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/.gitignore b/.gitignore
index f691227..e9d8978 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,3 +42,5 @@ yarn-error.log*
dist.zip
.aider*
.qodo
+
+error.txt
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 3f79c3d..d64ee74 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,18 +4,21 @@
-
+
-
-
-
-
+
+
+
+
+
+
+
@@ -23,7 +26,7 @@
-
+
@@ -42,171 +45,185 @@
"state": "OPEN"
}
}
- {
+ "prStates": [
{
- "id": {
- "id": "PR_kwDOMJIfts51PkS9",
- "number": 22
+ "id": {
+ "id": "PR_kwDOMJIfts51PkS9",
+ "number": 22
},
- "lastSeen": 1741207144695
+ "lastSeen": 1741207144695
},
{
- "id": {
- "id": "PR_kwDOMJIfts6NiNYl",
- "number": 32
+ "id": {
+ "id": "PR_kwDOMJIfts6NiNYl",
+ "number": 32
},
- "lastSeen": 1741209723869
+ "lastSeen": 1741209723869
},
{
- "id": {
- "id": "PR_kwDOMJIfts6Nheyd",
- "number": 31
+ "id": {
+ "id": "PR_kwDOMJIfts6Nheyd",
+ "number": 31
},
- "lastSeen": 1741213371410
+ "lastSeen": 1741213371410
},
{
- "id": {
- "id": "PR_kwDOMJIfts6NmRBs",
- "number": 33
+ "id": {
+ "id": "PR_kwDOMJIfts6NmRBs",
+ "number": 33
},
- "lastSeen": 1741282429036
+ "lastSeen": 1741282429036
},
{
- "id": {
- "id": "PR_kwDOMJIfts5zyFTs",
- "number": 15
+ "id": {
+ "id": "PR_kwDOMJIfts5zyFTs",
+ "number": 15
},
- "lastSeen": 1741535540953
+ "lastSeen": 1741535540953
},
{
- "id": {
- "id": "PR_kwDOMJIfts6QQB3c",
- "number": 59
+ "id": {
+ "id": "PR_kwDOMJIfts6QQB3c",
+ "number": 59
},
- "lastSeen": 1743018960900
+ "lastSeen": 1743018960900
},
{
- "id": {
- "id": "PR_kwDOMJIfts6QMPEg",
- "number": 58
+ "id": {
+ "id": "PR_kwDOMJIfts6QMPEg",
+ "number": 58
},
- "lastSeen": 1743019452983
+ "lastSeen": 1743019452983
},
{
- "id": {
- "id": "PR_kwDOMJIfts6QZvRI",
- "number": 61
+ "id": {
+ "id": "PR_kwDOMJIfts6QZvRI",
+ "number": 61
},
- "lastSeen": 1743103196866
+ "lastSeen": 1743103196866
},
{
- "id": {
- "id": "PR_kwDOMJIfts6QqPrQ",
- "number": 73
+ "id": {
+ "id": "PR_kwDOMJIfts6QqPrQ",
+ "number": 73
},
- "lastSeen": 1743265865001
+ "lastSeen": 1743265865001
},
{
- "id": {
- "id": "PR_kwDOMJIfts6Qp5nI",
- "number": 72
+ "id": {
+ "id": "PR_kwDOMJIfts6Qp5nI",
+ "number": 72
},
- "lastSeen": 1743338472110
+ "lastSeen": 1743338472110
},
{
- "id": {
- "id": "PR_kwDOMJIfts6QsjlS",
- "number": 76
+ "id": {
+ "id": "PR_kwDOMJIfts6QsjlS",
+ "number": 76
},
- "lastSeen": 1743352150953
+ "lastSeen": 1743352150953
},
{
- "id": {
- "id": "PR_kwDOMJIfts6Q0JBe",
- "number": 82
+ "id": {
+ "id": "PR_kwDOMJIfts6Q0JBe",
+ "number": 82
},
- "lastSeen": 1743470267269
+ "lastSeen": 1743470267269
},
{
- "id": {
- "id": "PR_kwDOMJIfts6UE9-x",
- "number": 102
+ "id": {
+ "id": "PR_kwDOMJIfts6UE9-x",
+ "number": 102
},
- "lastSeen": 1747171977348
+ "lastSeen": 1747171977348
},
{
- "id": {
- "id": "PR_kwDOMJIfts6XPua_",
- "number": 117
+ "id": {
+ "id": "PR_kwDOMJIfts6XPua_",
+ "number": 117
},
- "lastSeen": 1747929835864
+ "lastSeen": 1747929835864
},
{
- "id": {
- "id": "PR_kwDOMJIfts6XY-mZ",
- "number": 119
+ "id": {
+ "id": "PR_kwDOMJIfts6XY-mZ",
+ "number": 119
},
- "lastSeen": 1748028108508
+ "lastSeen": 1748028108508
},
{
- "id": {
- "id": "PR_kwDOMJIfts6Xdz4n",
- "number": 120
+ "id": {
+ "id": "PR_kwDOMJIfts6Xdz4n",
+ "number": 120
},
- "lastSeen": 1748282672214
+ "lastSeen": 1748282672214
},
{
- "id": {
- "id": "PR_kwDOMJIfts6X_zxl",
- "number": 131
+ "id": {
+ "id": "PR_kwDOMJIfts6X_zxl",
+ "number": 131
},
- "lastSeen": 1748881279494
+ "lastSeen": 1748881279494
},
{
- "id": {
- "id": "PR_kwDOMJIfts6bhieT",
- "number": 152
+ "id": {
+ "id": "PR_kwDOMJIfts6bhieT",
+ "number": 152
},
- "lastSeen": 1751848489082
+ "lastSeen": 1751848489082
},
{
- "id": {
- "id": "PR_kwDOMJIfts6dOyRk",
- "number": 154
+ "id": {
+ "id": "PR_kwDOMJIfts6dOyRk",
+ "number": 154
},
- "lastSeen": 1751849436454
+ "lastSeen": 1751849436454
},
{
- "id": {
- "id": "PR_kwDOMJIfts6cHjNi",
- "number": 153
+ "id": {
+ "id": "PR_kwDOMJIfts6cHjNi",
+ "number": 153
},
- "lastSeen": 1751849501498
+ "lastSeen": 1751849501498
},
{
- "id": {
- "id": "PR_kwDOMJIfts6Zs1FN",
- "number": 145
+ "id": {
+ "id": "PR_kwDOMJIfts6Zs1FN",
+ "number": 145
},
- "lastSeen": 1751849770308
+ "lastSeen": 1751849770308
},
{
- "id": {
- "id": "PR_kwDOMJIfts6bgKi9",
- "number": 150
+ "id": {
+ "id": "PR_kwDOMJIfts6bgKi9",
+ "number": 150
},
- "lastSeen": 1751850367300
+ "lastSeen": 1751850367300
},
{
- "id": {
- "id": "PR_kwDOMJIfts6eUKC-",
- "number": 176
+ "id": {
+ "id": "PR_kwDOMJIfts6eUKC-",
+ "number": 176
},
- "lastSeen": 1752158748013
+ "lastSeen": 1752158748013
+ },
+ {
+ "id": {
+ "id": "PR_kwDOMJIfts6eqzP7",
+ "number": 190
+ },
+ "lastSeen": 1752404173008
+ },
+ {
+ "id": {
+ "id": "PR_kwDOMJIfts6et6vx",
+ "number": 192
+ },
+ "lastSeen": 1752585709582
}
]
-}]]>
+}
{
"selectedUrlAndAccountId": {
"url": "https://github.com/iib0011/omni-tools.git",
@@ -244,6 +261,9 @@
"ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true",
"Docker.Dockerfile build.executor": "Run",
"Docker.Dockerfile.executor": "Run",
+ "Node.js.add-i18n-to-meta.js.executor": "Run",
+ "Node.js.locize-upload.js.executor": "Run",
+ "Node.js.update-i18n-from-meta.js.executor": "Run",
"Playwright.Create transparent PNG.should make png color transparent.executor": "Run",
"Playwright.JoinText Component.executor": "Run",
"Playwright.JoinText Component.should merge text pieces with specified join character.executor": "Run",
@@ -252,6 +272,7 @@
"RunOnceActivity.git.unshallow": "true",
"Vitest.compute function (1).executor": "Run",
"Vitest.compute function.executor": "Run",
+ "Vitest.generatePassword.executor": "Run",
"Vitest.mergeText.executor": "Run",
"Vitest.mergeText.should merge lines and preserve blank lines when deleteBlankLines is false.executor": "Run",
"Vitest.mergeText.should merge lines, preserve blank lines and trailing spaces when both deleteBlankLines and deleteTrailingSpaces are false.executor": "Run",
@@ -265,7 +286,7 @@
"git-widget-placeholder": "main",
"ignore.virus.scanning.warn.message": "true",
"kotlin-language-version-configured": "true",
- "last_opened_file_path": "C:/Users/Ibrahima/IdeaProjects/omni-tools/public",
+ "last_opened_file_path": "C:/Users/Ibrahima/IdeaProjects/omni-tools",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
@@ -273,6 +294,10 @@
"nodejs_package_manager_path": "npm",
"npm.build.executor": "Run",
"npm.dev.executor": "Run",
+ "npm.i18n:extract.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",
@@ -299,58 +324,31 @@
+
+
-
-
-
+
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -367,33 +365,58 @@
-
+
+
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
@@ -504,214 +527,9 @@
-
-
-
- 1743022260639
-
-
-
- 1743022260639
-
-
-
- 1743051792459
-
-
-
- 1743051792459
-
-
-
- 1743052111988
-
-
-
- 1743052111988
-
-
-
- 1743106796406
-
-
-
- 1743106796406
-
-
-
- 1743349732644
-
-
-
- 1743349732644
-
-
-
- 1743355099396
-
-
-
- 1743355099396
-
-
-
- 1743355166425
-
-
-
- 1743355166426
-
-
-
- 1743385388051
-
-
-
- 1743385388051
-
-
-
- 1743385467178
-
-
-
- 1743385467178
-
-
-
- 1743385898871
-
-
-
- 1743385898871
-
-
-
- 1743459110471
-
-
-
- 1743459110471
-
-
-
- 1743459205311
-
-
-
- 1743459205311
-
-
-
- 1743470832619
-
-
-
- 1743470832619
-
-
-
- 1743644598841
-
-
-
- 1743644598841
-
-
-
- 1743644703041
-
-
-
- 1743644703042
-
-
-
- 1743644942488
-
-
-
- 1743644942488
-
-
-
- 1743645074051
-
-
-
- 1743645074051
-
-
-
- 1743647707334
-
-
-
- 1743647707334
-
-
-
- 1743691399769
-
-
-
- 1743691399769
-
-
-
- 1743691471368
-
-
-
- 1743691471368
-
-
-
- 1743705749057
-
-
-
- 1743705749057
-
-
-
- 1743710133267
-
-
-
- 1743710133267
-
-
-
- 1743710669869
-
-
-
- 1743710669869
-
-
-
- 1743811980098
-
-
-
- 1743811980098
-
-
-
- 1745688369521
-
-
-
- 1745688369521
-
-
-
- 1745688866294
-
-
-
- 1745688866294
+
+
+
@@ -897,7 +715,215 @@
1752158119802
-
+
+
+ 1752402313190
+
+
+
+ 1752402313191
+
+
+
+ 1752408068771
+
+
+
+ 1752408068771
+
+
+
+ 1752412149075
+
+
+
+ 1752412149075
+
+
+
+ 1752422405814
+
+
+
+ 1752422405814
+
+
+
+ 1752423460080
+
+
+
+ 1752423460080
+
+
+
+ 1752493634215
+
+
+
+ 1752493634215
+
+
+
+ 1752497705915
+
+
+
+ 1752497705915
+
+
+
+ 1752501110885
+
+
+
+ 1752501110885
+
+
+
+ 1752503206380
+
+
+
+ 1752503206380
+
+
+
+ 1752503720380
+
+
+
+ 1752503720380
+
+
+
+ 1752503770543
+
+
+
+ 1752503770543
+
+
+
+ 1752505593881
+
+
+
+ 1752505593881
+
+
+
+ 1752512678963
+
+
+
+ 1752512678963
+
+
+
+ 1752514466233
+
+
+
+ 1752514466233
+
+
+
+ 1752515675314
+
+
+
+ 1752515675314
+
+
+
+ 1752585351036
+
+
+
+ 1752585351036
+
+
+
+ 1752585829343
+
+
+
+ 1752585829343
+
+
+
+ 1752586932190
+
+
+
+ 1752586932190
+
+
+
+ 1752591387066
+
+
+
+ 1752591387066
+
+
+
+ 1752596436284
+
+
+
+ 1752596436284
+
+
+
+ 1752600606853
+
+
+
+ 1752600606853
+
+
+
+ 1752601115085
+
+
+
+ 1752601115085
+
+
+
+ 1752601506346
+
+
+
+ 1752601506346
+
+
+
+ 1752601987121
+
+
+
+ 1752601987121
+
+
+
+ 1752604958929
+
+
+
+ 1752604958929
+
+
+
+ 1752605940802
+
+
+
+ 1752605940802
+
+
@@ -944,32 +970,32 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
false
diff --git a/@types/i18n.d.ts b/@types/i18n.d.ts
new file mode 100644
index 0000000..efd6ca1
--- /dev/null
+++ b/@types/i18n.d.ts
@@ -0,0 +1,9 @@
+// types/i18next.d.ts
+import 'i18next';
+import { resources } from '../src/i18n';
+
+declare module 'i18next' {
+ interface CustomTypeOptions {
+ resources: (typeof resources)['en'];
+ }
+}
diff --git a/README.md b/README.md
index 9d6e367..ed6f0b9 100644
--- a/README.md
+++ b/README.md
@@ -30,21 +30,21 @@ Here is the [demo](https://omnitools.app) website.
All files are processed entirely on the client side: nothing ever leaves your device.
Plus, the Docker image is super lightweight at just 28MB, making it fast to deploy and easy to self-host.
-
+
## Table of Contents
- [Features](#features)
- [Self-host](#self-hostrun)
- [Contribute](#contribute)
-- [License](#license)
- [Contact](#contact)
+- [License](#license)
## Features
We strive to offer a variety of tools, including:
-## **Image/Video/Audio Tools**
+### **Image/Video/Audio Tools**
- Image Resizer
- Image Converter
@@ -53,33 +53,33 @@ We strive to offer a variety of tools, including:
- Video Reverser
- And more...
-## **PDF Tools**
+### **PDF Tools**
- PDF Splitter
- PDF Merger
- PDF Editor
- And more...
-## **Text/List Tools**
+### **Text/List Tools**
- Case Converters
- List Shuffler
- Text Formatters
- And more...
-## **Date and Time Tools**
+### **Date and Time Tools**
- Date Calculators
- Time Zone Converters
- And more...
-## **Math Tools**
+### **Math Tools**
- Generate Prime Numbers
- Calculate voltage, current, or resistance
- And more...
-## **Data Tools**
+### **Data Tools**
- JSON Tools
- CSV Tools
@@ -148,20 +148,34 @@ npm run test
npm run test:e2e
```
+### i18n (Translations)
+The translation files are [here](public/locales). Only edit these if you are a developer. For non developers, use [Locize](https://www.locize.app/register?invitation=YOIH0Dyz3KHh3uQFCGYe9v1QOUoq8W5ySgmlwjX9cSypeJmt8F40brDtVbXb71fK).
+
## 🤝 Looking to contribute?
We welcome contributions! You can help by:
-- ✅ Reporting bugs
-- ✅ Suggesting new features in GitHub issues or [here](https://tally.so/r/nrkkx2)
-- ✅ Improving documentation
-- ✅ Submitting pull requests
+- Reporting bugs
+- Suggesting new features in GitHub issues or [here](https://tally.so/r/nrkkx2)
+- Translating in [Locize project](https://www.locize.app/register?invitation=YOIH0Dyz3KHh3uQFCGYe9v1QOUoq8W5ySgmlwjX9cSypeJmt8F40brDtVbXb71fK).
+- Improving documentation
+- Submitting pull requests
+
You can also join our [Discord server](https://discord.gg/SDbbn3hT4b)
+## 🧡 Sponsors
+
-### Contributors
+Thanks to [Locize](https://www.locize.com) for sponsoring OmniTools and supporting localization efforts.
+They make translation management simple and developer-friendly.
+
+## Contributors
diff --git a/img.png b/docs-images/img.png
similarity index 100%
rename from img.png
rename to docs-images/img.png
diff --git a/docs-images/locizeSponsor.svg b/docs-images/locizeSponsor.svg
new file mode 100644
index 0000000..1139aa2
--- /dev/null
+++ b/docs-images/locizeSponsor.svg
@@ -0,0 +1,187 @@
+
+
+
+ Custom Preset 2 Copy
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 5b698c2..cc72c78 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,6 +24,7 @@
"@types/lodash": "^4.17.5",
"@types/morsee": "^1.0.2",
"@types/omggif": "^1.0.5",
+ "@types/react-i18next": "^7.8.3",
"browser-image-compression": "^2.0.2",
"buffer": "^6.0.3",
"color": "^4.2.3",
@@ -32,10 +33,13 @@
"dayjs": "^1.11.13",
"fast-xml-parser": "^5.2.5",
"formik": "^2.4.6",
+ "i18next": "^25.3.2",
+ "i18next-http-backend": "^3.0.2",
"jimp": "^0.22.12",
"js-quantities": "^1.8.0",
"jszip": "^3.10.1",
"lint-staged": "^15.4.3",
+ "locize": "^4.0.14",
"lodash": "^4.17.21",
"mime": "^4.0.6",
"morsee": "^1.0.9",
@@ -51,6 +55,7 @@
"react-dom": "^18.3.1",
"react-filerobot-image-editor": "^4.9.1",
"react-helmet": "^6.1.0",
+ "react-i18next": "^15.6.0",
"react-image-crop": "^11.0.7",
"react-konva": "^18.2.10",
"react-router-dom": "^6.23.1",
@@ -85,6 +90,8 @@
"eslint-plugin-tailwindcss": "^3.17.0",
"happy-dom": "^12.10.3",
"husky": "^9.0.11",
+ "i18next-locize-backend": "^7.0.4",
+ "locize-cli": "^10.1.1",
"postcss": "^8.4.38",
"prettier": "3.1.1",
"start-server-and-test": "^2.0.4",
@@ -302,12 +309,10 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz",
- "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
+ "version": "7.27.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
+ "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
@@ -1419,20 +1424,22 @@
}
},
"node_modules/@floating-ui/core": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz",
- "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==",
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz",
+ "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==",
+ "license": "MIT",
"dependencies": {
- "@floating-ui/utils": "^0.2.0"
+ "@floating-ui/utils": "^0.2.10"
}
},
"node_modules/@floating-ui/dom": {
- "version": "1.6.5",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz",
- "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==",
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz",
+ "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==",
+ "license": "MIT",
"dependencies": {
- "@floating-ui/core": "^1.0.0",
- "@floating-ui/utils": "^0.2.0"
+ "@floating-ui/core": "^1.7.2",
+ "@floating-ui/utils": "^0.2.10"
}
},
"node_modules/@floating-ui/react-dom": {
@@ -1448,9 +1455,21 @@
}
},
"node_modules/@floating-ui/utils": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz",
- "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw=="
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
+ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
+ "license": "MIT"
+ },
+ "node_modules/@fluent/syntax": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@fluent/syntax/-/syntax-0.19.0.tgz",
+ "integrity": "sha512-5D2qVpZrgpjtqU4eNOcWGp1gnUCgjfM+vKGE2y03kKN6z5EBhtx0qdRFbg8QuNNj8wXNoX93KJoYb+NqoxswmQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14.0.0",
+ "npm": ">=7.0.0"
+ }
},
"node_modules/@hapi/hoek": {
"version": "9.3.0",
@@ -2078,6 +2097,13 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "node_modules/@js.properties/properties": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/@js.properties/properties/-/properties-0.5.4.tgz",
+ "integrity": "sha512-4M/Mb2CxzuI1CtQhVFs6OC9ceuGPAP6SOWnpLcrdB1TcUHroXbsYDVJNOm32koRMfuCoRACbojcm4dPPcQxu0w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@mui/base": {
"version": "5.0.0-beta.40",
"resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz",
@@ -3395,6 +3421,12 @@
"hoist-non-react-statics": "^3.3.0"
}
},
+ "node_modules/@types/i18next": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/@types/i18next/-/i18next-12.1.0.tgz",
+ "integrity": "sha512-qLyqTkp3ZKHsSoX8CNVYcTyTkxlm0aRCUpaUVetgkSlSpiNCdWryOgaYwgbO04tJIfLgBXPcy0tJ3Nl/RagllA==",
+ "license": "MIT"
+ },
"node_modules/@types/js-quantities": {
"version": "1.6.6",
"resolved": "https://registry.npmjs.org/@types/js-quantities/-/js-quantities-1.6.6.tgz",
@@ -3484,6 +3516,16 @@
"@types/react": "*"
}
},
+ "node_modules/@types/react-i18next": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@types/react-i18next/-/react-i18next-7.8.3.tgz",
+ "integrity": "sha512-VPopxbHXz/1Sjl+ljXQQchf6FHXaYLaH0a6TH6KnGOQGD4LzNbUVlofK26S30OIYfYibm8r/sAb2KeTst+AwTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/i18next": "*",
+ "@types/react": "*"
+ }
+ },
"node_modules/@types/react-reconciler": {
"version": "0.28.9",
"resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz",
@@ -3936,6 +3978,16 @@
"node": ">=0.4.0"
}
},
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -3952,6 +4004,17 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
+ "node_modules/android-string-resource": {
+ "version": "2.3.10",
+ "resolved": "https://registry.npmjs.org/android-string-resource/-/android-string-resource-2.3.10.tgz",
+ "integrity": "sha512-Ldzy2znjm+BVWVHbzyhmdiznVdIum/EM2CMtSPjnoVr1/MljZTVPB08giSpm1WIo00fK/sL/kcnvr0+d9wVUzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "rdotjson": "1.1.1",
+ "xml-js": "1.6.11"
+ }
+ },
"node_modules/ansi-escapes": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
@@ -4191,6 +4254,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/assertion-error": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
@@ -4200,6 +4273,13 @@
"node": "*"
}
},
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -4348,6 +4428,13 @@
"integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==",
"license": "MIT"
},
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
@@ -4450,6 +4537,16 @@
"node": ">=8"
}
},
+ "node_modules/cacheable-lookup": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz",
+ "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.6.0"
+ }
+ },
"node_modules/call-bind": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
@@ -4577,6 +4674,46 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/cheerio": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
+ "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "htmlparser2": "^8.0.1",
+ "parse5": "^7.0.0",
+ "parse5-htmlparser2-tree-adapter": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/cheerio-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+ "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-select": "^5.1.0",
+ "css-what": "^6.1.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -4802,6 +4939,16 @@
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
"license": "MIT"
},
+ "node_modules/colors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -4845,6 +4992,16 @@
"integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==",
"dev": true
},
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/conventional-changelog-angular": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz",
@@ -4936,10 +5093,21 @@
"cronstrue": "bin/cli.js"
}
},
+ "node_modules/cross-fetch": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz",
+ "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "node-fetch": "^2.7.0"
+ }
+ },
"node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "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",
@@ -4959,6 +5127,23 @@
"node": ">=4"
}
},
+ "node_modules/css-select": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
"node_modules/css-to-react-native": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz",
@@ -4971,6 +5156,19 @@
"postcss-value-parser": "^4.0.2"
}
},
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
"node_modules/css.escape": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
@@ -4994,6 +5192,13 @@
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
+ "node_modules/csvjson": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/csvjson/-/csvjson-5.1.0.tgz",
+ "integrity": "sha512-OqALQHA0k2rEGluOWikwFq5qtkRUDyoWP2u0UJy8uFjFx5FPMjPzx7D2Hn2KjBLpc8jkGrT9HDNgTUfopDlqVg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/dargs": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz",
@@ -5203,6 +5408,16 @@
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
"dev": true
},
+ "node_modules/diff": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz",
+ "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
"node_modules/diff-sequences": {
"version": "29.6.3",
"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
@@ -5263,11 +5478,70 @@
"csstype": "^3.0.2"
}
},
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
"node_modules/dom-walk": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
"integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
},
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
"node_modules/dot-prop": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
@@ -5280,6 +5554,19 @@
"node": ">=8"
}
},
+ "node_modules/dotenv": {
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz",
+ "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
"node_modules/duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -5304,6 +5591,16 @@
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"dev": true
},
+ "node_modules/encoding": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@@ -6108,6 +6405,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
"node_modules/flat-cache": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
@@ -6135,6 +6442,16 @@
"integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
"dev": true
},
+ "node_modules/fluent_conv": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/fluent_conv/-/fluent_conv-3.3.0.tgz",
+ "integrity": "sha512-OsTQyVWo1WYmEnnH7m3MRlk5NQq/+jXOLzv0WOk8GGn99LdQV1kNp3IOR6HYb+fwDqYebLPLAThS2pFEaDbyHQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@fluent/syntax": "0.19.0"
+ }
+ },
"node_modules/follow-redirects": {
"version": "1.15.6",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
@@ -6368,6 +6685,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/gettext-converter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/gettext-converter/-/gettext-converter-1.3.0.tgz",
+ "integrity": "sha512-vXjx4vRBjw6rd3Zg73IMyNLZuPjs8/lE9gJZs270YJJI0t5vlCpdsyX5E0TmSd+KcRWzwPbwjwd6bnNpF72sFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arrify": "^2.0.1",
+ "content-type": "1.0.5",
+ "encoding": "0.1.13"
+ }
+ },
"node_modules/gifwrap": {
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.10.1.tgz",
@@ -6684,6 +7013,49 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
+ "node_modules/html-parse-stringify": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
+ "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
+ "license": "MIT",
+ "dependencies": {
+ "void-elements": "3.1.0"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+ "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "entities": "^4.4.0"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/human-signals": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
@@ -6707,11 +7079,79 @@
"url": "https://github.com/sponsors/typicode"
}
},
+ "node_modules/i18next": {
+ "version": "25.3.2",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.3.2.tgz",
+ "integrity": "sha512-JSnbZDxRVbphc5jiptxr3o2zocy5dEqpVm9qCGdJwRNO+9saUJS0/u4LnM/13C23fUEWxAylPqKU/NpMV/IjqA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://locize.com"
+ },
+ {
+ "type": "individual",
+ "url": "https://locize.com/i18next.html"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.27.6"
+ },
+ "peerDependencies": {
+ "typescript": "^5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/i18next-http-backend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.2.tgz",
+ "integrity": "sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-fetch": "4.0.0"
+ }
+ },
+ "node_modules/i18next-http-backend/node_modules/cross-fetch": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
+ "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
+ "license": "MIT",
+ "dependencies": {
+ "node-fetch": "^2.6.12"
+ }
+ },
+ "node_modules/i18next-locize-backend": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/i18next-locize-backend/-/i18next-locize-backend-7.0.4.tgz",
+ "integrity": "sha512-saRyIQAX0k+YA6XzirU6cyudWDj1W7bGDz/Szq+8OIs3JJnNuMZCADuNgCwmo+dQm9P69bbALymV+9t9ffywBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-fetch": "4.1.0"
+ }
+ },
+ "node_modules/i18next-subliminal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/i18next-subliminal/-/i18next-subliminal-1.0.1.tgz",
+ "integrity": "sha512-h3m1oQ8lTaTNNgqmvBXAzFSGoJ0uobUcFW6TJMaWV4QDQ0+YGIih3ZcCX1XouGzK8yyFX13lP+2zAT/k7u4oiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.27.0"
+ }
+ },
"node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "dev": true,
+ "devOptional": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
@@ -7594,6 +8034,16 @@
"license": "MIT",
"peer": true
},
+ "node_modules/laravelphp": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/laravelphp/-/laravelphp-2.0.4.tgz",
+ "integrity": "sha512-rx5X+Yds6MmIxGS+VVQBWhylPYxkOYmKXrWqQHc2rj2ewsoWMZS7OaTXk9UE8y95XV+D5CqLjaEj+IJgRmrIaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "php-parser": "3.1.5"
+ }
+ },
"node_modules/lazy-ass": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
@@ -7876,6 +8326,146 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/locize": {
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/locize/-/locize-4.0.14.tgz",
+ "integrity": "sha512-4AnM9Hoxm7tgE+LhkdX1cDp+PLnraSruNc/3O/AAFfbmqmqaGdf9TyLwgHd0C9ug6GPRS0RIzXH6wdg5tHMWWw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.23.6",
+ "@floating-ui/dom": "^1.6.13",
+ "i18next-subliminal": "^1.0.1"
+ }
+ },
+ "node_modules/locize-cli": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/locize-cli/-/locize-cli-10.1.1.tgz",
+ "integrity": "sha512-X0qzyKvlMPsu65jSFAaTLGobVFvLvd2wuPqPiJqROruneIc2ddEIRA6jspuRBpi9EGxDCERnmkM5nkGK/SjV8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@js.properties/properties": "0.5.4",
+ "android-string-resource": "2.3.10",
+ "async": "3.2.6",
+ "cacheable-lookup": "6.1.0",
+ "colors": "1.4.0",
+ "commander": "9.5.0",
+ "csvjson": "5.1.0",
+ "diff": "7.0.0",
+ "dotenv": "16.5.0",
+ "flat": "5.0.2",
+ "fluent_conv": "3.3.0",
+ "gettext-converter": "1.3.0",
+ "https-proxy-agent": "7.0.6",
+ "ini": "4.1.3",
+ "laravelphp": "2.0.4",
+ "locize-xcstrings": "2.0.0",
+ "lodash.clonedeep": "4.5.0",
+ "mkdirp": "3.0.1",
+ "node-fetch": "2.7.0",
+ "resx": "2.0.4",
+ "rimraf": "4.4.1",
+ "strings-file": "0.0.5",
+ "tmexchange": "2.0.5",
+ "xliff": "6.2.2",
+ "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
+ "yaml": "2.8.0"
+ },
+ "bin": {
+ "locize": "bin/locize"
+ }
+ },
+ "node_modules/locize-cli/node_modules/commander": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+ "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || >=14"
+ }
+ },
+ "node_modules/locize-cli/node_modules/glob": {
+ "version": "9.3.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz",
+ "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "minimatch": "^8.0.2",
+ "minipass": "^4.2.4",
+ "path-scurry": "^1.6.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/locize-cli/node_modules/ini": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz",
+ "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/locize-cli/node_modules/minimatch": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz",
+ "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/locize-cli/node_modules/minipass": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
+ "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/locize-cli/node_modules/rimraf": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
+ "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^9.2.0"
+ },
+ "bin": {
+ "rimraf": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/locize-xcstrings": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locize-xcstrings/-/locize-xcstrings-2.0.0.tgz",
+ "integrity": "sha512-Gef3IrMDSB5ZuRbym9ktr7KXCTFjIvs1T2TEnaew5ed7BBwt3od0/sj8C7X9iGpRebHxG1kyF6hR6aK8iBPkLg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@@ -7892,6 +8482,13 @@
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
"dev": true
},
+ "node_modules/lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
@@ -8277,6 +8874,22 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/mlly": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz",
@@ -8457,6 +9070,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -8592,6 +9218,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/obop": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/obop/-/obop-0.2.3.tgz",
+ "integrity": "sha512-xmaHk+pwv4T6QKoq553KeJlkZUV6WBVGU/dO7rppA7YFIvGf+xB1OQAkw8mcORtxtSHpiK5JiTQ+d7Bme/Y7Wg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/omggif": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
@@ -8771,6 +9404,46 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
+ "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domhandler": "^5.0.3",
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5/node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -8897,6 +9570,13 @@
"integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==",
"deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."
},
+ "node_modules/php-parser": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.1.5.tgz",
+ "integrity": "sha512-jEY2DcbgCm5aclzBdfW86GM6VEIWcSlhTBSHN1qhJguVePlYe28GhwS0yoeLYXpM2K8y6wzLwrbq814n2PHSoQ==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -9282,6 +9962,16 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"license": "MIT"
},
+ "node_modules/process.argv": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/process.argv/-/process.argv-0.6.1.tgz",
+ "integrity": "sha512-WQOWF/VB0pTJu7c3ko0y5w6HWDQf6Wm3ppvKDI7ET4OSYBDOvcliBRM1HFIHHkJPNa/1bYTzmUinjF8492oaBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "obop": "^0.2.2"
+ }
+ },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -9579,6 +10269,34 @@
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"license": "MIT"
},
+ "node_modules/rdotjson": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/rdotjson/-/rdotjson-1.1.1.tgz",
+ "integrity": "sha512-L6wBhp64fAr/FPhjfkuf9Lx6dAbfkznROcBMj55tVamw6ddTvhcgoqu89a3lUJCaALJkZe/mTcQoNM0P09RpQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cheerio": "1.0.0-rc.12",
+ "is-stream": "^2.0.0",
+ "process.argv": "^0.6.1"
+ },
+ "bin": {
+ "rdotjson": "rdotjson.cli.js"
+ }
+ },
+ "node_modules/rdotjson/node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/react": {
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
@@ -9682,6 +10400,32 @@
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
"integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
},
+ "node_modules/react-i18next": {
+ "version": "15.6.0",
+ "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.6.0.tgz",
+ "integrity": "sha512-W135dB0rDfiFmbMipC17nOhGdttO5mzH8BivY+2ybsQBbXvxWIwl3cmeH3T9d+YPBSJu/ouyJKFJTtkK7rJofw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.27.6",
+ "html-parse-stringify": "^3.0.1"
+ },
+ "peerDependencies": {
+ "i18next": ">= 23.2.3",
+ "react": ">= 16.8.0",
+ "typescript": "^5"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
"node_modules/react-image-crop": {
"version": "11.0.7",
"resolved": "https://registry.npmjs.org/react-image-crop/-/react-image-crop-11.0.7.tgz",
@@ -9880,11 +10624,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
- },
"node_modules/regexp.prototype.flags": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
@@ -9982,6 +10721,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/resx": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/resx/-/resx-2.0.4.tgz",
+ "integrity": "sha512-b3IW7ge0nxbWOhbUGO/WULL4NG5ctrpey+UgDIwRq5K4Bblna4t1hLMbA2DZC9Y6e8U/zLuRJHg+qEOVKOoypQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xml2js": "0.5.0"
+ }
+ },
"node_modules/reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -10139,7 +10888,7 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
+ "devOptional": true
},
"node_modules/sax": {
"version": "1.4.1",
@@ -10706,6 +11455,29 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/strings-file": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/strings-file/-/strings-file-0.0.5.tgz",
+ "integrity": "sha512-4/Fc8WshjKl/6MctVvdcdH3pQpbSP3J481hMUo9qMSpEK+piDYKYg8oSTGGKFMt2AyeZCQCnGF1uMq3i/xg/wQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "^0.4.13"
+ }
+ },
+ "node_modules/strings-file/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -11140,6 +11912,16 @@
"@popperjs/core": "^2.9.0"
}
},
+ "node_modules/tmexchange": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/tmexchange/-/tmexchange-2.0.5.tgz",
+ "integrity": "sha512-fJQcBIY/ebEYDagOA0IY2PKYs2OJtBo0UGO+O2huyTkL9h+1Fg75DKw0JHkzXA1C56ejQdLW7S9YS/IL9rOpmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xml2js": "0.5.0"
+ }
+ },
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -11347,7 +12129,7 @@
"version": "5.4.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
"integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
- "dev": true,
+ "devOptional": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -11631,6 +12413,15 @@
}
}
},
+ "node_modules/void-elements": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
+ "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/wait-on": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz",
@@ -11940,6 +12731,42 @@
"xtend": "^4.0.0"
}
},
+ "node_modules/xliff": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/xliff/-/xliff-6.2.2.tgz",
+ "integrity": "sha512-8j1NITWDF3oRV3wkE514g1yYpk9pv3MKiOrVVaxY8YWtcQs1Ux12tfVmIwKeP5/GVfS7g0N6oRm1TqjR2MeEaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xml-js": "1.6.11"
+ }
+ },
+ "node_modules/xlsx": {
+ "version": "0.20.3",
+ "resolved": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
+ "integrity": "sha512-oLDq3jw7AcLqKWH2AhCpVTZl8mf6X2YReP+Neh0SJUzV/BdZYjth94tG5toiMB1PPrYtxOCfaoUCkvtuH+3AJA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "xlsx": "bin/xlsx.njs"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/xml-js": {
+ "version": "1.6.11",
+ "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
+ "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "xml-js": "bin/cli.js"
+ }
+ },
"node_modules/xml-parse-from-string": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
@@ -11983,15 +12810,15 @@
}
},
"node_modules/yaml": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
- "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
+ "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==",
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
},
"engines": {
- "node": ">= 14"
+ "node": ">= 14.6"
}
},
"node_modules/yargs": {
diff --git a/package.json b/package.json
index 52860e1..392bb6e 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,9 @@
"script:create:tool": "node scripts/create-tool.mjs",
"lint": "eslint src --max-warnings=0 --fix",
"typecheck": "tsc --project tsconfig.json --noEmit",
- "prepare": "husky install"
+ "prepare": "husky install",
+ "i18n:pull": "locize download --project-id e7156a3e-66fb-4035-a0f0-cebf1c63a3ba --path ./public/locales",
+ "i18n:sync": "locize sync --project-id e7156a3e-66fb-4035-a0f0-cebf1c63a3ba --path ./public/locales --update-values true --reference-language-only false"
},
"dependencies": {
"@emotion/react": "^11.11.4",
@@ -41,6 +43,7 @@
"@types/lodash": "^4.17.5",
"@types/morsee": "^1.0.2",
"@types/omggif": "^1.0.5",
+ "@types/react-i18next": "^7.8.3",
"browser-image-compression": "^2.0.2",
"buffer": "^6.0.3",
"color": "^4.2.3",
@@ -49,10 +52,13 @@
"dayjs": "^1.11.13",
"fast-xml-parser": "^5.2.5",
"formik": "^2.4.6",
+ "i18next": "^25.3.2",
+ "i18next-http-backend": "^3.0.2",
"jimp": "^0.22.12",
"js-quantities": "^1.8.0",
"jszip": "^3.10.1",
"lint-staged": "^15.4.3",
+ "locize": "^4.0.14",
"lodash": "^4.17.21",
"mime": "^4.0.6",
"morsee": "^1.0.9",
@@ -68,6 +74,7 @@
"react-dom": "^18.3.1",
"react-filerobot-image-editor": "^4.9.1",
"react-helmet": "^6.1.0",
+ "react-i18next": "^15.6.0",
"react-image-crop": "^11.0.7",
"react-konva": "^18.2.10",
"react-router-dom": "^6.23.1",
@@ -102,6 +109,8 @@
"eslint-plugin-tailwindcss": "^3.17.0",
"happy-dom": "^12.10.3",
"husky": "^9.0.11",
+ "i18next-locize-backend": "^7.0.4",
+ "locize-cli": "^10.1.1",
"postcss": "^8.4.38",
"prettier": "3.1.1",
"start-server-and-test": "^2.0.4",
diff --git a/public/locales/de/audio.json b/public/locales/de/audio.json
new file mode 100644
index 0000000..92c1d64
--- /dev/null
+++ b/public/locales/de/audio.json
@@ -0,0 +1,42 @@
+{
+ "changeSpeed": {
+ "description": "Ändern Sie die Wiedergabegeschwindigkeit von Audiodateien. Beschleunigen oder verlangsamen Sie die Wiedergabe, ohne die Tonhöhe zu verändern.",
+ "inputTitle": "Audioeingang",
+ "newAudioSpeed": "Neue Audiogeschwindigkeit",
+ "outputFormat": "Ausgabeformat",
+ "resultTitle": "Bearbeitetes Audio",
+ "settingSpeed": "Geschwindigkeit einstellen",
+ "shortDescription": "Ändern Sie die Geschwindigkeit von Audiodateien",
+ "speedDescription": "Standardmultiplikator: 2 bedeutet 2x schneller",
+ "title": "Audiogeschwindigkeit ändern",
+ "toolInfo": {
+ "title": "Was ist {{title}}?"
+ }
+ },
+ "extractAudio": {
+ "description": "Extrahieren Sie Audiospuren aus Videodateien.",
+ "extractingAudio": "Audio extrahieren",
+ "inputTitle": "Eingangsvideo",
+ "outputFormat": "Ausgabeformat",
+ "outputFormatDescription": "Wählen Sie das Format für das zu extrahierende Audio aus.",
+ "resultTitle": "Extrahiertes Audio",
+ "shortDescription": "Extrahieren Sie Audio aus Videodateien (MP4, MOV usw.) in AAC, MP3 oder WAV.",
+ "title": "Audio aus Video extrahieren",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie die Audiospur aus Videodateien extrahieren. Sie können zwischen verschiedenen Audioformaten wählen, darunter AAC, MP3 und WAV.",
+ "title": "Was ist {{title}}?"
+ }
+ },
+ "mergeAudio": {
+ "description": "Kombinieren Sie mehrere Audiodateien zu einer einzigen Audiodatei, indem Sie sie der Reihe nach aneinanderreihen.",
+ "longDescription": "Mit diesem Tool können Sie mehrere Audiodateien in der Reihenfolge des Hochladens zu einer einzigen Datei zusammenfügen. Ideal zum Kombinieren von Podcast-Segmenten, Musiktiteln oder anderen Audiodateien. Unterstützt verschiedene Audioformate, darunter MP3, AAC und WAV.",
+ "shortDescription": "Mehrere Audiodateien zu einer zusammenführen (MP3, AAC, WAV).",
+ "title": "Audio zusammenführen"
+ },
+ "trim": {
+ "description": "Schneiden und trimmen Sie Audiodateien, um bestimmte Segmente durch Angabe von Start- und Endzeiten zu extrahieren.",
+ "longDescription": "Mit diesem Tool können Sie Audiodateien durch Festlegen von Start- und Endzeiten kürzen. Sie können bestimmte Abschnitte aus längeren Audiodateien extrahieren, unerwünschte Teile entfernen oder kürzere Clips erstellen. Unterstützt verschiedene Audioformate, darunter MP3, AAC und WAV. Ideal für Podcast-Bearbeitung, Musikproduktion und alle anderen Audiobearbeitungsaufgaben.",
+ "shortDescription": "Schneiden Sie Audiodateien, um bestimmte Zeitsegmente zu extrahieren (MP3, AAC, WAV).",
+ "title": "Audio trimmen"
+ }
+}
diff --git a/public/locales/de/csv.json b/public/locales/de/csv.json
new file mode 100644
index 0000000..c7c9463
--- /dev/null
+++ b/public/locales/de/csv.json
@@ -0,0 +1,114 @@
+{
+ "changeCsvSeparator": {
+ "description": "Ändern Sie das Trennzeichen in CSV-Dateien. Konvertieren Sie zwischen verschiedenen CSV-Formaten wie Komma, Semikolon, Tabulator oder benutzerdefinierten Trennzeichen.",
+ "shortDescription": "CSV-Dateitrennzeichen ändern",
+ "title": "CSV-Trennzeichen ändern"
+ },
+ "csvRowsToColumns": {
+ "description": "Dieses Tool konvertiert Zeilen einer CSV-Datei (Comma Separated Values) in Spalten. Es extrahiert die horizontalen Zeilen einzeln aus der CSV-Eingabedatei, dreht sie um 90 Grad und gibt sie als vertikale Spalten nacheinander, durch Kommas getrennt, aus.', longDescription: 'Dieses Tool konvertiert Zeilen einer CSV-Datei (Comma Separated Values) in Spalten. Wenn die CSV-Eingabedaten beispielsweise sechs Zeilen haben, enthält die Ausgabe sechs Spalten, und die Elemente der Zeilen werden von oben nach unten angeordnet. In einer korrekt formatierten CSV-Datei ist die Anzahl der Werte in jeder Zeile gleich. Fehlende Felder in Zeilen können vom Programm korrigiert werden. Sie haben die Wahl zwischen verschiedenen Optionen: Füllen Sie fehlende Daten mit leeren Elementen auf oder ersetzen Sie fehlende Daten durch benutzerdefinierte Elemente wie \"missing\", \"?\" oder \"x\". Während der Konvertierung bereinigt das Tool die CSV-Datei außerdem von unnötigen Informationen wie Leerzeilen (Zeilen ohne sichtbare Informationen) und Kommentaren. Damit das Tool Kommentare korrekt erkennt, können Sie in den Optionen das Symbol am Zeilenanfang angeben, mit dem ein Kommentar beginnt. Dieses Symbol ist typischerweise ein Rautezeichen (#) oder ein doppelter Schrägstrich (//). CSV-abulous!",
+ "longDescription": "Dieses Tool konvertiert Zeilen einer CSV-Datei (Comma Separated Values) in Spalten. Wenn die CSV-Eingabedaten beispielsweise sechs Zeilen umfassen, enthält die Ausgabe sechs Spalten, und die Elemente der Zeilen werden von oben nach unten angeordnet. In einer korrekt formatierten CSV-Datei ist die Anzahl der Werte in jeder Zeile gleich. Sollten in Zeilen jedoch Felder fehlen, kann das Programm diese korrigieren. Sie haben die Wahl zwischen verschiedenen Optionen: Füllen Sie fehlende Daten mit leeren Elementen auf oder ersetzen Sie fehlende Daten durch benutzerdefinierte Elemente, wie z. B.",
+ "shortDescription": "Konvertieren Sie CSV-Zeilen in Spalten.",
+ "title": "CSV-Zeilen in Spalten konvertieren"
+ },
+ "csvToJson": {
+ "columnSeparator": "Spaltentrennzeichen (z. B. , ; \\t)",
+ "commentSymbol": "Kommentarsymbol (z. B. #)",
+ "conversionOptions": "Konvertierungsoptionen",
+ "description": "Konvertieren Sie CSV-Dateien in das JSON-Format mit anpassbaren Optionen für Trennzeichen, Anführungszeichen und Ausgabeformatierung. Unterstützt werden Header, Kommentare und dynamische Typkonvertierung.",
+ "dynamicTypes": "Dynamische Typen",
+ "dynamicTypesDescription": "Automatische Konvertierung von Zahlen und Booleschen Werten",
+ "errorParsing": "Fehler beim Parsen der CSV-Datei: {{error}}",
+ "fieldQuote": "Feld Zitat (z. B. \")",
+ "inputCsvFormat": "Eingabe-CSV-Format",
+ "inputTitle": "Eingabe-CSV",
+ "resultTitle": "JSON-Ausgabe",
+ "shortDescription": "Konvertieren Sie CSV-Daten in das JSON-Format.",
+ "skipEmptyLines": "Leere Zeilen überspringen",
+ "skipEmptyLinesDescription": "Leere Zeilen in der CSV-Eingabe ignorieren",
+ "title": "Konvertieren Sie CSV in JSON",
+ "useHeaders": "Verwenden Sie Überschriften",
+ "useHeadersDescription": "Behandeln Sie die erste Zeile als Spaltenüberschrift"
+ },
+ "csvToTsv": {
+ "description": "Laden Sie Ihre CSV-Datei im untenstehenden Formular hoch. Sie wird automatisch in eine TSV-Datei konvertiert. In den Tool-Optionen können Sie das CSV-Eingabeformat anpassen – Feldtrennzeichen, Anführungszeichen und Kommentarsymbol festlegen, leere CSV-Zeilen überspringen und festlegen, ob CSV-Spaltenüberschriften beibehalten werden sollen.",
+ "longDescription": "Dieses Tool wandelt CSV-Daten (Comma Separated Values) in TSV-Daten (Tab Separated Values) um. Sowohl CSV als auch TSV sind gängige Dateiformate zur Speicherung tabellarischer Daten, verwenden jedoch unterschiedliche Trennzeichen zur Trennung der Werte – CSV verwendet Kommas (",
+ "shortDescription": "Konvertieren Sie CSV-Daten in das TSV-Format.",
+ "title": "Konvertieren Sie CSV in TSV"
+ },
+ "csvToXml": {
+ "description": "Konvertieren Sie CSV-Dateien mit anpassbaren Optionen in das XML-Format.",
+ "shortDescription": "Konvertieren Sie CSV-Daten in das XML-Format.",
+ "title": "Konvertieren Sie CSV in XML"
+ },
+ "csvToYaml": {
+ "description": "Laden Sie Ihre CSV-Datei einfach im untenstehenden Formular hoch. Sie wird dann automatisch in eine YAML-Datei konvertiert. In den Tool-Optionen können Sie Feldtrennzeichen, Anführungszeichen und Kommentarzeichen festlegen, um das Tool an benutzerdefinierte CSV-Formate anzupassen. Zusätzlich können Sie das YAML-Ausgabeformat auswählen: eines, das CSV-Header beibehält, oder eines, das CSV-Header ausschließt.",
+ "longDescription": "Dieses Tool wandelt CSV-Daten (Comma Separated Values) in YAML-Daten (Yet Another Markup Language) um. CSV ist ein einfaches, tabellarisches Format zur Darstellung matrixartiger Datentypen mit Zeilen und Spalten. YAML hingegen ist ein erweitertes Format (eigentlich eine Obermenge von JSON), das besser lesbare Daten für die Serialisierung erzeugt und Listen, Wörterbücher und verschachtelte Objekte unterstützt. Das Programm unterstützt verschiedene CSV-Eingabeformate – die Eingabedaten können durch Kommas (Standard), Semikolons, Pipes oder ein anderes Trennzeichen getrennt sein. Sie können das genaue Trennzeichen Ihrer Daten in den Optionen festlegen. Ebenso können Sie in den Optionen das Anführungszeichen festlegen, das zum Umschließen von CSV-Feldern verwendet wird (standardmäßig ein doppeltes Anführungszeichen). Sie können auch Zeilen überspringen, die mit Kommentaren beginnen, indem Sie die Kommentarsymbole in den Optionen angeben. So halten Sie Ihre Daten übersichtlich, indem Sie unnötige Zeilen überspringen. Es gibt zwei Möglichkeiten, CSV in YAML zu konvertieren. Die erste Methode konvertiert jede CSV-Zeile in eine YAML-Liste. Die zweite Methode extrahiert Header aus der ersten CSV-Zeile und erstellt YAML-Objekte mit Schlüsseln basierend auf diesen Headern. Sie können das YAML-Ausgabeformat auch anpassen, indem Sie die Anzahl der Leerzeichen für die Einrückung von YAML-Strukturen angeben. Wenn Sie die umgekehrte Konvertierung durchführen, d. h. YAML in CSV umwandeln möchten, können Sie unser Tool „YAML in CSV konvertieren“ verwenden. CSV-genial!",
+ "shortDescription": "Konvertieren Sie schnell eine CSV-Datei in eine YAML-Datei.",
+ "title": "Konvertieren Sie CSV in YAML"
+ },
+ "findIncompleteCsvRecords": {
+ "checkingOptions": "Optionen prüfen",
+ "commentCharacterDescription": "Geben Sie das Zeichen ein, das den Beginn einer Kommentarzeile kennzeichnet. Zeilen, die mit diesem Symbol beginnen, werden übersprungen.",
+ "csvInputOptions": "CSV-Eingabeoptionen",
+ "csvSeparatorDescription": "Geben Sie das Zeichen ein, das zum Trennen von Spalten in der CSV-Eingabedatei verwendet wird.",
+ "deleteLinesWithNoData": "Zeilen ohne Daten löschen",
+ "deleteLinesWithNoDataDescription": "Entfernen Sie leere Zeilen aus der CSV-Eingabedatei.",
+ "description": "Laden Sie einfach Ihre CSV-Datei im untenstehenden Formular hoch. Das Tool prüft automatisch, ob in Zeilen und Spalten Werte fehlen. In den Tool-Optionen können Sie das Eingabedateiformat anpassen (Trennzeichen, Anführungszeichen und Kommentarzeichen festlegen). Zusätzlich können Sie die Prüfung auf leere Werte aktivieren, leere Zeilen überspringen und die Anzahl der Fehlermeldungen in der Ausgabe begrenzen.",
+ "findEmptyValues": "Leere Werte finden",
+ "findEmptyValuesDescription": "Zeigt eine Meldung zu leeren CSV-Feldern an (das sind keine fehlenden Felder, sondern Felder, die nichts enthalten).",
+ "inputTitle": "Eingabe-CSV",
+ "limitNumberOfMessages": "Anzahl der Nachrichten begrenzen",
+ "messageLimitDescription": "Legen Sie die Begrenzung der Anzahl der Nachrichten in der Ausgabe fest.",
+ "quoteCharacterDescription": "Geben Sie das Anführungszeichen ein, das zum Zitieren der CSV-Eingabefelder verwendet wird.",
+ "resultTitle": "CSV-Status",
+ "shortDescription": "Finden Sie schnell Zeilen und Spalten in CSV, in denen Werte fehlen.",
+ "title": "Unvollständige CSV-Datensätze finden",
+ "toolInfo": {
+ "title": "Was ist ein {{title}}?"
+ }
+ },
+ "insertCsvColumns": {
+ "appendColumns": "Spalten anhängen",
+ "commentCharacterDescription": "Geben Sie das Zeichen ein, das den Beginn einer Kommentarzeile kennzeichnet. Zeilen, die mit diesem Symbol beginnen, werden übersprungen.",
+ "csvOptions": "CSV-Optionen",
+ "csvSeparator": "CSV-Trennzeichen",
+ "csvToInsert": "CSV zum Einfügen",
+ "csvToInsertDescription": "Geben Sie eine oder mehrere Spalten ein, die Sie in die CSV-Datei einfügen möchten. Das Zeichen zur Spaltentrennung muss mit dem Zeichen in der CSV-Eingabedatei übereinstimmen. Hinweis: Leere Zeilen werden ignoriert.",
+ "customFillDescription": "Wenn die CSV-Eingabedatei unvollständig ist (fehlende Werte), fügen Sie den Datensätzen dann leere Felder oder benutzerdefinierte Symbole hinzu, um eine wohlgeformte CSV-Datei zu erstellen?",
+ "customFillValueDescription": "Verwenden Sie diesen benutzerdefinierten Wert, um fehlende Felder auszufüllen. (Funktioniert nur mit dem oben beschriebenen Modus „Benutzerdefinierte Werte“).",
+ "customPosition": "Benutzerdefinierte Position",
+ "customPositionOptionsDescription": "Wählen Sie die Methode zum Einfügen der Spalten in die CSV-Datei.",
+ "description": "Fügen Sie den CSV-Daten an angegebenen Positionen neue Spalten hinzu.",
+ "fillWithCustomValues": "Mit Zollwerten füllen",
+ "fillWithEmptyValues": "Mit leeren Werten füllen",
+ "headerName": "Kopfzeilenname",
+ "headerNameDescription": "Überschrift der Spalte, nach der Sie Spalten einfügen möchten.",
+ "inputTitle": "Eingabe-CSV",
+ "insertingPositionDescription": "Geben Sie an, wo die Spalten in der CSV-Datei eingefügt werden sollen.",
+ "position": "Position",
+ "positionOptions": "Positionsoptionen",
+ "prependColumns": "Spalten voranstellen",
+ "quoteCharDescription": "Geben Sie das Anführungszeichen ein, das zum Zitieren der CSV-Eingabefelder verwendet wird.",
+ "resultTitle": "Ausgabe-CSV",
+ "rowNumberDescription": "Nummer der Spalte, nach der Sie Spalten einfügen möchten.",
+ "separatorDescription": "Geben Sie das Zeichen ein, das zum Trennen von Spalten in der CSV-Eingabedatei verwendet wird.",
+ "shortDescription": "Fügen Sie schnell eine oder mehrere neue Spalten an beliebiger Stelle in einer CSV-Datei ein.",
+ "title": "CSV-Spalten einfügen",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie neue Spalten an bestimmten Positionen in CSV-Daten einfügen. Sie können Spalten basierend auf Überschriftennamen oder Spaltennummern an benutzerdefinierten Positionen voranstellen, anhängen oder einfügen.",
+ "title": "CSV-Spalten einfügen"
+ }
+ },
+ "swapCsvColumns": {
+ "description": "Laden Sie einfach Ihre CSV-Datei im untenstehenden Formular hoch und geben Sie die zu tauschenden Spalten an. Das Tool ändert dann automatisch die Positionen der angegebenen Spalten in der Ausgabedatei. In den Tool-Optionen können Sie die zu tauschenden Spaltenpositionen oder -namen angeben, unvollständige Daten korrigieren und optional leere und auskommentierte Datensätze entfernen.",
+ "longDescription": "Dieses Tool reorganisiert CSV-Daten, indem es die Positionen der Spalten tauscht. Das Tauschen von Spalten verbessert die Lesbarkeit einer CSV-Datei, indem häufig verwendete Daten zusammen oder nach vorne platziert werden, um den Vergleich und die Bearbeitung zu erleichtern. Sie können beispielsweise die erste Spalte mit der letzten oder die zweite Spalte mit der dritten tauschen. Um Spalten basierend auf ihren Positionen zu tauschen, wählen Sie das",
+ "shortDescription": "CSV-Spalten neu anordnen.",
+ "title": "CSV-Spalten austauschen"
+ },
+ "transposeCsv": {
+ "description": "Laden Sie einfach Ihre CSV-Datei in das untenstehende Formular hoch. Das Tool transponiert Ihre CSV-Datei automatisch. In den Tool-Optionen können Sie das Zeichen angeben, mit dem die Kommentarzeilen in der CSV-Datei beginnen, um diese zu entfernen. Falls die CSV-Datei unvollständig ist (fehlende Werte), können Sie fehlende Werte durch ein Leerzeichen oder ein benutzerdefiniertes Zeichen ersetzen.",
+ "longDescription": "Dieses Tool transponiert Komma-getrennte Werte (CSV). Es behandelt die CSV-Datei wie eine Datenmatrix und spiegelt alle Elemente entlang der Hauptdiagonale. Die Ausgabe enthält dieselben CSV-Daten wie die Eingabe, wobei nun alle Zeilen zu Spalten und alle Spalten zu Zeilen werden. Nach der Transposition weist die CSV-Datei entgegengesetzte Dimensionen auf. Wenn die Eingabedatei beispielsweise 4 Spalten und 3 Zeilen enthält, enthält die Ausgabedatei 3 Spalten und 4 Zeilen. Während der Konvertierung bereinigt das Programm die Daten außerdem von unnötigen Zeilen und korrigiert unvollständige Daten. Insbesondere löscht das Tool automatisch alle leeren Datensätze und Kommentare, die mit einem bestimmten Zeichen beginnen, das Sie in den Optionen festlegen können. Sollten die CSV-Daten beschädigt oder verloren gehen, ergänzt das Dienstprogramm die Datei zusätzlich mit leeren Feldern oder benutzerdefinierten Feldern, die Sie in den Optionen festlegen können. CSV-unverständlich!",
+ "shortDescription": "Transponieren Sie schnell eine CSV-Datei.",
+ "title": "CSV transponieren"
+ }
+}
diff --git a/public/locales/de/image.json b/public/locales/de/image.json
new file mode 100644
index 0000000..8a91930
--- /dev/null
+++ b/public/locales/de/image.json
@@ -0,0 +1,98 @@
+{
+ "changeColors": {
+ "description": "Welt",
+ "shortDescription": "Schnelles Austauschen der Farben in einem Bild",
+ "title": "Farben im Bild ändern"
+ },
+ "changeOpacity": {
+ "description": "Passen Sie die Transparenz Ihrer Bilder ganz einfach an. Laden Sie einfach Ihr Bild hoch, stellen Sie mit dem Schieberegler die gewünschte Deckkraft zwischen 0 (vollständig transparent) und 1 (vollständig undurchsichtig) ein und laden Sie das geänderte Bild herunter.",
+ "shortDescription": "Transparenz von Bildern anpassen",
+ "title": "Bilddeckkraft ändern"
+ },
+ "compress": {
+ "description": "Reduzieren Sie die Bilddateigröße, ohne die Qualität zu beeinträchtigen.",
+ "inputTitle": "Eingabebild",
+ "resultTitle": "Komprimiertes Bild",
+ "shortDescription": "Komprimieren Sie Bilder, um die Dateigröße zu reduzieren und gleichzeitig eine angemessene Qualität beizubehalten.",
+ "title": "Bild komprimieren"
+ },
+ "compressPng": {
+ "description": "Dies ist ein Programm zum Komprimieren von PNG-Bildern. Sobald Sie Ihr PNG-Bild in den Eingabebereich einfügen, komprimiert das Programm es und zeigt das Ergebnis im Ausgabebereich an. In den Optionen können Sie den Komprimierungsgrad anpassen und die alte und neue Bilddateigröße einsehen.",
+ "shortDescription": "PNG schnell komprimieren",
+ "title": "PNG komprimieren"
+ },
+ "convertJgpToPng": {
+ "description": "Konvertieren Sie Ihre JPG-Bilder schnell in PNG. Importieren Sie einfach Ihr PNG-Bild im Editor links",
+ "shortDescription": "Konvertieren Sie Ihre JPG-Bilder schnell in PNG",
+ "title": "Konvertieren Sie JPG in PNG"
+ },
+ "convertToJpg": {
+ "description": "Konvertieren Sie verschiedene Bildformate (PNG, GIF, TIF, PSD, SVG, WEBP, HEIC, RAW) in JPG mit anpassbaren Qualitäts- und Hintergrundfarbeinstellungen.",
+ "shortDescription": "Konvertieren Sie Bilder mit Qualitätskontrolle in JPG",
+ "title": "Bilder in JPG konvertieren"
+ },
+ "createTransparent": {
+ "description": "Welt",
+ "shortDescription": "Machen Sie ein Bild schnell transparent",
+ "title": "Transparentes PNG erstellen"
+ },
+ "crop": {
+ "description": "Schneiden Sie Bilder zu, um unerwünschte Bereiche zu entfernen.",
+ "inputTitle": "Eingabebild",
+ "resultTitle": "Zugeschnittenes Bild",
+ "shortDescription": "Bilder schnell zuschneiden.",
+ "title": "Bild zuschneiden"
+ },
+ "editor": {
+ "description": "Erweiterter Bildeditor mit Werkzeugen zum Zuschneiden, Drehen, Kommentieren, Anpassen von Farben und Hinzufügen von Wasserzeichen. Bearbeiten Sie Ihre Bilder mit professionellen Werkzeugen direkt in Ihrem Browser.",
+ "shortDescription": "Bearbeiten Sie Bilder mit erweiterten Tools und Funktionen",
+ "title": "Bildeditor"
+ },
+ "imageToText": {
+ "description": "Extrahieren Sie Text aus Bildern (JPG, PNG) mithilfe der optischen Zeichenerkennung (OCR).",
+ "shortDescription": "Extrahieren Sie mithilfe von OCR Text aus Bildern.",
+ "title": "Bild zu Text (OCR)"
+ },
+ "qrCode": {
+ "description": "Generieren Sie QR-Codes für verschiedene Datentypen: URL, Text, E-Mail, Telefon, SMS, WLAN, vCard und mehr.",
+ "shortDescription": "Erstellen Sie individuelle QR-Codes für verschiedene Datenformate.",
+ "title": "QR-Code-Generator"
+ },
+ "removeBackground": {
+ "description": "Welt",
+ "shortDescription": "Hintergründe automatisch aus Bildern entfernen",
+ "title": "Hintergrund aus Bild entfernen"
+ },
+ "resize": {
+ "description": "Passen Sie die Größe von Bildern an andere Abmessungen an.",
+ "dimensionType": "Dimensionstyp",
+ "heightDescription": "Höhe (in Pixeln)",
+ "inputTitle": "Eingabebild",
+ "maintainAspectRatio": "Seitenverhältnis beibehalten",
+ "maintainAspectRatioDescription": "Behalten Sie das ursprüngliche Seitenverhältnis des Bildes bei.",
+ "percentage": "Prozentsatz",
+ "percentageDescription": "Prozentsatz der Originalgröße (z. B. 50 für halbe Größe, 200 für doppelte Größe)",
+ "resizeByPercentage": "Größe um Prozent ändern",
+ "resizeByPercentageDescription": "Ändern Sie die Größe, indem Sie einen Prozentsatz der Originalgröße angeben.",
+ "resizeByPixels": "Größe in Pixeln ändern",
+ "resizeByPixelsDescription": "Ändern Sie die Größe, indem Sie die Abmessungen in Pixeln angeben.",
+ "resizeMethod": "Größenänderungsmethode",
+ "resultTitle": "Bildgröße geändert",
+ "setHeight": "Höhe festlegen",
+ "setHeightDescription": "Geben Sie die Höhe in Pixeln an und berechnen Sie die Breite basierend auf dem Seitenverhältnis.",
+ "setWidth": "Breite festlegen",
+ "setWidthDescription": "Geben Sie die Breite in Pixeln an und berechnen Sie die Höhe basierend auf dem Seitenverhältnis.",
+ "shortDescription": "Ändern Sie die Größe von Bildern ganz einfach.",
+ "title": "Bildgröße ändern",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie die Größe von JPG-, PNG-, SVG- und GIF-Bildern ändern. Sie können die Größe ändern, indem Sie die Abmessungen in Pixeln oder Prozent angeben und das ursprüngliche Seitenverhältnis beibehalten.",
+ "title": "Bildgröße ändern"
+ },
+ "widthDescription": "Breite (in Pixeln)"
+ },
+ "rotate": {
+ "description": "Drehen Sie ein Bild um einen bestimmten Winkel.",
+ "shortDescription": "Drehen Sie ein Bild ganz einfach.",
+ "title": "Bild drehen"
+ }
+}
diff --git a/public/locales/de/json.json b/public/locales/de/json.json
new file mode 100644
index 0000000..23d63cb
--- /dev/null
+++ b/public/locales/de/json.json
@@ -0,0 +1,62 @@
+{
+ "escapeJson": {
+ "description": "Escapen Sie Sonderzeichen in JSON-Strings. Konvertieren Sie JSON-Daten in ein korrekt maskiertes Format für eine sichere Übertragung oder Speicherung.",
+ "shortDescription": "Escape-Sonderzeichen in JSON",
+ "title": "Escape-JSON"
+ },
+ "jsonToXml": {
+ "description": "Konvertieren Sie JSON-Daten in das XML-Format. Transformieren Sie strukturierte JSON-Objekte in wohlgeformte XML-Dokumente.",
+ "shortDescription": "Konvertieren Sie JSON in das XML-Format",
+ "title": "JSON zu XML"
+ },
+ "minify": {
+ "description": "Entfernen Sie alle unnötigen Leerzeichen aus JSON.",
+ "inputTitle": "JSON-Eingabe",
+ "resultTitle": "Minimiertes JSON",
+ "shortDescription": "Minimieren Sie JSON durch Entfernen von Leerzeichen",
+ "title": "JSON minimieren",
+ "toolInfo": {
+ "description": "Bei der JSON-Minimierung werden alle unnötigen Leerzeichen aus JSON-Daten entfernt, ohne dass deren Gültigkeit verloren geht. Dazu gehören Leerzeichen, Zeilenumbrüche und Einrückungen, die für die korrekte JSON-Analyse nicht erforderlich sind. Durch die Minimierung wird die Größe von JSON-Daten reduziert, wodurch die Speicherung und Übertragung effizienter wird, während die Datenstruktur und die Werte unverändert bleiben.",
+ "title": "Was ist JSON-Minimierung?"
+ }
+ },
+ "prettify": {
+ "description": "Formatieren Sie JSON mit den richtigen Einrückungen und Abständen.",
+ "indentation": "Vertiefung",
+ "inputTitle": "JSON-Eingabe",
+ "resultTitle": "Verschönertes JSON",
+ "shortDescription": "Formatieren und Verschönern von JSON-Code",
+ "title": "JSON verschönern",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie JSON-Daten mit den richtigen Einrückungen und Abständen formatieren, sodass sie besser lesbar und einfacher zu bearbeiten sind.",
+ "title": "JSON verschönern"
+ },
+ "useSpaces": "Räume verwenden",
+ "useSpacesDescription": "Ausgabe mit Leerzeichen einrücken",
+ "useTabs": "Verwenden von Registerkarten",
+ "useTabsDescription": "Einrücken der Ausgabe mit Tabulatoren."
+ },
+ "stringify": {
+ "description": "Konvertieren Sie JavaScript-Objekte in das JSON-String-Format. Serialisieren Sie Datenstrukturen zur Speicherung oder Übertragung in JSON-Strings.",
+ "shortDescription": "Konvertieren Sie Objekte in JSON-Zeichenfolgen",
+ "title": "Stringify JSON"
+ },
+ "tsvToJson": {
+ "description": "Konvertieren Sie TSV-Daten (Tab-Separated Values) in das JSON-Format. Transformieren Sie tabellarische Daten in strukturierte JSON-Objekte.",
+ "shortDescription": "Konvertieren Sie TSV in das JSON-Format",
+ "title": "TSV zu JSON"
+ },
+ "validateJson": {
+ "description": "Überprüfen Sie, ob JSON gültig und wohlgeformt ist.",
+ "inputTitle": "JSON-Eingabe",
+ "invalidJson": "❌ {{error}}",
+ "resultTitle": "Validierungsergebnis",
+ "shortDescription": "JSON-Code auf Fehler überprüfen",
+ "title": "JSON validieren",
+ "toolInfo": {
+ "description": "JSON (JavaScript Object Notation) ist ein einfaches Datenaustauschformat. Die JSON-Validierung stellt sicher, dass die Datenstruktur dem JSON-Standard entspricht. Ein gültiges JSON-Objekt muss Folgendes enthalten: – Eigenschaftsnamen in doppelten Anführungszeichen. – Ausgewogene geschweifte Klammern {}. – Keine abschließenden Kommas nach dem letzten Schlüssel-Wert-Paar. – Korrekte Verschachtelung von Objekten und Arrays. Dieses Tool prüft das eingegebene JSON und gibt Feedback, um häufige Fehler zu identifizieren und zu beheben.",
+ "title": "Was ist JSON-Validierung?"
+ },
+ "validJson": "✅ Gültiges JSON"
+ }
+}
diff --git a/public/locales/de/list.json b/public/locales/de/list.json
new file mode 100644
index 0000000..5487dac
--- /dev/null
+++ b/public/locales/de/list.json
@@ -0,0 +1,208 @@
+{
+ "duplicate": {
+ "concatenate": "Verketten",
+ "concatenateDescription": "Kopien verketten (wenn nicht aktiviert, werden die Elemente miteinander verwoben)",
+ "copyDescription": "Anzahl der Kopien (kann Bruchteile sein)",
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Duplizieren von Listeneinträgen. Geben Sie Ihre Liste ein und legen Sie die Duplizierungskriterien fest, um Kopien von Einträgen zu erstellen. Ideal für Datenerweiterungen, Tests oder die Erstellung wiederkehrender Muster.",
+ "duplicationOptions": "Duplizierungsoptionen",
+ "examples": {
+ "fractional": {
+ "description": "Dieses Beispiel zeigt, wie eine Liste mit einer Bruchzahl von Kopien dupliziert wird.",
+ "title": "Bruchduplizierung"
+ },
+ "interweave": {
+ "description": "Dieses Beispiel zeigt, wie Elemente miteinander verwoben werden, anstatt sie zu verketten.",
+ "title": "Verweben von Gegenständen"
+ },
+ "reverse": {
+ "description": "Dieses Beispiel zeigt, wie eine Liste in umgekehrter Reihenfolge dupliziert wird.",
+ "title": "Rückwärtsduplizierung"
+ },
+ "simple": {
+ "description": "Dieses Beispiel zeigt, wie eine Liste von Wörtern dupliziert wird.",
+ "title": "Einfache Vervielfältigung"
+ }
+ },
+ "inputTitle": "Eingabeliste",
+ "joinSeparatorDescription": "Trennzeichen zum Verbinden der duplizierten Liste",
+ "resultTitle": "Duplizierte Liste",
+ "reverse": "Umkehren",
+ "reverseDescription": "Umkehren der duplizierten Elemente",
+ "shortDescription": "Doppelte Listenelemente mit angegebenen Kriterien",
+ "splitByRegex": "Aufteilen nach regulärem Ausdruck",
+ "splitBySymbol": "Nach Symbol teilen",
+ "splitOptions": "Teilungsoptionen",
+ "splitSeparatorDescription": "Trennzeichen zum Teilen der Liste",
+ "title": "Duplikat",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie Elemente einer Liste duplizieren. Sie können die Anzahl der Kopien (einschließlich Bruchzahlen) festlegen, steuern, ob Elemente verknüpft oder verwoben werden, und sogar die Duplikate umkehren. Es ist nützlich, um wiederkehrende Muster zu erstellen, Testdaten zu generieren oder Listen mit vorhersehbarem Inhalt zu erweitern.",
+ "title": "Listenduplizierung"
+ }
+ },
+ "findMostPopular": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Auffinden der beliebtesten Elemente in einer Liste. Geben Sie Ihre Liste ein und erhalten Sie sofort die am häufigsten vorkommenden Elemente. Ideal für Datenanalysen, Trenderkennung oder die Suche nach gemeinsamen Elementen.",
+ "shortDescription": "Am häufigsten vorkommende Elemente finden",
+ "title": "Finden Sie die beliebtesten"
+ },
+ "findUnique": {
+ "caseSensitiveItems": "Groß- und Kleinschreibung beachten",
+ "caseSensitiveItemsDescription": "Geben Sie Elemente mit unterschiedlicher Groß-/Kleinschreibung als eindeutige Elemente in der Liste aus.",
+ "delimiterDescription": "Legen Sie ein Trennsymbol oder einen regulären Ausdruck fest.",
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Auffinden eindeutiger Elemente in einer Liste. Geben Sie Ihre Liste ein und erhalten Sie sofort alle eindeutigen Werte, ohne Duplikate. Ideal für Datenbereinigung, Deduplizierung oder das Auffinden eindeutiger Elemente.",
+ "findAbsolutelyUniqueItems": "Finden Sie absolut einzigartige Artikel",
+ "findAbsolutelyUniqueItemsDescription": "Zeigen Sie nur die Elemente der Liste an, die in einer einzigen Kopie vorhanden sind.",
+ "inputListDelimiter": "Eingabelisten-Trennzeichen",
+ "inputTitle": "Eingabeliste",
+ "outputListDelimiter": "Ausgabelisten-Trennzeichen",
+ "resultTitle": "Einzigartige Gegenstände",
+ "shortDescription": "Suchen Sie nach eindeutigen Elementen in einer Liste",
+ "skipEmptyItems": "Leere Elemente überspringen",
+ "skipEmptyItemsDescription": "Schließen Sie die leeren Listenelemente nicht in die Ausgabe ein.",
+ "title": "Finden Sie einzigartige",
+ "trimItems": "Listenelemente kürzen",
+ "trimItemsDescription": "Entfernen Sie vor dem Vergleichen von Elementen führende und nachfolgende Leerzeichen.",
+ "uniqueItemOptions": "Einzigartige Artikeloptionen"
+ },
+ "group": {
+ "deleteEmptyItems": "Leere Elemente löschen",
+ "deleteEmptyItemsDescription": "Ignorieren Sie leere Elemente und nehmen Sie sie nicht in die Gruppen auf.",
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Gruppieren von Listenelementen. Geben Sie Ihre Liste ein und legen Sie Gruppierungskriterien fest, um Elemente in logische Gruppen zu ordnen. Ideal zum Kategorisieren von Daten, Organisieren von Informationen oder Erstellen strukturierter Listen. Unterstützt benutzerdefinierte Trennzeichen und verschiedene Gruppierungsoptionen.",
+ "emptyItemsAndPadding": "Leere Elemente und Polsterung",
+ "groupNumberDescription": "Anzahl der Elemente in einer Gruppe",
+ "groupSeparatorDescription": "Gruppentrennzeichen",
+ "groupSizeAndSeparators": "Gruppengröße und Trennzeichen",
+ "inputItemSeparator": "Eingabeelement-Trennzeichen",
+ "inputTitle": "Eingabeliste",
+ "itemSeparatorDescription": "Elementtrennzeichen",
+ "leftWrapDescription": "Linkes Umbruchsymbol der Gruppe.",
+ "padNonFullGroups": "Nicht volle Gruppen auffüllen",
+ "padNonFullGroupsDescription": "Füllen Sie nicht volle Gruppen mit einem benutzerdefinierten Element (unten eingeben).",
+ "paddingCharDescription": "Verwenden Sie dieses Zeichen oder Element, um nicht volle Gruppen aufzufüllen.",
+ "resultTitle": "Gruppierte Elemente",
+ "rightWrapDescription": "Rechtes Umbruchsymbol der Gruppe.",
+ "shortDescription": "Gruppieren Sie Listenelemente nach gemeinsamen Eigenschaften",
+ "splitOperators": {
+ "regex": {
+ "description": "Begrenzen Sie die Elemente der Eingabeliste mit einem regulären Ausdruck.",
+ "title": "Verwenden Sie einen regulären Ausdruck zum Aufteilen"
+ },
+ "symbol": {
+ "description": "Begrenzen Sie die Elemente der Eingabeliste durch ein Zeichen.",
+ "title": "Verwenden Sie ein Symbol zum Teilen"
+ }
+ },
+ "splitSeparatorDescription": "Legen Sie ein Trennsymbol oder einen regulären Ausdruck fest.",
+ "title": "Gruppe"
+ },
+ "reverse": {
+ "description": "Diese einfache browserbasierte Anwendung druckt alle Listenelemente rückwärts. Die Eingabeelemente können durch ein beliebiges Symbol getrennt werden. Sie können auch das Trennzeichen der umgekehrten Listenelemente ändern.",
+ "inputTitle": "Eingabeliste",
+ "itemSeparator": "Elementtrennzeichen",
+ "itemSeparatorDescription": "Legen Sie ein Trennsymbol oder einen regulären Ausdruck fest.",
+ "outputListOptions": "Ausgabelistenoptionen",
+ "outputSeparatorDescription": "Trennzeichen für Ausgabelistenelemente.",
+ "resultTitle": "Umgekehrte Liste",
+ "shortDescription": "Schnelles Umkehren einer Liste",
+ "splitOperators": {
+ "regex": {
+ "description": "Begrenzen Sie die Elemente der Eingabeliste mit einem regulären Ausdruck.",
+ "title": "Verwenden Sie einen regulären Ausdruck zum Aufteilen"
+ },
+ "symbol": {
+ "description": "Begrenzen Sie die Elemente der Eingabeliste durch ein Zeichen.",
+ "title": "Verwenden Sie ein Symbol zum Teilen"
+ }
+ },
+ "splitterMode": "Splitter-Modus",
+ "title": "Umkehren",
+ "toolInfo": {
+ "description": "Mit diesem Dienstprogramm können Sie die Reihenfolge der Elemente in einer Liste umkehren. Das Dienstprogramm zerlegt die Eingabeliste zunächst in einzelne Elemente und durchläuft diese dann vom letzten bis zum ersten Element. Dabei wird jedes Element ausgegeben. Die Eingabeliste kann alles enthalten, was sich als Text darstellen lässt, z. B. Ziffern, Zahlen, Zeichenfolgen, Wörter, Sätze usw. Das Trennzeichen für die Eingabeelemente kann auch ein regulärer Ausdruck sein. Beispielsweise ermöglicht der reguläre Ausdruck /[;,]/ die Verwendung von Elementen, die entweder durch Kommas oder Semikolons getrennt sind. Die Trennzeichen für die Elemente der Eingabe- und Ausgabeliste können in den Optionen angepasst werden. Standardmäßig sind sowohl die Eingabe- als auch die Ausgabelisten durch Kommas getrennt. Listabulous!",
+ "title": "Was ist ein Listenumkehrer?"
+ }
+ },
+ "rotate": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Rotieren von Listenelementen. Geben Sie Ihre Liste ein und legen Sie den Rotationsgrad fest, um die Elemente um eine bestimmte Anzahl von Positionen zu verschieben. Ideal für Datenmanipulation, zyklische Verschiebungen oder das Neuordnen von Listen.",
+ "shortDescription": "Listenelemente um angegebene Positionen rotieren",
+ "title": "Drehen"
+ },
+ "shuffle": {
+ "delimiterDescription": "Legen Sie ein Trennsymbol oder einen regulären Ausdruck fest.",
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Mischen von Listenelementen. Geben Sie Ihre Liste ein und erhalten Sie sofort eine zufällige Version mit Elementen in zufälliger Reihenfolge. Perfekt, um Abwechslung zu schaffen, Zufälligkeit zu testen oder geordnete Daten zu vermischen.",
+ "inputListSeparator": "Eingabelistentrennzeichen",
+ "inputTitle": "Eingabeliste",
+ "joinSeparatorDescription": "Verwenden Sie dieses Trennzeichen in der zufälligen Liste.",
+ "outputLengthDescription": "So viele zufällige Elemente ausgeben",
+ "resultTitle": "Gemischte Liste",
+ "shortDescription": "Zufällige Reihenfolge der Listenelemente",
+ "shuffledListLength": "Länge der gemischten Liste",
+ "shuffledListSeparator": "Trennzeichen für gemischte Listen",
+ "title": "Shuffle"
+ },
+ "sort": {
+ "caseSensitive": "Groß-/Kleinschreibung beachten",
+ "caseSensitiveDescription": "Groß- und Kleinbuchstaben werden getrennt sortiert. Großbuchstaben stehen in aufsteigender Reihenfolge vor Kleinbuchstaben. (Funktioniert nur im alphabetischen Sortiermodus.)",
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Sortieren von Listenelementen. Geben Sie Ihre Liste ein und legen Sie Sortierkriterien fest, um die Elemente in auf- oder absteigender Reihenfolge zu sortieren. Ideal für die Datenorganisation, Textverarbeitung oder das Erstellen sortierter Listen.",
+ "inputItemSeparator": "Trennzeichen für Eingabeelemente",
+ "inputTitle": "Eingabeliste",
+ "joinSeparatorDescription": "Verwenden Sie dieses Symbol als Verbindung zwischen Elementen in einer sortierten Liste.",
+ "orderDescription": "Wählen Sie eine Sortierreihenfolge aus.",
+ "orderOptions": {
+ "decreasing": "Absteigende Reihenfolge",
+ "increasing": "Zunehmende Ordnung"
+ },
+ "removeDuplicates": "Duplikate entfernen",
+ "removeDuplicatesDescription": "Löschen Sie doppelte Listenelemente.",
+ "resultTitle": "Sortierte Liste",
+ "shortDescription": "Listenelemente in angegebener Reihenfolge sortieren",
+ "sortMethod": "Sortiermethode",
+ "sortMethodDescription": "Wählen Sie eine Sortiermethode aus.",
+ "sortOptions": {
+ "alphabetic": "Alphabetisch sortieren",
+ "length": "Nach Länge sortieren",
+ "numeric": "Numerisch sortieren"
+ },
+ "sortedItemProperties": "Sortierte Artikeleigenschaften",
+ "splitOperators": {
+ "regex": {
+ "description": "Begrenzen Sie die Elemente der Eingabeliste mit einem regulären Ausdruck.",
+ "title": "Verwenden Sie einen regulären Ausdruck zum Aufteilen"
+ },
+ "symbol": {
+ "description": "Trennen Sie die Elemente der Eingabeliste durch ein Zeichen.",
+ "title": "Verwenden Sie ein Symbol zum Teilen"
+ }
+ },
+ "splitSeparatorDescription": "Legen Sie ein Trennsymbol oder einen regulären Ausdruck fest.",
+ "title": "Sortieren"
+ },
+ "truncate": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Kürzen von Listen. Geben Sie Ihre Liste ein und legen Sie die maximale Anzahl der zu behaltenden Elemente fest. Ideal für die Datenverarbeitung, Listenverwaltung oder die Begrenzung der Inhaltslänge.",
+ "shortDescription": "Liste auf die angegebene Anzahl von Elementen kürzen",
+ "title": "Kürzen"
+ },
+ "unwrap": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Entpacken von Listenelementen. Geben Sie Ihre verpackte Liste ein und legen Sie Entpackkriterien fest, um organisierte Elemente zu vereinfachen. Ideal für die Datenverarbeitung, Textbearbeitung oder das Extrahieren von Inhalten aus strukturierten Listen.",
+ "shortDescription": "Listenelemente aus strukturiertem Format auspacken",
+ "title": "Auspacken"
+ },
+ "wrap": {
+ "description": "Fügen Sie vor und nach jedem Listenelement Text hinzu.",
+ "inputTitle": "Eingabeliste",
+ "joinSeparatorDescription": "Trennzeichen zum Verbinden der umschlossenen Liste",
+ "leftTextDescription": "Vor jedem Element hinzuzufügender Text",
+ "removeEmptyItems": "Leere Elemente entfernen",
+ "resultTitle": "Umbrochene Liste",
+ "rightTextDescription": "Nach jedem Element hinzuzufügender Text",
+ "shortDescription": "Listenelemente mit angegebenen Kriterien umbrechen",
+ "splitByRegex": "Aufteilen nach regulärem Ausdruck",
+ "splitBySymbol": "Nach Symbol teilen",
+ "splitOptions": "Teilungsoptionen",
+ "splitSeparatorDescription": "Trennzeichen zum Teilen der Liste",
+ "title": "Wickeln",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie vor und nach jedem Listenelement Text hinzufügen. Sie können für die linke und rechte Seite unterschiedlichen Text festlegen und die Verarbeitung der Liste steuern. Es ist nützlich, um Listenelemente mit Anführungszeichen, Klammern oder anderen Formatierungen zu versehen, Daten für verschiedene Formate vorzubereiten oder strukturierten Text zu erstellen.",
+ "title": "Listenumbruch"
+ },
+ "wrapOptions": "Wrap-Optionen"
+ }
+}
diff --git a/public/locales/de/number.json b/public/locales/de/number.json
new file mode 100644
index 0000000..a65892e
--- /dev/null
+++ b/public/locales/de/number.json
@@ -0,0 +1,89 @@
+{
+ "arithmeticSequence": {
+ "commonDifferenceDescription": "Gemeinsamer Unterschied zwischen Begriffen (d)",
+ "description": "Generieren Sie arithmetische Folgen mit anpassbaren Parametern.",
+ "firstTermDescription": "Erster Term der Folge (a₁)",
+ "numberOfTermsDescription": "Anzahl der zu generierenden Terme (n)",
+ "outputFormat": "Ausgabeformat",
+ "resultTitle": "Generierte Sequenz",
+ "separatorDescription": "Trennzeichen zwischen Begriffen",
+ "sequenceParameters": "Sequenzparameter",
+ "shortDescription": "Arithmetische Folgen generieren",
+ "title": "Arithmetische Folge",
+ "toolInfo": {
+ "description": "Eine arithmetische Folge ist eine Zahlenfolge, bei der die Differenz zwischen den aufeinanderfolgenden Termen konstant ist. Diese konstante Differenz wird als gemeinsame Differenz bezeichnet. Gegeben sind der erste Term (a₁) und die gemeinsame Differenz (d). Jeder Term kann durch Addition der gemeinsamen Differenz zum vorherigen Term ermittelt werden.",
+ "title": "Was ist eine arithmetische Folge?"
+ }
+ },
+ "generate": {
+ "arithmeticSequenceOption": "Arithmetische Sequenzoption",
+ "description": "Generieren Sie eine Zahlenfolge mit anpassbaren Parametern.",
+ "numberOfElementsDescription": "Anzahl der Elemente in der Sequenz.",
+ "resultTitle": "Generierte Zahlen",
+ "separator": "Separator",
+ "separatorDescription": "Trennen Sie Elemente in der arithmetischen Folge durch dieses Zeichen.",
+ "shortDescription": "Generieren Sie Zufallszahlen in angegebenen Bereichen",
+ "startSequenceDescription": "Starten Sie die Sequenz ab dieser Nummer.",
+ "stepDescription": "Erhöhen Sie jedes Element um diesen Betrag",
+ "title": "Erzeugen",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie eine Zahlenfolge mit anpassbaren Parametern generieren. Sie können den Startwert, die Schrittweite und die Anzahl der Elemente festlegen.",
+ "title": "Zahlen generieren"
+ }
+ },
+ "ohmsLaw": {
+ "description": "Berechnet Spannung, Strom und Widerstand",
+ "longDescription": "Dieser Rechner wendet das Ohmsche Gesetz (V = I × R) an, um drei elektrische Parameter zu bestimmen, wenn die beiden anderen bekannt sind. Das Ohmsche Gesetz ist ein grundlegendes Prinzip der Elektrotechnik und beschreibt die Beziehung zwischen Spannung (V), Stromstärke (I) und Widerstand (R). Dieses Tool ist unverzichtbar für Elektronikbastler, Elektroingenieure und Studierende, die mit Schaltkreisen arbeiten, um unbekannte Werte in ihren elektrischen Konstruktionen schnell zu berechnen.",
+ "shortDescription": "Berechnen Sie Spannung, Strom oder Widerstand in Stromkreisen mit dem Ohmschen Gesetz",
+ "title": "Ohmsches Gesetz"
+ },
+ "slackline": {
+ "description": "Berechnet die Spannung einer Slackline",
+ "longDescription": "Dieser Rechner geht von einer Last in der Mitte des Seils aus",
+ "shortDescription": "Berechne die ungefähre Spannung einer Slackline oder Wäscheleine. Verlasse dich aus Sicherheitsgründen nicht darauf.",
+ "title": "Slackline-Spannung"
+ },
+ "sphereArea": {
+ "description": "Fläche einer Kugel",
+ "longDescription": "Dieser Rechner berechnet die Oberfläche einer Kugel mit der Formel A = 4πr². Sie können entweder den Radius eingeben, um die Oberfläche zu berechnen, oder die Oberfläche eingeben, um den gewünschten Radius zu berechnen. Dieses Tool ist nützlich für Geometriestudenten, Ingenieure, die mit sphärischen Objekten arbeiten, und alle, die Berechnungen mit sphärischen Oberflächen durchführen müssen.",
+ "shortDescription": "Berechnen Sie die Oberfläche einer Kugel anhand ihres Radius",
+ "title": "Fläche einer Kugel"
+ },
+ "sphereVolume": {
+ "description": "Volumen einer Kugel",
+ "longDescription": "Dieser Rechner berechnet das Volumen einer Kugel mit der Formel V = (4/3)πr³. Sie können entweder den Radius oder den Durchmesser eingeben, um das Volumen zu ermitteln, oder das Volumen eingeben, um den gewünschten Radius zu bestimmen. Das Tool ist nützlich für Studierende, Ingenieure und Fachleute, die mit kugelförmigen Objekten in Bereichen wie Physik, Ingenieurwesen und Fertigung arbeiten.",
+ "shortDescription": "Berechnen Sie das Volumen einer Kugel anhand des Radius oder Durchmessers",
+ "title": "Volumen einer Kugel"
+ },
+ "sum": {
+ "description": "Berechnen Sie die Summe einer Zahlenliste. Geben Sie die Zahlen durch Kommas oder Zeilenumbrüche getrennt ein, um die Gesamtsumme zu erhalten.",
+ "extractionTypes": {
+ "delimiter": {
+ "description": "Passen Sie hier das Zahlentrennzeichen an. (Standardmäßig ein Zeilenumbruch.)",
+ "title": "Zahlentrennzeichen"
+ },
+ "smart": {
+ "description": "Automatische Erkennung von Zahlen in der Eingabe.",
+ "title": "Smart Sum"
+ }
+ },
+ "inputTitle": "Eingang",
+ "numberExtraction": "Zahlenextraktion",
+ "printRunningSum": "Laufende Summe drucken",
+ "printRunningSumDescription": "Zeigen Sie die Summe an, während sie Schritt für Schritt berechnet wird.",
+ "resultTitle": "Gesamt",
+ "runningSum": "Laufende Summe",
+ "shortDescription": "Summe der Zahlen berechnen",
+ "title": "Summe",
+ "toolInfo": {
+ "description": "Dies ist ein browserbasiertes Online-Dienstprogramm zum Berechnen der Summe mehrerer Zahlen. Sie können die Zahlen durch Komma, Leerzeichen oder ein beliebiges anderes Zeichen (einschließlich Zeilenumbruch) getrennt eingeben. Sie können auch einfach einen Textabschnitt mit numerischen Werten einfügen, die Sie summieren möchten. Das Dienstprogramm extrahiert diese und berechnet deren Summe.",
+ "title": "Was ist ein Zahlensummenrechner?"
+ }
+ },
+ "voltageDropInWire": {
+ "description": "Berechnet die Rundreisespannung und den Leistungsverlust in einem 2-adrigen Kabel",
+ "longDescription": "Dieser Rechner hilft bei der Ermittlung des Spannungsabfalls und der Verlustleistung in einem zweiadrigen Elektrokabel. Er berücksichtigt Kabellänge, Drahtquerschnitt, Materialwiderstand und Stromfluss. Das Tool berechnet den Hin- und Rückspannungsabfall, den Gesamtwiderstand des Kabels und die in Wärme umgewandelte Leistung. Dies ist besonders nützlich für Elektroingenieure, Elektriker und Bastler bei der Konstruktion elektrischer Systeme, um sicherzustellen, dass die Spannungspegel an der Last innerhalb akzeptabler Grenzen bleiben.",
+ "shortDescription": "Berechnen Sie Spannungsabfall und Leistungsverlust in elektrischen Kabeln basierend auf Länge, Material und Stromstärke",
+ "title": "Hin- und Rückspannungsabfall im Kabel"
+ }
+}
diff --git a/public/locales/de/pdf.json b/public/locales/de/pdf.json
new file mode 100644
index 0000000..49a336c
--- /dev/null
+++ b/public/locales/de/pdf.json
@@ -0,0 +1,113 @@
+{
+ "compressPdf": {
+ "compressedFileSize": "Komprimierte Dateigröße",
+ "compressingPdf": "PDF wird komprimiert...",
+ "compressionLevel": "Komprimierungsstufe",
+ "compressionSettings": "Komprimierungseinstellungen",
+ "description": "Reduzieren Sie die PDF-Dateigröße bei gleichbleibender Qualität mit Ghostscript",
+ "errorCompressingPdf": "PDF konnte nicht komprimiert werden: {{error}}",
+ "errorReadingPdf": "PDF-Datei konnte nicht gelesen werden. Bitte stellen Sie sicher, dass es sich um eine gültige PDF-Datei handelt.",
+ "fileSize": "Originaldateigröße",
+ "highCompression": "Hohe Kompression",
+ "highCompressionDescription": "Maximale Reduzierung der Dateigröße mit gewissem Qualitätsverlust",
+ "inputTitle": "Eingabe-PDF",
+ "lowCompression": "Geringe Kompression",
+ "lowCompressionDescription": "Reduzieren Sie die Dateigröße leicht mit minimalem Qualitätsverlust",
+ "mediumCompression": "Mittlere Kompression",
+ "mediumCompressionDescription": "Gleichgewicht zwischen Dateigröße und Qualität",
+ "pages": "Seitenanzahl",
+ "resultTitle": "Komprimiertes PDF",
+ "shortDescription": "Komprimieren Sie PDF-Dateien sicher in Ihrem Browser",
+ "title": "PDF komprimieren"
+ },
+ "editor": {
+ "description": "Erweiterter PDF-Editor mit Funktionen zum Kommentieren, Ausfüllen von Formularen, Hervorheben und Exportieren. Bearbeiten Sie Ihre PDFs direkt im Browser mit professionellen Tools wie Texteinfügung, Zeichnen, Hervorheben, Unterschreiben und Ausfüllen von Formularen.",
+ "shortDescription": "Bearbeiten Sie PDFs mit erweiterten Werkzeugen zum Kommentieren, Signieren und Bearbeiten",
+ "title": "PDF Editor"
+ },
+ "merge": {
+ "inputTitle": "Eingabe-PDF",
+ "loadingText": "Seiten extrahieren",
+ "resultTitle": "Zusammengeführtes PDF ausgeben",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie mehrere PDF-Dateien zu einem einzigen Dokument zusammenführen. Laden Sie dazu einfach die zusammenzuführenden PDF-Dateien hoch. Das Tool fügt dann alle Seiten der Eingabedateien zu einem einzigen PDF-Dokument zusammen.",
+ "title": "Wie verwende ich das Tool zum Zusammenführen von PDFs?"
+ }
+ },
+ "mergePdf": {
+ "description": "Kombinieren Sie mehrere PDF-Dateien zu einem einzigen Dokument.",
+ "inputTitle": "Eingabe-PDFs",
+ "mergingPdfs": "PDFs zusammenführen",
+ "pdfOptions": "PDF-Optionen",
+ "resultTitle": "Zusammengeführte PDF",
+ "shortDescription": "Mehrere PDF-Dateien zu einem einzigen Dokument zusammenführen",
+ "sortByFileName": "Nach Dateinamen sortieren",
+ "sortByFileNameDescription": "PDFs alphabetisch nach Dateinamen sortieren",
+ "sortByUploadOrder": "Nach Upload-Reihenfolge sortieren",
+ "sortByUploadOrderDescription": "Behalten Sie PDFs in der Reihenfolge bei, in der sie hochgeladen wurden",
+ "title": "PDF zusammenführen",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie mehrere PDF-Dateien zu einem einzigen Dokument zusammenführen. Sie können die Sortierung der PDFs wählen, und das Tool fügt sie in der angegebenen Reihenfolge zusammen.",
+ "title": "PDF-Dateien zusammenführen"
+ }
+ },
+ "pdfToEpub": {
+ "description": "Wandeln Sie PDF-Dokumente in EPUB-Dateien um, um eine bessere E-Reader-Kompatibilität zu erzielen.‘, Symbol: ‚Materialsymbole:Kontakte importieren‘, Komponente: lazy(() => import(‚./index‘)), Schlüsselwörter: [‚pdf‘, ‚epub‘, ‚konvertieren‘, ‚ebook‘], Pfad: ‚pdf-zu-epub‘, i18n: {Name: ‚pdf:pdfToEpub.title‘, Beschreibung: ‚pdf:pdfToEpub.description‘",
+ "shortDescription": "Konvertieren Sie PDF-Dateien in das EPUB-Format",
+ "title": "PDF zu EPUB"
+ },
+ "pdfToPng": {
+ "description": "Wandeln Sie PDF-Dokumente in PNG-Panels um.",
+ "longDescription": "Laden Sie eine PDF-Datei hoch und konvertieren Sie jede Seite direkt in Ihrem Browser in ein hochwertiges PNG-Bild. Dieses Tool eignet sich ideal zum Extrahieren visueller Inhalte oder zum Teilen einzelner Seiten. Es werden keine Daten hochgeladen – alles läuft lokal.",
+ "shortDescription": "Konvertieren Sie PDF in PNG-Bilder",
+ "title": "PDF zu PNG"
+ },
+ "protectPdf": {
+ "description": "Fügen Sie Ihren PDF-Dateien sicher in Ihrem Browser einen Passwortschutz hinzu",
+ "shortDescription": "PDF-Dateien sicher mit einem Passwort schützen",
+ "title": "PDF schützen"
+ },
+ "rotatePdf": {
+ "allPagesWillBeRotated": "Alle {{count}} Seiten werden gedreht",
+ "angleOptions": {
+ "clockwise90": "90° im Uhrzeigersinn",
+ "counterClockwise270": "270° (90° gegen den Uhrzeigersinn)",
+ "upsideDown180": "180° (auf den Kopf gestellt)"
+ },
+ "applyToAllPages": "Auf alle Seiten anwenden",
+ "description": "Drehen Sie Seiten in einem PDF-Dokument.",
+ "inputTitle": "Eingabe-PDF",
+ "longDescription": "Ändern Sie die Ausrichtung von PDF-Seiten, indem Sie sie um 90, 180 oder 270 Grad drehen. Nützlich zum Korrigieren falsch gescannter Dokumente oder zum Vorbereiten von PDFs für den Druck.",
+ "pageRangesDescription": "Geben Sie Seitenzahlen oder Bereiche durch Kommas getrennt ein (z. B. 1,3,5-7).",
+ "pageRangesPlaceholder": "z.B. 1,5-8",
+ "pagesWillBeRotated": "{{count}} Seite{{count !== 1 ? 's' : ''}} wird gedreht",
+ "pdfPageCount": "PDF hat {{count}} Seite{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "Gedrehtes PDF",
+ "rotatingPages": "Seiten drehen",
+ "rotationAngle": "Drehwinkel",
+ "rotationSettings": "Rotationseinstellungen",
+ "shortDescription": "Seiten in einem PDF-Dokument drehen",
+ "title": "PDF drehen",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie Seiten in einem PDF-Dokument drehen. Sie können alle Seiten drehen oder einzelne Seiten auswählen. Wählen Sie einen Drehwinkel: 90° im Uhrzeigersinn, 180° (auf dem Kopf) oder 270° (90° gegen den Uhrzeigersinn). Um bestimmte Seiten zu drehen, deaktivieren Sie „Auf alle Seiten anwenden“ und geben Sie Seitenzahlen oder -bereiche durch Kommas getrennt ein (z. B. 1, 3, 5-7).",
+ "title": "So verwenden Sie das Tool zum Drehen von PDFs"
+ }
+ },
+ "splitPdf": {
+ "description": "Extrahieren Sie bestimmte Seiten aus einem PDF-Dokument.",
+ "extractingPages": "Seiten extrahieren",
+ "inputTitle": "Eingabe-PDF",
+ "pageExtractionPreview": "{{count}} Seite{{count !== 1 ? 's' : ''}} wird extrahiert",
+ "pageRangesDescription": "Geben Sie Seitenzahlen oder Bereiche durch Kommas getrennt ein (z. B. 1,3,5-7).",
+ "pageRangesPlaceholder": "z.B. 1,5-8",
+ "pageSelection": "Seitenauswahl",
+ "pdfPageCount": "PDF hat {{count}} Seite{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "Extrahiertes PDF",
+ "shortDescription": "Extrahieren Sie bestimmte Seiten aus einer PDF-Datei",
+ "title": "PDF teilen",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie bestimmte Seiten aus einem PDF-Dokument extrahieren. Sie können einzelne Seiten oder Seitenbereiche zum Extrahieren angeben.",
+ "title": "PDF teilen"
+ }
+ }
+}
diff --git a/public/locales/de/string.json b/public/locales/de/string.json
new file mode 100644
index 0000000..0d7e847
--- /dev/null
+++ b/public/locales/de/string.json
@@ -0,0 +1,261 @@
+{
+ "base64": {
+ "decode": "Base64-Dekodierung",
+ "description": "Kodieren oder dekodieren Sie Text mit der Base64-Kodierung.",
+ "encode": "Base64-Kodierung",
+ "inputTitle": "Eingabedaten",
+ "optionsTitle": "Base64-Optionen",
+ "resultTitle": "Ergebnis",
+ "shortDescription": "Kodieren oder dekodieren Sie Daten mit Base64.",
+ "title": "Base64-Encoder/Decoder",
+ "toolInfo": {
+ "description": "Base64 ist ein Kodierungsschema, das Daten im ASCII-String-Format darstellt, indem es sie in eine Radix-64-Darstellung übersetzt. Obwohl es zur Kodierung von Strings verwendet werden kann, wird es üblicherweise zur Kodierung binärer Daten für die Übertragung über Medien verwendet, die für die Verarbeitung von Textdaten ausgelegt sind.",
+ "title": "Was ist Base64?"
+ }
+ },
+ "censor": {
+ "description": "Dienstprogramm zum Zensieren von Wörtern in Texten. Laden Sie Ihren Text in das Eingabeformular links, geben Sie alle Schimpfwörter in den Optionen an, und Sie erhalten sofort zensierten Text im Ausgabebereich., longDescription: 'Mit diesem Online-Tool können Sie bestimmte Wörter in jedem Text zensieren. Sie können eine Liste unerwünschter Wörter (z. B. Schimpfwörter oder Geheimwörter) angeben, die das Programm durch alternative Wörter ersetzt und einen lesbaren Text erstellt. Die Wörter können in einem mehrzeiligen Textfeld in den Optionen angegeben werden, indem Sie pro Zeile ein Wort eingeben.', keywords: ['text', 'zensieren', 'wörter', 'zeichen'], component: lazy(() => import('./index')), i18n: { name: 'string:censor.title', description: 'string:censor.description",
+ "shortDescription": "Maskieren Sie Schimpfwörter schnell oder ersetzen Sie sie durch alternative Wörter.",
+ "title": "Textzensur"
+ },
+ "createPalindrome": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Erstellen von Palindromen aus beliebigem Text. Geben Sie Text ein und verwandeln Sie ihn sofort in ein Palindrom, das vorwärts und rückwärts gleich gelesen wird. Ideal für Wortspiele, das Erstellen symmetrischer Textmuster oder das Erkunden sprachlicher Kuriositäten.",
+ "shortDescription": "Erstellen Sie Text, der vorwärts und rückwärts gleich gelesen wird",
+ "title": "Palindrom erstellen"
+ },
+ "extractSubstring": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Extrahieren von Teilzeichenfolgen aus Text. Geben Sie Ihren Text ein und legen Sie Start- und Endposition fest, um den gewünschten Teil zu extrahieren. Ideal für die Datenverarbeitung, Textanalyse oder das Extrahieren spezifischer Inhalte aus größeren Textblöcken.",
+ "shortDescription": "Extrahieren Sie einen Textabschnitt zwischen angegebenen Positionen",
+ "title": "Teilzeichenfolge extrahieren"
+ },
+ "join": {
+ "blankLinesAndTrailingSpaces": "Leere Zeilen und Leerzeichen am Ende",
+ "deleteBlankDescription": "Löschen Sie Zeilen, die keine Textsymbole enthalten.",
+ "deleteBlankTitle": "Leere Zeilen löschen",
+ "deleteTrailingDescription": "Entfernen Sie Leerzeichen und Tabulatoren am Zeilenende.",
+ "deleteTrailingTitle": "Löschen Sie abschließende Leerzeichen",
+ "description": "Fügen Sie Textteile mit anpassbaren Trennzeichen zusammen.",
+ "inputTitle": "Textstücke",
+ "joinCharacterDescription": "Symbol, das unterbrochene Textteile verbindet. (Standardmäßig Leerzeichen.)",
+ "joinCharacterPlaceholder": "Charakter beitreten",
+ "resultTitle": "Verbundener Text",
+ "shortDescription": "Verbinden Sie Textelemente mit einem festgelegten Trennzeichen",
+ "textMergedOptions": "Optionen für zusammengeführten Text",
+ "title": "Text verbinden",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie Textteile zusammenfügen. Es nimmt eine Liste von Textwerten, getrennt durch Zeilenumbrüche, und fügt sie zusammen. Sie können das Zeichen festlegen, das zwischen den Teilen des zusammengefügten Textes platziert wird. Außerdem können Sie alle Leerzeilen ignorieren und Leerzeichen und Tabulatoren am Zeilenende entfernen. Textabulous!",
+ "title": "Was ist ein Textverbinder?"
+ }
+ },
+ "palindrome": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zur Überprüfung von Palindromen. Überprüfen Sie sofort, ob sich Ihr Text vorwärts und rückwärts gleich liest. Ideal für Worträtsel, linguistische Analysen oder die Validierung symmetrischer Textmuster. Unterstützt verschiedene Trennzeichen und die Erkennung mehrteiliger Palindrome.",
+ "shortDescription": "Überprüfen Sie, ob der Text vorwärts und rückwärts gleich gelesen wird",
+ "title": "Palindrom"
+ },
+ "passwordGenerator": {
+ "avoidAmbiguous": "Vermeiden Sie mehrdeutige Zeichen (i, I, l, 0, O).",
+ "description": "Generieren Sie sichere, zufällige Passwörter mit anpassbarer Länge und Zeichenart. Wählen Sie zwischen Kleinbuchstaben, Großbuchstaben, Zahlen und Sonderzeichen. Optional können Sie mehrdeutige Zeichen vermeiden, um die Lesbarkeit zu verbessern.",
+ "includeLowercase": "Kleinbuchstaben einschließen (a-z)",
+ "includeNumbers": "Zahlen einschließen (0-9)",
+ "includeSymbols": "Sonderzeichen einschließen",
+ "includeUppercase": "Großbuchstaben einschließen (A-Z)",
+ "lengthDesc": "Länge des Passwortes",
+ "lengthPlaceholder": "z.B. 12",
+ "optionsTitle": "Passwortoptionen",
+ "resultTitle": "Generiertes Passwort",
+ "shortDescription": "Generieren Sie sichere, zufällige Passwörter mit benutzerdefinierten Optionen",
+ "title": "Passwortgenerator",
+ "toolInfo": {
+ "description": "Dieses Tool generiert sichere, zufällige Passwörter basierend auf Ihren ausgewählten Kriterien. Sie können die Länge anpassen, verschiedene Zeichentypen ein- oder ausschließen und mehrdeutige Zeichen für eine bessere Lesbarkeit vermeiden. Ideal für die Erstellung sicherer Passwörter für Konten, Anwendungen oder andere Sicherheitsanforderungen.",
+ "title": "Über den Passwortgenerator"
+ }
+ },
+ "quote": {
+ "allowDoubleQuotation": "Doppelte Anführungszeichen zulassen",
+ "description": "Fügen Sie mit anpassbaren Optionen Anführungszeichen um den Text hinzu.",
+ "inputTitle": "Eingabetext",
+ "leftQuoteDescription": "Anführungszeichen links",
+ "processAsMultiLine": "Als mehrzeiligen Text verarbeiten",
+ "quoteEmptyLines": "Leere Zeilen in Zitieren setzen",
+ "quoteOptions": "Angebotsoptionen",
+ "resultTitle": "Zitierter Text",
+ "rightQuoteDescription": "Anführungszeichen rechts",
+ "shortDescription": "Fügen Sie Anführungszeichen um Text mit verschiedenen Stilen hinzu",
+ "title": "Textzitierer",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie Text in Anführungszeichen setzen. Sie können verschiedene Anführungszeichen wählen, mehrzeiligen Text bearbeiten und die Verarbeitung leerer Zeilen steuern. Es ist nützlich, um Text für die Programmierung vorzubereiten, Daten zu formatieren oder stilisierten Text zu erstellen.",
+ "title": "Textzitierer"
+ }
+ },
+ "randomizeCase": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zur zufälligen Groß- und Kleinschreibung. Geben Sie Ihren Text ein und transformieren Sie ihn sofort mit zufälligen Groß- und Kleinbuchstaben. Perfekt für einzigartige Texteffekte, zum Testen der Groß- und Kleinschreibung oder zum Generieren abwechslungsreicher Textmuster.",
+ "shortDescription": "Groß- und Kleinschreibung von Buchstaben im Text zufällig anordnen",
+ "title": "Groß-/Kleinschreibung randomisieren"
+ },
+ "removeDuplicateLines": {
+ "description": "Laden Sie Ihren Text in das Eingabeformular links und Sie erhalten sofort Text ohne doppelte Zeilen im Ausgabebereich. Leistungsstark, kostenlos und schnell. Textzeilen laden – einzigartige Textzeilen erhalten",
+ "shortDescription": "Löschen Sie schnell alle wiederholten Zeilen aus dem Text",
+ "title": "Entfernen Sie doppelte Zeilen"
+ },
+ "repeat": {
+ "delimiterDescription": "Trennzeichen für Ausgabekopien.",
+ "delimiterPlaceholder": "Trennzeichen",
+ "description": "Wiederholen Sie Text mehrmals mit anpassbaren Trennzeichen.",
+ "inputTitle": "Eingabetext",
+ "numberPlaceholder": "Nummer",
+ "repeatAmountDescription": "Anzahl der Wiederholungen.",
+ "repetitionsDelimiter": "Wiederholungsbegrenzer",
+ "resultTitle": "Wiederholter Text",
+ "shortDescription": "Text mehrmals wiederholen",
+ "textRepetitions": "Textwiederholungen",
+ "title": "Text wiederholen",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie einen bestimmten Text mit einem optionalen Trennzeichen mehrmals wiederholen.",
+ "title": "Text wiederholen"
+ }
+ },
+ "reverse": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Umkehren von Text. Geben Sie beliebigen Text ein und lassen Sie ihn sofort Zeichen für Zeichen umkehren. Ideal zum Erstellen von Spiegeltext, Analysieren von Palindromen oder zum Experimentieren mit Textmustern. Leerzeichen und Sonderzeichen bleiben beim Umkehren erhalten.",
+ "inputTitle": "Umzukehrender Text",
+ "processMultiLine": "Mehrzeiligen Text verarbeiten",
+ "processMultiLineDescription": "Jede Zeile wird unabhängig umgekehrt",
+ "resultTitle": "Umgekehrter Text",
+ "reversalOptions": "Umkehroptionen",
+ "shortDescription": "Kehren Sie jeden Text Zeichen für Zeichen um",
+ "skipEmptyLines": "Leere Zeilen überspringen",
+ "skipEmptyLinesDescription": "Leere Zeilen werden aus der Ausgabe entfernt",
+ "title": "Umkehren",
+ "trimWhitespace": "Leerzeichen entfernen",
+ "trimWhitespaceDescription": "Entfernen Sie führende und nachfolgende Leerzeichen aus jeder Zeile"
+ },
+ "rot13": {
+ "description": "Kodieren oder dekodieren Sie Text mit der ROT13-Chiffre.",
+ "inputTitle": "Eingabetext",
+ "resultTitle": "ROT13-Ergebnis",
+ "shortDescription": "Kodieren oder dekodieren Sie Text mit der ROT13-Chiffre.",
+ "title": "ROT13 Encoder/Decoder",
+ "toolInfo": {
+ "description": "ROT13 (Rotate by 13 places) ist eine einfache Buchstabenersetzungs-Chiffre, die einen Buchstaben durch den 13. Buchstaben im Alphabet ersetzt. ROT13 ist ein Sonderfall der Caesar-Chiffre, die im antiken Rom entwickelt wurde. Da das englische Alphabet 26 Buchstaben umfasst, ist ROT13 seine eigene Umkehrung. Das heißt, um ROT13 rückgängig zu machen, wird derselbe Algorithmus angewendet, sodass dieselbe Aktion zum Verschlüsseln und Entschlüsseln verwendet werden kann.",
+ "title": "Was ist ROT13?"
+ }
+ },
+ "rotate": {
+ "description": "Drehen Sie Zeichen im Text um angegebene Positionen.",
+ "inputTitle": "Eingabetext",
+ "processAsMultiLine": "Als mehrzeiligen Text verarbeiten (jede Zeile einzeln drehen)",
+ "resultTitle": "Gedrehter Text",
+ "rotateLeft": "Nach links drehen",
+ "rotateRight": "Nach rechts drehen",
+ "rotationOptions": "Rotationsoptionen",
+ "shortDescription": "Verschieben Sie Zeichen im Text um die Position.",
+ "stepDescription": "Anzahl der zu drehenden Positionen",
+ "title": "Text drehen",
+ "toolInfo": {
+ "description": "Mit diesem Werkzeug können Sie Zeichen in einer Zeichenfolge um eine bestimmte Anzahl von Positionen drehen. Sie können nach links oder rechts drehen und mehrzeiligen Text verarbeiten, indem Sie jede Zeile einzeln drehen. Die Zeichenfolgenrotation ist nützlich für einfache Texttransformationen, die Erstellung von Mustern oder die Implementierung grundlegender Verschlüsselungstechniken.",
+ "title": "Saitenrotation"
+ }
+ },
+ "split": {
+ "charAfterChunkDescription": "Zeichen nach jedem Block",
+ "charBeforeChunkDescription": "Zeichen vor jedem Block",
+ "chunksDescription": "Anzahl der gleich langen Chunks in der Ausgabe.",
+ "chunksTitle": "Verwenden Sie eine Anzahl von Chunks",
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Teilen von Text. Geben Sie Ihren Text ein und wählen Sie ein Trennzeichen, um ihn in mehrere Teile aufzuteilen. Ideal für die Datenverarbeitung, Textbearbeitung oder das Extrahieren bestimmter Inhalte aus größeren Textblöcken.",
+ "lengthDescription": "Anzahl der Symbole, die in jeden Ausgabeblock eingefügt werden.",
+ "lengthTitle": "Länge zum Teilen verwenden",
+ "outputSeparatorDescription": "Zeichen, das zwischen die geteilten Blöcke eingefügt wird.\n(Standardmäßig ist es das Zeilenumbruchzeichen „\\n“.)",
+ "outputSeparatorOptions": "Ausgabetrennzeichenoptionen",
+ "regexDescription": "Regulärer Ausdruck, der zum Aufteilen von Text verwendet wird.\n(Standardmäßig mehrere Leerzeichen.)",
+ "regexTitle": "Verwenden Sie einen regulären Ausdruck zum Aufteilen",
+ "resultTitle": "Textstücke",
+ "shortDescription": "Text mithilfe eines Trennzeichens in mehrere Teile aufteilen",
+ "splitSeparatorOptions": "Optionen für geteilte Trennzeichen",
+ "symbolDescription": "Zeichen, das zum Aufteilen des Textes verwendet wird.\n(Standardmäßig Leerzeichen.)",
+ "symbolTitle": "Verwenden Sie ein Symbol zum Teilen",
+ "title": "Teilt"
+ },
+ "statistic": {
+ "characterFrequencyAnalysis": "Zeichenhäufigkeitsanalyse",
+ "characterFrequencyAnalysisDescription": "Zählen Sie, wie oft jedes Zeichen im Text vorkommt",
+ "delimitersOptions": "Trennzeichenoptionen",
+ "description": "Analysieren Sie Texte und erstellen Sie umfassende Statistiken.",
+ "includeEmptyLines": "Leere Zeilen einschließen",
+ "includeEmptyLinesDescription": "Berücksichtigen Sie beim Zählen von Zeilen auch Leerzeilen",
+ "inputTitle": "Eingabetext",
+ "resultTitle": "Textstatistik",
+ "sentenceDelimitersDescription": "Geben Sie benutzerdefinierte Zeichen ein, die zur Abgrenzung von Sätzen in Ihrer Sprache verwendet werden (durch Komma getrennt), oder lassen Sie das Feld als Standard leer.",
+ "sentenceDelimitersPlaceholder": "z. B. ., !, ?, ...",
+ "shortDescription": "Erhalten Sie Statistiken zu Ihrem Text",
+ "statisticsOptions": "Statistikoptionen",
+ "title": "Textstatistik",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie Text analysieren und umfassende Statistiken erstellen, darunter Zeichenanzahl, Wortanzahl, Zeilenanzahl und Häufigkeitsanalyse von Zeichen und Wörtern.",
+ "title": "Was ist ein {{title}}?"
+ },
+ "wordDelimitersDescription": "Geben Sie einen benutzerdefinierten regulären Ausdruck ein, um Wörter zu zählen, oder lassen Sie das Feld für die Standardeinstellung leer.",
+ "wordDelimitersPlaceholder": "zB. \\s.,;:!?\"«»()…",
+ "wordFrequencyAnalysis": "Worthäufigkeitsanalyse",
+ "wordFrequencyAnalysisDescription": "Zählen Sie, wie oft jedes Wort im Text vorkommt"
+ },
+ "textReplacer": {
+ "description": "Ersetzen Sie Textmuster durch neue Inhalte.",
+ "findPatternInText": "Dieses Muster im Text finden",
+ "findPatternUsingRegexp": "Suchen eines Musters mithilfe eines regulären Ausdrucks",
+ "inputTitle": "Zu ersetzender Text",
+ "newTextPlaceholder": "Neuer Text",
+ "regexpDescription": "Geben Sie den regulären Ausdruck ein, den Sie ersetzen möchten.",
+ "replacePatternDescription": "Geben Sie das Muster ein, das zum Ersetzen verwendet werden soll.",
+ "replaceText": "Text ersetzen",
+ "resultTitle": "Text mit Ersetzungen",
+ "searchPatternDescription": "Geben Sie das Textmuster ein, das Sie ersetzen möchten.",
+ "searchText": "Suchtext",
+ "shortDescription": "Ersetzen Sie schnell Text in Ihrem Inhalt",
+ "title": "Textersetzung",
+ "toolInfo": {
+ "description": "Ersetzen Sie mit diesem einfachen, browserbasierten Tool ganz einfach Text in Ihren Inhalten. Geben Sie einfach Ihren Text ein, legen Sie den zu ersetzenden Text und den Ersetzungswert fest und erhalten Sie sofort die aktualisierte Version.",
+ "title": "Textersetzung"
+ }
+ },
+ "toMorse": {
+ "dashSymbolDescription": "Symbol, das dem Bindestrich im Morsecode entspricht.",
+ "description": "Konvertieren Sie Text in Morsecode.",
+ "dotSymbolDescription": "Symbol, das dem Punkt im Morsecode entspricht.",
+ "longSignal": "Langes Signal",
+ "resultTitle": "Morsezeichen",
+ "shortDescription": "Text schnell in Morse kodieren",
+ "shortSignal": "Kurzes Signal",
+ "title": "Zeichenfolge zu Morse"
+ },
+ "truncate": {
+ "addTruncationIndicator": "Trunkierungsindikator hinzufügen",
+ "charactersPlaceholder": "Charaktere",
+ "description": "Kürzen Sie den Text auf eine bestimmte Länge.",
+ "indicatorDescription": "Zeichen, die am Ende (oder Anfang) des Textes hinzugefügt werden sollen. Hinweis: Sie werden zur Länge gezählt.",
+ "inputTitle": "Eingabetext",
+ "leftSideDescription": "Entfernen Sie Zeichen vom Anfang des Textes.",
+ "leftSideTruncation": "Linksseitige Kürzung",
+ "lengthAndLines": "Länge und Linien",
+ "lineByLineDescription": "Kürzen Sie jede Zeile einzeln.",
+ "lineByLineTruncating": "Zeilenweises Abschneiden",
+ "maxLengthDescription": "Anzahl der Zeichen, die im Text verbleiben sollen.",
+ "numberPlaceholder": "Nummer",
+ "resultTitle": "Abgeschnittener Text",
+ "rightSideDescription": "Entfernen Sie Zeichen vom Ende des Textes.",
+ "rightSideTruncation": "Rechtsseitige Kürzung",
+ "shortDescription": "Text auf eine bestimmte Länge kürzen",
+ "suffixAndAffix": "Suffix und Affix",
+ "title": "Text abschneiden",
+ "toolInfo": {
+ "description": "Laden Sie Ihren Text in das Eingabeformular links und Sie erhalten rechts automatisch gekürzten Text.",
+ "title": "Text kürzen"
+ },
+ "truncationSide": "Abschneideseite"
+ },
+ "uppercase": {
+ "description": "Wandeln Sie Text in Großbuchstaben um.",
+ "inputTitle": "Eingabetext",
+ "resultTitle": "Großbuchstaben",
+ "shortDescription": "Text in Großbuchstaben umwandeln",
+ "title": "In Großbuchstaben umwandeln"
+ }
+}
diff --git a/public/locales/de/time.json b/public/locales/de/time.json
new file mode 100644
index 0000000..59d0858
--- /dev/null
+++ b/public/locales/de/time.json
@@ -0,0 +1,100 @@
+{
+ "checkLeapYears": {
+ "description": "Prüfen Sie, ob ein Jahr ein Schaltjahr ist, und erhalten Sie Informationen zum Schaltjahr.",
+ "inputTitle": "Jahr eingeben",
+ "resultTitle": "Schaltjahrergebnis",
+ "shortDescription": "Prüfen, ob ein Jahr ein Schaltjahr ist",
+ "title": "Schaltjahre prüfen",
+ "toolInfo": {
+ "description": "Ein Schaltjahr ist ein Jahr mit einem zusätzlichen Tag (29. Februar), um das Kalenderjahr mit dem astronomischen Jahr zu synchronisieren. Schaltjahre gibt es alle vier Jahre, mit Ausnahme der Jahre, die durch 100, aber nicht durch 400 teilbar sind.",
+ "title": "Was ist ein Schaltjahr?"
+ }
+ },
+ "convertDaysToHours": {
+ "addHoursName": "Stundennamen hinzufügen",
+ "addHoursNameDescription": "Hängen Sie die Zeichenfolge „Stunden“ an die Ausgabewerte an",
+ "description": "Wandeln Sie Tage mit anpassbaren Optionen in Stunden um.",
+ "hoursName": "Stunden Name",
+ "shortDescription": "Tage in Stunden umrechnen",
+ "title": "Tage in Stunden umrechnen",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie Tage in Stunden umrechnen. Sie können Tage als Zahlen oder mit Einheiten eingeben, und das Tool rechnet sie in Stunden um. Sie können den Ausgabewerten auch das Suffix „Stunden“ anhängen.",
+ "title": "Tage in Stunden umrechnen"
+ }
+ },
+ "convertHoursToDays": {
+ "addDaysName": "Tagesnamen hinzufügen",
+ "addDaysNameDescription": "Hängen Sie die Zeichenfolge „Tage“ an die Ausgabewerte an",
+ "daysName": "Tage Name",
+ "description": "Wandeln Sie Stunden mit anpassbaren Optionen in Tage um.",
+ "shortDescription": "Stunden in Tage umrechnen",
+ "title": "Stunden in Tage umrechnen",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie Stunden in Tage umrechnen. Sie können Stunden als Zahlen oder mit Einheiten eingeben, und das Tool rechnet sie in Tage um. Sie können den Ausgabewerten auch das Suffix „Tage“ anhängen.",
+ "title": "Stunden in Tage umrechnen"
+ }
+ },
+ "convertSecondsToTime": {
+ "addPadding": "Polsterung hinzufügen",
+ "addPaddingDescription": "Fügen Sie Stunden, Minuten und Sekunden mit Nullen aufgefüllt hinzu.",
+ "description": "Konvertiert Sekunden in ein lesbares Zeitformat (Stunden:Minuten:Sekunden). Geben Sie die Anzahl der Sekunden ein, um die formatierte Zeit zu erhalten.",
+ "shortDescription": "Sekunden in das Zeitformat konvertieren",
+ "timePadding": "Zeitauffüllung",
+ "title": "Sekunden in Zeit umrechnen",
+ "toolInfo": {
+ "title": "Was ist ein {{title}}?"
+ }
+ },
+ "convertTimeToSeconds": {
+ "description": "Konvertieren Sie die formatierte Zeit (HH:MM:SS) in Sekunden.",
+ "inputTitle": "Eingabezeit",
+ "resultTitle": "Sekunden",
+ "shortDescription": "Konvertieren Sie das Zeitformat in Sekunden",
+ "title": "Zeit in Sekunden umrechnen",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie formatierte Zeitzeichenfolgen (HH:MM:SS) in Sekunden umwandeln. Es ist nützlich für die Berechnung von Dauern und Zeitintervallen.",
+ "title": "Zeit in Sekunden umrechnen"
+ }
+ },
+ "crontabGuru": {
+ "description": "Generieren und verstehen Sie Cron-Ausdrücke. Erstellen Sie Cron-Zeitpläne für automatisierte Aufgaben und Systemjobs.",
+ "shortDescription": "Cron-Ausdrücke generieren und verstehen",
+ "title": "Crontab Guru"
+ },
+ "timeBetweenDates": {
+ "description": "Berechnen Sie die Zeitdifferenz zwischen zwei Daten. Ermitteln Sie die genaue Dauer in Tagen, Stunden, Minuten und Sekunden.",
+ "endDate": "Enddatum",
+ "endDateTime": "Enddatum und -zeit",
+ "endTime": "Endzeit",
+ "endTimezone": "Endzeitzone",
+ "shortDescription": "Berechnen Sie die Zeit zwischen zwei Daten",
+ "startDate": "Startdatum",
+ "startDateTime": "Startdatum und -zeit",
+ "startTime": "Startzeit",
+ "startTimezone": "Startzeitzone",
+ "title": "Zeit zwischen den Terminen",
+ "toolInfo": {
+ "description": "Berechnen Sie die genaue Zeitdifferenz zwischen zwei Datums- und Uhrzeitangaben, mit Unterstützung für verschiedene Zeitzonen. Dieses Tool bietet eine detaillierte Aufschlüsselung der Zeitdifferenz in verschiedenen Einheiten (Jahre, Monate, Tage, Stunden, Minuten und Sekunden).",
+ "title": "Zeit zwischen Daten-Rechner"
+ }
+ },
+ "truncateClockTime": {
+ "description": "Kürzen Sie die Uhrzeit, um Sekunden oder Minuten zu entfernen. Runden Sie die Zeit auf die nächste Stunde, Minute oder ein benutzerdefiniertes Intervall.",
+ "printDroppedComponents": "Drucken gelöschter Komponenten",
+ "shortDescription": "Kürzen Sie die Uhrzeit auf die angegebene Genauigkeit",
+ "timePadding": "Zeitauffüllung",
+ "title": "Uhrzeit kürzen",
+ "toolInfo": {
+ "title": "Was ist ein {{title}}?"
+ },
+ "truncateMinutesAndSeconds": "Minuten und Sekunden kürzen",
+ "truncateMinutesAndSecondsDescription": "Lassen Sie beides weg – die Minuten- und Sekundenkomponenten jeder Uhrzeit.",
+ "truncateOnlySeconds": "Nur Sekunden abschneiden",
+ "truncateOnlySecondsDescription": "Entfernen Sie die Sekundenkomponente aus jeder Uhrzeit.",
+ "truncationSide": "Abschneideseite",
+ "useZeroPadding": "Null-Padding verwenden",
+ "zeroPaddingDescription": "Sorgen Sie dafür, dass alle Zeitkomponenten immer zweistellig sind.",
+ "zeroPrintDescription": "Die weggelassenen Teile werden als Nullwerte „00“ angezeigt.",
+ "zeroPrintTruncatedParts": "Abgeschnittene Teile ohne Druck"
+ }
+}
diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json
new file mode 100644
index 0000000..459cbf1
--- /dev/null
+++ b/public/locales/de/translation.json
@@ -0,0 +1,250 @@
+{
+ "audio": {
+ "changeSpeed": {
+ "description": "Ändern Sie die Wiedergabegeschwindigkeit von Audiodateien. Beschleunigen oder verlangsamen Sie die Wiedergabe, ohne die Tonhöhe zu verändern.",
+ "name": "Audiogeschwindigkeit ändern",
+ "shortDescription": "Ändern Sie die Geschwindigkeit von Audiodateien"
+ },
+ "extractAudio": {
+ "description": "Extrahieren Sie die Audiospur aus einer Videodatei und speichern Sie sie als separate Audiodatei im gewünschten Format (AAC, MP3, WAV).",
+ "name": "Audio extrahieren",
+ "shortDescription": "Extrahieren Sie Audio aus Videodateien (MP4, MOV usw.) in AAC, MP3 oder WAV."
+ }
+ },
+ "baseFileInput": {
+ "copyFailed": "Kopieren fehlgeschlagen: {{error}}",
+ "dropFileHere": "Lassen Sie Ihre {{type}} Hier",
+ "fileCopied": "Datei kopiert",
+ "selectFileDescription": "Klicken Sie hier, um eine {{type}} Drücken Sie auf Ihrem Gerät Strg+V, um eine {{type}} aus der Zwischenablage oder ziehen Sie eine Datei per Drag & Drop vom Desktop"
+ },
+ "categories": {
+ "audio": {
+ "description": "Tools für die Arbeit mit Audio – Audio aus Video extrahieren, Audiogeschwindigkeit anpassen, mehrere Audiodateien zusammenführen und vieles mehr.",
+ "title": "Audio-Tools"
+ },
+ "csv": {
+ "description": "Tools zum Arbeiten mit CSV-Dateien – konvertieren Sie CSV in verschiedene Formate, bearbeiten Sie CSV-Daten, validieren Sie die CSV-Struktur und verarbeiten Sie CSV-Dateien effizient.",
+ "title": "CSV-Tools"
+ },
+ "gif": {
+ "description": "Tools zum Arbeiten mit GIF-Animationen – transparente GIFs erstellen, GIF-Frames extrahieren, Text zu GIFs hinzufügen, zuschneiden, drehen, GIFs umkehren und vieles mehr.",
+ "title": "GIF-Tools"
+ },
+ "image-generic": {
+ "description": "Tools zum Arbeiten mit Bildern – komprimieren, Größe ändern, zuschneiden, in JPG konvertieren, drehen, Hintergrund entfernen und vieles mehr.",
+ "title": "Bildwerkzeuge"
+ },
+ "json": {
+ "description": "Tools für die Arbeit mit JSON-Datenstrukturen – Verschönern und Minimieren von JSON-Objekten, Verflachen von JSON-Arrays, Stringifizieren von JSON-Werten, Analysieren von Daten und vieles mehr",
+ "title": "JSON-Tools"
+ },
+ "list": {
+ "description": "Tools zum Arbeiten mit Listen – Sortieren, Umkehren, Zufallssortieren von Listen, Suchen eindeutiger und doppelter Listenelemente, Ändern der Trennzeichen von Listenelementen und vieles mehr.",
+ "title": "Tools auflisten"
+ },
+ "number": {
+ "description": "Tools für die Arbeit mit Zahlen – Zahlenfolgen generieren, Zahlen in Wörter und Wörter in Zahlen umwandeln, sortieren, runden, Zahlen faktorisieren und vieles mehr.",
+ "title": "Zahlenwerkzeuge"
+ },
+ "pdf": {
+ "description": "Tools zum Arbeiten mit PDF-Dateien – Text aus PDFs extrahieren, PDFs in andere Formate konvertieren, PDFs bearbeiten und vieles mehr.",
+ "title": "PDF-Tools"
+ },
+ "png": {
+ "description": "Tools zum Arbeiten mit PNG-Bildern – konvertieren Sie PNGs in JPGs, erstellen Sie transparente PNGs, ändern Sie PNG-Farben, beschneiden Sie, drehen Sie, ändern Sie die Größe von PNGs und vieles mehr.",
+ "title": "PNG-Tools"
+ },
+ "seeAll": "Alles sehen {{title}}",
+ "string": {
+ "description": "Tools zum Arbeiten mit Text – Text in Bilder umwandeln, Text suchen und ersetzen, Text in Fragmente aufteilen, Textzeilen verbinden, Text wiederholen und vieles mehr.",
+ "title": "Textwerkzeuge"
+ },
+ "time": {
+ "description": "Tools zum Arbeiten mit Zeit und Datum – Zeitunterschiede berechnen, zwischen Zeitzonen umrechnen, Datumsangaben formatieren, Datumssequenzen generieren und vieles mehr.",
+ "title": "Zeitwerkzeuge"
+ },
+ "try": "Versuchen {{title}}",
+ "video": {
+ "description": "Tools zum Arbeiten mit Videos – Extrahieren Sie Frames aus Videos, erstellen Sie GIFs aus Videos, konvertieren Sie Videos in verschiedene Formate und vieles mehr.",
+ "title": "Video-Tools"
+ },
+ "xml": {
+ "description": "Tools zum Arbeiten mit XML-Datenstrukturen – Viewer, Beautifier, Validator und vieles mehr",
+ "title": "XML-Tools"
+ }
+ },
+ "csv": {
+ "findIncompleteCsvRecords": {
+ "description": "Laden Sie einfach Ihre CSV-Datei im untenstehenden Formular hoch. Das Tool prüft automatisch, ob in Zeilen und Spalten Werte fehlen. In den Tool-Optionen können Sie das Eingabedateiformat anpassen (Trennzeichen, Anführungszeichen und Kommentarzeichen festlegen). Zusätzlich können Sie die Prüfung auf leere Werte aktivieren, leere Zeilen überspringen und die Anzahl der Fehlermeldungen in der Ausgabe begrenzen.",
+ "name": "Unvollständige CSV-Datensätze finden",
+ "shortDescription": "Finden Sie schnell Zeilen und Spalten in CSV, in denen Werte fehlen."
+ }
+ },
+ "hero": {
+ "brand": "OmniTools",
+ "description": "Steigern Sie Ihre Produktivität mit OmniTools, dem ultimativen Toolkit für schnelles Arbeiten! Greifen Sie direkt von Ihrem Browser aus auf Tausende benutzerfreundliche Dienstprogramme zum Bearbeiten von Bildern, Texten, Listen und Daten zu.",
+ "examples": {
+ "calculateNumberSum": "Zahlensumme berechnen",
+ "changeGifSpeed": "GIF-Geschwindigkeit ändern",
+ "compressPng": "PNG komprimieren",
+ "createTransparentImage": "Erstellen Sie ein transparentes Bild",
+ "prettifyJson": "JSON verschönern",
+ "sortList": "Sortieren einer Liste",
+ "splitPdf": "PDF teilen",
+ "splitText": "Einen Text teilen",
+ "trimVideo": "Video zuschneiden"
+ },
+ "searchPlaceholder": "Alle Tools durchsuchen",
+ "title": "Erledigen Sie Dinge schnell mit"
+ },
+ "inputFooter": {
+ "clear": "Klar",
+ "copyToClipboard": "In die Zwischenablage kopieren",
+ "importFromFile": "Aus Datei importieren"
+ },
+ "list": {
+ "group": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Gruppieren von Listenelementen. Geben Sie Ihre Liste ein und legen Sie Gruppierungskriterien fest, um Elemente in logische Gruppen zu ordnen. Ideal zum Kategorisieren von Daten, Organisieren von Informationen oder Erstellen strukturierter Listen. Unterstützt benutzerdefinierte Trennzeichen und verschiedene Gruppierungsoptionen.",
+ "name": "Gruppe",
+ "shortDescription": "Gruppieren Sie Listenelemente nach gemeinsamen Eigenschaften"
+ },
+ "reverse": {
+ "description": "Diese einfache browserbasierte Anwendung druckt alle Listenelemente rückwärts. Die Eingabeelemente können durch ein beliebiges Symbol getrennt werden. Sie können auch das Trennzeichen der umgekehrten Listenelemente ändern.",
+ "name": "Umkehren",
+ "shortDescription": "Schnelles Umkehren einer Liste"
+ },
+ "sort": {
+ "description": "Dies ist eine sehr einfache browserbasierte Anwendung, die Elemente in einer Liste sortiert und in auf- oder absteigender Reihenfolge anordnet. Sie können die Elemente alphabetisch, numerisch oder nach Länge sortieren. Sie können auch doppelte und leere Elemente entfernen sowie einzelne Elemente mit Leerzeichen kürzen. Sie können die Elemente der Eingabeliste durch ein beliebiges Trennzeichen oder alternativ durch einen regulären Ausdruck trennen. Zusätzlich können Sie ein neues Trennzeichen für die sortierte Ausgabeliste erstellen.",
+ "name": "Sortieren",
+ "shortDescription": "Schnelles Sortieren einer Liste"
+ }
+ },
+ "navbar": {
+ "buyMeACoffee": "Kauf mir einen Kaffee",
+ "home": "Heim",
+ "tools": "Werkzeuge"
+ },
+ "number": {
+ "generate": {
+ "description": "Berechnen Sie schnell eine Liste von Ganzzahlen in Ihrem Browser. Geben Sie dazu einfach die erste Ganzzahl an, ändern Sie den Wert und die Gesamtzahl in den Optionen unten. Das Dienstprogramm generiert dann die entsprechende Anzahl Ganzzahlen.",
+ "name": "Zahlen generieren",
+ "shortDescription": "Berechnen Sie schnell eine Liste von Ganzzahlen in Ihrem Browser"
+ },
+ "sum": {
+ "description": "Dies ist eine sehr einfache browserbasierte Anwendung zum Summieren von Zahlen. Die eingegebenen Zahlen können durch ein beliebiges Symbol getrennt werden. Sie können auch das Trennzeichen der summierten Zahlen ändern.",
+ "name": "Summenzahlen",
+ "shortDescription": "Schnelles Summieren einer Zahlenliste"
+ }
+ },
+ "numericInputWithUnit": {
+ "unit": "Einheit"
+ },
+ "pdf": {
+ "compressPdf": {
+ "description": "Reduzieren Sie die PDF-Dateigröße bei gleichbleibender Qualität mit Ghostscript",
+ "name": "PDF komprimieren",
+ "shortDescription": "Komprimieren Sie PDF-Dateien sicher in Ihrem Browser"
+ },
+ "mergePdf": {
+ "description": "Kombinieren Sie mehrere PDF-Dateien zu einem einzigen Dokument.",
+ "name": "PDF zusammenführen",
+ "shortDescription": "Mehrere PDF-Dateien zu einem einzigen Dokument zusammenführen"
+ },
+ "pdfToEpub": {
+ "description": "Wandeln Sie PDF-Dokumente in EPUB-Dateien um, um eine bessere E-Reader-Kompatibilität zu erzielen.",
+ "name": "PDF zu EPUB",
+ "shortDescription": "Konvertieren Sie PDF-Dateien in das EPUB-Format"
+ },
+ "protectPdf": {
+ "description": "Fügen Sie Ihren PDF-Dateien sicher in Ihrem Browser einen Passwortschutz hinzu",
+ "name": "PDF schützen",
+ "shortDescription": "PDF-Dateien sicher mit einem Passwort schützen"
+ },
+ "splitPdf": {
+ "description": "Extrahieren Sie bestimmte Seiten aus einer PDF-Datei mithilfe von Seitenzahlen oder Bereichen (z. B. 1,5-8).",
+ "name": "PDF teilen",
+ "shortDescription": "Extrahieren Sie bestimmte Seiten aus einer PDF-Datei"
+ }
+ },
+ "resultFooter": {
+ "copy": "In die Zwischenablage kopieren",
+ "download": "Herunterladen"
+ },
+ "string": {
+ "createPalindrome": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Erstellen von Palindromen aus beliebigem Text. Geben Sie Text ein und verwandeln Sie ihn sofort in ein Palindrom, das vorwärts und rückwärts gleich gelesen wird. Ideal für Wortspiele, das Erstellen symmetrischer Textmuster oder das Erkunden sprachlicher Kuriositäten.",
+ "name": "Palindrom erstellen",
+ "shortDescription": "Erstellen Sie Text, der vorwärts und rückwärts gleich gelesen wird"
+ },
+ "palindrome": {
+ "description": "Das weltweit einfachste browserbasierte Tool zur Überprüfung von Palindromen. Überprüfen Sie sofort, ob sich Ihr Text vorwärts und rückwärts gleich liest. Ideal für Worträtsel, linguistische Analysen oder die Validierung symmetrischer Textmuster. Unterstützt verschiedene Trennzeichen und die Erkennung mehrteiliger Palindrome.",
+ "name": "Palindrom",
+ "shortDescription": "Überprüfen Sie, ob der Text vorwärts und rückwärts gleich gelesen wird"
+ },
+ "repeat": {
+ "description": "Mit diesem Tool können Sie einen bestimmten Text mit einem optionalen Trennzeichen mehrmals wiederholen.",
+ "name": "Text wiederholen",
+ "shortDescription": "Text mehrmals wiederholen"
+ },
+ "reverse": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Umkehren von Text. Geben Sie beliebigen Text ein und lassen Sie ihn sofort Zeichen für Zeichen umkehren. Ideal zum Erstellen von Spiegeltext, Analysieren von Palindromen oder zum Experimentieren mit Textmustern. Leerzeichen und Sonderzeichen bleiben beim Umkehren erhalten.",
+ "name": "Umkehren",
+ "shortDescription": "Kehren Sie jeden Text Zeichen für Zeichen um"
+ },
+ "toMorse": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zur Konvertierung von Text in Morsecode. Laden Sie Ihren Text in das Eingabeformular links und Sie erhalten sofort Morsecode im Ausgabebereich. Leistungsstark, kostenlos und schnell. Text laden – Morsecode erhalten.",
+ "name": "Zeichenfolge zu Morse",
+ "shortDescription": "Text schnell in Morse kodieren"
+ },
+ "uppercase": {
+ "description": "Das weltweit einfachste browserbasierte Dienstprogramm zur Konvertierung von Text in Großbuchstaben. Geben Sie einfach Ihren Text ein, und er wird automatisch in Großbuchstaben umgewandelt. Ideal für Überschriften, Hervorhebungen oder die Standardisierung des Textformats. Unterstützt verschiedene Textformate und behält Sonderzeichen bei.",
+ "name": "Großbuchstaben",
+ "shortDescription": "Text in Großbuchstaben umwandeln"
+ }
+ },
+ "toolExamples": {
+ "subtitle": "Klicken Sie hier, um es auszuprobieren!",
+ "title": "{{title}} Beispiele"
+ },
+ "toolFileResult": {
+ "copied": "Datei kopiert",
+ "copyFailed": "Kopieren fehlgeschlagen: {{error}}",
+ "loading": "Wird geladen... Dies kann einen Moment dauern.",
+ "result": "Ergebnis"
+ },
+ "toolHeader": {
+ "seeExamples": "Beispiele ansehen"
+ },
+ "toolLayout": {
+ "allToolsTitle": "Alle {{type}}"
+ },
+ "toolMultiFileResult": {
+ "copied": "Datei kopiert",
+ "copyFailed": "Kopieren fehlgeschlagen: {{error}}",
+ "loading": "Wird geladen... Dies kann einen Moment dauern.",
+ "result": "Ergebnis"
+ },
+ "toolMultipleAudioInput": {
+ "inputTitle": "Eingang {{type}}",
+ "noFilesSelected": "Keine Dateien ausgewählt"
+ },
+ "toolMultiplePdfInput": {
+ "inputTitle": "Eingang {{type}}",
+ "noFilesSelected": "Keine Dateien ausgewählt"
+ },
+ "toolOptions": {
+ "title": "Werkzeugoptionen"
+ },
+ "toolTextInput": {
+ "copied": "Text kopiert",
+ "copyFailed": "Kopieren fehlgeschlagen: {{error}}",
+ "input": "Eingabetext",
+ "placeholder": "Geben Sie hier Ihren Text ein..."
+ },
+ "toolTextResult": {
+ "copied": "Text kopiert",
+ "copyFailed": "Kopieren fehlgeschlagen: {{error}}",
+ "loading": "Wird geladen... Dies kann einen Moment dauern.",
+ "result": "Ergebnis"
+ }
+}
diff --git a/public/locales/de/video.json b/public/locales/de/video.json
new file mode 100644
index 0000000..3f110b9
--- /dev/null
+++ b/public/locales/de/video.json
@@ -0,0 +1,113 @@
+{
+ "changeSpeed": {
+ "defaultMultiplier": "Standardmultiplikator: 2 bedeutet 2x schneller",
+ "description": "Ändern Sie die Wiedergabegeschwindigkeit von Videodateien. Beschleunigen oder verlangsamen Sie Videos, während die Audiosynchronisation erhalten bleibt. Unterstützt verschiedene Geschwindigkeitsmultiplikatoren und gängige Videoformate.",
+ "inputTitle": "Eingangsvideo",
+ "newVideoSpeed": "Neue Videogeschwindigkeit",
+ "resultTitle": "Bearbeitetes Video",
+ "settingSpeed": "Geschwindigkeit einstellen",
+ "shortDescription": "Ändern der Videowiedergabegeschwindigkeit",
+ "title": "Videogeschwindigkeit ändern",
+ "toolInfo": {
+ "title": "Was ist ein {{title}}?"
+ }
+ },
+ "compress": {
+ "default": "Standard",
+ "description": "Komprimieren Sie Videos, indem Sie sie auf verschiedene Auflösungen wie 240p, 480p, 720p usw. skalieren. Dieses Tool hilft, die Dateigröße zu reduzieren und gleichzeitig eine akzeptable Qualität beizubehalten. Unterstützt gängige Videoformate wie MP4, WebM und OGG.",
+ "inputTitle": "Eingangsvideo",
+ "loadingText": "Video wird komprimiert...",
+ "lossless": "Verlustfrei",
+ "quality": "Qualität (CRF)",
+ "resolution": "Auflösung",
+ "resultTitle": "Komprimiertes Video",
+ "shortDescription": "Komprimieren Sie Videos durch Skalieren auf verschiedene Auflösungen",
+ "title": "Video komprimieren",
+ "worst": "Am schlimmsten"
+ },
+ "cropVideo": {
+ "cropCoordinates": "Zuschneidekoordinaten",
+ "croppingVideo": "Video zuschneiden",
+ "description": "Schneiden Sie das Video zu, um unerwünschte Bereiche zu entfernen.",
+ "errorBeyondHeight": "Der Zuschneidebereich geht über die Videohöhe hinaus ({{height}}px)",
+ "errorBeyondWidth": "Der Zuschneidebereich geht über die Videobreite hinaus ({{width}}px)",
+ "errorCroppingVideo": "Fehler beim Zuschneiden des Videos. Bitte überprüfen Sie die Parameter und die Videodatei.",
+ "errorLoadingDimensions": "Videoabmessungen konnten nicht geladen werden",
+ "errorNonNegativeCoordinates": "X- und Y-Koordinaten dürfen nicht negativ sein",
+ "errorPositiveDimensions": "Breite und Höhe müssen positiv sein",
+ "height": "Höhe",
+ "inputTitle": "Eingangsvideo",
+ "loadVideoForDimensions": "Laden Sie ein Video, um die Abmessungen anzuzeigen",
+ "resultTitle": "Zugeschnittenes Video",
+ "shortDescription": "Video zuschneiden, um unerwünschte Bereiche zu entfernen",
+ "title": "Video zuschneiden",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie Videodateien zuschneiden, um unerwünschte Bereiche zu entfernen. Sie können den Zuschneidebereich festlegen, indem Sie die X- und Y-Koordinaten sowie die Breiten- und Höhenmaße festlegen.",
+ "title": "Video zuschneiden"
+ },
+ "videoDimensions": "Videoabmessungen: {{width}} × {{height}} Pixel",
+ "videoInformation": "Videoinformationen",
+ "width": "Breite",
+ "xCoordinate": "X (links)",
+ "yCoordinate": "Y (oben)"
+ },
+ "flip": {
+ "description": "Drehen Sie Videodateien horizontal oder vertikal. Spiegeln Sie Videos für Spezialeffekte oder zum Korrigieren von Ausrichtungsproblemen.",
+ "flippingVideo": "Video spiegeln",
+ "horizontalLabel": "Horizontal (Spiegel)",
+ "inputTitle": "Eingangsvideo",
+ "orientation": "Orientierung",
+ "resultTitle": "Gespiegeltes Video",
+ "shortDescription": "Video horizontal oder vertikal spiegeln",
+ "title": "Video umdrehen",
+ "verticalLabel": "Vertikal (auf dem Kopf stehend)"
+ },
+ "gif": {
+ "changeSpeed": {
+ "description": "Ändern Sie die Wiedergabegeschwindigkeit von GIF-Animationen. Beschleunigen oder verlangsamen Sie GIFs, ohne die Animation zu verlangsamen.",
+ "shortDescription": "Ändern Sie die Geschwindigkeit der GIF-Animation",
+ "title": "GIF-Geschwindigkeit ändern"
+ }
+ },
+ "loop": {
+ "description": "Erstellen Sie ein Loop-Video, indem Sie das Originalvideo mehrmals wiederholen.",
+ "inputTitle": "Eingangsvideo",
+ "loopingVideo": "Videoschleife",
+ "loops": "Schleifen",
+ "numberOfLoops": "Anzahl der Schleifen",
+ "resultTitle": "Videoschleife",
+ "shortDescription": "Erstellen Sie Loop-Videodateien",
+ "title": "Video in Endlosschleife",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie ein Loop-Video erstellen, indem Sie das Originalvideo mehrmals wiederholen. Sie können festlegen, wie oft das Video wiederholt werden soll.",
+ "title": "Was ist ein {{title}}?"
+ }
+ },
+ "rotate": {
+ "180Degrees": "180° (auf den Kopf gestellt)",
+ "270Degrees": "270° (90° gegen den Uhrzeigersinn)",
+ "90Degrees": "90° im Uhrzeigersinn",
+ "description": "Drehen Sie Videodateien um 90, 180 oder 270 Grad. Korrigieren Sie die Videoausrichtung oder erstellen Sie Spezialeffekte mit präziser Rotationssteuerung.",
+ "inputTitle": "Eingangsvideo",
+ "resultTitle": "Gedrehtes Video",
+ "rotatingVideo": "Rotierendes Video",
+ "rotation": "Drehung",
+ "shortDescription": "Video um angegebene Gradzahlen drehen",
+ "title": "Video drehen"
+ },
+ "trim": {
+ "description": "Kürzen Sie Videodateien, indem Sie Start- und Endzeiten festlegen. Entfernen Sie unerwünschte Abschnitte am Anfang oder Ende von Videos.",
+ "endTime": "Endzeit",
+ "inputTitle": "Eingangsvideo",
+ "resultTitle": "Getrimmtes Video",
+ "shortDescription": "Schneiden Sie das Video, indem Sie unerwünschte Abschnitte entfernen",
+ "startTime": "Startzeit",
+ "timestamps": "Zeitstempel",
+ "title": "Video trimmen"
+ },
+ "videoToGif": {
+ "description": "Konvertieren Sie Videodateien in das animierte GIF-Format. Extrahieren Sie bestimmte Zeitbereiche und erstellen Sie gemeinsam nutzbare animierte Bilder.",
+ "shortDescription": "Video in animiertes GIF konvertieren",
+ "title": "Video zu GIF"
+ }
+}
diff --git a/public/locales/de/xml.json b/public/locales/de/xml.json
new file mode 100644
index 0000000..cb38726
--- /dev/null
+++ b/public/locales/de/xml.json
@@ -0,0 +1,38 @@
+{
+ "xmlBeautifier": {
+ "description": "Formatieren Sie XML mit den richtigen Einrückungen und Abständen.",
+ "indentation": "Vertiefung",
+ "inputTitle": "XML-Eingabe",
+ "resultTitle": "Verschönertes XML",
+ "shortDescription": "XML-Code formatieren und verschönern",
+ "title": "XML-Verschönerer",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie XML-Daten mit den richtigen Einrückungen und Abständen formatieren, sodass sie besser lesbar und einfacher zu bearbeiten sind.",
+ "title": "XML-Verschönerer"
+ },
+ "useSpaces": "Räume verwenden",
+ "useSpacesDescription": "Ausgabe mit Leerzeichen einrücken",
+ "useTabs": "Verwenden von Registerkarten",
+ "useTabsDescription": "Einrücken der Ausgabe mit Tabulatoren."
+ },
+ "xmlValidator": {
+ "description": "Validieren Sie die XML-Syntax und -Struktur.",
+ "placeholder": "XML hier einfügen oder importieren ...",
+ "shortDescription": "XML-Code auf Fehler validieren",
+ "title": "XML-Validator",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie die XML-Syntax und -Struktur validieren. Es prüft die korrekte XML-Formatierung und gibt bei festgestellten Problemen detaillierte Fehlermeldungen aus.",
+ "title": "XML-Validator"
+ }
+ },
+ "xmlViewer": {
+ "description": "Zeigen Sie die XML-Struktur in einem Baumformat an und erkunden Sie sie.",
+ "inputTitle": "XML-Eingabe",
+ "resultTitle": "XML-Strukturansicht",
+ "title": "XML-Viewer",
+ "toolInfo": {
+ "description": "Mit diesem Tool können Sie XML-Daten in einem hierarchischen Baumformat anzeigen, wodurch die Untersuchung und das Verständnis der Struktur von XML-Dokumenten erleichtert wird.",
+ "title": "XML-Viewer"
+ }
+ }
+}
diff --git a/public/locales/en/audio.json b/public/locales/en/audio.json
new file mode 100644
index 0000000..5184efe
--- /dev/null
+++ b/public/locales/en/audio.json
@@ -0,0 +1,61 @@
+{
+ "changeSpeed": {
+ "description": "Change the playback speed of audio files. Speed up or slow down audio while maintaining pitch.",
+ "inputTitle": "Input Audio",
+ "newAudioSpeed": "New Audio Speed",
+ "outputFormat": "Output Format",
+ "resultTitle": "Edited Audio",
+ "settingSpeed": "Setting Speed",
+ "shortDescription": "Change the speed of audio files",
+ "speedDescription": "Default multiplier: 2 means 2x faster",
+ "title": "Change audio speed",
+ "toolInfo": {
+ "title": "What is {{title}}?"
+ }
+ },
+ "extractAudio": {
+ "description": "Extract audio track from video files.",
+ "extractingAudio": "Extracting Audio",
+ "inputTitle": "Input Video",
+ "outputFormat": "Output Format",
+ "outputFormatDescription": "Select the format for the audio to be extracted as.",
+ "resultTitle": "Extracted Audio",
+ "shortDescription": "Extract audio from video files (MP4, MOV, etc.) to AAC, MP3, or WAV.",
+ "title": "Extract Audio from Video",
+ "toolInfo": {
+ "description": "This tool allows you to extract the audio track from video files. You can choose from different audio formats including AAC, MP3, and WAV.",
+ "title": "What is {{title}}?"
+ }
+ },
+ "mergeAudio": {
+ "description": "Combine multiple audio files into a single audio file by concatenating them in sequence.",
+ "inputTitle": "Input Audio 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.",
+ "mergingAudio": "Merging Audio",
+ "outputFormat": "Output Format",
+ "resultTitle": "Merged Audio",
+ "shortDescription": "Merge multiple audio files into one (MP3, AAC, WAV).",
+ "title": "Merge Audio",
+ "toolInfo": {
+ "title": "What is {{title}}?"
+ }
+ },
+ "trim": {
+ "description": "Cut and trim audio files to extract specific segments by specifying start and end times.",
+ "endTime": "End Time",
+ "endTimeDescription": "End time in format HH:MM:SS (e.g., 00:01:30)",
+ "inputTitle": "Input Audio",
+ "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.",
+ "outputFormat": "Output Format",
+ "resultTitle": "Trimmed Audio",
+ "shortDescription": "Trim audio files to extract specific time segments (MP3, AAC, WAV).",
+ "startTime": "Start Time",
+ "startTimeDescription": "Start time in format HH:MM:SS (e.g., 00:00:30)",
+ "timeSettings": "Time Settings",
+ "title": "Trim Audio",
+ "toolInfo": {
+ "title": "What is {{title}}?"
+ },
+ "trimmingAudio": "Trimming Audio"
+ }
+}
diff --git a/public/locales/en/csv.json b/public/locales/en/csv.json
new file mode 100644
index 0000000..5f533d4
--- /dev/null
+++ b/public/locales/en/csv.json
@@ -0,0 +1,120 @@
+{
+ "changeCsvSeparator": {
+ "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",
+ "title": "Change CSV Separator"
+ },
+ "csvRowsToColumns": {
+ "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!.",
+ "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",
+ "shortDescription": "Convert CSV rows to columns.",
+ "title": "Convert CSV Rows to Columns"
+ },
+ "csvToJson": {
+ "columnSeparator": "Column Separator (e.g., , ; \\t)",
+ "commentSymbol": "Comment Symbol (e.g., #)",
+ "conversionOptions": "Conversion Options",
+ "description": "Convert CSV files to JSON format with customizable options for delimiters, quotes, and output formatting. Support for headers, comments, and dynamic type conversion.",
+ "dynamicTypes": "Dynamic Types",
+ "dynamicTypesDescription": "Automatically convert numbers and booleans",
+ "error": "Error",
+ "errorParsing": "Error parsing CSV: {{error}}",
+ "fieldQuote": "Field Quote (e.g., \")",
+ "inputCsvFormat": "Input CSV Format",
+ "inputTitle": "Input CSV",
+ "invalidCsvFormat": "Invalid CSV format",
+ "resultTitle": "Output JSON",
+ "shortDescription": "Convert CSV data to JSON format.",
+ "skipEmptyLines": "Skip Empty Lines",
+ "skipEmptyLinesDescription": "Ignore empty lines in the input CSV",
+ "title": "Convert CSV to JSON",
+ "toolInfo": {
+ "description": "This tool transforms Comma Separated Values (CSV) files to JavaScript Object Notation (JSON) data structures. It supports various CSV formats with customizable delimiters, quote characters, and comment symbols. The converter can treat the first row as headers, skip empty lines, and automatically detect data types like numbers and booleans. The resulting JSON can be used for data migration, backups, or as input for other applications.",
+ "title": "What Is a CSV to JSON Converter?"
+ },
+ "useHeaders": "Use Headers",
+ "useHeadersDescription": "Treat the first row as column headers"
+ },
+ "csvToTsv": {
+ "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.",
+ "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 (",
+ "shortDescription": "Convert CSV data to TSV format.",
+ "title": "Convert CSV to TSV"
+ },
+ "csvToXml": {
+ "description": "Convert CSV files to XML format with customizable options.",
+ "shortDescription": "Convert CSV data to XML format.",
+ "title": "Convert CSV to XML"
+ },
+ "csvToYaml": {
+ "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.",
+ "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!",
+ "shortDescription": "Quickly convert a CSV file to a YAML file.",
+ "title": "Convert CSV to YAML"
+ },
+ "findIncompleteCsvRecords": {
+ "checkingOptions": "Checking Options",
+ "commentCharacterDescription": "Enter the character indicating the start of a comment line. Lines starting with this symbol will be skipped.",
+ "csvInputOptions": "CSV Input Options",
+ "csvSeparatorDescription": "Enter the character used to delimit columns in the CSV input file.",
+ "deleteLinesWithNoData": "Delete Lines with No Data",
+ "deleteLinesWithNoDataDescription": "Remove empty lines from CSV input file.",
+ "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.",
+ "findEmptyValues": "Find Empty Values",
+ "findEmptyValuesDescription": "Display a message about CSV fields that are empty (These are not missing fields but fields that contain nothing).",
+ "inputTitle": "Input CSV",
+ "limitNumberOfMessages": "Limit number of messages",
+ "messageLimitDescription": "Set the limit of number of messages in the output.",
+ "quoteCharacterDescription": "Enter the quote character used to quote the CSV input fields.",
+ "resultTitle": "CSV Status",
+ "shortDescription": "Quickly find rows and columns in CSV that are missing values.",
+ "title": "Find incomplete CSV records",
+ "toolInfo": {
+ "title": "What is a {{title}}?"
+ }
+ },
+ "insertCsvColumns": {
+ "appendColumns": "Append columns",
+ "commentCharacterDescription": "Enter the character indicating the start of a comment line. Lines starting with this symbol will be skipped.",
+ "csvOptions": "CSV Options",
+ "csvSeparator": "CSV separator",
+ "csvToInsert": "CSV to insert",
+ "csvToInsertDescription": "Enter one or more columns you want to insert into the CSV. the character used to delimit columns has to be the same with the one in the CSV input file. Ps: Blank lines will be ignored",
+ "customFillDescription": "If the input CSV file is incomplete (missing values), then add empty fields or custom symbols to records to make a well-formed CSV?",
+ "customFillValueDescription": "Use this custom value to fill in missing fields. (Works only with \"Custom Values\" mode above.)",
+ "customPosition": "Custom position",
+ "customPositionOptionsDescription": "Select the method to insert the columns in the CSV file.",
+ "description": "Add new columns to CSV data at specified positions.",
+ "fillWithCustomValues": "Fill With Customs Values",
+ "fillWithEmptyValues": "Fill With Empty Values",
+ "headerName": "Header name",
+ "headerNameDescription": "Header of the column you want to insert columns after.",
+ "inputTitle": "Input CSV",
+ "insertingPositionDescription": "Specify where to insert the columns in the CSV file.",
+ "position": "Position",
+ "positionOptions": "Position Options",
+ "prependColumns": "Prepend columns",
+ "quoteCharDescription": "Enter the quote character used to quote the CSV input fields.",
+ "resultTitle": "Output CSV",
+ "rowNumberDescription": "Number of the column you want to insert columns after.",
+ "separatorDescription": "Enter the character used to delimit columns in the CSV input file.",
+ "shortDescription": "Quickly insert one or more new columns anywhere in a CSV file.",
+ "title": "Insert CSV columns",
+ "toolInfo": {
+ "description": "This tool allows you to insert new columns into CSV data at specified positions. You can prepend, append, or insert columns at custom positions based on header names or column numbers.",
+ "title": "Insert CSV Columns"
+ }
+ },
+ "swapCsvColumns": {
+ "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.",
+ "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",
+ "shortDescription": "Reorder CSV columns.",
+ "title": "Swap CSV Columns"
+ },
+ "transposeCsv": {
+ "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.",
+ "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!",
+ "shortDescription": "Quickly transpose a CSV file.",
+ "title": "Transpose CSV"
+ }
+}
diff --git a/public/locales/en/image.json b/public/locales/en/image.json
new file mode 100644
index 0000000..9a03c73
--- /dev/null
+++ b/public/locales/en/image.json
@@ -0,0 +1,105 @@
+{
+ "changeColors": {
+ "description": "World",
+ "shortDescription": "Quickly swap colors in a image",
+ "title": "Change colors in image"
+ },
+ "changeOpacity": {
+ "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",
+ "title": "Change image Opacity"
+ },
+ "compress": {
+ "compressedSize": "Compressed Size",
+ "compressionOptions": "Compression options",
+ "description": "Reduce image file size while maintaining quality.",
+ "failedToCompress": "Failed to compress image. Please try again.",
+ "fileSizes": "File sizes",
+ "inputTitle": "Input image",
+ "maxFileSizeDescription": "Maximum file size in megabytes",
+ "originalSize": "Original Size",
+ "qualityDescription": "Image quality percentage (lower means smaller file size)",
+ "resultTitle": "Compressed image",
+ "shortDescription": "Compress images to reduce file size while maintaining reasonable quality.",
+ "title": "Compress Image"
+ },
+ "compressPng": {
+ "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",
+ "title": "Compress png"
+ },
+ "convertJgpToPng": {
+ "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",
+ "title": "Convert JPG to PNG"
+ },
+ "convertToJpg": {
+ "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",
+ "title": "Convert Images to JPG"
+ },
+ "createTransparent": {
+ "description": "World",
+ "shortDescription": "Quickly make an image transparent",
+ "title": "Create transparent PNG"
+ },
+ "crop": {
+ "description": "Crop images to remove unwanted areas.",
+ "inputTitle": "Input image",
+ "resultTitle": "Cropped image",
+ "shortDescription": "Crop images quickly.",
+ "title": "Crop Image"
+ },
+ "editor": {
+ "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",
+ "title": "Image Editor"
+ },
+ "imageToText": {
+ "description": "Extract text from images (JPG, PNG) using optical character recognition (OCR).",
+ "shortDescription": "Extract text from images using OCR.",
+ "title": "Image to Text (OCR)"
+ },
+ "qrCode": {
+ "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.",
+ "title": "QR Code Generator"
+ },
+ "removeBackground": {
+ "description": "World",
+ "shortDescription": "Automatically remove backgrounds from images",
+ "title": "Remove Background from Image"
+ },
+ "resize": {
+ "description": "Resize images to different dimensions.",
+ "dimensionType": "Dimension Type",
+ "heightDescription": "Height (in pixels)",
+ "inputTitle": "Input Image",
+ "maintainAspectRatio": "Maintain Aspect Ratio",
+ "maintainAspectRatioDescription": "Maintain the original aspect ratio of the image.",
+ "percentage": "Percentage",
+ "percentageDescription": "Percentage of original size (e.g., 50 for half size, 200 for double size)",
+ "resizeByPercentage": "Resize by Percentage",
+ "resizeByPercentageDescription": "Resize by specifying a percentage of the original size.",
+ "resizeByPixels": "Resize by Pixels",
+ "resizeByPixelsDescription": "Resize by specifying dimensions in pixels.",
+ "resizeMethod": "Resize Method",
+ "resultTitle": "Resized Image",
+ "setHeight": "Set Height",
+ "setHeightDescription": "Specify the height in pixels and calculate width based on aspect ratio.",
+ "setWidth": "Set Width",
+ "setWidthDescription": "Specify the width in pixels and calculate height based on aspect ratio.",
+ "shortDescription": "Resize images easily.",
+ "title": "Resize Image",
+ "toolInfo": {
+ "description": "This tool allows you to resize JPG, PNG, SVG, or GIF images. You can resize by specifying dimensions in pixels or by percentage, with options to maintain the original aspect ratio.",
+ "title": "Resize Image"
+ },
+ "widthDescription": "Width (in pixels)"
+ },
+ "rotate": {
+ "description": "Rotate an image by a specified angle.",
+ "shortDescription": "Rotate an image easily.",
+ "title": "Rotate Image"
+ }
+}
diff --git a/public/locales/en/json.json b/public/locales/en/json.json
new file mode 100644
index 0000000..634742f
--- /dev/null
+++ b/public/locales/en/json.json
@@ -0,0 +1,62 @@
+{
+ "escapeJson": {
+ "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",
+ "title": "Escape JSON"
+ },
+ "jsonToXml": {
+ "description": "Convert JSON data to XML format. Transform structured JSON objects into well-formed XML documents.",
+ "shortDescription": "Convert JSON to XML format",
+ "title": "JSON to XML"
+ },
+ "minify": {
+ "description": "Remove all unnecessary whitespace from JSON.",
+ "inputTitle": "Input JSON",
+ "resultTitle": "Minified JSON",
+ "shortDescription": "Minify JSON by removing whitespace",
+ "title": "Minify JSON",
+ "toolInfo": {
+ "description": "JSON minification is the process of removing all unnecessary whitespace characters from JSON data while maintaining its validity. This includes removing spaces, newlines, and indentation that aren't required for the JSON to be parsed correctly. Minification reduces the size of JSON data, making it more efficient for storage and transmission while keeping the exact same data structure and values.",
+ "title": "What Is JSON Minification?"
+ }
+ },
+ "prettify": {
+ "description": "Format JSON with proper indentation and spacing.",
+ "indentation": "Indentation",
+ "inputTitle": "Input JSON",
+ "resultTitle": "Prettified JSON",
+ "shortDescription": "Format and beautify JSON code",
+ "title": "Prettify JSON",
+ "toolInfo": {
+ "description": "This tool allows you to format JSON data with proper indentation and spacing, making it more readable and easier to work with.",
+ "title": "Prettify JSON"
+ },
+ "useSpaces": "Use Spaces",
+ "useSpacesDescription": "Indent output with spaces",
+ "useTabs": "Use Tabs",
+ "useTabsDescription": "Indent output with tabs."
+ },
+ "stringify": {
+ "description": "Convert JavaScript objects to JSON string format. Serialize data structures into JSON strings for storage or transmission.",
+ "shortDescription": "Convert objects to JSON string",
+ "title": "Stringify JSON"
+ },
+ "tsvToJson": {
+ "description": "Convert TSV (Tab-Separated Values) data to JSON format. Transform tabular data into structured JSON objects.",
+ "shortDescription": "Convert TSV to JSON format",
+ "title": "TSV to JSON"
+ },
+ "validateJson": {
+ "description": "Check if JSON is valid and well-formed.",
+ "inputTitle": "Input JSON",
+ "invalidJson": "❌ {{error}}",
+ "resultTitle": "Validation Result",
+ "shortDescription": "Validate JSON code for errors",
+ "title": "Validate JSON",
+ "toolInfo": {
+ "description": "JSON (JavaScript Object Notation) is a lightweight data-interchange format. JSON validation ensures that the structure of the data conforms to the JSON standard. A valid JSON object must have: - Property names enclosed in double quotes. - Properly balanced curly braces {}. - No trailing commas after the last key-value pair. - Proper nesting of objects and arrays. This tool checks the input JSON and provides feedback to help identify and fix common errors.",
+ "title": "What is JSON Validation?"
+ },
+ "validJson": "✅ Valid JSON"
+ }
+}
diff --git a/public/locales/en/list.json b/public/locales/en/list.json
new file mode 100644
index 0000000..ddb04d1
--- /dev/null
+++ b/public/locales/en/list.json
@@ -0,0 +1,258 @@
+{
+ "duplicate": {
+ "concatenate": "Concatenate",
+ "concatenateDescription": "Concatenate copies (if unchecked, items will be interweaved)",
+ "copyDescription": "Number of copies (can be fractional)",
+ "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.",
+ "duplicationOptions": "Duplication Options",
+ "error": "Error",
+ "example1Description": "This example shows how to duplicate a list of words.",
+ "example1Title": "Simple duplication",
+ "example2Description": "This example shows how to duplicate a list in reverse order.",
+ "example2Title": "Reverse duplication",
+ "example3Description": "This example shows how to interweave items instead of concatenating them.",
+ "example3Title": "Interweaving items",
+ "example4Description": "This example shows how to duplicate a list with a fractional number of copies.",
+ "example4Title": "Fractional duplication",
+ "examples": {
+ "fractional": {
+ "description": "This example shows how to duplicate a list with a fractional number of copies.",
+ "title": "Fractional duplication"
+ },
+ "interweave": {
+ "description": "This example shows how to interweave items instead of concatenating them.",
+ "title": "Interweaving items"
+ },
+ "reverse": {
+ "description": "This example shows how to duplicate a list in reverse order.",
+ "title": "Reverse duplication"
+ },
+ "simple": {
+ "description": "This example shows how to duplicate a list of words.",
+ "title": "Simple duplication"
+ }
+ },
+ "inputTitle": "Input List",
+ "joinSeparatorDescription": "Separator to join the duplicated list",
+ "resultTitle": "Duplicated List",
+ "reverse": "Reverse",
+ "reverseDescription": "Reverse the duplicated items",
+ "shortDescription": "Duplicate list items with specified criteria",
+ "splitByRegex": "Split by Regular Expression",
+ "splitBySymbol": "Split by Symbol",
+ "splitOptions": "Split Options",
+ "splitSeparatorDescription": "Separator to split the list",
+ "title": "Duplicate",
+ "toolInfo": {
+ "description": "This tool allows you to duplicate items in a list. You can specify the number of copies (including fractional values), control whether items are concatenated or interweaved, and even reverse the duplicated items. It's useful for creating repeated patterns, generating test data, or expanding lists with predictable content.",
+ "title": "List Duplication"
+ },
+ "unknownError": "An unknown error occurred",
+ "validation": {
+ "copyMustBeNumber": "Number of copies must be a number",
+ "copyMustBePositive": "Number of copies must be positive",
+ "copyRequired": "Number of copies is required",
+ "joinSeparatorRequired": "The join separator is required",
+ "separatorRequired": "The separator is required"
+ }
+ },
+ "findMostPopular": {
+ "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.",
+ "displayFormatDescription": "How to display the most popular list items?",
+ "displayOptions": {
+ "count": "Show item count",
+ "percentage": "Show item percentage",
+ "total": "Show item total"
+ },
+ "extractListItems": "How to Extract List Items?",
+ "ignoreItemCase": "Ignore Item Case",
+ "ignoreItemCaseDescription": "Compare all list items in lowercase.",
+ "inputTitle": "Input list",
+ "itemComparison": "Item comparison",
+ "outputFormat": "Top item output format",
+ "removeEmptyItems": "Remove empty items",
+ "removeEmptyItemsDescription": "Ignore empty items from comparison.",
+ "resultTitle": "Most popular items",
+ "shortDescription": "Find most frequently occurring items",
+ "sortOptions": {
+ "alphabetic": "Sort Alphabetically",
+ "count": "Sort by count"
+ },
+ "sortingMethodDescription": "Select a sorting method.",
+ "splitOperators": {
+ "regex": {
+ "description": "Delimit input list items with a regular expression.",
+ "title": "Use a Regex for Splitting"
+ },
+ "symbol": {
+ "description": "Delimit input list items with a character.",
+ "title": "Use a Symbol for Splitting"
+ }
+ },
+ "splitSeparatorDescription": "Set a delimiting symbol or regular expression.",
+ "title": "Find most popular",
+ "trimItems": "Trim top list items",
+ "trimItemsDescription": "Remove leading and trailing spaces before comparing items"
+ },
+ "findUnique": {
+ "caseSensitiveItems": "Case Sensitive Items",
+ "caseSensitiveItemsDescription": "Output items with different case as unique elements in the list.",
+ "delimiterDescription": "Set a delimiting symbol or regular expression.",
+ "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.",
+ "findAbsolutelyUniqueItems": "Find Absolutely Unique Items",
+ "findAbsolutelyUniqueItemsDescription": "Display only those items of the list that exist in a single copy.",
+ "inputListDelimiter": "Input List Delimiter",
+ "inputTitle": "Input List",
+ "outputListDelimiter": "Output List Delimiter",
+ "resultTitle": "Unique Items",
+ "shortDescription": "Find unique items in a list",
+ "skipEmptyItems": "Skip Empty Items",
+ "skipEmptyItemsDescription": "Don't include the empty list items in the output.",
+ "title": "Find unique",
+ "trimItems": "Trim List Items",
+ "trimItemsDescription": "Remove leading and trailing spaces before comparing items.",
+ "uniqueItemOptions": "Unique Item Options"
+ },
+ "group": {
+ "deleteEmptyItems": "Delete Empty Items",
+ "deleteEmptyItemsDescription": "Ignore empty items and don't include them in the groups.",
+ "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.",
+ "emptyItemsAndPadding": "Empty Items and Padding",
+ "groupNumberDescription": "Number of items in a group",
+ "groupSeparatorDescription": "Group separator character",
+ "groupSizeAndSeparators": "Group Size and Separators",
+ "inputItemSeparator": "Input Item Separator",
+ "inputTitle": "Input list",
+ "itemSeparatorDescription": "Item separator character",
+ "leftWrapDescription": "Group's left wrap symbol.",
+ "padNonFullGroups": "Pad Non-full Groups",
+ "padNonFullGroupsDescription": "Fill non-full groups with a custom item (enter below).",
+ "paddingCharDescription": "Use this character or item to pad non-full groups.",
+ "resultTitle": "Grouped items",
+ "rightWrapDescription": "Group's right wrap symbol.",
+ "shortDescription": "Group list items by common properties",
+ "splitOperators": {
+ "regex": {
+ "description": "Delimit input list items with a regular expression.",
+ "title": "Use a Regex for Splitting"
+ },
+ "symbol": {
+ "description": "Delimit input list items with a character.",
+ "title": "Use a Symbol for Splitting"
+ }
+ },
+ "splitSeparatorDescription": "Set a delimiting symbol or regular expression.",
+ "title": "Group"
+ },
+ "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.",
+ "inputTitle": "Input list",
+ "itemSeparator": "Item Separator",
+ "itemSeparatorDescription": "Set a delimiting symbol or regular expression.",
+ "outputListOptions": "Output List Options",
+ "outputSeparatorDescription": "Output list item separator.",
+ "resultTitle": "Reversed list",
+ "shortDescription": "Quickly reverse a list",
+ "splitOperators": {
+ "regex": {
+ "description": "Delimit input list items with a regular expression.",
+ "title": "Use a Regex for Splitting"
+ },
+ "symbol": {
+ "description": "Delimit input list items with a character.",
+ "title": "Use a Symbol for Splitting"
+ }
+ },
+ "splitterMode": "Splitter Mode",
+ "title": "Reverse",
+ "toolInfo": {
+ "description": "With this utility, you can reverse the order of items in a list. The utility first splits the input list into individual items and then iterates through them from the last item to the first item, printing each item to the output during the iteration. The input list may contain anything that can be represented as textual data, which includes digits, numbers, strings, words, sentences, etc. The input item separator can also be a regular expression. For example, the regex /[;,]/ will allow you to use items that are either comma- or semicolon-separated. The input and output list items delimiters can be customized in the options. By default, both input and output lists are comma-separated. Listabulous!",
+ "title": "What Is a List Reverser?"
+ }
+ },
+ "rotate": {
+ "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",
+ "title": "Rotate"
+ },
+ "shuffle": {
+ "delimiterDescription": "Set a delimiting symbol or regular expression.",
+ "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.",
+ "inputListSeparator": "Input list separator",
+ "inputTitle": "Input list",
+ "joinSeparatorDescription": "Use this separator in the randomized list.",
+ "outputLengthDescription": "Output this many random items",
+ "resultTitle": "Shuffled list",
+ "shortDescription": "Randomize the order of list items",
+ "shuffledListLength": "Shuffled List Length",
+ "shuffledListSeparator": "Shuffled List Separator",
+ "title": "Shuffle"
+ },
+ "sort": {
+ "caseSensitive": "Case Sensitive Sort",
+ "caseSensitiveDescription": "Sort uppercase and lowercase items separately. Capital letters precede lowercase letters in an ascending list. (Works only in alphabetical sorting mode.)",
+ "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.",
+ "inputItemSeparator": "Input item separator",
+ "inputTitle": "Input list",
+ "joinSeparatorDescription": "Use this symbol as a joiner between items in a sorted list.",
+ "orderDescription": "Select a sorting order.",
+ "orderOptions": {
+ "decreasing": "Decreasing order",
+ "increasing": "Increasing order"
+ },
+ "removeDuplicates": "Remove duplicates",
+ "removeDuplicatesDescription": "Delete duplicate list items.",
+ "resultTitle": "Sorted list",
+ "shortDescription": "Sort list items in specified order",
+ "sortMethod": "Sort method",
+ "sortMethodDescription": "Select a sorting method.",
+ "sortOptions": {
+ "alphabetic": "Sort Alphabetically",
+ "length": "Sort by Length",
+ "numeric": "Sort Numerically"
+ },
+ "sortedItemProperties": "Sorted item properties",
+ "splitOperators": {
+ "regex": {
+ "description": "Delimit input list items with a regular expression.",
+ "title": "Use a Regex for Splitting"
+ },
+ "symbol": {
+ "description": "Delimit input list items with a character.",
+ "title": "Use a Symbol for Splitting"
+ }
+ },
+ "splitSeparatorDescription": "Set a delimiting symbol or regular expression.",
+ "title": "Sort"
+ },
+ "truncate": {
+ "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",
+ "title": "Truncate"
+ },
+ "unwrap": {
+ "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",
+ "title": "Unwrap"
+ },
+ "wrap": {
+ "description": "Add text before and after each list item.",
+ "inputTitle": "Input List",
+ "joinSeparatorDescription": "Separator to join the wrapped list",
+ "leftTextDescription": "Text to add before each item",
+ "removeEmptyItems": "Remove empty items",
+ "resultTitle": "Wrapped List",
+ "rightTextDescription": "Text to add after each item",
+ "shortDescription": "Wrap list items with specified criteria",
+ "splitByRegex": "Split by Regular Expression",
+ "splitBySymbol": "Split by Symbol",
+ "splitOptions": "Split Options",
+ "splitSeparatorDescription": "Separator to split the list",
+ "title": "Wrap",
+ "toolInfo": {
+ "description": "This tool allows you to add text before and after each item in a list. You can specify different text for the left and right sides, and control how the list is processed. It's useful for adding quotes, brackets, or other formatting to list items, preparing data for different formats, or creating structured text.",
+ "title": "List Wrapping"
+ },
+ "wrapOptions": "Wrap Options"
+ }
+}
diff --git a/public/locales/en/number.json b/public/locales/en/number.json
new file mode 100644
index 0000000..9d57f64
--- /dev/null
+++ b/public/locales/en/number.json
@@ -0,0 +1,97 @@
+{
+ "arithmeticSequence": {
+ "commonDifferenceDescription": "Common difference between terms (d)",
+ "description": "Generate arithmetic sequences with customizable parameters.",
+ "firstTermDescription": "First term of the sequence (a₁)",
+ "numberOfTermsDescription": "Number of terms to generate (n)",
+ "outputFormat": "Output Format",
+ "resultTitle": "Generated Sequence",
+ "separatorDescription": "Separator between terms",
+ "sequenceParameters": "Sequence Parameters",
+ "shortDescription": "Generate arithmetic sequences",
+ "title": "Arithmetic Sequence",
+ "toolInfo": {
+ "description": "An arithmetic sequence is a sequence of numbers where the difference between each consecutive term is constant. This constant difference is called the common difference. Given the first term (a₁) and the common difference (d), each term can be found by adding the common difference to the previous term.",
+ "title": "What is an Arithmetic Sequence?"
+ }
+ },
+ "generate": {
+ "arithmeticSequenceOption": "Arithmetic sequence option",
+ "description": "Generate a sequence of numbers with customizable parameters.",
+ "numberOfElementsDescription": "Number of elements in sequence.",
+ "resultTitle": "Generated numbers",
+ "separator": "Separator",
+ "separatorDescription": "Separate elements in the arithmetic sequence by this character.",
+ "shortDescription": "Generate random numbers in specified ranges",
+ "startSequenceDescription": "Start sequence from this number.",
+ "stepDescription": "Increase each element by this amount",
+ "title": "Generate",
+ "toolInfo": {
+ "description": "This tool allows you to generate a sequence of numbers with customizable parameters. You can specify the starting value, step size, and number of elements.",
+ "title": "Generate numbers"
+ }
+ },
+ "ohmsLaw": {
+ "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.",
+ "shortDescription": "Calculate voltage, current, or resistance in electrical circuits using Ohm's Law",
+ "title": "Ohm's Law"
+ },
+ "slackline": {
+ "description": "Calculates tension in a slackline",
+ "longDescription": "This calculator assumes a load in the center of the rope",
+ "shortDescription": "Calculate the approximate tension of a slackline or clothesline. Do not rely on this for safety.",
+ "title": "Slackline Tension"
+ },
+ "sphereArea": {
+ "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.",
+ "shortDescription": "Calculate the surface area of a sphere based on its radius",
+ "title": "Area of a Sphere"
+ },
+ "sphereVolume": {
+ "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.",
+ "shortDescription": "Calculate the volume of a sphere using radius or diameter",
+ "title": "Volume of a Sphere"
+ },
+ "sum": {
+ "description": "Calculate the sum of a list of numbers. Enter numbers separated by commas or newlines to get their total sum.",
+ "example1Description": "In this example, we calculate the sum of ten positive integers. These integers are listed as a column and their total sum equals 19494.",
+ "example1Title": "Sum of Ten Positive Numbers",
+ "example2Description": "This example reverses a column of twenty three-syllable nouns and prints all the words from the bottom to top. To separate the list items, it uses the \\n character as input item separator, which means that each item is on its own line.",
+ "example2Title": "Count Trees in the Park",
+ "example3Description": "In this example, we add together ninety different values – positive numbers, negative numbers, integers and decimal fractions. We set the input separator to a comma and after adding all of them together, we get 0 as output.",
+ "example3Title": "Sum of Integers and Decimals",
+ "example4Description": "In this example, we calculate the sum of all ten digits and enable the option \"Print Running Sum\". We get the intermediate values of the sum in the process of addition. Thus, we have the following sequence in the output: 0, 1 (0 + 1), 3 (0 + 1 + 2), 6 (0 + 1 + 2 + 3), 10 (0 + 1 + 2 + 3 + 4), and so on.",
+ "example4Title": "Running Sum of Numbers",
+ "extractionTypes": {
+ "delimiter": {
+ "description": "Customize the number separator here. (By default a line break.)",
+ "title": "Number Delimiter"
+ },
+ "smart": {
+ "description": "Auto detect numbers in the input.",
+ "title": "Smart Sum"
+ }
+ },
+ "inputTitle": "Input",
+ "numberExtraction": "Number Extraction",
+ "printRunningSum": "Print Running Sum",
+ "printRunningSumDescription": "Display the sum as it's calculated step by step.",
+ "resultTitle": "Total",
+ "runningSum": "Running Sum",
+ "shortDescription": "Calculate sum of numbers",
+ "title": "Sum",
+ "toolInfo": {
+ "description": "This is an online browser-based utility for calculating the sum of a bunch of numbers. You can enter the numbers separated by a comma, space, or any other character, including the line break. You can also simply paste a fragment of textual data that contains numerical values that you want to sum up and the utility will extract them and find their sum.",
+ "title": "What Is a Number Sum Calculator?"
+ }
+ },
+ "voltageDropInWire": {
+ "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.",
+ "shortDescription": "Calculate voltage drop and power loss in electrical cables based on length, material, and current",
+ "title": "Round trip voltage drop in cable"
+ }
+}
diff --git a/public/locales/en/pdf.json b/public/locales/en/pdf.json
new file mode 100644
index 0000000..eb4b98d
--- /dev/null
+++ b/public/locales/en/pdf.json
@@ -0,0 +1,113 @@
+{
+ "compressPdf": {
+ "compressedFileSize": "Compressed File Size",
+ "compressingPdf": "Compressing PDF...",
+ "compressionLevel": "Compression Level",
+ "compressionSettings": "Compression Settings",
+ "description": "Reduce PDF file size while maintaining quality using Ghostscript",
+ "errorCompressingPdf": "Failed to compress PDF: {{error}}",
+ "errorReadingPdf": "Failed to read PDF file. Please make sure it is a valid PDF.",
+ "fileSize": "Original File Size",
+ "highCompression": "High Compression",
+ "highCompressionDescription": "Maximum file size reduction with some quality loss",
+ "inputTitle": "Input PDF",
+ "lowCompression": "Low Compression",
+ "lowCompressionDescription": "Slightly reduce file size with minimal quality loss",
+ "mediumCompression": "Medium Compression",
+ "mediumCompressionDescription": "Balance between file size and quality",
+ "pages": "Number of Pages",
+ "resultTitle": "Compressed PDF",
+ "shortDescription": "Compress PDF files securely in your browser",
+ "title": "Compress PDF"
+ },
+ "editor": {
+ "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",
+ "title": "PDF Editor"
+ },
+ "merge": {
+ "inputTitle": "Input PDF",
+ "loadingText": "Extracting pages",
+ "resultTitle": "Output merged PDF",
+ "toolInfo": {
+ "description": "This tool allows you to merge multiple PDF files into a single document. To use the tool, simply upload the PDF files you want to merge. The tool will then combine all pages from the input files into a single PDF document.",
+ "title": "How to Use the Merge PDF Tool?"
+ }
+ },
+ "mergePdf": {
+ "description": "Combine multiple PDF files into a single document.",
+ "inputTitle": "Input PDFs",
+ "mergingPdfs": "Merging PDFs",
+ "pdfOptions": "PDF Options",
+ "resultTitle": "Merged PDF",
+ "shortDescription": "Merge multiple PDF files into a single document",
+ "sortByFileName": "Sort by file name",
+ "sortByFileNameDescription": "Sort PDFs alphabetically by file name",
+ "sortByUploadOrder": "Sort by upload order",
+ "sortByUploadOrderDescription": "Keep PDFs in the order they were uploaded",
+ "title": "Merge PDF",
+ "toolInfo": {
+ "description": "This tool allows you to combine multiple PDF files into a single document. You can choose how to sort the PDFs and the tool will merge them in the specified order.",
+ "title": "Merge PDF Files"
+ }
+ },
+ "pdfToEpub": {
+ "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'], path: 'pdf-to-epub', i18n: { name: 'pdf:pdfToEpub.title', description: 'pdf:pdfToEpub.description",
+ "shortDescription": "Convert PDF files to EPUB format",
+ "title": "PDF to EPUB"
+ },
+ "pdfToPng": {
+ "description": "Transform PDF documents into PNG panels.",
+ "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.",
+ "shortDescription": "Convert PDF into PNG images",
+ "title": "PDF to PNG"
+ },
+ "protectPdf": {
+ "description": "Add password protection to your PDF files securely in your browser",
+ "shortDescription": "Password protect PDF files securely",
+ "title": "Protect PDF"
+ },
+ "rotatePdf": {
+ "allPagesWillBeRotated": "All {{count}} pages will be rotated",
+ "angleOptions": {
+ "clockwise90": "90° Clockwise",
+ "counterClockwise270": "270° (90° Counter-clockwise)",
+ "upsideDown180": "180° (Upside down)"
+ },
+ "applyToAllPages": "Apply to all pages",
+ "description": "Rotate pages in a PDF document.",
+ "inputTitle": "Input PDF",
+ "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.",
+ "pageRangesDescription": "Enter page numbers or ranges separated by commas (e.g., 1,3,5-7)",
+ "pageRangesPlaceholder": "e.g., 1,5-8",
+ "pagesWillBeRotated": "{{count}} page{{count !== 1 ? 's' : ''}} will be rotated",
+ "pdfPageCount": "PDF has {{count}} page{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "Rotated PDF",
+ "rotatingPages": "Rotating pages",
+ "rotationAngle": "Rotation Angle",
+ "rotationSettings": "Rotation Settings",
+ "shortDescription": "Rotate pages in a PDF document",
+ "title": "Rotate PDF",
+ "toolInfo": {
+ "description": "This tool allows you to rotate pages in a PDF document. You can rotate all pages or specify individual pages to rotate. Choose a rotation angle: 90° Clockwise, 180° (Upside down), or 270° (90° Counter-clockwise). To rotate specific pages, uncheck \"Apply to all pages\" and enter page numbers or ranges separated by commas (e.g., 1,3,5-7).",
+ "title": "How to Use the Rotate PDF Tool"
+ }
+ },
+ "splitPdf": {
+ "description": "Extract specific pages from a PDF document.",
+ "extractingPages": "Extracting pages",
+ "inputTitle": "Input PDF",
+ "pageExtractionPreview": "{{count}} page{{count !== 1 ? 's' : ''}} will be extracted",
+ "pageRangesDescription": "Enter page numbers or ranges separated by commas (e.g., 1,3,5-7)",
+ "pageRangesPlaceholder": "e.g., 1,5-8",
+ "pageSelection": "Page Selection",
+ "pdfPageCount": "PDF has {{count}} page{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "Extracted PDF",
+ "shortDescription": "Extract specific pages from a PDF file",
+ "title": "Split PDF",
+ "toolInfo": {
+ "description": "This tool allows you to extract specific pages from a PDF document. You can specify individual pages or ranges of pages to extract.",
+ "title": "Split PDF"
+ }
+ }
+}
diff --git a/public/locales/en/string.json b/public/locales/en/string.json
new file mode 100644
index 0000000..142f8b9
--- /dev/null
+++ b/public/locales/en/string.json
@@ -0,0 +1,261 @@
+{
+ "base64": {
+ "decode": "Base64 Decode",
+ "description": "Encode or decode text using Base64 encoding.",
+ "encode": "Base64 Encode",
+ "inputTitle": "Input Data",
+ "optionsTitle": "Base64 Options",
+ "resultTitle": "Result",
+ "shortDescription": "Encode or decode data using Base64.",
+ "title": "Base64 Encoder/Decoder",
+ "toolInfo": {
+ "description": "Base64 is an encoding scheme that represents data in an ASCII string format by translating it into a radix-64 representation. Although it can be used to encode strings, it is commonly used to encode binary data for transmission over media that are designed to deal with textual data.",
+ "title": "What is Base64?"
+ }
+ },
+ "censor": {
+ "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: { name: 'string:censor.title', description: 'string:censor.description",
+ "shortDescription": "Quickly mask bad words or replace them with alternative words.",
+ "title": "Text Censor"
+ },
+ "createPalindrome": {
+ "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",
+ "title": "Create palindrome"
+ },
+ "extractSubstring": {
+ "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",
+ "title": "Extract substring"
+ },
+ "join": {
+ "blankLinesAndTrailingSpaces": "Blank Lines and Trailing Spaces",
+ "deleteBlankDescription": "Delete lines that don't have text symbols.",
+ "deleteBlankTitle": "Delete Blank Lines",
+ "deleteTrailingDescription": "Remove spaces and tabs at the end of the lines.",
+ "deleteTrailingTitle": "Delete Trailing Spaces",
+ "description": "Join text pieces together with customizable separators.",
+ "inputTitle": "Text Pieces",
+ "joinCharacterDescription": "Symbol that connects broken pieces of text. (Space by default.)",
+ "joinCharacterPlaceholder": "Join Character",
+ "resultTitle": "Joined Text",
+ "shortDescription": "Join text elements with a specified separator",
+ "textMergedOptions": "Text Merged Options",
+ "title": "Join Text",
+ "toolInfo": {
+ "description": "With this tool you can join parts of the text together. It takes a list of text values, separated by newlines, and merges them together. You can set the character that will be placed between the parts of the combined text. Also, you can ignore all empty lines and remove spaces and tabs at the end of all lines. Textabulous!",
+ "title": "What Is a Text Joiner?"
+ }
+ },
+ "palindrome": {
+ "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",
+ "title": "Palindrome"
+ },
+ "passwordGenerator": {
+ "avoidAmbiguous": "Avoid ambiguous characters (i, I, l, 0, O)",
+ "description": "Generate secure random passwords with customizable length and character types. Choose from lowercase, uppercase, numbers, and special characters. Option to avoid ambiguous characters for better readability.",
+ "includeLowercase": "Include lowercase letters (a-z)",
+ "includeNumbers": "Include numbers (0-9)",
+ "includeSymbols": "Include special characters",
+ "includeUppercase": "Include uppercase letters (A-Z)",
+ "lengthDesc": "Length of the password",
+ "lengthPlaceholder": "e.g. 12",
+ "optionsTitle": "Password Options",
+ "resultTitle": "Generated Password",
+ "shortDescription": "Generate secure random passwords with custom options",
+ "title": "Password Generator",
+ "toolInfo": {
+ "description": "This tool generates secure random passwords based on your selected criteria. You can customize the length, include or exclude different character types, and avoid ambiguous characters for better readability. Perfect for creating strong passwords for accounts, applications, or any security needs.",
+ "title": "About Password Generator"
+ }
+ },
+ "quote": {
+ "allowDoubleQuotation": "Allow double quotation",
+ "description": "Add quotes around text with customizable options.",
+ "inputTitle": "Input Text",
+ "leftQuoteDescription": "Left quote character(s)",
+ "processAsMultiLine": "Process as multi-line text",
+ "quoteEmptyLines": "Quote empty lines",
+ "quoteOptions": "Quote Options",
+ "resultTitle": "Quoted Text",
+ "rightQuoteDescription": "Right quote character(s)",
+ "shortDescription": "Add quotes around text with various styles",
+ "title": "Text Quoter",
+ "toolInfo": {
+ "description": "This tool allows you to add quotes around text. You can choose different quote characters, handle multi-line text, and control how empty lines are processed. It's useful for preparing text for programming, formatting data, or creating stylized text.",
+ "title": "Text Quoter"
+ }
+ },
+ "randomizeCase": {
+ "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",
+ "title": "Randomize case"
+ },
+ "removeDuplicateLines": {
+ "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",
+ "title": "Remove duplicate lines"
+ },
+ "repeat": {
+ "delimiterDescription": "Delimiter for output copies.",
+ "delimiterPlaceholder": "Delimiter",
+ "description": "Repeat text multiple times with customizable separators.",
+ "inputTitle": "Input text",
+ "numberPlaceholder": "Number",
+ "repeatAmountDescription": "Number of repetitions.",
+ "repetitionsDelimiter": "Repetitions Delimiter",
+ "resultTitle": "Repeated text",
+ "shortDescription": "Repeat text multiple times",
+ "textRepetitions": "Text Repetitions",
+ "title": "Repeat Text",
+ "toolInfo": {
+ "description": "This tool allows you to repeat a given text multiple times with an optional separator.",
+ "title": "Repeat text"
+ }
+ },
+ "reverse": {
+ "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.",
+ "inputTitle": "Text to reverse",
+ "processMultiLine": "Process multi-line text",
+ "processMultiLineDescription": "Each line will be reversed independently",
+ "resultTitle": "Reversed text",
+ "reversalOptions": "Reversal options",
+ "shortDescription": "Reverse any text character by character",
+ "skipEmptyLines": "Skip empty lines",
+ "skipEmptyLinesDescription": "Empty lines will be removed from the output",
+ "title": "Reverse",
+ "trimWhitespace": "Trim whitespace",
+ "trimWhitespaceDescription": "Remove leading and trailing whitespace from each line"
+ },
+ "rot13": {
+ "description": "Encode or decode text using ROT13 cipher.",
+ "inputTitle": "Input Text",
+ "resultTitle": "ROT13 Result",
+ "shortDescription": "Encode or decode text using ROT13 cipher.",
+ "title": "ROT13 Encoder/Decoder",
+ "toolInfo": {
+ "description": "ROT13 (rotate by 13 places) is a simple letter substitution cipher that replaces a letter with the 13th letter after it in the alphabet. ROT13 is a special case of the Caesar cipher which was developed in ancient Rome. Because there are 26 letters in the English alphabet, ROT13 is its own inverse; that is, to undo ROT13, the same algorithm is applied, so the same action can be used for encoding and decoding.",
+ "title": "What Is ROT13?"
+ }
+ },
+ "rotate": {
+ "description": "Rotate characters in text by specified positions.",
+ "inputTitle": "Input Text",
+ "processAsMultiLine": "Process as multi-line text (rotate each line separately)",
+ "resultTitle": "Rotated Text",
+ "rotateLeft": "Rotate Left",
+ "rotateRight": "Rotate Right",
+ "rotationOptions": "Rotation Options",
+ "shortDescription": "Shift characters in text by position.",
+ "stepDescription": "Number of positions to rotate",
+ "title": "Rotate Text",
+ "toolInfo": {
+ "description": "This tool allows you to rotate characters in a string by a specified number of positions. You can rotate to the left or right, and process multi-line text by rotating each line separately. String rotation is useful for simple text transformations, creating patterns, or implementing basic encryption techniques.",
+ "title": "String Rotation"
+ }
+ },
+ "split": {
+ "charAfterChunkDescription": "Character after each chunk",
+ "charBeforeChunkDescription": "Character before each chunk",
+ "chunksDescription": "Number of chunks of equal length in the output.",
+ "chunksTitle": "Use a Number of Chunks",
+ "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.",
+ "lengthDescription": "Number of characters that will be put in each output chunk.",
+ "lengthTitle": "Use Length for Splitting",
+ "outputSeparatorDescription": "Character that will be put between the split chunks. (It's newline \"\\n\" by default.)",
+ "outputSeparatorOptions": "Output Separator Options",
+ "regexDescription": "Regular expression that will be used to break text into parts. (Multiple spaces by default.)",
+ "regexTitle": "Use a Regex for Splitting",
+ "resultTitle": "Split Result",
+ "shortDescription": "Split text into multiple parts using a separator",
+ "splitSeparatorOptions": "Split separator options",
+ "symbolDescription": "Character that will be used to break text into parts. (Space by default.)",
+ "symbolTitle": "Use a Symbol for Splitting",
+ "title": "Split"
+ },
+ "statistic": {
+ "characterFrequencyAnalysis": "Character Frequency Analysis",
+ "characterFrequencyAnalysisDescription": "Count how often each character appears in the text",
+ "delimitersOptions": "Delimiters Options",
+ "description": "Analyze text and generate comprehensive statistics.",
+ "includeEmptyLines": "Include Empty Lines",
+ "includeEmptyLinesDescription": "Include blank lines when counting lines",
+ "inputTitle": "Input text",
+ "resultTitle": "Text Statistics",
+ "sentenceDelimitersDescription": "Enter custom characters used to delimit sentences in your language (separated by comma) or leave it blank for default.",
+ "sentenceDelimitersPlaceholder": "e.g. ., !, ?, ...",
+ "shortDescription": "Get statistics about your text",
+ "statisticsOptions": "Statistics Options",
+ "title": "Text Statistics",
+ "toolInfo": {
+ "description": "This tool allows you to analyze text and generate comprehensive statistics including character count, word count, line count, and frequency analysis of characters and words.",
+ "title": "What is a {{title}}?"
+ },
+ "wordDelimitersDescription": "Enter custom Regex to count Words or leave it blank for default.",
+ "wordDelimitersPlaceholder": "eg. \\s.,;:!?\"«»()…",
+ "wordFrequencyAnalysis": "Word Frequency Analysis",
+ "wordFrequencyAnalysisDescription": "Count how often each word appears in the text"
+ },
+ "textReplacer": {
+ "description": "Replace text patterns with new content.",
+ "findPatternInText": "Find This Pattern in Text",
+ "findPatternUsingRegexp": "Find a Pattern Using a RegExp",
+ "inputTitle": "Text to replace",
+ "newTextPlaceholder": "New text",
+ "regexpDescription": "Enter the regular expression that you want to replace.",
+ "replacePatternDescription": "Enter the pattern to use for replacement.",
+ "replaceText": "Replace Text",
+ "resultTitle": "Text with replacements",
+ "searchPatternDescription": "Enter the text pattern that you want to replace.",
+ "searchText": "Search text",
+ "shortDescription": "Quickly replace text in your content",
+ "title": "Text Replacer",
+ "toolInfo": {
+ "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.",
+ "title": "Text Replacer"
+ }
+ },
+ "toMorse": {
+ "dashSymbolDescription": "Symbol that will correspond to the dash in Morse code.",
+ "description": "Convert text to Morse code.",
+ "dotSymbolDescription": "Symbol that will correspond to the dot in Morse code.",
+ "longSignal": "Long Signal",
+ "resultTitle": "Morse code",
+ "shortDescription": "Quickly encode text to morse",
+ "shortSignal": "Short Signal",
+ "title": "String To morse"
+ },
+ "truncate": {
+ "addTruncationIndicator": "Add Truncation Indicator",
+ "charactersPlaceholder": "Characters",
+ "description": "Shorten text to a specified length.",
+ "indicatorDescription": "Characters to add at the end (or start) of the text. Note: They count towards the length.",
+ "inputTitle": "Input text",
+ "leftSideDescription": "Remove characters from the start of the text.",
+ "leftSideTruncation": "Left-side Truncation",
+ "lengthAndLines": "Length and Lines",
+ "lineByLineDescription": "Truncate each line separately.",
+ "lineByLineTruncating": "Line-by-line Truncating",
+ "maxLengthDescription": "Number of characters to leave in the text.",
+ "numberPlaceholder": "Number",
+ "resultTitle": "Truncated text",
+ "rightSideDescription": "Remove characters from the end of the text.",
+ "rightSideTruncation": "Right-side Truncation",
+ "shortDescription": "Truncate text to a specified length",
+ "suffixAndAffix": "Suffix and Affix",
+ "title": "Truncate Text",
+ "toolInfo": {
+ "description": "Load your text in the input form on the left and you will automatically get truncated text on the right.",
+ "title": "Truncate text"
+ },
+ "truncationSide": "Truncation Side"
+ },
+ "uppercase": {
+ "description": "Convert text to uppercase letters.",
+ "inputTitle": "Input text",
+ "resultTitle": "Uppercase text",
+ "shortDescription": "Convert text to uppercase",
+ "title": "Convert to Uppercase"
+ }
+}
diff --git a/public/locales/en/time.json b/public/locales/en/time.json
new file mode 100644
index 0000000..3b3e93a
--- /dev/null
+++ b/public/locales/en/time.json
@@ -0,0 +1,102 @@
+{
+ "checkLeapYears": {
+ "description": "Check if a year is a leap year and get leap year information.",
+ "exampleDescription": "One of our friends was born on a leap year on February 29th and as a consequence, she has a birthday only once every 4 years. As we can never really remember when her birthday is, we are using our program to create a reminder list of the upcoming leap years. To create a list of her next birthdays, we load a sequence of years from 2025 to 2040 into the input and get the status of each year. If the program says that it's a leap year, then we know that we'll be invited to a birthday party on February 29th.",
+ "exampleTitle": "Find Birthdays on February 29",
+ "inputTitle": "Input year",
+ "resultTitle": "Leap year result",
+ "shortDescription": "Check if a year is a leap year",
+ "title": "Check Leap Years",
+ "toolInfo": {
+ "description": "A leap year is a year containing one additional day (February 29) to keep the calendar year synchronized with the astronomical year. Leap years occur every 4 years, except for years that are divisible by 100 but not by 400.",
+ "title": "What is a Leap Year?"
+ }
+ },
+ "convertDaysToHours": {
+ "addHoursName": "Add Hours Name",
+ "addHoursNameDescription": "Append the string hours to output values",
+ "description": "Convert days to hours with customizable options.",
+ "hoursName": "Hours Name",
+ "shortDescription": "Convert days to hours",
+ "title": "Convert Days to Hours",
+ "toolInfo": {
+ "description": "This tool allows you to convert days to hours. You can input days as numbers or with units, and the tool will convert them to hours. You can also choose to append the 'hours' suffix to the output values.",
+ "title": "Convert Days to Hours"
+ }
+ },
+ "convertHoursToDays": {
+ "addDaysName": "Add Days Name",
+ "addDaysNameDescription": "Append the string days to output values",
+ "daysName": "Days Name",
+ "description": "Convert hours to days with customizable options.",
+ "shortDescription": "Convert hours to days",
+ "title": "Convert Hours to Days",
+ "toolInfo": {
+ "description": "This tool allows you to convert hours to days. You can input hours as numbers or with units, and the tool will convert them to days. You can also choose to append the 'days' suffix to the output values.",
+ "title": "Convert Hours to Days"
+ }
+ },
+ "convertSecondsToTime": {
+ "addPadding": "Add Padding",
+ "addPaddingDescription": "Add zero padding to hours, minutes, and seconds.",
+ "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",
+ "timePadding": "Time Padding",
+ "title": "Convert Seconds to Time",
+ "toolInfo": {
+ "title": "What is a {{title}}?"
+ }
+ },
+ "convertTimeToSeconds": {
+ "description": "Convert formatted time (HH:MM:SS) to seconds.",
+ "inputTitle": "Input time",
+ "resultTitle": "Seconds",
+ "shortDescription": "Convert time format to seconds",
+ "title": "Convert Time to Seconds",
+ "toolInfo": {
+ "description": "This tool allows you to convert formatted time strings (HH:MM:SS) to seconds. It's useful for calculating durations and time intervals.",
+ "title": "Convert Time to Seconds"
+ }
+ },
+ "crontabGuru": {
+ "description": "Generate and understand cron expressions. Create cron schedules for automated tasks and system jobs.",
+ "shortDescription": "Generate and understand cron expressions",
+ "title": "Crontab Guru"
+ },
+ "timeBetweenDates": {
+ "description": "Calculate the time difference between two dates. Get the exact duration in days, hours, minutes, and seconds.",
+ "endDate": "End Date",
+ "endDateTime": "End Date & Time",
+ "endTime": "End Time",
+ "endTimezone": "End Timezone",
+ "shortDescription": "Calculate time between two dates",
+ "startDate": "Start Date",
+ "startDateTime": "Start Date & Time",
+ "startTime": "Start Time",
+ "startTimezone": "Start Timezone",
+ "title": "Time Between Dates",
+ "toolInfo": {
+ "description": "Calculate the exact time difference between two dates and times, with support for different timezones. This tool provides a detailed breakdown of the time difference in various units (years, months, days, hours, minutes, and seconds).",
+ "title": "Time Between Dates Calculator"
+ }
+ },
+ "truncateClockTime": {
+ "description": "Truncate clock time to remove seconds or minutes. Round time to the nearest hour, minute, or custom interval.",
+ "printDroppedComponents": "Print Dropped Components",
+ "shortDescription": "Truncate clock time to specified precision",
+ "timePadding": "Time Padding",
+ "title": "Truncate Clock Time",
+ "toolInfo": {
+ "title": "What is a {{title}}?"
+ },
+ "truncateMinutesAndSeconds": "Truncate Minutes and Seconds",
+ "truncateMinutesAndSecondsDescription": "Drop both – the minutes and seconds components from each clock time.",
+ "truncateOnlySeconds": "Truncate Only Seconds",
+ "truncateOnlySecondsDescription": "Drop the seconds component from each clock time.",
+ "truncationSide": "Truncation Side",
+ "useZeroPadding": "Use Zero Padding",
+ "zeroPaddingDescription": "Make all time components always be two digits wide.",
+ "zeroPrintDescription": "Display the dropped parts as zero values \"00\".",
+ "zeroPrintTruncatedParts": "Zero-print Truncated Parts"
+ }
+}
diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json
new file mode 100644
index 0000000..789e161
--- /dev/null
+++ b/public/locales/en/translation.json
@@ -0,0 +1,250 @@
+{
+ "audio": {
+ "changeSpeed": {
+ "description": "Change the playback speed of audio files. Speed up or slow down audio while maintaining pitch.",
+ "name": "Change audio speed",
+ "shortDescription": "Change the speed of audio files"
+ },
+ "extractAudio": {
+ "description": "Extract the audio track from a video file and save it as a separate audio file in your chosen format (AAC, MP3, WAV).",
+ "name": "Extract audio",
+ "shortDescription": "Extract audio from video files (MP4, MOV, etc.) to AAC, MP3, or WAV."
+ }
+ },
+ "baseFileInput": {
+ "copyFailed": "Failed to copy: {{error}}",
+ "dropFileHere": "Drop your {{type}} here",
+ "fileCopied": "File copied",
+ "selectFileDescription": "Click here to select a {{type}} from your device, press Ctrl+V to use a {{type}} from your clipboard, or drag and drop a file from desktop"
+ },
+ "categories": {
+ "audio": {
+ "description": "Tools for working with audio – extract audio from video, adjusting audio speed, merging multiple audio files and much more.",
+ "title": "Audio Tools"
+ },
+ "csv": {
+ "description": "Tools for working with CSV files - convert CSV to different formats, manipulate CSV data, validate CSV structure, and process CSV files efficiently.",
+ "title": "CSV Tools"
+ },
+ "gif": {
+ "description": "Tools for working with GIF animations – create transparent GIFs, extract GIF frames, add text to GIF, crop, rotate, reverse GIFs, and much more.",
+ "title": "GIF Tools"
+ },
+ "image-generic": {
+ "description": "Tools for working with pictures – compress, resize, crop, convert to JPG, rotate, remove background and much more.",
+ "title": "Image Tools"
+ },
+ "json": {
+ "description": "Tools for working with JSON data structures – prettify and minify JSON objects, flatten JSON arrays, stringify JSON values, analyze data, and much more",
+ "title": "JSON Tools"
+ },
+ "list": {
+ "description": "Tools for working with lists – sort, reverse, randomize lists, find unique and duplicate list items, change list item separators, and much more.",
+ "title": "List Tools"
+ },
+ "number": {
+ "description": "Tools for working with numbers – generate number sequences, convert numbers to words and words to numbers, sort, round, factor numbers, and much more.",
+ "title": "Number Tools"
+ },
+ "pdf": {
+ "description": "Tools for working with PDF files - extract text from PDFs, convert PDFs to other formats, manipulate PDFs, and much more.",
+ "title": "PDF Tools"
+ },
+ "png": {
+ "description": "Tools for working with PNG images – convert PNGs to JPGs, create transparent PNGs, change PNG colors, crop, rotate, resize PNGs, and much more.",
+ "title": "PNG Tools"
+ },
+ "seeAll": "See all {{title}}",
+ "string": {
+ "description": "Tools for working with text – convert text to images, find and replace text, split text into fragments, join text lines, repeat text, and much more.",
+ "title": "Text Tools"
+ },
+ "time": {
+ "description": "Tools for working with time and date – calculate time differences, convert between time zones, format dates, generate date sequences, and much more.",
+ "title": "Time Tools"
+ },
+ "try": "Try {{title}}",
+ "video": {
+ "description": "Tools for working with videos – extract frames from videos, create GIFs from videos, convert videos to different formats, and much more.",
+ "title": "Video Tools"
+ },
+ "xml": {
+ "description": "Tools for working with XML data structures - viewer, beautifier, validator and much more",
+ "title": "XML Tools"
+ }
+ },
+ "csv": {
+ "findIncompleteCsvRecords": {
+ "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.",
+ "name": "Find incomplete CSV records",
+ "shortDescription": "Quickly find rows and columns in CSV that are missing values."
+ }
+ },
+ "hero": {
+ "brand": "OmniTools",
+ "description": "Boost your productivity with OmniTools, the ultimate toolkit for getting things done quickly! Access thousands of user-friendly utilities for editing images, text, lists, and data, all directly from your browser.",
+ "examples": {
+ "calculateNumberSum": "Calculate number sum",
+ "changeGifSpeed": "Change GIF speed",
+ "compressPng": "Compress PNG",
+ "createTransparentImage": "Create a transparent image",
+ "prettifyJson": "Prettify JSON",
+ "sortList": "Sort a list",
+ "splitPdf": "Split PDF",
+ "splitText": "Split a text",
+ "trimVideo": "Trim video"
+ },
+ "searchPlaceholder": "Search all tools",
+ "title": "Get Things Done Quickly with"
+ },
+ "inputFooter": {
+ "clear": "Clear",
+ "copyToClipboard": "Copy to clipboard",
+ "importFromFile": "Import from file"
+ },
+ "list": {
+ "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.",
+ "name": "Group",
+ "shortDescription": "Group list items by common properties"
+ },
+ "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.",
+ "name": "Reverse",
+ "shortDescription": "Quickly reverse a list"
+ },
+ "sort": {
+ "description": "This is a super simple browser-based application that sorts items in a list and arranges them in increasing or decreasing order. You can sort the items alphabetically, numerically, or by their length. You can also remove duplicate and empty items, as well as trim individual items that have whitespace around them. You can use any separator character to separate the input list items or alternatively use a regular expression to separate them. Additionally, you can create a new delimiter for the sorted output list.",
+ "name": "Sort",
+ "shortDescription": "Quickly sort a list"
+ }
+ },
+ "navbar": {
+ "buyMeACoffee": "Buy me a coffee",
+ "home": "Home",
+ "tools": "Tools"
+ },
+ "number": {
+ "generate": {
+ "description": "Quickly calculate a list of integers in your browser. To get your list, just specify the first integer, change value and total count in the options below, and this utility will generate that many integers",
+ "name": "Generate numbers",
+ "shortDescription": "Quickly calculate a list of integers in your browser"
+ },
+ "sum": {
+ "description": "This is a super simple browser-based application that sums numbers. The input numbers can be separated by any symbol and you can also change the separator of the summed numbers.",
+ "name": "Sum numbers",
+ "shortDescription": "Quickly sum a list of numbers"
+ }
+ },
+ "numericInputWithUnit": {
+ "unit": "Unit"
+ },
+ "pdf": {
+ "compressPdf": {
+ "description": "Reduce PDF file size while maintaining quality using Ghostscript",
+ "name": "Compress PDF",
+ "shortDescription": "Compress PDF files securely in your browser"
+ },
+ "mergePdf": {
+ "description": "Combine multiple PDF files into a single document.",
+ "name": "Merge PDF",
+ "shortDescription": "Merge multiple PDF files into a single document"
+ },
+ "pdfToEpub": {
+ "description": "Transform PDF documents into EPUB files for better e-reader compatibility.",
+ "name": "PDF to EPUB",
+ "shortDescription": "Convert PDF files to EPUB format"
+ },
+ "protectPdf": {
+ "description": "Add password protection to your PDF files securely in your browser",
+ "name": "Protect PDF",
+ "shortDescription": "Password protect PDF files securely"
+ },
+ "splitPdf": {
+ "description": "Extract specific pages from a PDF file using page numbers or ranges (e.g., 1,5-8)",
+ "name": "Split PDF",
+ "shortDescription": "Extract specific pages from a PDF file"
+ }
+ },
+ "resultFooter": {
+ "copy": "Copy to clipboard",
+ "download": "Download"
+ },
+ "string": {
+ "createPalindrome": {
+ "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.",
+ "name": "Create palindrome",
+ "shortDescription": "Create text that reads the same forward and backward"
+ },
+ "palindrome": {
+ "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.",
+ "name": "Palindrome",
+ "shortDescription": "Check if text reads the same forward and backward"
+ },
+ "repeat": {
+ "description": "This tool allows you to repeat a given text multiple times with an optional separator.",
+ "name": "Repeat text",
+ "shortDescription": "Repeat text multiple times"
+ },
+ "reverse": {
+ "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.",
+ "name": "Reverse",
+ "shortDescription": "Reverse any text character by character"
+ },
+ "toMorse": {
+ "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.",
+ "name": "String To morse",
+ "shortDescription": "Quickly encode text to morse"
+ },
+ "uppercase": {
+ "description": "World's simplest browser-based utility for converting text to uppercase. Just input your text and it will be automatically converted to all capital letters. Perfect for creating headlines, emphasizing text, or standardizing text format. Supports various text formats and preserves special characters.",
+ "name": "Uppercase",
+ "shortDescription": "Convert text to uppercase letters"
+ }
+ },
+ "toolExamples": {
+ "subtitle": "Click to try!",
+ "title": "{{title}} Examples"
+ },
+ "toolFileResult": {
+ "copied": "File copied",
+ "copyFailed": "Failed to copy: {{error}}",
+ "loading": "Loading... This may take a moment.",
+ "result": "Result"
+ },
+ "toolHeader": {
+ "seeExamples": "See Examples"
+ },
+ "toolLayout": {
+ "allToolsTitle": "All {{type}}"
+ },
+ "toolMultiFileResult": {
+ "copied": "File copied",
+ "copyFailed": "Failed to copy: {{error}}",
+ "loading": "Loading... This may take a moment.",
+ "result": "Result"
+ },
+ "toolMultipleAudioInput": {
+ "inputTitle": "Input {{type}}",
+ "noFilesSelected": "No files selected"
+ },
+ "toolMultiplePdfInput": {
+ "inputTitle": "Input {{type}}",
+ "noFilesSelected": "No files selected"
+ },
+ "toolOptions": {
+ "title": "Tool options"
+ },
+ "toolTextInput": {
+ "copied": "Text copied",
+ "copyFailed": "Failed to copy: {{error}}",
+ "input": "Input text",
+ "placeholder": "Enter your text here..."
+ },
+ "toolTextResult": {
+ "copied": "Text copied",
+ "copyFailed": "Failed to copy: {{error}}",
+ "loading": "Loading... This may take a moment.",
+ "result": "Result"
+ }
+}
diff --git a/public/locales/en/video.json b/public/locales/en/video.json
new file mode 100644
index 0000000..d150ca8
--- /dev/null
+++ b/public/locales/en/video.json
@@ -0,0 +1,113 @@
+{
+ "changeSpeed": {
+ "defaultMultiplier": "Default multiplier: 2 means 2x faster",
+ "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.",
+ "inputTitle": "Input Video",
+ "newVideoSpeed": "New Video Speed",
+ "resultTitle": "Edited Video",
+ "settingSpeed": "Setting Speed",
+ "shortDescription": "Change video playback speed",
+ "title": "Change Video Speed",
+ "toolInfo": {
+ "title": "What is a {{title}}?"
+ }
+ },
+ "compress": {
+ "default": "Default",
+ "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.",
+ "inputTitle": "Input Video",
+ "loadingText": "Compressing video...",
+ "lossless": "Lossless",
+ "quality": "Quality (CRF)",
+ "resolution": "Resolution",
+ "resultTitle": "Compressed Video",
+ "shortDescription": "Compress videos by scaling to different resolutions",
+ "title": "Compress Video",
+ "worst": "Worst"
+ },
+ "cropVideo": {
+ "cropCoordinates": "Crop Coordinates",
+ "croppingVideo": "Cropping Video",
+ "description": "Crop video to remove unwanted areas.",
+ "errorBeyondHeight": "Crop area extends beyond video height ({{height}}px)",
+ "errorBeyondWidth": "Crop area extends beyond video width ({{width}}px)",
+ "errorCroppingVideo": "Error cropping video. Please check parameters and video file.",
+ "errorLoadingDimensions": "Failed to load video dimensions",
+ "errorNonNegativeCoordinates": "X and Y coordinates must be non-negative",
+ "errorPositiveDimensions": "Width and height must be positive",
+ "height": "Height",
+ "inputTitle": "Input Video",
+ "loadVideoForDimensions": "Load a video to see dimensions",
+ "resultTitle": "Cropped Video",
+ "shortDescription": "Crop video to remove unwanted areas",
+ "title": "Crop Video",
+ "toolInfo": {
+ "description": "This tool allows you to crop video files to remove unwanted areas. You can specify the crop area by setting the X, Y coordinates and width, height dimensions.",
+ "title": "Crop Video"
+ },
+ "videoDimensions": "Video dimensions: {{width}} × {{height}} pixels",
+ "videoInformation": "Video Information",
+ "width": "Width",
+ "xCoordinate": "X (left)",
+ "yCoordinate": "Y (top)"
+ },
+ "flip": {
+ "description": "Flip video files horizontally or vertically. Mirror videos for special effects or correct orientation issues.",
+ "flippingVideo": "Flipping Video",
+ "horizontalLabel": "Horizontal (Mirror)",
+ "inputTitle": "Input Video",
+ "orientation": "Orientation",
+ "resultTitle": "Flipped Video",
+ "shortDescription": "Flip video horizontally or vertically",
+ "title": "Flip Video",
+ "verticalLabel": "Vertical (Upside Down)"
+ },
+ "gif": {
+ "changeSpeed": {
+ "description": "Change the playback speed of GIF animations. Speed up or slow down GIFs while maintaining smooth animation.",
+ "shortDescription": "Change GIF animation speed",
+ "title": "Change GIF Speed"
+ }
+ },
+ "loop": {
+ "description": "Create a looping video by repeating the original video multiple times.",
+ "inputTitle": "Input Video",
+ "loopingVideo": "Looping Video",
+ "loops": "Loops",
+ "numberOfLoops": "Number of Loops",
+ "resultTitle": "Looped Video",
+ "shortDescription": "Create looping video files",
+ "title": "Loop Video",
+ "toolInfo": {
+ "description": "This tool allows you to create a looping video by repeating the original video multiple times. You can specify how many times the video should loop.",
+ "title": "What is a {{title}}?"
+ }
+ },
+ "rotate": {
+ "180Degrees": "180° (Upside down)",
+ "270Degrees": "270° (90° Counter-clockwise)",
+ "90Degrees": "90° Clockwise",
+ "description": "Rotate video files by 90, 180, or 270 degrees. Correct video orientation or create special effects with precise rotation control.",
+ "inputTitle": "Input Video",
+ "resultTitle": "Rotated Video",
+ "rotatingVideo": "Rotating Video",
+ "rotation": "Rotation",
+ "shortDescription": "Rotate video by specified degrees",
+ "title": "Rotate Video"
+ },
+ "trim": {
+ "description": "Trim video files by specifying start and end times. Remove unwanted sections from the beginning or end of videos.",
+ "endTime": "End Time",
+ "inputTitle": "Input Video",
+ "resultTitle": "Trimmed Video",
+ "shortDescription": "Trim video by removing unwanted sections",
+ "startTime": "Start Time",
+ "timestamps": "Timestamps",
+ "title": "Trim Video"
+ },
+ "videoToGif": {
+ "description": "Convert video files to animated GIF format. Extract specific time ranges and create shareable animated images.",
+ "shortDescription": "Convert video to animated GIF",
+ "title": "Video to GIF"
+ }
+}
diff --git a/public/locales/en/xml.json b/public/locales/en/xml.json
new file mode 100644
index 0000000..8acd4fc
--- /dev/null
+++ b/public/locales/en/xml.json
@@ -0,0 +1,38 @@
+{
+ "xmlBeautifier": {
+ "description": "Format XML with proper indentation and spacing.",
+ "indentation": "Indentation",
+ "inputTitle": "Input XML",
+ "resultTitle": "Beautified XML",
+ "shortDescription": "Format and beautify XML code",
+ "title": "XML Beautifier",
+ "toolInfo": {
+ "description": "This tool allows you to format XML data with proper indentation and spacing, making it more readable and easier to work with.",
+ "title": "XML Beautifier"
+ },
+ "useSpaces": "Use Spaces",
+ "useSpacesDescription": "Indent output with spaces",
+ "useTabs": "Use Tabs",
+ "useTabsDescription": "Indent output with tabs."
+ },
+ "xmlValidator": {
+ "description": "Validate XML syntax and structure.",
+ "placeholder": "Paste or import XML here...",
+ "shortDescription": "Validate XML code for errors",
+ "title": "XML Validator",
+ "toolInfo": {
+ "description": "This tool allows you to validate XML syntax and structure. It checks if the XML is well-formed and provides detailed error messages for any issues found.",
+ "title": "XML Validator"
+ }
+ },
+ "xmlViewer": {
+ "description": "View and explore XML structure in a tree format.",
+ "inputTitle": "Input XML",
+ "resultTitle": "XML Tree View",
+ "title": "XML Viewer",
+ "toolInfo": {
+ "description": "This tool allows you to view XML data in a hierarchical tree format, making it easier to explore and understand the structure of XML documents.",
+ "title": "XML Viewer"
+ }
+ }
+}
diff --git a/public/locales/es/audio.json b/public/locales/es/audio.json
new file mode 100644
index 0000000..e8698ca
--- /dev/null
+++ b/public/locales/es/audio.json
@@ -0,0 +1,42 @@
+{
+ "changeSpeed": {
+ "description": "Cambia la velocidad de reproducción de los archivos de audio. Acelera o ralentiza el audio manteniendo el tono.",
+ "inputTitle": "Entrada de audio",
+ "newAudioSpeed": "Nueva velocidad de audio",
+ "outputFormat": "Formato de salida",
+ "resultTitle": "Audio editado",
+ "settingSpeed": "Ajuste de velocidad",
+ "shortDescription": "Cambiar la velocidad de los archivos de audio",
+ "speedDescription": "Multiplicador predeterminado: 2 significa 2 veces más rápido",
+ "title": "Cambiar la velocidad del audio",
+ "toolInfo": {
+ "title": "Qué es {{title}}?"
+ }
+ },
+ "extractAudio": {
+ "description": "Extraer pistas de audio de archivos de vídeo.",
+ "extractingAudio": "Extrayendo audio",
+ "inputTitle": "Vídeo de entrada",
+ "outputFormat": "Formato de salida",
+ "outputFormatDescription": "Seleccione el formato en el que se extraerá el audio.",
+ "resultTitle": "Audio extraído",
+ "shortDescription": "Extrae audio de archivos de vídeo (MP4, MOV, etc.) a AAC, MP3 o WAV.",
+ "title": "Extraer audio de un vídeo",
+ "toolInfo": {
+ "description": "Esta herramienta te permite extraer la pista de audio de archivos de video. Puedes elegir entre diferentes formatos de audio, como AAC, MP3 y WAV.",
+ "title": "Qué es {{title}}?"
+ }
+ },
+ "mergeAudio": {
+ "description": "Combine varios archivos de audio en un solo archivo de audio concatenándolos en secuencia.",
+ "longDescription": "Esta herramienta te permite fusionar varios archivos de audio en uno solo concatenándolos en el orden en que los subes. Es perfecta para combinar segmentos de podcast, pistas de música o cualquier archivo de audio que necesite unirse. Admite varios formatos de audio, como MP3, AAC y WAV.",
+ "shortDescription": "Fusionar varios archivos de audio en uno (MP3, AAC, WAV).",
+ "title": "Fusionar audio"
+ },
+ "trim": {
+ "description": "Corte y recorte archivos de audio para extraer segmentos específicos especificando las horas de inicio y finalización.",
+ "longDescription": "Esta herramienta te permite recortar archivos de audio especificando la hora de inicio y la hora de fin. Puedes extraer segmentos específicos de archivos de audio más largos, eliminar partes no deseadas o crear clips más cortos. Compatible con varios formatos de audio, como MP3, AAC y WAV. Ideal para edición de podcasts, producción musical o cualquier otra necesidad de edición de audio.",
+ "shortDescription": "Recorta archivos de audio para extraer segmentos de tiempo específicos (MP3, AAC, WAV).",
+ "title": "Recortar audio"
+ }
+}
diff --git a/public/locales/es/csv.json b/public/locales/es/csv.json
new file mode 100644
index 0000000..3e4eed9
--- /dev/null
+++ b/public/locales/es/csv.json
@@ -0,0 +1,114 @@
+{
+ "changeCsvSeparator": {
+ "description": "Cambie el delimitador/separador en archivos CSV. Convierta entre diferentes formatos CSV, como coma, punto y coma, tabulación o separadores personalizados.",
+ "shortDescription": "Cambiar el delimitador del archivo CSV",
+ "title": "Cambiar el separador CSV"
+ },
+ "csvRowsToColumns": {
+ "description": "Esta herramienta convierte las filas de un archivo CSV (Valores Separados por Comas) en columnas. Extrae las líneas horizontales del CSV de entrada una por una, las gira 90 grados y las genera como columnas verticales, una tras otra, separadas por comas.', longDescription: 'Esta herramienta convierte las filas de un archivo CSV (Valores Separados por Comas) en columnas. Por ejemplo, si los datos CSV de entrada tienen 6 filas, la salida tendrá 6 columnas y los elementos de las filas se ordenarán de arriba a abajo. En un CSV bien formado, el número de valores en cada fila es el mismo. Sin embargo, si faltan campos en las filas, el programa puede corregirlos y usted puede elegir entre las opciones disponibles: rellenar los datos faltantes con elementos vacíos o reemplazarlos con elementos personalizados, como \"missing\", \"?\" o \"x\". Durante el proceso de conversión, la herramienta también limpia el archivo CSV de información innecesaria, como líneas vacías (líneas sin información visible) y comentarios. Para que la herramienta identifique correctamente los comentarios, en las opciones, puede especificar el símbolo al principio de la línea que inicia un comentario. Este símbolo suele ser una almohadilla \"#\" o una doble barra \"//\". ¡Csv-abuloso!",
+ "longDescription": "Esta herramienta convierte las filas de un archivo CSV (valores separados por comas) en columnas. Por ejemplo, si los datos CSV de entrada tienen 6 filas, la salida tendrá 6 columnas y los elementos de las filas se ordenarán de arriba a abajo. En un CSV bien formado, el número de valores en cada fila es el mismo. Sin embargo, si faltan campos en las filas, el programa puede corregirlos y usted puede elegir entre las opciones disponibles: rellenar los datos faltantes con elementos vacíos o reemplazarlos con elementos personalizados, como",
+ "shortDescription": "Convertir filas CSV en columnas.",
+ "title": "Convertir filas CSV en columnas"
+ },
+ "csvToJson": {
+ "columnSeparator": "Separador de columnas (p. ej., , ; \\t)",
+ "commentSymbol": "Símbolo de comentario (p. ej., #)",
+ "conversionOptions": "Opciones de conversión",
+ "description": "Convierte archivos CSV a formato JSON con opciones personalizables para delimitadores, comillas y formato de salida. Admite encabezados, comentarios y conversión dinámica de tipos.",
+ "dynamicTypes": "Tipos dinámicos",
+ "dynamicTypesDescription": "Convierte automáticamente números y valores booleanos",
+ "errorParsing": "Error al analizar CSV: {{error}}",
+ "fieldQuote": "Cita de campo (por ejemplo, \")",
+ "inputCsvFormat": "Formato CSV de entrada",
+ "inputTitle": "CSV de entrada",
+ "resultTitle": "Salida JSON",
+ "shortDescription": "Convierte datos CSV al formato JSON.",
+ "skipEmptyLines": "Saltar líneas vacías",
+ "skipEmptyLinesDescription": "Ignorar líneas vacías en el CSV de entrada",
+ "title": "Convertir CSV a JSON",
+ "useHeaders": "Usar encabezados",
+ "useHeadersDescription": "Tratar la primera fila como encabezados de columna"
+ },
+ "csvToTsv": {
+ "description": "Sube tu archivo CSV en el formulario a continuación y se convertirá automáticamente a un archivo TSV. En las opciones de la herramienta, puedes personalizar el formato CSV de entrada: especifica el delimitador de campo, las comillas y el símbolo de comentario, omite las líneas vacías del CSV y elige si deseas conservar los encabezados de columna del CSV.",
+ "longDescription": "Esta herramienta transforma datos de valores separados por comas (CSV) en datos de valores separados por tabulaciones (TSV). Tanto CSV como TSV son formatos de archivo populares para almacenar datos tabulares, pero utilizan diferentes delimitadores para separar los valores: CSV usa comas (",
+ "shortDescription": "Convierte datos CSV al formato TSV.",
+ "title": "Convertir CSV a TSV"
+ },
+ "csvToXml": {
+ "description": "Convierte archivos CSV al formato XML con opciones personalizables.",
+ "shortDescription": "Convertir datos CSV al formato XML.",
+ "title": "Convertir CSV a XML"
+ },
+ "csvToYaml": {
+ "description": "Simplemente cargue su archivo CSV en el formulario a continuación y se convertirá automáticamente a un archivo YAML. En las opciones de la herramienta, puede especificar el carácter delimitador de campo, la comilla de campo y el carácter de comentario para adaptar la herramienta a formatos CSV personalizados. Además, puede seleccionar el formato YAML de salida: uno que conserve o excluya los encabezados CSV.",
+ "longDescription": "Esta herramienta transforma datos CSV (valores separados por comas) en datos YAML (un lenguaje de marcado más). CSV es un formato tabular simple que se utiliza para representar tipos de datos matriciales compuestos por filas y columnas. YAML, por otro lado, es un formato más avanzado (en realidad, un superconjunto de JSON), que crea datos más legibles para la serialización y admite listas, diccionarios y objetos anidados. Este programa admite varios formatos CSV de entrada: los datos de entrada pueden estar separados por comas (predeterminado), punto y coma, barras verticales o usar un delimitador completamente diferente. Puede especificar el delimitador exacto que usan sus datos en las opciones. De igual forma, en las opciones, puede especificar el carácter de comillas que se utiliza para encapsular los campos CSV (por defecto, un símbolo de comillas dobles). También puede omitir líneas que comiencen con comentarios especificando los símbolos de comentario en las opciones. Esto le permite mantener sus datos limpios al omitir líneas innecesarias. Hay dos maneras de convertir CSV a YAML. El primer método convierte cada fila del CSV en una lista YAML. El segundo método extrae los encabezados de la primera fila del CSV y crea objetos YAML con claves basadas en estos encabezados. También puedes personalizar el formato YAML de salida especificando el número de espacios para la sangría de las estructuras YAML. Si necesitas realizar la conversión inversa, es decir, transformar YAML a CSV, puedes usar nuestra herramienta Convertir YAML a CSV. ¡Csv-abroso!",
+ "shortDescription": "Convierte rápidamente un archivo CSV en un archivo YAML.",
+ "title": "Convertir CSV a YAML"
+ },
+ "findIncompleteCsvRecords": {
+ "checkingOptions": "Opciones de comprobación",
+ "commentCharacterDescription": "Introduzca el carácter que indica el inicio de una línea de comentario. Las líneas que comiencen con este símbolo se omitirán.",
+ "csvInputOptions": "Opciones de entrada CSV",
+ "csvSeparatorDescription": "Introduzca el carácter utilizado para delimitar columnas en el archivo de entrada CSV.",
+ "deleteLinesWithNoData": "Eliminar líneas sin datos",
+ "deleteLinesWithNoDataDescription": "Eliminar líneas vacías del archivo de entrada CSV.",
+ "description": "Simplemente cargue su archivo CSV en el formulario a continuación y esta herramienta comprobará automáticamente si ninguna fila o columna tiene valores faltantes. En las opciones de la herramienta, puede ajustar el formato del archivo de entrada (especifique el delimitador, las comillas y el carácter de comentario). Además, puede activar la comprobación de valores vacíos, omitir líneas vacías y limitar el número de mensajes de error en la salida.",
+ "findEmptyValues": "Encontrar valores vacíos",
+ "findEmptyValuesDescription": "Mostrar un mensaje sobre los campos CSV que están vacíos (no son campos faltantes, sino campos que no contienen nada).",
+ "inputTitle": "CSV de entrada",
+ "limitNumberOfMessages": "Limitar el número de mensajes",
+ "messageLimitDescription": "Establezca el límite del número de mensajes en la salida.",
+ "quoteCharacterDescription": "Introduzca el carácter de comillas utilizado para citar los campos de entrada CSV.",
+ "resultTitle": "Estado CSV",
+ "shortDescription": "Encuentre rápidamente filas y columnas en CSV que tengan valores faltantes.",
+ "title": "Encontrar registros CSV incompletos",
+ "toolInfo": {
+ "title": "¿Qué es un? {{title}}?"
+ }
+ },
+ "insertCsvColumns": {
+ "appendColumns": "Añadir columnas",
+ "commentCharacterDescription": "Introduzca el carácter que indica el inicio de una línea de comentario. Las líneas que comiencen con este símbolo se omitirán.",
+ "csvOptions": "Opciones CSV",
+ "csvSeparator": "Separador CSV",
+ "csvToInsert": "CSV para insertar",
+ "csvToInsertDescription": "Introduzca una o más columnas que desee insertar en el CSV. El carácter utilizado para delimitar las columnas debe ser el mismo que el del archivo CSV de entrada. Nota: Se ignorarán las líneas en blanco.",
+ "customFillDescription": "Si el archivo CSV de entrada está incompleto (valores faltantes), ¿cómo agregar campos vacíos o símbolos personalizados a los registros para crear un CSV bien formado?",
+ "customFillValueDescription": "Utilice este valor personalizado para completar los campos que faltan. (Solo funciona con el modo \"Valores personalizados\" mencionado anteriormente).",
+ "customPosition": "Posición personalizada",
+ "customPositionOptionsDescription": "Seleccione el método para insertar las columnas en el archivo CSV.",
+ "description": "Agregar nuevas columnas a los datos CSV en posiciones específicas.",
+ "fillWithCustomValues": "Rellenar con valores aduaneros",
+ "fillWithEmptyValues": "Rellenar con valores vacíos",
+ "headerName": "Nombre del encabezado",
+ "headerNameDescription": "Encabezado de la columna después de la cual desea insertar columnas.",
+ "inputTitle": "CSV de entrada",
+ "insertingPositionDescription": "Especifique dónde insertar las columnas en el archivo CSV.",
+ "position": "Posición",
+ "positionOptions": "Opciones de posición",
+ "prependColumns": "Anteponer columnas",
+ "quoteCharDescription": "Introduzca el carácter de comillas utilizado para citar los campos de entrada CSV.",
+ "resultTitle": "CSV de salida",
+ "rowNumberDescription": "Número de la columna después de la cual desea insertar columnas.",
+ "separatorDescription": "Introduzca el carácter utilizado para delimitar columnas en el archivo de entrada CSV.",
+ "shortDescription": "Inserte rápidamente una o más columnas nuevas en cualquier lugar de un archivo CSV.",
+ "title": "Insertar columnas CSV",
+ "toolInfo": {
+ "description": "Esta herramienta permite insertar nuevas columnas en datos CSV en posiciones específicas. Puede anteponer, anexar o insertar columnas en posiciones personalizadas según los nombres de encabezado o los números de columna.",
+ "title": "Insertar columnas CSV"
+ }
+ },
+ "swapCsvColumns": {
+ "description": "Simplemente cargue su archivo CSV en el formulario a continuación, especifique las columnas que desea intercambiar y la herramienta cambiará automáticamente la posición de dichas columnas en el archivo de salida. En las opciones de la herramienta, puede especificar las posiciones o los nombres de las columnas que desea intercambiar, así como corregir datos incompletos y, opcionalmente, eliminar registros vacíos y comentados.",
+ "longDescription": "Esta herramienta reorganiza los datos CSV intercambiando la posición de sus columnas. Intercambiar columnas mejora la legibilidad de un archivo CSV al colocar los datos de uso frecuente juntos o al frente para facilitar la comparación y edición. Por ejemplo, puede intercambiar la primera columna con la última o la segunda con la tercera. Para intercambiar columnas según su posición, seleccione",
+ "shortDescription": "Reordenar columnas CSV.",
+ "title": "Intercambiar columnas CSV"
+ },
+ "transposeCsv": {
+ "description": "Simplemente cargue su archivo CSV en el formulario a continuación y esta herramienta lo transpondrá automáticamente. En las opciones de la herramienta, puede especificar el carácter que inicia las líneas de comentario en el CSV para eliminarlas. Además, si el CSV está incompleto (valores faltantes), puede reemplazarlos con el carácter vacío o un carácter personalizado.",
+ "longDescription": "Esta herramienta transpone valores separados por comas (CSV). Trata el CSV como una matriz de datos e invierte todos los elementos a lo largo de la diagonal principal. El resultado contiene los mismos datos CSV que la entrada, pero ahora todas las filas se han convertido en columnas y todas las columnas en filas. Tras la transposición, el archivo CSV tendrá dimensiones opuestas. Por ejemplo, si el archivo de entrada tiene 4 columnas y 3 filas, el archivo de salida tendrá 3 columnas y 4 filas. Durante la conversión, el programa también elimina las líneas innecesarias y corrige los datos incompletos. En concreto, la herramienta elimina automáticamente todos los registros vacíos y los comentarios que empiezan por un carácter específico, que se puede configurar en la opción. Además, si los datos CSV se corrompen o se pierden, la utilidad completa el archivo con campos vacíos o campos personalizados que se pueden especificar en las opciones. ¡Csv-abuloso!",
+ "shortDescription": "Transponer rápidamente un archivo CSV.",
+ "title": "Transponer CSV"
+ }
+}
diff --git a/public/locales/es/image.json b/public/locales/es/image.json
new file mode 100644
index 0000000..2d79bd5
--- /dev/null
+++ b/public/locales/es/image.json
@@ -0,0 +1,98 @@
+{
+ "changeColors": {
+ "description": "Mundo",
+ "shortDescription": "Intercambia colores rápidamente en una imagen",
+ "title": "Cambiar colores en la imagen"
+ },
+ "changeOpacity": {
+ "description": "Ajusta fácilmente la transparencia de tus imágenes. Simplemente sube tu imagen, usa el control deslizante para establecer el nivel de opacidad deseado entre 0 (totalmente transparente) y 1 (totalmente opaco) y descarga la imagen modificada.",
+ "shortDescription": "Ajustar la transparencia de las imágenes",
+ "title": "Cambiar la opacidad de la imagen"
+ },
+ "compress": {
+ "description": "Reduce el tamaño del archivo de imagen manteniendo la calidad.",
+ "inputTitle": "Imagen de entrada",
+ "resultTitle": "Imagen comprimida",
+ "shortDescription": "Comprima imágenes para reducir el tamaño del archivo manteniendo una calidad razonable.",
+ "title": "Comprimir imagen"
+ },
+ "compressPng": {
+ "description": "Este programa comprime imágenes PNG. Al pegar la imagen PNG en el área de entrada, el programa la comprimirá y mostrará el resultado en el área de salida. En las opciones, puede ajustar el nivel de compresión y consultar los tamaños de archivo de las imágenes antiguas y nuevas.",
+ "shortDescription": "Comprimir rápidamente un PNG",
+ "title": "Comprimir png"
+ },
+ "convertJgpToPng": {
+ "description": "Convierte rápidamente tus imágenes JPG a PNG. Simplemente importa tu imagen PNG en el editor de la izquierda.",
+ "shortDescription": "Convierte rápidamente tus imágenes JPG a PNG",
+ "title": "Convertir JPG a PNG"
+ },
+ "convertToJpg": {
+ "description": "Convierte varios formatos de imagen (PNG, GIF, TIF, PSD, SVG, WEBP, HEIC, RAW) a JPG con configuraciones de color de fondo y calidad personalizables.",
+ "shortDescription": "Convierte imágenes a JPG con control de calidad",
+ "title": "Convertir imágenes a JPG"
+ },
+ "createTransparent": {
+ "description": "Mundo",
+ "shortDescription": "Hacer que una imagen sea transparente rápidamente",
+ "title": "Crear PNG transparente"
+ },
+ "crop": {
+ "description": "Recortar imágenes para eliminar áreas no deseadas.",
+ "inputTitle": "Imagen de entrada",
+ "resultTitle": "Imagen recortada",
+ "shortDescription": "Recortar imágenes rápidamente.",
+ "title": "Recortar imagen"
+ },
+ "editor": {
+ "description": "Editor de imágenes avanzado con herramientas para recortar, rotar, anotar, ajustar colores y añadir marcas de agua. Edita tus imágenes con herramientas profesionales directamente en tu navegador.",
+ "shortDescription": "Edite imágenes con herramientas y funciones avanzadas",
+ "title": "Editor de imágenes"
+ },
+ "imageToText": {
+ "description": "Extraer texto de imágenes (JPG, PNG) mediante reconocimiento óptico de caracteres (OCR).",
+ "shortDescription": "Extraer texto de imágenes usando OCR.",
+ "title": "Imagen a texto (OCR)"
+ },
+ "qrCode": {
+ "description": "Genere códigos QR para diferentes tipos de datos: URL, texto, correo electrónico, teléfono, SMS, WiFi, vCard y más.",
+ "shortDescription": "Cree códigos QR personalizados para varios formatos de datos.",
+ "title": "Generador de códigos QR"
+ },
+ "removeBackground": {
+ "description": "Mundo",
+ "shortDescription": "Eliminar automáticamente los fondos de las imágenes",
+ "title": "Quitar el fondo de la imagen"
+ },
+ "resize": {
+ "description": "Cambiar el tamaño de las imágenes a diferentes dimensiones.",
+ "dimensionType": "Tipo de dimensión",
+ "heightDescription": "Altura (en píxeles)",
+ "inputTitle": "Imagen de entrada",
+ "maintainAspectRatio": "Mantener la relación de aspecto",
+ "maintainAspectRatioDescription": "Mantener la relación de aspecto original de la imagen.",
+ "percentage": "Porcentaje",
+ "percentageDescription": "Porcentaje del tamaño original (p. ej., 50 para la mitad del tamaño, 200 para el doble del tamaño)",
+ "resizeByPercentage": "Cambiar el tamaño por porcentaje",
+ "resizeByPercentageDescription": "Cambiar el tamaño especificando un porcentaje del tamaño original.",
+ "resizeByPixels": "Cambiar tamaño por píxeles",
+ "resizeByPixelsDescription": "Cambiar el tamaño especificando las dimensiones en píxeles.",
+ "resizeMethod": "Método de cambio de tamaño",
+ "resultTitle": "Imagen redimensionada",
+ "setHeight": "Establecer altura",
+ "setHeightDescription": "Especifique la altura en píxeles y calcule el ancho según la relación de aspecto.",
+ "setWidth": "Establecer ancho",
+ "setWidthDescription": "Especifique el ancho en píxeles y calcule la altura según la relación de aspecto.",
+ "shortDescription": "Cambie el tamaño de las imágenes fácilmente.",
+ "title": "Cambiar el tamaño de la imagen",
+ "toolInfo": {
+ "description": "Esta herramienta permite redimensionar imágenes JPG, PNG, SVG o GIF. Puedes redimensionarlas especificando las dimensiones en píxeles o por porcentaje, con opciones para mantener la relación de aspecto original.",
+ "title": "Cambiar el tamaño de la imagen"
+ },
+ "widthDescription": "Ancho (en píxeles)"
+ },
+ "rotate": {
+ "description": "Girar una imagen en un ángulo específico.",
+ "shortDescription": "Girar una imagen fácilmente.",
+ "title": "Girar imagen"
+ }
+}
diff --git a/public/locales/es/json.json b/public/locales/es/json.json
new file mode 100644
index 0000000..5ed5251
--- /dev/null
+++ b/public/locales/es/json.json
@@ -0,0 +1,62 @@
+{
+ "escapeJson": {
+ "description": "Escape de caracteres especiales en cadenas JSON. Convierta datos JSON a un formato de escape adecuado para una transmisión o almacenamiento seguros.",
+ "shortDescription": "Escapar caracteres especiales en JSON",
+ "title": "Escapar JSON"
+ },
+ "jsonToXml": {
+ "description": "Convierte datos JSON a formato XML. Transforma objetos JSON estructurados en documentos XML bien formados.",
+ "shortDescription": "Convertir JSON a formato XML",
+ "title": "JSON a XML"
+ },
+ "minify": {
+ "description": "Elimina todos los espacios en blanco innecesarios de JSON.",
+ "inputTitle": "Entrada JSON",
+ "resultTitle": "JSON minimizado",
+ "shortDescription": "Minificar JSON eliminando los espacios en blanco",
+ "title": "Minificar JSON",
+ "toolInfo": {
+ "description": "La minimización de JSON consiste en eliminar todos los espacios innecesarios de los datos JSON, manteniendo su validez. Esto incluye la eliminación de espacios, saltos de línea y sangrías innecesarios para el correcto análisis del JSON. La minimización reduce el tamaño de los datos JSON, lo que aumenta su eficiencia de almacenamiento y transmisión, manteniendo la misma estructura y valores de datos.",
+ "title": "¿Qué es la minificación de JSON?"
+ }
+ },
+ "prettify": {
+ "description": "Formatee JSON con sangría y espaciado adecuados.",
+ "indentation": "Sangría",
+ "inputTitle": "Entrada JSON",
+ "resultTitle": "JSON embellecido",
+ "shortDescription": "Formatear y embellecer el código JSON",
+ "title": "Embellecer JSON",
+ "toolInfo": {
+ "description": "Esta herramienta le permite formatear datos JSON con sangría y espaciado adecuados, haciéndolos más legibles y fáciles de trabajar.",
+ "title": "Embellecer JSON"
+ },
+ "useSpaces": "Utilice espacios",
+ "useSpacesDescription": "Sangrar la salida con espacios",
+ "useTabs": "Usar pestañas",
+ "useTabsDescription": "Sangrar la salida con tabulaciones."
+ },
+ "stringify": {
+ "description": "Convierte objetos JavaScript a formato de cadena JSON. Serializa estructuras de datos en cadenas JSON para su almacenamiento o transmisión.",
+ "shortDescription": "Convertir objetos en cadena JSON",
+ "title": "Convertir JSON en cadenas"
+ },
+ "tsvToJson": {
+ "description": "Convierte datos TSV (Valores Separados por Tabulaciones) a formato JSON. Transforma datos tabulares en objetos JSON estructurados.",
+ "shortDescription": "Convertir TSV a formato JSON",
+ "title": "TSV a JSON"
+ },
+ "validateJson": {
+ "description": "Comprueba si JSON es válido y está bien formado.",
+ "inputTitle": "Entrada JSON",
+ "invalidJson": "❌ {{error}}",
+ "resultTitle": "Resultado de la validación",
+ "shortDescription": "Validar el código JSON para detectar errores",
+ "title": "Validar JSON",
+ "toolInfo": {
+ "description": "JSON (Notación de Objetos JavaScript) es un formato ligero de intercambio de datos. La validación de JSON garantiza que la estructura de los datos cumpla con el estándar JSON. Un objeto JSON válido debe tener: - Nombres de propiedad entre comillas dobles. - Llaves {} correctamente equilibradas. - Sin comas finales después del último par clave-valor. - Anidamiento correcto de objetos y matrices. Esta herramienta revisa el JSON de entrada y proporciona información para ayudar a identificar y corregir errores comunes.",
+ "title": "¿Qué es la validación JSON?"
+ },
+ "validJson": "✅ JSON válido"
+ }
+}
diff --git a/public/locales/es/list.json b/public/locales/es/list.json
new file mode 100644
index 0000000..80f8191
--- /dev/null
+++ b/public/locales/es/list.json
@@ -0,0 +1,208 @@
+{
+ "duplicate": {
+ "concatenate": "Concatenar",
+ "concatenateDescription": "Concatenar copias (si no está marcada, los elementos se entrelazarán)",
+ "copyDescription": "Número de copias (puede ser fraccionario)",
+ "description": "La utilidad basada en navegador más sencilla del mundo para duplicar elementos de listas. Introduce tu lista y especifica los criterios de duplicación para crear copias de elementos. Perfecta para ampliar datos, realizar pruebas o crear patrones repetidos.",
+ "duplicationOptions": "Opciones de duplicación",
+ "examples": {
+ "fractional": {
+ "description": "Este ejemplo muestra cómo duplicar una lista con un número fraccionario de copias.",
+ "title": "Duplicación fraccionaria"
+ },
+ "interweave": {
+ "description": "Este ejemplo muestra cómo entrelazar elementos en lugar de concatenarlos.",
+ "title": "Elementos entretejidos"
+ },
+ "reverse": {
+ "description": "Este ejemplo muestra cómo duplicar una lista en orden inverso.",
+ "title": "Duplicación inversa"
+ },
+ "simple": {
+ "description": "Este ejemplo muestra cómo duplicar una lista de palabras.",
+ "title": "Duplicación simple"
+ }
+ },
+ "inputTitle": "Lista de entrada",
+ "joinSeparatorDescription": "Separador para unir la lista duplicada",
+ "resultTitle": "Lista duplicada",
+ "reverse": "Contrarrestar",
+ "reverseDescription": "Revertir los elementos duplicados",
+ "shortDescription": "Elementos de lista duplicados con criterios específicos",
+ "splitByRegex": "Dividir por expresión regular",
+ "splitBySymbol": "Dividir por símbolo",
+ "splitOptions": "Opciones divididas",
+ "splitSeparatorDescription": "Separador para dividir la lista",
+ "title": "Duplicado",
+ "toolInfo": {
+ "description": "Esta herramienta permite duplicar elementos en una lista. Se puede especificar el número de copias (incluidos los valores fraccionarios), controlar si los elementos están concatenados o entrelazados, e incluso invertir la duplicación. Resulta útil para crear patrones repetidos, generar datos de prueba o ampliar listas con contenido predecible.",
+ "title": "Duplicación de listas"
+ }
+ },
+ "findMostPopular": {
+ "description": "La utilidad de navegador más sencilla del mundo para encontrar los elementos más populares en una lista. Introduce tu lista y obtén al instante los elementos que aparecen con más frecuencia. Perfecta para análisis de datos, identificación de tendencias o búsqueda de elementos comunes.",
+ "shortDescription": "Encuentra los elementos que aparecen con más frecuencia",
+ "title": "Encuentra los más populares"
+ },
+ "findUnique": {
+ "caseSensitiveItems": "Elementos que distinguen entre mayúsculas y minúsculas",
+ "caseSensitiveItemsDescription": "Muestra los elementos con mayúsculas y minúsculas diferentes como elementos únicos en la lista.",
+ "delimiterDescription": "Establezca un símbolo delimitador o una expresión regular.",
+ "description": "La utilidad de navegador más sencilla del mundo para encontrar elementos únicos en una lista. Introduce tu lista y obtén al instante todos los valores únicos, eliminando los duplicados. Perfecta para la limpieza de datos, la deduplicación o la búsqueda de elementos distintos.",
+ "findAbsolutelyUniqueItems": "Encuentra artículos absolutamente únicos",
+ "findAbsolutelyUniqueItemsDescription": "Mostrar sólo aquellos elementos de la lista que existen en una sola copia.",
+ "inputListDelimiter": "Delimitador de lista de entrada",
+ "inputTitle": "Lista de entrada",
+ "outputListDelimiter": "Delimitador de lista de salida",
+ "resultTitle": "Artículos únicos",
+ "shortDescription": "Encuentra artículos únicos en una lista",
+ "skipEmptyItems": "Omitir elementos vacíos",
+ "skipEmptyItemsDescription": "No incluya los elementos de lista vacíos en la salida.",
+ "title": "Encuentra algo único",
+ "trimItems": "Elementos de la lista de recortes",
+ "trimItemsDescription": "Elimine los espacios iniciales y finales antes de comparar elementos.",
+ "uniqueItemOptions": "Opciones de artículos únicos"
+ },
+ "group": {
+ "deleteEmptyItems": "Eliminar elementos vacíos",
+ "deleteEmptyItemsDescription": "Ignore los elementos vacíos y no los incluya en los grupos.",
+ "description": "La utilidad basada en navegador más sencilla del mundo para agrupar elementos de listas. Introduce tu lista y especifica los criterios de agrupación para organizar los elementos en grupos lógicos. Perfecta para categorizar datos, organizar información o crear listas estructuradas. Admite separadores personalizados y diversas opciones de agrupación.",
+ "emptyItemsAndPadding": "Elementos vacíos y relleno",
+ "groupNumberDescription": "Número de elementos en un grupo",
+ "groupSeparatorDescription": "Carácter separador de grupo",
+ "groupSizeAndSeparators": "Tamaño del grupo y separadores",
+ "inputItemSeparator": "Separador de elementos de entrada",
+ "inputTitle": "Lista de entrada",
+ "itemSeparatorDescription": "Carácter separador de elementos",
+ "leftWrapDescription": "Símbolo de envoltura izquierda del grupo.",
+ "padNonFullGroups": "Grupos no llenos de Pad",
+ "padNonFullGroupsDescription": "Llene los grupos que no estén completos con un elemento personalizado (ingréselo a continuación).",
+ "paddingCharDescription": "Utilice este carácter o elemento para rellenar grupos que no estén completos.",
+ "resultTitle": "Elementos agrupados",
+ "rightWrapDescription": "Símbolo de envoltura derecha del grupo.",
+ "shortDescription": "Agrupar elementos de la lista por propiedades comunes",
+ "splitOperators": {
+ "regex": {
+ "description": "Delimitar los elementos de la lista de entrada con una expresión regular.",
+ "title": "Utilice una expresión regular para dividir"
+ },
+ "symbol": {
+ "description": "Delimitar los elementos de la lista de entrada con un carácter.",
+ "title": "Utilice un símbolo para dividir"
+ }
+ },
+ "splitSeparatorDescription": "Establezca un símbolo delimitador o una expresión regular.",
+ "title": "Grupo"
+ },
+ "reverse": {
+ "description": "Esta sencilla aplicación basada en navegador imprime todos los elementos de la lista en orden inverso. Los elementos de entrada se pueden separar con cualquier símbolo y también se puede cambiar el separador de los elementos de la lista invertidos.",
+ "inputTitle": "Lista de entrada",
+ "itemSeparator": "Separador de artículos",
+ "itemSeparatorDescription": "Establezca un símbolo delimitador o una expresión regular.",
+ "outputListOptions": "Opciones de lista de salida",
+ "outputSeparatorDescription": "Separador de elementos de lista de salida.",
+ "resultTitle": "Lista invertida",
+ "shortDescription": "Invertir una lista rápidamente",
+ "splitOperators": {
+ "regex": {
+ "description": "Delimitar los elementos de la lista de entrada con una expresión regular.",
+ "title": "Utilice una expresión regular para dividir"
+ },
+ "symbol": {
+ "description": "Delimitar los elementos de la lista de entrada con un carácter.",
+ "title": "Utilice un símbolo para dividir"
+ }
+ },
+ "splitterMode": "Modo divisor",
+ "title": "Contrarrestar",
+ "toolInfo": {
+ "description": "Con esta utilidad, puede invertir el orden de los elementos de una lista. La utilidad primero divide la lista de entrada en elementos individuales y luego los itera desde el último hasta el primero, imprimiendo cada elemento en la salida durante la iteración. La lista de entrada puede contener cualquier elemento que pueda representarse como datos textuales, incluyendo dígitos, números, cadenas, palabras, oraciones, etc. El separador de elementos de entrada también puede ser una expresión regular. Por ejemplo, la expresión regular /[;,]/ le permitirá usar elementos separados por coma o punto y coma. Los delimitadores de los elementos de las listas de entrada y salida se pueden personalizar en las opciones. Por defecto, tanto las listas de entrada como las de salida están separadas por comas. ¡Increíble!",
+ "title": "¿Qué es un inversor de listas?"
+ }
+ },
+ "rotate": {
+ "description": "La utilidad basada en navegador más sencilla del mundo para rotar elementos de listas. Introduce tu lista y especifica el grado de rotación para desplazar los elementos un número determinado de posiciones. Perfecta para la manipulación de datos, desplazamientos circulares o reordenamiento de listas.",
+ "shortDescription": "Rotar elementos de la lista según posiciones específicas",
+ "title": "Girar"
+ },
+ "shuffle": {
+ "delimiterDescription": "Establezca un símbolo delimitador o una expresión regular.",
+ "description": "La utilidad de navegador más sencilla del mundo para ordenar aleatoriamente los elementos de una lista. Introduce tu lista y obtén al instante una versión aleatoria con elementos en orden aleatorio. Perfecta para crear variedad, comprobar la aleatoriedad o mezclar datos ordenados.",
+ "inputListSeparator": "Separador de lista de entrada",
+ "inputTitle": "Lista de entrada",
+ "joinSeparatorDescription": "Utilice este separador en la lista aleatoria.",
+ "outputLengthDescription": "Generar esta cantidad de elementos aleatorios",
+ "resultTitle": "Lista barajada",
+ "shortDescription": "Aleatorizar el orden de los elementos de la lista",
+ "shuffledListLength": "Longitud de la lista aleatoria",
+ "shuffledListSeparator": "Separador de lista aleatoria",
+ "title": "Barajar"
+ },
+ "sort": {
+ "caseSensitive": "Ordenación sensible a mayúsculas y minúsculas",
+ "caseSensitiveDescription": "Ordena los elementos en mayúsculas y minúsculas por separado. Las mayúsculas preceden a las minúsculas en una lista ascendente. (Solo funciona en orden alfabético).",
+ "description": "La utilidad de navegador más sencilla del mundo para ordenar elementos de listas. Introduce tu lista y especifica los criterios de ordenación para organizar los elementos en orden ascendente o descendente. Perfecta para organizar datos, procesar texto o crear listas ordenadas.",
+ "inputItemSeparator": "Separador de elementos de entrada",
+ "inputTitle": "Lista de entrada",
+ "joinSeparatorDescription": "Utilice este símbolo como conector entre elementos de una lista ordenada.",
+ "orderDescription": "Seleccione un orden de clasificación.",
+ "orderOptions": {
+ "decreasing": "Orden decreciente",
+ "increasing": "Orden creciente"
+ },
+ "removeDuplicates": "Eliminar duplicados",
+ "removeDuplicatesDescription": "Eliminar elementos de lista duplicados.",
+ "resultTitle": "Lista ordenada",
+ "shortDescription": "Ordenar los elementos de la lista en el orden especificado",
+ "sortMethod": "Método de ordenación",
+ "sortMethodDescription": "Seleccione un método de clasificación.",
+ "sortOptions": {
+ "alphabetic": "Ordenar alfabéticamente",
+ "length": "Ordenar por longitud",
+ "numeric": "Ordenar numéricamente"
+ },
+ "sortedItemProperties": "Propiedades de elementos ordenados",
+ "splitOperators": {
+ "regex": {
+ "description": "Delimitar los elementos de la lista de entrada con una expresión regular.",
+ "title": "Utilice una expresión regular para dividir"
+ },
+ "symbol": {
+ "description": "Delimitar los elementos de la lista de entrada con un carácter.",
+ "title": "Utilice un símbolo para dividir"
+ }
+ },
+ "splitSeparatorDescription": "Establezca un símbolo delimitador o una expresión regular.",
+ "title": "Clasificar"
+ },
+ "truncate": {
+ "description": "La utilidad de navegador más sencilla del mundo para truncar listas. Introduce tu lista y especifica el número máximo de elementos que quieres conservar. Perfecta para procesar datos, gestionar listas o limitar la longitud del contenido.",
+ "shortDescription": "Truncar la lista a un número especificado de elementos",
+ "title": "Truncar"
+ },
+ "unwrap": {
+ "description": "La utilidad basada en navegador más sencilla del mundo para descomprimir elementos de listas. Ingrese su lista descomprimida y especifique los criterios de descompresión para aplanar los elementos organizados. Perfecta para procesar datos, manipular texto o extraer contenido de listas estructuradas.",
+ "shortDescription": "Desplegar elementos de lista del formato estructurado",
+ "title": "Desenvolver"
+ },
+ "wrap": {
+ "description": "Agregue texto antes y después de cada elemento de la lista.",
+ "inputTitle": "Lista de entrada",
+ "joinSeparatorDescription": "Separador para unir la lista envuelta",
+ "leftTextDescription": "Texto para agregar antes de cada elemento",
+ "removeEmptyItems": "Eliminar elementos vacíos",
+ "resultTitle": "Lista envuelta",
+ "rightTextDescription": "Texto para agregar después de cada elemento",
+ "shortDescription": "Envolver elementos de la lista con criterios específicos",
+ "splitByRegex": "Dividir por expresión regular",
+ "splitBySymbol": "Dividir por símbolo",
+ "splitOptions": "Opciones divididas",
+ "splitSeparatorDescription": "Separador para dividir la lista",
+ "title": "Envoltura",
+ "toolInfo": {
+ "description": "Esta herramienta permite agregar texto antes y después de cada elemento de una lista. Puede especificar texto diferente para los lados izquierdo y derecho, y controlar cómo se procesa la lista. Es útil para agregar comillas, corchetes u otro formato a los elementos de la lista, preparar datos para diferentes formatos o crear texto estructurado.",
+ "title": "Envoltura de listas"
+ },
+ "wrapOptions": "Opciones de envoltura"
+ }
+}
diff --git a/public/locales/es/number.json b/public/locales/es/number.json
new file mode 100644
index 0000000..c450a4b
--- /dev/null
+++ b/public/locales/es/number.json
@@ -0,0 +1,89 @@
+{
+ "arithmeticSequence": {
+ "commonDifferenceDescription": "Diferencia común entre términos (d)",
+ "description": "Genere secuencias aritméticas con parámetros personalizables.",
+ "firstTermDescription": "Primer término de la secuencia (a₁)",
+ "numberOfTermsDescription": "Número de términos a generar (n)",
+ "outputFormat": "Formato de salida",
+ "resultTitle": "Secuencia generada",
+ "separatorDescription": "Separador entre términos",
+ "sequenceParameters": "Parámetros de secuencia",
+ "shortDescription": "Generar secuencias aritméticas",
+ "title": "Sucesión aritmética",
+ "toolInfo": {
+ "description": "Una sucesión aritmética es una secuencia de números donde la diferencia entre cada término consecutivo es constante. Esta diferencia constante se denomina diferencia común. Dados el primer término (a₁) y la diferencia común (d), cada término se puede hallar sumando la diferencia común al término anterior.",
+ "title": "¿Qué es una secuencia aritmética?"
+ }
+ },
+ "generate": {
+ "arithmeticSequenceOption": "Opción de secuencia aritmética",
+ "description": "Genere una secuencia de números con parámetros personalizables.",
+ "numberOfElementsDescription": "Número de elementos en secuencia.",
+ "resultTitle": "Números generados",
+ "separator": "Separador",
+ "separatorDescription": "Separa elementos de la secuencia aritmética mediante este carácter.",
+ "shortDescription": "Generar números aleatorios en rangos específicos",
+ "startSequenceDescription": "Inicie la secuencia desde este número.",
+ "stepDescription": "Aumente cada elemento en esta cantidad",
+ "title": "Generar",
+ "toolInfo": {
+ "description": "Esta herramienta permite generar una secuencia de números con parámetros personalizables. Se puede especificar el valor inicial, el tamaño del paso y el número de elementos.",
+ "title": "Generar números"
+ }
+ },
+ "ohmsLaw": {
+ "description": "Calcula voltaje, corriente y resistencia.",
+ "longDescription": "Esta calculadora aplica la Ley de Ohm (V = I × R) para determinar cualquiera de los tres parámetros eléctricos cuando se conocen los otros dos. La Ley de Ohm es un principio fundamental en ingeniería eléctrica que describe la relación entre el voltaje (V), la corriente (I) y la resistencia (R). Esta herramienta es esencial para aficionados a la electrónica, ingenieros eléctricos y estudiantes que trabajan con circuitos para resolver rápidamente valores desconocidos en sus diseños eléctricos.",
+ "shortDescription": "Calcular voltaje, corriente o resistencia en circuitos eléctricos utilizando la Ley de Ohm",
+ "title": "Ley de Ohm"
+ },
+ "slackline": {
+ "description": "Calcula la tensión en una slackline",
+ "longDescription": "Esta calculadora asume una carga en el centro de la cuerda.",
+ "shortDescription": "Calcula la tensión aproximada de un slackline o tendedero. No confíes en esto para tu seguridad.",
+ "title": "Tensión de la slackline"
+ },
+ "sphereArea": {
+ "description": "Área de una esfera",
+ "longDescription": "Esta calculadora determina el área superficial de una esfera mediante la fórmula A = 4πr². Puedes introducir el radio para hallar el área superficial o introducir el área superficial para calcular el radio requerido. Esta herramienta es útil para estudiantes de geometría, ingenieros que trabajan con objetos esféricos y cualquier persona que necesite realizar cálculos con superficies esféricas.",
+ "shortDescription": "Calcular el área superficial de una esfera en función de su radio.",
+ "title": "Área de una esfera"
+ },
+ "sphereVolume": {
+ "description": "Volumen de una esfera",
+ "longDescription": "Esta calculadora calcula el volumen de una esfera mediante la fórmula V = (4/3)πr³. Puede introducir el radio o el diámetro para calcular el volumen, o bien introducir el volumen para determinar el radio requerido. Esta herramienta es útil para estudiantes, ingenieros y profesionales que trabajan con objetos esféricos en campos como la física, la ingeniería y la fabricación.",
+ "shortDescription": "Calcular el volumen de una esfera usando el radio o el diámetro.",
+ "title": "Volumen de una esfera"
+ },
+ "sum": {
+ "description": "Calcula la suma de una lista de números. Introduce los números separados por comas o saltos de línea para obtener la suma total.",
+ "extractionTypes": {
+ "delimiter": {
+ "description": "Personaliza aquí el separador de números (predeterminado: un salto de línea).",
+ "title": "Delimitador de números"
+ },
+ "smart": {
+ "description": "Detectar automáticamente números en la entrada.",
+ "title": "Suma inteligente"
+ }
+ },
+ "inputTitle": "Aporte",
+ "numberExtraction": "Extracción de números",
+ "printRunningSum": "Imprimir suma continua",
+ "printRunningSumDescription": "Muestra la suma a medida que se calcula paso a paso.",
+ "resultTitle": "Total",
+ "runningSum": "Suma continua",
+ "shortDescription": "Calcular la suma de números",
+ "title": "Suma",
+ "toolInfo": {
+ "description": "Esta es una utilidad en línea para calcular la suma de un conjunto de números. Puede introducir los números separados por coma, espacio o cualquier otro carácter, incluido el salto de línea. También puede pegar un fragmento de texto que contenga valores numéricos que desee sumar y la utilidad los extraerá y calculará su suma.",
+ "title": "¿Qué es una calculadora de suma de números?"
+ }
+ },
+ "voltageDropInWire": {
+ "description": "Calcula el voltaje de ida y vuelta y la pérdida de potencia en un cable de 2 conductores.",
+ "longDescription": "Esta calculadora ayuda a determinar la caída de tensión y la pérdida de potencia en un cable eléctrico de dos conductores. Considera la longitud del cable, el calibre del cable (área de la sección transversal), la resistividad del material y el flujo de corriente. La herramienta calcula la caída de tensión de ida y vuelta, la resistencia total del cable y la potencia disipada en forma de calor. Resulta especialmente útil para ingenieros eléctricos, electricistas y aficionados al diseñar sistemas eléctricos para garantizar que los niveles de tensión se mantengan dentro de los límites aceptables en la carga.",
+ "shortDescription": "Calcular la caída de tensión y la pérdida de potencia en cables eléctricos en función de la longitud, el material y la corriente.",
+ "title": "Caída de tensión de ida y vuelta en el cable"
+ }
+}
diff --git a/public/locales/es/pdf.json b/public/locales/es/pdf.json
new file mode 100644
index 0000000..7cba89a
--- /dev/null
+++ b/public/locales/es/pdf.json
@@ -0,0 +1,113 @@
+{
+ "compressPdf": {
+ "compressedFileSize": "Tamaño de archivo comprimido",
+ "compressingPdf": "Comprimiendo PDF...",
+ "compressionLevel": "Nivel de compresión",
+ "compressionSettings": "Configuración de compresión",
+ "description": "Reduzca el tamaño de los archivos PDF manteniendo la calidad usando Ghostscript",
+ "errorCompressingPdf": "Error al comprimir el PDF: {{error}}",
+ "errorReadingPdf": "No se pudo leer el archivo PDF. Asegúrese de que sea válido.",
+ "fileSize": "Tamaño del archivo original",
+ "highCompression": "Alta compresión",
+ "highCompressionDescription": "Reducción máxima del tamaño del archivo con cierta pérdida de calidad",
+ "inputTitle": "PDF de entrada",
+ "lowCompression": "Baja compresión",
+ "lowCompressionDescription": "Reduce ligeramente el tamaño del archivo con una pérdida mínima de calidad",
+ "mediumCompression": "Compresión media",
+ "mediumCompressionDescription": "Equilibrio entre el tamaño del archivo y la calidad",
+ "pages": "Número de páginas",
+ "resultTitle": "PDF comprimido",
+ "shortDescription": "Comprime archivos PDF de forma segura en tu navegador",
+ "title": "Comprimir PDF"
+ },
+ "editor": {
+ "description": "Editor de PDF avanzado con funciones de anotación, rellenado de formularios, resaltado y exportación. Edite sus PDF directamente en el navegador con herramientas profesionales que incluyen inserción de texto, dibujo, resaltado, firma y rellenado de formularios.",
+ "shortDescription": "Edite archivos PDF con herramientas avanzadas de anotación, firma y edición",
+ "title": "Editor de PDF"
+ },
+ "merge": {
+ "inputTitle": "PDF de entrada",
+ "loadingText": "Extrayendo páginas",
+ "resultTitle": "Salida PDF fusionada",
+ "toolInfo": {
+ "description": "Esta herramienta permite fusionar varios archivos PDF en un solo documento. Para usarla, simplemente cargue los archivos PDF que desea fusionar. La herramienta combinará todas las páginas de los archivos de entrada en un solo documento PDF.",
+ "title": "¿Cómo utilizar la herramienta Combinar PDF?"
+ }
+ },
+ "mergePdf": {
+ "description": "Combine varios archivos PDF en un solo documento.",
+ "inputTitle": "Entrada de archivos PDF",
+ "mergingPdfs": "Fusionar archivos PDF",
+ "pdfOptions": "Opciones de PDF",
+ "resultTitle": "PDF fusionado",
+ "shortDescription": "Fusionar varios archivos PDF en un solo documento",
+ "sortByFileName": "Ordenar por nombre de archivo",
+ "sortByFileNameDescription": "Ordenar archivos PDF alfabéticamente por nombre de archivo",
+ "sortByUploadOrder": "Ordenar por orden de carga",
+ "sortByUploadOrderDescription": "Mantenga los archivos PDF en el orden en que se cargaron",
+ "title": "Fusionar PDF",
+ "toolInfo": {
+ "description": "Esta herramienta permite combinar varios archivos PDF en un solo documento. Puedes elegir cómo ordenar los PDF y la herramienta los combinará en el orden especificado.",
+ "title": "Fusionar archivos PDF"
+ }
+ },
+ "pdfToEpub": {
+ "description": "Transforme documentos PDF en archivos EPUB para una mejor compatibilidad con los lectores electrónicos.', icon: 'material-symbols:import-contacts', component: lazy(() => import('./index')), keywords: ['pdf', 'epub', 'convert', 'ebook'], path: 'pdf-to-epub', i18n: { name: 'pdf:pdfToEpub.title', description: 'pdf:pdfToEpub.description",
+ "shortDescription": "Convertir archivos PDF al formato EPUB",
+ "title": "PDF a EPUB"
+ },
+ "pdfToPng": {
+ "description": "Transforme documentos PDF en paneles PNG.",
+ "longDescription": "Sube un PDF y convierte cada página en una imagen PNG de alta calidad directamente en tu navegador. Esta herramienta es ideal para extraer contenido visual o compartir páginas individuales. No se cargan datos: todo se ejecuta localmente.",
+ "shortDescription": "Convertir PDF a imágenes PNG",
+ "title": "PDF a PNG"
+ },
+ "protectPdf": {
+ "description": "Agregue protección con contraseña a sus archivos PDF de forma segura en su navegador",
+ "shortDescription": "Proteger con contraseña los archivos PDF de forma segura",
+ "title": "Proteger PDF"
+ },
+ "rotatePdf": {
+ "allPagesWillBeRotated": "Todo {{count}} Las páginas se rotarán",
+ "angleOptions": {
+ "clockwise90": "90° en sentido horario",
+ "counterClockwise270": "270° (90° en sentido antihorario)",
+ "upsideDown180": "180° (al revés)"
+ },
+ "applyToAllPages": "Aplicar a todas las páginas",
+ "description": "Rotar páginas en un documento PDF.",
+ "inputTitle": "PDF de entrada",
+ "longDescription": "Cambie la orientación de las páginas PDF girándolas 90, 180 o 270 grados. Útil para corregir documentos escaneados incorrectamente o preparar archivos PDF para imprimir.",
+ "pageRangesDescription": "Introduzca números de página o rangos separados por comas (por ejemplo, 1, 3, 5-7)",
+ "pageRangesPlaceholder": "p. ej., 1,5-8",
+ "pagesWillBeRotated": "{{count}} página{{count !== 1 ? 's' : ''}} se rotará",
+ "pdfPageCount": "PDF tiene {{count}} página{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "PDF rotado",
+ "rotatingPages": "Páginas rotatorias",
+ "rotationAngle": "Ángulo de rotación",
+ "rotationSettings": "Configuración de rotación",
+ "shortDescription": "Girar páginas en un documento PDF",
+ "title": "Girar PDF",
+ "toolInfo": {
+ "description": "Esta herramienta permite rotar páginas en un documento PDF. Puede rotar todas las páginas o especificar páginas individuales. Elija un ángulo de rotación: 90° en sentido horario, 180° (invertido) o 270° (90° en sentido antihorario). Para rotar páginas específicas, desmarque la opción \"Aplicar a todas las páginas\" e introduzca los números de página o intervalos separados por comas (p. ej., 1, 3, 5-7).",
+ "title": "Cómo utilizar la herramienta Rotar PDF"
+ }
+ },
+ "splitPdf": {
+ "description": "Extraer páginas específicas de un documento PDF.",
+ "extractingPages": "Extrayendo páginas",
+ "inputTitle": "PDF de entrada",
+ "pageExtractionPreview": "{{count}} página{{count !== 1 ? 's' : ''}} se extraerán",
+ "pageRangesDescription": "Introduzca números de página o rangos separados por comas (por ejemplo, 1, 3, 5-7)",
+ "pageRangesPlaceholder": "p. ej., 1,5-8",
+ "pageSelection": "Selección de página",
+ "pdfPageCount": "PDF tiene {{count}} página{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "PDF extraído",
+ "shortDescription": "Extraer páginas específicas de un archivo PDF",
+ "title": "PDF dividido",
+ "toolInfo": {
+ "description": "Esta herramienta permite extraer páginas específicas de un documento PDF. Puede especificar páginas individuales o un rango de páginas para extraer.",
+ "title": "PDF dividido"
+ }
+ }
+}
diff --git a/public/locales/es/string.json b/public/locales/es/string.json
new file mode 100644
index 0000000..69075f8
--- /dev/null
+++ b/public/locales/es/string.json
@@ -0,0 +1,261 @@
+{
+ "base64": {
+ "decode": "Descodificación Base64",
+ "description": "Codificar o decodificar texto utilizando la codificación Base64.",
+ "encode": "Codificación Base64",
+ "inputTitle": "Datos de entrada",
+ "optionsTitle": "Opciones de Base64",
+ "resultTitle": "Resultado",
+ "shortDescription": "Codificar o decodificar datos utilizando Base64.",
+ "title": "Codificador/decodificador Base64",
+ "toolInfo": {
+ "description": "Base64 es un esquema de codificación que representa datos en formato de cadena ASCII traduciéndolos a una representación de base 64. Si bien puede usarse para codificar cadenas, se usa comúnmente para codificar datos binarios para su transmisión a través de medios diseñados para procesar datos textuales.",
+ "title": "¿Qué es Base64?"
+ }
+ },
+ "censor": {
+ "description": "Utilidad para censurar palabras en texto. Cargue su texto en el formulario de entrada de la izquierda, especifique todas las palabras incorrectas en las opciones y obtendrá el texto censurado al instante en el área de salida. longDescription: 'Con esta herramienta en línea, puede censurar ciertas palabras en cualquier texto. Puede especificar una lista de palabras no deseadas (como palabras malsonantes o palabras secretas) y el programa las reemplazará con palabras alternativas y creará un texto seguro. Las palabras se pueden especificar en un campo de texto de varias líneas en las opciones, introduciendo una palabra por línea.', keywords: ['text', 'censor', 'words', 'characters'], component: lazy(() => import('./index')), i18n: { name: 'string:censor.title', description: 'string:censor.description'",
+ "shortDescription": "Enmascare rápidamente las malas palabras o reemplácelas con palabras alternativas.",
+ "title": "Censor de texto"
+ },
+ "createPalindrome": {
+ "description": "La utilidad de navegador más sencilla del mundo para crear palíndromos a partir de cualquier texto. Introduce texto y transfórmalo al instante en un palíndromo que se lee igual de derecho a revés. Perfecto para juegos de palabras, crear patrones de texto simétricos o explorar curiosidades lingüísticas.",
+ "shortDescription": "Crea texto que se lea igual hacia adelante y hacia atrás",
+ "title": "Crear palíndromo"
+ },
+ "extractSubstring": {
+ "description": "La utilidad basada en navegador más sencilla del mundo para extraer subcadenas de texto. Introduce el texto y especifica las posiciones inicial y final para extraer la parte deseada. Perfecta para el procesamiento de datos, el análisis de texto o la extracción de contenido específico de bloques de texto más grandes.",
+ "shortDescription": "Extraer una porción de texto entre posiciones específicas",
+ "title": "Extraer subcadena"
+ },
+ "join": {
+ "blankLinesAndTrailingSpaces": "Líneas en blanco y espacios finales",
+ "deleteBlankDescription": "Eliminar líneas que no tengan símbolos de texto.",
+ "deleteBlankTitle": "Eliminar líneas en blanco",
+ "deleteTrailingDescription": "Eliminar espacios y tabulaciones al final de las líneas.",
+ "deleteTrailingTitle": "Eliminar espacios finales",
+ "description": "Une fragmentos de texto con separadores personalizables.",
+ "inputTitle": "Fragmentos de texto",
+ "joinCharacterDescription": "Símbolo que conecta fragmentos de texto. (Espacio por defecto).",
+ "joinCharacterPlaceholder": "Unirse al personaje",
+ "resultTitle": "Texto unido",
+ "shortDescription": "Unir elementos de texto con un separador especificado",
+ "textMergedOptions": "Opciones de texto fusionado",
+ "title": "Unirse al texto",
+ "toolInfo": {
+ "description": "Con esta herramienta puedes unir partes del texto. Toma una lista de valores de texto, separados por saltos de línea, y los fusiona. Puedes configurar el carácter que se colocará entre las partes del texto combinado. También puedes ignorar todas las líneas vacías y eliminar los espacios y tabulaciones al final de todas las líneas. ¡Textabulento!",
+ "title": "¿Qué es un ensamblador de texto?"
+ }
+ },
+ "palindrome": {
+ "description": "La utilidad de navegador más sencilla del mundo para comprobar si un texto es un palíndromo. Comprueba al instante si tu texto se lee igual de adelante hacia atrás. Ideal para juegos de palabras, análisis lingüísticos o la validación de patrones de texto simétricos. Admite varios delimitadores y detección de palíndromos de varias palabras.",
+ "shortDescription": "Comprueba si el texto se lee igual hacia adelante y hacia atrás",
+ "title": "Palíndromo"
+ },
+ "passwordGenerator": {
+ "avoidAmbiguous": "Evite caracteres ambiguos (i, I, l, 0, O)",
+ "description": "Genere contraseñas aleatorias seguras con longitud y tipos de caracteres personalizables. Elija entre minúsculas, mayúsculas, números y caracteres especiales. Opción para evitar caracteres ambiguos para una mejor legibilidad.",
+ "includeLowercase": "Incluir letras minúsculas (a-z)",
+ "includeNumbers": "Incluir números (0-9)",
+ "includeSymbols": "Incluir caracteres especiales",
+ "includeUppercase": "Incluir letras mayúsculas (A-Z)",
+ "lengthDesc": "Longitud de la contraseña",
+ "lengthPlaceholder": "p. ej. 12",
+ "optionsTitle": "Opciones de contraseña",
+ "resultTitle": "Contraseña generada",
+ "shortDescription": "Genere contraseñas aleatorias seguras con opciones personalizadas",
+ "title": "Generador de contraseñas",
+ "toolInfo": {
+ "description": "Esta herramienta genera contraseñas aleatorias seguras según los criterios que selecciones. Puedes personalizar la longitud, incluir o excluir diferentes tipos de caracteres y evitar caracteres ambiguos para una mejor legibilidad. Perfecta para crear contraseñas seguras para cuentas, aplicaciones o cualquier necesidad de seguridad.",
+ "title": "Acerca del generador de contraseñas"
+ }
+ },
+ "quote": {
+ "allowDoubleQuotation": "Permitir comillas dobles",
+ "description": "Agregue comillas alrededor del texto con opciones personalizables.",
+ "inputTitle": "Texto de entrada",
+ "leftQuoteDescription": "Carácter(es) de comillas izquierdas",
+ "processAsMultiLine": "Procesar como texto de varias líneas",
+ "quoteEmptyLines": "Citar líneas vacías",
+ "quoteOptions": "Opciones de cotización",
+ "resultTitle": "Texto citado",
+ "rightQuoteDescription": "Carácter(es) de comillas derechas",
+ "shortDescription": "Agregue comillas alrededor del texto con varios estilos",
+ "title": "Citador de texto",
+ "toolInfo": {
+ "description": "Esta herramienta permite añadir comillas al texto. Permite elegir diferentes caracteres de comillas, gestionar texto multilínea y controlar el procesamiento de líneas vacías. Resulta útil para preparar texto para programación, formatear datos o crear texto estilizado.",
+ "title": "Citador de texto"
+ }
+ },
+ "randomizeCase": {
+ "description": "La utilidad de navegador más sencilla del mundo para aleatorizar mayúsculas y minúsculas. Introduce tu texto y transfórmalo al instante con mayúsculas y minúsculas aleatorias. Perfecta para crear efectos de texto únicos, comprobar la distinción entre mayúsculas y minúsculas o generar patrones de texto variados.",
+ "shortDescription": "Aleatorizar el caso de las letras en el texto",
+ "title": "Aleatorizar caso"
+ },
+ "removeDuplicateLines": {
+ "description": "Carga tu texto en el formulario de entrada de la izquierda y obtendrás texto al instante sin líneas duplicadas en el área de salida. Potente, gratuito y rápido. Carga líneas de texto: obtén líneas de texto únicas.",
+ "shortDescription": "Eliminar rápidamente todas las líneas repetidas del texto",
+ "title": "Eliminar líneas duplicadas"
+ },
+ "repeat": {
+ "delimiterDescription": "Delimitador para copias de salida.",
+ "delimiterPlaceholder": "Delimitador",
+ "description": "Repita el texto varias veces con separadores personalizables.",
+ "inputTitle": "Texto de entrada",
+ "numberPlaceholder": "Número",
+ "repeatAmountDescription": "Número de repeticiones.",
+ "repetitionsDelimiter": "Delimitador de repeticiones",
+ "resultTitle": "Texto repetido",
+ "shortDescription": "Repetir el texto varias veces",
+ "textRepetitions": "Repeticiones de texto",
+ "title": "Repetir texto",
+ "toolInfo": {
+ "description": "Esta herramienta le permite repetir un texto determinado varias veces con un separador opcional.",
+ "title": "Repetir texto"
+ }
+ },
+ "reverse": {
+ "description": "La utilidad de navegador más sencilla del mundo para invertir texto. Introduce cualquier texto y revísalo al instante, carácter por carácter. Perfecta para crear texto espejo, analizar palíndromos o experimentar con patrones de texto. Conserva los espacios y caracteres especiales al invertir.",
+ "inputTitle": "Texto para revertir",
+ "processMultiLine": "Procesar texto de varias líneas",
+ "processMultiLineDescription": "Cada línea se invertirá independientemente",
+ "resultTitle": "Texto invertido",
+ "reversalOptions": "Opciones de reversión",
+ "shortDescription": "Invertir cualquier texto carácter por carácter",
+ "skipEmptyLines": "Saltar líneas vacías",
+ "skipEmptyLinesDescription": "Las líneas vacías se eliminarán de la salida.",
+ "title": "Contrarrestar",
+ "trimWhitespace": "Recortar espacios en blanco",
+ "trimWhitespaceDescription": "Eliminar los espacios iniciales y finales de cada línea"
+ },
+ "rot13": {
+ "description": "Codificar o decodificar texto utilizando el cifrado ROT13.",
+ "inputTitle": "Texto de entrada",
+ "resultTitle": "Resultado de ROT13",
+ "shortDescription": "Codificar o decodificar texto utilizando el cifrado ROT13.",
+ "title": "Codificador/decodificador ROT13",
+ "toolInfo": {
+ "description": "ROT13 (rotación de 13 posiciones) es un cifrado simple de sustitución de letras que reemplaza una letra por la decimotercera letra siguiente en el alfabeto. ROT13 es un caso especial del cifrado César, desarrollado en la antigua Roma. Dado que el alfabeto inglés tiene 26 letras, ROT13 es su propio inverso; es decir, para deshacer ROT13, se aplica el mismo algoritmo, por lo que se puede usar la misma acción para codificar y decodificar.",
+ "title": "¿Qué es ROT13?"
+ }
+ },
+ "rotate": {
+ "description": "Girar caracteres en el texto en posiciones específicas.",
+ "inputTitle": "Texto de entrada",
+ "processAsMultiLine": "Procesar como texto de varias líneas (rotar cada línea por separado)",
+ "resultTitle": "Texto rotado",
+ "rotateLeft": "Girar a la izquierda",
+ "rotateRight": "Girar a la derecha",
+ "rotationOptions": "Opciones de rotación",
+ "shortDescription": "Desplazar caracteres en el texto por posición.",
+ "stepDescription": "Número de posiciones a rotar",
+ "title": "Girar texto",
+ "toolInfo": {
+ "description": "Esta herramienta permite rotar caracteres en una cadena un número específico de posiciones. Puede rotar a la izquierda o a la derecha, y procesar texto de varias líneas rotando cada línea por separado. La rotación de cadenas es útil para transformaciones de texto simples, la creación de patrones o la implementación de técnicas básicas de cifrado.",
+ "title": "Rotación de cuerdas"
+ }
+ },
+ "split": {
+ "charAfterChunkDescription": "Carácter después de cada fragmento",
+ "charBeforeChunkDescription": "Carácter antes de cada fragmento",
+ "chunksDescription": "Número de fragmentos de igual longitud en la salida.",
+ "chunksTitle": "Utilice varios fragmentos",
+ "description": "La utilidad para navegador más sencilla del mundo para dividir texto. Introduce tu texto y especifica un separador para dividirlo en varias partes. Ideal para procesar datos, manipular texto o extraer contenido específico de bloques de texto más grandes.",
+ "lengthDescription": "Número de símbolos que se colocarán en cada fragmento de salida.",
+ "lengthTitle": "Utilice la longitud para dividir",
+ "outputSeparatorDescription": "Carácter que se colocará entre los fragmentos divididos. (Por defecto, es el salto de línea \"\\n\").",
+ "outputSeparatorOptions": "Opciones de separador de salida",
+ "regexDescription": "Expresión regular que se usará para dividir el texto en partes. (Múltiples espacios por defecto).",
+ "regexTitle": "Utilice una expresión regular para dividir",
+ "resultTitle": "Fragmentos de texto",
+ "shortDescription": "Dividir el texto en varias partes usando un separador",
+ "splitSeparatorOptions": "Opciones de separador dividido",
+ "symbolDescription": "Carácter que se utilizará para dividir el texto en partes. (Espacio por defecto).",
+ "symbolTitle": "Utilice un símbolo para dividir",
+ "title": "Dividir"
+ },
+ "statistic": {
+ "characterFrequencyAnalysis": "Análisis de frecuencia de caracteres",
+ "characterFrequencyAnalysisDescription": "Cuenta con qué frecuencia aparece cada carácter en el texto.",
+ "delimitersOptions": "Opciones de delimitadores",
+ "description": "Analizar texto y generar estadísticas completas.",
+ "includeEmptyLines": "Incluir líneas vacías",
+ "includeEmptyLinesDescription": "Incluya líneas en blanco al contar líneas",
+ "inputTitle": "Texto de entrada",
+ "resultTitle": "Estadísticas de texto",
+ "sentenceDelimitersDescription": "Introduzca caracteres personalizados utilizados para delimitar oraciones en su idioma (separados por coma) o déjelo en blanco como valor predeterminado.",
+ "sentenceDelimitersPlaceholder": "p.ej. ., !, ?, ...",
+ "shortDescription": "Obtenga estadísticas sobre su texto",
+ "statisticsOptions": "Opciones de estadísticas",
+ "title": "Estadísticas de texto",
+ "toolInfo": {
+ "description": "Esta herramienta le permite analizar texto y generar estadísticas completas que incluyen recuento de caracteres, recuento de palabras, recuento de líneas y análisis de frecuencia de caracteres y palabras.",
+ "title": "¿Qué es un? {{title}}?"
+ },
+ "wordDelimitersDescription": "Ingrese una expresión regular personalizada para contar palabras o déjela en blanco para el valor predeterminado.",
+ "wordDelimitersPlaceholder": "p. ej. \\s.,;:!?\"«»()…",
+ "wordFrequencyAnalysis": "Análisis de frecuencia de palabras",
+ "wordFrequencyAnalysisDescription": "Cuenta con qué frecuencia aparece cada palabra en el texto."
+ },
+ "textReplacer": {
+ "description": "Reemplazar patrones de texto con contenido nuevo.",
+ "findPatternInText": "Encuentra este patrón en el texto",
+ "findPatternUsingRegexp": "Encontrar un patrón usando una expresión regular",
+ "inputTitle": "Texto a reemplazar",
+ "newTextPlaceholder": "Nuevo texto",
+ "regexpDescription": "Introduzca la expresión regular que desea reemplazar.",
+ "replacePatternDescription": "Introduzca el patrón que se utilizará para el reemplazo.",
+ "replaceText": "Reemplazar texto",
+ "resultTitle": "Texto con reemplazos",
+ "searchPatternDescription": "Introduzca el patrón de texto que desea reemplazar.",
+ "searchText": "Buscar texto",
+ "shortDescription": "Reemplace rápidamente el texto en su contenido",
+ "title": "Reemplazador de texto",
+ "toolInfo": {
+ "description": "Reemplace fácilmente texto específico en su contenido con esta sencilla herramienta basada en navegador. Simplemente ingrese el texto, configure el texto que desea reemplazar y el valor de reemplazo, y obtenga la versión actualizada al instante.",
+ "title": "Reemplazador de texto"
+ }
+ },
+ "toMorse": {
+ "dashSymbolDescription": "Símbolo que corresponderá al guión en código Morse.",
+ "description": "Convertir texto a código Morse.",
+ "dotSymbolDescription": "Símbolo que corresponderá al punto en código Morse.",
+ "longSignal": "Señal larga",
+ "resultTitle": "Código Morse",
+ "shortDescription": "Codifique rápidamente texto en morse",
+ "shortSignal": "Señal corta",
+ "title": "Cadena a morse"
+ },
+ "truncate": {
+ "addTruncationIndicator": "Agregar indicador de truncamiento",
+ "charactersPlaceholder": "Personajes",
+ "description": "Acortar el texto a una longitud específica.",
+ "indicatorDescription": "Caracteres que se añaden al final (o al principio) del texto. Nota: Se consideran para la longitud.",
+ "inputTitle": "Texto de entrada",
+ "leftSideDescription": "Eliminar caracteres del inicio del texto.",
+ "leftSideTruncation": "Truncamiento del lado izquierdo",
+ "lengthAndLines": "Longitud y líneas",
+ "lineByLineDescription": "Truncar cada línea por separado.",
+ "lineByLineTruncating": "Truncamiento línea por línea",
+ "maxLengthDescription": "Número de caracteres a dejar en el texto.",
+ "numberPlaceholder": "Número",
+ "resultTitle": "Texto truncado",
+ "rightSideDescription": "Eliminar caracteres del final del texto.",
+ "rightSideTruncation": "Truncamiento del lado derecho",
+ "shortDescription": "Truncar texto a una longitud especificada",
+ "suffixAndAffix": "Sufijo y afijo",
+ "title": "Truncar texto",
+ "toolInfo": {
+ "description": "Cargue su texto en el formulario de entrada de la izquierda y obtendrá automáticamente el texto truncado a la derecha.",
+ "title": "Truncar texto"
+ },
+ "truncationSide": "Lado de truncamiento"
+ },
+ "uppercase": {
+ "description": "Convertir texto a letras mayúsculas.",
+ "inputTitle": "Texto de entrada",
+ "resultTitle": "Texto en mayúsculas",
+ "shortDescription": "Convertir texto a mayúsculas",
+ "title": "Convertir a mayúsculas"
+ }
+}
diff --git a/public/locales/es/time.json b/public/locales/es/time.json
new file mode 100644
index 0000000..84ac090
--- /dev/null
+++ b/public/locales/es/time.json
@@ -0,0 +1,100 @@
+{
+ "checkLeapYears": {
+ "description": "Compruebe si un año es bisiesto y obtenga información sobre el año bisiesto.",
+ "inputTitle": "Año de entrada",
+ "resultTitle": "Resultado del año bisiesto",
+ "shortDescription": "Comprobar si un año es bisiesto",
+ "title": "Consultar años bisiestos",
+ "toolInfo": {
+ "description": "Un año bisiesto es un año que contiene un día adicional (29 de febrero) para mantener la sincronización del año calendario con el año astronómico. Los años bisiestos ocurren cada 4 años, excepto los años divisibles por 100, pero no por 400.",
+ "title": "¿Qué es un año bisiesto?"
+ }
+ },
+ "convertDaysToHours": {
+ "addHoursName": "Agregar nombre de horas",
+ "addHoursNameDescription": "Añade la cadena horas a los valores de salida",
+ "description": "Convierta días en horas con opciones personalizables.",
+ "hoursName": "Horas Nombre",
+ "shortDescription": "Convertir días a horas",
+ "title": "Convertir días a horas",
+ "toolInfo": {
+ "description": "Esta herramienta permite convertir días a horas. Puede introducir los días como números o con unidades, y la herramienta los convertirá a horas. También puede añadir el sufijo \"horas\" a los valores de salida.",
+ "title": "Convertir días a horas"
+ }
+ },
+ "convertHoursToDays": {
+ "addDaysName": "Agregar nombre de días",
+ "addDaysNameDescription": "Añade la cadena días a los valores de salida",
+ "daysName": "Nombre de los días",
+ "description": "Convierte horas en días con opciones personalizables.",
+ "shortDescription": "Convertir horas a días",
+ "title": "Convertir horas a días",
+ "toolInfo": {
+ "description": "Esta herramienta permite convertir horas a días. Puede introducir las horas como números o con unidades, y la herramienta las convertirá a días. También puede añadir el sufijo \"días\" a los valores de salida.",
+ "title": "Convertir horas a días"
+ }
+ },
+ "convertSecondsToTime": {
+ "addPadding": "Añadir relleno",
+ "addPaddingDescription": "Añade relleno de ceros a las horas, minutos y segundos.",
+ "description": "Convierte los segundos a un formato de hora legible (horas:minutos:segundos). Introduce la cantidad de segundos para obtener la hora formateada.",
+ "shortDescription": "Convertir segundos a formato de hora",
+ "timePadding": "Relleno de tiempo",
+ "title": "Convertir segundos a tiempo",
+ "toolInfo": {
+ "title": "¿Qué es un? {{title}}?"
+ }
+ },
+ "convertTimeToSeconds": {
+ "description": "Convierte la hora formateada (HH:MM:SS) a segundos.",
+ "inputTitle": "Hora de entrada",
+ "resultTitle": "Artículos de segunda clase",
+ "shortDescription": "Convertir formato de hora a segundos",
+ "title": "Convertir tiempo a segundos",
+ "toolInfo": {
+ "description": "Esta herramienta permite convertir cadenas de tiempo formateadas (HH:MM:SS) a segundos. Resulta útil para calcular duraciones e intervalos de tiempo.",
+ "title": "Convertir tiempo a segundos"
+ }
+ },
+ "crontabGuru": {
+ "description": "Generar y comprender expresiones cron. Crear programaciones cron para tareas automatizadas y trabajos del sistema.",
+ "shortDescription": "Generar y comprender expresiones cron",
+ "title": "Gurú de Crontab"
+ },
+ "timeBetweenDates": {
+ "description": "Calcula la diferencia horaria entre dos fechas. Obtén la duración exacta en días, horas, minutos y segundos.",
+ "endDate": "Fecha de finalización",
+ "endDateTime": "Fecha y hora de finalización",
+ "endTime": "Fin de los tiempos",
+ "endTimezone": "Zona horaria final",
+ "shortDescription": "Calcular el tiempo entre dos fechas",
+ "startDate": "Fecha de inicio",
+ "startDateTime": "Fecha y hora de inicio",
+ "startTime": "Hora de inicio",
+ "startTimezone": "Zona horaria de inicio",
+ "title": "Tiempo entre fechas",
+ "toolInfo": {
+ "description": "Calcula la diferencia horaria exacta entre dos fechas y horas, compatible con diferentes zonas horarias. Esta herramienta proporciona un desglose detallado de la diferencia horaria en varias unidades (años, meses, días, horas, minutos y segundos).",
+ "title": "Calculadora de tiempo entre fechas"
+ }
+ },
+ "truncateClockTime": {
+ "description": "Trunca la hora del reloj para quitar segundos o minutos. Redondea la hora a la hora, minuto o intervalo personalizado más cercano.",
+ "printDroppedComponents": "Imprimir componentes descartados",
+ "shortDescription": "Truncar el tiempo del reloj a la precisión especificada",
+ "timePadding": "Relleno de tiempo",
+ "title": "Truncar el tiempo del reloj",
+ "toolInfo": {
+ "title": "¿Qué es un? {{title}}?"
+ },
+ "truncateMinutesAndSeconds": "Truncar minutos y segundos",
+ "truncateMinutesAndSecondsDescription": "Elimina ambos componentes: los minutos y los segundos de cada hora del reloj.",
+ "truncateOnlySeconds": "Truncar solo segundos",
+ "truncateOnlySecondsDescription": "Elimina el componente de segundos de cada hora del reloj.",
+ "truncationSide": "Lado de truncamiento",
+ "useZeroPadding": "Utilice relleno de ceros",
+ "zeroPaddingDescription": "Haga que todos los componentes de tiempo siempre tengan dos dígitos de ancho.",
+ "zeroPrintDescription": "Muestra las partes descartadas como valores cero \"00\".",
+ "zeroPrintTruncatedParts": "Piezas truncadas de impresión cero"
+ }
+}
diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json
new file mode 100644
index 0000000..3bec9ef
--- /dev/null
+++ b/public/locales/es/translation.json
@@ -0,0 +1,250 @@
+{
+ "audio": {
+ "changeSpeed": {
+ "description": "Cambia la velocidad de reproducción de los archivos de audio. Acelera o ralentiza el audio manteniendo el tono.",
+ "name": "Cambiar la velocidad del audio",
+ "shortDescription": "Cambiar la velocidad de los archivos de audio"
+ },
+ "extractAudio": {
+ "description": "Extraiga la pista de audio de un archivo de vídeo y guárdelo como un archivo de audio separado en el formato elegido (AAC, MP3, WAV).",
+ "name": "Extraer audio",
+ "shortDescription": "Extrae audio de archivos de vídeo (MP4, MOV, etc.) a AAC, MP3 o WAV."
+ }
+ },
+ "baseFileInput": {
+ "copyFailed": "No se pudo copiar: {{error}}",
+ "dropFileHere": "Deja tu {{type}} aquí",
+ "fileCopied": "Archivo copiado",
+ "selectFileDescription": "Haga clic aquí para seleccionar uno {{type}} Desde su dispositivo, presione Ctrl+V para usar un {{type}} desde su portapapeles, o arrastre y suelte un archivo desde el escritorio"
+ },
+ "categories": {
+ "audio": {
+ "description": "Herramientas para trabajar con audio: extraer audio de vídeo, ajustar la velocidad del audio, fusionar varios archivos de audio y mucho más.",
+ "title": "Herramientas de audio"
+ },
+ "csv": {
+ "description": "Herramientas para trabajar con archivos CSV: convierta CSV a diferentes formatos, manipule datos CSV, valide la estructura CSV y procese archivos CSV de manera eficiente.",
+ "title": "Herramientas CSV"
+ },
+ "gif": {
+ "description": "Herramientas para trabajar con animaciones GIF: cree GIF transparentes, extraiga marcos GIF, agregue texto a GIF, recorte, rote, invierta GIF y mucho más.",
+ "title": "Herramientas GIF"
+ },
+ "image-generic": {
+ "description": "Herramientas para trabajar con imágenes: comprimir, redimensionar, recortar, convertir a JPG, rotar, eliminar fondo y mucho más.",
+ "title": "Herramientas de imagen"
+ },
+ "json": {
+ "description": "Herramientas para trabajar con estructuras de datos JSON: embellecer y minimizar objetos JSON, aplanar matrices JSON, convertir valores JSON en cadenas, analizar datos y mucho más",
+ "title": "Herramientas JSON"
+ },
+ "list": {
+ "description": "Herramientas para trabajar con listas: ordenar, invertir, aleatorizar listas, encontrar elementos de listas únicos y duplicados, cambiar separadores de elementos de listas y mucho más.",
+ "title": "Herramientas de lista"
+ },
+ "number": {
+ "description": "Herramientas para trabajar con números: generar secuencias numéricas, convertir números en palabras y palabras en números, ordenar, redondear, factorizar números y mucho más.",
+ "title": "Herramientas numéricas"
+ },
+ "pdf": {
+ "description": "Herramientas para trabajar con archivos PDF: extraer texto de archivos PDF, convertir archivos PDF a otros formatos, manipular archivos PDF y mucho más.",
+ "title": "Herramientas PDF"
+ },
+ "png": {
+ "description": "Herramientas para trabajar con imágenes PNG: convierta PNG a JPG, cree PNG transparentes, cambie colores PNG, recorte, rote, cambie el tamaño de PNG y mucho más.",
+ "title": "Herramientas PNG"
+ },
+ "seeAll": "Ver todo {{title}}",
+ "string": {
+ "description": "Herramientas para trabajar con texto: convertir texto en imágenes, buscar y reemplazar texto, dividir texto en fragmentos, unir líneas de texto, repetir texto y mucho más.",
+ "title": "Herramientas de texto"
+ },
+ "time": {
+ "description": "Herramientas para trabajar con hora y fecha: calcular diferencias horarias, convertir entre zonas horarias, formatear fechas, generar secuencias de fechas y mucho más.",
+ "title": "Herramientas de tiempo"
+ },
+ "try": "Intentar {{title}}",
+ "video": {
+ "description": "Herramientas para trabajar con vídeos: extrae fotogramas de vídeos, crea GIF a partir de vídeos, convierte vídeos a diferentes formatos y mucho más.",
+ "title": "Herramientas de vídeo"
+ },
+ "xml": {
+ "description": "Herramientas para trabajar con estructuras de datos XML: visor, embellecedor, validador y mucho más",
+ "title": "Herramientas XML"
+ }
+ },
+ "csv": {
+ "findIncompleteCsvRecords": {
+ "description": "Simplemente cargue su archivo CSV en el formulario a continuación y esta herramienta comprobará automáticamente si ninguna fila o columna tiene valores faltantes. En las opciones de la herramienta, puede ajustar el formato del archivo de entrada (especifique el delimitador, las comillas y el carácter de comentario). Además, puede activar la comprobación de valores vacíos, omitir líneas vacías y limitar el número de mensajes de error en la salida.",
+ "name": "Encontrar registros CSV incompletos",
+ "shortDescription": "Encuentre rápidamente filas y columnas en CSV que tengan valores faltantes."
+ }
+ },
+ "hero": {
+ "brand": "OmniTools",
+ "description": "Aumente su productividad con OmniTools, ¡el kit de herramientas definitivo para agilizar su trabajo! Acceda a miles de utilidades intuitivas para editar imágenes, texto, listas y datos, todo directamente desde su navegador.",
+ "examples": {
+ "calculateNumberSum": "Calcular la suma de números",
+ "changeGifSpeed": "Cambiar la velocidad del GIF",
+ "compressPng": "Comprimir PNG",
+ "createTransparentImage": "Crear una imagen transparente",
+ "prettifyJson": "Embellecer JSON",
+ "sortList": "Ordenar una lista",
+ "splitPdf": "PDF dividido",
+ "splitText": "Dividir un texto",
+ "trimVideo": "Recortar vídeo"
+ },
+ "searchPlaceholder": "Buscar en todas las herramientas",
+ "title": "Haga las cosas rápidamente con"
+ },
+ "inputFooter": {
+ "clear": "Claro",
+ "copyToClipboard": "Copiar al portapapeles",
+ "importFromFile": "Importar desde archivo"
+ },
+ "list": {
+ "group": {
+ "description": "La utilidad basada en navegador más sencilla del mundo para agrupar elementos de listas. Introduce tu lista y especifica los criterios de agrupación para organizar los elementos en grupos lógicos. Perfecta para categorizar datos, organizar información o crear listas estructuradas. Admite separadores personalizados y diversas opciones de agrupación.",
+ "name": "Grupo",
+ "shortDescription": "Agrupar elementos de la lista por propiedades comunes"
+ },
+ "reverse": {
+ "description": "Esta sencilla aplicación basada en navegador imprime todos los elementos de la lista en orden inverso. Los elementos de entrada se pueden separar con cualquier símbolo y también se puede cambiar el separador de los elementos de la lista invertidos.",
+ "name": "Contrarrestar",
+ "shortDescription": "Invertir una lista rápidamente"
+ },
+ "sort": {
+ "description": "Esta es una aplicación súper sencilla basada en navegador que ordena los elementos de una lista en orden creciente o decreciente. Puedes ordenar los elementos alfabéticamente, numéricamente o por longitud. También puedes eliminar elementos duplicados y vacíos, así como recortar elementos individuales con espacios en blanco. Puedes usar cualquier carácter separador para separar los elementos de la lista de entrada o, alternativamente, usar una expresión regular. Además, puedes crear un nuevo delimitador para la lista de salida ordenada.",
+ "name": "Clasificar",
+ "shortDescription": "Ordenar rápidamente una lista"
+ }
+ },
+ "navbar": {
+ "buyMeACoffee": "Invítame a un café",
+ "home": "Hogar",
+ "tools": "Herramientas"
+ },
+ "number": {
+ "generate": {
+ "description": "Calcule rápidamente una lista de enteros en su navegador. Para obtener la lista, simplemente especifique el primer entero, el valor de cambio y el recuento total en las opciones a continuación, y esta utilidad generará esa cantidad de enteros.",
+ "name": "Generar números",
+ "shortDescription": "Calcula rápidamente una lista de números enteros en tu navegador"
+ },
+ "sum": {
+ "description": "Esta es una aplicación súper sencilla para navegador que suma números. Los números ingresados se pueden separar con cualquier símbolo y también se puede cambiar el separador de los números sumados.",
+ "name": "Sumar números",
+ "shortDescription": "Sumar rápidamente una lista de números"
+ }
+ },
+ "numericInputWithUnit": {
+ "unit": "Unidad"
+ },
+ "pdf": {
+ "compressPdf": {
+ "description": "Reduzca el tamaño de los archivos PDF manteniendo la calidad usando Ghostscript",
+ "name": "Comprimir PDF",
+ "shortDescription": "Comprime archivos PDF de forma segura en tu navegador"
+ },
+ "mergePdf": {
+ "description": "Combine varios archivos PDF en un solo documento.",
+ "name": "Fusionar PDF",
+ "shortDescription": "Fusionar varios archivos PDF en un solo documento"
+ },
+ "pdfToEpub": {
+ "description": "Transforme documentos PDF en archivos EPUB para una mejor compatibilidad con los lectores electrónicos.",
+ "name": "PDF a EPUB",
+ "shortDescription": "Convertir archivos PDF al formato EPUB"
+ },
+ "protectPdf": {
+ "description": "Agregue protección con contraseña a sus archivos PDF de forma segura en su navegador",
+ "name": "Proteger PDF",
+ "shortDescription": "Proteger con contraseña los archivos PDF de forma segura"
+ },
+ "splitPdf": {
+ "description": "Extraer páginas específicas de un archivo PDF usando números de página o rangos (por ejemplo, 1,5-8)",
+ "name": "PDF dividido",
+ "shortDescription": "Extraer páginas específicas de un archivo PDF"
+ }
+ },
+ "resultFooter": {
+ "copy": "Copiar al portapapeles",
+ "download": "Descargar"
+ },
+ "string": {
+ "createPalindrome": {
+ "description": "La utilidad de navegador más sencilla del mundo para crear palíndromos a partir de cualquier texto. Introduce texto y transfórmalo al instante en un palíndromo que se lee igual de derecho a revés. Perfecto para juegos de palabras, crear patrones de texto simétricos o explorar curiosidades lingüísticas.",
+ "name": "Crear palíndromo",
+ "shortDescription": "Crea texto que se lea igual hacia adelante y hacia atrás"
+ },
+ "palindrome": {
+ "description": "La utilidad de navegador más sencilla del mundo para comprobar si un texto es un palíndromo. Comprueba al instante si tu texto se lee igual de adelante hacia atrás. Ideal para juegos de palabras, análisis lingüísticos o la validación de patrones de texto simétricos. Admite varios delimitadores y detección de palíndromos de varias palabras.",
+ "name": "Palíndromo",
+ "shortDescription": "Comprueba si el texto se lee igual hacia adelante y hacia atrás"
+ },
+ "repeat": {
+ "description": "Esta herramienta le permite repetir un texto determinado varias veces con un separador opcional.",
+ "name": "Repetir texto",
+ "shortDescription": "Repetir el texto varias veces"
+ },
+ "reverse": {
+ "description": "La utilidad de navegador más sencilla del mundo para invertir texto. Introduce cualquier texto y revísalo al instante, carácter por carácter. Perfecta para crear texto espejo, analizar palíndromos o experimentar con patrones de texto. Conserva los espacios y caracteres especiales al invertir.",
+ "name": "Contrarrestar",
+ "shortDescription": "Invertir cualquier texto carácter por carácter"
+ },
+ "toMorse": {
+ "description": "La utilidad de navegador más sencilla del mundo para convertir texto a código Morse. Carga tu texto en el formulario de entrada de la izquierda y obtendrás código Morse al instante en el área de salida. Potente, gratuito y rápido. Carga texto y obtén código Morse.",
+ "name": "Cadena a morse",
+ "shortDescription": "Codifique rápidamente texto en morse"
+ },
+ "uppercase": {
+ "description": "La utilidad para navegador más sencilla del mundo para convertir texto a mayúsculas. Simplemente introduce tu texto y se convertirá automáticamente a mayúsculas. Ideal para crear titulares, enfatizar texto o estandarizar su formato. Admite varios formatos de texto y conserva caracteres especiales.",
+ "name": "Mayúsculas",
+ "shortDescription": "Convertir texto a letras mayúsculas"
+ }
+ },
+ "toolExamples": {
+ "subtitle": "¡Haga clic para probar!",
+ "title": "{{title}} Ejemplos"
+ },
+ "toolFileResult": {
+ "copied": "Archivo copiado",
+ "copyFailed": "No se pudo copiar: {{error}}",
+ "loading": "Cargando... Esto puede tardar un momento.",
+ "result": "Resultado"
+ },
+ "toolHeader": {
+ "seeExamples": "Ver ejemplos"
+ },
+ "toolLayout": {
+ "allToolsTitle": "Todo {{type}}"
+ },
+ "toolMultiFileResult": {
+ "copied": "Archivo copiado",
+ "copyFailed": "No se pudo copiar: {{error}}",
+ "loading": "Cargando... Esto puede tardar un momento.",
+ "result": "Resultado"
+ },
+ "toolMultipleAudioInput": {
+ "inputTitle": "Aporte {{type}}",
+ "noFilesSelected": "No hay archivos seleccionados"
+ },
+ "toolMultiplePdfInput": {
+ "inputTitle": "Aporte {{type}}",
+ "noFilesSelected": "No hay archivos seleccionados"
+ },
+ "toolOptions": {
+ "title": "Opciones de herramientas"
+ },
+ "toolTextInput": {
+ "copied": "Texto copiado",
+ "copyFailed": "No se pudo copiar: {{error}}",
+ "input": "Texto de entrada",
+ "placeholder": "Introduzca su texto aquí..."
+ },
+ "toolTextResult": {
+ "copied": "Texto copiado",
+ "copyFailed": "No se pudo copiar: {{error}}",
+ "loading": "Cargando... Esto puede tardar un momento.",
+ "result": "Resultado"
+ }
+}
diff --git a/public/locales/es/video.json b/public/locales/es/video.json
new file mode 100644
index 0000000..29d48a8
--- /dev/null
+++ b/public/locales/es/video.json
@@ -0,0 +1,113 @@
+{
+ "changeSpeed": {
+ "defaultMultiplier": "Multiplicador predeterminado: 2 significa 2 veces más rápido",
+ "description": "Cambia la velocidad de reproducción de tus archivos de video. Acelera o ralentiza los videos manteniendo la sincronización del audio. Compatible con varios multiplicadores de velocidad y formatos de video comunes.",
+ "inputTitle": "Vídeo de entrada",
+ "newVideoSpeed": "Nueva velocidad de video",
+ "resultTitle": "Vídeo editado",
+ "settingSpeed": "Ajuste de velocidad",
+ "shortDescription": "Cambiar la velocidad de reproducción del vídeo",
+ "title": "Cambiar la velocidad del video",
+ "toolInfo": {
+ "title": "¿Qué es un? {{title}}?"
+ }
+ },
+ "compress": {
+ "default": "Por defecto",
+ "description": "Comprime videos escalándolos a diferentes resoluciones como 240p, 480p, 720p, etc. Esta herramienta ayuda a reducir el tamaño del archivo manteniendo una calidad aceptable. Es compatible con formatos de video comunes como MP4, WebM y OGG.",
+ "inputTitle": "Vídeo de entrada",
+ "loadingText": "Comprimiendo video...",
+ "lossless": "Sin pérdida",
+ "quality": "Calidad (CRF)",
+ "resolution": "Resolución",
+ "resultTitle": "Vídeo comprimido",
+ "shortDescription": "Comprimir vídeos escalando a diferentes resoluciones",
+ "title": "Comprimir vídeo",
+ "worst": "El peor"
+ },
+ "cropVideo": {
+ "cropCoordinates": "Coordenadas de cultivo",
+ "croppingVideo": "Recortar vídeo",
+ "description": "Recortar el vídeo para eliminar áreas no deseadas.",
+ "errorBeyondHeight": "El área de recorte se extiende más allá de la altura del video ({{height}}píxeles)",
+ "errorBeyondWidth": "El área de recorte se extiende más allá del ancho del video ({{width}}píxeles)",
+ "errorCroppingVideo": "Error al recortar el vídeo. Por favor, revise los parámetros y el archivo de vídeo.",
+ "errorLoadingDimensions": "No se pudieron cargar las dimensiones del vídeo",
+ "errorNonNegativeCoordinates": "Las coordenadas X e Y deben ser no negativas",
+ "errorPositiveDimensions": "El ancho y la altura deben ser positivos",
+ "height": "Altura",
+ "inputTitle": "Vídeo de entrada",
+ "loadVideoForDimensions": "Cargar un vídeo para ver las dimensiones",
+ "resultTitle": "Vídeo recortado",
+ "shortDescription": "Recortar el vídeo para eliminar áreas no deseadas",
+ "title": "Recortar vídeo",
+ "toolInfo": {
+ "description": "Esta herramienta permite recortar archivos de vídeo para eliminar áreas no deseadas. Puede especificar el área de recorte configurando las coordenadas X e Y, así como las dimensiones de ancho y alto.",
+ "title": "Recortar vídeo"
+ },
+ "videoDimensions": "Dimensiones del vídeo: {{width}} × {{height}} píxeles",
+ "videoInformation": "Información del vídeo",
+ "width": "Ancho",
+ "xCoordinate": "X (izquierda)",
+ "yCoordinate": "Y (arriba)"
+ },
+ "flip": {
+ "description": "Voltee archivos de video horizontal o verticalmente. Refleje videos para efectos especiales o corregir problemas de orientación.",
+ "flippingVideo": "Vídeo invertido",
+ "horizontalLabel": "Horizontal (Espejo)",
+ "inputTitle": "Vídeo de entrada",
+ "orientation": "Orientación",
+ "resultTitle": "Vídeo invertido",
+ "shortDescription": "Voltear el vídeo horizontal o verticalmente",
+ "title": "Voltear vídeo",
+ "verticalLabel": "Vertical (al revés)"
+ },
+ "gif": {
+ "changeSpeed": {
+ "description": "Cambia la velocidad de reproducción de los GIF. Acelera o ralentiza los GIF manteniendo una animación fluida.",
+ "shortDescription": "Cambiar la velocidad de la animación GIF",
+ "title": "Cambiar la velocidad del GIF"
+ }
+ },
+ "loop": {
+ "description": "Crea un vídeo en bucle repitiendo el vídeo original varias veces.",
+ "inputTitle": "Vídeo de entrada",
+ "loopingVideo": "Vídeo en bucle",
+ "loops": "Bucles",
+ "numberOfLoops": "Número de bucles",
+ "resultTitle": "Vídeo en bucle",
+ "shortDescription": "Crear archivos de vídeo en bucle",
+ "title": "Vídeo en bucle",
+ "toolInfo": {
+ "description": "Esta herramienta permite crear un vídeo en bucle repitiendo el vídeo original varias veces. Puedes especificar cuántas veces debe repetirse.",
+ "title": "¿Qué es un? {{title}}?"
+ }
+ },
+ "rotate": {
+ "180Degrees": "180° (al revés)",
+ "270Degrees": "270° (90° en sentido antihorario)",
+ "90Degrees": "90° en sentido horario",
+ "description": "Gira archivos de vídeo 90, 180 o 270 grados. Corrige la orientación del vídeo o crea efectos especiales con un control de rotación preciso.",
+ "inputTitle": "Vídeo de entrada",
+ "resultTitle": "Vídeo rotado",
+ "rotatingVideo": "Vídeo giratorio",
+ "rotation": "Rotación",
+ "shortDescription": "Girar el vídeo en grados específicos",
+ "title": "Girar vídeo"
+ },
+ "trim": {
+ "description": "Recorta archivos de vídeo especificando la hora de inicio y la hora de fin. Elimina las secciones no deseadas del principio o del final de los vídeos.",
+ "endTime": "Fin de los tiempos",
+ "inputTitle": "Vídeo de entrada",
+ "resultTitle": "Vídeo recortado",
+ "shortDescription": "Recortar el vídeo eliminando las secciones no deseadas",
+ "startTime": "Hora de inicio",
+ "timestamps": "Marcas de tiempo",
+ "title": "Recortar vídeo"
+ },
+ "videoToGif": {
+ "description": "Convierte archivos de vídeo a formato GIF animado. Extrae intervalos de tiempo específicos y crea imágenes animadas para compartir.",
+ "shortDescription": "Convertir vídeo a GIF animado",
+ "title": "Vídeo a GIF"
+ }
+}
diff --git a/public/locales/es/xml.json b/public/locales/es/xml.json
new file mode 100644
index 0000000..2ffd5c4
--- /dev/null
+++ b/public/locales/es/xml.json
@@ -0,0 +1,38 @@
+{
+ "xmlBeautifier": {
+ "description": "Formatear XML con sangría y espaciado adecuados.",
+ "indentation": "Sangría",
+ "inputTitle": "XML de entrada",
+ "resultTitle": "XML embellecido",
+ "shortDescription": "Formatear y embellecer el código XML",
+ "title": "Embellecedor XML",
+ "toolInfo": {
+ "description": "Esta herramienta le permite formatear datos XML con sangría y espaciado adecuados, haciéndolos más legibles y fáciles de trabajar.",
+ "title": "Embellecedor XML"
+ },
+ "useSpaces": "Utilice espacios",
+ "useSpacesDescription": "Sangrar la salida con espacios",
+ "useTabs": "Usar pestañas",
+ "useTabsDescription": "Sangrar la salida con tabulaciones."
+ },
+ "xmlValidator": {
+ "description": "Validar la sintaxis y estructura XML.",
+ "placeholder": "Pegue o importe XML aquí...",
+ "shortDescription": "Validar el código XML para detectar errores",
+ "title": "Validador XML",
+ "toolInfo": {
+ "description": "Esta herramienta permite validar la sintaxis y la estructura del XML. Comprueba si el XML está bien formado y proporciona mensajes de error detallados para cualquier problema detectado.",
+ "title": "Validador XML"
+ }
+ },
+ "xmlViewer": {
+ "description": "Ver y explorar la estructura XML en formato de árbol.",
+ "inputTitle": "XML de entrada",
+ "resultTitle": "Vista de árbol XML",
+ "title": "Visor XML",
+ "toolInfo": {
+ "description": "Esta herramienta le permite ver datos XML en un formato de árbol jerárquico, lo que facilita la exploración y la comprensión de la estructura de los documentos XML.",
+ "title": "Visor XML"
+ }
+ }
+}
diff --git a/public/locales/fr/audio.json b/public/locales/fr/audio.json
new file mode 100644
index 0000000..e63bbb2
--- /dev/null
+++ b/public/locales/fr/audio.json
@@ -0,0 +1,42 @@
+{
+ "changeSpeed": {
+ "description": "Modifier la vitesse de lecture des fichiers audio. Accélérer ou ralentir le son tout en conservant la hauteur.",
+ "inputTitle": "Entrée audio",
+ "newAudioSpeed": "Nouvelle vitesse audio",
+ "outputFormat": "Format de sortie",
+ "resultTitle": "Audio édité",
+ "settingSpeed": "Réglage de la vitesse",
+ "shortDescription": "Modifier la vitesse des fichiers audio",
+ "speedDescription": "Multiplicateur par défaut : 2 signifie 2x plus rapide",
+ "title": "Changer la vitesse audio",
+ "toolInfo": {
+ "title": "Qu'est-ce que {{title}}?"
+ }
+ },
+ "extractAudio": {
+ "description": "Extraire la piste audio des fichiers vidéo.",
+ "extractingAudio": "Extraction audio",
+ "inputTitle": "Entrée vidéo",
+ "outputFormat": "Format de sortie",
+ "outputFormatDescription": "Sélectionnez le format dans lequel l'audio doit être extrait.",
+ "resultTitle": "Audio extrait",
+ "shortDescription": "Extrayez l'audio des fichiers vidéo (MP4, MOV, etc.) vers AAC, MP3 ou WAV.",
+ "title": "Extraire l'audio d'une vidéo",
+ "toolInfo": {
+ "description": "Cet outil vous permet d'extraire la piste audio de vos fichiers vidéo. Vous pouvez choisir parmi différents formats audio, notamment AAC, MP3 et WAV.",
+ "title": "Qu'est-ce que {{title}}?"
+ }
+ },
+ "mergeAudio": {
+ "description": "Combinez plusieurs fichiers audio en un seul fichier audio en les concaténant en séquence.",
+ "longDescription": "Cet outil vous permet de fusionner plusieurs fichiers audio en un seul fichier en les concaténant dans l'ordre de leur mise en ligne. Idéal pour combiner des segments de podcast, des morceaux de musique ou tout autre fichier audio à assembler. Compatible avec différents formats audio, dont MP3, AAC et WAV.",
+ "shortDescription": "Fusionnez plusieurs fichiers audio en un seul (MP3, AAC, WAV).",
+ "title": "Fusionner l'audio"
+ },
+ "trim": {
+ "description": "Coupez et rognez des fichiers audio pour extraire des segments spécifiques en spécifiant les heures de début et de fin.",
+ "longDescription": "Cet outil vous permet de découper des fichiers audio en spécifiant les heures de début et de fin. Vous pouvez extraire des segments spécifiques de fichiers audio plus longs, supprimer des parties inutiles ou créer des clips plus courts. Il prend en charge divers formats audio, dont MP3, AAC et WAV. Idéal pour le montage de podcasts, la production musicale ou tout autre besoin d'édition audio.",
+ "shortDescription": "Découpez des fichiers audio pour extraire des segments de temps spécifiques (MP3, AAC, WAV).",
+ "title": "Couper le son"
+ }
+}
diff --git a/public/locales/fr/csv.json b/public/locales/fr/csv.json
new file mode 100644
index 0000000..fd2278c
--- /dev/null
+++ b/public/locales/fr/csv.json
@@ -0,0 +1,114 @@
+{
+ "changeCsvSeparator": {
+ "description": "Modifiez le délimiteur/séparateur dans les fichiers CSV. Convertissez vos fichiers entre différents formats CSV, comme la virgule, le point-virgule, la tabulation ou des séparateurs personnalisés.",
+ "shortDescription": "Modifier le délimiteur du fichier CSV",
+ "title": "Changer le séparateur CSV"
+ },
+ "csvRowsToColumns": {
+ "description": "Cet outil convertit les lignes d'un fichier CSV (valeurs séparées par des virgules) en colonnes. Il extrait les lignes horizontales du fichier CSV d'entrée une par une, les fait pivoter de 90 degrés et les affiche sous forme de colonnes verticales, l'une après l'autre, séparées par des virgules.', longDescription: 'Cet outil convertit les lignes d'un fichier CSV (valeurs séparées par des virgules) en colonnes. Par exemple, si les données CSV d'entrée comportent 6 lignes, la sortie comportera 6 colonnes et les éléments des lignes seront disposés de haut en bas. Dans un fichier CSV bien formé, le nombre de valeurs par ligne est le même. Cependant, si des lignes contiennent des champs manquants, le programme peut les corriger et vous pouvez choisir parmi les options disponibles : remplir les données manquantes avec des éléments vides ou remplacer les données manquantes par des éléments personnalisés, tels que « manquant », « ? » ou « x ». Pendant le processus de conversion, l'outil nettoie également le fichier CSV des informations inutiles, telles que les lignes vides (c'est-à-dire sans informations visibles) et les commentaires. Pour aider l'outil à identifier correctement les commentaires, vous pouvez spécifier dans les options le symbole au début d'une ligne qui démarre un commentaire. Ce symbole est généralement un dièse « # » ou une double barre oblique « // ». C'est incroyable !",
+ "longDescription": "Cet outil convertit les lignes d'un fichier CSV (valeurs séparées par des virgules) en colonnes. Par exemple, si les données CSV d'entrée comportent six lignes, le résultat comportera six colonnes et les éléments des lignes seront disposés de haut en bas. Dans un fichier CSV bien formé, le nombre de valeurs par ligne est identique. Cependant, si des champs manquent dans certaines lignes, le programme peut les corriger et vous pouvez choisir parmi les options disponibles : compléter les données manquantes avec des éléments vides ou les remplacer par des éléments personnalisés, tels que",
+ "shortDescription": "Convertissez les lignes CSV en colonnes.",
+ "title": "Convertir des lignes CSV en colonnes"
+ },
+ "csvToJson": {
+ "columnSeparator": "Séparateur de colonnes (par exemple, , ; \\t)",
+ "commentSymbol": "Symbole de commentaire (par exemple, #)",
+ "conversionOptions": "Options de conversion",
+ "description": "Convertissez des fichiers CSV au format JSON avec des options personnalisables pour les délimiteurs, les guillemets et le formatage de sortie. Prise en charge des en-têtes, des commentaires et de la conversion de type dynamique.",
+ "dynamicTypes": "Types dynamiques",
+ "dynamicTypesDescription": "Convertir automatiquement les nombres et les booléens",
+ "errorParsing": "Erreur lors de l'analyse du fichier CSV : {{error}}",
+ "fieldQuote": "Citation de champ (par exemple, \")",
+ "inputCsvFormat": "Format d'entrée CSV",
+ "inputTitle": "Entrée CSV",
+ "resultTitle": "Sortie JSON",
+ "shortDescription": "Convertissez les données CSV au format JSON.",
+ "skipEmptyLines": "Sauter les lignes vides",
+ "skipEmptyLinesDescription": "Ignorer les lignes vides dans le fichier CSV d'entrée",
+ "title": "Convertir CSV en JSON",
+ "useHeaders": "Utiliser les en-têtes",
+ "useHeadersDescription": "Traiter la première ligne comme en-tête de colonne"
+ },
+ "csvToTsv": {
+ "description": "Téléchargez votre fichier CSV via le formulaire ci-dessous et il sera automatiquement converti en fichier TSV. Dans les options de l'outil, vous pouvez personnaliser le format CSV d'entrée : spécifiez le délimiteur de champ, le caractère de guillemet et le symbole de commentaire, ignorez les lignes CSV vides et conservez ou non les en-têtes de colonnes CSV.",
+ "longDescription": "Cet outil convertit les données CSV (valeurs séparées par des virgules) en données TSV (valeurs séparées par des tabulations). CSV et TSV sont des formats de fichier courants pour stocker des données tabulaires, mais ils utilisent des séparateurs différents pour séparer les valeurs : le CSV utilise des virgules (",
+ "shortDescription": "Convertissez les données CSV au format TSV.",
+ "title": "Convertir CSV en TSV"
+ },
+ "csvToXml": {
+ "description": "Convertissez des fichiers CSV au format XML avec des options personnalisables.",
+ "shortDescription": "Convertissez les données CSV au format XML.",
+ "title": "Convertir CSV en XML"
+ },
+ "csvToYaml": {
+ "description": "Il vous suffit de télécharger votre fichier CSV via le formulaire ci-dessous et il sera automatiquement converti en fichier YAML. Dans les options de l'outil, vous pouvez spécifier le caractère de délimitation de champ, le caractère de guillemet et le caractère de commentaire pour adapter l'outil aux formats CSV personnalisés. Vous pouvez également sélectionner le format YAML de sortie : préservant ou excluant les en-têtes CSV.",
+ "longDescription": "Cet outil transforme les données CSV (Comma Separated Values) en données YAML (Yet Another Markup Language). CSV est un format tabulaire simple utilisé pour représenter des types de données matricielles composés de lignes et de colonnes. YAML, quant à lui, est un format plus avancé (en fait un sur-ensemble de JSON), qui crée des données plus lisibles pour la sérialisation et prend en charge les listes, les dictionnaires et les objets imbriqués. Ce programme prend en charge différents formats d'entrée CSV : les données d'entrée peuvent être séparées par des virgules (par défaut), des points-virgules, des barres verticales ou utiliser un autre délimiteur. Vous pouvez spécifier le délimiteur exact utilisé par vos données dans les options. De même, dans les options, vous pouvez spécifier le caractère guillemet utilisé pour encadrer les champs CSV (par défaut, un guillemet double). Vous pouvez également ignorer les lignes commençant par des commentaires en spécifiant les symboles de commentaire dans les options. Cela vous permet de préserver la clarté de vos données en ignorant les lignes inutiles. Il existe deux méthodes pour convertir un fichier CSV en YAML. La première méthode convertit chaque ligne CSV en liste YAML. La seconde méthode extrait les en-têtes de la première ligne CSV et crée des objets YAML avec des clés basées sur ces en-têtes. Vous pouvez également personnaliser le format YAML de sortie en spécifiant le nombre d'espaces pour l'indentation des structures YAML. Pour effectuer la conversion inverse, c'est-à-dire convertir un fichier YAML en CSV, vous pouvez utiliser notre outil de conversion YAML en CSV. C'est génial !",
+ "shortDescription": "Convertissez rapidement un fichier CSV en fichier YAML.",
+ "title": "Convertir CSV en YAML"
+ },
+ "findIncompleteCsvRecords": {
+ "checkingOptions": "Vérification des options",
+ "commentCharacterDescription": "Saisissez le caractère indiquant le début d'une ligne de commentaire. Les lignes commençant par ce symbole seront ignorées.",
+ "csvInputOptions": "Options de saisie CSV",
+ "csvSeparatorDescription": "Saisissez le caractère utilisé pour délimiter les colonnes dans le fichier d'entrée CSV.",
+ "deleteLinesWithNoData": "Supprimer les lignes sans données",
+ "deleteLinesWithNoDataDescription": "Supprimer les lignes vides du fichier d'entrée CSV.",
+ "description": "Il vous suffit de télécharger votre fichier CSV dans le formulaire ci-dessous et cet outil vérifiera automatiquement qu'aucune ligne ou colonne ne contient de valeur manquante. Dans les options de l'outil, vous pouvez ajuster le format du fichier d'entrée (spécifier le délimiteur, les guillemets et les commentaires). De plus, vous pouvez activer la vérification des valeurs vides, ignorer les lignes vides et limiter le nombre de messages d'erreur dans la sortie.",
+ "findEmptyValues": "Trouver des valeurs vides",
+ "findEmptyValuesDescription": "Afficher un message concernant les champs CSV vides (il ne s'agit pas de champs manquants mais de champs qui ne contiennent rien).",
+ "inputTitle": "Entrée CSV",
+ "limitNumberOfMessages": "Limiter le nombre de messages",
+ "messageLimitDescription": "Définissez la limite du nombre de messages dans la sortie.",
+ "quoteCharacterDescription": "Saisissez le caractère de citation utilisé pour citer les champs de saisie CSV.",
+ "resultTitle": "Statut CSV",
+ "shortDescription": "Trouvez rapidement les lignes et les colonnes dans CSV auxquelles il manque des valeurs.",
+ "title": "Rechercher des enregistrements CSV incomplets",
+ "toolInfo": {
+ "title": "Qu'est-ce qu'un {{title}}?"
+ }
+ },
+ "insertCsvColumns": {
+ "appendColumns": "Ajouter des colonnes",
+ "commentCharacterDescription": "Saisissez le caractère indiquant le début d'une ligne de commentaire. Les lignes commençant par ce symbole seront ignorées.",
+ "csvOptions": "Options CSV",
+ "csvSeparator": "Séparateur CSV",
+ "csvToInsert": "CSV à insérer",
+ "csvToInsertDescription": "Saisissez la ou les colonnes à insérer dans le fichier CSV. Le caractère de délimitation des colonnes doit être identique à celui du fichier d'entrée CSV. Remarque : les lignes vides seront ignorées.",
+ "customFillDescription": "Si le fichier CSV d'entrée est incomplet (valeurs manquantes), ajoutez-vous des champs vides ou des symboles personnalisés aux enregistrements pour créer un CSV bien formé ?",
+ "customFillValueDescription": "Utilisez cette valeur personnalisée pour remplir les champs manquants. (Fonctionne uniquement avec le mode « Valeurs personnalisées » ci-dessus.)",
+ "customPosition": "Position personnalisée",
+ "customPositionOptionsDescription": "Sélectionnez la méthode pour insérer les colonnes dans le fichier CSV.",
+ "description": "Ajoutez de nouvelles colonnes aux données CSV à des positions spécifiées.",
+ "fillWithCustomValues": "Remplir avec les valeurs douanières",
+ "fillWithEmptyValues": "Remplir avec des valeurs vides",
+ "headerName": "Nom de l'en-tête",
+ "headerNameDescription": "En-tête de la colonne après laquelle vous souhaitez insérer des colonnes.",
+ "inputTitle": "Entrée CSV",
+ "insertingPositionDescription": "Spécifiez où insérer les colonnes dans le fichier CSV.",
+ "position": "Position",
+ "positionOptions": "Options de position",
+ "prependColumns": "Ajouter des colonnes au début",
+ "quoteCharDescription": "Saisissez le caractère de citation utilisé pour citer les champs de saisie CSV.",
+ "resultTitle": "Sortie CSV",
+ "rowNumberDescription": "Numéro de la colonne après laquelle vous souhaitez insérer des colonnes.",
+ "separatorDescription": "Saisissez le caractère utilisé pour délimiter les colonnes dans le fichier d'entrée CSV.",
+ "shortDescription": "Insérez rapidement une ou plusieurs nouvelles colonnes n'importe où dans un fichier CSV.",
+ "title": "Insérer des colonnes CSV",
+ "toolInfo": {
+ "description": "Cet outil vous permet d'insérer de nouvelles colonnes dans des données CSV à des emplacements spécifiques. Vous pouvez ajouter des colonnes à des emplacements personnalisés en fonction des noms d'en-tête ou des numéros de colonne.",
+ "title": "Insérer des colonnes CSV"
+ }
+ },
+ "swapCsvColumns": {
+ "description": "Il vous suffit de télécharger votre fichier CSV dans le formulaire ci-dessous, de spécifier les colonnes à permuter et l'outil modifiera automatiquement la position de ces colonnes dans le fichier de sortie. Dans les options de l'outil, vous pouvez spécifier la position ou le nom des colonnes à permuter, corriger les données incomplètes et éventuellement supprimer les enregistrements vides et commentés.",
+ "longDescription": "Cet outil réorganise les données CSV en intervertissant la position de leurs colonnes. L'interversion des colonnes améliore la lisibilité d'un fichier CSV en regroupant ou en mettant au premier plan les données fréquemment utilisées, facilitant ainsi leur comparaison et leur modification. Par exemple, vous pouvez intervertir la première colonne avec la dernière, ou la deuxième avec la troisième. Pour intervertir les colonnes en fonction de leur position, sélectionnez l'option",
+ "shortDescription": "Réorganiser les colonnes CSV.",
+ "title": "Échanger les colonnes CSV"
+ },
+ "transposeCsv": {
+ "description": "Il vous suffit de télécharger votre fichier CSV via le formulaire ci-dessous et cet outil le transposera automatiquement. Dans les options, vous pouvez spécifier le caractère de début des lignes de commentaire dans le fichier CSV pour les supprimer. De plus, si le fichier CSV est incomplet (valeurs manquantes), vous pouvez remplacer les valeurs manquantes par le caractère vide ou un caractère personnalisé.",
+ "longDescription": "Cet outil transpose les fichiers CSV (valeurs séparées par des virgules). Il traite le fichier CSV comme une matrice de données et inverse tous les éléments sur la diagonale principale. Le fichier CSV de sortie contient les mêmes données CSV que le fichier d'entrée, mais toutes les lignes sont désormais des colonnes, et toutes les colonnes des lignes. Après la transposition, le fichier CSV aura des dimensions opposées. Par exemple, si le fichier d'entrée comporte 4 colonnes et 3 lignes, le fichier de sortie comportera 3 colonnes et 4 lignes. Lors de la conversion, le programme supprime également les lignes inutiles et corrige les données incomplètes. Plus précisément, l'outil supprime automatiquement tous les enregistrements vides et les commentaires commençant par un caractère spécifique, que vous pouvez définir dans l'option. De plus, en cas de corruption ou de perte des données CSV, l'utilitaire complète le fichier avec des champs vides ou personnalisés, que vous pouvez spécifier dans les options. Csv-abulous !",
+ "shortDescription": "Transposer rapidement un fichier CSV.",
+ "title": "Transposer CSV"
+ }
+}
diff --git a/public/locales/fr/image.json b/public/locales/fr/image.json
new file mode 100644
index 0000000..da859f1
--- /dev/null
+++ b/public/locales/fr/image.json
@@ -0,0 +1,98 @@
+{
+ "changeColors": {
+ "description": "Monde",
+ "shortDescription": "Échanger rapidement les couleurs d'une image",
+ "title": "Changer une couleur dans une image"
+ },
+ "changeOpacity": {
+ "description": "Ajustez facilement la transparence de vos images. Téléchargez simplement votre image, utilisez le curseur pour définir le niveau d'opacité souhaité entre 0 (transparent) et 1 (opaque), puis téléchargez l'image modifiée.",
+ "shortDescription": "Ajuster la transparence des images",
+ "title": "Modifier l'opacité de l'image"
+ },
+ "compress": {
+ "description": "Réduisez la taille du fichier image tout en conservant la qualité.",
+ "inputTitle": "Image d'entrée",
+ "resultTitle": "Image compressée",
+ "shortDescription": "Compresser des images en maintenant une qualité raisonnable.",
+ "title": "Compresser une image"
+ },
+ "compressPng": {
+ "description": "C'est un programme pour compresser des images PNG. Dès que vous collez votre image PNG dans la zone d'entrée, le programme va la compresser et afficher le résultat dans la zone de sortie. Dans les options, vous pouvez ajuster le niveau de compression et comparer la taille des 2 fichiers.",
+ "shortDescription": "Compresser rapidement un PNG",
+ "title": "Compresser un PNG"
+ },
+ "convertJgpToPng": {
+ "description": "Convertissez rapidement vos images JPG en PNG. Importez simplement votre image PNG dans l'éditeur à gauche.",
+ "shortDescription": "Convertir rapidement vos images JPG en PNG",
+ "title": "Convertir un JPG en PNG"
+ },
+ "convertToJpg": {
+ "description": "Convertissez différents formats d'image (PNG, GIF, TIF, PSD, SVG, WEBP, HEIC, RAW) en JPG avec des paramètres de qualité et de couleur d'arrière-plan personnalisables.",
+ "shortDescription": "Convertir des images en JPG avec contrôle de la qualité",
+ "title": "Convertir des images en JPG"
+ },
+ "createTransparent": {
+ "description": "Monde",
+ "shortDescription": "Rendre rapidement une image transparente",
+ "title": "Créer un PNG transparent"
+ },
+ "crop": {
+ "description": "Recadrez les images pour supprimer les zones indésirables.",
+ "inputTitle": "Image d'entrée",
+ "resultTitle": "Image rognée",
+ "shortDescription": "Rogner des images rapidement.",
+ "title": "Rogner une image"
+ },
+ "editor": {
+ "description": "Éditeur d'images avancé avec des outils de recadrage, de rotation, d'annotation, d'ajustement des couleurs et d'ajout de filigranes. Retouchez vos images avec des outils professionnels directement dans votre navigateur.",
+ "shortDescription": "Modifiez des images avec des outils et des fonctionnalités avancés",
+ "title": "Éditeur d'images"
+ },
+ "imageToText": {
+ "description": "Extraire du texte à partir d'images (JPG, PNG) à l'aide de la reconnaissance optique de caractères (OCR).",
+ "shortDescription": "Extraire du texte à partir d'images à l'aide de l'OCR.",
+ "title": "Conversion d'image en texte (OCR)"
+ },
+ "qrCode": {
+ "description": "Générez des codes QR pour différents types de données : URL, texte, e-mail, téléphone, SMS, WiFi, vCard, etc.",
+ "shortDescription": "Créez des codes QR personnalisés pour différents formats de données.",
+ "title": "Générateur de code QR"
+ },
+ "removeBackground": {
+ "description": "Monde",
+ "shortDescription": "Supprimer automatiquement les arrière-plans des images",
+ "title": "Supprimer l'arrière-plan de l'image"
+ },
+ "resize": {
+ "description": "Redimensionner les images à différentes dimensions.",
+ "dimensionType": "Type de dimension",
+ "heightDescription": "Hauteur (en pixels)",
+ "inputTitle": "Image d'entrée",
+ "maintainAspectRatio": "Maintenir le rapport hauteur/largeur",
+ "maintainAspectRatioDescription": "Conserver le rapport hauteur/largeur d'origine de l'image.",
+ "percentage": "Pourcentage",
+ "percentageDescription": "Pourcentage de la taille d'origine (par exemple, 50 pour la demi-taille, 200 pour la double taille)",
+ "resizeByPercentage": "Redimensionner par pourcentage",
+ "resizeByPercentageDescription": "Redimensionner en spécifiant un pourcentage de la taille d'origine.",
+ "resizeByPixels": "Redimensionner par pixels",
+ "resizeByPixelsDescription": "Redimensionner en spécifiant les dimensions en pixels.",
+ "resizeMethod": "Méthode de redimensionnement",
+ "resultTitle": "Image redimensionnée",
+ "setHeight": "Définir la hauteur",
+ "setHeightDescription": "Spécifiez la hauteur en pixels et calculez la largeur en fonction du rapport hauteur/largeur.",
+ "setWidth": "Définir la largeur",
+ "setWidthDescription": "Spécifiez la largeur en pixels et calculez la hauteur en fonction du rapport hauteur/largeur.",
+ "shortDescription": "Redimensionnez facilement les images.",
+ "title": "Redimensionner l'image",
+ "toolInfo": {
+ "description": "Cet outil vous permet de redimensionner des images JPG, PNG, SVG ou GIF. Vous pouvez redimensionner en spécifiant les dimensions en pixels ou en pourcentage, avec des options permettant de conserver le rapport hauteur/largeur d'origine.",
+ "title": "Redimensionner l'image"
+ },
+ "widthDescription": "Largeur (en pixels)"
+ },
+ "rotate": {
+ "description": "Faire pivoter une image selon un angle spécifié.",
+ "shortDescription": "Faites pivoter une image facilement.",
+ "title": "Faire pivoter l'image"
+ }
+}
diff --git a/public/locales/fr/json.json b/public/locales/fr/json.json
new file mode 100644
index 0000000..20bda9a
--- /dev/null
+++ b/public/locales/fr/json.json
@@ -0,0 +1,62 @@
+{
+ "escapeJson": {
+ "description": "Échappez les caractères spéciaux dans les chaînes JSON. Convertissez les données JSON au format correctement échappé pour une transmission ou un stockage sécurisé.",
+ "shortDescription": "Échapper aux caractères spéciaux dans JSON",
+ "title": "Échapper le JSON"
+ },
+ "jsonToXml": {
+ "description": "Convertissez des données JSON au format XML. Transformez des objets JSON structurés en documents XML bien formés.",
+ "shortDescription": "Convertir JSON au format XML",
+ "title": "JSON vers XML"
+ },
+ "minify": {
+ "description": "Supprimez tous les espaces inutiles du JSON.",
+ "inputTitle": "Entrée JSON",
+ "resultTitle": "JSON minifié",
+ "shortDescription": "Minifier JSON en supprimant les espaces",
+ "title": "Minifier JSON",
+ "toolInfo": {
+ "description": "La minification JSON consiste à supprimer tous les espaces inutiles des données JSON tout en préservant leur validité. Cela inclut la suppression des espaces, des sauts de ligne et des indentations inutiles à l'analyse correcte du JSON. La minification réduit la taille des données JSON, les rendant plus efficaces pour le stockage et la transmission, tout en conservant la même structure de données et les mêmes valeurs.",
+ "title": "Qu'est-ce que la minification JSON ?"
+ }
+ },
+ "prettify": {
+ "description": "Formatez JSON avec une indentation et un espacement appropriés.",
+ "indentation": "Échancrure",
+ "inputTitle": "Entrée JSON",
+ "resultTitle": "JSON embelli",
+ "shortDescription": "Formater et embellir le code JSON",
+ "title": "Embellir JSON",
+ "toolInfo": {
+ "description": "Cet outil vous permet de formater les données JSON avec une indentation et un espacement appropriés, les rendant plus lisibles et plus faciles à utiliser.",
+ "title": "Embellir JSON"
+ },
+ "useSpaces": "Utiliser les espaces",
+ "useSpacesDescription": "Indenter la sortie avec des espaces",
+ "useTabs": "Utiliser les onglets",
+ "useTabsDescription": "Indenter la sortie avec des tabulations."
+ },
+ "stringify": {
+ "description": "Convertissez des objets JavaScript au format de chaîne JSON. Sérialisez des structures de données en chaînes JSON pour le stockage ou la transmission.",
+ "shortDescription": "Convertir des objets en chaîne JSON",
+ "title": "Stringify JSON"
+ },
+ "tsvToJson": {
+ "description": "Convertissez les données TSV (valeurs séparées par des tabulations) au format JSON. Transformez les données tabulaires en objets JSON structurés.",
+ "shortDescription": "Convertir le format TSV au format JSON",
+ "title": "TSV vers JSON"
+ },
+ "validateJson": {
+ "description": "Vérifiez si JSON est valide et bien formé.",
+ "inputTitle": "Entrée JSON",
+ "invalidJson": "❌ {{error}}",
+ "resultTitle": "Résultat de validation",
+ "shortDescription": "Valider le code JSON pour les erreurs",
+ "title": "Valider JSON",
+ "toolInfo": {
+ "description": "JSON (JavaScript Object Notation) est un format d'échange de données léger. La validation JSON garantit la conformité de la structure des données à la norme JSON. Un objet JSON valide doit comporter : - des noms de propriétés entre guillemets ; - des accolades {} correctement équilibrées ; - aucune virgule après la dernière paire clé-valeur ; - une imbrication correcte des objets et des tableaux. Cet outil vérifie le JSON d'entrée et fournit des informations pour identifier et corriger les erreurs courantes.",
+ "title": "Qu'est-ce que la validation JSON ?"
+ },
+ "validJson": "✅ JSON valide"
+ }
+}
diff --git a/public/locales/fr/list.json b/public/locales/fr/list.json
new file mode 100644
index 0000000..3af2b77
--- /dev/null
+++ b/public/locales/fr/list.json
@@ -0,0 +1,208 @@
+{
+ "duplicate": {
+ "concatenate": "Concatener",
+ "concatenateDescription": "Concaténer les copies (si cette option n'est pas cochée, les éléments seront entrelacés)",
+ "copyDescription": "Nombre de copies (fractionnable)",
+ "description": "L'utilitaire de duplication d'éléments de liste le plus simple au monde, accessible depuis un navigateur. Saisissez votre liste et spécifiez des critères de duplication pour créer des copies d'éléments. Idéal pour l'expansion de données, les tests ou la création de modèles répétitifs.",
+ "duplicationOptions": "Options de Duplication",
+ "examples": {
+ "fractional": {
+ "description": "Cet exemple montre comment dupliquer une liste avec un nombre fractionnaire de copies.",
+ "title": "duplication fractionnaire"
+ },
+ "interweave": {
+ "description": "Cet exemple montre comment entrelacer des éléments au lieu de les concaténer.",
+ "title": "Éléments entrelacés"
+ },
+ "reverse": {
+ "description": "Cet exemple montre comment dupliquer une liste dans l’ordre inverse.",
+ "title": "Duplication inversée"
+ },
+ "simple": {
+ "description": "Cet exemple montre comment dupliquer une liste de mots.",
+ "title": "Duplication simple"
+ }
+ },
+ "inputTitle": "Liste d'entrées",
+ "joinSeparatorDescription": "Séparateur pour joindre la liste dupliquée",
+ "resultTitle": "Liste dupliquée",
+ "reverse": "Inverse",
+ "reverseDescription": "Inverser les éléments dupliqués",
+ "shortDescription": "Dupliquer les éléments de la liste avec des critères spécifiés",
+ "splitByRegex": "Diviser par expression régulière",
+ "splitBySymbol": "Diviser par symbole",
+ "splitOptions": "Options de fractionnement",
+ "splitSeparatorDescription": "Séparateur pour diviser la liste",
+ "title": "Double",
+ "toolInfo": {
+ "description": "Cet outil vous permet de dupliquer des éléments d'une liste. Vous pouvez spécifier le nombre de copies (y compris les valeurs fractionnaires), contrôler si les éléments sont concaténés ou entrelacés, et même inverser les éléments dupliqués. Il est utile pour créer des motifs répétés, générer des données de test ou étendre des listes au contenu prévisible.",
+ "title": "Duplication de liste"
+ }
+ },
+ "findMostPopular": {
+ "description": "L'utilitaire de recherche par navigateur le plus simple au monde pour trouver les éléments les plus populaires d'une liste. Saisissez votre liste et obtenez instantanément les éléments qui apparaissent le plus fréquemment. Idéal pour l'analyse de données, l'identification de tendances ou la recherche d'éléments communs.",
+ "shortDescription": "Trouver les éléments les plus fréquemment utilisés",
+ "title": "Trouver les plus populaires"
+ },
+ "findUnique": {
+ "caseSensitiveItems": "Éléments sensibles à la casse",
+ "caseSensitiveItemsDescription": "Affichez les éléments avec une casse différente comme éléments uniques dans la liste.",
+ "delimiterDescription": "Définissez un symbole de délimitation ou une expression régulière.",
+ "description": "L'utilitaire de recherche d'éléments uniques dans une liste, le plus simple au monde, est disponible sur navigateur. Saisissez votre liste et obtenez instantanément toutes les valeurs uniques, sans doublons. Idéal pour le nettoyage des données, la déduplication ou la recherche d'éléments distincts.",
+ "findAbsolutelyUniqueItems": "Trouvez des articles absolument uniques",
+ "findAbsolutelyUniqueItemsDescription": "Afficher uniquement les éléments de la liste qui existent en un seul exemplaire.",
+ "inputListDelimiter": "Délimiteur de liste d'entrée",
+ "inputTitle": "Liste d'entrées",
+ "outputListDelimiter": "Délimiteur de liste de sortie",
+ "resultTitle": "Articles uniques",
+ "shortDescription": "Trouver des éléments uniques dans une liste",
+ "skipEmptyItems": "Ignorer les éléments vides",
+ "skipEmptyItemsDescription": "N'incluez pas les éléments de liste vides dans la sortie.",
+ "title": "Trouvez l'unique",
+ "trimItems": "Éléments de la liste de finition",
+ "trimItemsDescription": "Supprimez les espaces de début et de fin avant de comparer les éléments.",
+ "uniqueItemOptions": "Options d'articles uniques"
+ },
+ "group": {
+ "deleteEmptyItems": "Supprimer les éléments vides",
+ "deleteEmptyItemsDescription": "Ignorez les éléments vides et ne les incluez pas dans les groupes.",
+ "description": "L'utilitaire de regroupement d'éléments de liste le plus simple au monde, accessible depuis un navigateur. Saisissez votre liste et spécifiez des critères de regroupement pour organiser les éléments en groupes logiques. Idéal pour catégoriser des données, organiser des informations ou créer des listes structurées. Prend en charge les séparateurs personnalisés et diverses options de regroupement.",
+ "emptyItemsAndPadding": "Éléments vides et remplissage",
+ "groupNumberDescription": "Nombre d'éléments dans un groupe",
+ "groupSeparatorDescription": "Caractère séparateur de groupe",
+ "groupSizeAndSeparators": "Taille du groupe et séparateurs",
+ "inputItemSeparator": "Séparateur d'éléments d'entrée",
+ "inputTitle": "Liste d'entrée",
+ "itemSeparatorDescription": "Caractère séparateur d'éléments",
+ "leftWrapDescription": "Symbole d'enroulement gauche du groupe.",
+ "padNonFullGroups": "Groupes non complets de Pad",
+ "padNonFullGroupsDescription": "Remplissez les groupes non complets avec un élément personnalisé (saisissez ci-dessous).",
+ "paddingCharDescription": "Utilisez ce caractère ou cet objet pour compléter les groupes non complets.",
+ "resultTitle": "Articles groupés",
+ "rightWrapDescription": "Symbole d'enveloppement droit du groupe.",
+ "shortDescription": "Regrouper les éléments de la liste par propriétés communes",
+ "splitOperators": {
+ "regex": {
+ "description": "Délimitez les éléments de la liste d’entrée avec une expression régulière.",
+ "title": "Utiliser une expression régulière pour le fractionnement"
+ },
+ "symbol": {
+ "description": "Délimitez les éléments de la liste d'entrée avec un caractère.",
+ "title": "Utiliser un symbole pour le fractionnement"
+ }
+ },
+ "splitSeparatorDescription": "Définissez un symbole de délimitation ou une expression régulière.",
+ "title": "Groupe"
+ },
+ "reverse": {
+ "description": "Cette application très simple, basée sur un navigateur, imprime tous les éléments d'une liste à l'envers. Les éléments saisis peuvent être séparés par n'importe quel symbole et vous pouvez également modifier le séparateur des éléments inversés.",
+ "inputTitle": "Liste d'entrée",
+ "itemSeparator": "Séparateur d'éléments",
+ "itemSeparatorDescription": "Définissez un symbole de délimitation ou une expression régulière.",
+ "outputListOptions": "Options de la liste de sortie",
+ "outputSeparatorDescription": "Séparateur d'éléments de liste de sortie.",
+ "resultTitle": "Liste inversée",
+ "shortDescription": "Inverser rapidement une liste",
+ "splitOperators": {
+ "regex": {
+ "description": "Délimitez les éléments de la liste d’entrée avec une expression régulière.",
+ "title": "Utiliser une expression régulière pour le fractionnement"
+ },
+ "symbol": {
+ "description": "Délimitez les éléments de la liste d'entrée avec un caractère.",
+ "title": "Utiliser un symbole pour le fractionnement"
+ }
+ },
+ "splitterMode": "Mode séparateur",
+ "title": "Inverse",
+ "toolInfo": {
+ "description": "Cet utilitaire permet d'inverser l'ordre des éléments d'une liste. Il divise d'abord la liste d'entrée en éléments individuels, puis les parcourt du dernier au premier, en affichant chaque élément dans la sortie au cours de l'itération. La liste d'entrée peut contenir tout ce qui peut être représenté sous forme de données textuelles, notamment des chiffres, des nombres, des chaînes de caractères, des mots, des phrases, etc. Le séparateur d'éléments d'entrée peut également être une expression régulière. Par exemple, l'expression régulière /[;,]/ permet d'utiliser des éléments séparés par des virgules ou des points-virgules. Les délimiteurs des éléments d'entrée et de sortie sont personnalisables dans les options. Par défaut, les listes d'entrée et de sortie sont séparées par des virgules. Incroyable !",
+ "title": "Qu'est-ce qu'un inverseur de liste ?"
+ }
+ },
+ "rotate": {
+ "description": "L'utilitaire de rotation des éléments de liste le plus simple au monde, basé sur un navigateur. Saisissez votre liste et spécifiez le degré de rotation pour décaler les éléments d'un nombre de positions spécifié. Idéal pour la manipulation de données, les décalages circulaires ou la réorganisation des listes.",
+ "shortDescription": "Faire pivoter les éléments de la liste selon des positions spécifiées",
+ "title": "Tourner"
+ },
+ "shuffle": {
+ "delimiterDescription": "Définissez un symbole de délimitation ou une expression régulière.",
+ "description": "L'utilitaire de navigation le plus simple au monde pour mélanger les éléments d'une liste. Saisissez votre liste et obtenez instantanément une version aléatoire avec les éléments dans un ordre aléatoire. Idéal pour varier, tester le caractère aléatoire ou mélanger des données ordonnées.",
+ "inputListSeparator": "Séparateur de liste d'entrée",
+ "inputTitle": "Liste d'entrée",
+ "joinSeparatorDescription": "Utilisez ce séparateur dans la liste aléatoire.",
+ "outputLengthDescription": "Afficher autant d'éléments aléatoires",
+ "resultTitle": "Liste mélangée",
+ "shortDescription": "Randomiser l'ordre des éléments de la liste",
+ "shuffledListLength": "Longueur de la liste mélangée",
+ "shuffledListSeparator": "Séparateur de liste mélangée",
+ "title": "Mélanger"
+ },
+ "sort": {
+ "caseSensitive": "Tri sensible à la casse",
+ "caseSensitiveDescription": "Trier les majuscules et les minuscules séparément. Les majuscules précèdent les minuscules dans une liste ascendante. (Fonctionne uniquement en mode de tri alphabétique.)",
+ "description": "L'utilitaire de tri de listes le plus simple au monde, basé sur un navigateur. Saisissez votre liste et spécifiez des critères de tri pour organiser les éléments par ordre croissant ou décroissant. Idéal pour l'organisation de données, le traitement de texte ou la création de listes ordonnées.",
+ "inputItemSeparator": "Séparateur d'éléments d'entrée",
+ "inputTitle": "Liste d'entrée",
+ "joinSeparatorDescription": "Utilisez ce symbole comme jointure entre les éléments d'une liste triée.",
+ "orderDescription": "Sélectionnez un ordre de tri.",
+ "orderOptions": {
+ "decreasing": "Ordre décroissant",
+ "increasing": "Ordre croissant"
+ },
+ "removeDuplicates": "Supprimer les doublons",
+ "removeDuplicatesDescription": "Supprimer les éléments de liste en double.",
+ "resultTitle": "Liste triée",
+ "shortDescription": "Trier les éléments de la liste dans l'ordre spécifié",
+ "sortMethod": "Méthode de tri",
+ "sortMethodDescription": "Sélectionnez une méthode de tri.",
+ "sortOptions": {
+ "alphabetic": "Trier par ordre alphabétique",
+ "length": "Trier par longueur",
+ "numeric": "Trier numériquement"
+ },
+ "sortedItemProperties": "Propriétés des éléments triés",
+ "splitOperators": {
+ "regex": {
+ "description": "Délimitez les éléments de la liste d’entrée avec une expression régulière.",
+ "title": "Utiliser une expression régulière pour le fractionnement"
+ },
+ "symbol": {
+ "description": "Délimitez les éléments de la liste d'entrée avec un caractère.",
+ "title": "Utiliser un symbole pour le fractionnement"
+ }
+ },
+ "splitSeparatorDescription": "Définissez un symbole de délimitation ou une expression régulière.",
+ "title": "Trier"
+ },
+ "truncate": {
+ "description": "L'utilitaire de tronquage de listes le plus simple au monde, accessible depuis un navigateur. Saisissez votre liste et spécifiez le nombre maximal d'éléments à conserver. Idéal pour le traitement de données, la gestion de listes ou la limitation de la longueur du contenu.",
+ "shortDescription": "Tronquer la liste au nombre spécifié d'éléments",
+ "title": "Tronquer"
+ },
+ "unwrap": {
+ "description": "L'utilitaire de dépliage de listes le plus simple au monde, basé sur un navigateur. Saisissez votre liste dépliée et spécifiez des critères de dépliage pour aplatir les éléments organisés. Idéal pour le traitement de données, la manipulation de texte ou l'extraction de contenu de listes structurées.",
+ "shortDescription": "Décompresser les éléments de la liste à partir du format structuré",
+ "title": "Déballer"
+ },
+ "wrap": {
+ "description": "Ajoutez du texte avant et après chaque élément de la liste.",
+ "inputTitle": "Liste d'entrées",
+ "joinSeparatorDescription": "Séparateur pour joindre la liste enveloppée",
+ "leftTextDescription": "Texte à ajouter avant chaque élément",
+ "removeEmptyItems": "Supprimer les éléments vides",
+ "resultTitle": "Liste enveloppée",
+ "rightTextDescription": "Texte à ajouter après chaque élément",
+ "shortDescription": "Envelopper les éléments de la liste avec des critères spécifiés",
+ "splitByRegex": "Diviser par expression régulière",
+ "splitBySymbol": "Diviser par symbole",
+ "splitOptions": "Options de fractionnement",
+ "splitSeparatorDescription": "Séparateur pour diviser la liste",
+ "title": "Envelopper",
+ "toolInfo": {
+ "description": "Cet outil vous permet d'ajouter du texte avant et après chaque élément d'une liste. Vous pouvez spécifier un texte différent pour les côtés gauche et droit, et contrôler le traitement de la liste. Il est utile pour ajouter des guillemets, des crochets ou d'autres éléments de mise en forme aux éléments d'une liste, préparer des données pour différents formats ou créer du texte structuré.",
+ "title": "Enveloppement de liste"
+ },
+ "wrapOptions": "Options d'enveloppement"
+ }
+}
diff --git a/public/locales/fr/number.json b/public/locales/fr/number.json
new file mode 100644
index 0000000..6f115d7
--- /dev/null
+++ b/public/locales/fr/number.json
@@ -0,0 +1,89 @@
+{
+ "arithmeticSequence": {
+ "commonDifferenceDescription": "Différence courante entre les termes (d)",
+ "description": "Générez des séquences arithmétiques avec des paramètres personnalisables.",
+ "firstTermDescription": "Premier terme de la suite (a₁)",
+ "numberOfTermsDescription": "Nombre de termes à générer (n)",
+ "outputFormat": "Format de sortie",
+ "resultTitle": "Séquence générée",
+ "separatorDescription": "Séparateur entre les termes",
+ "sequenceParameters": "Paramètres de séquence",
+ "shortDescription": "Générer des séquences arithmétiques",
+ "title": "Séquence arithmétique",
+ "toolInfo": {
+ "description": "Une suite arithmétique est une suite de nombres dont la différence entre chaque terme consécutif est constante. Cette différence constante est appelée différence commune. Étant donné le premier terme (a₁) et la différence commune (d), chaque terme peut être trouvé en additionnant la différence commune au terme précédent.",
+ "title": "Qu'est-ce qu'une suite arithmétique ?"
+ }
+ },
+ "generate": {
+ "arithmeticSequenceOption": "Option de séquence arithmétique",
+ "description": "Générer une séquence de nombres avec des paramètres personnalisables.",
+ "numberOfElementsDescription": "Nombre d'éléments dans la séquence.",
+ "resultTitle": "Numéros générés",
+ "separator": "Séparateur",
+ "separatorDescription": "Séparez les éléments de la séquence arithmétique par ce caractère.",
+ "shortDescription": "Générer des nombres aléatoires dans des plages spécifiées",
+ "startSequenceDescription": "Démarrer la séquence à partir de ce numéro.",
+ "stepDescription": "Augmentez chaque élément de ce montant",
+ "title": "Générer",
+ "toolInfo": {
+ "description": "Cet outil vous permet de générer une séquence de nombres avec des paramètres personnalisables. Vous pouvez spécifier la valeur de départ, le pas et le nombre d'éléments.",
+ "title": "Générer des nombres"
+ }
+ },
+ "ohmsLaw": {
+ "description": "Calcule la tension, le courant et la résistance",
+ "longDescription": "Cette calculatrice applique la loi d'Ohm (V = I × R) pour déterminer n'importe lequel des trois paramètres électriques lorsque les deux autres sont connus. La loi d'Ohm est un principe fondamental du génie électrique qui décrit la relation entre la tension (V), le courant (I) et la résistance (R). Cet outil est essentiel pour les électroniciens amateurs, les ingénieurs électriciens et les étudiants travaillant sur des circuits afin de résoudre rapidement les valeurs inconnues de leurs conceptions électriques.",
+ "shortDescription": "Calculer la tension, le courant ou la résistance dans les circuits électriques en utilisant la loi d'Ohm",
+ "title": "loi d'Ohm"
+ },
+ "slackline": {
+ "description": "Calcule la tension dans une slackline",
+ "longDescription": "Cette calculatrice suppose une charge au centre de la corde",
+ "shortDescription": "Calculez la tension approximative d'une slackline ou d'une corde à linge. Ne vous fiez pas à cela pour votre sécurité.",
+ "title": "Tension de la slackline"
+ },
+ "sphereArea": {
+ "description": "Aire d'une sphère",
+ "longDescription": "Cette calculatrice détermine l'aire de surface d'une sphère selon la formule A = 4πr². Vous pouvez saisir le rayon pour trouver l'aire de surface ou saisir l'aire de surface pour calculer le rayon requis. Cet outil est utile aux étudiants en géométrie, aux ingénieurs travaillant avec des objets sphériques et à toute personne devant effectuer des calculs impliquant des surfaces sphériques.",
+ "shortDescription": "Calculer l'aire de surface d'une sphère en fonction de son rayon",
+ "title": "Aire d'une sphère"
+ },
+ "sphereVolume": {
+ "description": "Volume d'une sphère",
+ "longDescription": "Cette calculatrice calcule le volume d'une sphère selon la formule V = (4/3)πr³. Vous pouvez saisir le rayon ou le diamètre pour trouver le volume, ou saisir le volume pour déterminer le rayon requis. Cet outil est précieux pour les étudiants, les ingénieurs et les professionnels travaillant avec des objets sphériques dans des domaines tels que la physique, l'ingénierie et la fabrication.",
+ "shortDescription": "Calculer le volume d'une sphère en utilisant le rayon ou le diamètre",
+ "title": "Volume d'une sphère"
+ },
+ "sum": {
+ "description": "Calculez la somme d'une liste de nombres. Saisissez les nombres séparés par des virgules ou des sauts de ligne pour obtenir leur somme totale.",
+ "extractionTypes": {
+ "delimiter": {
+ "description": "Personnalisez le séparateur de nombres ici. (Par défaut, il s'agit d'un saut de ligne.)",
+ "title": "Délimiteur de nombre"
+ },
+ "smart": {
+ "description": "Détection automatique des nombres dans l'entrée.",
+ "title": "Somme intelligente"
+ }
+ },
+ "inputTitle": "Entrée",
+ "numberExtraction": "Extraction de nombres",
+ "printRunningSum": "Imprimer le total cumulé",
+ "printRunningSumDescription": "Affichez la somme telle qu'elle est calculée étape par étape.",
+ "resultTitle": "Total",
+ "runningSum": "Somme courante",
+ "shortDescription": "Calculer la somme des nombres",
+ "title": "Somme",
+ "toolInfo": {
+ "description": "Il s'agit d'un utilitaire en ligne, accessible depuis un navigateur, permettant de calculer la somme de plusieurs nombres. Vous pouvez saisir les nombres séparés par une virgule, un espace ou tout autre caractère, y compris le saut de ligne. Vous pouvez également simplement coller un fragment de données textuelles contenant les valeurs numériques à additionner : l'utilitaire les extraira et calculera leur somme.",
+ "title": "Qu'est-ce qu'une calculatrice de somme numérique ?"
+ }
+ },
+ "voltageDropInWire": {
+ "description": "Calcule la tension aller-retour et la perte de puissance dans un câble à 2 conducteurs",
+ "longDescription": "Ce calculateur permet de déterminer la chute de tension et la perte de puissance dans un câble électrique à deux conducteurs. Il prend en compte la longueur du câble, la section du fil, la résistivité du matériau et le flux de courant. Il calcule la chute de tension aller-retour, la résistance totale du câble et la puissance dissipée sous forme de chaleur. Cet outil est particulièrement utile aux ingénieurs électriciens, aux électriciens et aux bricoleurs pour la conception de systèmes électriques afin de garantir que les niveaux de tension restent dans des limites acceptables sous charge.",
+ "shortDescription": "Calculer la chute de tension et la perte de puissance dans les câbles électriques en fonction de la longueur, du matériau et du courant",
+ "title": "Chute de tension aller-retour dans le câble"
+ }
+}
diff --git a/public/locales/fr/pdf.json b/public/locales/fr/pdf.json
new file mode 100644
index 0000000..81714b2
--- /dev/null
+++ b/public/locales/fr/pdf.json
@@ -0,0 +1,113 @@
+{
+ "compressPdf": {
+ "compressedFileSize": "Taille du fichier compressé",
+ "compressingPdf": "Compression des PDF...",
+ "compressionLevel": "Niveau de compression",
+ "compressionSettings": "Paramètres de compression",
+ "description": "Réduire la taille des fichiers PDF tout en maintenant la qualité grâce à Ghostscript",
+ "errorCompressingPdf": "Échec de la compression du PDF : {{error}}",
+ "errorReadingPdf": "Échec de la lecture du fichier PDF. Veuillez vous assurer qu'il s'agit d'un PDF valide.",
+ "fileSize": "Taille du fichier original",
+ "highCompression": "Compression élevée",
+ "highCompressionDescription": "Réduction maximale de la taille du fichier avec une certaine perte de qualité",
+ "inputTitle": "Entrée PDF",
+ "lowCompression": "Faible compression",
+ "lowCompressionDescription": "Réduisez légèrement la taille du fichier avec une perte de qualité minimale",
+ "mediumCompression": "Compression moyenne",
+ "mediumCompressionDescription": "Équilibre entre la taille et la qualité des fichiers",
+ "pages": "Nombre de pages",
+ "resultTitle": "PDF compressé",
+ "shortDescription": "Compresser des fichiers PDF en toute sécurité dans votre navigateur",
+ "title": "Compresser le PDF"
+ },
+ "editor": {
+ "description": "Éditeur PDF avancé avec fonctions d'annotation, de remplissage de formulaires, de surlignage et d'export. Modifiez vos PDF directement dans le navigateur avec des outils de qualité professionnelle, notamment l'insertion de texte, le dessin, le surlignage, la signature et le remplissage de formulaires.",
+ "shortDescription": "Modifier les PDF avec des outils avancés d'annotation, de signature et d'édition",
+ "title": "Editeur de PDF"
+ },
+ "merge": {
+ "inputTitle": "Entrée PDF",
+ "loadingText": "Extraire les pages",
+ "resultTitle": "Sortie du PDF fusionné",
+ "toolInfo": {
+ "description": "Cet outil vous permet de fusionner plusieurs fichiers PDF en un seul document. Pour utiliser cet outil, il vous suffit de télécharger les fichiers PDF que vous souhaitez fusionner. L'outil combinera ensuite toutes les pages des fichiers d'entrée en un seul document PDF.",
+ "title": "Comment utiliser l’outil de fusion de PDF ?"
+ }
+ },
+ "mergePdf": {
+ "description": "Comment utiliser l'outil Fusionner PDF ?",
+ "inputTitle": "PDF d'entrée",
+ "mergingPdfs": "Fusion de PDF",
+ "pdfOptions": "Options PDF",
+ "resultTitle": "PDF fusionné",
+ "shortDescription": "Fusionner plusieurs fichiers PDF en un seul document",
+ "sortByFileName": "Trier par nom de fichier",
+ "sortByFileNameDescription": "Trier les PDF par ordre alphabétique par nom de fichier",
+ "sortByUploadOrder": "Trier par ordre de téléchargement",
+ "sortByUploadOrderDescription": "Conserver les fichiers PDF dans l'ordre dans lequel ils ont été téléchargés",
+ "title": "Fusionner des PDF",
+ "toolInfo": {
+ "description": "Cet outil vous permet de combiner plusieurs fichiers PDF en un seul document. Vous pouvez choisir comment trier les PDF et l'outil les fusionnera dans l'ordre spécifié.",
+ "title": "Fusionner des fichiers PDF"
+ }
+ },
+ "pdfToEpub": {
+ "description": "Transformez les documents PDF en fichiers EPUB pour une meilleure compatibilité avec les liseuses.', icon: 'material-symbols:import-contacts', component: lazy(() => import('./index')), keywords: ['pdf', 'epub', 'convert', 'ebook'], path: 'pdf-to-epub', i18n: { name: 'pdf:pdfToEpub.title', description: 'pdf:pdfToEpub.description",
+ "shortDescription": "Convertir des fichiers PDF au format EPUB",
+ "title": "PDF vers EPUB"
+ },
+ "pdfToPng": {
+ "description": "Transformez les documents PDF en panneaux PNG.",
+ "longDescription": "Téléchargez un PDF et convertissez chaque page en image PNG de haute qualité directement dans votre navigateur. Cet outil est idéal pour extraire du contenu visuel ou partager des pages individuelles. Aucune donnée n'est téléchargée : tout fonctionne en local.",
+ "shortDescription": "Convertir des PDF en images PNG",
+ "title": "PDF en PNG"
+ },
+ "protectPdf": {
+ "description": "Ajoutez une protection par mot de passe à vos fichiers PDF en toute sécurité dans votre navigateur",
+ "shortDescription": "Protégez les fichiers PDF en toute sécurité avec un mot de passe",
+ "title": "Protéger le PDF"
+ },
+ "rotatePdf": {
+ "allPagesWillBeRotated": "Les {{count}} pages seront tournées",
+ "angleOptions": {
+ "clockwise90": "90° dans le sens des aiguilles d'une montre",
+ "counterClockwise270": "270° (90° dans le sens inverse des aiguilles d'une montre)",
+ "upsideDown180": "180° (à l'envers)"
+ },
+ "applyToAllPages": "Appliquer à toutes les pages",
+ "description": "Faire pivoter les pages d'un document PDF.",
+ "inputTitle": "Entrée PDF",
+ "longDescription": "Modifiez l'orientation des pages PDF en les faisant pivoter de 90, 180 ou 270 degrés. Utile pour corriger des documents mal numérisés ou préparer des PDF pour l'impression.",
+ "pageRangesDescription": "Saisissez les numéros de page ou les plages séparés par des virgules (par exemple, 1, 3, 5-7)",
+ "pageRangesPlaceholder": "par exemple, 1,5-8",
+ "pagesWillBeRotated": "{{count}} page{{count !== 1 ? 's' : ''}} sera tourné",
+ "pdfPageCount": "PDF a {{count}} page{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "PDF pivoté",
+ "rotatingPages": "Rotation des pages",
+ "rotationAngle": "Angle de rotation",
+ "rotationSettings": "Paramètres de rotation",
+ "shortDescription": "Faire pivoter les pages d'un document PDF",
+ "title": "Faire pivoter le PDF",
+ "toolInfo": {
+ "description": "Cet outil vous permet de faire pivoter les pages d'un document PDF. Vous pouvez faire pivoter toutes les pages ou spécifier des pages individuelles. Choisissez un angle de rotation : 90° dans le sens horaire, 180° (à l'envers) ou 270° (90° dans le sens antihoraire). Pour faire pivoter des pages spécifiques, décochez « Appliquer à toutes les pages » et saisissez les numéros de page ou les plages de numéros séparés par des virgules (par exemple, 1, 3, 5-7).",
+ "title": "Comment utiliser l'outil de rotation PDF"
+ }
+ },
+ "splitPdf": {
+ "description": "Extraire des pages spécifiques d'un document PDF.",
+ "extractingPages": "Extraire les pages",
+ "inputTitle": "Entrée PDF",
+ "pageExtractionPreview": "{{count}} page{{count !== 1 ? 's' : ''}} sera(ont) extrait(s)",
+ "pageRangesDescription": "Saisissez les numéros de page ou les plages séparés par des virgules (par exemple, 1, 3, 5-7)",
+ "pageRangesPlaceholder": "par exemple, 1,5-8",
+ "pageSelection": "Sélection de page",
+ "pdfPageCount": "PDF a {{count}} page{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "PDF extrait",
+ "shortDescription": "Extraire des pages spécifiques d'un fichier PDF",
+ "title": "Diviser le PDF",
+ "toolInfo": {
+ "description": "Cet outil vous permet d'extraire des pages spécifiques d'un document PDF. Vous pouvez spécifier des pages individuelles ou des plages de pages à extraire.",
+ "title": "Diviser le PDF"
+ }
+ }
+}
diff --git a/public/locales/fr/string.json b/public/locales/fr/string.json
new file mode 100644
index 0000000..8fbaacc
--- /dev/null
+++ b/public/locales/fr/string.json
@@ -0,0 +1,261 @@
+{
+ "base64": {
+ "decode": "Décodage Base64",
+ "description": "Encodez ou décodez du texte à l'aide de l'encodage Base64.",
+ "encode": "Encodage Base64",
+ "inputTitle": "Données d'entrée",
+ "optionsTitle": "Options Base64",
+ "resultTitle": "Résultat",
+ "shortDescription": "Encoder ou décoder des données à l'aide de Base64.",
+ "title": "Encodeur/décodeur Base64",
+ "toolInfo": {
+ "description": "Base64 est un schéma de codage qui représente les données au format chaîne ASCII en les convertissant en une représentation radix-64. Bien qu'il puisse être utilisé pour encoder des chaînes, il est couramment utilisé pour encoder des données binaires destinées à être transmises sur des supports conçus pour traiter des données textuelles.",
+ "title": "Qu'est-ce que Base64 ?"
+ }
+ },
+ "censor": {
+ "description": "Utilitaire de censure de mots dans un texte. Chargez votre texte dans le formulaire de saisie à gauche, spécifiez tous les mots interdits dans les options et vous obtiendrez instantanément le texte censuré dans la zone de sortie. », longDescription: « Avec cet outil en ligne, vous pouvez censurer certains mots dans n'importe quel texte. Vous pouvez spécifier une liste de mots indésirables (tels que des jurons ou des mots secrets) et le programme les remplacera par d'autres mots pour créer un texte lisible. Les mots peuvent être spécifiés dans un champ de texte multiligne dans les options, en saisissant un mot par ligne. », keywords: ['text', 'censor', 'words', 'characters'], component: lazy(() => import('./index')), i18n: { name: 'string:censor.title', description: 'string:censor.description",
+ "shortDescription": "Masquez rapidement les gros mots ou remplacez-les par des mots alternatifs.",
+ "title": "Censure de texte"
+ },
+ "createPalindrome": {
+ "description": "L'utilitaire de navigateur le plus simple au monde pour créer des palindromes à partir de n'importe quel texte. Saisissez du texte et transformez-le instantanément en un palindrome qui se lit de la même manière à l'endroit comme à l'envers. Idéal pour les jeux de mots, la création de motifs de texte symétriques ou l'exploration de curiosités linguistiques.",
+ "shortDescription": "Créez un texte qui se lit de la même manière à l'avant et à l'arrière",
+ "title": "Créer un palindrome"
+ },
+ "extractSubstring": {
+ "description": "L'utilitaire le plus simple au monde, basé sur un navigateur, pour extraire des sous-chaînes de texte. Saisissez votre texte et spécifiez les positions de début et de fin pour extraire la portion souhaitée. Idéal pour le traitement de données, l'analyse de texte ou l'extraction de contenu spécifique à partir de blocs de texte volumineux.",
+ "shortDescription": "Extraire une partie de texte entre des positions spécifiées",
+ "title": "Extraire la sous-chaîne"
+ },
+ "join": {
+ "blankLinesAndTrailingSpaces": "Lignes vides et espaces de fin",
+ "deleteBlankDescription": "Supprimez les lignes qui n’ont pas de symboles de texte.",
+ "deleteBlankTitle": "Supprimer les lignes vides",
+ "deleteTrailingDescription": "Supprimez les espaces et les tabulations à la fin des lignes.",
+ "deleteTrailingTitle": "Supprimer les espaces de fin",
+ "description": "Joignez des morceaux de texte avec des séparateurs personnalisables.",
+ "inputTitle": "Textes",
+ "joinCharacterDescription": "Symbole reliant les fragments de texte. (Espace par défaut.)",
+ "joinCharacterPlaceholder": "Rejoindre le personnage",
+ "resultTitle": "Texte joint",
+ "shortDescription": "Joindre des éléments de texte avec un séparateur spécifié",
+ "textMergedOptions": "Options de fusion de texte",
+ "title": "Joindre le texte",
+ "toolInfo": {
+ "description": "Cet outil vous permet de fusionner des parties de texte. Il prend une liste de valeurs de texte, séparées par des sauts de ligne, et les fusionne. Vous pouvez définir le caractère qui sera placé entre les parties du texte combiné. Vous pouvez également ignorer les lignes vides et supprimer les espaces et les tabulations à la fin de chaque ligne. Textabulous !",
+ "title": "Qu'est-ce qu'un outil de jointure de texte ?"
+ }
+ },
+ "palindrome": {
+ "description": "L'utilitaire le plus simple au monde, basé sur un navigateur, permet de vérifier si un texte est un palindrome. Vérifiez instantanément si votre texte se lit de la même manière à l'endroit comme à l'envers. Idéal pour les jeux de mots, l'analyse linguistique ou la validation de structures de texte symétriques. Prend en charge divers délimiteurs et la détection de palindromes multi-mots.",
+ "shortDescription": "Vérifiez si le texte se lit de la même manière à l'avant et à l'arrière",
+ "title": "Palindrome"
+ },
+ "passwordGenerator": {
+ "avoidAmbiguous": "Évitez les caractères ambigus (i, I, l, 0, O)",
+ "description": "Générez des mots de passe aléatoires sécurisés avec une longueur et des types de caractères personnalisables. Choisissez entre minuscules, majuscules, chiffres et caractères spéciaux. Option permettant d'éviter les caractères ambigus pour une meilleure lisibilité.",
+ "includeLowercase": "Inclure des lettres minuscules (a-z)",
+ "includeNumbers": "Inclure des chiffres (0-9)",
+ "includeSymbols": "Inclure des caractères spéciaux",
+ "includeUppercase": "Inclure des lettres majuscules (A-Z)",
+ "lengthDesc": "Longueur du mot de passe",
+ "lengthPlaceholder": "par exemple 12",
+ "optionsTitle": "Options de mot de passe",
+ "resultTitle": "Mot de passe généré",
+ "shortDescription": "Générez des mots de passe aléatoires sécurisés avec des options personnalisées",
+ "title": "Générateur de mot de passe",
+ "toolInfo": {
+ "description": "Cet outil génère des mots de passe aléatoires sécurisés selon vos critères. Vous pouvez personnaliser la longueur, inclure ou exclure différents types de caractères et éviter les caractères ambigus pour une meilleure lisibilité. Idéal pour créer des mots de passe forts pour vos comptes, applications ou tout autre besoin de sécurité.",
+ "title": "À propos du générateur de mots de passe"
+ }
+ },
+ "quote": {
+ "allowDoubleQuotation": "Autoriser les guillemets doubles",
+ "description": "Ajoutez des guillemets autour du texte avec des options personnalisables.",
+ "inputTitle": "Texte d'entrée",
+ "leftQuoteDescription": "Caractère(s) de citation gauche",
+ "processAsMultiLine": "Traiter comme un texte multiligne",
+ "quoteEmptyLines": "Citer les lignes vides",
+ "quoteOptions": "Options de devis",
+ "resultTitle": "Texte cité",
+ "rightQuoteDescription": "Caractère(s) de citation à droite",
+ "shortDescription": "Ajoutez des guillemets autour du texte avec différents styles",
+ "title": "Citation de texte",
+ "toolInfo": {
+ "description": "Cet outil vous permet d'insérer des guillemets autour du texte. Vous pouvez choisir différents caractères de guillemets, gérer du texte multiligne et contrôler le traitement des lignes vides. Il est utile pour préparer du texte pour la programmation, formater des données ou créer du texte stylisé.",
+ "title": "Citation de texte"
+ }
+ },
+ "randomizeCase": {
+ "description": "L'utilitaire de sélection aléatoire de casse de texte le plus simple au monde, basé sur un navigateur. Saisissez votre texte et transformez-le instantanément en ajoutant des majuscules et des minuscules aléatoires. Idéal pour créer des effets de texte uniques, tester la sensibilité à la casse ou générer des modèles de texte variés.",
+ "shortDescription": "Randomiser la casse des lettres dans le texte",
+ "title": "Cas randomisé"
+ },
+ "removeDuplicateLines": {
+ "description": "Chargez votre texte dans le formulaire de saisie à gauche et obtenez instantanément du texte sans doublons dans la zone de sortie. Puissant, gratuit et rapide. Chargez des lignes de texte : obtenez des lignes de texte uniques.",
+ "shortDescription": "Supprimez rapidement toutes les lignes répétées du texte",
+ "title": "Supprimer les lignes en double"
+ },
+ "repeat": {
+ "delimiterDescription": "Délimiteur pour les copies de sortie.",
+ "delimiterPlaceholder": "Délimiteur",
+ "description": "Répétez le texte plusieurs fois avec des séparateurs personnalisables.",
+ "inputTitle": "Texte d'entrée",
+ "numberPlaceholder": "Nombre",
+ "repeatAmountDescription": "Nombre de répétitions.",
+ "repetitionsDelimiter": "Délimiteur de répétitions",
+ "resultTitle": "Texte répété",
+ "shortDescription": "Répéter le texte plusieurs fois",
+ "textRepetitions": "Répétitions de texte",
+ "title": "Répéter le texte",
+ "toolInfo": {
+ "description": "Cet outil vous permet de répéter un texte donné plusieurs fois avec un séparateur optionnel.",
+ "title": "Répéter le texte"
+ }
+ },
+ "reverse": {
+ "description": "L'utilitaire d'inversion de texte le plus simple au monde, basé sur un navigateur. Saisissez n'importe quel texte et inversez-le instantanément, caractère par caractère. Idéal pour créer du texte miroir, analyser des palindromes ou jouer avec les motifs de texte. Préserve les espaces et les caractères spéciaux lors de l'inversion.",
+ "inputTitle": "Texte à inverser",
+ "processMultiLine": "Traiter un texte multiligne",
+ "processMultiLineDescription": "Chaque ligne sera inversée indépendamment",
+ "resultTitle": "Texte inversé",
+ "reversalOptions": "Options d'inversion",
+ "shortDescription": "Inverser n'importe quel texte caractère par caractère",
+ "skipEmptyLines": "Sauter les lignes vides",
+ "skipEmptyLinesDescription": "Les lignes vides seront supprimées de la sortie",
+ "title": "Inverse",
+ "trimWhitespace": "Couper les espaces blancs",
+ "trimWhitespaceDescription": "Supprimer les espaces de début et de fin de chaque ligne"
+ },
+ "rot13": {
+ "description": "Coder ou décoder du texte à l'aide du chiffrement ROT13.",
+ "inputTitle": "Texte d'entrée",
+ "resultTitle": "Résultat ROT13",
+ "shortDescription": "Coder ou décoder du texte à l'aide du chiffrement ROT13.",
+ "title": "Encodeur/décodeur ROT13",
+ "toolInfo": {
+ "description": "ROT13 (rotation de 13 positions) est un chiffrement par substitution de lettres simple qui remplace une lettre par la 13e lettre suivante dans l'alphabet. ROT13 est un cas particulier du chiffrement de César, développé dans la Rome antique. L'alphabet anglais comportant 26 lettres, ROT13 est son propre inverse ; pour annuler ROT13, le même algorithme est appliqué, permettant ainsi la même opération de codage et de décodage.",
+ "title": "Qu'est-ce que ROT13 ?"
+ }
+ },
+ "rotate": {
+ "description": "Faire pivoter les caractères du texte selon des positions spécifiées.",
+ "inputTitle": "Texte d'entrée",
+ "processAsMultiLine": "Traiter comme un texte multiligne (faire pivoter chaque ligne séparément)",
+ "resultTitle": "Texte pivoté",
+ "rotateLeft": "Tourner à gauche",
+ "rotateRight": "Tourner à droite",
+ "rotationOptions": "Options de rotation",
+ "shortDescription": "Décaler les caractères dans le texte par position.",
+ "stepDescription": "Nombre de positions à faire tourner",
+ "title": "Faire pivoter le texte",
+ "toolInfo": {
+ "description": "Cet outil vous permet de faire pivoter les caractères d'une chaîne d'un nombre spécifié de positions. Vous pouvez effectuer une rotation vers la gauche ou la droite, et traiter du texte multiligne en faisant pivoter chaque ligne séparément. La rotation de chaîne est utile pour les transformations de texte simples, la création de motifs ou la mise en œuvre de techniques de chiffrement de base.",
+ "title": "Rotation des cordes"
+ }
+ },
+ "split": {
+ "charAfterChunkDescription": "Caractère après chaque morceau",
+ "charBeforeChunkDescription": "Caractère avant chaque morceau",
+ "chunksDescription": "Nombre de morceaux de longueur égale dans la sortie.",
+ "chunksTitle": "Utiliser un certain nombre de morceaux",
+ "description": "L'utilitaire de découpage de texte basé sur navigateur le plus simple au monde. Saisissez votre texte et spécifiez un séparateur pour le diviser en plusieurs parties. Idéal pour le traitement de données, la manipulation de texte ou l'extraction de contenu spécifique à partir de blocs de texte volumineux.",
+ "lengthDescription": "Nombre de symboles qui seront placés dans chaque bloc de sortie.",
+ "lengthTitle": "Utiliser la longueur pour le fractionnement",
+ "outputSeparatorDescription": "Caractère à insérer entre les segments séparés. (Par défaut, il s'agit du saut de ligne « \\n ».)",
+ "outputSeparatorOptions": "Options de séparateur de sortie",
+ "regexDescription": "Expression régulière permettant de diviser le texte en plusieurs parties.\n(Plusieurs espaces par défaut.)",
+ "regexTitle": "Utiliser une expression régulière pour le fractionnement",
+ "resultTitle": "Textes",
+ "shortDescription": "Diviser le texte en plusieurs parties à l'aide d'un séparateur",
+ "splitSeparatorOptions": "Options de séparateur fractionné",
+ "symbolDescription": "Caractère permettant de diviser le texte en plusieurs parties.\n(Espace par défaut.)",
+ "symbolTitle": "Utiliser un symbole pour le fractionnement",
+ "title": "Diviser"
+ },
+ "statistic": {
+ "characterFrequencyAnalysis": "Analyse de la fréquence des caractères",
+ "characterFrequencyAnalysisDescription": "Comptez la fréquence à laquelle chaque caractère apparaît dans le texte",
+ "delimitersOptions": "Options de délimiteurs",
+ "description": "Analysez le texte et générez des statistiques complètes.",
+ "includeEmptyLines": "Inclure les lignes vides",
+ "includeEmptyLinesDescription": "Inclure les lignes vides lors du comptage des lignes",
+ "inputTitle": "Texte d'entrée",
+ "resultTitle": "Statistiques textuelles",
+ "sentenceDelimitersDescription": "Saisissez les caractères personnalisés utilisés pour délimiter les phrases dans votre langue (séparés par une virgule) ou laissez-le vide par défaut.",
+ "sentenceDelimitersPlaceholder": "par exemple ., !, ?, ...",
+ "shortDescription": "Obtenez des statistiques sur votre texte",
+ "statisticsOptions": "Options de statistiques",
+ "title": "Statistiques textuelles",
+ "toolInfo": {
+ "description": "Cet outil vous permet d'analyser du texte et de générer des statistiques complètes, notamment le nombre de caractères, le nombre de mots, le nombre de lignes et l'analyse de fréquence des caractères et des mots.",
+ "title": "Qu'est-ce qu'un {{title}}?"
+ },
+ "wordDelimitersDescription": "Saisissez une expression régulière personnalisée pour compter les mots ou laissez-la vide par défaut.",
+ "wordDelimitersPlaceholder": "par exemple \\s.,;:!?\"«»()…",
+ "wordFrequencyAnalysis": "Analyse de fréquence des mots",
+ "wordFrequencyAnalysisDescription": "Comptez la fréquence à laquelle chaque mot apparaît dans le texte"
+ },
+ "textReplacer": {
+ "description": "Remplacez les modèles de texte par un nouveau contenu.",
+ "findPatternInText": "Trouver ce modèle dans le texte",
+ "findPatternUsingRegexp": "Trouver un modèle à l'aide d'une expression régulière",
+ "inputTitle": "Texte à remplacer",
+ "newTextPlaceholder": "Nouveau texte",
+ "regexpDescription": "Saisissez l’expression régulière que vous souhaitez remplacer.",
+ "replacePatternDescription": "Saisissez le modèle à utiliser pour le remplacement.",
+ "replaceText": "Remplacer le texte",
+ "resultTitle": "Texte avec remplacements",
+ "searchPatternDescription": "Saisissez le modèle de texte que vous souhaitez remplacer.",
+ "searchText": "Texte de recherche",
+ "shortDescription": "Remplacez rapidement du texte dans votre contenu",
+ "title": "Remplaceur de texte",
+ "toolInfo": {
+ "description": "Remplacez facilement du texte spécifique dans votre contenu grâce à cet outil simple et accessible depuis un navigateur. Saisissez simplement votre texte, définissez le texte à remplacer et la valeur de remplacement, et obtenez instantanément la version mise à jour.",
+ "title": "Remplaceur de texte"
+ }
+ },
+ "toMorse": {
+ "dashSymbolDescription": "Symbole qui correspondra au tiret dans le code Morse.",
+ "description": "Convertir du texte en code Morse.",
+ "dotSymbolDescription": "Symbole qui correspondra au point dans le code Morse.",
+ "longSignal": "Signal long",
+ "resultTitle": "code Morse",
+ "shortDescription": "Encoder rapidement du texte en morse",
+ "shortSignal": "Signal court",
+ "title": "Chaîne en morse"
+ },
+ "truncate": {
+ "addTruncationIndicator": "Ajouter un indicateur de troncature",
+ "charactersPlaceholder": "Personnages",
+ "description": "Raccourcir le texte à une longueur spécifiée.",
+ "indicatorDescription": "Caractères à ajouter à la fin (ou au début) du texte. Remarque : ils sont pris en compte dans la longueur.",
+ "inputTitle": "Texte d'entrée",
+ "leftSideDescription": "Supprimer des caractères du début du texte.",
+ "leftSideTruncation": "Troncature du côté gauche",
+ "lengthAndLines": "Longueur et lignes",
+ "lineByLineDescription": "Tronquez chaque ligne séparément.",
+ "lineByLineTruncating": "Tronquer ligne par ligne",
+ "maxLengthDescription": "Nombre de caractères à laisser dans le texte.",
+ "numberPlaceholder": "Nombre",
+ "resultTitle": "Texte tronqué",
+ "rightSideDescription": "Supprimer les caractères de la fin du texte.",
+ "rightSideTruncation": "Troncature du côté droit",
+ "shortDescription": "Tronquer le texte à une longueur spécifiée",
+ "suffixAndAffix": "Suffixe et affixe",
+ "title": "Tronquer le texte",
+ "toolInfo": {
+ "description": "Chargez votre texte dans le formulaire de saisie à gauche et vous obtiendrez automatiquement du texte tronqué à droite.",
+ "title": "Tronquer le texte"
+ },
+ "truncationSide": "Côté troncature"
+ },
+ "uppercase": {
+ "description": "Convertir le texte en lettres majuscules.",
+ "inputTitle": "Texte d'entrée",
+ "resultTitle": "Texte en majuscules",
+ "shortDescription": "Convertir le texte en majuscules",
+ "title": "Convertir en majuscules"
+ }
+}
diff --git a/public/locales/fr/time.json b/public/locales/fr/time.json
new file mode 100644
index 0000000..e242426
--- /dev/null
+++ b/public/locales/fr/time.json
@@ -0,0 +1,100 @@
+{
+ "checkLeapYears": {
+ "description": "Vérifiez si une année est bissextile et obtenez des informations sur les années bissextiles.",
+ "inputTitle": "Année d'entrée",
+ "resultTitle": "Résultat de l'année bissextile",
+ "shortDescription": "Vérifiez si une année est bissextile",
+ "title": "Vérifiez les années bissextiles",
+ "toolInfo": {
+ "description": "Une année bissextile est une année comportant un jour supplémentaire (le 29 février) pour synchroniser l'année civile avec l'année astronomique. Les années bissextiles ont lieu tous les 4 ans, sauf pour les années divisibles par 100 mais pas par 400.",
+ "title": "Qu'est-ce qu'une année bissextile ?"
+ }
+ },
+ "convertDaysToHours": {
+ "addHoursName": "Ajouter le nom des heures",
+ "addHoursNameDescription": "Ajoutez la chaîne hours aux valeurs de sortie",
+ "description": "Convertissez les jours en heures avec des options personnalisables.",
+ "hoursName": "Nom des heures",
+ "shortDescription": "Convertir des jours en heures",
+ "title": "Convertir des jours en heures",
+ "toolInfo": {
+ "description": "Cet outil vous permet de convertir des jours en heures. Vous pouvez saisir les jours sous forme de nombres ou d'unités, et l'outil les convertira en heures. Vous pouvez également ajouter le suffixe « heures » aux valeurs de sortie.",
+ "title": "Convertir des jours en heures"
+ }
+ },
+ "convertHoursToDays": {
+ "addDaysName": "Ajouter le nom du jour",
+ "addDaysNameDescription": "Ajoutez la chaîne days aux valeurs de sortie",
+ "daysName": "Nom des jours",
+ "description": "Convertissez les heures en jours avec des options personnalisables.",
+ "shortDescription": "Convertir des heures en jours",
+ "title": "Convertir des heures en jours",
+ "toolInfo": {
+ "description": "Cet outil vous permet de convertir des heures en jours. Vous pouvez saisir des heures sous forme de nombres ou d'unités, et l'outil les convertira en jours. Vous pouvez également ajouter le suffixe « jours » aux valeurs de sortie.",
+ "title": "Convertir des heures en jours"
+ }
+ },
+ "convertSecondsToTime": {
+ "addPadding": "Ajouter un rembourrage",
+ "addPaddingDescription": "Ajoutez un remplissage de zéro aux heures, minutes et secondes.",
+ "description": "Convertissez les secondes dans un format horaire lisible (heures:minutes:secondes). Saisissez le nombre de secondes pour obtenir l'heure formatée.",
+ "shortDescription": "Convertir les secondes au format horaire",
+ "timePadding": "Remplissage temporel",
+ "title": "Convertir les secondes en temps",
+ "toolInfo": {
+ "title": "Qu'est-ce qu'un {{title}}?"
+ }
+ },
+ "convertTimeToSeconds": {
+ "description": "Convertissez l'heure formatée (HH:MM:SS) en secondes.",
+ "inputTitle": "Heure d'entrée",
+ "resultTitle": "Secondes",
+ "shortDescription": "Convertir le format de l'heure en secondes",
+ "title": "Convertir le temps en secondes",
+ "toolInfo": {
+ "description": "Cet outil permet de convertir des chaînes de temps formatées (HH:MM:SS) en secondes. Il est utile pour calculer des durées et des intervalles de temps.",
+ "title": "Convertir le temps en secondes"
+ }
+ },
+ "crontabGuru": {
+ "description": "Générez et comprenez les expressions Cron. Créez des planifications Cron pour les tâches automatisées et les tâches système.",
+ "shortDescription": "Générer et comprendre les expressions cron",
+ "title": "Crontab Guru"
+ },
+ "timeBetweenDates": {
+ "description": "Calculez le décalage horaire entre deux dates. Obtenez la durée exacte en jours, heures, minutes et secondes.",
+ "endDate": "Date de fin",
+ "endDateTime": "Date et heure de fin",
+ "endTime": "Fin des temps",
+ "endTimezone": "Fuseau horaire de fin",
+ "shortDescription": "Calculer le temps entre deux dates",
+ "startDate": "Date de début",
+ "startDateTime": "Date et heure de début",
+ "startTime": "Heure de début",
+ "startTimezone": "Fuseau horaire de départ",
+ "title": "Temps entre les dates",
+ "toolInfo": {
+ "description": "Calculez le décalage horaire exact entre deux dates et heures, avec la prise en charge de différents fuseaux horaires. Cet outil fournit une analyse détaillée du décalage horaire en différentes unités (années, mois, jours, heures, minutes et secondes).",
+ "title": "Calculateur de temps entre les dates"
+ }
+ },
+ "truncateClockTime": {
+ "description": "Tronquez l'heure pour supprimer les secondes ou les minutes. Arrondissez l'heure à l'heure, à la minute ou à l'intervalle personnalisé le plus proche.",
+ "printDroppedComponents": "Imprimer les composants supprimés",
+ "shortDescription": "Tronquer l'heure de l'horloge à la précision spécifiée",
+ "timePadding": "Remplissage temporel",
+ "title": "Tronquer l'heure de l'horloge",
+ "toolInfo": {
+ "title": "Qu'est-ce qu'un {{title}}?"
+ },
+ "truncateMinutesAndSeconds": "Tronquer les minutes et les secondes",
+ "truncateMinutesAndSecondsDescription": "Supprimez les deux composants – les minutes et les secondes – de chaque heure d’horloge.",
+ "truncateOnlySeconds": "Tronquer uniquement les secondes",
+ "truncateOnlySecondsDescription": "Supprimez le composant secondes de chaque heure d'horloge.",
+ "truncationSide": "Côté troncature",
+ "useZeroPadding": "Utiliser le remplissage zéro",
+ "zeroPaddingDescription": "Faites en sorte que tous les composants de temps aient toujours une largeur de deux chiffres.",
+ "zeroPrintDescription": "Afficher les parties supprimées sous forme de valeurs nulles « 00 ».",
+ "zeroPrintTruncatedParts": "Parties tronquées sans impression"
+ }
+}
diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json
new file mode 100644
index 0000000..3257c16
--- /dev/null
+++ b/public/locales/fr/translation.json
@@ -0,0 +1,250 @@
+{
+ "audio": {
+ "changeSpeed": {
+ "description": "Modifier la vitesse de lecture des fichiers audio. Accélérer ou ralentir le son tout en conservant la hauteur.",
+ "name": "Changer la vitesse audio",
+ "shortDescription": "Modifier la vitesse des fichiers audio"
+ },
+ "extractAudio": {
+ "description": "Extrayez la piste audio d'un fichier vidéo et enregistrez-la en tant que fichier audio séparé dans le format de votre choix (AAC, MP3, WAV).",
+ "name": "Extraire l'audio",
+ "shortDescription": "Extrayez l'audio des fichiers vidéo (MP4, MOV, etc.) vers AAC, MP3 ou WAV."
+ }
+ },
+ "baseFileInput": {
+ "copyFailed": "Échec de la copie : {{error}}",
+ "dropFileHere": "Déposez votre {{type}} ici",
+ "fileCopied": "Fichier copié",
+ "selectFileDescription": "Cliquez ici pour sélectionner un {{type}} depuis votre appareil, appuyez sur Ctrl+V pour utiliser un {{type}} depuis votre presse-papiers ou faites glisser et déposez un fichier depuis le bureau"
+ },
+ "categories": {
+ "audio": {
+ "description": "Outils pour travailler avec l'audio : extraire l'audio d'une vidéo, ajuster la vitesse de l'audio, fusionner plusieurs fichiers audio et bien plus encore.",
+ "title": "Outils audio"
+ },
+ "csv": {
+ "description": "Outils pour travailler avec des fichiers CSV : convertissez des fichiers CSV en différents formats, manipulez les données CSV, validez la structure CSV et traitez efficacement les fichiers CSV.",
+ "title": "Outils CSV"
+ },
+ "gif": {
+ "description": "Outils pour travailler avec des animations GIF : créez des GIF transparents, extrayez des cadres GIF, ajoutez du texte au GIF, recadrez, faites pivoter, inversez les GIF et bien plus encore.",
+ "title": "Outils GIF"
+ },
+ "image-generic": {
+ "description": "Outils pour travailler avec des images : compresser, redimensionner, recadrer, convertir en JPG, faire pivoter, supprimer l'arrière-plan et bien plus encore.",
+ "title": "Outils d'image"
+ },
+ "json": {
+ "description": "Outils pour travailler avec des structures de données JSON : embellir et minimiser des objets JSON, aplatir des tableaux JSON, transformer des valeurs JSON en chaînes, analyser des données et bien plus encore",
+ "title": "Outils JSON"
+ },
+ "list": {
+ "description": "Outils pour travailler avec des listes : trier, inverser, randomiser les listes, trouver des éléments de liste uniques et en double, modifier les séparateurs d'éléments de liste et bien plus encore.",
+ "title": "Liste des outils"
+ },
+ "number": {
+ "description": "Outils pour travailler avec des nombres : générer des séquences de nombres, convertir des nombres en mots et des mots en nombres, trier, arrondir, factoriser des nombres et bien plus encore.",
+ "title": "Outils numériques"
+ },
+ "pdf": {
+ "description": "Outils pour travailler avec des fichiers PDF : extraire du texte à partir de PDF, convertir des PDF en d'autres formats, manipuler des PDF et bien plus encore.",
+ "title": "Outils PDF"
+ },
+ "png": {
+ "description": "Outils pour travailler avec des images PNG : convertissez des PNG en JPG, créez des PNG transparents, modifiez les couleurs PNG, recadrez, faites pivoter, redimensionnez des PNG et bien plus encore.",
+ "title": "Outils PNG"
+ },
+ "seeAll": "Voir les {{title}}",
+ "string": {
+ "description": "Outils pour travailler avec du texte : convertissez du texte en images, recherchez et remplacez du texte, divisez du texte en fragments, joignez des lignes de texte, répétez du texte et bien plus encore.",
+ "title": "Outils de texte"
+ },
+ "time": {
+ "description": "Outils pour travailler avec l'heure et la date : calculez les différences horaires, convertissez entre les fuseaux horaires, formatez les dates, générez des séquences de dates et bien plus encore.",
+ "title": "Outils de temps"
+ },
+ "try": "Essayer {{title}}",
+ "video": {
+ "description": "Outils pour travailler avec des vidéos : extraire des images de vidéos, créer des GIF à partir de vidéos, convertir des vidéos en différents formats et bien plus encore.",
+ "title": "Outils vidéo"
+ },
+ "xml": {
+ "description": "Outils pour travailler avec des structures de données XML - visualiseur, embellisseur, validateur et bien plus encore",
+ "title": "Outils XML"
+ }
+ },
+ "csv": {
+ "findIncompleteCsvRecords": {
+ "description": "Il vous suffit de télécharger votre fichier CSV dans le formulaire ci-dessous et cet outil vérifiera automatiquement qu'aucune ligne ou colonne ne contient de valeur manquante. Dans les options de l'outil, vous pouvez ajuster le format du fichier d'entrée (spécifier le délimiteur, les guillemets et les commentaires). De plus, vous pouvez activer la vérification des valeurs vides, ignorer les lignes vides et limiter le nombre de messages d'erreur dans la sortie.",
+ "name": "Rechercher des enregistrements CSV incomplets",
+ "shortDescription": "Trouvez rapidement les lignes et les colonnes dans CSV auxquelles il manque des valeurs."
+ }
+ },
+ "hero": {
+ "brand": "OmniTools",
+ "description": "Boostez votre productivité avec OmniTools, la boîte à outils ultime pour accélérer vos tâches ! Accédez à des milliers d'utilitaires conviviaux pour modifier des images, du texte, des listes et des données, directement depuis votre navigateur.",
+ "examples": {
+ "calculateNumberSum": "Calculer la somme des nombres",
+ "changeGifSpeed": "Modifier la vitesse du GIF",
+ "compressPng": "Compresser PNG",
+ "createTransparentImage": "Créer une image transparente",
+ "prettifyJson": "Embellir JSON",
+ "sortList": "Trier une liste",
+ "splitPdf": "Diviser le PDF",
+ "splitText": "Diviser un texte",
+ "trimVideo": "Découper la vidéo"
+ },
+ "searchPlaceholder": "Rechercher tous les outils",
+ "title": "Faites avancer les choses rapidement avec"
+ },
+ "inputFooter": {
+ "clear": "Clair",
+ "copyToClipboard": "Copier dans le presse-papiers",
+ "importFromFile": "Importer à partir d'un fichier"
+ },
+ "list": {
+ "group": {
+ "description": "L'utilitaire de regroupement d'éléments de liste le plus simple au monde, accessible depuis un navigateur. Saisissez votre liste et spécifiez des critères de regroupement pour organiser les éléments en groupes logiques. Idéal pour catégoriser des données, organiser des informations ou créer des listes structurées. Prend en charge les séparateurs personnalisés et diverses options de regroupement.",
+ "name": "Groupe",
+ "shortDescription": "Regrouper les éléments de la liste par propriétés communes"
+ },
+ "reverse": {
+ "description": "Cette application très simple, basée sur un navigateur, imprime tous les éléments d'une liste à l'envers. Les éléments saisis peuvent être séparés par n'importe quel symbole et vous pouvez également modifier le séparateur des éléments inversés.",
+ "name": "Inverse",
+ "shortDescription": "Inverser rapidement une liste"
+ },
+ "sort": {
+ "description": "Il s'agit d'une application navigateur ultra-simple qui trie les éléments d'une liste et les organise par ordre croissant ou décroissant. Vous pouvez trier les éléments par ordre alphabétique, numérique ou par longueur. Vous pouvez également supprimer les doublons et les éléments vides, ainsi que les éléments individuels entourés d'espaces. Vous pouvez utiliser n'importe quel caractère séparateur pour séparer les éléments de la liste d'entrée ou une expression régulière. De plus, vous pouvez créer un nouveau délimiteur pour la liste de sortie triée.",
+ "name": "Trier",
+ "shortDescription": "Trier rapidement une liste"
+ }
+ },
+ "navbar": {
+ "buyMeACoffee": "Offre-moi un café",
+ "home": "Maison",
+ "tools": "Outils"
+ },
+ "number": {
+ "generate": {
+ "description": "Calculez rapidement une liste d'entiers dans votre navigateur. Pour obtenir votre liste, indiquez simplement le premier entier, modifiez la valeur et le nombre total dans les options ci-dessous, et cet utilitaire générera le nombre d'entiers correspondant.",
+ "name": "Générer des nombres",
+ "shortDescription": "Calculez rapidement une liste d'entiers dans votre navigateur"
+ },
+ "sum": {
+ "description": "Il s'agit d'une application très simple, accessible depuis un navigateur, qui additionne des nombres. Les nombres saisis peuvent être séparés par n'importe quel symbole et vous pouvez également modifier le séparateur des nombres additionnés.",
+ "name": "Somme des nombres",
+ "shortDescription": "Additionner rapidement une liste de nombres"
+ }
+ },
+ "numericInputWithUnit": {
+ "unit": "Unité"
+ },
+ "pdf": {
+ "compressPdf": {
+ "description": "Réduire la taille des fichiers PDF tout en maintenant la qualité grâce à Ghostscript",
+ "name": "Compresser le PDF",
+ "shortDescription": "Compresser des fichiers PDF en toute sécurité dans votre navigateur"
+ },
+ "mergePdf": {
+ "description": "Comment utiliser l'outil Fusionner PDF ?",
+ "name": "Fusionner des PDF",
+ "shortDescription": "Fusionner plusieurs fichiers PDF en un seul document"
+ },
+ "pdfToEpub": {
+ "description": "Transformez les documents PDF en fichiers EPUB pour une meilleure compatibilité avec les liseuses.",
+ "name": "PDF vers EPUB",
+ "shortDescription": "Convertir des fichiers PDF au format EPUB"
+ },
+ "protectPdf": {
+ "description": "Ajoutez une protection par mot de passe à vos fichiers PDF en toute sécurité dans votre navigateur",
+ "name": "Protéger le PDF",
+ "shortDescription": "Protégez les fichiers PDF en toute sécurité avec un mot de passe"
+ },
+ "splitPdf": {
+ "description": "Extraire des pages spécifiques d'un fichier PDF à l'aide de numéros de page ou de plages (par exemple, 1, 5-8)",
+ "name": "Diviser le PDF",
+ "shortDescription": "Extraire des pages spécifiques d'un fichier PDF"
+ }
+ },
+ "resultFooter": {
+ "copy": "Copier dans le presse-papiers",
+ "download": "Télécharger"
+ },
+ "string": {
+ "createPalindrome": {
+ "description": "L'utilitaire de navigateur le plus simple au monde pour créer des palindromes à partir de n'importe quel texte. Saisissez du texte et transformez-le instantanément en un palindrome qui se lit de la même manière à l'endroit comme à l'envers. Idéal pour les jeux de mots, la création de motifs de texte symétriques ou l'exploration de curiosités linguistiques.",
+ "name": "Créer un palindrome",
+ "shortDescription": "Créez un texte qui se lit de la même manière à l'avant et à l'arrière"
+ },
+ "palindrome": {
+ "description": "L'utilitaire le plus simple au monde, basé sur un navigateur, permet de vérifier si un texte est un palindrome. Vérifiez instantanément si votre texte se lit de la même manière à l'endroit comme à l'envers. Idéal pour les jeux de mots, l'analyse linguistique ou la validation de structures de texte symétriques. Prend en charge divers délimiteurs et la détection de palindromes multi-mots.",
+ "name": "Palindrome",
+ "shortDescription": "Vérifiez si le texte se lit de la même manière à l'avant et à l'arrière"
+ },
+ "repeat": {
+ "description": "Cet outil vous permet de répéter un texte donné plusieurs fois avec un séparateur optionnel.",
+ "name": "Répéter le texte",
+ "shortDescription": "Répéter le texte plusieurs fois"
+ },
+ "reverse": {
+ "description": "L'utilitaire d'inversion de texte le plus simple au monde, basé sur un navigateur. Saisissez n'importe quel texte et inversez-le instantanément, caractère par caractère. Idéal pour créer du texte miroir, analyser des palindromes ou jouer avec les motifs de texte. Préserve les espaces et les caractères spéciaux lors de l'inversion.",
+ "name": "Inverse",
+ "shortDescription": "Inverser n'importe quel texte caractère par caractère"
+ },
+ "toMorse": {
+ "description": "L'utilitaire de conversion de texte en code Morse le plus simple au monde, accessible depuis un navigateur. Chargez votre texte dans le formulaire de saisie à gauche et obtenez instantanément le code Morse dans la zone de sortie. Puissant, gratuit et rapide. Chargez du texte et obtenez le code Morse.",
+ "name": "Chaîne en morse",
+ "shortDescription": "Encoder rapidement du texte en morse"
+ },
+ "uppercase": {
+ "description": "L'utilitaire de conversion de texte en majuscules le plus simple au monde, accessible depuis un navigateur. Saisissez simplement votre texte et il sera automatiquement converti en majuscules. Idéal pour créer des titres, mettre en valeur du texte ou standardiser son format. Prend en charge divers formats de texte et préserve les caractères spéciaux.",
+ "name": "Majuscule",
+ "shortDescription": "Convertir le texte en lettres majuscules"
+ }
+ },
+ "toolExamples": {
+ "subtitle": "Cliquez pour essayer !",
+ "title": "{{title}} Exemples"
+ },
+ "toolFileResult": {
+ "copied": "Fichier copié",
+ "copyFailed": "Échec de la copie : {{error}}",
+ "loading": "Chargement... Cela peut prendre un moment.",
+ "result": "Résultat"
+ },
+ "toolHeader": {
+ "seeExamples": "Voir des exemples"
+ },
+ "toolLayout": {
+ "allToolsTitle": "Tous les {{type}}"
+ },
+ "toolMultiFileResult": {
+ "copied": "Fichier copié",
+ "copyFailed": "Échec de la copie : {{error}}",
+ "loading": "Chargement... Cela peut prendre un moment.",
+ "result": "Résultat"
+ },
+ "toolMultipleAudioInput": {
+ "inputTitle": "Saisir {{type}}",
+ "noFilesSelected": "Aucun fichier sélectionné"
+ },
+ "toolMultiplePdfInput": {
+ "inputTitle": "Saisir {{type}}",
+ "noFilesSelected": "Aucun fichier sélectionné"
+ },
+ "toolOptions": {
+ "title": "Options d'outils"
+ },
+ "toolTextInput": {
+ "copied": "Texte copié",
+ "copyFailed": "Échec de la copie : {{error}}",
+ "input": "Texte d'entrée",
+ "placeholder": "Entrez votre texte ici..."
+ },
+ "toolTextResult": {
+ "copied": "Texte copié",
+ "copyFailed": "Échec de la copie : {{error}}",
+ "loading": "Chargement... Cela peut prendre un moment.",
+ "result": "Résultat"
+ }
+}
diff --git a/public/locales/fr/video.json b/public/locales/fr/video.json
new file mode 100644
index 0000000..1bbc576
--- /dev/null
+++ b/public/locales/fr/video.json
@@ -0,0 +1,113 @@
+{
+ "changeSpeed": {
+ "defaultMultiplier": "Multiplicateur par défaut : 2 signifie 2x plus rapide",
+ "description": "Modifiez la vitesse de lecture des fichiers vidéo. Accélérez ou ralentissez les vidéos tout en conservant la synchronisation audio. Prise en charge de divers multiplicateurs de vitesse et formats vidéo courants.",
+ "inputTitle": "Entrée vidéo",
+ "newVideoSpeed": "Nouvelle vitesse vidéo",
+ "resultTitle": "Vidéo éditée",
+ "settingSpeed": "Réglage de la vitesse",
+ "shortDescription": "Modifier la vitesse de lecture vidéo",
+ "title": "Modifier la vitesse de la vidéo",
+ "toolInfo": {
+ "title": "Qu'est-ce qu'un {{title}}?"
+ }
+ },
+ "compress": {
+ "default": "Défaut",
+ "description": "Compressez vos vidéos en les adaptant à différentes résolutions (240p, 480p, 720p, etc.). Cet outil permet de réduire la taille des fichiers tout en conservant une qualité acceptable. Il prend en charge les formats vidéo courants comme MP4, WebM et OGG.",
+ "inputTitle": "Entrée vidéo",
+ "loadingText": "Compression vidéo...",
+ "lossless": "Sans perte",
+ "quality": "Qualité (CRF)",
+ "resolution": "Résolution",
+ "resultTitle": "Vidéo compressée",
+ "shortDescription": "Compresser des vidéos en les mettant à l'échelle vers différentes résolutions",
+ "title": "Compresser la vidéo",
+ "worst": "Pire"
+ },
+ "cropVideo": {
+ "cropCoordinates": "Coordonnées de culture",
+ "croppingVideo": "Recadrage vidéo",
+ "description": "Recadrez la vidéo pour supprimer les zones indésirables.",
+ "errorBeyondHeight": "La zone de recadrage s'étend au-delà de la hauteur de la vidéo ({{height}}px)",
+ "errorBeyondWidth": "La zone de recadrage s'étend au-delà de la largeur de la vidéo ({{width}}px)",
+ "errorCroppingVideo": "Erreur lors du recadrage de la vidéo. Veuillez vérifier les paramètres et le fichier vidéo.",
+ "errorLoadingDimensions": "Échec du chargement des dimensions de la vidéo",
+ "errorNonNegativeCoordinates": "Les coordonnées X et Y doivent être non négatives",
+ "errorPositiveDimensions": "La largeur et la hauteur doivent être positives",
+ "height": "Hauteur",
+ "inputTitle": "Entrée vidéo",
+ "loadVideoForDimensions": "Chargez une vidéo pour voir les dimensions",
+ "resultTitle": "Vidéo recadrée",
+ "shortDescription": "Recadrer la vidéo pour supprimer les zones indésirables",
+ "title": "Recadrer la vidéo",
+ "toolInfo": {
+ "description": "Cet outil vous permet de recadrer des fichiers vidéo afin de supprimer les zones indésirables. Vous pouvez spécifier la zone de recadrage en définissant les coordonnées X et Y, ainsi que les dimensions de largeur et de hauteur.",
+ "title": "Recadrer la vidéo"
+ },
+ "videoDimensions": "Dimensions de la vidéo : {{width}} × {{height}} pixels",
+ "videoInformation": "Informations vidéo",
+ "width": "Largeur",
+ "xCoordinate": "X (gauche)",
+ "yCoordinate": "Y (en haut)"
+ },
+ "flip": {
+ "description": "Retournez les fichiers vidéo horizontalement ou verticalement. Inversez les vidéos pour obtenir des effets spéciaux ou corriger les problèmes d'orientation.",
+ "flippingVideo": "Retournement vidéo",
+ "horizontalLabel": "Horizontal (miroir)",
+ "inputTitle": "Entrée vidéo",
+ "orientation": "Orientation",
+ "resultTitle": "Vidéo inversée",
+ "shortDescription": "Retourner la vidéo horizontalement ou verticalement",
+ "title": "Retourner la vidéo",
+ "verticalLabel": "Vertical (à l'envers)"
+ },
+ "gif": {
+ "changeSpeed": {
+ "description": "Modifiez la vitesse de lecture des animations GIF. Accélérez ou ralentissez les GIF tout en conservant une animation fluide.",
+ "shortDescription": "Modifier la vitesse de l'animation GIF",
+ "title": "Modifier la vitesse du GIF"
+ }
+ },
+ "loop": {
+ "description": "Créez une vidéo en boucle en répétant la vidéo originale plusieurs fois.",
+ "inputTitle": "Entrée vidéo",
+ "loopingVideo": "Vidéo en boucle",
+ "loops": "Boucles",
+ "numberOfLoops": "Nombre de boucles",
+ "resultTitle": "Vidéo en boucle",
+ "shortDescription": "Créer des fichiers vidéo en boucle",
+ "title": "Vidéo en boucle",
+ "toolInfo": {
+ "description": "Cet outil vous permet de créer une vidéo en boucle en répétant la vidéo originale plusieurs fois. Vous pouvez spécifier le nombre de répétitions.",
+ "title": "Qu'est-ce qu'un {{title}}?"
+ }
+ },
+ "rotate": {
+ "180Degrees": "180° (à l'envers)",
+ "270Degrees": "270° (90° dans le sens inverse des aiguilles d'une montre)",
+ "90Degrees": "90° dans le sens des aiguilles d'une montre",
+ "description": "Faites pivoter vos fichiers vidéo de 90, 180 ou 270 degrés. Corrigez l'orientation de vos vidéos ou créez des effets spéciaux grâce à un contrôle précis de la rotation.",
+ "inputTitle": "Entrée vidéo",
+ "resultTitle": "Vidéo tournée",
+ "rotatingVideo": "Vidéo rotative",
+ "rotation": "Rotation",
+ "shortDescription": "Faire pivoter la vidéo selon les degrés spécifiés",
+ "title": "Faire pivoter la vidéo"
+ },
+ "trim": {
+ "description": "Découpez vos fichiers vidéo en spécifiant les heures de début et de fin. Supprimez les sections indésirables au début ou à la fin de vos vidéos.",
+ "endTime": "Fin des temps",
+ "inputTitle": "Entrée vidéo",
+ "resultTitle": "Vidéo coupée",
+ "shortDescription": "Coupez la vidéo en supprimant les sections indésirables",
+ "startTime": "Heure de début",
+ "timestamps": "Horodatages",
+ "title": "Découper la vidéo"
+ },
+ "videoToGif": {
+ "description": "Convertissez des fichiers vidéo au format GIF animé. Extrayez des plages horaires spécifiques et créez des images animées partageables.",
+ "shortDescription": "Convertir une vidéo en GIF animé",
+ "title": "Vidéo en GIF"
+ }
+}
diff --git a/public/locales/fr/xml.json b/public/locales/fr/xml.json
new file mode 100644
index 0000000..0bc1a78
--- /dev/null
+++ b/public/locales/fr/xml.json
@@ -0,0 +1,38 @@
+{
+ "xmlBeautifier": {
+ "description": "Formater XML avec une indentation et un espacement appropriés.",
+ "indentation": "Indentation",
+ "inputTitle": "XML d'entrée",
+ "resultTitle": "XML embelli",
+ "shortDescription": "Formater et embellir le code XML",
+ "title": "Embellisseur XML",
+ "toolInfo": {
+ "description": "Cet outil vous permet de formater les données XML avec une indentation et un espacement appropriés, les rendant plus lisibles et plus faciles à utiliser.",
+ "title": "Embellisseur XML"
+ },
+ "useSpaces": "Utiliser les espaces",
+ "useSpacesDescription": "Indenter la sortie avec des espaces",
+ "useTabs": "Utiliser les onglets",
+ "useTabsDescription": "Indenter la sortie avec des tabulations."
+ },
+ "xmlValidator": {
+ "description": "Valider la syntaxe et la structure XML.",
+ "placeholder": "Collez ou importez du XML ici...",
+ "shortDescription": "Valider le code XML pour les erreurs",
+ "title": "Validateur XML",
+ "toolInfo": {
+ "description": "Cet outil vous permet de valider la syntaxe et la structure XML. Il vérifie la bonne formation du XML et fournit des messages d'erreur détaillés pour tout problème détecté.",
+ "title": "Validateur XML"
+ }
+ },
+ "xmlViewer": {
+ "description": "Afficher et explorer la structure XML dans un format arborescent.",
+ "inputTitle": "XML d'entrée",
+ "resultTitle": "Vue arborescente du XML",
+ "title": "Visionneuse XML",
+ "toolInfo": {
+ "description": "Cet outil vous permet de visualiser les données XML dans un format d'arborescence hiérarchique, ce qui facilite l'exploration et la compréhension de la structure des documents XML.",
+ "title": "Visionneuse XML"
+ }
+ }
+}
diff --git a/public/locales/hi/audio.json b/public/locales/hi/audio.json
new file mode 100644
index 0000000..c279909
--- /dev/null
+++ b/public/locales/hi/audio.json
@@ -0,0 +1,83 @@
+{
+ "changeSpeed": {
+ "description": "ऑडियो फ़ाइलों की प्लेबैक गति बदलें।",
+ "factorPlaceholder": "कारक (जैसे 0.5, 1.5, 2.0)",
+ "formatAac": "AAC",
+ "formatMp3": "MP3",
+ "formatWav": "WAV",
+ "inputTitle": "इनपुट ऑडियो",
+ "newAudioSpeed": "नई ऑडियो गति",
+ "outputFormat": "आउटपुट प्रारूप",
+ "preservePitch": "पिच संरक्षित करें",
+ "resultTitle": "गति बदली गई ऑडियो",
+ "settingSpeed": "गति सेट करना",
+ "shortDescription": "ऑडियो फ़ाइलों की गति बदलें",
+ "speedDescription": "डिफ़ॉल्ट गुणक: 2 का अर्थ है 2x तेज़",
+ "speedFactor": "गति कारक",
+ "speedOptions": "गति विकल्प",
+ "title": "ऑडियो गति बदलें",
+ "toolInfo": {
+ "title": "क्या है {{title}}?"
+ }
+ },
+ "extractAudio": {
+ "audioFormat": "ऑडियो प्रारूप",
+ "audioQuality": "ऑडियो गुणवत्ता",
+ "description": "वीडियो फ़ाइल से ऑडियो ट्रैक निकालें।",
+ "extractAllTracks": "सभी ट्रैक निकालें",
+ "extractingAudio": "ऑडियो निकालना",
+ "extractionOptions": "निकालने के विकल्प",
+ "formatAac": "AAC",
+ "formatMp3": "MP3",
+ "formatWav": "WAV",
+ "inputTitle": "इनपुट वीडियो",
+ "outputFormat": "आउटपुट प्रारूप",
+ "outputFormatDescription": "निकाले जाने वाले ऑडियो के लिए प्रारूप का चयन करें।",
+ "qualityHigh": "उच्च",
+ "qualityLow": "कम",
+ "qualityMedium": "मध्यम",
+ "resultTitle": "निकाला गया ऑडियो",
+ "shortDescription": "वीडियो फ़ाइलों (एमपी4, एमओवी, आदि) से ऑडियो निकालें एएसी, एमपी3, या डब्ल्यूएवी में।",
+ "title": "ऑडियो निकालें",
+ "toolInfo": {
+ "description": "यह टूल आपको वीडियो फ़ाइलों से ऑडियो ट्रैक निकालने की सुविधा देता है। आप AAC, MP3 और WAV सहित विभिन्न ऑडियो फ़ॉर्मेट में से चुन सकते हैं।",
+ "title": "क्या है {{title}}?"
+ }
+ },
+ "mergeAudio": {
+ "description": "कई ऑडियो फ़ाइलों को एक में जोड़ें।",
+ "formatAac": "AAC",
+ "formatMp3": "MP3",
+ "formatWav": "WAV",
+ "inputTitle": "इनपुट ऑडियो फ़ाइलें",
+ "longDescription": "यह टूल आपको कई ऑडियो फ़ाइलों को अपलोड करने के क्रम में जोड़कर उन्हें एक ही फ़ाइल में मर्ज करने की सुविधा देता है। पॉडकास्ट सेगमेंट, म्यूज़िक ट्रैक या किसी भी ऑडियो फ़ाइल को एक साथ जोड़ने के लिए यह बिल्कुल सही है। MP3, AAC और WAV सहित विभिन्न ऑडियो फ़ॉर्मेट को सपोर्ट करता है।",
+ "mergeMethod": "मर्ज विधि",
+ "mergeOptions": "मर्ज विकल्प",
+ "methodConcat": "क्रमबद्ध जोड़ना",
+ "methodMix": "मिश्रण",
+ "outputFormat": "आउटपुट प्रारूप",
+ "resultTitle": "मर्ज किया गया ऑडियो",
+ "shortDescription": "एकाधिक ऑडियो फ़ाइलों को एक में मर्ज करें (MP3, AAC, WAV)।",
+ "title": "ऑडियो मर्ज करें"
+ },
+ "trim": {
+ "description": "ऑडियो फ़ाइल से अनावश्यक भाग हटाएं।",
+ "endPlaceholder": "सेकंड",
+ "endTime": "अंतिम समय",
+ "fadeIn": "फेड इन",
+ "fadeInPlaceholder": "सेकंड",
+ "fadeOut": "फेड आउट",
+ "fadeOutPlaceholder": "सेकंड",
+ "formatMp3": "MP3",
+ "formatWav": "WAV",
+ "inputTitle": "इनपुट ऑडियो",
+ "longDescription": "यह टूल आपको ऑडियो फ़ाइलों को शुरू और खत्म होने का समय निर्दिष्ट करके ट्रिम करने की सुविधा देता है। आप लंबी ऑडियो फ़ाइलों से विशिष्ट खंड निकाल सकते हैं, अवांछित हिस्से हटा सकते हैं, या छोटी क्लिप बना सकते हैं। MP3, AAC, और WAV सहित विभिन्न ऑडियो फ़ॉर्मेट को सपोर्ट करता है। पॉडकास्ट एडिटिंग, म्यूज़िक प्रोडक्शन, या किसी भी ऑडियो एडिटिंग ज़रूरत के लिए बिल्कुल सही।",
+ "outputFormat": "आउटपुट प्रारूप",
+ "resultTitle": "ट्रिम किया गया ऑडियो",
+ "shortDescription": "विशिष्ट समय खंडों (MP3, AAC, WAV) को निकालने के लिए ऑडियो फ़ाइलों को ट्रिम करें।",
+ "startPlaceholder": "सेकंड",
+ "startTime": "शुरुआती समय",
+ "title": "ऑडियो ट्रिम करें",
+ "trimOptions": "ट्रिम विकल्प"
+ }
+}
diff --git a/public/locales/hi/csv.json b/public/locales/hi/csv.json
new file mode 100644
index 0000000..6b559ca
--- /dev/null
+++ b/public/locales/hi/csv.json
@@ -0,0 +1,212 @@
+{
+ "changeCsvSeparator": {
+ "description": "CSV फ़ाइलों में सीमांकक/विभाजक बदलें। विभिन्न CSV प्रारूपों जैसे अल्पविराम, अर्धविराम, टैब या कस्टम विभाजकों के बीच रूपांतरण करें।",
+ "shortDescription": "CSV फ़ाइल सीमांकक बदलें",
+ "title": "CSV विभाजक बदलें"
+ },
+ "changeSeparator": {
+ "comma": "कॉमा",
+ "commonSeparators": "सामान्य विभाजक",
+ "description": "CSV फ़ाइल में विभाजक वर्ण बदलें।",
+ "inputSeparator": "इनपुट विभाजक",
+ "inputSeparatorPlaceholder": "विभाजक",
+ "inputTitle": "इनपुट CSV",
+ "outputSeparator": "आउटपुट विभाजक",
+ "outputSeparatorPlaceholder": "विभाजक",
+ "pipe": "पाइप",
+ "resultTitle": "परिवर्तित CSV",
+ "semicolon": "सेमीकोलन",
+ "separatorOptions": "विभाजक विकल्प",
+ "tab": "टैब",
+ "title": "CSV विभाजक बदलें"
+ },
+ "csvRowsToColumns": {
+ "description": "यह टूल CSV (कॉमा सेपरेटेड वैल्यूज़) फ़ाइल की पंक्तियों को कॉलम में परिवर्तित करता है। यह इनपुट CSV से क्षैतिज रेखाओं को एक-एक करके निकालता है, उन्हें 90 डिग्री घुमाता है, और उन्हें कॉमा द्वारा अलग किए गए एक के बाद एक लंबवत कॉलम के रूप में आउटपुट करता है।', longDescription: 'यह टूल CSV (कॉमा सेपरेटेड वैल्यूज़) फ़ाइल की पंक्तियों को कॉलम में परिवर्तित करता है। उदाहरण के लिए, यदि इनपुट CSV डेटा में 6 पंक्तियाँ हैं, तो आउटपुट में भी 6 कॉलम होंगे और पंक्तियों के तत्व ऊपर से नीचे की ओर व्यवस्थित होंगे। एक सुव्यवस्थित CSV में, प्रत्येक पंक्ति में मानों की संख्या समान होती है। हालाँकि, यदि पंक्तियों में फ़ील्ड गायब हैं, तो प्रोग्राम उन्हें ठीक कर सकता है और आप उपलब्ध विकल्पों में से चुन सकते हैं: गायब डेटा को खाली तत्वों से भरें या गायब डेटा को कस्टम तत्वों, जैसे \"missing\", \"?\", या \"x\" से बदलें। रूपांतरण प्रक्रिया के दौरान, यह टूल CSV फ़ाइल से अनावश्यक जानकारी, जैसे खाली पंक्तियाँ (ये दृश्यमान जानकारी रहित पंक्तियाँ हैं) और टिप्पणियाँ, भी साफ़ करता है। टूल को टिप्पणियों की सही पहचान करने में मदद करने के लिए, विकल्पों में, आप टिप्पणी शुरू करने वाली पंक्ति की शुरुआत में प्रतीक निर्दिष्ट कर सकते हैं। यह प्रतीक आमतौर पर एक हैश \"#\" या डबल स्लैश \"//\" होता है। Csv-abulous!.",
+ "longDescription": "यह टूल CSV (कॉमा सेपरेटेड वैल्यूज़) फ़ाइल की पंक्तियों को कॉलम में बदलता है। उदाहरण के लिए, यदि इनपुट CSV डेटा में 6 पंक्तियाँ हैं, तो आउटपुट में भी 6 कॉलम होंगे और पंक्तियों के तत्व ऊपर से नीचे की ओर व्यवस्थित होंगे। एक सुव्यवस्थित CSV में, प्रत्येक पंक्ति में मानों की संख्या समान होती है। हालाँकि, जब पंक्तियों में फ़ील्ड गायब हों, तो प्रोग्राम उन्हें ठीक कर सकता है और आप उपलब्ध विकल्पों में से चुन सकते हैं: खाली तत्वों से गायब डेटा भरें या कस्टम तत्वों से गायब डेटा को बदलें, जैसे",
+ "shortDescription": "CSV पंक्तियों को स्तंभों में परिवर्तित करें.",
+ "title": "CSV पंक्तियों को स्तंभों में परिवर्तित करें"
+ },
+ "csvToJson": {
+ "arrayFormat": "सरणी प्रारूप",
+ "columnSeparator": "स्तंभ विभाजक (उदाहरणार्थ, , ; \\t)",
+ "commentSymbol": "टिप्पणी प्रतीक (उदाहरणार्थ, #)",
+ "conversionOptions": "रूपांतरण विकल्प",
+ "description": "CSV डेटा को JSON प्रारूप में बदलें।",
+ "dynamicTypes": "गतिशील प्रकार",
+ "dynamicTypesDescription": "संख्याओं और बूलियन को स्वचालित रूप से परिवर्तित करें",
+ "errorParsing": "CSV पार्स करने में त्रुटि: {{error}}",
+ "fieldQuote": "फ़ील्ड उद्धरण (उदाहरणार्थ, \")",
+ "firstRowAsHeaders": "पहली पंक्ति शीर्षक के रूप में",
+ "includeHeaders": "शीर्षक शामिल करें",
+ "inputCsvFormat": "इनपुट CSV प्रारूप",
+ "inputTitle": "इनपुट CSV",
+ "objectFormat": "ऑब्जेक्ट प्रारूप",
+ "outputFormat": "आउटपुट प्रारूप",
+ "resultTitle": "JSON परिणाम",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "CSV डेटा को JSON प्रारूप में परिवर्तित करें.",
+ "skipEmptyLines": "खाली लाइनें छोड़ें",
+ "skipEmptyLinesDescription": "इनपुट CSV में रिक्त पंक्तियों को अनदेखा करें",
+ "title": "CSV से JSON",
+ "useHeaders": "हेडर का उपयोग करें",
+ "useHeadersDescription": "पहली पंक्ति को स्तंभ शीर्षक के रूप में मानें"
+ },
+ "csvToTsv": {
+ "conversionOptions": "रूपांतरण विकल्प",
+ "description": "CSV फ़ाइल को TSV प्रारूप में बदलें।",
+ "inputSeparator": "इनपुट विभाजक",
+ "inputSeparatorPlaceholder": "विभाजक",
+ "inputTitle": "इनपुट CSV",
+ "longDescription": "यह टूल कॉमा सेपरेटेड वैल्यूज़ (CSV) डेटा को टैब सेपरेटेड वैल्यूज़ (TSV) डेटा में बदल देता है। CSV और TSV दोनों ही सारणीबद्ध डेटा संग्रहीत करने के लिए लोकप्रिय फ़ाइल स्वरूप हैं, लेकिन वे मानों को अलग करने के लिए अलग-अलग डिलीमीटर का उपयोग करते हैं - CSV कॉमा (",
+ "preserveHeaders": "शीर्षक संरक्षित करें",
+ "resultTitle": "TSV परिणाम",
+ "shortDescription": "CSV डेटा को TSV प्रारूप में परिवर्तित करें.",
+ "title": "CSV से TSV"
+ },
+ "csvToXml": {
+ "conversionOptions": "रूपांतरण विकल्प",
+ "description": "CSV डेटा को XML प्रारूप में बदलें।",
+ "firstRowAsHeaders": "पहली पंक्ति शीर्षक के रूप में",
+ "inputTitle": "इनपुट CSV",
+ "resultTitle": "XML परिणाम",
+ "rootElement": "मूल तत्व",
+ "rootPlaceholder": "तत्व नाम",
+ "rowElement": "पंक्ति तत्व",
+ "rowPlaceholder": "तत्व नाम",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "CSV डेटा को XML प्रारूप में परिवर्तित करें.",
+ "title": "CSV से XML"
+ },
+ "csvToYaml": {
+ "conversionOptions": "रूपांतरण विकल्प",
+ "description": "CSV डेटा को YAML प्रारूप में बदलें।",
+ "firstRowAsHeaders": "पहली पंक्ति शीर्षक के रूप में",
+ "includeHeaders": "शीर्षक शामिल करें",
+ "indentSize": "इंडेंट आकार",
+ "inputTitle": "इनपुट CSV",
+ "longDescription": "यह टूल CSV (कॉमा सेपरेटेड वैल्यूज़) डेटा को YAML (येट अनदर मार्कअप लैंग्वेज) डेटा में बदल देता है। CSV एक सरल, सारणीबद्ध फ़ॉर्मैट है जिसका उपयोग पंक्तियों और स्तंभों वाले मैट्रिक्स जैसे डेटा प्रकारों को दर्शाने के लिए किया जाता है। दूसरी ओर, YAML एक अधिक उन्नत फ़ॉर्मैट (वास्तव में JSON का एक सुपरसेट) है, जो क्रमांकन के लिए अधिक मानव-पठनीय डेटा बनाता है, और यह सूचियों, शब्दकोशों और नेस्टेड ऑब्जेक्ट्स का समर्थन करता है। यह प्रोग्राम विभिन्न इनपुट CSV फ़ॉर्मैट का समर्थन करता है - इनपुट डेटा कॉमा सेपरेटेड (डिफ़ॉल्ट), सेमीकोलन सेपरेटेड, पाइप सेपरेटेड हो सकता है, या किसी अन्य पूरी तरह से अलग डिलीमीटर का उपयोग कर सकता है। आप विकल्पों में अपने डेटा द्वारा उपयोग किए जाने वाले सटीक डिलीमीटर को निर्दिष्ट कर सकते हैं। इसी प्रकार, विकल्पों में, आप CSV फ़ील्ड को रैप करने के लिए उपयोग किए जाने वाले उद्धरण चिह्न को निर्दिष्ट कर सकते हैं (डिफ़ॉल्ट रूप से एक डबल-कोट प्रतीक)। आप विकल्पों में टिप्पणी चिह्न निर्दिष्ट करके टिप्पणियों से शुरू होने वाली पंक्तियों को भी छोड़ सकते हैं। इससे आप अनावश्यक पंक्तियों को छोड़कर अपने डेटा को साफ़ रख सकते हैं। CSV को YAML में बदलने के दो तरीके हैं। पहली विधि प्रत्येक CSV पंक्ति को एक YAML सूची में बदल देती है। दूसरी विधि पहली CSV पंक्ति से हेडर निकालती है और इन हेडर पर आधारित कुंजियों वाले YAML ऑब्जेक्ट बनाती है। आप YAML संरचनाओं को इंडेंट करने के लिए रिक्त स्थान की संख्या निर्दिष्ट करके आउटपुट YAML प्रारूप को भी अनुकूलित कर सकते हैं। यदि आपको रिवर्स रूपांतरण, यानी YAML को CSV में बदलने की आवश्यकता है, तो आप हमारे YAML को CSV में बदलने वाले टूल का उपयोग कर सकते हैं। Csv-abulous!",
+ "resultTitle": "YAML परिणाम",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "किसी CSV फ़ाइल को शीघ्रता से YAML फ़ाइल में परिवर्तित करें।",
+ "sizePlaceholder": "आकार",
+ "title": "CSV से YAML"
+ },
+ "findIncompleteCsvRecords": {
+ "checkingOptions": "विकल्पों की जाँच",
+ "commentCharacterDescription": "टिप्पणी पंक्ति की शुरुआत दर्शाने वाला वर्ण दर्ज करें। इस चिह्न से शुरू होने वाली पंक्तियाँ छोड़ दी जाएँगी।",
+ "csvInputOptions": "CSV इनपुट विकल्प",
+ "csvSeparatorDescription": "CSV इनपुट फ़ाइल में कॉलम को सीमांकित करने के लिए प्रयुक्त वर्ण दर्ज करें.",
+ "deleteLinesWithNoData": "बिना डेटा वाली पंक्तियाँ हटाएँ",
+ "deleteLinesWithNoDataDescription": "CSV इनपुट फ़ाइल से रिक्त पंक्तियाँ हटाएँ.",
+ "description": "बस नीचे फॉर्म में अपनी सीएसवी फ़ाइल अपलोड करें और यह टूल स्वचालित रूप से जांच करेगा कि क्या कोई पंक्ति या स्तंभ मूल्य नहीं खो रहे हैं। टूल विकल्पों में, आप इनपुट फ़ाइल प्रारूप को समायोजित कर सकते हैं (विभाजक, उद्धरण वर्ण, और टिप्पणी वर्ण निर्दिष्ट करें)। इसके अतिरिक्त, आप खाली मूल्यों की जांच सक्षम कर सकते हैं, खाली पंक्तियों को छोड़ सकते हैं, और आउटपुट में त्रुटि संदेशों की संख्या पर सीमा निर्धारित कर सकते हैं।",
+ "findEmptyValues": "रिक्त मान खोजें",
+ "findEmptyValuesDescription": "रिक्त CSV फ़ील्ड के बारे में संदेश प्रदर्शित करें (ये रिक्त फ़ील्ड नहीं हैं, बल्कि वे फ़ील्ड हैं जिनमें कुछ भी नहीं है)।",
+ "inputTitle": "इनपुट CSV",
+ "limitNumberOfMessages": "संदेशों की संख्या सीमित करें",
+ "messageLimitDescription": "आउटपुट में संदेशों की संख्या की सीमा निर्धारित करें.",
+ "quoteCharacterDescription": "CSV इनपुट फ़ील्ड को उद्धृत करने के लिए प्रयुक्त उद्धरण वर्ण दर्ज करें.",
+ "resultTitle": "सीएसवी स्थिति",
+ "shortDescription": "सीएसवी में जल्दी से पंक्तियां और स्तंभ खोजें जो मूल्य खो रहे हैं।",
+ "title": "अधूरे सीएसवी रिकॉर्ड खोजें",
+ "toolInfo": {
+ "title": "{{title}} क्या है?"
+ }
+ },
+ "findIncompleteRecords": {
+ "checkEmptyValues": "खाली मूल्य जांचें",
+ "description": "CSV फ़ाइल में अधूरे रिकॉर्ड खोजें।",
+ "errorLimit": "त्रुटि सीमा",
+ "inputTitle": "इनपुट CSV",
+ "limitPlaceholder": "सीमा",
+ "resultTitle": "अधूरे रिकॉर्ड",
+ "searchOptions": "खोज विकल्प",
+ "separatorPlaceholder": "विभाजक",
+ "skipEmptyLines": "खाली पंक्तियां छोड़ें",
+ "title": "अधूरे CSV रिकॉर्ड खोजें"
+ },
+ "insertColumns": {
+ "columnNames": "स्तंभ नाम",
+ "defaultValues": "डिफ़ॉल्ट मूल्य",
+ "description": "CSV फ़ाइल में नए स्तंभ डालें।",
+ "inputTitle": "इनपुट CSV",
+ "insertPosition": "डालने की स्थिति",
+ "insertionOptions": "डालने के विकल्प",
+ "namesPlaceholder": "नाम (कॉमा से अलग)",
+ "positionPlaceholder": "स्थिति",
+ "resultTitle": "संशोधित CSV",
+ "separatorPlaceholder": "विभाजक",
+ "title": "CSV स्तंभ डालें",
+ "valuesPlaceholder": "मूल्य (कॉमा से अलग)"
+ },
+ "insertCsvColumns": {
+ "appendColumns": "कॉलम जोड़ें",
+ "commentCharacterDescription": "टिप्पणी पंक्ति की शुरुआत दर्शाने वाला वर्ण दर्ज करें। इस चिह्न से शुरू होने वाली पंक्तियाँ छोड़ दी जाएँगी।",
+ "csvOptions": "CSV विकल्प",
+ "csvSeparator": "CSV विभाजक",
+ "csvToInsert": "सम्मिलित करने के लिए CSV",
+ "csvToInsertDescription": "CSV में डालने के लिए एक या एक से ज़्यादा कॉलम डालें। कॉलम को सीमांकित करने के लिए इस्तेमाल किया गया वर्ण CSV इनपुट फ़ाइल में मौजूद वर्ण के समान होना चाहिए। Ps: खाली पंक्तियों को अनदेखा कर दिया जाएगा।",
+ "customFillDescription": "यदि इनपुट CSV फ़ाइल अपूर्ण है (मान गायब हैं), तो एक सुव्यवस्थित CSV बनाने के लिए रिकॉर्ड में रिक्त फ़ील्ड या कस्टम प्रतीक जोड़ें?",
+ "customFillValueDescription": "रिक्त फ़ील्ड भरने के लिए इस कस्टम मान का उपयोग करें। (यह केवल ऊपर दिए गए \"कस्टम मान\" मोड के साथ काम करता है।)",
+ "customPosition": "कस्टम स्थिति",
+ "customPositionOptionsDescription": "CSV फ़ाइल में कॉलम सम्मिलित करने की विधि का चयन करें.",
+ "description": "निर्दिष्ट स्थानों पर CSV डेटा में नए कॉलम जोड़ें.",
+ "fillWithCustomValues": "सीमा शुल्क मूल्यों से भरें",
+ "fillWithEmptyValues": "रिक्त मानों से भरें",
+ "headerName": "हेडर का नाम",
+ "headerNameDescription": "उस कॉलम का शीर्षलेख जिसके बाद आप कॉलम सम्मिलित करना चाहते हैं.",
+ "inputTitle": "इनपुट CSV",
+ "insertingPositionDescription": "निर्दिष्ट करें कि CSV फ़ाइल में कॉलम कहाँ सम्मिलित करना है.",
+ "position": "पद",
+ "positionOptions": "स्थिति विकल्प",
+ "prependColumns": "कॉलम जोड़ें",
+ "quoteCharDescription": "CSV इनपुट फ़ील्ड को उद्धृत करने के लिए प्रयुक्त उद्धरण वर्ण दर्ज करें.",
+ "resultTitle": "आउटपुट CSV",
+ "rowNumberDescription": "उस कॉलम की संख्या जिसके बाद आप कॉलम सम्मिलित करना चाहते हैं.",
+ "separatorDescription": "CSV इनपुट फ़ाइल में कॉलम को सीमांकित करने के लिए प्रयुक्त वर्ण दर्ज करें.",
+ "shortDescription": "CSV फ़ाइल में कहीं भी एक या अधिक नए कॉलम शीघ्रता से डालें.",
+ "title": "CSV कॉलम डालें",
+ "toolInfo": {
+ "description": "यह टूल आपको CSV डेटा में निर्दिष्ट स्थानों पर नए कॉलम डालने की सुविधा देता है। आप हेडर नामों या कॉलम संख्याओं के आधार पर कस्टम स्थानों पर कॉलम जोड़, जोड़ या डाल सकते हैं।",
+ "title": "CSV कॉलम डालें"
+ }
+ },
+ "rowsToColumns": {
+ "description": "CSV डेटा को पंक्तियों से स्तंभों में बदलें।",
+ "includeHeaders": "शीर्षक शामिल करें",
+ "inputTitle": "इनपुट CSV",
+ "resultTitle": "परिवर्तित CSV",
+ "separatorPlaceholder": "विभाजक",
+ "title": "CSV पंक्तियां से स्तंभ",
+ "transformationOptions": "परिवर्तन विकल्प",
+ "transposeData": "डेटा ट्रांसपोज़ करें"
+ },
+ "swapColumns": {
+ "description": "CSV फ़ाइल में स्तंभों की स्थिति बदलें।",
+ "firstColumn": "पहला स्तंभ",
+ "firstColumnPlaceholder": "स्तंभ संख्या",
+ "inputTitle": "इनपुट CSV",
+ "resultTitle": "संशोधित CSV",
+ "secondColumn": "दूसरा स्तंभ",
+ "secondColumnPlaceholder": "स्तंभ संख्या",
+ "separatorPlaceholder": "विभाजक",
+ "swapOptions": "बदलने के विकल्प",
+ "title": "CSV स्तंभ बदलें"
+ },
+ "swapCsvColumns": {
+ "description": "बस नीचे दिए गए फ़ॉर्म में अपनी CSV फ़ाइल अपलोड करें, स्वैप करने के लिए कॉलम निर्दिष्ट करें, और टूल स्वचालित रूप से आउटपुट फ़ाइल में निर्दिष्ट कॉलम की स्थिति बदल देगा। टूल विकल्पों में, आप उन कॉलम की स्थिति या नाम निर्दिष्ट कर सकते हैं जिन्हें आप स्वैप करना चाहते हैं, साथ ही अधूरे डेटा को ठीक कर सकते हैं और वैकल्पिक रूप से खाली रिकॉर्ड और टिप्पणी किए गए रिकॉर्ड हटा सकते हैं।",
+ "longDescription": "यह टूल CSV डेटा के कॉलम की स्थिति बदलकर उसे पुनर्व्यवस्थित करता है। कॉलम बदलने से अक्सर इस्तेमाल होने वाले डेटा को एक साथ या आगे रखकर CSV फ़ाइल की पठनीयता बढ़ाई जा सकती है, जिससे डेटा की तुलना और संपादन आसान हो जाता है। उदाहरण के लिए, आप पहले कॉलम को आखिरी कॉलम से या दूसरे कॉलम को तीसरे कॉलम से बदल सकते हैं। कॉलम की स्थिति के आधार पर उन्हें बदलने के लिए, चुनें",
+ "shortDescription": "CSV कॉलम पुनःक्रमित करें.",
+ "title": "CSV कॉलम स्वैप करें"
+ },
+ "transposeCsv": {
+ "description": "CSV डेटा को ट्रांसपोज़ करें (पंक्तियों को स्तंभों में बदलें)।",
+ "includeHeaders": "शीर्षक शामिल करें",
+ "inputTitle": "इनपुट CSV",
+ "longDescription": "यह टूल कॉमा सेपरेटेड वैल्यूज़ (CSV) को ट्रांसपोज़ करता है। यह CSV को डेटा के एक मैट्रिक्स की तरह मानता है और सभी तत्वों को मुख्य विकर्ण पर पलट देता है। आउटपुट में इनपुट के समान ही CSV डेटा होता है, लेकिन अब सभी पंक्तियाँ कॉलम में बदल गई हैं, और सभी कॉलम पंक्तियाँ में बदल गए हैं। ट्रांसपोज़िशन के बाद, CSV फ़ाइल के आयाम विपरीत होंगे। उदाहरण के लिए, यदि इनपुट फ़ाइल में 4 कॉलम और 3 पंक्तियाँ हैं, तो आउटपुट फ़ाइल में 3 कॉलम और 4 पंक्तियाँ होंगी। रूपांतरण के दौरान, प्रोग्राम अनावश्यक पंक्तियों से डेटा भी साफ़ करता है और अधूरे डेटा को सही करता है। विशेष रूप से, यह टूल किसी विशिष्ट वर्ण से शुरू होने वाले सभी रिक्त रिकॉर्ड और टिप्पणियों को स्वचालित रूप से हटा देता है, जिसे आप विकल्प में सेट कर सकते हैं। इसके अतिरिक्त, ऐसे मामलों में जहाँ CSV डेटा दूषित या खो गया है, उपयोगिता फ़ाइल को रिक्त फ़ील्ड या कस्टम फ़ील्ड से भर देती है जिन्हें विकल्पों में निर्दिष्ट किया जा सकता है। Csv-abulous!",
+ "resultTitle": "ट्रांसपोज़ किया गया CSV",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "CSV फ़ाइल को शीघ्रता से ट्रांसपोज़ करें.",
+ "title": "CSV ट्रांसपोज़ करें",
+ "transposeOptions": "ट्रांसपोज़ विकल्प"
+ }
+}
diff --git a/public/locales/hi/image.json b/public/locales/hi/image.json
new file mode 100644
index 0000000..67122dd
--- /dev/null
+++ b/public/locales/hi/image.json
@@ -0,0 +1,224 @@
+{
+ "changeColors": {
+ "description": "दुनिया",
+ "shortDescription": "किसी छवि में रंगों को शीघ्रता से बदलें",
+ "title": "छवि में रंग बदलें"
+ },
+ "changeOpacity": {
+ "description": "अपनी छवियों की पारदर्शिता को आसानी से समायोजित करें। बस अपनी छवि अपलोड करें, स्लाइडर का उपयोग करके वांछित अपारदर्शिता स्तर 0 (पूरी तरह से पारदर्शी) और 1 (पूरी तरह से अपारदर्शी) के बीच सेट करें, और संशोधित छवि डाउनलोड करें।",
+ "shortDescription": "छवियों की पारदर्शिता समायोजित करें",
+ "title": "छवि अपारदर्शिता बदलें"
+ },
+ "compress": {
+ "compressionOptions": "संपीड़न विकल्प",
+ "description": "छवि फ़ाइल आकार कम करें।",
+ "formatJpeg": "JPEG",
+ "formatPng": "PNG",
+ "formatWebp": "WebP",
+ "imageQuality": "छवि गुणवत्ता",
+ "inputTitle": "इनपुट छवि",
+ "outputFormat": "आउटपुट प्रारूप",
+ "progressiveJpeg": "प्रगतिशील JPEG",
+ "qualityPlaceholder": "गुणवत्ता (1-100)",
+ "removeMetadata": "मेटाडेटा हटाएं",
+ "resultTitle": "संपीड़ित छवि",
+ "shortDescription": "उचित गुणवत्ता बनाए रखते हुए फ़ाइल आकार को कम करने के लिए छवियों को संपीड़ित करें।",
+ "title": "छवि संपीड़ित करें"
+ },
+ "compressPng": {
+ "description": "यह एक ऐसा प्रोग्राम है जो PNG चित्रों को संपीड़ित करता है। जैसे ही आप अपनी PNG तस्वीर को इनपुट क्षेत्र में पेस्ट करेंगे, प्रोग्राम उसे संपीड़ित कर देगा और परिणाम आउटपुट क्षेत्र में दिखाएगा। विकल्पों में, आप संपीड़न स्तर को समायोजित कर सकते हैं, साथ ही पुरानी और नई तस्वीर फ़ाइल का आकार भी देख सकते हैं।",
+ "shortDescription": "PNG को शीघ्रता से संपीड़ित करें",
+ "title": "png संपीड़ित करें"
+ },
+ "convert": {
+ "conversionOptions": "रूपांतरण विकल्प",
+ "description": "छवि को एक प्रारूप से दूसरे में बदलें।",
+ "formatBmp": "BMP",
+ "formatGif": "GIF",
+ "formatJpeg": "JPEG",
+ "formatPng": "PNG",
+ "formatTiff": "TIFF",
+ "formatWebp": "WebP",
+ "imageQuality": "छवि गुणवत्ता",
+ "inputTitle": "इनपुट छवि",
+ "outputFormat": "आउटपुट प्रारूप",
+ "preserveTransparency": "पारदर्शिता संरक्षित करें",
+ "qualityPlaceholder": "गुणवत्ता (1-100)",
+ "resultTitle": "परिवर्तित छवि",
+ "title": "छवि प्रारूप बदलें"
+ },
+ "convertJgpToPng": {
+ "description": "अपनी JPG इमेज को झटपट PNG में बदलें। बस अपनी PNG इमेज को बाईं ओर दिए गए एडिटर में इम्पोर्ट करें।",
+ "shortDescription": "अपनी JPG छवियों को शीघ्रता से PNG में बदलें",
+ "title": "JPG को PNG में बदलें"
+ },
+ "convertToJpg": {
+ "description": "अनुकूलन योग्य गुणवत्ता और पृष्ठभूमि रंग सेटिंग्स के साथ विभिन्न छवि प्रारूपों (PNG, GIF, TIF, PSD, SVG, WEBP, HEIC, RAW) को JPG में परिवर्तित करें।",
+ "shortDescription": "गुणवत्ता नियंत्रण के साथ छवियों को JPG में परिवर्तित करें",
+ "title": "छवियों को JPG में परिवर्तित करें"
+ },
+ "createTransparent": {
+ "description": "दुनिया",
+ "shortDescription": "किसी छवि को शीघ्रता से पारदर्शी बनाएँ",
+ "title": "पारदर्शी PNG बनाएँ"
+ },
+ "crop": {
+ "aspectRatio": "आकार अनुपात",
+ "cropArea": "क्रॉप क्षेत्र",
+ "cropMethod": "क्रॉप विधि",
+ "cropOptions": "क्रॉप विकल्प",
+ "description": "छवि से अनावश्यक भाग हटाएं।",
+ "height": "ऊंचाई",
+ "heightPlaceholder": "पिक्सेल",
+ "inputTitle": "इनपुट छवि",
+ "methodAspectRatio": "आकार अनुपात",
+ "methodManual": "मैनुअल",
+ "ratio16x9": "16:9",
+ "ratio1x1": "1:1",
+ "ratio3x2": "3:2",
+ "ratio4x3": "4:3",
+ "resultTitle": "क्रॉप की गई छवि",
+ "shortDescription": "छवियों को शीघ्रता से काटें.",
+ "title": "छवि क्रॉप करें",
+ "width": "चौड़ाई",
+ "widthPlaceholder": "पिक्सेल",
+ "xPlaceholder": "पिक्सेल",
+ "xPosition": "X स्थिति",
+ "yPlaceholder": "पिक्सेल",
+ "yPosition": "Y स्थिति"
+ },
+ "editor": {
+ "description": "क्रॉप करने, घुमाने, एनोटेट करने, रंग समायोजित करने और वॉटरमार्क जोड़ने के लिए उपकरणों के साथ उन्नत छवि संपादक। अपने ब्राउज़र में सीधे पेशेवर-स्तरीय उपकरणों से अपनी छवियों को संपादित करें।",
+ "shortDescription": "उन्नत टूल और सुविधाओं के साथ छवियों को संपादित करें",
+ "title": "छवि संपादक"
+ },
+ "filter": {
+ "description": "छवि पर विभिन्न फ़िल्टर लागू करें।",
+ "filterIntensity": "फ़िल्टर तीव्रता",
+ "filterOptions": "फ़िल्टर विकल्प",
+ "filterType": "फ़िल्टर प्रकार",
+ "inputTitle": "इनपुट छवि",
+ "intensityPlaceholder": "मान (0-100)",
+ "resultTitle": "फ़िल्टर की गई छवि",
+ "title": "छवि फ़िल्टर",
+ "typeBlur": "धुंधला",
+ "typeBrightness": "चमक",
+ "typeContrast": "कंट्रास्ट",
+ "typeGrayscale": "ग्रेस्केल",
+ "typeInvert": "उलटा",
+ "typeSaturation": "संतृप्ति",
+ "typeSepia": "सेपिया",
+ "typeSharpen": "तेज़"
+ },
+ "flip": {
+ "description": "छवि को क्षैतिज या लंबवत रूप से फ्लिप करें।",
+ "directionBoth": "दोनों",
+ "directionHorizontal": "क्षैतिज",
+ "directionVertical": "लंबवत",
+ "flipDirection": "फ्लिप दिशा",
+ "flipOptions": "फ्लिप विकल्प",
+ "inputTitle": "इनपुट छवि",
+ "resultTitle": "फ्लिप की गई छवि",
+ "title": "छवि फ्लिप करें"
+ },
+ "imageToText": {
+ "description": "ऑप्टिकल कैरेक्टर रिकॉग्निशन (OCR) का उपयोग करके छवियों (JPG, PNG) से पाठ निकालें।",
+ "shortDescription": "OCR का उपयोग करके छवियों से पाठ निकालें।",
+ "title": "छवि से पाठ (ओसीआर)"
+ },
+ "qrCode": {
+ "description": "विभिन्न डेटा प्रकारों के लिए क्यूआर कोड उत्पन्न करें: यूआरएल, टेक्स्ट, ईमेल, फोन, एसएमएस, वाईफाई, वीकार्ड, और अधिक।",
+ "shortDescription": "विभिन्न डेटा प्रारूपों के लिए अनुकूलित क्यूआर कोड बनाएं।",
+ "title": "क्यूआर कोड जनरेटर"
+ },
+ "removeBackground": {
+ "description": "दुनिया",
+ "shortDescription": "छवियों से पृष्ठभूमि स्वचालित रूप से हटाएँ",
+ "title": "छवि से पृष्ठभूमि हटाएँ"
+ },
+ "resize": {
+ "description": "छवि का आकार बदलें।",
+ "dimensionType": "आयाम प्रकार",
+ "height": "ऊंचाई",
+ "heightDescription": "ऊँचाई (पिक्सेल में)",
+ "heightPlaceholder": "मान",
+ "inputTitle": "इनपुट छवि",
+ "interpolationMethod": "इंटरपोलेशन विधि",
+ "maintainAspectRatio": "आकार अनुपात बनाए रखें",
+ "maintainAspectRatioDescription": "छवि का मूल पहलू अनुपात बनाए रखें.",
+ "methodAspectRatio": "आकार अनुपात",
+ "methodBicubic": "द्विघन",
+ "methodBilinear": "द्विरेखीय",
+ "methodNearest": "निकटतम",
+ "methodPercentage": "प्रतिशत",
+ "methodPixels": "पिक्सेल",
+ "percentage": "को PERCENTAGE",
+ "percentageDescription": "मूल आकार का प्रतिशत (उदाहरण के लिए, आधे आकार के लिए 50, दोहरे आकार के लिए 200)",
+ "resizeByPercentage": "प्रतिशत के अनुसार आकार बदलें",
+ "resizeByPercentageDescription": "मूल आकार का प्रतिशत निर्दिष्ट करके आकार बदलें।",
+ "resizeByPixels": "पिक्सेल द्वारा आकार बदलें",
+ "resizeByPixelsDescription": "पिक्सेल में आयाम निर्दिष्ट करके आकार बदलें.",
+ "resizeMethod": "आकार बदलने की विधि",
+ "resizeOptions": "आकार बदलने के विकल्प",
+ "resultTitle": "आकार बदली गई छवि",
+ "setHeight": "ऊँचाई निर्धारित करें",
+ "setHeightDescription": "पिक्सेल में ऊंचाई निर्दिष्ट करें और पहलू अनुपात के आधार पर चौड़ाई की गणना करें।",
+ "setWidth": "चौड़ाई सेट करें",
+ "setWidthDescription": "पिक्सेल में चौड़ाई निर्दिष्ट करें और पहलू अनुपात के आधार पर ऊंचाई की गणना करें।",
+ "shortDescription": "छवियों का आकार आसानी से बदलें.",
+ "title": "छवि आकार बदलें",
+ "toolInfo": {
+ "description": "यह टूल आपको JPG, PNG, SVG, या GIF इमेज का आकार बदलने की सुविधा देता है। आप पिक्सेल या प्रतिशत में आयाम निर्दिष्ट करके आकार बदल सकते हैं, साथ ही मूल पहलू अनुपात बनाए रखने के विकल्प भी उपलब्ध हैं।",
+ "title": "छवि आकार बदलें"
+ },
+ "width": "चौड़ाई",
+ "widthDescription": "चौड़ाई (पिक्सेल में)",
+ "widthPlaceholder": "मान"
+ },
+ "rotate": {
+ "angle180": "180 डिग्री",
+ "angle270": "270 डिग्री",
+ "angle90": "90 डिग्री",
+ "backgroundColor": "पृष्ठभूमि रंग",
+ "colorBlack": "काला",
+ "colorCustom": "कस्टम",
+ "colorTransparent": "पारदर्शी",
+ "colorWhite": "सफेद",
+ "customAngle": "कस्टम कोण",
+ "customAnglePlaceholder": "डिग्री",
+ "customColorPlaceholder": "#RRGGBB",
+ "description": "छवि को निर्दिष्ट कोण से घुमाएं।",
+ "inputTitle": "इनपुट छवि",
+ "resultTitle": "घुमाई गई छवि",
+ "rotationAngle": "घुमाने का कोण",
+ "rotationOptions": "घुमाने के विकल्प",
+ "shortDescription": "किसी छवि को आसानी से घुमाएँ.",
+ "title": "छवि घुमाएं"
+ },
+ "watermark": {
+ "colorPlaceholder": "#RRGGBB",
+ "description": "छवि पर टेक्स्ट या छवि वॉटरमार्क जोड़ें।",
+ "fontColor": "फ़ॉन्ट रंग",
+ "fontSize": "फ़ॉन्ट आकार",
+ "fontSizePlaceholder": "आकार",
+ "imagePlaceholder": "छवि फ़ाइल",
+ "inputTitle": "इनपुट छवि",
+ "opacity": "पारदर्शिता",
+ "opacityPlaceholder": "प्रतिशत (1-100)",
+ "position": "स्थिति",
+ "positionBottomLeft": "नीचे बाएं",
+ "positionBottomRight": "नीचे दाएं",
+ "positionCenter": "केंद्र",
+ "positionTopLeft": "ऊपर बाएं",
+ "positionTopRight": "ऊपर दाएं",
+ "resultTitle": "वॉटरमार्क वाली छवि",
+ "textPlaceholder": "टेक्स्ट",
+ "title": "छवि पर वॉटरमार्क",
+ "typeImage": "छवि",
+ "typeText": "टेक्स्ट",
+ "watermarkImage": "वॉटरमार्क छवि",
+ "watermarkOptions": "वॉटरमार्क विकल्प",
+ "watermarkText": "वॉटरमार्क टेक्स्ट",
+ "watermarkType": "वॉटरमार्क प्रकार"
+ }
+}
diff --git a/public/locales/hi/json.json b/public/locales/hi/json.json
new file mode 100644
index 0000000..20d51e4
--- /dev/null
+++ b/public/locales/hi/json.json
@@ -0,0 +1,110 @@
+{
+ "escape": {
+ "description": "JSON स्ट्रिंग में विशेष वर्णों को एस्केप करें।",
+ "escapeBackslashes": "बैकस्लैश एस्केप करें",
+ "escapeNewlines": "नई पंक्तियां एस्केप करें",
+ "escapeOptions": "एस्केप विकल्प",
+ "escapeQuotes": "उद्धरण एस्केप करें",
+ "escapeTabs": "टैब एस्केप करें",
+ "inputTitle": "इनपुट JSON",
+ "resultTitle": "एस्केप किया गया JSON",
+ "title": "JSON एस्केप करें"
+ },
+ "escapeJson": {
+ "description": "JSON स्ट्रिंग्स में विशेष वर्णों को एस्केप करें। सुरक्षित संचरण या संग्रहण के लिए JSON डेटा को उचित रूप से एस्केप किए गए प्रारूप में परिवर्तित करें।",
+ "shortDescription": "JSON में विशेष वर्णों से बचें",
+ "title": "JSON से बचें"
+ },
+ "jsonToXml": {
+ "conversionOptions": "रूपांतरण विकल्प",
+ "description": "JSON डेटा को XML प्रारूप में बदलें।",
+ "includeAttributes": "विशेषताएं शामिल करें",
+ "indentSize": "इंडेंट आकार",
+ "inputTitle": "इनपुट JSON",
+ "resultTitle": "XML परिणाम",
+ "rootElement": "मूल तत्व",
+ "rootPlaceholder": "तत्व नाम",
+ "shortDescription": "JSON को XML प्रारूप में परिवर्तित करें",
+ "sizePlaceholder": "आकार",
+ "title": "JSON से XML"
+ },
+ "minify": {
+ "compactArrays": "सरणियां संक्षिप्त करें",
+ "description": "JSON को संक्षिप्त प्रारूप में बदलें।",
+ "inputTitle": "इनपुट JSON",
+ "minifyOptions": "संक्षिप्त करने के विकल्प",
+ "removeComments": "टिप्पणियां हटाएं",
+ "removeWhitespace": "सफेद स्थान हटाएं",
+ "resultTitle": "संक्षिप्त JSON",
+ "shortDescription": "रिक्त स्थान हटाकर JSON को छोटा करें",
+ "title": "JSON संक्षिप्त करें",
+ "toolInfo": {
+ "description": "JSON मिनिफिकेशन, JSON डेटा से सभी अनावश्यक रिक्त स्थान वर्णों को हटाने की प्रक्रिया है, जबकि इसकी वैधता बरकरार रहती है। इसमें रिक्त स्थान, नई पंक्तियाँ और इंडेंटेशन हटाना शामिल है जो JSON को सही ढंग से पार्स करने के लिए आवश्यक नहीं हैं। मिनिफिकेशन JSON डेटा के आकार को कम करता है, जिससे यह संग्रहण और संचरण के लिए अधिक कुशल हो जाता है, जबकि डेटा संरचना और मान बिल्कुल समान रहते हैं।",
+ "title": "JSON मिनिमाइजेशन क्या है?"
+ }
+ },
+ "prettify": {
+ "description": "JSON को सुंदर प्रारूप में बदलें।",
+ "formattingOptions": "फॉर्मेटिंग विकल्प",
+ "indentCharacter": "इंडेंट वर्ण",
+ "indentSize": "इंडेंट आकार",
+ "indentation": "खरोज",
+ "inputTitle": "इनपुट JSON",
+ "resultTitle": "सुंदर JSON",
+ "shortDescription": "JSON कोड को प्रारूपित और सुशोभित करें",
+ "sizePlaceholder": "आकार",
+ "sortKeys": "कुंजियां क्रमबद्ध करें",
+ "space": "स्पेस",
+ "tab": "टैब",
+ "title": "JSON सुंदर बनाएं",
+ "toolInfo": {
+ "description": "यह टूल आपको JSON डेटा को उचित इंडेंटेशन और स्पेसिंग के साथ फॉर्मेट करने की अनुमति देता है, जिससे यह अधिक पठनीय और काम करने में आसान हो जाता है।",
+ "title": "JSON सुंदर बनाएं"
+ },
+ "useSpaces": "रिक्त स्थान का उपयोग करें",
+ "useSpacesDescription": "रिक्त स्थान के साथ आउटपुट इंडेंट करें",
+ "useTabs": "टैब का उपयोग करें",
+ "useTabsDescription": "टैब के साथ आउटपुट इंडेंट करें."
+ },
+ "stringify": {
+ "description": "JavaScript ऑब्जेक्ट को JSON स्ट्रिंग में बदलें।",
+ "includeFunctions": "फ़ंक्शन शामिल करें",
+ "includeUndefined": "अपरिभाषित शामिल करें",
+ "inputTitle": "इनपुट ऑब्जेक्ट",
+ "prettyPrint": "सुंदर प्रिंट",
+ "resultTitle": "JSON स्ट्रिंग",
+ "shortDescription": "ऑब्जेक्ट को JSON स्ट्रिंग में परिवर्तित करें",
+ "stringifyOptions": "स्ट्रिंगिफाई विकल्प",
+ "title": "JSON स्ट्रिंगिफाई"
+ },
+ "tsvToJson": {
+ "arrayFormat": "सरणी प्रारूप",
+ "conversionOptions": "रूपांतरण विकल्प",
+ "description": "TSV डेटा को JSON प्रारूप में बदलें।",
+ "firstRowAsHeaders": "पहली पंक्ति शीर्षक के रूप में",
+ "includeHeaders": "शीर्षक शामिल करें",
+ "inputTitle": "इनपुट TSV",
+ "objectFormat": "ऑब्जेक्ट प्रारूप",
+ "outputFormat": "आउटपुट प्रारूप",
+ "resultTitle": "JSON परिणाम",
+ "shortDescription": "TSV को JSON प्रारूप में परिवर्तित करें",
+ "title": "TSV से JSON"
+ },
+ "validateJson": {
+ "allowComments": "टिप्पणियां अनुमति दें",
+ "allowTrailingCommas": "अनुगामी कॉमा अनुमति दें",
+ "description": "JSON स्ट्रिंग की वैधता जांचें।",
+ "inputTitle": "इनपुट JSON",
+ "invalidJson": "❌ {{error}}",
+ "resultTitle": "मान्यता परिणाम",
+ "shortDescription": "त्रुटियों के लिए JSON कोड सत्यापित करें",
+ "strictMode": "सख्त मोड",
+ "title": "JSON मान्य करें",
+ "toolInfo": {
+ "description": "JSON (जावास्क्रिप्ट ऑब्जेक्ट नोटेशन) एक हल्का डेटा-इंटरचेंज फ़ॉर्मेट है। JSON सत्यापन यह सुनिश्चित करता है कि डेटा की संरचना JSON मानक के अनुरूप हो। एक मान्य JSON ऑब्जेक्ट में ये चीज़ें होनी चाहिए: - प्रॉपर्टी के नाम दोहरे उद्धरण चिह्नों में संलग्न हों। - उचित रूप से संतुलित कर्ली ब्रेसेज़ {}। - अंतिम कुंजी-मान युग्म के बाद कोई अनुगामी अल्पविराम न हो। - ऑब्जेक्ट्स और ऐरे का उचित नेस्टिंग। यह टूल इनपुट JSON की जाँच करता है और सामान्य त्रुटियों की पहचान करने और उन्हें ठीक करने में मदद के लिए फ़ीडबैक प्रदान करता है।",
+ "title": "JSON सत्यापन क्या है?"
+ },
+ "validJson": "✅ मान्य JSON",
+ "validationOptions": "मान्यता विकल्प"
+ }
+}
diff --git a/public/locales/hi/list.json b/public/locales/hi/list.json
new file mode 100644
index 0000000..3cbf179
--- /dev/null
+++ b/public/locales/hi/list.json
@@ -0,0 +1,283 @@
+{
+ "duplicate": {
+ "concatenate": "CONCATENATE",
+ "concatenateDescription": "प्रतियों को संयोजित करें (यदि अनचेक किया गया, तो आइटम आपस में गुंथ जाएंगे)",
+ "copyDescription": "प्रतियों की संख्या (आंशिक हो सकती है)",
+ "countPlaceholder": "संख्या",
+ "description": "सूची में आइटम को दोहराएं।",
+ "duplicateAll": "सभी आइटम दोहराएं",
+ "duplicateCount": "दोहराव की संख्या",
+ "duplicateEach": "प्रत्येक आइटम दोहराएं",
+ "duplicationOptions": "दोहराव विकल्प",
+ "examples": {
+ "fractional": {
+ "description": "यह उदाहरण दिखाता है कि किसी सूची की आंशिक संख्या की प्रतिलिपि कैसे बनाई जाए।",
+ "title": "आंशिक दोहराव"
+ },
+ "interweave": {
+ "description": "यह उदाहरण दिखाता है कि वस्तुओं को संयोजित करने के बजाय उन्हें कैसे आपस में जोड़ा जाए।",
+ "title": "आपस में जुड़ी हुई वस्तुएँ"
+ },
+ "reverse": {
+ "description": "यह उदाहरण दिखाता है कि किसी सूची को उल्टे क्रम में कैसे दोहराया जाए।",
+ "title": "रिवर्स डुप्लिकेशन"
+ },
+ "simple": {
+ "description": "यह उदाहरण दिखाता है कि शब्दों की सूची की प्रतिलिपि कैसे बनाई जाए।",
+ "title": "सरल दोहराव"
+ }
+ },
+ "inputTitle": "इनपुट सूची",
+ "joinSeparatorDescription": "डुप्लिकेट सूची में शामिल करने के लिए विभाजक",
+ "resultTitle": "दोहराई गई सूची",
+ "reverse": "सूची उलटा करें",
+ "reverseDescription": "डुप्लिकेट आइटम को उलट दें",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "निर्दिष्ट मानदंडों के साथ डुप्लिकेट सूची आइटम",
+ "splitByRegex": "नियमित अभिव्यक्ति द्वारा विभाजित",
+ "splitBySymbol": "प्रतीक द्वारा विभाजित",
+ "splitOptions": "विभाजित विकल्प",
+ "splitSeparatorDescription": "सूची को विभाजित करने के लिए विभाजक",
+ "title": "आइटम दोहराएं",
+ "toolInfo": {
+ "description": "यह टूल आपको सूची में आइटम्स की प्रतिलिपि बनाने की अनुमति देता है। आप प्रतियों की संख्या (आंशिक मानों सहित) निर्दिष्ट कर सकते हैं, नियंत्रित कर सकते हैं कि आइटम्स संयोजित हों या अंतर्गुंथित, और यहाँ तक कि डुप्लिकेट किए गए आइटम्स को उलट भी सकते हैं। यह दोहराए गए पैटर्न बनाने, परीक्षण डेटा उत्पन्न करने, या पूर्वानुमानित सामग्री वाली सूचियों का विस्तार करने के लिए उपयोगी है।",
+ "title": "सूची दोहराव"
+ }
+ },
+ "findMostPopular": {
+ "caseSensitive": "केस संवेदी",
+ "countPlaceholder": "संख्या",
+ "description": "सूची में सबसे अधिक बार आने वाले आइटम खोजें।",
+ "inputTitle": "इनपुट सूची",
+ "popularityOptions": "लोकप्रियता विकल्प",
+ "removeEmpty": "खाली आइटम हटाएं",
+ "resultTitle": "लोकप्रिय आइटम",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "सबसे अधिक बार आने वाली वस्तुओं को खोजें",
+ "title": "सबसे लोकप्रिय खोजें",
+ "topCount": "शीर्ष संख्या"
+ },
+ "findUnique": {
+ "caseSensitive": "केस संवेदी",
+ "caseSensitiveItems": "केस सेंसिटिव आइटम",
+ "caseSensitiveItemsDescription": "सूची में अलग-अलग केस वाले आइटम को अद्वितीय तत्व के रूप में आउटपुट करें।",
+ "delimiterDescription": "एक सीमांकक प्रतीक या नियमित अभिव्यक्ति सेट करें.",
+ "description": "सूची से अद्वितीय आइटम निकालें।",
+ "findAbsolutelyUniqueItems": "बिल्कुल अनोखी वस्तुएँ खोजें",
+ "findAbsolutelyUniqueItemsDescription": "सूची के केवल उन आइटमों को प्रदर्शित करें जो एकल प्रतिलिपि में मौजूद हों।",
+ "inputListDelimiter": "इनपुट सूची सीमांकक",
+ "inputTitle": "इनपुट सूची",
+ "outputListDelimiter": "आउटपुट सूची सीमांकक",
+ "removeEmpty": "खाली आइटम हटाएं",
+ "resultTitle": "अद्वितीय आइटम",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "सूची में अद्वितीय आइटम खोजें",
+ "skipEmptyItems": "खाली आइटम छोड़ें",
+ "skipEmptyItemsDescription": "आउटपुट में खाली सूची आइटम शामिल न करें।",
+ "title": "अद्वितीय आइटम खोजें",
+ "trimItems": "सूची आइटम ट्रिम करें",
+ "trimItemsDescription": "वस्तुओं की तुलना करने से पहले प्रारंभिक और अंतिम रिक्त स्थान हटा दें।",
+ "trimWhitespace": "सफेद स्थान ट्रिम करें",
+ "uniqueItemOptions": "अद्वितीय आइटम विकल्प",
+ "uniqueOptions": "अद्वितीय विकल्प"
+ },
+ "group": {
+ "deleteEmptyItems": "खाली आइटम हटाएं",
+ "deleteEmptyItemsDescription": "खाली आइटमों को अनदेखा करें और उन्हें समूहों में शामिल न करें।",
+ "description": "सूची आइटम को समूहित करने के लिए सरल उपकरण।",
+ "emptyItemsAndPadding": "खाली आइटम और पैडिंग",
+ "groupByFirstChar": "पहले वर्ण के अनुसार समूहित करें",
+ "groupByLastChar": "अंतिम वर्ण के अनुसार समूहित करें",
+ "groupByLength": "लंबाई के अनुसार समूहित करें",
+ "groupByPattern": "पैटर्न के अनुसार समूहित करें",
+ "groupHeaders": "समूह शीर्षक जोड़ें",
+ "groupNumberDescription": "एक समूह में वस्तुओं की संख्या",
+ "groupSeparatorDescription": "समूह विभाजक वर्ण",
+ "groupSizeAndSeparators": "समूह का आकार और विभाजक",
+ "groupingOptions": "समूहीकरण विकल्प",
+ "inputItemSeparator": "इनपुट आइटम विभाजक",
+ "inputTitle": "इनपुट सूची",
+ "itemSeparatorDescription": "आइटम विभाजक वर्ण",
+ "leftWrapDescription": "समूह का बायां आवरण प्रतीक.",
+ "outputFormat": "आउटपुट प्रारूप",
+ "padNonFullGroups": "पैड गैर-पूर्ण समूह",
+ "padNonFullGroupsDescription": "गैर-पूर्ण समूहों को कस्टम आइटम से भरें (नीचे दर्ज करें).",
+ "paddingCharDescription": "गैर-पूर्ण समूहों को पैड करने के लिए इस वर्ण या आइटम का उपयोग करें.",
+ "patternPlaceholder": "रेगेक्स पैटर्न",
+ "resultTitle": "समूहित सूची",
+ "rightWrapDescription": "समूह का दायाँ आवरण प्रतीक.",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "सामान्य गुणों द्वारा सूची आइटम को समूहित करें",
+ "splitOperators": {
+ "regex": {
+ "description": "नियमित अभिव्यक्ति के साथ इनपुट सूची आइटम को सीमांकित करें.",
+ "title": "विभाजन के लिए रेगेक्स का उपयोग करें"
+ },
+ "symbol": {
+ "description": "इनपुट सूची आइटम को किसी वर्ण से सीमांकित करें.",
+ "title": "विभाजन के लिए प्रतीक का उपयोग करें"
+ }
+ },
+ "splitSeparatorDescription": "एक सीमांकक प्रतीक या नियमित अभिव्यक्ति सेट करें.",
+ "title": "सूची समूहित करें"
+ },
+ "reverse": {
+ "description": "सूची में आइटम के क्रम को उलटा करें।",
+ "inputTitle": "इनपुट सूची",
+ "itemSeparator": "आइटम विभाजक",
+ "itemSeparatorDescription": "एक सीमांकक प्रतीक या नियमित अभिव्यक्ति सेट करें.",
+ "outputListOptions": "आउटपुट सूची विकल्प",
+ "outputSeparatorDescription": "आउटपुट सूची आइटम विभाजक.",
+ "resultTitle": "उलटी सूची",
+ "reverseEachItem": "प्रत्येक आइटम उलटा करें",
+ "reverseOptions": "उलटाने के विकल्प",
+ "reverseOrder": "क्रम उलटा करें",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "जल्दी से सूची को उलटा करें",
+ "splitOperators": {
+ "regex": {
+ "description": "नियमित अभिव्यक्ति के साथ इनपुट सूची आइटम को सीमांकित करें.",
+ "title": "विभाजन के लिए रेगेक्स का उपयोग करें"
+ },
+ "symbol": {
+ "description": "इनपुट सूची आइटम को किसी वर्ण से सीमांकित करें.",
+ "title": "विभाजन के लिए प्रतीक का उपयोग करें"
+ }
+ },
+ "splitterMode": "स्प्लिटर मोड",
+ "title": "सूची उलटा करें",
+ "toolInfo": {
+ "description": "इस उपयोगिता से, आप किसी सूची में आइटम्स के क्रम को उलट सकते हैं। यह उपयोगिता पहले इनपुट सूची को अलग-अलग आइटम्स में विभाजित करती है और फिर अंतिम आइटम से पहले आइटम तक उनमें पुनरावृति करती है, और पुनरावृत्ति के दौरान प्रत्येक आइटम को आउटपुट में प्रिंट करती है। इनपुट सूची में कुछ भी हो सकता है जिसे पाठ्य डेटा के रूप में दर्शाया जा सकता है, जिसमें अंक, संख्याएँ, स्ट्रिंग, शब्द, वाक्य आदि शामिल हैं। इनपुट आइटम विभाजक एक नियमित अभिव्यक्ति भी हो सकता है। उदाहरण के लिए, रेगुलर एक्सप्रेशन /[;,]/ आपको अल्पविराम या अर्धविराम से अलग किए गए आइटम्स का उपयोग करने की अनुमति देगा। इनपुट और आउटपुट सूची आइटम विभाजक विकल्पों में अनुकूलित किए जा सकते हैं। डिफ़ॉल्ट रूप से, इनपुट और आउटपुट दोनों सूचियाँ अल्पविराम से अलग होती हैं। Listabulous!",
+ "title": "सूची उलटने वाला क्या है?"
+ }
+ },
+ "rotate": {
+ "description": "सूची में आइटम को निर्दिष्ट स्थानों द्वारा घुमाएं।",
+ "inputTitle": "इनपुट सूची",
+ "resultTitle": "घुमाई गई सूची",
+ "rotateDirection": "घुमाने की दिशा",
+ "rotateLeft": "बाईं ओर घुमाएं",
+ "rotateRight": "दाईं ओर घुमाएं",
+ "rotateSteps": "घुमाने के चरण",
+ "rotationOptions": "घुमाने के विकल्प",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "सूची आइटम को निर्दिष्ट स्थानों पर घुमाएँ",
+ "stepsPlaceholder": "चरणों की संख्या",
+ "title": "सूची घुमाएं"
+ },
+ "shuffle": {
+ "delimiterDescription": "एक सीमांकक प्रतीक या नियमित अभिव्यक्ति सेट करें.",
+ "description": "सूची में आइटम को यादृच्छिक क्रम में व्यवस्थित करें।",
+ "inputListSeparator": "इनपुट सूची विभाजक",
+ "inputTitle": "इनपुट सूची",
+ "joinSeparatorDescription": "यादृच्छिक सूची में इस विभाजक का उपयोग करें।",
+ "outputLengthDescription": "इतने सारे यादृच्छिक आइटम आउटपुट करें",
+ "randomSeed": "यादृच्छिक बीज",
+ "resultTitle": "फेरबदल की गई सूची",
+ "seedPlaceholder": "बीज मान",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "सूची आइटमों का क्रम यादृच्छिक करें",
+ "shuffleOptions": "फेरबदल विकल्प",
+ "shuffledListLength": "फेरबदल सूची की लंबाई",
+ "shuffledListSeparator": "फेरबदल सूची विभाजक",
+ "title": "सूची फेरबदल करें"
+ },
+ "sort": {
+ "ascending": "आरोही",
+ "caseSensitive": "केस सेंसिटिव सॉर्ट",
+ "caseSensitiveDescription": "बड़े और छोटे अक्षरों वाले आइटम को अलग-अलग क्रमबद्ध करें। बड़े अक्षरों को आरोही क्रम में छोटे अक्षरों से पहले रखें। (केवल वर्णानुक्रमिक क्रम में काम करता है।)",
+ "descending": "अवरोही",
+ "description": "सूची में आइटम को क्रमबद्ध करें।",
+ "inputItemSeparator": "इनपुट आइटम विभाजक",
+ "inputTitle": "इनपुट सूची",
+ "joinSeparatorDescription": "इस प्रतीक का उपयोग क्रमबद्ध सूची में आइटमों के बीच जोड़ने वाले के रूप में करें।",
+ "orderDescription": "एक सॉर्टिंग क्रम का चयन करें.",
+ "orderOptions": {
+ "decreasing": "घटते क्रम",
+ "increasing": "बढ़ते क्रम"
+ },
+ "removeDuplicates": "डुप्लिकेट हटाएं",
+ "removeDuplicatesDescription": "डुप्लिकेट सूची आइटम हटाएं.",
+ "removeEmpty": "खाली आइटम हटाएं",
+ "resultTitle": "क्रमबद्ध सूची",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "सूची आइटम को निर्दिष्ट क्रम में सॉर्ट करें",
+ "sortAlphabetically": "वर्णानुक्रमिक रूप से क्रमबद्ध करें",
+ "sortByLength": "लंबाई के अनुसार क्रमबद्ध करें",
+ "sortMethod": "सॉर्ट विधि",
+ "sortMethodDescription": "एक सॉर्टिंग विधि का चयन करें.",
+ "sortNumerically": "संख्यात्मक रूप से क्रमबद्ध करें",
+ "sortOptions": {
+ "alphabetic": "वर्णानुक्रम में क्रमबद्ध करें",
+ "length": "लंबाई के अनुसार क्रमबद्ध करें",
+ "numeric": "संख्यात्मक रूप से क्रमबद्ध करें"
+ },
+ "sortOrder": "क्रमबद्ध करने का क्रम",
+ "sortedItemProperties": "क्रमबद्ध आइटम गुण",
+ "sortingOptions": "क्रमबद्ध करने के विकल्प",
+ "splitOperators": {
+ "regex": {
+ "description": "नियमित अभिव्यक्ति के साथ इनपुट सूची आइटम को सीमांकित करें.",
+ "title": "विभाजन के लिए रेगेक्स का उपयोग करें"
+ },
+ "symbol": {
+ "description": "इनपुट सूची आइटम को किसी वर्ण से सीमांकित करें.",
+ "title": "विभाजन के लिए प्रतीक का उपयोग करें"
+ }
+ },
+ "splitSeparatorDescription": "एक सीमांकक प्रतीक या नियमित अभिव्यक्ति सेट करें.",
+ "title": "सूची क्रमबद्ध करें",
+ "trimWhitespace": "सफेद स्थान ट्रिम करें"
+ },
+ "truncate": {
+ "description": "सूची को निर्दिष्ट लंबाई तक काटें।",
+ "inputTitle": "इनपुट सूची",
+ "lengthPlaceholder": "लंबाई",
+ "resultTitle": "काटी गई सूची",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "सूची को निर्दिष्ट संख्या में आइटम तक छोटा करें",
+ "title": "सूची काटें",
+ "truncateFrom": "कहाँ से काटें",
+ "truncateFromEnd": "अंत से",
+ "truncateFromStart": "शुरुआत से",
+ "truncateLength": "काटने की लंबाई",
+ "truncationOptions": "काटने के विकल्प"
+ },
+ "unwrap": {
+ "characterPlaceholder": "वर्ण",
+ "description": "लपेटी गई सूची को खोलें।",
+ "inputTitle": "इनपुट सूची",
+ "removeEmpty": "खाली आइटम हटाएं",
+ "resultTitle": "खोली गई सूची",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "संरचित प्रारूप से सूची आइटम खोलना",
+ "title": "सूची खोलें",
+ "unwrapCharacter": "खोलने का वर्ण",
+ "unwrapOptions": "खोलने के विकल्प"
+ },
+ "wrap": {
+ "characterPlaceholder": "वर्ण",
+ "description": "सूची आइटम को निर्दिष्ट लंबाई में लपेटें।",
+ "inputTitle": "इनपुट सूची",
+ "joinSeparatorDescription": "लिपटे सूची में शामिल करने के लिए विभाजक",
+ "leftTextDescription": "प्रत्येक आइटम से पहले जोड़ने के लिए पाठ",
+ "removeEmptyItems": "खाली आइटम हटाएँ",
+ "resultTitle": "लपेटी गई सूची",
+ "rightTextDescription": "प्रत्येक आइटम के बाद जोड़ने के लिए पाठ",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "सूची आइटम को निर्दिष्ट मानदंडों के साथ लपेटें",
+ "splitByRegex": "नियमित अभिव्यक्ति द्वारा विभाजित",
+ "splitBySymbol": "प्रतीक द्वारा विभाजित",
+ "splitOptions": "विभाजित विकल्प",
+ "splitSeparatorDescription": "सूची को विभाजित करने के लिए विभाजक",
+ "title": "सूची लपेटें",
+ "toolInfo": {
+ "description": "यह टूल आपको सूची में प्रत्येक आइटम के पहले और बाद में टेक्स्ट जोड़ने की अनुमति देता है। आप बाएँ और दाएँ पक्षों के लिए अलग-अलग टेक्स्ट निर्दिष्ट कर सकते हैं, और सूची को कैसे संसाधित किया जाए, इसे नियंत्रित कर सकते हैं। यह सूची आइटम में उद्धरण चिह्न, कोष्ठक या अन्य स्वरूपण जोड़ने, विभिन्न स्वरूपों के लिए डेटा तैयार करने, या संरचित टेक्स्ट बनाने के लिए उपयोगी है।",
+ "title": "सूची लपेटना"
+ },
+ "widthPlaceholder": "चौड़ाई",
+ "wrapCharacter": "लपेटने का वर्ण",
+ "wrapOptions": "लपेटने के विकल्प",
+ "wrapWidth": "लपेटने की चौड़ाई"
+ }
+}
diff --git a/public/locales/hi/number.json b/public/locales/hi/number.json
new file mode 100644
index 0000000..ff50bed
--- /dev/null
+++ b/public/locales/hi/number.json
@@ -0,0 +1,115 @@
+{
+ "arithmeticSequence": {
+ "commonDifference": "सामान्य अंतर",
+ "commonDifferenceDescription": "शब्दों के बीच सामान्य अंतर (d)",
+ "description": "अंकगणितीय अनुक्रम उत्पन्न करें।",
+ "differencePlaceholder": "अंतर",
+ "firstTerm": "पहला पद",
+ "firstTermDescription": "अनुक्रम का पहला पद (a₁)",
+ "firstTermPlaceholder": "पद",
+ "inputTitle": "अनुक्रम",
+ "numberOfTerms": "पदों की संख्या",
+ "numberOfTermsDescription": "उत्पन्न करने के लिए पदों की संख्या (n)",
+ "outputFormat": "आउटपुट प्रारूप",
+ "resultTitle": "अंकगणितीय अनुक्रम",
+ "separatorDescription": "शब्दों के बीच विभाजक",
+ "separatorPlaceholder": "विभाजक",
+ "sequenceOptions": "अनुक्रम विकल्प",
+ "sequenceParameters": "अनुक्रम पैरामीटर",
+ "shortDescription": "अंकगणितीय अनुक्रम उत्पन्न करें",
+ "termsPlaceholder": "संख्या",
+ "title": "अंकगणितीय अनुक्रम",
+ "toolInfo": {
+ "description": "अंकगणितीय अनुक्रम संख्याओं का एक ऐसा अनुक्रम होता है जहाँ प्रत्येक क्रमागत पद का अंतर स्थिर होता है। इस स्थिर अंतर को सार्व अंतर कहते हैं। पहला पद (a₁) और सार्व अंतर (d) दिए होने पर, प्रत्येक पद को पिछले पद में सार्व अंतर जोड़कर ज्ञात किया जा सकता है।",
+ "title": "अंकगणितीय अनुक्रम क्या है?"
+ }
+ },
+ "generate": {
+ "arithmeticSequenceOption": "अंकगणितीय अनुक्रम विकल्प",
+ "countNumbers": "संख्याओं की संख्या",
+ "countPlaceholder": "संख्या",
+ "description": "निर्दिष्ट मापदंडों के अनुसार संख्याओं की सूची उत्पन्न करें।",
+ "generationOptions": "उत्पन्न करने के विकल्प",
+ "inputTitle": "उत्पन्न की गई संख्याएं",
+ "numberOfElementsDescription": "अनुक्रम में तत्वों की संख्या.",
+ "outputFormat": "आउटपुट प्रारूप",
+ "resultTitle": "संख्याओं की सूची",
+ "separator": "सेपरेटर",
+ "separatorDescription": "इस वर्ण द्वारा अंकगणितीय अनुक्रम में तत्वों को अलग करें।",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "निर्दिष्ट श्रेणियों में यादृच्छिक संख्याएँ उत्पन्न करें",
+ "startNumber": "शुरुआती संख्या",
+ "startPlaceholder": "संख्या",
+ "startSequenceDescription": "इस संख्या से अनुक्रम प्रारंभ करें.",
+ "stepDescription": "प्रत्येक तत्व को इस मात्रा से बढ़ाएँ",
+ "stepPlaceholder": "मान",
+ "stepValue": "चरण मान",
+ "title": "संख्याएं उत्पन्न करें",
+ "toolInfo": {
+ "description": "यह टूल आपको अनुकूलन योग्य मापदंडों के साथ संख्याओं का एक क्रम बनाने की अनुमति देता है। आप प्रारंभिक मान, चरण आकार और तत्वों की संख्या निर्दिष्ट कर सकते हैं।",
+ "title": "संख्याएं उत्पन्न करें"
+ }
+ },
+ "ohmsLaw": {
+ "description": "वोल्टेज, धारा और प्रतिरोध की गणना करता है",
+ "longDescription": "यह कैलकुलेटर ओम के नियम (V = I × R) का उपयोग करके तीन विद्युत प्राचलों में से किसी एक का निर्धारण करता है, जब अन्य दो ज्ञात हों। ओम का नियम विद्युत इंजीनियरिंग का एक मूलभूत सिद्धांत है जो वोल्टेज (V), धारा (I), और प्रतिरोध (R) के बीच संबंध का वर्णन करता है। यह उपकरण इलेक्ट्रॉनिक्स के शौकीनों, विद्युत इंजीनियरों और सर्किट पर काम करने वाले छात्रों के लिए उनके विद्युत डिज़ाइनों में अज्ञात मानों को शीघ्रता से हल करने हेतु आवश्यक है।",
+ "shortDescription": "ओम के नियम का उपयोग करके विद्युत परिपथों में वोल्टेज, धारा या प्रतिरोध की गणना करें",
+ "title": "ओम कानून"
+ },
+ "slackline": {
+ "description": "स्लैकलाइन में तनाव की गणना करता है",
+ "longDescription": "यह कैलकुलेटर रस्सी के केंद्र में भार मानता है",
+ "shortDescription": "स्लैकलाइन या क्लोथलाइन के अनुमानित तनाव की गणना करें। सुरक्षा के लिए इस पर निर्भर न रहें।",
+ "title": "स्लैकलाइन तनाव"
+ },
+ "sphereArea": {
+ "description": "गोले का क्षेत्रफल",
+ "longDescription": "यह कैलकुलेटर सूत्र A = 4πr² का उपयोग करके एक गोले का पृष्ठीय क्षेत्रफल ज्ञात करता है। आप पृष्ठीय क्षेत्रफल ज्ञात करने के लिए त्रिज्या दर्ज कर सकते हैं या आवश्यक त्रिज्या की गणना करने के लिए पृष्ठीय क्षेत्रफल दर्ज कर सकते हैं। यह उपकरण ज्यामिति के छात्रों, गोलाकार वस्तुओं पर काम करने वाले इंजीनियरों, और गोलाकार सतहों से संबंधित गणनाएँ करने वाले किसी भी व्यक्ति के लिए उपयोगी है।",
+ "shortDescription": "एक गोले के सतह क्षेत्र की गणना उसकी त्रिज्या के आधार पर करें",
+ "title": "गोले का क्षेत्रफल"
+ },
+ "sphereVolume": {
+ "description": "गोले का आयतन",
+ "longDescription": "यह कैलकुलेटर सूत्र V = (4/3)πr³ का उपयोग करके एक गोले का आयतन ज्ञात करता है। आप आयतन ज्ञात करने के लिए त्रिज्या या व्यास दर्ज कर सकते हैं, या आवश्यक त्रिज्या ज्ञात करने के लिए आयतन दर्ज कर सकते हैं। यह उपकरण भौतिकी, इंजीनियरिंग और विनिर्माण जैसे क्षेत्रों में गोलाकार वस्तुओं के साथ काम करने वाले छात्रों, इंजीनियरों और पेशेवरों के लिए उपयोगी है।",
+ "shortDescription": "त्रिज्या या व्यास का उपयोग करके एक गोले का आयतन ज्ञात करें",
+ "title": "गोले का आयतन"
+ },
+ "sum": {
+ "description": "संख्याओं की सूची का योग करें।",
+ "extractionTypes": {
+ "delimiter": {
+ "description": "यहां संख्या विभाजक को अनुकूलित करें। (डिफ़ॉल्ट रूप से एक लाइन ब्रेक।)",
+ "title": "संख्या सीमांकक"
+ },
+ "smart": {
+ "description": "इनपुट में संख्याओं का स्वतः पता लगाना.",
+ "title": "स्मार्ट योग"
+ }
+ },
+ "ignoreNonNumbers": "गैर-संख्यात्मक मान अनदेखा करें",
+ "inputTitle": "इनपुट संख्याएं",
+ "numberExtraction": "संख्या निष्कर्षण",
+ "printRunningSum": "चल योग प्रिंट करें",
+ "printRunningSumDescription": "चरण दर चरण गणना करके योग प्रदर्शित करें।",
+ "resultFormat": "परिणाम प्रारूप",
+ "resultTitle": "योग",
+ "runningSum": "चल योग",
+ "separatorPlaceholder": "विभाजक",
+ "shortDescription": "संख्याओं का योग ज्ञात कीजिए",
+ "showAverage": "औसत दिखाएं",
+ "showCount": "गणना दिखाएं",
+ "showSum": "योग दिखाएं",
+ "sumOptions": "जोड़ने के विकल्प",
+ "title": "संख्याएं जोड़ें",
+ "toolInfo": {
+ "description": "यह संख्याओं के समूह का योग निकालने के लिए एक ऑनलाइन ब्राउज़र-आधारित उपयोगिता है। आप संख्याओं को अल्पविराम, रिक्त स्थान या किसी अन्य वर्ण (लाइन ब्रेक सहित) से अलग करके दर्ज कर सकते हैं। आप पाठ्य डेटा का एक अंश भी पेस्ट कर सकते हैं जिसमें वे संख्यात्मक मान हों जिनका आप योग करना चाहते हैं और उपयोगिता उन्हें निकालकर उनका योग ज्ञात कर लेगी।",
+ "title": "संख्या योग कैलकुलेटर क्या है?"
+ }
+ },
+ "voltageDropInWire": {
+ "description": "2 कंडक्टर केबल में राउंड ट्रिप वोल्टेज और बिजली हानि की गणना करता है",
+ "longDescription": "यह कैलकुलेटर दो-चालक विद्युत केबल में वोल्टेज ड्रॉप और पावर लॉस का पता लगाने में मदद करता है। यह केबल की लंबाई, तार के गेज (अनुप्रस्थ क्षेत्र), पदार्थ की प्रतिरोधकता और धारा प्रवाह को ध्यान में रखता है। यह उपकरण राउंड-ट्रिप वोल्टेज ड्रॉप, केबल के कुल प्रतिरोध और ऊष्मा के रूप में क्षय होने वाली शक्ति की गणना करता है। यह विशेष रूप से विद्युत इंजीनियरों, इलेक्ट्रीशियनों और शौकिया लोगों के लिए उपयोगी है, जब वे विद्युत प्रणालियों को डिज़ाइन करते हैं ताकि यह सुनिश्चित किया जा सके कि वोल्टेज का स्तर लोड पर स्वीकार्य सीमा के भीतर रहे।",
+ "shortDescription": "लंबाई, सामग्री और धारा के आधार पर विद्युत केबलों में वोल्टेज ड्रॉप और बिजली हानि की गणना करें",
+ "title": "केबल में राउंड ट्रिप वोल्टेज ड्रॉप"
+ }
+}
diff --git a/public/locales/hi/pdf.json b/public/locales/hi/pdf.json
new file mode 100644
index 0000000..33b2524
--- /dev/null
+++ b/public/locales/hi/pdf.json
@@ -0,0 +1,159 @@
+{
+ "compressPdf": {
+ "compressedFileSize": "संपीड़ित फ़ाइल का आकार",
+ "compressingPdf": "पीडीएफ संपीड़ित किया जा रहा है...",
+ "compressionLevel": "संपीड़न स्तर",
+ "compressionOptions": "संपीड़न विकल्प",
+ "compressionSettings": "संपीड़न सेटिंग्स",
+ "description": "PDF फ़ाइल आकार कम करें।",
+ "errorCompressingPdf": "पीडीएफ संपीड़ित करने में विफल: {{error}}",
+ "errorReadingPdf": "PDF फ़ाइल पढ़ने में विफल। कृपया सुनिश्चित करें कि यह एक मान्य PDF है।",
+ "fileSize": "मूल फ़ाइल आकार",
+ "high": "उच्च",
+ "highCompression": "उच्च संपीड़न",
+ "highCompressionDescription": "कुछ गुणवत्ता हानि के साथ अधिकतम फ़ाइल आकार में कमी",
+ "imageQuality": "छवि गुणवत्ता",
+ "inputTitle": "इनपुट PDF",
+ "low": "कम",
+ "lowCompression": "कम संपीड़न",
+ "lowCompressionDescription": "न्यूनतम गुणवत्ता हानि के साथ फ़ाइल आकार को थोड़ा कम करें",
+ "medium": "मध्यम",
+ "mediumCompression": "मध्यम संपीड़न",
+ "mediumCompressionDescription": "फ़ाइल आकार और गुणवत्ता के बीच संतुलन",
+ "pages": "पृष्ठों की संख्या",
+ "qualityPlaceholder": "गुणवत्ता (1-100)",
+ "removeMetadata": "मेटाडेटा हटाएं",
+ "resultTitle": "संपीड़ित PDF",
+ "shortDescription": "अपने ब्राउज़र में सुरक्षित रूप से पीडीएफ फ़ाइलों को संपीड़ित करें",
+ "title": "PDF संपीड़ित करें"
+ },
+ "editor": {
+ "description": "एनोटेशन, फ़ॉर्म-फ़िल, हाइलाइट और निर्यात क्षमताओं वाला उन्नत PDF संपादक। टेक्स्ट इंसर्शन, ड्रॉइंग, हाइलाइटिंग, हस्ताक्षर और फ़ॉर्म भरने जैसे पेशेवर-स्तरीय टूल से सीधे ब्राउज़र में अपनी PDF फ़ाइलों को संपादित करें।",
+ "shortDescription": "उन्नत एनोटेशन, हस्ताक्षर और संपादन टूल के साथ PDF संपादित करें",
+ "title": "पीडीएफ संपादक"
+ },
+ "merge": {
+ "inputTitle": "इनपुट PDF",
+ "loadingText": "पृष्ठ निकालना",
+ "resultTitle": "आउटपुट मर्ज किया गया PDF",
+ "toolInfo": {
+ "description": "यह टूल आपको कई PDF फ़ाइलों को एक ही दस्तावेज़ में मर्ज करने की सुविधा देता है। इस टूल का इस्तेमाल करने के लिए, बस उन PDF फ़ाइलों को अपलोड करें जिन्हें आप मर्ज करना चाहते हैं। फिर यह टूल इनपुट फ़ाइलों के सभी पृष्ठों को एक ही PDF दस्तावेज़ में मर्ज कर देगा।",
+ "title": "मर्ज पीडीएफ टूल का उपयोग कैसे करें?"
+ }
+ },
+ "mergePdf": {
+ "customOrder": "कस्टम क्रम",
+ "description": "कई PDF फ़ाइलों को एक दस्तावेज़ में जोड़ें।",
+ "includeBookmarks": "बुकमार्क शामिल करें",
+ "inputTitle": "इनपुट PDF फ़ाइलें",
+ "mergeOptions": "मर्ज विकल्प",
+ "mergeOrder": "मर्ज क्रम",
+ "mergingPdfs": "PDF को मर्ज करना",
+ "orderByFilename": "फ़ाइल नाम के अनुसार क्रम",
+ "orderByUpload": "अपलोड क्रम के अनुसार",
+ "pdfOptions": "पीडीएफ विकल्प",
+ "resultTitle": "मर्ज किया गया PDF",
+ "shortDescription": "कई पीडीएफ फ़ाइलों को एक दस्तावेज़ में मर्ज करें",
+ "sortByFileName": "फ़ाइल नाम के अनुसार क्रमबद्ध करें",
+ "sortByFileNameDescription": "PDF को फ़ाइल नाम के अनुसार वर्णानुक्रम में क्रमबद्ध करें",
+ "sortByUploadOrder": "अपलोड क्रम के अनुसार क्रमबद्ध करें",
+ "sortByUploadOrderDescription": "PDF को उसी क्रम में रखें जिस क्रम में उन्हें अपलोड किया गया था",
+ "title": "PDF मर्ज करें",
+ "toolInfo": {
+ "description": "यह टूल आपको कई PDF फ़ाइलों को एक ही दस्तावेज़ में संयोजित करने की सुविधा देता है। आप PDF फ़ाइलों को क्रमबद्ध करने का तरीका चुन सकते हैं और यह टूल उन्हें निर्दिष्ट क्रम में मर्ज कर देगा।",
+ "title": "पीडीएफ फाइलों को मर्ज करें"
+ }
+ },
+ "pdfToEpub": {
+ "conversionOptions": "रूपांतरण विकल्प",
+ "description": "PDF दस्तावेज़ों को EPUB फ़ाइलों में बदलें।",
+ "extractImages": "छवियां निकालें",
+ "generateToc": "सामग्री तालिका उत्पन्न करें",
+ "inputTitle": "इनपुट PDF",
+ "preserveFormatting": "फॉर्मेटिंग संरक्षित करें",
+ "resultTitle": "EPUB फ़ाइल",
+ "shortDescription": "पीडीएफ फ़ाइलों को ईपीयूबी प्रारूप में बदलें",
+ "title": "PDF से EPUB"
+ },
+ "pdfToPng": {
+ "description": "पीडीएफ दस्तावेजों को पीएनजी पैनल में बदलें।",
+ "longDescription": "एक PDF अपलोड करें और प्रत्येक पृष्ठ को सीधे अपने ब्राउज़र में एक उच्च-गुणवत्ता वाली PNG छवि में बदलें। यह टूल विज़ुअल सामग्री निकालने या अलग-अलग पृष्ठों को साझा करने के लिए आदर्श है। कोई डेटा अपलोड नहीं किया जाता है - सब कुछ स्थानीय रूप से चलता है।",
+ "shortDescription": "PDF को PNG छवियों में परिवर्तित करें",
+ "title": "पीडीएफ से पीएनजी"
+ },
+ "protectPdf": {
+ "allowCopying": "कॉपी करने की अनुमति दें",
+ "allowModification": "संशोधन की अनुमति दें",
+ "allowPrinting": "प्रिंटिंग की अनुमति दें",
+ "description": "PDF फ़ाइलों में पासवर्ड सुरक्षा जोड़ें।",
+ "inputTitle": "इनपुट PDF",
+ "ownerPassword": "मालिक पासवर्ड",
+ "ownerPasswordPlaceholder": "पासवर्ड",
+ "permissions": "अनुमतियां",
+ "protectionOptions": "सुरक्षा विकल्प",
+ "resultTitle": "सुरक्षित PDF",
+ "shortDescription": "पीडीएफ फ़ाइलों को सुरक्षित रूप से पासवर्ड सुरक्षित करें",
+ "title": "PDF सुरक्षित करें",
+ "userPassword": "उपयोगकर्ता पासवर्ड",
+ "userPasswordPlaceholder": "पासवर्ड"
+ },
+ "rotatePdf": {
+ "allPagesWillBeRotated": "सभी {{count}} पृष्ठ घुमाए जाएंगे",
+ "angle180": "180 डिग्री",
+ "angle270": "270 डिग्री",
+ "angle90": "90 डिग्री",
+ "angleOptions": {
+ "clockwise90": "90° दक्षिणावर्त",
+ "counterClockwise270": "270° (90° वामावर्त)",
+ "upsideDown180": "180° (उल्टा)"
+ },
+ "applyToAll": "सभी पेजों पर लागू करें",
+ "applyToAllPages": "सभी पृष्ठों पर लागू करें",
+ "applyToSelected": "चयनित पेजों पर लागू करें",
+ "description": "PDF पेजों को घुमाएं।",
+ "inputTitle": "इनपुट PDF",
+ "longDescription": "PDF पृष्ठों को 90, 180, या 270 डिग्री घुमाकर उनका ओरिएंटेशन बदलें। गलत तरीके से स्कैन किए गए दस्तावेज़ों को ठीक करने या PDF को प्रिंट करने के लिए तैयार करने में उपयोगी।",
+ "pageRangesDescription": "पृष्ठ संख्या या श्रेणियाँ अल्पविराम से अलग करके दर्ज करें (उदाहरण के लिए, 1,3,5-7)",
+ "pageRangesPlaceholder": "उदाहरणार्थ, 1,5-8",
+ "pagesPlaceholder": "जैसे 1,3-5,7",
+ "pagesWillBeRotated": "{{count}} पृष्ठ{{count !== 1 ? 's' : ''}} घुमाया जाएगा",
+ "pdfPageCount": "पीडीएफ में है {{count}} पृष्ठ{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "घुमाया गया PDF",
+ "rotatingPages": "घूमते हुए पृष्ठ",
+ "rotationAngle": "घुमाने का कोण",
+ "rotationOptions": "घुमाने के विकल्प",
+ "rotationSettings": "रोटेशन सेटिंग्स",
+ "selectedPages": "चयनित पेज",
+ "shortDescription": "PDF दस्तावेज़ में पृष्ठों को घुमाएँ",
+ "title": "PDF घुमाएं",
+ "toolInfo": {
+ "description": "यह टूल आपको PDF दस्तावेज़ में पृष्ठों को घुमाने की सुविधा देता है। आप सभी पृष्ठों को घुमा सकते हैं या घुमाने के लिए अलग-अलग पृष्ठ निर्दिष्ट कर सकते हैं। घुमाव कोण चुनें: 90° दक्षिणावर्त, 180° (उल्टा), या 270° (90° वामावर्त)। विशिष्ट पृष्ठों को घुमाने के लिए, \"सभी पृष्ठों पर लागू करें\" को अनचेक करें और पृष्ठ संख्याएँ या अल्पविराम से अलग की गई श्रेणियाँ (जैसे, 1,3,5-7) दर्ज करें।",
+ "title": "रोटेट पीडीएफ टूल का उपयोग कैसे करें"
+ }
+ },
+ "splitPdf": {
+ "description": "PDF फ़ाइल से विशिष्ट पेज निकालें।",
+ "extractingPages": "पृष्ठ निकालना",
+ "includeBookmarks": "बुकमार्क शामिल करें",
+ "inputTitle": "इनपुट PDF",
+ "pageExtractionPreview": "{{count}} पृष्ठ{{count !== 1 ? 's' : ''}} निकाला जाएगा",
+ "pageRanges": "पेज श्रेणियां",
+ "pageRangesDescription": "पृष्ठ संख्या या श्रेणियाँ अल्पविराम से अलग करके दर्ज करें (उदाहरण के लिए, 1,3,5-7)",
+ "pageRangesPlaceholder": "उदाहरणार्थ, 1,5-8",
+ "pageSelection": "पृष्ठ चयन",
+ "pdfPageCount": "पीडीएफ में है {{count}} पृष्ठ{{count !== 1 ? 's' : ''}}",
+ "rangesPlaceholder": "जैसे 1,3-5,7",
+ "resultTitle": "विभाजित PDF फ़ाइलें",
+ "shortDescription": "पीडीएफ फ़ाइल से विशिष्ट पेज निकालें",
+ "splitByBookmarks": "बुकमार्क द्वारा विभाजित करें",
+ "splitByPages": "पेज द्वारा विभाजित करें",
+ "splitByRanges": "श्रेणियों द्वारा विभाजित करें",
+ "splitMethod": "विभाजन विधि",
+ "splitOptions": "विभाजन विकल्प",
+ "title": "PDF विभाजित करें",
+ "toolInfo": {
+ "description": "यह टूल आपको किसी PDF दस्तावेज़ से विशिष्ट पृष्ठ निकालने की सुविधा देता है। आप निकालने के लिए अलग-अलग पृष्ठ या पृष्ठों की श्रेणी निर्दिष्ट कर सकते हैं।",
+ "title": "PDF विभाजित करें"
+ }
+ }
+}
diff --git a/public/locales/hi/string.json b/public/locales/hi/string.json
new file mode 100644
index 0000000..25b3f10
--- /dev/null
+++ b/public/locales/hi/string.json
@@ -0,0 +1,261 @@
+{
+ "base64": {
+ "decode": "बेस64 डिकोड",
+ "description": "बेस64 एनकोडिंग का उपयोग करके टेक्स्ट को एनकोड या डिकोड करें।",
+ "encode": "बेस64 एनकोड",
+ "inputTitle": "इनपुट डेटा",
+ "optionsTitle": "बेस64 विकल्प",
+ "resultTitle": "परिणाम",
+ "shortDescription": "बेस64 का उपयोग करके डेटा को एनकोड या डिकोड करें।",
+ "title": "बेस64 एनकोडर/डिकोडर",
+ "toolInfo": {
+ "description": "बेस64 एक एनकोडिंग योजना है जो डेटा को रेडिक्स-64 प्रतिनिधित्व में अनुवाद करके ASCII स्ट्रिंग प्रारूप में प्रस्तुत करती है। हालांकि इसका उपयोग स्ट्रिंग्स को एनकोड करने के लिए किया जा सकता है, यह आमतौर पर बाइनरी डेटा को एनकोड करने के लिए उपयोग किया जाता है जो टेक्स्ट डेटा से निपटने के लिए डिज़ाइन किए गए मीडिया पर प्रसारण के लिए होता है।",
+ "title": "बेस64 क्या है?"
+ }
+ },
+ "censor": {
+ "description": "पाठ में शब्दों को सेंसर करने की उपयोगिता। बाईं ओर दिए गए इनपुट फ़ॉर्म में अपना पाठ लोड करें, विकल्पों में सभी गलत शब्द निर्दिष्ट करें, और आपको आउटपुट क्षेत्र में तुरंत सेंसर किया गया पाठ मिल जाएगा।\", longDescription: 'इस ऑनलाइन टूल से, आप किसी भी पाठ में कुछ शब्दों को सेंसर कर सकते हैं। आप अवांछित शब्दों (जैसे अपशब्द या गुप्त शब्द) की एक सूची निर्दिष्ट कर सकते हैं और प्रोग्राम उन्हें वैकल्पिक शब्दों से बदलकर एक सुरक्षित पाठ तैयार कर देगा। विकल्पों में एक बहु-पंक्ति पाठ फ़ील्ड में प्रति पंक्ति एक शब्द दर्ज करके शब्दों को निर्दिष्ट किया जा सकता है।', keywords: ['text', 'censor', 'words', 'characters'], component: lazy(() => import('./index')), i18n: { name: 'string:censor.title', description: 'string:censor.description'",
+ "shortDescription": "बुरे शब्दों को तुरंत हटा दें या उन्हें वैकल्पिक शब्दों से बदल दें।",
+ "title": "पाठ सेंसर"
+ },
+ "createPalindrome": {
+ "description": "किसी भी टेक्स्ट से पैलिंड्रोम बनाने के लिए दुनिया का सबसे सरल ब्राउज़र-आधारित उपयोगिता। टेक्स्ट इनपुट करें और इसे तुरंत एक पैलिंड्रोम में बदल दें जो आगे और पीछे एक जैसा पढ़ता है। शब्द खेलों, सममित टेक्स्ट पैटर्न बनाने, या भाषाई जिज्ञासाओं की खोज के लिए बिल्कुल सही।",
+ "shortDescription": "ऐसा टेक्स्ट बनाएं जो आगे और पीछे एक जैसा पढ़ता है",
+ "title": "पैलिंड्रोम बनाएं"
+ },
+ "extractSubstring": {
+ "description": "टेक्स्ट से सबस्ट्रिंग निकालने के लिए दुनिया की सबसे सरल ब्राउज़र-आधारित उपयोगिता। अपना टेक्स्ट इनपुट करें और वांछित भाग निकालने के लिए आरंभ और अंत स्थितियाँ निर्दिष्ट करें। डेटा प्रोसेसिंग, टेक्स्ट विश्लेषण, या बड़े टेक्स्ट ब्लॉक से विशिष्ट सामग्री निकालने के लिए बिल्कुल सही।",
+ "shortDescription": "निर्दिष्ट स्थानों के बीच पाठ का एक भाग निकालें",
+ "title": "सबस्ट्रिंग निकालें"
+ },
+ "join": {
+ "blankLinesAndTrailingSpaces": "खाली पंक्तियां और अनुगामी स्थान",
+ "deleteBlankDescription": "उन पंक्तियों को हटाएं जिनमें टेक्स्ट प्रतीक नहीं हैं।",
+ "deleteBlankTitle": "खाली पंक्तियां हटाएं",
+ "deleteTrailingDescription": "पंक्तियों के अंत से स्पेस और टैब हटाएं।",
+ "deleteTrailingTitle": "अनुगामी स्थान हटाएं",
+ "description": "कस्टमाइज़ करने योग्य विभाजकों के साथ टेक्स्ट टुकड़ों को एक साथ जोड़ें।",
+ "inputTitle": "टेक्स्ट टुकड़े",
+ "joinCharacterDescription": "प्रतीक जो टेक्स्ट के टूटे हुए टुकड़ों को जोड़ता है। (डिफ़ॉल्ट रूप से स्पेस।)",
+ "joinCharacterPlaceholder": "जोड़ने का वर्ण",
+ "resultTitle": "जुड़ा हुआ टेक्स्ट",
+ "shortDescription": "निर्दिष्ट विभाजक के साथ पाठ तत्वों को जोड़ें",
+ "textMergedOptions": "टेक्स्ट मर्ज विकल्प",
+ "title": "टेक्स्ट जोड़ें",
+ "toolInfo": {
+ "description": "इस टूल के साथ आप टेक्स्ट के भागों को एक साथ जोड़ सकते हैं। यह नई पंक्तियों से अलग किए गए टेक्स्ट मूल्यों की सूची लेता है और उन्हें एक साथ मर्ज करता है। आप उस वर्ण को सेट कर सकते हैं जो संयुक्त टेक्स्ट के भागों के बीच रखा जाएगा। साथ ही, आप सभी खाली पंक्तियों को अनदेखा कर सकते हैं और सभी पंक्तियों के अंत से स्पेस और टैब हटा सकते हैं। टेक्स्टाबुलस!",
+ "title": "टेक्स्ट जोइनर क्या है?"
+ }
+ },
+ "palindrome": {
+ "description": "यह जांचने के लिए दुनिया का सबसे सरल ब्राउज़र-आधारित उपयोगिता कि टेक्स्ट पैलिंड्रोम है या नहीं। तुरंत सत्यापित करें कि क्या आपका टेक्स्ट आगे और पीछे एक जैसा पढ़ता है। शब्द पहेलियों, भाषाई विश्लेषण, या सममित टेक्स्ट पैटर्न को मान्य करने के लिए बिल्कुल सही। विभिन्न विभाजकों और बहु-शब्द पैलिंड्रोम पहचान का समर्थन करता है।",
+ "shortDescription": "जांचें कि क्या टेक्स्ट आगे और पीछे एक जैसा पढ़ता है",
+ "title": "पैलिंड्रोम"
+ },
+ "passwordGenerator": {
+ "avoidAmbiguous": "अस्पष्ट वर्णों (i, I, l, 0, O) से बचें",
+ "description": "अनुकूलन योग्य लंबाई और वर्ण प्रकारों के साथ सुरक्षित, यादृच्छिक पासवर्ड बनाएँ। लोअरकेस, अपरकेस, संख्याएँ और विशेष वर्णों में से चुनें। बेहतर पठनीयता के लिए अस्पष्ट वर्णों से बचने का विकल्प।",
+ "includeLowercase": "छोटे अक्षर (a-z) शामिल करें",
+ "includeNumbers": "संख्याएँ शामिल करें (0-9)",
+ "includeSymbols": "विशेष वर्ण शामिल करें",
+ "includeUppercase": "बड़े अक्षर (A-Z) शामिल करें",
+ "lengthDesc": "पासवर्ड की लंबाई",
+ "lengthPlaceholder": "उदाहरणार्थ 12",
+ "optionsTitle": "पासवर्ड विकल्प",
+ "resultTitle": "जनरेट किया गया पासवर्ड",
+ "shortDescription": "कस्टम विकल्पों के साथ सुरक्षित यादृच्छिक पासवर्ड उत्पन्न करें",
+ "title": "पासवर्ड जनरेटर",
+ "toolInfo": {
+ "description": "यह टूल आपके चुने हुए मानदंडों के आधार पर सुरक्षित, यादृच्छिक पासवर्ड बनाता है। आप लंबाई को अनुकूलित कर सकते हैं, विभिन्न प्रकार के वर्णों को शामिल या हटा सकते हैं, और बेहतर पठनीयता के लिए अस्पष्ट वर्णों से बच सकते हैं। खातों, एप्लिकेशन या किसी भी सुरक्षा आवश्यकताओं के लिए मज़बूत पासवर्ड बनाने के लिए यह एकदम सही है।",
+ "title": "पासवर्ड जनरेटर के बारे में"
+ }
+ },
+ "quote": {
+ "allowDoubleQuotation": "दोहरे उद्धरण की अनुमति दें",
+ "description": "कस्टमाइज़ करने योग्य विकल्पों के साथ टेक्स्ट के चारों ओर उद्धरण जोड़ें।",
+ "inputTitle": "इनपुट टेक्स्ट",
+ "leftQuoteDescription": "बाएं उद्धरण वर्ण",
+ "processAsMultiLine": "बहु-पंक्ति टेक्स्ट के रूप में प्रक्रिया करें",
+ "quoteEmptyLines": "खाली पंक्तियों को कोट करें",
+ "quoteOptions": "उद्धरण विकल्प",
+ "resultTitle": "कोटेड टेक्स्ट",
+ "rightQuoteDescription": "दाएं उद्धरण वर्ण",
+ "shortDescription": "विभिन्न शैलियों के साथ पाठ के चारों ओर उद्धरण जोड़ें",
+ "title": "टेक्स्ट कोटर",
+ "toolInfo": {
+ "description": "यह टूल आपको टेक्स्ट के चारों ओर उद्धरण जोड़ने की अनुमति देता है। आप विभिन्न उद्धरण वर्ण चुन सकते हैं, बहु-पंक्ति टेक्स्ट को संभाल सकते हैं, और नियंत्रित कर सकते हैं कि खाली पंक्तियों को कैसे संसाधित किया जाता है। यह प्रोग्रामिंग के लिए टेक्स्ट तैयार करने, डेटा को फॉर्मेट करने, या स्टाइलिश टेक्स्ट बनाने के लिए उपयोगी है।",
+ "title": "टेक्स्ट कोटर"
+ }
+ },
+ "randomizeCase": {
+ "description": "टेक्स्ट केस को रैंडमाइज़ करने के लिए दुनिया की सबसे सरल ब्राउज़र-आधारित उपयोगिता। अपना टेक्स्ट इनपुट करें और उसे तुरंत रैंडम अपर और लोअर केस अक्षरों से बदल दें। अनोखे टेक्स्ट इफ़ेक्ट बनाने, केस सेंसिटिविटी टेस्ट करने, या अलग-अलग टेक्स्ट पैटर्न बनाने के लिए बिल्कुल सही।",
+ "shortDescription": "पाठ में अक्षरों के केस को यादृच्छिक करें",
+ "title": "मामले को यादृच्छिक करें"
+ },
+ "removeDuplicateLines": {
+ "description": "बाईं ओर दिए गए इनपुट फ़ॉर्म में अपना टेक्स्ट लोड करें और आपको तुरंत ऐसा टेक्स्ट मिलेगा जिसमें आउटपुट क्षेत्र में कोई डुप्लिकेट लाइन नहीं होगी। शक्तिशाली, मुफ़्त और तेज़। टेक्स्ट लाइन लोड करें - अनोखी टेक्स्ट लाइन प्राप्त करें",
+ "shortDescription": "पाठ से सभी दोहराई गई पंक्तियों को तुरंत हटाएँ",
+ "title": "डुप्लिकेट पंक्तियाँ हटाएँ"
+ },
+ "repeat": {
+ "delimiterDescription": "आउटपुट प्रतियों के लिए विभाजक।",
+ "delimiterPlaceholder": "विभाजक",
+ "description": "कस्टमाइज़ करने योग्य विभाजकों के साथ टेक्स्ट को कई बार दोहराएं।",
+ "inputTitle": "इनपुट टेक्स्ट",
+ "numberPlaceholder": "संख्या",
+ "repeatAmountDescription": "दोहराव की संख्या।",
+ "repetitionsDelimiter": "दोहराव विभाजक",
+ "resultTitle": "दोहराया गया टेक्स्ट",
+ "shortDescription": "टेक्स्ट को कई बार दोहराएं",
+ "textRepetitions": "टेक्स्ट दोहराव",
+ "title": "टेक्स्ट दोहराएं",
+ "toolInfo": {
+ "description": "यह टूल आपको वैकल्पिक विभाजक के साथ दिए गए टेक्स्ट को कई बार दोहराने की अनुमति देता है।",
+ "title": "टेक्स्ट दोहराएं"
+ }
+ },
+ "reverse": {
+ "description": "टेक्स्ट में वर्णों के क्रम को उलटा करें।",
+ "inputTitle": "इनपुट टेक्स्ट",
+ "processMultiLine": "बहु-पंक्ति टेक्स्ट के रूप में प्रक्रिया करें (प्रत्येक पंक्ति को अलग से उलटा करें)",
+ "processMultiLineDescription": "प्रत्येक पंक्ति स्वतंत्र रूप से उलटी जाएगी",
+ "resultTitle": "उलटा टेक्स्ट",
+ "reversalOptions": "उलट विकल्प",
+ "shortDescription": "किसी भी टेक्स्ट को वर्ण दर वर्ण उलटा करें",
+ "skipEmptyLines": "खाली पंक्तियों को छोड़ें",
+ "skipEmptyLinesDescription": "आउटपुट से खाली लाइनें हटा दी जाएंगी",
+ "title": "टेक्स्ट उलटा करें",
+ "trimWhitespace": "पंक्तियों से सफेद स्थान ट्रिम करें",
+ "trimWhitespaceDescription": "प्रत्येक पंक्ति से आरंभिक और अंतिम रिक्त स्थान हटाएँ"
+ },
+ "rot13": {
+ "description": "ROT13 सिफर का उपयोग करके टेक्स्ट को एनकोड या डिकोड करें।",
+ "inputTitle": "इनपुट टेक्स्ट",
+ "resultTitle": "ROT13 परिणाम",
+ "shortDescription": "ROT13 सिफर का उपयोग करके टेक्स्ट को एनकोड या डिकोड करें।",
+ "title": "ROT13 एनकोडर/डिकोडर",
+ "toolInfo": {
+ "description": "ROT13 (13 स्थानों से घुमाएं) एक सरल अक्षर प्रतिस्थापन सिफर है जो एक अक्षर को वर्णमाला में उसके बाद के 13वें अक्षर से बदल देता है। ROT13 सीज़र सिफर का एक विशेष मामला है जो प्राचीन रोम में विकसित किया गया था। क्योंकि अंग्रेजी वर्णमाला में 26 अक्षर हैं, ROT13 अपना स्वयं का व्युत्क्रम है; अर्थात, ROT13 को पूर्ववत करने के लिए, एक ही एल्गोरिथम लागू किया जाता है, इसलिए एनकोडिंग और डिकोडिंग दोनों के लिए एक ही क्रिया का उपयोग किया जा सकता है।",
+ "title": "ROT13 क्या है?"
+ }
+ },
+ "rotate": {
+ "description": "निर्दिष्ट स्थानों द्वारा टेक्स्ट में वर्णों को घुमाएं।",
+ "inputTitle": "इनपुट टेक्स्ट",
+ "processAsMultiLine": "बहु-पंक्ति टेक्स्ट के रूप में प्रक्रिया करें (प्रत्येक पंक्ति को अलग से घुमाएं)",
+ "resultTitle": "घुमाया गया टेक्स्ट",
+ "rotateLeft": "बाईं ओर घुमाएं",
+ "rotateRight": "दाईं ओर घुमाएं",
+ "rotationOptions": "घुमाने के विकल्प",
+ "shortDescription": "पाठ में वर्णों को स्थान के अनुसार स्थानांतरित करें।",
+ "stepDescription": "घुमाने के लिए स्थानों की संख्या",
+ "title": "टेक्स्ट घुमाएं",
+ "toolInfo": {
+ "description": "यह टूल आपको निर्दिष्ट संख्या में स्थानों द्वारा स्ट्रिंग में वर्णों को घुमाने की अनुमति देता है। आप बाएं या दाएं घुमा सकते हैं, और प्रत्येक पंक्ति को अलग से घुमाकर बहु-पंक्ति टेक्स्ट को संसाधित कर सकते हैं। स्ट्रिंग रोटेशन सरल टेक्स्ट परिवर्तनों, पैटर्न बनाने, या बुनियादी एन्क्रिप्शन तकनीकों को लागू करने के लिए उपयोगी है।",
+ "title": "स्ट्रिंग रोटेशन"
+ }
+ },
+ "split": {
+ "charAfterChunkDescription": "प्रत्येक चंक के बाद वर्ण",
+ "charBeforeChunkDescription": "प्रत्येक चंक से पहले वर्ण",
+ "chunksDescription": "आउटपुट में समान लंबाई के चंक की संख्या।",
+ "chunksTitle": "चंक की संख्या का उपयोग करें",
+ "description": "विभिन्न मानदंडों के आधार पर टेक्स्ट को भागों में विभाजित करें।",
+ "lengthDescription": "प्रत्येक आउटपुट चंक में रखे जाने वाले वर्णों की संख्या।",
+ "lengthTitle": "विभाजन के लिए लंबाई का उपयोग करें",
+ "outputSeparatorDescription": "वर्ण जो विभाजित चंक के बीच रखा जाएगा। (यह डिफ़ॉल्ट रूप से नई पंक्ति \"\\n\" है।)",
+ "outputSeparatorOptions": "आउटपुट विभाजक विकल्प",
+ "regexDescription": "नियमित अभिव्यक्ति जो टेक्स्ट को भागों में तोड़ने के लिए उपयोग की जाएगी। (डिफ़ॉल्ट रूप से कई स्पेस।)",
+ "regexTitle": "विभाजन के लिए रेगेक्स का उपयोग करें",
+ "resultTitle": "टेक्स्ट टुकड़े",
+ "shortDescription": "विभाजक का उपयोग करके पाठ को कई भागों में विभाजित करें",
+ "splitSeparatorOptions": "विभाजक विकल्प",
+ "symbolDescription": "वर्ण जो टेक्स्ट को भागों में तोड़ने के लिए उपयोग किया जाएगा। (डिफ़ॉल्ट रूप से स्पेस।)",
+ "symbolTitle": "विभाजन के लिए प्रतीक का उपयोग करें",
+ "title": "टेक्स्ट विभाजित करें"
+ },
+ "statistic": {
+ "characterFrequencyAnalysis": "वर्ण आवृत्ति विश्लेषण",
+ "characterFrequencyAnalysisDescription": "गणना करें कि प्रत्येक वर्ण टेक्स्ट में कितनी बार दिखाई देता है",
+ "delimitersOptions": "विभाजक विकल्प",
+ "description": "टेक्स्ट का विश्लेषण करें और व्यापक आंकड़े उत्पन्न करें।",
+ "includeEmptyLines": "खाली पंक्तियां शामिल करें",
+ "includeEmptyLinesDescription": "पंक्तियों की गणना करते समय खाली पंक्तियां शामिल करें",
+ "inputTitle": "इनपुट टेक्स्ट",
+ "resultTitle": "टेक्स्ट आंकड़े",
+ "sentenceDelimitersDescription": "अपनी भाषा में वाक्यों को विभाजित करने के लिए उपयोग किए जाने वाले कस्टम वर्ण दर्ज करें (कॉमा से अलग) या डिफ़ॉल्ट के लिए इसे खाली छोड़ दें।",
+ "sentenceDelimitersPlaceholder": "जैसे ., !, ?, ...",
+ "shortDescription": "अपने पाठ के बारे में आँकड़े प्राप्त करें",
+ "statisticsOptions": "आंकड़े विकल्प",
+ "title": "टेक्स्ट आंकड़े",
+ "toolInfo": {
+ "description": "यह टूल आपको टेक्स्ट का विश्लेषण करने और वर्ण गणना, शब्द गणना, पंक्ति गणना, और वर्णों और शब्दों के आवृत्ति विश्लेषण सहित व्यापक आंकड़े उत्पन्न करने की अनुमति देता है।",
+ "title": "{{title}} क्या है?"
+ },
+ "wordDelimitersDescription": "शब्दों की गणना के लिए कस्टम रेगेक्स दर्ज करें या डिफ़ॉल्ट के लिए इसे खाली छोड़ दें।",
+ "wordDelimitersPlaceholder": "जैसे \\s.,;:!?\"«»()…",
+ "wordFrequencyAnalysis": "शब्द आवृत्ति विश्लेषण",
+ "wordFrequencyAnalysisDescription": "गणना करें कि प्रत्येक शब्द टेक्स्ट में कितनी बार दिखाई देता है"
+ },
+ "textReplacer": {
+ "description": "टेक्स्ट पैटर्न को नई सामग्री से बदलें।",
+ "findPatternInText": "टेक्स्ट में यह पैटर्न खोजें",
+ "findPatternUsingRegexp": "रेगेक्स का उपयोग करके पैटर्न खोजें",
+ "inputTitle": "बदलने के लिए टेक्स्ट",
+ "newTextPlaceholder": "नया टेक्स्ट",
+ "regexpDescription": "उस नियमित अभिव्यक्ति को दर्ज करें जिसे आप बदलना चाहते हैं।",
+ "replacePatternDescription": "प्रतिस्थापन के लिए उपयोग करने के लिए पैटर्न दर्ज करें।",
+ "replaceText": "टेक्स्ट बदलें",
+ "resultTitle": "प्रतिस्थापन के साथ टेक्स्ट",
+ "searchPatternDescription": "उस टेक्स्ट पैटर्न को दर्ज करें जिसे आप बदलना चाहते हैं।",
+ "searchText": "खोज टेक्स्ट",
+ "shortDescription": "अपनी सामग्री में टेक्स्ट को तुरंत बदलें",
+ "title": "टेक्स्ट रिप्लेसर",
+ "toolInfo": {
+ "description": "इस सरल, ब्राउज़र-आधारित टूल के साथ अपनी सामग्री में विशिष्ट टेक्स्ट को आसानी से बदलें। बस अपना टेक्स्ट इनपुट करें, उस टेक्स्ट को सेट करें जिसे आप बदलना चाहते हैं और प्रतिस्थापन मूल्य, और तुरंत अपडेटेड संस्करण प्राप्त करें।",
+ "title": "टेक्स्ट रिप्लेसर"
+ }
+ },
+ "toMorse": {
+ "dashSymbolDescription": "प्रतीक जो मोर्स कोड में डैश के अनुरूप होगा।",
+ "description": "टेक्स्ट को मोर्स कोड में बदलें।",
+ "dotSymbolDescription": "प्रतीक जो मोर्स कोड में डॉट के अनुरूप होगा।",
+ "longSignal": "लंबा संकेत",
+ "resultTitle": "मोर्स कोड",
+ "shortDescription": "टेक्स्ट को जल्दी से मोर्स में एनकोड करें",
+ "shortSignal": "छोटा संकेत",
+ "title": "मोर्स में"
+ },
+ "truncate": {
+ "addTruncationIndicator": "काटने का संकेतक जोड़ें",
+ "charactersPlaceholder": "वर्ण",
+ "description": "टेक्स्ट को निर्दिष्ट लंबाई तक छोटा करें।",
+ "indicatorDescription": "टेक्स्ट के अंत (या शुरुआत) में जोड़ने के लिए वर्ण। नोट: वे लंबाई की ओर गिने जाते हैं।",
+ "inputTitle": "इनपुट टेक्स्ट",
+ "leftSideDescription": "टेक्स्ट की शुरुआत से वर्ण हटाएं।",
+ "leftSideTruncation": "बाईं तरफ काटना",
+ "lengthAndLines": "लंबाई और पंक्तियां",
+ "lineByLineDescription": "प्रत्येक पंक्ति को अलग से काटें।",
+ "lineByLineTruncating": "पंक्ति दर पंक्ति काटना",
+ "maxLengthDescription": "टेक्स्ट में छोड़ने के लिए वर्णों की संख्या।",
+ "numberPlaceholder": "संख्या",
+ "resultTitle": "काटा गया टेक्स्ट",
+ "rightSideDescription": "टेक्स्ट के अंत से वर्ण हटाएं।",
+ "rightSideTruncation": "दाईं तरफ काटना",
+ "shortDescription": "पाठ को निर्दिष्ट लंबाई तक छोटा करें",
+ "suffixAndAffix": "प्रत्यय और उपसर्ग",
+ "title": "टेक्स्ट काटें",
+ "toolInfo": {
+ "description": "बाईं ओर इनपुट फॉर्म में अपना टेक्स्ट लोड करें और आपको दाईं ओर स्वचालित रूप से काटा गया टेक्स्ट मिलेगा।",
+ "title": "टेक्स्ट काटें"
+ },
+ "truncationSide": "काटने की तरफ"
+ },
+ "uppercase": {
+ "description": "टेक्स्ट को बड़े अक्षरों में बदलें।",
+ "inputTitle": "इनपुट टेक्स्ट",
+ "resultTitle": "बड़े अक्षरों में टेक्स्ट",
+ "shortDescription": "पाठ को बड़े अक्षरों में बदलें",
+ "title": "बड़े अक्षरों में बदलें"
+ }
+}
diff --git a/public/locales/hi/time.json b/public/locales/hi/time.json
new file mode 100644
index 0000000..b27c976
--- /dev/null
+++ b/public/locales/hi/time.json
@@ -0,0 +1,163 @@
+{
+ "checkLeapYears": {
+ "checkMultiple": "कई वर्ष जांचें",
+ "checkOptions": "जांच विकल्प",
+ "description": "निर्दिष्ट वर्षों को लीप वर्ष के रूप में जांचें।",
+ "endPlaceholder": "वर्ष",
+ "endYear": "अंतिम वर्ष",
+ "inputTitle": "इनपुट वर्ष",
+ "resultTitle": "लीप वर्ष परिणाम",
+ "shortDescription": "जांचें कि कोई वर्ष लीप वर्ष है या नहीं",
+ "startPlaceholder": "वर्ष",
+ "startYear": "शुरुआती वर्ष",
+ "title": "लीप वर्ष जांचें",
+ "toolInfo": {
+ "description": "लीप वर्ष वह वर्ष होता है जिसमें कैलेंडर वर्ष को खगोलीय वर्ष के साथ समकालिक बनाए रखने के लिए एक अतिरिक्त दिन (29 फ़रवरी) होता है। लीप वर्ष हर 4 वर्ष में आते हैं, सिवाय उन वर्षों के जो 100 से विभाज्य होते हैं लेकिन 400 से नहीं।",
+ "title": "लीप वर्ष क्या है?"
+ },
+ "yearRange": "वर्ष श्रेणी"
+ },
+ "convertDaysToHours": {
+ "addHoursName": "घंटे का नाम जोड़ें",
+ "addHoursNameDescription": "आउटपुट मानों में स्ट्रिंग घंटे जोड़ें",
+ "conversionOptions": "रूपांतरण विकल्प",
+ "decimalPlaces": "दशमलव स्थान",
+ "description": "दिनों की संख्या को घंटों में बदलें।",
+ "hoursName": "घंटों का नाम",
+ "inputTitle": "इनपुट दिन",
+ "placesPlaceholder": "स्थान",
+ "resultTitle": "घंटे",
+ "shortDescription": "दिनों को घंटों में बदलें",
+ "showBreakdown": "विस्तृत विवरण दिखाएं",
+ "title": "दिनों को घंटों में बदलें",
+ "toolInfo": {
+ "description": "यह टूल आपको दिनों को घंटों में बदलने की सुविधा देता है। आप दिनों को संख्याओं या इकाइयों के रूप में इनपुट कर सकते हैं, और यह टूल उन्हें घंटों में बदल देगा। आप आउटपुट मानों में 'घंटे' प्रत्यय भी जोड़ सकते हैं।",
+ "title": "दिनों को घंटों में बदलें"
+ }
+ },
+ "convertHoursToDays": {
+ "addDaysName": "दिन का नाम जोड़ें",
+ "addDaysNameDescription": "आउटपुट मानों में स्ट्रिंग days जोड़ें",
+ "conversionOptions": "रूपांतरण विकल्प",
+ "daysName": "दिन का नाम",
+ "decimalPlaces": "दशमलव स्थान",
+ "description": "घंटों की संख्या को दिनों में बदलें।",
+ "inputTitle": "इनपुट घंटे",
+ "placesPlaceholder": "स्थान",
+ "resultTitle": "दिन",
+ "shortDescription": "घंटों को दिनों में बदलें",
+ "showBreakdown": "विस्तृत विवरण दिखाएं",
+ "title": "घंटों को दिनों में बदलें",
+ "toolInfo": {
+ "description": "यह टूल आपको घंटों को दिनों में बदलने की सुविधा देता है। आप घंटों को संख्याओं या इकाइयों के रूप में इनपुट कर सकते हैं, और यह टूल उन्हें दिनों में बदल देगा। आप आउटपुट मानों में 'दिन' प्रत्यय भी जोड़ सकते हैं।",
+ "title": "घंटों को दिनों में बदलें"
+ }
+ },
+ "convertSecondsToTime": {
+ "addPadding": "पैडिंग जोड़ें",
+ "addPaddingDescription": "घंटे, मिनट और सेकंड में शून्य पैडिंग जोड़ें।",
+ "conversionOptions": "रूपांतरण विकल्प",
+ "description": "सेकंड की संख्या को पठनीय समय प्रारूप में बदलें।",
+ "formatDHMS": "दिन:घंटे:मिनट:सेकंड",
+ "formatHMS": "घंटे:मिनट:सेकंड",
+ "inputTitle": "इनपुट सेकंड",
+ "resultTitle": "समय",
+ "shortDescription": "सेकंड को समय प्रारूप में परिवर्तित करें",
+ "showZeroValues": "शून्य मान दिखाएं",
+ "timeFormat": "समय प्रारूप",
+ "timePadding": "समय पैडिंग",
+ "title": "सेकंड को समय में बदलें",
+ "toolInfo": {
+ "title": "{{title}} क्या है?"
+ }
+ },
+ "convertTimeToSeconds": {
+ "conversionOptions": "रूपांतरण विकल्प",
+ "description": "समय प्रारूप को सेकंड की संख्या में बदलें।",
+ "formatDHMS": "दिन:घंटे:मिनट:सेकंड",
+ "formatHMS": "घंटे:मिनट:सेकंड",
+ "inputPlaceholder": "जैसे 1:30:45 या 1d 2h 30m 45s",
+ "inputTitle": "इनपुट समय",
+ "resultTitle": "सेकंड",
+ "shortDescription": "समय प्रारूप को सेकंड में परिवर्तित करें",
+ "timeFormat": "समय प्रारूप",
+ "title": "समय को सेकंड में बदलें",
+ "toolInfo": {
+ "description": "यह टूल आपको फ़ॉर्मेट किए गए समय स्ट्रिंग (HH:MM:SS) को सेकंड में बदलने की सुविधा देता है। यह अवधि और समय अंतराल की गणना के लिए उपयोगी है।",
+ "title": "समय को सेकंड में बदलें"
+ }
+ },
+ "crontabGuru": {
+ "countPlaceholder": "संख्या",
+ "cronOptions": "Cron विकल्प",
+ "description": "Cron एक्सप्रेशन को मानव-पठनीय प्रारूप में बदलें।",
+ "expressionPlaceholder": "जैसे */5 * * * *",
+ "inputTitle": "इनपुट Cron एक्सप्रेशन",
+ "resultTitle": "मानव-पठनीय विवरण",
+ "runCount": "रन की संख्या",
+ "shortDescription": "क्रॉन एक्सप्रेशन उत्पन्न करें और समझें",
+ "showNextRuns": "अगले रन दिखाएं",
+ "title": "Crontab गुरु"
+ },
+ "timeBetweenDates": {
+ "dateOptions": "तिथि विकल्प",
+ "description": "दो तिथियों के बीच का समय अंतराल ज्ञात करें।",
+ "endDate": "अंतिम तिथि",
+ "endDatePlaceholder": "YYYY-MM-DD",
+ "endDateTime": "समाप्ति तिथि और समय",
+ "endTime": "अंतिम समय",
+ "endTimePlaceholder": "HH:MM:SS",
+ "endTimezone": "समाप्ति समय क्षेत्र",
+ "formatDays": "दिन",
+ "formatHours": "घंटे",
+ "formatMinutes": "मिनट",
+ "formatSeconds": "सेकंड",
+ "includeTime": "समय शामिल करें",
+ "inputTitle": "तिथि जोड़े",
+ "outputFormat": "आउटपुट प्रारूप",
+ "resultTitle": "समय अंतराल",
+ "shortDescription": "दो तिथियों के बीच का समय गणना करें",
+ "startDate": "शुरुआती तिथि",
+ "startDatePlaceholder": "YYYY-MM-DD",
+ "startDateTime": "प्रारंभ तिथि और समय",
+ "startTime": "शुरुआती समय",
+ "startTimePlaceholder": "HH:MM:SS",
+ "startTimezone": "प्रारंभ समय क्षेत्र",
+ "title": "तिथियों के बीच समय",
+ "toolInfo": {
+ "description": "विभिन्न समय क्षेत्रों के समर्थन के साथ, दो तिथियों और समयों के बीच सटीक समय अंतर की गणना करें। यह टूल विभिन्न इकाइयों (वर्ष, महीने, दिन, घंटे, मिनट और सेकंड) में समय अंतर का विस्तृत विवरण प्रदान करता है।",
+ "title": "तिथियों के बीच का समय कैलकुलेटर"
+ }
+ },
+ "truncateClockTime": {
+ "description": "समय को निर्दिष्ट स्तर तक काटें।",
+ "format12Hour": "12 घंटे प्रारूप",
+ "format24Hour": "24 घंटे प्रारूप",
+ "inputTitle": "इनपुट समय",
+ "printDroppedComponents": "गिरे हुए घटकों को प्रिंट करें",
+ "resultTitle": "काटा गया समय",
+ "roundDown": "नीचे गोल करें",
+ "roundUp": "ऊपर गोल करें",
+ "shortDescription": "घड़ी के समय को निर्दिष्ट परिशुद्धता तक छोटा करें",
+ "timeFormat": "समय प्रारूप",
+ "timePadding": "समय पैडिंग",
+ "title": "घड़ी का समय काटें",
+ "toolInfo": {
+ "title": "{{title}} क्या है?"
+ },
+ "truncateMinutesAndSeconds": "मिनट और सेकंड को छोटा करें",
+ "truncateMinutesAndSecondsDescription": "प्रत्येक घड़ी के समय से मिनट और सेकंड दोनों घटकों को हटा दें।",
+ "truncateOnlySeconds": "केवल सेकंड काटें",
+ "truncateOnlySecondsDescription": "प्रत्येक घड़ी के समय से सेकंड घटक हटा दें।",
+ "truncateTo": "काटने का स्तर",
+ "truncateToHours": "घंटे",
+ "truncateToMinutes": "मिनट",
+ "truncateToSeconds": "सेकंड",
+ "truncationOptions": "काटने के विकल्प",
+ "truncationSide": "काटने की तरफ",
+ "useZeroPadding": "शून्य पैडिंग का उपयोग करें",
+ "zeroPaddingDescription": "सभी समय घटकों को हमेशा दो अंक चौड़ा रखें।",
+ "zeroPrintDescription": "गिराए गए भागों को शून्य मान \"00\" के रूप में प्रदर्शित करें।",
+ "zeroPrintTruncatedParts": "शून्य-मुद्रित काटे गए भाग"
+ }
+}
diff --git a/public/locales/hi/translation.json b/public/locales/hi/translation.json
new file mode 100644
index 0000000..84b4bf0
--- /dev/null
+++ b/public/locales/hi/translation.json
@@ -0,0 +1,250 @@
+{
+ "audio": {
+ "changeSpeed": {
+ "description": "ऑडियो फ़ाइलों की प्लेबैक गति बदलें। पिच बनाए रखते हुए ऑडियो को तेज़ या धीमा करें।",
+ "name": "ऑडियो गति बदलें",
+ "shortDescription": "ऑडियो फ़ाइलों की गति बदलें"
+ },
+ "extractAudio": {
+ "description": "वीडियो फ़ाइल से ऑडियो ट्रैक निकालें और इसे अपने चुने हुए प्रारूप (एएसी, एमपी3, डब्ल्यूएवी) में एक अलग ऑडियो फ़ाइल के रूप में सहेजें।",
+ "name": "ऑडियो निकालें",
+ "shortDescription": "वीडियो फ़ाइलों (एमपी4, एमओवी, आदि) से ऑडियो निकालें एएसी, एमपी3, या डब्ल्यूएवी में।"
+ }
+ },
+ "baseFileInput": {
+ "copyFailed": "कॉपी करने में विफल: {{error}}",
+ "dropFileHere": "यहाँ अपनी {{type}} डालें",
+ "fileCopied": "फ़ाइल कॉपी की गई",
+ "selectFileDescription": "यहाँ क्लिक करें अपने डिवाइस से {{type}} चुनने के लिए, Ctrl+V दबाएं क्लिपबोर्ड से {{type}} का उपयोग करने के लिए, या डेस्कटॉप से फ़ाइल को खींचकर डालें"
+ },
+ "categories": {
+ "audio": {
+ "description": "ऑडियो के साथ काम करने के लिए टूल्स – वीडियो से ऑडियो निकालें, ऑडियो गति समायोजित करें, कई ऑडियो फ़ाइलों को मर्ज करें और बहुत कुछ।",
+ "title": "ऑडियो टूल्स"
+ },
+ "csv": {
+ "description": "CSV फ़ाइलों के साथ काम करने के लिए टूल्स - CSV को विभिन्न प्रारूपों में बदलें, CSV डेटा में हेरफेर करें, CSV संरचना को मान्य करें, और CSV फ़ाइलों को कुशलतापूर्वक संसाधित करें।",
+ "title": "CSV टूल्स"
+ },
+ "gif": {
+ "description": "GIF एनिमेशन के साथ काम करने के लिए टूल्स – पारदर्शी GIF बनाएं, GIF फ्रेम निकालें, GIF में टेक्स्ट जोड़ें, क्रॉप, घुमाएं, GIF को उलटा करें, और बहुत कुछ।",
+ "title": "GIF टूल्स"
+ },
+ "image-generic": {
+ "description": "चित्रों के साथ काम करने के लिए टूल्स – संपीड़ित करें, आकार बदलें, क्रॉप करें, JPG में बदलें, घुमाएं, पृष्ठभूमि हटाएं और बहुत कुछ।",
+ "title": "छवि टूल्स"
+ },
+ "json": {
+ "description": "JSON डेटा संरचनाओं के साथ काम करने के लिए टूल्स – JSON ऑब्जेक्ट को सुंदर और संक्षिप्त करें, JSON सरणियों को समतल करें, JSON मूल्यों को स्ट्रिंगिफाई करें, डेटा का विश्लेषण करें, और बहुत कुछ",
+ "title": "JSON टूल्स"
+ },
+ "list": {
+ "description": "सूचियों के साथ काम करने के लिए टूल्स – क्रमबद्ध करें, उलटा करें, सूचियों को यादृच्छिक करें, अद्वितीय और डुप्लिकेट सूची आइटम खोजें, सूची आइटम विभाजक बदलें, और बहुत कुछ।",
+ "title": "सूची टूल्स"
+ },
+ "number": {
+ "description": "संख्याओं के साथ काम करने के लिए टूल्स – संख्या अनुक्रम उत्पन्न करें, संख्याओं को शब्दों में और शब्दों को संख्याओं में बदलें, क्रमबद्ध करें, गोल करें, संख्याओं का गुणनखंड करें, और बहुत कुछ।",
+ "title": "संख्या टूल्स"
+ },
+ "pdf": {
+ "description": "PDF फ़ाइलों के साथ काम करने के लिए टूल्स - PDF से टेक्स्ट निकालें, PDF को अन्य प्रारूपों में बदलें, PDF में हेरफेर करें, और बहुत कुछ।",
+ "title": "PDF टूल्स"
+ },
+ "png": {
+ "description": "PNG छवियों के साथ काम करने के लिए टूल्स – PNG को JPG में बदलें, पारदर्शी PNG बनाएं, PNG रंग बदलें, क्रॉप, घुमाएं, PNG का आकार बदलें, और बहुत कुछ।",
+ "title": "PNG टूल्स"
+ },
+ "seeAll": "सभी {{title}} देखें",
+ "string": {
+ "description": "टेक्स्ट के साथ काम करने के लिए टूल्स – टेक्स्ट को छवियों में बदलें, टेक्स्ट खोजें और बदलें, टेक्स्ट को टुकड़ों में विभाजित करें, टेक्स्ट पंक्तियों को जोड़ें, टेक्स्ट दोहराएं, और बहुत कुछ।",
+ "title": "टेक्स्ट टूल्स"
+ },
+ "time": {
+ "description": "समय और तिथि के साथ काम करने के लिए टूल्स – समय अंतर की गणना करें, समय क्षेत्रों के बीच बदलें, तिथियों को फॉर्मेट करें, तिथि अनुक्रम उत्पन्न करें, और बहुत कुछ।",
+ "title": "समय टूल्स"
+ },
+ "try": "{{title}} आज़माएं",
+ "video": {
+ "description": "वीडियो के साथ काम करने के लिए टूल्स – वीडियो से फ्रेम निकालें, वीडियो से GIF बनाएं, वीडियो को विभिन्न प्रारूपों में बदलें, और बहुत कुछ।",
+ "title": "वीडियो टूल्स"
+ },
+ "xml": {
+ "description": "XML डेटा संरचनाओं के साथ काम करने के लिए टूल्स - व्यूअर, ब्यूटिफायर, वैलिडेटर और बहुत कुछ",
+ "title": "XML टूल्स"
+ }
+ },
+ "csv": {
+ "findIncompleteCsvRecords": {
+ "description": "बस नीचे फॉर्म में अपनी सीएसवी फ़ाइल अपलोड करें और यह टूल स्वचालित रूप से जांच करेगा कि क्या कोई पंक्ति या स्तंभ मूल्य नहीं खो रहे हैं। टूल विकल्पों में, आप इनपुट फ़ाइल प्रारूप को समायोजित कर सकते हैं (विभाजक, उद्धरण वर्ण, और टिप्पणी वर्ण निर्दिष्ट करें)। इसके अतिरिक्त, आप खाली मूल्यों की जांच सक्षम कर सकते हैं, खाली पंक्तियों को छोड़ सकते हैं, और आउटपुट में त्रुटि संदेशों की संख्या पर सीमा निर्धारित कर सकते हैं।",
+ "name": "अधूरे सीएसवी रिकॉर्ड खोजें",
+ "shortDescription": "सीएसवी में जल्दी से पंक्तियां और स्तंभ खोजें जो मूल्य खो रहे हैं।"
+ }
+ },
+ "hero": {
+ "brand": "ओमनीटूल्स",
+ "description": "ओमनीटूल्स के साथ अपनी उत्पादकता बढ़ाएं, जल्दी काम करने के लिए अंतिम टूलकिट! छवियों, टेक्स्ट, सूचियों और डेटा को संपादित करने के लिए हजारों उपयोगकर्ता-अनुकूल उपयोगिताओं तक पहुंचें, सभी सीधे अपने ब्राउज़र से।",
+ "examples": {
+ "calculateNumberSum": "संख्याओं का योग करें",
+ "changeGifSpeed": "GIF गति बदलें",
+ "compressPng": "PNG संपीड़ित करें",
+ "createTransparentImage": "पारदर्शी छवि बनाएं",
+ "prettifyJson": "JSON सुंदर बनाएं",
+ "sortList": "सूची क्रमबद्ध करें",
+ "splitPdf": "PDF विभाजित करें",
+ "splitText": "टेक्स्ट विभाजित करें",
+ "trimVideo": "वीडियो ट्रिम करें"
+ },
+ "searchPlaceholder": "सभी टूल्स खोजें",
+ "title": "के साथ जल्दी काम करें"
+ },
+ "inputFooter": {
+ "clear": "साफ़ करें",
+ "copyToClipboard": "क्लिपबोर्ड पर कॉपी करें",
+ "importFromFile": "फ़ाइल से आयात करें"
+ },
+ "list": {
+ "group": {
+ "description": "सूची आइटम को समूहित करने के लिए दुनिया का सबसे सरल ब्राउज़र-आधारित उपयोगिता। अपनी सूची इनपुट करें और समूहीकरण मानदंड निर्दिष्ट करें ताकि आइटम को तार्किक समूहों में व्यवस्थित किया जा सके। डेटा को वर्गीकृत करने, जानकारी को व्यवस्थित करने, या संरचित सूचियां बनाने के लिए बिल्कुल सही। कस्टम विभाजक और विभिन्न समूहीकरण विकल्पों का समर्थन करता है।",
+ "name": "समूह",
+ "shortDescription": "सामान्य गुणों द्वारा सूची आइटम को समूहित करें"
+ },
+ "reverse": {
+ "description": "यह एक सुपर सरल ब्राउज़र-आधारित एप्लिकेशन है जो सभी सूची आइटम को उल्टे क्रम में प्रिंट करती है। इनपुट आइटम किसी भी प्रतीक से अलग किए जा सकते हैं और आप उलटे सूची आइटम के विभाजक को भी बदल सकते हैं।",
+ "name": "उलटा",
+ "shortDescription": "जल्दी से सूची को उलटा करें"
+ },
+ "sort": {
+ "description": "यह एक सुपर सरल ब्राउज़र-आधारित एप्लिकेशन है जो सूची में आइटम को क्रमबद्ध करती है और उन्हें बढ़ते या घटते क्रम में व्यवस्थित करती है। आप आइटम को वर्णानुक्रमिक, संख्यात्मक, या उनकी लंबाई के अनुसार क्रमबद्ध कर सकते हैं। आप डुप्लिकेट और खाली आइटम को भी हटा सकते हैं, साथ ही उन आइटम को ट्रिम कर सकते हैं जिनके चारों ओर सफेद स्थान है। आप इनपुट सूची आइटम को अलग करने के लिए कोई भी विभाजक वर्ण उपयोग कर सकते हैं या वैकल्पिक रूप से उन्हें अलग करने के लिए एक नियमित अभिव्यक्ति का उपयोग कर सकते हैं। इसके अतिरिक्त, आप क्रमबद्ध आउटपुट सूची के लिए एक नया डिलिमिटर बना सकते हैं।",
+ "name": "क्रमबद्ध",
+ "shortDescription": "जल्दी से सूची को क्रमबद्ध करें"
+ }
+ },
+ "navbar": {
+ "buyMeACoffee": "मुझे कॉफी खरीदें",
+ "home": "होम",
+ "tools": "टूल्स"
+ },
+ "number": {
+ "generate": {
+ "description": "अपने ब्राउज़र में पूर्णांकों की सूची की तुरंत गणना करें। अपनी सूची प्राप्त करने के लिए, बस पहला पूर्णांक निर्दिष्ट करें, नीचे विकल्पों में मान और कुल संख्या बदलें, और यह उपयोगिता उतने पूर्णांक उत्पन्न करेगी",
+ "name": "संख्याएं उत्पन्न करें",
+ "shortDescription": "अपने ब्राउज़र में पूर्णांकों की सूची की तुरंत गणना करें"
+ },
+ "sum": {
+ "description": "यह एक सुपर सरल ब्राउज़र-आधारित एप्लिकेशन है जो संख्याओं को जोड़ती है। इनपुट संख्याएं किसी भी प्रतीक से अलग की जा सकती हैं और आप जोड़ी गई संख्याओं के विभाजक को भी बदल सकते हैं।",
+ "name": "संख्याएं जोड़ें",
+ "shortDescription": "जल्दी से संख्याओं की सूची जोड़ें"
+ }
+ },
+ "numericInputWithUnit": {
+ "unit": "इकाई"
+ },
+ "pdf": {
+ "compressPdf": {
+ "description": "गोस्टस्क्रिप्ट का उपयोग करके गुणवत्ता बनाए रखते हुए पीडीएफ फ़ाइल आकार कम करें",
+ "name": "पीडीएफ संपीड़ित करें",
+ "shortDescription": "अपने ब्राउज़र में सुरक्षित रूप से पीडीएफ फ़ाइलों को संपीड़ित करें"
+ },
+ "mergePdf": {
+ "description": "कई पीडीएफ फ़ाइलों को एक दस्तावेज़ में जोड़ें।",
+ "name": "पीडीएफ मर्ज करें",
+ "shortDescription": "कई पीडीएफ फ़ाइलों को एक दस्तावेज़ में मर्ज करें"
+ },
+ "pdfToEpub": {
+ "description": "बेहतर ई-रीडर संगतता के लिए पीडीएफ दस्तावेज़ों को ईपीयूबी फ़ाइलों में बदलें।",
+ "name": "पीडीएफ से ईपीयूबी",
+ "shortDescription": "पीडीएफ फ़ाइलों को ईपीयूबी प्रारूप में बदलें"
+ },
+ "protectPdf": {
+ "description": "अपने ब्राउज़र में सुरक्षित रूप से अपनी पीडीएफ फ़ाइलों में पासवर्ड सुरक्षा जोड़ें",
+ "name": "पीडीएफ सुरक्षित करें",
+ "shortDescription": "पीडीएफ फ़ाइलों को सुरक्षित रूप से पासवर्ड सुरक्षित करें"
+ },
+ "splitPdf": {
+ "description": "पेज नंबर या श्रेणियों का उपयोग करके पीडीएफ फ़ाइल से विशिष्ट पेज निकालें (उदाहरण के लिए, 1,5-8)",
+ "name": "पीडीएफ विभाजित करें",
+ "shortDescription": "पीडीएफ फ़ाइल से विशिष्ट पेज निकालें"
+ }
+ },
+ "resultFooter": {
+ "copy": "क्लिपबोर्ड पर कॉपी करें",
+ "download": "डाउनलोड"
+ },
+ "string": {
+ "createPalindrome": {
+ "description": "किसी भी टेक्स्ट से पैलिंड्रोम बनाने के लिए दुनिया का सबसे सरल ब्राउज़र-आधारित उपयोगिता। टेक्स्ट इनपुट करें और इसे तुरंत एक पैलिंड्रोम में बदल दें जो आगे और पीछे एक जैसा पढ़ता है। शब्द खेलों, सममित टेक्स्ट पैटर्न बनाने, या भाषाई जिज्ञासाओं की खोज के लिए बिल्कुल सही।",
+ "name": "पैलिंड्रोम बनाएं",
+ "shortDescription": "ऐसा टेक्स्ट बनाएं जो आगे और पीछे एक जैसा पढ़ता है"
+ },
+ "palindrome": {
+ "description": "यह जांचने के लिए दुनिया का सबसे सरल ब्राउज़र-आधारित उपयोगिता कि टेक्स्ट पैलिंड्रोम है या नहीं। तुरंत सत्यापित करें कि क्या आपका टेक्स्ट आगे और पीछे एक जैसा पढ़ता है। शब्द पहेलियों, भाषाई विश्लेषण, या सममित टेक्स्ट पैटर्न को मान्य करने के लिए बिल्कुल सही। विभिन्न विभाजकों और बहु-शब्द पैलिंड्रोम पहचान का समर्थन करता है।",
+ "name": "पैलिंड्रोम",
+ "shortDescription": "जांचें कि क्या टेक्स्ट आगे और पीछे एक जैसा पढ़ता है"
+ },
+ "repeat": {
+ "description": "यह टूल आपको वैकल्पिक विभाजक के साथ दिए गए टेक्स्ट को कई बार दोहराने की अनुमति देता है।",
+ "name": "टेक्स्ट दोहराएं",
+ "shortDescription": "टेक्स्ट को कई बार दोहराएं"
+ },
+ "reverse": {
+ "description": "टेक्स्ट को उलटने के लिए दुनिया का सबसे सरल ब्राउज़र-आधारित उपयोगिता। कोई भी टेक्स्ट इनपुट करें और इसे तुरंत उलटा प्राप्त करें, वर्ण दर वर्ण। दर्पण टेक्स्ट बनाने, पैलिंड्रोम का विश्लेषण करने, या टेक्स्ट पैटर्न के साथ खेलने के लिए बिल्कुल सही। उलटते समय स्थान और विशेष वर्णों को संरक्षित करता है।",
+ "name": "उलटा",
+ "shortDescription": "किसी भी टेक्स्ट को वर्ण दर वर्ण उलटा करें"
+ },
+ "toMorse": {
+ "description": "टेक्स्ट को मोर्स कोड में बदलने के लिए दुनिया का सबसे सरल ब्राउज़र-आधारित उपयोगिता। बाईं ओर इनपुट फॉर्म में अपना टेक्स्ट लोड करें और आपको तुरंत आउटपुट क्षेत्र में मोर्स कोड मिलेगा। शक्तिशाली, मुफ्त, और तेज़। टेक्स्ट लोड करें – मोर्स कोड प्राप्त करें।",
+ "name": "टेक्स्ट से मोर्स",
+ "shortDescription": "टेक्स्ट को जल्दी से मोर्स में एनकोड करें"
+ },
+ "uppercase": {
+ "description": "टेक्स्ट को बड़े अक्षरों में बदलने के लिए दुनिया का सबसे सरल ब्राउज़र-आधारित उपयोगिता। बस अपना टेक्स्ट इनपुट करें और यह स्वचालित रूप से सभी बड़े अक्षरों में परिवर्तित हो जाएगा। शीर्षक बनाने, टेक्स्ट पर जोर देने, या टेक्स्ट प्रारूप को मानकीकृत करने के लिए बिल्कुल सही। विभिन्न टेक्स्ट प्रारूपों का समर्थन करता है और विशेष वर्णों को संरक्षित करता है।",
+ "name": "बड़े अक्षर",
+ "shortDescription": "टेक्स्ट को बड़े अक्षरों में बदलें"
+ }
+ },
+ "toolExamples": {
+ "subtitle": "आज़माने के लिए क्लिक करें!",
+ "title": "{{title}} उदाहरण"
+ },
+ "toolFileResult": {
+ "copied": "फ़ाइल कॉपी की गई",
+ "copyFailed": "कॉपी करने में विफल: {{error}}",
+ "loading": "लोड हो रहा है... इसमें कुछ समय लग सकता है।",
+ "result": "परिणाम"
+ },
+ "toolHeader": {
+ "seeExamples": "उदाहरण देखें"
+ },
+ "toolLayout": {
+ "allToolsTitle": "सभी {{type}}"
+ },
+ "toolMultiFileResult": {
+ "copied": "फ़ाइल कॉपी की गई",
+ "copyFailed": "कॉपी करने में विफल: {{error}}",
+ "loading": "लोड हो रहा है... इसमें कुछ समय लग सकता है।",
+ "result": "परिणाम"
+ },
+ "toolMultipleAudioInput": {
+ "inputTitle": "इनपुट {{type}}",
+ "noFilesSelected": "कोई फ़ाइल चयनित नहीं"
+ },
+ "toolMultiplePdfInput": {
+ "inputTitle": "इनपुट {{type}}",
+ "noFilesSelected": "कोई फ़ाइल चयनित नहीं"
+ },
+ "toolOptions": {
+ "title": "टूल विकल्प"
+ },
+ "toolTextInput": {
+ "copied": "टेक्स्ट कॉपी किया गया",
+ "copyFailed": "कॉपी करने में विफल: {{error}}",
+ "input": "इनपुट टेक्स्ट",
+ "placeholder": "यहाँ अपना टेक्स्ट दर्ज करें..."
+ },
+ "toolTextResult": {
+ "copied": "टेक्स्ट कॉपी किया गया",
+ "copyFailed": "कॉपी करने में विफल: {{error}}",
+ "loading": "लोड हो रहा है... इसमें कुछ समय लग सकता है।",
+ "result": "परिणाम"
+ }
+}
diff --git a/public/locales/hi/video.json b/public/locales/hi/video.json
new file mode 100644
index 0000000..966aef7
--- /dev/null
+++ b/public/locales/hi/video.json
@@ -0,0 +1,194 @@
+{
+ "changeSpeed": {
+ "defaultMultiplier": "डिफ़ॉल्ट गुणक: 2 का अर्थ है 2x तेज़",
+ "description": "वीडियो फ़ाइलों की प्लेबैक गति बदलें।",
+ "factorPlaceholder": "कारक (जैसे 0.5, 1.5, 2.0)",
+ "formatAvi": "AVI",
+ "formatMov": "MOV",
+ "formatMp4": "MP4",
+ "inputTitle": "इनपुट वीडियो",
+ "newVideoSpeed": "नई वीडियो स्पीड",
+ "outputFormat": "आउटपुट प्रारूप",
+ "preserveAudio": "ऑडियो संरक्षित करें",
+ "resultTitle": "गति बदली गई वीडियो",
+ "settingSpeed": "गति सेट करना",
+ "shortDescription": "वीडियो प्लेबैक गति बदलें",
+ "speedFactor": "गति कारक",
+ "speedOptions": "गति विकल्प",
+ "title": "वीडियो गति बदलें",
+ "toolInfo": {
+ "title": "{{title}} क्या है?"
+ }
+ },
+ "compress": {
+ "compressionOptions": "संपीड़न विकल्प",
+ "default": "गलती करना",
+ "description": "वीडियो फ़ाइल आकार कम करें।",
+ "formatAvi": "AVI",
+ "formatMp4": "MP4",
+ "inputTitle": "इनपुट वीडियो",
+ "loadingText": "वीडियो संपीड़ित किया जा रहा है...",
+ "lossless": "दोषरहित",
+ "outputFormat": "आउटपुट प्रारूप",
+ "quality": "गुणवत्ता (सीआरएफ)",
+ "qualityHigh": "उच्च",
+ "qualityLow": "कम",
+ "qualityMedium": "मध्यम",
+ "resolution": "रिज़ॉल्यूशन",
+ "resolution360p": "360p",
+ "resolution480p": "480p",
+ "resolution720p": "720p",
+ "resolutionOriginal": "मूल",
+ "resultTitle": "संपीड़ित वीडियो",
+ "shortDescription": "विभिन्न रिज़ॉल्यूशन पर स्केल करके वीडियो संपीड़ित करें",
+ "title": "वीडियो संपीड़ित करें",
+ "videoQuality": "वीडियो गुणवत्ता",
+ "worst": "बहुत बुरा"
+ },
+ "cropVideo": {
+ "aspectRatio": "आकार अनुपात",
+ "cropArea": "क्रॉप क्षेत्र",
+ "cropCoordinates": "फसल निर्देशांक",
+ "cropMethod": "क्रॉप विधि",
+ "cropOptions": "क्रॉप विकल्प",
+ "croppingVideo": "वीडियो क्रॉप करना",
+ "description": "वीडियो से अनावश्यक भाग हटाएं।",
+ "errorBeyondHeight": "फसल क्षेत्र वीडियो की ऊंचाई से आगे तक फैला हुआ है ({{height}}पिक्सल)",
+ "errorBeyondWidth": "फसल क्षेत्र वीडियो की चौड़ाई से आगे तक फैला हुआ है ({{width}}पिक्सल)",
+ "errorCroppingVideo": "वीडियो क्रॉप करने में त्रुटि हुई। कृपया पैरामीटर और वीडियो फ़ाइल जाँचें।",
+ "errorLoadingDimensions": "वीडियो आयाम लोड करने में विफल",
+ "errorNonNegativeCoordinates": "X और Y निर्देशांक गैर-ऋणात्मक होने चाहिए",
+ "errorPositiveDimensions": "चौड़ाई और ऊंचाई धनात्मक होनी चाहिए",
+ "height": "ऊंचाई",
+ "heightPlaceholder": "पिक्सेल",
+ "inputTitle": "इनपुट वीडियो",
+ "loadVideoForDimensions": "आयाम देखने के लिए वीडियो लोड करें",
+ "methodAspectRatio": "आकार अनुपात",
+ "methodManual": "मैनुअल",
+ "ratio16x9": "16:9",
+ "ratio1x1": "1:1",
+ "ratio4x3": "4:3",
+ "resultTitle": "क्रॉप किया गया वीडियो",
+ "shortDescription": "अवांछित क्षेत्रों को हटाने के लिए वीडियो को क्रॉप करें",
+ "title": "वीडियो क्रॉप करें",
+ "toolInfo": {
+ "description": "यह टूल आपको वीडियो फ़ाइलों को क्रॉप करके अवांछित क्षेत्रों को हटाने की सुविधा देता है। आप X, Y निर्देशांक और चौड़ाई, ऊँचाई के आयाम निर्धारित करके क्रॉप क्षेत्र निर्दिष्ट कर सकते हैं।",
+ "title": "वीडियो क्रॉप करें"
+ },
+ "videoDimensions": "वीडियो आयाम: {{width}} × {{height}} पिक्सेल",
+ "videoInformation": "वीडियो जानकारी",
+ "width": "चौड़ाई",
+ "widthPlaceholder": "पिक्सेल",
+ "xCoordinate": "X (बाएं)",
+ "xPlaceholder": "पिक्सेल",
+ "xPosition": "X स्थिति",
+ "yCoordinate": "Y (ऊपर)",
+ "yPlaceholder": "पिक्सेल",
+ "yPosition": "Y स्थिति"
+ },
+ "flip": {
+ "description": "वीडियो को क्षैतिज या लंबवत रूप से फ्लिप करें।",
+ "directionBoth": "दोनों",
+ "directionHorizontal": "क्षैतिज",
+ "directionVertical": "लंबवत",
+ "flipDirection": "फ्लिप दिशा",
+ "flipOptions": "फ्लिप विकल्प",
+ "flippingVideo": "फ़्लिपिंग वीडियो",
+ "horizontalLabel": "क्षैतिज (दर्पण)",
+ "inputTitle": "इनपुट वीडियो",
+ "orientation": "अभिविन्यास",
+ "preserveAudio": "ऑडियो संरक्षित करें",
+ "resultTitle": "फ्लिप किया गया वीडियो",
+ "shortDescription": "वीडियो को क्षैतिज या लंबवत रूप से फ़्लिप करें",
+ "title": "वीडियो फ्लिप करें",
+ "verticalLabel": "ऊर्ध्वाधर (उल्टा)"
+ },
+ "gif": {
+ "changeSpeed": {
+ "delayPlaceholder": "मिलीसेकंड",
+ "description": "GIF एनिमेटेड फ़ाइलों की गति बदलें।",
+ "factorPlaceholder": "कारक (जैसे 0.5, 1.5, 2.0)",
+ "frameDelay": "फ्रेम विलंब",
+ "inputTitle": "इनपुट GIF",
+ "resultTitle": "गति बदली गई GIF",
+ "shortDescription": "GIF एनीमेशन की गति बदलें",
+ "speedFactor": "गति कारक",
+ "speedOptions": "गति विकल्प",
+ "title": "GIF गति बदलें"
+ }
+ },
+ "loop": {
+ "countPlaceholder": "संख्या",
+ "description": "वीडियो को लूप में चलाएं।",
+ "durationPlaceholder": "सेकंड",
+ "fadeDuration": "फेड अवधि",
+ "fadeTransition": "फेड संक्रमण",
+ "inputTitle": "इनपुट वीडियो",
+ "loopCount": "लूप की संख्या",
+ "loopInfinitely": "अनंत लूप",
+ "loopOptions": "लूप विकल्प",
+ "loopingVideo": "पाशन वीडियो",
+ "loops": "छोरों",
+ "numberOfLoops": "लूपों की संख्या",
+ "resultTitle": "लूप वीडियो",
+ "shortDescription": "लूपिंग वीडियो फ़ाइलें बनाएँ",
+ "title": "वीडियो लूप करें",
+ "toolInfo": {
+ "description": "यह टूल आपको मूल वीडियो को कई बार दोहराकर एक लूपिंग वीडियो बनाने की सुविधा देता है। आप यह भी निर्दिष्ट कर सकते हैं कि वीडियो को कितनी बार लूप किया जाना चाहिए।",
+ "title": "{{title}} क्या है?"
+ }
+ },
+ "rotate": {
+ "180Degrees": "180° (उल्टा)",
+ "270Degrees": "270° (90° वामावर्त)",
+ "90Degrees": "90° दक्षिणावर्त",
+ "angle180": "180 डिग्री",
+ "angle270": "270 डिग्री",
+ "angle90": "90 डिग्री",
+ "customAngle": "कस्टम कोण",
+ "customAnglePlaceholder": "डिग्री",
+ "description": "वीडियो को निर्दिष्ट कोण से घुमाएं।",
+ "inputTitle": "इनपुट वीडियो",
+ "preserveAudio": "ऑडियो संरक्षित करें",
+ "resultTitle": "घुमाया गया वीडियो",
+ "rotatingVideo": "घूमता हुआ वीडियो",
+ "rotation": "ROTATION",
+ "rotationAngle": "घुमाने का कोण",
+ "rotationOptions": "घुमाने के विकल्प",
+ "shortDescription": "वीडियो को निर्दिष्ट डिग्री तक घुमाएँ",
+ "title": "वीडियो घुमाएं"
+ },
+ "trim": {
+ "description": "वीडियो से अनावश्यक भाग हटाएं।",
+ "endPlaceholder": "सेकंड",
+ "endTime": "अंतिम समय",
+ "inputTitle": "इनपुट वीडियो",
+ "preserveAudio": "ऑडियो संरक्षित करें",
+ "resultTitle": "ट्रिम किया गया वीडियो",
+ "shortDescription": "अवांछित अनुभागों को हटाकर वीडियो ट्रिम करें",
+ "startPlaceholder": "सेकंड",
+ "startTime": "शुरुआती समय",
+ "timestamps": "मुहर",
+ "title": "वीडियो ट्रिम करें",
+ "trimOptions": "ट्रिम विकल्प"
+ },
+ "videoToGif": {
+ "conversionOptions": "रूपांतरण विकल्प",
+ "description": "वीडियो को GIF एनिमेटेड फ़ाइल में बदलें।",
+ "frameRate": "फ्रेम दर",
+ "frameRatePlaceholder": "FPS",
+ "height": "ऊंचाई",
+ "heightPlaceholder": "पिक्सेल",
+ "inputTitle": "इनपुट वीडियो",
+ "quality": "गुणवत्ता",
+ "qualityHigh": "उच्च",
+ "qualityLow": "कम",
+ "qualityMedium": "मध्यम",
+ "resize": "आकार बदलें",
+ "resultTitle": "GIF फ़ाइल",
+ "shortDescription": "वीडियो को एनिमेटेड GIF में बदलें",
+ "title": "वीडियो से GIF",
+ "width": "चौड़ाई",
+ "widthPlaceholder": "पिक्सेल"
+ }
+}
diff --git a/public/locales/hi/xml.json b/public/locales/hi/xml.json
new file mode 100644
index 0000000..bdc1b5b
--- /dev/null
+++ b/public/locales/hi/xml.json
@@ -0,0 +1,62 @@
+{
+ "xmlBeautifier": {
+ "description": "XML को सुंदर प्रारूप में बदलें।",
+ "formattingOptions": "फॉर्मेटिंग विकल्प",
+ "indentCharacter": "इंडेंट वर्ण",
+ "indentSize": "इंडेंट आकार",
+ "indentation": "खरोज",
+ "inputTitle": "इनपुट XML",
+ "preserveWhitespace": "सफेद स्थान संरक्षित करें",
+ "removeComments": "टिप्पणियां हटाएं",
+ "resultTitle": "सुंदर XML",
+ "shortDescription": "XML कोड को प्रारूपित और सुशोभित करें",
+ "sizePlaceholder": "आकार",
+ "sortAttributes": "विशेषताएं क्रमबद्ध करें",
+ "space": "स्पेस",
+ "tab": "टैब",
+ "title": "XML सुंदर बनाएं",
+ "toolInfo": {
+ "description": "यह उपकरण आपको XML डेटा को उचित इंडेंटेशन और स्पेसिंग के साथ फॉर्मेट करने की अनुमति देता है, जिससे यह अधिक पठनीय और काम करने में आसान हो जाता है।",
+ "title": "XML सुंदर बनाएं"
+ },
+ "useSpaces": "रिक्त स्थान का उपयोग करें",
+ "useSpacesDescription": "रिक्त स्थान के साथ आउटपुट इंडेंट करें",
+ "useTabs": "टैब का उपयोग करें",
+ "useTabsDescription": "टैब के साथ आउटपुट इंडेंट करें."
+ },
+ "xmlValidator": {
+ "allowCDATA": "CDATA अनुमति दें",
+ "allowComments": "टिप्पणियां अनुमति दें",
+ "description": "XML स्ट्रिंग की वैधता जांचें।",
+ "inputTitle": "इनपुट XML",
+ "placeholder": "XML को यहां चिपकाएं या आयात करें...",
+ "resultTitle": "मान्यता परिणाम",
+ "shortDescription": "त्रुटियों के लिए XML कोड मान्य करें",
+ "showErrorDetails": "त्रुटि विवरण दिखाएं",
+ "showLineNumbers": "पंक्ति संख्याएं दिखाएं",
+ "strictMode": "सख्त मोड",
+ "title": "XML मान्य करें",
+ "toolInfo": {
+ "description": "यह टूल आपको XML सिंटैक्स और संरचना को सत्यापित करने की अनुमति देता है। यह जाँचता है कि XML सही ढंग से बना है या नहीं और किसी भी समस्या के लिए विस्तृत त्रुटि संदेश प्रदान करता है।",
+ "title": "XML मान्य करें"
+ },
+ "validationOptions": "मान्यता विकल्प"
+ },
+ "xmlViewer": {
+ "collapseAll": "सभी संक्षिप्त करें",
+ "description": "XML को पेड़ संरचना में देखें।",
+ "expandAll": "सभी विस्तारित करें",
+ "highlightSyntax": "सिंटैक्स हाइलाइट करें",
+ "inputTitle": "इनपुट XML",
+ "lineNumbers": "पंक्ति संख्याएं",
+ "resultTitle": "XML पेड़",
+ "showAttributes": "विशेषताएं दिखाएं",
+ "showTextNodes": "टेक्स्ट नोड दिखाएं",
+ "title": "XML व्यूअर",
+ "toolInfo": {
+ "description": "यह उपकरण आपको XML डेटा को पदानुक्रमित वृक्ष प्रारूप में देखने की अनुमति देता है, जिससे XML दस्तावेज़ों की संरचना का पता लगाना और समझना आसान हो जाता है।",
+ "title": "XML व्यूअर"
+ },
+ "viewerOptions": "व्यूअर विकल्प"
+ }
+}
diff --git a/public/locales/ja/audio.json b/public/locales/ja/audio.json
new file mode 100644
index 0000000..052e15c
--- /dev/null
+++ b/public/locales/ja/audio.json
@@ -0,0 +1,42 @@
+{
+ "changeSpeed": {
+ "description": "オーディオファイルの再生速度を変更します。ピッチを維持しながら、オーディオの再生速度を上げたり下げたりできます。",
+ "inputTitle": "入力オーディオ",
+ "newAudioSpeed": "新しいオーディオ速度",
+ "outputFormat": "出力形式",
+ "resultTitle": "編集されたオーディオ",
+ "settingSpeed": "速度設定",
+ "shortDescription": "オーディオファイルの速度を変更する",
+ "speedDescription": "デフォルトの乗数: 2は2倍速を意味します",
+ "title": "オーディオ速度を変更する",
+ "toolInfo": {
+ "title": "何ですか {{title}}?"
+ }
+ },
+ "extractAudio": {
+ "description": "ビデオ ファイルからオーディオ トラックを抽出します。",
+ "extractingAudio": "オーディオの抽出",
+ "inputTitle": "入力ビデオ",
+ "outputFormat": "出力形式",
+ "outputFormatDescription": "抽出するオーディオの形式を選択します。",
+ "resultTitle": "抽出された音声",
+ "shortDescription": "ビデオ ファイル (MP4、MOV など) からオーディオを AAC、MP3、または WAV に抽出します。",
+ "title": "ビデオからオーディオを抽出する",
+ "toolInfo": {
+ "description": "このツールを使えば、動画ファイルから音声トラックを抽出できます。AAC、MP3、WAVなど、様々な音声形式から選択できます。",
+ "title": "何ですか {{title}}?"
+ }
+ },
+ "mergeAudio": {
+ "description": "複数のオーディオ ファイルを順番に連結して 1 つのオーディオ ファイルに結合します。",
+ "longDescription": "このツールを使えば、複数のオーディオファイルをアップロード順に連結し、1つのファイルにまとめることができます。ポッドキャストのセグメント、音楽トラック、その他様々なオーディオファイルを結合するのに最適です。MP3、AAC、WAVなど、様々なオーディオ形式に対応しています。",
+ "shortDescription": "複数のオーディオ ファイルを 1 つに結合します (MP3、AAC、WAV)。",
+ "title": "オーディオを結合"
+ },
+ "trim": {
+ "description": "開始時間と終了時間を指定して、オーディオ ファイルをカットおよびトリミングし、特定のセグメントを抽出します。",
+ "longDescription": "このツールを使えば、開始時間と終了時間を指定してオーディオファイルをトリミングできます。長いオーディオファイルから特定のセグメントを抽出したり、不要な部分を削除したり、短いクリップを作成したりできます。MP3、AAC、WAVなど、様々なオーディオ形式に対応しています。ポッドキャスト編集、音楽制作、その他あらゆるオーディオ編集のニーズに最適です。",
+ "shortDescription": "オーディオ ファイルをトリミングして特定の時間セグメントを抽出します (MP3、AAC、WAV)。",
+ "title": "オーディオをトリムする"
+ }
+}
diff --git a/public/locales/ja/csv.json b/public/locales/ja/csv.json
new file mode 100644
index 0000000..2a845b7
--- /dev/null
+++ b/public/locales/ja/csv.json
@@ -0,0 +1,114 @@
+{
+ "changeCsvSeparator": {
+ "description": "CSVファイルの区切り文字を変更します。カンマ、セミコロン、タブ、カスタム区切り文字など、さまざまなCSV形式間で変換できます。",
+ "shortDescription": "CSVファイルの区切り文字を変更する",
+ "title": "CSVセパレーターの変更"
+ },
+ "csvRowsToColumns": {
+ "description": "このツールは、CSV(カンマ区切り値)ファイルの行を列に変換します。入力CSVから水平方向の行を1行ずつ抽出し、90度回転させて、カンマで区切られた垂直方向の列として出力します。', longDescription: 'このツールは、CSV(カンマ区切り値)ファイルの行を列に変換します。例えば、入力CSVデータが6行の場合、出力は6列になり、行の要素は上から下へ並べられます。整形式のCSVでは、各行の値の数は同じです。ただし、行にフィールドが欠落している場合は、プログラムが修正します。欠落データを空要素で埋めるか、「missing」、「?」、「x」などのカスタム要素で置き換えるかを選択できます。変換プロセス中、ツールはCSVファイルから空行(表示情報のない行)やコメントなどの不要な情報も削除します。ツールがコメントを正しく識別できるように、オプションで行頭のコメント開始記号を指定できます。この記号は通常、ハッシュ「#」またはダブルスラッシュ「//」です。CSV-abulous!",
+ "longDescription": "このツールは、CSV(カンマ区切り値)ファイルの行を列に変換します。例えば、入力CSVデータが6行の場合、出力は6列になり、行の要素は上から下に並べられます。整形式のCSVでは、各行の値の数は同じです。ただし、行にフィールドが欠落している場合は、プログラムが修正し、利用可能なオプションから選択できます。欠落データを空の要素で埋めるか、欠落データをカスタム要素で置き換えます。",
+ "shortDescription": "CSV の行を列に変換します。",
+ "title": "CSVの行を列に変換する"
+ },
+ "csvToJson": {
+ "columnSeparator": "列区切り文字(例:, ; \\t)",
+ "commentSymbol": "コメント記号(例:#)",
+ "conversionOptions": "変換オプション",
+ "description": "区切り文字、引用符、出力フォーマットなどのカスタマイズ可能なオプションを使用して、CSVファイルをJSON形式に変換します。ヘッダー、コメント、動的な型変換をサポートします。",
+ "dynamicTypes": "動的型",
+ "dynamicTypesDescription": "数値とブール値を自動的に変換する",
+ "errorParsing": "CSV 解析エラー: {{error}}",
+ "fieldQuote": "フィールド引用符(例: \")",
+ "inputCsvFormat": "入力CSV形式",
+ "inputTitle": "入力CSV",
+ "resultTitle": "出力JSON",
+ "shortDescription": "CSV データを JSON 形式に変換します。",
+ "skipEmptyLines": "空行をスキップ",
+ "skipEmptyLinesDescription": "入力CSV内の空行を無視する",
+ "title": "CSVをJSONに変換する",
+ "useHeaders": "ヘッダーを使用する",
+ "useHeadersDescription": "最初の行を列ヘッダーとして扱う"
+ },
+ "csvToTsv": {
+ "description": "以下のフォームにCSVファイルをアップロードすると、自動的にTSVファイルに変換されます。ツールのオプションでは、入力CSV形式をカスタマイズできます。フィールド区切り文字、引用符、コメント記号を指定したり、空のCSV行をスキップしたり、CSVの列ヘッダーを保持するかどうかを選択したりできます。",
+ "longDescription": "このツールは、カンマ区切り値(CSV)データをタブ区切り値(TSV)データに変換します。CSVとTSVはどちらも表形式のデータを保存する一般的なファイル形式ですが、値を区切る区切り文字が異なります。CSVではカンマ(",
+ "shortDescription": "CSV データを TSV 形式に変換します。",
+ "title": "CSVをTSVに変換する"
+ },
+ "csvToXml": {
+ "description": "カスタマイズ可能なオプションを使用して、CSV ファイルを XML 形式に変換します。",
+ "shortDescription": "CSV データを XML 形式に変換します。",
+ "title": "CSVをXMLに変換する"
+ },
+ "csvToYaml": {
+ "description": "下記のフォームにCSVファイルをアップロードするだけで、自動的にYAMLファイルに変換されます。ツールオプションでは、フィールド区切り文字、フィールド引用符、コメント文字を指定して、カスタムCSV形式に対応させることができます。さらに、出力YAML形式として、CSVヘッダーを保持する形式とCSVヘッダーを除外する形式を選択できます。",
+ "longDescription": "このツールは、CSV(カンマ区切り値)データをYAML(Yet Another Markup Language)データに変換します。CSVは、行と列で構成される行列のようなデータ型を表すために使用されるシンプルな表形式です。一方、YAMLはより高度な形式(実際にはJSONのスーパーセット)であり、シリアル化のために人間が読みやすいデータを作成し、リスト、辞書、ネストされたオブジェクトをサポートしています。このプログラムは、さまざまな入力CSV形式をサポートしています。入力データは、カンマ区切り(デフォルト)、セミコロン区切り、パイプ区切り、または全く異なる区切り文字を使用できます。オプションで、データで使用する正確な区切り文字を指定できます。同様に、オプションでは、CSVフィールドを囲むために使用される引用符文字(デフォルトは二重引用符)を指定できます。また、オプションでコメント記号を指定することにより、コメントで始まる行をスキップすることもできます。これにより、不要な行をスキップしてデータを整理できます。CSVをYAMLに変換するには、2つの方法があります。最初の方法は、CSVの各行をYAMLリストに変換します。2番目の方法は、CSVの最初の行からヘッダーを抽出し、それらのヘッダーに基づいてキーを持つYAMLオブジェクトを作成します。YAML構造のインデントに使用するスペースの数を指定することで、出力YAML形式をカスタマイズすることもできます。逆変換、つまりYAMLからCSVへの変換が必要な場合は、YAMLからCSVへの変換ツールをご利用ください。CSV変換はまさに至高です!",
+ "shortDescription": "CSV ファイルを YAML ファイルにすばやく変換します。",
+ "title": "CSVをYAMLに変換する"
+ },
+ "findIncompleteCsvRecords": {
+ "checkingOptions": "オプションの確認",
+ "commentCharacterDescription": "コメント行の開始を示す文字を入力します。この記号で始まる行はスキップされます。",
+ "csvInputOptions": "CSV入力オプション",
+ "csvSeparatorDescription": "CSV 入力ファイル内の列を区切るために使用する文字を入力します。",
+ "deleteLinesWithNoData": "データのない行を削除する",
+ "deleteLinesWithNoDataDescription": "CSV 入力ファイルから空の行を削除します。",
+ "description": "以下のフォームにCSVファイルをアップロードするだけで、このツールは行または列に欠損値がないかどうかを自動的にチェックします。ツールのオプションでは、入力ファイルの形式(区切り文字、引用符、コメント文字の指定)を調整できます。さらに、空値のチェックを有効にしたり、空行をスキップしたり、出力時のエラーメッセージの数に制限を設定したりすることもできます。",
+ "findEmptyValues": "空の値を見つける",
+ "findEmptyValuesDescription": "空の CSV フィールドに関するメッセージを表示します (これらは欠落したフィールドではなく、何も含まれていないフィールドです)。",
+ "inputTitle": "入力CSV",
+ "limitNumberOfMessages": "メッセージ数を制限する",
+ "messageLimitDescription": "出力されるメッセージ数の制限を設定します。",
+ "quoteCharacterDescription": "CSV 入力フィールドを引用するために使用する引用符文字を入力します。",
+ "resultTitle": "CSVステータス",
+ "shortDescription": "CSV 内で値が欠落している行と列をすばやく見つけます。",
+ "title": "不完全なCSVレコードを見つける",
+ "toolInfo": {
+ "title": "何ですか {{title}}?"
+ }
+ },
+ "insertCsvColumns": {
+ "appendColumns": "列を追加する",
+ "commentCharacterDescription": "コメント行の開始を示す文字を入力します。この記号で始まる行はスキップされます。",
+ "csvOptions": "CSVオプション",
+ "csvSeparator": "CSVセパレーター",
+ "csvToInsert": "挿入するCSV",
+ "csvToInsertDescription": "CSVに挿入したい列を1つ以上入力してください。列区切りに使用する文字は、CSV入力ファイル内の文字と同じである必要があります。注:空白行は無視されます。",
+ "customFillDescription": "入力 CSV ファイルが不完全 (値が欠落している) な場合は、レコードに空のフィールドまたはカスタム シンボルを追加して、整形式の CSV を作成しますか?",
+ "customFillValueDescription": "このカスタム値を使用して、不足しているフィールドを入力します。(上記の「カスタム値」モードでのみ機能します。)",
+ "customPosition": "カスタム位置",
+ "customPositionOptionsDescription": "CSV ファイルに列を挿入する方法を選択します。",
+ "description": "指定された位置に CSV データに新しい列を追加します。",
+ "fillWithCustomValues": "関税額を入力する",
+ "fillWithEmptyValues": "空の値を入力する",
+ "headerName": "ヘッダー名",
+ "headerNameDescription": "後ろに列を挿入する列のヘッダー。",
+ "inputTitle": "入力CSV",
+ "insertingPositionDescription": "CSV ファイル内の列を挿入する場所を指定します。",
+ "position": "位置",
+ "positionOptions": "ポジションオプション",
+ "prependColumns": "列を先頭に追加する",
+ "quoteCharDescription": "CSV 入力フィールドを引用するために使用する引用符文字を入力します。",
+ "resultTitle": "CSV出力",
+ "rowNumberDescription": "後ろに列を挿入する列の番号。",
+ "separatorDescription": "CSV 入力ファイル内の列を区切るために使用する文字を入力します。",
+ "shortDescription": "CSV ファイル内の任意の場所に 1 つ以上の新しい列をすばやく挿入します。",
+ "title": "CSV列を挿入する",
+ "toolInfo": {
+ "description": "このツールを使用すると、CSVデータの指定した位置に新しい列を挿入できます。ヘッダー名または列番号に基づいて、任意の位置に列を追加、追加、または挿入できます。",
+ "title": "CSV列の挿入"
+ }
+ },
+ "swapCsvColumns": {
+ "description": "以下のフォームにCSVファイルをアップロードし、入れ替えたい列を指定するだけで、ツールは出力ファイル内で指定された列の位置を自動的に変更します。ツールのオプションでは、入れ替えたい列の位置や列名を指定できるほか、不完全なデータを修正したり、空のレコードやコメントアウトされたレコードを削除したりすることもできます。",
+ "longDescription": "このツールは、CSVデータの列の位置を入れ替えることでデータを再構成します。列を入れ替えることで、頻繁に使用するデータをまとめて配置したり、先頭に配置したりすることで、データの比較や編集が容易になり、CSVファイルの読みやすさが向上します。例えば、最初の列を最後の列と入れ替えたり、2番目の列を3番目の列と入れ替えたりすることができます。列の位置に基づいて列を入れ替えるには、",
+ "shortDescription": "CSV 列を並べ替えます。",
+ "title": "CSV列の入れ替え"
+ },
+ "transposeCsv": {
+ "description": "以下のフォームにCSVファイルをアップロードするだけで、このツールが自動的にCSVを転置します。ツールのオプションでは、CSV内のコメント行の先頭文字を指定して削除できます。また、CSVが不完全(欠損値)な場合は、欠損値を空文字または任意の文字に置き換えることができます。",
+ "longDescription": "このツールは、カンマ区切り値(CSV)を転置します。CSVをデータの行列として扱い、すべての要素を主対角線を挟んで反転します。出力には入力と同じCSVデータが含まれますが、すべての行が列になり、すべての列が行になります。転置後、CSVファイルの次元は逆になります。たとえば、入力ファイルに4列3行がある場合、出力ファイルは3列4行になります。変換中に、プログラムは不要な行のデータを削除し、不完全なデータを修正します。具体的には、ツールはオプションで設定できる特定の文字で始まるすべての空のレコードとコメントを自動的に削除します。さらに、CSVデータが破損または失われた場合、ユーティリティはオプションで指定できる空のフィールドまたはカスタムフィールドでファイルを補完します。CSV-abulous!",
+ "shortDescription": "CSV ファイルをすばやく転置します。",
+ "title": "CSV転置"
+ }
+}
diff --git a/public/locales/ja/image.json b/public/locales/ja/image.json
new file mode 100644
index 0000000..26c5547
--- /dev/null
+++ b/public/locales/ja/image.json
@@ -0,0 +1,98 @@
+{
+ "changeColors": {
+ "description": "世界",
+ "shortDescription": "画像内の色を素早く入れ替える",
+ "title": "画像の色を変更する"
+ },
+ "changeOpacity": {
+ "description": "画像の透明度を簡単に調整できます。画像をアップロードし、スライダーを使って0(完全に透明)から1(完全に不透明)の間で希望の不透明度を設定し、変更した画像をダウンロードするだけです。",
+ "shortDescription": "画像の透明度を調整する",
+ "title": "画像の不透明度を変更する"
+ },
+ "compress": {
+ "description": "品質を維持しながら画像ファイルのサイズを縮小します。",
+ "inputTitle": "入力画像",
+ "resultTitle": "圧縮画像",
+ "shortDescription": "適切な品質を維持しながら画像を圧縮してファイル サイズを縮小します。",
+ "title": "画像を圧縮"
+ },
+ "compressPng": {
+ "description": "これはPNG画像を圧縮するプログラムです。PNG画像を入力エリアに貼り付けると、プログラムがすぐに圧縮し、出力エリアに結果を表示します。オプションでは、圧縮レベルを調整したり、圧縮前の画像ファイルサイズと新しい画像ファイルサイズを確認したりできます。",
+ "shortDescription": "PNGを素早く圧縮する",
+ "title": "PNGを圧縮する"
+ },
+ "convertJgpToPng": {
+ "description": "JPG画像をPNGに素早く変換できます。左側のエディタにPNG画像をインポートするだけです。",
+ "shortDescription": "JPG画像をPNGに素早く変換",
+ "title": "JPGをPNGに変換する"
+ },
+ "convertToJpg": {
+ "description": "さまざまな画像形式 (PNG、GIF、TIF、PSD、SVG、WEBP、HEIC、RAW) を、カスタマイズ可能な品質と背景色の設定で JPG に変換します。",
+ "shortDescription": "品質管理しながら画像をJPGに変換する",
+ "title": "画像をJPGに変換する"
+ },
+ "createTransparent": {
+ "description": "世界",
+ "shortDescription": "画像を素早く透明にする",
+ "title": "透明なPNGを作成する"
+ },
+ "crop": {
+ "description": "画像をトリミングして不要な部分を削除します。",
+ "inputTitle": "入力画像",
+ "resultTitle": "切り抜かれた画像",
+ "shortDescription": "画像を素早く切り取ります。",
+ "title": "画像をトリミング"
+ },
+ "editor": {
+ "description": "切り抜き、回転、注釈、色調整、透かしの追加など、高度な画像編集ツールを備えた高度な画像エディター。プロ仕様のツールを使って、ブラウザ上で直接画像を編集できます。",
+ "shortDescription": "高度なツールと機能で画像を編集する",
+ "title": "画像エディタ"
+ },
+ "imageToText": {
+ "description": "光学文字認識 (OCR) を使用して画像 (JPG、PNG) からテキストを抽出します。",
+ "shortDescription": "OCR を使用して画像からテキストを抽出します。",
+ "title": "画像からテキストへ(OCR)"
+ },
+ "qrCode": {
+ "description": "URL、テキスト、電子メール、電話、SMS、WiFi、vCard など、さまざまなデータ タイプの QR コードを生成します。",
+ "shortDescription": "さまざまなデータ形式に合わせてカスタマイズされた QR コードを作成します。",
+ "title": "QRコードジェネレーター"
+ },
+ "removeBackground": {
+ "description": "世界",
+ "shortDescription": "画像から背景を自動的に削除する",
+ "title": "画像から背景を削除する"
+ },
+ "resize": {
+ "description": "画像をさまざまな寸法に合わせてサイズ変更します。",
+ "dimensionType": "ディメンションタイプ",
+ "heightDescription": "高さ(ピクセル単位)",
+ "inputTitle": "入力画像",
+ "maintainAspectRatio": "アスペクト比を維持",
+ "maintainAspectRatioDescription": "画像の元のアスペクト比を維持します。",
+ "percentage": "パーセンテージ",
+ "percentageDescription": "元のサイズの割合(例:半分のサイズの場合は 50、2 倍のサイズの場合は 200)",
+ "resizeByPercentage": "パーセンテージでサイズを変更する",
+ "resizeByPercentageDescription": "元のサイズのパーセンテージを指定してサイズを変更します。",
+ "resizeByPixels": "ピクセル単位でサイズ変更",
+ "resizeByPixelsDescription": "ピクセル単位で寸法を指定してサイズを変更します。",
+ "resizeMethod": "サイズ変更方法",
+ "resultTitle": "サイズ変更された画像",
+ "setHeight": "高さの設定",
+ "setHeightDescription": "高さをピクセル単位で指定し、アスペクト比に基づいて幅を計算します。",
+ "setWidth": "幅を設定する",
+ "setWidthDescription": "幅をピクセル単位で指定し、アスペクト比に基づいて高さを計算します。",
+ "shortDescription": "画像のサイズを簡単に変更できます。",
+ "title": "画像のサイズ変更",
+ "toolInfo": {
+ "description": "このツールを使えば、JPG、PNG、SVG、GIF画像のサイズを変更できます。ピクセル単位またはパーセンテージでサイズを指定し、元のアスペクト比を維持するオプションも用意されています。",
+ "title": "画像のサイズ変更"
+ },
+ "widthDescription": "幅(ピクセル単位)"
+ },
+ "rotate": {
+ "description": "指定された角度で画像を回転します。",
+ "shortDescription": "画像を簡単に回転します。",
+ "title": "画像を回転する"
+ }
+}
diff --git a/public/locales/ja/json.json b/public/locales/ja/json.json
new file mode 100644
index 0000000..c929d56
--- /dev/null
+++ b/public/locales/ja/json.json
@@ -0,0 +1,62 @@
+{
+ "escapeJson": {
+ "description": "JSON文字列内の特殊文字をエスケープします。JSONデータを適切にエスケープされた形式に変換して、安全な転送や保存を実現します。",
+ "shortDescription": "JSON内の特殊文字をエスケープする",
+ "title": "JSON のエスケープ"
+ },
+ "jsonToXml": {
+ "description": "JSONデータをXML形式に変換します。構造化されたJSONオブジェクトを整形式のXMLドキュメントに変換します。",
+ "shortDescription": "JSONをXML形式に変換する",
+ "title": "JSONからXMLへ"
+ },
+ "minify": {
+ "description": "JSON から不要な空白をすべて削除します。",
+ "inputTitle": "入力JSON",
+ "resultTitle": "縮小されたJSON",
+ "shortDescription": "空白を削除してJSONを縮小する",
+ "title": "JSONを縮小する",
+ "toolInfo": {
+ "description": "JSONの縮小とは、JSONデータの妥当性を維持しながら、不要な空白文字をすべて削除するプロセスです。これには、JSONを正しく解析するために不要なスペース、改行、インデントなどが含まれます。縮小によりJSONデータのサイズが縮小され、データ構造と値は全く同じまま、保存と転送の効率が向上します。",
+ "title": "JSON の縮小とは何ですか?"
+ }
+ },
+ "prettify": {
+ "description": "適切なインデントとスペースを使用して JSON をフォーマットします。",
+ "indentation": "インデント",
+ "inputTitle": "入力JSON",
+ "resultTitle": "整形されたJSON",
+ "shortDescription": "JSON コードをフォーマットして美しくする",
+ "title": "JSONを美しくする",
+ "toolInfo": {
+ "description": "このツールを使用すると、JSON データを適切なインデントとスペースでフォーマットできるため、読みやすく、操作しやすくなります。",
+ "title": "JSONを美しくする"
+ },
+ "useSpaces": "スペースを使用する",
+ "useSpacesDescription": "スペースで出力をインデントする",
+ "useTabs": "タブを使用する",
+ "useTabsDescription": "出力をタブでインデントします。"
+ },
+ "stringify": {
+ "description": "JavaScriptオブジェクトをJSON文字列形式に変換します。データ構造をJSON文字列にシリアル化して保存または転送します。",
+ "shortDescription": "オブジェクトをJSON文字列に変換する",
+ "title": "JSONを文字列化する"
+ },
+ "tsvToJson": {
+ "description": "TSV(タブ区切り値)データをJSON形式に変換します。表形式のデータを構造化されたJSONオブジェクトに変換します。",
+ "shortDescription": "TSVをJSON形式に変換する",
+ "title": "TSVからJSONへ"
+ },
+ "validateJson": {
+ "description": "JSON が有効かつ整形式であるかどうかを確認します。",
+ "inputTitle": "入力JSON",
+ "invalidJson": "❌ {{error}}",
+ "resultTitle": "検証結果",
+ "shortDescription": "JSONコードのエラーを検証する",
+ "title": "JSONを検証する",
+ "toolInfo": {
+ "description": "JSON(JavaScript Object Notation)は軽量なデータ交換形式です。JSON検証は、データの構造がJSON標準に準拠していることを確認します。有効なJSONオブジェクトには、以下の要素が必要です。- プロパティ名が二重引用符で囲まれている。- 中括弧{}が適切にバランスされている。- 最後のキーと値のペアの後にカンマが付いていない。- オブジェクトと配列が適切にネストされている。このツールは入力されたJSONを検証し、一般的なエラーを特定して修正するためのフィードバックを提供します。",
+ "title": "JSON 検証とは何ですか?"
+ },
+ "validJson": "✅ 有効なJSON"
+ }
+}
diff --git a/public/locales/ja/list.json b/public/locales/ja/list.json
new file mode 100644
index 0000000..2858790
--- /dev/null
+++ b/public/locales/ja/list.json
@@ -0,0 +1,208 @@
+{
+ "duplicate": {
+ "concatenate": "連結",
+ "concatenateDescription": "コピーを連結する(チェックを外すと、アイテムが織り交ぜられます)",
+ "copyDescription": "コピー数(端数も可)",
+ "description": "リストアイテムを複製するための、世界で最もシンプルなブラウザベースのユーティリティです。リストを入力し、複製条件を指定するだけで、アイテムのコピーを作成できます。データの拡張、テスト、繰り返しパターンの作成に最適です。",
+ "duplicationOptions": "複製オプション",
+ "examples": {
+ "fractional": {
+ "description": "この例では、リストを小数部数で複製する方法を示します。",
+ "title": "部分的な複製"
+ },
+ "interweave": {
+ "description": "この例では、項目を連結するのではなく織り交ぜる方法を示します。",
+ "title": "織り交ぜたアイテム"
+ },
+ "reverse": {
+ "description": "この例では、リストを逆の順序で複製する方法を示します。",
+ "title": "逆複製"
+ },
+ "simple": {
+ "description": "この例では、単語のリストを複製する方法を示します。",
+ "title": "単純な複製"
+ }
+ },
+ "inputTitle": "入力リスト",
+ "joinSeparatorDescription": "重複したリストを結合するための区切り文字",
+ "resultTitle": "重複リスト",
+ "reverse": "逆行する",
+ "reverseDescription": "重複したアイテムを元に戻す",
+ "shortDescription": "指定した条件でリスト項目を複製する",
+ "splitByRegex": "正規表現で分割",
+ "splitBySymbol": "シンボルで分割",
+ "splitOptions": "分割オプション",
+ "splitSeparatorDescription": "リストを分割するための区切り文字",
+ "title": "重複",
+ "toolInfo": {
+ "description": "このツールを使うと、リスト内の項目を複製できます。複製する数(小数点以下を含む)を指定したり、項目を連結するか織り交ぜるかを制御したり、複製した項目を反転させたりすることも可能です。繰り返しパターンの作成、テストデータの生成、あるいは予測可能な内容のリスト拡張などに便利です。",
+ "title": "リストの重複"
+ }
+ },
+ "findMostPopular": {
+ "description": "リスト内で最も人気のあるアイテムを見つけるための、世界で最もシンプルなブラウザベースのユーティリティです。リストを入力するだけで、最も頻繁に表示されるアイテムを瞬時に表示します。データ分析、トレンドの特定、共通要素の発見に最適です。",
+ "shortDescription": "最も頻繁に発生するアイテムを見つける",
+ "title": "最も人気のあるものを探す"
+ },
+ "findUnique": {
+ "caseSensitiveItems": "大文字と小文字を区別する項目",
+ "caseSensitiveItemsDescription": "大文字と小文字が異なる項目をリスト内の一意の要素として出力します。",
+ "delimiterDescription": "区切り記号または正規表現を設定します。",
+ "description": "リスト内の一意の項目を見つけるための、世界で最もシンプルなブラウザベースのユーティリティです。リストを入力すると、重複を除いたすべての一意の値が瞬時に取得されます。データのクリーニング、重複除去、または異なる要素の検索に最適です。",
+ "findAbsolutelyUniqueItems": "絶対にユニークなアイテムを見つける",
+ "findAbsolutelyUniqueItemsDescription": "リストの項目のうち、単一のコピー内に存在するものだけを表示します。",
+ "inputListDelimiter": "入力リスト区切り文字",
+ "inputTitle": "入力リスト",
+ "outputListDelimiter": "出力リスト区切り文字",
+ "resultTitle": "ユニークなアイテム",
+ "shortDescription": "リスト内のユニークなアイテムを見つける",
+ "skipEmptyItems": "空の項目をスキップ",
+ "skipEmptyItemsDescription": "出力に空のリスト項目を含めないでください。",
+ "title": "ユニークなものを見つける",
+ "trimItems": "リスト項目をトリムする",
+ "trimItemsDescription": "項目を比較する前に先頭と末尾のスペースを削除します。",
+ "uniqueItemOptions": "ユニークなアイテムオプション"
+ },
+ "group": {
+ "deleteEmptyItems": "空のアイテムを削除する",
+ "deleteEmptyItemsDescription": "空の項目は無視し、グループに含めません。",
+ "description": "リスト項目をグループ化するための、世界で最もシンプルなブラウザベースのユーティリティです。リストを入力し、グループ化の条件を指定するだけで、項目を論理的なグループに整理できます。データの分類、情報の整理、構造化されたリストの作成に最適です。カスタムセパレーターと様々なグループ化オプションをサポートしています。",
+ "emptyItemsAndPadding": "空の項目とパディング",
+ "groupNumberDescription": "グループ内のアイテム数",
+ "groupSeparatorDescription": "グループ区切り文字",
+ "groupSizeAndSeparators": "グループサイズと区切り",
+ "inputItemSeparator": "入力項目セパレーター",
+ "inputTitle": "入力リスト",
+ "itemSeparatorDescription": "項目区切り文字",
+ "leftWrapDescription": "グループの左折り返し記号。",
+ "padNonFullGroups": "非フルグループのパディング",
+ "padNonFullGroupsDescription": "いっぱいでないグループをカスタム項目で埋めます (以下に入力)。",
+ "paddingCharDescription": "この文字または項目を使用して、完全でないグループを埋め込みます。",
+ "resultTitle": "グループ化されたアイテム",
+ "rightWrapDescription": "グループの右折り返し記号。",
+ "shortDescription": "共通のプロパティでリスト項目をグループ化する",
+ "splitOperators": {
+ "regex": {
+ "description": "入力リスト項目を正規表現で区切ります。",
+ "title": "正規表現を使用して分割する"
+ },
+ "symbol": {
+ "description": "入力リスト項目を文字で区切ります。",
+ "title": "分割にシンボルを使用する"
+ }
+ },
+ "splitSeparatorDescription": "区切り記号または正規表現を設定します。",
+ "title": "グループ"
+ },
+ "reverse": {
+ "description": "これは、すべてのリスト項目を逆順に表示する、非常にシンプルなブラウザベースのアプリケーションです。入力項目は任意の記号で区切ることができ、逆順に表示するリスト項目の区切り文字を変更することもできます。",
+ "inputTitle": "入力リスト",
+ "itemSeparator": "アイテムセパレーター",
+ "itemSeparatorDescription": "区切り記号または正規表現を設定します。",
+ "outputListOptions": "出力リストオプション",
+ "outputSeparatorDescription": "出力リスト項目のセパレーター。",
+ "resultTitle": "逆リスト",
+ "shortDescription": "リストを素早く逆順にする",
+ "splitOperators": {
+ "regex": {
+ "description": "入力リスト項目を正規表現で区切ります。",
+ "title": "正規表現を使用して分割する"
+ },
+ "symbol": {
+ "description": "入力リスト項目を文字で区切ります。",
+ "title": "分割にシンボルを使用する"
+ }
+ },
+ "splitterMode": "スプリッターモード",
+ "title": "逆行する",
+ "toolInfo": {
+ "description": "このユーティリティを使えば、リスト内の項目の順序を逆にすることができます。このユーティリティはまず入力リストを個々の項目に分割し、最後の項目から最初の項目まで反復処理を行い、反復処理中に各項目を出力に出力します。入力リストには、数字、文字列、単語、文章など、テキストデータとして表現できるあらゆるものを含めることができます。入力項目の区切り文字には正規表現も使用できます。例えば、正規表現 /[;,]/ を使用すると、カンマ区切りまたはセミコロン区切りの項目を使用できます。入力リストと出力リストの項目の区切り文字は、オプションでカスタマイズできます。デフォルトでは、入力リストと出力リストの両方がカンマ区切りです。まさにリストの素晴らしさ!",
+ "title": "リストリバーサーとは何ですか?"
+ }
+ },
+ "rotate": {
+ "description": "リスト項目を回転させる、世界で最もシンプルなブラウザベースのユーティリティです。リストを入力し、回転量を指定すると、指定した数だけ項目を移動できます。データ操作、循環シフト、リストの並べ替えに最適です。",
+ "shortDescription": "リスト項目を指定された位置で回転する",
+ "title": "回転"
+ },
+ "shuffle": {
+ "delimiterDescription": "区切り記号または正規表現を設定します。",
+ "description": "リスト項目をシャッフルする、世界で最もシンプルなブラウザベースのユーティリティです。リストを入力すると、項目がランダムな順序で並んだランダムバージョンが瞬時に作成されます。バラエティ豊かなリストの作成、ランダム性のテスト、順序付けられたデータの混合などに最適です。",
+ "inputListSeparator": "入力リストセパレーター",
+ "inputTitle": "入力リスト",
+ "joinSeparatorDescription": "ランダム化されたリストではこの区切り文字を使用します。",
+ "outputLengthDescription": "これだけの数のランダムアイテムを出力する",
+ "resultTitle": "シャッフルされたリスト",
+ "shortDescription": "リスト項目の順序をランダムにする",
+ "shuffledListLength": "シャッフルリストの長さ",
+ "shuffledListSeparator": "シャッフルリストセパレーター",
+ "title": "シャッフル"
+ },
+ "sort": {
+ "caseSensitive": "大文字と小文字を区別する並べ替え",
+ "caseSensitiveDescription": "大文字と小文字を別々に並べ替えます。昇順リストでは、大文字が小文字よりも前に表示されます。(アルファベット順の並べ替えモードでのみ機能します。)",
+ "description": "リスト項目を並べ替えるための、世界で最もシンプルなブラウザベースのユーティリティです。リストを入力し、並べ替え条件を指定することで、項目を昇順または降順に並べ替えることができます。データの整理、テキスト処理、順序付きリストの作成に最適です。",
+ "inputItemSeparator": "入力項目セパレーター",
+ "inputTitle": "入力リスト",
+ "joinSeparatorDescription": "この記号は、ソートされたリスト内の項目間の結合子として使用します。",
+ "orderDescription": "並べ替え順序を選択します。",
+ "orderOptions": {
+ "decreasing": "降順",
+ "increasing": "昇順"
+ },
+ "removeDuplicates": "重複を削除する",
+ "removeDuplicatesDescription": "重複したリスト項目を削除します。",
+ "resultTitle": "ソートされたリスト",
+ "shortDescription": "リスト項目を指定された順序で並べ替える",
+ "sortMethod": "ソート方法",
+ "sortMethodDescription": "並べ替え方法を選択します。",
+ "sortOptions": {
+ "alphabetic": "アルファベット順に並べ替え",
+ "length": "長さで並べ替え",
+ "numeric": "数値順に並べ替える"
+ },
+ "sortedItemProperties": "並べ替えられたアイテムのプロパティ",
+ "splitOperators": {
+ "regex": {
+ "description": "入力リスト項目を正規表現で区切ります。",
+ "title": "正規表現を使用して分割する"
+ },
+ "symbol": {
+ "description": "入力リスト項目を文字で区切ります。",
+ "title": "分割にシンボルを使用する"
+ }
+ },
+ "splitSeparatorDescription": "区切り記号または正規表現を設定します。",
+ "title": "選別"
+ },
+ "truncate": {
+ "description": "リストを切り捨てるための、世界で最もシンプルなブラウザベースのユーティリティです。リストを入力し、保持するアイテムの最大数を指定します。データ処理、リスト管理、コンテンツの長さ制限などに最適です。",
+ "shortDescription": "リストを指定された項目数に切り捨てる",
+ "title": "切り捨て"
+ },
+ "unwrap": {
+ "description": "リスト項目を展開するための、世界で最もシンプルなブラウザベースのユーティリティです。展開されたリストを入力し、展開条件を指定することで、整理された項目をフラット化できます。データ処理、テキスト操作、構造化リストからのコンテンツ抽出に最適です。",
+ "shortDescription": "構造化された形式からリスト項目をアンラップする",
+ "title": "ラップを解除"
+ },
+ "wrap": {
+ "description": "各リスト項目の前後にテキストを追加します。",
+ "inputTitle": "入力リスト",
+ "joinSeparatorDescription": "ラップされたリストを結合するためのセパレーター",
+ "leftTextDescription": "各項目の前に追加するテキスト",
+ "removeEmptyItems": "空のアイテムを削除する",
+ "resultTitle": "ラップされたリスト",
+ "rightTextDescription": "各項目の後に追加するテキスト",
+ "shortDescription": "指定した条件でリスト項目を囲む",
+ "splitByRegex": "正規表現で分割",
+ "splitBySymbol": "シンボルで分割",
+ "splitOptions": "分割オプション",
+ "splitSeparatorDescription": "リストを分割するための区切り文字",
+ "title": "包む",
+ "toolInfo": {
+ "description": "このツールを使うと、リスト内の各項目の前後にテキストを追加できます。左右に異なるテキストを指定したり、リストの処理方法を制御したりできます。リスト項目に引用符、括弧、その他の書式を追加したり、さまざまな形式に合わせてデータを準備したり、構造化テキストを作成したりするのに役立ちます。",
+ "title": "リストの折り返し"
+ },
+ "wrapOptions": "ラップオプション"
+ }
+}
diff --git a/public/locales/ja/number.json b/public/locales/ja/number.json
new file mode 100644
index 0000000..7e7b1c2
--- /dev/null
+++ b/public/locales/ja/number.json
@@ -0,0 +1,89 @@
+{
+ "arithmeticSequence": {
+ "commonDifferenceDescription": "用語間の共通差異(d)",
+ "description": "カスタマイズ可能なパラメータを使用して算術シーケンスを生成します。",
+ "firstTermDescription": "数列の最初の項 (a₁)",
+ "numberOfTermsDescription": "生成する項の数 (n)",
+ "outputFormat": "出力形式",
+ "resultTitle": "生成されたシーケンス",
+ "separatorDescription": "用語間の区切り文字",
+ "sequenceParameters": "シーケンスパラメータ",
+ "shortDescription": "等差数列を生成する",
+ "title": "等差数列",
+ "toolInfo": {
+ "description": "等差数列とは、連続する各項の差が一定である数列です。この一定差は公差と呼ばれます。最初の項 (a₁) と公差 (d) が与えられれば、各項は前の項に公差を加えることで求められます。",
+ "title": "等差数列とは何ですか?"
+ }
+ },
+ "generate": {
+ "arithmeticSequenceOption": "等差数列オプション",
+ "description": "カスタマイズ可能なパラメータを使用して数値のシーケンスを生成します。",
+ "numberOfElementsDescription": "シーケンス内の要素の数。",
+ "resultTitle": "生成された番号",
+ "separator": "セパレーター",
+ "separatorDescription": "等差数列内の要素をこの文字で区切ります。",
+ "shortDescription": "指定された範囲内で乱数を生成する",
+ "startSequenceDescription": "この番号からシーケンスを開始します。",
+ "stepDescription": "各要素をこの量だけ増加します",
+ "title": "生成する",
+ "toolInfo": {
+ "description": "このツールを使用すると、カスタマイズ可能なパラメータを使用して数値列を生成できます。開始値、ステップサイズ、要素数を指定できます。",
+ "title": "数字を生成する"
+ }
+ },
+ "ohmsLaw": {
+ "description": "電圧、電流、抵抗を計算します",
+ "longDescription": "この計算機は、オームの法則(V = I × R)を用いて、他の2つの電気パラメータが既知の場合、3つの電気パラメータのいずれかを決定します。オームの法則は、電圧(V)、電流(I)、抵抗(R)の関係を記述する電気工学の基本原理です。このツールは、電子工学愛好家、電気技術者、そして回路設計に取り組む学生にとって、電気設計における未知の値を素早く解くために不可欠です。",
+ "shortDescription": "オームの法則を使って電気回路の電圧、電流、抵抗を計算する",
+ "title": "オームの法則"
+ },
+ "slackline": {
+ "description": "スラックラインの張力を計算する",
+ "longDescription": "この計算機はロープの中央に荷重がかかることを想定しています",
+ "shortDescription": "スラックラインや物干しロープのおおよその張力を計算しましょう。ただし、安全のためにこれに頼らないでください。",
+ "title": "スラックラインの張力"
+ },
+ "sphereArea": {
+ "description": "球の面積",
+ "longDescription": "この計算機は、A = 4πr²という公式を用いて球の表面積を計算します。半径を入力して表面積を求めることも、表面積を入力して必要な半径を計算することもできます。このツールは、幾何学を学ぶ学生、球体を扱うエンジニア、そして球面に関する計算を行う必要があるすべての人にとって便利です。",
+ "shortDescription": "球の半径に基づいて球の表面積を計算する",
+ "title": "球の面積"
+ },
+ "sphereVolume": {
+ "description": "球の体積",
+ "longDescription": "この計算機は、V = (4/3)πr³という公式を用いて球の体積を計算します。半径または直径を入力して体積を求めることも、体積を入力して必要な半径を求めることもできます。このツールは、物理学、工学、製造業などの分野で球体を扱う学生、エンジニア、専門家にとって非常に役立ちます。",
+ "shortDescription": "半径または直径を使用して球の体積を計算する",
+ "title": "球の体積"
+ },
+ "sum": {
+ "description": "数値リストの合計を計算します。数値をカンマまたは改行で区切って入力すると、合計が求められます。",
+ "extractionTypes": {
+ "delimiter": {
+ "description": "ここで数値区切りをカスタマイズします。(デフォルトでは改行です。)",
+ "title": "数値区切り文字"
+ },
+ "smart": {
+ "description": "入力内の数字を自動検出します。",
+ "title": "スマートサム"
+ }
+ },
+ "inputTitle": "入力",
+ "numberExtraction": "番号抽出",
+ "printRunningSum": "累計を印刷",
+ "printRunningSumDescription": "計算された合計を段階的に表示します。",
+ "resultTitle": "合計",
+ "runningSum": "累計",
+ "shortDescription": "数字の合計を計算する",
+ "title": "和",
+ "toolInfo": {
+ "description": "これは、複数の数値の合計を計算するためのブラウザベースのオンラインユーティリティです。数値は、カンマ、スペース、または改行を含む任意の文字で区切って入力できます。また、合計したい数値を含むテキストデータを貼り付けるだけで、ユーティリティがそれらの数値を抽出し、合計を計算します。",
+ "title": "数値合計計算機とは何ですか?"
+ }
+ },
+ "voltageDropInWire": {
+ "description": "2導体ケーブルの往復電圧と電力損失を計算します",
+ "longDescription": "この計算機は、2芯電気ケーブルにおける電圧降下と電力損失を計算するのに役立ちます。ケーブルの長さ、電線ゲージ(断面積)、材質の抵抗率、電流の流れを考慮します。このツールは、往復の電圧降下、ケーブルの総抵抗、そして熱として消費される電力を計算します。これは、電気技術者、電気技師、そして趣味で電気システムを設計する際に、負荷における電圧レベルが許容範囲内に維持されるようにする際に特に役立ちます。",
+ "shortDescription": "長さ、材質、電流に基づいて電気ケーブルの電圧降下と電力損失を計算します",
+ "title": "ケーブルの往復電圧降下"
+ }
+}
diff --git a/public/locales/ja/pdf.json b/public/locales/ja/pdf.json
new file mode 100644
index 0000000..3f0e3a6
--- /dev/null
+++ b/public/locales/ja/pdf.json
@@ -0,0 +1,113 @@
+{
+ "compressPdf": {
+ "compressedFileSize": "圧縮ファイルサイズ",
+ "compressingPdf": "PDF を圧縮しています...",
+ "compressionLevel": "圧縮レベル",
+ "compressionSettings": "圧縮設定",
+ "description": "Ghostscriptを使用して品質を維持しながらPDFファイルのサイズを縮小する",
+ "errorCompressingPdf": "PDF の圧縮に失敗しました: {{error}}",
+ "errorReadingPdf": "PDFファイルの読み取りに失敗しました。有効なPDFであることを確認してください。",
+ "fileSize": "元のファイルサイズ",
+ "highCompression": "高圧縮",
+ "highCompressionDescription": "多少の品質低下を伴いファイルサイズを最大限に削減",
+ "inputTitle": "入力PDF",
+ "lowCompression": "低圧縮",
+ "lowCompressionDescription": "品質の低下を最小限に抑えながらファイルサイズをわずかに削減",
+ "mediumCompression": "中圧縮",
+ "mediumCompressionDescription": "ファイルサイズと品質のバランス",
+ "pages": "ページ数",
+ "resultTitle": "圧縮PDF",
+ "shortDescription": "ブラウザでPDFファイルを安全に圧縮",
+ "title": "PDFを圧縮"
+ },
+ "editor": {
+ "description": "注釈、フォーム入力、ハイライト、エクスポート機能を備えた高度なPDFエディター。テキスト挿入、描画、ハイライト、署名、フォーム入力などのプロ仕様のツールを使って、ブラウザ内で直接PDFを編集できます。",
+ "shortDescription": "高度な注釈、署名、編集ツールでPDFを編集",
+ "title": "PDFエディター"
+ },
+ "merge": {
+ "inputTitle": "入力PDF",
+ "loadingText": "ページの抽出",
+ "resultTitle": "結合したPDFを出力する",
+ "toolInfo": {
+ "description": "このツールを使えば、複数のPDFファイルを1つの文書に結合することができます。結合したいPDFファイルをアップロードするだけで、入力ファイルのすべてのページが1つのPDF文書に結合されます。",
+ "title": "Merge PDF ツールの使い方"
+ }
+ },
+ "mergePdf": {
+ "description": "複数の PDF ファイルを 1 つのドキュメントに結合します。",
+ "inputTitle": "入力PDF",
+ "mergingPdfs": "PDFの結合",
+ "pdfOptions": "PDFオプション",
+ "resultTitle": "結合されたPDF",
+ "shortDescription": "複数のPDFファイルを1つの文書に結合する",
+ "sortByFileName": "ファイル名で並べ替え",
+ "sortByFileNameDescription": "PDFをファイル名のアルファベット順に並べ替える",
+ "sortByUploadOrder": "アップロード順に並べ替え",
+ "sortByUploadOrderDescription": "PDFをアップロードされた順序で保存する",
+ "title": "PDFを結合",
+ "toolInfo": {
+ "description": "このツールを使えば、複数のPDFファイルを1つの文書に結合できます。PDFファイルの並び順を指定すると、ツールが指定した順序で結合します。",
+ "title": "PDFファイルの結合"
+ }
+ },
+ "pdfToEpub": {
+ "description": "PDF文書をEPUBファイルに変換して、電子書籍リーダーとの互換性を高めます。', icon: 'material-symbols:import-contacts', components: lazy(() => import('./index')), keywords: ['pdf', 'epub', 'convert', 'ebook'], path: 'pdf-to-epub', i18n: { name: 'pdf:pdfToEpub.title', description: 'pdf:pdfToEpub.description",
+ "shortDescription": "PDFファイルをEPUB形式に変換する",
+ "title": "PDFからEPUBへ"
+ },
+ "pdfToPng": {
+ "description": "PDF ドキュメントを PNG パネルに変換します。",
+ "longDescription": "PDFをアップロードすると、ブラウザ内で各ページを高画質のPNG画像に変換できます。このツールは、ビジュアルコンテンツの抽出や個々のページの共有に最適です。データはアップロードされず、すべてローカルで実行されます。",
+ "shortDescription": "PDFをPNG画像に変換する",
+ "title": "PDFからPNGへ"
+ },
+ "protectPdf": {
+ "description": "ブラウザで安全にPDFファイルにパスワード保護を追加します",
+ "shortDescription": "PDFファイルをパスワードで安全に保護する",
+ "title": "PDFを保護する"
+ },
+ "rotatePdf": {
+ "allPagesWillBeRotated": "全て {{count}} ページが回転します",
+ "angleOptions": {
+ "clockwise90": "90°時計回り",
+ "counterClockwise270": "270°(反時計回り90°)",
+ "upsideDown180": "180°(上下逆さま)"
+ },
+ "applyToAllPages": "すべてのページに適用",
+ "description": "PDF ドキュメント内のページを回転します。",
+ "inputTitle": "入力PDF",
+ "longDescription": "PDFページの向きを90度、180度、または270度回転して変更できます。スキャンミスを修正したり、印刷用のPDFを準備したりする際に便利です。",
+ "pageRangesDescription": "ページ番号または範囲をコンマで区切って入力してください(例:1,3,5-7)",
+ "pageRangesPlaceholder": "例:1.5-8",
+ "pagesWillBeRotated": "{{count}} ページ{{count !== 1 ? 's' : ''}} 回転します",
+ "pdfPageCount": "PDFには {{count}} ページ{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "回転したPDF",
+ "rotatingPages": "ページの回転",
+ "rotationAngle": "回転角度",
+ "rotationSettings": "回転設定",
+ "shortDescription": "PDF文書のページを回転する",
+ "title": "PDFを回転",
+ "toolInfo": {
+ "description": "このツールを使うと、PDF文書内のページを回転できます。すべてのページを回転することも、特定のページを指定して回転させることもできます。回転角度は、時計回り90度、180度(上下反転)、または反時計回り90度(270度)から選択できます。特定のページを回転させるには、「すべてのページに適用」のチェックを外し、ページ番号またはページ範囲をカンマで区切って入力します(例:1,3,5-7)。",
+ "title": "PDF回転ツールの使い方"
+ }
+ },
+ "splitPdf": {
+ "description": "PDF ドキュメントから特定のページを抽出します。",
+ "extractingPages": "ページの抽出",
+ "inputTitle": "入力PDF",
+ "pageExtractionPreview": "{{count}} ページ{{count !== 1 ? 's' : ''}} 抽出されます",
+ "pageRangesDescription": "ページ番号または範囲をコンマで区切って入力してください(例:1,3,5-7)",
+ "pageRangesPlaceholder": "例:1.5-8",
+ "pageSelection": "ページ選択",
+ "pdfPageCount": "PDFには {{count}} ページ{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "抽出されたPDF",
+ "shortDescription": "PDFファイルから特定のページを抽出する",
+ "title": "PDFを分割",
+ "toolInfo": {
+ "description": "このツールを使うと、PDF文書から特定のページを抽出できます。抽出するページは、個々のページまたはページ範囲で指定できます。",
+ "title": "PDFを分割"
+ }
+ }
+}
diff --git a/public/locales/ja/string.json b/public/locales/ja/string.json
new file mode 100644
index 0000000..897f312
--- /dev/null
+++ b/public/locales/ja/string.json
@@ -0,0 +1,261 @@
+{
+ "base64": {
+ "decode": "Base64デコード",
+ "description": "Base64 エンコーディングを使用してテキストをエンコードまたはデコードします。",
+ "encode": "Base64エンコード",
+ "inputTitle": "入力データ",
+ "optionsTitle": "Base64オプション",
+ "resultTitle": "結果",
+ "shortDescription": "Base64 を使用してデータをエンコードまたはデコードします。",
+ "title": "Base64 エンコーダ/デコーダ",
+ "toolInfo": {
+ "description": "Base64は、ASCII文字列形式のデータを基数64の表現に変換して表現するエンコード方式です。文字列のエンコードにも使用できますが、テキストデータを扱うように設計されたメディアで伝送するバイナリデータのエンコードによく使用されます。",
+ "title": "Base64 とは何ですか?"
+ }
+ },
+ "censor": {
+ "description": "テキスト内の単語を検閲するためのユーティリティです。左側の入力フォームにテキストを入力し、オプションで不適切な単語をすべて指定すると、出力領域に検閲されたテキストが即座に表示されます。\", longDescription: 'このオンラインツールを使えば、あらゆるテキスト内の特定の単語を検閲できます。不要な単語(罵り言葉や秘密の言葉など)のリストを指定すると、プログラムがそれらを代替単語に置き換え、安全に読めるテキストを作成します。単語は、オプションの複数行テキストフィールドに1行につき1単語ずつ入力することで指定できます。', キーワード: ['text', 'censor', 'words', 'characters'], コンポーネント: lazy(() => import('./index')), i18n: { name: 'string:censor.title', description: 'string:censor.description",
+ "shortDescription": "不適切な単語をすぐにマスクするか、別の単語に置き換えます。",
+ "title": "テキスト検閲"
+ },
+ "createPalindrome": {
+ "description": "あらゆるテキストから回文を作成できる、世界で最もシンプルなブラウザベースのユーティリティです。テキストを入力すると、前後どちらから読んでも同じ回文に瞬時に変換されます。言葉遊び、対称的なテキストパターンの作成、言語的好奇心の探求などに最適です。",
+ "shortDescription": "前後どちらから読んでも同じテキストを作成する",
+ "title": "回文を作成する"
+ },
+ "extractSubstring": {
+ "description": "テキストから部分文字列を抽出できる、世界で最もシンプルなブラウザベースのユーティリティです。テキストを入力し、開始位置と終了位置を指定するだけで、必要な部分を抽出できます。データ処理、テキスト分析、あるいは大きなテキストブロックから特定のコンテンツを抽出するのに最適です。",
+ "shortDescription": "指定した位置の間のテキストの一部を抽出する",
+ "title": "部分文字列の抽出"
+ },
+ "join": {
+ "blankLinesAndTrailingSpaces": "空白行と末尾のスペース",
+ "deleteBlankDescription": "テキスト シンボルのない行を削除します。",
+ "deleteBlankTitle": "空白行を削除する",
+ "deleteTrailingDescription": "行末のスペースとタブを削除します。",
+ "deleteTrailingTitle": "末尾のスペースを削除",
+ "description": "カスタマイズ可能なセパレーターを使用してテキスト部分を結合します。",
+ "inputTitle": "テキストピース",
+ "joinCharacterDescription": "テキストの断片を連結する記号。(デフォルトではスペース)",
+ "joinCharacterPlaceholder": "キャラクターを参加させる",
+ "resultTitle": "結合テキスト",
+ "shortDescription": "指定した区切り文字でテキスト要素を結合する",
+ "textMergedOptions": "テキスト結合オプション",
+ "title": "テキストを結合",
+ "toolInfo": {
+ "description": "このツールを使えば、テキストの一部を結合できます。改行で区切られたテキスト値のリストを受け取り、それらを結合します。結合後のテキストの各部分の間に挿入する文字を設定できます。また、すべての空行を無視し、すべての行末のスペースとタブを削除することもできます。Textabulous!",
+ "title": "テキストジョイナーとは何ですか?"
+ }
+ },
+ "palindrome": {
+ "description": "テキストが回文であるかどうかをチェックする、世界で最もシンプルなブラウザベースのユーティリティです。テキストが前後どちらから読んでも同じかどうかを瞬時に検証します。単語パズル、言語分析、対称的なテキストパターンの検証に最適です。様々な区切り文字と複数単語の回文検出に対応しています。",
+ "shortDescription": "テキストが前後で同じ読み方をしているか確認する",
+ "title": "回文"
+ },
+ "passwordGenerator": {
+ "avoidAmbiguous": "あいまいな文字(i、I、l、0、O)は避けてください",
+ "description": "長さと文字種をカスタマイズ可能な、安全なランダムパスワードを生成します。小文字、大文字、数字、特殊文字から選択できます。読みやすさを向上させるため、あいまいな文字を避けるオプションも用意されています。",
+ "includeLowercase": "小文字(a~z)を含める",
+ "includeNumbers": "数字を含める(0~9)",
+ "includeSymbols": "特殊文字を含める",
+ "includeUppercase": "大文字(A~Z)を含める",
+ "lengthDesc": "パスワードの長さ",
+ "lengthPlaceholder": "例:12",
+ "optionsTitle": "パスワードオプション",
+ "resultTitle": "生成されたパスワード",
+ "shortDescription": "カスタムオプションで安全なランダムパスワードを生成する",
+ "title": "パスワードジェネレーター",
+ "toolInfo": {
+ "description": "このツールは、選択した条件に基づいて安全なランダムパスワードを生成します。長さをカスタマイズしたり、様々な文字種を含めるか除外したり、読みやすさを向上させるために曖昧な文字を避けたりすることができます。アカウント、アプリケーション、その他あらゆるセキュリティニーズに対応する強力なパスワードの作成に最適です。",
+ "title": "パスワードジェネレータについて"
+ }
+ },
+ "quote": {
+ "allowDoubleQuotation": "二重引用符を許可する",
+ "description": "カスタマイズ可能なオプションを使用してテキストを引用符で囲みます。",
+ "inputTitle": "入力テキスト",
+ "leftQuoteDescription": "左引用文字",
+ "processAsMultiLine": "複数行テキストとして処理",
+ "quoteEmptyLines": "空行を引用する",
+ "quoteOptions": "引用オプション",
+ "resultTitle": "引用テキスト",
+ "rightQuoteDescription": "右引用符文字",
+ "shortDescription": "さまざまなスタイルでテキストを引用符で囲む",
+ "title": "テキスト引用",
+ "toolInfo": {
+ "description": "このツールを使うと、テキストを引用符で囲むことができます。様々な引用符文字を選択したり、複数行テキストを扱ったり、空行の処理方法を制御したりできます。プログラミング用のテキストの作成、データの書式設定、スタイリッシュなテキストの作成に役立ちます。",
+ "title": "テキスト引用"
+ }
+ },
+ "randomizeCase": {
+ "description": "テキストの大文字と小文字をランダム化する、世界で最もシンプルなブラウザベースのユーティリティです。テキストを入力すると、大文字と小文字がランダムにランダムに変換されます。ユニークなテキストエフェクトの作成、大文字と小文字の区別のテスト、多様なテキストパターンの生成に最適です。",
+ "shortDescription": "テキスト内の大文字と小文字をランダムにする",
+ "title": "ケースをランダム化"
+ },
+ "removeDuplicateLines": {
+ "description": "左側の入力フォームにテキストを読み込むと、出力エリアに重複行のないテキストが瞬時に表示されます。強力、無料、そして高速。テキスト行の読み込み – 重複行のないテキスト行を取得",
+ "shortDescription": "テキストから重複行をすべて素早く削除します",
+ "title": "重複行を削除する"
+ },
+ "repeat": {
+ "delimiterDescription": "出力コピーの区切り文字。",
+ "delimiterPlaceholder": "デリミタ",
+ "description": "カスタマイズ可能なセパレーターを使用してテキストを複数回繰り返します。",
+ "inputTitle": "入力テキスト",
+ "numberPlaceholder": "番号",
+ "repeatAmountDescription": "繰り返し回数。",
+ "repetitionsDelimiter": "繰り返し区切り文字",
+ "resultTitle": "繰り返しテキスト",
+ "shortDescription": "テキストを複数回繰り返す",
+ "textRepetitions": "テキストの繰り返し",
+ "title": "テキストの繰り返し",
+ "toolInfo": {
+ "description": "このツールを使用すると、オプションの区切り文字を使用して、特定のテキストを複数回繰り返すことができます。",
+ "title": "テキストの繰り返し"
+ }
+ },
+ "reverse": {
+ "description": "世界で最もシンプルなブラウザベースのテキスト反転ユーティリティ。任意のテキストを入力すると、文字ごとに瞬時に反転します。鏡文字の作成、回文の解析、テキストパターンの操作に最適です。反転時にスペースと特殊文字は保持されます。",
+ "inputTitle": "反転するテキスト",
+ "processMultiLine": "複数行テキストを処理する",
+ "processMultiLineDescription": "各行は独立して反転されます",
+ "resultTitle": "反転テキスト",
+ "reversalOptions": "反転オプション",
+ "shortDescription": "テキストを文字ごとに反転します",
+ "skipEmptyLines": "空行をスキップする",
+ "skipEmptyLinesDescription": "出力から空行は削除されます",
+ "title": "逆行する",
+ "trimWhitespace": "空白をトリムする",
+ "trimWhitespaceDescription": "各行の先頭と末尾の空白を削除します"
+ },
+ "rot13": {
+ "description": "ROT13 暗号を使用してテキストをエンコードまたはデコードします。",
+ "inputTitle": "入力テキスト",
+ "resultTitle": "ROT13の結果",
+ "shortDescription": "ROT13 暗号を使用してテキストをエンコードまたはデコードします。",
+ "title": "ROT13 エンコーダ/デコーダ",
+ "toolInfo": {
+ "description": "ROT13(13桁回転)は、文字をアルファベットの13番目の文字に置き換えるシンプルな文字置換暗号です。ROT13は、古代ローマで開発されたシーザー暗号の特殊なケースです。英語のアルファベットは26文字であるため、ROT13はシーザー暗号の逆であり、つまりROT13を元に戻すには同じアルゴリズムが適用され、エンコードとデコードに同じ操作を使用することができます。",
+ "title": "ROT13とは何ですか?"
+ }
+ },
+ "rotate": {
+ "description": "テキスト内の文字を指定された位置だけ回転します。",
+ "inputTitle": "入力テキスト",
+ "processAsMultiLine": "複数行テキストとして処理する(各行を個別に回転する)",
+ "resultTitle": "回転したテキスト",
+ "rotateLeft": "左に回転",
+ "rotateRight": "右に回転",
+ "rotationOptions": "回転オプション",
+ "shortDescription": "テキスト内の文字を位置によってシフトします。",
+ "stepDescription": "ローテーションするポジションの数",
+ "title": "テキストを回転する",
+ "toolInfo": {
+ "description": "このツールを使用すると、文字列内の文字を指定した数だけ回転させることができます。左または右に回転したり、複数行のテキストを各行ごとに回転させて処理したりできます。文字列の回転は、単純なテキスト変換、パターンの作成、基本的な暗号化技術の実装に役立ちます。",
+ "title": "弦の回転"
+ }
+ },
+ "split": {
+ "charAfterChunkDescription": "各チャンクの後の文字",
+ "charBeforeChunkDescription": "各チャンクの前の文字",
+ "chunksDescription": "出力内の同じ長さのチャンクの数。",
+ "chunksTitle": "チャンクの数を使用する",
+ "description": "世界で最もシンプルなブラウザベースのテキスト分割ユーティリティです。テキストを入力し、区切り文字を指定するだけで複数の部分に分割できます。データ処理、テキスト操作、または大きなテキストブロックから特定のコンテンツを抽出するのに最適です。",
+ "lengthDescription": "各出力チャンクに配置されるシンボルの数。",
+ "lengthTitle": "長さを使って分割する",
+ "outputSeparatorDescription": "分割されたチャンクの間に挿入される文字。(デフォルトでは改行文字 \"\\n\" です。)",
+ "outputSeparatorOptions": "出力セパレーターオプション",
+ "regexDescription": "テキストを複数の部分に分割するために使用される正規表現。\n(デフォルトでは複数のスペース)",
+ "regexTitle": "正規表現を使用して分割する",
+ "resultTitle": "テキスト部分",
+ "shortDescription": "セパレータを使用してテキストを複数の部分に分割する",
+ "splitSeparatorOptions": "分割区切りオプション",
+ "symbolDescription": "テキストを分割するために使用される文字。\n(デフォルトはスペース)",
+ "symbolTitle": "分割にシンボルを使用する",
+ "title": "スプリット"
+ },
+ "statistic": {
+ "characterFrequencyAnalysis": "文字頻度分析",
+ "characterFrequencyAnalysisDescription": "各文字がテキストに何回出現するかを数える",
+ "delimitersOptions": "区切り文字オプション",
+ "description": "テキストを分析し、包括的な統計を生成します。",
+ "includeEmptyLines": "空行を含める",
+ "includeEmptyLinesDescription": "行数を数えるときに空白行を含める",
+ "inputTitle": "入力テキスト",
+ "resultTitle": "テキスト統計",
+ "sentenceDelimitersDescription": "あなたの言語で文を区切るために使用するカスタム文字(コンマで区切る)を入力するか、デフォルトの場合は空白のままにします。",
+ "sentenceDelimitersPlaceholder": "例: .、!、?、...",
+ "shortDescription": "テキストに関する統計情報を取得する",
+ "statisticsOptions": "統計オプション",
+ "title": "テキスト統計",
+ "toolInfo": {
+ "description": "このツールを使用すると、テキストを分析し、文字数、単語数、行数、文字と単語の頻度分析などの包括的な統計を生成できます。",
+ "title": "何ですか {{title}}?"
+ },
+ "wordDelimitersDescription": "単語数をカウントするためのカスタム正規表現を入力するか、デフォルトの場合は空白のままにします。",
+ "wordDelimitersPlaceholder": "例: \\s.,;:!?\"«»()…",
+ "wordFrequencyAnalysis": "単語頻度分析",
+ "wordFrequencyAnalysisDescription": "各単語がテキストに何回出現するかを数える"
+ },
+ "textReplacer": {
+ "description": "テキスト パターンを新しいコンテンツに置き換えます。",
+ "findPatternInText": "テキスト内のこのパターンを見つける",
+ "findPatternUsingRegexp": "正規表現を使ってパターンを見つける",
+ "inputTitle": "置換するテキスト",
+ "newTextPlaceholder": "新しいテキスト",
+ "regexpDescription": "置換する正規表現を入力します。",
+ "replacePatternDescription": "置換に使用するパターンを入力します。",
+ "replaceText": "テキストの置換",
+ "resultTitle": "置換テキスト",
+ "searchPatternDescription": "置換するテキスト パターンを入力します。",
+ "searchText": "検索テキスト",
+ "shortDescription": "コンテンツ内のテキストを素早く置き換える",
+ "title": "テキスト置換",
+ "toolInfo": {
+ "description": "このシンプルなブラウザベースのツールを使えば、コンテンツ内の特定のテキストを簡単に置き換えることができます。テキストを入力し、置き換えたいテキストと置換値を設定するだけで、すぐに更新されたバージョンを取得できます。",
+ "title": "テキスト置換"
+ }
+ },
+ "toMorse": {
+ "dashSymbolDescription": "モールス信号のダッシュに対応する記号。",
+ "description": "テキストをモールス信号に変換します。",
+ "dotSymbolDescription": "モールス信号のドットに対応する記号。",
+ "longSignal": "ロングシグナル",
+ "resultTitle": "モールス信号",
+ "shortDescription": "テキストをモールス信号に素早くエンコード",
+ "shortSignal": "ショートシグナル",
+ "title": "モールス信号への文字列"
+ },
+ "truncate": {
+ "addTruncationIndicator": "切り捨てインジケーターを追加",
+ "charactersPlaceholder": "キャラクター",
+ "description": "テキストを指定された長さに短縮します。",
+ "indicatorDescription": "テキストの末尾(または先頭)に追加する文字。注: 長さにカウントされます。",
+ "inputTitle": "入力テキスト",
+ "leftSideDescription": "テキストの先頭から文字を削除します。",
+ "leftSideTruncation": "左側切り捨て",
+ "lengthAndLines": "長さと線",
+ "lineByLineDescription": "各行を個別に切り捨てます。",
+ "lineByLineTruncating": "行ごとの切り捨て",
+ "maxLengthDescription": "テキストに残す文字数。",
+ "numberPlaceholder": "番号",
+ "resultTitle": "切り捨てられたテキスト",
+ "rightSideDescription": "テキストの末尾から文字を削除します。",
+ "rightSideTruncation": "右側切り捨て",
+ "shortDescription": "指定された長さにテキストを切り捨てる",
+ "suffixAndAffix": "接尾辞と接辞",
+ "title": "テキストを切り捨てる",
+ "toolInfo": {
+ "description": "左側の入力フォームにテキストを読み込むと、右側に切り捨てられたテキストが自動的に表示されます。",
+ "title": "テキストを切り捨てる"
+ },
+ "truncationSide": "切り捨て側"
+ },
+ "uppercase": {
+ "description": "テキストを大文字に変換します。",
+ "inputTitle": "入力テキスト",
+ "resultTitle": "大文字のテキスト",
+ "shortDescription": "テキストを大文字に変換する",
+ "title": "大文字に変換"
+ }
+}
diff --git a/public/locales/ja/time.json b/public/locales/ja/time.json
new file mode 100644
index 0000000..a9b6b2d
--- /dev/null
+++ b/public/locales/ja/time.json
@@ -0,0 +1,100 @@
+{
+ "checkLeapYears": {
+ "description": "その年がうるう年かどうかを確認し、うるう年情報を取得します。",
+ "inputTitle": "入力年",
+ "resultTitle": "閏年の結果",
+ "shortDescription": "その年がうるう年かどうかをチェックする",
+ "title": "うるう年を確認する",
+ "toolInfo": {
+ "description": "閏年とは、暦年を天文年と一致させるために、1日(2月29日)が追加される年です。閏年は4年に1度発生しますが、100で割り切れるが400で割り切れない年は例外です。",
+ "title": "うるう年とは何ですか?"
+ }
+ },
+ "convertDaysToHours": {
+ "addHoursName": "営業時間名を追加",
+ "addHoursNameDescription": "出力値に文字列「時間」を追加します",
+ "description": "カスタマイズ可能なオプションを使用して日数を時間数に変換します。",
+ "hoursName": "時間名",
+ "shortDescription": "日数を時間数に変換する",
+ "title": "日数を時間数に変換する",
+ "toolInfo": {
+ "description": "このツールを使うと、日数を時間数に変換できます。日数を数値または単位付きで入力すると、ツールが時間数に変換します。また、出力値の末尾に「時間」を付けることもできます。",
+ "title": "日数を時間数に変換する"
+ }
+ },
+ "convertHoursToDays": {
+ "addDaysName": "曜日名を追加",
+ "addDaysNameDescription": "出力値に文字列 days を追加します",
+ "daysName": "日付名",
+ "description": "カスタマイズ可能なオプションを使用して時間を日数に変換します。",
+ "shortDescription": "時間を日数に変換する",
+ "title": "時間を日数に変換する",
+ "toolInfo": {
+ "description": "このツールを使うと、時間を日数に変換できます。時間を数値または単位付きで入力すると、ツールが日数に変換します。また、出力値の末尾に「日数」を付けることもできます。",
+ "title": "時間を日数に変換する"
+ }
+ },
+ "convertSecondsToTime": {
+ "addPadding": "パディングを追加",
+ "addPaddingDescription": "時間、分、秒にゼロパディングを追加します。",
+ "description": "秒数を判読可能な時刻形式(時:分:秒)に変換します。秒数を入力すると、フォーマットされた時刻が表示されます。",
+ "shortDescription": "秒を時間形式に変換する",
+ "timePadding": "時間のパディング",
+ "title": "秒を時間に変換する",
+ "toolInfo": {
+ "title": "何ですか {{title}}?"
+ }
+ },
+ "convertTimeToSeconds": {
+ "description": "フォーマットされた時間 (HH:MM:SS) を秒に変換します。",
+ "inputTitle": "入力時間",
+ "resultTitle": "秒",
+ "shortDescription": "時間形式を秒に変換する",
+ "title": "時間を秒に変換する",
+ "toolInfo": {
+ "description": "このツールを使うと、フォーマットされた時刻文字列(HH:MM:SS)を秒数に変換できます。期間や時間間隔を計算するのに便利です。",
+ "title": "時間を秒に変換する"
+ }
+ },
+ "crontabGuru": {
+ "description": "cron式を生成し、理解します。自動化されたタスクやシステムジョブのcronスケジュールを作成します。",
+ "shortDescription": "cron式を生成して理解する",
+ "title": "クロンタブの達人"
+ },
+ "timeBetweenDates": {
+ "description": "2つの日付間の時差を計算します。正確な日数、時間、分、秒を取得します。",
+ "endDate": "終了日",
+ "endDateTime": "終了日時",
+ "endTime": "終了時間",
+ "endTimezone": "終了タイムゾーン",
+ "shortDescription": "2つの日付間の時間を計算する",
+ "startDate": "開始日",
+ "startDateTime": "開始日時",
+ "startTime": "開始時間",
+ "startTimezone": "開始タイムゾーン",
+ "title": "日付間の時間",
+ "toolInfo": {
+ "description": "2つの日付と時刻の正確な時差を計算します。複数のタイムゾーンに対応しています。このツールは、時差を様々な単位(年、月、日、時、分、秒)で詳細に表示します。",
+ "title": "日付間の時間計算機"
+ }
+ },
+ "truncateClockTime": {
+ "description": "秒数または分数を切り捨てて時計の時刻を表示します。時間を最も近い時間、分、またはカスタム間隔に丸めます。",
+ "printDroppedComponents": "ドロップされたコンポーネントを印刷する",
+ "shortDescription": "指定された精度でクロック時間を切り捨てる",
+ "timePadding": "時間のパディング",
+ "title": "時計時間を切り捨てる",
+ "toolInfo": {
+ "title": "何ですか {{title}}?"
+ },
+ "truncateMinutesAndSeconds": "分と秒を切り捨てる",
+ "truncateMinutesAndSecondsDescription": "各クロック時間から分と秒の両方の要素を削除します。",
+ "truncateOnlySeconds": "秒のみ切り捨て",
+ "truncateOnlySecondsDescription": "各クロック時間から秒の要素を削除します。",
+ "truncationSide": "切り捨て側",
+ "useZeroPadding": "ゼロパディングを使用する",
+ "zeroPaddingDescription": "すべての時間コンポーネントを常に 2 桁の幅にします。",
+ "zeroPrintDescription": "ドロップされた部分をゼロ値「00」として表示します。",
+ "zeroPrintTruncatedParts": "ゼロ印刷切り捨て部分"
+ }
+}
diff --git a/public/locales/ja/translation.json b/public/locales/ja/translation.json
new file mode 100644
index 0000000..97c87b0
--- /dev/null
+++ b/public/locales/ja/translation.json
@@ -0,0 +1,250 @@
+{
+ "audio": {
+ "changeSpeed": {
+ "description": "オーディオファイルの再生速度を変更します。ピッチを維持しながら、オーディオの再生速度を上げたり下げたりできます。",
+ "name": "オーディオ速度を変更する",
+ "shortDescription": "オーディオファイルの速度を変更する"
+ },
+ "extractAudio": {
+ "description": "ビデオ ファイルからオーディオ トラックを抽出し、選択した形式 (AAC、MP3、WAV) で個別のオーディオ ファイルとして保存します。",
+ "name": "音声を抽出する",
+ "shortDescription": "ビデオ ファイル (MP4、MOV など) からオーディオを AAC、MP3、または WAV に抽出します。"
+ }
+ },
+ "baseFileInput": {
+ "copyFailed": "コピーに失敗しました: {{error}}",
+ "dropFileHere": "ドロップ {{type}} ここ",
+ "fileCopied": "ファイルをコピーしました",
+ "selectFileDescription": "選択するにはここをクリックしてください {{type}} デバイスからCtrl+Vを押して {{type}} クリップボードから、またはデスクトップからファイルをドラッグアンドドロップします"
+ },
+ "categories": {
+ "audio": {
+ "description": "オーディオを操作するためのツール – ビデオからオーディオを抽出したり、オーディオ速度を調整したり、複数のオーディオ ファイルを結合したり、その他さまざまな機能を備えています。",
+ "title": "オーディオツール"
+ },
+ "csv": {
+ "description": "CSV ファイルの操作用ツール - CSV をさまざまな形式に変換し、CSV データを操作し、CSV 構造を検証し、CSV ファイルを効率的に処理します。",
+ "title": "CSVツール"
+ },
+ "gif": {
+ "description": "GIF アニメーションを操作するためのツール – 透明な GIF の作成、GIF フレームの抽出、GIF へのテキストの追加、GIF の切り取り、回転、反転など。",
+ "title": "GIFツール"
+ },
+ "image-generic": {
+ "description": "画像を操作するツール – 圧縮、サイズ変更、切り取り、JPG への変換、回転、背景の削除など。",
+ "title": "画像ツール"
+ },
+ "json": {
+ "description": "JSON データ構造を操作するためのツール – JSON オブジェクトの整形と縮小、JSON 配列のフラット化、JSON 値の文字列化、データの分析など",
+ "title": "JSONツール"
+ },
+ "list": {
+ "description": "リストを操作するためのツール – リストの並べ替え、反転、ランダム化、一意のリスト項目と重複するリスト項目の検索、リスト項目の区切りの変更など。",
+ "title": "リストツール"
+ },
+ "number": {
+ "description": "数字を操作するためのツール – 数列を生成したり、数字を単語に変換したり、単語を数字に変換したり、数字を並べ替えたり、四捨五入したり、因数分解したり、その他さまざまな機能があります。",
+ "title": "数値ツール"
+ },
+ "pdf": {
+ "description": "PDF ファイルの操作ツール - PDF からテキストを抽出したり、PDF を他の形式に変換したり、PDF を操作したり、その他さまざまな機能を備えています。",
+ "title": "PDFツール"
+ },
+ "png": {
+ "description": "PNG 画像を操作するツール – PNG を JPG に変換したり、透明な PNG を作成したり、PNG の色を変更したり、PNG を切り取ったり、回転したり、サイズ変更したり、その他多くの機能があります。",
+ "title": "PNGツール"
+ },
+ "seeAll": "すべてを見る {{title}}",
+ "string": {
+ "description": "テキストを操作するためのツール – テキストを画像に変換したり、テキストを検索して置換したり、テキストを断片に分割したり、テキスト行を結合したり、テキストを繰り返したり、その他さまざまな機能があります。",
+ "title": "テキストツール"
+ },
+ "time": {
+ "description": "時間と日付を操作するためのツール – 時差の計算、タイムゾーンの変換、日付の書式設定、日付シーケンスの生成など。",
+ "title": "時間ツール"
+ },
+ "try": "試す {{title}}",
+ "video": {
+ "description": "ビデオを操作するためのツール – ビデオからフレームを抽出したり、ビデオから GIF を作成したり、ビデオをさまざまな形式に変換したり、その他さまざまな機能を備えています。",
+ "title": "ビデオツール"
+ },
+ "xml": {
+ "description": "XML データ構造を操作するためのツール - ビューア、ビューティファイア、バリデータなど",
+ "title": "XMLツール"
+ }
+ },
+ "csv": {
+ "findIncompleteCsvRecords": {
+ "description": "以下のフォームにCSVファイルをアップロードするだけで、このツールは行または列に欠損値がないかどうかを自動的にチェックします。ツールのオプションでは、入力ファイルの形式(区切り文字、引用符、コメント文字の指定)を調整できます。さらに、空値のチェックを有効にしたり、空行をスキップしたり、出力時のエラーメッセージの数に制限を設定したりすることもできます。",
+ "name": "不完全なCSVレコードを見つける",
+ "shortDescription": "CSV 内で値が欠落している行と列をすばやく見つけます。"
+ }
+ },
+ "hero": {
+ "brand": "オムニツール",
+ "description": "作業を素早く完了するための究極のツールキット、OmniTools で生産性を飛躍的に向上させましょう。画像、テキスト、リスト、データを編集するための数千もの使いやすいユーティリティに、ブラウザから直接アクセスできます。",
+ "examples": {
+ "calculateNumberSum": "数値の合計を計算する",
+ "changeGifSpeed": "GIFの速度を変更する",
+ "compressPng": "PNGを圧縮",
+ "createTransparentImage": "透明な画像を作成する",
+ "prettifyJson": "JSONを美しくする",
+ "sortList": "リストを並べ替える",
+ "splitPdf": "PDFを分割",
+ "splitText": "テキストを分割する",
+ "trimVideo": "ビデオをトリミングする"
+ },
+ "searchPlaceholder": "すべてのツールを検索",
+ "title": "物事を素早く終わらせる"
+ },
+ "inputFooter": {
+ "clear": "クリア",
+ "copyToClipboard": "クリップボードにコピー",
+ "importFromFile": "ファイルからインポート"
+ },
+ "list": {
+ "group": {
+ "description": "リスト項目をグループ化するための、世界で最もシンプルなブラウザベースのユーティリティです。リストを入力し、グループ化の条件を指定するだけで、項目を論理的なグループに整理できます。データの分類、情報の整理、構造化されたリストの作成に最適です。カスタムセパレーターと様々なグループ化オプションをサポートしています。",
+ "name": "グループ",
+ "shortDescription": "共通のプロパティでリスト項目をグループ化する"
+ },
+ "reverse": {
+ "description": "これは、すべてのリスト項目を逆順に表示する、非常にシンプルなブラウザベースのアプリケーションです。入力項目は任意の記号で区切ることができ、逆順に表示するリスト項目の区切り文字を変更することもできます。",
+ "name": "逆行する",
+ "shortDescription": "リストを素早く逆順にする"
+ },
+ "sort": {
+ "description": "これは、リスト内の項目を昇順または降順に並べ替える、非常にシンプルなブラウザベースのアプリケーションです。項目はアルファベット順、数字順、または長さで並べ替えることができます。また、重複項目や空項目を削除したり、空白で囲まれた項目を個別に切り取ったりすることも可能です。入力リスト項目は、任意の区切り文字、または正規表現を使用して区切ることができます。さらに、ソートされた出力リスト用に新しい区切り文字を作成することもできます。",
+ "name": "選別",
+ "shortDescription": "リストを素早く並べ替える"
+ }
+ },
+ "navbar": {
+ "buyMeACoffee": "コーヒーを買ってください",
+ "home": "家",
+ "tools": "ツール"
+ },
+ "number": {
+ "generate": {
+ "description": "ブラウザで整数のリストを素早く計算します。リストを取得するには、最初の整数を指定し、以下のオプションで値と合計数を変更するだけで、このユーティリティがその数の整数を生成します。",
+ "name": "数字を生成する",
+ "shortDescription": "ブラウザで整数のリストを素早く計算する"
+ },
+ "sum": {
+ "description": "これは、数値を合計する非常にシンプルなブラウザベースのアプリケーションです。入力した数値は任意の記号で区切ることができ、合計した数値の区切り文字を変更することもできます。",
+ "name": "数字を合計する",
+ "shortDescription": "数値リストを素早く合計する"
+ }
+ },
+ "numericInputWithUnit": {
+ "unit": "ユニット"
+ },
+ "pdf": {
+ "compressPdf": {
+ "description": "Ghostscriptを使用して品質を維持しながらPDFファイルのサイズを縮小する",
+ "name": "PDFを圧縮",
+ "shortDescription": "ブラウザでPDFファイルを安全に圧縮"
+ },
+ "mergePdf": {
+ "description": "複数の PDF ファイルを 1 つのドキュメントに結合します。",
+ "name": "PDFを結合",
+ "shortDescription": "複数のPDFファイルを1つの文書に結合する"
+ },
+ "pdfToEpub": {
+ "description": "電子書籍リーダーとの互換性を高めるために、PDF ドキュメントを EPUB ファイルに変換します。",
+ "name": "PDFからEPUBへ",
+ "shortDescription": "PDFファイルをEPUB形式に変換する"
+ },
+ "protectPdf": {
+ "description": "ブラウザで安全にPDFファイルにパスワード保護を追加します",
+ "name": "PDFを保護する",
+ "shortDescription": "PDFファイルをパスワードで安全に保護する"
+ },
+ "splitPdf": {
+ "description": "ページ番号または範囲(例:1,5-8)を使用して、PDF ファイルから特定のページを抽出します。",
+ "name": "PDFを分割",
+ "shortDescription": "PDFファイルから特定のページを抽出する"
+ }
+ },
+ "resultFooter": {
+ "copy": "クリップボードにコピー",
+ "download": "ダウンロード"
+ },
+ "string": {
+ "createPalindrome": {
+ "description": "あらゆるテキストから回文を作成できる、世界で最もシンプルなブラウザベースのユーティリティです。テキストを入力すると、前後どちらから読んでも同じ回文に瞬時に変換されます。言葉遊び、対称的なテキストパターンの作成、言語的好奇心の探求などに最適です。",
+ "name": "回文を作成する",
+ "shortDescription": "前後どちらから読んでも同じテキストを作成する"
+ },
+ "palindrome": {
+ "description": "テキストが回文であるかどうかをチェックする、世界で最もシンプルなブラウザベースのユーティリティです。テキストが前後どちらから読んでも同じかどうかを瞬時に検証します。単語パズル、言語分析、対称的なテキストパターンの検証に最適です。様々な区切り文字と複数単語の回文検出に対応しています。",
+ "name": "回文",
+ "shortDescription": "テキストが前後で同じ読み方をしているか確認する"
+ },
+ "repeat": {
+ "description": "このツールを使用すると、オプションの区切り文字を使用して、特定のテキストを複数回繰り返すことができます。",
+ "name": "テキストの繰り返し",
+ "shortDescription": "テキストを複数回繰り返す"
+ },
+ "reverse": {
+ "description": "世界で最もシンプルなブラウザベースのテキスト反転ユーティリティ。任意のテキストを入力すると、文字ごとに瞬時に反転します。鏡文字の作成、回文の解析、テキストパターンの操作に最適です。反転時にスペースと特殊文字は保持されます。",
+ "name": "逆行する",
+ "shortDescription": "テキストを文字ごとに反転します"
+ },
+ "toMorse": {
+ "description": "テキストをモールス信号に変換する、世界で最もシンプルなブラウザベースのユーティリティです。左側の入力フォームにテキストを入力すると、出力エリアにモールス信号が瞬時に表示されます。高機能、無料、そして高速。テキストを読み込んでモールス信号を取得。",
+ "name": "モールス信号への文字列",
+ "shortDescription": "テキストをモールス信号に素早くエンコード"
+ },
+ "uppercase": {
+ "description": "世界で最もシンプルなブラウザベースのテキスト大文字変換ユーティリティ。テキストを入力するだけで、自動的にすべて大文字に変換されます。見出しの作成、テキストの強調、テキスト形式の標準化に最適です。様々なテキスト形式をサポートし、特殊文字も保持します。",
+ "name": "大文字",
+ "shortDescription": "テキストを大文字に変換する"
+ }
+ },
+ "toolExamples": {
+ "subtitle": "クリックしてお試しください!",
+ "title": "{{title}} 例"
+ },
+ "toolFileResult": {
+ "copied": "ファイルをコピーしました",
+ "copyFailed": "コピーに失敗しました: {{error}}",
+ "loading": "読み込み中... 少々時間がかかる場合があります。",
+ "result": "結果"
+ },
+ "toolHeader": {
+ "seeExamples": "例を見る"
+ },
+ "toolLayout": {
+ "allToolsTitle": "全て {{type}}"
+ },
+ "toolMultiFileResult": {
+ "copied": "ファイルをコピーしました",
+ "copyFailed": "コピーに失敗しました: {{error}}",
+ "loading": "読み込み中... 少々時間がかかる場合があります。",
+ "result": "結果"
+ },
+ "toolMultipleAudioInput": {
+ "inputTitle": "入力 {{type}}",
+ "noFilesSelected": "ファイルが選択されていません"
+ },
+ "toolMultiplePdfInput": {
+ "inputTitle": "入力 {{type}}",
+ "noFilesSelected": "ファイルが選択されていません"
+ },
+ "toolOptions": {
+ "title": "ツールオプション"
+ },
+ "toolTextInput": {
+ "copied": "テキストをコピーしました",
+ "copyFailed": "コピーに失敗しました: {{error}}",
+ "input": "入力テキスト",
+ "placeholder": "ここにテキストを入力してください..."
+ },
+ "toolTextResult": {
+ "copied": "テキストをコピーしました",
+ "copyFailed": "コピーに失敗しました: {{error}}",
+ "loading": "読み込み中... 少々時間がかかる場合があります。",
+ "result": "結果"
+ }
+}
diff --git a/public/locales/ja/video.json b/public/locales/ja/video.json
new file mode 100644
index 0000000..4cb451b
--- /dev/null
+++ b/public/locales/ja/video.json
@@ -0,0 +1,113 @@
+{
+ "changeSpeed": {
+ "defaultMultiplier": "デフォルトの乗数: 2は2倍速を意味します",
+ "description": "動画ファイルの再生速度を変更できます。音声の同期を維持しながら、動画の再生速度を上げたり下げたりできます。様々な速度調整機能と一般的な動画形式に対応しています。",
+ "inputTitle": "入力ビデオ",
+ "newVideoSpeed": "新しいビデオ速度",
+ "resultTitle": "編集されたビデオ",
+ "settingSpeed": "速度設定",
+ "shortDescription": "ビデオの再生速度を変更する",
+ "title": "ビデオ速度の変更",
+ "toolInfo": {
+ "title": "何ですか {{title}}?"
+ }
+ },
+ "compress": {
+ "default": "デフォルト",
+ "description": "動画を240p、480p、720pなどの様々な解像度にスケーリングして圧縮します。このツールは、許容できる品質を維持しながらファイルサイズを縮小するのに役立ちます。MP4、WebM、OGGなどの一般的な動画形式をサポートしています。",
+ "inputTitle": "入力ビデオ",
+ "loadingText": "ビデオを圧縮しています...",
+ "lossless": "ロスレス",
+ "quality": "品質(CRF)",
+ "resolution": "解決",
+ "resultTitle": "圧縮ビデオ",
+ "shortDescription": "さまざまな解像度に合わせてビデオを圧縮する",
+ "title": "ビデオを圧縮する",
+ "worst": "最悪"
+ },
+ "cropVideo": {
+ "cropCoordinates": "作物の座標",
+ "croppingVideo": "ビデオの切り取り",
+ "description": "ビデオをトリミングして不要な部分を削除します。",
+ "errorBeyondHeight": "切り取り領域がビデオの高さを超えて拡張されます({{height}}ピクセル)",
+ "errorBeyondWidth": "切り取り領域がビデオの幅を超えています({{width}}ピクセル)",
+ "errorCroppingVideo": "ビデオのトリミング中にエラーが発生しました。パラメータとビデオファイルを確認してください。",
+ "errorLoadingDimensions": "ビデオのサイズを読み込めませんでした",
+ "errorNonNegativeCoordinates": "X座標とY座標は負でない必要があります",
+ "errorPositiveDimensions": "幅と高さは正の数でなければなりません",
+ "height": "身長",
+ "inputTitle": "入力ビデオ",
+ "loadVideoForDimensions": "ビデオをロードして寸法を確認してください",
+ "resultTitle": "切り抜かれたビデオ",
+ "shortDescription": "不要な部分を削除するためにビデオをトリミングする",
+ "title": "ビデオをトリミング",
+ "toolInfo": {
+ "description": "このツールを使うと、動画ファイルをトリミングして不要な部分を削除できます。X、Y座標と幅、高さの寸法を設定することで、トリミング領域を指定できます。",
+ "title": "ビデオをトリミング"
+ },
+ "videoDimensions": "ビデオのサイズ: {{width}} × {{height}} ピクセル",
+ "videoInformation": "ビデオ情報",
+ "width": "幅",
+ "xCoordinate": "X(左)",
+ "yCoordinate": "Y(上)"
+ },
+ "flip": {
+ "description": "ビデオファイルを水平または垂直に反転します。特殊効果や向きの問題を修正するためにビデオをミラーリングします。",
+ "flippingVideo": "反転ビデオ",
+ "horizontalLabel": "水平(ミラー)",
+ "inputTitle": "入力ビデオ",
+ "orientation": "オリエンテーション",
+ "resultTitle": "反転ビデオ",
+ "shortDescription": "ビデオを水平または垂直に反転する",
+ "title": "フリップビデオ",
+ "verticalLabel": "垂直(逆さま)"
+ },
+ "gif": {
+ "changeSpeed": {
+ "description": "GIFアニメーションの再生速度を変更します。スムーズなアニメーションを維持しながら、GIFの再生速度を上げたり下げたりできます。",
+ "shortDescription": "GIFアニメーションの速度を変更する",
+ "title": "GIFの速度を変更する"
+ }
+ },
+ "loop": {
+ "description": "元のビデオを複数回繰り返してループビデオを作成します。",
+ "inputTitle": "入力ビデオ",
+ "loopingVideo": "ループビデオ",
+ "loops": "ループ",
+ "numberOfLoops": "ループ数",
+ "resultTitle": "ループ動画",
+ "shortDescription": "ループ動画ファイルを作成する",
+ "title": "ループビデオ",
+ "toolInfo": {
+ "description": "このツールを使えば、元の動画を複数回繰り返し再生することで、ループ動画を作成できます。動画をループさせる回数も指定できます。",
+ "title": "何ですか {{title}}?"
+ }
+ },
+ "rotate": {
+ "180Degrees": "180°(上下逆さま)",
+ "270Degrees": "270°(反時計回り90°)",
+ "90Degrees": "90°時計回り",
+ "description": "ビデオファイルを90度、180度、または270度回転できます。正確な回転制御により、ビデオの向きを修正したり、特殊効果を作成したりできます。",
+ "inputTitle": "入力ビデオ",
+ "resultTitle": "回転したビデオ",
+ "rotatingVideo": "回転するビデオ",
+ "rotation": "回転",
+ "shortDescription": "指定した角度でビデオを回転する",
+ "title": "ビデオを回転する"
+ },
+ "trim": {
+ "description": "開始時間と終了時間を指定してビデオファイルをトリミングします。ビデオの先頭または末尾の不要な部分を削除します。",
+ "endTime": "終了時間",
+ "inputTitle": "入力ビデオ",
+ "resultTitle": "トリミングされたビデオ",
+ "shortDescription": "不要な部分を削除してビデオをトリミングする",
+ "startTime": "開始時間",
+ "timestamps": "タイムスタンプ",
+ "title": "ビデオをトリムする"
+ },
+ "videoToGif": {
+ "description": "ビデオファイルをアニメーションGIF形式に変換します。特定の時間範囲を抽出し、共有可能なアニメーション画像を作成します。",
+ "shortDescription": "ビデオをアニメーションGIFに変換する",
+ "title": "ビデオをGIFに変換"
+ }
+}
diff --git a/public/locales/ja/xml.json b/public/locales/ja/xml.json
new file mode 100644
index 0000000..42dd3c2
--- /dev/null
+++ b/public/locales/ja/xml.json
@@ -0,0 +1,38 @@
+{
+ "xmlBeautifier": {
+ "description": "適切なインデントとスペースを使用して XML をフォーマットします。",
+ "indentation": "インデント",
+ "inputTitle": "入力XML",
+ "resultTitle": "美化されたXML",
+ "shortDescription": "XML コードをフォーマットして美しくする",
+ "title": "XML 美化ツール",
+ "toolInfo": {
+ "description": "このツールを使用すると、適切なインデントと間隔で XML データをフォーマットできるため、読みやすく、操作しやすくなります。",
+ "title": "XML 美化ツール"
+ },
+ "useSpaces": "スペースを使用する",
+ "useSpacesDescription": "スペースで出力をインデントする",
+ "useTabs": "タブを使用する",
+ "useTabsDescription": "出力をタブでインデントします。"
+ },
+ "xmlValidator": {
+ "description": "XML 構文と構造を検証します。",
+ "placeholder": "ここに XML を貼り付けるかインポートします...",
+ "shortDescription": "XMLコードのエラーを検証する",
+ "title": "XMLバリデータ",
+ "toolInfo": {
+ "description": "このツールを使うと、XMLの構文と構造を検証できます。XMLが整形式であるかどうかを確認し、問題が見つかった場合は詳細なエラーメッセージを表示します。",
+ "title": "XMLバリデータ"
+ }
+ },
+ "xmlViewer": {
+ "description": "XML 構造をツリー形式で表示および探索します。",
+ "inputTitle": "入力XML",
+ "resultTitle": "XMLツリービュー",
+ "title": "XMLビューア",
+ "toolInfo": {
+ "description": "このツールを使用すると、XML データを階層ツリー形式で表示できるため、XML ドキュメントの構造を簡単に調査して理解できるようになります。",
+ "title": "XMLビューア"
+ }
+ }
+}
diff --git a/public/locales/nl/audio.json b/public/locales/nl/audio.json
new file mode 100644
index 0000000..3967aec
--- /dev/null
+++ b/public/locales/nl/audio.json
@@ -0,0 +1,42 @@
+{
+ "changeSpeed": {
+ "description": "Wijzig de afspeelsnelheid van audiobestanden. Versnel of vertraag audio met behoud van toonhoogte.",
+ "inputTitle": "Invoer audio",
+ "newAudioSpeed": "Nieuwe audiosnelheid",
+ "outputFormat": "Uitvoerformaat",
+ "resultTitle": "Bewerkte audio",
+ "settingSpeed": "Snelheid instellen",
+ "shortDescription": "De snelheid van audiobestanden wijzigen",
+ "speedDescription": "Standaardvermenigvuldiger: 2 betekent 2x sneller",
+ "title": "Wijzig audiosnelheid",
+ "toolInfo": {
+ "title": "Wat is {{title}}?"
+ }
+ },
+ "extractAudio": {
+ "description": "Haal een audiotrack uit videobestanden.",
+ "extractingAudio": "Audio extraheren",
+ "inputTitle": "Invoervideo",
+ "outputFormat": "Uitvoerformaat",
+ "outputFormatDescription": "Selecteer het formaat waarin u de audio wilt extraheren.",
+ "resultTitle": "Geëxtraheerde audio",
+ "shortDescription": "Extraheer audio uit videobestanden (MP4, MOV, enz.) naar AAC, MP3 of WAV.",
+ "title": "Audio uit video extraheren",
+ "toolInfo": {
+ "description": "Met deze tool kun je de audiotrack uit videobestanden halen. Je kunt kiezen uit verschillende audioformaten, waaronder AAC, MP3 en WAV.",
+ "title": "Wat is {{title}}?"
+ }
+ },
+ "mergeAudio": {
+ "description": "Combineer meerdere audiobestanden tot één audiobestand door ze in volgorde te plaatsen.",
+ "longDescription": "Met deze tool kun je meerdere audiobestanden samenvoegen tot één bestand door ze te combineren in de volgorde waarin je ze uploadt. Perfect voor het combineren van podcastfragmenten, muzieknummers of andere audiobestanden die moeten worden samengevoegd. Ondersteunt diverse audioformaten, waaronder MP3, AAC en WAV.",
+ "shortDescription": "Voeg meerdere audiobestanden samen tot één bestand (MP3, AAC, WAV).",
+ "title": "Audio samenvoegen"
+ },
+ "trim": {
+ "description": "Knip en trim audiobestanden om specifieke segmenten te extraheren door start- en eindtijden op te geven.",
+ "longDescription": "Met deze tool kun je audiobestanden inkorten door de begin- en eindtijd op te geven. Je kunt specifieke segmenten uit langere audiobestanden halen, ongewenste delen verwijderen of kortere clips maken. Ondersteunt diverse audioformaten, waaronder MP3, AAC en WAV. Perfect voor podcastbewerking, muziekproductie of andere audiobewerkingsbehoeften.",
+ "shortDescription": "Trim audiobestanden om specifieke tijdssegmenten te extraheren (MP3, AAC, WAV).",
+ "title": "Audio bijsnijden"
+ }
+}
diff --git a/public/locales/nl/csv.json b/public/locales/nl/csv.json
new file mode 100644
index 0000000..9a43017
--- /dev/null
+++ b/public/locales/nl/csv.json
@@ -0,0 +1,114 @@
+{
+ "changeCsvSeparator": {
+ "description": "Wijzig het scheidingsteken in CSV-bestanden. Converteer tussen verschillende CSV-formaten, zoals komma's, puntkomma's, tabs of aangepaste scheidingstekens.",
+ "shortDescription": "Wijzig het scheidingsteken van CSV-bestanden",
+ "title": "CSV-scheidingsteken wijzigen"
+ },
+ "csvRowsToColumns": {
+ "description": "Deze tool converteert rijen van een CSV-bestand (Comma Separated Values) naar kolommen. De horizontale regels worden één voor één uit het invoerbestand (CSV) gehaald, 90 graden gedraaid en als verticale kolommen, gescheiden door komma's, na elkaar weergegeven.', longDescription: 'Deze tool converteert rijen van een CSV-bestand (Comma Separated Values) naar kolommen. Als de invoergegevens bijvoorbeeld 6 rijen bevatten, bevat de uitvoer 6 kolommen en worden de elementen van de rijen van boven naar beneden gerangschikt. In een correct opgemaakte CSV is het aantal waarden in elke rij hetzelfde. Wanneer er echter velden in rijen ontbreken, kan het programma deze herstellen en kunt u kiezen uit de beschikbare opties: ontbrekende gegevens vullen met lege elementen of ontbrekende gegevens vervangen door aangepaste elementen, zoals \"ontbrekend\", \"?\" of \"x\". Tijdens het conversieproces verwijdert de tool ook onnodige informatie uit het CSV-bestand, zoals lege regels (dit zijn regels zonder zichtbare informatie) en opmerkingen. Om de tool te helpen opmerkingen correct te identificeren, kunt u in de opties het symbool opgeven aan het begin van een regel waarmee een opmerking begint. Dit symbool is meestal een hekje \"#\" of een dubbele slash \"//\". Csv-abulous!",
+ "longDescription": "Deze tool converteert rijen van een CSV-bestand (Comma Separated Values) naar kolommen. Als de invoergegevens in CSV-formaat bijvoorbeeld 6 rijen bevatten, heeft de uitvoer 6 kolommen en worden de elementen van de rijen van boven naar beneden gerangschikt. In een correct opgemaakte CSV is het aantal waarden in elke rij hetzelfde. Wanneer er echter velden in rijen ontbreken, kan het programma deze herstellen en kunt u kiezen uit de beschikbare opties: ontbrekende gegevens vullen met lege elementen of ontbrekende gegevens vervangen door aangepaste elementen, zoals",
+ "shortDescription": "Converteer CSV-rijen naar kolommen.",
+ "title": "CSV-rijen naar kolommen converteren"
+ },
+ "csvToJson": {
+ "columnSeparator": "Kolomscheidingsteken (bijv. , ; \\t)",
+ "commentSymbol": "Commentaarsymbool (bijv. #)",
+ "conversionOptions": "Conversie-opties",
+ "description": "Converteer CSV-bestanden naar JSON-formaat met aanpasbare opties voor scheidingstekens, aanhalingstekens en uitvoeropmaak. Ondersteuning voor kopteksten, opmerkingen en dynamische typeconversie.",
+ "dynamicTypes": "Dynamische typen",
+ "dynamicTypesDescription": "Automatisch getallen en Booleaanse waarden converteren",
+ "errorParsing": "Fout bij het parseren van CSV: {{error}}",
+ "fieldQuote": "Veldcitaat (bijv. \")",
+ "inputCsvFormat": "CSV-invoerformaat",
+ "inputTitle": "CSV-invoer",
+ "resultTitle": "Uitvoer JSON",
+ "shortDescription": "Converteer CSV-gegevens naar JSON-formaat.",
+ "skipEmptyLines": "Lege regels overslaan",
+ "skipEmptyLinesDescription": "Negeer lege regels in de invoer-CSV",
+ "title": "CSV naar JSON converteren",
+ "useHeaders": "Gebruik headers",
+ "useHeadersDescription": "Behandel de eerste rij als kolomkoppen"
+ },
+ "csvToTsv": {
+ "description": "Upload uw CSV-bestand via onderstaand formulier en het wordt automatisch omgezet naar een TSV-bestand. In de toolopties kunt u het CSV-invoerformaat aanpassen: geef het veldscheidingsteken, het aanhalingsteken en het commentaarsymbool op, sla lege CSV-regels over en kies of u CSV-kolomkoppen wilt behouden.",
+ "longDescription": "Deze tool zet Comma Separated Values (CSV)-gegevens om in Tab Separated Values (TSV). Zowel CSV als TSV zijn populaire bestandsformaten voor het opslaan van tabelgegevens, maar ze gebruiken verschillende scheidingstekens om waarden te scheiden. CSV gebruikt komma's (",
+ "shortDescription": "Converteer CSV-gegevens naar TSV-formaat.",
+ "title": "CSV naar TSV converteren"
+ },
+ "csvToXml": {
+ "description": "Converteer CSV-bestanden naar XML-formaat met aanpasbare opties.",
+ "shortDescription": "Converteer CSV-gegevens naar XML-formaat.",
+ "title": "CSV naar XML converteren"
+ },
+ "csvToYaml": {
+ "description": "Upload uw CSV-bestand via onderstaand formulier en het wordt automatisch omgezet naar een YAML-bestand. In de toolopties kunt u het scheidingsteken voor velden, het aanhalingsteken voor velden en het commentaarteken opgeven om de tool aan te passen aan aangepaste CSV-indelingen. Daarnaast kunt u de uitvoer-YAML-indeling selecteren: een indeling die CSV-headers behoudt of een indeling die CSV-headers uitsluit.",
+ "longDescription": "Deze tool transformeert CSV-gegevens (Comma Separated Values) naar YAML-gegevens (Yet Another Markup Language). CSV is een eenvoudig tabelformaat dat wordt gebruikt om matrixachtige gegevenstypen weer te geven die bestaan uit rijen en kolommen. YAML daarentegen is een geavanceerder formaat (eigenlijk een superset van JSON), dat beter leesbare gegevens voor serialisatie genereert en lijsten, woordenboeken en geneste objecten ondersteunt. Dit programma ondersteunt verschillende CSV-invoerformaten: de invoergegevens kunnen door komma's (standaard), door puntkomma's, door slierten of een ander scheidingsteken worden gescheiden. U kunt het exacte scheidingsteken dat uw gegevens gebruiken in de opties opgeven. Op dezelfde manier kunt u in de opties het aanhalingsteken opgeven dat wordt gebruikt om CSV-velden in te sluiten (standaard een dubbel aanhalingsteken). U kunt ook regels overslaan die beginnen met opmerkingen door de opmerkingsymbolen in de opties op te geven. Zo houdt u uw gegevens overzichtelijk door onnodige regels over te slaan. Er zijn twee manieren om CSV naar YAML te converteren. De eerste methode converteert elke CSV-rij naar een YAML-lijst. De tweede methode extraheert headers uit de eerste CSV-rij en creëert YAML-objecten met sleutels op basis van deze headers. U kunt de YAML-uitvoer ook aanpassen door het aantal spaties voor inspringing van YAML-structuren op te geven. Als u de omgekeerde conversie wilt uitvoeren, dat wil zeggen YAML naar CSV wilt converteren, kunt u onze tool YAML naar CSV converteren gebruiken. Csv-abulous!",
+ "shortDescription": "Converteer snel een CSV-bestand naar een YAML-bestand.",
+ "title": "CSV naar YAML converteren"
+ },
+ "findIncompleteCsvRecords": {
+ "checkingOptions": "Opties controleren",
+ "commentCharacterDescription": "Voer het teken in dat het begin van een commentaarregel aangeeft. Regels die met dit symbool beginnen, worden overgeslagen.",
+ "csvInputOptions": "CSV-invoeropties",
+ "csvSeparatorDescription": "Voer het teken in dat gebruikt wordt om kolommen in het CSV-invoerbestand te scheiden.",
+ "deleteLinesWithNoData": "Regels zonder gegevens verwijderen",
+ "deleteLinesWithNoDataDescription": "Verwijder lege regels uit het CSV-invoerbestand.",
+ "description": "Upload uw CSV-bestand via onderstaand formulier en deze tool controleert automatisch of er geen waarden in de rijen of kolommen ontbreken. In de toolopties kunt u de opmaak van het invoerbestand aanpassen (het scheidingsteken, de aanhalingstekens en het commentaarteken opgeven). Daarnaast kunt u de controle op lege waarden inschakelen, lege regels overslaan en een limiet instellen voor het aantal foutmeldingen in de uitvoer.",
+ "findEmptyValues": "Lege waarden zoeken",
+ "findEmptyValuesDescription": "Geef een bericht weer over lege CSV-velden (dit zijn geen ontbrekende velden, maar velden die niets bevatten).",
+ "inputTitle": "CSV-invoer",
+ "limitNumberOfMessages": "Beperk het aantal berichten",
+ "messageLimitDescription": "Stel de limiet in voor het aantal berichten in de uitvoer.",
+ "quoteCharacterDescription": "Voer het aanhalingsteken in dat u wilt gebruiken om de CSV-invoervelden te citeren.",
+ "resultTitle": "CSV-status",
+ "shortDescription": "Vind snel rijen en kolommen in CSV waar waarden ontbreken.",
+ "title": "Onvolledige CSV-records vinden",
+ "toolInfo": {
+ "title": "Wat is een {{title}}?"
+ }
+ },
+ "insertCsvColumns": {
+ "appendColumns": "Kolommen toevoegen",
+ "commentCharacterDescription": "Voer het teken in dat het begin van een commentaarregel aangeeft. Regels die met dit symbool beginnen, worden overgeslagen.",
+ "csvOptions": "CSV-opties",
+ "csvSeparator": "CSV-scheidingsteken",
+ "csvToInsert": "CSV om in te voegen",
+ "csvToInsertDescription": "Voer een of meer kolommen in die u in het CSV-bestand wilt invoegen. Het teken dat wordt gebruikt om kolommen te scheiden, moet hetzelfde zijn als het teken in het CSV-invoerbestand. Let op: lege regels worden genegeerd.",
+ "customFillDescription": "Als het invoer-CSV-bestand niet compleet is (ontbrekende waarden), kunt u dan lege velden of aangepaste symbolen aan de records toevoegen om een goed opgemaakte CSV te maken?",
+ "customFillValueDescription": "Gebruik deze aangepaste waarde om ontbrekende velden in te vullen. (Werkt alleen met de modus 'Aangepaste waarden' hierboven.)",
+ "customPosition": "Aangepaste positie",
+ "customPositionOptionsDescription": "Selecteer de methode om de kolommen in het CSV-bestand in te voegen.",
+ "description": "Voeg nieuwe kolommen toe aan CSV-gegevens op de opgegeven posities.",
+ "fillWithCustomValues": "Vul met douanewaarden",
+ "fillWithEmptyValues": "Vullen met lege waarden",
+ "headerName": "Koptekstnaam",
+ "headerNameDescription": "Koptekst van de kolom waarna u kolommen wilt invoegen.",
+ "inputTitle": "CSV-invoer",
+ "insertingPositionDescription": "Geef aan waar de kolommen in het CSV-bestand moeten worden ingevoegd.",
+ "position": "Positie",
+ "positionOptions": "Positieopties",
+ "prependColumns": "Kolommen vooraf toevoegen",
+ "quoteCharDescription": "Voer het aanhalingsteken in dat u wilt gebruiken om de CSV-invoervelden te citeren.",
+ "resultTitle": "CSV-uitvoer",
+ "rowNumberDescription": "Nummer van de kolom waarna u kolommen wilt invoegen.",
+ "separatorDescription": "Voer het teken in dat gebruikt wordt om kolommen in het CSV-invoerbestand te scheiden.",
+ "shortDescription": "Voeg snel een of meer nieuwe kolommen in, waar dan ook in een CSV-bestand.",
+ "title": "CSV-kolommen invoegen",
+ "toolInfo": {
+ "description": "Met deze tool kunt u nieuwe kolommen op specifieke posities in CSV-gegevens invoegen. U kunt kolommen op aangepaste posities voorvoegen, toevoegen of invoegen op basis van koptekstnamen of kolomnummers.",
+ "title": "CSV-kolommen invoegen"
+ }
+ },
+ "swapCsvColumns": {
+ "description": "Upload uw CSV-bestand via het onderstaande formulier, geef aan welke kolommen u wilt omwisselen en de tool wijzigt automatisch de posities van de opgegeven kolommen in het uitvoerbestand. In de toolopties kunt u de kolomposities of -namen opgeven die u wilt omwisselen, onvolledige gegevens corrigeren en optioneel lege records en uitgeschakelde records verwijderen.",
+ "longDescription": "Deze tool reorganiseert CSV-gegevens door de posities van de kolommen om te wisselen. Het omwisselen van kolommen kan de leesbaarheid van een CSV-bestand verbeteren door veelgebruikte gegevens samen of vooraan te plaatsen, voor eenvoudigere gegevensvergelijking en -bewerking. U kunt bijvoorbeeld de eerste kolom omwisselen met de laatste of de tweede kolom met de derde. Om kolommen op basis van hun positie om te wisselen, selecteert u",
+ "shortDescription": "CSV-kolommen opnieuw ordenen.",
+ "title": "CSV-kolommen verwisselen"
+ },
+ "transposeCsv": {
+ "description": "Upload uw CSV-bestand via onderstaand formulier en deze tool transponeert uw CSV-bestand automatisch. In de toolopties kunt u het teken opgeven waarmee de commentaarregels in het CSV-bestand beginnen om ze te verwijderen. Als het CSV-bestand onvolledig is (ontbrekende waarden), kunt u de ontbrekende waarden vervangen door het lege teken of een aangepast teken.",
+ "longDescription": "Deze tool transponeert Comma Separated Values (CSV). Het behandelt de CSV als een matrix met data en draait alle elementen om over de hoofddiagonaal. De uitvoer bevat dezelfde CSV-data als de invoer, maar nu zijn alle rijen kolommen en alle kolommen rijen geworden. Na transpositie heeft het CSV-bestand tegengestelde afmetingen. Als het invoerbestand bijvoorbeeld 4 kolommen en 3 rijen heeft, heeft het uitvoerbestand 3 kolommen en 4 rijen. Tijdens de conversie zuivert het programma de data ook van onnodige regels en corrigeert het onvolledige data. De tool verwijdert automatisch alle lege records en opmerkingen die beginnen met een specifiek teken, dat u in de optie kunt instellen. Bovendien, in gevallen waarin de CSV-data beschadigd of verloren zijn, vult het hulpprogramma het bestand aan met lege velden of aangepaste velden die u in de opties kunt opgeven. Csv-abulous!",
+ "shortDescription": "Snel een CSV-bestand transponeren.",
+ "title": "CSV transponeren"
+ }
+}
diff --git a/public/locales/nl/image.json b/public/locales/nl/image.json
new file mode 100644
index 0000000..145b0a8
--- /dev/null
+++ b/public/locales/nl/image.json
@@ -0,0 +1,98 @@
+{
+ "changeColors": {
+ "description": "Wereld",
+ "shortDescription": "Snel kleuren in een afbeelding verwisselen",
+ "title": "Kleuren in afbeelding wijzigen"
+ },
+ "changeOpacity": {
+ "description": "Pas de transparantie van je afbeeldingen eenvoudig aan. Upload je afbeelding, gebruik de schuifbalk om de gewenste dekking in te stellen tussen 0 (volledig transparant) en 1 (volledig ondoorzichtig) en download de aangepaste afbeelding.",
+ "shortDescription": "Pas de transparantie van afbeeldingen aan",
+ "title": "Afbeeldingsdekking wijzigen"
+ },
+ "compress": {
+ "description": "Verklein de bestandsgrootte van een afbeelding, maar behoud de kwaliteit.",
+ "inputTitle": "Invoerafbeelding",
+ "resultTitle": "Gecomprimeerde afbeelding",
+ "shortDescription": "Comprimeer afbeeldingen om de bestandsgrootte te verkleinen, maar zorg er wel voor dat de kwaliteit redelijk blijft.",
+ "title": "Afbeelding comprimeren"
+ },
+ "compressPng": {
+ "description": "Dit is een programma dat PNG-afbeeldingen comprimeert. Zodra u uw PNG-afbeelding in het invoerveld plakt, comprimeert het programma deze en toont het resultaat in het uitvoerveld. In de opties kunt u het compressieniveau aanpassen en de oude en nieuwe bestandsgroottes van de afbeeldingen vinden.",
+ "shortDescription": "Snel een PNG comprimeren",
+ "title": "PNG comprimeren"
+ },
+ "convertJgpToPng": {
+ "description": "Converteer je JPG-afbeeldingen snel naar PNG. Importeer je PNG-afbeelding in de editor aan de linkerkant.",
+ "shortDescription": "Converteer uw JPG-afbeeldingen snel naar PNG",
+ "title": "JPG naar PNG converteren"
+ },
+ "convertToJpg": {
+ "description": "Converteer verschillende afbeeldingsformaten (PNG, GIF, TIF, PSD, SVG, WEBP, HEIC, RAW) naar JPG met aanpasbare instellingen voor de kwaliteit en achtergrondkleur.",
+ "shortDescription": "Converteer afbeeldingen naar JPG met kwaliteitscontrole",
+ "title": "Afbeeldingen naar JPG converteren"
+ },
+ "createTransparent": {
+ "description": "Wereld",
+ "shortDescription": "Snel een afbeelding transparant maken",
+ "title": "Transparante PNG maken"
+ },
+ "crop": {
+ "description": "Snijd afbeeldingen bij om ongewenste delen te verwijderen.",
+ "inputTitle": "Invoerafbeelding",
+ "resultTitle": "Bijgesneden afbeelding",
+ "shortDescription": "Snel afbeeldingen bijsnijden.",
+ "title": "Afbeelding bijsnijden"
+ },
+ "editor": {
+ "description": "Geavanceerde beeldbewerker met tools voor bijsnijden, roteren, annoteren, kleuren aanpassen en watermerken toevoegen. Bewerk je afbeeldingen met professionele tools rechtstreeks in je browser.",
+ "shortDescription": "Bewerk afbeeldingen met geavanceerde tools en functies",
+ "title": "Afbeeldingseditor"
+ },
+ "imageToText": {
+ "description": "Extraheer tekst uit afbeeldingen (JPG, PNG) met behulp van optische tekenherkenning (OCR).",
+ "shortDescription": "Tekst uit afbeeldingen extraheren met OCR.",
+ "title": "Afbeelding naar tekst (OCR)"
+ },
+ "qrCode": {
+ "description": "Genereer QR-codes voor verschillende gegevenstypen: URL, tekst, e-mail, telefoon, sms, wifi, vCard en meer.",
+ "shortDescription": "Maak aangepaste QR-codes voor verschillende gegevensformaten.",
+ "title": "QR-codegenerator"
+ },
+ "removeBackground": {
+ "description": "Wereld",
+ "shortDescription": "Achtergronden automatisch uit afbeeldingen verwijderen",
+ "title": "Achtergrond uit afbeelding verwijderen"
+ },
+ "resize": {
+ "description": "Afbeeldingen aanpassen naar verschillende afmetingen.",
+ "dimensionType": "Dimensietype",
+ "heightDescription": "Hoogte (in pixels)",
+ "inputTitle": "Invoerafbeelding",
+ "maintainAspectRatio": "Beeldverhouding behouden",
+ "maintainAspectRatioDescription": "Behoud de originele beeldverhouding van de afbeelding.",
+ "percentage": "Percentage",
+ "percentageDescription": "Percentage van de oorspronkelijke grootte (bijv. 50 voor halve grootte, 200 voor dubbele grootte)",
+ "resizeByPercentage": "Formaat wijzigen met percentage",
+ "resizeByPercentageDescription": "U kunt de grootte wijzigen door een percentage van de oorspronkelijke grootte op te geven.",
+ "resizeByPixels": "Formaat wijzigen met pixels",
+ "resizeByPixelsDescription": "U kunt het formaat wijzigen door de afmetingen in pixels op te geven.",
+ "resizeMethod": "Methode voor het wijzigen van de grootte",
+ "resultTitle": "Afbeelding met gewijzigd formaat",
+ "setHeight": "Hoogte instellen",
+ "setHeightDescription": "Geef de hoogte op in pixels en bereken de breedte op basis van de beeldverhouding.",
+ "setWidth": "Breedte instellen",
+ "setWidthDescription": "Geef de breedte op in pixels en bereken de hoogte op basis van de beeldverhouding.",
+ "shortDescription": "U kunt de grootte van afbeeldingen eenvoudig aanpassen.",
+ "title": "Afbeelding formaat wijzigen",
+ "toolInfo": {
+ "description": "Met deze tool kun je de grootte van JPG-, PNG-, SVG- of GIF-afbeeldingen aanpassen. Je kunt de grootte aanpassen door de afmetingen in pixels of percentages op te geven, met opties om de oorspronkelijke beeldverhouding te behouden.",
+ "title": "Afbeelding formaat wijzigen"
+ },
+ "widthDescription": "Breedte (in pixels)"
+ },
+ "rotate": {
+ "description": "Draai een afbeelding met een bepaalde hoek.",
+ "shortDescription": "Draai een afbeelding eenvoudig.",
+ "title": "Afbeelding roteren"
+ }
+}
diff --git a/public/locales/nl/json.json b/public/locales/nl/json.json
new file mode 100644
index 0000000..1fa6fe4
--- /dev/null
+++ b/public/locales/nl/json.json
@@ -0,0 +1,62 @@
+{
+ "escapeJson": {
+ "description": "Escape speciale tekens in JSON-strings. Converteer JSON-gegevens naar een correct geëscapete indeling voor veilige overdracht of opslag.",
+ "shortDescription": "Speciale tekens in JSON ontsnappen",
+ "title": "Ontsnappen aan JSON"
+ },
+ "jsonToXml": {
+ "description": "Converteer JSON-gegevens naar XML-formaat. Transformeer gestructureerde JSON-objecten naar correct vormgegeven XML-documenten.",
+ "shortDescription": "Converteer JSON naar XML-formaat",
+ "title": "JSON naar XML"
+ },
+ "minify": {
+ "description": "Verwijder alle onnodige witruimte uit JSON.",
+ "inputTitle": "Invoer JSON",
+ "resultTitle": "Geminimaliseerde JSON",
+ "shortDescription": "Verklein JSON door witruimte te verwijderen",
+ "title": "JSON verkleinen",
+ "toolInfo": {
+ "description": "JSON-minificatie is het proces waarbij alle onnodige witruimte uit JSON-gegevens wordt verwijderd, terwijl de geldigheid ervan behouden blijft. Dit omvat het verwijderen van spaties, nieuwe regels en inspringingen die niet nodig zijn voor een correcte parsering van de JSON. Minificatie verkleint de grootte van JSON-gegevens, waardoor deze efficiënter worden opgeslagen en verzonden, met behoud van exact dezelfde datastructuur en waarden.",
+ "title": "Wat is JSON-minificatie?"
+ }
+ },
+ "prettify": {
+ "description": "Formatteer JSON met de juiste inspringing en spatie.",
+ "indentation": "Inspringing",
+ "inputTitle": "Invoer JSON",
+ "resultTitle": "Verfraaide JSON",
+ "shortDescription": "JSON-code opmaken en verfraaien",
+ "title": "JSON verfraaien",
+ "toolInfo": {
+ "description": "Met deze tool kunt u JSON-gegevens opmaken met de juiste inspringing en spaties, waardoor ze beter leesbaar en eenvoudiger te gebruiken zijn.",
+ "title": "JSON verfraaien"
+ },
+ "useSpaces": "Gebruik spaties",
+ "useSpacesDescription": "Uitvoer inspringen met spaties",
+ "useTabs": "Tabbladen gebruiken",
+ "useTabsDescription": "Uitvoer inspringen met tabs."
+ },
+ "stringify": {
+ "description": "Converteer JavaScript-objecten naar JSON-stringformaat. Serialiseer datastructuren naar JSON-strings voor opslag of verzending.",
+ "shortDescription": "Objecten converteren naar JSON-string",
+ "title": "Stringify JSON"
+ },
+ "tsvToJson": {
+ "description": "Converteer TSV-gegevens (Tab-Separated Values) naar JSON-formaat. Transformeer tabelgegevens naar gestructureerde JSON-objecten.",
+ "shortDescription": "Converteer TSV naar JSON-formaat",
+ "title": "TSV naar JSON"
+ },
+ "validateJson": {
+ "description": "Controleer of JSON geldig en correct is geformuleerd.",
+ "inputTitle": "Invoer JSON",
+ "invalidJson": "❌ {{error}}",
+ "resultTitle": "Validatieresultaat",
+ "shortDescription": "Valideer JSON-code op fouten",
+ "title": "Valideer JSON",
+ "toolInfo": {
+ "description": "JSON (JavaScript Object Notation) is een lichtgewicht formaat voor gegevensuitwisseling. JSON-validatie zorgt ervoor dat de structuur van de gegevens voldoet aan de JSON-standaard. Een geldig JSON-object moet het volgende bevatten: - Eigenschapsnamen tussen dubbele aanhalingstekens. - Correct gebalanceerde accolades {}. - Geen afsluitende komma's na het laatste sleutel-waardepaar. - Correcte nesting van objecten en arrays. Deze tool controleert de invoer-JSON en geeft feedback om veelvoorkomende fouten te identificeren en te verhelpen.",
+ "title": "Wat is JSON-validatie?"
+ },
+ "validJson": "✅ Geldige JSON"
+ }
+}
diff --git a/public/locales/nl/list.json b/public/locales/nl/list.json
new file mode 100644
index 0000000..ae2f1ee
--- /dev/null
+++ b/public/locales/nl/list.json
@@ -0,0 +1,208 @@
+{
+ "duplicate": {
+ "concatenate": "Concateneren",
+ "concatenateDescription": "Kopieën samenvoegen (indien niet aangevinkt, worden de items verweven)",
+ "copyDescription": "Aantal kopieën (kan fractioneel zijn)",
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het dupliceren van lijstitems. Voer uw lijst in en specificeer duplicatiecriteria om kopieën van items te maken. Perfect voor data-uitbreiding, testen of het creëren van herhaalde patronen.",
+ "duplicationOptions": "Duplicatieopties",
+ "examples": {
+ "fractional": {
+ "description": "Dit voorbeeld laat zien hoe u een lijst kunt dupliceren met een fractioneel aantal kopieën.",
+ "title": "Fractionele duplicatie"
+ },
+ "interweave": {
+ "description": "Dit voorbeeld laat zien hoe u items kunt verweven in plaats van aaneenschakelen.",
+ "title": "Verweven items"
+ },
+ "reverse": {
+ "description": "Dit voorbeeld laat zien hoe u een lijst in omgekeerde volgorde kunt dupliceren.",
+ "title": "Omgekeerde duplicatie"
+ },
+ "simple": {
+ "description": "Dit voorbeeld laat zien hoe u een lijst met woorden kunt dupliceren.",
+ "title": "Eenvoudige duplicatie"
+ }
+ },
+ "inputTitle": "Invoerlijst",
+ "joinSeparatorDescription": "Scheidingsteken om de gedupliceerde lijst samen te voegen",
+ "resultTitle": "Gedupliceerde lijst",
+ "reverse": "Achteruit",
+ "reverseDescription": "Draai de gedupliceerde items om",
+ "shortDescription": "Dubbele lijstitems met opgegeven criteria",
+ "splitByRegex": "Gesplitst door reguliere expressie",
+ "splitBySymbol": "Gesplitst op symbool",
+ "splitOptions": "Gesplitste opties",
+ "splitSeparatorDescription": "Scheidingsteken om de lijst te splitsen",
+ "title": "Duplicaat",
+ "toolInfo": {
+ "description": "Met deze tool kunt u items in een lijst dupliceren. U kunt het aantal kopieën (inclusief fractionele waarden) opgeven, bepalen of items worden samengevoegd of verweven, en zelfs de gedupliceerde items omkeren. Dit is handig voor het creëren van herhaalde patronen, het genereren van testgegevens of het uitbreiden van lijsten met voorspelbare inhoud.",
+ "title": "Lijstduplicatie"
+ }
+ },
+ "findMostPopular": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde tool om de populairste items in een lijst te vinden. Voer je lijst in en krijg direct de items die het vaakst voorkomen. Perfect voor data-analyse, trendidentificatie of het vinden van gemeenschappelijke elementen.",
+ "shortDescription": "Vind de meest voorkomende items",
+ "title": "Vind de meest populaire"
+ },
+ "findUnique": {
+ "caseSensitiveItems": "Hoofdlettergevoelige items",
+ "caseSensitiveItemsDescription": "Geef items met verschillende hoofdletters/kleine letters weer als unieke elementen in de lijst.",
+ "delimiterDescription": "Stel een scheidingsteken of reguliere expressie in.",
+ "description": "'s Werelds eenvoudigste browsergebaseerde tool voor het vinden van unieke items in een lijst. Voer uw lijst in en ontvang direct alle unieke waarden, inclusief verwijderde duplicaten. Perfect voor dataopschoning, deduplicatie of het vinden van afzonderlijke elementen.",
+ "findAbsolutelyUniqueItems": "Vind absoluut unieke items",
+ "findAbsolutelyUniqueItemsDescription": "Geef alleen die items van de lijst weer die in één exemplaar aanwezig zijn.",
+ "inputListDelimiter": "Invoerlijst scheidingsteken",
+ "inputTitle": "Invoerlijst",
+ "outputListDelimiter": "Uitvoerlijstscheidingsteken",
+ "resultTitle": "Unieke items",
+ "shortDescription": "Vind unieke items in een lijst",
+ "skipEmptyItems": "Lege items overslaan",
+ "skipEmptyItemsDescription": "Neem de lege lijst-items niet op in de uitvoer.",
+ "title": "Vind uniek",
+ "trimItems": "Items in de trimlijst",
+ "trimItemsDescription": "Verwijder spaties voor en na de items voordat u ze vergelijkt.",
+ "uniqueItemOptions": "Unieke itemopties"
+ },
+ "group": {
+ "deleteEmptyItems": "Lege items verwijderen",
+ "deleteEmptyItemsDescription": "Negeer lege items en neem ze niet op in de groepen.",
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het groeperen van lijstitems. Voer uw lijst in en specificeer groeperingscriteria om items in logische groepen te ordenen. Perfect voor het categoriseren van gegevens, het organiseren van informatie of het maken van gestructureerde lijsten. Ondersteunt aangepaste scheidingstekens en diverse groeperingsopties.",
+ "emptyItemsAndPadding": "Lege items en opvulling",
+ "groupNumberDescription": "Aantal items in een groep",
+ "groupSeparatorDescription": "Groepsscheidingsteken",
+ "groupSizeAndSeparators": "Groepsgrootte en scheidingstekens",
+ "inputItemSeparator": "Scheidingsteken voor invoeritems",
+ "inputTitle": "Invoerlijst",
+ "itemSeparatorDescription": "Itemscheidingsteken",
+ "leftWrapDescription": "Linksomloopsymbool van de groep.",
+ "padNonFullGroups": "Pad Niet-volledige groepen",
+ "padNonFullGroupsDescription": "Vul niet-volledige groepen met een aangepast item (voer hieronder in).",
+ "paddingCharDescription": "Gebruik dit karakter of item om groepen aan te vullen die niet vol zijn.",
+ "resultTitle": "Gegroepeerde items",
+ "rightWrapDescription": "Symbool voor de rechteromslag van de groep.",
+ "shortDescription": "Groepeer lijstitems op basis van gemeenschappelijke eigenschappen",
+ "splitOperators": {
+ "regex": {
+ "description": "Beperk de items in de invoerlijst met een reguliere expressie.",
+ "title": "Gebruik een Regex voor het splitsen"
+ },
+ "symbol": {
+ "description": "Beperk de items in de invoerlijst met een teken.",
+ "title": "Gebruik een symbool voor splitsen"
+ }
+ },
+ "splitSeparatorDescription": "Stel een scheidingsteken of reguliere expressie in.",
+ "title": "Groep"
+ },
+ "reverse": {
+ "description": "Dit is een supereenvoudige browserapplicatie die alle items in de lijst in spiegelbeeld afdrukt. De invoeritems kunnen worden gescheiden door een willekeurig symbool en u kunt ook de scheidingstekens van de omgekeerde items in de lijst wijzigen.",
+ "inputTitle": "Invoerlijst",
+ "itemSeparator": "Itemscheidingsteken",
+ "itemSeparatorDescription": "Stel een scheidingsteken of reguliere expressie in.",
+ "outputListOptions": "Opties voor uitvoerlijst",
+ "outputSeparatorDescription": "Scheidingsteken voor uitvoerlijst-items.",
+ "resultTitle": "Omgekeerde lijst",
+ "shortDescription": "Een lijst snel omkeren",
+ "splitOperators": {
+ "regex": {
+ "description": "Beperk de items in de invoerlijst met een reguliere expressie.",
+ "title": "Gebruik een Regex voor het splitsen"
+ },
+ "symbol": {
+ "description": "Beperk de items in de invoerlijst met een teken.",
+ "title": "Gebruik een symbool voor splitsen"
+ }
+ },
+ "splitterMode": "Splittermodus",
+ "title": "Achteruit",
+ "toolInfo": {
+ "description": "Met dit hulpprogramma kunt u de volgorde van items in een lijst omkeren. Het hulpprogramma splitst de invoerlijst eerst op in afzonderlijke items en doorloopt deze vervolgens van het laatste naar het eerste item, waarbij elk item tijdens de iteratie in de uitvoer wordt afgedrukt. De invoerlijst kan alles bevatten wat kan worden weergegeven als tekstuele gegevens, zoals cijfers, getallen, strings, woorden, zinnen, enz. Het scheidingsteken voor invoeritems kan ook een reguliere expressie zijn. Met de regex /[;,]/ kunt u bijvoorbeeld items gebruiken die door komma's of puntkomma's worden gescheiden. De scheidingstekens voor invoer- en uitvoerlijstitems kunnen in de opties worden aangepast. Standaard zijn zowel invoer- als uitvoerlijsten door komma's gescheiden. Listabulous!",
+ "title": "Wat is een lijstomkeerder?"
+ }
+ },
+ "rotate": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het roteren van lijstitems. Voer uw lijst in en specificeer de rotatiehoeveelheid om items met een bepaald aantal posities te verschuiven. Perfect voor gegevensmanipulatie, circulaire verschuivingen of het opnieuw ordenen van lijsten.",
+ "shortDescription": "Lijstitems roteren op opgegeven posities",
+ "title": "Draaien"
+ },
+ "shuffle": {
+ "delimiterDescription": "Stel een scheidingsteken of reguliere expressie in.",
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het herschikken van lijstitems. Voer je lijst in en ontvang direct een gerandomiseerde versie met items in willekeurige volgorde. Perfect voor het creëren van variatie, het testen van willekeur of het door elkaar halen van geordende gegevens.",
+ "inputListSeparator": "Scheidingsteken voor invoerlijst",
+ "inputTitle": "Invoerlijst",
+ "joinSeparatorDescription": "Gebruik dit scheidingsteken in de willekeurige lijst.",
+ "outputLengthDescription": "Geef zoveel willekeurige items weer",
+ "resultTitle": "Geschudde lijst",
+ "shortDescription": "De volgorde van lijstitems willekeurig maken",
+ "shuffledListLength": "Lengte van de geschudde lijst",
+ "shuffledListSeparator": "Geschudde lijstscheidingsteken",
+ "title": "Schudden"
+ },
+ "sort": {
+ "caseSensitive": "Hoofdlettergevoelig sorteren",
+ "caseSensitiveDescription": "Sorteer hoofdletters en kleine letters apart. Hoofdletters gaan vooraf aan kleine letters in een oplopende lijst. (Werkt alleen in alfabetische sorteermodus.)",
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het sorteren van lijstitems. Voer uw lijst in en specificeer sorteercriteria om items in oplopende of aflopende volgorde te ordenen. Perfect voor gegevensorganisatie, tekstverwerking of het maken van geordende lijsten.",
+ "inputItemSeparator": "Scheidingsteken voor invoeritems",
+ "inputTitle": "Invoerlijst",
+ "joinSeparatorDescription": "Gebruik dit symbool als verbindingsstuk tussen items in een gesorteerde lijst.",
+ "orderDescription": "Selecteer een sorteervolgorde.",
+ "orderOptions": {
+ "decreasing": "Afnemende volgorde",
+ "increasing": "Toenemende orde"
+ },
+ "removeDuplicates": "Duplicaten verwijderen",
+ "removeDuplicatesDescription": "Verwijder dubbele lijstonderdelen.",
+ "resultTitle": "Gesorteerde lijst",
+ "shortDescription": "Lijstitems in de opgegeven volgorde sorteren",
+ "sortMethod": "Sorteermethode",
+ "sortMethodDescription": "Selecteer een sorteermethode.",
+ "sortOptions": {
+ "alphabetic": "Alfabetisch sorteren",
+ "length": "Sorteren op lengte",
+ "numeric": "Numeriek sorteren"
+ },
+ "sortedItemProperties": "Gesorteerde itemeigenschappen",
+ "splitOperators": {
+ "regex": {
+ "description": "Beperk de items in de invoerlijst met een reguliere expressie.",
+ "title": "Gebruik een Regex voor het splitsen"
+ },
+ "symbol": {
+ "description": "Beperk de items in de invoerlijst met een teken.",
+ "title": "Gebruik een symbool voor splitsen"
+ }
+ },
+ "splitSeparatorDescription": "Stel een scheidingsteken of reguliere expressie in.",
+ "title": "Soort"
+ },
+ "truncate": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het afkappen van lijsten. Voer uw lijst in en specificeer het maximale aantal items dat u wilt behouden. Perfect voor gegevensverwerking, lijstbeheer of het beperken van de lengte van content.",
+ "shortDescription": "Lijst afkappen tot een bepaald aantal items",
+ "title": "Afkappen"
+ },
+ "unwrap": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het uitpakken van lijstitems. Voer uw ingepakte lijst in en specificeer uitpakcriteria om georganiseerde items plat te maken. Perfect voor gegevensverwerking, tekstmanipulatie of het extraheren van inhoud uit gestructureerde lijsten.",
+ "shortDescription": "Lijstitems uit gestructureerde opmaak uitpakken",
+ "title": "Uitpakken"
+ },
+ "wrap": {
+ "description": "Voeg tekst toe voor en na elk item in de lijst.",
+ "inputTitle": "Invoerlijst",
+ "joinSeparatorDescription": "Scheidingsteken om de ingepakte lijst samen te voegen",
+ "leftTextDescription": "Tekst die vóór elk item moet worden toegevoegd",
+ "removeEmptyItems": "Lege items verwijderen",
+ "resultTitle": "Ingepakte lijst",
+ "rightTextDescription": "Tekst die na elk item moet worden toegevoegd",
+ "shortDescription": "Lijstitems inpakken met opgegeven criteria",
+ "splitByRegex": "Gesplitst door reguliere expressie",
+ "splitBySymbol": "Gesplitst op symbool",
+ "splitOptions": "Gesplitste opties",
+ "splitSeparatorDescription": "Scheidingsteken om de lijst te splitsen",
+ "title": "Wrap",
+ "toolInfo": {
+ "description": "Met deze tool kunt u tekst voor en na elk item in een lijst toevoegen. U kunt verschillende tekst opgeven voor de linker- en rechterkant en bepalen hoe de lijst wordt verwerkt. Deze tool is handig voor het toevoegen van aanhalingstekens, haakjes of andere opmaak aan lijstitems, het voorbereiden van gegevens voor verschillende formaten of het maken van gestructureerde tekst.",
+ "title": "Lijstomloop"
+ },
+ "wrapOptions": "Wrap-opties"
+ }
+}
diff --git a/public/locales/nl/number.json b/public/locales/nl/number.json
new file mode 100644
index 0000000..4800780
--- /dev/null
+++ b/public/locales/nl/number.json
@@ -0,0 +1,89 @@
+{
+ "arithmeticSequence": {
+ "commonDifferenceDescription": "Veelvoorkomend verschil tussen termen (d)",
+ "description": "Genereer rekenkundige reeksen met aanpasbare parameters.",
+ "firstTermDescription": "Eerste term van de reeks (a₁)",
+ "numberOfTermsDescription": "Aantal te genereren termen (n)",
+ "outputFormat": "Uitvoerformaat",
+ "resultTitle": "Gegenereerde sequentie",
+ "separatorDescription": "Scheidingsteken tussen termen",
+ "sequenceParameters": "Sequentieparameters",
+ "shortDescription": "Genereer rekenkundige reeksen",
+ "title": "Rekenkundige reeks",
+ "toolInfo": {
+ "description": "Een rekenkundige rij is een reeks getallen waarbij het verschil tussen elke opeenvolgende term constant is. Dit constante verschil wordt de gemeenschappelijke afwijking genoemd. Gegeven de eerste term (a₁) en de gemeenschappelijke afwijking (d), kan elke term worden gevonden door de gemeenschappelijke afwijking op te tellen bij de vorige term.",
+ "title": "Wat is een rekenkundige rij?"
+ }
+ },
+ "generate": {
+ "arithmeticSequenceOption": "Optie voor rekenkundige reeks",
+ "description": "Genereer een getallenreeks met aanpasbare parameters.",
+ "numberOfElementsDescription": "Aantal elementen in volgorde.",
+ "resultTitle": "Gegenereerde nummers",
+ "separator": "Scheidingsteken",
+ "separatorDescription": "Scheid elementen in de rekenkundige reeks met dit teken.",
+ "shortDescription": "Genereer willekeurige getallen in opgegeven bereiken",
+ "startSequenceDescription": "Start de reeks vanaf dit nummer.",
+ "stepDescription": "Verhoog elk element met dit bedrag",
+ "title": "Genereren",
+ "toolInfo": {
+ "description": "Met deze tool kunt u een getallenreeks genereren met aanpasbare parameters. U kunt de startwaarde, stapgrootte en het aantal elementen specificeren.",
+ "title": "Genereer getallen"
+ }
+ },
+ "ohmsLaw": {
+ "description": "Bereken spanning, stroom en weerstand",
+ "longDescription": "Deze rekenmachine past de wet van Ohm (V = I × R) toe om een van de drie elektrische parameters te bepalen wanneer de andere twee bekend zijn. De wet van Ohm is een fundamenteel principe in de elektrotechniek dat de relatie beschrijft tussen spanning (V), stroomsterkte (I) en weerstand (R). Deze tool is essentieel voor elektronicahobbyisten, elektrotechnici en studenten die met schakelingen werken om snel onbekende waarden in hun elektrische ontwerpen op te lossen.",
+ "shortDescription": "Bereken spanning, stroom of weerstand in elektrische circuits met behulp van de wet van Ohm",
+ "title": "Wet van Ohm"
+ },
+ "slackline": {
+ "description": "Bereken de spanning in een slackline",
+ "longDescription": "Deze rekenmachine gaat uit van een last in het midden van het touw",
+ "shortDescription": "Bereken de geschatte spanning van een slackline of waslijn. Vertrouw hier niet op voor je veiligheid.",
+ "title": "Slackline-spanning"
+ },
+ "sphereArea": {
+ "description": "Oppervlakte van een bol",
+ "longDescription": "Deze rekenmachine bepaalt de oppervlakte van een bol met behulp van de formule A = 4πr². U kunt de straal invoeren om de oppervlakte te berekenen, of de oppervlakte invoeren om de gewenste straal te berekenen. Deze tool is handig voor studenten meetkunde, ingenieurs die met bolvormige objecten werken en iedereen die berekeningen met bolvormige oppervlakken moet uitvoeren.",
+ "shortDescription": "Bereken het oppervlak van een bol op basis van de straal",
+ "title": "Oppervlakte van een bol"
+ },
+ "sphereVolume": {
+ "description": "Volume van een bol",
+ "longDescription": "Deze rekenmachine berekent het volume van een bol met de formule V = (4/3)πr³. U kunt de straal of diameter invoeren om het volume te berekenen, of het volume invoeren om de gewenste straal te bepalen. Deze tool is nuttig voor studenten, ingenieurs en professionals die met bolvormige objecten werken in vakgebieden zoals natuurkunde, techniek en productie.",
+ "shortDescription": "Bereken het volume van een bol met behulp van de straal of diameter",
+ "title": "Volume van een bol"
+ },
+ "sum": {
+ "description": "Bereken de som van een lijst met getallen. Voer getallen gescheiden door komma's of nieuwe regels in om de som te berekenen.",
+ "extractionTypes": {
+ "delimiter": {
+ "description": "Pas hier het scheidingsteken voor getallen aan. (Standaard een regelafbreking.)",
+ "title": "Nummerscheidingsteken"
+ },
+ "smart": {
+ "description": "Automatische detectie van getallen in de invoer.",
+ "title": "Slimme Som"
+ }
+ },
+ "inputTitle": "Invoer",
+ "numberExtraction": "Nummer extractie",
+ "printRunningSum": "Afdrukken Lopende Som",
+ "printRunningSumDescription": "Geef de som weer terwijl deze stap voor stap wordt berekend.",
+ "resultTitle": "Totaal",
+ "runningSum": "Lopende som",
+ "shortDescription": "Bereken de som van getallen",
+ "title": "Som",
+ "toolInfo": {
+ "description": "Dit is een online browserprogramma waarmee je de som van een aantal getallen kunt berekenen. Je kunt de getallen invoeren, gescheiden door een komma, spatie of een ander teken, inclusief de regelafbreking. Je kunt ook gewoon een fragment tekstuele gegevens plakken met numerieke waarden die je wilt optellen. Het programma zal deze waarden dan extraheren en de som bepalen.",
+ "title": "Wat is een getallensomcalculator?"
+ }
+ },
+ "voltageDropInWire": {
+ "description": "Bereken de retourspanning en het vermogensverlies in een 2-aderige kabel",
+ "longDescription": "Deze calculator helpt bij het bepalen van de spanningsval en het vermogensverlies in een tweeaderige elektrische kabel. Hierbij wordt rekening gehouden met de kabellengte, de draaddikte (dwarsdoorsnede), de materiaalweerstand en de stroomsterkte. De tool berekent de spanningsval heen en terug, de totale weerstand van de kabel en het vermogen dat als warmte wordt afgegeven. Dit is met name handig voor elektrotechnici, elektriciens en hobbyisten bij het ontwerpen van elektrische systemen om ervoor te zorgen dat de spanningsniveaus bij de belasting binnen acceptabele grenzen blijven.",
+ "shortDescription": "Bereken spanningsval en vermogensverlies in elektrische kabels op basis van lengte, materiaal en stroom",
+ "title": "Spanningsval in de kabel bij retour"
+ }
+}
diff --git a/public/locales/nl/pdf.json b/public/locales/nl/pdf.json
new file mode 100644
index 0000000..250f554
--- /dev/null
+++ b/public/locales/nl/pdf.json
@@ -0,0 +1,113 @@
+{
+ "compressPdf": {
+ "compressedFileSize": "Gecomprimeerde bestandsgrootte",
+ "compressingPdf": "PDF comprimeren...",
+ "compressionLevel": "Compressieniveau",
+ "compressionSettings": "Compressie-instellingen",
+ "description": "Verklein de PDF-bestandsgrootte met behoud van kwaliteit met Ghostscript",
+ "errorCompressingPdf": "PDF comprimeren is mislukt: {{error}}",
+ "errorReadingPdf": "PDF-bestand kan niet worden gelezen. Controleer of het een geldig PDF-bestand is.",
+ "fileSize": "Originele bestandsgrootte",
+ "highCompression": "Hoge compressie",
+ "highCompressionDescription": "Maximale bestandsgroottevermindering met enig kwaliteitsverlies",
+ "inputTitle": "PDF-invoer",
+ "lowCompression": "Lage compressie",
+ "lowCompressionDescription": "Verklein de bestandsgrootte lichtjes met minimaal kwaliteitsverlies",
+ "mediumCompression": "Gemiddelde compressie",
+ "mediumCompressionDescription": "Balans tussen bestandsgrootte en kwaliteit",
+ "pages": "Aantal pagina's",
+ "resultTitle": "Gecomprimeerde PDF",
+ "shortDescription": "Comprimeer PDF-bestanden veilig in uw browser",
+ "title": "PDF comprimeren"
+ },
+ "editor": {
+ "description": "Geavanceerde PDF-editor met mogelijkheden voor annotatie, formulieren invullen, markeren en exporteren. Bewerk uw PDF's rechtstreeks in de browser met professionele tools zoals tekst invoegen, tekenen, markeren, ondertekenen en formulieren invullen.",
+ "shortDescription": "Bewerk PDF's met geavanceerde hulpmiddelen voor annotatie, ondertekening en bewerking",
+ "title": "PDF-editor"
+ },
+ "merge": {
+ "inputTitle": "PDF-invoer",
+ "loadingText": "Pagina's extraheren",
+ "resultTitle": "Samengevoegde PDF-uitvoer",
+ "toolInfo": {
+ "description": "Met deze tool kun je meerdere PDF-bestanden samenvoegen tot één document. Om de tool te gebruiken, upload je eenvoudig de PDF-bestanden die je wilt samenvoegen. De tool combineert vervolgens alle pagina's uit de invoerbestanden tot één PDF-document.",
+ "title": "Hoe gebruik ik de PDF-samenvoegtool?"
+ }
+ },
+ "mergePdf": {
+ "description": "Combineer meerdere PDF-bestanden tot één document.",
+ "inputTitle": "PDF-invoer",
+ "mergingPdfs": "PDF's samenvoegen",
+ "pdfOptions": "PDF-opties",
+ "resultTitle": "Samengevoegde PDF",
+ "shortDescription": "Meerdere PDF-bestanden samenvoegen tot één document",
+ "sortByFileName": "Sorteren op bestandsnaam",
+ "sortByFileNameDescription": "PDF's alfabetisch sorteren op bestandsnaam",
+ "sortByUploadOrder": "Sorteren op uploadvolgorde",
+ "sortByUploadOrderDescription": "Bewaar PDF's in de volgorde waarin ze zijn geüpload",
+ "title": "PDF samenvoegen",
+ "toolInfo": {
+ "description": "Met deze tool kun je meerdere PDF-bestanden combineren tot één document. Je kunt kiezen hoe je de PDF's wilt sorteren en de tool voegt ze samen in de opgegeven volgorde.",
+ "title": "PDF-bestanden samenvoegen"
+ }
+ },
+ "pdfToEpub": {
+ "description": "PDF-documenten transformeren naar EPUB-bestanden voor betere compatibiliteit met e-readers.', pictogram: 'material-symbols:import-contacts', component: lazy(() => import('./index')), trefwoorden: ['pdf', 'epub', 'convert', 'ebook'], pad: 'pdf-naar-epub', i18n: { naam: 'pdf:pdfToEpub.title', beschrijving: 'pdf:pdfToEpub.description",
+ "shortDescription": "PDF-bestanden converteren naar EPUB-formaat",
+ "title": "PDF naar EPUB"
+ },
+ "pdfToPng": {
+ "description": "Transformeer PDF-documenten naar PNG-panelen.",
+ "longDescription": "Upload een PDF en converteer elke pagina rechtstreeks in je browser naar een hoogwaardige PNG-afbeelding. Deze tool is ideaal voor het extraheren van visuele content of het delen van individuele pagina's. Er worden geen gegevens geüpload - alles wordt lokaal uitgevoerd.",
+ "shortDescription": "PDF naar PNG-afbeeldingen converteren",
+ "title": "PDF naar PNG"
+ },
+ "protectPdf": {
+ "description": "Voeg wachtwoordbeveiliging toe aan uw PDF-bestanden veilig in uw browser",
+ "shortDescription": "PDF-bestanden veilig met een wachtwoord beveiligen",
+ "title": "PDF beschermen"
+ },
+ "rotatePdf": {
+ "allPagesWillBeRotated": "Alle {{count}} pagina's worden gedraaid",
+ "angleOptions": {
+ "clockwise90": "90° met de klok mee",
+ "counterClockwise270": "270° (90° tegen de klok in)",
+ "upsideDown180": "180° (op zijn kop)"
+ },
+ "applyToAllPages": "Toepassen op alle pagina's",
+ "description": "Pagina's in een PDF-document roteren.",
+ "inputTitle": "PDF-invoer",
+ "longDescription": "Wijzig de oriëntatie van PDF-pagina's door ze 90, 180 of 270 graden te draaien. Handig voor het corrigeren van onjuist gescande documenten of het voorbereiden van PDF's voor afdrukken.",
+ "pageRangesDescription": "Voer paginanummers of bereiken in, gescheiden door komma's (bijv. 1, 3, 5-7)",
+ "pageRangesPlaceholder": "bijv. 1,5-8",
+ "pagesWillBeRotated": "{{count}} pagina{{count !== 1 ? 's' : ''}} zal worden gedraaid",
+ "pdfPageCount": "PDF heeft {{count}} pagina{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "Gedraaide PDF",
+ "rotatingPages": "Roterende pagina's",
+ "rotationAngle": "Rotatiehoek",
+ "rotationSettings": "Rotatie-instellingen",
+ "shortDescription": "Pagina's in een PDF-document roteren",
+ "title": "PDF roteren",
+ "toolInfo": {
+ "description": "Met deze tool kunt u pagina's in een PDF-document roteren. U kunt alle pagina's roteren of specifieke pagina's opgeven. Kies een rotatiehoek: 90° met de klok mee, 180° (ondersteboven) of 270° (90° tegen de klok in). Om specifieke pagina's te roteren, schakelt u 'Toepassen op alle pagina's' uit en voert u paginanummers of paginabereiken in, gescheiden door komma's (bijvoorbeeld 1, 3, 5-7).",
+ "title": "De PDF-rotatietool gebruiken"
+ }
+ },
+ "splitPdf": {
+ "description": "Specifieke pagina's uit een PDF-document extraheren.",
+ "extractingPages": "Pagina's extraheren",
+ "inputTitle": "PDF-invoer",
+ "pageExtractionPreview": "{{count}} pagina{{count !== 1 ? 's' : ''}} zal worden geëxtraheerd",
+ "pageRangesDescription": "Voer paginanummers of bereiken in, gescheiden door komma's (bijv. 1, 3, 5-7)",
+ "pageRangesPlaceholder": "bijv. 1,5-8",
+ "pageSelection": "Paginaselectie",
+ "pdfPageCount": "PDF heeft {{count}} pagina{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "Geëxtraheerde PDF",
+ "shortDescription": "Specifieke pagina's uit een PDF-bestand extraheren",
+ "title": "PDF splitsen",
+ "toolInfo": {
+ "description": "Met deze tool kunt u specifieke pagina's uit een PDF-document extraheren. U kunt specifieke pagina's of paginareeksen opgeven die u wilt extraheren.",
+ "title": "PDF splitsen"
+ }
+ }
+}
diff --git a/public/locales/nl/string.json b/public/locales/nl/string.json
new file mode 100644
index 0000000..5864ea2
--- /dev/null
+++ b/public/locales/nl/string.json
@@ -0,0 +1,261 @@
+{
+ "base64": {
+ "decode": "Base64-decodering",
+ "description": "Codeer of decodeer tekst met Base64-codering.",
+ "encode": "Base64-codering",
+ "inputTitle": "Invoergegevens",
+ "optionsTitle": "Base64-opties",
+ "resultTitle": "Resultaat",
+ "shortDescription": "Codeer of decodeer gegevens met Base64.",
+ "title": "Base64-encoder/-decoder",
+ "toolInfo": {
+ "description": "Base64 is een coderingsmethode die gegevens in een ASCII-stringformaat weergeeft door ze te vertalen naar een radix-64-representatie. Hoewel het gebruikt kan worden om strings te coderen, wordt het vaak gebruikt om binaire gegevens te coderen voor transmissie via media die ontworpen zijn voor tekstuele gegevens.",
+ "title": "Wat is Base64?"
+ }
+ },
+ "censor": {
+ "description": "Hulpprogramma voor het censureren van woorden in tekst. Laad uw tekst in het invoerformulier aan de linkerkant, specificeer alle ongewenste woorden in de opties en u krijgt direct gecensureerde tekst in het uitvoergebied.\", longDescription: 'Met deze online tool kunt u bepaalde woorden in elke tekst censureren. U kunt een lijst met ongewenste woorden (zoals scheldwoorden of geheime woorden) opgeven en het programma vervangt deze door alternatieve woorden en creëert een veilig leesbare tekst. De woorden kunnen worden opgegeven in een tekstveld van meerdere regels in de opties door één woord per regel in te voeren.', keywords: ['tekst', 'censureren', 'woorden', 'tekens'], component: lazy(() => import('./index')), i18n: { name: 'string:censor.title', description: 'string:censor.description",
+ "shortDescription": "Maskeer snel slechte woorden of vervang ze door alternatieve woorden.",
+ "title": "Tekstcensor"
+ },
+ "createPalindrome": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde tool voor het maken van palindromen van elke tekst. Voer tekst in en transformeer deze direct in een palindroom die zowel van voor naar achter als van achter naar voren hetzelfde leest. Perfect voor woordspelletjes, het creëren van symmetrische tekstpatronen of het verkennen van taalkundige curiosa.",
+ "shortDescription": "Maak een tekst die van voor naar achter en van achter naar voren hetzelfde leest",
+ "title": "Palindroom maken"
+ },
+ "extractSubstring": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het extraheren van substrings uit tekst. Voer uw tekst in en specificeer de begin- en eindposities om het gewenste deel te extraheren. Perfect voor gegevensverwerking, tekstanalyse of het extraheren van specifieke inhoud uit grotere tekstblokken.",
+ "shortDescription": "Een tekstgedeelte tussen opgegeven posities extraheren",
+ "title": "Substring extraheren"
+ },
+ "join": {
+ "blankLinesAndTrailingSpaces": "Lege regels en spaties aan het einde",
+ "deleteBlankDescription": "Verwijder regels die geen tekstsymbolen bevatten.",
+ "deleteBlankTitle": "Lege regels verwijderen",
+ "deleteTrailingDescription": "Verwijder spaties en tabs aan het einde van de regels.",
+ "deleteTrailingTitle": "Verwijder afsluitende spaties",
+ "description": "Voeg tekststukken samen met aanpasbare scheidingstekens.",
+ "inputTitle": "Tekststukken",
+ "joinCharacterDescription": "Symbool dat gebroken tekststukken met elkaar verbindt. (Standaard spatie.)",
+ "joinCharacterPlaceholder": "Sluit je aan bij het personage",
+ "resultTitle": "Gekoppelde tekst",
+ "shortDescription": "Tekstelementen samenvoegen met een opgegeven scheidingsteken",
+ "textMergedOptions": "Opties voor samengevoegde tekst",
+ "title": "Tekst toevoegen",
+ "toolInfo": {
+ "description": "Met deze tool kun je tekstdelen samenvoegen. Het neemt een lijst met tekstwaarden, gescheiden door nieuwe regels, en voegt deze samen. Je kunt het teken instellen dat tussen de delen van de samengevoegde tekst wordt geplaatst. Je kunt ook alle lege regels negeren en spaties en tabs aan het einde van alle regels verwijderen. Tekstabulous!",
+ "title": "Wat is een tekstsamenvoeger?"
+ }
+ },
+ "palindrome": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma om te controleren of tekst een palindroom is. Controleer direct of uw tekst van voor naar achter hetzelfde leest. Perfect voor woordpuzzels, taalkundige analyses of het valideren van symmetrische tekstpatronen. Ondersteunt diverse scheidingstekens en palindroomdetectie van meerdere woorden.",
+ "shortDescription": "Controleren of de tekst van voor naar achter hetzelfde leest",
+ "title": "Palindroom"
+ },
+ "passwordGenerator": {
+ "avoidAmbiguous": "Vermijd dubbelzinnige tekens (i, I, l, 0, O)",
+ "description": "Genereer veilige, willekeurige wachtwoorden met aanpasbare lengte en tekentypes. Kies uit kleine letters, hoofdletters, cijfers en speciale tekens. Optie om dubbelzinnige tekens te vermijden voor een betere leesbaarheid.",
+ "includeLowercase": "Gebruik kleine letters (a-z)",
+ "includeNumbers": "Inclusief cijfers (0-9)",
+ "includeSymbols": "Speciale tekens toevoegen",
+ "includeUppercase": "Inclusief hoofdletters (A-Z)",
+ "lengthDesc": "Lengte van het wachtwoord",
+ "lengthPlaceholder": "bijv. 12",
+ "optionsTitle": "Wachtwoordopties",
+ "resultTitle": "gegenereerd wachtwoord",
+ "shortDescription": "Genereer veilige willekeurige wachtwoorden met aangepaste opties",
+ "title": "Wachtwoordgenerator",
+ "toolInfo": {
+ "description": "Deze tool genereert veilige, willekeurige wachtwoorden op basis van de door u geselecteerde criteria. U kunt de lengte aanpassen, verschillende tekentypen toevoegen of uitsluiten en dubbelzinnige tekens vermijden voor een betere leesbaarheid. Perfect voor het maken van sterke wachtwoorden voor accounts, applicaties of andere beveiligingsbehoeften.",
+ "title": "Over wachtwoordgenerator"
+ }
+ },
+ "quote": {
+ "allowDoubleQuotation": "Dubbele aanhalingstekens toestaan",
+ "description": "Voeg aanhalingstekens toe rondom de tekst met aanpasbare opties.",
+ "inputTitle": "Invoertekst",
+ "leftQuoteDescription": "Linker aanhalingsteken(s)",
+ "processAsMultiLine": "Verwerken als meerregelige tekst",
+ "quoteEmptyLines": "Lege regels citeren",
+ "quoteOptions": "Offerte-opties",
+ "resultTitle": "Geciteerde tekst",
+ "rightQuoteDescription": "Rechter aanhalingsteken(s)",
+ "shortDescription": "Voeg aanhalingstekens toe rond tekst met verschillende stijlen",
+ "title": "Tekstcitaat",
+ "toolInfo": {
+ "description": "Met deze tool kun je aanhalingstekens rond tekst plaatsen. Je kunt verschillende aanhalingstekens kiezen, tekst van meerdere regels verwerken en bepalen hoe lege regels worden verwerkt. Het is handig om tekst voor te bereiden voor programmering, gegevens op te maken of gestileerde tekst te maken.",
+ "title": "Tekstcitaat"
+ }
+ },
+ "randomizeCase": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het willekeurig maken van teksthoofdletters en kleine letters. Voer je tekst in en transformeer deze direct met willekeurige hoofdletters en kleine letters. Perfect voor het creëren van unieke teksteffecten, het testen van hoofdlettergevoeligheid of het genereren van gevarieerde tekstpatronen.",
+ "shortDescription": "Willekeurige hoofdlettergebruik in tekst",
+ "title": "Randomiseer het geval"
+ },
+ "removeDuplicateLines": {
+ "description": "Laad je tekst in het invoerformulier aan de linkerkant en je krijgt direct tekst zonder dubbele regels in het uitvoergebied. Krachtig, gratis en snel. Laad tekstregels – krijg unieke tekstregels.",
+ "shortDescription": "Verwijder snel alle herhaalde regels uit de tekst",
+ "title": "Dubbele regels verwijderen"
+ },
+ "repeat": {
+ "delimiterDescription": "Scheidingsteken voor uitvoerkopieën.",
+ "delimiterPlaceholder": "scheidingsteken",
+ "description": "Herhaal tekst meerdere keren met aanpasbare scheidingstekens.",
+ "inputTitle": "Invoertekst",
+ "numberPlaceholder": "Nummer",
+ "repeatAmountDescription": "Aantal herhalingen.",
+ "repetitionsDelimiter": "Herhalingen scheidingsteken",
+ "resultTitle": "Herhaalde tekst",
+ "shortDescription": "Herhaal de tekst meerdere keren",
+ "textRepetitions": "Tekstherhalingen",
+ "title": "Herhaal tekst",
+ "toolInfo": {
+ "description": "Met deze tool kunt u een bepaalde tekst meerdere keren herhalen met een optionele scheidingsteken.",
+ "title": "Herhaal tekst"
+ }
+ },
+ "reverse": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het omkeren van tekst. Voer tekst in en laat deze direct omkeren, teken voor teken. Perfect voor het maken van spiegeltekst, het analyseren van palindromen of het experimenteren met tekstpatronen. Spaties en speciale tekens blijven behouden tijdens het omkeren.",
+ "inputTitle": "Omgekeerde tekst",
+ "processMultiLine": "Verwerk meerregelige tekst",
+ "processMultiLineDescription": "Elke regel wordt onafhankelijk omgedraaid",
+ "resultTitle": "Omgekeerde tekst",
+ "reversalOptions": "Omkeeropties",
+ "shortDescription": "Elke tekst teken voor teken omdraaien",
+ "skipEmptyLines": "Lege regels overslaan",
+ "skipEmptyLinesDescription": "Lege regels worden uit de uitvoer verwijderd",
+ "title": "Achteruit",
+ "trimWhitespace": "Witruimte bijsnijden",
+ "trimWhitespaceDescription": "Verwijder voorloop- en volgspaties van elke regel"
+ },
+ "rot13": {
+ "description": "Codeer of decodeer tekst met behulp van de ROT13-codering.",
+ "inputTitle": "Invoertekst",
+ "resultTitle": "ROT13-resultaat",
+ "shortDescription": "Codeer of decodeer tekst met behulp van de ROT13-codering.",
+ "title": "ROT13 Encoder/Decoder",
+ "toolInfo": {
+ "description": "ROT13 (rotate by 13 places) is een eenvoudige lettervervangingscode die een letter vervangt door de 13e letter erna in het alfabet. ROT13 is een speciaal geval van de Caesarcode, die in het oude Rome werd ontwikkeld. Omdat het Engelse alfabet 26 letters telt, is ROT13 zijn eigen inverse; dat wil zeggen, om ROT13 ongedaan te maken, wordt hetzelfde algoritme toegepast, zodat dezelfde actie kan worden gebruikt voor zowel coderen als decoderen.",
+ "title": "Wat is ROT13?"
+ }
+ },
+ "rotate": {
+ "description": "Draai tekens in tekst over opgegeven posities.",
+ "inputTitle": "Invoertekst",
+ "processAsMultiLine": "Verwerken als meerregelige tekst (elke regel afzonderlijk roteren)",
+ "resultTitle": "Gedraaide tekst",
+ "rotateLeft": "Linksom draaien",
+ "rotateRight": "Rechts draaien",
+ "rotationOptions": "Rotatieopties",
+ "shortDescription": "Verplaats tekens in tekst per positie.",
+ "stepDescription": "Aantal te roteren posities",
+ "title": "Tekst roteren",
+ "toolInfo": {
+ "description": "Met deze tool kunt u tekens in een tekenreeks met een bepaald aantal posities roteren. U kunt naar links of rechts roteren en tekst van meerdere regels verwerken door elke regel afzonderlijk te roteren. Tekenreeksrotatie is handig voor eenvoudige teksttransformaties, het maken van patronen of het implementeren van basisversleutelingstechnieken.",
+ "title": "Snaarrotatie"
+ }
+ },
+ "split": {
+ "charAfterChunkDescription": "Karakter na elk stukje",
+ "charBeforeChunkDescription": "Karakter voor elk stukje",
+ "chunksDescription": "Aantal gelijke\nlengtes in de uitvoer.",
+ "chunksTitle": "Gebruik een aantal stukken",
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het splitsen van tekst. Voer uw tekst in en geef een scheidingsteken op om deze in meerdere delen te splitsen. Perfect voor gegevensverwerking, tekstmanipulatie of het extraheren van specifieke inhoud uit grotere tekstblokken.",
+ "lengthDescription": "Aantal symbolen dat in elk uitvoerblok wordt geplaatst.",
+ "lengthTitle": "Gebruik lengte voor splitsen",
+ "outputSeparatorDescription": "Teken dat tussen de gesplitste delen wordt geplaatst.\n(Standaard is dit een nieuwe regel \"\\n\".)",
+ "outputSeparatorOptions": "Opties voor uitvoerscheidingstekens",
+ "regexDescription": "Reguliere expressie die wordt gebruikt om tekst in stukken te splitsen.\n(Standaard meerdere spaties.)",
+ "regexTitle": "Gebruik een Regex voor het splitsen",
+ "resultTitle": "Tekststukken",
+ "shortDescription": "Tekst in meerdere delen splitsen met behulp van een scheidingsteken",
+ "splitSeparatorOptions": "Opties voor scheidingslijnen",
+ "symbolDescription": "Teken dat wordt gebruikt om tekst in stukken te splitsen.\n(Standaard spatie.)",
+ "symbolTitle": "Gebruik een symbool voor splitsen",
+ "title": "Split"
+ },
+ "statistic": {
+ "characterFrequencyAnalysis": "Karakterfrequentieanalyse",
+ "characterFrequencyAnalysisDescription": "Tel hoe vaak elk teken in de tekst voorkomt",
+ "delimitersOptions": "Opties voor scheidingstekens",
+ "description": "Analyseer tekst en genereer uitgebreide statistieken.",
+ "includeEmptyLines": "Lege regels toevoegen",
+ "includeEmptyLinesDescription": "Voeg lege regels toe bij het tellen van regels",
+ "inputTitle": "Invoertekst",
+ "resultTitle": "Tekststatistieken",
+ "sentenceDelimitersDescription": "Voer aangepaste tekens in die u wilt gebruiken om zinnen in uw taal af te bakenen (gescheiden door komma's) of laat dit veld leeg voor de standaardinstelling.",
+ "sentenceDelimitersPlaceholder": "bijv. ., !, ?, ...",
+ "shortDescription": "Ontvang statistieken over uw tekst",
+ "statisticsOptions": "Statistiekenopties",
+ "title": "Tekststatistieken",
+ "toolInfo": {
+ "description": "Met deze tool kunt u tekst analyseren en uitgebreide statistieken genereren, waaronder het aantal tekens, woorden, regels en de frequentieanalyse van tekens en woorden.",
+ "title": "Wat is een {{title}}?"
+ },
+ "wordDelimitersDescription": "Voer een aangepaste Regex in om het aantal woorden te tellen of laat dit leeg voor de standaardwaarde.",
+ "wordDelimitersPlaceholder": "bijv. \\s.,;:!?\"«»()…",
+ "wordFrequencyAnalysis": "Woordfrequentieanalyse",
+ "wordFrequencyAnalysisDescription": "Tel hoe vaak elk woord in de tekst voorkomt"
+ },
+ "textReplacer": {
+ "description": "Vervang tekstpatronen door nieuwe inhoud.",
+ "findPatternInText": "Vind dit patroon in de tekst",
+ "findPatternUsingRegexp": "Vind een patroon met behulp van een RegExp",
+ "inputTitle": "Te vervangen tekst",
+ "newTextPlaceholder": "Nieuwe tekst",
+ "regexpDescription": "Voer de reguliere expressie in die u wilt vervangen.",
+ "replacePatternDescription": "Voer het patroon in dat u voor de vervanging wilt gebruiken.",
+ "replaceText": "Tekst vervangen",
+ "resultTitle": "Tekst met vervangingen",
+ "searchPatternDescription": "Voer het tekstpatroon in dat u wilt vervangen.",
+ "searchText": "Zoektekst",
+ "shortDescription": "Vervang snel tekst in uw inhoud",
+ "title": "Tekstvervanger",
+ "toolInfo": {
+ "description": "Vervang eenvoudig specifieke tekst in je content met deze eenvoudige, browsergebaseerde tool. Voer je tekst in, stel de tekst die je wilt vervangen en de vervangingswaarde in, en ontvang direct de bijgewerkte versie.",
+ "title": "Tekstvervanger"
+ }
+ },
+ "toMorse": {
+ "dashSymbolDescription": "Symbool dat overeenkomt met het streepje in Morsecode.",
+ "description": "Converteer tekst naar morsecode.",
+ "dotSymbolDescription": "Symbool dat overeenkomt met het punt in Morsecode.",
+ "longSignal": "Lang signaal",
+ "resultTitle": "Morsecode",
+ "shortDescription": "Snel tekst naar morse coderen",
+ "shortSignal": "Kort signaal",
+ "title": "String naar morse"
+ },
+ "truncate": {
+ "addTruncationIndicator": "Voeg afkappingsindicator toe",
+ "charactersPlaceholder": "Personages",
+ "description": "Kort de tekst in tot een bepaalde lengte.",
+ "indicatorDescription": "Tekens die aan het einde (of begin) van de tekst moeten worden toegevoegd. Let op: deze tellen mee voor de lengte.",
+ "inputTitle": "Invoertekst",
+ "leftSideDescription": "Verwijder tekens aan het begin van de tekst.",
+ "leftSideTruncation": "Linkerkant afkapping",
+ "lengthAndLines": "Lengte en lijnen",
+ "lineByLineDescription": "Knip elke regel afzonderlijk af.",
+ "lineByLineTruncating": "Regel-voor-regel afkappen",
+ "maxLengthDescription": "Aantal tekens dat in de tekst moet worden overgelaten.",
+ "numberPlaceholder": "Nummer",
+ "resultTitle": "Afgekorte tekst",
+ "rightSideDescription": "Verwijder tekens aan het einde van de tekst.",
+ "rightSideTruncation": "Afkapping aan de rechterkant",
+ "shortDescription": "Tekst afkappen tot een bepaalde lengte",
+ "suffixAndAffix": "Achtervoegsel en affix",
+ "title": "Tekst afbreken",
+ "toolInfo": {
+ "description": "Vul uw tekst in het invoerformulier aan de linkerkant in, dan krijgt u rechts automatisch afgekapte tekst te zien.",
+ "title": "Tekst afkappen"
+ },
+ "truncationSide": "Afkappingszijde"
+ },
+ "uppercase": {
+ "description": "Converteer tekst naar hoofdletters.",
+ "inputTitle": "Invoertekst",
+ "resultTitle": "Hoofdlettertekst",
+ "shortDescription": "Tekst naar hoofdletters converteren",
+ "title": "Omzetten naar hoofdletters"
+ }
+}
diff --git a/public/locales/nl/time.json b/public/locales/nl/time.json
new file mode 100644
index 0000000..e0f423b
--- /dev/null
+++ b/public/locales/nl/time.json
@@ -0,0 +1,100 @@
+{
+ "checkLeapYears": {
+ "description": "Controleer of een jaar een schrikkeljaar is en ontvang informatie over schrikkeljaren.",
+ "inputTitle": "Invoerjaar",
+ "resultTitle": "Resultaat van een schrikkeljaar",
+ "shortDescription": "Controleren of een jaar een schrikkeljaar is",
+ "title": "Controleer schrikkeljaren",
+ "toolInfo": {
+ "description": "Een schrikkeljaar is een jaar met een extra dag (29 februari) om het kalenderjaar gelijk te laten lopen met het astronomische jaar. Schrikkeljaren komen elke vier jaar voor, behalve jaren die deelbaar zijn door 100 maar niet door 400.",
+ "title": "Wat is een schrikkeljaar?"
+ }
+ },
+ "convertDaysToHours": {
+ "addHoursName": "Urennaam toevoegen",
+ "addHoursNameDescription": "Voeg de tekenreeks uren toe aan de uitvoerwaarden",
+ "description": "Converteer dagen naar uren met aanpasbare opties.",
+ "hoursName": "Uren Naam",
+ "shortDescription": "Dagen naar uren omrekenen",
+ "title": "Dagen naar uren converteren",
+ "toolInfo": {
+ "description": "Met deze tool kunt u dagen naar uren omrekenen. U kunt dagen invoeren als getallen of met eenheden, waarna de tool ze naar uren converteert. U kunt er ook voor kiezen om het achtervoegsel 'uren' aan de uitvoerwaarden toe te voegen.",
+ "title": "Dagen naar uren converteren"
+ }
+ },
+ "convertHoursToDays": {
+ "addDaysName": "Dagennaam toevoegen",
+ "addDaysNameDescription": "Voeg de tekenreeks dagen toe aan de uitvoerwaarden",
+ "daysName": "Dagen Naam",
+ "description": "Converteer uren naar dagen met aanpasbare opties.",
+ "shortDescription": "Uren naar dagen omrekenen",
+ "title": "Uren naar dagen omrekenen",
+ "toolInfo": {
+ "description": "Met deze tool kunt u uren naar dagen omrekenen. U kunt uren invoeren als getallen of met eenheden, waarna de tool ze naar dagen converteert. U kunt er ook voor kiezen om het achtervoegsel 'dagen' aan de uitvoerwaarden toe te voegen.",
+ "title": "Uren naar dagen omrekenen"
+ }
+ },
+ "convertSecondsToTime": {
+ "addPadding": "Opvulling toevoegen",
+ "addPaddingDescription": "Voeg nulvulling toe aan uren, minuten en seconden.",
+ "description": "Converteer seconden naar een leesbaar tijdsformaat (uren:minuten:seconden). Voer het aantal seconden in om de tijd in het juiste formaat te krijgen.",
+ "shortDescription": "Seconden naar tijdformaat converteren",
+ "timePadding": "Tijdvulling",
+ "title": "Seconden naar tijd converteren",
+ "toolInfo": {
+ "title": "Wat is een {{title}}?"
+ }
+ },
+ "convertTimeToSeconds": {
+ "description": "Converteer de geformatteerde tijd (UU:MM:SS) naar seconden.",
+ "inputTitle": "Invoertijd",
+ "resultTitle": "Seconden",
+ "shortDescription": "Tijdformaat naar seconden converteren",
+ "title": "Tijd naar seconden converteren",
+ "toolInfo": {
+ "description": "Met deze tool kun je geformatteerde tijdreeksen (UU:MM:SS) omzetten naar seconden. Dit is handig voor het berekenen van tijdsduren en tijdsintervallen.",
+ "title": "Tijd naar seconden converteren"
+ }
+ },
+ "crontabGuru": {
+ "description": "Genereer en begrijp cron-expressies. Maak cron-schema's voor geautomatiseerde taken en systeemtaken.",
+ "shortDescription": "Genereer en begrijp cron-expressies",
+ "title": "Crontab-goeroe"
+ },
+ "timeBetweenDates": {
+ "description": "Bereken het tijdsverschil tussen twee datums. Bereken de exacte duur in dagen, uren, minuten en seconden.",
+ "endDate": "Einddatum",
+ "endDateTime": "Einddatum en -tijd",
+ "endTime": "Eindtijd",
+ "endTimezone": "Eindtijdzone",
+ "shortDescription": "Bereken de tijd tussen twee data",
+ "startDate": "Startdatum",
+ "startDateTime": "Startdatum en -tijd",
+ "startTime": "Starttijd",
+ "startTimezone": "Starttijdzone",
+ "title": "Tijd tussen data",
+ "toolInfo": {
+ "description": "Bereken het exacte tijdsverschil tussen twee datums en tijden, met ondersteuning voor verschillende tijdzones. Deze tool biedt een gedetailleerde weergave van het tijdsverschil in verschillende eenheden (jaren, maanden, dagen, uren, minuten en seconden).",
+ "title": "Tijd tussen datums calculator"
+ }
+ },
+ "truncateClockTime": {
+ "description": "Kort de kloktijd in om seconden of minuten te verwijderen. Rond de tijd af naar het dichtstbijzijnde uur, minuut of aangepaste interval.",
+ "printDroppedComponents": "Afdrukken van verwijderde componenten",
+ "shortDescription": "De kloktijd afkappen tot de opgegeven precisie",
+ "timePadding": "Tijdvulling",
+ "title": "Kloktijd afkappen",
+ "toolInfo": {
+ "title": "Wat is een {{title}}?"
+ },
+ "truncateMinutesAndSeconds": "Minuten en seconden afkappen",
+ "truncateMinutesAndSecondsDescription": "Laat beide componenten – de minuten en seconden – van elke kloktijd weg.",
+ "truncateOnlySeconds": "Alleen seconden afkappen",
+ "truncateOnlySecondsDescription": "Verwijder het secondecomponent van elke kloktijd.",
+ "truncationSide": "Afkappingszijde",
+ "useZeroPadding": "Gebruik nulvulling",
+ "zeroPaddingDescription": "Zorg ervoor dat alle tijdcomponenten altijd twee cijfers breed zijn.",
+ "zeroPrintDescription": "Geef de verwijderde onderdelen weer als nulwaarden \"00\".",
+ "zeroPrintTruncatedParts": "Afgekapte onderdelen zonder afdrukken"
+ }
+}
diff --git a/public/locales/nl/translation.json b/public/locales/nl/translation.json
new file mode 100644
index 0000000..6e463d5
--- /dev/null
+++ b/public/locales/nl/translation.json
@@ -0,0 +1,250 @@
+{
+ "audio": {
+ "changeSpeed": {
+ "description": "Wijzig de afspeelsnelheid van audiobestanden. Versnel of vertraag audio met behoud van toonhoogte.",
+ "name": "Wijzig audiosnelheid",
+ "shortDescription": "De snelheid van audiobestanden wijzigen"
+ },
+ "extractAudio": {
+ "description": "Haal het audiospoor uit een videobestand en sla het op als een afzonderlijk audiobestand in het door u gekozen formaat (AAC, MP3, WAV).",
+ "name": "Audio extraheren",
+ "shortDescription": "Extraheer audio uit videobestanden (MP4, MOV, enz.) naar AAC, MP3 of WAV."
+ }
+ },
+ "baseFileInput": {
+ "copyFailed": "Kopiëren mislukt: {{error}}",
+ "dropFileHere": "Laat je vallen {{type}} hier",
+ "fileCopied": "Bestand gekopieerd",
+ "selectFileDescription": "Klik hier om een te selecteren {{type}} Druk vanaf uw apparaat op Ctrl+V om een {{type}} vanaf uw klembord, of sleep en zet een bestand neer vanaf uw bureaublad"
+ },
+ "categories": {
+ "audio": {
+ "description": "Hulpmiddelen voor het werken met audio: audio uit video extraheren, de audiosnelheid aanpassen, meerdere audiobestanden samenvoegen en nog veel meer.",
+ "title": "Audio-hulpmiddelen"
+ },
+ "csv": {
+ "description": "Hulpmiddelen voor het werken met CSV-bestanden: converteer CSV naar verschillende formaten, manipuleer CSV-gegevens, valideer de CSV-structuur en verwerk CSV-bestanden efficiënt.",
+ "title": "CSV-hulpmiddelen"
+ },
+ "gif": {
+ "description": "Hulpmiddelen voor het werken met GIF-animaties: maak transparante GIF's, extraheer GIF-frames, voeg tekst toe aan GIF, snijd GIF's bij, draai ze, draai ze om en nog veel meer.",
+ "title": "GIF-hulpmiddelen"
+ },
+ "image-generic": {
+ "description": "Hulpmiddelen voor het werken met afbeeldingen: comprimeren, formaat wijzigen, bijsnijden, converteren naar JPG, roteren, achtergrond verwijderen en nog veel meer.",
+ "title": "Afbeeldingshulpmiddelen"
+ },
+ "json": {
+ "description": "Hulpmiddelen voor het werken met JSON-datastructuren: JSON-objecten mooier maken en verkleinen, JSON-arrays afvlakken, JSON-waarden stringen, gegevens analyseren en nog veel meer",
+ "title": "JSON-hulpmiddelen"
+ },
+ "list": {
+ "description": "Hulpmiddelen voor het werken met lijsten: lijsten sorteren, omkeren, willekeurig maken, unieke en dubbele listitems vinden, listitemscheidingstekens wijzigen en nog veel meer.",
+ "title": "Lijsthulpmiddelen"
+ },
+ "number": {
+ "description": "Hulpmiddelen voor het werken met getallen: genereer getallenreeksen, converteer getallen naar woorden en woorden naar getallen, sorteer, rond af, ontbind getallen en nog veel meer.",
+ "title": "Getallenhulpmiddelen"
+ },
+ "pdf": {
+ "description": "Hulpmiddelen voor het werken met PDF-bestanden: tekst uit PDF's extraheren, PDF's naar andere formaten converteren, PDF's bewerken en nog veel meer.",
+ "title": "PDF-hulpmiddelen"
+ },
+ "png": {
+ "description": "Hulpmiddelen voor het werken met PNG-afbeeldingen: converteer PNG's naar JPG's, maak transparante PNG's, wijzig PNG-kleuren, snijd PNG's bij, roteer ze, wijzig de grootte ervan en nog veel meer.",
+ "title": "PNG-hulpmiddelen"
+ },
+ "seeAll": "Bekijk alles {{title}}",
+ "string": {
+ "description": "Hulpmiddelen voor het werken met tekst: tekst naar afbeeldingen converteren, tekst zoeken en vervangen, tekst in fragmenten splitsen, tekstregels samenvoegen, tekst herhalen en nog veel meer.",
+ "title": "Teksthulpmiddelen"
+ },
+ "time": {
+ "description": "Hulpmiddelen voor het werken met tijd en datum: bereken tijdsverschillen, converteer tussen tijdzones, formatteer datums, genereer datumreeksen en nog veel meer.",
+ "title": "Tijdhulpmiddelen"
+ },
+ "try": "Poging {{title}}",
+ "video": {
+ "description": "Hulpmiddelen voor het werken met video's: frames uit video's halen, GIF's van video's maken, video's naar verschillende formaten converteren en nog veel meer.",
+ "title": "Videotools"
+ },
+ "xml": {
+ "description": "Hulpmiddelen voor het werken met XML-datastructuren - viewer, beautifier, validator en nog veel meer",
+ "title": "XML-hulpmiddelen"
+ }
+ },
+ "csv": {
+ "findIncompleteCsvRecords": {
+ "description": "Upload uw CSV-bestand via onderstaand formulier en deze tool controleert automatisch of er geen waarden in de rijen of kolommen ontbreken. In de toolopties kunt u de opmaak van het invoerbestand aanpassen (het scheidingsteken, de aanhalingstekens en het commentaarteken opgeven). Daarnaast kunt u de controle op lege waarden inschakelen, lege regels overslaan en een limiet instellen voor het aantal foutmeldingen in de uitvoer.",
+ "name": "Onvolledige CSV-records vinden",
+ "shortDescription": "Vind snel rijen en kolommen in CSV waar waarden ontbreken."
+ }
+ },
+ "hero": {
+ "brand": "OmniTools",
+ "description": "Verhoog je productiviteit met OmniTools, de ultieme toolkit om snel aan de slag te gaan! Krijg toegang tot duizenden gebruiksvriendelijke tools voor het bewerken van afbeeldingen, tekst, lijsten en gegevens, allemaal rechtstreeks vanuit je browser.",
+ "examples": {
+ "calculateNumberSum": "Bereken de getallensom",
+ "changeGifSpeed": "GIF-snelheid wijzigen",
+ "compressPng": "PNG comprimeren",
+ "createTransparentImage": "Een transparante afbeelding maken",
+ "prettifyJson": "JSON verfraaien",
+ "sortList": "Een lijst sorteren",
+ "splitPdf": "PDF splitsen",
+ "splitText": "Een tekst splitsen",
+ "trimVideo": "Video bijsnijden"
+ },
+ "searchPlaceholder": "Zoek in alle tools",
+ "title": "Krijg dingen snel gedaan met"
+ },
+ "inputFooter": {
+ "clear": "Duidelijk",
+ "copyToClipboard": "Kopiëren naar klembord",
+ "importFromFile": "Importeren uit bestand"
+ },
+ "list": {
+ "group": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het groeperen van lijstitems. Voer uw lijst in en specificeer groeperingscriteria om items in logische groepen te ordenen. Perfect voor het categoriseren van gegevens, het organiseren van informatie of het maken van gestructureerde lijsten. Ondersteunt aangepaste scheidingstekens en diverse groeperingsopties.",
+ "name": "Groep",
+ "shortDescription": "Groepeer lijstitems op basis van gemeenschappelijke eigenschappen"
+ },
+ "reverse": {
+ "description": "Dit is een supereenvoudige browsergebaseerde applicatie die alle items in de lijst in spiegelbeeld afdrukt. De invoeritems kunnen worden gescheiden door een willekeurig symbool en u kunt ook de scheidingstekens van de omgekeerde items in de lijst wijzigen.",
+ "name": "Achteruit",
+ "shortDescription": "Snel een lijst omkeren"
+ },
+ "sort": {
+ "description": "Dit is een supereenvoudige browsergebaseerde applicatie die items in een lijst sorteert en in oplopende of aflopende volgorde rangschikt. U kunt de items alfabetisch, numeriek of op lengte sorteren. U kunt ook dubbele en lege items verwijderen, en afzonderlijke items met witruimte eromheen verwijderen. U kunt elk scheidingsteken gebruiken om de items in de invoerlijst te scheiden, of u kunt een reguliere expressie gebruiken om ze te scheiden. Daarnaast kunt u een nieuw scheidingsteken maken voor de gesorteerde uitvoerlijst.",
+ "name": "Soort",
+ "shortDescription": "Snel een lijst sorteren"
+ }
+ },
+ "navbar": {
+ "buyMeACoffee": "Koop me een koffie",
+ "home": "Thuis",
+ "tools": "Hulpmiddelen"
+ },
+ "number": {
+ "generate": {
+ "description": "Bereken snel een lijst met gehele getallen in uw browser. Om uw lijst te verkrijgen, specificeert u het eerste gehele getal, wijzigt u de waarde en het totale aantal in de onderstaande opties, en deze tool genereert dat aantal gehele getallen.",
+ "name": "Genereer getallen",
+ "shortDescription": "Bereken snel een lijst met gehele getallen in uw browser"
+ },
+ "sum": {
+ "description": "Dit is een supereenvoudige browserapplicatie die getallen optelt. De ingevoerde getallen kunnen worden gescheiden door een willekeurig symbool en je kunt ook het scheidingsteken van de opgetelde getallen wijzigen.",
+ "name": "Som getallen",
+ "shortDescription": "Snel een lijst met getallen optellen"
+ }
+ },
+ "numericInputWithUnit": {
+ "unit": "Eenheid"
+ },
+ "pdf": {
+ "compressPdf": {
+ "description": "Verklein de PDF-bestandsgrootte met behoud van kwaliteit met Ghostscript",
+ "name": "PDF comprimeren",
+ "shortDescription": "Comprimeer PDF-bestanden veilig in uw browser"
+ },
+ "mergePdf": {
+ "description": "Combineer meerdere PDF-bestanden tot één document.",
+ "name": "PDF samenvoegen",
+ "shortDescription": "Meerdere PDF-bestanden samenvoegen tot één document"
+ },
+ "pdfToEpub": {
+ "description": "Transformeer PDF-documenten naar EPUB-bestanden voor betere compatibiliteit met e-readers.",
+ "name": "PDF naar EPUB",
+ "shortDescription": "PDF-bestanden converteren naar EPUB-formaat"
+ },
+ "protectPdf": {
+ "description": "Voeg wachtwoordbeveiliging toe aan uw PDF-bestanden veilig in uw browser",
+ "name": "PDF beschermen",
+ "shortDescription": "PDF-bestanden veilig met een wachtwoord beveiligen"
+ },
+ "splitPdf": {
+ "description": "Specifieke pagina's uit een PDF-bestand extraheren met behulp van paginanummers of bereiken (bijv. 1, 5-8)",
+ "name": "PDF splitsen",
+ "shortDescription": "Specifieke pagina's uit een PDF-bestand extraheren"
+ }
+ },
+ "resultFooter": {
+ "copy": "Kopiëren naar klembord",
+ "download": "Download"
+ },
+ "string": {
+ "createPalindrome": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde tool voor het maken van palindromen van elke tekst. Voer tekst in en transformeer deze direct in een palindroom die zowel van voor naar achter als van achter naar voren hetzelfde leest. Perfect voor woordspelletjes, het creëren van symmetrische tekstpatronen of het verkennen van taalkundige curiosa.",
+ "name": "Palindroom maken",
+ "shortDescription": "Maak een tekst die van voor naar achter en van achter naar voren hetzelfde leest"
+ },
+ "palindrome": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma om te controleren of tekst een palindroom is. Controleer direct of uw tekst van voor naar achteren hetzelfde leest. Perfect voor woordpuzzels, taalkundige analyses of het valideren van symmetrische tekstpatronen. Ondersteunt diverse scheidingstekens en palindroomdetectie van meerdere woorden.",
+ "name": "Palindroom",
+ "shortDescription": "Controleren of de tekst van voor naar achter hetzelfde leest"
+ },
+ "repeat": {
+ "description": "Met deze tool kunt u een bepaalde tekst meerdere keren herhalen met een optionele scheidingsteken.",
+ "name": "Herhaal tekst",
+ "shortDescription": "Herhaal de tekst meerdere keren"
+ },
+ "reverse": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het omkeren van tekst. Voer tekst in en laat deze direct omkeren, teken voor teken. Perfect voor het maken van spiegeltekst, het analyseren van palindromen of het experimenteren met tekstpatronen. Spaties en speciale tekens blijven behouden tijdens het omkeren.",
+ "name": "Achteruit",
+ "shortDescription": "Elke tekst teken voor teken omdraaien"
+ },
+ "toMorse": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het converteren van tekst naar morsecode. Laad uw tekst in het invoerveld aan de linkerkant en u krijgt direct morsecode in het uitvoergebied. Krachtig, gratis en snel. Laad tekst – ontvang morsecode.",
+ "name": "String naar morse",
+ "shortDescription": "Snel tekst naar morse coderen"
+ },
+ "uppercase": {
+ "description": "'s Werelds eenvoudigste browsergebaseerde hulpprogramma voor het omzetten van tekst naar hoofdletters. Voer uw tekst in en deze wordt automatisch omgezet naar alleen hoofdletters. Perfect voor het maken van koppen, het benadrukken van tekst of het standaardiseren van tekstopmaak. Ondersteunt diverse tekstformaten en behoudt speciale tekens.",
+ "name": "Hoofdletters",
+ "shortDescription": "Tekst naar hoofdletters converteren"
+ }
+ },
+ "toolExamples": {
+ "subtitle": "Klik om te proberen!",
+ "title": "{{title}} Voorbeelden"
+ },
+ "toolFileResult": {
+ "copied": "Bestand gekopieerd",
+ "copyFailed": "Kopiëren mislukt: {{error}}",
+ "loading": "Bezig met laden... Dit kan even duren.",
+ "result": "Resultaat"
+ },
+ "toolHeader": {
+ "seeExamples": "Zie voorbeelden"
+ },
+ "toolLayout": {
+ "allToolsTitle": "Alle {{type}}"
+ },
+ "toolMultiFileResult": {
+ "copied": "Bestand gekopieerd",
+ "copyFailed": "Kopiëren mislukt: {{error}}",
+ "loading": "Bezig met laden... Dit kan even duren.",
+ "result": "Resultaat"
+ },
+ "toolMultipleAudioInput": {
+ "inputTitle": "Invoer {{type}}",
+ "noFilesSelected": "Geen bestanden geselecteerd"
+ },
+ "toolMultiplePdfInput": {
+ "inputTitle": "Invoer {{type}}",
+ "noFilesSelected": "Geen bestanden geselecteerd"
+ },
+ "toolOptions": {
+ "title": "Gereedschapsopties"
+ },
+ "toolTextInput": {
+ "copied": "Tekst gekopieerd",
+ "copyFailed": "Kopiëren mislukt: {{error}}",
+ "input": "Invoertekst",
+ "placeholder": "Voer hier uw tekst in..."
+ },
+ "toolTextResult": {
+ "copied": "Tekst gekopieerd",
+ "copyFailed": "Kopiëren mislukt: {{error}}",
+ "loading": "Bezig met laden... Dit kan even duren.",
+ "result": "Resultaat"
+ }
+}
diff --git a/public/locales/nl/video.json b/public/locales/nl/video.json
new file mode 100644
index 0000000..9a7571b
--- /dev/null
+++ b/public/locales/nl/video.json
@@ -0,0 +1,113 @@
+{
+ "changeSpeed": {
+ "defaultMultiplier": "Standaardvermenigvuldiger: 2 betekent 2x sneller",
+ "description": "Wijzig de afspeelsnelheid van videobestanden. Versnel of vertraag video's met behoud van audiosynchronisatie. Ondersteunt diverse snelheidsvermenigvuldigers en gangbare videoformaten.",
+ "inputTitle": "Invoervideo",
+ "newVideoSpeed": "Nieuwe videosnelheid",
+ "resultTitle": "Bewerkte video",
+ "settingSpeed": "Snelheid instellen",
+ "shortDescription": "Wijzig de afspeelsnelheid van video",
+ "title": "Videosnelheid wijzigen",
+ "toolInfo": {
+ "title": "Wat is een {{title}}?"
+ }
+ },
+ "compress": {
+ "default": "Standaard",
+ "description": "Comprimeer video's door ze te schalen naar verschillende resoluties, zoals 240p, 480p, 720p, enz. Deze tool helpt de bestandsgrootte te verkleinen met behoud van een acceptabele kwaliteit. Ondersteunt gangbare videoformaten zoals MP4, WebM en OGG.",
+ "inputTitle": "Invoervideo",
+ "loadingText": "Video comprimeren...",
+ "lossless": "Verliesloos",
+ "quality": "Kwaliteit (CRF)",
+ "resolution": "Oplossing",
+ "resultTitle": "Gecomprimeerde video",
+ "shortDescription": "Comprimeer video's door te schalen naar verschillende resoluties",
+ "title": "Video comprimeren",
+ "worst": "Slechtst"
+ },
+ "cropVideo": {
+ "cropCoordinates": "Gewascoördinaten",
+ "croppingVideo": "Video bijsnijden",
+ "description": "Snijd de video bij om ongewenste delen te verwijderen.",
+ "errorBeyondHeight": "Het gewasgebied strekt zich uit voorbij de videohoogte ({{height}}px)",
+ "errorBeyondWidth": "Het bijsnijdgebied is groter dan de videobreedte ({{width}}px)",
+ "errorCroppingVideo": "Fout bij het bijsnijden van de video. Controleer de parameters en het videobestand.",
+ "errorLoadingDimensions": "Het laden van de video-afmetingen is mislukt",
+ "errorNonNegativeCoordinates": "X- en Y-coördinaten moeten niet-negatief zijn",
+ "errorPositiveDimensions": "Breedte en hoogte moeten positief zijn",
+ "height": "Hoogte",
+ "inputTitle": "Invoervideo",
+ "loadVideoForDimensions": "Laad een video om de afmetingen te zien",
+ "resultTitle": "Bijgesneden video",
+ "shortDescription": "Video bijsnijden om ongewenste gebieden te verwijderen",
+ "title": "Bijsnijden Video",
+ "toolInfo": {
+ "description": "Met deze tool kunt u videobestanden bijsnijden om ongewenste delen te verwijderen. U kunt het bijsnijdgebied specificeren door de X- en Y-coördinaten en de breedte- en hoogte-afmetingen in te stellen.",
+ "title": "Bijsnijden Video"
+ },
+ "videoDimensions": "Video-afmetingen: {{width}} × {{height}} pixels",
+ "videoInformation": "Video-informatie",
+ "width": "Breedte",
+ "xCoordinate": "X (links)",
+ "yCoordinate": "Y (boven)"
+ },
+ "flip": {
+ "description": "Draai videobestanden horizontaal of verticaal. Spiegel video's voor speciale effecten of om problemen met de oriëntatie te corrigeren.",
+ "flippingVideo": "Flipping Video",
+ "horizontalLabel": "Horizontaal (Spiegel)",
+ "inputTitle": "Invoervideo",
+ "orientation": "Oriëntatie",
+ "resultTitle": "Omgedraaide video",
+ "shortDescription": "Video horizontaal of verticaal spiegelen",
+ "title": "Flip Video",
+ "verticalLabel": "Verticaal (op zijn kop)"
+ },
+ "gif": {
+ "changeSpeed": {
+ "description": "Wijzig de afspeelsnelheid van GIF-animaties. Versnel of vertraag GIF's met behoud van vloeiende animaties.",
+ "shortDescription": "Verander de GIF-animatiesnelheid",
+ "title": "GIF-snelheid wijzigen"
+ }
+ },
+ "loop": {
+ "description": "Maak een herhalende video door de originele video meerdere keren te herhalen.",
+ "inputTitle": "Invoervideo",
+ "loopingVideo": "Video herhalen",
+ "loops": "Lussen",
+ "numberOfLoops": "Aantal lussen",
+ "resultTitle": "Geloopte video",
+ "shortDescription": "Maak herhalende videobestanden",
+ "title": "Loop-video",
+ "toolInfo": {
+ "description": "Met deze tool kun je een herhalende video maken door de originele video meerdere keren te herhalen. Je kunt zelf aangeven hoe vaak de video moet worden herhaald.",
+ "title": "Wat is een {{title}}?"
+ }
+ },
+ "rotate": {
+ "180Degrees": "180° (op zijn kop)",
+ "270Degrees": "270° (90° tegen de klok in)",
+ "90Degrees": "90° met de klok mee",
+ "description": "Roteer videobestanden 90, 180 of 270 graden. Corrigeer de video-oriëntatie of creëer speciale effecten met nauwkeurige rotatiecontrole.",
+ "inputTitle": "Invoervideo",
+ "resultTitle": "Gedraaide video",
+ "rotatingVideo": "Roterende video",
+ "rotation": "Rotatie",
+ "shortDescription": "Video met opgegeven graden roteren",
+ "title": "Video roteren"
+ },
+ "trim": {
+ "description": "Trim videobestanden door begin- en eindtijden op te geven. Verwijder ongewenste delen aan het begin of einde van video's.",
+ "endTime": "Eindtijd",
+ "inputTitle": "Invoervideo",
+ "resultTitle": "Bijgesneden video",
+ "shortDescription": "Video bijsnijden door ongewenste delen te verwijderen",
+ "startTime": "Starttijd",
+ "timestamps": "Tijdstempels",
+ "title": "Video bijsnijden"
+ },
+ "videoToGif": {
+ "description": "Converteer videobestanden naar geanimeerde GIF-indeling. Extraheer specifieke tijdsperioden en maak deelbare geanimeerde afbeeldingen.",
+ "shortDescription": "Converteer video naar geanimeerde GIF",
+ "title": "Video naar GIF"
+ }
+}
diff --git a/public/locales/nl/xml.json b/public/locales/nl/xml.json
new file mode 100644
index 0000000..17d0841
--- /dev/null
+++ b/public/locales/nl/xml.json
@@ -0,0 +1,38 @@
+{
+ "xmlBeautifier": {
+ "description": "Formatteer XML met de juiste inspringing en spatie.",
+ "indentation": "Inspringing",
+ "inputTitle": "Invoer XML",
+ "resultTitle": "Verfraaide XML",
+ "shortDescription": "XML-code opmaken en verfraaien",
+ "title": "XML-verfraaier",
+ "toolInfo": {
+ "description": "Met deze tool kunt u XML-gegevens opmaken met de juiste inspringing en spaties, waardoor ze beter leesbaar worden en u er gemakkelijker mee kunt werken.",
+ "title": "XML-verfraaier"
+ },
+ "useSpaces": "Gebruik spaties",
+ "useSpacesDescription": "Uitvoer inspringen met spaties",
+ "useTabs": "Tabbladen gebruiken",
+ "useTabsDescription": "Uitvoer inspringen met tabs."
+ },
+ "xmlValidator": {
+ "description": "Valideer XML-syntaxis en -structuur.",
+ "placeholder": "Plak of importeer hier XML...",
+ "shortDescription": "XML-code valideren op fouten",
+ "title": "XML-validator",
+ "toolInfo": {
+ "description": "Met deze tool kunt u de XML-syntaxis en -structuur valideren. De tool controleert of de XML correct is opgemaakt en geeft gedetailleerde foutmeldingen bij gevonden problemen.",
+ "title": "XML-validator"
+ }
+ },
+ "xmlViewer": {
+ "description": "Bekijk en verken de XML-structuur in een boomstructuur.",
+ "inputTitle": "Invoer XML",
+ "resultTitle": "XML-boomweergave",
+ "title": "XML-viewer",
+ "toolInfo": {
+ "description": "Met deze tool kunt u XML-gegevens in een hiërarchische boomstructuur bekijken, waardoor u de structuur van XML-documenten eenvoudiger kunt verkennen en begrijpen.",
+ "title": "XML-viewer"
+ }
+ }
+}
diff --git a/public/locales/pt/audio.json b/public/locales/pt/audio.json
new file mode 100644
index 0000000..568d31e
--- /dev/null
+++ b/public/locales/pt/audio.json
@@ -0,0 +1,42 @@
+{
+ "changeSpeed": {
+ "description": "Altere a velocidade de reprodução dos arquivos de áudio. Acelere ou desacelere o áudio, mantendo o tom.",
+ "inputTitle": "Áudio de entrada",
+ "newAudioSpeed": "Nova velocidade de áudio",
+ "outputFormat": "Formato de saída",
+ "resultTitle": "Áudio editado",
+ "settingSpeed": "Definindo a velocidade",
+ "shortDescription": "Alterar a velocidade dos arquivos de áudio",
+ "speedDescription": "Multiplicador padrão: 2 significa 2x mais rápido",
+ "title": "Alterar velocidade do áudio",
+ "toolInfo": {
+ "title": "O que é {{title}}?"
+ }
+ },
+ "extractAudio": {
+ "description": "Extraia faixas de áudio de arquivos de vídeo.",
+ "extractingAudio": "Extraindo áudio",
+ "inputTitle": "Entrada de vídeo",
+ "outputFormat": "Formato de saída",
+ "outputFormatDescription": "Selecione o formato para o áudio ser extraído.",
+ "resultTitle": "Áudio extraído",
+ "shortDescription": "Extraia áudio de arquivos de vídeo (MP4, MOV, etc.) para AAC, MP3 ou WAV.",
+ "title": "Extrair áudio de vídeo",
+ "toolInfo": {
+ "description": "Esta ferramenta permite extrair a faixa de áudio de arquivos de vídeo. Você pode escolher entre diferentes formatos de áudio, incluindo AAC, MP3 e WAV.",
+ "title": "O que é {{title}}?"
+ }
+ },
+ "mergeAudio": {
+ "description": "Combine vários arquivos de áudio em um único arquivo de áudio concatenando-os em sequência.",
+ "longDescription": "Esta ferramenta permite mesclar vários arquivos de áudio em um único arquivo, concatenando-os na ordem em que foram enviados. Perfeito para combinar segmentos de podcast, faixas de música ou qualquer arquivo de áudio que precise ser unido. Suporta vários formatos de áudio, incluindo MP3, AAC e WAV.",
+ "shortDescription": "Mescle vários arquivos de áudio em um (MP3, AAC, WAV).",
+ "title": "Mesclar áudio"
+ },
+ "trim": {
+ "description": "Corte e apare arquivos de áudio para extrair segmentos específicos, especificando horários de início e término.",
+ "longDescription": "Esta ferramenta permite cortar arquivos de áudio especificando os tempos de início e término. Você pode extrair segmentos específicos de arquivos de áudio mais longos, remover partes indesejadas ou criar clipes mais curtos. Suporta vários formatos de áudio, incluindo MP3, AAC e WAV. Perfeito para edição de podcasts, produção musical ou qualquer necessidade de edição de áudio.",
+ "shortDescription": "Corte arquivos de áudio para extrair segmentos de tempo específicos (MP3, AAC, WAV).",
+ "title": "Aparar áudio"
+ }
+}
diff --git a/public/locales/pt/csv.json b/public/locales/pt/csv.json
new file mode 100644
index 0000000..6b8a2be
--- /dev/null
+++ b/public/locales/pt/csv.json
@@ -0,0 +1,114 @@
+{
+ "changeCsvSeparator": {
+ "description": "Altere o delimitador/separador em arquivos CSV. Converta entre diferentes formatos CSV, como vírgula, ponto e vírgula, tabulação ou separadores personalizados.",
+ "shortDescription": "Alterar delimitador de arquivo CSV",
+ "title": "Alterar separador CSV"
+ },
+ "csvRowsToColumns": {
+ "description": "Esta ferramenta converte linhas de um arquivo CSV (Valores Separados por Vírgula) em colunas. Ela extrai as linhas horizontais do arquivo CSV de entrada, uma a uma, gira-as 90 graus e as gera como colunas verticais, uma após a outra, separadas por vírgulas.', longDescription: 'Esta ferramenta converte linhas de um arquivo CSV (Valores Separados por Vírgula) em colunas. Por exemplo, se os dados CSV de entrada tiverem 6 linhas, a saída terá 6 colunas e os elementos das linhas serão organizados de cima para baixo. Em um CSV bem formado, o número de valores em cada linha é o mesmo. No entanto, nos casos em que as linhas não possuem campos, o programa pode corrigi-los e você pode escolher entre as opções disponíveis: preencher os dados ausentes com elementos vazios ou substituir os dados ausentes por elementos personalizados, como \"ausente\", \"?\" ou \"x\". Durante o processo de conversão, a ferramenta também limpa o arquivo CSV de informações desnecessárias, como linhas vazias (linhas sem informações visíveis) e comentários. Para ajudar a ferramenta a identificar corretamente os comentários, nas opções, você pode especificar o símbolo no início de uma linha que inicia um comentário. Este símbolo normalmente é um hash \"#\" ou uma barra dupla \"//\". Csv-abulous!.",
+ "longDescription": "Esta ferramenta converte linhas de um arquivo CSV (Valores Separados por Vírgula) em colunas. Por exemplo, se os dados CSV de entrada tiverem 6 linhas, a saída terá 6 colunas e os elementos das linhas serão organizados de cima para baixo. Em um CSV bem formado, o número de valores em cada linha é o mesmo. No entanto, nos casos em que as linhas não possuem campos, o programa pode corrigi-los e você pode escolher entre as opções disponíveis: preencher os dados ausentes com elementos vazios ou substituir os dados ausentes por elementos personalizados, como",
+ "shortDescription": "Converter linhas CSV em colunas.",
+ "title": "Converter linhas CSV em colunas"
+ },
+ "csvToJson": {
+ "columnSeparator": "Separador de coluna (por exemplo, , ; \\t)",
+ "commentSymbol": "Símbolo de comentário (por exemplo, #)",
+ "conversionOptions": "Opções de conversão",
+ "description": "Converta arquivos CSV para o formato JSON com opções personalizáveis para delimitadores, aspas e formatação de saída. Suporte para cabeçalhos, comentários e conversão dinâmica de tipos.",
+ "dynamicTypes": "Tipos dinâmicos",
+ "dynamicTypesDescription": "Converta números e booleanos automaticamente",
+ "errorParsing": "Erro ao analisar CSV: {{error}}",
+ "fieldQuote": "Citação de campo (por exemplo, \")",
+ "inputCsvFormat": "Formato CSV de entrada",
+ "inputTitle": "Entrada CSV",
+ "resultTitle": "Saída JSON",
+ "shortDescription": "Converta dados CSV para o formato JSON.",
+ "skipEmptyLines": "Pular linhas vazias",
+ "skipEmptyLinesDescription": "Ignorar linhas vazias no CSV de entrada",
+ "title": "Converter CSV para JSON",
+ "useHeaders": "Usar Cabeçalhos",
+ "useHeadersDescription": "Tratar a primeira linha como cabeçalhos de coluna"
+ },
+ "csvToTsv": {
+ "description": "Carregue seu arquivo CSV no formulário abaixo e ele será convertido automaticamente para um arquivo TSV. Nas opções da ferramenta, você pode personalizar o formato CSV de entrada – especificar o delimitador de campo, o caractere de aspas e o símbolo de comentário, além de pular linhas CSV vazias e escolher se deseja preservar os cabeçalhos das colunas CSV.",
+ "longDescription": "Esta ferramenta transforma dados de Valores Separados por Vírgula (CSV) em dados de Valores Separados por Tabulação (TSV). CSV e TSV são formatos de arquivo populares para armazenar dados tabulares, mas usam delimitadores diferentes para separar valores – CSV usa vírgulas (",
+ "shortDescription": "Converter dados CSV para o formato TSV.",
+ "title": "Converter CSV para TSV"
+ },
+ "csvToXml": {
+ "description": "Converta arquivos CSV para o formato XML com opções personalizáveis.",
+ "shortDescription": "Converta dados CSV para o formato XML.",
+ "title": "Converter CSV para XML"
+ },
+ "csvToYaml": {
+ "description": "Basta enviar seu arquivo CSV no formulário abaixo e ele será convertido automaticamente para um arquivo YAML. Nas opções da ferramenta, você pode especificar o caractere delimitador de campo, o caractere de aspas de campo e o caractere de comentário para adaptar a ferramenta a formatos CSV personalizados. Além disso, você pode selecionar o formato YAML de saída: um que preserva os cabeçalhos CSV ou um que exclui os cabeçalhos CSV.",
+ "longDescription": "Esta ferramenta transforma dados CSV (Valores Separados por Vírgula) em dados YAML (Yet Another Markup Language). CSV é um formato tabular simples usado para representar tipos de dados matriciais, compostos por linhas e colunas. YAML, por outro lado, é um formato mais avançado (na verdade, um superconjunto de JSON), que cria dados mais legíveis para serialização e oferece suporte a listas, dicionários e objetos aninhados. Este programa oferece suporte a vários formatos CSV de entrada – os dados de entrada podem ser separados por vírgula (padrão), ponto e vírgula, barra vertical ou usar outro delimitador completamente diferente. Você pode especificar o delimitador exato que seus dados usam nas opções. Da mesma forma, nas opções, você pode especificar o caractere de aspas usado para quebrar campos CSV (por padrão, um símbolo de aspas duplas). Você também pode pular linhas que começam com comentários, especificando os símbolos de comentário nas opções. Isso permite que você mantenha seus dados limpos, pulando linhas desnecessárias. Há duas maneiras de converter CSV para YAML. O primeiro método converte cada linha CSV em uma lista YAML. O segundo método extrai cabeçalhos da primeira linha CSV e cria objetos YAML com chaves baseadas nesses cabeçalhos. Você também pode personalizar o formato YAML de saída especificando o número de espaços para recuar as estruturas YAML. Se precisar realizar a conversão reversa, ou seja, transformar YAML em CSV, você pode usar nossa ferramenta Converter YAML para CSV. CSV-abulous!",
+ "shortDescription": "Converta rapidamente um arquivo CSV em um arquivo YAML.",
+ "title": "Converter CSV para YAML"
+ },
+ "findIncompleteCsvRecords": {
+ "checkingOptions": "Opções de verificação",
+ "commentCharacterDescription": "Insira o caractere que indica o início de uma linha de comentário. Linhas que começam com este símbolo serão ignoradas.",
+ "csvInputOptions": "Opções de entrada CSV",
+ "csvSeparatorDescription": "Digite o caractere usado para delimitar colunas no arquivo de entrada CSV.",
+ "deleteLinesWithNoData": "Excluir linhas sem dados",
+ "deleteLinesWithNoDataDescription": "Remova linhas vazias do arquivo de entrada CSV.",
+ "description": "Basta enviar seu arquivo CSV no formulário abaixo e esta ferramenta verificará automaticamente se nenhuma das linhas ou colunas contém valores ausentes. Nas opções da ferramenta, você pode ajustar o formato do arquivo de entrada (especifique o delimitador, o caractere de aspas e o caractere de comentário). Além disso, você pode ativar a verificação de valores vazios, ignorar linhas vazias e definir um limite para o número de mensagens de erro na saída.",
+ "findEmptyValues": "Encontrar valores vazios",
+ "findEmptyValuesDescription": "Exibir uma mensagem sobre campos CSV que estão vazios (não são campos ausentes, mas campos que não contêm nada).",
+ "inputTitle": "Entrada CSV",
+ "limitNumberOfMessages": "Limite de número de mensagens",
+ "messageLimitDescription": "Defina o limite do número de mensagens na saída.",
+ "quoteCharacterDescription": "Digite o caractere de aspas usado para citar os campos de entrada CSV.",
+ "resultTitle": "Status do CSV",
+ "shortDescription": "Encontre rapidamente linhas e colunas em CSV que não tenham valores.",
+ "title": "Encontre registros CSV incompletos",
+ "toolInfo": {
+ "title": "O que é um {{title}}?"
+ }
+ },
+ "insertCsvColumns": {
+ "appendColumns": "Adicionar colunas",
+ "commentCharacterDescription": "Insira o caractere que indica o início de uma linha de comentário. Linhas que começam com este símbolo serão ignoradas.",
+ "csvOptions": "Opções CSV",
+ "csvSeparator": "Separador CSV",
+ "csvToInsert": "CSV para inserir",
+ "csvToInsertDescription": "Insira uma ou mais colunas que deseja inserir no CSV. O caractere usado para delimitar as colunas deve ser o mesmo que o do arquivo CSV de entrada. Obs.: Linhas em branco serão ignoradas.",
+ "customFillDescription": "Se o arquivo CSV de entrada estiver incompleto (valores ausentes), adicione campos vazios ou símbolos personalizados aos registros para criar um CSV bem formado?",
+ "customFillValueDescription": "Use este valor personalizado para preencher campos ausentes. (Funciona apenas com o modo \"Valores Personalizados\" acima.)",
+ "customPosition": "Posição personalizada",
+ "customPositionOptionsDescription": "Selecione o método para inserir as colunas no arquivo CSV.",
+ "description": "Adicione novas colunas aos dados CSV em posições especificadas.",
+ "fillWithCustomValues": "Preencher com valores alfandegários",
+ "fillWithEmptyValues": "Preencher com valores vazios",
+ "headerName": "Nome do cabeçalho",
+ "headerNameDescription": "Cabeçalho da coluna depois da qual você deseja inserir colunas.",
+ "inputTitle": "Entrada CSV",
+ "insertingPositionDescription": "Especifique onde inserir as colunas no arquivo CSV.",
+ "position": "Posição",
+ "positionOptions": "Opções de posição",
+ "prependColumns": "Prefixar colunas",
+ "quoteCharDescription": "Digite o caractere de aspas usado para citar os campos de entrada CSV.",
+ "resultTitle": "Saída CSV",
+ "rowNumberDescription": "Número da coluna depois da qual você deseja inserir colunas.",
+ "separatorDescription": "Digite o caractere usado para delimitar colunas no arquivo de entrada CSV.",
+ "shortDescription": "Insira rapidamente uma ou mais colunas novas em qualquer lugar de um arquivo CSV.",
+ "title": "Inserir colunas CSV",
+ "toolInfo": {
+ "description": "Esta ferramenta permite inserir novas colunas em dados CSV em posições específicas. Você pode acrescentar, anexar ou inserir colunas em posições personalizadas com base em nomes de cabeçalho ou números de coluna.",
+ "title": "Inserir colunas CSV"
+ }
+ },
+ "swapCsvColumns": {
+ "description": "Basta carregar seu arquivo CSV no formulário abaixo, especificar as colunas a serem trocadas e a ferramenta alterará automaticamente as posições das colunas especificadas no arquivo de saída. Nas opções da ferramenta, você pode especificar as posições ou nomes das colunas que deseja trocar, bem como corrigir dados incompletos e, opcionalmente, remover registros vazios e registros comentados.",
+ "longDescription": "Esta ferramenta reorganiza dados CSV trocando as posições de suas colunas. Trocar colunas pode melhorar a legibilidade de um arquivo CSV, colocando dados usados com frequência juntos ou na frente para facilitar a comparação e a edição de dados. Por exemplo, você pode trocar a primeira coluna com a última ou trocar a segunda coluna com a terceira. Para trocar colunas com base em suas posições, selecione a opção",
+ "shortDescription": "Reordene as colunas CSV.",
+ "title": "Trocar colunas CSV"
+ },
+ "transposeCsv": {
+ "description": "Basta enviar seu arquivo CSV no formulário abaixo e esta ferramenta o transporá automaticamente. Nas opções da ferramenta, você pode especificar o caractere que inicia as linhas de comentário no CSV para removê-las. Além disso, se o CSV estiver incompleto (com valores ausentes), você pode substituí-los pelo caractere vazio ou por um caractere personalizado.",
+ "longDescription": "Esta ferramenta transpõe valores separados por vírgula (CSV). Ela trata o CSV como uma matriz de dados e inverte todos os elementos na diagonal principal. A saída contém os mesmos dados CSV que a entrada, mas agora todas as linhas se tornaram colunas e todas as colunas se tornaram linhas. Após a transposição, o arquivo CSV terá dimensões opostas. Por exemplo, se o arquivo de entrada tiver 4 colunas e 3 linhas, o arquivo de saída terá 3 colunas e 4 linhas. Durante a conversão, o programa também limpa os dados de linhas desnecessárias e corrige dados incompletos. Especificamente, a ferramenta exclui automaticamente todos os registros e comentários vazios que começam com um caractere específico, que você pode definir na opção. Além disso, nos casos em que os dados CSV são corrompidos ou perdidos, o utilitário completa o arquivo com campos vazios ou campos personalizados que podem ser especificados nas opções. CSV-abulous!",
+ "shortDescription": "Transponha rapidamente um arquivo CSV.",
+ "title": "Transpor CSV"
+ }
+}
diff --git a/public/locales/pt/image.json b/public/locales/pt/image.json
new file mode 100644
index 0000000..10ac100
--- /dev/null
+++ b/public/locales/pt/image.json
@@ -0,0 +1,98 @@
+{
+ "changeColors": {
+ "description": "Mundo",
+ "shortDescription": "Troque cores rapidamente em uma imagem",
+ "title": "Alterar cores na imagem"
+ },
+ "changeOpacity": {
+ "description": "Ajuste facilmente a transparência das suas imagens. Basta carregar a sua imagem, usar o controle deslizante para definir o nível de opacidade desejado entre 0 (totalmente transparente) e 1 (totalmente opaco) e baixar a imagem modificada.",
+ "shortDescription": "Ajustar a transparência das imagens",
+ "title": "Alterar opacidade da imagem"
+ },
+ "compress": {
+ "description": "Reduza o tamanho do arquivo de imagem, mantendo a qualidade.",
+ "inputTitle": "Imagem de entrada",
+ "resultTitle": "Imagem compactada",
+ "shortDescription": "Compacte imagens para reduzir o tamanho do arquivo, mantendo uma qualidade razoável.",
+ "title": "Comprimir imagem"
+ },
+ "compressPng": {
+ "description": "Este é um programa que compacta imagens PNG. Assim que você colar a imagem PNG na área de entrada, o programa a compactará e exibirá o resultado na área de saída. Nas opções, você pode ajustar o nível de compactação, bem como encontrar os tamanhos de arquivo de imagem antigos e novos.",
+ "shortDescription": "Comprimir rapidamente um PNG",
+ "title": "Comprimir png"
+ },
+ "convertJgpToPng": {
+ "description": "Converta rapidamente suas imagens JPG para PNG. Basta importar sua imagem PNG no editor à esquerda.",
+ "shortDescription": "Converta rapidamente suas imagens JPG para PNG",
+ "title": "Converter JPG para PNG"
+ },
+ "convertToJpg": {
+ "description": "Converta vários formatos de imagem (PNG, GIF, TIF, PSD, SVG, WEBP, HEIC, RAW) para JPG com configurações personalizáveis de qualidade e cor de fundo.",
+ "shortDescription": "Converta imagens para JPG com controle de qualidade",
+ "title": "Converter imagens para JPG"
+ },
+ "createTransparent": {
+ "description": "Mundo",
+ "shortDescription": "Tornar uma imagem transparente rapidamente",
+ "title": "Criar PNG transparente"
+ },
+ "crop": {
+ "description": "Corte imagens para remover áreas indesejadas.",
+ "inputTitle": "Imagem de entrada",
+ "resultTitle": "Imagem recortada",
+ "shortDescription": "Corte imagens rapidamente.",
+ "title": "Cortar imagem"
+ },
+ "editor": {
+ "description": "Editor de imagens avançado com ferramentas para cortar, girar, anotar, ajustar cores e adicionar marcas d'água. Edite suas imagens com ferramentas profissionais diretamente no seu navegador.",
+ "shortDescription": "Edite imagens com ferramentas e recursos avançados",
+ "title": "Editor de imagens"
+ },
+ "imageToText": {
+ "description": "Extraia texto de imagens (JPG, PNG) usando reconhecimento óptico de caracteres (OCR).",
+ "shortDescription": "Extraia texto de imagens usando OCR.",
+ "title": "Imagem para texto (OCR)"
+ },
+ "qrCode": {
+ "description": "Gere códigos QR para diferentes tipos de dados: URL, texto, e-mail, telefone, SMS, WiFi, vCard e muito mais.",
+ "shortDescription": "Crie códigos QR personalizados para vários formatos de dados.",
+ "title": "Gerador de código QR"
+ },
+ "removeBackground": {
+ "description": "Mundo",
+ "shortDescription": "Remover fundos de imagens automaticamente",
+ "title": "Remover fundo da imagem"
+ },
+ "resize": {
+ "description": "Redimensione imagens para dimensões diferentes.",
+ "dimensionType": "Tipo de dimensão",
+ "heightDescription": "Altura (em pixels)",
+ "inputTitle": "Imagem de entrada",
+ "maintainAspectRatio": "Manter proporção de aspecto",
+ "maintainAspectRatioDescription": "Manter a proporção original da imagem.",
+ "percentage": "Percentagem",
+ "percentageDescription": "Porcentagem do tamanho original (por exemplo, 50 para metade do tamanho, 200 para o dobro do tamanho)",
+ "resizeByPercentage": "Redimensionar por porcentagem",
+ "resizeByPercentageDescription": "Redimensione especificando uma porcentagem do tamanho original.",
+ "resizeByPixels": "Redimensionar por pixels",
+ "resizeByPixelsDescription": "Redimensione especificando dimensões em pixels.",
+ "resizeMethod": "Método de redimensionamento",
+ "resultTitle": "Imagem redimensionada",
+ "setHeight": "Altura definida",
+ "setHeightDescription": "Especifique a altura em pixels e calcule a largura com base na proporção.",
+ "setWidth": "Definir largura",
+ "setWidthDescription": "Especifique a largura em pixels e calcule a altura com base na proporção.",
+ "shortDescription": "Redimensione imagens facilmente.",
+ "title": "Redimensionar imagem",
+ "toolInfo": {
+ "description": "Esta ferramenta permite redimensionar imagens JPG, PNG, SVG ou GIF. Você pode redimensionar especificando as dimensões em pixels ou em porcentagem, com opções para manter a proporção original.",
+ "title": "Redimensionar imagem"
+ },
+ "widthDescription": "Largura (em pixels)"
+ },
+ "rotate": {
+ "description": "Girar uma imagem em um ângulo especificado.",
+ "shortDescription": "Gire uma imagem facilmente.",
+ "title": "Girar imagem"
+ }
+}
diff --git a/public/locales/pt/json.json b/public/locales/pt/json.json
new file mode 100644
index 0000000..32f981b
--- /dev/null
+++ b/public/locales/pt/json.json
@@ -0,0 +1,62 @@
+{
+ "escapeJson": {
+ "description": "Escape caracteres especiais em strings JSON. Converta dados JSON para um formato de escape adequado para transmissão ou armazenamento seguro.",
+ "shortDescription": "Escape de caracteres especiais em JSON",
+ "title": "Escape JSON"
+ },
+ "jsonToXml": {
+ "description": "Converta dados JSON para o formato XML. Transforme objetos JSON estruturados em documentos XML bem-formados.",
+ "shortDescription": "Converter JSON para o formato XML",
+ "title": "JSON para XML"
+ },
+ "minify": {
+ "description": "Remova todos os espaços em branco desnecessários do JSON.",
+ "inputTitle": "Entrada JSON",
+ "resultTitle": "JSON minificado",
+ "shortDescription": "Minifique JSON removendo espaços em branco",
+ "title": "Minificar JSON",
+ "toolInfo": {
+ "description": "A minificação de JSON é o processo de remover todos os caracteres de espaço em branco desnecessários dos dados JSON, mantendo sua validade. Isso inclui a remoção de espaços, quebras de linha e recuos desnecessários para que o JSON seja analisado corretamente. A minificação reduz o tamanho dos dados JSON, tornando-os mais eficientes para armazenamento e transmissão, mantendo exatamente a mesma estrutura de dados e valores.",
+ "title": "O que é minificação JSON?"
+ }
+ },
+ "prettify": {
+ "description": "Formate JSON com recuo e espaçamento adequados.",
+ "indentation": "Recuo",
+ "inputTitle": "Entrada JSON",
+ "resultTitle": "JSON embelezado",
+ "shortDescription": "Formate e embeleze o código JSON",
+ "title": "Embeleze JSON",
+ "toolInfo": {
+ "description": "Esta ferramenta permite formatar dados JSON com recuo e espaçamento adequados, tornando-os mais legíveis e fáceis de trabalhar.",
+ "title": "Embeleze JSON"
+ },
+ "useSpaces": "Use Espaços",
+ "useSpacesDescription": "Recuar a saída com espaços",
+ "useTabs": "Usar guias",
+ "useTabsDescription": "Recuar a saída com tabulações."
+ },
+ "stringify": {
+ "description": "Converta objetos JavaScript para o formato de string JSON. Serialize estruturas de dados em strings JSON para armazenamento ou transmissão.",
+ "shortDescription": "Converter objetos em string JSON",
+ "title": "Stringify JSON"
+ },
+ "tsvToJson": {
+ "description": "Converta dados TSV (Valores Separados por Tabulação) para o formato JSON. Transforme dados tabulares em objetos JSON estruturados.",
+ "shortDescription": "Converter TSV para o formato JSON",
+ "title": "TSV para JSON"
+ },
+ "validateJson": {
+ "description": "Verifique se JSON é válido e bem formado.",
+ "inputTitle": "Entrada JSON",
+ "invalidJson": "❌ {{error}}",
+ "resultTitle": "Resultado da Validação",
+ "shortDescription": "Validar código JSON para erros",
+ "title": "Validar JSON",
+ "toolInfo": {
+ "description": "JSON (JavaScript Object Notation) é um formato leve para troca de dados. A validação JSON garante que a estrutura dos dados esteja em conformidade com o padrão JSON. Um objeto JSON válido deve ter: - Nomes de propriedades entre aspas duplas. - Chaves {} devidamente balanceadas. - Sem vírgulas finais após o último par chave-valor. - Aninhamento correto de objetos e matrizes. Esta ferramenta verifica o JSON de entrada e fornece feedback para ajudar a identificar e corrigir erros comuns.",
+ "title": "O que é validação JSON?"
+ },
+ "validJson": "✅ JSON válido"
+ }
+}
diff --git a/public/locales/pt/list.json b/public/locales/pt/list.json
new file mode 100644
index 0000000..8bc58ed
--- /dev/null
+++ b/public/locales/pt/list.json
@@ -0,0 +1,208 @@
+{
+ "duplicate": {
+ "concatenate": "Concatenar",
+ "concatenateDescription": "Concatenar cópias (se desmarcado, os itens serão entrelaçados)",
+ "copyDescription": "Número de cópias (pode ser fracionário)",
+ "description": "O utilitário baseado em navegador mais simples do mundo para duplicar itens de lista. Insira sua lista e especifique critérios de duplicação para criar cópias dos itens. Perfeito para expansão de dados, testes ou criação de padrões repetidos.",
+ "duplicationOptions": "Opções de duplicação",
+ "examples": {
+ "fractional": {
+ "description": "Este exemplo mostra como duplicar uma lista com um número fracionário de cópias.",
+ "title": "Duplicação fracionária"
+ },
+ "interweave": {
+ "description": "Este exemplo mostra como entrelaçar itens em vez de concatená-los.",
+ "title": "Itens entrelaçados"
+ },
+ "reverse": {
+ "description": "Este exemplo mostra como duplicar uma lista na ordem inversa.",
+ "title": "Duplicação reversa"
+ },
+ "simple": {
+ "description": "Este exemplo mostra como duplicar uma lista de palavras.",
+ "title": "Duplicação simples"
+ }
+ },
+ "inputTitle": "Lista de Entrada",
+ "joinSeparatorDescription": "Separador para unir a lista duplicada",
+ "resultTitle": "Lista Duplicada",
+ "reverse": "Reverter",
+ "reverseDescription": "Reverter os itens duplicados",
+ "shortDescription": "Itens de lista duplicados com critérios especificados",
+ "splitByRegex": "Dividir por expressão regular",
+ "splitBySymbol": "Dividido por símbolo",
+ "splitOptions": "Opções de divisão",
+ "splitSeparatorDescription": "Separador para dividir a lista",
+ "title": "Duplicado",
+ "toolInfo": {
+ "description": "Esta ferramenta permite duplicar itens em uma lista. Você pode especificar o número de cópias (incluindo valores fracionários), controlar se os itens serão concatenados ou entrelaçados e até mesmo reverter os itens duplicados. É útil para criar padrões repetidos, gerar dados de teste ou expandir listas com conteúdo previsível.",
+ "title": "Duplicação de lista"
+ }
+ },
+ "findMostPopular": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para encontrar os itens mais populares em uma lista. Insira sua lista e obtenha instantaneamente os itens que aparecem com mais frequência. Perfeito para análise de dados, identificação de tendências ou busca por elementos comuns.",
+ "shortDescription": "Encontre os itens mais frequentes",
+ "title": "Encontre os mais populares"
+ },
+ "findUnique": {
+ "caseSensitiveItems": "Itens que diferenciam maiúsculas de minúsculas",
+ "caseSensitiveItemsDescription": "Produza itens com maiúsculas e minúsculas diferentes como elementos exclusivos na lista.",
+ "delimiterDescription": "Defina um símbolo delimitador ou uma expressão regular.",
+ "description": "O utilitário baseado em navegador mais simples do mundo para encontrar itens únicos em uma lista. Insira sua lista e obtenha instantaneamente todos os valores únicos, com as duplicatas removidas. Perfeito para limpeza de dados, desduplicação ou busca de elementos distintos.",
+ "findAbsolutelyUniqueItems": "Encontre itens absolutamente únicos",
+ "findAbsolutelyUniqueItemsDescription": "Exibe somente os itens da lista que existem em uma única cópia.",
+ "inputListDelimiter": "Delimitador de lista de entrada",
+ "inputTitle": "Lista de Entrada",
+ "outputListDelimiter": "Delimitador da lista de saída",
+ "resultTitle": "Itens Únicos",
+ "shortDescription": "Encontre itens exclusivos em uma lista",
+ "skipEmptyItems": "Pular itens vazios",
+ "skipEmptyItemsDescription": "Não inclua os itens da lista vazia na saída.",
+ "title": "Encontre algo único",
+ "trimItems": "Itens da lista de corte",
+ "trimItemsDescription": "Remova os espaços iniciais e finais antes de comparar itens.",
+ "uniqueItemOptions": "Opções de itens exclusivos"
+ },
+ "group": {
+ "deleteEmptyItems": "Excluir itens vazios",
+ "deleteEmptyItemsDescription": "Ignore itens vazios e não os inclua nos grupos.",
+ "description": "O utilitário baseado em navegador mais simples do mundo para agrupar itens de lista. Insira sua lista e especifique critérios de agrupamento para organizar os itens em grupos lógicos. Perfeito para categorizar dados, organizar informações ou criar listas estruturadas. Suporta separadores personalizados e diversas opções de agrupamento.",
+ "emptyItemsAndPadding": "Itens vazios e preenchimento",
+ "groupNumberDescription": "Número de itens em um grupo",
+ "groupSeparatorDescription": "Caractere separador de grupo",
+ "groupSizeAndSeparators": "Tamanho do grupo e separadores",
+ "inputItemSeparator": "Separador de itens de entrada",
+ "inputTitle": "Lista de entrada",
+ "itemSeparatorDescription": "Caractere separador de itens",
+ "leftWrapDescription": "Símbolo de envoltório esquerdo do grupo.",
+ "padNonFullGroups": "Grupos não completos",
+ "padNonFullGroupsDescription": "Preencha grupos não completos com um item personalizado (insira abaixo).",
+ "paddingCharDescription": "Use este caractere ou item para preencher grupos não completos.",
+ "resultTitle": "Itens agrupados",
+ "rightWrapDescription": "Símbolo de envoltório direito do grupo.",
+ "shortDescription": "Agrupar itens da lista por propriedades comuns",
+ "splitOperators": {
+ "regex": {
+ "description": "Delimite itens da lista de entrada com uma expressão regular.",
+ "title": "Use um Regex para Divisão"
+ },
+ "symbol": {
+ "description": "Delimitar itens da lista de entrada com um caractere.",
+ "title": "Use um símbolo para dividir"
+ }
+ },
+ "splitSeparatorDescription": "Defina um símbolo delimitador ou uma expressão regular.",
+ "title": "Grupo"
+ },
+ "reverse": {
+ "description": "Este é um aplicativo super simples baseado em navegador que imprime todos os itens da lista em ordem inversa. Os itens de entrada podem ser separados por qualquer símbolo e você também pode alterar o separador dos itens da lista em ordem inversa.",
+ "inputTitle": "Lista de entrada",
+ "itemSeparator": "Separador de Itens",
+ "itemSeparatorDescription": "Defina um símbolo delimitador ou uma expressão regular.",
+ "outputListOptions": "Opções da lista de saída",
+ "outputSeparatorDescription": "Separador de itens da lista de saída.",
+ "resultTitle": "Lista invertida",
+ "shortDescription": "Inverter uma lista rapidamente",
+ "splitOperators": {
+ "regex": {
+ "description": "Delimite itens da lista de entrada com uma expressão regular.",
+ "title": "Use um Regex para Divisão"
+ },
+ "symbol": {
+ "description": "Delimitar itens da lista de entrada com um caractere.",
+ "title": "Use um símbolo para dividir"
+ }
+ },
+ "splitterMode": "Modo divisor",
+ "title": "Reverter",
+ "toolInfo": {
+ "description": "Com este utilitário, você pode inverter a ordem dos itens em uma lista. O utilitário primeiro divide a lista de entrada em itens individuais e, em seguida, itera entre eles, do último item para o primeiro, imprimindo cada item na saída durante a iteração. A lista de entrada pode conter qualquer coisa que possa ser representada como dados textuais, o que inclui dígitos, números, strings, palavras, frases, etc. O separador de itens de entrada também pode ser uma expressão regular. Por exemplo, a expressão regular /[;,]/ permitirá que você use itens separados por vírgula ou ponto e vírgula. Os delimitadores dos itens da lista de entrada e saída podem ser personalizados nas opções. Por padrão, as listas de entrada e saída são separadas por vírgula. Listabulous!",
+ "title": "O que é um inversor de lista?"
+ }
+ },
+ "rotate": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para rotacionar itens de lista. Insira sua lista e especifique o valor de rotação para deslocar os itens em um número específico de posições. Perfeito para manipulação de dados, deslocamentos circulares ou reordenação de listas.",
+ "shortDescription": "Girar itens da lista por posições especificadas",
+ "title": "Girar"
+ },
+ "shuffle": {
+ "delimiterDescription": "Defina um símbolo delimitador ou uma expressão regular.",
+ "description": "O utilitário baseado em navegador mais simples do mundo para embaralhar itens de lista. Insira sua lista e obtenha instantaneamente uma versão aleatória com itens em ordem aleatória. Perfeito para criar variedade, testar aleatoriedade ou misturar dados ordenados.",
+ "inputListSeparator": "Separador de lista de entrada",
+ "inputTitle": "Lista de entrada",
+ "joinSeparatorDescription": "Use este separador na lista aleatória.",
+ "outputLengthDescription": "Produzir esta quantidade de itens aleatórios",
+ "resultTitle": "Lista embaralhada",
+ "shortDescription": "Randomize a ordem dos itens da lista",
+ "shuffledListLength": "Comprimento da lista embaralhada",
+ "shuffledListSeparator": "Separador de lista embaralhada",
+ "title": "Embaralhar"
+ },
+ "sort": {
+ "caseSensitive": "Classificação com diferenciação entre maiúsculas e minúsculas",
+ "caseSensitiveDescription": "Classifique itens em letras maiúsculas e minúsculas separadamente. Letras maiúsculas precedem letras minúsculas em uma lista crescente. (Funciona apenas no modo de classificação alfabética.)",
+ "description": "O utilitário baseado em navegador mais simples do mundo para classificar itens de lista. Insira sua lista e especifique critérios de classificação para organizar os itens em ordem crescente ou decrescente. Perfeito para organização de dados, processamento de texto ou criação de listas ordenadas.",
+ "inputItemSeparator": "Separador de itens de entrada",
+ "inputTitle": "Lista de entrada",
+ "joinSeparatorDescription": "Use este símbolo para unir itens em uma lista classificada.",
+ "orderDescription": "Selecione uma ordem de classificação.",
+ "orderOptions": {
+ "decreasing": "Ordem decrescente",
+ "increasing": "Ordem crescente"
+ },
+ "removeDuplicates": "Remover duplicatas",
+ "removeDuplicatesDescription": "Excluir itens duplicados da lista.",
+ "resultTitle": "Lista ordenada",
+ "shortDescription": "Classificar itens da lista na ordem especificada",
+ "sortMethod": "Método de classificação",
+ "sortMethodDescription": "Selecione um método de classificação.",
+ "sortOptions": {
+ "alphabetic": "Classificar em ordem alfabética",
+ "length": "Classificar por comprimento",
+ "numeric": "Classificar numericamente"
+ },
+ "sortedItemProperties": "Propriedades de itens classificados",
+ "splitOperators": {
+ "regex": {
+ "description": "Delimite itens da lista de entrada com uma expressão regular.",
+ "title": "Use um Regex para Divisão"
+ },
+ "symbol": {
+ "description": "Delimitar itens da lista de entrada com um caractere.",
+ "title": "Use um símbolo para dividir"
+ }
+ },
+ "splitSeparatorDescription": "Defina um símbolo delimitador ou uma expressão regular.",
+ "title": "Organizar"
+ },
+ "truncate": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para truncar listas. Insira sua lista e especifique o número máximo de itens a serem mantidos. Perfeito para processamento de dados, gerenciamento de listas ou limitação de tamanho de conteúdo.",
+ "shortDescription": "Truncar lista para um número específico de itens",
+ "title": "Truncar"
+ },
+ "unwrap": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para descompactar itens de lista. Insira sua lista encapsulada e especifique critérios de descompactação para simplificar os itens organizados. Perfeito para processamento de dados, manipulação de texto ou extração de conteúdo de listas estruturadas.",
+ "shortDescription": "Desembrulhe itens de lista do formato estruturado",
+ "title": "Desembrulhar"
+ },
+ "wrap": {
+ "description": "Adicione texto antes e depois de cada item da lista.",
+ "inputTitle": "Lista de Entrada",
+ "joinSeparatorDescription": "Separador para unir a lista encapsulada",
+ "leftTextDescription": "Texto para adicionar antes de cada item",
+ "removeEmptyItems": "Remover itens vazios",
+ "resultTitle": "Lista encapsulada",
+ "rightTextDescription": "Texto para adicionar após cada item",
+ "shortDescription": "Encapsule os itens da lista com critérios especificados",
+ "splitByRegex": "Dividir por expressão regular",
+ "splitBySymbol": "Dividido por símbolo",
+ "splitOptions": "Opções de divisão",
+ "splitSeparatorDescription": "Separador para dividir a lista",
+ "title": "Enrolar",
+ "toolInfo": {
+ "description": "Esta ferramenta permite adicionar texto antes e depois de cada item de uma lista. Você pode especificar textos diferentes para os lados esquerdo e direito e controlar como a lista é processada. É útil para adicionar aspas, colchetes ou outras formatações aos itens da lista, preparar dados para diferentes formatos ou criar texto estruturado.",
+ "title": "Encapsulamento de lista"
+ },
+ "wrapOptions": "Opções de envoltório"
+ }
+}
diff --git a/public/locales/pt/number.json b/public/locales/pt/number.json
new file mode 100644
index 0000000..419b83c
--- /dev/null
+++ b/public/locales/pt/number.json
@@ -0,0 +1,89 @@
+{
+ "arithmeticSequence": {
+ "commonDifferenceDescription": "Diferença comum entre os termos (d)",
+ "description": "Gere sequências aritméticas com parâmetros personalizáveis.",
+ "firstTermDescription": "Primeiro termo da sequência (a₁)",
+ "numberOfTermsDescription": "Número de termos a gerar (n)",
+ "outputFormat": "Formato de saída",
+ "resultTitle": "Sequência Gerada",
+ "separatorDescription": "Separador entre termos",
+ "sequenceParameters": "Parâmetros de sequência",
+ "shortDescription": "Gerar sequências aritméticas",
+ "title": "Sequência Aritmética",
+ "toolInfo": {
+ "description": "Uma progressão aritmética é uma sequência de números em que a diferença entre cada termo consecutivo é constante. Essa diferença constante é chamada de diferença comum. Dado o primeiro termo (a₁) e a diferença comum (d), cada termo pode ser encontrado somando a diferença comum ao termo anterior.",
+ "title": "O que é uma sequência aritmética?"
+ }
+ },
+ "generate": {
+ "arithmeticSequenceOption": "Opção de sequência aritmética",
+ "description": "Gere uma sequência de números com parâmetros personalizáveis.",
+ "numberOfElementsDescription": "Número de elementos em sequência.",
+ "resultTitle": "Números gerados",
+ "separator": "Separador",
+ "separatorDescription": "Separe os elementos na sequência aritmética por este caractere.",
+ "shortDescription": "Gerar números aleatórios em intervalos especificados",
+ "startSequenceDescription": "Inicie a sequência a partir deste número.",
+ "stepDescription": "Aumente cada elemento por esta quantidade",
+ "title": "Gerar",
+ "toolInfo": {
+ "description": "Esta ferramenta permite gerar uma sequência de números com parâmetros personalizáveis. Você pode especificar o valor inicial, o tamanho do passo e o número de elementos.",
+ "title": "Gerar números"
+ }
+ },
+ "ohmsLaw": {
+ "description": "Calcula tensão, corrente e resistência",
+ "longDescription": "Esta calculadora aplica a Lei de Ohm (V = I × R) para determinar qualquer um dos três parâmetros elétricos quando os outros dois são conhecidos. A Lei de Ohm é um princípio fundamental em engenharia elétrica que descreve a relação entre tensão (V), corrente (I) e resistência (R). Esta ferramenta é essencial para entusiastas de eletrônica, engenheiros elétricos e estudantes que trabalham com circuitos, para que possam resolver rapidamente valores desconhecidos em seus projetos elétricos.",
+ "shortDescription": "Calcular tensão, corrente ou resistência em circuitos elétricos usando a Lei de Ohm",
+ "title": "Lei de Ohm"
+ },
+ "slackline": {
+ "description": "Calcula a tensão em uma slackline",
+ "longDescription": "Esta calculadora assume uma carga no centro da corda",
+ "shortDescription": "Calcule a tensão aproximada de um slackline ou varal. Não confie apenas nisso para sua segurança.",
+ "title": "Tensão da Slackline"
+ },
+ "sphereArea": {
+ "description": "Área de uma esfera",
+ "longDescription": "Esta calculadora determina a área da superfície de uma esfera usando a fórmula A = 4πr². Você pode inserir o raio para encontrar a área da superfície ou inseri-la para calcular o raio necessário. Esta ferramenta é útil para estudantes de geometria, engenheiros que trabalham com objetos esféricos e qualquer pessoa que precise realizar cálculos envolvendo superfícies esféricas.",
+ "shortDescription": "Calcular a área da superfície de uma esfera com base em seu raio",
+ "title": "Área de uma esfera"
+ },
+ "sphereVolume": {
+ "description": "Volume de uma esfera",
+ "longDescription": "Esta calculadora calcula o volume de uma esfera usando a fórmula V = (4/3)πr³. Você pode inserir o raio ou o diâmetro para encontrar o volume ou inserir o volume para determinar o raio necessário. A ferramenta é valiosa para estudantes, engenheiros e profissionais que trabalham com objetos esféricos em áreas como física, engenharia e manufatura.",
+ "shortDescription": "Calcular o volume de uma esfera usando raio ou diâmetro",
+ "title": "Volume de uma esfera"
+ },
+ "sum": {
+ "description": "Calcule a soma de uma lista de números. Insira os números separados por vírgulas ou quebras de linha para obter a soma total.",
+ "extractionTypes": {
+ "delimiter": {
+ "description": "Personalize o separador de números aqui. (Por padrão, uma quebra de linha.)",
+ "title": "Delimitador de Número"
+ },
+ "smart": {
+ "description": "Detectar automaticamente números na entrada.",
+ "title": "Soma Inteligente"
+ }
+ },
+ "inputTitle": "Entrada",
+ "numberExtraction": "Extração de Números",
+ "printRunningSum": "Imprimir soma corrente",
+ "printRunningSumDescription": "Exiba a soma conforme ela é calculada passo a passo.",
+ "resultTitle": "Total",
+ "runningSum": "Soma Corrente",
+ "shortDescription": "Calcular soma de números",
+ "title": "Soma",
+ "toolInfo": {
+ "description": "Este é um utilitário online baseado em navegador para calcular a soma de vários números. Você pode inserir os números separados por vírgula, espaço ou qualquer outro caractere, incluindo a quebra de linha. Você também pode simplesmente colar um fragmento de dados textuais que contenha valores numéricos que você deseja somar, e o utilitário os extrairá e calculará a soma.",
+ "title": "O que é uma calculadora de soma numérica?"
+ }
+ },
+ "voltageDropInWire": {
+ "description": "Calcula a tensão de ida e volta e a perda de potência em um cabo de 2 condutores",
+ "longDescription": "Esta calculadora ajuda a determinar a queda de tensão e a perda de potência em um cabo elétrico de dois condutores. Ela leva em consideração o comprimento do cabo, a bitola do fio (área da seção transversal), a resistividade do material e o fluxo de corrente. A ferramenta calcula a queda de tensão de ida e volta, a resistência total do cabo e a potência dissipada na forma de calor. Isso é particularmente útil para engenheiros elétricos, eletricistas e amadores ao projetar sistemas elétricos para garantir que os níveis de tensão permaneçam dentro dos limites aceitáveis na carga.",
+ "shortDescription": "Calcular queda de tensão e perda de potência em cabos elétricos com base no comprimento, material e corrente",
+ "title": "Queda de tensão de ida e volta no cabo"
+ }
+}
diff --git a/public/locales/pt/pdf.json b/public/locales/pt/pdf.json
new file mode 100644
index 0000000..049f798
--- /dev/null
+++ b/public/locales/pt/pdf.json
@@ -0,0 +1,113 @@
+{
+ "compressPdf": {
+ "compressedFileSize": "Tamanho do arquivo compactado",
+ "compressingPdf": "Compactando PDF...",
+ "compressionLevel": "Nível de compressão",
+ "compressionSettings": "Configurações de compressão",
+ "description": "Reduza o tamanho do arquivo PDF mantendo a qualidade usando Ghostscript",
+ "errorCompressingPdf": "Falha ao compactar PDF: {{error}}",
+ "errorReadingPdf": "Falha ao ler o arquivo PDF. Certifique-se de que é um PDF válido.",
+ "fileSize": "Tamanho original do arquivo",
+ "highCompression": "Alta compressão",
+ "highCompressionDescription": "Redução máxima do tamanho do arquivo com alguma perda de qualidade",
+ "inputTitle": "PDF de entrada",
+ "lowCompression": "Baixa compressão",
+ "lowCompressionDescription": "Reduza ligeiramente o tamanho do arquivo com perda mínima de qualidade",
+ "mediumCompression": "Compressão média",
+ "mediumCompressionDescription": "Equilíbrio entre tamanho e qualidade do arquivo",
+ "pages": "Número de páginas",
+ "resultTitle": "PDF compactado",
+ "shortDescription": "Compacte arquivos PDF com segurança no seu navegador",
+ "title": "Comprimir PDF"
+ },
+ "editor": {
+ "description": "Editor de PDF avançado com recursos de anotação, preenchimento de formulários, destaque e exportação. Edite seus PDFs diretamente no navegador com ferramentas de nível profissional, incluindo inserção de texto, desenho, destaque, assinatura e preenchimento de formulários.",
+ "shortDescription": "Edite PDFs com ferramentas avançadas de anotação, assinatura e edição",
+ "title": "Editor de PDF"
+ },
+ "merge": {
+ "inputTitle": "PDF de entrada",
+ "loadingText": "Extraindo páginas",
+ "resultTitle": "Saída PDF mesclada",
+ "toolInfo": {
+ "description": "Esta ferramenta permite mesclar vários arquivos PDF em um único documento. Para usá-la, basta carregar os arquivos PDF que deseja mesclar. A ferramenta então combinará todas as páginas dos arquivos de entrada em um único documento PDF.",
+ "title": "Como usar a ferramenta Mesclar PDF?"
+ }
+ },
+ "mergePdf": {
+ "description": "Combine vários arquivos PDF em um único documento.",
+ "inputTitle": "PDFs de entrada",
+ "mergingPdfs": "Mesclando PDFs",
+ "pdfOptions": "Opções de PDF",
+ "resultTitle": "PDF mesclado",
+ "shortDescription": "Mesclar vários arquivos PDF em um único documento",
+ "sortByFileName": "Classificar por nome de arquivo",
+ "sortByFileNameDescription": "Classificar PDFs em ordem alfabética por nome de arquivo",
+ "sortByUploadOrder": "Classificar por ordem de upload",
+ "sortByUploadOrderDescription": "Mantenha os PDFs na ordem em que foram enviados",
+ "title": "Mesclar PDF",
+ "toolInfo": {
+ "description": "Esta ferramenta permite combinar vários arquivos PDF em um único documento. Você pode escolher como classificar os PDFs e a ferramenta os mesclará na ordem especificada.",
+ "title": "Mesclar arquivos PDF"
+ }
+ },
+ "pdfToEpub": {
+ "description": "Transforme documentos PDF em arquivos EPUB para melhor compatibilidade com leitores eletrônicos.', ícone: 'material-symbols:import-contacts', componente: lazy(() => import('./index')), palavras-chave: ['pdf', 'epub', 'convert', 'ebook'], caminho: 'pdf-to-epub', i18n: { nome: 'pdf:pdfToEpub.title', descrição: 'pdf:pdfToEpub.description",
+ "shortDescription": "Converter arquivos PDF para o formato EPUB",
+ "title": "PDF para EPUB"
+ },
+ "pdfToPng": {
+ "description": "Transforme documentos PDF em painéis PNG.",
+ "longDescription": "Carregue um PDF e converta cada página em uma imagem PNG de alta qualidade diretamente no seu navegador. Esta ferramenta é ideal para extrair conteúdo visual ou compartilhar páginas individuais. Nenhum dado é carregado — tudo é executado localmente.",
+ "shortDescription": "Converter PDF em imagens PNG",
+ "title": "PDF para PNG"
+ },
+ "protectPdf": {
+ "description": "Adicione proteção por senha aos seus arquivos PDF com segurança no seu navegador",
+ "shortDescription": "Proteja arquivos PDF com senha com segurança",
+ "title": "Proteger PDF"
+ },
+ "rotatePdf": {
+ "allPagesWillBeRotated": "Todos {{count}} as páginas serão giradas",
+ "angleOptions": {
+ "clockwise90": "90° no sentido horário",
+ "counterClockwise270": "270° (90° sentido anti-horário)",
+ "upsideDown180": "180° (de cabeça para baixo)"
+ },
+ "applyToAllPages": "Aplicar a todas as páginas",
+ "description": "Girar páginas em um documento PDF.",
+ "inputTitle": "PDF de entrada",
+ "longDescription": "Altere a orientação das páginas do PDF girando-as 90, 180 ou 270 graus. Útil para corrigir documentos digitalizados incorretamente ou preparar PDFs para impressão.",
+ "pageRangesDescription": "Insira números de página ou intervalos separados por vírgulas (por exemplo, 1,3,5-7)",
+ "pageRangesPlaceholder": "por exemplo, 1,5-8",
+ "pagesWillBeRotated": "{{count}} página{{count !== 1 ? 's' : ''}} será girado",
+ "pdfPageCount": "PDF tem {{count}} página{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "PDF girado",
+ "rotatingPages": "Páginas rotativas",
+ "rotationAngle": "Ângulo de rotação",
+ "rotationSettings": "Configurações de rotação",
+ "shortDescription": "Girar páginas em um documento PDF",
+ "title": "Girar PDF",
+ "toolInfo": {
+ "description": "Esta ferramenta permite girar páginas em um documento PDF. Você pode girar todas as páginas ou especificar páginas individuais para girar. Escolha um ângulo de rotação: 90° no sentido horário, 180° (de cabeça para baixo) ou 270° (90° no sentido anti-horário). Para girar páginas específicas, desmarque \"Aplicar a todas as páginas\" e insira os números das páginas ou intervalos separados por vírgulas (por exemplo, 1, 3, 5-7).",
+ "title": "Como usar a ferramenta Girar PDF"
+ }
+ },
+ "splitPdf": {
+ "description": "Extraia páginas específicas de um documento PDF.",
+ "extractingPages": "Extraindo páginas",
+ "inputTitle": "PDF de entrada",
+ "pageExtractionPreview": "{{count}} página{{count !== 1 ? 's' : ''}} será extraído",
+ "pageRangesDescription": "Insira números de página ou intervalos separados por vírgulas (por exemplo, 1,3,5-7)",
+ "pageRangesPlaceholder": "por exemplo, 1,5-8",
+ "pageSelection": "Seleção de página",
+ "pdfPageCount": "PDF tem {{count}} página{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "PDF extraído",
+ "shortDescription": "Extrair páginas específicas de um arquivo PDF",
+ "title": "Dividir PDF",
+ "toolInfo": {
+ "description": "Esta ferramenta permite extrair páginas específicas de um documento PDF. Você pode especificar páginas individuais ou intervalos de páginas para extrair.",
+ "title": "Dividir PDF"
+ }
+ }
+}
diff --git a/public/locales/pt/string.json b/public/locales/pt/string.json
new file mode 100644
index 0000000..48c3ac4
--- /dev/null
+++ b/public/locales/pt/string.json
@@ -0,0 +1,261 @@
+{
+ "base64": {
+ "decode": "Decodificação Base64",
+ "description": "Codifique ou decodifique texto usando codificação Base64.",
+ "encode": "Codificação Base64",
+ "inputTitle": "Dados de entrada",
+ "optionsTitle": "Opções Base64",
+ "resultTitle": "Resultado",
+ "shortDescription": "Codifique ou decodifique dados usando Base64.",
+ "title": "Codificador/Decodificador Base64",
+ "toolInfo": {
+ "description": "Base64 é um esquema de codificação que representa dados em um formato de string ASCII, traduzindo-os para uma representação radix-64. Embora possa ser usado para codificar strings, é comumente usado para codificar dados binários para transmissão em mídias projetadas para lidar com dados textuais.",
+ "title": "O que é Base64?"
+ }
+ },
+ "censor": {
+ "description": "Utilitário para censurar palavras em texto. Carregue seu texto no formulário de entrada à esquerda, especifique todos os palavrões nas opções e você obterá instantaneamente o texto censurado na área de saída.\", longDescription: \"Com esta ferramenta online, você pode censurar certas palavras em qualquer texto. Você pode especificar uma lista de palavras indesejadas (como palavrões ou palavras secretas) e o programa as substituirá por palavras alternativas e criará um texto seguro para leitura. As palavras podem ser especificadas em um campo de texto de várias linhas nas opções, inserindo uma palavra por linha.\", keywords: ['text', 'censor', 'words', 'characters'], component: lazy(() => import('./index')), i18n: { name: 'string:censor.title', description: 'string:censor.description",
+ "shortDescription": "Mascare rapidamente palavras ruins ou substitua-as por palavras alternativas.",
+ "title": "Censor de texto"
+ },
+ "createPalindrome": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para criar palíndromos a partir de qualquer texto. Insira texto e transforme-o instantaneamente em um palíndromo com a mesma leitura de trás para frente. Perfeito para jogos de palavras, criação de padrões de texto simétricos ou exploração de curiosidades linguísticas.",
+ "shortDescription": "Crie um texto que seja lido da mesma forma para frente e para trás",
+ "title": "Criar palíndromo"
+ },
+ "extractSubstring": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para extrair substrings de texto. Insira seu texto e especifique as posições inicial e final para extrair a parte desejada. Perfeito para processamento de dados, análise de texto ou extração de conteúdo específico de blocos de texto maiores.",
+ "shortDescription": "Extrair uma parte do texto entre posições especificadas",
+ "title": "Extrair substring"
+ },
+ "join": {
+ "blankLinesAndTrailingSpaces": "Linhas em branco e espaços finais",
+ "deleteBlankDescription": "Exclua linhas que não tenham símbolos de texto.",
+ "deleteBlankTitle": "Excluir linhas em branco",
+ "deleteTrailingDescription": "Remova espaços e tabulações no final das linhas.",
+ "deleteTrailingTitle": "Excluir espaços finais",
+ "description": "Una partes de texto com separadores personalizáveis.",
+ "inputTitle": "Pedaços de texto",
+ "joinCharacterDescription": "Símbolo que conecta partes quebradas de texto. (Espaço por padrão.)",
+ "joinCharacterPlaceholder": "Junte-se ao personagem",
+ "resultTitle": "Texto unido",
+ "shortDescription": "Unir elementos de texto com um separador especificado",
+ "textMergedOptions": "Opções de mesclagem de texto",
+ "title": "Junte-se ao texto",
+ "toolInfo": {
+ "description": "Com esta ferramenta, você pode unir partes do texto. Ela pega uma lista de valores de texto, separados por quebras de linha, e os mescla. Você pode definir o caractere que será colocado entre as partes do texto combinado. Além disso, você pode ignorar todas as linhas vazias e remover espaços e tabulações no final de todas as linhas. Textabulous!",
+ "title": "O que é um unidor de texto?"
+ }
+ },
+ "palindrome": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para verificar se um texto é um palíndromo. Verifique instantaneamente se o seu texto é lido da mesma forma, de trás para frente. Perfeito para quebra-cabeças de palavras, análise linguística ou validação de padrões de texto simétricos. Suporta vários delimitadores e detecção de palíndromos de várias palavras.",
+ "shortDescription": "Verifique se o texto é lido da mesma forma para frente e para trás",
+ "title": "Palíndromo"
+ },
+ "passwordGenerator": {
+ "avoidAmbiguous": "Evite caracteres ambíguos (i, I, l, 0, O)",
+ "description": "Gere senhas aleatórias e seguras com comprimento e tipos de caracteres personalizáveis. Escolha entre letras minúsculas, maiúsculas, números e caracteres especiais. Opção para evitar caracteres ambíguos para melhor legibilidade.",
+ "includeLowercase": "Incluir letras minúsculas (a-z)",
+ "includeNumbers": "Incluir números (0-9)",
+ "includeSymbols": "Incluir caracteres especiais",
+ "includeUppercase": "Incluir letras maiúsculas (A-Z)",
+ "lengthDesc": "Comprimento da senha",
+ "lengthPlaceholder": "por exemplo 12",
+ "optionsTitle": "Opções de senha",
+ "resultTitle": "Senha gerada",
+ "shortDescription": "Gere senhas aleatórias seguras com opções personalizadas",
+ "title": "Gerador de senhas",
+ "toolInfo": {
+ "description": "Esta ferramenta gera senhas aleatórias e seguras com base nos critérios selecionados. Você pode personalizar o comprimento, incluir ou excluir diferentes tipos de caracteres e evitar caracteres ambíguos para melhor legibilidade. Perfeito para criar senhas fortes para contas, aplicativos ou qualquer necessidade de segurança.",
+ "title": "Sobre o gerador de senhas"
+ }
+ },
+ "quote": {
+ "allowDoubleQuotation": "Permitir aspas duplas",
+ "description": "Adicione aspas ao redor do texto com opções personalizáveis.",
+ "inputTitle": "Texto de entrada",
+ "leftQuoteDescription": "Caractere(s) de aspas à esquerda",
+ "processAsMultiLine": "Processar como texto multilinha",
+ "quoteEmptyLines": "Citar linhas vazias",
+ "quoteOptions": "Opções de cotação",
+ "resultTitle": "Texto citado",
+ "rightQuoteDescription": "Caractere(s) de aspas corretas",
+ "shortDescription": "Adicione aspas ao redor do texto com vários estilos",
+ "title": "Citador de texto",
+ "toolInfo": {
+ "description": "Esta ferramenta permite adicionar aspas ao redor do texto. Você pode escolher diferentes caracteres de aspas, manipular texto com várias linhas e controlar como as linhas vazias são processadas. É útil para preparar texto para programação, formatar dados ou criar texto estilizado.",
+ "title": "Citador de texto"
+ }
+ },
+ "randomizeCase": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para randomizar letras maiúsculas e minúsculas em textos. Insira seu texto e transforme-o instantaneamente com letras maiúsculas e minúsculas aleatórias. Perfeito para criar efeitos de texto exclusivos, testar a diferenciação entre maiúsculas e minúsculas ou gerar padrões de texto variados.",
+ "shortDescription": "Randomize a caixa das letras no texto",
+ "title": "Randomizar caso"
+ },
+ "removeDuplicateLines": {
+ "description": "Carregue seu texto no formulário de entrada à esquerda e você obterá instantaneamente texto sem linhas duplicadas na área de saída. Poderoso, gratuito e rápido. Carregue linhas de texto – obtenha linhas de texto exclusivas.",
+ "shortDescription": "Exclua rapidamente todas as linhas repetidas do texto",
+ "title": "Remover linhas duplicadas"
+ },
+ "repeat": {
+ "delimiterDescription": "Delimitador para cópias de saída.",
+ "delimiterPlaceholder": "Delimitador",
+ "description": "Repita o texto várias vezes com separadores personalizáveis.",
+ "inputTitle": "Texto de entrada",
+ "numberPlaceholder": "Número",
+ "repeatAmountDescription": "Número de repetições.",
+ "repetitionsDelimiter": "Delimitador de Repetições",
+ "resultTitle": "Texto repetido",
+ "shortDescription": "Repita o texto várias vezes",
+ "textRepetitions": "Repetições de texto",
+ "title": "Repetir texto",
+ "toolInfo": {
+ "description": "Esta ferramenta permite que você repita um determinado texto várias vezes com um separador opcional.",
+ "title": "Repetir texto"
+ }
+ },
+ "reverse": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para inverter texto. Insira qualquer texto e inverta-o instantaneamente, caractere por caractere. Perfeito para criar texto espelhado, analisar palíndromos ou brincar com padrões de texto. Preserva espaços e caracteres especiais durante a inversão.",
+ "inputTitle": "Texto para reverter",
+ "processMultiLine": "Processar texto multilinha",
+ "processMultiLineDescription": "Cada linha será revertida independentemente",
+ "resultTitle": "Texto invertido",
+ "reversalOptions": "Opções de reversão",
+ "shortDescription": "Inverter qualquer texto caractere por caractere",
+ "skipEmptyLines": "Pular linhas vazias",
+ "skipEmptyLinesDescription": "As linhas vazias serão removidas da saída",
+ "title": "Reverter",
+ "trimWhitespace": "Aparar espaços em branco",
+ "trimWhitespaceDescription": "Remova os espaços em branco à esquerda e à direita de cada linha"
+ },
+ "rot13": {
+ "description": "Codifique ou decodifique texto usando a cifra ROT13.",
+ "inputTitle": "Texto de entrada",
+ "resultTitle": "Resultado ROT13",
+ "shortDescription": "Codifique ou decodifique texto usando a cifra ROT13.",
+ "title": "Codificador/Decodificador ROT13",
+ "toolInfo": {
+ "description": "ROT13 (rotação de 13 posições) é uma cifra simples de substituição de letras que substitui uma letra pela 13ª letra seguinte no alfabeto. ROT13 é um caso especial da cifra de César, desenvolvida na Roma Antiga. Como o alfabeto inglês possui 26 letras, ROT13 é seu próprio inverso; ou seja, para desfazer a ROT13, o mesmo algoritmo é aplicado, permitindo que a mesma ação seja usada para codificação e decodificação.",
+ "title": "O que é ROT13?"
+ }
+ },
+ "rotate": {
+ "description": "Girar caracteres no texto por posições especificadas.",
+ "inputTitle": "Texto de entrada",
+ "processAsMultiLine": "Processar como texto multilinha (girar cada linha separadamente)",
+ "resultTitle": "Texto girado",
+ "rotateLeft": "Girar para a esquerda",
+ "rotateRight": "Girar para a direita",
+ "rotationOptions": "Opções de rotação",
+ "shortDescription": "Deslocar caracteres no texto por posição.",
+ "stepDescription": "Número de posições para girar",
+ "title": "Girar texto",
+ "toolInfo": {
+ "description": "Esta ferramenta permite girar caracteres em uma string por um número específico de posições. Você pode girar para a esquerda ou para a direita e processar texto com várias linhas girando cada linha separadamente. A rotação de strings é útil para transformações simples de texto, criação de padrões ou implementação de técnicas básicas de criptografia.",
+ "title": "Rotação de cordas"
+ }
+ },
+ "split": {
+ "charAfterChunkDescription": "Caractere após cada pedaço",
+ "charBeforeChunkDescription": "Caractere antes de cada pedaço",
+ "chunksDescription": "Número de pedaços de igual\ncomprimento na saída.",
+ "chunksTitle": "Use vários pedaços",
+ "description": "O utilitário baseado em navegador mais simples do mundo para dividir texto. Insira seu texto e especifique um separador para dividi-lo em várias partes. Perfeito para processamento de dados, manipulação de texto ou extração de conteúdo específico de blocos de texto maiores.",
+ "lengthDescription": "Número de símbolos que serão colocados em cada bloco de saída.",
+ "lengthTitle": "Use comprimento para divisão",
+ "outputSeparatorDescription": "Caractere que será colocado entre os blocos divididos.\n(Por padrão, é a quebra de linha \"\\n\".)",
+ "outputSeparatorOptions": "Opções de separador de saída",
+ "regexDescription": "Expressão regular que será usada para dividir o texto em partes.\n(Vários espaços por padrão.)",
+ "regexTitle": "Use um Regex para Divisão",
+ "resultTitle": "Pedaços de texto",
+ "shortDescription": "Dividir o texto em várias partes usando um separador",
+ "splitSeparatorOptions": "Opções de separador de divisão",
+ "symbolDescription": "Caractere que será usado para dividir o texto em partes.\n(Espaço por padrão.)",
+ "symbolTitle": "Use um símbolo para dividir",
+ "title": "Dividir"
+ },
+ "statistic": {
+ "characterFrequencyAnalysis": "Análise de Frequência de Caracteres",
+ "characterFrequencyAnalysisDescription": "Conte com que frequência cada caractere aparece no texto",
+ "delimitersOptions": "Opções de delimitadores",
+ "description": "Analise texto e gere estatísticas abrangentes.",
+ "includeEmptyLines": "Incluir linhas vazias",
+ "includeEmptyLinesDescription": "Incluir linhas em branco ao contar linhas",
+ "inputTitle": "Texto de entrada",
+ "resultTitle": "Estatísticas de texto",
+ "sentenceDelimitersDescription": "Insira caracteres personalizados usados para delimitar frases no seu idioma (separados por vírgula) ou deixe em branco para o padrão.",
+ "sentenceDelimitersPlaceholder": "por exemplo ., !, ?, ...",
+ "shortDescription": "Obtenha estatísticas sobre seu texto",
+ "statisticsOptions": "Opções de estatísticas",
+ "title": "Estatísticas de texto",
+ "toolInfo": {
+ "description": "Esta ferramenta permite que você analise texto e gere estatísticas abrangentes, incluindo contagem de caracteres, contagem de palavras, contagem de linhas e análise de frequência de caracteres e palavras.",
+ "title": "O que é um {{title}}?"
+ },
+ "wordDelimitersDescription": "Insira uma Regex personalizada para contar palavras ou deixe em branco para o padrão.",
+ "wordDelimitersPlaceholder": "por exemplo. \\s.,;:!?\"«»()…",
+ "wordFrequencyAnalysis": "Análise de frequência de palavras",
+ "wordFrequencyAnalysisDescription": "Conte com que frequência cada palavra aparece no texto"
+ },
+ "textReplacer": {
+ "description": "Substitua padrões de texto por novo conteúdo.",
+ "findPatternInText": "Encontre este padrão no texto",
+ "findPatternUsingRegexp": "Encontre um padrão usando uma RegExp",
+ "inputTitle": "Texto para substituir",
+ "newTextPlaceholder": "Novo texto",
+ "regexpDescription": "Insira a expressão regular que você deseja substituir.",
+ "replacePatternDescription": "Digite o padrão a ser usado para substituição.",
+ "replaceText": "Substituir texto",
+ "resultTitle": "Texto com substituições",
+ "searchPatternDescription": "Digite o padrão de texto que você deseja substituir.",
+ "searchText": "Pesquisar texto",
+ "shortDescription": "Substitua rapidamente o texto em seu conteúdo",
+ "title": "Substituidor de texto",
+ "toolInfo": {
+ "description": "Substitua facilmente textos específicos em seu conteúdo com esta ferramenta simples para navegador. Basta inserir o texto, definir o texto que deseja substituir e o valor de substituição e obter a versão atualizada instantaneamente.",
+ "title": "Substituidor de texto"
+ }
+ },
+ "toMorse": {
+ "dashSymbolDescription": "Símbolo que corresponderá ao travessão no código Morse.",
+ "description": "Converta texto em código Morse.",
+ "dotSymbolDescription": "Símbolo que corresponderá ao ponto no código Morse.",
+ "longSignal": "Sinal longo",
+ "resultTitle": "código Morse",
+ "shortDescription": "Codifique rapidamente o texto para Morse",
+ "shortSignal": "Sinal curto",
+ "title": "String para Morse"
+ },
+ "truncate": {
+ "addTruncationIndicator": "Adicionar Indicador de Truncamento",
+ "charactersPlaceholder": "Personagens",
+ "description": "Encurte o texto para um comprimento especificado.",
+ "indicatorDescription": "Caracteres a serem adicionados ao final (ou início) do texto. Observação: eles contam para o comprimento.",
+ "inputTitle": "Texto de entrada",
+ "leftSideDescription": "Remova caracteres do início do texto.",
+ "leftSideTruncation": "Truncamento do lado esquerdo",
+ "lengthAndLines": "Comprimento e Linhas",
+ "lineByLineDescription": "Trunque cada linha separadamente.",
+ "lineByLineTruncating": "Truncamento linha por linha",
+ "maxLengthDescription": "Número de caracteres a deixar no texto.",
+ "numberPlaceholder": "Número",
+ "resultTitle": "Texto truncado",
+ "rightSideDescription": "Remova caracteres do final do texto.",
+ "rightSideTruncation": "Truncamento do lado direito",
+ "shortDescription": "Truncar texto para um comprimento especificado",
+ "suffixAndAffix": "Sufixo e Afixo",
+ "title": "Truncar texto",
+ "toolInfo": {
+ "description": "Carregue seu texto no formulário de entrada à esquerda e você obterá automaticamente o texto truncado à direita.",
+ "title": "Truncar texto"
+ },
+ "truncationSide": "Lado de truncamento"
+ },
+ "uppercase": {
+ "description": "Converta texto em letras maiúsculas.",
+ "inputTitle": "Texto de entrada",
+ "resultTitle": "Texto em maiúsculas",
+ "shortDescription": "Converter texto em letras maiúsculas",
+ "title": "Converter para maiúsculas"
+ }
+}
diff --git a/public/locales/pt/time.json b/public/locales/pt/time.json
new file mode 100644
index 0000000..ad6f4d1
--- /dev/null
+++ b/public/locales/pt/time.json
@@ -0,0 +1,100 @@
+{
+ "checkLeapYears": {
+ "description": "Verifique se um ano é bissexto e obtenha informações sobre o ano bissexto.",
+ "inputTitle": "Ano de entrada",
+ "resultTitle": "Resultado do ano bissexto",
+ "shortDescription": "Verifique se um ano é bissexto",
+ "title": "Verifique os anos bissextos",
+ "toolInfo": {
+ "description": "Um ano bissexto é um ano que contém um dia adicional (29 de fevereiro) para manter o ano civil sincronizado com o ano astronômico. Anos bissextos ocorrem a cada 4 anos, exceto anos divisíveis por 100, mas não por 400.",
+ "title": "O que é um ano bissexto?"
+ }
+ },
+ "convertDaysToHours": {
+ "addHoursName": "Adicionar nome das horas",
+ "addHoursNameDescription": "Adicionar a string horas aos valores de saída",
+ "description": "Converta dias em horas com opções personalizáveis.",
+ "hoursName": "Nome das horas",
+ "shortDescription": "Converter dias em horas",
+ "title": "Converter dias em horas",
+ "toolInfo": {
+ "description": "Esta ferramenta permite converter dias em horas. Você pode inserir dias como números ou unidades, e a ferramenta os converterá para horas. Você também pode optar por adicionar o sufixo \"horas\" aos valores de saída.",
+ "title": "Converter dias em horas"
+ }
+ },
+ "convertHoursToDays": {
+ "addDaysName": "Adicionar nome dos dias",
+ "addDaysNameDescription": "Adicione a string days aos valores de saída",
+ "daysName": "Nome dos dias",
+ "description": "Converta horas em dias com opções personalizáveis.",
+ "shortDescription": "Converter horas em dias",
+ "title": "Converter horas em dias",
+ "toolInfo": {
+ "description": "Esta ferramenta permite converter horas em dias. Você pode inserir horas como números ou com unidades, e a ferramenta as converterá para dias. Você também pode optar por adicionar o sufixo \"dias\" aos valores de saída.",
+ "title": "Converter horas em dias"
+ }
+ },
+ "convertSecondsToTime": {
+ "addPadding": "Adicionar preenchimento",
+ "addPaddingDescription": "Adicione preenchimento zero às horas, minutos e segundos.",
+ "description": "Converta os segundos para um formato de hora legível (horas:minutos:segundos). Insira o número de segundos para obter a hora formatada.",
+ "shortDescription": "Converter segundos para o formato de hora",
+ "timePadding": "Preenchimento de tempo",
+ "title": "Converter segundos em tempo",
+ "toolInfo": {
+ "title": "O que é um {{title}}?"
+ }
+ },
+ "convertTimeToSeconds": {
+ "description": "Converter hora formatada (HH:MM:SS) em segundos.",
+ "inputTitle": "Tempo de entrada",
+ "resultTitle": "Segundos",
+ "shortDescription": "Converter formato de hora em segundos",
+ "title": "Converter tempo em segundos",
+ "toolInfo": {
+ "description": "Esta ferramenta permite converter sequências de tempo formatadas (HH:MM:SS) em segundos. É útil para calcular durações e intervalos de tempo.",
+ "title": "Converter tempo em segundos"
+ }
+ },
+ "crontabGuru": {
+ "description": "Gere e compreenda expressões cron. Crie agendamentos cron para tarefas automatizadas e trabalhos do sistema.",
+ "shortDescription": "Gerar e compreender expressões cron",
+ "title": "Guru Crontab"
+ },
+ "timeBetweenDates": {
+ "description": "Calcule a diferença de tempo entre duas datas. Obtenha a duração exata em dias, horas, minutos e segundos.",
+ "endDate": "Data de término",
+ "endDateTime": "Data e hora de término",
+ "endTime": "Fim dos tempos",
+ "endTimezone": "Fim do fuso horário",
+ "shortDescription": "Calcular o tempo entre duas datas",
+ "startDate": "Data de início",
+ "startDateTime": "Data e hora de início",
+ "startTime": "Hora de início",
+ "startTimezone": "Fuso horário de início",
+ "title": "Tempo entre datas",
+ "toolInfo": {
+ "description": "Calcule a diferença horária exata entre duas datas e horas, com suporte para diferentes fusos horários. Esta ferramenta fornece uma análise detalhada da diferença horária em várias unidades (anos, meses, dias, horas, minutos e segundos).",
+ "title": "Calculadora de tempo entre datas"
+ }
+ },
+ "truncateClockTime": {
+ "description": "Trunque o horário do relógio para remover segundos ou minutos. Arredonde o horário para a hora, minuto ou intervalo personalizado mais próximo.",
+ "printDroppedComponents": "Imprimir componentes descartados",
+ "shortDescription": "Truncar o tempo do relógio para a precisão especificada",
+ "timePadding": "Preenchimento de tempo",
+ "title": "Truncar o tempo do relógio",
+ "toolInfo": {
+ "title": "O que é um {{title}}?"
+ },
+ "truncateMinutesAndSeconds": "Truncar minutos e segundos",
+ "truncateMinutesAndSecondsDescription": "Elimine ambos – os componentes de minutos e segundos de cada relógio.",
+ "truncateOnlySeconds": "Truncar apenas segundos",
+ "truncateOnlySecondsDescription": "Retire o componente de segundos de cada hora do relógio.",
+ "truncationSide": "Lado de truncamento",
+ "useZeroPadding": "Usar preenchimento zero",
+ "zeroPaddingDescription": "Faça com que todos os componentes de tempo tenham sempre dois dígitos de largura.",
+ "zeroPrintDescription": "Exibe as partes descartadas como valores zero \"00\".",
+ "zeroPrintTruncatedParts": "Partes truncadas com impressão zero"
+ }
+}
diff --git a/public/locales/pt/translation.json b/public/locales/pt/translation.json
new file mode 100644
index 0000000..066bf84
--- /dev/null
+++ b/public/locales/pt/translation.json
@@ -0,0 +1,250 @@
+{
+ "audio": {
+ "changeSpeed": {
+ "description": "Altere a velocidade de reprodução dos arquivos de áudio. Acelere ou desacelere o áudio, mantendo o tom.",
+ "name": "Alterar velocidade do áudio",
+ "shortDescription": "Alterar a velocidade dos arquivos de áudio"
+ },
+ "extractAudio": {
+ "description": "Extraia a faixa de áudio de um arquivo de vídeo e salve-a como um arquivo de áudio separado no formato escolhido (AAC, MP3, WAV).",
+ "name": "Extrair áudio",
+ "shortDescription": "Extraia áudio de arquivos de vídeo (MP4, MOV, etc.) para AAC, MP3 ou WAV."
+ }
+ },
+ "baseFileInput": {
+ "copyFailed": "Falha ao copiar: {{error}}",
+ "dropFileHere": "Largue o seu {{type}} aqui",
+ "fileCopied": "Arquivo copiado",
+ "selectFileDescription": "Clique aqui para selecionar um {{type}} do seu dispositivo, pressione Ctrl+V para usar um {{type}} da sua área de transferência ou arraste e solte um arquivo da área de trabalho"
+ },
+ "categories": {
+ "audio": {
+ "description": "Ferramentas para trabalhar com áudio – extrair áudio de vídeo, ajustar a velocidade do áudio, mesclar vários arquivos de áudio e muito mais.",
+ "title": "Ferramentas de áudio"
+ },
+ "csv": {
+ "description": "Ferramentas para trabalhar com arquivos CSV - converta CSV para diferentes formatos, manipule dados CSV, valide a estrutura CSV e processe arquivos CSV com eficiência.",
+ "title": "Ferramentas CSV"
+ },
+ "gif": {
+ "description": "Ferramentas para trabalhar com animações GIF – crie GIFs transparentes, extraia quadros de GIF, adicione texto ao GIF, corte, gire, inverta GIFs e muito mais.",
+ "title": "Ferramentas GIF"
+ },
+ "image-generic": {
+ "description": "Ferramentas para trabalhar com imagens – compactar, redimensionar, cortar, converter para JPG, girar, remover fundo e muito mais.",
+ "title": "Ferramentas de imagem"
+ },
+ "json": {
+ "description": "Ferramentas para trabalhar com estruturas de dados JSON – embelezar e minimizar objetos JSON, achatar matrizes JSON, transformar valores JSON em strings, analisar dados e muito mais",
+ "title": "Ferramentas JSON"
+ },
+ "list": {
+ "description": "Ferramentas para trabalhar com listas – classificar, reverter, randomizar listas, encontrar itens de lista exclusivos e duplicados, alterar separadores de itens de lista e muito mais.",
+ "title": "Ferramentas de lista"
+ },
+ "number": {
+ "description": "Ferramentas para trabalhar com números – gerar sequências numéricas, converter números em palavras e palavras em números, classificar, arredondar, fatorar números e muito mais.",
+ "title": "Ferramentas numéricas"
+ },
+ "pdf": {
+ "description": "Ferramentas para trabalhar com arquivos PDF - extraia texto de PDFs, converta PDFs para outros formatos, manipule PDFs e muito mais.",
+ "title": "Ferramentas de PDF"
+ },
+ "png": {
+ "description": "Ferramentas para trabalhar com imagens PNG – converta PNGs em JPGs, crie PNGs transparentes, altere cores de PNG, corte, gire, redimensione PNGs e muito mais.",
+ "title": "Ferramentas PNG"
+ },
+ "seeAll": "Ver tudo {{title}}",
+ "string": {
+ "description": "Ferramentas para trabalhar com texto – converter texto em imagens, localizar e substituir texto, dividir texto em fragmentos, unir linhas de texto, repetir texto e muito mais.",
+ "title": "Ferramentas de texto"
+ },
+ "time": {
+ "description": "Ferramentas para trabalhar com hora e data – calcule diferenças de horário, converta entre fusos horários, formate datas, gere sequências de datas e muito mais.",
+ "title": "Ferramentas de tempo"
+ },
+ "try": "Tentar {{title}}",
+ "video": {
+ "description": "Ferramentas para trabalhar com vídeos – extraia quadros de vídeos, crie GIFs de vídeos, converta vídeos para diferentes formatos e muito mais.",
+ "title": "Ferramentas de vídeo"
+ },
+ "xml": {
+ "description": "Ferramentas para trabalhar com estruturas de dados XML - visualizador, embelezador, validador e muito mais",
+ "title": "Ferramentas XML"
+ }
+ },
+ "csv": {
+ "findIncompleteCsvRecords": {
+ "description": "Basta enviar seu arquivo CSV no formulário abaixo e esta ferramenta verificará automaticamente se nenhuma das linhas ou colunas contém valores ausentes. Nas opções da ferramenta, você pode ajustar o formato do arquivo de entrada (especifique o delimitador, o caractere de aspas e o caractere de comentário). Além disso, você pode ativar a verificação de valores vazios, ignorar linhas vazias e definir um limite para o número de mensagens de erro na saída.",
+ "name": "Encontre registros CSV incompletos",
+ "shortDescription": "Encontre rapidamente linhas e colunas em CSV que não tenham valores."
+ }
+ },
+ "hero": {
+ "brand": "OmniTools",
+ "description": "Aumente sua produtividade com o OmniTools, o kit de ferramentas definitivo para fazer as coisas rapidamente! Acesse milhares de utilitários fáceis de usar para editar imagens, textos, listas e dados, tudo diretamente do seu navegador.",
+ "examples": {
+ "calculateNumberSum": "Calcular soma numérica",
+ "changeGifSpeed": "Alterar velocidade do GIF",
+ "compressPng": "Comprimir PNG",
+ "createTransparentImage": "Crie uma imagem transparente",
+ "prettifyJson": "Embeleze JSON",
+ "sortList": "Classificar uma lista",
+ "splitPdf": "Dividir PDF",
+ "splitText": "Dividir um texto",
+ "trimVideo": "Cortar vídeo"
+ },
+ "searchPlaceholder": "Pesquisar todas as ferramentas",
+ "title": "Faça as coisas rapidamente com"
+ },
+ "inputFooter": {
+ "clear": "Claro",
+ "copyToClipboard": "Copiar para a área de transferência",
+ "importFromFile": "Importar de arquivo"
+ },
+ "list": {
+ "group": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para agrupar itens de lista. Insira sua lista e especifique critérios de agrupamento para organizar os itens em grupos lógicos. Perfeito para categorizar dados, organizar informações ou criar listas estruturadas. Suporta separadores personalizados e diversas opções de agrupamento.",
+ "name": "Grupo",
+ "shortDescription": "Agrupar itens da lista por propriedades comuns"
+ },
+ "reverse": {
+ "description": "Este é um aplicativo super simples baseado em navegador que imprime todos os itens da lista em ordem inversa. Os itens de entrada podem ser separados por qualquer símbolo e você também pode alterar o separador dos itens da lista em ordem inversa.",
+ "name": "Reverter",
+ "shortDescription": "Inverter uma lista rapidamente"
+ },
+ "sort": {
+ "description": "Este é um aplicativo super simples baseado em navegador que classifica itens em uma lista e os organiza em ordem crescente ou decrescente. Você pode classificar os itens em ordem alfabética, numérica ou por tamanho. Você também pode remover itens duplicados e vazios, bem como cortar itens individuais com espaços em branco. Você pode usar qualquer caractere separador para separar os itens da lista de entrada ou, alternativamente, usar uma expressão regular para separá-los. Além disso, você pode criar um novo delimitador para a lista de saída classificada.",
+ "name": "Organizar",
+ "shortDescription": "Classifique uma lista rapidamente"
+ }
+ },
+ "navbar": {
+ "buyMeACoffee": "Compre-me um café",
+ "home": "Lar",
+ "tools": "Ferramentas"
+ },
+ "number": {
+ "generate": {
+ "description": "Calcule rapidamente uma lista de números inteiros no seu navegador. Para obter sua lista, basta especificar o primeiro número inteiro, alterar o valor e a contagem total nas opções abaixo, e este utilitário gerará essa quantidade de números inteiros.",
+ "name": "Gerar números",
+ "shortDescription": "Calcule rapidamente uma lista de inteiros no seu navegador"
+ },
+ "sum": {
+ "description": "Este é um aplicativo super simples para navegador que soma números. Os números inseridos podem ser separados por qualquer símbolo e você também pode alterar o separador dos números somados.",
+ "name": "Somar números",
+ "shortDescription": "Some rapidamente uma lista de números"
+ }
+ },
+ "numericInputWithUnit": {
+ "unit": "Unidade"
+ },
+ "pdf": {
+ "compressPdf": {
+ "description": "Reduza o tamanho do arquivo PDF mantendo a qualidade usando Ghostscript",
+ "name": "Comprimir PDF",
+ "shortDescription": "Compacte arquivos PDF com segurança no seu navegador"
+ },
+ "mergePdf": {
+ "description": "Combine vários arquivos PDF em um único documento.",
+ "name": "Mesclar PDF",
+ "shortDescription": "Mesclar vários arquivos PDF em um único documento"
+ },
+ "pdfToEpub": {
+ "description": "Transforme documentos PDF em arquivos EPUB para melhor compatibilidade com leitores eletrônicos.",
+ "name": "PDF para EPUB",
+ "shortDescription": "Converter arquivos PDF para o formato EPUB"
+ },
+ "protectPdf": {
+ "description": "Adicione proteção por senha aos seus arquivos PDF com segurança no seu navegador",
+ "name": "Proteger PDF",
+ "shortDescription": "Proteja arquivos PDF com senha com segurança"
+ },
+ "splitPdf": {
+ "description": "Extraia páginas específicas de um arquivo PDF usando números de página ou intervalos (por exemplo, 1,5-8)",
+ "name": "Dividir PDF",
+ "shortDescription": "Extrair páginas específicas de um arquivo PDF"
+ }
+ },
+ "resultFooter": {
+ "copy": "Copiar para a área de transferência",
+ "download": "Download"
+ },
+ "string": {
+ "createPalindrome": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para criar palíndromos a partir de qualquer texto. Insira texto e transforme-o instantaneamente em um palíndromo com a mesma leitura de trás para frente. Perfeito para jogos de palavras, criação de padrões de texto simétricos ou exploração de curiosidades linguísticas.",
+ "name": "Criar palíndromo",
+ "shortDescription": "Crie um texto que seja lido da mesma forma para frente e para trás"
+ },
+ "palindrome": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para verificar se um texto é um palíndromo. Verifique instantaneamente se o seu texto é lido da mesma forma, de trás para frente. Perfeito para quebra-cabeças de palavras, análise linguística ou validação de padrões de texto simétricos. Suporta vários delimitadores e detecção de palíndromos de várias palavras.",
+ "name": "Palíndromo",
+ "shortDescription": "Verifique se o texto é lido da mesma forma para frente e para trás"
+ },
+ "repeat": {
+ "description": "Esta ferramenta permite que você repita um determinado texto várias vezes com um separador opcional.",
+ "name": "Repetir texto",
+ "shortDescription": "Repita o texto várias vezes"
+ },
+ "reverse": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para inverter texto. Insira qualquer texto e inverta-o instantaneamente, caractere por caractere. Perfeito para criar texto espelhado, analisar palíndromos ou brincar com padrões de texto. Preserva espaços e caracteres especiais durante a inversão.",
+ "name": "Reverter",
+ "shortDescription": "Inverter qualquer texto caractere por caractere"
+ },
+ "toMorse": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para converter texto em código Morse. Carregue seu texto no formulário de entrada à esquerda e você obterá o código Morse instantaneamente na área de saída. Poderoso, gratuito e rápido. Carregue texto – obtenha código Morse.",
+ "name": "String para Morse",
+ "shortDescription": "Codifique rapidamente o texto para Morse"
+ },
+ "uppercase": {
+ "description": "O utilitário baseado em navegador mais simples do mundo para converter texto em letras maiúsculas. Basta inserir o texto e ele será convertido automaticamente para letras maiúsculas. Perfeito para criar títulos, enfatizar texto ou padronizar o formato de texto. Suporta vários formatos de texto e preserva caracteres especiais.",
+ "name": "Maiúsculas",
+ "shortDescription": "Converter texto em letras maiúsculas"
+ }
+ },
+ "toolExamples": {
+ "subtitle": "Clique para experimentar!",
+ "title": "{{title}} Exemplos"
+ },
+ "toolFileResult": {
+ "copied": "Arquivo copiado",
+ "copyFailed": "Falha ao copiar: {{error}}",
+ "loading": "Carregando... Isso pode demorar um momento.",
+ "result": "Resultado"
+ },
+ "toolHeader": {
+ "seeExamples": "Veja exemplos"
+ },
+ "toolLayout": {
+ "allToolsTitle": "Todos {{type}}"
+ },
+ "toolMultiFileResult": {
+ "copied": "Arquivo copiado",
+ "copyFailed": "Falha ao copiar: {{error}}",
+ "loading": "Carregando... Isso pode demorar um momento.",
+ "result": "Resultado"
+ },
+ "toolMultipleAudioInput": {
+ "inputTitle": "Entrada {{type}}",
+ "noFilesSelected": "Nenhum arquivo selecionado"
+ },
+ "toolMultiplePdfInput": {
+ "inputTitle": "Entrada {{type}}",
+ "noFilesSelected": "Nenhum arquivo selecionado"
+ },
+ "toolOptions": {
+ "title": "Opções de ferramentas"
+ },
+ "toolTextInput": {
+ "copied": "Texto copiado",
+ "copyFailed": "Falha ao copiar: {{error}}",
+ "input": "Texto de entrada",
+ "placeholder": "Digite seu texto aqui..."
+ },
+ "toolTextResult": {
+ "copied": "Texto copiado",
+ "copyFailed": "Falha ao copiar: {{error}}",
+ "loading": "Carregando... Isso pode demorar um momento.",
+ "result": "Resultado"
+ }
+}
diff --git a/public/locales/pt/video.json b/public/locales/pt/video.json
new file mode 100644
index 0000000..19f9077
--- /dev/null
+++ b/public/locales/pt/video.json
@@ -0,0 +1,113 @@
+{
+ "changeSpeed": {
+ "defaultMultiplier": "Multiplicador padrão: 2 significa 2x mais rápido",
+ "description": "Altere a velocidade de reprodução de arquivos de vídeo. Acelere ou desacelere vídeos, mantendo a sincronização do áudio. Suporta vários multiplicadores de velocidade e formatos de vídeo comuns.",
+ "inputTitle": "Entrada de vídeo",
+ "newVideoSpeed": "Nova velocidade de vídeo",
+ "resultTitle": "Vídeo editado",
+ "settingSpeed": "Definindo a velocidade",
+ "shortDescription": "Alterar a velocidade de reprodução do vídeo",
+ "title": "Alterar velocidade do vídeo",
+ "toolInfo": {
+ "title": "O que é um {{title}}?"
+ }
+ },
+ "compress": {
+ "default": "Padrão",
+ "description": "Compacte vídeos dimensionando-os para diferentes resoluções, como 240p, 480p, 720p, etc. Esta ferramenta ajuda a reduzir o tamanho do arquivo, mantendo uma qualidade aceitável. Suporta formatos de vídeo comuns, como MP4, WebM e OGG.",
+ "inputTitle": "Entrada de vídeo",
+ "loadingText": "Compactando vídeo...",
+ "lossless": "Sem perdas",
+ "quality": "Qualidade (CRF)",
+ "resolution": "Resolução",
+ "resultTitle": "Vídeo compactado",
+ "shortDescription": "Comprimir vídeos dimensionando-os para diferentes resoluções",
+ "title": "Comprimir vídeo",
+ "worst": "Pior"
+ },
+ "cropVideo": {
+ "cropCoordinates": "Coordenadas de corte",
+ "croppingVideo": "Recortando vídeo",
+ "description": "Corte o vídeo para remover áreas indesejadas.",
+ "errorBeyondHeight": "A área de corte se estende além da altura do vídeo ({{height}}px)",
+ "errorBeyondWidth": "A área de corte se estende além da largura do vídeo ({{width}}px)",
+ "errorCroppingVideo": "Erro ao cortar o vídeo. Verifique os parâmetros e o arquivo de vídeo.",
+ "errorLoadingDimensions": "Falha ao carregar as dimensões do vídeo",
+ "errorNonNegativeCoordinates": "As coordenadas X e Y devem ser não negativas",
+ "errorPositiveDimensions": "Largura e altura devem ser positivas",
+ "height": "Altura",
+ "inputTitle": "Entrada de vídeo",
+ "loadVideoForDimensions": "Carregue um vídeo para ver as dimensões",
+ "resultTitle": "Vídeo recortado",
+ "shortDescription": "Recorte o vídeo para remover áreas indesejadas",
+ "title": "Cortar vídeo",
+ "toolInfo": {
+ "description": "Esta ferramenta permite cortar arquivos de vídeo para remover áreas indesejadas. Você pode especificar a área de corte definindo as coordenadas X, Y e as dimensões de largura e altura.",
+ "title": "Cortar vídeo"
+ },
+ "videoDimensions": "Dimensões do vídeo: {{width}} × {{height}} pixels",
+ "videoInformation": "Informações do vídeo",
+ "width": "Largura",
+ "xCoordinate": "X (esquerda)",
+ "yCoordinate": "Y (topo)"
+ },
+ "flip": {
+ "description": "Inverta arquivos de vídeo horizontal ou verticalmente. Espelhe vídeos para obter efeitos especiais ou corrigir problemas de orientação.",
+ "flippingVideo": "Invertendo o vídeo",
+ "horizontalLabel": "Horizontal (Espelho)",
+ "inputTitle": "Entrada de vídeo",
+ "orientation": "Orientação",
+ "resultTitle": "Vídeo invertido",
+ "shortDescription": "Inverter o vídeo horizontalmente ou verticalmente",
+ "title": "Flip Video",
+ "verticalLabel": "Vertical (de cabeça para baixo)"
+ },
+ "gif": {
+ "changeSpeed": {
+ "description": "Altere a velocidade de reprodução de animações GIF. Acelere ou desacelere GIFs, mantendo a animação suave.",
+ "shortDescription": "Alterar a velocidade da animação GIF",
+ "title": "Alterar velocidade do GIF"
+ }
+ },
+ "loop": {
+ "description": "Crie um vídeo em loop repetindo o vídeo original várias vezes.",
+ "inputTitle": "Entrada de vídeo",
+ "loopingVideo": "Vídeo em loop",
+ "loops": "Laços",
+ "numberOfLoops": "Número de Loops",
+ "resultTitle": "Vídeo em loop",
+ "shortDescription": "Crie arquivos de vídeo em loop",
+ "title": "Vídeo em loop",
+ "toolInfo": {
+ "description": "Esta ferramenta permite criar um vídeo em loop repetindo o vídeo original várias vezes. Você pode especificar quantas vezes o vídeo deve ser repetido.",
+ "title": "O que é um {{title}}?"
+ }
+ },
+ "rotate": {
+ "180Degrees": "180° (de cabeça para baixo)",
+ "270Degrees": "270° (90° sentido anti-horário)",
+ "90Degrees": "90° no sentido horário",
+ "description": "Gire arquivos de vídeo em 90, 180 ou 270 graus. Corrija a orientação do vídeo ou crie efeitos especiais com controle de rotação preciso.",
+ "inputTitle": "Entrada de vídeo",
+ "resultTitle": "Vídeo girado",
+ "rotatingVideo": "Vídeo rotativo",
+ "rotation": "Rotação",
+ "shortDescription": "Girar o vídeo em graus especificados",
+ "title": "Girar vídeo"
+ },
+ "trim": {
+ "description": "Corte arquivos de vídeo especificando os horários de início e término. Remova trechos indesejados do início ou do fim dos vídeos.",
+ "endTime": "Fim dos tempos",
+ "inputTitle": "Entrada de vídeo",
+ "resultTitle": "Vídeo recortado",
+ "shortDescription": "Corte o vídeo removendo seções indesejadas",
+ "startTime": "Hora de início",
+ "timestamps": "Carimbos de data e hora",
+ "title": "Cortar vídeo"
+ },
+ "videoToGif": {
+ "description": "Converta arquivos de vídeo para o formato GIF animado. Extraia intervalos de tempo específicos e crie imagens animadas compartilháveis.",
+ "shortDescription": "Converter vídeo em GIF animado",
+ "title": "Vídeo para GIF"
+ }
+}
diff --git a/public/locales/pt/xml.json b/public/locales/pt/xml.json
new file mode 100644
index 0000000..4e6b12d
--- /dev/null
+++ b/public/locales/pt/xml.json
@@ -0,0 +1,38 @@
+{
+ "xmlBeautifier": {
+ "description": "Formate XML com recuo e espaçamento adequados.",
+ "indentation": "Recuo",
+ "inputTitle": "XML de entrada",
+ "resultTitle": "XML embelezado",
+ "shortDescription": "Formate e embeleze o código XML",
+ "title": "Embelezador XML",
+ "toolInfo": {
+ "description": "Esta ferramenta permite formatar dados XML com recuo e espaçamento adequados, tornando-os mais legíveis e fáceis de trabalhar.",
+ "title": "Embelezador XML"
+ },
+ "useSpaces": "Use Espaços",
+ "useSpacesDescription": "Recuar a saída com espaços",
+ "useTabs": "Usar guias",
+ "useTabsDescription": "Recuar a saída com tabulações."
+ },
+ "xmlValidator": {
+ "description": "Valide a sintaxe e a estrutura do XML.",
+ "placeholder": "Cole ou importe XML aqui...",
+ "shortDescription": "Validar código XML para erros",
+ "title": "Validador XML",
+ "toolInfo": {
+ "description": "Esta ferramenta permite validar a sintaxe e a estrutura do XML. Ela verifica se o XML está bem formado e fornece mensagens de erro detalhadas para quaisquer problemas encontrados.",
+ "title": "Validador XML"
+ }
+ },
+ "xmlViewer": {
+ "description": "Visualize e explore a estrutura XML em formato de árvore.",
+ "inputTitle": "XML de entrada",
+ "resultTitle": "Visualização em árvore XML",
+ "title": "Visualizador XML",
+ "toolInfo": {
+ "description": "Esta ferramenta permite que você visualize dados XML em um formato de árvore hierárquica, facilitando a exploração e a compreensão da estrutura de documentos XML.",
+ "title": "Visualizador XML"
+ }
+ }
+}
diff --git a/public/locales/ru/audio.json b/public/locales/ru/audio.json
new file mode 100644
index 0000000..cab0caa
--- /dev/null
+++ b/public/locales/ru/audio.json
@@ -0,0 +1,42 @@
+{
+ "changeSpeed": {
+ "description": "Измените скорость воспроизведения аудиофайлов. Ускорьте или замедлите звук, сохраняя высоту звука.",
+ "inputTitle": "Входной аудиосигнал",
+ "newAudioSpeed": "Новая скорость звука",
+ "outputFormat": "Формат вывода",
+ "resultTitle": "Отредактированный аудиофайл",
+ "settingSpeed": "Скорость установки",
+ "shortDescription": "Изменить скорость аудиофайлов",
+ "speedDescription": "Множитель по умолчанию: 2 означает в 2 раза быстрее",
+ "title": "Изменить скорость звука",
+ "toolInfo": {
+ "title": "Что такое {{title}}?"
+ }
+ },
+ "extractAudio": {
+ "description": "Извлечь звуковую дорожку из видеофайлов.",
+ "extractingAudio": "Извлечение аудио",
+ "inputTitle": "Входное видео",
+ "outputFormat": "Формат вывода",
+ "outputFormatDescription": "Выберите формат, в котором будет извлечен аудиофайл.",
+ "resultTitle": "Извлеченный аудиофайл",
+ "shortDescription": "Извлекайте аудио из видеофайлов (MP4, MOV и т. д.) в форматы AAC, MP3 или WAV.",
+ "title": "Извлечь аудио из видео",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет извлекать звуковую дорожку из видеофайлов. Вы можете выбрать различные аудиоформаты, включая AAC, MP3 и WAV.",
+ "title": "Что такое {{title}}?"
+ }
+ },
+ "mergeAudio": {
+ "description": "Объедините несколько аудиофайлов в один, объединив их последовательно.",
+ "longDescription": "Этот инструмент позволяет объединить несколько аудиофайлов в один, объединяя их в порядке загрузки. Идеально подходит для объединения фрагментов подкастов, музыкальных треков и любых других аудиофайлов, которые необходимо объединить. Поддерживает различные аудиоформаты, включая MP3, AAC и WAV.",
+ "shortDescription": "Объединить несколько аудиофайлов в один (MP3, AAC, WAV).",
+ "title": "Объединить аудио"
+ },
+ "trim": {
+ "description": "Вырезайте и обрезайте аудиофайлы, чтобы извлечь определенные сегменты, указав время начала и окончания.",
+ "longDescription": "Этот инструмент позволяет обрезать аудиофайлы, указав начальное и конечное время. Вы можете извлекать отдельные фрагменты из длинных аудиофайлов, удалять ненужные фрагменты или создавать более короткие клипы. Поддерживает различные аудиоформаты, включая MP3, AAC и WAV. Идеально подходит для редактирования подкастов, создания музыки и любых других задач аудиомонтажа.",
+ "shortDescription": "Обрезайте аудиофайлы, извлекая определенные временные сегменты (MP3, AAC, WAV).",
+ "title": "Обрезать аудио"
+ }
+}
diff --git a/public/locales/ru/csv.json b/public/locales/ru/csv.json
new file mode 100644
index 0000000..1ce4f2d
--- /dev/null
+++ b/public/locales/ru/csv.json
@@ -0,0 +1,114 @@
+{
+ "changeCsvSeparator": {
+ "description": "Измените разделитель/разделитель в CSV-файлах. Конвертируйте данные между различными форматами CSV, такими как запятая, точка с запятой, табуляция или пользовательские разделители.",
+ "shortDescription": "Изменить разделитель CSV-файла",
+ "title": "Изменить разделитель CSV"
+ },
+ "csvRowsToColumns": {
+ "description": "Этот инструмент преобразует строки CSV-файла (значения, разделённые запятыми) в столбцы. Он извлекает горизонтальные строки из входного CSV-файла одну за другой, поворачивает их на 90 градусов и выводит в виде вертикальных столбцов, разделённых запятыми.', longDescription: 'Этот инструмент преобразует строки CSV-файла (значения, разделённые запятыми) в столбцы. Например, если входные данные CSV-файла содержат 6 строк, то и выходные данные будут содержать 6 столбцов, а элементы строк будут расположены сверху вниз. В правильно сформированном CSV-файле количество значений в каждой строке одинаково. Однако, если в строках отсутствуют поля, программа может их исправить, и вы можете выбрать один из доступных вариантов: заполнить отсутствующие данные пустыми элементами или заменить отсутствующие данные пользовательскими элементами, такими как «missing», «?» или «x». В процессе преобразования инструмент также очищает CSV-файл от ненужной информации, такой как пустые строки (строки без видимой информации) и комментарии. Чтобы инструмент правильно распознавал комментарии, в настройках можно указать символ в начале строки, с которой начинается комментарий. Обычно это решётка «#» или двойной слеш «//». CSV-abulous!",
+ "longDescription": "Этот инструмент преобразует строки CSV-файла (файл с разделителями-запятыми) в столбцы. Например, если входные данные CSV-файла содержат 6 строк, выходные данные будут содержать 6 столбцов, а элементы строк будут расположены сверху вниз. В правильно сформированном CSV-файле количество значений в каждой строке одинаково. Однако, если в строках отсутствуют поля, программа может их исправить, и вы можете выбрать один из доступных вариантов: заполнить отсутствующие данные пустыми элементами или заменить отсутствующие данные пользовательскими элементами, например,",
+ "shortDescription": "Преобразовать строки CSV в столбцы.",
+ "title": "Преобразование строк CSV в столбцы"
+ },
+ "csvToJson": {
+ "columnSeparator": "Разделитель столбцов (например, , ; \\t)",
+ "commentSymbol": "Символ комментария (например, #)",
+ "conversionOptions": "Варианты конвертации",
+ "description": "Конвертируйте CSV-файлы в формат JSON с настраиваемыми параметрами разделителей, кавычек и форматирования вывода. Поддержка заголовков, комментариев и динамического преобразования типов.",
+ "dynamicTypes": "Динамические типы",
+ "dynamicTypesDescription": "Автоматически преобразовывать числа и логические значения",
+ "errorParsing": "Ошибка анализа CSV: {{error}}",
+ "fieldQuote": "Поле Цитата (например, \")",
+ "inputCsvFormat": "Входной формат CSV",
+ "inputTitle": "Входной CSV-файл",
+ "resultTitle": "Выходной JSON",
+ "shortDescription": "Конвертируйте данные CSV в формат JSON.",
+ "skipEmptyLines": "Пропускать пустые строки",
+ "skipEmptyLinesDescription": "Игнорировать пустые строки во входном CSV-файле",
+ "title": "Конвертировать CSV в JSON",
+ "useHeaders": "Использовать заголовки",
+ "useHeadersDescription": "Относиться к первой строке как к заголовкам столбцов"
+ },
+ "csvToTsv": {
+ "description": "Загрузите CSV-файл в форму ниже, и он будет автоматически преобразован в TSV-файл. В настройках инструмента вы можете настроить формат входного CSV-файла: указать разделитель полей, символ кавычек и символ комментария, а также включить пропуск пустых строк CSV-файла и выбрать, сохранять ли заголовки столбцов CSV-файла.",
+ "longDescription": "Этот инструмент преобразует данные из формата CSV (Comma Separated Values) в данные из формата TSV (Tab Separated Values). CSV и TSV — популярные форматы файлов для хранения табличных данных, но в них используются разные разделители для разделения значений: в CSV используются запятые (",
+ "shortDescription": "Конвертировать данные CSV в формат TSV.",
+ "title": "Конвертировать CSV в TSV"
+ },
+ "csvToXml": {
+ "description": "Конвертируйте CSV-файлы в формат XML с настраиваемыми параметрами.",
+ "shortDescription": "Конвертировать данные CSV в формат XML.",
+ "title": "Конвертировать CSV в XML"
+ },
+ "csvToYaml": {
+ "description": "Просто загрузите CSV-файл в форму ниже, и он автоматически будет преобразован в YAML-файл. В настройках инструмента вы можете указать символ разделителя полей, символ кавычки и символ комментария, чтобы адаптировать инструмент к пользовательским форматам CSV. Кроме того, вы можете выбрать выходной формат YAML: с сохранением заголовков CSV или без них.",
+ "longDescription": "Этот инструмент преобразует данные CSV (значения, разделенные запятыми) в данные YAML (еще один язык разметки). CSV — это простой табличный формат, используемый для представления матричных типов данных, состоящих из строк и столбцов. YAML, с другой стороны, — более продвинутый формат (фактически, надмножество JSON), который создает более удобочитаемые данные для сериализации и поддерживает списки, словари и вложенные объекты. Эта программа поддерживает различные форматы входных CSV: входные данные могут быть разделены запятыми (по умолчанию), точкой с запятой, вертикальной чертой или использовать совершенно другой разделитель. Вы можете указать точный разделитель, который будут использовать ваши данные, в параметрах. Аналогично, в параметрах вы можете указать символ кавычек, который будет использоваться для переноса полей CSV (по умолчанию это символ двойной кавычки). Вы также можете пропускать строки, начинающиеся с комментариев, указав символы комментариев в параметрах. Это позволяет поддерживать чистоту данных, пропуская ненужные строки. Существует два способа преобразования CSV в YAML. Первый метод преобразует каждую строку CSV в список YAML. Второй метод извлекает заголовки из первой строки CSV и создает объекты YAML с ключами на основе этих заголовков. Вы также можете настроить выходной формат YAML, указав количество пробелов для отступов в структурах YAML. Если вам необходимо выполнить обратное преобразование, то есть преобразовать YAML в CSV, вы можете воспользоваться нашим инструментом для преобразования YAML в CSV. Csv-abulous!",
+ "shortDescription": "Быстро конвертируйте CSV-файл в YAML-файл.",
+ "title": "Конвертировать CSV в YAML"
+ },
+ "findIncompleteCsvRecords": {
+ "checkingOptions": "Проверка параметров",
+ "commentCharacterDescription": "Введите символ начала строки комментария. Строки, начинающиеся с этого символа, будут пропущены.",
+ "csvInputOptions": "Параметры ввода CSV",
+ "csvSeparatorDescription": "Введите символ, используемый для разделения столбцов во входном CSV-файле.",
+ "deleteLinesWithNoData": "Удалить строки без данных",
+ "deleteLinesWithNoDataDescription": "Удалить пустые строки из входного CSV-файла.",
+ "description": "Просто загрузите CSV-файл в форму ниже, и этот инструмент автоматически проверит наличие всех пропущенных значений в строках и столбцах. В настройках инструмента можно настроить формат входного файла (указать разделитель, символ кавычки и символ комментария). Кроме того, можно включить проверку на наличие пустых значений, пропускать пустые строки и установить ограничение на количество сообщений об ошибках в выходных данных.",
+ "findEmptyValues": "Найти пустые значения",
+ "findEmptyValuesDescription": "Вывести сообщение о пустых полях CSV (это не отсутствующие поля, а поля, которые ничего не содержат).",
+ "inputTitle": "Входной CSV-файл",
+ "limitNumberOfMessages": "Ограничить количество сообщений",
+ "messageLimitDescription": "Установите ограничение на количество сообщений в выводе.",
+ "quoteCharacterDescription": "Введите символ кавычек, используемый для заключения в кавычки полей ввода CSV.",
+ "resultTitle": "Статус CSV",
+ "shortDescription": "Быстро находите строки и столбцы в CSV-файле, в которых отсутствуют значения.",
+ "title": "Найти неполные записи CSV",
+ "toolInfo": {
+ "title": "Что такое {{title}}?"
+ }
+ },
+ "insertCsvColumns": {
+ "appendColumns": "Добавить столбцы",
+ "commentCharacterDescription": "Введите символ начала строки комментария. Строки, начинающиеся с этого символа, будут пропущены.",
+ "csvOptions": "Параметры CSV",
+ "csvSeparator": "CSV-разделитель",
+ "csvToInsert": "CSV для вставки",
+ "csvToInsertDescription": "Введите один или несколько столбцов, которые вы хотите вставить в CSV-файл. Символ, используемый для разделения столбцов, должен совпадать с символом во входном CSV-файле. P.S. Пустые строки будут игнорироваться.",
+ "customFillDescription": "Если входной CSV-файл неполный (отсутствуют значения), то можно ли добавить пустые поля или пользовательские символы в записи, чтобы создать правильно сформированный CSV-файл?",
+ "customFillValueDescription": "Используйте это пользовательское значение для заполнения отсутствующих полей. (Работает только с режимом «Пользовательские значения», описанным выше.)",
+ "customPosition": "Пользовательская позиция",
+ "customPositionOptionsDescription": "Выберите способ вставки столбцов в CSV-файл.",
+ "description": "Добавить новые столбцы в данные CSV в указанных позициях.",
+ "fillWithCustomValues": "Заполнить таможенные значения",
+ "fillWithEmptyValues": "Заполнить пустыми значениями",
+ "headerName": "Имя заголовка",
+ "headerNameDescription": "Заголовок столбца, после которого вы хотите вставить столбцы.",
+ "inputTitle": "Входной CSV-файл",
+ "insertingPositionDescription": "Укажите, куда вставлять столбцы в CSV-файле.",
+ "position": "Позиция",
+ "positionOptions": "Варианты позиций",
+ "prependColumns": "Добавить столбцы",
+ "quoteCharDescription": "Введите символ кавычек, используемый для заключения в кавычки полей ввода CSV.",
+ "resultTitle": "Вывод CSV",
+ "rowNumberDescription": "Номер столбца, после которого вы хотите вставить столбцы.",
+ "separatorDescription": "Введите символ, используемый для разделения столбцов во входном CSV-файле.",
+ "shortDescription": "Быстро вставляйте один или несколько новых столбцов в любое место CSV-файла.",
+ "title": "Вставить столбцы CSV",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет добавлять новые столбцы в CSV-данные в заданных позициях. Вы можете добавлять столбцы в начало, конец или вставлять их в произвольные позиции, используя названия заголовков или номера столбцов.",
+ "title": "Вставить столбцы CSV"
+ }
+ },
+ "swapCsvColumns": {
+ "description": "Просто загрузите CSV-файл в форму ниже, укажите столбцы для замены, и инструмент автоматически изменит положение указанных столбцов в выходном файле. В настройках инструмента вы можете указать положение или названия столбцов, которые хотите заменить, а также исправить неполные данные и при необходимости удалить пустые и закомментированные записи.",
+ "longDescription": "Этот инструмент реорганизует данные CSV, меняя местами столбцы. Перестановка столбцов может улучшить читаемость CSV-файла, размещая часто используемые данные вместе или в начале для более удобного сравнения и редактирования. Например, можно поменять местами первый столбец с последним или второй столбец с третьим. Чтобы поменять местами столбцы, выберите",
+ "shortDescription": "Изменить порядок столбцов CSV.",
+ "title": "Поменять местами столбцы CSV"
+ },
+ "transposeCsv": {
+ "description": "Просто загрузите свой CSV-файл в форму ниже, и этот инструмент автоматически транспонирует его. В настройках инструмента вы можете указать символ, с которого начинаются строки комментариев в CSV-файле, чтобы удалить их. Кроме того, если CSV-файл неполный (содержат пропущенные значения), вы можете заменить пропущенные значения пустым символом или пользовательским символом.",
+ "longDescription": "Этот инструмент транспонирует данные, разделенные запятыми (CSV). Он обрабатывает CSV как матрицу данных и переворачивает все элементы по главной диагонали. Выходные данные содержат те же данные CSV, что и входные, но теперь все строки стали столбцами, а все столбцы — строками. После транспонирования CSV-файл будет иметь противоположные размеры. Например, если входной файл содержит 4 столбца и 3 строки, выходной файл будет содержать 3 столбца и 4 строки. Во время преобразования программа также очищает данные от ненужных строк и исправляет неполные данные. В частности, инструмент автоматически удаляет все пустые записи и комментарии, начинающиеся с определенного символа, который можно задать в настройках. Кроме того, в случае повреждения или потери данных CSV-файла утилита дополняет файл пустыми полями или пользовательскими полями, которые можно указать в настройках. CSV-abulous!",
+ "shortDescription": "Быстро транспонируйте CSV-файл.",
+ "title": "Транспонировать CSV"
+ }
+}
diff --git a/public/locales/ru/image.json b/public/locales/ru/image.json
new file mode 100644
index 0000000..5726b00
--- /dev/null
+++ b/public/locales/ru/image.json
@@ -0,0 +1,98 @@
+{
+ "changeColors": {
+ "description": "Мир",
+ "shortDescription": "Быстро поменяйте цвета на изображении",
+ "title": "Изменить цвета на изображении"
+ },
+ "changeOpacity": {
+ "description": "Легко настраивайте прозрачность изображений. Просто загрузите изображение, установите желаемый уровень непрозрачности с помощью ползунка от 0 (полностью прозрачно) до 1 (полностью непрозрачно) и скачайте изменённое изображение.",
+ "shortDescription": "Отрегулируйте прозрачность изображений",
+ "title": "Изменить непрозрачность изображения"
+ },
+ "compress": {
+ "description": "Уменьшите размер файла изображения, сохранив качество.",
+ "inputTitle": "Входное изображение",
+ "resultTitle": "Сжатое изображение",
+ "shortDescription": "Сжимайте изображения, чтобы уменьшить размер файла, сохраняя при этом приемлемое качество.",
+ "title": "Сжать изображение"
+ },
+ "compressPng": {
+ "description": "Это программа для сжатия изображений в формате PNG. После того, как вы вставите изображение в поле ввода, программа сожмёт его и отобразит результат в поле вывода. В настройках можно настроить степень сжатия, а также посмотреть старый и новый размеры файла изображения.",
+ "shortDescription": "Быстро сжать PNG",
+ "title": "Сжать png"
+ },
+ "convertJgpToPng": {
+ "description": "Быстро конвертируйте изображения JPG в PNG. Просто импортируйте изображение PNG в редактор слева.",
+ "shortDescription": "Быстро конвертируйте изображения JPG в PNG",
+ "title": "Конвертировать JPG в PNG"
+ },
+ "convertToJpg": {
+ "description": "Конвертируйте различные форматы изображений (PNG, GIF, TIF, PSD, SVG, WEBP, HEIC, RAW) в JPG с настраиваемыми параметрами качества и цвета фона.",
+ "shortDescription": "Конвертируйте изображения в JPG с контролем качества",
+ "title": "Конвертировать изображения в JPG"
+ },
+ "createTransparent": {
+ "description": "Мир",
+ "shortDescription": "Быстро сделать изображение прозрачным",
+ "title": "Создать прозрачный PNG"
+ },
+ "crop": {
+ "description": "Обрезайте изображения, чтобы удалить нежелательные области.",
+ "inputTitle": "Входное изображение",
+ "resultTitle": "Обрезанное изображение",
+ "shortDescription": "Быстро обрезайте изображения.",
+ "title": "Обрезать изображение"
+ },
+ "editor": {
+ "description": "Расширенный редактор изображений с инструментами для обрезки, поворота, аннотирования, настройки цветов и добавления водяных знаков. Редактируйте изображения с помощью профессиональных инструментов прямо в браузере.",
+ "shortDescription": "Редактируйте изображения с помощью расширенных инструментов и функций",
+ "title": "Редактор изображений"
+ },
+ "imageToText": {
+ "description": "Извлекайте текст из изображений (JPG, PNG) с помощью оптического распознавания символов (OCR).",
+ "shortDescription": "Извлекайте текст из изображений с помощью OCR.",
+ "title": "Изображение в текст (OCR)"
+ },
+ "qrCode": {
+ "description": "Создавайте QR-коды для различных типов данных: URL, текст, электронная почта, телефон, SMS, Wi-Fi, vCard и т. д.",
+ "shortDescription": "Создавайте индивидуальные QR-коды для различных форматов данных.",
+ "title": "Генератор QR-кода"
+ },
+ "removeBackground": {
+ "description": "Мир",
+ "shortDescription": "Автоматически удалять фоны с изображений",
+ "title": "Удалить фон из изображения"
+ },
+ "resize": {
+ "description": "Изменяйте размеры изображений до разных размеров.",
+ "dimensionType": "Тип измерения",
+ "heightDescription": "Высота (в пикселях)",
+ "inputTitle": "Входное изображение",
+ "maintainAspectRatio": "Сохранять соотношение сторон",
+ "maintainAspectRatioDescription": "Сохраните исходное соотношение сторон изображения.",
+ "percentage": "Процент",
+ "percentageDescription": "Процент от исходного размера (например, 50 для половинного размера, 200 для двойного размера)",
+ "resizeByPercentage": "Изменить размер в процентах",
+ "resizeByPercentageDescription": "Измените размер, указав процент от исходного размера.",
+ "resizeByPixels": "Изменить размер по пикселям",
+ "resizeByPixelsDescription": "Измените размер, указав размеры в пикселях.",
+ "resizeMethod": "Метод изменения размера",
+ "resultTitle": "Измененное изображение",
+ "setHeight": "Установить высоту",
+ "setHeightDescription": "Укажите высоту в пикселях и рассчитайте ширину на основе соотношения сторон.",
+ "setWidth": "Установить ширину",
+ "setWidthDescription": "Укажите ширину в пикселях и рассчитайте высоту на основе соотношения сторон.",
+ "shortDescription": "Легко изменяйте размер изображений.",
+ "title": "Изменить размер изображения",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет изменять размер изображений JPG, PNG, SVG или GIF. Размер можно изменять, указывая значения в пикселях или процентах, с возможностью сохранения исходного соотношения сторон.",
+ "title": "Изменить размер изображения"
+ },
+ "widthDescription": "Ширина (в пикселях)"
+ },
+ "rotate": {
+ "description": "Повернуть изображение на указанный угол.",
+ "shortDescription": "Легко поворачивайте изображение.",
+ "title": "Повернуть изображение"
+ }
+}
diff --git a/public/locales/ru/json.json b/public/locales/ru/json.json
new file mode 100644
index 0000000..b6bc6c2
--- /dev/null
+++ b/public/locales/ru/json.json
@@ -0,0 +1,62 @@
+{
+ "escapeJson": {
+ "description": "Экранируйте специальные символы в строках JSON. Преобразуйте данные JSON в корректно экранированный формат для безопасной передачи и хранения.",
+ "shortDescription": "Экранирование специальных символов в JSON",
+ "title": "Escape JSON"
+ },
+ "jsonToXml": {
+ "description": "Преобразуйте данные JSON в формат XML. Преобразуйте структурированные объекты JSON в корректные XML-документы.",
+ "shortDescription": "Конвертировать формат JSON в XML",
+ "title": "JSON в XML"
+ },
+ "minify": {
+ "description": "Удалите все ненужные пробелы из JSON.",
+ "inputTitle": "Входной JSON",
+ "resultTitle": "Минимизированный JSON",
+ "shortDescription": "Минимизируйте JSON, удалив пробелы",
+ "title": "Минифицировать JSON",
+ "toolInfo": {
+ "description": "Минификация JSON — это процесс удаления всех ненужных пробелов из JSON-данных с сохранением их корректности. Это включает в себя удаление пробелов, переносов строк и отступов, которые не требуются для корректного анализа JSON-данных. Минификация уменьшает размер JSON-данных, делая их более эффективными для хранения и передачи, сохраняя при этом прежнюю структуру данных и значения.",
+ "title": "Что такое минификация JSON?"
+ }
+ },
+ "prettify": {
+ "description": "Отформатируйте JSON с правильными отступами и пробелами.",
+ "indentation": "Отступ",
+ "inputTitle": "Входной JSON",
+ "resultTitle": "Упрощенный JSON",
+ "shortDescription": "Форматируйте и украшайте JSON-код",
+ "title": "Упрощение JSON",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет форматировать данные JSON с правильными отступами и интервалами, что делает их более читабельными и удобными для работы.",
+ "title": "Упрощение JSON"
+ },
+ "useSpaces": "Используйте пробелы",
+ "useSpacesDescription": "Отступ вывода с пробелами",
+ "useTabs": "Использовать вкладки",
+ "useTabsDescription": "Отступ вывода с помощью табуляции."
+ },
+ "stringify": {
+ "description": "Преобразуйте объекты JavaScript в строки формата JSON. Сериализуйте структуры данных в строки JSON для хранения или передачи.",
+ "shortDescription": "Преобразование объектов в строку JSON",
+ "title": "Строкификация JSON"
+ },
+ "tsvToJson": {
+ "description": "Преобразуйте данные TSV (значения, разделенные табуляцией) в формат JSON. Преобразуйте табличные данные в структурированные объекты JSON.",
+ "shortDescription": "Конвертировать формат TSV в JSON",
+ "title": "TSV в JSON"
+ },
+ "validateJson": {
+ "description": "Проверьте корректность и правильность формата JSON.",
+ "inputTitle": "Входной JSON",
+ "invalidJson": "❌ {{error}}",
+ "resultTitle": "Результат проверки",
+ "shortDescription": "Проверить JSON-код на наличие ошибок",
+ "title": "Проверить JSON",
+ "toolInfo": {
+ "description": "JSON (JavaScript Object Notation) — это облегчённый формат обмена данными. Проверка JSON гарантирует соответствие структуры данных стандарту JSON. Корректный объект JSON должен иметь: - Имена свойств, заключённые в двойные кавычки. - Правильно сбалансированные фигурные скобки {}. - Отсутствие запятых после последней пары «ключ-значение». - Корректную вложенность объектов и массивов. Этот инструмент проверяет входной JSON и предоставляет обратную связь, помогающую выявлять и исправлять распространённые ошибки.",
+ "title": "Что такое валидация JSON?"
+ },
+ "validJson": "✅ Действительный JSON"
+ }
+}
diff --git a/public/locales/ru/list.json b/public/locales/ru/list.json
new file mode 100644
index 0000000..dd7a407
--- /dev/null
+++ b/public/locales/ru/list.json
@@ -0,0 +1,208 @@
+{
+ "duplicate": {
+ "concatenate": "Объединить",
+ "concatenateDescription": "Объединить копии (если этот флажок не установлен, элементы будут переплетены)",
+ "copyDescription": "Количество копий (может быть дробным)",
+ "description": "Самая простая в мире браузерная утилита для копирования элементов списка. Введите список и укажите критерии копирования, чтобы создать копии элементов. Идеально подходит для расширения данных, тестирования или создания повторяющихся шаблонов.",
+ "duplicationOptions": "Варианты дублирования",
+ "examples": {
+ "fractional": {
+ "description": "В этом примере показано, как дублировать список с дробным числом копий.",
+ "title": "Дробное дублирование"
+ },
+ "interweave": {
+ "description": "В этом примере показано, как переплетать элементы, а не объединять их.",
+ "title": "Переплетение предметов"
+ },
+ "reverse": {
+ "description": "В этом примере показано, как дублировать список в обратном порядке.",
+ "title": "Обратное дублирование"
+ },
+ "simple": {
+ "description": "В этом примере показано, как дублировать список слов.",
+ "title": "Простое дублирование"
+ }
+ },
+ "inputTitle": "Список входных данных",
+ "joinSeparatorDescription": "Разделитель для присоединения к дублированному списку",
+ "resultTitle": "Дублированный список",
+ "reverse": "Обеспечить регресс",
+ "reverseDescription": "Отменить дублирующиеся элементы",
+ "shortDescription": "Дублировать элементы списка с указанными критериями",
+ "splitByRegex": "Разделить по регулярному выражению",
+ "splitBySymbol": "Разделить по символу",
+ "splitOptions": "Варианты разделения",
+ "splitSeparatorDescription": "Разделитель для разделения списка",
+ "title": "Дубликат",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет дублировать элементы списка. Вы можете указать количество копий (включая дробные значения), управлять объединением или переплетением элементов и даже инвертировать дублированные элементы. Он полезен для создания повторяющихся шаблонов, генерации тестовых данных или расширения списков с предсказуемым содержимым.",
+ "title": "Дублирование списка"
+ }
+ },
+ "findMostPopular": {
+ "description": "Самая простая в мире браузерная утилита для поиска самых популярных элементов в списке. Введите данные из списка и мгновенно получите элементы, которые встречаются чаще всего. Идеально подходит для анализа данных, выявления тенденций или поиска общих элементов.",
+ "shortDescription": "Найти наиболее часто встречающиеся элементы",
+ "title": "Найти самые популярные"
+ },
+ "findUnique": {
+ "caseSensitiveItems": "Элементы, чувствительные к регистру",
+ "caseSensitiveItemsDescription": "Выводить элементы с разным регистром как уникальные элементы в списке.",
+ "delimiterDescription": "Установите разделительный символ или регулярное выражение.",
+ "description": "Самая простая в мире браузерная утилита для поиска уникальных элементов в списке. Введите данные из списка и мгновенно получите все уникальные значения, удалив дубликаты. Идеально подходит для очистки данных, дедупликации или поиска уникальных элементов.",
+ "findAbsolutelyUniqueItems": "Найдите абсолютно уникальные предметы",
+ "findAbsolutelyUniqueItemsDescription": "Отображать только те элементы списка, которые существуют в единственном экземпляре.",
+ "inputListDelimiter": "Разделитель входного списка",
+ "inputTitle": "Список входных данных",
+ "outputListDelimiter": "Разделитель выходного списка",
+ "resultTitle": "Уникальные предметы",
+ "shortDescription": "Найти уникальные элементы в списке",
+ "skipEmptyItems": "Пропустить пустые элементы",
+ "skipEmptyItemsDescription": "Не включайте пустые элементы списка в вывод.",
+ "title": "Найти уникальный",
+ "trimItems": "Элементы списка обрезки",
+ "trimItemsDescription": "Перед сравнением элементов удалите начальные и конечные пробелы.",
+ "uniqueItemOptions": "Уникальные параметры предмета"
+ },
+ "group": {
+ "deleteEmptyItems": "Удалить пустые элементы",
+ "deleteEmptyItemsDescription": "Игнорируйте пустые элементы и не включайте их в группы.",
+ "description": "Самая простая в мире браузерная утилита для группировки элементов списка. Введите список и укажите критерии группировки, чтобы организовать элементы в логические группы. Идеально подходит для категоризации данных, организации информации и создания структурированных списков. Поддерживает настраиваемые разделители и различные варианты группировки.",
+ "emptyItemsAndPadding": "Пустые предметы и заполнение",
+ "groupNumberDescription": "Количество предметов в группе",
+ "groupSeparatorDescription": "Символ разделителя групп",
+ "groupSizeAndSeparators": "Размер группы и разделители",
+ "inputItemSeparator": "Разделитель входных элементов",
+ "inputTitle": "Список входных данных",
+ "itemSeparatorDescription": "Символ разделителя элементов",
+ "leftWrapDescription": "Символ левого переноса группы.",
+ "padNonFullGroups": "Группы с неполным заполнением",
+ "padNonFullGroupsDescription": "Заполните неполные группы пользовательским элементом (введите ниже).",
+ "paddingCharDescription": "Используйте этот символ или элемент для заполнения неполных групп.",
+ "resultTitle": "Сгруппированные элементы",
+ "rightWrapDescription": "Правый символ переноса группы.",
+ "shortDescription": "Группировать элементы списка по общим свойствам",
+ "splitOperators": {
+ "regex": {
+ "description": "Разделите элементы входного списка с помощью регулярного выражения.",
+ "title": "Используйте регулярное выражение для разделения"
+ },
+ "symbol": {
+ "description": "Разделите элементы входного списка символом.",
+ "title": "Используйте символ для разделения"
+ }
+ },
+ "splitSeparatorDescription": "Установите разделительный символ или регулярное выражение.",
+ "title": "Группа"
+ },
+ "reverse": {
+ "description": "Это очень простое браузерное приложение, которое выводит все элементы списка в обратном порядке. Элементы ввода можно разделять любым символом, и вы также можете изменить разделитель для элементов перевёрнутого списка.",
+ "inputTitle": "Список входных данных",
+ "itemSeparator": "Разделитель элементов",
+ "itemSeparatorDescription": "Установите разделительный символ или регулярное выражение.",
+ "outputListOptions": "Параметры выходного списка",
+ "outputSeparatorDescription": "Разделитель элементов выходного списка.",
+ "resultTitle": "Обратный список",
+ "shortDescription": "Быстро перевернуть список",
+ "splitOperators": {
+ "regex": {
+ "description": "Разделите элементы входного списка с помощью регулярного выражения.",
+ "title": "Используйте регулярное выражение для разделения"
+ },
+ "symbol": {
+ "description": "Разделяйте элементы входного списка символами.",
+ "title": "Используйте символ для разделения"
+ }
+ },
+ "splitterMode": "Режим разделителя",
+ "title": "Обеспечить регресс",
+ "toolInfo": {
+ "description": "С помощью этой утилиты вы можете изменить порядок элементов в списке на обратный. Утилита сначала разбивает входной список на отдельные элементы, а затем проходит по ним от последнего к первому, выводя каждый элемент на выход. Входной список может содержать любые текстовые данные, включая цифры, числа, строки, слова, предложения и т. д. Разделителем элементов входного списка также может быть регулярное выражение. Например, регулярное выражение /[;,]/ позволит использовать элементы, разделённые запятыми или точкой с запятой. Разделители элементов входного и выходного списков можно настроить в параметрах. По умолчанию как входной, так и выходной списки разделяются запятыми. Listabulous!",
+ "title": "Что такое реверс списка?"
+ }
+ },
+ "rotate": {
+ "description": "Самая простая в мире браузерная утилита для поворота элементов списка. Введите список и укажите величину поворота, чтобы сместить элементы на указанное количество позиций. Идеально подходит для обработки данных, циклических сдвигов или изменения порядка списков.",
+ "shortDescription": "Повернуть элементы списка по указанным позициям",
+ "title": "Повернуть"
+ },
+ "shuffle": {
+ "delimiterDescription": "Установите разделительный символ или регулярное выражение.",
+ "description": "Самая простая в мире браузерная утилита для перемешивания элементов списка. Введите свой список и мгновенно получите его случайную версию с элементами в случайном порядке. Идеально подходит для создания разнообразия, проверки случайности или перемешивания упорядоченных данных.",
+ "inputListSeparator": "Разделитель входного списка",
+ "inputTitle": "Список входных данных",
+ "joinSeparatorDescription": "Используйте этот разделитель в рандомизированном списке.",
+ "outputLengthDescription": "Вывести столько случайных элементов",
+ "resultTitle": "Перемешанный список",
+ "shortDescription": "Расположить элементы списка в случайном порядке",
+ "shuffledListLength": "Длина перемешанного списка",
+ "shuffledListSeparator": "Разделитель перемешанного списка",
+ "title": "Перемешать"
+ },
+ "sort": {
+ "caseSensitive": "Сортировка с учетом регистра",
+ "caseSensitiveDescription": "Сортируйте элементы с заглавными и строчными буквами отдельно. Заглавные буквы располагаются перед строчными в списке по возрастанию. (Работает только в режиме сортировки по алфавиту.)",
+ "description": "Самая простая в мире браузерная утилита для сортировки элементов списка. Введите список и укажите критерии сортировки, чтобы упорядочить элементы по возрастанию или убыванию. Идеально подходит для организации данных, обработки текста и создания упорядоченных списков.",
+ "inputItemSeparator": "Разделитель входных элементов",
+ "inputTitle": "Список входных данных",
+ "joinSeparatorDescription": "Используйте этот символ для объединения элементов в отсортированном списке.",
+ "orderDescription": "Выберите порядок сортировки.",
+ "orderOptions": {
+ "decreasing": "В порядке убывания",
+ "increasing": "По возрастанию"
+ },
+ "removeDuplicates": "Удалить дубликаты",
+ "removeDuplicatesDescription": "Удалить дублирующиеся элементы списка.",
+ "resultTitle": "Сортированный список",
+ "shortDescription": "Сортировать элементы списка в указанном порядке",
+ "sortMethod": "Метод сортировки",
+ "sortMethodDescription": "Выберите метод сортировки.",
+ "sortOptions": {
+ "alphabetic": "Сортировать по алфавиту",
+ "length": "Сортировать по длине",
+ "numeric": "Сортировка по числам"
+ },
+ "sortedItemProperties": "Сортированные свойства элементов",
+ "splitOperators": {
+ "regex": {
+ "description": "Разделите элементы входного списка с помощью регулярного выражения.",
+ "title": "Используйте регулярное выражение для разделения"
+ },
+ "symbol": {
+ "description": "Разделяйте элементы входного списка символами.",
+ "title": "Используйте символ для разделения"
+ }
+ },
+ "splitSeparatorDescription": "Установите разделительный символ или регулярное выражение.",
+ "title": "Сортировать"
+ },
+ "truncate": {
+ "description": "Самая простая в мире браузерная утилита для обрезки списков. Введите список и укажите максимальное количество элементов, которые нужно сохранить. Идеально подходит для обработки данных, управления списками или ограничения длины контента.",
+ "shortDescription": "Сократить список до указанного количества элементов",
+ "title": "Усечение"
+ },
+ "unwrap": {
+ "description": "Самая простая в мире браузерная утилита для развёртывания элементов списка. Введите свой развёрнутый список и укажите критерии развёртывания, чтобы сделать упорядоченные элементы плоскими. Идеально подходит для обработки данных, работы с текстом или извлечения контента из структурированных списков.",
+ "shortDescription": "Извлечь элементы списка из структурированного формата",
+ "title": "Развернуть"
+ },
+ "wrap": {
+ "description": "Добавьте текст до и после каждого элемента списка.",
+ "inputTitle": "Список входных данных",
+ "joinSeparatorDescription": "Разделитель для присоединения к упакованному списку",
+ "leftTextDescription": "Текст, который нужно добавить перед каждым элементом",
+ "removeEmptyItems": "Удалить пустые элементы",
+ "resultTitle": "Обернутый список",
+ "rightTextDescription": "Текст, который нужно добавить после каждого элемента",
+ "shortDescription": "Обернуть элементы списка по указанным критериям",
+ "splitByRegex": "Разделить по регулярному выражению",
+ "splitBySymbol": "Разделить по символу",
+ "splitOptions": "Варианты разделения",
+ "splitSeparatorDescription": "Разделитель для разделения списка",
+ "title": "Сворачивать",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет добавлять текст перед каждым элементом списка и после него. Вы можете указать разный текст для левой и правой частей списка и управлять обработкой списка. Он полезен для добавления кавычек, скобок и другого форматирования элементов списка, подготовки данных для различных форматов или создания структурированного текста.",
+ "title": "Перенос списка"
+ },
+ "wrapOptions": "Варианты обертывания"
+ }
+}
diff --git a/public/locales/ru/number.json b/public/locales/ru/number.json
new file mode 100644
index 0000000..a9fdc89
--- /dev/null
+++ b/public/locales/ru/number.json
@@ -0,0 +1,89 @@
+{
+ "arithmeticSequence": {
+ "commonDifferenceDescription": "Общее различие между терминами (г)",
+ "description": "Генерация арифметических последовательностей с настраиваемыми параметрами.",
+ "firstTermDescription": "Первый член последовательности (a₁)",
+ "numberOfTermsDescription": "Количество генерируемых терминов (n)",
+ "outputFormat": "Формат вывода",
+ "resultTitle": "Сгенерированная последовательность",
+ "separatorDescription": "Разделитель между терминами",
+ "sequenceParameters": "Параметры последовательности",
+ "shortDescription": "Генерация арифметических последовательностей",
+ "title": "Арифметическая последовательность",
+ "toolInfo": {
+ "description": "Арифметическая прогрессия — это последовательность чисел, в которой разность между каждым последующим членом постоянна. Эта постоянная разность называется разностью. Зная первый член (a₁) и разность (d), можно найти каждый член, прибавив разность к предыдущему.",
+ "title": "Что такое арифметическая последовательность?"
+ }
+ },
+ "generate": {
+ "arithmeticSequenceOption": "Вариант арифметической последовательности",
+ "description": "Сгенерируйте последовательность чисел с настраиваемыми параметрами.",
+ "numberOfElementsDescription": "Количество элементов в последовательности.",
+ "resultTitle": "Сгенерированные числа",
+ "separator": "Разделитель",
+ "separatorDescription": "Разделите элементы в арифметической последовательности этим символом.",
+ "shortDescription": "Генерация случайных чисел в указанных диапазонах",
+ "startSequenceDescription": "Начните последовательность с этого числа.",
+ "stepDescription": "Увеличьте каждый элемент на эту величину",
+ "title": "Генерировать",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет генерировать последовательность чисел с настраиваемыми параметрами. Вы можете указать начальное значение, размер шага и количество элементов.",
+ "title": "Генерировать числа"
+ }
+ },
+ "ohmsLaw": {
+ "description": "Рассчитывает напряжение, ток и сопротивление",
+ "longDescription": "Этот калькулятор использует закон Ома (V = I × R) для определения любого из трёх электрических параметров при известных двух других. Закон Ома — фундаментальный принцип электротехники, описывающий взаимосвязь между напряжением (V), током (I) и сопротивлением (R). Этот инструмент незаменим для любителей электроники, инженеров-электриков и студентов, работающих с электрическими схемами, для быстрого нахождения неизвестных значений в своих электрических схемах.",
+ "shortDescription": "Рассчитайте напряжение, ток или сопротивление в электрических цепях, используя закон Ома.",
+ "title": "Закон Ома"
+ },
+ "slackline": {
+ "description": "Рассчитывает натяжение стропы",
+ "longDescription": "Этот калькулятор предполагает наличие нагрузки в центре троса.",
+ "shortDescription": "Рассчитайте примерное натяжение стропы или бельевой веревки. Не полагайтесь на это в вопросах безопасности.",
+ "title": "Натяжение стропы"
+ },
+ "sphereArea": {
+ "description": "Площадь сферы",
+ "longDescription": "Этот калькулятор вычисляет площадь поверхности сферы по формуле A = 4πr². Вы можете либо ввести радиус для нахождения площади поверхности, либо ввести площадь поверхности для расчёта искомого радиуса. Этот инструмент полезен для студентов, изучающих геометрию, инженеров, работающих со сферическими объектами, и всех, кому необходимо выполнять расчёты, связанные со сферическими поверхностями.",
+ "shortDescription": "Рассчитайте площадь поверхности сферы по ее радиусу.",
+ "title": "Площадь сферы"
+ },
+ "sphereVolume": {
+ "description": "Объем сферы",
+ "longDescription": "Этот калькулятор вычисляет объём сферы по формуле V = (4/3)πr³. Вы можете ввести радиус или диаметр для расчёта объёма, либо ввести объём для определения необходимого радиуса. Этот инструмент будет полезен студентам, инженерам и специалистам, работающим со сферическими объектами в таких областях, как физика, инженерия и производство.",
+ "shortDescription": "Рассчитайте объем сферы, используя радиус или диаметр.",
+ "title": "Объем сферы"
+ },
+ "sum": {
+ "description": "Вычислите сумму списка чисел. Введите числа, разделенные запятыми или символами переноса строки, чтобы получить их общую сумму.",
+ "extractionTypes": {
+ "delimiter": {
+ "description": "Настройте разделитель чисел здесь. (По умолчанию это разрыв строки.)",
+ "title": "Разделитель чисел"
+ },
+ "smart": {
+ "description": "Автоматическое определение цифр во входных данных.",
+ "title": "Умная сумма"
+ }
+ },
+ "inputTitle": "Вход",
+ "numberExtraction": "Извлечение чисел",
+ "printRunningSum": "Печать текущей суммы",
+ "printRunningSumDescription": "Отобразить сумму по мере ее расчета шаг за шагом.",
+ "resultTitle": "Общий",
+ "runningSum": "Текущая сумма",
+ "shortDescription": "Вычислить сумму чисел",
+ "title": "Сумма",
+ "toolInfo": {
+ "description": "Это онлайн-браузерная утилита для вычисления суммы набора чисел. Вы можете вводить числа, разделяя их запятой, пробелом или любым другим символом, включая перенос строки. Вы также можете просто вставить фрагмент текстовых данных, содержащий числовые значения, которые нужно просуммировать, и утилита извлечет их и вычислит сумму.",
+ "title": "Что такое калькулятор суммы чисел?"
+ }
+ },
+ "voltageDropInWire": {
+ "description": "Рассчитывает напряжение в обоих направлениях и потери мощности в двухпроводном кабеле.",
+ "longDescription": "Этот калькулятор помогает определить падение напряжения и потери мощности в двухжильном электрическом кабеле. Он учитывает длину кабеля, площадь поперечного сечения проводов, удельное сопротивление материала и силу тока. Инструмент рассчитывает падение напряжения в обоих направлениях, полное сопротивление кабеля и мощность, рассеиваемую в виде тепла. Это особенно полезно для инженеров-электриков, электриков и любителей при проектировании электрических систем, чтобы гарантировать, что уровень напряжения на нагрузке будет в допустимых пределах.",
+ "shortDescription": "Рассчитать падение напряжения и потерю мощности в электрических кабелях на основе длины, материала и тока.",
+ "title": "Падение напряжения в кабеле в обоих направлениях"
+ }
+}
diff --git a/public/locales/ru/pdf.json b/public/locales/ru/pdf.json
new file mode 100644
index 0000000..08e9a7d
--- /dev/null
+++ b/public/locales/ru/pdf.json
@@ -0,0 +1,113 @@
+{
+ "compressPdf": {
+ "compressedFileSize": "Размер сжатого файла",
+ "compressingPdf": "Сжатие PDF-файла...",
+ "compressionLevel": "Уровень сжатия",
+ "compressionSettings": "Настройки сжатия",
+ "description": "Уменьшите размер PDF-файла, сохранив качество, с помощью Ghostscript",
+ "errorCompressingPdf": "Не удалось сжать PDF: {{error}}",
+ "errorReadingPdf": "Не удалось прочитать PDF-файл. Убедитесь, что это корректный PDF-файл.",
+ "fileSize": "Исходный размер файла",
+ "highCompression": "Высокая степень сжатия",
+ "highCompressionDescription": "Максимальное уменьшение размера файла с некоторой потерей качества",
+ "inputTitle": "Входной PDF-файл",
+ "lowCompression": "Низкая компрессия",
+ "lowCompressionDescription": "Немного уменьшить размер файла с минимальной потерей качества",
+ "mediumCompression": "Средняя компрессия",
+ "mediumCompressionDescription": "Баланс между размером файла и качеством",
+ "pages": "Количество страниц",
+ "resultTitle": "Сжатый PDF-файл",
+ "shortDescription": "Безопасное сжатие PDF-файлов в вашем браузере",
+ "title": "Сжать PDF"
+ },
+ "editor": {
+ "description": "Расширенный редактор PDF с функциями аннотирования, заполнения форм, выделения текста и экспорта. Редактируйте PDF-файлы прямо в браузере с помощью профессиональных инструментов, включая вставку текста, рисование, выделение текста, подписание и заполнение форм.",
+ "shortDescription": "Редактируйте PDF-файлы с помощью расширенных инструментов аннотирования, подписания и редактирования.",
+ "title": "PDF-редактор"
+ },
+ "merge": {
+ "inputTitle": "Входной PDF-файл",
+ "loadingText": "Извлечение страниц",
+ "resultTitle": "Вывести объединенный PDF-файл",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет объединить несколько PDF-файлов в один документ. Чтобы воспользоваться инструментом, просто загрузите PDF-файлы, которые вы хотите объединить. Инструмент объединит все страницы исходных файлов в один PDF-документ.",
+ "title": "Как использовать инструмент объединения PDF-файлов?"
+ }
+ },
+ "mergePdf": {
+ "description": "Объедините несколько PDF-файлов в один документ.",
+ "inputTitle": "Входные PDF-файлы",
+ "mergingPdfs": "Объединение PDF-файлов",
+ "pdfOptions": "Параметры PDF-файла",
+ "resultTitle": "Объединенный PDF-файл",
+ "shortDescription": "Объединить несколько PDF-файлов в один документ",
+ "sortByFileName": "Сортировать по имени файла",
+ "sortByFileNameDescription": "Сортировать PDF-файлы в алфавитном порядке по имени файла",
+ "sortByUploadOrder": "Сортировать по порядку загрузки",
+ "sortByUploadOrderDescription": "Сохраняйте PDF-файлы в том порядке, в котором они были загружены.",
+ "title": "Объединить PDF",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет объединить несколько PDF-файлов в один документ. Вы можете выбрать способ сортировки PDF-файлов, и инструмент объединит их в указанном порядке.",
+ "title": "Объединить PDF-файлы"
+ }
+ },
+ "pdfToEpub": {
+ "description": "Преобразуйте PDF-документы в файлы EPUB для лучшей совместимости с электронными книгами.', icon: 'material-symbols:import-contacts', component: lazy(() => import('./index')), keywords: ['pdf', 'epub', 'convert', 'ebook'], path: 'pdf-to-epub', i18n: { name: 'pdf:pdfToEpub.title', description: 'pdf:pdfToEpub.description",
+ "shortDescription": "Конвертировать PDF-файлы в формат EPUB",
+ "title": "PDF в EPUB"
+ },
+ "pdfToPng": {
+ "description": "Преобразуйте PDF-документы в панели PNG.",
+ "longDescription": "Загрузите PDF-файл и преобразуйте каждую страницу в высококачественное изображение PNG прямо в браузере. Этот инструмент идеально подходит для извлечения визуального контента или публикации отдельных страниц. Загрузка данных не требуется — всё работает локально.",
+ "shortDescription": "Конвертировать PDF в изображения PNG",
+ "title": "PDF в PNG"
+ },
+ "protectPdf": {
+ "description": "Добавьте надежную защиту паролем для ваших PDF-файлов в браузере.",
+ "shortDescription": "Надежная защита паролем PDF-файлов",
+ "title": "Защитить PDF-файл"
+ },
+ "rotatePdf": {
+ "allPagesWillBeRotated": "Все {{count}} страницы будут ротироваться",
+ "angleOptions": {
+ "clockwise90": "90° по часовой стрелке",
+ "counterClockwise270": "270° (90° против часовой стрелки)",
+ "upsideDown180": "180° (вверх дном)"
+ },
+ "applyToAllPages": "Применить ко всем страницам",
+ "description": "Поворот страниц в PDF-документе.",
+ "inputTitle": "Входной PDF-файл",
+ "longDescription": "Измените ориентацию страниц PDF-файла, повернув их на 90, 180 или 270 градусов. Это полезно для исправления неправильно отсканированных документов или подготовки PDF-файлов к печати.",
+ "pageRangesDescription": "Введите номера страниц или диапазоны, разделенные запятыми (например, 1,3,5-7)",
+ "pageRangesPlaceholder": "например, 1,5-8",
+ "pagesWillBeRotated": "{{count}} страница{{count !== 1 ? 's' : ''}} будет вращаться",
+ "pdfPageCount": "PDF имеет {{count}} страница{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "Повернутый PDF-файл",
+ "rotatingPages": "Ротация страниц",
+ "rotationAngle": "Угол поворота",
+ "rotationSettings": "Настройки вращения",
+ "shortDescription": "Поворот страниц в PDF-документе",
+ "title": "Повернуть PDF",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет поворачивать страницы в PDF-документе. Вы можете повернуть все страницы или указать отдельные. Выберите угол поворота: 90° по часовой стрелке, 180° (вверх ногами) или 270° (на 90° против часовой стрелки). Чтобы повернуть отдельные страницы, снимите флажок «Применить ко всем страницам» и введите номера страниц или диапазоны через запятую (например, 1, 3, 5–7).",
+ "title": "Как использовать инструмент поворота PDF-файла"
+ }
+ },
+ "splitPdf": {
+ "description": "Извлечение определенных страниц из PDF-документа.",
+ "extractingPages": "Извлечение страниц",
+ "inputTitle": "Входной PDF-файл",
+ "pageExtractionPreview": "{{count}} страница{{count !== 1 ? 's' : ''}} будут извлечены",
+ "pageRangesDescription": "Введите номера страниц или диапазоны, разделенные запятыми (например, 1,3,5-7)",
+ "pageRangesPlaceholder": "например, 1,5-8",
+ "pageSelection": "Выбор страницы",
+ "pdfPageCount": "PDF имеет {{count}} страница{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "Извлеченный PDF-файл",
+ "shortDescription": "Извлечь определенные страницы из PDF-файла",
+ "title": "Разделить PDF",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет извлекать определённые страницы из PDF-документа. Вы можете указать отдельные страницы или диапазоны страниц для извлечения.",
+ "title": "Разделить PDF"
+ }
+ }
+}
diff --git a/public/locales/ru/string.json b/public/locales/ru/string.json
new file mode 100644
index 0000000..045b074
--- /dev/null
+++ b/public/locales/ru/string.json
@@ -0,0 +1,261 @@
+{
+ "base64": {
+ "decode": "Декодирование Base64",
+ "description": "Кодировать или декодировать текст с использованием кодировки Base64.",
+ "encode": "Кодирование Base64",
+ "inputTitle": "Входные данные",
+ "optionsTitle": "Параметры Base64",
+ "resultTitle": "Результат",
+ "shortDescription": "Кодировать или декодировать данные с помощью Base64.",
+ "title": "Кодировщик/декодер Base64",
+ "toolInfo": {
+ "description": "Base64 — это схема кодирования, которая представляет данные в формате ASCII-строки путём перевода их в систему счисления с основанием 64. Хотя её можно использовать для кодирования строк, она обычно применяется для кодирования двоичных данных для передачи по средам, предназначенным для работы с текстовыми данными.",
+ "title": "Что такое Base64?"
+ }
+ },
+ "censor": {
+ "description": "Утилита для цензурирования слов в тексте. Загрузите текст в форму ввода слева, укажите все нецензурные слова в параметрах, и вы мгновенно получите отцензурированный текст в области вывода.\", longDescription: 'С помощью этого онлайн-инструмента вы можете отцензурировать определённые слова в любом тексте. Вы можете указать список нежелательных слов (например, ругательств или секретных слов), и программа заменит их альтернативными словами и создаст безопасный для чтения текст. Слова можно указать в многострочном текстовом поле в параметрах, вводя по одному слову на строку.', keywords: ['text', 'censor', 'words', 'characters'], component: lazy(() => import('./index')), i18n: { name: 'string:censor.title', description: 'string:censor.description",
+ "shortDescription": "Быстро маскируйте плохие слова или заменяйте их другими словами.",
+ "title": "Текстовый цензор"
+ },
+ "createPalindrome": {
+ "description": "Самая простая в мире браузерная утилита для создания палиндромов из любого текста. Введите текст и мгновенно преобразуйте его в палиндром, который читается одинаково слева направо и справа налево. Идеально подходит для словесных игр, создания симметричных текстовых узоров или изучения лингвистических диковинок.",
+ "shortDescription": "Создайте текст, который одинаково читается как слева направо, так и слева направо.",
+ "title": "Создать палиндром"
+ },
+ "extractSubstring": {
+ "description": "Самая простая в мире браузерная утилита для извлечения подстрок из текста. Введите текст и укажите начальную и конечную позиции, чтобы извлечь нужную часть. Идеально подходит для обработки данных, анализа текста или извлечения определённого контента из больших текстовых блоков.",
+ "shortDescription": "Извлечь часть текста между указанными позициями",
+ "title": "Извлечь подстроку"
+ },
+ "join": {
+ "blankLinesAndTrailingSpaces": "Пустые строки и конечные пробелы",
+ "deleteBlankDescription": "Удалите строки, не содержащие текстовых символов.",
+ "deleteBlankTitle": "Удалить пустые строки",
+ "deleteTrailingDescription": "Удалите пробелы и знаки табуляции в конце строк.",
+ "deleteTrailingTitle": "Удалить конечные пробелы",
+ "description": "Объединяйте фрагменты текста с помощью настраиваемых разделителей.",
+ "inputTitle": "Текстовые фрагменты",
+ "joinCharacterDescription": "Символ, соединяющий разрозненные фрагменты текста. (Пробел по умолчанию.)",
+ "joinCharacterPlaceholder": "Присоединиться к персонажу",
+ "resultTitle": "Объединенный текст",
+ "shortDescription": "Объединить текстовые элементы с указанным разделителем",
+ "textMergedOptions": "Параметры объединения текста",
+ "title": "Присоединиться к тексту",
+ "toolInfo": {
+ "description": "С помощью этого инструмента можно объединить части текста. Он берёт список текстовых значений, разделённых символами переноса строки, и объединяет их. Вы можете задать символ, который будет вставлен между частями объединённого текста. Кроме того, можно игнорировать все пустые строки и удалять пробелы и табуляции в конце всех строк. Текстуально!",
+ "title": "Что такое средство объединения текстов?"
+ }
+ },
+ "palindrome": {
+ "description": "Самая простая в мире браузерная утилита для проверки текста на палиндром. Мгновенно проверяет, одинаково ли читается текст слева направо и справа налево. Идеально подходит для решения словесных головоломок, лингвистического анализа и проверки симметричности текстовых шаблонов. Поддерживает различные разделители и определение палиндромов из нескольких слов.",
+ "shortDescription": "Проверьте, читается ли текст одинаково в прямом и обратном направлении.",
+ "title": "Палиндром"
+ },
+ "passwordGenerator": {
+ "avoidAmbiguous": "Избегайте неоднозначных символов (i, I, l, 0, O)",
+ "description": "Создавайте надёжные случайные пароли с настраиваемой длиной и типом символов. Выбирайте строчные, заглавные, цифры и специальные символы. Возможность исключить неоднозначные символы для лучшей читаемости.",
+ "includeLowercase": "Включать строчные буквы (a–z)",
+ "includeNumbers": "Включить цифры (0-9)",
+ "includeSymbols": "Включить специальные символы",
+ "includeUppercase": "Включайте заглавные буквы (A–Z)",
+ "lengthDesc": "Длина пароля",
+ "lengthPlaceholder": "например, 12",
+ "optionsTitle": "Параметры пароля",
+ "resultTitle": "Сгенерированный пароль",
+ "shortDescription": "Генерируйте безопасные случайные пароли с помощью пользовательских параметров",
+ "title": "Генератор паролей",
+ "toolInfo": {
+ "description": "Этот инструмент генерирует надёжные случайные пароли на основе выбранных вами критериев. Вы можете настроить длину, включать или исключать различные типы символов, а также избегать неоднозначных символов для лучшей читаемости. Идеально подходит для создания надёжных паролей для учётных записей, приложений и любых других задач безопасности.",
+ "title": "О генераторе паролей"
+ }
+ },
+ "quote": {
+ "allowDoubleQuotation": "Разрешить двойные кавычки",
+ "description": "Добавляйте кавычки вокруг текста с помощью настраиваемых параметров.",
+ "inputTitle": "Введите текст",
+ "leftQuoteDescription": "Символ(ы) левой кавычки",
+ "processAsMultiLine": "Обрабатывать как многострочный текст",
+ "quoteEmptyLines": "Цитировать пустые строки",
+ "quoteOptions": "Варианты расценок",
+ "resultTitle": "Цитируемый текст",
+ "rightQuoteDescription": "Символ(ы) правой кавычки",
+ "shortDescription": "Добавляйте кавычки вокруг текста с использованием различных стилей",
+ "title": "Цитата из текста",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет добавлять кавычки к тексту. Вы можете выбирать различные символы кавычек, работать с многострочным текстом и управлять обработкой пустых строк. Он полезен для подготовки текста к программированию, форматирования данных или создания стилизованного текста.",
+ "title": "Цитата из текста"
+ }
+ },
+ "randomizeCase": {
+ "description": "Самая простая в мире браузерная утилита для случайного изменения регистра текста. Введите текст и мгновенно преобразуйте его, используя случайные заглавные и строчные буквы. Идеально подходит для создания уникальных текстовых эффектов, проверки чувствительности к регистру или генерации различных текстовых шаблонов.",
+ "shortDescription": "Случайный регистр букв в тексте",
+ "title": "Рандомизировать случай"
+ },
+ "removeDuplicateLines": {
+ "description": "Загрузите текст в форму ввода слева, и вы мгновенно получите текст без дубликатов строк в области вывода. Мощный, бесплатный и быстрый инструмент. Загрузите текстовые строки — получите уникальные текстовые строки.",
+ "shortDescription": "Быстро удалить все повторяющиеся строки из текста",
+ "title": "Удалить дубликаты строк"
+ },
+ "repeat": {
+ "delimiterDescription": "Разделитель для выходных копий.",
+ "delimiterPlaceholder": "Разделитель",
+ "description": "Повторяйте текст несколько раз с настраиваемыми разделителями.",
+ "inputTitle": "Введите текст",
+ "numberPlaceholder": "Число",
+ "repeatAmountDescription": "Количество повторений.",
+ "repetitionsDelimiter": "Разделитель повторений",
+ "resultTitle": "Повторяющийся текст",
+ "shortDescription": "Повторить текст несколько раз",
+ "textRepetitions": "Повторы текста",
+ "title": "Повторить текст",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет повторять заданный текст несколько раз с дополнительным разделителем.",
+ "title": "Повторить текст"
+ }
+ },
+ "reverse": {
+ "description": "Самая простая в мире браузерная утилита для переворота текста. Введите любой текст, и он мгновенно перевернётся, символ за символом. Идеально подходит для создания зеркального текста, анализа палиндромов и экспериментов с текстовыми шаблонами. Сохраняет пробелы и специальные символы при перевороте.",
+ "inputTitle": "Текст для переворота",
+ "processMultiLine": "Обработка многострочного текста",
+ "processMultiLineDescription": "Каждая строка будет перевернута независимо",
+ "resultTitle": "Перевернутый текст",
+ "reversalOptions": "Варианты отмены",
+ "shortDescription": "Перевернуть любой текст посимвольно",
+ "skipEmptyLines": "Пропускать пустые строки",
+ "skipEmptyLinesDescription": "Пустые строки будут удалены из вывода.",
+ "title": "Обеспечить регресс",
+ "trimWhitespace": "Обрезать пробелы",
+ "trimWhitespaceDescription": "Удалить начальные и конечные пробелы из каждой строки."
+ },
+ "rot13": {
+ "description": "Кодировать или декодировать текст с помощью шифра ROT13.",
+ "inputTitle": "Введите текст",
+ "resultTitle": "Результат ROT13",
+ "shortDescription": "Кодировать или декодировать текст с помощью шифра ROT13.",
+ "title": "Кодер/декодер ROT13",
+ "toolInfo": {
+ "description": "ROT13 (поворот на 13 позиций) — это простой шифр замены букв, который заменяет букву на 13-ю букву после неё в алфавите. ROT13 — это особый случай шифра Цезаря, разработанного в Древнем Риме. Поскольку в английском алфавите 26 букв, ROT13 является своим собственным инверсией; то есть для отмены ROT13 применяется тот же алгоритм, поэтому одно и то же действие можно использовать для кодирования и декодирования.",
+ "title": "Что такое ROT13?"
+ }
+ },
+ "rotate": {
+ "description": "Повернуть символы в тексте на указанные позиции.",
+ "inputTitle": "Введите текст",
+ "processAsMultiLine": "Обрабатывать как многострочный текст (поворачивать каждую строку отдельно)",
+ "resultTitle": "Повернутый текст",
+ "rotateLeft": "Повернуть влево",
+ "rotateRight": "Повернуть вправо",
+ "rotationOptions": "Параметры вращения",
+ "shortDescription": "Сдвиг символов в тексте по позиции.",
+ "stepDescription": "Количество позиций для поворота",
+ "title": "Повернуть текст",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет поворачивать символы в строке на заданное количество позиций. Вы можете поворачивать символы влево или вправо, а также обрабатывать многострочный текст, поворачивая каждую строку отдельно. Поворот строк полезен для простых преобразований текста, создания шаблонов или реализации базовых методов шифрования.",
+ "title": "Вращение струны"
+ }
+ },
+ "split": {
+ "charAfterChunkDescription": "Символ после каждого фрагмента",
+ "charBeforeChunkDescription": "Символ перед каждым фрагментом",
+ "chunksDescription": "Количество фрагментов одинаковой длины на выходе.",
+ "chunksTitle": "Используйте несколько фрагментов",
+ "description": "Самая простая в мире браузерная утилита для разделения текста. Введите текст и укажите разделитель, чтобы разделить его на несколько частей. Идеально подходит для обработки данных, работы с текстом или извлечения определённого контента из больших текстовых блоков.",
+ "lengthDescription": "Количество символов, которые будут помещены в каждый выходной фрагмент.",
+ "lengthTitle": "Использовать длину для разделения",
+ "outputSeparatorDescription": "Символ, который будет вставлен между разделёнными фрагментами.\n(По умолчанию это символ новой строки \"\\n\".)",
+ "outputSeparatorOptions": "Параметры разделителя вывода",
+ "regexDescription": "Регулярное выражение, которое будет использоваться для разбиения текста на части.\n(По умолчанию несколько пробелов.)",
+ "regexTitle": "Используйте регулярное выражение для разделения",
+ "resultTitle": "Текстовые фрагменты",
+ "shortDescription": "Разделить текст на несколько частей с помощью разделителя",
+ "splitSeparatorOptions": "Параметры разделителя разделителей",
+ "symbolDescription": "Символ, который будет использоваться для разбиения текста на части.\n(Пробел по умолчанию.)",
+ "symbolTitle": "Используйте символ для разделения",
+ "title": "Расколоть"
+ },
+ "statistic": {
+ "characterFrequencyAnalysis": "Анализ частоты символов",
+ "characterFrequencyAnalysisDescription": "Подсчитайте, как часто каждый символ встречается в тексте.",
+ "delimitersOptions": "Параметры разделителей",
+ "description": "Анализируйте текст и создавайте комплексную статистику.",
+ "includeEmptyLines": "Включить пустые строки",
+ "includeEmptyLinesDescription": "При подсчете строк учитывайте пустые строки.",
+ "inputTitle": "Введите текст",
+ "resultTitle": "Статистика текста",
+ "sentenceDelimitersDescription": "Введите пользовательские символы, используемые для разделения предложений на вашем языке (через запятую), или оставьте поле пустым, чтобы использовать значение по умолчанию.",
+ "sentenceDelimitersPlaceholder": "например, ., !, ?, ...",
+ "shortDescription": "Получите статистику о вашем тексте",
+ "statisticsOptions": "Параметры статистики",
+ "title": "Статистика текста",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет анализировать текст и генерировать комплексную статистику, включая количество символов, количество слов, количество строк, а также анализ частоты символов и слов.",
+ "title": "Что такое {{title}}?"
+ },
+ "wordDelimitersDescription": "Введите пользовательское регулярное выражение для подсчета слов или оставьте поле пустым для использования по умолчанию.",
+ "wordDelimitersPlaceholder": "напр. \\s.,;:!?\"«»()…",
+ "wordFrequencyAnalysis": "Анализ частоты слов",
+ "wordFrequencyAnalysisDescription": "Подсчитайте, как часто каждое слово встречается в тексте."
+ },
+ "textReplacer": {
+ "description": "Замените текстовые шаблоны новым содержанием.",
+ "findPatternInText": "Найти этот шаблон в тексте",
+ "findPatternUsingRegexp": "Найдите шаблон с помощью регулярного выражения",
+ "inputTitle": "Текст для замены",
+ "newTextPlaceholder": "Новый текст",
+ "regexpDescription": "Введите регулярное выражение, которое вы хотите заменить.",
+ "replacePatternDescription": "Введите шаблон, который будет использоваться для замены.",
+ "replaceText": "Заменить текст",
+ "resultTitle": "Текст с заменами",
+ "searchPatternDescription": "Введите текстовый шаблон, который вы хотите заменить.",
+ "searchText": "Поиск текста",
+ "shortDescription": "Быстро заменяйте текст в вашем контенте",
+ "title": "Заменитель текста",
+ "toolInfo": {
+ "description": "Легко заменяйте текст в вашем контенте с помощью этого простого браузерного инструмента. Просто введите текст, укажите текст, который хотите заменить, и значение для замены, и мгновенно получите обновлённую версию.",
+ "title": "Заменитель текста"
+ }
+ },
+ "toMorse": {
+ "dashSymbolDescription": "Символ, который будет соответствовать тире в азбуке Морзе.",
+ "description": "Преобразовать текст в азбуку Морзе.",
+ "dotSymbolDescription": "Символ, который будет соответствовать точке в азбуке Морзе.",
+ "longSignal": "Длинный сигнал",
+ "resultTitle": "азбука Морзе",
+ "shortDescription": "Быстрое кодирование текста в азбуку Морзе",
+ "shortSignal": "Короткий сигнал",
+ "title": "Строка в азбуке Морзе"
+ },
+ "truncate": {
+ "addTruncationIndicator": "Добавить индикатор усечения",
+ "charactersPlaceholder": "Персонажи",
+ "description": "Сократить текст до указанной длины.",
+ "indicatorDescription": "Символы, добавляемые в конец (или начало) текста. Примечание: они учитываются при подсчёте длины.",
+ "inputTitle": "Введите текст",
+ "leftSideDescription": "Удалить символы из начала текста.",
+ "leftSideTruncation": "Усечение слева",
+ "lengthAndLines": "Длина и линии",
+ "lineByLineDescription": "Обрезайте каждую строку отдельно.",
+ "lineByLineTruncating": "Построчное усечение",
+ "maxLengthDescription": "Количество символов, которое нужно оставить в тексте.",
+ "numberPlaceholder": "Число",
+ "resultTitle": "Усеченный текст",
+ "rightSideDescription": "Удалить символы из конца текста.",
+ "rightSideTruncation": "Правостороннее усечение",
+ "shortDescription": "Обрезать текст до указанной длины",
+ "suffixAndAffix": "Суффикс и аффикс",
+ "title": "Обрезать текст",
+ "toolInfo": {
+ "description": "Загрузите текст в форму ввода слева, и справа вы автоматически получите обрезанный текст.",
+ "title": "Обрезать текст"
+ },
+ "truncationSide": "Сторона усечения"
+ },
+ "uppercase": {
+ "description": "Преобразовать текст в заглавные буквы.",
+ "inputTitle": "Введите текст",
+ "resultTitle": "Текст заглавными буквами",
+ "shortDescription": "Преобразовать текст в верхний регистр",
+ "title": "Преобразовать в верхний регистр"
+ }
+}
diff --git a/public/locales/ru/time.json b/public/locales/ru/time.json
new file mode 100644
index 0000000..835422c
--- /dev/null
+++ b/public/locales/ru/time.json
@@ -0,0 +1,100 @@
+{
+ "checkLeapYears": {
+ "description": "Проверьте, является ли год високосным, и получите информацию о високосном годе.",
+ "inputTitle": "Введите год",
+ "resultTitle": "Результат високосного года",
+ "shortDescription": "Проверьте, является ли год високосным",
+ "title": "Проверьте високосные годы",
+ "toolInfo": {
+ "description": "Високосный год — это год, содержащий один дополнительный день (29 февраля) для синхронизации календарного года с астрономическим годом. Високосные годы происходят каждые 4 года, за исключением тех, которые делятся на 100, но не делятся на 400.",
+ "title": "Что такое високосный год?"
+ }
+ },
+ "convertDaysToHours": {
+ "addHoursName": "Добавить часы Имя",
+ "addHoursNameDescription": "Добавить строку часов к выходным значениям",
+ "description": "Конвертируйте дни в часы с помощью настраиваемых параметров.",
+ "hoursName": "Часы Имя",
+ "shortDescription": "Конвертировать дни в часы",
+ "title": "Конвертировать дни в часы",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет преобразовывать дни в часы. Вы можете ввести дни в виде чисел или единиц измерения, и инструмент преобразует их в часы. Вы также можете добавить суффикс «часы» к выходным значениям.",
+ "title": "Конвертировать дни в часы"
+ }
+ },
+ "convertHoursToDays": {
+ "addDaysName": "Добавить название дня",
+ "addDaysNameDescription": "Добавить строку days к выходным значениям",
+ "daysName": "Имя дня",
+ "description": "Конвертируйте часы в дни с помощью настраиваемых параметров.",
+ "shortDescription": "Конвертировать часы в дни",
+ "title": "Конвертировать часы в дни",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет конвертировать часы в дни. Вы можете ввести часы в виде чисел или единиц измерения, и инструмент конвертирует их в дни. Вы также можете добавить суффикс «дни» к выходным значениям.",
+ "title": "Конвертировать часы в дни"
+ }
+ },
+ "convertSecondsToTime": {
+ "addPadding": "Добавить отступ",
+ "addPaddingDescription": "Добавьте нули к часам, минутам и секундам.",
+ "description": "Перевод секунд в удобный для чтения формат времени (часы:минуты:секунды). Введите количество секунд, чтобы получить отформатированное время.",
+ "shortDescription": "Преобразовать секунды в формат времени",
+ "timePadding": "Заполнение времени",
+ "title": "Перевести секунды во время",
+ "toolInfo": {
+ "title": "Что такое {{title}}?"
+ }
+ },
+ "convertTimeToSeconds": {
+ "description": "Преобразовать форматированное время (ЧЧ:ММ:СС) в секунды.",
+ "inputTitle": "Время ввода",
+ "resultTitle": "Секунды",
+ "shortDescription": "Конвертировать формат времени в секунды",
+ "title": "Перевести время в секунды",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет преобразовывать форматированные строки времени (ЧЧ:ММ:СС) в секунды. Он полезен для расчёта длительностей и временных интервалов.",
+ "title": "Перевести время в секунды"
+ }
+ },
+ "crontabGuru": {
+ "description": "Генерируйте и анализируйте выражения cron. Создавайте расписания cron для автоматизированных задач и системных заданий.",
+ "shortDescription": "Генерация и понимание выражений cron",
+ "title": "Crontab Гуру"
+ },
+ "timeBetweenDates": {
+ "description": "Рассчитайте разницу во времени между двумя датами. Получите точную продолжительность в днях, часах, минутах и секундах.",
+ "endDate": "Дата окончания",
+ "endDateTime": "Дата и время окончания",
+ "endTime": "Конец Времени",
+ "endTimezone": "Конечный часовой пояс",
+ "shortDescription": "Рассчитать время между двумя датами",
+ "startDate": "Дата начала",
+ "startDateTime": "Дата и время начала",
+ "startTime": "Время начала",
+ "startTimezone": "Начальный часовой пояс",
+ "title": "Время между датами",
+ "toolInfo": {
+ "description": "Рассчитайте точную разницу во времени между двумя датами и временем с поддержкой разных часовых поясов. Этот инструмент предоставляет подробную информацию о разнице во времени в различных единицах (годы, месяцы, дни, часы, минуты и секунды).",
+ "title": "Калькулятор времени между датами"
+ }
+ },
+ "truncateClockTime": {
+ "description": "Округлите время до ближайшего часа, минуты или заданного вами интервала.",
+ "printDroppedComponents": "Печать удаленных компонентов",
+ "shortDescription": "Усечение времени до заданной точности",
+ "timePadding": "Заполнение времени",
+ "title": "Усечение времени на часах",
+ "toolInfo": {
+ "title": "Что такое {{title}}?"
+ },
+ "truncateMinutesAndSeconds": "Усечение минут и секунд",
+ "truncateMinutesAndSecondsDescription": "Отбросьте обе составляющие — минуты и секунды — из каждого времени.",
+ "truncateOnlySeconds": "Сократить только секунды",
+ "truncateOnlySecondsDescription": "Отбросьте секундную составляющую из каждого показания часов.",
+ "truncationSide": "Сторона усечения",
+ "useZeroPadding": "Использовать нулевое заполнение",
+ "zeroPaddingDescription": "Сделайте так, чтобы все компоненты времени всегда были двузначными.",
+ "zeroPrintDescription": "Отобразить отброшенные части как нулевые значения «00».",
+ "zeroPrintTruncatedParts": "Усеченные детали с нулевой печатью"
+ }
+}
diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json
new file mode 100644
index 0000000..d537f8f
--- /dev/null
+++ b/public/locales/ru/translation.json
@@ -0,0 +1,250 @@
+{
+ "audio": {
+ "changeSpeed": {
+ "description": "Измените скорость воспроизведения аудиофайлов. Ускорьте или замедлите звук, сохраняя высоту звука.",
+ "name": "Изменить скорость звука",
+ "shortDescription": "Изменить скорость аудиофайлов"
+ },
+ "extractAudio": {
+ "description": "Извлеките звуковую дорожку из видеофайла и сохраните ее как отдельный аудиофайл в выбранном вами формате (AAC, MP3, WAV).",
+ "name": "Извлечь аудио",
+ "shortDescription": "Извлекайте аудио из видеофайлов (MP4, MOV и т. д.) в форматы AAC, MP3 или WAV."
+ }
+ },
+ "baseFileInput": {
+ "copyFailed": "Не удалось скопировать: {{error}}",
+ "dropFileHere": "Оставьте свой {{type}} здесь",
+ "fileCopied": "Файл скопирован",
+ "selectFileDescription": "Нажмите здесь, чтобы выбрать {{type}} с вашего устройства нажмите Ctrl+V, чтобы использовать {{type}} из буфера обмена или перетащите файл с рабочего стола"
+ },
+ "categories": {
+ "audio": {
+ "description": "Инструменты для работы со звуком — извлечение звука из видео, регулировка скорости звука, объединение нескольких аудиофайлов и многое другое.",
+ "title": "Аудио инструменты"
+ },
+ "csv": {
+ "description": "Инструменты для работы с CSV-файлами — конвертируйте CSV в различные форматы, обрабатывайте CSV-данные, проверяйте структуру CSV и эффективно обрабатывайте CSV-файлы.",
+ "title": "CSV-инструменты"
+ },
+ "gif": {
+ "description": "Инструменты для работы с GIF-анимацией — создание прозрачных GIF-файлов, извлечение GIF-кадров, добавление текста в GIF-файлы, обрезка, поворот, обратное отображение GIF-файлов и многое другое.",
+ "title": "GIF-инструменты"
+ },
+ "image-generic": {
+ "description": "Инструменты для работы с изображениями — сжатие, изменение размера, обрезка, конвертация в JPG, поворот, удаление фона и многое другое.",
+ "title": "Инструменты для работы с изображениями"
+ },
+ "json": {
+ "description": "Инструменты для работы со структурами данных JSON — упрощайте и минимизируйте объекты JSON, выравнивайте массивы JSON, преобразуйте значения JSON в строки, анализируйте данные и многое другое.",
+ "title": "Инструменты JSON"
+ },
+ "list": {
+ "description": "Инструменты для работы со списками — сортировка, обратный порядок, рандомизация списков, поиск уникальных и повторяющихся элементов списка, изменение разделителей элементов списка и многое другое.",
+ "title": "Список инструментов"
+ },
+ "number": {
+ "description": "Инструменты для работы с числами — генерация числовых последовательностей, преобразование чисел в слова и слов в числа, сортировка, округление, разложение чисел на множители и многое другое.",
+ "title": "Числовые инструменты"
+ },
+ "pdf": {
+ "description": "Инструменты для работы с PDF-файлами — извлечение текста из PDF-файлов, конвертация PDF-файлов в другие форматы, манипулирование PDF-файлами и многое другое.",
+ "title": "PDF-инструменты"
+ },
+ "png": {
+ "description": "Инструменты для работы с изображениями PNG — конвертируйте PNG в JPG, создавайте прозрачные PNG, изменяйте цвета PNG, обрезайте, поворачивайте, изменяйте размер PNG и многое другое.",
+ "title": "Инструменты PNG"
+ },
+ "seeAll": "Смотреть все {{title}}",
+ "string": {
+ "description": "Инструменты для работы с текстом — преобразование текста в изображения, поиск и замена текста, разделение текста на фрагменты, объединение текстовых строк, повтор текста и многое другое.",
+ "title": "Текстовые инструменты"
+ },
+ "time": {
+ "description": "Инструменты для работы со временем и датой — расчет разницы во времени, преобразование часовых поясов, форматирование дат, создание последовательностей дат и многое другое.",
+ "title": "Инструменты времени"
+ },
+ "try": "Пытаться {{title}}",
+ "video": {
+ "description": "Инструменты для работы с видео — извлечение кадров из видео, создание GIF-файлов из видео, конвертация видео в различные форматы и многое другое.",
+ "title": "Видео инструменты"
+ },
+ "xml": {
+ "description": "Инструменты для работы с XML-структурами данных — просмотрщик, улучшитель, валидатор и многое другое",
+ "title": "XML-инструменты"
+ }
+ },
+ "csv": {
+ "findIncompleteCsvRecords": {
+ "description": "Просто загрузите CSV-файл в форму ниже, и этот инструмент автоматически проверит наличие всех пропущенных значений в строках и столбцах. В настройках инструмента можно настроить формат входного файла (указать разделитель, символ кавычки и символ комментария). Кроме того, можно включить проверку на наличие пустых значений, пропускать пустые строки и установить ограничение на количество сообщений об ошибках в выходных данных.",
+ "name": "Найти неполные записи CSV",
+ "shortDescription": "Быстро находите строки и столбцы в CSV-файле, в которых отсутствуют значения."
+ }
+ },
+ "hero": {
+ "brand": "ОмниИнструменты",
+ "description": "Повысьте свою производительность с OmniTools — лучшим набором инструментов для быстрого решения задач! Получите доступ к тысячам удобных утилит для редактирования изображений, текста, списков и данных — и всё это прямо в браузере.",
+ "examples": {
+ "calculateNumberSum": "Вычислить сумму чисел",
+ "changeGifSpeed": "Изменить скорость GIF-анимации",
+ "compressPng": "Сжать PNG",
+ "createTransparentImage": "Создать прозрачное изображение",
+ "prettifyJson": "Упрощение JSON",
+ "sortList": "Сортировать список",
+ "splitPdf": "Разделить PDF",
+ "splitText": "Разделить текст",
+ "trimVideo": "Обрезать видео"
+ },
+ "searchPlaceholder": "Искать все инструменты",
+ "title": "Выполняйте задачи быстро с помощью"
+ },
+ "inputFooter": {
+ "clear": "Прозрачный",
+ "copyToClipboard": "Копировать в буфер обмена",
+ "importFromFile": "Импорт из файла"
+ },
+ "list": {
+ "group": {
+ "description": "Самая простая в мире браузерная утилита для группировки элементов списка. Введите список и укажите критерии группировки, чтобы организовать элементы в логические группы. Идеально подходит для категоризации данных, организации информации и создания структурированных списков. Поддерживает настраиваемые разделители и различные варианты группировки.",
+ "name": "Группа",
+ "shortDescription": "Группировать элементы списка по общим свойствам"
+ },
+ "reverse": {
+ "description": "Это очень простое браузерное приложение, которое выводит все элементы списка в обратном порядке. Элементы ввода можно разделять любым символом, и вы также можете изменить разделитель для элементов перевёрнутого списка.",
+ "name": "Обеспечить регресс",
+ "shortDescription": "Быстро перевернуть список"
+ },
+ "sort": {
+ "description": "Это очень простое браузерное приложение, которое сортирует элементы списка в порядке возрастания или убывания. Вы можете сортировать элементы по алфавиту, по номерам или по длине. Вы также можете удалять повторяющиеся и пустые элементы, а также обрезать отдельные элементы с пробелами вокруг них. Для разделения элементов входного списка можно использовать любой символ-разделитель или регулярное выражение. Кроме того, вы можете создать новый разделитель для отсортированного выходного списка.",
+ "name": "Сортировать",
+ "shortDescription": "Быстрая сортировка списка"
+ }
+ },
+ "navbar": {
+ "buyMeACoffee": "Купи мне кофе",
+ "home": "Дом",
+ "tools": "Инструменты"
+ },
+ "number": {
+ "generate": {
+ "description": "Быстро вычисляйте список целых чисел в браузере. Чтобы получить список, просто укажите первое целое число, измените значение и общее количество в параметрах ниже, и эта утилита сгенерирует нужное количество целых чисел.",
+ "name": "Генерировать числа",
+ "shortDescription": "Быстро вычислите список целых чисел в вашем браузере"
+ },
+ "sum": {
+ "description": "Это очень простое браузерное приложение для сложения чисел. Вводимые числа можно разделять любым символом, а также можно изменить разделитель суммируемых чисел.",
+ "name": "Сумма чисел",
+ "shortDescription": "Быстро суммировать список чисел"
+ }
+ },
+ "numericInputWithUnit": {
+ "unit": "Единица"
+ },
+ "pdf": {
+ "compressPdf": {
+ "description": "Уменьшите размер PDF-файла, сохранив качество, с помощью Ghostscript",
+ "name": "Сжать PDF",
+ "shortDescription": "Безопасное сжатие PDF-файлов в вашем браузере"
+ },
+ "mergePdf": {
+ "description": "Объедините несколько PDF-файлов в один документ.",
+ "name": "Объединить PDF",
+ "shortDescription": "Объединить несколько PDF-файлов в один документ"
+ },
+ "pdfToEpub": {
+ "description": "Преобразуйте PDF-документы в файлы EPUB для лучшей совместимости с электронными книгами.",
+ "name": "PDF в EPUB",
+ "shortDescription": "Конвертировать PDF-файлы в формат EPUB"
+ },
+ "protectPdf": {
+ "description": "Добавьте надежную защиту паролем для ваших PDF-файлов в браузере.",
+ "name": "Защитить PDF-файл",
+ "shortDescription": "Надежная защита паролем PDF-файлов"
+ },
+ "splitPdf": {
+ "description": "Извлечение определенных страниц из PDF-файла с использованием номеров или диапазонов страниц (например, 1,5-8)",
+ "name": "Разделить PDF",
+ "shortDescription": "Извлечь определенные страницы из PDF-файла"
+ }
+ },
+ "resultFooter": {
+ "copy": "Копировать в буфер обмена",
+ "download": "Скачать"
+ },
+ "string": {
+ "createPalindrome": {
+ "description": "Самая простая в мире браузерная утилита для создания палиндромов из любого текста. Введите текст и мгновенно преобразуйте его в палиндром, который читается одинаково слева направо и справа налево. Идеально подходит для словесных игр, создания симметричных текстовых узоров или изучения лингвистических диковинок.",
+ "name": "Создать палиндром",
+ "shortDescription": "Создайте текст, который одинаково читается как слева направо, так и слева направо."
+ },
+ "palindrome": {
+ "description": "Самая простая в мире браузерная утилита для проверки текста на палиндром. Мгновенно проверяет, одинаково ли читается текст слева направо и справа налево. Идеально подходит для решения словесных головоломок, лингвистического анализа и проверки симметричности текстовых шаблонов. Поддерживает различные разделители и определение палиндромов из нескольких слов.",
+ "name": "Палиндром",
+ "shortDescription": "Проверьте, читается ли текст одинаково в прямом и обратном направлении."
+ },
+ "repeat": {
+ "description": "Этот инструмент позволяет повторять заданный текст несколько раз с дополнительным разделителем.",
+ "name": "Повторить текст",
+ "shortDescription": "Повторить текст несколько раз"
+ },
+ "reverse": {
+ "description": "Самая простая в мире браузерная утилита для переворота текста. Введите любой текст, и он мгновенно перевернётся, символ за символом. Идеально подходит для создания зеркального текста, анализа палиндромов и экспериментов с текстовыми шаблонами. Сохраняет пробелы и специальные символы при перевороте.",
+ "name": "Обеспечить регресс",
+ "shortDescription": "Перевернуть любой текст посимвольно"
+ },
+ "toMorse": {
+ "description": "Самая простая в мире браузерная утилита для преобразования текста в код Морзе. Загрузите текст в форму ввода слева, и вы мгновенно получите код Морзе в области вывода. Мощная, бесплатная и быстрая. Загрузите текст — получите код Морзе.",
+ "name": "Строка в азбуке Морзе",
+ "shortDescription": "Быстрое кодирование текста в азбуку Морзе"
+ },
+ "uppercase": {
+ "description": "Самая простая в мире браузерная утилита для преобразования текста в верхний регистр. Просто введите текст, и он будет автоматически преобразован в заглавные буквы. Идеально подходит для создания заголовков, выделения текста или стандартизации форматирования текста. Поддерживает различные текстовые форматы и сохраняет специальные символы.",
+ "name": "Заглавные буквы",
+ "shortDescription": "Преобразовать текст в заглавные буквы"
+ }
+ },
+ "toolExamples": {
+ "subtitle": "Нажмите, чтобы попробовать!",
+ "title": "{{title}} Примеры"
+ },
+ "toolFileResult": {
+ "copied": "Файл скопирован",
+ "copyFailed": "Не удалось скопировать: {{error}}",
+ "loading": "Загрузка... Это может занять некоторое время.",
+ "result": "Результат"
+ },
+ "toolHeader": {
+ "seeExamples": "См. примеры"
+ },
+ "toolLayout": {
+ "allToolsTitle": "Все {{type}}"
+ },
+ "toolMultiFileResult": {
+ "copied": "Файл скопирован",
+ "copyFailed": "Не удалось скопировать: {{error}}",
+ "loading": "Загрузка... Это может занять некоторое время.",
+ "result": "Результат"
+ },
+ "toolMultipleAudioInput": {
+ "inputTitle": "Вход {{type}}",
+ "noFilesSelected": "Файлы не выбраны."
+ },
+ "toolMultiplePdfInput": {
+ "inputTitle": "Вход {{type}}",
+ "noFilesSelected": "Файлы не выбраны."
+ },
+ "toolOptions": {
+ "title": "Параметры инструмента"
+ },
+ "toolTextInput": {
+ "copied": "Текст скопирован",
+ "copyFailed": "Не удалось скопировать: {{error}}",
+ "input": "Введите текст",
+ "placeholder": "Введите текст здесь..."
+ },
+ "toolTextResult": {
+ "copied": "Текст скопирован",
+ "copyFailed": "Не удалось скопировать: {{error}}",
+ "loading": "Загрузка... Это может занять некоторое время.",
+ "result": "Результат"
+ }
+}
diff --git a/public/locales/ru/video.json b/public/locales/ru/video.json
new file mode 100644
index 0000000..3f0b505
--- /dev/null
+++ b/public/locales/ru/video.json
@@ -0,0 +1,113 @@
+{
+ "changeSpeed": {
+ "defaultMultiplier": "Множитель по умолчанию: 2 означает в 2 раза быстрее",
+ "description": "Изменяйте скорость воспроизведения видеофайлов. Ускоряйте или замедляйте видео, сохраняя синхронизацию со звуком. Поддерживает различные коэффициенты ускорения и распространённые видеоформаты.",
+ "inputTitle": "Входное видео",
+ "newVideoSpeed": "Новая скорость видео",
+ "resultTitle": "Отредактированное видео",
+ "settingSpeed": "Скорость установки",
+ "shortDescription": "Изменить скорость воспроизведения видео",
+ "title": "Изменить скорость видео",
+ "toolInfo": {
+ "title": "Что такое {{title}}?"
+ }
+ },
+ "compress": {
+ "default": "По умолчанию",
+ "description": "Сжимайте видео, масштабируя их до различных разрешений, таких как 240p, 480p, 720p и т. д. Этот инструмент помогает уменьшить размер файла, сохраняя приемлемое качество. Поддерживает распространённые видеоформаты, такие как MP4, WebM и OGG.",
+ "inputTitle": "Входное видео",
+ "loadingText": "Сжатие видео...",
+ "lossless": "Без потерь",
+ "quality": "Качество (CRF)",
+ "resolution": "Разрешение",
+ "resultTitle": "Сжатое видео",
+ "shortDescription": "Сжимайте видео путем масштабирования до разных разрешений",
+ "title": "Сжать видео",
+ "worst": "Худший"
+ },
+ "cropVideo": {
+ "cropCoordinates": "Координаты обрезки",
+ "croppingVideo": "Обрезка видео",
+ "description": "Обрежьте видео, чтобы удалить нежелательные области.",
+ "errorBeyondHeight": "Область кадрирования выходит за пределы высоты видео ({{height}}пикс)",
+ "errorBeyondWidth": "Область кадрирования выходит за пределы ширины видео ({{width}}пикс)",
+ "errorCroppingVideo": "Ошибка обрезки видео. Проверьте параметры и видеофайл.",
+ "errorLoadingDimensions": "Не удалось загрузить размеры видео.",
+ "errorNonNegativeCoordinates": "Координаты X и Y должны быть неотрицательными",
+ "errorPositiveDimensions": "Ширина и высота должны быть положительными.",
+ "height": "Высота",
+ "inputTitle": "Входное видео",
+ "loadVideoForDimensions": "Загрузите видео, чтобы увидеть размеры",
+ "resultTitle": "Обрезанное видео",
+ "shortDescription": "Обрежьте видео, чтобы удалить нежелательные области",
+ "title": "Обрезать видео",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет обрезать видеофайлы, удаляя нежелательные области. Вы можете указать область обрезки, задав координаты X, Y, а также ширину и высоту.",
+ "title": "Обрезать видео"
+ },
+ "videoDimensions": "Размеры видео: {{width}} × {{height}} пиксели",
+ "videoInformation": "Видео информация",
+ "width": "Ширина",
+ "xCoordinate": "X (слева)",
+ "yCoordinate": "Y (вверху)"
+ },
+ "flip": {
+ "description": "Переворачивайте видеофайлы по горизонтали или вертикали. Зеркально отображайте видео для создания спецэффектов или исправления проблем с ориентацией.",
+ "flippingVideo": "Перелистывание видео",
+ "horizontalLabel": "Горизонтальный (Зеркальный)",
+ "inputTitle": "Входное видео",
+ "orientation": "Ориентация",
+ "resultTitle": "Перевернутое видео",
+ "shortDescription": "Перевернуть видео по горизонтали или вертикали",
+ "title": "Перевернуть видео",
+ "verticalLabel": "Вертикально (вверх дном)"
+ },
+ "gif": {
+ "changeSpeed": {
+ "description": "Измените скорость воспроизведения GIF-анимации. Ускоряйте или замедляйте GIF-анимацию, сохраняя плавность анимации.",
+ "shortDescription": "Изменить скорость GIF-анимации",
+ "title": "Изменить скорость GIF-анимации"
+ }
+ },
+ "loop": {
+ "description": "Создайте зацикленное видео, повторив исходное видео несколько раз.",
+ "inputTitle": "Входное видео",
+ "loopingVideo": "Зацикливание видео",
+ "loops": "Петли",
+ "numberOfLoops": "Количество петель",
+ "resultTitle": "Зацикленное видео",
+ "shortDescription": "Создание зацикленных видеофайлов",
+ "title": "Цикл видео",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет создать цикличное видео, повторяя исходное видео несколько раз. Вы можете указать, сколько раз видео должно повторяться.",
+ "title": "Что такое {{title}}?"
+ }
+ },
+ "rotate": {
+ "180Degrees": "180° (вверх дном)",
+ "270Degrees": "270° (90° против часовой стрелки)",
+ "90Degrees": "90° по часовой стрелке",
+ "description": "Поворачивайте видеофайлы на 90, 180 или 270 градусов. Корректируйте ориентацию видео или создавайте спецэффекты с помощью точного управления поворотом.",
+ "inputTitle": "Входное видео",
+ "resultTitle": "Повернутое видео",
+ "rotatingVideo": "Вращение видео",
+ "rotation": "Вращение",
+ "shortDescription": "Повернуть видео на указанный угол",
+ "title": "Повернуть видео"
+ },
+ "trim": {
+ "description": "Обрезайте видеофайлы, указав время начала и окончания. Удаляйте ненужные фрагменты в начале или конце видео.",
+ "endTime": "Конец Времени",
+ "inputTitle": "Входное видео",
+ "resultTitle": "Обрезанное видео",
+ "shortDescription": "Обрежьте видео, удалив ненужные фрагменты",
+ "startTime": "Время начала",
+ "timestamps": "Временные метки",
+ "title": "Обрезать видео"
+ },
+ "videoToGif": {
+ "description": "Конвертируйте видеофайлы в анимированный GIF-формат. Извлекайте определённые временные диапазоны и создавайте анимированные изображения для публикации.",
+ "shortDescription": "Конвертировать видео в анимированный GIF",
+ "title": "Видео в GIF"
+ }
+}
diff --git a/public/locales/ru/xml.json b/public/locales/ru/xml.json
new file mode 100644
index 0000000..97a2f85
--- /dev/null
+++ b/public/locales/ru/xml.json
@@ -0,0 +1,38 @@
+{
+ "xmlBeautifier": {
+ "description": "Отформатируйте XML с правильными отступами и интервалами.",
+ "indentation": "Отступ",
+ "inputTitle": "Входной XML",
+ "resultTitle": "Украшенный XML",
+ "shortDescription": "Форматируйте и украшайте XML-код",
+ "title": "XML Beautifier",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет форматировать XML-данные с правильными отступами и интервалами, делая их более читабельными и удобными для работы.",
+ "title": "XML Beautifier"
+ },
+ "useSpaces": "Используйте пробелы",
+ "useSpacesDescription": "Отступ вывода с пробелами",
+ "useTabs": "Использовать вкладки",
+ "useTabsDescription": "Отступ вывода с помощью табуляции."
+ },
+ "xmlValidator": {
+ "description": "Проверьте синтаксис и структуру XML.",
+ "placeholder": "Вставьте или импортируйте XML сюда...",
+ "shortDescription": "Проверить XML-код на наличие ошибок",
+ "title": "XML-валидатор",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет проверить синтаксис и структуру XML. Он проверяет правильность формата XML и выводит подробные сообщения об ошибках при обнаружении любых проблем.",
+ "title": "XML-валидатор"
+ }
+ },
+ "xmlViewer": {
+ "description": "Просмотр и исследование структуры XML в древовидной форме.",
+ "inputTitle": "Входной XML",
+ "resultTitle": "XML-дерево",
+ "title": "XML-просмотрщик",
+ "toolInfo": {
+ "description": "Этот инструмент позволяет просматривать XML-данные в формате иерархического дерева, что упрощает изучение и понимание структуры XML-документов.",
+ "title": "XML-просмотрщик"
+ }
+ }
+}
diff --git a/public/locales/zh/audio.json b/public/locales/zh/audio.json
new file mode 100644
index 0000000..241f235
--- /dev/null
+++ b/public/locales/zh/audio.json
@@ -0,0 +1,42 @@
+{
+ "changeSpeed": {
+ "description": "更改音频文件的播放速度。在保持音调不变的情况下加快或减慢音频速度。",
+ "inputTitle": "输入音频",
+ "newAudioSpeed": "新音频速度",
+ "outputFormat": "输出格式",
+ "resultTitle": "编辑音频",
+ "settingSpeed": "设定速度",
+ "shortDescription": "更改音频文件的速度",
+ "speedDescription": "默认乘数:2 表示速度快 2 倍",
+ "title": "更改音频速度",
+ "toolInfo": {
+ "title": "什么是 {{title}}?"
+ }
+ },
+ "extractAudio": {
+ "description": "从视频文件中提取音轨。",
+ "extractingAudio": "提取音频",
+ "inputTitle": "输入视频",
+ "outputFormat": "输出格式",
+ "outputFormatDescription": "选择要提取的音频的格式。",
+ "resultTitle": "提取音频",
+ "shortDescription": "将视频文件(MP4、MOV 等)中的音频提取为 AAC、MP3 或 WAV。",
+ "title": "从视频中提取音频",
+ "toolInfo": {
+ "description": "此工具可让您从视频文件中提取音轨。您可以选择不同的音频格式,包括 AAC、MP3 和 WAV。",
+ "title": "什么是 {{title}}?"
+ }
+ },
+ "mergeAudio": {
+ "description": "按顺序连接多个音频文件,将其合并为一个音频文件。",
+ "longDescription": "此工具允许您将多个音频文件按照上传顺序串联成一个文件。非常适合合并播客片段、音乐曲目或任何需要合并的音频文件。支持多种音频格式,包括 MP3、AAC 和 WAV。",
+ "shortDescription": "将多个音频文件合并为一个(MP3、AAC、WAV)。",
+ "title": "合并音频"
+ },
+ "trim": {
+ "description": "通过指定开始和结束时间来剪切和修剪音频文件以提取特定片段。",
+ "longDescription": "此工具允许您通过指定开始和结束时间来修剪音频文件。您可以从较长的音频文件中提取特定片段,删除不需要的部分,或创建较短的片段。支持多种音频格式,包括 MP3、AAC 和 WAV。非常适合播客编辑、音乐制作或任何音频编辑需求。",
+ "shortDescription": "修剪音频文件以提取特定时间段(MP3、AAC、WAV)。",
+ "title": "修剪音频"
+ }
+}
diff --git a/public/locales/zh/csv.json b/public/locales/zh/csv.json
new file mode 100644
index 0000000..2383050
--- /dev/null
+++ b/public/locales/zh/csv.json
@@ -0,0 +1,114 @@
+{
+ "changeCsvSeparator": {
+ "description": "更改 CSV 文件中的分隔符。在不同的 CSV 格式(例如逗号、分号、制表符或自定义分隔符)之间进行转换。",
+ "shortDescription": "更改 CSV 文件分隔符",
+ "title": "更改 CSV 分隔符"
+ },
+ "csvRowsToColumns": {
+ "description": "此工具可将 CSV(逗号分隔值)文件的行转换为列。它会从输入的 CSV 文件中逐行提取水平线,将其旋转 90 度,然后将其输出为垂直列,并以逗号分隔。', longDescription: '此工具可将 CSV(逗号分隔值)文件的行转换为列。例如,如果输入的 CSV 数据有 6 行,则输出将有 6 列,并且行中的元素将按从上到下的顺序排列。在格式正确的 CSV 文件中,每行的值数量相同。但是,如果行中缺少字段,程序可以修复它们,您可以从可用选项中进行选择:用空元素填充缺失数据,或用自定义元素(例如“missing”、“?”或“x”)替换缺失数据。在转换过程中,该工具还会清除 CSV 文件中的不必要信息,例如空行(这些行没有可见的信息)和注释。为了帮助工具正确识别注释,您可以在选项中指定行首的注释符号。此符号通常是井号“#”或双斜杠“//”。CSV 真棒!",
+ "longDescription": "此工具可将 CSV(逗号分隔值)文件的行转换为列。例如,如果输入的 CSV 数据有 6 行,则输出将有 6 列,并且行中的元素将按从上到下的顺序排列。在格式正确的 CSV 文件中,每行的值数量相同。但是,如果行中缺少字段,程序可以修复它们,您可以从以下选项中进行选择:用空元素填充缺失数据,或用自定义元素替换缺失数据,例如",
+ "shortDescription": "将 CSV 行转换为列。",
+ "title": "将 CSV 行转换为列"
+ },
+ "csvToJson": {
+ "columnSeparator": "列分隔符(例如,,;\\t)",
+ "commentSymbol": "注释符号(例如 #)",
+ "conversionOptions": "转换选项",
+ "description": "将 CSV 文件转换为 JSON 格式,并可自定义分隔符、引号和输出格式。支持标题、注释和动态类型转换。",
+ "dynamicTypes": "动态类型",
+ "dynamicTypesDescription": "自动转换数字和布尔值",
+ "errorParsing": "解析 CSV 时出错: {{error}}",
+ "fieldQuote": "字段引号(例如“)",
+ "inputCsvFormat": "输入 CSV 格式",
+ "inputTitle": "输入 CSV",
+ "resultTitle": "输出 JSON",
+ "shortDescription": "将 CSV 数据转换为 JSON 格式。",
+ "skipEmptyLines": "跳过空行",
+ "skipEmptyLinesDescription": "忽略输入 CSV 中的空行",
+ "title": "将 CSV 转换为 JSON",
+ "useHeaders": "使用标题",
+ "useHeadersDescription": "将第一行视为列标题"
+ },
+ "csvToTsv": {
+ "description": "使用下方表单上传您的 CSV 文件,它将自动转换为 TSV 文件。在工具选项中,您可以自定义输入的 CSV 格式——指定字段分隔符、引号和注释符号,以及跳过空的 CSV 行,并选择是否保留 CSV 列标题。",
+ "longDescription": "此工具将逗号分隔值 (CSV) 数据转换为制表符分隔值 (TSV)。CSV 和 TSV 都是用于存储表格数据的常用文件格式,但它们使用不同的分隔符来分隔值——CSV 使用逗号 (",
+ "shortDescription": "将 CSV 数据转换为 TSV 格式。",
+ "title": "将 CSV 转换为 TSV"
+ },
+ "csvToXml": {
+ "description": "使用可自定义的选项将 CSV 文件转换为 XML 格式。",
+ "shortDescription": "将 CSV 数据转换为 XML 格式。",
+ "title": "将 CSV 转换为 XML"
+ },
+ "csvToYaml": {
+ "description": "只需在下方表单中上传您的 CSV 文件,它就会自动转换为 YAML 文件。在工具选项中,您可以指定字段分隔符、字段引号和注释符,以使工具适应自定义 CSV 格式。此外,您还可以选择输出 YAML 格式:保留 CSV 标头或不包含 CSV 标头。",
+ "longDescription": "此工具可将 CSV(逗号分隔值)数据转换为 YAML(另一种标记语言)数据。CSV 是一种简单的表格格式,用于表示由行和列组成的矩阵式数据类型。而 YAML 是一种更高级的格式(实际上是 JSON 的超集),它能够创建更易于序列化的数据,并且支持列表、字典和嵌套对象。此程序支持多种 CSV 输入格式——输入数据可以使用逗号分隔(默认)、分号分隔、竖线分隔或使用其他完全不同的分隔符。您可以在选项中指定数据使用的确切分隔符。同样,您可以在选项中指定用于包装 CSV 字段的引号字符(默认为双引号)。您还可以通过在选项中指定注释符号来跳过以注释开头的行。这样可以通过跳过不必要的行来保持数据整洁。有两种方法可以将 CSV 转换为 YAML。第一种方法将每个 CSV 行转换为 YAML 列表。第二种方法从第一个 CSV 行中提取标题,并根据这些标题创建带有键的 YAML 对象。您还可以通过指定 YAML 结构缩进的空格数来自定义输出 YAML 格式。如果您需要执行反向转换,即将 YAML 转换为 CSV,可以使用我们的“将 YAML 转换为 CSV”工具。CSV 真棒!",
+ "shortDescription": "快速将 CSV 文件转换为 YAML 文件。",
+ "title": "将 CSV 转换为 YAML"
+ },
+ "findIncompleteCsvRecords": {
+ "checkingOptions": "检查选项",
+ "commentCharacterDescription": "输入表示注释行开始的字符。以此符号开头的行将被跳过。",
+ "csvInputOptions": "CSV 输入选项",
+ "csvSeparatorDescription": "输入用于分隔 CSV 输入文件中列的字符。",
+ "deleteLinesWithNoData": "删除没有数据的行",
+ "deleteLinesWithNoDataDescription": "从 CSV 输入文件中删除空行。",
+ "description": "只需将您的 CSV 文件上传到下方表单,此工具就会自动检查所有行或列是否均缺失值。在工具选项中,您可以调整输入文件格式(指定分隔符、引号和注释符)。此外,您还可以启用空值检查、跳过空行,以及设置输出中错误消息的数量限制。",
+ "findEmptyValues": "查找空值",
+ "findEmptyValuesDescription": "显示有关 CSV 字段为空的消息(这些不是缺失的字段,而是不包含任何内容的字段)。",
+ "inputTitle": "输入 CSV",
+ "limitNumberOfMessages": "限制消息数量",
+ "messageLimitDescription": "设置输出中消息数量的限制。",
+ "quoteCharacterDescription": "输入用于引用 CSV 输入字段的引号字符。",
+ "resultTitle": "CSV 状态",
+ "shortDescription": "快速查找 CSV 中缺少值的行和列。",
+ "title": "查找不完整的 CSV 记录",
+ "toolInfo": {
+ "title": "什么是 {{title}}?"
+ }
+ },
+ "insertCsvColumns": {
+ "appendColumns": "附加列",
+ "commentCharacterDescription": "输入表示注释行开始的字符。以此符号开头的行将被跳过。",
+ "csvOptions": "CSV 选项",
+ "csvSeparator": "CSV 分隔符",
+ "csvToInsert": "要插入的 CSV",
+ "csvToInsertDescription": "输入要插入到 CSV 中的一个或多个列。用于分隔列的字符必须与 CSV 输入文件中的字符相同。注:空行将被忽略",
+ "customFillDescription": "如果输入的 CSV 文件不完整(缺少值),则向记录中添加空字段或自定义符号以制作格式良好的 CSV?",
+ "customFillValueDescription": "使用此自定义值填写缺失的字段。(仅适用于上述“自定义值”模式。)",
+ "customPosition": "自定义位置",
+ "customPositionOptionsDescription": "选择在 CSV 文件中插入列的方法。",
+ "description": "在指定位置向 CSV 数据添加新列。",
+ "fillWithCustomValues": "填写海关价值",
+ "fillWithEmptyValues": "填充空值",
+ "headerName": "标头名称",
+ "headerNameDescription": "您想要在其后插入列的列标题。",
+ "inputTitle": "输入 CSV",
+ "insertingPositionDescription": "指定在 CSV 文件中插入列的位置。",
+ "position": "位置",
+ "positionOptions": "位置选项",
+ "prependColumns": "添加列",
+ "quoteCharDescription": "输入用于引用 CSV 输入字段的引号字符。",
+ "resultTitle": "输出 CSV",
+ "rowNumberDescription": "您想要在其后插入列的列号。",
+ "separatorDescription": "输入用于分隔 CSV 输入文件中列的字符。",
+ "shortDescription": "在 CSV 文件中的任何位置快速插入一个或多个新列。",
+ "title": "插入 CSV 列",
+ "toolInfo": {
+ "description": "此工具允许您在 CSV 数据的指定位置插入新列。您可以根据标题名称或列号在自定义位置添加、追加或插入列。",
+ "title": "插入 CSV 列"
+ }
+ },
+ "swapCsvColumns": {
+ "description": "只需在下方表单中上传您的 CSV 文件,指定要交换的列,该工具就会自动更改输出文件中指定列的位置。在工具选项中,您可以指定要交换的列位置或名称,还可以修复不完整的数据,并选择性地删除空记录和已注释掉的记录。",
+ "longDescription": "此工具通过交换列的位置来重新组织 CSV 数据。交换列可以将常用数据放在一起或放在最前面,以便于数据比较和编辑,从而提高 CSV 文件的可读性。例如,您可以将第一列与最后一列交换,或者将第二列与第三列交换。要根据列的位置交换列,请选择",
+ "shortDescription": "重新排序 CSV 列。",
+ "title": "交换 CSV 列"
+ },
+ "transposeCsv": {
+ "description": "只需使用下方表格上传您的 CSV 文件,此工具就会自动转置您的 CSV 文件。在工具选项中,您可以指定 CSV 文件中注释行的起始字符,以将其移除。此外,如果 CSV 文件不完整(缺少值),您可以使用空字符或自定义字符替换缺失值。",
+ "longDescription": "此工具用于转置逗号分隔值 (CSV)。它将 CSV 视为数据矩阵,并将所有元素沿主对角线翻转。输出包含与输入相同的 CSV 数据,但现在所有行都变成了列,所有列都变成了行。转置后,CSV 文件的尺寸将相反。例如,如果输入文件有 4 列 3 行,则输出文件将有 3 列 4 行。在转换过程中,程序还会清除数据中不必要的行,并更正不完整的数据。具体来说,该工具会自动删除所有以特定字符开头的空记录和注释,您可以在选项中设置这些字符。此外,如果 CSV 数据损坏或丢失,该实用程序会使用空字段或自定义字段(可在选项中指定)来填充文件。CSV 真是太棒了!",
+ "shortDescription": "快速转置 CSV 文件。",
+ "title": "转置 CSV"
+ }
+}
diff --git a/public/locales/zh/image.json b/public/locales/zh/image.json
new file mode 100644
index 0000000..870131b
--- /dev/null
+++ b/public/locales/zh/image.json
@@ -0,0 +1,98 @@
+{
+ "changeColors": {
+ "description": "世界",
+ "shortDescription": "快速交换图像中的颜色",
+ "title": "改变图像的颜色"
+ },
+ "changeOpacity": {
+ "description": "轻松调整图片透明度。只需上传图片,使用滑块在 0(完全透明)和 1(完全不透明)之间设置所需的不透明度,然后下载修改后的图片即可。",
+ "shortDescription": "调整图像的透明度",
+ "title": "更改图像不透明度"
+ },
+ "compress": {
+ "description": "在保持质量的同时减小图像文件大小。",
+ "inputTitle": "输入图像",
+ "resultTitle": "压缩图像",
+ "shortDescription": "压缩图像以减小文件大小,同时保持合理的质量。",
+ "title": "压缩图像"
+ },
+ "compressPng": {
+ "description": "这是一个压缩 PNG 图片的程序。只要您将 PNG 图片粘贴到输入区域,程序就会对其进行压缩,并在输出区域显示结果。在选项中,您可以调整压缩级别,以及查看新旧图片文件的大小。",
+ "shortDescription": "快速压缩 PNG",
+ "title": "压缩 png"
+ },
+ "convertJgpToPng": {
+ "description": "快速将您的 JPG 图像转换为 PNG。只需在左侧的编辑器中导入您的 PNG 图像即可",
+ "shortDescription": "快速将您的 JPG 图像转换为 PNG",
+ "title": "JPG 转换为 PNG"
+ },
+ "convertToJpg": {
+ "description": "将各种图像格式(PNG、GIF、TIF、PSD、SVG、WEBP、HEIC、RAW)转换为 JPG,并可自定义质量和背景颜色设置。",
+ "shortDescription": "将图像转换为 JPG 格式并进行质量控制",
+ "title": "将图像转换为 JPG"
+ },
+ "createTransparent": {
+ "description": "世界",
+ "shortDescription": "快速使图像透明",
+ "title": "创建透明 PNG"
+ },
+ "crop": {
+ "description": "裁剪图像以删除不需要的区域。",
+ "inputTitle": "输入图像",
+ "resultTitle": "裁剪图像",
+ "shortDescription": "快速裁剪图像。",
+ "title": "裁剪图片"
+ },
+ "editor": {
+ "description": "高级图像编辑器,包含裁剪、旋转、注释、调整颜色和添加水印等工具。直接在浏览器中使用专业级工具编辑图像。",
+ "shortDescription": "使用高级工具和功能编辑图像",
+ "title": "图像编辑器"
+ },
+ "imageToText": {
+ "description": "使用光学字符识别 (OCR) 从图像 (JPG、PNG) 中提取文本。",
+ "shortDescription": "使用 OCR 从图像中提取文本。",
+ "title": "图像转文本 (OCR)"
+ },
+ "qrCode": {
+ "description": "为不同数据类型生成二维码:URL、文本、电子邮件、电话、短信、WiFi、vCard 等。",
+ "shortDescription": "为各种数据格式创建定制的二维码。",
+ "title": "二维码生成器"
+ },
+ "removeBackground": {
+ "description": "世界",
+ "shortDescription": "自动删除图像的背景",
+ "title": "从图像中删除背景"
+ },
+ "resize": {
+ "description": "将图像调整为不同的尺寸。",
+ "dimensionType": "尺寸类型",
+ "heightDescription": "高度(像素)",
+ "inputTitle": "输入图像",
+ "maintainAspectRatio": "保持纵横比",
+ "maintainAspectRatioDescription": "保持图像的原始纵横比。",
+ "percentage": "百分比",
+ "percentageDescription": "原始大小的百分比(例如,50 表示一半大小,200 表示两倍大小)",
+ "resizeByPercentage": "按百分比调整大小",
+ "resizeByPercentageDescription": "通过指定原始大小的百分比来调整大小。",
+ "resizeByPixels": "按像素调整大小",
+ "resizeByPixelsDescription": "通过指定像素尺寸来调整大小。",
+ "resizeMethod": "调整大小方法",
+ "resultTitle": "调整大小的图像",
+ "setHeight": "设置高度",
+ "setHeightDescription": "以像素为单位指定高度并根据纵横比计算宽度。",
+ "setWidth": "设置宽度",
+ "setWidthDescription": "以像素为单位指定宽度并根据纵横比计算高度。",
+ "shortDescription": "轻松调整图像大小。",
+ "title": "调整图像大小",
+ "toolInfo": {
+ "description": "此工具允许您调整 JPG、PNG、SVG 或 GIF 图像的大小。您可以指定像素或百分比来调整大小,并可选择保持原始宽高比。",
+ "title": "调整图像大小"
+ },
+ "widthDescription": "宽度(像素)"
+ },
+ "rotate": {
+ "description": "按指定角度旋转图像。",
+ "shortDescription": "轻松旋转图像。",
+ "title": "旋转图像"
+ }
+}
diff --git a/public/locales/zh/json.json b/public/locales/zh/json.json
new file mode 100644
index 0000000..94366ff
--- /dev/null
+++ b/public/locales/zh/json.json
@@ -0,0 +1,62 @@
+{
+ "escapeJson": {
+ "description": "转义 JSON 字符串中的特殊字符。将 JSON 数据转换为正确的转义格式,以便安全传输或存储。",
+ "shortDescription": "转义 JSON 中的特殊字符",
+ "title": "转义 JSON"
+ },
+ "jsonToXml": {
+ "description": "将 JSON 数据转换为 XML 格式。将结构化的 JSON 对象转换为格式良好的 XML 文档。",
+ "shortDescription": "将 JSON 转换为 XML 格式",
+ "title": "JSON 到 XML"
+ },
+ "minify": {
+ "description": "从 JSON 中删除所有不必要的空格。",
+ "inputTitle": "输入 JSON",
+ "resultTitle": "最小化 JSON",
+ "shortDescription": "通过删除空格来缩小 JSON",
+ "title": "最小化 JSON",
+ "toolInfo": {
+ "description": "JSON 压缩是指在保持 JSON 数据有效性的同时,从中移除所有不必要的空格字符的过程。这包括移除 JSON 正确解析所需的空格、换行符和缩进。压缩可以减小 JSON 数据的大小,使其在保持完全相同的数据结构和值的同时,更高效地存储和传输。",
+ "title": "什么是 JSON 最小化?"
+ }
+ },
+ "prettify": {
+ "description": "使用适当的缩进和间距来格式化 JSON。",
+ "indentation": "缩进",
+ "inputTitle": "输入 JSON",
+ "resultTitle": "美化 JSON",
+ "shortDescription": "格式化并美化 JSON 代码",
+ "title": "美化 JSON",
+ "toolInfo": {
+ "description": "此工具允许您使用适当的缩进和间距格式化 JSON 数据,使其更具可读性且更易于使用。",
+ "title": "美化 JSON"
+ },
+ "useSpaces": "使用空格",
+ "useSpacesDescription": "使用空格缩进输出",
+ "useTabs": "使用标签",
+ "useTabsDescription": "使用制表符缩进输出。"
+ },
+ "stringify": {
+ "description": "将 JavaScript 对象转换为 JSON 字符串格式。将数据结构序列化为 JSON 字符串以便存储或传输。",
+ "shortDescription": "将对象转换为 JSON 字符串",
+ "title": "字符串化 JSON"
+ },
+ "tsvToJson": {
+ "description": "将 TSV(制表符分隔值)数据转换为 JSON 格式。将表格数据转换为结构化的 JSON 对象。",
+ "shortDescription": "将 TSV 转换为 JSON 格式",
+ "title": "TSV 到 JSON"
+ },
+ "validateJson": {
+ "description": "检查 JSON 是否有效且格式正确。",
+ "inputTitle": "输入 JSON",
+ "invalidJson": "❌ {{error}}",
+ "resultTitle": "验证结果",
+ "shortDescription": "验证 JSON 代码是否存在错误",
+ "title": "验证 JSON",
+ "toolInfo": {
+ "description": "JSON(JavaScript 对象表示法)是一种轻量级数据交换格式。JSON 验证可确保数据结构符合 JSON 标准。有效的 JSON 对象必须具备以下特征:- 属性名称用双引号括起来。- 正确匹配的花括号 {}。- 最后一个键值对后没有尾随逗号。- 对象和数组的嵌套正确。此工具会检查输入的 JSON 并提供反馈,以帮助识别和修复常见错误。",
+ "title": "什么是 JSON 验证?"
+ },
+ "validJson": "✅ 有效的 JSON"
+ }
+}
diff --git a/public/locales/zh/list.json b/public/locales/zh/list.json
new file mode 100644
index 0000000..1e119ef
--- /dev/null
+++ b/public/locales/zh/list.json
@@ -0,0 +1,208 @@
+{
+ "duplicate": {
+ "concatenate": "连接",
+ "concatenateDescription": "连接副本(如果未选中,则项目将交织在一起)",
+ "copyDescription": "份数(可以是分数)",
+ "description": "世界上最简单的基于浏览器的列表项复制实用程序。输入您的列表并指定复制条件即可创建项目副本。非常适合数据扩展、测试或创建重复模式。",
+ "duplicationOptions": "复制选项",
+ "examples": {
+ "fractional": {
+ "description": "此示例显示如何复制具有小数份副本的列表。",
+ "title": "部分重复"
+ },
+ "interweave": {
+ "description": "此示例显示如何交织项目而不是连接它们。",
+ "title": "交织物品"
+ },
+ "reverse": {
+ "description": "此示例显示如何以相反的顺序复制列表。",
+ "title": "反向复制"
+ },
+ "simple": {
+ "description": "此示例显示如何复制单词列表。",
+ "title": "简单复制"
+ }
+ },
+ "inputTitle": "输入列表",
+ "joinSeparatorDescription": "用于连接重复列表的分隔符",
+ "resultTitle": "重复列表",
+ "reverse": "撤销",
+ "reverseDescription": "反转重复项",
+ "shortDescription": "按照指定条件复制列表项",
+ "splitByRegex": "按正则表达式拆分",
+ "splitBySymbol": "按符号拆分",
+ "splitOptions": "拆分选项",
+ "splitSeparatorDescription": "用于分割列表的分隔符",
+ "title": "复制",
+ "toolInfo": {
+ "description": "此工具允许您复制列表中的项目。您可以指定副本数量(包括小数),控制项目是连接还是交织,甚至可以反转重复的项目。它非常适合创建重复模式、生成测试数据或扩展具有可预测内容的列表。",
+ "title": "列表重复"
+ }
+ },
+ "findMostPopular": {
+ "description": "世界上最简单的基于浏览器的实用程序,用于查找列表中最热门的项目。输入您的列表,即可立即获取出现频率最高的项目。非常适合数据分析、趋势识别或查找共同点。",
+ "shortDescription": "查找最常出现的项目",
+ "title": "查找最受欢迎的"
+ },
+ "findUnique": {
+ "caseSensitiveItems": "区分大小写的项目",
+ "caseSensitiveItemsDescription": "将具有不同大小写的项目作为列表中的唯一元素输出。",
+ "delimiterDescription": "设置分隔符号或正则表达式。",
+ "description": "世界上最简单的基于浏览器的实用程序,用于在列表中查找唯一项。输入您的列表,即可立即获取所有唯一值(已删除重复项)。非常适合数据清理、重复数据删除或查找不同元素。",
+ "findAbsolutelyUniqueItems": "寻找绝对独特的物品",
+ "findAbsolutelyUniqueItemsDescription": "仅显示列表中存在于单个副本中的项目。",
+ "inputListDelimiter": "输入列表分隔符",
+ "inputTitle": "输入列表",
+ "outputListDelimiter": "输出列表分隔符",
+ "resultTitle": "独特物品",
+ "shortDescription": "在列表中查找唯一项",
+ "skipEmptyItems": "跳过空项目",
+ "skipEmptyItemsDescription": "不要在输出中包含空列表项。",
+ "title": "寻找独特的",
+ "trimItems": "修剪列表项",
+ "trimItemsDescription": "比较项目之前删除前导和尾随空格。",
+ "uniqueItemOptions": "独特物品选项"
+ },
+ "group": {
+ "deleteEmptyItems": "删除空项目",
+ "deleteEmptyItemsDescription": "忽略空项目并且不要将它们包含在组中。",
+ "description": "世界上最简单的基于浏览器的列表项分组工具。输入您的列表并指定分组条件,即可将项目按逻辑分组。非常适合分类数据、组织信息或创建结构化列表。支持自定义分隔符和各种分组选项。",
+ "emptyItemsAndPadding": "空项目和填充",
+ "groupNumberDescription": "组中项目的数量",
+ "groupSeparatorDescription": "组分隔符",
+ "groupSizeAndSeparators": "组大小和分隔符",
+ "inputItemSeparator": "输入项分隔符",
+ "inputTitle": "输入列表",
+ "itemSeparatorDescription": "项目分隔符",
+ "leftWrapDescription": "组的左换行符号。",
+ "padNonFullGroups": "填充非满组",
+ "padNonFullGroupsDescription": "使用自定义项目(在下面输入)填充非完整组。",
+ "paddingCharDescription": "使用此字符或项目来填充非完整组。",
+ "resultTitle": "分组项目",
+ "rightWrapDescription": "组的右换行符号。",
+ "shortDescription": "按共同属性对列表项进行分组",
+ "splitOperators": {
+ "regex": {
+ "description": "使用正则表达式分隔输入列表项。",
+ "title": "使用正则表达式进行拆分"
+ },
+ "symbol": {
+ "description": "用字符分隔输入列表项。",
+ "title": "使用符号进行拆分"
+ }
+ },
+ "splitSeparatorDescription": "设置分隔符号或正则表达式。",
+ "title": "团体"
+ },
+ "reverse": {
+ "description": "这是一个基于浏览器的超级简单的应用程序,可以反向打印所有列表项。输入项可以用任意符号分隔,并且您还可以更改反向列表项的分隔符。",
+ "inputTitle": "输入列表",
+ "itemSeparator": "项目分隔符",
+ "itemSeparatorDescription": "设置分隔符号或正则表达式。",
+ "outputListOptions": "输出列表选项",
+ "outputSeparatorDescription": "输出列表项分隔符。",
+ "resultTitle": "反转列表",
+ "shortDescription": "快速反转列表",
+ "splitOperators": {
+ "regex": {
+ "description": "使用正则表达式分隔输入列表项。",
+ "title": "使用正则表达式进行拆分"
+ },
+ "symbol": {
+ "description": "用字符分隔输入列表项。",
+ "title": "使用符号进行拆分"
+ }
+ },
+ "splitterMode": "分离器模式",
+ "title": "撤销",
+ "toolInfo": {
+ "description": "使用此实用程序,您可以反转列表中项目的顺序。该实用程序首先将输入列表拆分成单个项目,然后从最后一个项目到第一个项目进行迭代,并在迭代过程中将每个项目打印到输出中。输入列表可以包含任何可以表示为文本数据的内容,包括数字、数值、字符串、单词、句子等。输入项分隔符也可以是正则表达式。例如,正则表达式 /[;,]/ 允许您使用逗号或分号分隔的项目。输入和输出列表项分隔符可以在选项中自定义。默认情况下,输入和输出列表均以逗号分隔。Listabulous!",
+ "title": "什么是列表反转器?"
+ }
+ },
+ "rotate": {
+ "description": "世界上最简单的基于浏览器的列表项旋转工具。输入您的列表并指定旋转量,即可将列表项移动指定的位置。非常适合数据操作、循环移动或列表重新排序。",
+ "shortDescription": "按指定位置旋转列表项",
+ "title": "旋转"
+ },
+ "shuffle": {
+ "delimiterDescription": "设置分隔符号或正则表达式。",
+ "description": "世界上最简单的基于浏览器的列表项随机排序工具。输入您的列表,即可立即获得一个按随机顺序排列的列表项随机版本。非常适合创建多样性、测试随机性或混合有序数据。",
+ "inputListSeparator": "输入列表分隔符",
+ "inputTitle": "输入列表",
+ "joinSeparatorDescription": "在随机列表中使用此分隔符。",
+ "outputLengthDescription": "输出这么多的随机物品",
+ "resultTitle": "随机列表",
+ "shortDescription": "随机化列表项的顺序",
+ "shuffledListLength": "打乱列表长度",
+ "shuffledListSeparator": "随机列表分隔符",
+ "title": "随机播放"
+ },
+ "sort": {
+ "caseSensitive": "区分大小写排序",
+ "caseSensitiveDescription": "分别对大写和小写字母进行排序。按升序排列时,大写字母优先于小写字母。(仅适用于字母排序模式。)",
+ "description": "世界上最简单的基于浏览器的列表项排序工具。输入您的列表并指定排序条件,即可按升序或降序排列项目。非常适合数据整理、文本处理或创建有序列表。",
+ "inputItemSeparator": "输入项分隔符",
+ "inputTitle": "输入列表",
+ "joinSeparatorDescription": "使用此符号作为排序列表中项目之间的连接符。",
+ "orderDescription": "选择排序顺序。",
+ "orderOptions": {
+ "decreasing": "降序排列",
+ "increasing": "增加订单"
+ },
+ "removeDuplicates": "删除重复项",
+ "removeDuplicatesDescription": "删除重复的列表项。",
+ "resultTitle": "排序列表",
+ "shortDescription": "按指定顺序对列表项进行排序",
+ "sortMethod": "排序方法",
+ "sortMethodDescription": "选择排序方法。",
+ "sortOptions": {
+ "alphabetic": "按字母顺序排序",
+ "length": "按长度排序",
+ "numeric": "按数字排序"
+ },
+ "sortedItemProperties": "排序的项目属性",
+ "splitOperators": {
+ "regex": {
+ "description": "使用正则表达式分隔输入列表项。",
+ "title": "使用正则表达式进行拆分"
+ },
+ "symbol": {
+ "description": "用字符分隔输入列表项。",
+ "title": "使用符号进行拆分"
+ }
+ },
+ "splitSeparatorDescription": "设置分隔符号或正则表达式。",
+ "title": "种类"
+ },
+ "truncate": {
+ "description": "世界上最简单的基于浏览器的列表截断工具。输入您的列表并指定要保留的最大项目数。非常适合数据处理、列表管理或限制内容长度。",
+ "shortDescription": "将列表截断为指定数量的项目",
+ "title": "截短"
+ },
+ "unwrap": {
+ "description": "世界上最简单的基于浏览器的列表项展开工具。输入已展开的列表,并指定展开条件以展平有序的列表项。非常适合数据处理、文本操作或从结构化列表中提取内容。",
+ "shortDescription": "从结构化格式中解开列表项",
+ "title": "展开"
+ },
+ "wrap": {
+ "description": "在每个列表项之前和之后添加文本。",
+ "inputTitle": "输入列表",
+ "joinSeparatorDescription": "用于连接包装列表的分隔符",
+ "leftTextDescription": "每个项目前添加的文本",
+ "removeEmptyItems": "删除空项目",
+ "resultTitle": "包装列表",
+ "rightTextDescription": "每项后添加的文本",
+ "shortDescription": "使用指定条件包装列表项",
+ "splitByRegex": "按正则表达式拆分",
+ "splitBySymbol": "按符号拆分",
+ "splitOptions": "拆分选项",
+ "splitSeparatorDescription": "用于分割列表的分隔符",
+ "title": "裹",
+ "toolInfo": {
+ "description": "此工具允许您在列表中每个项目前后添加文本。您可以为左右两侧指定不同的文本,并控制列表的处理方式。它适用于为列表项添加引号、括号或其他格式,准备不同格式的数据,或创建结构化文本。",
+ "title": "列表包装"
+ },
+ "wrapOptions": "包装选项"
+ }
+}
diff --git a/public/locales/zh/number.json b/public/locales/zh/number.json
new file mode 100644
index 0000000..220c1fe
--- /dev/null
+++ b/public/locales/zh/number.json
@@ -0,0 +1,89 @@
+{
+ "arithmeticSequence": {
+ "commonDifferenceDescription": "术语之间的共同差异(d)",
+ "description": "生成具有可定制参数的算术序列。",
+ "firstTermDescription": "序列的第一项 (a₁)",
+ "numberOfTermsDescription": "生成的术语数(n)",
+ "outputFormat": "输出格式",
+ "resultTitle": "生成的序列",
+ "separatorDescription": "术语之间的分隔符",
+ "sequenceParameters": "序列参数",
+ "shortDescription": "生成等差序列",
+ "title": "等差序列",
+ "toolInfo": {
+ "description": "等差数列是指一系列连续数列中,各连续项之间的差为常数。这个常数差称为公差。给定第一项 (a₁) 和公差 (d),可以通过将公差加到前一项来求出每一项。",
+ "title": "什么是等差序列?"
+ }
+ },
+ "generate": {
+ "arithmeticSequenceOption": "算术序列选项",
+ "description": "生成具有可定制参数的数字序列。",
+ "numberOfElementsDescription": "序列中的元素数量。",
+ "resultTitle": "生成的数字",
+ "separator": "分隔符",
+ "separatorDescription": "用该字符分隔算术序列中的元素。",
+ "shortDescription": "生成指定范围内的随机数",
+ "startSequenceDescription": "从该数字开始序列。",
+ "stepDescription": "将每个元素增加此量",
+ "title": "产生",
+ "toolInfo": {
+ "description": "此工具允许您生成具有可自定义参数的数字序列。您可以指定起始值、步长和元素数量。",
+ "title": "生成数字"
+ }
+ },
+ "ohmsLaw": {
+ "description": "计算电压、电流和电阻",
+ "longDescription": "此计算器应用欧姆定律 (V = I × R),在已知其他两个电参数的情况下,确定任意三个电参数。欧姆定律是电气工程中的一个基本原理,描述了电压 (V)、电流 (I) 和电阻 (R) 之间的关系。对于电子爱好者、电气工程师和从事电路设计的学生来说,此工具必不可少,可以帮助他们快速求解电气设计中的未知值。",
+ "shortDescription": "使用欧姆定律计算电路中的电压、电流或电阻",
+ "title": "欧姆定律"
+ },
+ "slackline": {
+ "description": "计算松弛线的张力",
+ "longDescription": "该计算器假设绳索中心有负载",
+ "shortDescription": "计算松弛绳或晾衣绳的大致张力。不要依赖它来确保安全。",
+ "title": "松弛线张力"
+ },
+ "sphereArea": {
+ "description": "球体的面积",
+ "longDescription": "此计算器使用公式 A = 4πr² 计算球体的表面积。您可以输入半径来计算表面积,也可以直接输入表面积来计算所需的半径。此工具适用于学习几何的学生、处理球形物体的工程师以及任何需要进行球面计算的人。",
+ "shortDescription": "根据球体的半径计算其表面积",
+ "title": "球体的面积"
+ },
+ "sphereVolume": {
+ "description": "球体的体积",
+ "longDescription": "此计算器使用公式 V = (4/3)πr³ 计算球体的体积。您可以输入半径或直径来计算体积,也可以直接输入体积来确定所需的半径。对于在物理、工程和制造等领域处理球形物体的学生、工程师和专业人士来说,此工具非常有用。",
+ "shortDescription": "使用半径或直径计算球体的体积",
+ "title": "球体的体积"
+ },
+ "sum": {
+ "description": "计算一串数字的总和。输入以逗号或换行符分隔的数字,即可计算出它们的总和。",
+ "extractionTypes": {
+ "delimiter": {
+ "description": "在此自定义数字分隔符。(默认为换行符。)",
+ "title": "数字分隔符"
+ },
+ "smart": {
+ "description": "自动检测输入中的数字。",
+ "title": "智能总和"
+ }
+ },
+ "inputTitle": "输入",
+ "numberExtraction": "数字提取",
+ "printRunningSum": "打印运行总和",
+ "printRunningSumDescription": "显示逐步计算的总和。",
+ "resultTitle": "全部的",
+ "runningSum": "运行总和",
+ "shortDescription": "计算数字之和",
+ "title": "和",
+ "toolInfo": {
+ "description": "这是一个基于浏览器的在线实用程序,用于计算一组数字的总和。您可以输入用逗号、空格或任何其他字符(包括换行符)分隔的数字。您也可以直接粘贴一段包含要求和的数值的文本数据,该实用程序会提取这些数据并计算总和。",
+ "title": "什么是数字总和计算器?"
+ }
+ },
+ "voltageDropInWire": {
+ "description": "计算双芯电缆的往返电压和功率损耗",
+ "longDescription": "这款计算器可帮助计算双芯电缆的电压降和功率损耗。它考虑了电缆长度、线规(横截面积)、材料电阻率和电流。该工具可计算往返电压降、电缆总电阻以及以热量形式耗散的功率。这对于电气工程师、电工和业余爱好者在设计电气系统时尤其有用,可确保负载下的电压水平保持在可接受的范围内。",
+ "shortDescription": "根据长度、材料和电流计算电缆的电压降和功率损耗",
+ "title": "电缆往返电压降"
+ }
+}
diff --git a/public/locales/zh/pdf.json b/public/locales/zh/pdf.json
new file mode 100644
index 0000000..aeb3726
--- /dev/null
+++ b/public/locales/zh/pdf.json
@@ -0,0 +1,113 @@
+{
+ "compressPdf": {
+ "compressedFileSize": "压缩文件大小",
+ "compressingPdf": "正在压缩 PDF...",
+ "compressionLevel": "压缩级别",
+ "compressionSettings": "压缩设置",
+ "description": "使用 Ghostscript 减小 PDF 文件大小同时保持质量",
+ "errorCompressingPdf": "压缩 PDF 失败: {{error}}",
+ "errorReadingPdf": "无法读取 PDF 文件。请确保它是有效的 PDF。",
+ "fileSize": "原始文件大小",
+ "highCompression": "高压缩",
+ "highCompressionDescription": "最大程度地减少文件大小,但会损失一些质量",
+ "inputTitle": "输入 PDF",
+ "lowCompression": "低压缩",
+ "lowCompressionDescription": "在尽量减少质量损失的情况下稍微减小文件大小",
+ "mediumCompression": "中等压缩",
+ "mediumCompressionDescription": "文件大小和质量之间的平衡",
+ "pages": "页数",
+ "resultTitle": "压缩 PDF",
+ "shortDescription": "在浏览器中安全地压缩 PDF 文件",
+ "title": "压缩PDF"
+ },
+ "editor": {
+ "description": "高级 PDF 编辑器,具备注释、表单填写、高亮显示和导出功能。您可以使用专业级工具(包括文本插入、绘图、高亮显示、签名和表单填写)直接在浏览器中编辑 PDF。",
+ "shortDescription": "使用高级注释、签名和编辑工具编辑 PDF",
+ "title": "PDF编辑器"
+ },
+ "merge": {
+ "inputTitle": "输入 PDF",
+ "loadingText": "提取页面",
+ "resultTitle": "输出合并的 PDF",
+ "toolInfo": {
+ "description": "此工具允许您将多个 PDF 文件合并为一个文档。要使用该工具,只需上传要合并的 PDF 文件即可。然后,该工具会将输入文件中的所有页面合并为一个 PDF 文档。",
+ "title": "如何使用合并 PDF 工具?"
+ }
+ },
+ "mergePdf": {
+ "description": "合并多个 PDF 文件为一个文档。",
+ "inputTitle": "输入 PDF",
+ "mergingPdfs": "合并 PDF",
+ "pdfOptions": "PDF 选项",
+ "resultTitle": "合并的 PDF",
+ "shortDescription": "将多个 PDF 文件合并为一个文档",
+ "sortByFileName": "按文件名排序",
+ "sortByFileNameDescription": "按文件名字母顺序对 PDF 进行排序",
+ "sortByUploadOrder": "按上传顺序排序",
+ "sortByUploadOrderDescription": "保持 PDF 按照上传顺序排列",
+ "title": "合并 PDF",
+ "toolInfo": {
+ "description": "此工具允许您将多个 PDF 文件合并为一个文档。您可以选择对 PDF 进行排序,该工具将按照指定的顺序进行合并。",
+ "title": "合并PDF文件"
+ }
+ },
+ "pdfToEpub": {
+ "description": "将 PDF 文档转换为 EPUB 文件,以实现更好的电子阅读器兼容性。', icon: 'material-symbols:import-contacts', component: lazy(() => import('./index')), keywords: ['pdf', 'epub', 'convert', 'ebook'], path: 'pdf-to-epub', i18n: { name: 'pdf:pdfToEpub.title', description: 'pdf:pdfToEpub.description",
+ "shortDescription": "将 PDF 文件转换为 EPUB 格式",
+ "title": "PDF 转 EPUB"
+ },
+ "pdfToPng": {
+ "description": "将 PDF 文档转换为 PNG 面板。",
+ "longDescription": "上传 PDF 后,直接在浏览器中将每个页面转换为高质量的 PNG 图像。此工具非常适合提取视觉内容或分享单个页面。无需上传数据,所有操作均在本地运行。",
+ "shortDescription": "将 PDF 转换为 PNG 图像",
+ "title": "PDF 转 PNG"
+ },
+ "protectPdf": {
+ "description": "在浏览器中安全地为 PDF 文件添加密码保护",
+ "shortDescription": "使用密码安全地保护 PDF 文件",
+ "title": "保护 PDF"
+ },
+ "rotatePdf": {
+ "allPagesWillBeRotated": "全部 {{count}} 页面将会旋转",
+ "angleOptions": {
+ "clockwise90": "顺时针 90°",
+ "counterClockwise270": "270°(逆时针90°)",
+ "upsideDown180": "180°(上下颠倒)"
+ },
+ "applyToAllPages": "应用于所有页面",
+ "description": "旋转 PDF 文档中的页面。",
+ "inputTitle": "输入 PDF",
+ "longDescription": "通过将 PDF 页面旋转 90 度、180 度或 270 度来更改其方向。这对于修复扫描错误的文档或准备打印 PDF 非常有用。",
+ "pageRangesDescription": "输入页码或范围,以逗号分隔(例如,1,3,5-7)",
+ "pageRangesPlaceholder": "例如,1.5-8",
+ "pagesWillBeRotated": "{{count}} 页{{count !== 1 ? 's' : ''}} 将会轮换",
+ "pdfPageCount": "PDF 有 {{count}} 页{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "旋转的 PDF",
+ "rotatingPages": "旋转页面",
+ "rotationAngle": "旋转角度",
+ "rotationSettings": "旋转设置",
+ "shortDescription": "旋转 PDF 文档中的页面",
+ "title": "旋转 PDF",
+ "toolInfo": {
+ "description": "此工具允许您旋转 PDF 文档中的页面。您可以旋转所有页面,也可以指定单个页面进行旋转。选择旋转角度:顺时针 90°、上下 180° 或逆时针 270°。要旋转特定页面,请取消勾选“应用于所有页面”,并输入页码或以逗号分隔的范围(例如,1,3,5-7)。",
+ "title": "如何使用旋转 PDF 工具"
+ }
+ },
+ "splitPdf": {
+ "description": "从 PDF 文档中提取特定页面。",
+ "extractingPages": "提取页面",
+ "inputTitle": "输入 PDF",
+ "pageExtractionPreview": "{{count}} 页{{count !== 1 ? 's' : ''}} 将被提取",
+ "pageRangesDescription": "输入页码或范围,以逗号分隔(例如,1,3,5-7)",
+ "pageRangesPlaceholder": "例如,1.5-8",
+ "pageSelection": "页面选择",
+ "pdfPageCount": "PDF 有 {{count}} 页{{count !== 1 ? 's' : ''}}",
+ "resultTitle": "提取的 PDF",
+ "shortDescription": "从 PDF 文件中提取特定页面",
+ "title": "拆分 PDF",
+ "toolInfo": {
+ "description": "此工具允许您从 PDF 文档中提取特定页面。您可以指定要提取的单个页面或页面范围。",
+ "title": "拆分 PDF"
+ }
+ }
+}
diff --git a/public/locales/zh/string.json b/public/locales/zh/string.json
new file mode 100644
index 0000000..fd483ff
--- /dev/null
+++ b/public/locales/zh/string.json
@@ -0,0 +1,261 @@
+{
+ "base64": {
+ "decode": "Base64解码",
+ "description": "使用 Base64 编码对文本进行编码或解码。",
+ "encode": "Base64编码",
+ "inputTitle": "输入数据",
+ "optionsTitle": "Base64 选项",
+ "resultTitle": "结果",
+ "shortDescription": "使用 Base64 对数据进行编码或解码。",
+ "title": "Base64 编码器/解码器",
+ "toolInfo": {
+ "description": "Base64 是一种编码方案,它将 ASCII 字符串格式的数据转换为 radix-64 表示形式。虽然 Base64 也可以用来编码字符串,但它更常用于编码二进制数据,以便在专门处理文本数据的介质上传输。",
+ "title": "什么是Base64?"
+ }
+ },
+ "censor": {
+ "description": "用于审查文本中单词的实用程序。在左侧的输入表单中加载您的文本,并在选项中指定所有脏话,您将立即在输出区域获得已审查的文本。\", longDescription: '使用此在线工具,您可以审查任何文本中的某些单词。您可以指定不想要的单词列表(例如脏话或秘密单词),程序会用替代单词替换它们,并创建可安全阅读的文本。您可以在选项中的多行文本字段中通过每行输入一个单词来指定这些单词。', keywords: ['text', 'censor', 'words', 'characters'], component: lazy(() => import('./index')), i18n: { name: 'string:censor.title', description: 'string:censor.description",
+ "shortDescription": "快速掩盖脏话或用替代词代替。",
+ "title": "文本审查"
+ },
+ "createPalindrome": {
+ "description": "世界上最简单的基于浏览器的回文创建工具,可从任何文本创建回文。输入文本即可立即将其转换为正反读相同的回文。非常适合文字游戏、创建对称文本模式或探索语言学知识。",
+ "shortDescription": "创建正读和倒读相同的文本",
+ "title": "创建回文"
+ },
+ "extractSubstring": {
+ "description": "世界上最简单的基于浏览器的文本子字符串提取工具。输入文本并指定起始和终止位置即可提取所需部分。非常适合数据处理、文本分析或从较大文本块中提取特定内容。",
+ "shortDescription": "提取指定位置之间的部分文本",
+ "title": "提取子字符串"
+ },
+ "join": {
+ "blankLinesAndTrailingSpaces": "空行和尾随空格",
+ "deleteBlankDescription": "删除没有文本符号的行。",
+ "deleteBlankTitle": "删除空白行",
+ "deleteTrailingDescription": "删除行尾的空格和制表符。",
+ "deleteTrailingTitle": "删除尾随空格",
+ "description": "使用可自定义的分隔符将文本片段连接在一起。",
+ "inputTitle": "文本片段",
+ "joinCharacterDescription": "连接文本片段的符号。(默认为空格。)",
+ "joinCharacterPlaceholder": "加入角色",
+ "resultTitle": "连接文本",
+ "shortDescription": "使用指定的分隔符连接文本元素",
+ "textMergedOptions": "文本合并选项",
+ "title": "加入文本",
+ "toolInfo": {
+ "description": "使用此工具,您可以将文本的各个部分连接在一起。它接收一个以换行符分隔的文本值列表,并将它们合并在一起。您可以设置合并文本各部分之间的字符。此外,您还可以忽略所有空行,并删除所有行末的空格和制表符。Textabulous!",
+ "title": "什么是文本连接器?"
+ }
+ },
+ "palindrome": {
+ "description": "世界上最简单的基于浏览器的回文检测工具。即时验证文本正读和反读是否一致。非常适合字谜游戏、语言分析或验证对称文本模式。支持各种分隔符和多词回文检测。",
+ "shortDescription": "检查文本正读和反读是否相同",
+ "title": "回文"
+ },
+ "passwordGenerator": {
+ "avoidAmbiguous": "避免使用歧义字符(i、I、l、0、O)",
+ "description": "生成安全的随机密码,可自定义长度和字符类型。密码类型包括小写字母、大写字母、数字和特殊字符。此外,还可选择避免使用模糊字符,以提高可读性。",
+ "includeLowercase": "包含小写字母(a-z)",
+ "includeNumbers": "包含数字 (0-9)",
+ "includeSymbols": "包含特殊字符",
+ "includeUppercase": "包含大写字母(A-Z)",
+ "lengthDesc": "密码长度",
+ "lengthPlaceholder": "例如 12",
+ "optionsTitle": "密码选项",
+ "resultTitle": "生成的密码",
+ "shortDescription": "使用自定义选项生成安全的随机密码",
+ "title": "密码生成器",
+ "toolInfo": {
+ "description": "此工具可根据您选择的条件生成安全的随机密码。您可以自定义长度,包含或排除不同的字符类型,并避免使用模糊字符以提高可读性。非常适合为帐户、应用程序或任何安全需求创建强密码。",
+ "title": "关于密码生成器"
+ }
+ },
+ "quote": {
+ "allowDoubleQuotation": "允许双引号",
+ "description": "使用可自定义的选项在文本周围添加引号。",
+ "inputTitle": "输入文本",
+ "leftQuoteDescription": "左引号字符",
+ "processAsMultiLine": "作为多行文本处理",
+ "quoteEmptyLines": "引用空行",
+ "quoteOptions": "报价选项",
+ "resultTitle": "引用文本",
+ "rightQuoteDescription": "右引号字符",
+ "shortDescription": "使用各种样式在文本周围添加引号",
+ "title": "文字引述者",
+ "toolInfo": {
+ "description": "此工具可用于在文本周围添加引号。您可以选择不同的引号字符、处理多行文本以及控制空行的处理方式。它对于准备编程文本、格式化数据或创建风格化文本非常有用。",
+ "title": "文字引述者"
+ }
+ },
+ "randomizeCase": {
+ "description": "世界上最简单的基于浏览器的文本大小写随机化工具。输入文本后,即可立即将其转换为随机的大小写字母。非常适合创建独特的文本效果、测试大小写敏感度或生成丰富的文本模式。",
+ "shortDescription": "随机化文本中字母的大小写",
+ "title": "随机化案例"
+ },
+ "removeDuplicateLines": {
+ "description": "在左侧的输入表单中加载文本,即可立即在输出区域获得无重复行的文本。功能强大、免费且快速。加载文本行 – 获取独特的文本行",
+ "shortDescription": "快速删除文本中所有重复的行",
+ "title": "删除重复的行"
+ },
+ "repeat": {
+ "delimiterDescription": "输出副本的分隔符。",
+ "delimiterPlaceholder": "分隔符",
+ "description": "使用可自定义的分隔符多次重复文本。",
+ "inputTitle": "输入文本",
+ "numberPlaceholder": "数字",
+ "repeatAmountDescription": "重复次数。",
+ "repetitionsDelimiter": "重复分隔符",
+ "resultTitle": "重复的文本",
+ "shortDescription": "重复文本多次",
+ "textRepetitions": "文本重复",
+ "title": "重复文本",
+ "toolInfo": {
+ "description": "此工具允许您使用可选分隔符多次重复给定的文本。",
+ "title": "重复文本"
+ }
+ },
+ "reverse": {
+ "description": "世界上最简单的基于浏览器的文本反转工具。输入任意文本即可立即逐字符反转。非常适合创建镜像文本、分析回文或玩转文本模式。反转时保留空格和特殊字符。",
+ "inputTitle": "反转文本",
+ "processMultiLine": "处理多行文本",
+ "processMultiLineDescription": "每行将单独反转",
+ "resultTitle": "反转文本",
+ "reversalOptions": "逆转期权",
+ "shortDescription": "逐个字符地反转任何文本",
+ "skipEmptyLines": "跳过空行",
+ "skipEmptyLinesDescription": "输出中的空行将被删除",
+ "title": "撤销",
+ "trimWhitespace": "修剪空格",
+ "trimWhitespaceDescription": "删除每行的前导和尾随空格"
+ },
+ "rot13": {
+ "description": "使用 ROT13 密码对文本进行编码或解码。",
+ "inputTitle": "输入文本",
+ "resultTitle": "ROT13 结果",
+ "shortDescription": "使用 ROT13 密码对文本进行编码或解码。",
+ "title": "ROT13编码器/解码器",
+ "toolInfo": {
+ "description": "ROT13(循环13位)是一种简单的字母替换密码,用字母表中该字母后面的第13个字母替换该字母。ROT13是古罗马凯撒密码的一个特例。由于英语字母表有26个字母,因此ROT13是其自身的逆;也就是说,要撤销ROT13,需要应用相同的算法,因此编码和解码的操作相同。",
+ "title": "ROT13 是什么?"
+ }
+ },
+ "rotate": {
+ "description": "按指定位置旋转文本中的字符。",
+ "inputTitle": "输入文本",
+ "processAsMultiLine": "作为多行文本处理(分别旋转每一行)",
+ "resultTitle": "旋转文本",
+ "rotateLeft": "向左旋转",
+ "rotateRight": "向右旋转",
+ "rotationOptions": "旋转选项",
+ "shortDescription": "按位置移动文本中的字符。",
+ "stepDescription": "旋转位置数",
+ "title": "旋转文本",
+ "toolInfo": {
+ "description": "此工具允许您将字符串中的字符旋转指定位数。您可以向左或向右旋转,并通过分别旋转每一行来处理多行文本。字符串旋转对于简单的文本转换、创建模式或实现基本的加密技术非常有用。",
+ "title": "琴弦旋转"
+ }
+ },
+ "split": {
+ "charAfterChunkDescription": "每个块后的字符",
+ "charBeforeChunkDescription": "每个块前的字符",
+ "chunksDescription": "输出中等长数据块的数量。",
+ "chunksTitle": "使用多个块",
+ "description": "世界上最简单的基于浏览器的文本分割工具。输入文本并指定分隔符即可将其拆分为多个部分。非常适合数据处理、文本操作或从较大的文本块中提取特定内容。",
+ "lengthDescription": "每个输出块中放入的符号数量。",
+ "lengthTitle": "使用长度进行拆分",
+ "outputSeparatorDescription": "插入拆分块之间的字符。(默认为换行符“\\n”。)",
+ "outputSeparatorOptions": "输出分隔符选项",
+ "regexDescription": "用于将文本拆分成多个部分的正则表达式。(默认为多个空格。)",
+ "regexTitle": "使用正则表达式进行拆分",
+ "resultTitle": "文本片段",
+ "shortDescription": "使用分隔符将文本拆分为多个部分",
+ "splitSeparatorOptions": "拆分分隔符选项",
+ "symbolDescription": "用于将文本拆分成多个部分的字符。(默认为空格。)",
+ "symbolTitle": "使用符号进行拆分",
+ "title": "分裂"
+ },
+ "statistic": {
+ "characterFrequencyAnalysis": "字频分析",
+ "characterFrequencyAnalysisDescription": "计算每个字符在文本中出现的频率",
+ "delimitersOptions": "分隔符选项",
+ "description": "分析文本并生成综合统计数据。",
+ "includeEmptyLines": "包含空行",
+ "includeEmptyLinesDescription": "计算行数时包含空行",
+ "inputTitle": "输入文本",
+ "resultTitle": "文本统计",
+ "sentenceDelimitersDescription": "输入用于分隔您语言中的句子的自定义字符(以逗号分隔)或将其留空作为默认设置。",
+ "sentenceDelimitersPlaceholder": "例如。,!,?,...",
+ "shortDescription": "获取有关文本的统计数据",
+ "statisticsOptions": "统计选项",
+ "title": "文本统计",
+ "toolInfo": {
+ "description": "该工具允许您分析文本并生成全面的统计数据,包括字符数、字数、行数以及字符和单词的频率分析。",
+ "title": "什么是 {{title}}?"
+ },
+ "wordDelimitersDescription": "输入自定义正则表达式来计算单词数,或将其留空作为默认值。",
+ "wordDelimitersPlaceholder": "例如。 \\s.,;:!?”«»()…",
+ "wordFrequencyAnalysis": "词频分析",
+ "wordFrequencyAnalysisDescription": "计算每个单词在文本中出现的频率"
+ },
+ "textReplacer": {
+ "description": "用新内容替换文本模式。",
+ "findPatternInText": "在文本中查找此模式",
+ "findPatternUsingRegexp": "使用正则表达式查找模式",
+ "inputTitle": "要替换的文本",
+ "newTextPlaceholder": "新文本",
+ "regexpDescription": "输入要替换的正则表达式。",
+ "replacePatternDescription": "输入用于替换的模式。",
+ "replaceText": "替换文本",
+ "resultTitle": "带替换的文本",
+ "searchPatternDescription": "输入您想要替换的文本模式。",
+ "searchText": "搜索文本",
+ "shortDescription": "快速替换内容中的文本",
+ "title": "文本替换器",
+ "toolInfo": {
+ "description": "使用这款基于浏览器的简单工具,轻松替换内容中的特定文本。只需输入文本,设置要替换的文本和替换值,即可立即获取更新版本。",
+ "title": "文本替换器"
+ }
+ },
+ "toMorse": {
+ "dashSymbolDescription": "与摩尔斯电码中的破折号相对应的符号。",
+ "description": "将文本转换为摩尔斯电码。",
+ "dotSymbolDescription": "与摩尔斯电码中的点对应的符号。",
+ "longSignal": "长信号",
+ "resultTitle": "摩尔斯电码",
+ "shortDescription": "快速将文本编码为摩尔斯电码",
+ "shortSignal": "短信号",
+ "title": "字符串到莫尔斯"
+ },
+ "truncate": {
+ "addTruncationIndicator": "添加截断指示符",
+ "charactersPlaceholder": "人物",
+ "description": "将文本缩短至指定长度。",
+ "indicatorDescription": "在文本末尾(或开头)添加的字符。注意:这些字符计入长度。",
+ "inputTitle": "输入文本",
+ "leftSideDescription": "从文本开头删除字符。",
+ "leftSideTruncation": "左侧截断",
+ "lengthAndLines": "长度和线条",
+ "lineByLineDescription": "分别截断每一行。",
+ "lineByLineTruncating": "逐行截断",
+ "maxLengthDescription": "文本中保留的字符数。",
+ "numberPlaceholder": "数字",
+ "resultTitle": "文本被截断",
+ "rightSideDescription": "删除文本末尾的字符。",
+ "rightSideTruncation": "右侧截断",
+ "shortDescription": "将文本截断为指定长度",
+ "suffixAndAffix": "后缀和词缀",
+ "title": "截断文本",
+ "toolInfo": {
+ "description": "在左侧的输入表单中加载您的文本,您将自动在右侧获得截断文本。",
+ "title": "截断文本"
+ },
+ "truncationSide": "截断侧"
+ },
+ "uppercase": {
+ "description": "将文本转换为大写字母。",
+ "inputTitle": "输入文本",
+ "resultTitle": "大写文本",
+ "shortDescription": "将文本转换为大写",
+ "title": "转换为大写"
+ }
+}
diff --git a/public/locales/zh/time.json b/public/locales/zh/time.json
new file mode 100644
index 0000000..ffcf212
--- /dev/null
+++ b/public/locales/zh/time.json
@@ -0,0 +1,100 @@
+{
+ "checkLeapYears": {
+ "description": "检查某一年份是否为闰年并获取闰年信息。",
+ "inputTitle": "输入年份",
+ "resultTitle": "闰年结果",
+ "shortDescription": "检查年份是否为闰年",
+ "title": "检查闰年",
+ "toolInfo": {
+ "description": "闰年是指在每年的2月29日增加一天,以使日历年与天文年保持一致。闰年每4年一次,但能被100整除但不能被400整除的年份除外。",
+ "title": "什么是闰年?"
+ }
+ },
+ "convertDaysToHours": {
+ "addHoursName": "添加营业时间名称",
+ "addHoursNameDescription": "将字符串 hours 附加到输出值",
+ "description": "使用可自定义的选项将天数转换为小时数。",
+ "hoursName": "营业时间名称",
+ "shortDescription": "将天数转换为小时数",
+ "title": "将天数转换为小时数",
+ "toolInfo": {
+ "description": "此工具可让您将天数转换为小时数。您可以输入数字或单位形式的天数,该工具会将其转换为小时数。您还可以选择在输出值后附加“小时”后缀。",
+ "title": "将天数转换为小时数"
+ }
+ },
+ "convertHoursToDays": {
+ "addDaysName": "添加日期名称",
+ "addDaysNameDescription": "将字符串 days 附加到输出值",
+ "daysName": "日期名称",
+ "description": "使用可自定义的选项将小时转换为天。",
+ "shortDescription": "将小时转换为天",
+ "title": "将小时转换为天",
+ "toolInfo": {
+ "description": "此工具可让您将小时转换为天。您可以输入数字或单位形式的小时,该工具会将其转换为天。您还可以选择在输出值后附加“天”后缀。",
+ "title": "将小时转换为天"
+ }
+ },
+ "convertSecondsToTime": {
+ "addPadding": "添加填充",
+ "addPaddingDescription": "在小时、分钟和秒后添加零填充。",
+ "description": "将秒转换为可读的时间格式(小时:分钟:秒)。输入秒数即可获取格式化的时间。",
+ "shortDescription": "将秒数转换为时间格式",
+ "timePadding": "时间填充",
+ "title": "将秒转换为时间",
+ "toolInfo": {
+ "title": "什么是 {{title}}?"
+ }
+ },
+ "convertTimeToSeconds": {
+ "description": "将格式化的时间(HH:MM:SS)转换为秒。",
+ "inputTitle": "输入时间",
+ "resultTitle": "秒",
+ "shortDescription": "将时间格式转换为秒",
+ "title": "将时间转换为秒",
+ "toolInfo": {
+ "description": "此工具可让您将格式化的时间字符串 (HH:MM:SS) 转换为秒。它对于计算持续时间和时间间隔非常有用。",
+ "title": "将时间转换为秒"
+ }
+ },
+ "crontabGuru": {
+ "description": "生成并理解 cron 表达式。为自动化任务和系统作业创建 cron 计划。",
+ "shortDescription": "生成并理解 cron 表达式",
+ "title": "Crontab 大师"
+ },
+ "timeBetweenDates": {
+ "description": "计算两个日期之间的时差。获取精确的天、小时、分钟和秒数。",
+ "endDate": "结束日期",
+ "endDateTime": "结束日期和时间",
+ "endTime": "结束时间",
+ "endTimezone": "结束时区",
+ "shortDescription": "计算两个日期之间的时间",
+ "startDate": "开始日期",
+ "startDateTime": "开始日期和时间",
+ "startTime": "开始时间",
+ "startTimezone": "开始时区",
+ "title": "日期间隔时间",
+ "toolInfo": {
+ "description": "计算两个日期和时间之间的精确时差,支持不同时区。此工具提供按不同单位(年、月、日、时、分、秒)计算的详细时差细分。",
+ "title": "日期间隔时间计算器"
+ }
+ },
+ "truncateClockTime": {
+ "description": "截断时钟时间以删除秒数或分钟数。将时间四舍五入到最接近的小时数、分钟数或自定义间隔。",
+ "printDroppedComponents": "打印掉落的组件",
+ "shortDescription": "将时钟时间截断为指定的精度",
+ "timePadding": "时间填充",
+ "title": "截断时钟时间",
+ "toolInfo": {
+ "title": "什么是 {{title}}?"
+ },
+ "truncateMinutesAndSeconds": "截断分钟和秒",
+ "truncateMinutesAndSecondsDescription": "删除每个时钟时间中的分钟和秒部分。",
+ "truncateOnlySeconds": "仅截断秒数",
+ "truncateOnlySecondsDescription": "从每个时钟时间中删除秒数部分。",
+ "truncationSide": "截断侧",
+ "useZeroPadding": "使用零填充",
+ "zeroPaddingDescription": "使所有时间部分始终为两位数宽度。",
+ "zeroPrintDescription": "将删除的部分显示为零值“00”。",
+ "zeroPrintTruncatedParts": "零打印截断部件"
+ }
+}
diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json
new file mode 100644
index 0000000..e240e2d
--- /dev/null
+++ b/public/locales/zh/translation.json
@@ -0,0 +1,250 @@
+{
+ "audio": {
+ "changeSpeed": {
+ "description": "更改音频文件的播放速度。在保持音调不变的情况下加快或减慢音频速度。",
+ "name": "更改音频速度",
+ "shortDescription": "更改音频文件的速度"
+ },
+ "extractAudio": {
+ "description": "从视频文件中提取音轨并将其保存为您选择的格式(AAC、MP3、WAV)的单独音频文件。",
+ "name": "提取音频",
+ "shortDescription": "将视频文件(MP4、MOV 等)中的音频提取为 AAC、MP3 或 WAV。"
+ }
+ },
+ "baseFileInput": {
+ "copyFailed": "复制失败: {{error}}",
+ "dropFileHere": "放下你的 {{type}} 这里",
+ "fileCopied": "文件已复制",
+ "selectFileDescription": "单击此处选择一个 {{type}} 在您的设备上,按 Ctrl+V 使用 {{type}} 从剪贴板中,或从桌面拖放文件"
+ },
+ "categories": {
+ "audio": {
+ "description": "处理音频的工具——从视频中提取音频、调整音频速度、合并多个音频文件等等。",
+ "title": "音频工具"
+ },
+ "csv": {
+ "description": "处理 CSV 文件的工具 - 将 CSV 转换为不同的格式、操作 CSV 数据、验证 CSV 结构以及有效地处理 CSV 文件。",
+ "title": "CSV 工具"
+ },
+ "gif": {
+ "description": "处理 GIF 动画的工具 - 创建透明 GIF、提取 GIF 帧、向 GIF 添加文本、裁剪、旋转、反转 GIF 等等。",
+ "title": "GIF工具"
+ },
+ "image-generic": {
+ "description": "处理图片的工具——压缩、调整大小、裁剪、转换为 JPG、旋转、删除背景等等。",
+ "title": "图像工具"
+ },
+ "json": {
+ "description": "处理 JSON 数据结构的工具——美化和缩小 JSON 对象、展平 JSON 数组、字符串化 JSON 值、分析数据等等",
+ "title": "JSON 工具"
+ },
+ "list": {
+ "description": "处理列表的工具——排序、反转、随机化列表、查找唯一和重复的列表项、更改列表项分隔符等等。",
+ "title": "列表工具"
+ },
+ "number": {
+ "description": "处理数字的工具——生成数字序列、将数字转换为文字、将文字转换为数字、排序、舍入、因式分解等等。",
+ "title": "数字工具"
+ },
+ "pdf": {
+ "description": "处理 PDF 文件的工具 - 从 PDF 中提取文本、将 PDF 转换为其他格式、操作 PDF 等等。",
+ "title": "PDF工具"
+ },
+ "png": {
+ "description": "处理 PNG 图像的工具 - 将 PNG 转换为 JPG、创建透明 PNG、更改 PNG 颜色、裁剪、旋转、调整 PNG 大小等等。",
+ "title": "PNG工具"
+ },
+ "seeAll": "查看全部 {{title}}",
+ "string": {
+ "description": "处理文本的工具——将文本转换为图像、查找和替换文本、将文本拆分成片段、连接文本行、重复文本等等。",
+ "title": "文本工具"
+ },
+ "time": {
+ "description": "处理时间和日期的工具——计算时差、在时区之间转换、格式化日期、生成日期序列等等。",
+ "title": "时间工具"
+ },
+ "try": "尝试 {{title}}",
+ "video": {
+ "description": "处理视频的工具——从视频中提取帧、从视频创建 GIF、将视频转换为不同的格式等等。",
+ "title": "视频工具"
+ },
+ "xml": {
+ "description": "处理 XML 数据结构的工具 - 查看器、美化器、验证器等等",
+ "title": "XML 工具"
+ }
+ },
+ "csv": {
+ "findIncompleteCsvRecords": {
+ "description": "只需将您的 CSV 文件上传到下方表单,此工具就会自动检查所有行或列是否均缺失值。在工具选项中,您可以调整输入文件格式(指定分隔符、引号和注释符)。此外,您还可以启用空值检查、跳过空行,以及设置输出中错误消息的数量限制。",
+ "name": "查找不完整的 CSV 记录",
+ "shortDescription": "快速查找 CSV 中缺少值的行和列。"
+ }
+ },
+ "hero": {
+ "brand": "OmniTools",
+ "description": "使用 OmniTools 提升您的工作效率,这是一款快速完成任务的终极工具包!数千个用户友好的实用程序,可直接通过浏览器编辑图像、文本、列表和数据。",
+ "examples": {
+ "calculateNumberSum": "计算数字和",
+ "changeGifSpeed": "更改 GIF 速度",
+ "compressPng": "压缩 PNG",
+ "createTransparentImage": "创建透明图像",
+ "prettifyJson": "美化 JSON",
+ "sortList": "对列表进行排序",
+ "splitPdf": "拆分 PDF",
+ "splitText": "拆分文本",
+ "trimVideo": "修剪视频"
+ },
+ "searchPlaceholder": "搜索所有工具",
+ "title": "快速完成工作"
+ },
+ "inputFooter": {
+ "clear": "清除",
+ "copyToClipboard": "复制到剪贴板",
+ "importFromFile": "从文件导入"
+ },
+ "list": {
+ "group": {
+ "description": "世界上最简单的基于浏览器的列表项分组工具。输入您的列表并指定分组条件,即可将项目按逻辑分组。非常适合分类数据、组织信息或创建结构化列表。支持自定义分隔符和各种分组选项。",
+ "name": "团体",
+ "shortDescription": "按共同属性对列表项进行分组"
+ },
+ "reverse": {
+ "description": "这是一个基于浏览器的超级简单的应用程序,可以反向打印所有列表项。输入项可以用任意符号分隔,并且您还可以更改反向列表项的分隔符。",
+ "name": "撤销",
+ "shortDescription": "快速反转列表"
+ },
+ "sort": {
+ "description": "这是一款基于浏览器的超级简单应用程序,可以对列表中的项目进行排序,并按升序或降序排列。您可以按字母顺序、数字或长度对项目进行排序。您还可以删除重复和空白的项目,以及修剪周围有空格的单个项目。您可以使用任何分隔符分隔输入列表项,也可以使用正则表达式分隔它们。此外,您还可以为排序后的输出列表创建新的分隔符。",
+ "name": "种类",
+ "shortDescription": "快速对列表进行排序"
+ }
+ },
+ "navbar": {
+ "buyMeACoffee": "请我喝杯咖啡",
+ "home": "家",
+ "tools": "工具"
+ },
+ "number": {
+ "generate": {
+ "description": "在浏览器中快速计算整数列表。要获取列表,只需指定第一个整数,并在下方选项中更改值和总数,此实用程序就会生成相应数量的整数。",
+ "name": "生成数字",
+ "shortDescription": "在浏览器中快速计算整数列表"
+ },
+ "sum": {
+ "description": "这是一款基于浏览器的超级简单的求和应用程序。输入的数字可以用任意符号分隔,并且您还可以更改求和结果的分隔符。",
+ "name": "总和数",
+ "shortDescription": "快速对数字列表求和"
+ }
+ },
+ "numericInputWithUnit": {
+ "unit": "单元"
+ },
+ "pdf": {
+ "compressPdf": {
+ "description": "使用 Ghostscript 减小 PDF 文件大小同时保持质量",
+ "name": "压缩PDF",
+ "shortDescription": "在浏览器中安全地压缩 PDF 文件"
+ },
+ "mergePdf": {
+ "description": "合并多个 PDF 文件为一个文档。",
+ "name": "合并 PDF",
+ "shortDescription": "将多个 PDF 文件合并为一个文档"
+ },
+ "pdfToEpub": {
+ "description": "将 PDF 文档转换为 EPUB 文件,以实现更好的电子阅读器兼容性。",
+ "name": "PDF 转 EPUB",
+ "shortDescription": "将 PDF 文件转换为 EPUB 格式"
+ },
+ "protectPdf": {
+ "description": "在浏览器中安全地为 PDF 文件添加密码保护",
+ "name": "保护 PDF",
+ "shortDescription": "使用密码安全地保护 PDF 文件"
+ },
+ "splitPdf": {
+ "description": "使用页码或范围(例如 1,5-8)从 PDF 文件中提取特定页面",
+ "name": "拆分 PDF",
+ "shortDescription": "从 PDF 文件中提取特定页面"
+ }
+ },
+ "resultFooter": {
+ "copy": "复制到剪贴板",
+ "download": "下载"
+ },
+ "string": {
+ "createPalindrome": {
+ "description": "世界上最简单的基于浏览器的回文创建工具,可从任何文本创建回文。输入文本即可立即将其转换为正反读相同的回文。非常适合文字游戏、创建对称文本模式或探索语言学知识。",
+ "name": "创建回文",
+ "shortDescription": "创建正读和倒读相同的文本"
+ },
+ "palindrome": {
+ "description": "世界上最简单的基于浏览器的回文检测工具。即时验证文本正读和反读是否一致。非常适合字谜游戏、语言分析或验证对称文本模式。支持各种分隔符和多词回文检测。",
+ "name": "回文",
+ "shortDescription": "检查文本正读和反读是否相同"
+ },
+ "repeat": {
+ "description": "此工具允许您使用可选分隔符多次重复给定的文本。",
+ "name": "重复文本",
+ "shortDescription": "重复文本多次"
+ },
+ "reverse": {
+ "description": "世界上最简单的基于浏览器的文本反转工具。输入任意文本即可立即逐字符反转。非常适合创建镜像文本、分析回文或玩转文本模式。反转时保留空格和特殊字符。",
+ "name": "撤销",
+ "shortDescription": "逐个字符地反转任何文本"
+ },
+ "toMorse": {
+ "description": "世界上最简单的基于浏览器的文本转摩尔斯电码工具。只需在左侧输入框中输入文本,即可立即在输出区域获得摩尔斯电码。功能强大、免费且快速。输入文本,即可获得摩尔斯电码。",
+ "name": "字符串到莫尔斯",
+ "shortDescription": "快速将文本编码为摩尔斯电码"
+ },
+ "uppercase": {
+ "description": "世界上最简单的基于浏览器的大写文本转换工具。只需输入文本,即可自动转换为全部大写字母。非常适合创建标题、强调文本或标准化文本格式。支持各种文本格式并保留特殊字符。",
+ "name": "大写",
+ "shortDescription": "将文本转换为大写字母"
+ }
+ },
+ "toolExamples": {
+ "subtitle": "点击尝试!",
+ "title": "{{title}} 示例"
+ },
+ "toolFileResult": {
+ "copied": "文件已复制",
+ "copyFailed": "复制失败: {{error}}",
+ "loading": "正在加载...这可能需要一点时间。",
+ "result": "结果"
+ },
+ "toolHeader": {
+ "seeExamples": "查看示例"
+ },
+ "toolLayout": {
+ "allToolsTitle": "全部 {{type}}"
+ },
+ "toolMultiFileResult": {
+ "copied": "文件已复制",
+ "copyFailed": "复制失败: {{error}}",
+ "loading": "正在加载...这可能需要一点时间。",
+ "result": "结果"
+ },
+ "toolMultipleAudioInput": {
+ "inputTitle": "输入 {{type}}",
+ "noFilesSelected": "未选择任何文件"
+ },
+ "toolMultiplePdfInput": {
+ "inputTitle": "输入 {{type}}",
+ "noFilesSelected": "未选择任何文件"
+ },
+ "toolOptions": {
+ "title": "工具选项"
+ },
+ "toolTextInput": {
+ "copied": "文本已复制",
+ "copyFailed": "复制失败: {{error}}",
+ "input": "输入文本",
+ "placeholder": "在此处输入您的文本..."
+ },
+ "toolTextResult": {
+ "copied": "文本已复制",
+ "copyFailed": "复制失败: {{error}}",
+ "loading": "正在加载...这可能需要一点时间。",
+ "result": "结果"
+ }
+}
diff --git a/public/locales/zh/video.json b/public/locales/zh/video.json
new file mode 100644
index 0000000..c37ea1a
--- /dev/null
+++ b/public/locales/zh/video.json
@@ -0,0 +1,113 @@
+{
+ "changeSpeed": {
+ "defaultMultiplier": "默认乘数:2 表示速度快 2 倍",
+ "description": "更改视频文件的播放速度。在保持音频同步的同时,加快或减慢视频速度。支持各种倍速器和常见视频格式。",
+ "inputTitle": "输入视频",
+ "newVideoSpeed": "新视频速度",
+ "resultTitle": "编辑视频",
+ "settingSpeed": "设定速度",
+ "shortDescription": "更改视频播放速度",
+ "title": "更改视频速度",
+ "toolInfo": {
+ "title": "什么是 {{title}}?"
+ }
+ },
+ "compress": {
+ "default": "默认",
+ "description": "通过将视频缩放到不同的分辨率(例如 240p、480p、720p 等)来压缩视频。此工具有助于在保持可接受质量的同时减小文件大小。支持 MP4、WebM 和 OGG 等常见视频格式。",
+ "inputTitle": "输入视频",
+ "loadingText": "正在压缩视频...",
+ "lossless": "无损",
+ "quality": "质量(CRF)",
+ "resolution": "解决",
+ "resultTitle": "压缩视频",
+ "shortDescription": "通过缩放到不同的分辨率来压缩视频",
+ "title": "压缩视频",
+ "worst": "最差"
+ },
+ "cropVideo": {
+ "cropCoordinates": "作物坐标",
+ "croppingVideo": "裁剪视频",
+ "description": "裁剪视频以删除不需要的区域。",
+ "errorBeyondHeight": "裁剪区域超出视频高度({{height}}像素)",
+ "errorBeyondWidth": "裁剪区域超出视频宽度({{width}}像素)",
+ "errorCroppingVideo": "裁剪视频时出错。请检查参数和视频文件。",
+ "errorLoadingDimensions": "无法加载视频尺寸",
+ "errorNonNegativeCoordinates": "X 和 Y 坐标必须为非负数",
+ "errorPositiveDimensions": "宽度和高度必须为正数",
+ "height": "高度",
+ "inputTitle": "输入视频",
+ "loadVideoForDimensions": "加载视频以查看尺寸",
+ "resultTitle": "裁剪视频",
+ "shortDescription": "裁剪视频以删除不需要的区域",
+ "title": "裁剪视频",
+ "toolInfo": {
+ "description": "此工具允许您裁剪视频文件以删除不需要的区域。您可以通过设置 X、Y 坐标以及宽度和高度尺寸来指定裁剪区域。",
+ "title": "裁剪视频"
+ },
+ "videoDimensions": "视频尺寸: {{width}} × {{height}} 像素",
+ "videoInformation": "视频信息",
+ "width": "宽度",
+ "xCoordinate": "X(左)",
+ "yCoordinate": "Y(顶部)"
+ },
+ "flip": {
+ "description": "水平或垂直翻转视频文件。镜像视频以获得特殊效果或纠正方向问题。",
+ "flippingVideo": "翻转视频",
+ "horizontalLabel": "水平(镜像)",
+ "inputTitle": "输入视频",
+ "orientation": "方向",
+ "resultTitle": "翻转视频",
+ "shortDescription": "水平或垂直翻转视频",
+ "title": "翻转视频",
+ "verticalLabel": "垂直(倒置)"
+ },
+ "gif": {
+ "changeSpeed": {
+ "description": "更改 GIF 动画的播放速度。在保持动画流畅的情况下,加快或减慢 GIF 的速度。",
+ "shortDescription": "更改 GIF 动画速度",
+ "title": "更改 GIF 速度"
+ }
+ },
+ "loop": {
+ "description": "通过多次重复播放原始视频来创建循环视频。",
+ "inputTitle": "输入视频",
+ "loopingVideo": "循环视频",
+ "loops": "循环",
+ "numberOfLoops": "循环次数",
+ "resultTitle": "循环视频",
+ "shortDescription": "创建循环视频文件",
+ "title": "循环视频",
+ "toolInfo": {
+ "description": "此工具可让您通过多次重复播放原始视频来创建循环视频。您可以指定视频循环播放的次数。",
+ "title": "什么是 {{title}}?"
+ }
+ },
+ "rotate": {
+ "180Degrees": "180°(上下颠倒)",
+ "270Degrees": "270°(逆时针90°)",
+ "90Degrees": "顺时针 90°",
+ "description": "将视频文件旋转 90 度、180 度或 270 度。通过精确的旋转控制来校正视频方向或创建特殊效果。",
+ "inputTitle": "输入视频",
+ "resultTitle": "旋转视频",
+ "rotatingVideo": "旋转视频",
+ "rotation": "旋转",
+ "shortDescription": "按指定角度旋转视频",
+ "title": "旋转视频"
+ },
+ "trim": {
+ "description": "通过指定开始和结束时间来修剪视频文件。从视频的开头或结尾删除不需要的部分。",
+ "endTime": "结束时间",
+ "inputTitle": "输入视频",
+ "resultTitle": "修剪的视频",
+ "shortDescription": "通过删除不需要的部分来修剪视频",
+ "startTime": "开始时间",
+ "timestamps": "时间戳",
+ "title": "修剪视频"
+ },
+ "videoToGif": {
+ "description": "将视频文件转换为 GIF 动画格式。提取特定时间范围并创建可共享的动画图像。",
+ "shortDescription": "将视频转换为动画 GIF",
+ "title": "视频转GIF"
+ }
+}
diff --git a/public/locales/zh/xml.json b/public/locales/zh/xml.json
new file mode 100644
index 0000000..e9cdbc8
--- /dev/null
+++ b/public/locales/zh/xml.json
@@ -0,0 +1,38 @@
+{
+ "xmlBeautifier": {
+ "description": "使用适当的缩进和间距来格式化 XML。",
+ "indentation": "缩进",
+ "inputTitle": "输入 XML",
+ "resultTitle": "美化 XML",
+ "shortDescription": "格式化和美化 XML 代码",
+ "title": "XML美化器",
+ "toolInfo": {
+ "description": "此工具允许您使用适当的缩进和间距来格式化 XML 数据,使其更易读且更易于使用。",
+ "title": "XML美化器"
+ },
+ "useSpaces": "使用空格",
+ "useSpacesDescription": "使用空格缩进输出",
+ "useTabs": "使用标签",
+ "useTabsDescription": "使用制表符缩进输出。"
+ },
+ "xmlValidator": {
+ "description": "验证 XML 语法和结构。",
+ "placeholder": "在此处粘贴或导入 XML...",
+ "shortDescription": "验证 XML 代码是否存在错误",
+ "title": "XML验证器",
+ "toolInfo": {
+ "description": "此工具可用于验证 XML 的语法和结构。它会检查 XML 格式是否正确,并针对发现的任何问题提供详细的错误消息。",
+ "title": "XML验证器"
+ }
+ },
+ "xmlViewer": {
+ "description": "以树状格式查看和探索 XML 结构。",
+ "inputTitle": "输入 XML",
+ "resultTitle": "XML 树视图",
+ "title": "XML 查看器",
+ "toolInfo": {
+ "description": "该工具允许您以分层树格式查看 XML 数据,从而更容易探索和理解 XML 文档的结构。",
+ "title": "XML 查看器"
+ }
+ }
+}
diff --git a/scripts/add-i18n-to-meta.js b/scripts/add-i18n-to-meta.js
new file mode 100644
index 0000000..b5fac00
--- /dev/null
+++ b/scripts/add-i18n-to-meta.js
@@ -0,0 +1,260 @@
+const fs = require('fs');
+const path = require('path');
+
+const TYPE_MAPPING = { 'image-generic': 'image', png: 'image' };
+// Helper function to convert kebab-case to camelCase
+function toCamelCase(str) {
+ return str.replace(/-([a-z])/g, (match, letter) => letter.toUpperCase());
+}
+
+// Helper function to parse meta.ts file and extract required fields
+function parseMeta(filePath) {
+ const content = fs.readFileSync(filePath, 'utf8');
+
+ // Extract category from defineTool first parameter
+ const categoryMatch = content.match(/defineTool\s*\(\s*['"]([^'"]+)['"]/);
+ if (!categoryMatch) {
+ throw new Error(`Could not find category in ${filePath}`);
+ }
+ const category = categoryMatch[1];
+
+ // Extract name, description, shortDescription, and longDescription
+ const nameMatch = content.match(/name\s*:\s*['"`]([^'"`]+)['"`]/);
+ const descMatch = content.match(/description\s*:\s*['"`]([\s\S]*?)['"`]/);
+ const shortMatch = content.match(
+ /shortDescription\s*:\s*['"`]([^'"`]+)['"`]/
+ );
+ const longMatch = content.match(/longDescription\s*:\s*['"`]([\s\S]*?)['"`]/);
+
+ if (!nameMatch || !descMatch || !shortMatch) {
+ console.warn(`⚠️ Missing required fields in ${filePath}`);
+ console.warn(
+ ` name: ${!!nameMatch}, description: ${!!descMatch}, shortDescription: ${!!shortMatch}`
+ );
+ return null;
+ }
+
+ return {
+ category,
+ name: nameMatch[1],
+ description: descMatch[1].replace(/\s+/g, ' ').trim(),
+ shortDescription: shortMatch[1],
+ longDescription: longMatch ? longMatch[1].replace(/\s+/g, ' ').trim() : null
+ };
+}
+
+// Helper function to check if meta.ts already has i18n field
+function hasI18nField(filePath) {
+ const content = fs.readFileSync(filePath, 'utf8');
+ return content.includes('i18n:');
+}
+
+// Helper function to add i18n field to meta.ts
+function addI18nToMeta(filePath, category, toolName, hasLongDescription) {
+ const content = fs.readFileSync(filePath, 'utf8');
+
+ // Build i18n object
+ let i18nObject = ` i18n: {
+ name: '${category}:${toolName}.title',
+ description: '${category}:${toolName}.description',
+ shortDescription: '${category}:${toolName}.shortDescription'`;
+
+ if (hasLongDescription) {
+ i18nObject += `,
+ longDescription: '${category}:${toolName}.longDescription'`;
+ }
+
+ i18nObject += `
+ },`;
+
+ // Find the position to insert i18n (after the export line but before the closing bracket)
+ const exportMatch = content.match(/export const tool = defineTool\([^{]*\{/);
+ if (!exportMatch) {
+ throw new Error(`Could not find export structure in ${filePath}`);
+ }
+
+ const insertPosition = exportMatch.index + exportMatch[0].length;
+ const beforeInsert = content.substring(0, insertPosition);
+ const afterInsert = content.substring(insertPosition);
+
+ // Insert i18n field at the beginning of the object
+ const updatedContent = beforeInsert + '\n' + i18nObject + afterInsert;
+
+ fs.writeFileSync(filePath, updatedContent, 'utf8');
+}
+
+// Helper function to get category i18n file path
+function getCategoryI18nPath(category) {
+ const PROJECT_ROOT = path.resolve(__dirname, '..');
+ // Special case: image-generic tools use the image folder for i18n
+ const folderName = TYPE_MAPPING[category] || category;
+ return path.join(
+ PROJECT_ROOT,
+ 'src',
+ 'pages',
+ 'tools',
+ folderName,
+ 'i18n',
+ 'en.json'
+ );
+}
+
+// Helper function to load category i18n data
+function loadCategoryI18n(category) {
+ const i18nPath = getCategoryI18nPath(category);
+
+ try {
+ if (fs.existsSync(i18nPath)) {
+ const i18nRaw = fs.readFileSync(i18nPath, 'utf8');
+ return JSON.parse(i18nRaw);
+ } else {
+ const i18nDir = path.dirname(i18nPath);
+ if (!fs.existsSync(i18nDir)) {
+ fs.mkdirSync(i18nDir, { recursive: true });
+ }
+ return {};
+ }
+ } catch (err) {
+ console.error(`❌ Failed to parse ${i18nPath}:`, err.message);
+ return {};
+ }
+}
+
+// Helper function to save category i18n data
+function saveCategoryI18n(category, data) {
+ const i18nPath = getCategoryI18nPath(category);
+ fs.writeFileSync(i18nPath, JSON.stringify(data, null, 2) + '\n', 'utf8');
+ return i18nPath;
+}
+
+// Main execution
+console.log('🚀 Adding i18n fields to meta.ts files...\n');
+
+const PROJECT_ROOT = path.resolve(__dirname, '..');
+
+// Target files as specified
+const rootDir = path.join(PROJECT_ROOT, 'src/pages/tools');
+const metaFiles = [];
+
+function findMetaFiles(dir) {
+ const items = fs.readdirSync(dir, { withFileTypes: true });
+
+ for (const item of items) {
+ const fullPath = path.join(dir, item.name);
+
+ if (item.isDirectory()) {
+ findMetaFiles(fullPath); // Recurse
+ } else if (item.isFile() && item.name === 'meta.ts') {
+ metaFiles.push(fullPath);
+ }
+ }
+}
+
+findMetaFiles(rootDir);
+
+let processedCount = 0;
+let skippedCount = 0;
+let errorCount = 0;
+const updatedCategories = new Set();
+const categoryData = {};
+
+// Process each target file
+metaFiles.forEach((filePath) => {
+ try {
+ // Check if file exists
+ if (!fs.existsSync(filePath)) {
+ console.error(`❌ File not found: ${filePath}`);
+ errorCount++;
+ return;
+ }
+
+ // Check if i18n field already exists
+ if (hasI18nField(filePath)) {
+ console.log(`⏭️ Skipped ${filePath} (already has i18n field)`);
+ skippedCount++;
+ return;
+ }
+
+ // Parse meta.ts file
+ const parsed = parseMeta(filePath);
+ if (!parsed) {
+ errorCount++;
+ return;
+ }
+
+ const {
+ category: rawCategory,
+ name,
+ description,
+ shortDescription,
+ longDescription
+ } = parsed;
+
+ const category = TYPE_MAPPING[rawCategory] || rawCategory;
+ // Get tool name from folder path
+ const toolFolderName = path.basename(path.dirname(filePath));
+ const toolKey = toCamelCase(toolFolderName); // camelCase for i18n file keys
+
+ // Load category i18n data if not already loaded
+ if (!categoryData[category]) {
+ categoryData[category] = loadCategoryI18n(category);
+ }
+
+ // Ensure tool entry exists in i18n
+ if (!categoryData[category][toolKey]) {
+ categoryData[category][toolKey] = {};
+ }
+
+ const entry = categoryData[category][toolKey];
+ let hasI18nChanges = false;
+
+ // Add missing fields to i18n
+ if (!entry.title) {
+ entry.title = name;
+ hasI18nChanges = true;
+ }
+ if (!entry.description) {
+ entry.description = description;
+ hasI18nChanges = true;
+ }
+ if (!entry.shortDescription) {
+ entry.shortDescription = shortDescription;
+ hasI18nChanges = true;
+ }
+ if (longDescription && !entry.longDescription) {
+ entry.longDescription = longDescription;
+ hasI18nChanges = true;
+ }
+
+ // Add i18n field to meta.ts
+ addI18nToMeta(filePath, category, toolKey, !!longDescription);
+
+ if (hasI18nChanges) {
+ updatedCategories.add(category);
+ }
+
+ console.log(`✅ Added i18n to ${filePath}`);
+ processedCount++;
+ } catch (err) {
+ console.error(`❌ Error processing ${filePath}:`, err.message);
+ errorCount++;
+ }
+});
+
+// Save updated category i18n files
+if (updatedCategories.size > 0) {
+ console.log('\n💾 Saving updated i18n files...');
+ for (const category of updatedCategories) {
+ const savedPath = saveCategoryI18n(category, categoryData[category]);
+ console.log(` 📁 ${path.relative(PROJECT_ROOT, savedPath)}`);
+ }
+}
+
+// Summary
+console.log('\n📊 Summary:');
+console.log(` ✅ Processed: ${processedCount} files`);
+console.log(` ⏭️ Skipped: ${skippedCount} files (already had i18n)`);
+console.log(` ❌ Errors: ${errorCount} files`);
+console.log(
+ `\n🎉 Successfully updated ${processedCount} meta.ts files and ${updatedCategories.size} i18n files!`
+);
diff --git a/scripts/cleanup-empty-directories.js b/scripts/cleanup-empty-directories.js
new file mode 100644
index 0000000..e907d5a
--- /dev/null
+++ b/scripts/cleanup-empty-directories.js
@@ -0,0 +1,94 @@
+const fs = require('fs');
+const path = require('path');
+
+/**
+ * Recursively delete all empty folders in a directory
+ * @param {string} dirPath - The directory path to process
+ * @param {boolean} deleteRoot - Whether to delete the root directory if it becomes empty
+ * @returns {boolean} - Returns true if the directory is empty after processing
+ */
+function deleteEmptyFolders(dirPath, deleteRoot = false) {
+ if (!fs.existsSync(dirPath)) {
+ console.log(`Directory does not exist: ${dirPath}`);
+ return false;
+ }
+
+ if (!fs.statSync(dirPath).isDirectory()) {
+ console.log(`Path is not a directory: ${dirPath}`);
+ return false;
+ }
+
+ let files;
+ try {
+ files = fs.readdirSync(dirPath);
+ } catch (err) {
+ console.error(`Error reading directory ${dirPath}:`, err.message);
+ return false;
+ }
+
+ // Process each item in the directory
+ for (const file of files) {
+ const fullPath = path.join(dirPath, file);
+
+ try {
+ const stat = fs.statSync(fullPath);
+
+ if (stat.isDirectory()) {
+ // Recursively process subdirectories
+ const isEmpty = deleteEmptyFolders(fullPath, true);
+
+ // If subdirectory is empty, remove it from the files array
+ if (isEmpty) {
+ const index = files.indexOf(file);
+ if (index > -1) {
+ files.splice(index, 1);
+ }
+ }
+ }
+ } catch (err) {
+ console.error(`Error processing ${fullPath}:`, err.message);
+ }
+ }
+
+ // Check if directory is empty after processing
+ const isEmpty = files.length === 0;
+
+ if (isEmpty && deleteRoot) {
+ try {
+ fs.rmdirSync(dirPath);
+ console.log(`Deleted empty directory: ${dirPath}`);
+ return true;
+ } catch (err) {
+ console.error(`Error deleting directory ${dirPath}:`, err.message);
+ return false;
+ }
+ }
+
+ return isEmpty;
+}
+
+/**
+ * Main function to start the cleanup process
+ * @param {string} targetPath - The root directory to clean up
+ */
+function cleanupEmptyFolders(targetPath) {
+ console.log(`Starting cleanup of empty folders in: ${targetPath}`);
+
+ const absolutePath = path.resolve(targetPath);
+ const result = deleteEmptyFolders(absolutePath, false);
+
+ if (result) {
+ console.log(
+ 'Cleanup completed. Root directory is empty but was not deleted.'
+ );
+ } else {
+ console.log('Cleanup completed.');
+ }
+}
+
+// Usage example
+const targetDirectory = process.argv[2] || './target-folder';
+cleanupEmptyFolders(targetDirectory);
+
+// Export for use as a module
+module.exports = { deleteEmptyFolders, cleanupEmptyFolders };
diff --git a/scripts/create-tool.mjs b/scripts/create-tool.mjs
index 3032f95..1d68f1c 100644
--- a/scripts/create-tool.mjs
+++ b/scripts/create-tool.mjs
@@ -138,6 +138,40 @@ export default function ${capitalizeFirstLetter(toolNameCamelCase)}({
}
`
);
+const validNamespaces = [
+ 'string',
+ 'number',
+ 'video',
+ 'list',
+ 'json',
+ 'time',
+ 'csv',
+ 'pdf',
+ 'audio',
+ 'xml',
+ 'translation',
+ 'image'
+];
+const isValidI18nNamespace = (value) => {
+ return validNamespaces.includes(value);
+};
+
+const getI18nNamespaceFromToolCategory = (category) => {
+ // Map image-related categories to 'image'
+ if (['png', 'image-generic'].includes(category)) {
+ return 'image';
+ } else if (['gif'].includes(category)) {
+ return 'video';
+ }
+ // Use type guard to check if category is a valid I18nNamespaces
+ if (isValidI18nNamespace(category)) {
+ return category;
+ }
+
+ return 'translation';
+};
+
+const i18nNamespace = getI18nNamespaceFromToolCategory(type);
createToolFile(
`meta.ts`,
`
@@ -145,13 +179,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('${type}', {
- name: '${toolNameTitleCase}',
+ i18n: {
+ name: '${i18nNamespace}:${toolNameCamelCase}.title',
+ description: '${i18nNamespace}:${toolNameCamelCase}.description',
+ shortDescription: '${i18nNamespace}:${toolNameCamelCase}.shortDescription',
+ longDescription: '${i18nNamespace}:${toolNameCamelCase}.longDescription'
+ },
path: '${toolName}',
icon: '',
- description: '',
- shortDescription: '',
keywords: ['${toolName.split('-').join("', '")}'],
- longDescription: '',
component: lazy(() => import('./index'))
});
`
@@ -222,4 +258,30 @@ indexContent.splice(
)} } from './${toolName}/meta';`
);
writeFile(toolsIndex, indexContent.join('\n'));
+
+// Update locale JSON file
+const localeFilePath = join(
+ currentDirname,
+ '..',
+ 'public',
+ 'locales',
+ 'en',
+ `${i18nNamespace}.json`
+);
+
+let localeData = {};
+if (fs.existsSync(localeFilePath)) {
+ const localeContent = await readFile(localeFilePath, { encoding: 'utf-8' });
+ localeData = JSON.parse(localeContent);
+}
+
+localeData[toolNameCamelCase] = {
+ title: toolNameTitleCase,
+ description: '',
+ shortDescription: '',
+ longDescription: ''
+};
+
+// Write updated locale file
+await writeFile(localeFilePath, JSON.stringify(localeData, null, 2));
console.log(`Added import in: ${toolsIndex}`);
diff --git a/scripts/locize-upload.js b/scripts/locize-upload.js
new file mode 100644
index 0000000..6099a3d
--- /dev/null
+++ b/scripts/locize-upload.js
@@ -0,0 +1,213 @@
+// one-time-upload.js
+// Simple script to upload your existing translations to Locize once
+
+const fs = require('fs');
+const https = require('https');
+
+// Configuration
+const LOCIZE_PROJECT_ID = 'e7156a3e-66fb-4035-a0f0-cebf1c63a3ba';
+const LOCIZE_API_KEY = process.env.LOCIZE_API_KEY; // Replace with your actual API key
+const LOCIZE_VERSION = 'latest';
+
+// Define your translation files
+const translationFiles = [
+ // English translations
+ { lang: 'en', namespace: 'translation', file: '../src/i18n/en.json' },
+ {
+ lang: 'en',
+ namespace: 'list',
+ file: '../src/pages/tools/list/i18n/en.json'
+ },
+ {
+ lang: 'en',
+ namespace: 'string',
+ file: '../src/pages/tools/string/i18n/en.json'
+ },
+ { lang: 'en', namespace: 'csv', file: '../src/pages/tools/csv/i18n/en.json' },
+ {
+ lang: 'en',
+ namespace: 'json',
+ file: '../src/pages/tools/json/i18n/en.json'
+ },
+ { lang: 'en', namespace: 'pdf', file: '../src/pages/tools/pdf/i18n/en.json' },
+ {
+ lang: 'en',
+ namespace: 'image',
+ file: '../src/pages/tools/image/i18n/en.json'
+ },
+ {
+ lang: 'en',
+ namespace: 'audio',
+ file: '../src/pages/tools/audio/i18n/en.json'
+ },
+ {
+ lang: 'en',
+ namespace: 'video',
+ file: '../src/pages/tools/video/i18n/en.json'
+ },
+ {
+ lang: 'en',
+ namespace: 'number',
+ file: '../src/pages/tools/number/i18n/en.json'
+ },
+ {
+ lang: 'en',
+ namespace: 'time',
+ file: '../src/pages/tools/time/i18n/en.json'
+ },
+ { lang: 'en', namespace: 'xml', file: '../src/pages/tools/xml/i18n/en.json' },
+
+ // Hindi translations
+ { lang: 'hi', namespace: 'translation', file: '../src/i18n/hi.json' },
+ {
+ lang: 'hi',
+ namespace: 'list',
+ file: '../src/pages/tools/list/i18n/hi.json'
+ },
+ {
+ lang: 'hi',
+ namespace: 'string',
+ file: '../src/pages/tools/string/i18n/hi.json'
+ },
+ { lang: 'hi', namespace: 'csv', file: '../src/pages/tools/csv/i18n/hi.json' },
+ {
+ lang: 'hi',
+ namespace: 'json',
+ file: '../src/pages/tools/json/i18n/hi.json'
+ },
+ { lang: 'hi', namespace: 'pdf', file: '../src/pages/tools/pdf/i18n/hi.json' },
+ {
+ lang: 'hi',
+ namespace: 'image',
+ file: '../src/pages/tools/image/i18n/hi.json'
+ },
+ {
+ lang: 'hi',
+ namespace: 'audio',
+ file: '../src/pages/tools/audio/i18n/hi.json'
+ },
+ {
+ lang: 'hi',
+ namespace: 'video',
+ file: '../src/pages/tools/video/i18n/hi.json'
+ },
+ {
+ lang: 'hi',
+ namespace: 'number',
+ file: '../src/pages/tools/number/i18n/hi.json'
+ },
+ {
+ lang: 'hi',
+ namespace: 'time',
+ file: '../src/pages/tools/time/i18n/hi.json'
+ },
+ { lang: 'hi', namespace: 'xml', file: '../src/pages/tools/xml/i18n/hi.json' }
+];
+
+function flattenJson(obj, prefix = '') {
+ const flattened = {};
+
+ for (const key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ const newKey = prefix ? `${prefix}.${key}` : key;
+
+ if (
+ typeof obj[key] === 'object' &&
+ obj[key] !== null &&
+ !Array.isArray(obj[key])
+ ) {
+ // Recursively flatten nested objects
+ Object.assign(flattened, flattenJson(obj[key], newKey));
+ } else {
+ // It's a primitive value or array
+ flattened[newKey] = obj[key];
+ }
+ }
+ }
+
+ return flattened;
+}
+
+function uploadToLocize(lang, namespace, data) {
+ return new Promise((resolve, reject) => {
+ // Flatten the JSON structure for Locize API
+ const flattenedData = flattenJson(data);
+ const postData = JSON.stringify(flattenedData);
+
+ const options = {
+ hostname: 'api.locize.app',
+ port: 443,
+ path: `/update/${LOCIZE_PROJECT_ID}/${LOCIZE_VERSION}/${lang}/${namespace}`,
+ method: 'POST',
+ headers: {
+ Authorization: `Bearer ${LOCIZE_API_KEY}`,
+ 'Content-Type': 'application/json',
+ 'Content-Length': Buffer.byteLength(postData)
+ }
+ };
+
+ const req = https.request(options, (res) => {
+ let data = '';
+ res.on('data', (chunk) => (data += chunk));
+ res.on('end', () => {
+ if (res.statusCode === 200) {
+ resolve(JSON.parse(data));
+ } else {
+ reject(new Error(`HTTP ${res.statusCode}: ${data}`));
+ }
+ });
+ });
+
+ req.on('error', reject);
+ req.write(postData);
+ req.end();
+ });
+}
+
+async function main() {
+ console.log('Starting one-time upload to Locize...\n');
+
+ let successCount = 0;
+ let errorCount = 0;
+
+ for (const { lang, namespace, file } of translationFiles) {
+ try {
+ // Check if file exists
+ if (!fs.existsSync(file)) {
+ console.log(`⚠️ File not found: ${file}`);
+ continue;
+ }
+
+ // Read translation file
+ const translations = JSON.parse(fs.readFileSync(file, 'utf8'));
+ const flattenedTranslations = flattenJson(translations);
+ const keyCount = Object.keys(flattenedTranslations).length;
+
+ if (keyCount === 0) {
+ console.log(`⚠️ Empty file: ${lang}/${namespace}`);
+ continue;
+ }
+
+ // Upload to Locize
+ await uploadToLocize(lang, namespace, translations);
+ console.log(`✅ ${lang}/${namespace} - ${keyCount} keys uploaded`);
+ successCount++;
+ } catch (error) {
+ console.error(`❌ ${lang}/${namespace} - Error: ${error.message}`);
+ errorCount++;
+ }
+ }
+
+ console.log('\n=== Upload Summary ===');
+ console.log(`✅ Successful uploads: ${successCount}`);
+ console.log(`❌ Failed uploads: ${errorCount}`);
+ console.log(`📊 Total files processed: ${successCount + errorCount}`);
+
+ if (errorCount === 0) {
+ console.log('\n🎉 All translations uploaded successfully!');
+ console.log('You can now view them in your Locize dashboard.');
+ }
+}
+
+// Run the upload
+main().catch(console.error);
diff --git a/scripts/update-i18n-from-meta.js b/scripts/update-i18n-from-meta.js
new file mode 100644
index 0000000..bba4d8f
--- /dev/null
+++ b/scripts/update-i18n-from-meta.js
@@ -0,0 +1,203 @@
+const fs = require('fs');
+const path = require('path');
+
+// Helper function to convert kebab-case to camelCase
+function toCamelCase(str) {
+ return str.replace(/-([a-z])/g, (match, letter) => letter.toUpperCase());
+}
+
+// Helper function to recursively find all meta.ts files
+function findMetaFiles(dir) {
+ const files = [];
+
+ function traverse(currentDir) {
+ const items = fs.readdirSync(currentDir, { withFileTypes: true });
+
+ for (const item of items) {
+ const fullPath = path.join(currentDir, item.name);
+
+ if (item.isDirectory()) {
+ traverse(fullPath);
+ } else if (item.name === 'meta.ts') {
+ files.push(fullPath);
+ }
+ }
+ }
+
+ traverse(dir);
+ return files;
+}
+
+// Helper function to parse meta.ts file and extract the required fields
+function parseMeta(filePath) {
+ const content = fs.readFileSync(filePath, 'utf8');
+
+ // Extract category from defineTool first parameter
+ const categoryMatch = content.match(/defineTool\s*\(\s*['"]([^'"]+)['"]/);
+ if (!categoryMatch) {
+ throw new Error(`Could not find category in ${filePath}`);
+ }
+ const category = categoryMatch[1];
+
+ // Extract name, description, and shortDescription
+ const nameMatch = content.match(/name\s*:\s*['"`]([^'"`]+)['"`]/);
+ const descMatch = content.match(
+ /description\s*:\s*['"`]([\s\S]*?)['"`]\s*,\s*shortDescription/
+ );
+ const shortMatch = content.match(
+ /shortDescription\s*:\s*['"`]([^'"`]+)['"`]/
+ );
+
+ if (!nameMatch || !descMatch || !shortMatch) {
+ console.warn(`⚠️ Missing fields in ${filePath}`);
+ console.warn(
+ ` name: ${!!nameMatch}, description: ${!!descMatch}, shortDescription: ${!!shortMatch}`
+ );
+ return null;
+ }
+
+ return {
+ category,
+ name: nameMatch[1],
+ description: descMatch[1].replace(/\s+/g, ' ').trim(),
+ shortDescription: shortMatch[1]
+ };
+}
+
+// Main execution
+console.log('🚀 Starting i18n extraction from meta.ts files...\n');
+
+const PROJECT_ROOT = path.resolve(__dirname, '..');
+
+// Helper function to get or create category i18n file
+function getCategoryI18nPath(category) {
+ return path.join(
+ PROJECT_ROOT,
+ 'src',
+ 'pages',
+ 'tools',
+ category,
+ 'i18n',
+ 'en.json'
+ );
+}
+
+function loadCategoryI18n(category) {
+ const i18nPath = getCategoryI18nPath(category);
+
+ try {
+ if (fs.existsSync(i18nPath)) {
+ const i18nRaw = fs.readFileSync(i18nPath, 'utf8');
+ return JSON.parse(i18nRaw);
+ } else {
+ // Create directory if it doesn't exist
+ const i18nDir = path.dirname(i18nPath);
+ if (!fs.existsSync(i18nDir)) {
+ fs.mkdirSync(i18nDir, { recursive: true });
+ }
+ return {};
+ }
+ } catch (err) {
+ console.error(`❌ Failed to parse ${i18nPath}:`, err.message);
+ return {};
+ }
+}
+
+function saveCategoryI18n(category, data) {
+ const i18nPath = getCategoryI18nPath(category);
+
+ // Create backup
+ // if (fs.existsSync(i18nPath)) {
+ // fs.copyFileSync(i18nPath, i18nPath + '.bak');
+ // }
+
+ // Write updated file
+ fs.writeFileSync(i18nPath, JSON.stringify(data, null, 2) + '\n', 'utf8');
+ return i18nPath;
+}
+
+// 2) Find all meta.ts files under src/pages/tools
+const toolsDir = path.join(PROJECT_ROOT, 'src', 'pages', 'tools');
+const files = findMetaFiles(toolsDir);
+console.log(`📁 Found ${files.length} meta.ts files\n`);
+
+let addedCount = 0;
+let skippedCount = 0;
+let errorCount = 0;
+const updatedCategories = new Set();
+
+// 3) Process each meta.ts file
+const categoryData = {};
+
+files.forEach((file) => {
+ try {
+ const relativePath = path.relative(PROJECT_ROOT, file);
+ const parsed = parseMeta(file);
+
+ if (!parsed) {
+ errorCount++;
+ return;
+ }
+
+ const { category, name, description, shortDescription } = parsed;
+
+ // Load category i18n data if not already loaded
+ if (!categoryData[category]) {
+ categoryData[category] = loadCategoryI18n(category);
+ }
+
+ // Get tool key from folder name (convert kebab-case to camelCase)
+ const toolSlug = path.basename(path.dirname(file));
+ const toolKey = toCamelCase(toolSlug);
+
+ // Ensure tool entry exists
+ if (!categoryData[category][toolKey]) {
+ categoryData[category][toolKey] = {};
+ }
+
+ const entry = categoryData[category][toolKey];
+ let hasChanges = false;
+
+ // Add missing fields
+ if (!entry.name) {
+ entry.name = name;
+ hasChanges = true;
+ }
+ if (!entry.description) {
+ entry.description = description;
+ hasChanges = true;
+ }
+ if (!entry.shortDescription) {
+ entry.shortDescription = shortDescription;
+ hasChanges = true;
+ }
+
+ if (hasChanges) {
+ console.log(`✅ Updated ${category}/${toolKey}`);
+ addedCount++;
+ updatedCategories.add(category);
+ } else {
+ console.log(`⏭️ Skipped ${category}/${toolKey} (already exists)`);
+ skippedCount++;
+ }
+ } catch (err) {
+ console.error(`❌ Error processing ${file}:`, err.message);
+ errorCount++;
+ }
+});
+
+// 4) Save updated category i18n files
+console.log('\n💾 Saving updated i18n files...');
+for (const category of updatedCategories) {
+ const savedPath = saveCategoryI18n(category, categoryData[category]);
+ console.log(` 📁 ${path.relative(PROJECT_ROOT, savedPath)}`);
+}
+
+// 6) Summary
+console.log('\n📊 Summary:');
+console.log(` ✅ Updated: ${addedCount} tools`);
+console.log(` ⏭️ Skipped: ${skippedCount} tools (already had entries)`);
+console.log(` ❌ Errors: ${errorCount} tools`);
+console.log(
+ `\n🎉 Successfully updated ${updatedCategories.size} category i18n files!`
+);
diff --git a/src/@types/i18n.d.ts b/src/@types/i18n.d.ts
new file mode 100644
index 0000000..a0554fa
--- /dev/null
+++ b/src/@types/i18n.d.ts
@@ -0,0 +1,33 @@
+import 'i18next';
+
+import translation from '../../public/locales/en/translation.json';
+import string from '../../public/locales/en/string.json';
+import number from '../../public/locales/en/number.json';
+import video from '../../public/locales/en/video.json';
+import list from '../../public/locales/en/list.json';
+import json from '../../public/locales/en/json.json';
+import time from '../../public/locales/en/time.json';
+import csv from '../../public/locales/en/csv.json';
+import pdf from '../../public/locales/en/pdf.json';
+import audio from '../../public/locales/en/audio.json';
+import xml from '../../public/locales/en/xml.json';
+import image from '../../public/locales/en/image.json';
+
+declare module 'i18next' {
+ interface CustomTypeOptions {
+ resources: {
+ translation: typeof translation;
+ string: typeof string;
+ number: typeof number;
+ video: typeof video;
+ list: typeof list;
+ json: typeof json;
+ time: typeof time;
+ csv: typeof csv;
+ pdf: typeof pdf;
+ audio: typeof audio;
+ xml: typeof xml;
+ image: typeof image;
+ };
+ }
+}
diff --git a/src/components/App.tsx b/src/components/App.tsx
index 69d4d36..b71abd8 100644
--- a/src/components/App.tsx
+++ b/src/components/App.tsx
@@ -10,6 +10,8 @@ import { tools } from '../tools';
import './index.css';
import { darkTheme, lightTheme } from '../config/muiConfig';
import ScrollToTopButton from './ScrollToTopButton';
+import { I18nextProvider } from 'react-i18next';
+import i18n from '../i18n';
export type Mode = 'dark' | 'light' | 'system';
@@ -44,32 +46,34 @@ function App() {
}, []);
return (
-
-
-
-
-
- {
- setMode((prev) => nextMode(prev));
- localStorage.setItem('theme', nextMode(mode));
- }}
- />
- }>
-
-
-
-
-
-
-
+
+
+
+
+
+
+ {
+ setMode((prev) => nextMode(prev));
+ localStorage.setItem('theme', nextMode(mode));
+ }}
+ />
+ }>
+
+
+
+
+
+
+
+
);
}
diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx
index c1c6487..91143d6 100644
--- a/src/components/Hero.tsx
+++ b/src/components/Hero.tsx
@@ -15,9 +15,16 @@ import { useState } from 'react';
import { DefinedTool } from '@tools/defineTool';
import { filterTools, tools } from '@tools/index';
import { useNavigate } from 'react-router-dom';
-import _ from 'lodash';
import { Icon } from '@iconify/react';
import { getToolCategoryTitle } from '@utils/string';
+import { useTranslation } from 'react-i18next';
+import { FullI18nKey, validNamespaces } from '../i18n';
+import {
+ getBookmarkedToolPaths,
+ isBookmarked,
+ toggleBookmarked
+} from '@utils/bookmark';
+import IconButton from '@mui/material/IconButton';
const GroupHeader = styled('div')(({ theme }) => ({
position: 'sticky',
@@ -33,44 +40,98 @@ const GroupHeader = styled('div')(({ theme }) => ({
const GroupItems = styled('ul')({
padding: 0
});
-const exampleTools: { label: string; url: string }[] = [
- {
- label: 'Create a transparent image',
- url: '/image-generic/create-transparent'
- },
- { label: 'Prettify JSON', url: '/json/prettify' },
- { label: 'Change GIF speed', url: '/gif/change-speed' },
- { label: 'Sort a list', url: '/list/sort' },
- { label: 'Compress PNG', url: '/png/compress-png' },
- { label: 'Split a text', url: '/string/split' },
- { label: 'Split PDF', url: '/pdf/split-pdf' },
- { label: 'Trim video', url: '/video/trim' },
- { label: 'Calculate number sum', url: '/number/sum' }
-];
+
+type ToolInfo = {
+ label: FullI18nKey;
+ url: string;
+};
+
export default function Hero() {
+ const { t } = useTranslation(validNamespaces);
const [inputValue, setInputValue] = useState('');
const theme = useTheme();
const [filteredTools, setFilteredTools] = useState(tools);
+ const [bookmarkedToolPaths, setBookmarkedToolPaths] = useState(
+ getBookmarkedToolPaths()
+ );
const navigate = useNavigate();
+
+ const exampleTools: ToolInfo[] = [
+ {
+ label: 'translation:hero.examples.createTransparentImage',
+ url: '/image-generic/create-transparent'
+ },
+ {
+ label: 'translation:hero.examples.prettifyJson',
+ url: '/json/prettify'
+ },
+ {
+ label: 'translation:hero.examples.changeGifSpeed',
+ url: '/gif/change-speed'
+ },
+ {
+ label: 'translation:hero.examples.sortList',
+ url: '/list/sort'
+ },
+ {
+ label: 'translation:hero.examples.compressPng',
+ url: '/png/compress-png'
+ },
+ {
+ label: 'translation:hero.examples.splitText',
+ url: '/string/split'
+ },
+ {
+ label: 'translation:hero.examples.splitPdf',
+ url: '/pdf/split-pdf'
+ },
+ {
+ label: 'translation:hero.examples.trimVideo',
+ url: '/video/trim'
+ },
+ {
+ label: 'translation:hero.examples.calculateNumberSum',
+ url: '/number/sum'
+ }
+ ];
+
const handleInputChange = (
event: React.ChangeEvent<{}>,
newInputValue: string
) => {
setInputValue(newInputValue);
- setFilteredTools(filterTools(tools, newInputValue));
+ setFilteredTools(filterTools(tools, newInputValue, t));
};
+ const toolsMap = new Map();
+ for (const tool of filteredTools) {
+ toolsMap.set(tool.path, {
+ label: tool.name,
+ url: '/' + tool.path
+ });
+ }
+
+ const displayedTools =
+ bookmarkedToolPaths.length > 0
+ ? bookmarkedToolPaths.flatMap((path) => {
+ const tool = toolsMap.get(path);
+ if (tool === undefined) {
+ return [];
+ }
+ return [tool];
+ })
+ : exampleTools;
return (
- Get Things Done Quickly with{' '}
+ {t('translation:hero.title')}{' '}
- OmniTools
+ {t('translation:hero.brand')}
@@ -79,9 +140,7 @@ export default function Hero() {
fontSize={{ xs: 15, md: 20 }}
mb={2}
>
- Boost your productivity with OmniTools, the ultimate toolkit for getting
- things done quickly! Access thousands of user-friendly utilities for
- editing images, text, lists, and data, all directly from your browser.
+ {t('translation:hero.description')}
{
return (
- {getToolCategoryTitle(params.group)}
+ {getToolCategoryTitle(params.group, t)}
{params.children}
);
}}
inputValue={inputValue}
- getOptionLabel={(option) => option.name}
+ getOptionLabel={(option) => t(option.name)}
renderInput={(params) => (
,
@@ -121,12 +180,42 @@ export default function Hero() {
{...props}
onClick={() => navigate('/' + option.path)}
>
-
-
-
- {option.name}
- {option.shortDescription}
-
+
+
+
+
+ {t(option.name)}
+
+ {t(option.shortDescription)}
+
+
+
+ {
+ e.stopPropagation();
+ toggleBookmarked(option.path);
+ setBookmarkedToolPaths(getBookmarkedToolPaths());
+ }}
+ >
+
+
)}
@@ -137,7 +226,7 @@ export default function Hero() {
}}
/>
- {exampleTools.map((tool) => (
+ {displayedTools.map((tool) => (
navigate(tool.url.startsWith('/') ? tool.url : `/${tool.url}`)
@@ -162,10 +251,30 @@ export default function Hero() {
cursor: 'pointer',
'&:hover': {
backgroundColor: 'background.hover'
- }
+ },
+ height: '100%'
}}
>
- {tool.label}
+
+ {t(tool.label)}
+ {bookmarkedToolPaths.length > 0 && (
+ {
+ e.stopPropagation();
+ const path = tool.url.substring(1);
+ toggleBookmarked(path);
+ setBookmarkedToolPaths(getBookmarkedToolPaths());
+ }}
+ size={'small'}
+ >
+
+
+ )}
+
))}
diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx
index 5b1bfcf..6677266 100644
--- a/src/components/Navbar/index.tsx
+++ b/src/components/Navbar/index.tsx
@@ -13,22 +13,39 @@ import {
ListItem,
ListItemButton,
ListItemText,
- Stack
+ Stack,
+ Select,
+ MenuItem,
+ FormControl
} from '@mui/material';
import useMediaQuery from '@mui/material/useMediaQuery';
import { useTheme } from '@mui/material/styles';
import { Icon } from '@iconify/react';
import { Mode } from 'components/App';
+import { useTranslation } from 'react-i18next';
interface NavbarProps {
mode: Mode;
onChangeMode: () => void;
}
+const languages = [
+ { code: 'en', label: 'English' },
+ { code: 'de', label: 'Deutsch' },
+ { code: 'es', label: 'Español' },
+ { code: 'fr', label: 'Français' },
+ { code: 'pt', label: 'Português' },
+ { code: 'ja', label: '日本語' },
+ { code: 'hi', label: 'हिंदी' },
+ { code: 'nl', label: 'Nederlands' },
+ { code: 'ru', label: 'Русский' },
+ { code: 'zh', label: '中文' }
+];
const Navbar: React.FC = ({
mode,
onChangeMode: onChangeMode
}) => {
+ const { t, i18n } = useTranslation();
const navigate = useNavigate();
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down('md'));
@@ -36,12 +53,51 @@ const Navbar: React.FC = ({
const toggleDrawer = (open: boolean) => () => {
setDrawerOpen(open);
};
+
+ const handleLanguageChange = (event: any) => {
+ const newLanguage = event.target.value;
+ i18n.changeLanguage(newLanguage);
+ localStorage.setItem('lang', newLanguage);
+ };
+
const navItems: { label: string; path: string }[] = [
// { label: 'Features', path: '/features' }
// { label: 'About Us', path: '/about-us' }
];
+ const languageSelector = (
+
+
+ {languages.map((lang) => (
+
+ {lang.label}
+
+ ))}
+
+
+ );
+
const buttons: ReactNode[] = [
+ languageSelector,
= ({
/>
}
>
- Buy me a coffee
+ {t('navbar.buyMeACoffee')}
];
const drawerList = (
diff --git a/src/components/ToolHeader.tsx b/src/components/ToolHeader.tsx
index 8d88f13..a39c0db 100644
--- a/src/components/ToolHeader.tsx
+++ b/src/components/ToolHeader.tsx
@@ -1,4 +1,4 @@
-import { Box, Button, styled, useTheme } from '@mui/material';
+import { Box, Button, Stack, styled, useTheme } from '@mui/material';
import Typography from '@mui/material/Typography';
import ToolBreadcrumb from './ToolBreadcrumb';
import { capitalizeFirstLetter } from '../utils/string';
@@ -7,6 +7,11 @@ import { Icon, IconifyIcon } from '@iconify/react';
import { categoriesColors } from '../config/uiConfig';
import { getToolsByCategory } from '@tools/index';
import { useEffect, useState } from 'react';
+import { isBookmarked, toggleBookmarked } from '@utils/bookmark';
+import IconButton from '@mui/material/IconButton';
+import { useTranslation } from 'react-i18next';
+import useMediaQuery from '@mui/material/useMediaQuery';
+import { validNamespaces } from '../i18n';
const StyledButton = styled(Button)(({ theme }) => ({
backgroundColor: 'white',
@@ -21,10 +26,14 @@ interface ToolHeaderProps {
description: string;
icon?: IconifyIcon | string;
type: string;
+ path: string;
}
function ToolLinks() {
+ const { t } = useTranslation();
const [examplesVisible, setExamplesVisible] = useState(false);
+ const theme = useTheme();
+ const isMd = useMediaQuery(theme.breakpoints.down('md'));
useEffect(() => {
const timeout = setTimeout(() => {
@@ -45,16 +54,18 @@ function ToolLinks() {
}
return (
-
- scrollToElement('tool')}
- >
- Use This Tool
-
-
+ {isMd && (
+
+ scrollToElement('tool')}
+ >
+ Use This Tool
+
+
+ )}
{examplesVisible && (
scrollToElement('examples')}
>
- See Examples
+ {t('toolHeader.seeExamples')}
)}
@@ -80,15 +91,19 @@ export default function ToolHeader({
icon,
title,
description,
- type
+ type,
+ path
}: ToolHeaderProps) {
+ const theme = useTheme();
+ const { t } = useTranslation();
+ const [bookmarked, setBookmarked] = useState(isBookmarked(path));
return (
category.type === type
)!.rawTitle,
link: '/categories/' + type
@@ -98,9 +113,27 @@ export default function ToolHeader({
/>
-
- {title}
-
+
+
+ {title}
+
+ {
+ toggleBookmarked(path);
+ setBookmarked(!bookmarked);
+ }}
+ >
+
+
+
{description}
diff --git a/src/components/ToolLayout.tsx b/src/components/ToolLayout.tsx
index 3da0837..5559d49 100644
--- a/src/components/ToolLayout.tsx
+++ b/src/components/ToolLayout.tsx
@@ -5,26 +5,47 @@ import ToolHeader from './ToolHeader';
import Separator from './Separator';
import AllTools from './allTools/AllTools';
import { getToolsByCategory } from '@tools/index';
-import { capitalizeFirstLetter } from '../utils/string';
+import {
+ capitalizeFirstLetter,
+ getI18nNamespaceFromToolCategory
+} from '../utils/string';
import { IconifyIcon } from '@iconify/react';
+import { useTranslation } from 'react-i18next';
+import { ToolCategory } from '@tools/defineTool';
+import { FullI18nKey } from '../i18n';
export default function ToolLayout({
children,
- title,
- description,
icon,
- type
+ i18n,
+ type,
+ fullPath
}: {
- title: string;
- description: string;
icon?: IconifyIcon | string;
- type: string;
+ type: ToolCategory;
+ fullPath: string;
children: ReactNode;
+ i18n?: {
+ name: FullI18nKey;
+ description: FullI18nKey;
+ shortDescription: FullI18nKey;
+ };
}) {
+ const { t } = useTranslation([
+ 'translation',
+ getI18nNamespaceFromToolCategory(type)
+ ]);
+
+ // Use i18n keys if available, otherwise fall back to provided strings
+ //@ts-ignore
+ const toolTitle: string = t(i18n.name);
+ //@ts-ignore
+ const toolDescription: string = t(i18n.description);
+
const otherCategoryTools =
- getToolsByCategory()
+ getToolsByCategory(t)
.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,
@@ -41,22 +62,25 @@ export default function ToolLayout({
sx={{ backgroundColor: 'background.default' }}
>
- {`${title} - OmniTools`}
+ {`${toolTitle} - OmniTools`}
{children}
category.type === type)!
- .rawTitle
- )} tools`}
+ title={t('translation:toolLayout.allToolsTitle', '', {
+ type: capitalizeFirstLetter(
+ getToolsByCategory(t).find((category) => category.type === type)!
+ .title
+ )
+ })}
toolCards={otherCategoryTools}
/>
diff --git a/src/components/allTools/AllTools.tsx b/src/components/allTools/AllTools.tsx
index 06d663b..bd447e0 100644
--- a/src/components/allTools/AllTools.tsx
+++ b/src/components/allTools/AllTools.tsx
@@ -1,10 +1,12 @@
import { Box, Grid, Stack, Typography } from '@mui/material';
import ToolCard from './ToolCard';
import { IconifyIcon } from '@iconify/react';
+import { useTranslation } from 'react-i18next';
+import { FullI18nKey } from '../../i18n';
export interface ToolCardProps {
- title: string;
- description: string;
+ title: FullI18nKey;
+ description: FullI18nKey;
link: string;
icon: IconifyIcon | string;
}
@@ -15,6 +17,7 @@ interface AllToolsProps {
}
export default function AllTools({ title, toolCards }: AllToolsProps) {
+ const { t } = useTranslation();
return (
@@ -25,8 +28,10 @@ export default function AllTools({ title, toolCards }: AllToolsProps) {
{toolCards.map((card, index) => (
diff --git a/src/components/examples/ToolExamples.tsx b/src/components/examples/ToolExamples.tsx
index c1c00c6..1b87f16 100644
--- a/src/components/examples/ToolExamples.tsx
+++ b/src/components/examples/ToolExamples.tsx
@@ -3,6 +3,7 @@ import ExampleCard, { ExampleCardProps } from './ExampleCard';
import React from 'react';
import { GetGroupsType } from '@components/options/ToolOptions';
import { useFormikContext } from 'formik';
+import { useTranslation } from 'react-i18next';
export type CardExampleType = Omit<
ExampleCardProps,
@@ -24,6 +25,7 @@ export default function ToolExamples({
getGroups,
setInput
}: ExampleProps) {
+ const { t } = useTranslation();
const { setValues } = useFormikContext();
function changeInputResult(newInput: string | undefined, newOptions: T) {
@@ -39,10 +41,10 @@ export default function ToolExamples({
- {`${title} Examples`}
+ {t('toolExamples.title', { title })}
- {subtitle ?? 'Click to try!'}
+ {subtitle ?? t('toolExamples.subtitle')}
diff --git a/src/components/input/BaseFileInput.tsx b/src/components/input/BaseFileInput.tsx
index ebc3840..6502e6c 100644
--- a/src/components/input/BaseFileInput.tsx
+++ b/src/components/input/BaseFileInput.tsx
@@ -12,6 +12,7 @@ import { globalInputHeight } from '../../config/uiConfig';
import { CustomSnackBarContext } from '../../contexts/CustomSnackBarContext';
import greyPattern from '@assets/grey-pattern.png';
import { isArray } from 'lodash';
+import { useTranslation } from 'react-i18next';
interface BaseFileInputComponentProps extends BaseFileInputProps {
children: (props: { preview: string | undefined }) => ReactNode;
@@ -26,6 +27,7 @@ export default function BaseFileInput({
children,
type
}: BaseFileInputComponentProps) {
+ const { t } = useTranslation();
const [preview, setPreview] = useState(null);
const [isDragging, setIsDragging] = useState(false);
const theme = useTheme();
@@ -60,9 +62,9 @@ export default function BaseFileInput({
navigator.clipboard
.write([clipboardItem])
- .then(() => showSnackBar('File copied', 'success'))
+ .then(() => showSnackBar(t('baseFileInput.fileCopied'), 'success'))
.catch((err) => {
- showSnackBar('Failed to copy: ' + err, 'error');
+ showSnackBar(t('baseFileInput.copyFailed', { error: err }), 'error');
});
}
};
@@ -190,7 +192,7 @@ export default function BaseFileInput({
variant="h6"
align="center"
>
- Drop your {type} here
+ {t('baseFileInput.dropFileHere', { type })}
) : (
- Click here to select a {type} from your device, press Ctrl+V to
- use a {type} from your clipboard, or drag and drop a file from
- desktop
+ {t('baseFileInput.selectFileDescription', { type })}
)}
diff --git a/src/components/input/InputFooter.tsx b/src/components/input/InputFooter.tsx
index 5760022..3a4afa5 100644
--- a/src/components/input/InputFooter.tsx
+++ b/src/components/input/InputFooter.tsx
@@ -3,6 +3,7 @@ import Button from '@mui/material/Button';
import PublishIcon from '@mui/icons-material/Publish';
import ContentPasteIcon from '@mui/icons-material/ContentPaste';
import ClearIcon from '@mui/icons-material/Clear';
+import { useTranslation } from 'react-i18next';
export default function InputFooter({
handleImport,
@@ -13,19 +14,21 @@ export default function InputFooter({
handleCopy?: () => void;
handleClear?: () => void;
}) {
+ const { t } = useTranslation();
+
return (
}>
- Import from file
+ {t('inputFooter.importFromFile')}
{handleCopy && (
}>
- Copy to clipboard
+ {t('inputFooter.copyToClipboard')}
)}
{handleClear && (
}>
- Clear
+ {t('inputFooter.clear')}
)}
diff --git a/src/components/input/NumericInputWithUnit.tsx b/src/components/input/NumericInputWithUnit.tsx
index a545685..436d933 100644
--- a/src/components/input/NumericInputWithUnit.tsx
+++ b/src/components/input/NumericInputWithUnit.tsx
@@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react';
import { Grid, Select, MenuItem } from '@mui/material';
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import Qty from 'js-quantities';
+import { useTranslation } from 'react-i18next';
//
const siPrefixes: { [key: string]: number } = {
@@ -23,6 +24,7 @@ export default function NumericInputWithUnit(props: {
onOwnChange?: (value: { value: number; unit: string }) => void;
defaultPrefix?: string;
}) {
+ const { t } = useTranslation();
const [inputValue, setInputValue] = useState(props.value.value);
const [prefix, setPrefix] = useState(props.defaultPrefix || 'Default prefix');
@@ -158,7 +160,7 @@ export default function NumericInputWithUnit(props: {
{
diff --git a/src/components/input/ToolMultipleAudioInput.tsx b/src/components/input/ToolMultipleAudioInput.tsx
index daba468..f6729cc 100644
--- a/src/components/input/ToolMultipleAudioInput.tsx
+++ b/src/components/input/ToolMultipleAudioInput.tsx
@@ -6,6 +6,7 @@ import InputFooter from './InputFooter';
import { CustomSnackBarContext } from '../../contexts/CustomSnackBarContext';
import { isArray } from 'lodash';
import MusicNoteIcon from '@mui/icons-material/MusicNote';
+import { useTranslation } from 'react-i18next';
interface MultiAudioInputComponentProps {
accept: string[];
@@ -27,7 +28,10 @@ export default function ToolMultipleAudioInput({
title,
type
}: MultiAudioInputComponentProps) {
+ const { t } = useTranslation();
+ const theme = useTheme();
const fileInputRef = useRef(null);
+ const { showSnackBar } = useContext(CustomSnackBarContext);
const handleFileChange = (event: React.ChangeEvent) => {
const files = event.target.files;
@@ -93,7 +97,12 @@ export default function ToolMultipleAudioInput({
return (
- No files selected
+ {t('toolMultipleAudioInput.noFilesSelected')}
)}
diff --git a/src/components/input/ToolMultiplePdfInput.tsx b/src/components/input/ToolMultiplePdfInput.tsx
index 2afa2ff..67f874f 100644
--- a/src/components/input/ToolMultiplePdfInput.tsx
+++ b/src/components/input/ToolMultiplePdfInput.tsx
@@ -6,6 +6,7 @@ import InputFooter from './InputFooter';
import { CustomSnackBarContext } from '../../contexts/CustomSnackBarContext';
import { isArray } from 'lodash';
import PictureAsPdfIcon from '@mui/icons-material/PictureAsPdf';
+import { useTranslation } from 'react-i18next';
interface MultiPdfInputComponentProps {
accept: string[];
@@ -27,6 +28,7 @@ export default function ToolMultiFileInput({
title,
type
}: MultiPdfInputComponentProps) {
+ const { t } = useTranslation();
const theme = useTheme();
const fileInputRef = useRef(null);
const { showSnackBar } = useContext(CustomSnackBarContext);
@@ -96,7 +98,12 @@ export default function ToolMultiFileInput({
return (
- No files selected
+ {t('toolMultiplePdfInput.noFilesSelected')}
)}
diff --git a/src/components/input/ToolTextInput.tsx b/src/components/input/ToolTextInput.tsx
index 793e0d7..5891dee 100644
--- a/src/components/input/ToolTextInput.tsx
+++ b/src/components/input/ToolTextInput.tsx
@@ -3,6 +3,7 @@ import React, { useContext, useRef } from 'react';
import { CustomSnackBarContext } from '../../contexts/CustomSnackBarContext';
import InputHeader from '../InputHeader';
import InputFooter from './InputFooter';
+import { useTranslation } from 'react-i18next';
export default function ToolTextInput({
value,
@@ -15,15 +16,16 @@ export default function ToolTextInput({
onChange: (value: string) => void;
placeholder?: string;
}) {
+ const { t } = useTranslation();
const { showSnackBar } = useContext(CustomSnackBarContext);
const fileInputRef = useRef(null);
const handleCopy = () => {
navigator.clipboard
.writeText(value)
- .then(() => showSnackBar('Text copied', 'success'))
+ .then(() => showSnackBar(t('toolTextInput.copied'), 'success'))
.catch((err) => {
- showSnackBar('Failed to copy: ' + err, 'error');
+ showSnackBar(t('toolTextInput.copyFailed', { error: err }), 'error');
});
};
const handleFileChange = (event: React.ChangeEvent) => {
@@ -45,14 +47,14 @@ export default function ToolTextInput({
};
return (
-
+
onChange(event.target.value)}
fullWidth
multiline
rows={10}
- placeholder={placeholder}
+ placeholder={placeholder || t('toolTextInput.placeholder')}
sx={{
'&.MuiTextField-root': {
backgroundColor: 'background.paper'
diff --git a/src/components/options/ToolOptions.tsx b/src/components/options/ToolOptions.tsx
index b08d42a..0e14b02 100644
--- a/src/components/options/ToolOptions.tsx
+++ b/src/components/options/ToolOptions.tsx
@@ -4,6 +4,7 @@ import Typography from '@mui/material/Typography';
import React, { ReactNode } from 'react';
import { FormikProps, FormikValues, useFormikContext } from 'formik';
import ToolOptionGroups, { ToolOptionGroup } from './ToolOptionGroups';
+import { useTranslation } from 'react-i18next';
export type UpdateField = (field: Y, value: T[Y]) => void;
type NonEmptyArray = [T, ...T[]];
@@ -20,6 +21,7 @@ export default function ToolOptions({
getGroups: GetGroupsType | null;
vertical?: boolean;
}) {
+ const { t } = useTranslation();
const theme = useTheme();
const formikContext = useFormikContext();
@@ -45,7 +47,7 @@ export default function ToolOptions({
>
- Tool options
+ {t('toolOptions.title')}
diff --git a/src/components/result/ResultFooter.tsx b/src/components/result/ResultFooter.tsx
index cf8708e..58aeaca 100644
--- a/src/components/result/ResultFooter.tsx
+++ b/src/components/result/ResultFooter.tsx
@@ -3,13 +3,14 @@ import Button from '@mui/material/Button';
import DownloadIcon from '@mui/icons-material/Download';
import ContentPasteIcon from '@mui/icons-material/ContentPaste';
import React from 'react';
+import { useTranslation } from 'react-i18next';
export default function ResultFooter({
handleDownload,
handleCopy,
disabled,
hideCopy,
- downloadLabel = 'Download'
+ downloadLabel
}: {
handleDownload: () => void;
handleCopy?: () => void;
@@ -17,6 +18,7 @@ export default function ResultFooter({
hideCopy?: boolean;
downloadLabel?: string;
}) {
+ const { t } = useTranslation();
return (
}
>
- {downloadLabel}
+ {downloadLabel || t('resultFooter.download')}
{!hideCopy && (
}
>
- Copy to clipboard
+ {t('resultFooter.copy')}
)}
diff --git a/src/components/result/ToolFileResult.tsx b/src/components/result/ToolFileResult.tsx
index 7dc9b5d..b5478c7 100644
--- a/src/components/result/ToolFileResult.tsx
+++ b/src/components/result/ToolFileResult.tsx
@@ -5,6 +5,7 @@ import greyPattern from '@assets/grey-pattern.png';
import { globalInputHeight } from '../../config/uiConfig';
import ResultFooter from './ResultFooter';
import { CustomSnackBarContext } from '../../contexts/CustomSnackBarContext';
+import { useTranslation } from 'react-i18next';
export default function ToolFileResult({
title = 'Result',
@@ -19,6 +20,7 @@ export default function ToolFileResult({
loading?: boolean;
loadingText?: string;
}) {
+ const { t } = useTranslation();
const [preview, setPreview] = React.useState(null);
const { showSnackBar } = useContext(CustomSnackBarContext);
const theme = useTheme();
@@ -41,9 +43,9 @@ export default function ToolFileResult({
navigator.clipboard
.write([clipboardItem])
- .then(() => showSnackBar('File copied', 'success'))
+ .then(() => showSnackBar(t('toolFileResult.copied'), 'success'))
.catch((err) => {
- showSnackBar('Failed to copy: ' + err, 'error');
+ showSnackBar(t('toolFileResult.copyFailed', { error: err }), 'error');
});
}
};
@@ -91,7 +93,7 @@ export default function ToolFileResult({
return (
-
+
- {loadingText}... This may take a moment.
+ {loadingText || t('toolFileResult.loading')}
) : (
diff --git a/src/components/result/ToolMultiFileResult.tsx b/src/components/result/ToolMultiFileResult.tsx
index d7b006e..87d8aa7 100644
--- a/src/components/result/ToolMultiFileResult.tsx
+++ b/src/components/result/ToolMultiFileResult.tsx
@@ -9,8 +9,11 @@ import InputHeader from '../InputHeader';
import greyPattern from '@assets/grey-pattern.png';
import { globalInputHeight } from '../../config/uiConfig';
import ResultFooter from './ResultFooter';
+import { useTranslation } from 'react-i18next';
+import React, { useContext } from 'react';
+import { CustomSnackBarContext } from '../../contexts/CustomSnackBarContext';
-export default function ToolFileResult({
+export default function ToolMultiFileResult({
title = 'Result',
value,
zipFile,
@@ -23,7 +26,9 @@ export default function ToolFileResult({
loading?: boolean;
loadingText?: string;
}) {
+ const { t } = useTranslation();
const theme = useTheme();
+ const { showSnackBar } = useContext(CustomSnackBarContext);
const getFileType = (
file: File
@@ -46,9 +51,25 @@ export default function ToolFileResult({
URL.revokeObjectURL(url);
};
+ const handleCopy = () => {
+ if (zipFile) {
+ const blob = new Blob([zipFile], { type: zipFile.type });
+ const clipboardItem = new ClipboardItem({ [zipFile.type]: blob });
+ navigator.clipboard
+ .write([clipboardItem])
+ .then(() => showSnackBar(t('toolMultiFileResult.copied'), 'success'))
+ .catch((err) => {
+ showSnackBar(
+ t('toolMultiFileResult.copyFailed', { error: err }),
+ 'error'
+ );
+ });
+ }
+ };
+
return (
-
+
- {loadingText}... This may take a moment.
+ {loadingText || t('toolMultiFileResult.loading')}
) : (
diff --git a/src/components/result/ToolTextResult.tsx b/src/components/result/ToolTextResult.tsx
index ca2b588..64ec61b 100644
--- a/src/components/result/ToolTextResult.tsx
+++ b/src/components/result/ToolTextResult.tsx
@@ -6,6 +6,7 @@ import ResultFooter from './ResultFooter';
import { replaceSpecialCharacters } from '@utils/string';
import mime from 'mime';
import { globalInputHeight } from '../../config/uiConfig';
+import { useTranslation } from 'react-i18next';
export default function ToolTextResult({
title = 'Result',
@@ -20,13 +21,14 @@ export default function ToolTextResult({
keepSpecialCharacters?: boolean;
loading?: boolean;
}) {
+ const { t } = useTranslation();
const { showSnackBar } = useContext(CustomSnackBarContext);
const handleCopy = () => {
navigator.clipboard
.writeText(value)
- .then(() => showSnackBar('Text copied', 'success'))
+ .then(() => showSnackBar(t('toolTextResult.copied'), 'success'))
.catch((err) => {
- showSnackBar('Failed to copy: ' + err, 'error');
+ showSnackBar(t('toolTextResult.copyFailed', { error: err }), 'error');
});
};
const handleDownload = () => {
@@ -48,7 +50,7 @@ export default function ToolTextResult({
};
return (
-
+
{loading ? (
- Loading... This may take a moment.
+ {t('toolTextResult.loading')}
) : (
diff --git a/src/i18n/index.ts b/src/i18n/index.ts
new file mode 100644
index 0000000..0f6a430
--- /dev/null
+++ b/src/i18n/index.ts
@@ -0,0 +1,39 @@
+import i18n, { Namespace, ParseKeys } from 'i18next';
+import { initReactI18next } from 'react-i18next';
+import Backend from 'i18next-http-backend';
+
+export const validNamespaces = [
+ 'string',
+ 'number',
+ 'video',
+ 'list',
+ 'json',
+ 'time',
+ 'csv',
+ 'pdf',
+ 'audio',
+ 'xml',
+ 'translation',
+ 'image'
+] as const satisfies readonly Namespace[];
+
+export type I18nNamespaces = (typeof validNamespaces)[number];
+export type FullI18nKey = {
+ [K in I18nNamespaces]: `${K}:${ParseKeys}`;
+}[I18nNamespaces];
+
+i18n
+ .use(Backend)
+ .use(initReactI18next)
+ .init({
+ lng: localStorage.getItem('lang') || 'en',
+ fallbackLng: 'en',
+ interpolation: {
+ escapeValue: false // react already safes from xss => https://www.i18next.com/translation-function/interpolation#unescape
+ },
+ backend: {
+ loadPath: '/locales/{{lng}}/{{ns}}.json'
+ }
+ });
+
+export default i18n;
diff --git a/src/pages/home/Categories.tsx b/src/pages/home/Categories.tsx
index 12ee949..81bf1b6 100644
--- a/src/pages/home/Categories.tsx
+++ b/src/pages/home/Categories.tsx
@@ -7,6 +7,9 @@ import Button from '@mui/material/Button';
import { useState } from 'react';
import { categoriesColors } from 'config/uiConfig';
import { Icon } from '@iconify/react';
+import { useTranslation } from 'react-i18next';
+import { getI18nNamespaceFromToolCategory } from '@utils/string';
+import { validNamespaces } from '../../i18n';
type ArrayElement =
ArrayType extends readonly (infer ElementType)[] ? ElementType : never;
@@ -18,10 +21,26 @@ const SingleCategory = function ({
category: ArrayElement>;
index: number;
}) {
+ const { t } = useTranslation(getI18nNamespaceFromToolCategory(category.type));
const navigate = useNavigate();
const theme = useTheme();
const [hovered, setHovered] = useState(false);
const toggleHover = () => setHovered((prevState) => !prevState);
+
+ // Get translated category title and description
+ const categoryTitle = t(`categories.${category.type}.title`, category.title);
+ const categoryDescription = t(
+ `categories.${category.type}.description`,
+ category.description
+ );
+ const seeAllText = t('translation:categories.seeAll', 'See all {{title}}', {
+ title: categoryTitle
+ });
+ const tryText = t('translation:categories.try', 'Try {{title}}', {
+ //@ts-ignore
+ title: t(category.example.title)
+ });
+
return (
- {category.title}
+ {categoryTitle}
- {category.description}
+ {categoryDescription}
@@ -71,7 +90,9 @@ const SingleCategory = function ({
fullWidth
onClick={() => navigate('/categories/' + category.type)}
variant={'contained'}
- >{`See all ${category.title}`}
+ >
+ {seeAllText}
+
navigate(category.example.path)}
variant={'outlined'}
- >{`Try ${category.example.title}`}
+ >
+ {tryText}
+
@@ -89,9 +112,10 @@ const SingleCategory = function ({
);
};
export default function Categories() {
+ const { t } = useTranslation();
return (
- {getToolsByCategory().map((category, index) => (
+ {getToolsByCategory(t).map((category, index) => (
))}
diff --git a/src/pages/home/index.tsx b/src/pages/home/index.tsx
index 4443975..bf891d8 100644
--- a/src/pages/home/index.tsx
+++ b/src/pages/home/index.tsx
@@ -1,6 +1,7 @@
import { Box, useTheme } from '@mui/material';
import Hero from 'components/Hero';
import Categories from './Categories';
+import { Helmet } from 'react-helmet';
export default function Home() {
const theme = useTheme();
@@ -25,6 +26,7 @@ export default function Home() {
justifyContent={'center'}
width={'100%'}
>
+
diff --git a/src/pages/tools-by-category/index.tsx b/src/pages/tools-by-category/index.tsx
index 947862e..2129bfe 100644
--- a/src/pages/tools-by-category/index.tsx
+++ b/src/pages/tools-by-category/index.tsx
@@ -2,8 +2,8 @@ import {
Box,
Divider,
Stack,
- TextField,
styled,
+ TextField,
useTheme
} from '@mui/material';
import Grid from '@mui/material/Grid';
@@ -11,16 +11,19 @@ import Typography from '@mui/material/Typography';
import { Link, useNavigate, useParams } from 'react-router-dom';
import { filterTools, getToolsByCategory } from '../../tools';
import Hero from 'components/Hero';
-import { capitalizeFirstLetter, getToolCategoryTitle } from '@utils/string';
+import {
+ getI18nNamespaceFromToolCategory,
+ getToolCategoryTitle
+} from '@utils/string';
import { Icon } from '@iconify/react';
import { categoriesColors } from 'config/uiConfig';
import React, { useEffect } from 'react';
import IconButton from '@mui/material/IconButton';
-import { ArrowBack } from '@mui/icons-material';
-import BackButton from '@components/BackButton';
import ArrowBackIcon from '@mui/icons-material/ArrowBack';
import SearchIcon from '@mui/icons-material/Search';
import { Helmet } from 'react-helmet';
+import { useTranslation } from 'react-i18next';
+import { I18nNamespaces, validNamespaces } from '../../i18n';
const StyledLink = styled(Link)(({ theme }) => ({
'&:hover': {
@@ -33,7 +36,14 @@ export default function ToolsByCategory() {
const mainContentRef = React.useRef(null);
const { categoryName } = useParams();
const [searchTerm, setSearchTerm] = React.useState('');
- const rawTitle = getToolCategoryTitle(categoryName as string);
+ const { t } = useTranslation(validNamespaces);
+ const rawTitle = getToolCategoryTitle(categoryName as string, t);
+ // First get tools by category without filtering
+ const toolsByCategory =
+ getToolsByCategory(t).find(({ type }) => type === categoryName)?.tools ??
+ [];
+
+ const categoryTools = filterTools(toolsByCategory, searchTerm, t);
useEffect(() => {
if (mainContentRef.current) {
@@ -44,7 +54,7 @@ export default function ToolsByCategory() {
return (
- {`${rawTitle} Tools`}
+ {rawTitle}
navigate('/')}>
- {`All ${rawTitle} Tools`}
+
+ {t('translation:toolLayout.allToolsTitle', { type: rawTitle })}
+
- {filterTools(
- getToolsByCategory().find(({ type }) => type === categoryName)
- ?.tools ?? [],
- searchTerm
- ).map((tool, index) => (
+ {categoryTools.map((tool, index) => (
- {tool.name}
+ {/*@ts-ignore*/}
+ {t(tool.name)}
- {tool.shortDescription}
+ {/*@ts-ignore*/}
+ {t(tool.shortDescription)}
diff --git a/src/pages/tools/audio/change-speed/index.tsx b/src/pages/tools/audio/change-speed/index.tsx
index e799814..bb556b3 100644
--- a/src/pages/tools/audio/change-speed/index.tsx
+++ b/src/pages/tools/audio/change-speed/index.tsx
@@ -9,6 +9,7 @@ import ToolFileResult from '@components/result/ToolFileResult';
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import RadioWithTextField from '@components/options/RadioWithTextField';
import { changeAudioSpeed } from './service';
+import { useTranslation } from 'react-i18next';
const initialValues: InitialValuesType = {
newSpeed: 2,
@@ -25,6 +26,7 @@ export default function ChangeSpeed({
title,
longDescription
}: ToolComponentProps) {
+ const { t } = useTranslation('audio');
const [input, setInput] = useState(null);
const [result, setResult] = useState(null);
const [loading, setLoading] = useState(false);
@@ -49,20 +51,20 @@ export default function ChangeSpeed({
updateField
}) => [
{
- title: 'New Audio Speed',
+ title: t('changeSpeed.newAudioSpeed'),
component: (
updateField('newSpeed', Number(val))}
- description="Default multiplier: 2 means 2x faster"
+ description={t('changeSpeed.speedDescription')}
type="number"
/>
)
},
{
- title: 'Output Format',
+ title: t('changeSpeed.outputFormat'),
component: (
}
resultComponent={
loading ? (
-
+
) : (
@@ -114,7 +120,10 @@ export default function ChangeSpeed({
getGroups={getGroups}
setInput={setInput}
compute={compute}
- toolInfo={{ title: `What is ${title}?`, description: longDescription }}
+ toolInfo={{
+ title: t('changeSpeed.toolInfo.title', { title }),
+ description: longDescription
+ }}
/>
);
}
diff --git a/src/pages/tools/audio/change-speed/meta.ts b/src/pages/tools/audio/change-speed/meta.ts
index a23d674..addfefe 100644
--- a/src/pages/tools/audio/change-speed/meta.ts
+++ b/src/pages/tools/audio/change-speed/meta.ts
@@ -2,12 +2,24 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('audio', {
- name: 'Change speed',
path: 'change-speed',
- icon: 'material-symbols-light:speed-outline',
- description:
- 'This online utility lets you change the speed of an audio. You can speed it up or slow it down.',
- shortDescription: 'Quickly change audio speed',
- keywords: ['change', 'speed'],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:speed',
+
+ keywords: [
+ 'audio',
+ 'speed',
+ 'tempo',
+ 'playback',
+ 'accelerate',
+ 'slow down',
+ 'pitch',
+ 'media'
+ ],
+
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'audio:changeSpeed.title',
+ description: 'audio:changeSpeed.description',
+ shortDescription: 'audio:changeSpeed.shortDescription'
+ }
});
diff --git a/src/pages/tools/audio/extract-audio/index.tsx b/src/pages/tools/audio/extract-audio/index.tsx
index f5012ec..e54e290 100644
--- a/src/pages/tools/audio/extract-audio/index.tsx
+++ b/src/pages/tools/audio/extract-audio/index.tsx
@@ -8,6 +8,7 @@ import ToolVideoInput from '@components/input/ToolVideoInput';
import { GetGroupsType } from '@components/options/ToolOptions';
import ToolFileResult from '@components/result/ToolFileResult';
import SelectWithDesc from '@components/options/SelectWithDesc';
+import { useTranslation } from 'react-i18next';
const initialValues: InitialValuesType = {
outputFormat: 'aac'
@@ -17,6 +18,7 @@ export default function ExtractAudio({
title,
longDescription
}: ToolComponentProps) {
+ const { t } = useTranslation('audio');
const [file, setFile] = useState(null);
const [audioFile, setAudioFile] = useState(null);
const [loading, setLoading] = useState(false);
@@ -27,7 +29,7 @@ export default function ExtractAudio({
}) => {
return [
{
- title: 'Output Format',
+ title: t('extractAudio.outputFormat'),
component: (
)
@@ -68,23 +68,33 @@ export default function ExtractAudio({
title={title}
input={file}
inputComponent={
-
+
}
resultComponent={
loading ? (
) : (
-
+
)
}
initialValues={initialValues}
getGroups={getGroups}
compute={compute}
- toolInfo={{ title: `What is ${title}?`, description: longDescription }}
+ toolInfo={{
+ title: t('extractAudio.toolInfo.title', { title }),
+ description: longDescription
+ }}
setInput={setFile}
/>
);
diff --git a/src/pages/tools/audio/extract-audio/meta.ts b/src/pages/tools/audio/extract-audio/meta.ts
index a89afe8..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,7 +16,11 @@ 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'))
+
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'audio:extractAudio.title',
+ description: 'audio:extractAudio.description',
+ shortDescription: 'audio:extractAudio.shortDescription'
+ }
});
diff --git a/src/pages/tools/audio/merge-audio/index.tsx b/src/pages/tools/audio/merge-audio/index.tsx
index 09acd35..02ab2b8 100644
--- a/src/pages/tools/audio/merge-audio/index.tsx
+++ b/src/pages/tools/audio/merge-audio/index.tsx
@@ -1,5 +1,6 @@
import { Box, FormControlLabel, Radio, RadioGroup } from '@mui/material';
import React, { useState } from 'react';
+import { useTranslation } from 'react-i18next';
import ToolContent from '@components/ToolContent';
import { ToolComponentProps } from '@tools/defineTool';
import { GetGroupsType } from '@components/options/ToolOptions';
@@ -24,6 +25,7 @@ export default function MergeAudio({
title,
longDescription
}: ToolComponentProps) {
+ const { t } = useTranslation('audio');
const [input, setInput] = useState([]);
const [result, setResult] = useState(null);
const [loading, setLoading] = useState(false);
@@ -51,7 +53,7 @@ export default function MergeAudio({
updateField
}) => [
{
- title: 'Output Format',
+ title: t('mergeAudio.outputFormat'),
component: (
}
resultComponent={
loading ? (
-
+
) : (
@@ -106,7 +112,10 @@ export default function MergeAudio({
getGroups={getGroups}
setInput={setInput}
compute={compute}
- toolInfo={{ title: `What is ${title}?`, description: longDescription }}
+ toolInfo={{
+ title: t('mergeAudio.toolInfo.title', { title }),
+ description: longDescription
+ }}
/>
);
}
diff --git a/src/pages/tools/audio/merge-audio/meta.ts b/src/pages/tools/audio/merge-audio/meta.ts
index dc1775a..e413504 100644
--- a/src/pages/tools/audio/merge-audio/meta.ts
+++ b/src/pages/tools/audio/merge-audio/meta.ts
@@ -2,12 +2,16 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('audio', {
- name: 'Merge Audio',
+ i18n: {
+ name: 'audio:mergeAudio.title',
+ description: 'audio:mergeAudio.description',
+ shortDescription: 'audio:mergeAudio.shortDescription',
+ longDescription: 'audio:mergeAudio.longDescription'
+ },
+
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',
@@ -20,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/index.tsx b/src/pages/tools/audio/trim/index.tsx
index 07fed95..1a3efe7 100644
--- a/src/pages/tools/audio/trim/index.tsx
+++ b/src/pages/tools/audio/trim/index.tsx
@@ -1,5 +1,6 @@
import { Box, FormControlLabel, Radio, RadioGroup } from '@mui/material';
import React, { useState } from 'react';
+import { useTranslation } from 'react-i18next';
import ToolContent from '@components/ToolContent';
import { ToolComponentProps } from '@tools/defineTool';
import { GetGroupsType } from '@components/options/ToolOptions';
@@ -22,6 +23,7 @@ const formatOptions = [
];
export default function Trim({ title, longDescription }: ToolComponentProps) {
+ const { t } = useTranslation('audio');
const [input, setInput] = useState(null);
const [result, setResult] = useState(null);
const [loading, setLoading] = useState(false);
@@ -48,28 +50,28 @@ export default function Trim({ title, longDescription }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Time Settings',
+ title: t('trim.timeSettings'),
component: (
updateField('startTime', val)}
- description="Start time in format HH:MM:SS (e.g., 00:00:30)"
- label="Start Time"
+ description={t('trim.startTimeDescription')}
+ label={t('trim.startTime')}
/>
updateField('endTime', val)}
- description="End time in format HH:MM:SS (e.g., 00:01:30)"
- label="End Time"
+ description={t('trim.endTimeDescription')}
+ label={t('trim.endTime')}
/>
)
},
{
- title: 'Output Format',
+ title: t('trim.outputFormat'),
component: (
}
resultComponent={
loading ? (
-
+
) : (
@@ -122,7 +128,10 @@ export default function Trim({ title, longDescription }: ToolComponentProps) {
getGroups={getGroups}
setInput={setInput}
compute={compute}
- toolInfo={{ title: `What is ${title}?`, description: longDescription }}
+ toolInfo={{
+ title: t('trim.toolInfo.title', { title }),
+ description: longDescription
+ }}
/>
);
}
diff --git a/src/pages/tools/audio/trim/meta.ts b/src/pages/tools/audio/trim/meta.ts
index a4f36e3..5509d79 100644
--- a/src/pages/tools/audio/trim/meta.ts
+++ b/src/pages/tools/audio/trim/meta.ts
@@ -2,13 +2,16 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('audio', {
- name: 'Trim Audio',
+ i18n: {
+ name: 'audio:trim.title',
+ description: 'audio:trim.description',
+ shortDescription: 'audio:trim.shortDescription',
+ longDescription: 'audio:trim.longDescription'
+ },
+
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',
@@ -21,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 efdbea1..5c7fb08 100644
--- a/src/pages/tools/csv/change-csv-separator/meta.ts
+++ b/src/pages/tools/csv/change-csv-separator/meta.ts
@@ -2,14 +2,14 @@ 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:split-scene-rounded',
- description:
- 'Just upload your CSV file in the form below and it will automatically get a new column delimiter character. In the tool options, you can specify which delimiter and quote characters are used in the source CSV file and customize the desired delimiter and quote characters for the output CSV. You can also filter the input CSV before the conversion process and skip blank lines and comment lines.',
- shortDescription: 'Quickly change the CSV column delimiter to a new symbol.',
- keywords: ['change', 'csv', 'sepa rator'],
- longDescription:
- 'This tool changes the field separator in CSV (Comma Separated Values) files. This is useful because different programs may use different default separators. While a comma is the most common separator in CSV files, some programs require files to be tab-separated (TSV), semicolon-separated (SSV), pipe-separated (PSV), or have another separation symbol. The default comma may not be so convenient as a delimiter in CSV files because commas are frequently present within fields. In such cases, it can be difficult and confusing to distinguish between commas as delimiters and commas as punctuation symbols. By replacing the comma with another delimiter, you can convert the file into a more easily readable and parsable format. In the options section of this tool, you can configure both the input and output CSV file formats. For the input CSV, you can specify its current delimiter (by default, it is a comma) and also indicate the quotation mark character used to wrap fields. For the output CSV, you can set a new delimiter, choose a new quotation mark character, and optionally enclose all the fields in quotes. Additionally, you have the option to remove empty lines from the input CSV and eliminate comment lines that start with a specified character (usually a hash "#" or double slashes "//"). Csv-abulous!',
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:code',
+
+ keywords: ['csv', 'separator', 'delimiter', 'change'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'csv:changeCsvSeparator.title',
+ description: 'csv:changeCsvSeparator.description',
+ shortDescription: 'csv:changeCsvSeparator.shortDescription'
+ }
});
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 f126d75..7a1869e 100644
--- a/src/pages/tools/csv/csv-rows-to-columns/meta.ts
+++ b/src/pages/tools/csv/csv-rows-to-columns/meta.ts
@@ -2,14 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('csv', {
- name: 'Convert CSV Rows to Columns',
+ i18n: {
+ name: 'csv:csvRowsToColumns.title',
+ description: 'csv:csvRowsToColumns.description',
+ shortDescription: 'csv:csvRowsToColumns.shortDescription',
+ longDescription: 'csv:csvRowsToColumns.longDescription'
+ },
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/index.tsx b/src/pages/tools/csv/csv-to-json/index.tsx
index fea2037..33e0fe6 100644
--- a/src/pages/tools/csv/csv-to-json/index.tsx
+++ b/src/pages/tools/csv/csv-to-json/index.tsx
@@ -6,10 +6,9 @@ import { convertCsvToJson } from './service';
import { CardExampleType } from '@components/examples/ToolExamples';
import { ToolComponentProps } from '@tools/defineTool';
import { Box } from '@mui/material';
-import RadioWithTextField from '@components/options/RadioWithTextField';
-import SimpleRadio from '@components/options/SimpleRadio';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
+import { useTranslation } from 'react-i18next';
type InitialValuesType = {
delimiter: string;
@@ -114,6 +113,7 @@ id,name,active
];
export default function CsvToJson({ title }: ToolComponentProps) {
+ const { t } = useTranslation('csv');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -131,8 +131,10 @@ export default function CsvToJson({ title }: ToolComponentProps) {
setResult(jsonResult);
} catch (error) {
setResult(
- `Error: ${
- error instanceof Error ? error.message : 'Invalid CSV format'
+ `${t('csvToJson.error')}: ${
+ error instanceof Error
+ ? error.message
+ : t('csvToJson.invalidCsvFormat')
}`
);
}
@@ -148,28 +150,36 @@ export default function CsvToJson({ title }: ToolComponentProps) {
compute={compute}
exampleCards={exampleCards}
inputComponent={
-
+
}
resultComponent={
-
+
}
getGroups={({ values, updateField }) => [
{
- title: 'Input CSV Format',
+ title: t('csvToJson.inputCsvFormat'),
component: (
updateField('delimiter', val)}
/>
updateField('quote', val)}
value={values.quote}
/>
updateField('comment', val)}
/>
@@ -177,35 +187,34 @@ export default function CsvToJson({ title }: ToolComponentProps) {
)
},
{
- title: 'Conversion Options',
+ title: t('csvToJson.conversionOptions'),
component: (
updateField('useHeaders', value)}
- title="Use Headers"
- description="First row is treated as column headers"
+ title={t('csvToJson.useHeaders')}
+ description={t('csvToJson.useHeadersDescription')}
/>
updateField('skipEmptyLines', value)}
- title="Skip Empty Lines"
- description="Don't process empty lines in the CSV"
+ title={t('csvToJson.skipEmptyLines')}
+ description={t('csvToJson.skipEmptyLinesDescription')}
/>
updateField('dynamicTypes', value)}
- title="Dynamic Types"
- description="Convert numbers and booleans to their proper types"
+ title={t('csvToJson.dynamicTypes')}
+ description={t('csvToJson.dynamicTypesDescription')}
/>
)
}
]}
toolInfo={{
- title: 'What Is a CSV to JSON Converter?',
- description:
- 'This tool transforms Comma Separated Values (CSV) files to JavaScript Object Notation (JSON) data structures. It supports various CSV formats with customizable delimiters, quote characters, and comment symbols. The converter can treat the first row as headers, skip empty lines, and automatically detect data types like numbers and booleans. The resulting JSON can be used for data migration, backups, or as input for other applications.'
+ title: t('csvToJson.toolInfo.title'),
+ description: t('csvToJson.toolInfo.description')
}}
/>
);
diff --git a/src/pages/tools/csv/csv-to-json/meta.ts b/src/pages/tools/csv/csv-to-json/meta.ts
index 94dbae7..64840d1 100644
--- a/src/pages/tools/csv/csv-to-json/meta.ts
+++ b/src/pages/tools/csv/csv-to-json/meta.ts
@@ -2,12 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('csv', {
- name: 'Convert CSV to JSON',
+ i18n: {
+ name: 'csv:csvToJson.title',
+ description: 'csv:csvToJson.description',
+ shortDescription: 'csv:csvToJson.shortDescription'
+ },
+
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 526a92b..6105e00 100644
--- a/src/pages/tools/csv/csv-to-tsv/meta.ts
+++ b/src/pages/tools/csv/csv-to-tsv/meta.ts
@@ -2,14 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('csv', {
- name: 'Convert CSV to TSV',
+ i18n: {
+ name: 'csv:csvToTsv.title',
+ description: 'csv:csvToTsv.description',
+ shortDescription: 'csv:csvToTsv.shortDescription',
+ longDescription: 'csv:csvToTsv.longDescription'
+ },
+
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 9eea05c..bbaae24 100644
--- a/src/pages/tools/csv/csv-to-xml/meta.ts
+++ b/src/pages/tools/csv/csv-to-xml/meta.ts
@@ -2,11 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('csv', {
- name: 'Convert CSV to XML',
+ i18n: {
+ name: 'csv:csvToXml.title',
+ description: 'csv:csvToXml.description',
+ shortDescription: 'csv:csvToXml.shortDescription'
+ },
+
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 cccb6d4..7623c7a 100644
--- a/src/pages/tools/csv/csv-to-yaml/meta.ts
+++ b/src/pages/tools/csv/csv-to-yaml/meta.ts
@@ -2,14 +2,16 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('csv', {
- name: 'Convert CSV to YAML',
+ i18n: {
+ name: 'csv:csvToYaml.title',
+ description: 'csv:csvToYaml.description',
+ shortDescription: 'csv:csvToYaml.shortDescription',
+ longDescription: 'csv:csvToYaml.longDescription'
+ },
+
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/index.tsx b/src/pages/tools/csv/find-incomplete-csv-records/index.tsx
index 1831451..fec3e23 100644
--- a/src/pages/tools/csv/find-incomplete-csv-records/index.tsx
+++ b/src/pages/tools/csv/find-incomplete-csv-records/index.tsx
@@ -10,6 +10,7 @@ import { findIncompleteCsvRecords } from './service';
import { InitialValuesType } from './types';
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
+import { useTranslation } from 'react-i18next';
const initialValues: InitialValuesType = {
csvSeparator: ',',
@@ -103,6 +104,7 @@ export default function FindIncompleteCsvRecords({
title,
longDescription
}: ToolComponentProps) {
+ const { t } = useTranslation('csv');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -115,55 +117,57 @@ export default function FindIncompleteCsvRecords({
updateField
}) => [
{
- title: 'Csv input Options',
+ title: t('findIncompleteCsvRecords.csvInputOptions'),
component: (
updateField('csvSeparator', val)}
- description={
- 'Enter the character used to delimit columns in the CSV input file.'
- }
+ description={t('findIncompleteCsvRecords.csvSeparatorDescription')}
/>
updateField('quoteCharacter', val)}
- description={
- 'Enter the quote character used to quote the CSV input fields.'
- }
+ description={t(
+ 'findIncompleteCsvRecords.quoteCharacterDescription'
+ )}
/>
updateField('commentCharacter', val)}
- description={
- 'Enter the character indicating the start of a comment line. Lines starting with this symbol will be skipped.'
- }
+ description={t(
+ 'findIncompleteCsvRecords.commentCharacterDescription'
+ )}
/>
)
},
{
- title: 'Checking Options',
+ title: t('findIncompleteCsvRecords.checkingOptions'),
component: (
updateField('emptyLines', value)}
- title="Delete Lines with No Data"
- description="Remove empty lines from CSV input file."
+ title={t('findIncompleteCsvRecords.deleteLinesWithNoData')}
+ description={t(
+ 'findIncompleteCsvRecords.deleteLinesWithNoDataDescription'
+ )}
/>
updateField('emptyValues', value)}
- title="Find Empty Values"
- description="Display a message about CSV fields that are empty (These are not missing fields but fields that contain nothing)."
+ title={t('findIncompleteCsvRecords.findEmptyValues')}
+ description={t(
+ 'findIncompleteCsvRecords.findEmptyValuesDescription'
+ )}
/>
updateField('messageLimit', value)}
- title="Limit number of messages"
+ title={t('findIncompleteCsvRecords.limitNumberOfMessages')}
/>
{values.messageLimit && (
@@ -172,7 +176,9 @@ export default function FindIncompleteCsvRecords({
onOwnChange={(val) => updateField('messageNumber', Number(val))}
type="number"
inputProps={{ min: 1 }}
- description={'Set the limit of number of messages in the output.'}
+ description={t(
+ 'findIncompleteCsvRecords.messageLimitDescription'
+ )}
/>
)}
@@ -184,15 +190,27 @@ export default function FindIncompleteCsvRecords({
title={title}
input={input}
inputComponent={
-
+
+ }
+ resultComponent={
+
}
- resultComponent={ }
initialValues={initialValues}
exampleCards={exampleCards}
getGroups={getGroups}
setInput={setInput}
compute={compute}
- toolInfo={{ title: `What is a ${title}?`, description: longDescription }}
+ toolInfo={{
+ title: t('findIncompleteCsvRecords.toolInfo.title', { title }),
+ description: longDescription
+ }}
/>
);
}
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 fc8f165..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,15 +2,15 @@ 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 checks the completeness of CSV (Comma Separated Values) files and identifies incomplete records within the data. It finds rows and columns where one or more values are missing and displays their positions in the output so that you can quickly find and fix your CSV file. A valid CSV file has the same number of values (fields) in all rows and the same number of values (fields) in all columns. If the CSV you load in this tool is complete, the program will notify you with a green badge. If at least one value is missing in any row or column, the program will show a red badge and indicate the exact location of the missing value. If the CSV file has a field with no characters in it, then such a field is called an empty field. It is not a missing field, just empty as it contains nothing. You can activate the "Find Empty Values" checkbox in the options to identify all such fields in the CSV. If the file contains empty lines, you can ignore them with the "Skip Empty Lines" option or check them for completeness along with other lines. You can also configure the delimiter, quote, and comment characters in the options. This allows you to adapt to other file formats besides CSV, such as TSV (Tab Separated Values), SSV (Semicolon Separated Values), or PSV (Pipe Separated Values). If the file has too many incomplete or empty records, you can set a limit on the output messages to display, for example, 5, 10, or 20 messages. If you want to quickly fill in the missing data with default values, you can use our Fill Incomplete CSV Records tool. Csv-abulous!',
- component: lazy(() => import('./index'))
+
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'csv:findIncompleteCsvRecords.title',
+ description: 'csv:findIncompleteCsvRecords.description',
+ shortDescription: 'csv:findIncompleteCsvRecords.shortDescription'
+ }
});
diff --git a/src/pages/tools/csv/insert-csv-columns/index.tsx b/src/pages/tools/csv/insert-csv-columns/index.tsx
index db45420..055c13c 100644
--- a/src/pages/tools/csv/insert-csv-columns/index.tsx
+++ b/src/pages/tools/csv/insert-csv-columns/index.tsx
@@ -1,16 +1,17 @@
import { Box } from '@mui/material';
import React, { useState } from 'react';
import ToolContent from '@components/ToolContent';
-import { ToolComponentProps } from '@tools/defineTool';
import ToolTextInput from '@components/input/ToolTextInput';
import ToolTextResult from '@components/result/ToolTextResult';
-import { GetGroupsType } from '@components/options/ToolOptions';
-import { CardExampleType } from '@components/examples/ToolExamples';
import { main } from './service';
-import { getCsvHeaders } from '@utils/csv';
import { InitialValuesType } from './types';
+import { GetGroupsType } from '@components/options/ToolOptions';
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import SelectWithDesc from '@components/options/SelectWithDesc';
+import { CardExampleType } from '@components/examples/ToolExamples';
+import { ToolComponentProps } from '@tools/defineTool';
+import { getCsvHeaders } from '@utils/csv';
+import { useTranslation } from 'react-i18next';
const initialValues: InitialValuesType = {
csvToInsert: '',
@@ -27,15 +28,19 @@ const initialValues: InitialValuesType = {
const exampleCards: CardExampleType[] = [
{
- title: 'Add One Column to a CSV File',
+ title: 'Insert a single column by position',
description:
- 'In this example, we insert a column with the title "city" into a CSV file that already contains two other columns with titles "name" and "age". The new column consists of three values: "city", "dallas", and "houston", corresponding to the height of the input CSV data. The value "city" is the header value (appearing on the first row) and values "dallas" and "houston" are data values (appearing on rows two and three). We specify the position of the new column by an ordinal number and set it to 1 in the options. This value indicates that the new "city" column should be placed after the first column.',
- sampleText: `name,age
-john,25
-emma,22`,
- sampleResult: `name,city,age
-john,dallas,25
-emma,houston,22`,
+ 'In this example, we insert a single column "city" at position 1 in the CSV data. The input CSV has data about cars, including the "Brand" and "Model" of the car. We now add a "city" column at position 1. To do this, we enter the city data in the comma-separated format in the "New Column" option, and to quickly add the new column at position 1, then we specify the position number.',
+ sampleText: `Brand,Model
+Toyota,Camry
+Ford,Mustang
+Honda,Accord
+Chevrolet,Malibu`,
+ sampleResult: `city,Brand,Model
+dallas,Toyota,Camry
+houston,Ford,Mustang
+dallas,Honda,Accord
+houston,Chevrolet,Malibu`,
sampleOptions: {
csvToInsert: `city
dallas
@@ -118,6 +123,7 @@ export default function InsertCsvColumns({
title,
longDescription
}: ToolComponentProps) {
+ const { t } = useTranslation('csv');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -139,7 +145,7 @@ export default function InsertCsvColumns({
updateField
}) => [
{
- title: 'CSV to insert',
+ title: t('insertCsvColumns.csvToInsert'),
component: (
updateField('csvToInsert', val)}
- title="CSV separator"
- description={`Enter one or more columns you want to insert into the CSV.
- the character used to delimit columns has to be the same with the one in the CSV input file.
- Ps: Blank lines will be ignored`}
+ title={t('insertCsvColumns.csvSeparator')}
+ description={t('insertCsvColumns.csvToInsertDescription')}
/>
)
},
{
- title: 'CSV Options',
+ title: t('insertCsvColumns.csvOptions'),
component: (
updateField('separator', val)}
- description={
- 'Enter the character used to delimit columns in the CSV input file.'
- }
+ description={t('insertCsvColumns.separatorDescription')}
/>
updateField('quoteChar', val)}
- description={
- 'Enter the quote character used to quote the CSV input fields.'
- }
+ description={t('insertCsvColumns.quoteCharDescription')}
/>
updateField('commentCharacter', val)}
- description={
- 'Enter the character indicating the start of a comment line. Lines starting with this symbol will be skipped.'
- }
+ description={t('insertCsvColumns.commentCharacterDescription')}
/>
{
updateField('customFill', value);
@@ -192,48 +196,59 @@ export default function InsertCsvColumns({
updateField('customFillValue', ''); // Reset custom fill value
}
}}
- description={
- 'If the input CSV file is incomplete (missing values), then add empty fields or custom symbols to records to make a well-formed CSV?'
- }
+ description={t('insertCsvColumns.customFillDescription')}
/>
{values.customFill && (
updateField('customFillValue', val)}
- description={
- 'Use this custom value to fill in missing fields. (Works only with "Custom Values" mode above.)'
- }
+ description={t('insertCsvColumns.customFillValueDescription')}
/>
)}
)
},
{
- title: 'Position Options',
+ title: t('insertCsvColumns.positionOptions'),
component: (
updateField('insertingPosition', value)}
- description={'Specify where to insert the columns in the CSV file.'}
+ description={t('insertCsvColumns.insertingPositionDescription')}
/>
{values.insertingPosition === 'custom' && (
updateField('customPostionOptions', value)}
- description={
- 'Select the method to insert the columns in the CSV file.'
- }
+ description={t(
+ 'insertCsvColumns.customPositionOptionsDescription'
+ )}
/>
)}
@@ -243,42 +258,53 @@ export default function InsertCsvColumns({
selected={values.headerName}
options={headerOptions}
onChange={(value) => updateField('headerName', value)}
- description={
- 'Header of the column you want to insert columns after.'
- }
+ description={t('insertCsvColumns.headerNameDescription')}
/>
)}
{values.insertingPosition === 'custom' &&
values.customPostionOptions === 'rowNumber' && (
updateField('rowNumber', Number(val))}
- inputProps={{ min: 1, max: headers.length }}
- type="number"
- description={
- 'Number of the column you want to insert columns after.'
+ value={values.rowNumber.toString()}
+ onOwnChange={(val) =>
+ updateField('rowNumber', parseInt(val) || 0)
}
+ description={t('insertCsvColumns.rowNumberDescription')}
+ type="number"
/>
)}
)
}
];
+
return (
+
+ }
+ resultComponent={
+
}
- resultComponent={ }
initialValues={initialValues}
- exampleCards={exampleCards}
getGroups={getGroups}
- setInput={setInput}
compute={compute}
- toolInfo={{ title: `What is a ${title}?`, description: longDescription }}
+ input={input}
+ setInput={setInput}
+ toolInfo={{
+ title: t('insertCsvColumns.toolInfo.title'),
+ description: t('insertCsvColumns.toolInfo.description')
+ }}
+ exampleCards={exampleCards}
/>
);
}
diff --git a/src/pages/tools/csv/insert-csv-columns/meta.ts b/src/pages/tools/csv/insert-csv-columns/meta.ts
index 7a002ed..66c4cf6 100644
--- a/src/pages/tools/csv/insert-csv-columns/meta.ts
+++ b/src/pages/tools/csv/insert-csv-columns/meta.ts
@@ -2,14 +2,16 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('csv', {
- name: 'Insert CSV columns',
+ i18n: {
+ name: 'csv:insertCsvColumns.title',
+ description: 'csv:insertCsvColumns.description',
+ shortDescription: 'csv:insertCsvColumns.shortDescription'
+ },
+
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 46911ca..8e4739c 100644
--- a/src/pages/tools/csv/swap-csv-columns/meta.ts
+++ b/src/pages/tools/csv/swap-csv-columns/meta.ts
@@ -2,14 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('csv', {
- name: 'Swap CSV Columns',
+ i18n: {
+ name: 'csv:swapCsvColumns.title',
+ description: 'csv:swapCsvColumns.description',
+ shortDescription: 'csv:swapCsvColumns.shortDescription',
+ longDescription: 'csv:swapCsvColumns.longDescription'
+ },
+
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 2f05e33..ddda470 100644
--- a/src/pages/tools/csv/transpose-csv/meta.ts
+++ b/src/pages/tools/csv/transpose-csv/meta.ts
@@ -2,14 +2,17 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('csv', {
- name: 'Transpose CSV',
+ i18n: {
+ name: 'csv:transposeCsv.title',
+ description: 'csv:transposeCsv.description',
+ shortDescription: 'csv:transposeCsv.shortDescription',
+ longDescription: 'csv:transposeCsv.longDescription'
+ },
+
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 287a327..6594fcc 100644
--- a/src/pages/tools/image/generic/change-colors/meta.ts
+++ b/src/pages/tools/image/generic/change-colors/meta.ts
@@ -2,12 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('image-generic', {
- name: 'Change colors in image',
+ i18n: {
+ name: 'image:changeColors.title',
+ description: 'image:changeColors.description',
+ shortDescription: 'image:changeColors.shortDescription'
+ },
+
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 81ef77f..a30cd99 100644
--- a/src/pages/tools/image/generic/change-opacity/meta.ts
+++ b/src/pages/tools/image/generic/change-opacity/meta.ts
@@ -2,12 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('image-generic', {
- name: 'Change image Opacity',
+ i18n: {
+ name: 'image:changeOpacity.title',
+ description: 'image:changeOpacity.description',
+ shortDescription: 'image:changeOpacity.shortDescription'
+ },
+
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/index.tsx b/src/pages/tools/image/generic/compress/index.tsx
index 1fa537c..fe9f9b0 100644
--- a/src/pages/tools/image/generic/compress/index.tsx
+++ b/src/pages/tools/image/generic/compress/index.tsx
@@ -1,4 +1,5 @@
import React, { useContext, useState } from 'react';
+import { useTranslation } from 'react-i18next';
import { InitialValuesType } from './types';
import { compressImage } from './service';
import ToolContent from '@components/ToolContent';
@@ -17,6 +18,7 @@ const initialValues: InitialValuesType = {
};
export default function CompressImage({ title }: ToolComponentProps) {
+ const { t } = useTranslation('image');
const [input, setInput] = useState(null);
const [result, setResult] = useState(null);
const [isProcessing, setIsProcessing] = useState(false);
@@ -37,7 +39,7 @@ export default function CompressImage({ title }: ToolComponentProps) {
setResult(compressed);
setCompressedSize(compressed.size);
} else {
- showSnackBar('Failed to compress image. Please try again.', 'error');
+ showSnackBar(t('compress.failedToCompress'), 'error');
}
} catch (err) {
console.error('Error in compression:', err);
@@ -55,12 +57,12 @@ export default function CompressImage({ title }: ToolComponentProps) {
value={input}
onChange={setInput}
accept={['image/*']}
- title={'Input image'}
+ title={t('compress.inputTitle')}
/>
}
resultComponent={
@@ -68,14 +70,14 @@ export default function CompressImage({ title }: ToolComponentProps) {
initialValues={initialValues}
getGroups={({ values, updateField }) => [
{
- title: 'Compression options',
+ title: t('compress.compressionOptions'),
component: (
updateNumberField(value, 'maxFileSizeInMB', updateField)
}
@@ -85,7 +87,7 @@ export default function CompressImage({ title }: ToolComponentProps) {
name="quality"
type="number"
inputProps={{ min: 10, max: 100, step: 1 }}
- description="Image quality percentage (lower means smaller file size)"
+ description={t('compress.qualityDescription')}
onOwnChange={(value) =>
updateNumberField(value, 'quality', updateField)
}
@@ -95,18 +97,20 @@ export default function CompressImage({ title }: ToolComponentProps) {
)
},
{
- title: 'File sizes',
+ title: t('compress.fileSizes'),
component: (
{originalSize !== null && (
- Original Size: {(originalSize / 1024).toFixed(2)} KB
+ {t('compress.originalSize')}:{' '}
+ {(originalSize / 1024).toFixed(2)} KB
)}
{compressedSize !== null && (
- Compressed Size: {(compressedSize / 1024).toFixed(2)} KB
+ {t('compress.compressedSize')}:{' '}
+ {(compressedSize / 1024).toFixed(2)} KB
)}
diff --git a/src/pages/tools/image/generic/compress/meta.ts b/src/pages/tools/image/generic/compress/meta.ts
index fb34481..7cd8c6c 100644
--- a/src/pages/tools/image/generic/compress/meta.ts
+++ b/src/pages/tools/image/generic/compress/meta.ts
@@ -2,13 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('image-generic', {
- name: 'Compress Image',
+ i18n: {
+ name: 'image:compress.title',
+ description: 'image:compress.description',
+ shortDescription: 'image:compress.shortDescription'
+ },
+
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 7f4c548..05c76c4 100644
--- a/src/pages/tools/image/generic/convert-to-jpg/meta.ts
+++ b/src/pages/tools/image/generic/convert-to-jpg/meta.ts
@@ -2,12 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('image-generic', {
- name: 'Convert Images to JPG',
+ i18n: {
+ name: 'image:convertToJpg.title',
+ description: 'image:convertToJpg.description',
+ shortDescription: 'image:convertToJpg.shortDescription'
+ },
+
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 d606dfb..50fe18a 100644
--- a/src/pages/tools/image/generic/create-transparent/meta.ts
+++ b/src/pages/tools/image/generic/create-transparent/meta.ts
@@ -2,12 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('image-generic', {
- name: 'Create transparent PNG',
+ i18n: {
+ name: 'image:createTransparent.title',
+ description: 'image:createTransparent.description',
+ shortDescription: 'image:createTransparent.shortDescription'
+ },
+
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 897eeeb..8f93b1d 100644
--- a/src/pages/tools/image/generic/crop/meta.ts
+++ b/src/pages/tools/image/generic/crop/meta.ts
@@ -2,11 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('image-generic', {
- name: 'Crop',
+ i18n: {
+ name: 'image:crop.title',
+ description: 'image:crop.description',
+ shortDescription: 'image:crop.shortDescription'
+ },
+
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 2771325..b9e25d9 100644
--- a/src/pages/tools/image/generic/editor/meta.ts
+++ b/src/pages/tools/image/generic/editor/meta.ts
@@ -2,12 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('image-generic', {
- name: 'Image Editor',
+ i18n: {
+ name: 'image:editor.title',
+ description: 'image:editor.description',
+ shortDescription: 'image:editor.shortDescription'
+ },
+
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 d35c89d..501023a 100644
--- a/src/pages/tools/image/generic/image-to-text/meta.ts
+++ b/src/pages/tools/image/generic/image-to-text/meta.ts
@@ -2,12 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('image-generic', {
- name: 'Image to Text (OCR)',
+ i18n: {
+ name: 'image:imageToText.title',
+ description: 'image:imageToText.description',
+ shortDescription: 'image:imageToText.shortDescription'
+ },
+
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 302e526..ee3ab35 100644
--- a/src/pages/tools/image/generic/qr-code/meta.ts
+++ b/src/pages/tools/image/generic/qr-code/meta.ts
@@ -2,12 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('image-generic', {
- name: 'QR Code Generator',
+ i18n: {
+ name: 'image:qrCode.title',
+ description: 'image:qrCode.description',
+ shortDescription: 'image:qrCode.shortDescription'
+ },
+
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 fe13bbd..8bf12d0 100644
--- a/src/pages/tools/image/generic/remove-background/meta.ts
+++ b/src/pages/tools/image/generic/remove-background/meta.ts
@@ -2,12 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('image-generic', {
- name: 'Remove Background from Image',
+ i18n: {
+ name: 'image:removeBackground.title',
+ description: 'image:removeBackground.description',
+ shortDescription: 'image:removeBackground.shortDescription'
+ },
+
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/index.tsx b/src/pages/tools/image/generic/resize/index.tsx
index f3df9f5..1e7d592 100644
--- a/src/pages/tools/image/generic/resize/index.tsx
+++ b/src/pages/tools/image/generic/resize/index.tsx
@@ -11,6 +11,7 @@ import SimpleRadio from '@components/options/SimpleRadio';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
import { processImage } from './service';
import { InitialValuesType } from './types';
+import { useTranslation } from 'react-i18next';
const initialValues: InitialValuesType = {
resizeMethod: 'pixels' as 'pixels' | 'percentage',
@@ -45,6 +46,7 @@ const validationSchema = Yup.object({
});
export default function ResizeImage({ title }: ToolComponentProps) {
+ const { t } = useTranslation('image');
const [input, setInput] = useState(null);
const [result, setResult] = useState(null);
@@ -58,22 +60,20 @@ export default function ResizeImage({ title }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Resize Method',
+ title: t('resize.resizeMethod'),
component: (
updateField('resizeMethod', 'pixels')}
checked={values.resizeMethod === 'pixels'}
- description={'Resize by specifying dimensions in pixels.'}
- title={'Resize by Pixels'}
+ description={t('resize.resizeByPixelsDescription')}
+ title={t('resize.resizeByPixels')}
/>
updateField('resizeMethod', 'percentage')}
checked={values.resizeMethod === 'percentage'}
- description={
- 'Resize by specifying a percentage of the original size.'
- }
- title={'Resize by Percentage'}
+ description={t('resize.resizeByPercentageDescription')}
+ title={t('resize.resizeByPercentage')}
/>
)
@@ -81,7 +81,7 @@ export default function ResizeImage({ title }: ToolComponentProps) {
...(values.resizeMethod === 'pixels'
? [
{
- title: 'Dimension Type',
+ title: t('resize.dimensionType'),
component: (
updateField('maintainAspectRatio', value)
}
- description={
- 'Maintain the original aspect ratio of the image.'
- }
- title={'Maintain Aspect Ratio'}
+ description={t('resize.maintainAspectRatioDescription')}
+ title={t('resize.maintainAspectRatio')}
/>
{values.maintainAspectRatio && (
updateField('dimensionType', 'width')}
checked={values.dimensionType === 'width'}
- description={
- 'Specify the width in pixels and calculate height based on aspect ratio.'
- }
- title={'Set Width'}
+ description={t('resize.setWidthDescription')}
+ title={t('resize.setWidth')}
/>
updateField('dimensionType', 'height')}
checked={values.dimensionType === 'height'}
- description={
- 'Specify the height in pixels and calculate width based on aspect ratio.'
- }
- title={'Set Height'}
+ description={t('resize.setHeightDescription')}
+ title={t('resize.setHeight')}
/>
)}
updateField('width', val)}
- description={'Width (in pixels)'}
+ description={t('resize.widthDescription')}
disabled={
values.maintainAspectRatio &&
values.dimensionType === 'height'
@@ -131,7 +125,7 @@ export default function ResizeImage({ title }: ToolComponentProps) {
updateField('height', val)}
- description={'Height (in pixels)'}
+ description={t('resize.heightDescription')}
disabled={
values.maintainAspectRatio &&
values.dimensionType === 'width'
@@ -148,15 +142,13 @@ export default function ResizeImage({ title }: ToolComponentProps) {
]
: [
{
- title: 'Percentage',
+ title: t('resize.percentage'),
component: (
updateField('percentage', val)}
- description={
- 'Percentage of original size (e.g., 50 for half size, 200 for double size)'
- }
+ description={t('resize.percentageDescription')}
inputProps={{
'data-testid': 'percentage-input',
type: 'number',
@@ -183,20 +175,19 @@ export default function ResizeImage({ title }: ToolComponentProps) {
value={input}
onChange={setInput}
accept={['image/jpeg', 'image/png', 'image/svg+xml', 'image/gif']}
- title={'Input Image'}
+ title={t('resize.inputTitle')}
/>
}
resultComponent={
}
toolInfo={{
- title: 'Resize Image',
- description:
- 'This tool allows you to resize JPG, PNG, SVG, or GIF images. You can resize by specifying dimensions in pixels or by percentage, with options to maintain the original aspect ratio.'
+ title: t('resize.toolInfo.title'),
+ description: t('resize.toolInfo.description')
}}
/>
);
diff --git a/src/pages/tools/image/generic/resize/meta.ts b/src/pages/tools/image/generic/resize/meta.ts
index 8be266a..fbc4d1f 100644
--- a/src/pages/tools/image/generic/resize/meta.ts
+++ b/src/pages/tools/image/generic/resize/meta.ts
@@ -2,12 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('image-generic', {
- name: 'Resize Image',
+ i18n: {
+ name: 'image:resize.title',
+ description: 'image:resize.description',
+ shortDescription: 'image:resize.shortDescription'
+ },
+
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 bd1e7af..80e7d67 100644
--- a/src/pages/tools/image/generic/rotate/meta.ts
+++ b/src/pages/tools/image/generic/rotate/meta.ts
@@ -2,11 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('image-generic', {
- name: 'Rotate Image',
+ i18n: {
+ name: 'image:rotate.title',
+ description: 'image:rotate.description',
+ shortDescription: 'image:rotate.shortDescription'
+ },
+
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 4ed8009..224d20e 100644
--- a/src/pages/tools/image/png/compress-png/meta.ts
+++ b/src/pages/tools/image/png/compress-png/meta.ts
@@ -3,12 +3,15 @@ import { lazy } from 'react';
// import image from '@assets/text.png';
export const tool = defineTool('png', {
- name: 'Compress png',
+ i18n: {
+ name: 'image:compressPng.title',
+ description: 'image:compressPng.description',
+ shortDescription: 'image:compressPng.shortDescription'
+ },
+
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 b7c8da7..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
@@ -2,12 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('png', {
- name: 'Convert JPG to PNG',
+ i18n: {
+ name: 'image:convertJgpToPng.title',
+ description: 'image:convertJgpToPng.description',
+ shortDescription: 'image:convertJgpToPng.shortDescription'
+ },
+
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 bc45f00..2b57258 100644
--- a/src/pages/tools/json/escape-json/meta.ts
+++ b/src/pages/tools/json/escape-json/meta.ts
@@ -2,13 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('json', {
- name: 'Escape JSON',
path: 'escape-json',
- icon: 'lets-icons:json-light',
- description:
- 'Free online JSON escaper. Just load your JSON in the input field and it will automatically get escaped. In the tool options, you can optionally enable wrapping the escaped JSON in double quotes to get an escaped JSON string.',
- shortDescription: 'Quickly escape special JSON characters.',
- longDescription: `This tool converts special characters in JSON files and data structures into their escaped versions. Such special characters are, for example, double quotes, newline characters, backslashes, tabs, and many others. If these characters aren't escaped and appear in a raw JSON string without escaping, they can lead to errors in data parsing. The program turns them into safe versions by adding a backslash (\\) before the character, changing its interpretation. Additionally, you can enable the "Wrap Output in Quotes" checkbox in the options, which adds double quotes around the resulting escaped JSON data. This is useful when the escaped JSON data needs to be used as a string in other data structures or the JavaScript programming language. Json-abulous!`,
- keywords: ['escape', 'json'],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:code',
+
+ keywords: ['json', 'escape', 'characters', 'format'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'json:escapeJson.title',
+ description: 'json:escapeJson.description',
+ shortDescription: 'json:escapeJson.shortDescription'
+ }
});
diff --git a/src/pages/tools/json/json-to-xml/meta.ts b/src/pages/tools/json/json-to-xml/meta.ts
index a0f5f63..e737dc1 100644
--- a/src/pages/tools/json/json-to-xml/meta.ts
+++ b/src/pages/tools/json/json-to-xml/meta.ts
@@ -2,11 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('json', {
- name: 'Convert JSON to XML',
path: 'json-to-xml',
- icon: 'mdi-light:xml',
- description: 'Convert JSON files to XML format with customizable options.',
- shortDescription: 'Convert JSON data to XML format',
- keywords: ['json', 'xml', 'convert', 'transform', 'parse'],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:code',
+
+ keywords: ['json', 'xml', 'convert', 'transform'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'json:jsonToXml.title',
+ description: 'json:jsonToXml.description',
+ shortDescription: 'json:jsonToXml.shortDescription'
+ }
});
diff --git a/src/pages/tools/json/minify/index.tsx b/src/pages/tools/json/minify/index.tsx
index bbe05e2..69c0646 100644
--- a/src/pages/tools/json/minify/index.tsx
+++ b/src/pages/tools/json/minify/index.tsx
@@ -5,6 +5,7 @@ import ToolTextResult from '@components/result/ToolTextResult';
import { minifyJson } from './service';
import { CardExampleType } from '@components/examples/ToolExamples';
import { ToolComponentProps } from '@tools/defineTool';
+import { useTranslation } from 'react-i18next';
type InitialValuesType = Record;
@@ -47,6 +48,7 @@ const exampleCards: CardExampleType[] = [
];
export default function MinifyJson({ title }: ToolComponentProps) {
+ const { t } = useTranslation('json');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -58,11 +60,15 @@ export default function MinifyJson({ title }: ToolComponentProps) {
+
}
resultComponent={
@@ -70,9 +76,8 @@ export default function MinifyJson({ title }: ToolComponentProps) {
initialValues={initialValues}
getGroups={null}
toolInfo={{
- title: 'What Is JSON Minification?',
- description:
- "JSON minification is the process of removing all unnecessary whitespace characters from JSON data while maintaining its validity. This includes removing spaces, newlines, and indentation that aren't required for the JSON to be parsed correctly. Minification reduces the size of JSON data, making it more efficient for storage and transmission while keeping the exact same data structure and values."
+ title: t('minify.toolInfo.title'),
+ description: t('minify.toolInfo.description')
}}
exampleCards={exampleCards}
input={input}
diff --git a/src/pages/tools/json/minify/meta.ts b/src/pages/tools/json/minify/meta.ts
index 513bf0a..e856cb3 100644
--- a/src/pages/tools/json/minify/meta.ts
+++ b/src/pages/tools/json/minify/meta.ts
@@ -2,12 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('json', {
- name: 'Minify JSON',
path: 'minify',
- icon: 'lets-icons:json-light',
- description:
- 'Minify your JSON by removing all unnecessary whitespace and formatting. This tool compresses JSON data to its smallest possible size while maintaining valid JSON structure.',
- shortDescription: 'Quickly compress JSON file.',
- keywords: ['minify', 'compress', 'minimize', 'json', 'compact'],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:code',
+
+ keywords: ['json', 'minify', 'compress', 'whitespace'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'json:minify.title',
+ description: 'json:minify.description',
+ shortDescription: 'json:minify.shortDescription'
+ }
});
diff --git a/src/pages/tools/json/prettify/index.tsx b/src/pages/tools/json/prettify/index.tsx
index a85c973..c24b825 100644
--- a/src/pages/tools/json/prettify/index.tsx
+++ b/src/pages/tools/json/prettify/index.tsx
@@ -14,6 +14,7 @@ import RadioWithTextField from '@components/options/RadioWithTextField';
import SimpleRadio from '@components/options/SimpleRadio';
import { isNumber, updateNumberField } from '../../../../utils/string';
import ToolContent from '@components/ToolContent';
+import { useTranslation } from 'react-i18next';
type InitialValuesType = {
indentationType: 'tab' | 'space';
@@ -115,6 +116,7 @@ const exampleCards: CardExampleType[] = [
];
export default function PrettifyJson({ title }: ToolComponentProps) {
+ const { t } = useTranslation('json');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -128,11 +130,15 @@ export default function PrettifyJson({ title }: ToolComponentProps) {
title={title}
input={input}
inputComponent={
-
+
}
resultComponent={
@@ -140,14 +146,14 @@ export default function PrettifyJson({ title }: ToolComponentProps) {
initialValues={initialValues}
getGroups={({ values, updateField }) => [
{
- title: 'Indentation',
+ title: t('prettify.indentation'),
component: (
updateField('indentationType', 'space')}
onTextChange={(val) =>
@@ -157,8 +163,8 @@ export default function PrettifyJson({ title }: ToolComponentProps) {
updateField('indentationType', 'tab')}
checked={values.indentationType === 'tab'}
- description={'Indent output with tabs.'}
- title={'Use Tabs'}
+ description={t('prettify.useTabsDescription')}
+ title={t('prettify.useTabs')}
/>
)
@@ -168,9 +174,8 @@ export default function PrettifyJson({ title }: ToolComponentProps) {
setInput={setInput}
exampleCards={exampleCards}
toolInfo={{
- title: 'What Is a JSON Prettifier?',
- description:
- 'This tool adds consistent formatting to the data in JavaScript Object Notation (JSON) format. This transformation makes the JSON code more readable, making it easier to understand and edit. The program parses the JSON data structure into tokens and then reformats them by adding indentation and line breaks. If the data is hierarchial, then it adds indentation at the beginning of lines to visually show the depth of the JSON and adds newlines to break long single-line JSON arrays into multiple shorter, more readable ones. Additionally, this utility can remove unnecessary spaces and tabs from your JSON code (especially leading and trailing whitespaces), making it more compact. You can choose the line indentation method in the options: indent with spaces or indent with tabs. When using spaces, you can also specify how many spaces to use for each indentation level (usually 2 or 4 spaces). '
+ title: t('prettify.toolInfo.title'),
+ description: t('prettify.toolInfo.description')
}}
/>
);
diff --git a/src/pages/tools/json/prettify/meta.ts b/src/pages/tools/json/prettify/meta.ts
index 0a97e83..58a7102 100644
--- a/src/pages/tools/json/prettify/meta.ts
+++ b/src/pages/tools/json/prettify/meta.ts
@@ -2,12 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('json', {
- name: 'Prettify JSON',
path: 'prettify',
- icon: 'lets-icons:json-light',
- description:
- "Just load your JSON in the input field and it will automatically get prettified. In the tool options, you can choose whether to use spaces or tabs for indentation and if you're using spaces, you can specify the number of spaces to add per indentation level.",
- shortDescription: 'Quickly beautify a JSON data structure.',
- keywords: ['prettify'],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:code',
+
+ keywords: ['json', 'prettify', 'format', 'beautify'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'json:prettify.title',
+ description: 'json:prettify.description',
+ shortDescription: 'json:prettify.shortDescription'
+ }
});
diff --git a/src/pages/tools/json/stringify/meta.ts b/src/pages/tools/json/stringify/meta.ts
index 8c28b61..1a6e02c 100644
--- a/src/pages/tools/json/stringify/meta.ts
+++ b/src/pages/tools/json/stringify/meta.ts
@@ -2,20 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('json', {
- name: 'Stringify JSON',
path: 'stringify',
- icon: 'ant-design:field-string-outlined',
- description:
- 'Convert JavaScript objects and arrays into their JSON string representation. Options include custom indentation and HTML character escaping for web-safe JSON strings.',
- shortDescription: 'Convert JavaScript objects to JSON strings',
- keywords: [
- 'stringify',
- 'serialize',
- 'convert',
- 'object',
- 'array',
- 'json',
- 'string'
- ],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:code',
+
+ keywords: ['json', 'stringify', 'serialize', 'convert'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'json:stringify.title',
+ description: 'json:stringify.description',
+ shortDescription: 'json:stringify.shortDescription'
+ }
});
diff --git a/src/pages/tools/json/tsv-to-json/meta.ts b/src/pages/tools/json/tsv-to-json/meta.ts
index ed7c304..0f644a3 100644
--- a/src/pages/tools/json/tsv-to-json/meta.ts
+++ b/src/pages/tools/json/tsv-to-json/meta.ts
@@ -2,14 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('json', {
- name: 'Convert TSV to JSON',
path: 'tsv-to-json',
- icon: 'material-symbols:tsv-rounded',
- description:
- 'Convert TSV files to JSON format with customizable options for delimiters, quotes, and output formatting. Support for headers, comments, and dynamic type conversion.',
- shortDescription: 'Convert TSV data to JSON format.',
- longDescription:
- 'This tool allows you to convert TSV (Tab-Separated Values) files into JSON format. You can customize the conversion process by specifying delimiters, quote characters, and whether to use headers. It also supports dynamic type conversion for values, handling comments, and skipping empty lines. The output can be formatted with indentation or minified as needed.',
- keywords: ['tsv', 'json', 'convert', 'transform', 'parse'],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:code',
+
+ keywords: ['tsv', 'json', 'convert', 'tabular'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'json:tsvToJson.title',
+ description: 'json:tsvToJson.description',
+ shortDescription: 'json:tsvToJson.shortDescription'
+ }
});
diff --git a/src/pages/tools/json/validateJson/index.tsx b/src/pages/tools/json/validateJson/index.tsx
index 39333af..7642b59 100644
--- a/src/pages/tools/json/validateJson/index.tsx
+++ b/src/pages/tools/json/validateJson/index.tsx
@@ -5,6 +5,7 @@ import { CardExampleType } from '@components/examples/ToolExamples';
import { validateJson } from './service';
import { ToolComponentProps } from '@tools/defineTool';
import ToolContent from '@components/ToolContent';
+import { useTranslation } from 'react-i18next';
const exampleCards: CardExampleType<{}>[] = [
{
@@ -46,6 +47,7 @@ const exampleCards: CardExampleType<{}>[] = [
];
export default function ValidateJson({ title }: ToolComponentProps) {
+ const { t } = useTranslation('json');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -53,9 +55,9 @@ export default function ValidateJson({ title }: ToolComponentProps) {
const { valid, error } = validateJson(input);
if (valid) {
- setResult('✅ Valid JSON');
+ setResult(t('validateJson.validJson'));
} else {
- setResult(`❌ ${error}`);
+ setResult(t('validateJson.invalidJson', { error }));
}
};
@@ -63,25 +65,20 @@ export default function ValidateJson({ title }: ToolComponentProps) {
+
}
resultComponent={
-
+
}
initialValues={{}}
getGroups={null}
toolInfo={{
- title: 'What is JSON Validation?',
- description: `
- JSON (JavaScript Object Notation) is a lightweight data-interchange format.
- JSON validation ensures that the structure of the data conforms to the JSON standard.
- A valid JSON object must have:
- - Property names enclosed in double quotes.
- - Properly balanced curly braces {}.
- - No trailing commas after the last key-value pair.
- - Proper nesting of objects and arrays.
- This tool checks the input JSON and provides feedback to help identify and fix common errors.
- `
+ title: t('validateJson.toolInfo.title'),
+ description: t('validateJson.toolInfo.description')
}}
exampleCards={exampleCards}
input={input}
diff --git a/src/pages/tools/json/validateJson/meta.ts b/src/pages/tools/json/validateJson/meta.ts
index 379bb11..c18b58b 100644
--- a/src/pages/tools/json/validateJson/meta.ts
+++ b/src/pages/tools/json/validateJson/meta.ts
@@ -2,12 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('json', {
- name: 'Validate JSON',
- path: 'validateJson',
- icon: 'lets-icons:json-light',
- description:
- 'Validate JSON data and identify formatting issues such as missing quotes, trailing commas, and incorrect brackets.',
- shortDescription: 'Quickly validate a JSON data structure.',
- keywords: ['validate', 'json', 'syntax'],
- component: lazy(() => import('./index'))
+ path: 'validate-json',
+ icon: 'material-symbols:check-circle',
+
+ keywords: ['json', 'validate', 'check', 'syntax', 'errors'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'json:validateJson.title',
+ description: 'json:validateJson.description',
+ shortDescription: 'json:validateJson.shortDescription'
+ }
});
diff --git a/src/pages/tools/list/duplicate/index.tsx b/src/pages/tools/list/duplicate/index.tsx
index 9e4f50c..d12b372 100644
--- a/src/pages/tools/list/duplicate/index.tsx
+++ b/src/pages/tools/list/duplicate/index.tsx
@@ -11,6 +11,7 @@ import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import SimpleRadio from '@components/options/SimpleRadio';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
import * as Yup from 'yup';
+import { useTranslation } from 'react-i18next';
interface InitialValuesType {
splitOperatorType: SplitOperatorType;
@@ -101,6 +102,7 @@ const exampleCards: CardExampleType[] = [
];
export default function Duplicate({ title }: ToolComponentProps) {
+ const { t } = useTranslation('list');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -121,9 +123,9 @@ export default function Duplicate({ title }: ToolComponentProps) {
);
} catch (error) {
if (error instanceof Error) {
- setResult(`Error: ${error.message}`);
+ setResult(`${t('duplicate.error')}: ${error.message}`);
} else {
- setResult('An unknown error occurred');
+ setResult(t('duplicate.unknownError'));
}
}
}
@@ -134,55 +136,53 @@ export default function Duplicate({ title }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Split Options',
+ title: t('duplicate.splitOptions'),
component: (
updateField('splitOperatorType', 'symbol')}
checked={values.splitOperatorType === 'symbol'}
- title={'Split by Symbol'}
+ title={t('duplicate.splitBySymbol')}
/>
updateField('splitOperatorType', 'regex')}
checked={values.splitOperatorType === 'regex'}
- title={'Split by Regular Expression'}
+ title={t('duplicate.splitByRegex')}
/>
updateField('splitSeparator', val)}
- description={'Separator to split the list'}
+ description={t('duplicate.splitSeparatorDescription')}
/>
updateField('joinSeparator', val)}
- description={'Separator to join the duplicated list'}
+ description={t('duplicate.joinSeparatorDescription')}
/>
)
},
{
- title: 'Duplication Options',
+ title: t('duplicate.duplicationOptions'),
component: (
updateField('copy', val)}
- description={'Number of copies (can be fractional)'}
+ description={t('duplicate.copyDescription')}
type="number"
/>
updateField('concatenate', checked)}
- description={
- 'Concatenate copies (if unchecked, items will be interweaved)'
- }
+ description={t('duplicate.concatenateDescription')}
/>
updateField('reverse', checked)}
- description={'Reverse the duplicated items'}
+ description={t('duplicate.reverseDescription')}
/>
)
@@ -193,18 +193,21 @@ export default function Duplicate({ title }: ToolComponentProps) {
+
}
resultComponent={
-
+
}
initialValues={initialValues}
getGroups={getGroups}
validationSchema={validationSchema}
toolInfo={{
- title: 'List Duplication',
- description:
- "This tool allows you to duplicate items in a list. You can specify the number of copies (including fractional values), control whether items are concatenated or interweaved, and even reverse the duplicated items. It's useful for creating repeated patterns, generating test data, or expanding lists with predictable content."
+ title: t('duplicate.toolInfo.title'),
+ description: t('duplicate.toolInfo.description')
}}
exampleCards={exampleCards}
input={input}
diff --git a/src/pages/tools/list/duplicate/meta.ts b/src/pages/tools/list/duplicate/meta.ts
index 82fa874..e9d2dbd 100644
--- a/src/pages/tools/list/duplicate/meta.ts
+++ b/src/pages/tools/list/duplicate/meta.ts
@@ -3,12 +3,14 @@ import { lazy } from 'react';
// import image from '@assets/text.png';
export const tool = defineTool('list', {
- name: 'Duplicate',
path: 'duplicate',
- icon: 'mdi:content-duplicate',
- description:
- 'A tool to duplicate each item in a list a specified number of times. Perfect for creating repeated patterns, test data, or expanding datasets.',
- shortDescription: 'Repeat items in a list multiple times.',
+ icon: 'material-symbols-light:content-copy',
+
keywords: ['duplicate'],
- component: lazy(() => import('./index'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'list:duplicate.title',
+ description: 'list:duplicate.description',
+ shortDescription: 'list:duplicate.shortDescription'
+ }
});
diff --git a/src/pages/tools/list/find-most-popular/index.tsx b/src/pages/tools/list/find-most-popular/index.tsx
index 7e2f597..47b447f 100644
--- a/src/pages/tools/list/find-most-popular/index.tsx
+++ b/src/pages/tools/list/find-most-popular/index.tsx
@@ -1,5 +1,6 @@
import { Box } from '@mui/material';
import React, { useState } from 'react';
+import { useTranslation } from 'react-i18next';
import ToolTextInput from '@components/input/ToolTextInput';
import ToolTextResult from '@components/result/ToolTextResult';
import {
@@ -14,6 +15,7 @@ import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
import SelectWithDesc from '@components/options/SelectWithDesc';
import ToolContent from '@components/ToolContent';
import { ToolComponentProps } from '@tools/defineTool';
+import { ParseKeys } from 'i18next';
const initialValues = {
splitSeparatorType: 'symbol' as SplitOperatorType,
@@ -25,23 +27,24 @@ const initialValues = {
trimItems: false
};
const splitOperators: {
- title: string;
- description: string;
+ title: ParseKeys<'list'>;
+ description: ParseKeys<'list'>;
type: SplitOperatorType;
}[] = [
{
- title: 'Use a Symbol for Splitting',
- description: 'Delimit input list items with a character.',
+ title: 'findMostPopular.splitOperators.symbol.title',
+ description: 'findMostPopular.splitOperators.symbol.description',
type: 'symbol'
},
{
- title: 'Use a Regex for Splitting',
+ title: 'findMostPopular.splitOperators.regex.title',
type: 'regex',
- description: 'Delimit input list items with a regular expression.'
+ description: 'findMostPopular.splitOperators.regex.description'
}
];
export default function FindMostPopular({ title }: ToolComponentProps) {
+ const { t } = useTranslation('list');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
const compute = (optionsValues: typeof initialValues, input: any) => {
@@ -74,28 +77,35 @@ export default function FindMostPopular({ title }: ToolComponentProps) {
title={title}
input={input}
inputComponent={
-
+
}
resultComponent={
-
+
}
initialValues={initialValues}
getGroups={({ values, updateField }) => [
{
- title: 'How to Extract List Items?',
+ title: t('findMostPopular.extractListItems'),
component: (
{splitOperators.map(({ title, description, type }) => (
updateField('splitSeparatorType', type)}
- title={title}
- description={description}
+ title={t(title)}
+ description={t(description)}
checked={values.splitSeparatorType === type}
/>
))}
updateField('splitSeparator', val)}
/>
@@ -103,26 +113,24 @@ export default function FindMostPopular({ title }: ToolComponentProps) {
)
},
{
- title: 'Item comparison',
+ title: t('findMostPopular.itemComparison'),
component: (
updateField('deleteEmptyItems', value)}
/>
updateField('trimItems', value)}
/>
updateField('ignoreItemCase', value)}
/>
@@ -130,27 +138,42 @@ export default function FindMostPopular({ title }: ToolComponentProps) {
)
},
{
- title: 'Top item output format',
+ title: t('findMostPopular.outputFormat'),
component: (
updateField('displayFormat', value)}
- description={'How to display the most popular list items?'}
+ description={t('findMostPopular.displayFormatDescription')}
/>
updateField('sortingMethod', value)}
- description={'Select a sorting method.'}
+ description={t('findMostPopular.sortingMethodDescription')}
/>
)
diff --git a/src/pages/tools/list/find-most-popular/meta.ts b/src/pages/tools/list/find-most-popular/meta.ts
index 4f3217f..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,14 @@ 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:query-stats',
- description:
- 'A tool to identify and count the most frequently occurring items in a list. Useful for data analysis, finding trends, or identifying common elements.',
- shortDescription: 'Find most common items in a list.',
+ icon: 'material-symbols-light:trending-up',
+
keywords: ['find', 'most', 'popular'],
- component: lazy(() => import('./index'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'list:findMostPopular.title',
+ description: 'list:findMostPopular.description',
+ shortDescription: 'list:findMostPopular.shortDescription'
+ }
});
diff --git a/src/pages/tools/list/find-unique/index.tsx b/src/pages/tools/list/find-unique/index.tsx
index b5ef4b9..89af8da 100644
--- a/src/pages/tools/list/find-unique/index.tsx
+++ b/src/pages/tools/list/find-unique/index.tsx
@@ -7,6 +7,7 @@ import { findUniqueCompute, SplitOperatorType } from './service';
import SimpleRadio from '@components/options/SimpleRadio';
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
+import { useTranslation } from 'react-i18next';
const initialValues = {
splitOperatorType: 'symbol' as SplitOperatorType,
@@ -35,6 +36,7 @@ const splitOperators: {
];
export default function FindUnique() {
+ const { t } = useTranslation('list');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
const compute = (optionsValues: typeof initialValues, input: any) => {
@@ -64,18 +66,24 @@ export default function FindUnique() {
return (
+
+ }
+ resultComponent={
+
}
- resultComponent={ }
getGroups={({ values, updateField }) => [
{
- title: 'Input List Delimiter',
+ title: t('findUnique.inputListDelimiter'),
component: (
{splitOperators.map(({ title, description, type }) => (
@@ -88,7 +96,7 @@ export default function FindUnique() {
/>
))}
updateField('splitSeparator', val)}
/>
@@ -96,7 +104,7 @@ export default function FindUnique() {
)
},
{
- title: 'Output List Delimiter',
+ title: t('findUnique.outputListDelimiter'),
component: (
updateField('joinSeparator', value)}
/>
updateField('trimItems', value)}
/>
updateField('deleteEmptyItems', value)}
/>
@@ -123,22 +127,20 @@ export default function FindUnique() {
)
},
{
- title: 'Unique Item Options',
+ title: t('findUnique.uniqueItemOptions'),
component: (
updateField('absolutelyUnique', value)}
/>
updateField('caseSensitive', value)}
/>
diff --git a/src/pages/tools/list/find-unique/meta.ts b/src/pages/tools/list/find-unique/meta.ts
index 865e188..d9828a3 100644
--- a/src/pages/tools/list/find-unique/meta.ts
+++ b/src/pages/tools/list/find-unique/meta.ts
@@ -2,11 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('list', {
- name: 'Find unique',
path: 'find-unique',
- icon: 'mynaui:one',
- description: "World's simplest browser-based utility for finding unique items in a list. Just input your list with any separator, and it will automatically identify and extract unique items. Perfect for removing duplicates, finding distinct values, or analyzing data uniqueness. You can customize the input/output separators and choose whether to preserve the original order.",
- shortDescription: 'Find unique items in a list',
+ icon: 'material-symbols-light:search',
+
keywords: ['find', 'unique'],
- component: lazy(() => import('./index'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'list:findUnique.title',
+ description: 'list:findUnique.description',
+ shortDescription: 'list:findUnique.shortDescription'
+ }
});
diff --git a/src/pages/tools/list/group/index.tsx b/src/pages/tools/list/group/index.tsx
index e7f70e6..84377be 100644
--- a/src/pages/tools/list/group/index.tsx
+++ b/src/pages/tools/list/group/index.tsx
@@ -9,6 +9,7 @@ import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
import { formatNumber } from '../../../../utils/number';
import ToolContent from '@components/ToolContent';
import { ToolComponentProps } from '@tools/defineTool';
+import { useTranslation } from 'react-i18next';
const initialValues = {
splitOperatorType: 'symbol' as SplitOperatorType,
@@ -40,6 +41,7 @@ const splitOperators: {
];
export default function FindUnique({ title }: ToolComponentProps) {
+ const { t } = useTranslation('list');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
const compute = (optionsValues: typeof initialValues, input: any) => {
@@ -78,28 +80,32 @@ export default function FindUnique({ title }: ToolComponentProps) {
title={title}
input={input}
inputComponent={
-
+
}
resultComponent={
-
+
}
initialValues={initialValues}
getGroups={({ values, updateField }) => [
{
- title: 'Input Item Separator',
+ title: t('group.inputItemSeparator'),
component: (
{splitOperators.map(({ title, description, type }) => (
updateField('splitOperatorType', type)}
- title={title}
- description={description}
+ title={t(`group.splitOperators.${type}.title`)}
+ description={t(`group.splitOperators.${type}.description`)}
checked={values.splitOperatorType === type}
/>
))}
updateField('splitSeparator', val)}
/>
@@ -107,12 +113,12 @@ export default function FindUnique({ title }: ToolComponentProps) {
)
},
{
- title: 'Group Size and Separators',
+ title: t('group.groupSizeAndSeparators'),
component: (
updateField('groupNumber', formatNumber(value, 1))
@@ -120,52 +126,46 @@ export default function FindUnique({ title }: ToolComponentProps) {
/>
updateField('itemSeparator', value)}
/>
updateField('groupSeparator', value)}
/>
updateField('leftWrap', value)}
/>
updateField('rightWrap', value)}
/>
)
},
{
- title: 'Empty Items and Padding',
+ title: t('group.emptyItemsAndPadding'),
component: (
updateField('deleteEmptyItems', value)}
/>
updateField('padNonFullGroup', value)}
/>
updateField('paddingChar', value)}
/>
diff --git a/src/pages/tools/list/group/meta.ts b/src/pages/tools/list/group/meta.ts
index 20e1b61..394b61c 100644
--- a/src/pages/tools/list/group/meta.ts
+++ b/src/pages/tools/list/group/meta.ts
@@ -2,11 +2,14 @@ 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'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'list:group.title',
+ description: 'list:group.description',
+ shortDescription: 'list:group.shortDescription'
+ }
});
diff --git a/src/pages/tools/list/reverse/index.tsx b/src/pages/tools/list/reverse/index.tsx
index 9de94f8..0a6e5f9 100644
--- a/src/pages/tools/list/reverse/index.tsx
+++ b/src/pages/tools/list/reverse/index.tsx
@@ -9,6 +9,7 @@ import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import { CardExampleType } from '@components/examples/ToolExamples';
import { ToolComponentProps } from '@tools/defineTool';
import ToolContent from '@components/ToolContent';
+import { useTranslation } from 'react-i18next';
const initialValues = {
splitOperatorType: 'symbol' as SplitOperatorType,
@@ -111,6 +112,7 @@ argument`,
];
export default function Reverse({ title }: ToolComponentProps) {
+ const { t } = useTranslation('list');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -119,15 +121,15 @@ export default function Reverse({ title }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Splitter Mode',
+ title: t('reverse.splitterMode'),
component: (
{splitOperators.map(({ title, description, type }) => (
updateField('splitOperatorType', type)}
- title={title}
- description={description}
+ title={t(`reverse.splitOperators.${type}.title`)}
+ description={t(`reverse.splitOperators.${type}.description`)}
checked={values.splitOperatorType === type}
/>
))}
@@ -135,11 +137,11 @@ export default function Reverse({ title }: ToolComponentProps) {
)
},
{
- title: 'Item Separator',
+ title: t('reverse.itemSeparator'),
component: (
updateField('splitSeparator', val)}
/>
@@ -147,11 +149,11 @@ export default function Reverse({ title }: ToolComponentProps) {
)
},
{
- title: 'Output List Options',
+ title: t('reverse.outputListOptions'),
component: (
updateField('joinSeparator', val)}
/>
@@ -176,15 +178,18 @@ export default function Reverse({ title }: ToolComponentProps) {
input={input}
setInput={setInput}
inputComponent={
-
+
}
resultComponent={
-
+
}
toolInfo={{
- title: 'What Is a List Reverser?',
- description:
- 'With this utility, you can reverse the order of items in a list. The utility first splits the input list into individual items and then iterates through them from the last item to the first item, printing each item to the output during the iteration. The input list may contain anything that can be represented as textual data, which includes digits, numbers, strings, words, sentences, etc. The input item separator can also be a regular expression. For example, the regex /[;,]/ will allow you to use items that are either comma- or semicolon-separated. The input and output list items delimiters can be customized in the options. By default, both input and output lists are comma-separated. Listabulous!'
+ title: t('reverse.toolInfo.title'),
+ description: t('reverse.toolInfo.description')
}}
exampleCards={exampleCards}
/>
diff --git a/src/pages/tools/list/reverse/meta.ts b/src/pages/tools/list/reverse/meta.ts
index 9ff21db..ff500fa 100644
--- a/src/pages/tools/list/reverse/meta.ts
+++ b/src/pages/tools/list/reverse/meta.ts
@@ -3,11 +3,14 @@ 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'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'list:reverse.title',
+ description: 'list:reverse.description',
+ shortDescription: 'list:reverse.shortDescription'
+ }
});
diff --git a/src/pages/tools/list/rotate/meta.ts b/src/pages/tools/list/rotate/meta.ts
index df31e9f..70a0691 100644
--- a/src/pages/tools/list/rotate/meta.ts
+++ b/src/pages/tools/list/rotate/meta.ts
@@ -3,12 +3,14 @@ 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:
- 'A tool to rotate items in a list by a specified number of positions. Shift elements left or right while maintaining their relative order.',
- shortDescription: 'Shift list items by position.',
+
keywords: ['rotate'],
- component: lazy(() => import('./index'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'list:rotate.title',
+ description: 'list:rotate.description',
+ shortDescription: 'list:rotate.shortDescription'
+ }
});
diff --git a/src/pages/tools/list/shuffle/index.tsx b/src/pages/tools/list/shuffle/index.tsx
index 47f0d7e..34e110c 100644
--- a/src/pages/tools/list/shuffle/index.tsx
+++ b/src/pages/tools/list/shuffle/index.tsx
@@ -7,6 +7,7 @@ import { shuffleList, SplitOperatorType } from './service';
import SimpleRadio from '@components/options/SimpleRadio';
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import { isNumber } from '@utils/string';
+import { useTranslation } from 'react-i18next';
const initialValues = {
splitOperatorType: 'symbol' as SplitOperatorType,
@@ -32,6 +33,7 @@ const splitOperators: {
];
export default function Shuffle() {
+ const { t } = useTranslation('list');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
const compute = (optionsValues: typeof initialValues, input: any) => {
@@ -51,20 +53,24 @@ export default function Shuffle() {
return (
+
}
resultComponent={
-
+
}
getGroups={({ values, updateField }) => [
{
- title: 'Input list separator',
+ title: t('shuffle.inputListSeparator'),
component: (
{splitOperators.map(({ title, description, type }) => (
@@ -77,7 +83,7 @@ export default function Shuffle() {
/>
))}
updateField('splitSeparator', val)}
/>
@@ -85,11 +91,11 @@ export default function Shuffle() {
)
},
{
- title: 'Shuffled List Length',
+ title: t('shuffle.shuffledListLength'),
component: (
updateField('length', val)}
/>
@@ -97,13 +103,13 @@ export default function Shuffle() {
)
},
{
- title: 'Shuffled List Separator',
+ title: t('shuffle.shuffledListSeparator'),
component: (
updateField('joinSeparator', value)}
- description={'Use this separator in the randomized list.'}
+ description={t('shuffle.joinSeparatorDescription')}
/>
)
diff --git a/src/pages/tools/list/shuffle/meta.ts b/src/pages/tools/list/shuffle/meta.ts
index de29b67..bb01cd7 100644
--- a/src/pages/tools/list/shuffle/meta.ts
+++ b/src/pages/tools/list/shuffle/meta.ts
@@ -3,12 +3,14 @@ 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:
- 'A tool to randomly reorder items in a list. Perfect for randomizing data, creating random selections, or generating random sequences.',
- shortDescription: 'Randomly reorder list items.',
+
keywords: ['shuffle'],
- component: lazy(() => import('./index'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'list:shuffle.title',
+ description: 'list:shuffle.description',
+ shortDescription: 'list:shuffle.shortDescription'
+ }
});
diff --git a/src/pages/tools/list/sort/index.tsx b/src/pages/tools/list/sort/index.tsx
index 81e4414..1567e81 100644
--- a/src/pages/tools/list/sort/index.tsx
+++ b/src/pages/tools/list/sort/index.tsx
@@ -9,6 +9,7 @@ import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
import SelectWithDesc from '@components/options/SelectWithDesc';
import ToolContent from '@components/ToolContent';
import { ToolComponentProps } from '@tools/defineTool';
+import { useTranslation } from 'react-i18next';
const initialValues = {
splitSeparatorType: 'symbol' as SplitOperatorType,
@@ -36,7 +37,8 @@ const splitOperators: {
}
];
-export default function SplitText({ title }: ToolComponentProps) {
+export default function SortList({ title }: ToolComponentProps) {
+ const { t } = useTranslation('list');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
const compute = (optionsValues: typeof initialValues, input: any) => {
@@ -69,26 +71,32 @@ export default function SplitText({ title }: ToolComponentProps) {
title={title}
input={input}
inputComponent={
-
+
+ }
+ resultComponent={
+
}
- resultComponent={ }
initialValues={initialValues}
getGroups={({ values, updateField }) => [
{
- title: 'Input item separator',
+ title: t('sort.inputItemSeparator'),
component: (
{splitOperators.map(({ title, description, type }) => (
updateField('splitSeparatorType', type)}
- title={title}
- description={description}
+ title={t(`sort.splitOperators.${type}.title`)}
+ description={t(`sort.splitOperators.${type}.description`)}
checked={values.splitSeparatorType === type}
/>
))}
updateField('splitSeparator', val)}
/>
@@ -96,35 +104,45 @@ export default function SplitText({ title }: ToolComponentProps) {
)
},
{
- title: 'Sort method',
+ title: t('sort.sortMethod'),
component: (
updateField('sortingMethod', value)}
- description={'Select a sorting method.'}
+ description={t('sort.sortMethodDescription')}
/>
{
updateField('increasing', value);
}}
- description={'Select a sorting order.'}
+ description={t('sort.orderDescription')}
/>
updateField('caseSensitive', val)}
/>
@@ -132,19 +150,17 @@ export default function SplitText({ title }: ToolComponentProps) {
)
},
{
- title: 'Sorted item properties',
+ title: t('sort.sortedItemProperties'),
component: (
updateField('joinSeparator', val)}
/>
updateField('removeDuplicated', val)}
/>
diff --git a/src/pages/tools/list/sort/meta.ts b/src/pages/tools/list/sort/meta.ts
index b2e7cfc..6b7fac3 100644
--- a/src/pages/tools/list/sort/meta.ts
+++ b/src/pages/tools/list/sort/meta.ts
@@ -3,12 +3,14 @@ import { lazy } from 'react';
// import image from '@assets/text.png';
export const tool = defineTool('list', {
- name: 'Sort',
path: 'sort',
- icon: 'basil:sort-outline',
- description:
- 'This is a super simple browser-based application that sorts items in a list and arranges them in increasing or decreasing order. You can sort the items alphabetically, numerically, or by their length. You can also remove duplicate and empty items, as well as trim individual items that have whitespace around them. You can use any separator character to separate the input list items or alternatively use a regular expression to separate them. Additionally, you can create a new delimiter for the sorted output list.',
- shortDescription: 'Quickly sort a list',
+ icon: 'material-symbols-light:sort',
+
keywords: ['sort'],
- component: lazy(() => import('./index'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'list:sort.title',
+ description: 'list:sort.description',
+ shortDescription: 'list:sort.shortDescription'
+ }
});
diff --git a/src/pages/tools/list/truncate/meta.ts b/src/pages/tools/list/truncate/meta.ts
index 00d44a2..8e42e91 100644
--- a/src/pages/tools/list/truncate/meta.ts
+++ b/src/pages/tools/list/truncate/meta.ts
@@ -2,12 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('list', {
- name: 'Truncate',
path: 'truncate',
- icon: 'mdi:format-horizontal-align-right',
- description:
- "World's simplest browser-based utility for truncating lists. Quickly limit the number of items in your list by specifying a maximum length. Perfect for sampling data, creating previews, or managing large lists. Supports custom separators and various truncation options.",
- shortDescription: 'Limit the number of items in a list',
+ icon: 'material-symbols-light:content-cut',
+
keywords: ['truncate'],
- component: lazy(() => import('./index'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'list:truncate.title',
+ description: 'list:truncate.description',
+ shortDescription: 'list:truncate.shortDescription'
+ }
});
diff --git a/src/pages/tools/list/unwrap/meta.ts b/src/pages/tools/list/unwrap/meta.ts
index 2871bf0..9f52494 100644
--- a/src/pages/tools/list/unwrap/meta.ts
+++ b/src/pages/tools/list/unwrap/meta.ts
@@ -3,12 +3,14 @@ import { lazy } from 'react';
// import image from '@assets/text.png';
export const tool = defineTool('list', {
- name: 'Unwrap',
path: 'unwrap',
- icon: 'mdi:unwrap',
- description:
- 'A tool to remove characters from the beginning and end of each item in a list. Perfect for cleaning up formatted data or removing unwanted wrappers.',
- shortDescription: 'Remove characters around list items.',
+ icon: 'material-symbols-light:unfold-more',
+
keywords: ['unwrap'],
- component: lazy(() => import('./index'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'list:unwrap.title',
+ description: 'list:unwrap.description',
+ shortDescription: 'list:unwrap.shortDescription'
+ }
});
diff --git a/src/pages/tools/list/wrap/index.tsx b/src/pages/tools/list/wrap/index.tsx
index dec2ae7..e616b20 100644
--- a/src/pages/tools/list/wrap/index.tsx
+++ b/src/pages/tools/list/wrap/index.tsx
@@ -11,6 +11,7 @@ import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import SimpleRadio from '@components/options/SimpleRadio';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
import * as Yup from 'yup';
+import { useTranslation } from 'react-i18next';
interface InitialValuesType {
splitOperatorType: SplitOperatorType;
@@ -85,6 +86,7 @@ const exampleCards: CardExampleType[] = [
];
export default function Wrap({ title }: ToolComponentProps) {
+ const { t } = useTranslation('list');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -117,50 +119,50 @@ export default function Wrap({ title }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Split Options',
+ title: t('wrap.splitOptions'),
component: (
updateField('splitOperatorType', 'symbol')}
checked={values.splitOperatorType === 'symbol'}
- title={'Split by Symbol'}
+ title={t('wrap.splitBySymbol')}
/>
updateField('splitOperatorType', 'regex')}
checked={values.splitOperatorType === 'regex'}
- title={'Split by Regular Expression'}
+ title={t('wrap.splitByRegex')}
/>
updateField('splitSeparator', val)}
- description={'Separator to split the list'}
+ description={t('wrap.splitSeparatorDescription')}
/>
updateField('joinSeparator', val)}
- description={'Separator to join the wrapped list'}
+ description={t('wrap.joinSeparatorDescription')}
/>
updateField('deleteEmptyItems', checked)}
- title={'Remove empty items'}
+ title={t('wrap.removeEmptyItems')}
/>
)
},
{
- title: 'Wrap Options',
+ title: t('wrap.wrapOptions'),
component: (
updateField('left', val)}
- description={'Text to add before each item'}
+ description={t('wrap.leftTextDescription')}
/>
updateField('right', val)}
- description={'Text to add after each item'}
+ description={t('wrap.rightTextDescription')}
/>
)
@@ -171,16 +173,21 @@ export default function Wrap({ title }: ToolComponentProps) {
+
+ }
+ resultComponent={
+
}
- resultComponent={ }
initialValues={initialValues}
getGroups={getGroups}
validationSchema={validationSchema}
toolInfo={{
- title: 'List Wrapping',
- description:
- "This tool allows you to add text before and after each item in a list. You can specify different text for the left and right sides, and control how the list is processed. It's useful for adding quotes, brackets, or other formatting to list items, preparing data for different formats, or creating structured text."
+ title: t('wrap.toolInfo.title'),
+ description: t('wrap.toolInfo.description')
}}
exampleCards={exampleCards}
input={input}
diff --git a/src/pages/tools/list/wrap/meta.ts b/src/pages/tools/list/wrap/meta.ts
index 331f50b..de7783a 100644
--- a/src/pages/tools/list/wrap/meta.ts
+++ b/src/pages/tools/list/wrap/meta.ts
@@ -3,12 +3,14 @@ import { lazy } from 'react';
// import image from '@assets/text.png';
export const tool = defineTool('list', {
- name: 'Wrap',
path: 'wrap',
- icon: 'mdi:wrap',
- description:
- 'A tool to wrap each item in a list with custom prefix and suffix characters. Useful for formatting lists for code, markup languages, or presentation.',
- shortDescription: 'Add characters around list items.',
+ icon: 'material-symbols-light:wrap-text',
+
keywords: ['wrap'],
- component: lazy(() => import('./index'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'list:wrap.title',
+ description: 'list:wrap.description',
+ shortDescription: 'list:wrap.shortDescription'
+ }
});
diff --git a/src/pages/tools/number/arithmetic-sequence/index.tsx b/src/pages/tools/number/arithmetic-sequence/index.tsx
index 6835d99..498528d 100644
--- a/src/pages/tools/number/arithmetic-sequence/index.tsx
+++ b/src/pages/tools/number/arithmetic-sequence/index.tsx
@@ -7,6 +7,7 @@ import { generateArithmeticSequence } from './service';
import * as Yup from 'yup';
import { CardExampleType } from '@components/examples/ToolExamples';
import { ToolComponentProps } from '@tools/defineTool';
+import { useTranslation } from 'react-i18next';
type InitialValuesType = {
firstTerm: string;
@@ -70,6 +71,7 @@ const exampleCards: CardExampleType[] = [
];
export default function ArithmeticSequence({ title }: ToolComponentProps) {
+ const { t } = useTranslation('number');
const [result, setResult] = useState('');
return (
@@ -77,35 +79,39 @@ export default function ArithmeticSequence({ title }: ToolComponentProps) {
title={title}
inputComponent={null}
resultComponent={
-
+
}
initialValues={initialValues}
validationSchema={validationSchema}
exampleCards={exampleCards}
toolInfo={{
- title: 'What is an Arithmetic Sequence?',
- description:
- 'An arithmetic sequence is a sequence of numbers where the difference between each consecutive term is constant. This constant difference is called the common difference. Given the first term (a₁) and the common difference (d), each term can be found by adding the common difference to the previous term.'
+ title: t('arithmeticSequence.toolInfo.title'),
+ description: t('arithmeticSequence.toolInfo.description')
}}
getGroups={({ values, updateField }) => [
{
- title: 'Sequence Parameters',
+ title: t('arithmeticSequence.sequenceParameters'),
component: (
updateField('firstTerm', val)}
type="number"
/>
updateField('commonDifference', val)}
type="number"
/>
updateField('numberOfTerms', val)}
type="number"
@@ -114,10 +120,10 @@ export default function ArithmeticSequence({ title }: ToolComponentProps) {
)
},
{
- title: 'Output Format',
+ title: t('arithmeticSequence.outputFormat'),
component: (
updateField('separator', val)}
/>
diff --git a/src/pages/tools/number/arithmetic-sequence/meta.ts b/src/pages/tools/number/arithmetic-sequence/meta.ts
index 2423600..20a14b6 100644
--- a/src/pages/tools/number/arithmetic-sequence/meta.ts
+++ b/src/pages/tools/number/arithmetic-sequence/meta.ts
@@ -2,20 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('number', {
- name: 'Generate Arithmetic Sequence',
path: 'arithmetic-sequence',
- icon: 'ic:sharp-plus',
- description:
- 'Generate an arithmetic sequence by specifying the first term (a₁), common difference (d), and number of terms (n). The tool creates a sequence where each number differs from the previous by a constant difference.',
- shortDescription:
- 'Generate a sequence where each term differs by a constant value.',
- keywords: [
- 'arithmetic',
- 'sequence',
- 'progression',
- 'numbers',
- 'series',
- 'generate'
- ],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:functions',
+
+ keywords: ['arithmetic', 'sequence', 'math', 'progression'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'number:arithmeticSequence.title',
+ description: 'number:arithmeticSequence.description',
+ shortDescription: 'number:arithmeticSequence.shortDescription'
+ }
});
diff --git a/src/pages/tools/number/generate/index.tsx b/src/pages/tools/number/generate/index.tsx
index 7f99d62..44158d0 100644
--- a/src/pages/tools/number/generate/index.tsx
+++ b/src/pages/tools/number/generate/index.tsx
@@ -5,6 +5,7 @@ import { listOfIntegers } from './service';
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import ToolContent from '@components/ToolContent';
import { ToolComponentProps } from '@tools/defineTool';
+import { useTranslation } from 'react-i18next';
const initialValues = {
firstValue: '1',
@@ -14,6 +15,7 @@ const initialValues = {
};
export default function GenerateNumbers({ title }: ToolComponentProps) {
+ const { t } = useTranslation('number');
const [result, setResult] = useState('');
const compute = (optionsValues: typeof initialValues) => {
@@ -34,23 +36,23 @@ export default function GenerateNumbers({ title }: ToolComponentProps) {
initialValues={initialValues}
getGroups={({ values, updateField }) => [
{
- title: 'Arithmetic sequence option',
+ title: t('generate.arithmeticSequenceOption'),
component: (
updateField('firstValue', val)}
type={'number'}
/>
updateField('step', val)}
type={'number'}
/>
updateField('numberOfNumbers', val)}
type={'number'}
@@ -59,12 +61,10 @@ export default function GenerateNumbers({ title }: ToolComponentProps) {
)
},
{
- title: 'Separator',
+ title: t('generate.separator'),
component: (
updateField('separator', val)}
/>
@@ -73,7 +73,7 @@ export default function GenerateNumbers({ title }: ToolComponentProps) {
]}
compute={compute}
resultComponent={
-
+
}
/>
);
diff --git a/src/pages/tools/number/generate/meta.ts b/src/pages/tools/number/generate/meta.ts
index a58e227..3ef2739 100644
--- a/src/pages/tools/number/generate/meta.ts
+++ b/src/pages/tools/number/generate/meta.ts
@@ -3,12 +3,14 @@ import { lazy } from 'react';
// import image from '@assets/text.png';
export const tool = defineTool('number', {
- name: 'Generate numbers',
path: 'generate',
- shortDescription: 'Quickly calculate a list of integers in your browser',
- icon: 'lsicon:number-filled',
- description:
- 'Quickly calculate a list of integers in your browser. To get your list, just specify the first integer, change value and total count in the options below, and this utility will generate that many integers',
- keywords: ['generate'],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:add-circle',
+
+ keywords: ['generate', 'random', 'numbers'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'number:generate.title',
+ description: 'number:generate.description',
+ shortDescription: 'number:generate.shortDescription'
+ }
});
diff --git a/src/pages/tools/number/generic-calc/data/ohmsLaw.ts b/src/pages/tools/number/generic-calc/data/ohmsLaw.ts
index 237c71d..87ed54b 100644
--- a/src/pages/tools/number/generic-calc/data/ohmsLaw.ts
+++ b/src/pages/tools/number/generic-calc/data/ohmsLaw.ts
@@ -13,14 +13,14 @@ 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',
+ description: 'number:ohmsLaw.description',
+ shortDescription: 'number:ohmsLaw.shortDescription',
+ longDescription: 'number:ohmsLaw.longDescription'
+ },
presets: [],
variables: [
{
diff --git a/src/pages/tools/number/generic-calc/data/slackline.ts b/src/pages/tools/number/generic-calc/data/slackline.ts
index 843a110..0d1c7b2 100644
--- a/src/pages/tools/number/generic-calc/data/slackline.ts
+++ b/src/pages/tools/number/generic-calc/data/slackline.ts
@@ -11,14 +11,15 @@ 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: {
+ name: 'number:slackline.title',
+ description: 'number:slackline.description',
+ shortDescription: 'number:slackline.shortDescription',
+ longDescription: 'number:slackline.longDescription'
+ },
variables: [
{
name: 'L',
diff --git a/src/pages/tools/number/generic-calc/data/sphereArea.ts b/src/pages/tools/number/generic-calc/data/sphereArea.ts
index 15a8d13..029a4a6 100644
--- a/src/pages/tools/number/generic-calc/data/sphereArea.ts
+++ b/src/pages/tools/number/generic-calc/data/sphereArea.ts
@@ -13,15 +13,15 @@ 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: {
+ name: 'number:sphereArea.title',
+ description: 'number:sphereArea.description',
+ shortDescription: 'number:sphereArea.shortDescription',
+ longDescription: 'number:sphereArea.longDescription'
+ },
variables: [
{
name: 'A',
diff --git a/src/pages/tools/number/generic-calc/data/sphereVolume.ts b/src/pages/tools/number/generic-calc/data/sphereVolume.ts
index b6132bc..07c629f 100644
--- a/src/pages/tools/number/generic-calc/data/sphereVolume.ts
+++ b/src/pages/tools/number/generic-calc/data/sphereVolume.ts
@@ -14,12 +14,13 @@ 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',
+ shortDescription: 'number:sphereVolume.shortDescription',
+ 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 1fc8c72..3bae1a3 100644
--- a/src/pages/tools/number/generic-calc/data/voltageDropInWire.ts
+++ b/src/pages/tools/number/generic-calc/data/voltageDropInWire.ts
@@ -16,15 +16,14 @@ 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',
- 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.',
+ i18n: {
+ name: 'number:voltageDropInWire.title',
+ description: 'number:voltageDropInWire.description',
+ shortDescription: 'number:voltageDropInWire.shortDescription',
+ longDescription: 'number:voltageDropInWire.longDescription'
+ },
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..c87e090 100644
--- a/src/pages/tools/number/generic-calc/index.tsx
+++ b/src/pages/tools/number/generic-calc/index.tsx
@@ -26,6 +26,8 @@ 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';
+import { validNamespaces } from '../../../../i18n';
function numericSolveEquationFor(
equation: string,
@@ -61,6 +63,7 @@ export default async function makeTool(
return function GenericCalc({ title }: ToolComponentProps) {
const { showSnackBar } = useContext(CustomSnackBarContext);
+ const { t } = useTranslation(validNamespaces);
const theme = useTheme();
const lessThanSmall = useMediaQuery(theme.breakpoints.down('sm'));
@@ -236,8 +239,10 @@ export default async function makeTool(
inputComponent={null}
initialValues={initialValues}
toolInfo={{
- title: calcData.name,
- description: calcData.longDescription
+ title: t(calcData.i18n.name),
+ description: calcData.i18n.longDescription
+ ? t(calcData.i18n.longDescription)
+ : undefined
}}
verticalGroups
// @ts-ignore
diff --git a/src/pages/tools/number/sum/index.tsx b/src/pages/tools/number/sum/index.tsx
index 1b150ba..d649f99 100644
--- a/src/pages/tools/number/sum/index.tsx
+++ b/src/pages/tools/number/sum/index.tsx
@@ -9,6 +9,7 @@ import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
import { CardExampleType } from '@components/examples/ToolExamples';
import { ToolComponentProps } from '@tools/defineTool';
import ToolContent from '@components/ToolContent';
+import { useTranslation } from 'react-i18next';
const initialValues = {
extractionType: 'smart' as NumberExtractionType,
@@ -118,6 +119,7 @@ const exampleCards: CardExampleType[] = [
];
export default function SumNumbers({ title }: ToolComponentProps) {
+ const { t } = useTranslation('number');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -126,16 +128,16 @@ export default function SumNumbers({ title }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Number extraction',
+ title: t('sum.numberExtraction'),
component: extractionTypes.map(
({ title, description, type, withTextField, textValueAccessor }) =>
withTextField ? (
updateField('extractionType', type)}
checked={values.extractionType === type}
- description={description}
- title={title}
+ description={t(`sum.extractionTypes.${type}.description`)}
+ title={t(`sum.extractionTypes.${type}.title`)}
/>
)
)
},
{
- title: 'Running Sum',
+ title: t('sum.runningSum'),
component: (
updateField('printRunningSum', value)}
/>
@@ -171,8 +173,16 @@ export default function SumNumbers({ title }: ToolComponentProps) {
}
- resultComponent={ }
+ inputComponent={
+
+ }
+ resultComponent={
+
+ }
initialValues={initialValues}
getGroups={getGroups}
compute={(optionsValues, input) => {
@@ -181,9 +191,8 @@ export default function SumNumbers({ title }: ToolComponentProps) {
}}
setInput={setInput}
toolInfo={{
- title: 'What Is a Number Sum Calculator?',
- description:
- 'This is an online browser-based utility for calculating the sum of a bunch of numbers. You can enter the numbers separated by a comma, space, or any other character, including the line break. You can also simply paste a fragment of textual data that contains numerical values that you want to sum up and the utility will extract them and find their sum.'
+ title: t('sum.toolInfo.title'),
+ description: t('sum.toolInfo.description')
}}
exampleCards={exampleCards}
/>
diff --git a/src/pages/tools/number/sum/meta.ts b/src/pages/tools/number/sum/meta.ts
index 02de1f1..4b7b9b9 100644
--- a/src/pages/tools/number/sum/meta.ts
+++ b/src/pages/tools/number/sum/meta.ts
@@ -3,12 +3,14 @@ import { lazy } from 'react';
// import image from '@assets/text.png';
export const tool = defineTool('number', {
- name: 'Number Sum Calculator',
path: 'sum',
- icon: 'fluent:autosum-20-regular',
- description:
- 'Quickly calculate the sum of numbers in your browser. To get your sum, just enter your list of numbers in the input field, adjust the separator between the numbers in the options below, and this utility will add up all these numbers.',
- shortDescription: 'Quickly sum numbers',
- keywords: ['sum'],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:add',
+
+ keywords: ['sum', 'add', 'calculate', 'total'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'number:sum.title',
+ description: 'number:sum.description',
+ shortDescription: 'number:sum.shortDescription'
+ }
});
diff --git a/src/pages/tools/pdf/compress-pdf/index.tsx b/src/pages/tools/pdf/compress-pdf/index.tsx
index c5a8b2c..53f2731 100644
--- a/src/pages/tools/pdf/compress-pdf/index.tsx
+++ b/src/pages/tools/pdf/compress-pdf/index.tsx
@@ -1,24 +1,26 @@
import { Box, Typography } from '@mui/material';
-import React, { useContext, useEffect, useState } from 'react';
+import React, { useState, useEffect, useContext } from 'react';
import ToolContent from '@components/ToolContent';
import { ToolComponentProps } from '@tools/defineTool';
+import { compressPdf } from './service';
+import { InitialValuesType, CompressionLevel } from './types';
import ToolPdfInput from '@components/input/ToolPdfInput';
+import { GetGroupsType } from '@components/options/ToolOptions';
import ToolFileResult from '@components/result/ToolFileResult';
+import SimpleRadio from '@components/options/SimpleRadio';
import { CardExampleType } from '@components/examples/ToolExamples';
import { PDFDocument } from 'pdf-lib';
-import { CompressionLevel, InitialValuesType } from './types';
-import { compressPdf } from './service';
-import SimpleRadio from '@components/options/SimpleRadio';
import { CustomSnackBarContext } from '../../../../contexts/CustomSnackBarContext';
+import { useTranslation } from 'react-i18next';
const initialValues: InitialValuesType = {
- compressionLevel: 'medium'
+ compressionLevel: 'low'
};
const exampleCards: CardExampleType[] = [
{
title: 'Low Compression',
- description: 'Slightly reduce file size with minimal quality loss',
+ description: 'Minimal quality loss with slight file size reduction',
sampleText: '',
sampleResult: '',
sampleOptions: {
@@ -49,6 +51,7 @@ export default function CompressPdf({
title,
longDescription
}: ToolComponentProps) {
+ const { t } = useTranslation('pdf');
const [input, setInput] = useState(null);
const [result, setResult] = useState(null);
const [resultSize, setResultSize] = useState('');
@@ -77,10 +80,7 @@ export default function CompressPdf({
} catch (error) {
console.error('Error getting PDF info:', error);
setFileInfo(null);
- showSnackBar(
- 'Error reading PDF file. Please make sure it is a valid PDF.',
- 'error'
- );
+ showSnackBar(t('compressPdf.errorReadingPdf'), 'error');
}
};
@@ -112,9 +112,9 @@ export default function CompressPdf({
} catch (error) {
console.error('Error compressing PDF:', error);
showSnackBar(
- `Failed to compress PDF: ${
- error instanceof Error ? error.message : String(error)
- }`,
+ t('compressPdf.errorCompressingPdf', {
+ error: error instanceof Error ? error.message : String(error)
+ }),
'error'
);
setResult(null);
@@ -130,18 +130,18 @@ export default function CompressPdf({
}[] = [
{
value: 'low',
- label: 'Low Compression',
- description: 'Slightly reduce file size with minimal quality loss'
+ label: t('compressPdf.lowCompression'),
+ description: t('compressPdf.lowCompressionDescription')
},
{
value: 'medium',
- label: 'Medium Compression',
- description: 'Balance between file size and quality'
+ label: t('compressPdf.mediumCompression'),
+ description: t('compressPdf.mediumCompressionDescription')
},
{
value: 'high',
- label: 'High Compression',
- description: 'Maximum file size reduction with some quality loss'
+ label: t('compressPdf.highCompression'),
+ description: t('compressPdf.highCompressionDescription')
}
];
@@ -157,26 +157,26 @@ export default function CompressPdf({
value={input}
onChange={setInput}
accept={['application/pdf']}
- title={'Input PDF'}
+ title={t('compressPdf.inputTitle')}
/>
}
resultComponent={
}
getGroups={({ values, updateField }) => [
{
- title: 'Compression Settings',
+ title: t('compressPdf.compressionSettings'),
component: (
- Compression Level
+ {t('compressPdf.compressionLevel')}
{compressionOptions.map((option) => (
@@ -201,14 +201,16 @@ export default function CompressPdf({
}}
>
- File size: {fileInfo.size}
+ {t('compressPdf.fileSize')}:{' '}
+ {fileInfo.size}
- Pages: {fileInfo.pages}
+ {t('compressPdf.pages')}: {fileInfo.pages}
{resultSize && (
- Compressed file size: {resultSize}
+ {t('compressPdf.compressedFileSize')}:{' '}
+ {resultSize}
)}
diff --git a/src/pages/tools/pdf/compress-pdf/meta.ts b/src/pages/tools/pdf/compress-pdf/meta.ts
index cbd608a..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,7 +19,11 @@ 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'))
+
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'pdf:compressPdf.title',
+ description: 'pdf:compressPdf.description',
+ shortDescription: 'pdf:compressPdf.shortDescription'
+ }
});
diff --git a/src/pages/tools/pdf/editor/meta.ts b/src/pages/tools/pdf/editor/meta.ts
index 8bb1ee0..9d9901f 100644
--- a/src/pages/tools/pdf/editor/meta.ts
+++ b/src/pages/tools/pdf/editor/meta.ts
@@ -2,13 +2,15 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('pdf', {
- name: 'PDF Editor',
+ i18n: {
+ name: 'pdf:editor.title',
+ description: 'pdf:editor.description',
+ shortDescription: 'pdf:editor.shortDescription'
+ },
+
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/index.tsx b/src/pages/tools/pdf/merge-pdf/index.tsx
index 789da77..9510209 100644
--- a/src/pages/tools/pdf/merge-pdf/index.tsx
+++ b/src/pages/tools/pdf/merge-pdf/index.tsx
@@ -6,8 +6,10 @@ import { mergePdf } from './service';
import ToolMultiPdfInput, {
MultiPdfInput
} from '@components/input/ToolMultiplePdfInput';
+import { useTranslation } from 'react-i18next';
export default function MergePdf({ title }: ToolComponentProps) {
+ const { t } = useTranslation('pdf');
const [input, setInput] = useState([]);
const [result, setResult] = useState(null);
const [isProcessing, setIsProcessing] = useState(false);
@@ -42,24 +44,23 @@ export default function MergePdf({ title }: ToolComponentProps) {
setInput(pdfInputs);
}}
accept={['application/pdf']}
- title={'Input PDF'}
+ title={t('merge.inputTitle')}
type="pdf"
/>
}
getGroups={null}
resultComponent={
}
toolInfo={{
- title: 'How to Use the Merge PDF Tool?',
- description: `This tool allows you to merge multiple PDF files into a single document.
- To use the tool, simply upload the PDF files you want to merge. The tool will then combine all pages from the input files into a single PDF document.`
+ title: t('merge.toolInfo.title'),
+ description: t('merge.toolInfo.description')
}}
/>
);
diff --git a/src/pages/tools/pdf/merge-pdf/meta.ts b/src/pages/tools/pdf/merge-pdf/meta.ts
index 5820f61..b393bf2 100644
--- a/src/pages/tools/pdf/merge-pdf/meta.ts
+++ b/src/pages/tools/pdf/merge-pdf/meta.ts
@@ -2,11 +2,13 @@ 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'],
- path: 'merge-pdf'
+ path: 'merge-pdf',
+ i18n: {
+ name: 'pdf:mergePdf.title',
+ description: 'pdf:mergePdf.description',
+ shortDescription: 'pdf:mergePdf.shortDescription'
+ }
});
diff --git a/src/pages/tools/pdf/pdf-to-epub/meta.ts b/src/pages/tools/pdf/pdf-to-epub/meta.ts
index 7f24758..411814f 100644
--- a/src/pages/tools/pdf/pdf-to-epub/meta.ts
+++ b/src/pages/tools/pdf/pdf-to-epub/meta.ts
@@ -2,12 +2,13 @@ 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'],
- path: 'pdf-to-epub'
+ path: 'pdf-to-epub',
+ i18n: {
+ name: 'pdf:pdfToEpub.title',
+ description: 'pdf:pdfToEpub.description',
+ shortDescription: 'pdf:pdfToEpub.shortDescription'
+ }
});
diff --git a/src/pages/tools/pdf/pdf-to-png/meta.ts b/src/pages/tools/pdf/pdf-to-png/meta.ts
index 1960368..dc3efb5 100644
--- a/src/pages/tools/pdf/pdf-to-png/meta.ts
+++ b/src/pages/tools/pdf/pdf-to-png/meta.ts
@@ -2,13 +2,17 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('pdf', {
- name: 'PDF to PNG',
+ i18n: {
+ name: 'pdf:pdfToPng.title',
+ description: 'pdf:pdfToPng.description',
+ shortDescription: 'pdf:pdfToPng.shortDescription',
+ longDescription: 'pdf:pdfToPng.longDescription'
+ },
+
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 51ecd53..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,7 +18,11 @@ 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'))
+
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'pdf:protectPdf.title',
+ description: 'pdf:protectPdf.description',
+ shortDescription: 'pdf:protectPdf.shortDescription'
+ }
});
diff --git a/src/pages/tools/pdf/rotate-pdf/index.tsx b/src/pages/tools/pdf/rotate-pdf/index.tsx
index 2e41f2a..a262805 100644
--- a/src/pages/tools/pdf/rotate-pdf/index.tsx
+++ b/src/pages/tools/pdf/rotate-pdf/index.tsx
@@ -1,16 +1,16 @@
-import { Box, FormControlLabel, Switch, Typography } from '@mui/material';
-import React, { useEffect, useState } from 'react';
+import { Box, Typography, FormControlLabel, Switch } from '@mui/material';
+import { useEffect, useState } from 'react';
+import ToolFileResult from '@components/result/ToolFileResult';
+import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import ToolContent from '@components/ToolContent';
import { ToolComponentProps } from '@tools/defineTool';
-import ToolPdfInput from '@components/input/ToolPdfInput';
-import ToolFileResult from '@components/result/ToolFileResult';
+import { parsePageRanges, rotatePdf } from './service';
import { CardExampleType } from '@components/examples/ToolExamples';
import { PDFDocument } from 'pdf-lib';
-import { InitialValuesType, RotationAngle } from './types';
-import { parsePageRanges, rotatePdf } from './service';
+import ToolPdfInput from '@components/input/ToolPdfInput';
import SimpleRadio from '@components/options/SimpleRadio';
-import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
-import { isArray } from 'lodash';
+import { InitialValuesType, RotationAngle } from './types';
+import { useTranslation } from 'react-i18next';
const initialValues: InitialValuesType = {
rotationAngle: 90,
@@ -21,7 +21,7 @@ const initialValues: InitialValuesType = {
const exampleCards: CardExampleType[] = [
{
title: 'Rotate All Pages 90°',
- description: 'Rotate all pages in the document 90 degrees clockwise',
+ description: 'Rotate all pages in the PDF by 90 degrees clockwise',
sampleText: '',
sampleResult: '',
sampleOptions: {
@@ -32,7 +32,7 @@ const exampleCards: CardExampleType[] = [
},
{
title: 'Rotate Specific Pages 180°',
- description: 'Rotate only pages 1 and 3 by 180 degrees',
+ description: 'Rotate pages 1 and 3 by 180 degrees',
sampleText: '',
sampleResult: '',
sampleOptions: {
@@ -58,6 +58,7 @@ export default function RotatePdf({
title,
longDescription
}: ToolComponentProps) {
+ const { t } = useTranslation('pdf');
const [input, setInput] = useState(null);
const [result, setResult] = useState(null);
const [isProcessing, setIsProcessing] = useState(false);
@@ -90,7 +91,9 @@ export default function RotatePdf({
if (applyToAllPages) {
setPageRangePreview(
- totalPages > 0 ? `All ${totalPages} pages will be rotated` : ''
+ totalPages > 0
+ ? t('rotatePdf.allPagesWillBeRotated', { count: totalPages })
+ : ''
);
return;
}
@@ -102,9 +105,7 @@ export default function RotatePdf({
try {
const count = parsePageRanges(pageRanges, totalPages).length;
- setPageRangePreview(
- `${count} page${count !== 1 ? 's' : ''} will be rotated`
- );
+ setPageRangePreview(t('rotatePdf.pagesWillBeRotated', { count }));
} catch (error) {
setPageRangePreview('');
}
@@ -124,9 +125,9 @@ export default function RotatePdf({
}
};
const angleOptions: { value: RotationAngle; label: string }[] = [
- { value: 90, label: '90° Clockwise' },
- { value: 180, label: '180° (Upside down)' },
- { value: 270, label: '270° (90° Counter-clockwise)' }
+ { value: 90, label: t('rotatePdf.angleOptions.clockwise90') },
+ { value: 180, label: t('rotatePdf.angleOptions.upsideDown180') },
+ { value: 270, label: t('rotatePdf.angleOptions.counterClockwise270') }
];
return (
}
resultComponent={
}
getGroups={({ values, updateField }) => [
{
- title: 'Rotation Settings',
+ title: t('rotatePdf.rotationSettings'),
component: (
- Rotation Angle
+ {t('rotatePdf.rotationAngle')}
{angleOptions.map((angleOption) => (
}
- label="Apply to all pages"
+ label={t('rotatePdf.applyToAllPages')}
/>
@@ -190,7 +191,7 @@ export default function RotatePdf({
{totalPages > 0 && (
- PDF has {totalPages} page{totalPages !== 1 ? 's' : ''}
+ {t('rotatePdf.pdfPageCount', { count: totalPages })}
)}
{
updateField('pageRanges', val);
}}
- description={
- 'Enter page numbers or ranges separated by commas (e.g., 1,3,5-7)'
- }
- placeholder={'e.g., 1,5-8'}
+ description={t('rotatePdf.pageRangesDescription')}
+ placeholder={t('rotatePdf.pageRangesPlaceholder')}
/>
{pageRangePreview && (
);
diff --git a/src/pages/tools/pdf/rotate-pdf/meta.ts b/src/pages/tools/pdf/rotate-pdf/meta.ts
index 8dc71a1..f0ab83f 100644
--- a/src/pages/tools/pdf/rotate-pdf/meta.ts
+++ b/src/pages/tools/pdf/rotate-pdf/meta.ts
@@ -2,13 +2,17 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('pdf', {
- name: 'Rotate PDF',
+ i18n: {
+ name: 'pdf:rotatePdf.title',
+ description: 'pdf:rotatePdf.description',
+ shortDescription: 'pdf:rotatePdf.shortDescription',
+ longDescription: 'pdf:rotatePdf.longDescription'
+ },
+
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/index.tsx b/src/pages/tools/pdf/split-pdf/index.tsx
index 3ceacbd..85beed0 100644
--- a/src/pages/tools/pdf/split-pdf/index.tsx
+++ b/src/pages/tools/pdf/split-pdf/index.tsx
@@ -8,6 +8,7 @@ import { parsePageRanges, splitPdf } from './service';
import { CardExampleType } from '@components/examples/ToolExamples';
import { PDFDocument } from 'pdf-lib';
import ToolPdfInput from '@components/input/ToolPdfInput';
+import { useTranslation } from 'react-i18next';
type InitialValuesType = {
pageRanges: string;
@@ -48,6 +49,7 @@ const exampleCards: CardExampleType[] = [
];
export default function SplitPdf({ title }: ToolComponentProps) {
+ const { t } = useTranslation('pdf');
const [input, setInput] = useState(null);
const [result, setResult] = useState(null);
const [isProcessing, setIsProcessing] = useState(false);
@@ -83,9 +85,7 @@ export default function SplitPdf({ title }: ToolComponentProps) {
}
try {
const count = parsePageRanges(pageRanges, totalPages).length;
- setPageRangePreview(
- `${count} page${count !== 1 ? 's' : ''} will be extracted`
- );
+ setPageRangePreview(t('splitPdf.pageExtractionPreview', { count }));
} catch (error) {
setPageRangePreview('');
}
@@ -118,26 +118,26 @@ export default function SplitPdf({ title }: ToolComponentProps) {
value={input}
onChange={setInput}
accept={['application/pdf']}
- title={'Input PDF'}
+ title={t('splitPdf.inputTitle')}
/>
}
resultComponent={
}
getGroups={({ values, updateField }) => [
{
- title: 'Page Selection',
+ title: t('splitPdf.pageSelection'),
component: (
{totalPages > 0 && (
- PDF has {totalPages} page{totalPages !== 1 ? 's' : ''}
+ {t('splitPdf.pdfPageCount', { count: totalPages })}
)}
{
updateField('pageRanges', val);
}}
- description={
- 'Enter page numbers or ranges separated by commas (e.g., 1,3,5-7)'
- }
- placeholder={'e.g., 1,5-8'}
+ description={t('splitPdf.pageRangesDescription')}
+ placeholder={t('splitPdf.pageRangesPlaceholder')}
/>
{pageRangePreview && (
);
diff --git a/src/pages/tools/pdf/split-pdf/meta.ts b/src/pages/tools/pdf/split-pdf/meta.ts
index 25b3d4c..04d8ac2 100644
--- a/src/pages/tools/pdf/split-pdf/meta.ts
+++ b/src/pages/tools/pdf/split-pdf/meta.ts
@@ -2,12 +2,13 @@ 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'],
- path: 'split-pdf'
+ path: 'split-pdf',
+ i18n: {
+ name: 'pdf:splitPdf.title',
+ description: 'pdf:splitPdf.description',
+ shortDescription: 'pdf:splitPdf.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/base64/index.tsx b/src/pages/tools/string/base64/index.tsx
index 6176367..1a6d208 100644
--- a/src/pages/tools/string/base64/index.tsx
+++ b/src/pages/tools/string/base64/index.tsx
@@ -9,6 +9,7 @@ import { GetGroupsType } from '@components/options/ToolOptions';
import { Box } from '@mui/material';
import SimpleRadio from '@components/options/SimpleRadio';
import { InitialValuesType } from './types';
+import { useTranslation } from 'react-i18next';
const initialValues: InitialValuesType = {
mode: 'encode'
@@ -33,6 +34,7 @@ const exampleCards: CardExampleType[] = [
];
export default function Base64({ title }: ToolComponentProps) {
+ const { t } = useTranslation('string');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -45,18 +47,18 @@ export default function Base64({ title }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Base64 Options',
+ title: t('base64.optionsTitle'),
component: (
updateField('mode', 'encode')}
checked={values.mode === 'encode'}
- title={'Base64 Encode'}
+ title={t('base64.encode')}
/>
updateField('mode', 'decode')}
checked={values.mode === 'decode'}
- title={'Base64 Decode'}
+ title={t('base64.decode')}
/>
)
@@ -67,15 +69,20 @@ export default function Base64({ title }: ToolComponentProps) {
+
+ }
+ resultComponent={
+
}
- resultComponent={ }
initialValues={initialValues}
getGroups={getGroups}
toolInfo={{
- title: 'What is Base64?',
- description:
- 'Base64 is an encoding scheme that represents data in an ASCII string format by translating it into a radix-64 representation. Although it can be used to encode strings, it is commonly used to encode binary data for transmission over media that are designed to deal with textual data.'
+ title: t('base64.toolInfo.title'),
+ description: t('base64.toolInfo.description')
}}
exampleCards={exampleCards}
input={input}
diff --git a/src/pages/tools/string/base64/meta.ts b/src/pages/tools/string/base64/meta.ts
index 31a9337..a334e77 100644
--- a/src/pages/tools/string/base64/meta.ts
+++ b/src/pages/tools/string/base64/meta.ts
@@ -2,12 +2,14 @@ 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'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:base64.title',
+ description: 'string:base64.description',
+ shortDescription: 'string:base64.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/censor/meta.ts b/src/pages/tools/string/censor/meta.ts
index 0a7e6d0..bda557b 100644
--- a/src/pages/tools/string/censor/meta.ts
+++ b/src/pages/tools/string/censor/meta.ts
@@ -2,15 +2,15 @@ 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'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:censor.title',
+ description: 'string:censor.description',
+ shortDescription: 'string:censor.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/create-palindrome/meta.ts b/src/pages/tools/string/create-palindrome/meta.ts
index cee5acc..cadd578 100644
--- a/src/pages/tools/string/create-palindrome/meta.ts
+++ b/src/pages/tools/string/create-palindrome/meta.ts
@@ -3,14 +3,14 @@ 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'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:createPalindrome.title',
+ description: 'string:createPalindrome.description',
+ shortDescription: 'string:createPalindrome.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/extract-substring/meta.ts b/src/pages/tools/string/extract-substring/meta.ts
index a8a6eee..7a7a361 100644
--- a/src/pages/tools/string/extract-substring/meta.ts
+++ b/src/pages/tools/string/extract-substring/meta.ts
@@ -3,12 +3,14 @@ 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. Easily extract specific portions of text by specifying start position and length. Perfect for parsing data, isolating specific parts of text, or data extraction tasks. Supports multi-line text processing and character-level precision.",
- shortDescription: 'Extract specific portions of text by position and length',
+
keywords: ['extract', 'substring'],
- component: lazy(() => import('./index'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:extractSubstring.title',
+ description: 'string:extractSubstring.description',
+ shortDescription: 'string:extractSubstring.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/index.ts b/src/pages/tools/string/index.ts
index e4979fc..0ded96d 100644
--- a/src/pages/tools/string/index.ts
+++ b/src/pages/tools/string/index.ts
@@ -17,6 +17,7 @@ import { tool as stringTruncate } from './truncate/meta';
import { tool as stringBase64 } from './base64/meta';
import { tool as stringStatistic } from './statistic/meta';
import { tool as stringCensor } from './censor/meta';
+import { tool as stringPasswordGenerator } from './password-generator/meta';
export const stringTools = [
stringSplit,
@@ -37,5 +38,6 @@ export const stringTools = [
stringRot13,
stringBase64,
stringStatistic,
- stringCensor
+ stringCensor,
+ stringPasswordGenerator
];
diff --git a/src/pages/tools/string/join/index.tsx b/src/pages/tools/string/join/index.tsx
index eb0105a..da69a33 100644
--- a/src/pages/tools/string/join/index.tsx
+++ b/src/pages/tools/string/join/index.tsx
@@ -9,6 +9,7 @@ import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
import { CardExampleType } from '@components/examples/ToolExamples';
import { ToolComponentProps } from '@tools/defineTool';
+import { useTranslation } from 'react-i18next';
const initialValues = {
joinCharacter: '',
@@ -32,7 +33,7 @@ const mergeOptions = {
const blankTrailingOptions: {
title: string;
description: string;
- accessor: keyof InitialValuesType;
+ accessor: keyof Omit;
}[] = [
{
title: 'Delete Blank Lines',
@@ -107,6 +108,7 @@ s
];
export default function JoinText({ title }: ToolComponentProps) {
+ const { t } = useTranslation('string');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
const compute = (optionsValues: InitialValuesType, input: any) => {
@@ -119,25 +121,25 @@ export default function JoinText({ title }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Text Merged Options',
+ title: t('join.textMergedOptions'),
component: (
updateField(mergeOptions.accessor, value)}
- description={mergeOptions.description}
+ description={t('join.joinCharacterDescription')}
/>
)
},
{
- title: 'Blank Lines and Trailing Spaces',
+ title: t('join.blankLinesAndTrailingSpaces'),
component: blankTrailingOptions.map((option) => (
updateField(option.accessor, value)}
- description={option.description}
+ description={t(`join.${option.accessor}Description`)}
/>
))
}
@@ -151,17 +153,18 @@ export default function JoinText({ title }: ToolComponentProps) {
setInput={setInput}
inputComponent={
}
- resultComponent={ }
+ resultComponent={
+
+ }
getGroups={getGroups}
toolInfo={{
- title: 'What Is a Text Joiner?',
- description:
- 'With this tool you can join parts of the text together. It takes a list of text values, separated by newlines, and merges them together. You can set the character that will be placed between the parts of the combined text. Also, you can ignore all empty lines and remove spaces and tabs at the end of all lines. Textabulous!'
+ title: t('join.toolInfo.title'),
+ description: t('join.toolInfo.description')
}}
exampleCards={exampleCards}
/>
diff --git a/src/pages/tools/string/join/meta.ts b/src/pages/tools/string/join/meta.ts
index ce895b4..5fcc936 100644
--- a/src/pages/tools/string/join/meta.ts
+++ b/src/pages/tools/string/join/meta.ts
@@ -3,11 +3,13 @@ import { lazy } from 'react';
export const tool = defineTool('string', {
path: 'join',
- name: 'Text Joiner',
- icon: 'tabler:arrows-join',
- description:
- "World's Simplest Text Tool World's simplest browser-based utility for joining text. Load your text in the input form on the left and you'll automatically get merged text on the right. Powerful, free, and fast. Load text – get joined lines",
- shortDescription: 'Quickly merge texts',
- keywords: ['text', 'join'],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols-light:join',
+
+ keywords: ['join'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:join.title',
+ description: 'string:join.description',
+ shortDescription: 'string:join.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/palindrome/meta.ts b/src/pages/tools/string/palindrome/meta.ts
index bf40d4a..5c56ba0 100644
--- a/src/pages/tools/string/palindrome/meta.ts
+++ b/src/pages/tools/string/palindrome/meta.ts
@@ -3,12 +3,14 @@ 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'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:palindrome.title',
+ description: 'string:palindrome.description',
+ shortDescription: 'string:palindrome.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/password-generator/index.tsx b/src/pages/tools/string/password-generator/index.tsx
new file mode 100644
index 0000000..9d7f62d
--- /dev/null
+++ b/src/pages/tools/string/password-generator/index.tsx
@@ -0,0 +1,165 @@
+import React, { useState } from 'react';
+import { Box, Checkbox, FormControlLabel, FormGroup } from '@mui/material';
+import { generatePassword } from './service';
+import { initialValues, InitialValuesType } from './initialValues';
+import ToolContent from '@components/ToolContent';
+import ToolTextResult from '@components/result/ToolTextResult';
+import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
+import { ToolComponentProps } from '@tools/defineTool';
+import { GetGroupsType } from '@components/options/ToolOptions';
+import { CardExampleType } from '@components/examples/ToolExamples';
+import { useTranslation } from 'react-i18next';
+
+const exampleCards: CardExampleType[] = [
+ {
+ title: 'Strong Password (12 characters)',
+ description:
+ 'Generate a secure password with all character types including symbols.',
+ sampleText: '',
+ sampleResult: 'A7#mK9$pL2@x',
+ sampleOptions: {
+ length: '12',
+ includeLowercase: true,
+ includeUppercase: true,
+ includeNumbers: true,
+ includeSymbols: true,
+ avoidAmbiguous: false
+ }
+ },
+ {
+ title: 'Simple Password (8 characters)',
+ description: 'Generate a basic password with letters and numbers only.',
+ sampleText: '',
+ sampleResult: 'Ab3mK9pL',
+ sampleOptions: {
+ length: '8',
+ includeLowercase: true,
+ includeUppercase: true,
+ includeNumbers: true,
+ includeSymbols: false,
+ avoidAmbiguous: false
+ }
+ },
+ {
+ title: 'Clear Password (No ambiguous)',
+ description:
+ 'Generate a password without ambiguous characters (i, I, l, 0, O).',
+ sampleText: '',
+ sampleResult: 'A7#mK9$pL2@x',
+ sampleOptions: {
+ length: '12',
+ includeLowercase: true,
+ includeUppercase: true,
+ includeNumbers: true,
+ includeSymbols: true,
+ avoidAmbiguous: true
+ }
+ }
+];
+
+export default function PasswordGenerator({ title }: ToolComponentProps) {
+ const { t } = useTranslation('string');
+ const [result, setResult] = useState('');
+
+ function compute(values: InitialValuesType) {
+ setResult(generatePassword(values));
+ }
+
+ const getGroups: GetGroupsType = ({
+ values,
+ updateField
+ }) => [
+ {
+ title: t('passwordGenerator.optionsTitle'),
+ component: (
+
+ updateField('length', val)}
+ type="number"
+ />
+
+
+
+ updateField('includeLowercase', e.target.checked)
+ }
+ />
+ }
+ label={t('passwordGenerator.includeLowercase')}
+ />
+
+ updateField('includeUppercase', e.target.checked)
+ }
+ />
+ }
+ label={t('passwordGenerator.includeUppercase')}
+ />
+
+ updateField('includeNumbers', e.target.checked)
+ }
+ />
+ }
+ label={t('passwordGenerator.includeNumbers')}
+ />
+
+ updateField('includeSymbols', e.target.checked)
+ }
+ />
+ }
+ label={t('passwordGenerator.includeSymbols')}
+ />
+
+ updateField('avoidAmbiguous', e.target.checked)
+ }
+ />
+ }
+ label={t('passwordGenerator.avoidAmbiguous')}
+ />
+
+
+ )
+ }
+ ];
+
+ return (
+
+ }
+ toolInfo={{
+ title: t('passwordGenerator.toolInfo.title'),
+ description: t('passwordGenerator.toolInfo.description')
+ }}
+ exampleCards={exampleCards}
+ />
+ );
+}
diff --git a/src/pages/tools/string/password-generator/initialValues.ts b/src/pages/tools/string/password-generator/initialValues.ts
new file mode 100644
index 0000000..a96cc1b
--- /dev/null
+++ b/src/pages/tools/string/password-generator/initialValues.ts
@@ -0,0 +1,17 @@
+export type InitialValuesType = {
+ length: string; // user enters a number here
+ includeLowercase: boolean;
+ includeUppercase: boolean;
+ includeNumbers: boolean;
+ includeSymbols: boolean;
+ avoidAmbiguous: boolean;
+};
+
+export const initialValues: InitialValuesType = {
+ length: '12',
+ includeLowercase: true,
+ includeUppercase: true,
+ includeNumbers: true,
+ includeSymbols: true,
+ avoidAmbiguous: false
+};
diff --git a/src/pages/tools/string/password-generator/meta.ts b/src/pages/tools/string/password-generator/meta.ts
new file mode 100644
index 0000000..f24ffc2
--- /dev/null
+++ b/src/pages/tools/string/password-generator/meta.ts
@@ -0,0 +1,14 @@
+import { defineTool } from '@tools/defineTool';
+import { lazy } from 'react';
+
+export const tool = defineTool('string', {
+ path: 'password-generator',
+ icon: 'material-symbols:key',
+ keywords: ['password', 'generator', 'random', 'secure'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:passwordGenerator.title',
+ description: 'string:passwordGenerator.description',
+ shortDescription: 'string:passwordGenerator.shortDescription'
+ }
+});
diff --git a/src/pages/tools/string/password-generator/password-generator.service.test.ts b/src/pages/tools/string/password-generator/password-generator.service.test.ts
new file mode 100644
index 0000000..e6bb634
--- /dev/null
+++ b/src/pages/tools/string/password-generator/password-generator.service.test.ts
@@ -0,0 +1,143 @@
+import { describe, expect, it } from 'vitest';
+import { generatePassword } from './service';
+import { initialValues } from './initialValues';
+
+describe('generatePassword', () => {
+ it('should generate a password with the specified length', () => {
+ const options = { ...initialValues, length: '10' };
+ const result = generatePassword(options);
+ expect(result).toHaveLength(10);
+ });
+
+ it('should return empty string for invalid length', () => {
+ const options = { ...initialValues, length: '0' };
+ const result = generatePassword(options);
+ expect(result).toBe('');
+ });
+
+ it('should return empty string for non-numeric length', () => {
+ const options = { ...initialValues, length: 'abc' };
+ const result = generatePassword(options);
+ expect(result).toBe('');
+ });
+
+ it('should return empty string when no character types are selected', () => {
+ const options = {
+ ...initialValues,
+ includeLowercase: false,
+ includeUppercase: false,
+ includeNumbers: false,
+ includeSymbols: false
+ };
+ const result = generatePassword(options);
+ expect(result).toBe('');
+ });
+
+ it('should only include lowercase letters when only lowercase is selected', () => {
+ const options = {
+ ...initialValues,
+ length: '20',
+ includeLowercase: true,
+ includeUppercase: false,
+ includeNumbers: false,
+ includeSymbols: false
+ };
+ const result = generatePassword(options);
+ expect(result).toMatch(/^[a-z]+$/);
+ expect(result).toHaveLength(20);
+ });
+
+ it('should only include uppercase letters when only uppercase is selected', () => {
+ const options = {
+ ...initialValues,
+ length: '15',
+ includeLowercase: false,
+ includeUppercase: true,
+ includeNumbers: false,
+ includeSymbols: false
+ };
+ const result = generatePassword(options);
+ expect(result).toMatch(/^[A-Z]+$/);
+ expect(result).toHaveLength(15);
+ });
+
+ it('should only include numbers when only numbers is selected', () => {
+ const options = {
+ ...initialValues,
+ length: '8',
+ includeLowercase: false,
+ includeUppercase: false,
+ includeNumbers: true,
+ includeSymbols: false
+ };
+ const result = generatePassword(options);
+ expect(result).toMatch(/^[0-9]+$/);
+ expect(result).toHaveLength(8);
+ });
+
+ it('should include mixed character types when multiple are selected', () => {
+ const options = {
+ ...initialValues,
+ length: '100', // larger sample for better testing
+ includeLowercase: true,
+ includeUppercase: true,
+ includeNumbers: true,
+ includeSymbols: false
+ };
+ const result = generatePassword(options);
+ expect(result).toMatch(/^[a-zA-Z0-9]+$/);
+ expect(result).toHaveLength(100);
+ });
+
+ it('should exclude ambiguous characters when avoidAmbiguous is true', () => {
+ const options = {
+ ...initialValues,
+ length: '50',
+ avoidAmbiguous: true
+ };
+ const result = generatePassword(options);
+ expect(result).not.toMatch(/[iIl0O]/);
+ expect(result).toHaveLength(50);
+ });
+
+ it('should include symbols when includeSymbols is true', () => {
+ const options = {
+ ...initialValues,
+ length: '30',
+ includeLowercase: false,
+ includeUppercase: false,
+ includeNumbers: false,
+ includeSymbols: true
+ };
+ const result = generatePassword(options);
+ expect(result).toMatch(/^[!@#$%^&*()_+~`|}{[\]:;?><,./\-=]+$/);
+ expect(result).toHaveLength(30);
+ });
+
+ it('should exclude ambiguous characters from symbols too', () => {
+ const options = {
+ ...initialValues,
+ length: '50',
+ includeLowercase: false,
+ includeUppercase: false,
+ includeNumbers: true,
+ includeSymbols: true,
+ avoidAmbiguous: true
+ };
+ const result = generatePassword(options);
+ expect(result).not.toMatch(/[iIl0O]/);
+ expect(result).toHaveLength(50);
+ });
+
+ it('should handle edge case with very short length', () => {
+ const options = { ...initialValues, length: '1' };
+ const result = generatePassword(options);
+ expect(result).toHaveLength(1);
+ });
+
+ it('should handle negative length', () => {
+ const options = { ...initialValues, length: '-5' };
+ const result = generatePassword(options);
+ expect(result).toBe('');
+ });
+});
diff --git a/src/pages/tools/string/password-generator/service.ts b/src/pages/tools/string/password-generator/service.ts
new file mode 100644
index 0000000..fe20a6b
--- /dev/null
+++ b/src/pages/tools/string/password-generator/service.ts
@@ -0,0 +1,38 @@
+import type { InitialValuesType } from './initialValues';
+
+export function generatePassword(options: InitialValuesType): string {
+ const length = parseInt(options.length || '', 10);
+ if (isNaN(length) || length <= 0) {
+ return '';
+ }
+
+ let charset = '';
+ const lower = 'abcdefghijklmnopqrstuvwxyz';
+ const upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+ const numbers = '0123456789';
+ const symbols = '!@#$%^&*()_+~`|}{[]:;?><,./-=';
+
+ if (options.includeLowercase) charset += lower;
+ if (options.includeUppercase) charset += upper;
+ if (options.includeNumbers) charset += numbers;
+ if (options.includeSymbols) charset += symbols;
+
+ if (options.avoidAmbiguous) {
+ // ambiguous set = i, I, l, 0, O
+ const ambig = new Set(['i', 'I', 'l', '0', 'O']);
+ charset = Array.from(charset)
+ .filter((c) => !ambig.has(c))
+ .join('');
+ }
+
+ if (!charset) {
+ return ''; // nothing to pick from
+ }
+
+ let pwd = '';
+ for (let i = 0; i < length; i++) {
+ const idx = Math.floor(Math.random() * charset.length);
+ pwd += charset[idx];
+ }
+ return pwd;
+}
diff --git a/src/pages/tools/string/quote/index.tsx b/src/pages/tools/string/quote/index.tsx
index 61035a0..64b523c 100644
--- a/src/pages/tools/string/quote/index.tsx
+++ b/src/pages/tools/string/quote/index.tsx
@@ -9,6 +9,7 @@ import { ToolComponentProps } from '@tools/defineTool';
import { GetGroupsType } from '@components/options/ToolOptions';
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
+import { useTranslation } from 'react-i18next';
interface InitialValuesType {
leftQuote: string;
@@ -70,6 +71,7 @@ const exampleCards: CardExampleType[] = [
];
export default function Quote({ title }: ToolComponentProps) {
+ const { t } = useTranslation('string');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -93,33 +95,33 @@ export default function Quote({ title }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Quote Options',
+ title: t('quote.quoteOptions'),
component: (
updateField('leftQuote', val)}
- description={'Left quote character(s)'}
+ description={t('quote.leftQuoteDescription')}
/>
updateField('rightQuote', val)}
- description={'Right quote character(s)'}
+ description={t('quote.rightQuoteDescription')}
/>
updateField('doubleQuotation', checked)}
- title={'Allow double quotation'}
+ title={t('quote.allowDoubleQuotation')}
/>
updateField('emptyQuoting', checked)}
- title={'Quote empty lines'}
+ title={t('quote.quoteEmptyLines')}
/>
updateField('multiLine', checked)}
- title={'Process as multi-line text'}
+ title={t('quote.processAsMultiLine')}
/>
)
@@ -130,15 +132,20 @@ export default function Quote({ title }: ToolComponentProps) {
+
+ }
+ resultComponent={
+
}
- resultComponent={ }
initialValues={initialValues}
getGroups={getGroups}
toolInfo={{
- title: 'Text Quoter',
- description:
- "This tool allows you to add quotes around text. You can choose different quote characters, handle multi-line text, and control how empty lines are processed. It's useful for preparing text for programming, formatting data, or creating stylized text."
+ title: t('quote.toolInfo.title'),
+ description: t('quote.toolInfo.description')
}}
exampleCards={exampleCards}
input={input}
diff --git a/src/pages/tools/string/quote/meta.ts b/src/pages/tools/string/quote/meta.ts
index ee2a167..7bb86e9 100644
--- a/src/pages/tools/string/quote/meta.ts
+++ b/src/pages/tools/string/quote/meta.ts
@@ -3,12 +3,14 @@ import { lazy } from 'react';
// import image from '@assets/text.png';
export const tool = defineTool('string', {
- name: 'Quote',
path: 'quote',
- icon: 'proicons:quote',
- description:
- 'A tool to add quotation marks or custom characters around text. Perfect for formatting strings for code, citations, or stylistic purposes.',
- shortDescription: 'Add quotes around text easily.',
+ icon: 'material-symbols-light:format-quote',
+
keywords: ['quote'],
- component: lazy(() => import('./index'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:quote.title',
+ description: 'string:quote.description',
+ shortDescription: 'string:quote.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/randomize-case/meta.ts b/src/pages/tools/string/randomize-case/meta.ts
index 2430f3a..4eb3af1 100644
--- a/src/pages/tools/string/randomize-case/meta.ts
+++ b/src/pages/tools/string/randomize-case/meta.ts
@@ -3,12 +3,14 @@ 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:format-textdirection-l-to-r',
- description:
- "World's simplest browser-based utility for randomizing the case of text. Just paste your text and get it instantly transformed with random uppercase and lowercase letters. Perfect for creating playful text styles, meme text, or simulating chaotic writing.",
- shortDescription: 'Convert text to random uppercase and lowercase letters',
+ icon: 'material-symbols-light:shuffle',
+
keywords: ['randomize', 'case'],
- component: lazy(() => import('./index'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:randomizeCase.title',
+ description: 'string:randomizeCase.description',
+ shortDescription: 'string:randomizeCase.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/remove-duplicate-lines/meta.ts b/src/pages/tools/string/remove-duplicate-lines/meta.ts
index a1a6a8b..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,14 @@ 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'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:removeDuplicateLines.title',
+ description: 'string:removeDuplicateLines.description',
+ shortDescription: 'string:removeDuplicateLines.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/repeat/index.tsx b/src/pages/tools/string/repeat/index.tsx
index 0a954e2..2df00ba 100644
--- a/src/pages/tools/string/repeat/index.tsx
+++ b/src/pages/tools/string/repeat/index.tsx
@@ -9,6 +9,7 @@ import { initialValues, InitialValuesType } from './initialValues';
import ToolContent from '@components/ToolContent';
import { CardExampleType } from '@components/examples/ToolExamples';
import { ToolComponentProps } from '@tools/defineTool';
+import { useTranslation } from 'react-i18next';
const exampleCards: CardExampleType[] = [
{
@@ -48,6 +49,7 @@ const exampleCards: CardExampleType[] = [
];
export default function Replacer({ title }: ToolComponentProps) {
+ const { t } = useTranslation('string');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -60,12 +62,12 @@ export default function Replacer({ title }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Text Repetitions',
+ title: t('repeat.textRepetitions'),
component: (
updateField('repeatAmount', val)}
type={'number'}
@@ -74,12 +76,12 @@ export default function Replacer({ title }: ToolComponentProps) {
)
},
{
- title: 'Repetitions Delimiter',
+ title: t('repeat.repetitionsDelimiter'),
component: (
updateField('delimiter', val)}
type={'text'}
@@ -98,15 +100,18 @@ export default function Replacer({ title }: ToolComponentProps) {
input={input}
setInput={setInput}
inputComponent={
-
+
}
resultComponent={
-
+
}
toolInfo={{
- title: 'Repeat text',
- description:
- 'This tool allows you to repeat a given text multiple times with an optional separator.'
+ title: t('repeat.toolInfo.title'),
+ description: t('repeat.toolInfo.description')
}}
exampleCards={exampleCards}
/>
diff --git a/src/pages/tools/string/repeat/meta.ts b/src/pages/tools/string/repeat/meta.ts
index 69f5d79..02c2910 100644
--- a/src/pages/tools/string/repeat/meta.ts
+++ b/src/pages/tools/string/repeat/meta.ts
@@ -2,12 +2,15 @@ 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'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:repeat.title',
+ description: 'string:repeat.description',
+ shortDescription: 'string:repeat.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/reverse/index.tsx b/src/pages/tools/string/reverse/index.tsx
index b017b79..8406c65 100644
--- a/src/pages/tools/string/reverse/index.tsx
+++ b/src/pages/tools/string/reverse/index.tsx
@@ -12,6 +12,7 @@ import ToolExamples, {
import { ToolComponentProps } from '@tools/defineTool';
import { FormikProps } from 'formik';
import ToolContent from '@components/ToolContent';
+import { useTranslation } from 'react-i18next';
const initialValues = {
multiLine: true,
@@ -58,6 +59,7 @@ const exampleCards: CardExampleType[] = [
];
export default function Reverse({ title }: ToolComponentProps) {
+ const { t } = useTranslation('string');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -74,27 +76,27 @@ export default function Reverse({ title }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Reversal options',
+ title: t('reverse.reversalOptions'),
component: [
updateField('multiLine', val)}
/>,
updateField('emptyItems', val)}
/>,
updateField('trim', val)}
/>
]
@@ -109,9 +111,15 @@ export default function Reverse({ title }: ToolComponentProps) {
compute={computeExternal}
input={input}
setInput={setInput}
- inputComponent={ }
+ inputComponent={
+
+ }
resultComponent={
-
+
}
exampleCards={exampleCards}
/>
diff --git a/src/pages/tools/string/reverse/meta.ts b/src/pages/tools/string/reverse/meta.ts
index bd5f192..1f30e9b 100644
--- a/src/pages/tools/string/reverse/meta.ts
+++ b/src/pages/tools/string/reverse/meta.ts
@@ -2,12 +2,14 @@ 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'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:reverse.title',
+ description: 'string:reverse.description',
+ shortDescription: 'string:reverse.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/rot13/index.tsx b/src/pages/tools/string/rot13/index.tsx
index eae341f..ca0e848 100644
--- a/src/pages/tools/string/rot13/index.tsx
+++ b/src/pages/tools/string/rot13/index.tsx
@@ -5,6 +5,7 @@ import ToolTextResult from '@components/result/ToolTextResult';
import { rot13 } from './service';
import { CardExampleType } from '@components/examples/ToolExamples';
import { ToolComponentProps } from '@tools/defineTool';
+import { useTranslation } from 'react-i18next';
type InitialValuesType = Record;
@@ -30,6 +31,7 @@ const exampleCards: CardExampleType[] = [
];
export default function Rot13({ title }: ToolComponentProps) {
+ const { t } = useTranslation('string');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -41,15 +43,20 @@ export default function Rot13({ title }: ToolComponentProps) {
+
+ }
+ resultComponent={
+
}
- resultComponent={ }
initialValues={initialValues}
getGroups={null}
toolInfo={{
- title: 'What Is ROT13?',
- description:
- 'ROT13 (rotate by 13 places) is a simple letter substitution cipher that replaces a letter with the 13th letter after it in the alphabet. ROT13 is a special case of the Caesar cipher which was developed in ancient Rome. Because there are 26 letters in the English alphabet, ROT13 is its own inverse; that is, to undo ROT13, the same algorithm is applied, so the same action can be used for encoding and decoding.'
+ title: t('rot13.toolInfo.title'),
+ description: t('rot13.toolInfo.description')
}}
exampleCards={exampleCards}
input={input}
diff --git a/src/pages/tools/string/rot13/meta.ts b/src/pages/tools/string/rot13/meta.ts
index bd04076..8e6be8c 100644
--- a/src/pages/tools/string/rot13/meta.ts
+++ b/src/pages/tools/string/rot13/meta.ts
@@ -3,12 +3,15 @@ import { lazy } from 'react';
// import image from '@assets/text.png';
export const tool = defineTool('string', {
- name: 'Rot13',
+ i18n: {
+ name: 'string:rot13.title',
+ description: 'string:rot13.description',
+ shortDescription: 'string:rot13.shortDescription'
+ },
+
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/index.tsx b/src/pages/tools/string/rotate/index.tsx
index df19411..cb4fea5 100644
--- a/src/pages/tools/string/rotate/index.tsx
+++ b/src/pages/tools/string/rotate/index.tsx
@@ -10,6 +10,7 @@ import { GetGroupsType } from '@components/options/ToolOptions';
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import SimpleRadio from '@components/options/SimpleRadio';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
+import { useTranslation } from 'react-i18next';
interface InitialValuesType {
step: string;
@@ -63,6 +64,7 @@ const exampleCards: CardExampleType[] = [
];
export default function Rotate({ title }: ToolComponentProps) {
+ const { t } = useTranslation('string');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -79,29 +81,29 @@ export default function Rotate({ title }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Rotation Options',
+ title: t('rotate.rotationOptions'),
component: (
updateField('step', val)}
- description={'Number of positions to rotate'}
+ description={t('rotate.stepDescription')}
type="number"
/>
updateField('direction', 'right')}
checked={values.direction === 'right'}
- title={'Rotate Right'}
+ title={t('rotate.rotateRight')}
/>
updateField('direction', 'left')}
checked={values.direction === 'left'}
- title={'Rotate Left'}
+ title={t('rotate.rotateLeft')}
/>
updateField('multiLine', checked)}
- title={'Process as multi-line text (rotate each line separately)'}
+ title={t('rotate.processAsMultiLine')}
/>
)
@@ -112,15 +114,20 @@ export default function Rotate({ title }: ToolComponentProps) {
+
+ }
+ resultComponent={
+
}
- resultComponent={ }
initialValues={initialValues}
getGroups={getGroups}
toolInfo={{
- title: 'String Rotation',
- description:
- 'This tool allows you to rotate characters in a string by a specified number of positions. You can rotate to the left or right, and process multi-line text by rotating each line separately. String rotation is useful for simple text transformations, creating patterns, or implementing basic encryption techniques.'
+ title: t('rotate.toolInfo.title'),
+ description: t('rotate.toolInfo.description')
}}
exampleCards={exampleCards}
input={input}
diff --git a/src/pages/tools/string/rotate/meta.ts b/src/pages/tools/string/rotate/meta.ts
index d8669a9..66c4117 100644
--- a/src/pages/tools/string/rotate/meta.ts
+++ b/src/pages/tools/string/rotate/meta.ts
@@ -3,12 +3,15 @@ import { lazy } from 'react';
// import image from '@assets/text.png';
export const tool = defineTool('string', {
- name: 'Rotate',
+ i18n: {
+ name: 'string:rotate.title',
+ description: 'string:rotate.description',
+ shortDescription: 'string:rotate.shortDescription'
+ },
+
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/index.tsx b/src/pages/tools/string/split/index.tsx
index b147e32..4961fda 100644
--- a/src/pages/tools/string/split/index.tsx
+++ b/src/pages/tools/string/split/index.tsx
@@ -11,6 +11,8 @@ import ToolExamples, {
import { ToolComponentProps } from '@tools/defineTool';
import { FormikProps } from 'formik';
import ToolContent from '@components/ToolContent';
+import { useTranslation } from 'react-i18next';
+import { ParseKeys } from 'i18next';
const initialValues = {
splitSeparatorType: 'symbol' as SplitOperatorType,
@@ -24,55 +26,45 @@ const initialValues = {
charAfterChunk: ''
};
const splitOperators: {
- title: string;
- description: string;
+ title: ParseKeys<'string'>;
+ description: ParseKeys<'string'>;
type: SplitOperatorType;
}[] = [
{
- title: 'Use a Symbol for Splitting',
- description:
- 'Character that will be used to\n' +
- 'break text into parts.\n' +
- '(Space by default.)',
+ title: 'split.symbolTitle',
+ description: 'split.symbolDescription',
type: 'symbol'
},
{
- title: 'Use a Regex for Splitting',
+ title: 'split.regexTitle',
type: 'regex',
- description:
- 'Regular expression that will be\n' +
- 'used to break text into parts.\n' +
- '(Multiple spaces by default.)'
+ description: 'split.regexDescription'
},
{
- title: 'Use Length for Splitting',
- description:
- 'Number of symbols that will be\n' + 'put in each output chunk.',
+ title: 'split.lengthTitle',
+ description: 'split.lengthDescription',
type: 'length'
},
{
- title: 'Use a Number of Chunks',
- description: 'Number of chunks of equal\n' + 'length in the output.',
+ title: 'split.chunksTitle',
+ description: 'split.chunksDescription',
type: 'chunks'
}
];
const outputOptions: {
- description: string;
+ description: ParseKeys<'string'>;
accessor: keyof typeof initialValues;
}[] = [
{
- description:
- 'Character that will be put\n' +
- 'between the split chunks.\n' +
- '(It\'s newline "\\n" by default.)',
+ description: 'split.outputSeparatorDescription',
accessor: 'outputSeparator'
},
{
- description: 'Character before each chunk',
+ description: 'split.charBeforeChunkDescription',
accessor: 'charBeforeChunk'
},
{
- description: 'Character after each chunk',
+ description: 'split.charAfterChunkDescription',
accessor: 'charAfterChunk'
}
];
@@ -132,6 +124,7 @@ easy`,
];
export default function SplitText({ title }: ToolComponentProps) {
+ const { t } = useTranslation('string');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -170,18 +163,20 @@ export default function SplitText({ title }: ToolComponentProps) {
title={title}
input={input}
inputComponent={ }
- resultComponent={ }
+ resultComponent={
+
+ }
initialValues={initialValues}
getGroups={({ values, updateField }) => [
{
- title: 'Split separator options',
+ title: t('split.splitSeparatorOptions'),
component: splitOperators.map(({ title, description, type }) => (
updateField('splitSeparatorType', type)}
onTextChange={(val) => updateField(`${type}Value`, val)}
@@ -189,13 +184,13 @@ export default function SplitText({ title }: ToolComponentProps) {
))
},
{
- title: 'Output separator options',
+ title: t('split.outputSeparatorOptions'),
component: outputOptions.map((option) => (
updateField(option.accessor, value)}
- description={option.description}
+ description={t(option.description)}
/>
))
}
diff --git a/src/pages/tools/string/split/meta.ts b/src/pages/tools/string/split/meta.ts
index d6ad595..8b7b6a9 100644
--- a/src/pages/tools/string/split/meta.ts
+++ b/src/pages/tools/string/split/meta.ts
@@ -3,12 +3,13 @@ import { lazy } from 'react';
export const tool = defineTool('string', {
path: 'split',
- name: 'Text splitter',
- icon: 'material-symbols-light:arrow-split',
- description:
- "World's simplest browser-based utility for splitting text. Load your text in the input form on the left and you'll automatically get pieces of this text on the right. Powerful, free, and fast. Load text – get chunks.",
- shortDescription: 'Quickly split a text',
- longDescription: 'Quickly split a text',
- keywords: ['text', 'split'],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols-light:call-split',
+
+ keywords: ['split'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:split.title',
+ description: 'string:split.description',
+ shortDescription: 'string:split.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/statistic/index.tsx b/src/pages/tools/string/statistic/index.tsx
index 4ca3059..c803174 100644
--- a/src/pages/tools/string/statistic/index.tsx
+++ b/src/pages/tools/string/statistic/index.tsx
@@ -10,6 +10,7 @@ import { CardExampleType } from '@components/examples/ToolExamples';
import { ToolComponentProps } from '@tools/defineTool';
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
+import { useTranslation } from 'react-i18next';
const initialValues: InitialValuesType = {
emptyLines: false,
@@ -216,6 +217,7 @@ export default function Truncate({
title,
longDescription
}: ToolComponentProps) {
+ const { t } = useTranslation('string');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -228,49 +230,45 @@ export default function Truncate({
updateField
}) => [
{
- title: 'Delimiters Options',
+ title: t('statistic.delimitersOptions'),
component: (
updateField('sentenceDelimiters', val)}
- placeholder="e.g. ., !, ?, ..."
- description={
- 'Enter custom characters used to delimit sentences in your language (separated by comma) or leave it blank for default.'
- }
+ placeholder={t('statistic.sentenceDelimitersPlaceholder')}
+ description={t('statistic.sentenceDelimitersDescription')}
/>
updateField('wordDelimiters', val)}
- placeholder="eg. \\s.,;:!?\”«»()…"
- description={
- 'Enter custom Regex to count Words or leave it blank for default.'
- }
+ placeholder={t('statistic.wordDelimitersPlaceholder')}
+ description={t('statistic.wordDelimitersDescription')}
/>
)
},
{
- title: 'Statistics Options',
+ title: t('statistic.statisticsOptions'),
component: (
updateField('wordCount', value)}
- title="Word Frequency Analysis"
- description="Count how often each word appears in the text"
+ title={t('statistic.wordFrequencyAnalysis')}
+ description={t('statistic.wordFrequencyAnalysisDescription')}
/>
updateField('characterCount', value)}
- title="Character Frequency Analysis"
- description="Count how often each character appears in the text"
+ title={t('statistic.characterFrequencyAnalysis')}
+ description={t('statistic.characterFrequencyAnalysisDescription')}
/>
updateField('emptyLines', value)}
- title="Include Empty Lines"
- description="Include blank lines when counting lines"
+ title={t('statistic.includeEmptyLines')}
+ description={t('statistic.includeEmptyLinesDescription')}
/>
)
@@ -286,12 +284,19 @@ export default function Truncate({
input={input}
setInput={setInput}
inputComponent={
-
+
}
resultComponent={
-
+
}
- toolInfo={{ title: `What is a ${title}?`, description: longDescription }}
+ toolInfo={{
+ title: t('statistic.toolInfo.title', { title }),
+ description: longDescription
+ }}
exampleCards={exampleCards}
/>
);
diff --git a/src/pages/tools/string/statistic/meta.ts b/src/pages/tools/string/statistic/meta.ts
index 18bc663..f56b7d4 100644
--- a/src/pages/tools/string/statistic/meta.ts
+++ b/src/pages/tools/string/statistic/meta.ts
@@ -2,14 +2,15 @@ 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'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:statistic.title',
+ description: 'string:statistic.description',
+ shortDescription: 'string:statistic.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/text-replacer/index.tsx b/src/pages/tools/string/text-replacer/index.tsx
index ee99fe0..3908f62 100644
--- a/src/pages/tools/string/text-replacer/index.tsx
+++ b/src/pages/tools/string/text-replacer/index.tsx
@@ -10,6 +10,7 @@ import { initialValues, InitialValuesType } from './initialValues';
import ToolContent from '@components/ToolContent';
import { CardExampleType } from '@components/examples/ToolExamples';
import { ToolComponentProps } from '@tools/defineTool';
+import { useTranslation } from 'react-i18next';
const exampleCards: CardExampleType[] = [
{
@@ -60,6 +61,7 @@ const exampleCards: CardExampleType[] = [
];
export default function Replacer({ title }: ToolComponentProps) {
+ const { t } = useTranslation('string');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -72,16 +74,16 @@ export default function Replacer({ title }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Search text',
+ title: t('textReplacer.searchText'),
component: (
updateField('mode', 'text')}
checked={values.mode === 'text'}
- title={'Find This Pattern in Text'}
+ title={t('textReplacer.findPatternInText')}
/>
updateField('searchValue', val)}
type={'text'}
@@ -89,12 +91,10 @@ export default function Replacer({ title }: ToolComponentProps) {
updateField('mode', 'regexp')}
checked={values.mode === 'regexp'}
- title={'Find a Pattern Using a RegExp'}
+ title={t('textReplacer.findPatternUsingRegexp')}
/>
updateField('searchRegexp', val)}
type={'text'}
@@ -103,12 +103,12 @@ export default function Replacer({ title }: ToolComponentProps) {
)
},
{
- title: 'Replace Text',
+ title: t('textReplacer.replaceText'),
component: (
updateField('replaceValue', val)}
type={'text'}
@@ -128,18 +128,17 @@ export default function Replacer({ title }: ToolComponentProps) {
setInput={setInput}
inputComponent={
}
resultComponent={
-
+
}
toolInfo={{
- title: 'Text Replacer',
- 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.'
+ title: t('textReplacer.toolInfo.title'),
+ description: t('textReplacer.toolInfo.description')
}}
exampleCards={exampleCards}
/>
diff --git a/src/pages/tools/string/text-replacer/meta.ts b/src/pages/tools/string/text-replacer/meta.ts
index a7162f7..d02502b 100644
--- a/src/pages/tools/string/text-replacer/meta.ts
+++ b/src/pages/tools/string/text-replacer/meta.ts
@@ -2,12 +2,16 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('string', {
- name: 'Text Replacer',
+ i18n: {
+ name: 'string:textReplacer.title',
+ description: 'string:textReplacer.description',
+ shortDescription: 'string:textReplacer.shortDescription'
+ },
+
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/index.tsx b/src/pages/tools/string/to-morse/index.tsx
index 866fb93..f50e547 100644
--- a/src/pages/tools/string/to-morse/index.tsx
+++ b/src/pages/tools/string/to-morse/index.tsx
@@ -4,6 +4,7 @@ import ToolTextInput from '@components/input/ToolTextInput';
import ToolTextResult from '@components/result/ToolTextResult';
import { compute } from './service';
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
+import { useTranslation } from 'react-i18next';
const initialValues = {
dotSymbol: '.',
@@ -11,6 +12,7 @@ const initialValues = {
};
export default function ToMorse() {
+ const { t } = useTranslation('string');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
const computeOptions = (optionsValues: typeof initialValues, input: any) => {
@@ -20,33 +22,31 @@ export default function ToMorse() {
return (
}
- resultComponent={ }
+ resultComponent={
+
+ }
getGroups={({ values, updateField }) => [
{
- title: 'Short Signal',
+ title: t('toMorse.shortSignal'),
component: (
updateField('dotSymbol', val)}
/>
)
},
{
- title: 'Long Signal',
+ title: t('toMorse.longSignal'),
component: (
updateField('dashSymbol', val)}
/>
diff --git a/src/pages/tools/string/to-morse/meta.ts b/src/pages/tools/string/to-morse/meta.ts
index 71aa30f..5244c3a 100644
--- a/src/pages/tools/string/to-morse/meta.ts
+++ b/src/pages/tools/string/to-morse/meta.ts
@@ -3,12 +3,13 @@ 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'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:toMorse.title',
+ description: 'string:toMorse.description',
+ shortDescription: 'string:toMorse.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/truncate/index.tsx b/src/pages/tools/string/truncate/index.tsx
index 8f60b6a..399054e 100644
--- a/src/pages/tools/string/truncate/index.tsx
+++ b/src/pages/tools/string/truncate/index.tsx
@@ -11,6 +11,7 @@ import { CardExampleType } from '@components/examples/ToolExamples';
import { ToolComponentProps } from '@tools/defineTool';
import SimpleRadio from '@components/options/SimpleRadio';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
+import { useTranslation } from 'react-i18next';
const exampleCards: CardExampleType[] = [
{
@@ -67,6 +68,7 @@ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
];
export default function Truncate({ title }: ToolComponentProps) {
+ const { t } = useTranslation('string');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -79,31 +81,31 @@ export default function Truncate({ title }: ToolComponentProps) {
updateField
}) => [
{
- title: 'Truncation Side',
+ title: t('truncate.truncationSide'),
component: (
updateField('truncationSide', 'right')}
checked={values.truncationSide === 'right'}
- title={'Right-side Truncation'}
- description={'Remove characters from the end of the text.'}
+ title={t('truncate.rightSideTruncation')}
+ description={t('truncate.rightSideDescription')}
/>
updateField('truncationSide', 'left')}
checked={values.truncationSide === 'left'}
- title={'Left-side Truncation'}
- description={'Remove characters from the start of the text.'}
+ title={t('truncate.leftSideTruncation')}
+ description={t('truncate.leftSideDescription')}
/>
)
},
{
- title: 'Length and Lines',
+ title: t('truncate.lengthAndLines'),
component: (
updateField('maxLength', val)}
type={'number'}
@@ -111,27 +113,25 @@ export default function Truncate({ title }: ToolComponentProps) {
updateField('lineByLine', val)}
checked={values.lineByLine}
- title={'Line-by-line Truncating'}
- description={'Truncate each line separately.'}
+ title={t('truncate.lineByLineTruncating')}
+ description={t('truncate.lineByLineDescription')}
/>
)
},
{
- title: 'Suffix and Affix',
+ title: t('truncate.suffixAndAffix'),
component: (
updateField('addIndicator', val)}
checked={values.addIndicator}
- title={'Add Truncation Indicator'}
+ title={t('truncate.addTruncationIndicator')}
description={''}
/>
updateField('indicator', val)}
type={'text'}
@@ -150,15 +150,18 @@ export default function Truncate({ title }: ToolComponentProps) {
input={input}
setInput={setInput}
inputComponent={
-
+
}
resultComponent={
-
+
}
toolInfo={{
- title: 'Truncate text',
- description:
- 'Load your text in the input form on the left and you will automatically get truncated text on the right.'
+ title: t('truncate.toolInfo.title'),
+ description: t('truncate.toolInfo.description')
}}
exampleCards={exampleCards}
/>
diff --git a/src/pages/tools/string/truncate/meta.ts b/src/pages/tools/string/truncate/meta.ts
index 1cbb045..a62eebc 100644
--- a/src/pages/tools/string/truncate/meta.ts
+++ b/src/pages/tools/string/truncate/meta.ts
@@ -2,12 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('string', {
- name: 'Truncate text',
path: 'truncate',
- shortDescription: 'Truncate your text easily',
- icon: 'material-symbols-light:short-text',
- description:
- 'Load your text in the input form on the left and you will automatically get truncated text on the right.',
- keywords: ['text', 'truncate'],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols-light:content-cut',
+
+ keywords: ['truncate'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:truncate.title',
+ description: 'string:truncate.description',
+ shortDescription: 'string:truncate.shortDescription'
+ }
});
diff --git a/src/pages/tools/string/uppercase/index.tsx b/src/pages/tools/string/uppercase/index.tsx
index e234cda..a09713f 100644
--- a/src/pages/tools/string/uppercase/index.tsx
+++ b/src/pages/tools/string/uppercase/index.tsx
@@ -5,6 +5,7 @@ import { UppercaseInput } from './service';
import { CardExampleType } from '@components/examples/ToolExamples';
import { ToolComponentProps } from '@tools/defineTool';
import ToolContent from '@components/ToolContent';
+import { useTranslation } from 'react-i18next';
const initialValues = {};
@@ -35,6 +36,7 @@ const exampleCards: CardExampleType[] = [
];
export default function Uppercase({ title }: ToolComponentProps) {
+ const { t } = useTranslation('string');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -53,9 +55,15 @@ export default function Uppercase({ title }: ToolComponentProps) {
compute={computeExternal}
input={input}
setInput={setInput}
- inputComponent={ }
+ inputComponent={
+
+ }
resultComponent={
-
+
}
exampleCards={exampleCards}
/>
diff --git a/src/pages/tools/string/uppercase/meta.ts b/src/pages/tools/string/uppercase/meta.ts
index 30371bd..9c2e25c 100644
--- a/src/pages/tools/string/uppercase/meta.ts
+++ b/src/pages/tools/string/uppercase/meta.ts
@@ -2,12 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('string', {
- name: 'Uppercase',
path: 'uppercase',
- icon: 'material-symbols-light:text-fields',
- description:
- "World's simplest browser-based utility for converting text to uppercase. Just input your text and it will be automatically converted to all capital letters. Perfect for creating headlines, emphasizing text, or standardizing text format. Supports various text formats and preserves special characters.",
- shortDescription: 'Convert text to uppercase letters',
+ icon: 'material-symbols-light:format-textdirection-l-to-r',
+
keywords: ['uppercase'],
- component: lazy(() => import('./index'))
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'string:uppercase.title',
+ description: 'string:uppercase.description',
+ shortDescription: 'string:uppercase.shortDescription'
+ }
});
diff --git a/src/pages/tools/time/check-leap-years/index.tsx b/src/pages/tools/time/check-leap-years/index.tsx
index 99672bd..b960f14 100644
--- a/src/pages/tools/time/check-leap-years/index.tsx
+++ b/src/pages/tools/time/check-leap-years/index.tsx
@@ -6,6 +6,7 @@ import ToolTextResult from '@components/result/ToolTextResult';
import { GetGroupsType } from '@components/options/ToolOptions';
import { CardExampleType } from '@components/examples/ToolExamples';
import { checkLeapYear } from './service';
+import { useTranslation } from 'react-i18next';
const initialValues = {};
@@ -56,6 +57,7 @@ export default function ConvertDaysToHours({
title,
longDescription
}: ToolComponentProps) {
+ const { t } = useTranslation('time');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -75,7 +77,10 @@ export default function ConvertDaysToHours({
getGroups={getGroups}
setInput={setInput}
compute={compute}
- toolInfo={{ title: `What is a ${title}?`, description: longDescription }}
+ toolInfo={{
+ title: t('checkLeapYears.toolInfo.title', { title }),
+ description: longDescription
+ }}
exampleCards={exampleCards}
/>
);
diff --git a/src/pages/tools/time/check-leap-years/meta.ts b/src/pages/tools/time/check-leap-years/meta.ts
index 31c2829..661f4a6 100644
--- a/src/pages/tools/time/check-leap-years/meta.ts
+++ b/src/pages/tools/time/check-leap-years/meta.ts
@@ -3,12 +3,13 @@ import { lazy } from 'react';
export const tool = defineTool('time', {
path: 'check-leap-years',
- name: 'Check Leap Years',
- icon: 'arcticons:calendar-simple-29',
- description:
- ' You can check if a given calendar year is a leap year. You can enter one or many different years into the input field with one date per line and get the answer to the test question of whether the given year is a leap year.',
- shortDescription: 'Convert days to hours easily.',
- keywords: ['check', 'leap', 'years'],
- longDescription: `This is a quick online utility for testing if the given year is a leap year. Just as a reminder, a leap year has 366 days, which is one more day than a common year. This extra day is added to the month of February and it falls on February 29th. There's a simple mathematical formula for calculating if the given year is a leap year. Leap years are those years that are divisible by 4 but not divisible by 100, as well as years that are divisible by 100 and 400 simultaneously. Our algorithm checks each input year using this formula and outputs the year's status. For example, if you enter the value "2025" as input, the program will display "2025 is not a leap year.", and for the value "2028", the status will be "2028 is a leap year.". You can also enter multiple years as the input in a column and get a matching column of statuses as the output.`,
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:calendar-month',
+
+ keywords: ['leap', 'year', 'calendar', 'date'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'time:checkLeapYears.title',
+ description: 'time:checkLeapYears.description',
+ shortDescription: 'time:checkLeapYears.shortDescription'
+ }
});
diff --git a/src/pages/tools/time/convert-days-to-hours/index.tsx b/src/pages/tools/time/convert-days-to-hours/index.tsx
index 96f200e..b8f83c1 100644
--- a/src/pages/tools/time/convert-days-to-hours/index.tsx
+++ b/src/pages/tools/time/convert-days-to-hours/index.tsx
@@ -8,6 +8,7 @@ import { GetGroupsType } from '@components/options/ToolOptions';
import { CardExampleType } from '@components/examples/ToolExamples';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
import { convertDaysToHours } from './service';
+import { useTranslation } from 'react-i18next';
const initialValues = {
hoursFlag: false
@@ -18,7 +19,7 @@ const exampleCards: CardExampleType[] = [
title: 'Full Days to Hours',
description:
'This example calculates how many hours there are in 1 day, in one week (7 days), in one month (30 days), and in even longer time periods. To see all the results at once, we enter each individual day value on a new line. We also use the "days" suffix in the input and add the "hours" suffix to the output.',
- sampleText: `1 day
+ sampleText: `1 day
7 days
30 days
90 days
@@ -62,6 +63,7 @@ export default function ConvertDaysToHours({
title,
longDescription
}: ToolComponentProps) {
+ const { t } = useTranslation('time');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -74,14 +76,14 @@ export default function ConvertDaysToHours({
updateField
}) => [
{
- title: 'Hours Name',
+ title: t('convertDaysToHours.hoursName'),
component: (
updateField('hoursFlag', val)}
checked={values.hoursFlag}
- title={'Add Hours Name'}
- description={'Append the string hours to output values'}
+ title={t('convertDaysToHours.addHoursName')}
+ description={t('convertDaysToHours.addHoursNameDescription')}
/>
)
@@ -98,7 +100,10 @@ export default function ConvertDaysToHours({
getGroups={getGroups}
setInput={setInput}
compute={compute}
- toolInfo={{ title: `What is a ${title}?`, description: longDescription }}
+ toolInfo={{
+ title: t('convertDaysToHours.toolInfo.title'),
+ description: t('convertDaysToHours.toolInfo.description')
+ }}
exampleCards={exampleCards}
/>
);
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 9971f6c..a94823b 100644
--- a/src/pages/tools/time/convert-days-to-hours/meta.ts
+++ b/src/pages/tools/time/convert-days-to-hours/meta.ts
@@ -3,13 +3,13 @@ import { lazy } from 'react';
export const tool = defineTool('time', {
path: 'convert-days-to-hours',
- name: 'Convert Days to Hours',
- icon: 'ri:24-hours-line',
- description:
- 'With this browser-based application, you can calculate how many hours there are in the given number of days. The application takes the input values (days), multiplies them by 24 and that converts them into hours. It supports both integer and decimal day values and it can convert multiple values at the same time.',
- shortDescription: 'Convert days to hours easily.',
- keywords: ['convert', 'days', 'hours'],
- longDescription:
- 'This is a quick online utility for converting days to hours. One day is 24 hours and to convert days to hours, we simply do the multiplication operation: hours = days × 24. For example, 2 days is 2 × 24 = 48 hours and 5 days is 5 × 24 = 120 hours. You can convert not only full days to hours but also fractional day values. For example, 1.5 days is 1.5 × 24 = 36 hours and 4.6 days is 4.6 × 24 = 110.4 hours. You can enter multiple days in the input field (one value per line). In this case, they will all be computed in parallel and at once. The program also supports the postfix "days" or "d" for the input values and you can add the postfix "hours" to the output values. Timeabulous!',
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:schedule',
+
+ keywords: ['days', 'hours', 'convert', 'time'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'time:convertDaysToHours.title',
+ description: 'time:convertDaysToHours.description',
+ shortDescription: 'time:convertDaysToHours.shortDescription'
+ }
});
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 28ed2cc..fd49c3f 100644
--- a/src/pages/tools/time/convert-hours-to-days/meta.ts
+++ b/src/pages/tools/time/convert-hours-to-days/meta.ts
@@ -3,13 +3,13 @@ import { lazy } from 'react';
export const tool = defineTool('time', {
path: 'convert-hours-to-days',
- name: 'Convert Hours to Days',
- icon: 'mdi:hours-24',
- description:
- 'With this browser-based application, you can calculate how many days there are in the given number of hours. Given one or more hour values in the input, it converts them into days via the simple math formula: days = hours/24. It works with arbitrary large hour values and you can also customize the decimal day precision.',
- shortDescription: 'Convert hours to days easily.',
- keywords: ['convert', 'hours', 'days'],
- longDescription:
- "This is a quick online utility for converting hours to days. To figure out the number of days in the specified hours, the program divides them by 24. For example, if the input hours value is 48, then by doing 48/24, it finds that there are 2 days, or if the hours value is 120, then it's 120/24 = 5 days. If the hours value is not divisible by 24, then the number of days is displayed as a decimal number. For example, 36 hours is 36/24 = 1.5 days and 100 hours is approximately 4.167 days. You can specify the precision of the decimal fraction calculation in the options. You can also enable the option that adds the postfix 'days' to all the output values. Timeabulous!",
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:schedule',
+
+ keywords: ['hours', 'days', 'convert', 'time'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'time:convertHoursToDays.title',
+ description: 'time:convertHoursToDays.description',
+ shortDescription: 'time:convertHoursToDays.shortDescription'
+ }
});
diff --git a/src/pages/tools/time/convert-seconds-to-time/index.tsx b/src/pages/tools/time/convert-seconds-to-time/index.tsx
index 026fdd3..0e5d10d 100644
--- a/src/pages/tools/time/convert-seconds-to-time/index.tsx
+++ b/src/pages/tools/time/convert-seconds-to-time/index.tsx
@@ -8,6 +8,7 @@ import { GetGroupsType } from '@components/options/ToolOptions';
import { CardExampleType } from '@components/examples/ToolExamples';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
import { convertSecondsToTime } from './service';
+import { useTranslation } from 'react-i18next';
const initialValues = {
paddingFlag: false
@@ -68,6 +69,7 @@ export default function SecondsToTime({
title,
longDescription
}: ToolComponentProps) {
+ const { t } = useTranslation('time');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -80,14 +82,14 @@ export default function SecondsToTime({
updateField
}) => [
{
- title: 'Time Padding',
+ title: t('convertSecondsToTime.timePadding'),
component: (
updateField('paddingFlag', val)}
checked={values.paddingFlag}
- title={'Add Padding'}
- description={'Add zero padding to hours, minutes, and seconds.'}
+ title={t('convertSecondsToTime.addPadding')}
+ description={t('convertSecondsToTime.addPaddingDescription')}
/>
)
@@ -104,7 +106,10 @@ export default function SecondsToTime({
getGroups={getGroups}
setInput={setInput}
compute={compute}
- toolInfo={{ title: `What is a ${title}?`, description: longDescription }}
+ toolInfo={{
+ title: t('convertSecondsToTime.toolInfo.title', { title }),
+ description: longDescription
+ }}
exampleCards={exampleCards}
/>
);
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 a92f010..574623d 100644
--- a/src/pages/tools/time/convert-seconds-to-time/meta.ts
+++ b/src/pages/tools/time/convert-seconds-to-time/meta.ts
@@ -3,13 +3,13 @@ import { lazy } from 'react';
export const tool = defineTool('time', {
path: 'convert-seconds-to-time',
- name: 'Convert Seconds to Time',
- icon: 'fluent-mdl2:time-picker',
- description:
- 'With this browser-based application, you can convert seconds to clock time. Given the seconds input value, it converts them into full hours (H), minutes (M), and seconds (S) and prints them in human-readable clock format (H:M:S or HH:MM:SS) in the output field.',
- shortDescription: 'Quicky convert seconds to clock time in H:M:S format.',
- keywords: ['convert', 'seconds', 'time', 'clock'],
- longDescription:
- 'This is a quick online utility for converting seconds to H:M:S or HH:MM:SS digital clock time format. It calculates the number of full hours, full minutes, and remaining seconds from the input seconds and outputs regular clock time. For example, 100 seconds is 1 minute and 40 seconds so we get the clock time 00:01:40. To convert seconds to human-readable time we use the Euclidean division algorithm, also known as a division with remainder. If "n" is the input seconds value, then the hours "h" are calculated from the formula n = 3600×h + r, where r is the remainder of dividing n by 3600. Minutes "m" are calculated from the formula r = 60×m + s, and seconds "s" is the remainder of dividing r by 60. For example, if the input n = 4000, then 4000 = 3600×1 + 400. From here we find that the full hours value is 1. Next, the remaining 400 seconds are equal to 60×6 + 40. From here, there are 6 full minutes and 40 more remaining seconds. Thus, we find that 4000 seconds in human time 1 hour, 6 minutes, and 40 seconds. By default, the program outputs the clock time in a padded HH:MM:SS format (i.e. 01:06:40) but you can also disable the padding option and get just H:M:S (i.e. 1:6:40). Timeabulous!',
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:schedule',
+
+ keywords: ['seconds', 'time', 'convert', 'format'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'time:convertSecondsToTime.title',
+ description: 'time:convertSecondsToTime.description',
+ shortDescription: 'time:convertSecondsToTime.shortDescription'
+ }
});
diff --git a/src/pages/tools/time/convert-time-to-seconds/index.tsx b/src/pages/tools/time/convert-time-to-seconds/index.tsx
index d7bae7e..be48eb5 100644
--- a/src/pages/tools/time/convert-time-to-seconds/index.tsx
+++ b/src/pages/tools/time/convert-time-to-seconds/index.tsx
@@ -5,6 +5,7 @@ import ToolTextInput from '@components/input/ToolTextInput';
import ToolTextResult from '@components/result/ToolTextResult';
import { CardExampleType } from '@components/examples/ToolExamples';
import { convertTimetoSeconds } from './service';
+import { useTranslation } from 'react-i18next';
const initialValues = {};
type InitialValuesType = typeof initialValues;
@@ -75,6 +76,7 @@ export default function TimeToSeconds({
title,
longDescription
}: ToolComponentProps) {
+ const { t } = useTranslation('time');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -92,7 +94,10 @@ export default function TimeToSeconds({
getGroups={null}
setInput={setInput}
compute={compute}
- toolInfo={{ title: `What is a ${title}?`, description: longDescription }}
+ toolInfo={{
+ title: t('convertTimeToSeconds.toolInfo.title', { title }),
+ description: longDescription
+ }}
exampleCards={exampleCards}
/>
);
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 dd79168..988e6c0 100644
--- a/src/pages/tools/time/convert-time-to-seconds/meta.ts
+++ b/src/pages/tools/time/convert-time-to-seconds/meta.ts
@@ -3,13 +3,13 @@ import { lazy } from 'react';
export const tool = defineTool('time', {
path: 'convert-time-to-seconds',
- name: 'Convert Time to Seconds',
- icon: 'ic:round-timer-10-select',
- description:
- 'With this browser-based application, you can convert clock time provided in hours, minutes, and seconds into just seconds. Given a time in HH:MM:SS format, it calculates HH*3600 + MM*60 + SS and prints this value in the output box. It supports AM/PM time formats as well as clock times beyond 24 hours.',
- shortDescription: 'Quickly convert clock time in H:M:S format to seconds.',
- keywords: ['convert', 'seconds', 'time', 'clock'],
- longDescription:
- 'This is a quick online utility for calculating how many seconds there are in the given time. When you input a full clock time in the input box (in format H:M:S), it gets split into hours, minutes, and seconds, and using the math formula hours×60×60 plus minutes×60 plus seconds, it finds the seconds. If seconds are missing (format is H:M), then the formula becomes hours×60×60 plus minutes×60. If minutes are also missing, then the formula becomes hours×60×60. As an extra feature, hours, minutes, and seconds are not limited to just 24 hours, 60 minutes, and 60 seconds. You can use any hours value, any minutes value, and any seconds value. For example, the input time "72:00:00" will find the number of seconds in three days (72 hours is 3×24 hours) and the input time "0:1000:0" will find seconds in 1000 minutes. Timeabulous!',
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:schedule',
+
+ keywords: ['time', 'seconds', 'convert', 'format'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'time:convertTimeToSeconds.title',
+ description: 'time:convertTimeToSeconds.description',
+ shortDescription: 'time:convertTimeToSeconds.shortDescription'
+ }
});
diff --git a/src/pages/tools/time/crontab-guru/meta.ts b/src/pages/tools/time/crontab-guru/meta.ts
index 1ce0744..2c5d2e0 100644
--- a/src/pages/tools/time/crontab-guru/meta.ts
+++ b/src/pages/tools/time/crontab-guru/meta.ts
@@ -2,23 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('time', {
- name: 'Crontab explainer',
path: 'crontab-guru',
- icon: 'mdi:calendar-clock',
- description:
- 'Parse, validate, and explain crontab expressions in plain English.',
- shortDescription: 'Crontab expression parser and explainer',
- keywords: [
- 'crontab',
- 'cron',
- 'schedule',
- 'guru',
- 'time',
- 'expression',
- 'parser',
- 'explain'
- ],
- longDescription:
- 'Enter a crontab expression (like "35 16 * * 0-5") to get a human-readable explanation and validation. Useful for understanding and debugging cron schedules. Inspired by crontab.guru.',
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:schedule',
+
+ keywords: ['cron', 'schedule', 'automation', 'expression'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'time:crontabGuru.title',
+ description: 'time:crontabGuru.description',
+ shortDescription: 'time:crontabGuru.shortDescription'
+ }
});
diff --git a/src/pages/tools/time/time-between-dates/index.tsx b/src/pages/tools/time/time-between-dates/index.tsx
index 94491b9..7caef08 100644
--- a/src/pages/tools/time/time-between-dates/index.tsx
+++ b/src/pages/tools/time/time-between-dates/index.tsx
@@ -11,6 +11,7 @@ import {
} from './service';
import * as Yup from 'yup';
import { CardExampleType } from '@components/examples/ToolExamples';
+import { useTranslation } from 'react-i18next';
type TimeUnit =
| 'milliseconds'
@@ -120,11 +121,12 @@ const exampleCards: CardExampleType[] = [
];
export default function TimeBetweenDates() {
+ const { t } = useTranslation('time');
const [result, setResult] = useState('');
return (
[
{
- title: 'Start Date & Time',
+ title: t('timeBetweenDates.startDateTime'),
component: (
updateField('startDate', val)}
type="date"
/>
updateField('startTime', val)}
type="time"
/>
updateField('startTimezone', val)}
options={timezoneOptions}
@@ -184,23 +185,23 @@ export default function TimeBetweenDates() {
)
},
{
- title: 'End Date & Time',
+ title: t('timeBetweenDates.endDateTime'),
component: (
updateField('endDate', val)}
type="date"
/>
updateField('endTime', val)}
type="time"
/>
updateField('endTimezone', val)}
options={timezoneOptions}
diff --git a/src/pages/tools/time/time-between-dates/meta.ts b/src/pages/tools/time/time-between-dates/meta.ts
index a94f6ec..028617b 100644
--- a/src/pages/tools/time/time-between-dates/meta.ts
+++ b/src/pages/tools/time/time-between-dates/meta.ts
@@ -2,21 +2,14 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('time', {
- name: 'Time Between Dates',
path: 'time-between-dates',
- icon: 'tabler:clock-minus',
- description:
- 'Calculate the exact time difference between two dates and times, with support for different timezones. This tool provides a detailed breakdown of the time difference in various units (years, months, days, hours, minutes, and seconds).',
- shortDescription:
- 'Calculate the precise time duration between two dates with timezone support.',
- keywords: [
- 'time',
- 'dates',
- 'difference',
- 'duration',
- 'calculator',
- 'timezones',
- 'interval'
- ],
- component: lazy(() => import('./index'))
+ icon: 'material-symbols:schedule',
+
+ keywords: ['dates', 'time', 'difference', 'duration', 'calculate'],
+ component: lazy(() => import('./index')),
+ i18n: {
+ name: 'time:timeBetweenDates.title',
+ description: 'time:timeBetweenDates.description',
+ shortDescription: 'time:timeBetweenDates.shortDescription'
+ }
});
diff --git a/src/pages/tools/time/truncate-clock-time/index.tsx b/src/pages/tools/time/truncate-clock-time/index.tsx
index ae76280..f754748 100644
--- a/src/pages/tools/time/truncate-clock-time/index.tsx
+++ b/src/pages/tools/time/truncate-clock-time/index.tsx
@@ -9,6 +9,7 @@ import { CardExampleType } from '@components/examples/ToolExamples';
import CheckboxWithDesc from '@components/options/CheckboxWithDesc';
import SimpleRadio from '@components/options/SimpleRadio';
import { truncateClockTime } from './service';
+import { useTranslation } from 'react-i18next';
const initialValues = {
onlySecond: true,
@@ -67,6 +68,7 @@ export default function TruncateClockTime({
title,
longDescription
}: ToolComponentProps) {
+ const { t } = useTranslation('time');
const [input, setInput] = useState('');
const [result, setResult] = useState('');
@@ -86,48 +88,48 @@ export default function TruncateClockTime({
updateField
}) => [
{
- title: 'Truncation Side',
+ title: t('truncateClockTime.truncationSide'),
component: (