diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md deleted file mode 100644 index c4bf532b..00000000 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve our tools -title: '[BUG] ' -labels: bug -assignees: CorentinTh ---- - -**Which tool is impacted?** -Example: the token generator - -**To Reproduce** -Steps to reproduce the behavior: - -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Configuration (please complete the following information):** - -- Device: [e.g. iPhone6, ] -- OS: [e.g. iOS] -- Browser [e.g. chrome, safari] -- Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 00000000..d338fa3f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,48 @@ +name: 🐞 Bug Report +description: File a bug report. +labels: ['bug', 'triage'] +assignees: + - CorentinTh +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + + - type: textarea + id: bug-description + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. If you intend to submit a PR for this issue, tell us in the description. Thanks! + placeholder: Bug description + validations: + required: true + + - type: textarea + id: what-happened + attributes: + label: What happened? + description: Also tell us, what did you expect to happen? If you have a screenshot, you can paste it here. + placeholder: Tell us what you see! + value: 'A bug happened!' + validations: + required: true + + - type: textarea + id: version + attributes: + label: System information + description: What is you environment? You can use the `npx envinfo --system --browsers` command to get this information. + validations: + required: true + + - type: dropdown + id: app-type + attributes: + label: Where did you encounter the bug? + options: + - Public app (it-tools.tech) + - A self hosted + - Other (installations, docker, etc.) + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..3ba13e0c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 00000000..edae822e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,56 @@ +name: 🚀 New feature proposal +description: Propose a new feature/enhancement or tool idea for IT-Tools +labels: ['enhancement', 'triage'] + +body: + - type: markdown + attributes: + value: | + Thanks for your interest in the project and taking the time to fill out this feature report! + + - type: dropdown + id: request-type + attributes: + label: What type of request is this? + options: + - New tool idea + - New feature for an existing tool + - Deployment or CI/CD improvement + - Self-hosting improvement + - Other + validations: + required: true + + - type: textarea + id: feature-description + attributes: + label: Clear and concise description of the feature you are proposing + description: A clear and concise description of what the feature is. + placeholder: 'Example: a token generator tool' + validations: + required: true + + - type: textarea + id: alternative + attributes: + label: Is their example of this tool in the wild? + description: Provide link to already existing tool (like websites, apps, cli, ...) or npm packages that could be used or provide inspiration for the feature. + + - type: textarea + id: additional-context + attributes: + label: Additional context + description: Any other context or screenshots about the feature request here. + + - type: checkboxes + id: checkboxes + attributes: + label: Validations + description: Before submitting the issue, please make sure you do the following + options: + - label: Check the feature is not already implemented in the project. + required: true + - label: Check that there isn't already an issue that request the same feature to avoid creating a duplicate. + required: true + - label: Check that the feature can be implemented in a client side only app (IT-Tools is client side only, no server). + required: true diff --git a/.github/ISSUE_TEMPLATE/new-tool-request.md b/.github/ISSUE_TEMPLATE/new-tool-request.md deleted file mode 100644 index a67a9cd0..00000000 --- a/.github/ISSUE_TEMPLATE/new-tool-request.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -name: New tool request -about: Suggest a new tool idea -title: '[NEW TOOL]' -labels: new tool -assignees: CorentinTh ---- - -**What tool do you want?** -Example: a token generator - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Is their example of this tool in the wild?** -Provide link to already existing tool or npm packages if any exists - -**Additional context** -Add any other context about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/other-request.md b/.github/ISSUE_TEMPLATE/other-request.md deleted file mode 100644 index b4901ed4..00000000 --- a/.github/ISSUE_TEMPLATE/other-request.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -name: Other request -about: Any request that does not concern a tool creation, a new feature request on a tool or a bug -title: '[OTHER] ' -labels: -assignees: CorentinTh ---- - -**Describe the solution you'd like** -A clear and concise description of what you want. - -**Additional context** -Add any other context about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/tool-improvement.md b/.github/ISSUE_TEMPLATE/tool-improvement.md deleted file mode 100644 index 8ff8bb6c..00000000 --- a/.github/ISSUE_TEMPLATE/tool-improvement.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -name: Tool improvement -about: Improvement on an existing tool -title: '[TOOL IMPROVEMENT]' -labels: enhancement -assignees: CorentinTh ---- - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Additional context** -Add any other context about the feature request here. diff --git a/.github/logo-dark.png b/.github/logo-dark.png new file mode 100644 index 00000000..9bee8a9c Binary files /dev/null and b/.github/logo-dark.png differ diff --git a/.github/logo-white.png b/.github/logo-white.png new file mode 100644 index 00000000..560a135b Binary files /dev/null and b/.github/logo-white.png differ diff --git a/.github/logo.png b/.github/logo.png deleted file mode 100644 index 18bac950..00000000 Binary files a/.github/logo.png and /dev/null differ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d5c67208..4dd9ffb7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ jobs: - run: corepack enable - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 20 cache: 'pnpm' - name: Install dependencies diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 6d11e825..00000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,69 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [ dev ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ dev ] - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ 'javascript' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - - steps: - - name: Checkout repository - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - # â„č Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/docker-nightly-release.yml b/.github/workflows/docker-nightly-release.yml index 81a0898c..41dbb155 100644 --- a/.github/workflows/docker-nightly-release.yml +++ b/.github/workflows/docker-nightly-release.yml @@ -32,7 +32,7 @@ jobs: - run: corepack enable - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 20 cache: 'pnpm' - name: Install dependencies diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index b5b04096..13b787ef 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 20 cache: 'pnpm' - name: Get Playwright version diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 8ed4099d..d0d3febd 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -61,7 +61,7 @@ jobs: - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 20 cache: 'pnpm' - name: Install dependencies diff --git a/CHANGELOG.md b/CHANGELOG.md index 09ff19c9..984fa58e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,22 +2,102 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## Version 2024.05.13-a0bc346 + +### Features +- **i18n**: added German translation (#1038) (2c2fb21) +- **new tool**: Outlook Safelink Decoder (#911) (d3b32cc) +- **new tool**: ascii art generator (#886) (fe349ad) +- **i18n**: get locales on build (#880) (dc04615) +- **i18n**: added vi tools translations (#876) (079aa21) +- **i18n**: added zh tools translations (#874) (9c6b122) +- **i18n**: added missing locale files in tools (#863) (7f5fa00) +- **i18n**: added vietnamese language (#859) (1334bff) +- **i18n**: added spanish language (#854) (85b50bb) +- **i18n**: added portuguese language (#813) (c65ffb6) +- **i18n**: added ukrainian language (#827) (693f362) +- **new-tool**: yaml formater (#779) (fc06f01) +- **new-tool**: added unicode conversion utilities (#858) (c46207f) + +### Bug fixes +- **language**: English language cleanup (#1036) (221ddfa) +- **url-encoder, validation**: typo in validation of url-encoder.vue #1024 (cb5b462) +- **integer base converter**: support bigint (#872) (9eac9cb) +- **bcrypt tool**: allow salt rounds up to 100 (#987) (23f82d9) + +### Refactoring +- **lint**: removed extra semi (33e5294) +- **auto-imports**: regen auto imports (1242842) +- **home**: lightened tool cards (#882) (a07806c) +- **home**: removed n-grid to prevent layout shift (#881) (10e56b3) +- **i18n**: added locales per tool (#861) (95698cb) + +### Chores +- **issues**: prevent empty issues (#1078) (a0bc346) +- **issues**: removed old issue templates (#1077) (5a7b0f9) +- **node**: upgraded node version in CI workflows (b59942a) +- **version**: release 2024.05.10-33e5294 (38d5687) +- **issues**: improved issues template (2852c30) +- **issues**: improved bug issue template (#1046) (a799234) + +### Documentation +- **changelog**: update changelog for 2024.05.10-33e5294 (9dfd347) + +## Version 2023.12.21-5ed3693 + +### Features + +- **i18n**: improve chinese i18n (#757) (2e56641) +- **i18n**: add tooltip and favoriteButton i18n (#756) (a1037cf) +- **i18n**: add Chinese translation base (#718) (8f99eb6) +- **new tool**: pdf signature checker (#745) (4781920) +- **new tool**: numeronym generator (#729) (e07e2ae) + +### Bug fixes + +- **jwt-parser**: jwt claim array support (#799) (5ed3693) +- **camera-recorder**: stop camera on navigation (#782) (80e46c9) +- **doc**: updated create new tool command in readme (#762) (7a70dbb) +- **base64-file-converter**: fix downloading of index.html content without data preambula (#750) (043e4f0) +- **docker**: rollback armv7 in docker releases (#741) (205e360) +- **eta**: corrected example (#737) (821cbea) + +### Refactoring + +- **about, i18n**: improved i18n dx with markdown (#753) (bd3edcb) +- **token, i18n**: complete fr translation (#752) (de1ee69) +- **uuid generator**: uuid version picker (#751) (38586ca) +- **case converter**: no split on lowercase, uppercase and mocking case (#748) (ca43a25) +- **ui**: replaced legacy n-upload with c-file-upload (#747) (7fe47b3) +- **token**: added password in token generator keywords (#746) (16ffe6b) +- **bcrypt**: fix input label align (#721) (093ff31) + +### Chores + +- **deps**: switched from oui to oui-data for mac address lookup (#693) (0fe9a20) +- **deps**: update unocss monorepo to ^0.57.0 (#638) (2e396d8) +- **docker**: added armv7 plateform for docker releases (#722) (fe1de8c) + ## Version 2023.11.02-7d94e11 ### Features + - **i18n**: language selector (#710) (e86fd96) ### Bug fixes + - **dockerfile**: revert replacement of nginx image with non-privileged one (#716) (7d94e11) - **encryption**: alert on decryption error (#711) (02b0d0d) ### Refactoring + - **math-evaluator**: improved description (e87f4b1) - **math-evaluator**: improved search and UX (#713) (58de897) ## Version 2023.11.01-e164afb ### Features + - **command-palette**: clear prompt on palette close (#708) (d013696) - **command-palette**: added about page in command palette (99b1eb9) - **new tool**: random MAC address generator (#657) (cc3425d) @@ -36,11 +116,13 @@ All notable changes to this project will be documented in this file. See [standa - **new tool**: text diff and comparator (#588) (81bfe57) ### Bug fixes + - **deps**: fix issue on slugify (#593) (#673) (720201a) - **deps**: update dependency monaco-editor to ^0.43.0 (#620) (e371ef7) - **deps**: update dependency sql-formatter to v13 (#606) (c7d4562) ### Refactoring + - **ui**: better ui demo preview menu (#664) (015c673) - **color-converter**: improved color-converter UX (#701) (abb8335) - **docker**: improved docker config (#700) (020e9cb) @@ -57,6 +139,7 @@ All notable changes to this project will be documented in this file. See [standa - **bcrypt**: fix typo (#604) (e18bae1) ### Chores + - **deps**: clean unused dependencies (#709) (e164afb) - **deps**: update docker/setup-qemu-action action to v3 (#627) (4365226) - **deps**: update docker/setup-buildx-action action to v3 (#626) (57ecda1) @@ -71,19 +154,23 @@ All notable changes to this project will be documented in this file. See [standa - **deps**: update dependency typescript to ~5.2.0 (#587) (f3e14fc) ### Doc + - **readme**: added contributors list (#622) (557b304) - **hosting**: added cloudron in the other hosting solutions section (#589) (06c3547) ## Version 2023.08.21-6f93cba ### Features + - **copy**: support legacy copy to clipboard for older browser (#581) (6f93cba) - **new tool**: string obfuscator (#575) (c58d6e3) ### Bug fixes + - **deps**: update dependency sql-formatter to v12 (#520) (2bcb77a) ### Chores + - **deps**: switched to fucking typescript v5 (#501) (76b2761) - **deps**: update dependency @antfu/eslint-config to ^0.40.0 (#552) (6ff9a01) - **deps**: update dependency prettier to v3 (#564) (a2b9b15) @@ -93,6 +180,7 @@ All notable changes to this project will be documented in this file. See [standa ## Version 2023.08.16-9bd4ad4 ### Features + - **Case Converter**: Add lowercase and uppercase (#534) (7b6232a) - **new tool**: emoji picker (#551) (93f7cf0) - **ui**: added c-select in the ui lib (#550) (dfa1ba8) @@ -113,6 +201,7 @@ All notable changes to this project will be documented in this file. See [standa - **base64-string-converter**: switch to encode and decode url safe base64 strings (#392) (0b20f1c) ### Bug fixes + - **deps**: update dependency uuid to v9 (#566) (5e12991) - **deps**: update dependency mathjs to v11 (#519) (7924456) - **deps**: update dependency @vueuse/router to v10 (#516) (ea0f27c) @@ -132,6 +221,7 @@ All notable changes to this project will be documented in this file. See [standa - **ipv4-converter**: removed readonly on input (7aed9c5) ### Refactoring + - **navbar**: consistent spacing in navbar buttons (#507) (30f88fc) - **ui**: remove n-text (#506) (72c98a3) - **ui**: replaced some n-input to c-input (#505) (05ea545) @@ -144,6 +234,7 @@ All notable changes to this project will be documented in this file. See [standa - **ui**: replaced some n-input with c-input-text (f7fc779) ### Chores + - **deps**: update dependency vitest to ^0.34.0 (#562) (9bd4ad4) - **deps**: update dependency node to v18.17.1 (#560) (65a9474) - **deps**: update dependency unocss to ^0.55.0 (#561) (85cc7a8) @@ -184,47 +275,58 @@ All notable changes to this project will be documented in this file. See [standa - **lint**: switched to a better lint config (33c9b66) ### Refacor + - **transformers**: use monospace font for JSON and SQL text areas (#476) (ba4876d) ### Documentation + - **ide**: updated vscode extensions settings (#472) (847323c) ### Chors + - **deps**: updated vueuse dependency version (8515c24) ## Version 2023.05.14-77f2efc ### Features + - **list-converter**: a small converter who deals with column based data and do some stuff with it (#387) (83a7b3b) - **new tool**: phone parser and normalizer (ce3150c) ### Bug fixes + - **phone-parser**: use default country code (a43c546) - **home**: prevent weird blue border on card (3f6c8f0) ### Refactoring + - **ui**: replaced some n-input with c-input-text (77f2efc) ### Chores + - **issues**: updated new tool request issue template (edae4c6) ### Ui-lib + - **new-component**: added text input component in the c-lib (aad8d84) - **button**: size variants (401f13f) ## Version 2023.04.23-92bd835 ### Features + - **ui-lib**: demo pages for c-lib components (92bd835) - **new-tool**: diff of two json objects (362f2fa) - **ipv4-range-expander**: expands a given IPv4 start and end address to a valid IPv4 subnet (#366) (df989e2) - **date converter**: auto focus main input (6d22025) ### Bug fixes + - **ts**: cleaned legacy typechecking warning (e88c1d5) - **mac-address-lookup**: added copy handler on button click (c311e38) ### Refactoring + - **ui-lib**: prevent c-button to shrink (61ece23) - **ui**: replaced naive ui cards with custom ones (f080933) - **clean**: removed unused lodash import (bb32513) @@ -234,48 +336,60 @@ All notable changes to this project will be documented in this file. See [standa ## Version 2023.04.14-dbad773 ### Features + - **new-tool**: http status codes (8355bd2) ### Refactoring + - **uuid-generator**: prevent NaN in quantity (6fb4994) ### Chores + - **release**: create a github release on new version (dbad773) - **version**: reset CHANGELOG content to support new format (85cb0ff) ## Version 2023.04.14-f9b77b7 ### Features + - **new-tool**: http status codes (8355bd2) ### Refactoring + - **uuid-generator**: prevent NaN in quantity (6fb4994) ### Chores + - **release**: create a github release on new version (f9b77b7) - **version**: reset CHANGELOG content to support new format (85cb0ff) ## Version 2023.04.14-2f0d239 ### Features + - **new-tool**: http status codes (8355bd2) ### Refactoring + - **uuid-generator**: prevent NaN in quantity (6fb4994) ### Chores + - **release**: create a github release on new version (2f0d239) - **version**: reset CHANGELOG content to support new format (85cb0ff) ## Version 2023.04.14-474cae4 ### Features + - **new-tool**: http status codes (8355bd2) ### Refactoring + - **uuid-generator**: prevent NaN in quantity (6fb4994) ### Chores + - **release**: create a github release on new version (474cae4) - **version**: reset CHANGELOG content to support new format (85cb0ff) diff --git a/README.md b/README.md index a51f9c53..93c7aa73 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,8 @@ -![logo](.github/logo.png) + + + + logo + Useful tools for developer and people working in IT. [Have a look !](https://it-tools.tech). @@ -113,7 +117,7 @@ Big thanks to all the people who have already contributed! ## Credits -Coded with ❀ by [Corentin Thomasset](//corentin-thomasset.fr). +Coded with ❀ by [Corentin Thomasset](https://corentin.tech?utm_source=it-tools&utm_medium=readme). This project is continuously deployed using [vercel.com](https://vercel.com). diff --git a/components.d.ts b/components.d.ts index 29dccdc1..ea73a54a 100644 --- a/components.d.ts +++ b/components.d.ts @@ -12,6 +12,7 @@ declare module '@vue/runtime-core' { '404.page': typeof import('./src/pages/404.page.vue')['default'] About: typeof import('./src/pages/About.vue')['default'] App: typeof import('./src/App.vue')['default'] + AsciiTextDrawer: typeof import('./src/tools/ascii-text-drawer/ascii-text-drawer.vue')['default'] 'Base.layout': typeof import('./src/layouts/base.layout.vue')['default'] Base64FileConverter: typeof import('./src/tools/base64-file-converter/base64-file-converter.vue')['default'] Base64StringConverter: typeof import('./src/tools/base64-string-converter/base64-string-converter.vue')['default'] @@ -72,6 +73,7 @@ declare module '@vue/runtime-core' { DurationCalculator: typeof import('./src/tools/duration-calculator/duration-calculator.vue')['default'] DynamicValues: typeof import('./src/tools/benchmark-builder/dynamic-values.vue')['default'] Editor: typeof import('./src/tools/html-wysiwyg-editor/editor/editor.vue')['default'] + EmailNormalizer: typeof import('./src/tools/email-normalizer/email-normalizer.vue')['default'] EmojiCard: typeof import('./src/tools/emoji-picker/emoji-card.vue')['default'] EmojiGrid: typeof import('./src/tools/emoji-picker/emoji-grid.vue')['default'] EmojiPicker: typeof import('./src/tools/emoji-picker/emoji-picker.vue')['default'] @@ -110,6 +112,7 @@ declare module '@vue/runtime-core' { JsonMinify: typeof import('./src/tools/json-minify/json-minify.vue')['default'] JsonToCsv: typeof import('./src/tools/json-to-csv/json-to-csv.vue')['default'] JsonToToml: typeof import('./src/tools/json-to-toml/json-to-toml.vue')['default'] + JsonToXml: typeof import('./src/tools/json-to-xml/json-to-xml.vue')['default'] JsonToYaml: typeof import('./src/tools/json-to-yaml-converter/json-to-yaml.vue')['default'] JsonViewer: typeof import('./src/tools/json-viewer/json-viewer.vue')['default'] JwtParser: typeof import('./src/tools/jwt-parser/jwt-parser.vue')['default'] @@ -119,6 +122,7 @@ declare module '@vue/runtime-core' { LoremIpsumGenerator: typeof import('./src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue')['default'] MacAddressGenerator: typeof import('./src/tools/mac-address-generator/mac-address-generator.vue')['default'] MacAddressLookup: typeof import('./src/tools/mac-address-lookup/mac-address-lookup.vue')['default'] + MarkdownToHtml: typeof import('./src/tools/markdown-to-html/markdown-to-html.vue')['default'] MathEvaluator: typeof import('./src/tools/math-evaluator/math-evaluator.vue')['default'] MenuBar: typeof import('./src/tools/html-wysiwyg-editor/editor/menu-bar.vue')['default'] MenuBarItem: typeof import('./src/tools/html-wysiwyg-editor/editor/menu-bar-item.vue')['default'] @@ -152,11 +156,15 @@ declare module '@vue/runtime-core' { PhoneParserAndFormatter: typeof import('./src/tools/phone-parser-and-formatter/phone-parser-and-formatter.vue')['default'] QrCodeGenerator: typeof import('./src/tools/qr-code-generator/qr-code-generator.vue')['default'] RandomPortGenerator: typeof import('./src/tools/random-port-generator/random-port-generator.vue')['default'] + RegexMemo: typeof import('./src/tools/regex-memo/regex-memo.vue')['default'] + 'RegexMemo.content': typeof import('./src/tools/regex-memo/regex-memo.content.md')['default'] + RegexTester: typeof import('./src/tools/regex-tester/regex-tester.vue')['default'] ResultRow: typeof import('./src/tools/ipv4-range-expander/result-row.vue')['default'] RomanNumeralConverter: typeof import('./src/tools/roman-numeral-converter/roman-numeral-converter.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] RsaKeyPairGenerator: typeof import('./src/tools/rsa-key-pair-generator/rsa-key-pair-generator.vue')['default'] + SafelinkDecoder: typeof import('./src/tools/safelink-decoder/safelink-decoder.vue')['default'] SlugifyString: typeof import('./src/tools/slugify-string/slugify-string.vue')['default'] SpanCopyable: typeof import('./src/components/SpanCopyable.vue')['default'] SqlPrettify: typeof import('./src/tools/sql-prettify/sql-prettify.vue')['default'] @@ -168,6 +176,7 @@ declare module '@vue/runtime-core' { TextStatistics: typeof import('./src/tools/text-statistics/text-statistics.vue')['default'] TextToBinary: typeof import('./src/tools/text-to-binary/text-to-binary.vue')['default'] TextToNatoAlphabet: typeof import('./src/tools/text-to-nato-alphabet/text-to-nato-alphabet.vue')['default'] + TextToUnicode: typeof import('./src/tools/text-to-unicode/text-to-unicode.vue')['default'] TokenDisplay: typeof import('./src/tools/otp-code-generator-and-validator/token-display.vue')['default'] 'TokenGenerator.tool': typeof import('./src/tools/token-generator/token-generator.tool.vue')['default'] TomlToJson: typeof import('./src/tools/toml-to-json/toml-to-json.vue')['default'] @@ -182,7 +191,9 @@ declare module '@vue/runtime-core' { UuidGenerator: typeof import('./src/tools/uuid-generator/uuid-generator.vue')['default'] WifiQrCodeGenerator: typeof import('./src/tools/wifi-qr-code-generator/wifi-qr-code-generator.vue')['default'] XmlFormatter: typeof import('./src/tools/xml-formatter/xml-formatter.vue')['default'] + XmlToJson: typeof import('./src/tools/xml-to-json/xml-to-json.vue')['default'] YamlToJson: typeof import('./src/tools/yaml-to-json-converter/yaml-to-json.vue')['default'] YamlToToml: typeof import('./src/tools/yaml-to-toml/yaml-to-toml.vue')['default'] + YamlViewer: typeof import('./src/tools/yaml-viewer/yaml-viewer.vue')['default'] } } diff --git a/locales/de.yml b/locales/de.yml new file mode 100644 index 00000000..e59ca114 --- /dev/null +++ b/locales/de.yml @@ -0,0 +1,455 @@ +'404': + notFound: 404 Nicht gefunden + sorry: Entschuldigung, diese Seite scheint nicht zu existieren + maybe: >- + Vielleicht macht der Cache etwas Seltsames. Mit einem erzwungenen Neuladen + versuchen? + backHome: ZurĂŒck zur Startseite +home: + categories: + newestTools: Neueste Tools + favoriteTools: Deine Lieblingstools + allTools: Alle Tools + subtitle: Praktische Tools fĂŒr Entwickler + toggleMenu: MenĂŒ umschalten + home: Startseite + uiLib: UI-Bibliothek + support: UnterstĂŒtze die Entwicklung von IT-Tools + buyMeACoffee: Kauf mir einen Kaffee + follow: + title: Magst du IT-Tools? + p1: Gib uns einen Stern auf + githubRepository: IT-Tools GitHub-Repository + p2: oder folge uns auf + twitterAccount: IT-Tools Twitter-Konto + thankYou: Vielen Dank! + nav: + github: GitHub-Repository + githubRepository: IT-Tools GitHub-Repository + twitter: Twitter-Konto + twitterAccount: IT-Tools Twitter-Konto + about: Über IT-Tools + aboutLabel: Über + darkMode: Dunkelmodus + lightMode: Hellmodus + mode: Wechseln zwischen dunklem/hellem Modus +about: + content: > + # Über IT-Tools + + Diese wunderbare Website, erstellt mit ❀ von [Corentin + Thomasset](https://corentin.tech?utm_source=it-tools&utm_medium=about), sammelt nĂŒtzliche Tools fĂŒr + Entwickler und Menschen, die in der IT arbeiten. Wenn du sie nĂŒtzlich + findest, teile sie gerne mit Personen, von denen du denkst, dass sie sie + ebenfalls nĂŒtzlich finden könnten, und vergiss nicht, sie in deiner + Lesezeichenleiste zu speichern! + + IT-Tools ist Open Source (unter der MIT-Lizenz) und kostenlos und wird es + immer sein, aber es kostet mich Geld, die Website zu hosten und den + Domainnamen zu erneuern. Wenn du meine Arbeit unterstĂŒtzen möchtest und mich + ermutigen möchtest, mehr Tools hinzuzufĂŒgen, ĂŒberlege bitte, mich durch + [Sponsoring](https://www.buymeacoffee.com/cthmsst) zu unterstĂŒtzen. + + ## Technologien + + IT-Tools wurde mit Vue.js (Vue 3) und der Naive UI-Komponentenbibliothek + erstellt und wird von Vercel gehostet und kontinuierlich bereitgestellt. In + einigen Tools werden Drittanbieter-Open-Source-Bibliotheken verwendet. Du + findest die vollstĂ€ndige Liste in der + [package.json](https://github.com/CorentinTh/it-tools/blob/main/package.json)-Datei + des Repositorys. + + ## Einen Fehler gefunden? Ein Tool fehlt? + + Wenn du ein Tool benötigst, das hier noch nicht vorhanden ist, und du + denkst, dass es nĂŒtzlich sein könnte, bist du herzlich eingeladen, einen + Feature-Request im + [Issues-Bereich](https://github.com/CorentinTh/it-tools/issues/new/choose) + im GitHub-Repository einzureichen. + + Und wenn du einen Fehler gefunden hast oder etwas nicht wie erwartet + funktioniert, melde bitte einen Fehler im + [Issues-Bereich](https://github.com/CorentinTh/it-tools/issues/new/choose) + im GitHub-Repository. +favoriteButton: + remove: Aus Favoriten entfernen + add: Zu Favoriten hinzufĂŒgen +toolCard: + new: Neu +search: + label: Suche +tools: + categories: + favorite-tools: Deine Lieblingstools + crypto: Krypto + converter: Konverter + web: Web + images and videos: Bilder & Videos + development: Entwicklung + network: Netzwerk + math: Mathematik + measurement: Messung + text: Text + data: Daten + password-strength-analyser: + title: PasswortstĂ€rken-Analysator + description: >- + Ermittle die StĂ€rke deines Passworts mit diesem Client-seitigen + PasswortstĂ€rken-Analysator und Tool zur SchĂ€tzung der Knackzeit. + chronometer: + title: Chronometer + description: >- + Überwache die Dauer einer Sache. Im Grunde ein Chronometer mit einfachen + Chronometerfunktionen. + token-generator: + title: Token-Generator + description: >- + Generiere eine zufĂ€llige Zeichenfolge mit den von dir gewĂŒnschten Zeichen, + Groß- oder Kleinbuchstaben, Zahlen und/oder Symbolen. + uppercase: Großbuchstaben (ABC...) + lowercase: Kleinbuchstaben (abc...) + numbers: Zahlen (123...) + symbols: Symbole (!-;...) + length: LĂ€nge + tokenPlaceholder: Der Token ... + copied: Token in die Zwischenablage kopiert + button: + copy: Kopieren + refresh: Aktualisieren + percentage-calculator: + title: Prozentrechner + description: >- + Berechne einfach ProzentsĂ€tze von einem Wert zu einem anderen Wert oder + von einem Prozentsatz zu einem Wert. + svg-placeholder-generator: + title: SVG-Platzhalter-Generator + description: >- + Generiere SVG-Bilder, die als Platzhalter in deinen Anwendungen verwendet + werden können. + json-to-csv: + title: JSON zu CSV + description: Konvertiere JSON mit automatischer Headererkennung in CSV. + camera-recorder: + title: Kamera-Rekorder + description: Mache ein Foto oder nimm ein Video von deiner Webcam oder Kamera auf. + keycode-info: + title: Keycode-Info + description: >- + Finde den JavaScript-Keycode, den Code, den Standort und die Modifikatoren + einer beliebigen gedrĂŒckten Taste. + emoji-picker: + title: Emoji-Picker + description: >- + Einfaches Kopieren und EinfĂŒgen von Emojis. Erhalte außerdem den Unicode- + und Codepunkt-Wert jedes Emojis. + color-converter: + title: Farbkonverter + description: >- + Konvertiere Farben zwischen den verschiedenen Formaten (Hex, RGB, HSL und + CSS-Name). + bcrypt: + title: Bcrypt + description: >- + Hashen und Vergleichen von Strings mit bcrypt. Bcrypt ist eine auf der + Blowfish-Chiffre basierende Hash-Funktion. + crontab-generator: + title: Crontab-Generator + description: >- + ÜberprĂŒfe und generiere Crontab und erhalte die menschenlesbare + Beschreibung des Cron-Zeitplans. + http-status-codes: + title: HTTP-Statuscodes + description: Liste aller HTTP-Statuscodes, ihrer Namen und ihrer Bedeutung. + sql-prettify: + title: SQL verschönern und formatieren + description: >- + Formatiere und verschönere deine SQL-Abfragen online (unterstĂŒtzt + verschiedene SQL-Dialekte). + benchmark-builder: + title: Benchmark-Builder + description: >- + Vergleiche ganz einfach die AusfĂŒhrungszeit von Aufgaben mit diesem sehr + einfachen Online-Benchmark-Builder. + git-memo: + title: Git-Spickzettel + description: >- + Git ist eine dezentrale Versionsverwaltungssoftware. Mit diesem + Spickzettel hast du schnellen Zugriff auf die gĂ€ngigsten Git-Befehle. + slugify-string: + title: Slugify String + description: Mache einen String URL-, Dateinamen- und ID-sicher. + encryption: + title: Text verschlĂŒsseln / entschlĂŒsseln + description: >- + VerschlĂŒssele und entschlĂŒssele Klartext mithilfe von Kryptoalgorithmen + wie AES, TripleDES, Rabbit oder RC4. + random-port-generator: + title: ZufĂ€lliger Port-Generator + description: >- + Generiere zufĂ€llige Portnummern außerhalb des Bereichs der "bekannten" + Ports (0-1023). + yaml-prettify: + title: YAML verschönern und formatieren + description: Verschönere deinen YAML-String in ein menschenlesbares Format. + eta-calculator: + title: ETA-Rechner + description: >- + Ein ETA (Estimated Time of Arrival)-Rechner, um die ungefĂ€hre Endzeit + einer Aufgabe zu erfahren, z. B. den Zeitpunkt des Endes eines Downloads. + roman-numeral-converter: + title: Römische Zahlen Konverter + description: >- + Konvertiere römische Zahlen in Dezimalzahlen und Dezimalzahlen in römische + Zahlen. + hmac-generator: + title: HMAC-Generator + description: >- + Berechnet einen hashbasierten Nachrichtenauthentifizierungscode (HMAC) + unter Verwendung eines geheimen SchlĂŒssels und deiner bevorzugten + Hash-Funktion. + bip39-generator: + title: BIP39-Passphrasengenerator + description: >- + Generiere BIP39-Passphrasen aus vorhandener oder zufĂ€lliger Mnemonik oder + erhalte die Mnemonik aus der Passphrase. + base64-file-converter: + title: Base64-Dateikonverter + description: Konvertiere Strings, Dateien oder Bilder in ihre Base64-ReprĂ€sentation. + list-converter: + title: Listenkonverter + description: >- + Dieses Tool kann spaltenbasierte Daten verarbeiten und verschiedene + Änderungen (transponieren, PrĂ€fix und Suffix hinzufĂŒgen, Liste umkehren, + Liste sortieren, Werte in Kleinbuchstaben umwandeln, Werte abschneiden) + auf jede Zeile anwenden. + base64-string-converter: + title: Base64-String-Encoder/Decoder + description: Codiere und decodiere Strings einfach in ihre Base64-ReprĂ€sentation. + toml-to-yaml: + title: TOML zu YAML + description: Parse und konvertiere TOML zu YAML. + math-evaluator: + title: Mathematischer Auswerter + description: >- + Ein Taschenrechner zum Auswerten mathematischer AusdrĂŒcke. Du kannst + Funktionen wie sqrt, cos, sin, abs usw. verwenden. + json-to-yaml-converter: + title: JSON zu YAML + description: Konvertiere JSON einfach in YAML mit diesem Live-Online-Konverter. + url-parser: + title: URL-Parser + description: >- + Parse eine URL-Zeichenfolge, um alle verschiedenen Teile (Protokoll, + Ursprung, Parameter, Port, Benutzername-Passwort usw.) zu erhalten. + iban-validator-and-parser: + title: IBAN-Validator und -Parser + description: >- + Validiere und parse IBAN-Nummern. ÜberprĂŒfe, ob die IBAN gĂŒltig ist, und + erhalte das Land, BBAN, ob es sich um eine QR-IBAN handelt und das + IBAN-freundliche Format. + user-agent-parser: + title: User-Agent-Parser + description: >- + Erkenne und parse Browser, Engine, Betriebssystem, CPU und + GerĂ€tetyp/-modell aus einer User-Agent-Zeichenfolge. + numeronym-generator: + title: Numeronym-Generator + description: >- + Ein Numeronym ist ein Wort, bei dem eine Zahl verwendet wird, um eine + AbkĂŒrzung zu bilden. Zum Beispiel ist "i18n" ein Numeronym fĂŒr + "internationalization", wobei 18 fĂŒr die Anzahl der Buchstaben zwischen + dem ersten "i" und dem letzten "n" im Wort steht. + case-converter: + title: Fall-Konverter + description: >- + Ändere den Fall eines Strings und wĂ€hle zwischen verschiedenen Formaten + aus. + html-entities: + title: HTML-Entity-Escape + description: >- + Escape oder unescape HTML-EntitĂ€ten (ersetze <, >, &, " und ' durch ihre + HTML-Version). + json-prettify: + title: JSON verschönern und formatieren + description: Verschönere deinen JSON-String in ein menschenlesbares Format. + docker-run-to-docker-compose-converter: + title: Docker run zu Docker compose Konverter + description: Wandle docker run-Befehle in docker-compose-Dateien um! + mac-address-lookup: + title: MAC-Adressensuche + description: Finde den Anbieter und Hersteller eines GerĂ€ts anhand seiner MAC-Adresse. + mime-types: + title: MIME-Typen + description: Konvertiere MIME-Typen in Erweiterungen und umgekehrt. + toml-to-json: + title: TOML zu JSON + description: Parse und konvertiere TOML zu JSON. + lorem-ipsum-generator: + title: Lorem Ipsum Generator + description: >- + Lorem Ipsum ist ein Platzhaltertext, der hĂ€ufig verwendet wird, um die + visuelle Form eines Dokuments oder einer Schriftart ohne Verwendung von + bedeutendem Inhalt zu demonstrieren. + qrcode-generator: + title: QR-Code-Generator + description: >- + Generiere und downloade QR-Codes fĂŒr eine URL oder einfach einen Text und + passe die Hintergrund- und Vordergrundfarben an. + wifi-qrcode-generator: + title: WLAN-QR-Code-Generator + description: >- + Generiere und lade QR-Codes fĂŒr schnelle Verbindungen zu WLAN-Netzwerken + herunter. + xml-formatter: + title: XML-Formatter + description: Verschönere deinen XML-String in ein menschenlesbares Format. + temperature-converter: + title: Temperaturkonverter + description: >- + Temperaturgradumrechnungen fĂŒr Kelvin, Celsius, Fahrenheit, Rankine, + Delisle, Newton, RĂ©aumur und RĂžmer. + chmod-calculator: + title: Chmod-Rechner + description: >- + Berechne deine Chmod-Berechtigungen und -Befehle mit diesem + Online-Chmod-Rechner. + rsa-key-pair-generator: + title: RSA-SchlĂŒsselpaar-Generator + description: Generiere neue zufĂ€llige RSA-Private- und Public-Key-PEM-Zertifikate. + html-wysiwyg-editor: + title: HTML-WYSIWYG-Editor + description: >- + Online-HTML-Editor mit funktionsreichem WYSIWYG-Editor, erhalte sofort den + Quellcode des Inhalts. + yaml-to-toml: + title: YAML zu TOML + description: Parse und konvertiere YAML zu TOML. + mac-address-generator: + title: MAC-Adressen-Generator + description: >- + Gebe die Menge und das PrĂ€fix ein. MAC-Adressen werden in deiner gewĂ€hlten + Schreibweise (Groß- oder Kleinbuchstaben) generiert. + json-diff: + title: JSON-Unterschied + description: Vergleiche zwei JSON-Objekte und erhalte die Unterschiede zwischen ihnen. + jwt-parser: + title: JWT-Parser + description: >- + Parse und decodiere deinen JSON-Web-Token (JWT) und zeige dessen Inhalt + an. + date-converter: + title: Datum-Uhrzeit-Konverter + description: Konvertiere Datum und Uhrzeit in verschiedene Formate. + phone-parser-and-formatter: + title: Telefonnummer-Parser und -Formatter + description: >- + Parse, validiere und formatiere Telefonnummern. Erhalte Informationen zur + Telefonnummer, wie z. B. die Landesvorwahl, den Typ usw. + ipv4-subnet-calculator: + title: IPv4-Subnetzrechner + description: >- + Parse deine IPv4-CIDR-Blöcke und erhalte alle Informationen, die du ĂŒber + dein Subnetz benötigst. + og-meta-generator: + title: Open Graph Meta-Generator + description: Generiere Open Graph- und Social-HTML-Metatags fĂŒr deine Website. + ipv6-ula-generator: + title: IPv6-ULA-Generator + description: >- + Generiere deine eigenen lokalen, nicht routbaren IP-Adressen in deinem + Netzwerk gemĂ€ĂŸ RFC4193. + hash-text: + title: Text hashen + description: >- + Hashe einen Text-String mit der von dir benötigten Funktion: MD5, SHA1, + SHA256, SHA224, SHA512, SHA384, SHA3 oder RIPEMD160 + json-to-toml: + title: JSON zu TOML + description: Parse und konvertiere JSON zu TOML. + device-information: + title: GerĂ€teinformationen + description: >- + Informationen zu deinem aktuellen GerĂ€t (BildschirmgrĂ¶ĂŸe, PixelverhĂ€ltnis, + Benutzeragent, ...) erhalten. + pdf-signature-checker: + title: PDF-SignaturprĂŒfer + description: >- + ÜberprĂŒfe die Signaturen einer PDF-Datei. Eine signierte PDF-Datei enthĂ€lt + eine oder mehrere Signaturen, die verwendet werden können, um + festzustellen, ob der Inhalt der Datei seit dem Zeitpunkt der Signierung + geĂ€ndert wurde. + json-minify: + title: JSON minifizieren + description: >- + Minifiziere und komprimiere dein JSON, indem unnötige Leerzeichen entfernt + werden. + ulid-generator: + title: ULID-Generator + description: >- + Generiere zufĂ€llige Universally Unique Lexicographically Sortable + Identifier (ULID). + string-obfuscator: + title: String-Verschleierer + description: >- + Verschleiere einen String (wie ein Secret, eine IBAN oder ein Token), um + ihn weitergeben zu können und identifizierbar zu machen, ohne seinen + Inhalt preiszugeben. + base-converter: + title: Ganzzahl-Basiskonverter + description: >- + Konvertiere Zahlen zwischen verschiedenen Basen (Dezimal, Hexadezimal, + BinĂ€r, Oktal, Base64, ...). + yaml-to-json-converter: + title: YAML zu JSON + description: Konvertiere YAML einfach in JSON mit diesem Live-Online-Konverter. + uuid-generator: + title: UUID-Generator + description: >- + Ein Universally Unique Identifier (UUID) ist eine 128-Bit-Nummer, die zur + Identifizierung von Informationen in Computersystemen verwendet wird. Die + Anzahl der möglichen UUIDs betrĂ€gt 16^32, was 2^128 oder etwa 3,4x10^38 + entspricht (was ziemlich viel ist!). + ipv4-address-converter: + title: IPv4-Adresskonverter + description: >- + Konvertiere eine IP-Adresse in Dezimal, BinĂ€r, Hexadezimal oder sogar in + IPv6. + text-statistics: + title: Textstatistiken + description: >- + Informationen zu einem Text erhalten, wie die Anzahl der Zeichen, die + Anzahl der Wörter, die GrĂ¶ĂŸe usw. + text-to-nato-alphabet: + title: Text zu NATO-Alphabet + description: >- + Wandle Text in das NATO-Phonetik-Alphabet fĂŒr die mĂŒndliche Übermittlung + um. + basic-auth-generator: + title: Basic-Auth-Generator + description: >- + Generiere einen Base64-Basic-Auth-Header aus einem Benutzernamen und einem + Passwort. + text-to-unicode: + title: Text zu Unicode + description: Parse und konvertiere Text in Unicode und umgekehrt. + ipv4-range-expander: + title: IPv4-Bereichserweiterer + description: >- + Bei Angabe einer Start- und End-IPv4-Adresse berechnet dieses Tool ein + gĂŒltiges IPv4-Netzwerk mit seiner CIDR-Notation. + text-diff: + title: Textunterschied + description: Vergleiche zwei Texte und sieh die Unterschiede zwischen ihnen. + otp-generator: + title: OTP-Code-Generator + description: >- + Generiere und validiere zeitbasierte OTPs (Einmalpasswörter) fĂŒr + Multi-Faktor-Authentifizierung. + url-encoder: + title: Kodieren/Decodieren von URL-formatierten Zeichenfolgen + description: >- + Kodiere zum URL-kodierten Format (auch als "prozentkodiert" bekannt) oder + decodiere es. + text-to-binary: + title: Text zu ASCII-BinĂ€r + description: Konvertiere Text in seine ASCII-BinĂ€rreprĂ€sentation und umgekehrt. diff --git a/locales/en.yml b/locales/en.yml index ef5c4beb..d1cd21c4 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -7,7 +7,7 @@ home: toggleMenu: 'Toggle menu' home: Home uiLib: 'UI Lib' - support: 'Support IT Tools development' + support: 'Support IT-Tools development' buyMeACoffee: 'Buy me a coffee' follow: title: 'You like it-tools?' @@ -15,7 +15,7 @@ home: githubRepository: 'IT-Tools GitHub repository' p2: 'or follow us on' twitterAccount: 'IT-Tools Twitter account' - thankYou: 'Thank you !' + thankYou: 'Thank you!' nav: github: 'GitHub repository' githubRepository: 'IT-Tools GitHub repository' @@ -30,7 +30,7 @@ about: content: > # About IT-Tools - This wonderful website, made with ❀ by [Corentin Thomasset](https://github.com/CorentinTh) , aggregates useful tools for developer and people working in IT. If you find it useful, please feel free to share it to people you think may find it useful too and don't forget to bookmark it in your shortcut bar! + This wonderful website, made with ❀ by [Corentin Thomasset](https://corentin.tech?utm_source=it-tools&utm_medium=about) , aggregates useful tools for developer and people working in IT. If you find it useful, please feel free to share it to people you think may find it useful too and don't forget to bookmark it in your shortcut bar! IT Tools is open-source (under the MIT license) and free, and will always be, but it costs me money to host and renew the domain name. If you want to support my work, and encourage me to add more tools, please consider supporting by [sponsoring me](https://www.buymeacoffee.com/cthmsst). @@ -69,3 +69,325 @@ tools: measurement: Measurement text: Text data: Data + + password-strength-analyser: + title: Password strength analyser + description: Discover the strength of your password with this client-side-only password strength analyser and crack time estimation tool. + + chronometer: + title: Chronometer + description: Monitor the duration of a thing. Basically a chronometer with simple chronometer features. + + token-generator: + title: Token generator + description: Generate random string with the chars you want, uppercase or lowercase letters, numbers and/or symbols. + + uppercase: Uppercase (ABC...) + lowercase: Lowercase (abc...) + numbers: Numbers (123...) + symbols: Symbols (!-;...) + length: Length + tokenPlaceholder: 'The token...' + copied: Token copied to the clipboard + button: + copy: Copy + refresh: Refresh + percentage-calculator: + title: Percentage calculator + description: Easily calculate percentages from a value to another value, or from a percentage to a value. + + svg-placeholder-generator: + title: SVG placeholder generator + description: Generate svg images to use as a placeholder in your applications. + + json-to-csv: + title: JSON to CSV + description: Convert JSON to CSV with automatic header detection. + + camera-recorder: + title: Camera recorder + description: Take a picture or record a video from your webcam or camera. + + keycode-info: + title: Keycode info + description: Find the javascript keycode, code, location and modifiers of any pressed key. + + emoji-picker: + title: Emoji picker + description: Copy and paste emojis easily and get the unicode and code points value of each emoji. + + color-converter: + title: Color converter + description: Convert color between the different formats (hex, rgb, hsl and css name) + + bcrypt: + title: Bcrypt + description: Hash and compare text string using bcrypt. Bcrypt is a password-hashing function based on the Blowfish cipher. + + crontab-generator: + title: Crontab generator + description: Validate and generate crontab and get the human-readable description of the cron schedule. + + http-status-codes: + title: HTTP status codes + description: The list of all HTTP status codes, their name, and their meaning. + + sql-prettify: + title: SQL prettify and format + description: Format and prettify your SQL queries online (it supports various SQL dialects). + + benchmark-builder: + title: Benchmark builder + description: Easily compare execution time of tasks with this very simple online benchmark builder. + + git-memo: + title: Git cheatsheet + description: Git is a decentralized version management software. With this cheatsheet, you will have quick access to the most common git commands. + + slugify-string: + title: Slugify string + description: Make a string url, filename and id safe. + + encryption: + title: Encrypt / decrypt text + description: Encrypt clear text and decrypt ciphertext using crypto algorithms like AES, TripleDES, Rabbit or RC4. + + random-port-generator: + title: Random port generator + description: Generate random port numbers outside of the range of "known" ports (0-1023). + + yaml-prettify: + title: YAML prettify and format + description: Prettify your YAML string into a friendly, human-readable format. + + eta-calculator: + title: ETA calculator + description: An ETA (Estimated Time of Arrival) calculator to determine the approximate end time of a task, for example, the end time and duration of a file download. + + roman-numeral-converter: + title: Roman numeral converter + description: Convert Roman numerals to numbers and convert numbers to Roman numerals. + + hmac-generator: + title: Hmac generator + description: Computes a hash-based message authentication code (HMAC) using a secret key and your favorite hashing function. + + bip39-generator: + title: BIP39 passphrase generator + description: Generate a BIP39 passphrase from an existing or random mnemonic, or get the mnemonic from the passphrase. + + base64-file-converter: + title: Base64 file converter + description: Convert a string, file, or image into its base64 representation. + + list-converter: + title: List converter + description: This tool can process column-based data and apply various changes (transpose, add prefix and suffix, reverse list, sort list, lowercase values, truncate values) to each row. + + base64-string-converter: + title: Base64 string encoder/decoder + description: Simply encode and decode strings into their base64 representation. + + toml-to-yaml: + title: TOML to YAML + description: Parse and convert TOML to YAML. + + math-evaluator: + title: Math evaluator + description: A calculator for evaluating mathematical expressions. You can use functions like sqrt, cos, sin, abs, etc. + + json-to-yaml-converter: + title: JSON to YAML converter + description: Simply convert JSON to YAML with this online live converter. + + url-parser: + title: URL parser + description: Parse a URL into its separate constituent parts (protocol, origin, params, port, username-password, ...) + + iban-validator-and-parser: + title: IBAN validator and parser + description: Validate and parse IBAN numbers. Check if an IBAN is valid and get the country, BBAN, if it is a QR-IBAN and the IBAN friendly format. + + user-agent-parser: + title: User-agent parser + description: Detect and parse Browser, Engine, OS, CPU, and Device type/model from an user-agent string. + + numeronym-generator: + title: Numeronym generator + description: A numeronym is a word where a number is used to form an abbreviation. For example, "i18n" is a numeronym of "internationalization" where 18 stands for the number of letters between the first i and the last n in the word. + + case-converter: + title: Case converter + description: Transform the case of a string and choose between different formats + + html-entities: + title: Escape HTML entities + description: Escape or unescape HTML entities (replace characters like <,>, &, " and \' with their HTML version) + + json-prettify: + title: JSON prettify and format + description: Prettify your JSON string into a friendly, human-readable format. + + docker-run-to-docker-compose-converter: + title: Docker run to Docker compose converter + description: Transforms "docker run" commands into docker-compose files! + + mac-address-lookup: + title: MAC address lookup + description: Find the vendor and manufacturer of a device by its MAC address. + + mime-types: + title: MIME types + description: Convert MIME types to file extensions and vice-versa. + + toml-to-json: + title: TOML to JSON + description: Parse and convert TOML to JSON. + + lorem-ipsum-generator: + title: Lorem ipsum generator + description: Lorem ipsum is a placeholder text commonly used to demonstrate the visual form of a document or a typeface without relying on meaningful content + + qrcode-generator: + title: QR Code generator + description: Generate and download a QR code for a URL (or just plain text), and customize the background and foreground colors. + + wifi-qrcode-generator: + title: WiFi QR Code generator + description: Generate and download QR codes for quick connections to WiFi networks. + + xml-formatter: + title: XML formatter + description: Prettify your XML string into a friendly, human-readable format. + + temperature-converter: + title: Temperature converter + description: Degrees temperature conversions for Kelvin, Celsius, Fahrenheit, Rankine, Delisle, Newton, RĂ©aumur, and RĂžmer. + + chmod-calculator: + title: Chmod calculator + description: Compute your chmod permissions and commands with this online chmod calculator. + + rsa-key-pair-generator: + title: RSA key pair generator + description: Generate a new random RSA private and public pem certificate key pair. + + html-wysiwyg-editor: + title: HTML WYSIWYG editor + description: Online, feature-rich WYSIWYG HTML editor which generates the source code of the content immediately. + + yaml-to-toml: + title: YAML to TOML + description: Parse and convert YAML to TOML. + + mac-address-generator: + title: MAC address generator + description: Enter the quantity and prefix. MAC addresses will be generated in your chosen case (uppercase or lowercase) + + json-diff: + title: JSON diff + description: Compare two JSON objects and get the differences between them. + + jwt-parser: + title: JWT parser + description: Parse and decode your JSON Web Token (jwt) and display its content. + + date-converter: + title: Date-time converter + description: Convert date and time into the various different formats + + phone-parser-and-formatter: + title: Phone parser and formatter + description: Parse, validate and format phone numbers. Get information about the phone number, like the country code, type, etc. + + ipv4-subnet-calculator: + title: IPv4 subnet calculator + description: Parse your IPv4 CIDR blocks and get all the info you need about your subnet. + + og-meta-generator: + title: Open graph meta generator + description: Generate open-graph and socials HTML meta tags for your website. + + ipv6-ula-generator: + title: IPv6 ULA generator + description: Generate your own local, non-routable IP addresses for your network according to RFC4193. + + hash-text: + title: Hash text + description: 'Hash a text string using the function you need : MD5, SHA1, SHA256, SHA224, SHA512, SHA384, SHA3 or RIPEMD160' + + json-to-toml: + title: JSON to TOML + description: Parse and convert JSON to TOML. + + device-information: + title: Device information + description: Get information about your current device (screen size, pixel-ratio, user agent, ...) + + pdf-signature-checker: + title: PDF signature checker + description: Verify the signatures of a PDF file. A signed PDF file contains one or more signatures that may be used to determine whether the contents of the file have been altered since the file was signed. + + json-minify: + title: JSON minify + description: Minify and compress your JSON by removing unnecessary whitespace. + + ulid-generator: + title: ULID generator + description: Generate random Universally Unique Lexicographically Sortable Identifier (ULID). + + string-obfuscator: + title: String obfuscator + description: Obfuscate a string (like a secret, an IBAN, or a token) to make it shareable and identifiable without revealing its content. + + base-converter: + title: Integer base converter + description: Convert a number between different bases (decimal, hexadecimal, binary, octal, base64, ...) + + yaml-to-json-converter: + title: YAML to JSON converter + description: Simply convert YAML to JSON with this online live converter. + + uuid-generator: + title: UUIDs generator + description: A Universally Unique Identifier (UUID) is a 128-bit number used to identify information in computer systems. The number of possible UUIDs is 16^32, which is 2^128 or about 3.4x10^38 (which is a lot!). + + ipv4-address-converter: + title: IPv4 address converter + description: Convert an IP address into decimal, binary, hexadecimal, or even an IPv6 representation of it. + + text-statistics: + title: Text statistics + description: Get information about a text, the number of characters, the number of words, its size in bytes, ... + + text-to-nato-alphabet: + title: Text to NATO alphabet + description: Transform text into the NATO phonetic alphabet for oral transmission. + + basic-auth-generator: + title: Basic auth generator + description: Generate a base64 basic auth header from a username and password. + + text-to-unicode: + title: Text to Unicode + description: Parse and convert text to unicode and vice-versa + + ipv4-range-expander: + title: IPv4 range expander + description: Given a start and an end IPv4 address, this tool calculates a valid IPv4 subnet along with its CIDR notation. + + text-diff: + title: Text diff + description: Compare two texts and see the differences between them. + + otp-generator: + title: OTP code generator + description: Generate and validate time-based OTP (one time password) for multi-factor authentication. + + url-encoder: + title: Encode/decode URL-formatted strings + description: Encode text to URL-encoded format (also known as "percent-encoded"), or decode from it. + + text-to-binary: + title: Text to ASCII binary + description: Convert text to its ASCII binary representation and vice-versa. diff --git a/locales/es.yml b/locales/es.yml new file mode 100644 index 00000000..2d8b2515 --- /dev/null +++ b/locales/es.yml @@ -0,0 +1,71 @@ +home: + categories: + newestTools: Nuevas herramientas + favoriteTools: 'Tus herramientas favoritas' + allTools: 'Todas las herramientas' + subtitle: 'Herramientas practicas para desarrolladores' + toggleMenu: 'Toggle menu' + home: Home + uiLib: 'UI Lib' + support: 'Apoyar el desarrollo de IT-Tools' + buyMeACoffee: 'Buy me a coffee' + follow: + title: 'Te gustan las it-tools?' + p1: 'Danos una estrella en' + githubRepository: 'Repositorio de IT-Tools en GitHub' + p2: 'o sĂ­guenos en' + twitterAccount: 'Cuenta de twitter de IT-Tools' + thankYou: 'Muchas gracias!' + nav: + github: 'Repositorio en github' + githubRepository: 'IT-Tools GitHub repository' + twitter: 'Cuenta de Twitter' + twitterAccount: 'Cuenta de twitter de IT Tools' + about: 'Sobre IT-Tools' + aboutLabel: 'Sobre' + darkMode: 'Modo obscuro' + lightMode: 'Modo claro' + mode: 'Alternar modo oscuro/claro' +about: + content: > + # Sobre IT-Tools + + Este maravilloso sitio web, hecho con ❀ por [Corentin Thomasset](https://corentin.tech?utm_source=it-tools&utm_medium=about) , agrega herramientas Ăștiles para desarrolladores y personas que trabajan en IT. Si lo encuentra Ăștil, no dude en compartirlo con las personas que crea que tambiĂ©n pueden encontrarlo Ăștil y ÂĄno olvide marcarlo como favorito en su barra de accesos directos! + + IT Tools es de cĂłdigo abierto (under the MIT license) y gratis, y siempre lo serĂĄ, pero me cuesta dinero alojar y renovar el nombre de dominio. Si desea apoyar mi trabajo y animarme a agregar mĂĄs herramientas, considere apoyarme a travĂ©s de[sponsoring me](https://www.buymeacoffee.com/cthmsst). + + ## TecnologĂ­as + + IT Tools estĂĄ creado en Vue.js (Vue 3) con la biblioteca de componentes Naive UI y Vercel lo aloja y lo implementa continuamente. En algunas herramientas se utilizan bibliotecas de cĂłdigo abierto de terceros; puede encontrar la lista completa en [package.json](https://github.com/CorentinTh/it-tools/blob/main/package.json) archivo del repositorio. + + ## ÂżEncontraste un error? ÂżFalta una herramienta? + + Si necesita una herramienta que actualmente no estĂĄ presente aquĂ­ y cree que puede ser Ăștil, puede enviar una solicitud de funciĂłn en el [issues section](https://github.com/CorentinTh/it-tools/issues/new/choose) en el repositorio de GitHub. + + Y si encontrĂł un error o algo no funciona como se esperaba, presente un reporte de error en el [issues section](https://github.com/CorentinTh/it-tools/issues/new/choose) en el repositorio de GitHub. + +404: + notFound: '404 Not Found' + sorry: 'Lo sentimos, esta pĂĄgina no parece existir' + maybe: 'Tal vez el cachĂ© estĂ© haciendo cosas raras, Âżprobamos a refrescar forzosamente?' + backHome: 'Back home' +favoriteButton: + remove: 'Quitar de favoritos' + add: 'Añadir a favoritos' +toolCard: + new: Nuevo +search: + label: Buscar +tools: + categories: + favorite-tools: 'Tus herramientas favoritas' + crypto: Crypto + converter: Converter + web: Web + images and videos: 'Images & Videos' + development: Development + network: Network + math: Math + measurement: Measurement + text: Text + data: Data diff --git a/locales/fr.yml b/locales/fr.yml index ff128461..cd5cc0e8 100644 --- a/locales/fr.yml +++ b/locales/fr.yml @@ -29,7 +29,7 @@ about: content: > # À propos de IT-Tools - Ce merveilleux site, fait avec ❀ par [Corentin Thomasset](https://github.com/CorentinTh), regroupe des outils utiles pour les dĂ©veloppeurs et les personnes travaillant dans l'informatique. Si vous le trouvez utile, n'hĂ©sitez pas Ă  le partager et n'oubliez pas de le mettre dans vos favoris ! + Ce merveilleux site, fait avec ❀ par [Corentin Thomasset](https://corentin.tech?utm_source=it-tools&utm_medium=about), regroupe des outils utiles pour les dĂ©veloppeurs et les personnes travaillant dans l'informatique. Si vous le trouvez utile, n'hĂ©sitez pas Ă  le partager et n'oubliez pas de le mettre dans vos favoris ! IT Tools est open-source (sous licence MIT) et gratuit, et le restera toujours, mais cela me coĂ»te de l'argent pour l'hĂ©berger et renouveler le nom de domaine. Si vous voulez soutenir mon travail, et m'encourager Ă  ajouter plus d'outils, n'hĂ©sitez pas Ă  me [soutenir](https://www.buymeacoffee.com/cthmsst). @@ -63,3 +63,19 @@ tools: measurement: Mesure text: Texte data: DonnĂ©es + + token-generator: + title: GĂ©nĂ©rateur de token + description: >- + GĂ©nĂšre une chaĂźne alĂ©atoire avec les caractĂšres que vous voulez, lettres + majuscules ou minuscules, chiffres et/ou symboles. + uppercase: Majuscules (ABC...) + lowercase: Minuscules (abc...) + numbers: Chiffres (123...) + symbols: Symboles (!-;...) + button: + copy: Copier + refresh: Rafraichir + copied: Le token a Ă©tĂ© copiĂ© + length: Longueur + tokenPlaceholder: Le token... diff --git a/locales/pt.yml b/locales/pt.yml new file mode 100644 index 00000000..822bea8a --- /dev/null +++ b/locales/pt.yml @@ -0,0 +1,71 @@ +home: + categories: + newestTools: 'Novas ferramentas' + favoriteTools: 'Suas ferramentas favoritas' + allTools: 'Todas as ferramentas' + subtitle: 'Ferraentas Ășteis para desenvolvedores' + toggleMenu: 'Menu' + home: 'InĂ­cio' + uiLib: 'Biblioteca de UI' + support: 'Apoie o desenvolvimento do IT Tools' + buyMeACoffee: 'Pague-me um cafĂ©' + follow: + title: 'Gostou do it-tools?' + p1: 'DĂȘ uma estrela no' + githubRepository: 'repositĂłrio do IT-Tools no GitHub' + p2: 'ou siga nossa' + twitterAccount: 'conta IT-Tools no Twitter' + thankYou: 'Obrigado !' + nav: + github: 'RepositĂłrio no GitHub' + githubRepository: 'repositĂłrio do IT-Tools no GitHub' + twitter: 'Conta no Twitter' + twitterAccount: 'conta do IT Tools no Twitter' + about: 'Sobre o IT-Tools' + aboutLabel: 'Sobre' + darkMode: 'Modo Escuro' + lightMode: 'Modo Claro' + mode: 'Trocar modo escuro/claro' +about: + content: > + # Sobre o IT-Tools + + Este site maravilhoso, feito com ❀ por [Corentin Thomasset](https://corentin.tech?utm_source=it-tools&utm_medium=about), junta ferramentas Ășteis para desenvolvedores e outras pessoas que trabalham com TI. Se vocĂȘ achar o site Ăștil, fique Ă  vontade para compartilhar com quem tambĂ©m possa gostar e nĂŁo esqueça de salvar o bookmark na sua barra de atalhos! + + O IT Tools Ă© cĂłdigo aberto (sob a licença MIT), Ă© gratuito, e sempre serĂĄ, mas custa dinheiro para hospedar e renovar o domĂ­nio. Se quiser apoiar meu trabalho e me encorajar a adicionar mais ferramentas, por favor considere [ser patrocinador](https://www.buymeacoffee.com/cthmsst). + + ## Tecnologias + + O IT Tools Ă© feito em Vue.js (Vue 3) com a biblioteca de componentes Naive UI e Ă© hospedado pela Vercel. Bibliotecas de cĂłdigo aberto de terceiros sĂŁo usadas em algumas ferramentas e vocĂȘ pode encontrar a lista completa no arquivo [package.json](https://github.com/CorentinTh/it-tools/blob/main/package.json) do repositĂłrio. + + ## Achou um bug? EstĂĄ faltando uma ferramenta? + + Se vocĂȘ precisa de uma ferramenta que ainda nĂŁo existe aqui e acha que pode ser Ăștil, seu pedido serĂĄ bem vindo na [seção de issues](https://github.com/CorentinTh/it-tools/issues/new/choose) no repositĂłrio do GitHub. + + E se vocĂȘ encontrar um bug ou se algo nĂŁo funcionar como esperado, por favor registre um relato de bug na [seção de issues](https://github.com/CorentinTh/it-tools/issues/new/choose) no GitHub. + +404: + notFound: '404 NĂŁo Encontrado' + sorry: 'Desculpe, parece que essa pĂĄgina nĂŁo existe' + maybe: 'Talvez o cache esteja fazendo bobagem, que tal tentar forçar a atualização?' + backHome: 'Voltar para o inĂ­cio' +favoriteButton: + remove: 'Remover dos favoritos' + add: 'Adicionar aos favoritos' +toolCard: + new: 'Novo' +search: + label: 'Pesquisar' +tools: + categories: + favorite-tools: 'Suas ferramentas favoritas' + crypto: 'Cripto' + converter: 'Conversores' + web: 'Web' + images and videos: 'Imagens & VĂ­deos' + development: 'Desenvolvimento' + network: 'Rede' + math: 'MatemĂĄtica' + measurement: 'Medidas' + text: 'Texto' + data: 'Dados' diff --git a/locales/uk.yml b/locales/uk.yml new file mode 100644 index 00000000..ad455a7d --- /dev/null +++ b/locales/uk.yml @@ -0,0 +1,71 @@ +home: + categories: + newestTools: НаĐčĐœĐŸĐČіші Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž + favoriteTools: 'Ваші ŃƒĐ»ŃŽĐ±Đ»Đ”ĐœŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž' + allTools: 'Усі Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž' + subtitle: 'Đ—Ń€ŃƒŃ‡ĐœŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž ĐŽĐ»Ń Ń€ĐŸĐ·Ń€ĐŸĐ±ĐœĐžĐșіĐČ' + toggleMenu: 'ĐŸĐ”Ń€Đ”ĐŒĐžĐșĐ°ĐœĐœŃ ĐŒĐ”ĐœŃŽ' + home: Đ“ĐŸĐ»ĐŸĐČĐœĐ° + uiLib: 'UI Đ‘Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșа' + support: 'ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа Ń€ĐŸĐ·Ń€ĐŸĐ±ĐșĐž IT Tools' + buyMeACoffee: 'Купо ĐŒĐ”ĐœŃ– ĐșаĐČу' + follow: + title: 'Đ’Đ°ĐŒ ĐżĐŸĐŽĐŸĐ±Đ°ŃŽŃ‚ŃŒŃŃ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž IT?' + p1: 'Đ”ĐŸĐŽĐ°ĐčтД ĐœĐ°ĐŒ Đ·Ń–Ń€Đșу ĐœĐ°' + githubRepository: 'GitHub-Ń€Đ”ĐżĐŸĐ·ĐžŃ‚ĐŸŃ€Ń–Đč IT-Tools' + p2: 'Đ°Đ±ĐŸ сліЎĐșуĐčтД за ĐœĐ°ĐŒĐž ĐœĐ°' + twitterAccount: 'ĐąĐČіттДр-аĐșĐ°ŃƒĐœŃ‚ IT-Tools' + thankYou: 'ДяĐșŃƒŃ”ĐŒĐŸ!' + nav: + github: 'GitHub-Ń€Đ”ĐżĐŸĐ·ĐžŃ‚ĐŸŃ€Ń–Đč' + githubRepository: 'GitHub-Ń€Đ”ĐżĐŸĐ·ĐžŃ‚ĐŸŃ€Ń–Đč IT-Tools' + twitter: 'ĐąĐČіттДр' + twitterAccount: 'ĐąĐČіттДр-аĐșĐ°ŃƒĐœŃ‚ IT-Tools' + about: 'ĐŸŃ€ĐŸ IT-Tools' + aboutLabel: 'ĐŸŃ€ĐŸ ĐœĐ°Ń' + darkMode: 'ĐąĐ”ĐŒĐœĐžĐč Ń€Đ”Đ¶ĐžĐŒ' + lightMode: 'ĐĄĐČітлОĐč Ń€Đ”Đ¶ĐžĐŒ' + mode: 'ĐŸĐ”Ń€Đ”ĐŒĐžĐșĐ°ĐœĐœŃ Ń‚Đ”ĐŒĐœĐŸĐłĐŸ/сĐČŃ–Ń‚Đ»ĐŸĐłĐŸ Ń€Đ”Đ¶ĐžĐŒŃƒ' +about: + content: > + # ĐŸŃ€ĐŸ IT-Tools + + ĐŠĐ”Đč Ń‡ŃƒĐŽĐŸĐČĐžĐč ĐČДбсаĐčт, стĐČĐŸŃ€Đ”ĐœĐžĐč Đ· ❀ [Corentin Thomasset](https://corentin.tech?utm_source=it-tools&utm_medium=about), Đ°ĐłŃ€Đ”ĐłŃƒŃ” ĐșĐŸŃ€ĐžŃĐœŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž ĐŽĐ»Ń Ń€ĐŸĐ·Ń€ĐŸĐ±ĐœĐžĐșіĐČ Ń– люЎДĐč, яĐșі працюють ĐČ ŃŃ„Đ”Ń€Ń– IT. ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ цД ĐșĐŸŃ€ĐžŃĐœĐŸ, Đ±ŃƒĐŽŃŒ ласĐșа, ĐżĐŸĐŽŃ–Đ»Ń–Ń‚ŃŒŃŃ Ń†ĐžĐŒ Đ· Đ»ŃŽĐŽŃŒĐŒĐž, яĐșі, ĐœĐ° ĐČашу ĐŽŃƒĐŒĐșу, таĐșĐŸĐ¶ ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ Đ·ĐœĐ°Đčто ĐčĐŸĐłĐŸ ĐșĐŸŃ€ĐžŃĐœĐžĐŒ, і ĐœĐ” Đ·Đ°Đ±ŃƒĐŽŃŒŃ‚Đ” ĐŽĐŸĐŽĐ°Ń‚Đž ĐčĐŸĐłĐŸ ĐŽĐŸ заĐșĐ»Đ°ĐŽĐŸĐș у ĐČашіĐč ĐżĐ°ĐœĐ”Đ»Ń– шĐČОЎĐșĐŸĐłĐŸ ĐŽĐŸŃŃ‚ŃƒĐżŃƒ! + + IT Tools є ĐČіЮĐșŃ€ĐžŃ‚ĐžĐŒ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐœĐžĐŒ Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡Đ”ĐœĐœŃĐŒ (піЮ Đ»Ń–Ń†Đ”ĐœĐ·Ń–Ń”ŃŽ MIT) і бДзĐșĐŸŃˆŃ‚ĐŸĐČĐœĐžĐŒ, і заĐČжЎО буЎД таĐșĐžĐŒ, алД ĐŒĐ”ĐœŃ– ĐșĐŸŃˆŃ‚ŃƒŃ” ĐłŃ€ĐŸŃˆŃ– ĐŽĐ»Ń Ń…ĐŸŃŃ‚ĐžĐœĐłŃƒ і ĐżŃ€ĐŸĐŽĐŸĐČĐ¶Đ”ĐœĐœŃ ĐŽĐŸĐŒĐ”ĐœĐœĐŸĐłĐŸ Ń–ĐŒĐ”ĐœŃ–. ĐŻĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐ°Ń‚Đž ĐŒĐŸŃŽ Ń€ĐŸĐ±ĐŸŃ‚Ńƒ і ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐ°Ń‚Đž ĐŒĐ”ĐœĐ” у ĐŽĐŸĐŽĐ°ĐČĐ°ĐœĐœŃ– ĐœĐŸĐČох Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ, Ń€ĐŸĐ·ĐłĐ»ŃĐœŃŒŃ‚Đ” ĐŒĐŸĐ¶Đ»ĐžĐČість ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșĐž, [ŃĐżĐŸĐœŃĐŸŃ€ŃƒŃŽŃ‡Đž ĐŒĐ”ĐœĐ”](https://www.buymeacoffee.com/cthmsst). + + ## ĐąĐ”Ń…ĐœĐŸĐ»ĐŸĐłŃ–Ń— + + IT Tools ĐČĐžĐșĐŸĐœĐ°ĐœĐžĐč ĐœĐ° Vue.js (Vue 3) Đ· ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃĐŒ Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”ĐșĐž ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚Ń–ĐČ Naive UI і Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐžĐč за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ Vercel. ĐŁ ĐŽĐ”ŃĐșох Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đ°Ń… ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуються ŃŃ‚ĐŸŃ€ĐŸĐœĐœŃ– ĐČіЮĐșроті Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”ĐșĐž, ĐżĐŸĐČĐœĐžĐč ŃĐżĐžŃĐŸĐș яĐșох ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·ĐœĐ°Đčто ĐČ Ń„Đ°Đčлі [package.json](https://github.com/CorentinTh/it-tools/blob/main/package.json) Ń€Đ”ĐżĐŸĐ·ĐžŃ‚ĐŸŃ€Ń–ŃŽ. + + ## Đ—ĐœĐ°ĐčшлО баг? Đ’Ń–ĐŽŃŃƒŃ‚ĐœŃ–Đč Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚? + + ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±Đ”Đœ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚, яĐșĐŸĐłĐŸ ĐœĐ°Ń€Đ°Đ·Ń– ĐœĐ”ĐŒĐ°Ń” тут, і ĐČĐž ĐČĐČажаєтД, Ń‰ĐŸ ĐČŃ–Đœ ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐșĐŸŃ€ĐžŃĐœĐžĐŒ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸĐŽĐ°Ń‚Đž запОт ĐœĐ° ĐŽĐŸĐŽĐ°ĐČĐ°ĐœĐœŃ Ń„ŃƒĐœĐșції ĐČ [Ń€ĐŸĐ·ĐŽŃ–Đ»Ń– ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒ](https://github.com/CorentinTh/it-tools/issues/new/choose) у Ń€Đ”ĐżĐŸĐ·ĐžŃ‚ĐŸŃ€Ń–Ń— GitHub. + + А яĐșŃ‰ĐŸ ĐČĐž Đ·ĐœĐ°ĐčшлО баг Đ°Đ±ĐŸ Ń‰ĐŸŃŃŒ ĐœĐ” працює, яĐș ĐŸŃ‡Ń–ĐșуĐČĐ°Đ»ĐŸŃŃ, Đ±ŃƒĐŽŃŒ ласĐșа, ĐżĐŸĐŽĐ°ĐčтД Đ·ĐČіт ĐżŃ€ĐŸ баг ĐČ [Ń€ĐŸĐ·ĐŽŃ–Đ»Ń– ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒ](https://github.com/CorentinTh/it-tools/issues/new/choose) у Ń€Đ”ĐżĐŸĐ·ĐžŃ‚ĐŸŃ€Ń–Ń— GitHub. + +404: + notFound: '404 ĐĄŃ‚ĐŸŃ€Ń–ĐœĐșа ĐœĐ” Đ·ĐœĐ°ĐčĐŽĐ”ĐœĐ°' + sorry: 'ВОбачтД, ця ŃŃ‚ĐŸŃ€Ń–ĐœĐșа, ŃŃ…ĐŸĐ¶Đ”, ĐœĐ” Ń–ŃĐœŃƒŃ”' + maybe: 'ĐœĐŸĐ¶Đ»ĐžĐČĐŸ, ĐșДш Ń€ĐŸĐ±ĐžŃ‚ŃŒ Ń…ĐžŃ‚Ń€ĐŸŃ‰Ń–, ŃĐżŃ€ĐŸĐ±ŃƒĐčтД ĐżŃ€ĐžĐŒŃƒŃĐŸĐČĐŸ ĐŸĐœĐŸĐČото ŃŃ‚ĐŸŃ€Ń–ĐœĐșу?' + backHome: 'ĐŸĐŸĐČĐ”Ń€ĐœŃƒŃ‚ĐžŃŃ ĐœĐ° ĐłĐŸĐ»ĐŸĐČĐœŃƒ' +favoriteButton: + remove: 'Đ’ĐžĐ»ŃƒŃ‡ĐžŃ‚Đž Đ· ĐŸĐ±Ń€Đ°ĐœĐžŃ…' + add: 'Đ”ĐŸĐŽĐ°Ń‚Đž ĐŽĐŸ ĐŸĐ±Ń€Đ°ĐœĐžŃ…' +toolCard: + new: ĐĐŸĐČĐžĐč +search: + label: ĐŸĐŸŃˆŃƒĐș +tools: + categories: + favorite-tools: 'Ваші ŃƒĐ»ŃŽĐ±Đ»Đ”ĐœŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž' + crypto: Кропта + converter: ĐšĐŸĐœĐČДртДр + web: ВДб + images and videos: 'Đ—ĐŸĐ±Ń€Đ°Đ¶Đ”ĐœĐœŃ та ĐČŃ–ĐŽĐ”ĐŸ' + development: Đ ĐŸĐ·Ń€ĐŸĐ±Đșа + network: ĐœĐ”Ń€Đ”Đ¶Đ° + math: ĐœĐ°Ń‚Đ”ĐŒĐ°Ń‚ĐžĐșа + measurement: Đ’ĐžĐŒŃ–Ń€ŃŽĐČĐ°ĐœĐœŃ + text: йДĐșст + data: Đ”Đ°ĐœŃ– diff --git a/locales/vi.yml b/locales/vi.yml new file mode 100644 index 00000000..de574a6c --- /dev/null +++ b/locales/vi.yml @@ -0,0 +1,382 @@ +home: + categories: + newestTools: CĂŽng cỄ mới nháș„t + favoriteTools: 'CĂŽng cỄ yĂȘu thĂ­ch cá»§a báșĄn' + allTools: 'Táș„t cáșŁ cĂŽng cỄ' + subtitle: 'CĂŽng cỄ cho nhĂ  phĂĄt triển.' + toggleMenu: 'Chuyển đổi menu' + home: Trang chá»§ + uiLib: 'Thư viện UI' + support: 'Hỗ trợ phĂĄt triển IT Tools' + buyMeACoffee: 'Ịng hộ tĂĄc giáșŁ' + follow: + title: 'BáșĄn thĂ­ch IT-tools?' + p1: 'HĂŁy cho chĂșng tĂŽi một ngĂŽi sao trĂȘn' + githubRepository: 'Kho GitHub IT-Tools' + p2: 'hoáș·c theo dĂ”i chĂșng tĂŽi trĂȘn' + twitterAccount: 'TĂ i khoáșŁn Twitter IT-Tools' + thankYou: 'CáșŁm ÆĄn báșĄn!' + nav: + github: 'Kho GitHub' + githubRepository: 'Kho GitHub IT-Tools' + twitter: 'TĂ i khoáșŁn Twitter' + twitterAccount: 'TĂ i khoáșŁn Twitter IT Tools' + about: 'Về IT-Tools' + aboutLabel: 'Giới thiệu' + darkMode: 'Cháșż độ tối' + lightMode: 'Cháșż độ sĂĄng' + mode: 'Chuyển đổi cháșż độ tối/sĂĄng' +about: + content: > + # Về IT-Tools + + Website tuyệt vời nĂ y, Ä‘Æ°á»Łc táșĄo ra báș±ng ❀ bởi [Corentin Thomasset](https://corentin.tech?utm_source=it-tools&utm_medium=about), tổng hợp cĂĄc cĂŽng cỄ hữu Ă­ch cho nhĂ  phĂĄt triển vĂ  những người lĂ m việc trong lÄ©nh vá»±c IT. Náșżu báșĄn tháș„y nĂł hữu Ă­ch, xin đừng ngáș§n ngáșĄi chia sáș» cho những người mĂ  báșĄn nghÄ© sáșœ tháș„y nĂł hữu Ă­ch vĂ  đừng quĂȘn đánh dáș„u nĂł trong thanh lối táșŻt cá»§a báșĄn! + + IT Tools lĂ  mĂŁ nguồn mở (dưới giáș„y phĂ©p MIT) vĂ  miễn phĂ­, vĂ  sáșœ luĂŽn như váș­y, nhưng tĂŽi pháșŁi tráșŁ tiền để lưu trữ vĂ  gia háșĄn tĂȘn miền. Náșżu báșĄn muốn hỗ trợ cĂŽng việc cá»§a tĂŽi, vĂ  khĂ­ch lệ tĂŽi thĂȘm nhiều cĂŽng cỄ hÆĄn, hĂŁy xem xĂ©t hỗ trợ báș±ng cĂĄch [tĂ i trợ cho tĂŽi](https://www.buymeacoffee.com/cthmsst). + + ## CĂŽng nghệ + + IT Tools Ä‘Æ°á»Łc táșĄo ra báș±ng Vue.js (Vue 3) với thư viện thĂ nh pháș§n Naive UI vĂ  Ä‘Æ°á»Łc lưu trữ vĂ  triển khai liĂȘn tỄc bởi Vercel. CĂĄc thư viện mĂŁ nguồn mở cá»§a bĂȘn thứ ba Ä‘Æ°á»Łc sá»­ dỄng trong một số cĂŽng cỄ, báșĄn cĂł thể tĂŹm danh sĂĄch đáș§y đủ trong file [package.json](https://github.com/CorentinTh/it-tools/blob/main/package.json) cá»§a kho lưu trữ. + + ## PhĂĄt hiện lỗi? Một cĂŽng cỄ bị thiáșżu? + + Náșżu báșĄn cáș§n một cĂŽng cỄ hiện khĂŽng cĂł ở đñy, vĂ  báșĄn nghÄ© ráș±ng nĂł cĂł thể hữu Ă­ch, báșĄn Ä‘Æ°á»Łc chĂ o đón để gá»­i một yĂȘu cáș§u tĂ­nh năng trong [pháș§n váș„n đề](https://github.com/CorentinTh/it-tools/issues/new/choose) trong kho GitHub. + + VĂ  náșżu báșĄn phĂĄt hiện ra một lỗi, hoáș·c điều gĂŹ đó khĂŽng hoáșĄt động như mong đợi, xin vui lĂČng gá»­i bĂĄo cĂĄo lỗi trong [pháș§n váș„n đề](https://github.com/CorentinTh/it-tools/issues/new/choose) trong kho GitHub. + +404: + notFound: '404 KhĂŽng TĂŹm Tháș„y' + sorry: 'Xin lỗi, trang nĂ y dường như khĂŽng tồn táșĄi' + maybe: 'Lỗi xáșŁy ra cĂł thể do bộ nhớ đệm, hĂŁy (CTRL + F5) để táșŁi láșĄi trang?' + backHome: 'Quay về trang chá»§' +favoriteButton: + remove: 'XĂła khỏi mỄc yĂȘu thĂ­ch' + add: 'ThĂȘm vĂ o mỄc yĂȘu thĂ­ch' +toolCard: + new: Mới +search: + label: TĂŹm kiáșżm +tools: + categories: + favorite-tools: 'CĂŽng cỄ yĂȘu thĂ­ch cá»§a báșĄn' + crypto: MĂŁ hĂła + converter: Chuyển đổi + web: Web + images and videos: 'HĂŹnh áșŁnh & Video' + development: PhĂĄt triển + network: MáșĄng + math: ToĂĄn học + measurement: Đo lường + text: Văn báșŁn + data: Dữ liệu + + password-strength-analyser: + title: Bộ phĂąn tĂ­ch độ máșĄnh máș­t kháș©u + description: KhĂĄm phĂĄ độ máșĄnh cá»§a máș­t kháș©u cá»§a báșĄn với cĂŽng cỄ phĂąn tĂ­ch độ máșĄnh máș­t kháș©u chỉ cháșĄy trĂȘn phĂ­a mĂĄy khĂĄch vĂ  ước tĂ­nh thời gian phĂĄ máș­t kháș©u. + + chronometer: + title: Đồng hồ báș„m giờ + description: GiĂĄm sĂĄt thời gian cá»§a một sá»± việc. CÆĄ báșŁn lĂ  một đồng hồ báș„m giờ với cĂĄc tĂ­nh năng Ä‘ÆĄn giáșŁn. + + token-generator: + title: TrĂŹnh táșĄo mĂŁ thĂŽng bĂĄo + description: TáșĄo chuỗi ngáș«u nhiĂȘn với cĂĄc kĂœ tá»± báșĄn muốn, chữ hoa hoáș·c chữ thường, số vĂ /hoáș·c kĂœ tá»± đáș·c biệt. + + uppercase: Chữ hoa (ABC...) + lowercase: Chữ thường (abc...) + numbers: Số (123...) + symbols: KĂœ tá»± đáș·c biệt (!-;...) + length: Độ dĂ i + tokenPlaceholder: 'MĂŁ thĂŽng bĂĄo...' + copied: MĂŁ thĂŽng bĂĄo đã Ä‘Æ°á»Łc sao chĂ©p vĂ o clipboard + button: + copy: Sao chĂ©p + refresh: LĂ m mới + + percentage-calculator: + title: MĂĄy tĂ­nh pháș§n trăm + description: Dễ dĂ ng tĂ­nh toĂĄn pháș§n trăm từ một giĂĄ trị đáșżn giĂĄ trị khĂĄc, hoáș·c từ một pháș§n trăm đáșżn một giĂĄ trị. + + svg-placeholder-generator: + title: TrĂŹnh táșĄo hĂŹnh áșŁnh SVG giáșŁ Ä‘á»‹nh + description: TáșĄo hĂŹnh áșŁnh svg để sá»­ dỄng lĂ m giáșŁ Ä‘á»‹nh trong ứng dỄng cá»§a báșĄn. + + json-to-csv: + title: Chuyển đổi JSON thĂ nh CSV + description: Chuyển đổi JSON thĂ nh CSV với việc tá»± động phĂĄt hiện tiĂȘu đề. + + camera-recorder: + title: Ghi láșĄi camera + description: ChỄp áșŁnh hoáș·c quay video từ webcam hoáș·c mĂĄy áșŁnh cá»§a báșĄn. + keycode-info: + title: ThĂŽng tin Keycode + description: TĂŹm mĂŁ keycode, mĂŁ, vị trĂ­ vĂ  cĂĄc phĂ­m điều khiển cá»§a báș„t kỳ phĂ­m nĂ o Ä‘Æ°á»Łc nháș„n. + + emoji-picker: + title: Bộ chọn biểu tÆ°á»Łng cáșŁm xĂșc + description: Sao chĂ©p vĂ  dĂĄn biểu tÆ°á»Łng cáșŁm xĂșc một cĂĄch dễ dĂ ng vĂ  nháș­n giĂĄ trị unicode vĂ  mĂŁ điểm cá»§a mỗi biểu tÆ°á»Łng cáșŁm xĂșc. + + color-converter: + title: TrĂŹnh chuyển đổi mĂ u + description: Chuyển đổi mĂ u giữa cĂĄc định dáșĄng khĂĄc nhau (hex, rgb, hsl vĂ  tĂȘn css) + + bcrypt: + title: Bcrypt + description: MĂŁ hĂła vĂ  so sĂĄnh chuỗi văn báșŁn sá»­ dỄng bcrypt. Bcrypt lĂ  một hĂ m mĂŁ hĂła máș­t kháș©u dá»±a trĂȘn thuáș­t toĂĄn Blowfish. + crontab-generator: + title: TrĂŹnh táșĄo Crontab + description: XĂĄc thá»±c vĂ  táșĄo crontab vĂ  láș„y mĂŽ táșŁ Ä‘á»c Ä‘Æ°á»Łc cá»§a lịch trĂŹnh cron. + http-status-codes: + title: MĂŁ tráșĄng thĂĄi HTTP + description: Danh sĂĄch táș„t cáșŁ cĂĄc mĂŁ tráșĄng thĂĄi HTTP, tĂȘn vĂ  Ăœ nghÄ©a cá»§a chĂșng. + + sql-prettify: + title: Định dáșĄng vĂ  lĂ m đáșčp SQL + description: Định dáșĄng vĂ  lĂ m đáșčp cĂĄc truy váș„n SQL cá»§a báșĄn trá»±c tuyáșżn (hỗ trợ nhiều ngĂŽn ngữ SQL khĂĄc nhau). + + benchmark-builder: + title: TrĂŹnh táșĄo báșŁng đánh giĂĄ + description: Dễ dĂ ng so sĂĄnh thời gian thá»±c thi cá»§a cĂĄc nhiệm vỄ với trĂŹnh táșĄo báșŁng đánh giĂĄ trá»±c tuyáșżn Ä‘ÆĄn giáșŁn nĂ y. + git-memo: + title: Lệnh Git + description: Git lĂ  một pháș§n mềm quáșŁn lĂœ phiĂȘn báșŁn phĂąn tĂĄn. Với báșŁng ghi chĂș nĂ y, báșĄn sáșœ cĂł thể truy cáș­p nhanh vĂ o cĂĄc lệnh Git phổ biáșżn nháș„t. + + slugify-string: + title: Chuyển đổi chuỗi thĂ nh slug + description: Biáșżn đổi chuỗi thĂ nh dáșĄng an toĂ n để sá»­ dỄng trong URL, tĂȘn file vĂ  ID. + + encryption: + title: MĂŁ hĂła / giáșŁi mĂŁ văn báșŁn + description: MĂŁ hĂła vĂ  giáșŁi mĂŁ văn báșŁn rĂ” báș±ng cĂĄch sá»­ dỄng thuáș­t toĂĄn mĂŁ hĂła như AES, TripleDES, Rabbit hoáș·c RC4. + + random-port-generator: + title: TrĂŹnh táșĄo số cổng ngáș«u nhiĂȘn + description: TáșĄo số cổng ngáș«u nhiĂȘn náș±m ngoĂ i pháșĄm vi cá»§a cĂĄc cổng "biáșżt Ä‘Æ°á»Łc" (0-1023). + + yaml-prettify: + title: Định dáșĄng vĂ  lĂ m đáșčp YAML + description: Định dáșĄng chuỗi YAML cá»§a báșĄn thĂ nh một định dáșĄng dễ đọc vĂ  thĂąn thiện với con người. + + eta-calculator: + title: MĂĄy tĂ­nh ETA + description: Một mĂĄy tĂ­nh ETA (Thời gian dá»± kiáșżn đáșżn) để biáșżt thời gian káșżt thĂșc xáș„p xỉ cá»§a một nhiệm vỄ, vĂ­ dỄ như thời điểm káșżt thĂșc cá»§a một quĂĄ trĂŹnh táșŁi xuống. + + roman-numeral-converter: + title: Bộ chuyển đổi số La MĂŁ + description: Chuyển đổi số La MĂŁ thĂ nh số vĂ  chuyển đổi số thĂ nh số La MĂŁ. + + hmac-generator: + title: MĂĄy táșĄo HMAC + description: TĂ­nh toĂĄn mĂŁ xĂĄc thá»±c thĂŽng điệp dá»±a trĂȘn hash (HMAC) sá»­ dỄng một khĂła bĂ­ máș­t vĂ  hĂ m băm yĂȘu thĂ­ch cá»§a báșĄn. + + bip39-generator: + title: TrĂŹnh táșĄo BIP39 passphrase + description: TáșĄo BIP39 passphrase từ mnemonic hiện cĂł hoáș·c ngáș«u nhiĂȘn, hoáș·c láș„y mnemonic từ passphrase. + base64-file-converter: + title: TrĂŹnh chuyển đổi tệp Base64 + description: Chuyển đổi chuỗi, tệp hoáș·c hĂŹnh áșŁnh thĂ nh mĂŁ Base64. + list-converter: + title: TrĂŹnh chuyển đổi danh sĂĄch + description: CĂŽng cỄ nĂ y cĂł thể xá»­ lĂœ dữ liệu dá»±a trĂȘn cột vĂ  ĂĄp dỄng cĂĄc thay đổi khĂĄc nhau (đáșŁo ngÆ°á»Łc, thĂȘm tiền tố vĂ  háș­u tố, đáșŁo danh sĂĄch, sáșŻp xáșżp danh sĂĄch, giáșŁm giĂĄ trị thĂ nh chữ thường, cáșŻt giĂĄ trị) cho mỗi hĂ ng. + + base64-string-converter: + title: TrĂŹnh mĂŁ hĂła/giáșŁi mĂŁ chuỗi Base64 + description: ÄÆĄn giáșŁn mĂŁ hĂła vĂ  giáșŁi mĂŁ chuỗi thĂ nh mĂŁ Base64. + toml-to-yaml: + title: Chuyển đổi TOML thĂ nh YAML + description: PhĂąn tĂ­ch vĂ  chuyển đổi TOML thĂ nh YAML. + + math-evaluator: + title: TrĂŹnh đánh giĂĄ toĂĄn học + description: Một mĂĄy tĂ­nh để tĂ­nh toĂĄn biểu thức toĂĄn học. BáșĄn cĂł thể sá»­ dỄng cĂĄc hĂ m như sqrt, cos, sin, abs, v.v. + + json-to-yaml-converter: + title: Chuyển đổi JSON sang YAML + description: Chuyển đổi Ä‘ÆĄn giáșŁn JSON sang YAML với cĂŽng cỄ chuyển đổi trá»±c tuyáșżn nĂ y. + + url-parser: + title: TrĂŹnh phĂąn tĂ­ch URL + description: PhĂąn tĂ­ch một chuỗi URL để láș„y táș„t cáșŁ cĂĄc pháș§n khĂĄc nhau (giao thức, nguồn gốc, tham số, cổng, tĂȘn người dĂčng-máș­t kháș©u, ...) + + iban-validator-and-parser: + title: Kiểm tra vĂ  phĂąn tĂ­ch số IBAN + description: XĂĄc thá»±c vĂ  phĂąn tĂ­ch số IBAN. Kiểm tra tĂ­nh hợp lệ cá»§a IBAN vĂ  láș„y thĂŽng tin về quốc gia, BBAN, xem cĂł pháșŁi lĂ  QR-IBAN vĂ  định dáșĄng thĂąn thiện cá»§a IBAN. + + user-agent-parser: + title: TrĂŹnh phĂąn tĂ­ch User-agent + description: PhĂĄt hiện vĂ  phĂąn tĂ­ch trĂŹnh duyệt, engine, hệ điều hĂ nh, CPU vĂ  kiểu/mĂŽ hĂŹnh thiáșżt bị từ chuỗi user-agent. + + numeronym-generator: + title: TrĂŹnh táșĄo Numeronym + description: Numeronym lĂ  một từ mĂ  một số Ä‘Æ°á»Łc sá»­ dỄng để táșĄo thĂ nh một từ viáșżt táșŻt. VĂ­ dỄ, "i18n" lĂ  một numeronym cá»§a "internationalization" trong đó số 18 đáșĄi diện cho số chữ cĂĄi giữa chữ i đáș§u tiĂȘn vĂ  chữ n cuối cĂčng trong từ. + + case-converter: + title: Chuyển đổi chữ hoa/chữ thường + description: Thay đổi kiểu chữ cá»§a một chuỗi vĂ  chọn giữa cĂĄc định dáșĄng khĂĄc nhau + html-entities: + title: Thay tháșż cĂĄc kĂœ tá»± HTML + description: Thay tháșż hoáș·c bỏ tháș» cĂĄc kĂœ tá»± HTML (thay tháșż <,>, &, " vĂ  \' thĂ nh phiĂȘn báșŁn HTML tÆ°ÆĄng ứng) + + json-prettify: + title: Định dáșĄng vĂ  lĂ m đáșčp JSON + description: Định dáșĄng chuỗi JSON cá»§a báșĄn thĂ nh một định dáșĄng dễ đọc vĂ  thĂąn thiện với con người. + + docker-run-to-docker-compose-converter: + title: Chuyển đổi lệnh docker run thĂ nh tệp docker-compose + description: Chuyển đổi cĂĄc lệnh docker run thĂ nh tệp docker-compose! + + mac-address-lookup: + title: Tra cứu địa chỉ MAC + description: TĂŹm nhĂ  sáșŁn xuáș„t vĂ  nhĂ  cung cáș„p cá»§a thiáșżt bị dá»±a trĂȘn địa chỉ MAC. + + mime-types: + title: LoáșĄi Mime + description: Chuyển đổi loáșĄi mime thĂ nh pháș§n mở rộng vĂ  ngÆ°á»Łc láșĄi. + + toml-to-json: + title: Chuyển đổi TOML thĂ nh JSON + description: PhĂąn tĂ­ch vĂ  chuyển đổi TOML thĂ nh JSON. + + lorem-ipsum-generator: + title: MĂĄy táșĄo văn báșŁn Lorem ipsum + description: Lorem ipsum lĂ  một đoáșĄn văn báșŁn giáșŁ Ä‘Æ°á»Łc sá»­ dỄng phổ biáșżn để thể hiện hĂŹnh thức cá»§a một tĂ i liệu hoáș·c một kiểu chữ mĂ  khĂŽng cáș§n dá»±a vĂ o nội dung cĂł Ăœ nghÄ©a + + qrcode-generator: + title: TáșĄo mĂŁ QR + description: TáșĄo vĂ  táșŁi xuống mĂŁ QR cho một URL hoáș·c chỉ một đoáșĄn văn báșŁn vĂ  tĂčy chỉnh mĂ u nền vĂ  mĂ u chữ. + + wifi-qrcode-generator: + title: TáșĄo mĂŁ QR WiFi + description: TáșĄo vĂ  táșŁi xuống mĂŁ QR để káșżt nối nhanh đáșżn máșĄng WiFi. + + xml-formatter: + title: Định dáșĄng XML + description: Định dáșĄng chuỗi XML cá»§a báșĄn thĂ nh một định dáșĄng dễ đọc vĂ  thĂąn thiện với con người. + + temperature-converter: + title: Bộ chuyển đổi nhiệt độ + description: Chuyển đổi độ nhiệt độ cho Kelvin, Celsius, Fahrenheit, Rankine, Delisle, Newton, RĂ©aumur vĂ  RĂžmer. + + chmod-calculator: + title: MĂĄy tĂ­nh Chmod + description: TĂ­nh toĂĄn quyền vĂ  lệnh chmod cá»§a báșĄn với mĂĄy tĂ­nh Chmod trá»±c tuyáșżn nĂ y. + rsa-key-pair-generator: + title: TrĂŹnh táșĄo cáș·p khĂła RSA + description: TáșĄo cĂĄc chứng chỉ pem khĂła riĂȘng tư vĂ  khĂła cĂŽng khai RSA ngáș«u nhiĂȘn mới. + + html-wysiwyg-editor: + title: TrĂŹnh soáșĄn tháșŁo HTML WYSIWYG + description: TrĂŹnh soáșĄn tháșŁo HTML trá»±c tuyáșżn với trĂŹnh soáșĄn tháșŁo WYSIWYG đa chức năng, láș„y mĂŁ nguồn cá»§a nội dung ngay láș­p tức. + + yaml-to-toml: + title: YAML sang TOML + description: PhĂąn tĂ­ch vĂ  chuyển đổi YAML sang TOML. + + mac-address-generator: + title: TrĂŹnh táșĄo địa chỉ MAC + description: Nháș­p số lÆ°á»Łng vĂ  tiền tố. Địa chỉ MAC sáșœ Ä‘Æ°á»Łc táșĄo ra theo kiểu chữ hoa hoáș·c chữ thường theo lá»±a chọn cá»§a báșĄn + + json-diff: + title: So sĂĄnh JSON + description: So sĂĄnh hai đối tÆ°á»Łng JSON vĂ  láș„y ra sá»± khĂĄc biệt giữa chĂșng. + + jwt-parser: + title: GiáșŁi mĂŁ JWT + description: GiáșŁi mĂŁ vĂ  hiển thị nội dung cá»§a JSON Web Token (jwt). + + date-converter: + title: Chuyển đổi ngĂ y-thĂĄng + description: Chuyển đổi ngĂ y vĂ  thời gian sang cĂĄc định dáșĄng khĂĄc nhau + + phone-parser-and-formatter: + title: TrĂŹnh phĂąn tĂ­ch vĂ  định dáșĄng số điện thoáșĄi + description: PhĂąn tĂ­ch, xĂĄc thá»±c vĂ  định dáșĄng số điện thoáșĄi. Láș„y thĂŽng tin về số điện thoáșĄi, như mĂŁ quốc gia, loáșĄi, v.v. + + ipv4-subnet-calculator: + title: MĂĄy tĂ­nh máșĄng con IPv4 + description: PhĂąn tĂ­ch cĂĄc khối CIDR IPv4 cá»§a báșĄn vĂ  nháș­n thĂŽng tin về máșĄng con cá»§a báșĄn. + + og-meta-generator: + title: TrĂŹnh táșĄo meta Open Graph + description: TáșĄo cĂĄc tháș» meta HTML Open Graph vĂ  máșĄng xĂŁ hội cho trang web cá»§a báșĄn. + + ipv6-ula-generator: + title: TrĂŹnh táșĄo địa chỉ IPv6 ULA + description: TáșĄo địa chỉ IP cỄc bộ, khĂŽng thể định tuyáșżn trĂȘn máșĄng cá»§a báșĄn theo RFC4193. + + hash-text: + title: MĂŁ hĂła văn báșŁn + description: 'MĂŁ hĂła một chuỗi văn báșŁn báș±ng cĂĄch sá»­ dỄng cĂĄc hĂ m báșĄn cáș§n: MD5, SHA1, SHA256, SHA224, SHA512, SHA384, SHA3 hoáș·c RIPEMD160' + json-to-toml: + title: Chuyển đổi JSON sang TOML + description: PhĂąn tĂ­ch vĂ  chuyển đổi JSON sang TOML. + + device-information: + title: ThĂŽng tin thiáșżt bị + description: Láș„y thĂŽng tin về thiáșżt bị hiện táșĄi cá»§a báșĄn (kĂ­ch thước mĂ n hĂŹnh, tá»· lệ pixel, user agent, ...) + + pdf-signature-checker: + title: Kiểm tra chữ kĂœ PDF + description: XĂĄc minh chữ kĂœ cá»§a một tệp PDF. Một tệp PDF đã Ä‘Æ°á»Łc kĂœ cĂł chứa một hoáș·c nhiều chữ kĂœ cĂł thể Ä‘Æ°á»Łc sá»­ dỄng để xĂĄc định xem nội dung cá»§a tệp đã Ä‘Æ°á»Łc thay đổi kể từ khi tệp Ä‘Æ°á»Łc kĂœ. + + json-minify: + title: GiáșŁm kĂ­ch thước JSON + description: GiáșŁm kĂ­ch thước vĂ  nĂ©n JSON cá»§a báșĄn báș±ng cĂĄch loáșĄi bỏ khoáșŁng tráșŻng khĂŽng cáș§n thiáșżt. + + ulid-generator: + title: TáșĄo ULID + description: TáșĄo ngáș«u nhiĂȘn mĂŁ định danh duy nháș„t cĂł thể sáșŻp xáșżp theo thứ tá»± từ điển (ULID). + string-obfuscator: + title: MĂŁ hĂła chuỗi + description: MĂŁ hĂła một chuỗi (như một bĂ­ máș­t, một IBAN hoáș·c một mĂŁ thĂŽng bĂĄo) để cĂł thể chia sáș» vĂ  nháș­n dáșĄng mĂ  khĂŽng tiáșżt lộ nội dung. + + base-converter: + title: Chuyển đổi cÆĄ số số nguyĂȘn + description: Chuyển đổi số giữa cĂĄc cÆĄ số khĂĄc nhau (tháș­p phĂąn, tháș­p lỄc phĂąn, nhị phĂąn, bĂĄt phĂąn, base64, ...) + + yaml-to-json-converter: + title: TrĂŹnh chuyển đổi YAML sang JSON + description: Chuyển đổi YAML sang JSON một cĂĄch Ä‘ÆĄn giáșŁn với cĂŽng cỄ chuyển đổi trá»±c tuyáșżn nĂ y. + + uuid-generator: + title: TrĂŹnh táșĄo UUID + description: Một UUID (Universally Unique Identifier) lĂ  một số 128 bit Ä‘Æ°á»Łc sá»­ dỄng để xĂĄc định thĂŽng tin trong hệ thống mĂĄy tĂ­nh. Số lÆ°á»Łng UUID cĂł thể cĂł lĂ  16^32, tÆ°ÆĄng Ä‘Æ°ÆĄng với 2^128 hoáș·c khoáșŁng 3.4x10^38 (ráș„t lớn!). + + ipv4-address-converter: + title: Chuyển đổi địa chỉ Ipv4 + description: Chuyển đổi địa chỉ ip thĂ nh số tháș­p phĂąn, nhị phĂąn, tháș­p lỄc phĂąn hoáș·c tháș­m chĂ­ thĂ nh ipv6 + + text-statistics: + title: Thống kĂȘ văn báșŁn + description: Láș„y thĂŽng tin về một văn báșŁn, số kĂœ tá»±, số từ, kĂ­ch thước cá»§a nĂł, ... + + text-to-nato-alphabet: + title: Chuyển đổi văn báșŁn thĂ nh báșŁng chữ cĂĄi NATO + description: Chuyển đổi văn báșŁn thĂ nh báșŁng chữ cĂĄi phiĂȘn Ăąm NATO để truyền táșŁi báș±ng miệng. + + basic-auth-generator: + title: TáșĄo mĂŁ xĂĄc thá»±c cÆĄ báșŁn + description: TáșĄo một tiĂȘu đề xĂĄc thá»±c cÆĄ báșŁn base64 từ tĂȘn người dĂčng vĂ  máș­t kháș©u. + text-to-unicode: + title: Chuyển đổi văn báșŁn thĂ nh Unicode + description: PhĂąn tĂ­ch vĂ  chuyển đổi văn báșŁn thĂ nh Unicode vĂ  ngÆ°á»Łc láșĄi + + ipv4-range-expander: + title: Mở rộng dáșŁi IPv4 + description: Cho một địa chỉ IPv4 báșŻt đáș§u vĂ  káșżt thĂșc, cĂŽng cỄ nĂ y tĂ­nh toĂĄn một máșĄng IPv4 hợp lệ với kĂœ hiệu CIDR cá»§a nĂł. + + text-diff: + title: So sĂĄnh văn báșŁn + description: So sĂĄnh hai văn báșŁn vĂ  xem sá»± khĂĄc biệt giữa chĂșng. + + otp-generator: + title: TáșĄo mĂŁ OTP + description: TáșĄo vĂ  xĂĄc thá»±c mĂŁ OTP (máș­t kháș©u một láș§n) dá»±a trĂȘn thời gian cho xĂĄc thá»±c đa yáșżu tố. + + url-encoder: + title: MĂŁ hĂła/giáșŁi mĂŁ chuỗi định dáșĄng URL + description: MĂŁ hĂła thĂ nh định dáșĄng URL (cĂČn Ä‘Æ°á»Łc gọi lĂ  "percent-encoded") hoáș·c giáșŁi mĂŁ từ đó. + + text-to-binary: + title: Chuyển đổi văn báșŁn thĂ nh nhị phĂąn ASCII + description: Chuyển đổi văn báșŁn thĂ nh biểu diễn nhị phĂąn ASCII cá»§a nĂł vĂ  ngÆ°á»Łc láșĄi. diff --git a/locales/zh.yml b/locales/zh.yml index d16a9ac8..9b065682 100644 --- a/locales/zh.yml +++ b/locales/zh.yml @@ -30,7 +30,7 @@ about: content: > # 慳äșŽ IT-Tools - IT-Tools 由 [Corentin Thomasset](https://github.com/CorentinTh) 甹 ❀ ćŒ€ć‘ïŒŒæ±‡é›†äș†ćŻčćŒ€ć‘äșș摘撌 IT ä»Žäžšè€…æœ‰ç”šçš„ć·„ć…·ă€‚ćŠ‚æžœćŻčæ‚šæœ‰ćžźćŠ©ïŒŒèŻ·ć°†ć…¶ćˆ†äș«ç»™æ‚šçš„æœ‹ć‹ïŒŒćč¶äž”æ·»ćŠ ćˆ°æ”¶è—ć€č䞭 + IT-Tools 由 [Corentin Thomasset](https://corentin.tech?utm_source=it-tools&utm_medium=about) 甹 ❀ ćŒ€ć‘ïŒŒæ±‡é›†äș†ćŻčćŒ€ć‘äșș摘撌 IT ä»Žäžšè€…æœ‰ç”šçš„ć·„ć…·ă€‚ćŠ‚æžœćŻčæ‚šæœ‰ćžźćŠ©ïŒŒèŻ·ć°†ć…¶ćˆ†äș«ç»™æ‚šçš„æœ‹ć‹ïŒŒćč¶äž”æ·»ćŠ ćˆ°æ”¶è—ć€č䞭 IT-Tools æ°žäč…ć…èŽčäž”ćŒ€æșïŒˆMIT èźžćŻèŻïŒ‰ïŒŒäœ†éœ€èŠè”„é‡‘ç”šäșŽæ‰˜çźĄć’Œç»­èźąćŸŸćă€‚ćŠ‚æžœæ‚šæƒłæ”ŻæŒæˆ‘çš„ć·„äœœïŒŒćč¶éŒ“ćŠ±æˆ‘æ·»ćŠ æ›Žć€šć·„ć…·ïŒŒèŻ·è€ƒè™‘é€šèż‡ [è”žćŠ©æˆ‘](https://www.buymeacoffee.com/cthmsst) èż›èĄŒæ”ŻæŒă€‚ @@ -69,3 +69,321 @@ tools: measurement: '攋量' text: 'æ–‡æœŹ' data: 'æ•°æź' + + password-strength-analyser: + title: 毆码ćŒșćșŠćˆ†æžä»Ș + description: äœżç”šæ­€ćŻ†ç ćŒșćșŠćˆ†æžć™šć’Œç Žè§Łæ—¶é—ŽäŒ°èźĄć·„ć…·æ„ć‘çŽ°ćŻ†ç çš„ćŒșćșŠă€‚ + + chronometer: + title: èźĄæ—¶ć™š + description: 监控äș‹ç‰©çš„æŒç»­æ—¶é—Žă€‚ćŸșæœŹäžŠæ˜Żäž€ç§ć…·æœ‰çź€ć•èźĄæ—¶ć™šćŠŸèƒœçš„èźĄæ—¶ć™šă€‚ + token-generator: + title: Token ç”Ÿæˆć™š + description: äœżç”šæ‚šæƒłèŠçš„ć­—çŹŠă€ć€§ć†™æˆ–ć°ć†™ć­—æŻă€æ•°ć­—ć’Œ/æˆ–çŹŠć·ç”Ÿæˆéšæœș歗笩äžČ。 + + uppercase: '性憙 (ABC...)' + lowercase: '氏憙 (abc...)' + numbers: 'æ•°ć­— (123...)' + symbols: 'çŹŠć· (!-;...)' + length: '长ćșŠ' + tokenPlaceholder: '什牌...' + copied: ć€ćˆ¶ćˆ°ć‰ȘèŽŽæż + button: + copy: ć€ćˆ¶ + refresh: ćˆ·æ–° + percentage-calculator: + title: ç™Ÿćˆ†æŻ”èźĄçź—ć™š + description: èœ»æŸèźĄçź—ä»Žäž€äžȘć€Œćˆ°ćŠäž€äžȘć€Œçš„ç™Ÿćˆ†æŻ”ïŒŒæˆ–ä»Žç™Ÿćˆ†æŻ”ćˆ°ć€Œçš„ç™Ÿćˆ†æŻ”ă€‚ + + svg-placeholder-generator: + title: SVG ć äœçŹŠç”Ÿæˆć™š + description: 生成 svg ć›Ÿćƒä»„ç”šäœœćș”甚皋ćșäž­çš„ć äœçŹŠă€‚ + + json-to-csv: + title: JSON èœŹ CSV + description: äœżç”šè‡ȘćŠšæ ‡ć€ŽæŁ€æ”‹ć°†JSONèœŹæąäžșCSV。 + + camera-recorder: + title: æ‘„ćƒæœșèź°ćœ•ć™š + description: ä»Žçœ‘ç»œæ‘„ćƒć€Žæˆ–ç…§ç›žæœșæ‹æ‘„ç…§ç‰‡æˆ–ćœ•ćˆ¶è§†éą‘ă€‚ + + keycode-info: + title: Keycode äżĄæŻ + description: æŸ„æ‰Ÿä»»äœ•æŒ‰äž‹çš„é”źçš„javascripté”źä»Łç ă€ä»Łç ă€äœçœźć’Œäżźé„°çŹŠă€‚ + + emoji-picker: + title: Emoji é€‰æ‹©ć™š + description: èœ»æŸć€ćˆ¶ć’ŒçČ˜èŽŽEmojièĄšæƒ…çŹŠć·ïŒŒćč¶èŽ·ćŸ—æŻäžȘèĄšæƒ…çŹŠć·çš„unicode撌code pointsć€Œ. + + color-converter: + title: Color é€‰æ‹©ć™š + description: ćœšäžćŒæ ŒćŒïŒˆćć…­èż›ćˆ¶ă€rgb、hsl撌cssćç§°ïŒ‰äč‹é—ŽèœŹæąéąœè‰Č + bcrypt: + title: 抠毆 + description: äœżç”šbcryptćŻčæ–‡æœŹć­—çŹŠäžČèż›èĄŒć“ˆćžŒć’ŒæŻ”èŸƒă€‚Bcryptæ˜Żäž€äžȘćŸșäșŽBlowfishćŻ†ç çš„ćŻ†ç ć“ˆćžŒć‡œæ•°ă€‚ + + crontab-generator: + title: Crontab èĄšèŸŸćŒç”Ÿæˆ + description: éȘŒè݁ćč¶ç”Ÿæˆcrontabćč¶èŽ·ć–cron调ćșŠçš„ćŻèŻ»æèż°ă€‚ + + http-status-codes: + title: HTTP 状态码 + description: 所有HTTPçŠ¶æ€çš„ćˆ—èĄšćŻčć…¶ćç§°ć’Œć«äč‰è§Łé‡Šă€‚ + + sql-prettify: + title: SQL çŸŽćŒ–ć’Œæ ŒćŒćŒ– + description: 朹çșżæ ŒćŒćŒ–ć’ŒçŸŽćŒ–æ‚šçš„ SQL æŸ„èŻąïŒˆćźƒæ”ŻæŒć„ç§ SQL æ–čèš€ïŒ‰ă€‚ + + benchmark-builder: + title: ćŸșć‡†ç”Ÿæˆć™š + description: 缀捕的朹çșżćŸșć‡†æž„ć»șć™šćŻä»„èœ»æŸæŻ”èŸƒä»»ćŠĄçš„æ‰§èĄŒæ—¶é—Žă€‚ + + git-memo: + title: Git ć€‡ćż˜ćœ• + description: Gitæ˜Żäž€ç§ćŽ»äž­ćżƒćŒ–çš„ç‰ˆæœŹçźĄç†èœŻä»¶ă€‚äœżç”šæ­€ć€‡ćż˜ć•ïŒŒæ‚šćŻä»„ćż«é€Ÿèźżé—źæœ€ćžžè§çš„gitć‘œä»€. + + slugify-string: + title: 打äč±ć­—珊äžČ + description: 硼保歗笩äžČ urlă€æ–‡ä»¶ćć’Œ id 漉慹。 + + encryption: + title: 抠毆/è§ŁćŻ†æ–‡æœŹ + description: äœżç”šćŠ ćŻ†çź—æł•ïŒˆćŠ‚AES、TripleDES、Rabbit或RC4ïŒ‰ćŠ ćŻ†ć’Œè§ŁćŻ†æ–‡æœŹæ˜Žæ–‡ă€‚ + + random-port-generator: + title: 随æœșç«ŻćŁç”Ÿæˆ + description: 生成“ć·ČçŸ„â€ç«ŻćŁèŒƒć›ŽïŒˆ0-1023äč‹ć€–的随æœșç«ŻćŁć·ă€‚ + + yaml-prettify: + title: YAMLçŸŽćŒ–ć’Œæ ŒćŒćŒ– + description: 氆YAML歗笩äžČäżźé„°äžșć‹ć„œçš„ćŻèŻ»æ ŒćŒă€‚ + + eta-calculator: + title: ETA èźĄçź—ć™š + description: ETAïŒˆäŒ°èźĄćˆ°èŸŸæ—¶é—ŽïŒ‰èźĄçź—ć™šïŒŒç”šäșŽçŸ„é“ä»»ćŠĄçš„èż‘äŒŒç»“æŸæ—¶é—ŽïŒŒäŸ‹ćŠ‚äž‹èœœçš„ç»“æŸæ—¶ćˆ»ă€‚ + + roman-numeral-converter: + title: çœ—é©Źæ•°ć­—èœŹæąć™š + description: ć°†çœ—é©Źæ•°ć­—èœŹæąäžșæ•°ć­—ïŒŒćč¶ć°†æ•°ć­—èœŹæąäžșçœ—é©Źæ•°ć­—ă€‚ + + hmac-generator: + title: Hmac ç”Ÿæˆć™š + description: äœżç”šćŻ†é’„ć’Œæ‚šć–œæŹąçš„ć“ˆćžŒć‡œæ•°èźĄçź—ćŸșäșŽć“ˆćžŒçš„æ¶ˆæŻèș«ä»œéȘŒèŻä»Łç ïŒˆHMACïŒ‰ă€‚ + + bip39-generator: + title: BIP39ćŻ†ç ç”Ÿæˆć™š + description: 从现有或随æœșćŠ©èź°çŹŠç”ŸæˆBIP39ćŻ†ç çŸ­èŻ­ïŒŒæˆ–ä»ŽćŻ†ç çŸ­èŻ­èŽ·ć–ćŠ©èź°çŹŠă€‚ + + base64-file-converter: + title: Base64 æ–‡ä»¶èœŹæąć™š + description: 氆歗笩äžČă€æ–‡ä»¶æˆ–ć›ŸćƒèœŹæąäžșć…¶ Base64 èĄšç€șćœąćŒă€‚ + list-converter: + title: List èœŹæąć™š + description: èŻ„ć·„ć…·ćŻä»„ć€„ç†ćŸșäșŽæ•°ç»„çš„æ•°æźïŒŒćč¶ć°†ć„种曎æ”čïŒˆèœŹçœźă€æ·»ćŠ ć‰çŒ€ć’ŒćŽçŒ€ă€ćć‘ćˆ—èĄšă€æŽ’ćșćˆ—èĄšă€ć°ć†™ć€Œă€æˆȘæ–­ć€ŒïŒ‰ćș”甚äșŽæŻäž€èĄŒă€‚ + + base64-string-converter: + title: Base64 歗笩äžČ猖码/è§Łç  + description: 氆歗笩äžČçŒ–ç ć’Œè§Łç äžșć…¶ Base64 æ ŒćŒèĄšç€șćœąćŒćłćŻă€‚ + + toml-to-yaml: + title: TOML 戰 YAML + description: Parse and convert TOML to YAML. + + math-evaluator: + title: æ•°ć­ŠèźĄçź—ć™š + description: èźĄçź—æ•°ć­ŠèĄšèŸŸćŒçš„èźĄçź—ć™šă€‚æ‚šćŻä»„äœżç”šsqrt、cos、sin、absç­‰ć‡œæ•°ă€‚ + + json-to-yaml-converter: + title: JSON戰YAMLèœŹæąć™š + description: 朹çșżèœŹæąć°†JSONèœŹæąäžșYAML。 + + url-parser: + title: Urlćˆ†æžć™š + description: è§Łæžurl歗笩äžČä»„èŽ·ć–æ‰€æœ‰äžćŒçš„éƒšćˆ†ïŒˆćèźźă€æ„æșă€ć‚æ•°ă€ç«ŻćŁă€ç”šæˆ·ććŻ†ç â€ŠïŒ‰ + + iban-validator-and-parser: + title: IBANéȘŒèŻć™šć’Œè§Łæžć™š + description: éȘŒèŻć’Œćˆ†æžIBANçŒ–ć·ă€‚æŁ€æŸ„IBANæ˜ŻćŠæœ‰æ•ˆïŒŒćč¶èŽ·ć–ć›œćź¶BBANïŒŒćŠ‚æžœćźƒæ˜ŻQR-IBAN撌IBANć‹ć„œæ ŒćŒă€‚ + + user-agent-parser: + title: ç”šæˆ·ä»Łç†ćˆ†æžć™š + description: ä»Žç”šæˆ·ä»Łç†ć­—çŹŠäžČäž­æŁ€æ”‹ć’Œćˆ†æžæ”è§ˆć™šă€ćŒ•æ“Žă€æ“äœœçł»ç»Ÿă€CPUć’ŒèźŸć€‡ç±»ćž‹/ćž‹ć·ă€‚ + + numeronym-generator: + title: æ•°ć­—ćç§°ç”Ÿæˆć™š + description: æ•°ć­—ćæ˜Żäž€äžȘç”šæ•°ć­—æž„æˆçŒ©ć†™çš„èŻă€‚äŸ‹ćŠ‚ïŒŒâ€œi18nâ€æ˜Żâ€œć›œé™…ćŒ–â€çš„ćèŻïŒŒć…¶äž­18èĄšç€șć•èŻäž­çŹŹäž€äžȘić’Œæœ€ćŽäž€äžȘnäč‹é—Žçš„ć­—æŻæ•°ă€‚ + + case-converter: + title: ć€§ć°ć†™èœŹæą + description: 曎æ”č歗笩äžČçš„ć€§ć°ć†™ćč¶ćœšäžćŒæ ŒćŒäč‹é—Žèż›èĄŒé€‰æ‹© + + html-entities: + title: èœŹäč‰htmlćźžäœ“ + description: èœŹä艿ˆ–unescape htmlćźžäœ“ïŒˆć°†<、>、&、“撌\'æ›żæąäžșć…¶htmlç‰ˆæœŹïŒ‰ + + json-prettify: + title: JSONçŸŽćŒ–ć’Œæ ŒćŒćŒ– + description: 氆JSON歗笩äžČäżźé„°äžșć‹ć„œçš„ćŻèŻ»æ ŒćŒă€‚ + + docker-run-to-docker-compose-converter: + title: Docker Run 戰 docker-compose èœŹæąć™š + description: 氆 docker run ć‘œä»€èĄŒèœŹæąäžș docker-compose 文件! + + mac-address-lookup: + title: MACćœ°ć€æŸ„æ‰Ÿ + description: é€šèż‡èźŸć€‡çš„MACćœ°ć€æŸ„æ‰ŸèźŸć€‡çš„äŸ›ćș”ć•†ć’Œćˆ¶é€ ć•†ă€‚ + + mime-types: + title: mime类枋 + description: 氆mimeç±»ćž‹èœŹæąäžșæ‰©ć±•ïŒŒćäč‹äșŠç„¶ă€‚ + + toml-to-json: + title: TOML 戰 JSON + description: è§ŁæžTOMLćč¶ć°†ć…¶èœŹæąäžșJSON。 + + lorem-ipsum-generator: + title: Lorem ipsumç”Ÿæˆć™š + description: Lorem ipsumæ˜Żäž€ç§ć äœçŹŠæ–‡æœŹïŒŒé€šćžžç”šäșŽæŒ”ç€șæ–‡æĄŁæˆ–ć­—äœ“çš„è§†è§‰ćœąćŒïŒŒè€ŒäžäŸè”–äșŽæœ‰æ„äč‰çš„憅ćźč + + qrcode-generator: + title: äșŒç»Žç ç”Ÿæˆć™š + description: 生成ćč¶äž‹èœœurlæˆ–æ–‡æœŹçš„QRä»Łç ïŒŒćč¶è‡Ș漚äč‰èƒŒæ™Żć’Œć‰æ™Żéąœè‰Č。 + + wifi-qrcode-generator: + title: WiFi äșŒç»Žç ç”Ÿæˆć™š + description: ç”Ÿæˆć’Œäž‹èœœQRç ä»„ćż«é€ŸèżžæŽ„ćˆ°WiFiçœ‘ç»œă€‚ + + xml-formatter: + title: XML æ ŒćŒćŒ– + description: 氆XML歗笩äžČäżźé„°äžșć‹ć„œçš„ćŻèŻ»æ ŒćŒă€‚ + + temperature-converter: + title: æž©ćșŠèœŹæąć™š + description: ćŒ€ć°”æ–‡ă€æ‘„æ°ćșŠă€ćŽæ°ćșŠă€ć…°é‡‘ă€ćŸ·èŽ±ć°”ă€ç‰›éĄżă€é›·ć„„ç©†ć°”ć’Œçœ—é»˜æž©ćșŠćșŠæ•°èœŹæąă€‚ + + chmod-calculator: + title: Chmod èźĄçź—ć™š + description: äœżç”šæ­€ćœšçșżçš„chmodèźĄçź—ć™šèźĄçź—chmodæƒé™ć’Œć‘œä»€ă€‚ + + rsa-key-pair-generator: + title: RSA毆钄ćŻčç”Ÿæˆć™š + description: 生成新的随æœșRSAç§é’„ć’Œć…Źé’„pemèŻäčŠă€‚ + + html-wysiwyg-editor: + title: HTMLæ‰€è§ćłæ‰€ćŸ—çŒ–èŸ‘ć™š + description: 朹çșżHTMLçŒ–èŸ‘ć™šć…·æœ‰ćŠŸèƒœäž°ćŻŒçš„æ‰€è§ćłæ‰€ćŸ—çŒ–èŸ‘ć™šïŒŒç«‹ćłèŽ·ćŸ—ć†…ćźč的æșä»Łç ă€‚ + + yaml-to-toml: + title: YAML 戰 TOML + description: è§ŁæžYAMLćč¶ć°†ć…¶èœŹæąäžșTOML。 + + mac-address-generator: + title: MAC ćœ°ć€ç”Ÿæˆć™š + description: èŸ“ć…„æ•°é‡ć’Œć‰çŒ€ă€‚MACćœ°ć€ć°†ä»„æ‚šé€‰æ‹©çš„ć€§ć°ć†™ïŒˆć€§ć†™æˆ–ć°ć†™ïŒ‰ç”Ÿæˆ + + json-diff: + title: JSON ć·źćŒ‚æŻ”èŸƒ + description: æŻ”èŸƒäž€äžȘJSONćŻčè±Ąćč¶èŽ·ćŸ—ćźƒä»Źäč‹é—Žçš„ć·źćŒ‚ă€‚ + jwt-parser: + title: JWT è§Łæžć™š + description: è§Łæžć’Œè§Łç JSON Web Tokenjwtćč¶æ˜Ÿç€ș慶憅ćźč。 + + date-converter: + title: æ—„æœŸæ—¶é—ŽèœŹæąć™š + description: ć°†æ—„æœŸć’Œæ—¶é—ŽèœŹæąäžșć„ç§äžćŒçš„æ ŒćŒ + + phone-parser-and-formatter: + title: ç””èŻćˆ†æžć™šć’Œæ ŒćŒćŒ–çš‹ćș + description: è§Łæžă€éȘŒèŻć’Œæ ŒćŒćŒ–ç””èŻć·ç ă€‚èŽ·ć–æœ‰ć…łç””èŻć·ç çš„äżĄæŻïŒŒćŠ‚ć›œćź¶/㜰ćŒș代码、类枋等。 + + ipv4-subnet-calculator: + title: IPv4ć­çœ‘èźĄçź—ć™š + description: è§ŁæžIPv4 CIDRć—ïŒŒćč¶èŽ·ć–æœ‰ć…łć­çœ‘ç»œçš„æ‰€æœ‰æ‰€éœ€äżĄæŻă€‚ + + og-meta-generator: + title: ćŒ€æ”ŸćŒć›Ÿćœąć…ƒç”Ÿæˆć™š + description: äžșæ‚šçš„çœ‘ç«™ç”ŸæˆćŒ€æ”ŸćŒć›Ÿćœąć’Œç€Ÿäș€htmlć…ƒæ ‡èź°ă€‚ + + ipv6-ula-generator: + title: IPv6 ULAç”Ÿæˆć™š + description: æ čæźRFC4193ćœšçœ‘ç»œäžŠç”Ÿæˆæ‚šè‡Șć·±çš„æœŹćœ°äžćŻè·Żç”±IP朰杀。 + + hash-text: + title: Hash æ–‡æœŹ + description: 'äœżç”šæ‰€éœ€çš„ć‡œæ•°ć“ˆćžŒæ–‡æœŹć­—çŹŠäžČMD5、SHA1、SHA256、SHA224、SHA512、SHA384、SHA3或RIPEMD160' + + json-to-toml: + title: JSON èœŹ TOML + description: è§ŁæžJSONćč¶ć°†ć…¶èœŹæąäžșTOML。 + + device-information: + title: èźŸć€‡äżĄæŻ + description: èŽ·ć–æœ‰ć…łćœ“ć‰èźŸć€‡çš„äżĄæŻïŒˆć±ćč•ć€§ć°ă€ćƒçŽ æŻ”çŽ‡ă€ç”šæˆ·ä»Łç†â€ŠïŒ‰ + + pdf-signature-checker: + title: PDFç­ŸćæŁ€æŸ„ć™š + description: 'éȘŒè݁PDFæ–‡ä»¶çš„ç­Ÿćă€‚ç­Ÿćçš„PDFæ–‡ä»¶ćŒ…ć«äž€äžȘæˆ–ć€šäžȘç­ŸćïŒŒćŻç”šäșŽçĄźćꚿ–‡ä»¶çš„憅ćźčćœšç­ŸććŽæ˜ŻćŠć·Čèą«æ›Žæ”č。' + + json-minify: + title: JSON ćŽ‹çŒ© + description: é€šèż‡ćˆ é™€äžćż…èŠçš„ç©șç™œæ„çŒ©ć°ć’ŒćŽ‹çŒ©JSON。 + + ulid-generator: + title: ULID ç”Ÿæˆć™š + description: 生成随æœșçš„é€šç”šć”Żäž€èŻć…žćŻæŽ’ćșæ ‡èŻ†çŹŠïŒˆULIDïŒ‰ă€‚ + + string-obfuscator: + title: 歗笩äžČæ··æ·†ć™š + description: æ··æ·†ć­—çŹŠäžČïŒˆćŠ‚ç§˜ćŻ†ă€IBAN æˆ–ä»€ç‰ŒïŒ‰ïŒŒäœżć…¶ćŻć…±äș«ć’ŒćŻèŻ†ćˆ«ïŒŒè€Œäžæł„éœČ慶憅ćźč。 + + base-converter: + title: 敎数ćŸșèœŹæąć™š + description: 朹侍搌的ćŸșæ•°ïŒˆćèż›ćˆ¶ă€ćć…­èż›ćˆ¶ă€äșŒèż›ćˆ¶ă€ć…«èż›ćˆ¶ă€base64 äč‹é—ŽèœŹæąæ•°ć­— + + yaml-to-json-converter: + title: YAML戰JSONèœŹæąć™š + description: äœżç”šæ­€ćœšçșżèœŹæąć™šć°†YAMLèœŹæąäžșJSON。 + + uuid-generator: + title: UUIDs ç”Ÿæˆć™š + description: é€šç”šć”Żäž€æ ‡èŻ†çŹŠïŒˆUUIDïŒ‰æ˜Żäž€äžȘ128äœæ•°ć­—ïŒŒç”šäșŽæ ‡èŻ†èźĄçź—æœșçł»ç»Ÿäž­çš„äżĄæŻă€‚ćŻèƒœçš„UUID数量äžș16^32ïŒŒćł2^128或çșŠ3.4x10^38ïŒˆèż™æ˜Żäž€äžȘćŸˆć€§çš„æ•°ć­—ïŒïŒ‰ă€‚ + + ipv4-address-converter: + title: Ipv4ćœ°ć€èœŹæąć™š + description: 朹ipv6äž­ïŒŒć°†ipćœ°ć€èœŹæąäžșćèż›ćˆ¶ă€äșŒèż›ćˆ¶ă€ćć…­èż›ćˆ¶æˆ–äș‹ä»¶ + + text-statistics: + title: æ–‡æœŹç»ŸèźĄ + description: èŽ·ć–æœ‰ć…łæ–‡æœŹă€ć­—çŹŠæ•°ă€ć­—æ•°ă€ć€§ć°ç­‰çš„äżĄæŻ + + text-to-nato-alphabet: + title: æ–‡æœŹèœŹćŒ—çșŠć­—æŻèĄš + description: ć°†æ–‡æœŹèœŹæąäžș挗çșŠæ‹ŒéŸłć­—æŻä»„èż›èĄŒćŁć€ŽäŒ æ’­ă€‚ + + basic-auth-generator: + title: ćŸșæœŹèș«ä»œéȘŒèŻç”Ÿæˆć™š + description: ä»Žç”šæˆ·ćć’ŒćŻ†ç ç”Ÿæˆ base64 ćŸșæœŹèș«ä»œéȘŒèŻæ ‡ć€Žă€‚ + + text-to-unicode: + title: æ–‡æœŹèœŹ Unicode + description: è§Łæžæ–‡æœŹćč¶ć°†ć…¶èœŹæąäžș unicodeïŒŒćäč‹äșŠç„¶ + + ipv4-range-expander: + title: IPv4èŒƒć›Žæ‰©ć±•ć™š + description: ç»™ćźšè”·ć§‹ć’Œç»“æŸIPv4ćœ°ć€ïŒŒæ­€ć·„ć…·äœżç”šć…¶CIDRèĄšç€șæł•èźĄçź—æœ‰æ•ˆçš„IPv4çœ‘ç»œă€‚ + + text-diff: + title: æ–‡æœŹæŻ”èŸƒ + description: æŻ”èŸƒäž€äžȘæ–‡æœŹćč¶æŸ„çœ‹ćźƒä»Źäč‹é—Žçš„ć·źćŒ‚ă€‚ + + otp-generator: + title: OTPä»Łç ç”Ÿæˆć™š + description: äžș怚曠玠èș«ä»œéȘŒèŻç”Ÿæˆć’ŒéȘŒè݁ćŸșäșŽæ—¶é—Žçš„OTPïŒˆäž€æŹĄæ€§ćŻ†ç ïŒ‰ă€‚ + + url-encoder: + title: 猖码/è§Łç urlæ ŒćŒçš„ć­—çŹŠäžČ + description: 猖码äžșurlçŒ–ç æ ŒćŒïŒˆäčŸç§°äžșâ€œç™Ÿćˆ†æŻ”çŒ–ç â€ïŒ‰æˆ–ä»Žäž­è§Łç ă€‚ + + text-to-binary: + title: æ–‡æœŹćˆ° ASCII äșŒèż›ćˆ¶ + description: ć°†æ–‡æœŹèœŹæąäžșć…¶ ASCII äșŒèż›ćˆ¶èĄšç€șćœąćŒïŒŒćäč‹äșŠç„¶ă€‚ diff --git a/package.json b/package.json index 520ffec4..e7e58d7a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,14 @@ { "name": "it-tools", - "version": "2023.11.2-7d94e11", + "version": "2024.5.13-a0bc346", + "packageManager": "pnpm@8.15.3", "description": "Collection of handy online tools for developers, with great UX. ", + "author": "Corentin Th (https://corentin.tech)", + "license": "GNU GPLv3", + "repository": { + "type": "git", + "url": "https://github.com/CorentinTh/it-tools" + }, "keywords": [ "productivity", "converter", @@ -13,12 +20,6 @@ "developer-tools", "developer-productivity" ], - "author": "Corentin Th (https://github.com/CorentinTh)", - "license": "GNU GPLv3", - "repository": { - "type": "git", - "url": "https://github.com/CorentinTh/it-tools" - }, "scripts": { "dev": "vite", "build": "vue-tsc --noEmit && NODE_OPTIONS=--max_old_space_size=4096 vite build", @@ -37,10 +38,13 @@ "dependencies": { "@it-tools/bip39": "^0.0.4", "@it-tools/oggen": "^1.3.0", + "@regexper/render": "^1.0.0", "@sindresorhus/slugify": "^2.2.1", "@tiptap/pm": "2.1.6", "@tiptap/starter-kit": "2.1.6", "@tiptap/vue-3": "2.0.3", + "@types/figlet": "^1.5.8", + "@types/markdown-it": "^13.0.7", "@vicons/material": "^0.12.0", "@vicons/tabler": "^0.12.0", "@vueuse/core": "^10.3.0", @@ -57,16 +61,20 @@ "date-fns": "^2.29.3", "dompurify": "^3.0.6", "duration-fns": "^3.0.2", + "email-normalizer": "^1.0.0", "emojilib": "^3.0.10", + "figlet": "^1.7.0", "figue": "^1.2.0", "fuse.js": "^6.6.2", "highlight.js": "^11.7.0", "iarna-toml-esm": "^3.0.5", "ibantools": "^4.3.3", + "js-base64": "^3.7.6", "json5": "^2.2.3", "jwt-decode": "^3.1.2", "libphonenumber-js": "^1.10.28", "lodash": "^4.17.21", + "markdown-it": "^14.0.0", "marked": "^10.0.0", "mathjs": "^11.9.1", "mime-types": "^2.1.35", @@ -81,6 +89,7 @@ "plausible-tracker": "^0.3.8", "pretty-ms": "^9.1.0", "qrcode": "^1.5.1", + "randexp": "^0.5.3", "sql-formatter": "^13.0.0", "ua-parser-js": "^1.0.35", "ulid": "^2.3.0", @@ -88,16 +97,18 @@ "unplugin-auto-import": "^0.16.4", "uuid": "^9.0.0", "vue": "^3.3.4", - "vue-i18n": "^9.2.2", + "vue-i18n": "^9.9.1", "vue-router": "^4.1.6", + "vue-shadow-dom": "^4.2.0", "vue-tsc": "^1.8.1", "xml-formatter": "^3.3.2", + "xml-js": "^1.6.11", "yaml": "^2.2.1" }, "devDependencies": { "@antfu/eslint-config": "^0.41.0", "@iconify-json/mdi": "^1.1.50", - "@intlify/unplugin-vue-i18n": "^0.13.0", + "@intlify/unplugin-vue-i18n": "^2.0.0", "@playwright/test": "^1.32.3", "@rushstack/eslint-patch": "^1.2.0", "@tsconfig/node18": "^18.2.0", diff --git a/playwright.config.ts b/playwright.config.ts index 3caa0612..5257c526 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -9,7 +9,7 @@ const useWebServer = process.env.NO_WEB_SERVER !== 'true'; */ export default defineConfig({ testDir: './src', - testMatch: /.*\.e2e\.(spec\.)?ts/, + testMatch: /\.e2e\.(spec\.)?ts$/, /* Run tests in files in parallel */ fullyParallel: true, /* Fail the build on CI if you accidentally left test.only in the source code. */ @@ -57,7 +57,7 @@ export default defineConfig({ && { webServer: { command: 'npm run preview', - url: 'http://127.0.0.1:5050', + url: 'http://localhost:5050', reuseExistingServer: !isCI, }, } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b7cf98e..e078fa5a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ dependencies: '@it-tools/oggen': specifier: ^1.3.0 version: 1.3.0 + '@regexper/render': + specifier: ^1.0.0 + version: 1.0.0 '@sindresorhus/slugify': specifier: ^2.2.1 version: 2.2.1 @@ -23,6 +26,12 @@ dependencies: '@tiptap/vue-3': specifier: 2.0.3 version: 2.0.3(@tiptap/core@2.1.12)(@tiptap/pm@2.1.6)(vue@3.3.4) + '@types/figlet': + specifier: ^1.5.8 + version: 1.5.8 + '@types/markdown-it': + specifier: ^13.0.7 + version: 13.0.9 '@vicons/material': specifier: ^0.12.0 version: 0.12.0 @@ -71,9 +80,15 @@ dependencies: duration-fns: specifier: ^3.0.2 version: 3.0.2 + email-normalizer: + specifier: ^1.0.0 + version: 1.0.0 emojilib: specifier: ^3.0.10 version: 3.0.10 + figlet: + specifier: ^1.7.0 + version: 1.7.0 figue: specifier: ^1.2.0 version: 1.2.0 @@ -89,6 +104,9 @@ dependencies: ibantools: specifier: ^4.3.3 version: 4.3.3 + js-base64: + specifier: ^3.7.6 + version: 3.7.7 json5: specifier: ^2.2.3 version: 2.2.3 @@ -101,6 +119,9 @@ dependencies: lodash: specifier: ^4.17.21 version: 4.17.21 + markdown-it: + specifier: ^14.0.0 + version: 14.1.0 marked: specifier: ^10.0.0 version: 10.0.0 @@ -143,6 +164,9 @@ dependencies: qrcode: specifier: ^1.5.1 version: 1.5.1 + randexp: + specifier: ^0.5.3 + version: 0.5.3 sql-formatter: specifier: ^13.0.0 version: 13.0.0 @@ -165,17 +189,23 @@ dependencies: specifier: ^3.3.4 version: 3.3.4 vue-i18n: - specifier: ^9.2.2 - version: 9.2.2(vue@3.3.4) + specifier: ^9.9.1 + version: 9.9.1(vue@3.3.4) vue-router: specifier: ^4.1.6 version: 4.1.6(vue@3.3.4) + vue-shadow-dom: + specifier: ^4.2.0 + version: 4.2.0 vue-tsc: specifier: ^1.8.1 version: 1.8.1(typescript@5.2.2) xml-formatter: specifier: ^3.3.2 version: 3.3.2 + xml-js: + specifier: ^1.6.11 + version: 1.6.11 yaml: specifier: ^2.2.1 version: 2.2.1 @@ -188,8 +218,8 @@ devDependencies: specifier: ^1.1.50 version: 1.1.50 '@intlify/unplugin-vue-i18n': - specifier: ^0.13.0 - version: 0.13.0(rollup@2.79.1)(vue-i18n@9.2.2) + specifier: ^2.0.0 + version: 2.0.0(rollup@2.79.1)(vue-i18n@9.9.1) '@playwright/test': specifier: ^1.32.3 version: 1.32.3 @@ -2209,8 +2239,8 @@ packages: - supports-color dev: true - /@intlify/bundle-utils@7.1.0(vue-i18n@9.2.2): - resolution: {integrity: sha512-Q88Wl2T8oaRXls8Yr6l807jZM88mceJvK7QS6gKdU8/pf3gTpU9XmcYORDgAv6h5WKQMoaFjNVf5+SWLfTAysA==} + /@intlify/bundle-utils@7.5.0(vue-i18n@9.9.1): + resolution: {integrity: sha512-6DymqusddBQ8kVtVBsVFFF7arNfIhuLacOmmsqayT2vl427j9m0VX12mMC+cgoVIodSpRfzYPaPTdPuJq7mK0Q==} engines: {node: '>= 14.16'} peerDependencies: petite-vue-i18n: '*' @@ -2221,65 +2251,39 @@ packages: vue-i18n: optional: true dependencies: - '@intlify/message-compiler': 9.3.0-beta.27 - '@intlify/shared': 9.3.0-beta.27 - acorn: 8.10.0 - escodegen: 2.0.0 + '@intlify/message-compiler': 9.9.1 + '@intlify/shared': 9.9.1 + acorn: 8.11.2 + escodegen: 2.1.0 estree-walker: 2.0.2 jsonc-eslint-parser: 2.3.0 - magic-string: 0.30.2 - mlly: 1.4.0 + magic-string: 0.30.5 + mlly: 1.4.2 source-map-js: 1.0.2 - vue-i18n: 9.2.2(vue@3.3.4) + vue-i18n: 9.9.1(vue@3.3.4) yaml-eslint-parser: 1.2.2 dev: true - /@intlify/core-base@9.2.2: - resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==} - engines: {node: '>= 14'} - dependencies: - '@intlify/devtools-if': 9.2.2 - '@intlify/message-compiler': 9.2.2 - '@intlify/shared': 9.2.2 - '@intlify/vue-devtools': 9.2.2 - - /@intlify/devtools-if@9.2.2: - resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==} - engines: {node: '>= 14'} - dependencies: - '@intlify/shared': 9.2.2 - - /@intlify/message-compiler@9.2.2: - resolution: {integrity: sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==} - engines: {node: '>= 14'} - dependencies: - '@intlify/shared': 9.2.2 - source-map: 0.6.1 - - /@intlify/message-compiler@9.3.0-beta.27: - resolution: {integrity: sha512-GC8rSbd7V67Zu+a9Z0bpV4riBek11YCURJU50YaEhV4Ub2JHEPtoYxK5r2eIsq/kp+M2hJyGLiC4NJUrGa2VwQ==} + /@intlify/core-base@9.9.1: + resolution: {integrity: sha512-qsV15dg7jNX2faBRyKMgZS8UcFJViWEUPLdzZ9UR0kQZpFVeIpc0AG7ZOfeP7pX2T9SQ5jSiorq/tii9nkkafA==} engines: {node: '>= 16'} dependencies: - '@intlify/shared': 9.3.0-beta.27 + '@intlify/message-compiler': 9.9.1 + '@intlify/shared': 9.9.1 + + /@intlify/message-compiler@9.9.1: + resolution: {integrity: sha512-zTvP6X6HeumHOXuAE1CMMsV6tTX+opKMOxO1OHTCg5N5Sm/F7d8o2jdT6W6L5oHUsJ/vvkGefHIs7Q3hfowmsA==} + engines: {node: '>= 16'} + dependencies: + '@intlify/shared': 9.9.1 source-map-js: 1.0.2 - dev: true - /@intlify/shared@9.2.2: - resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==} - engines: {node: '>= 14'} - - /@intlify/shared@9.3.0-beta.14-77e850b: - resolution: {integrity: sha512-aHZYRM0sJN+YSUnoC5Dv4L1TFYtP23kdTkrK5cHSEqUbI5UXc8FbnXPal0lJliMhO0ED7Ic7aEOeQX84BM3xCQ==} - engines: {node: '>= 14'} - dev: true - - /@intlify/shared@9.3.0-beta.27: - resolution: {integrity: sha512-hPMsmVCs+ZUVHHU5VORG6LopzXZT7zmyVNqc9OQG80YpA/N4lT/pkJ4B6DTNIsv2C7mwfGM7RdK+0qPki43YgA==} + /@intlify/shared@9.9.1: + resolution: {integrity: sha512-b3Pta1nwkz5rGq434v0psHwEwHGy1pYCttfcM22IE//K9owbpkEvFptx9VcuRAxjQdrO2If249cmDDjBu5wMDA==} engines: {node: '>= 16'} - dev: true - /@intlify/unplugin-vue-i18n@0.13.0(rollup@2.79.1)(vue-i18n@9.2.2): - resolution: {integrity: sha512-Mm9NhcvbsSZ5FXXnCpL/XFCk1hPp809hxErNmnwqGp21JjYOKGp3wpQSrpvGk33ZrHZbhPqAu70IEVEAxVZ5+A==} + /@intlify/unplugin-vue-i18n@2.0.0(rollup@2.79.1)(vue-i18n@9.9.1): + resolution: {integrity: sha512-1oKvm92L9l2od2H9wKx2ZvR4tzn7gUtd7bPLI7AWUmm7U9H1iEypndt5d985ypxGsEs0gToDaKTrytbBIJwwSg==} engines: {node: '>= 14.16'} peerDependencies: petite-vue-i18n: '*' @@ -2293,9 +2297,9 @@ packages: vue-i18n-bridge: optional: true dependencies: - '@intlify/bundle-utils': 7.1.0(vue-i18n@9.2.2) - '@intlify/shared': 9.3.0-beta.14-77e850b - '@rollup/pluginutils': 5.0.2(rollup@2.79.1) + '@intlify/bundle-utils': 7.5.0(vue-i18n@9.9.1) + '@intlify/shared': 9.9.1 + '@rollup/pluginutils': 5.0.5(rollup@2.79.1) '@vue/compiler-sfc': 3.3.4 debug: 4.3.4 fast-glob: 3.3.1 @@ -2305,19 +2309,12 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 unplugin: 1.4.0 - vue-i18n: 9.2.2(vue@3.3.4) + vue-i18n: 9.9.1(vue@3.3.4) transitivePeerDependencies: - rollup - supports-color dev: true - /@intlify/vue-devtools@9.2.2: - resolution: {integrity: sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==} - engines: {node: '>= 14'} - dependencies: - '@intlify/core-base': 9.2.2 - '@intlify/shared': 9.2.2 - /@it-tools/bip39@0.0.4: resolution: {integrity: sha512-0PWO7VKi6VALiFcm8z2WgxzSZ5wAko0OctBZ0I5+jjtSIXm3t1d54yrrHfgFOZDTyMpCXi638oLpzqexcfRtbA==} dependencies: @@ -2501,6 +2498,17 @@ packages: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false + /@regexper/parser@1.0.0: + resolution: {integrity: sha512-S8AWIGpCNdl9PNHdbhI6TpXZsPk6FDU/RTZI+6UFF4rVFqDQKjCIbZSgFu7NihoEZKq57wKFPbbT1EzrjVvPHA==} + dev: false + + /@regexper/render@1.0.0: + resolution: {integrity: sha512-xYm9RUgnhhZotTtf8UZpK1PG2CcTRXQ3JPwfTlYUZsy2J+UcTVc7BaO/MJadpMoVuT8jrIyptH4Y0HLzqhI3hQ==} + dependencies: + '@regexper/parser': 1.0.0 + '@svgdotjs/svg.js': 3.2.4 + dev: false + /@remirror/core-constants@2.0.1: resolution: {integrity: sha512-ZR4aihtnnT9lMbhh5DEbsriJRlukRXmLZe7HmM+6ufJNNUDoazc75UX26xbgQlNUqgAqMcUdGFAnPc1JwgAdLQ==} dependencies: @@ -2650,6 +2658,10 @@ packages: string.prototype.matchall: 4.0.10 dev: true + /@svgdotjs/svg.js@3.2.4: + resolution: {integrity: sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==} + dev: false + /@tiptap/core@2.1.12(@tiptap/pm@2.1.6): resolution: {integrity: sha512-ZGc3xrBJA9KY8kln5AYTj8y+GDrKxi7u95xIl2eccrqTY5CQeRu6HRNM1yT4mAjuSaG9jmazyjGRlQuhyxCKxQ==} peerDependencies: @@ -2944,6 +2956,10 @@ packages: /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + /@types/figlet@1.5.8: + resolution: {integrity: sha512-G22AUvy4Tl95XLE7jmUM8s8mKcoz+Hr+Xm9W90gJsppJq9f9tHvOGkrpn4gRX0q/cLtBdNkWtWCKDg2UDZoZvQ==} + dev: false + /@types/fs-extra@11.0.1: resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} dependencies: @@ -2975,7 +2991,6 @@ packages: /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} - dev: true /@types/lodash-es@4.17.10: resolution: {integrity: sha512-YJP+w/2khSBwbUSFdGsSqmDvmnN3cCKoPOL7Zjle6s30ZtemkkqhjVfFqGwPN7ASil5VyjE2GtyU/yqYY6mC0A==} @@ -2997,6 +3012,13 @@ packages: '@types/mdurl': 1.0.2 dev: true + /@types/markdown-it@13.0.9: + resolution: {integrity: sha512-1XPwR0+MgXLWfTn9gCsZ55AHOKW1WN+P9vr0PaQh5aerR9LLQXUbjfEAFhjmEmyoYFWAyuN2Mqkn40MZ4ukjBw==} + dependencies: + '@types/linkify-it': 3.0.2 + '@types/mdurl': 1.0.2 + dev: false + /@types/mdast@3.0.11: resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==} dependencies: @@ -3005,7 +3027,6 @@ packages: /@types/mdurl@1.0.2: resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} - dev: true /@types/mime-types@2.1.1: resolution: {integrity: sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==} @@ -4974,6 +4995,11 @@ packages: tslib: 2.5.0 dev: false + /drange@1.1.1: + resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==} + engines: {node: '>=4'} + dev: false + /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: true @@ -5006,6 +5032,12 @@ packages: /electron-to-chromium@1.4.572: resolution: {integrity: sha512-RlFobl4D3ieetbnR+2EpxdzFl9h0RAJkPK3pfiwMug2nhBin2ZCsGIAJWdpNniLz43sgXam/CgipOmvTA+rUiA==} + /email-normalizer@1.0.0: + resolution: {integrity: sha512-wZYuuMtL4kUOmg/TPtCrf9hAZjbFq+FcjWA85Z5nr2lGllRnWJPxCJw3gy4Cx+adMoyVw4VJfGGvt/OHgIW+qg==} + dependencies: + typescript: 5.5.4 + dev: false + /emitter-component@1.1.1: resolution: {integrity: sha512-G+mpdiAySMuB7kesVRLuyvYRqDmshB7ReKEVuyBPkzQlmiDiLrt7hHHIy4Aff552bgknVN7B2/d3lzhGO5dvpQ==} dev: false @@ -5037,7 +5069,6 @@ packages: /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - dev: true /errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} @@ -5166,15 +5197,14 @@ packages: engines: {node: '>=12'} dev: false - /escodegen@2.0.0: - resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} hasBin: true dependencies: esprima: 4.0.1 estraverse: 5.3.0 esutils: 2.0.3 - optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 dev: true @@ -5632,6 +5662,12 @@ packages: web-streams-polyfill: 3.2.1 dev: true + /figlet@1.7.0: + resolution: {integrity: sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==} + engines: {node: '>= 0.4.0'} + hasBin: true + dev: false + /figue@1.2.0: resolution: {integrity: sha512-CXKr12kiNWjKtUK3X+YHeXKepn80s9Rg6pgZXoLQYEybgwaGJ9uGW4DrBrVK30ZWZf1mcvTbXF56AcovG7gLVw==} dependencies: @@ -6503,6 +6539,10 @@ packages: hasBin: true dev: true + /js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + dev: false + /js-beautify@1.14.6: resolution: {integrity: sha512-GfofQY5zDp+cuHc+gsEXKPpNw2KbPddreEo35O6jT6i0RVK6LhsoYBhq5TvK4/n74wnA0QbK8gGd+jUZwTMKJw==} engines: {node: '>=10'} @@ -6679,14 +6719,6 @@ packages: engines: {node: '>=6'} dev: true - /levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - dev: true - /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -6708,6 +6740,12 @@ packages: dependencies: uc.micro: 1.0.6 + /linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + dependencies: + uc.micro: 2.1.0 + dev: false + /local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} @@ -6845,6 +6883,18 @@ packages: mdurl: 1.0.1 uc.micro: 1.0.6 + /markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + dev: false + /marked@10.0.0: resolution: {integrity: sha512-YiGcYcWj50YrwBgNzFoYhQ1hT6GmQbFG8SksnYJX1z4BXTHSOrz1GB5/Jm2yQvMg4nN1FHP4M6r03R10KrVUiA==} engines: {node: '>= 18'} @@ -6893,6 +6943,10 @@ packages: /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + /mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + dev: false + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -7211,18 +7265,6 @@ packages: is-wsl: 2.2.0 dev: true - /optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 - dev: true - /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -7523,11 +7565,6 @@ packages: source-map-js: 1.0.2 dev: true - /prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - dev: true - /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -7735,6 +7772,11 @@ packages: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true + /punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + dev: false + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -7774,6 +7816,14 @@ packages: ret: 0.1.15 dev: false + /randexp@0.5.3: + resolution: {integrity: sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==} + engines: {node: '>=4'} + dependencies: + drange: 1.1.1 + ret: 0.2.2 + dev: false + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -7944,6 +7994,11 @@ packages: engines: {node: '>=0.12'} dev: false + /ret@0.2.2: + resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} + engines: {node: '>=4'} + dev: false + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -8024,8 +8079,6 @@ packages: /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} requiresBuild: true - dev: true - optional: true /saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} @@ -8207,6 +8260,7 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + dev: true /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} @@ -8582,13 +8636,6 @@ packages: typescript: 5.2.2 dev: true - /type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - dev: true - /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -8674,6 +8721,12 @@ packages: engines: {node: '>=14.17'} hasBin: true + /typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + dev: false + /ua-parser-js@1.0.35: resolution: {integrity: sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==} dev: false @@ -8681,6 +8734,10 @@ packages: /uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + /uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + dev: false + /ufo@1.1.2: resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} @@ -9262,15 +9319,14 @@ packages: - supports-color dev: true - /vue-i18n@9.2.2(vue@3.3.4): - resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==} - engines: {node: '>= 14'} + /vue-i18n@9.9.1(vue@3.3.4): + resolution: {integrity: sha512-xyQ4VspLdNSPTKBFBPWa1tvtj+9HuockZwgFeD2OhxxXuC2CWeNvV4seu2o9+vbQOyQbhAM5Ez56oxUrrnTWdw==} + engines: {node: '>= 16'} peerDependencies: vue: ^3.0.0 dependencies: - '@intlify/core-base': 9.2.2 - '@intlify/shared': 9.2.2 - '@intlify/vue-devtools': 9.2.2 + '@intlify/core-base': 9.9.1 + '@intlify/shared': 9.9.1 '@vue/devtools-api': 6.5.0 vue: 3.3.4 @@ -9283,6 +9339,10 @@ packages: vue: 3.3.4 dev: false + /vue-shadow-dom@4.2.0: + resolution: {integrity: sha512-lguI064rT2HT/dxqSmXtz860KOvCq+W3nU1jMqroTmX3K1H46q22BMR4emh/Ld3ozy35XJKOaNGcr6mkJ/t/yg==} + dev: false + /vue-template-compiler@2.7.14: resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} dependencies: @@ -9443,11 +9503,6 @@ packages: stackback: 0.0.2 dev: true - /word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - dev: true - /workbox-background-sync@7.0.0: resolution: {integrity: sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==} dependencies: @@ -9627,6 +9682,13 @@ packages: xml-parser-xo: 4.0.5 dev: false + /xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + dependencies: + sax: 1.2.4 + dev: false + /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} diff --git a/scripts/build-locales-files.mjs b/scripts/build-locales-files.mjs new file mode 100644 index 00000000..db1483de --- /dev/null +++ b/scripts/build-locales-files.mjs @@ -0,0 +1,61 @@ +import { existsSync, writeFileSync } from 'node:fs'; +import { Glob } from 'bun'; +import _ from 'lodash'; + +async function getPathsFromGlobs({ patterns, onlyFiles = true }) { + const filePaths = []; + + for (const pattern of patterns) { + const glob = new Glob(pattern); + + for await (const filePath of glob.scan({ onlyFiles, cwd: '.' })) { + filePaths.push(filePath); + } + } + + return { filePaths }; +} + +function getLocaleKey({ filePath }) { + const fileName = filePath.split('/').pop(); + return fileName.replace(/\.yml$/, ''); +} + +async function createMissingLocaleFile({ localeKey }) { + const fileName = `${localeKey}.yml`; + + const { filePaths: localesDirs } = await getPathsFromGlobs({ + patterns: [ + 'locales', + 'src/tools/*/locales', + ], + onlyFiles: false, + }); + + for (const localesDir of localesDirs) { + const filePath = `${localesDir}/${fileName}`; + + if (existsSync(filePath)) { + console.log(`Locale file already exists: ${filePath}`); + continue; + } + + console.log(`Creating missing locale file: ${filePath}`); + writeFileSync(filePath, '', 'utf8'); + } +} + +const { filePaths } = await getPathsFromGlobs({ + patterns: [ + 'locales/*.yml', + 'src/tools/*/locales/*.yml', + ], +}); + +await Promise.all( + _.chain(filePaths) + .map(filePath => getLocaleKey({ filePath })) + .uniq() + .map(localeKey => createMissingLocaleFile({ localeKey })) + .value(), +); diff --git a/src/components/FormatTransformer.vue b/src/components/FormatTransformer.vue index 677fc25a..bcfcdb58 100644 --- a/src/components/FormatTransformer.vue +++ b/src/components/FormatTransformer.vue @@ -48,7 +48,7 @@ const output = computed(() => transformer.value(input.value)); monospace /> -
+
{{ outputLabel }}
diff --git a/src/components/TextareaCopyable.vue b/src/components/TextareaCopyable.vue index 8b0aae61..9585177d 100644 --- a/src/components/TextareaCopyable.vue +++ b/src/components/TextareaCopyable.vue @@ -7,6 +7,7 @@ import sqlHljs from 'highlight.js/lib/languages/sql'; import xmlHljs from 'highlight.js/lib/languages/xml'; import yamlHljs from 'highlight.js/lib/languages/yaml'; import iniHljs from 'highlight.js/lib/languages/ini'; +import markdownHljs from 'highlight.js/lib/languages/markdown'; import { useCopy } from '@/composable/copy'; const props = withDefaults( @@ -30,6 +31,7 @@ hljs.registerLanguage('html', xmlHljs); hljs.registerLanguage('xml', xmlHljs); hljs.registerLanguage('yaml', yamlHljs); hljs.registerLanguage('toml', iniHljs); +hljs.registerLanguage('markdown', markdownHljs); const { value, language, followHeightOf, copyPlacement, copyMessage } = toRefs(props); const { height } = followHeightOf.value ? useElementSize(followHeightOf) : { height: ref(null) }; diff --git a/src/components/ToolCard.vue b/src/components/ToolCard.vue index 768e9ede..4ba4564c 100644 --- a/src/components/ToolCard.vue +++ b/src/components/ToolCard.vue @@ -1,78 +1,41 @@ - - diff --git a/src/composable/debouncedref.ts b/src/composable/debouncedref.ts new file mode 100644 index 00000000..09dd10e9 --- /dev/null +++ b/src/composable/debouncedref.ts @@ -0,0 +1,21 @@ +import _ from 'lodash'; + +function useDebouncedRef(initialValue: T, delay: number, immediate: boolean = false) { + const state = ref(initialValue); + const debouncedRef = customRef((track, trigger) => ({ + get() { + track(); + return state.value; + }, + set: _.debounce( + (value) => { + state.value = value; + trigger(); + }, + delay, + { leading: immediate }, + ), + })); + return debouncedRef; +} +export default useDebouncedRef; diff --git a/src/composable/downloadBase64.ts b/src/composable/downloadBase64.ts index 37b0428d..3bc20226 100644 --- a/src/composable/downloadBase64.ts +++ b/src/composable/downloadBase64.ts @@ -1,8 +1,13 @@ -import { extension as getExtensionFromMime } from 'mime-types'; +import { extension as getExtensionFromMimeType, extension as getMimeTypeFromExtension } from 'mime-types'; import type { Ref } from 'vue'; import _ from 'lodash'; -export { getMimeTypeFromBase64, useDownloadFileFromBase64 }; +export { + getMimeTypeFromBase64, + getMimeTypeFromExtension, getExtensionFromMimeType, + useDownloadFileFromBase64, useDownloadFileFromBase64Refs, + previewImageFromBase64, +}; const commonMimeTypesSignatures = { 'JVBERi0': 'application/pdf', @@ -36,30 +41,78 @@ function getFileExtensionFromMimeType({ defaultExtension?: string }) { if (mimeType) { - return getExtensionFromMime(mimeType) ?? defaultExtension; + return getExtensionFromMimeType(mimeType) ?? defaultExtension; } return defaultExtension; } -function useDownloadFileFromBase64({ source, filename }: { source: Ref; filename?: string }) { +function downloadFromBase64({ sourceValue, filename, extension, fileMimeType }: +{ sourceValue: string; filename?: string; extension?: string; fileMimeType?: string }) { + if (sourceValue === '') { + throw new Error('Base64 string is empty'); + } + + const defaultExtension = extension ?? 'txt'; + const { mimeType } = getMimeTypeFromBase64({ base64String: sourceValue }); + let base64String = sourceValue; + if (!mimeType) { + const targetMimeType = fileMimeType ?? getMimeTypeFromExtension(defaultExtension); + base64String = `data:${targetMimeType};base64,${sourceValue}`; + } + + const cleanExtension = extension ?? getFileExtensionFromMimeType( + { mimeType, defaultExtension }); + let cleanFileName = filename ?? `file.${cleanExtension}`; + if (extension && !cleanFileName.endsWith(`.${extension}`)) { + cleanFileName = `${cleanFileName}.${cleanExtension}`; + } + + const a = document.createElement('a'); + a.href = base64String; + a.download = cleanFileName; + a.click(); +} + +function useDownloadFileFromBase64( + { source, filename, extension, fileMimeType }: + { source: Ref; filename?: string; extension?: string; fileMimeType?: string }) { return { download() { - if (source.value === '') { - throw new Error('Base64 string is empty'); - } - - const { mimeType } = getMimeTypeFromBase64({ base64String: source.value }); - const base64String = mimeType - ? source.value - : `data:text/plain;base64,${source.value}`; - - const cleanFileName = filename ?? `file.${getFileExtensionFromMimeType({ mimeType })}`; - - const a = document.createElement('a'); - a.href = base64String; - a.download = cleanFileName; - a.click(); + downloadFromBase64({ sourceValue: source.value, filename, extension, fileMimeType }); }, }; } + +function useDownloadFileFromBase64Refs( + { source, filename, extension }: + { source: Ref; filename?: Ref; extension?: Ref }) { + return { + download() { + downloadFromBase64({ sourceValue: source.value, filename: filename?.value, extension: extension?.value }); + }, + }; +} + +function previewImageFromBase64(base64String: string): HTMLImageElement { + if (base64String === '') { + throw new Error('Base64 string is empty'); + } + + const img = document.createElement('img'); + img.src = base64String; + + const container = document.createElement('div'); + container.appendChild(img); + + const previewContainer = document.getElementById('previewContainer'); + if (previewContainer) { + previewContainer.innerHTML = ''; + previewContainer.appendChild(container); + } + else { + throw new Error('Preview container element not found'); + } + + return img; +} diff --git a/src/composable/queryParams.ts b/src/composable/queryParams.ts index 9699abbc..7cc8cc0d 100644 --- a/src/composable/queryParams.ts +++ b/src/composable/queryParams.ts @@ -1,7 +1,8 @@ import { useRouteQuery } from '@vueuse/router'; import { computed } from 'vue'; +import { useStorage } from '@vueuse/core'; -export { useQueryParam }; +export { useQueryParam, useQueryParamOrStorage }; const transformers = { number: { @@ -16,6 +17,12 @@ const transformers = { fromQuery: (value: string) => value.toLowerCase() === 'true', toQuery: (value: boolean) => (value ? 'true' : 'false'), }, + object: { + fromQuery: (value: string) => { + return JSON.parse(value); + }, + toQuery: (value: object) => JSON.stringify(value), + }, }; function useQueryParam({ name, defaultValue }: { name: string; defaultValue: T }) { @@ -33,3 +40,27 @@ function useQueryParam({ name, defaultValue }: { name: string; defaultValue: }, }); } + +function useQueryParamOrStorage({ name, storageName, defaultValue }: { name: string; storageName: string; defaultValue: T }) { + const type = typeof defaultValue; + const transformer = transformers[type as keyof typeof transformers] ?? transformers.string; + + const storageRef = useStorage(storageName, defaultValue); + const proxyDefaultValue = transformer.toQuery(defaultValue as never); + const proxy = useRouteQuery(name, proxyDefaultValue); + + const r = ref(defaultValue); + + watch(r, + (value) => { + proxy.value = transformer.toQuery(value as never); + storageRef.value = value as never; + }, + { deep: true }); + + r.value = (proxy.value && proxy.value !== proxyDefaultValue + ? transformer.fromQuery(proxy.value) as unknown as T + : storageRef.value as T) as never; + + return r; +} diff --git a/src/composable/validation.ts b/src/composable/validation.ts index 472ca4b2..33a6a7b2 100644 --- a/src/composable/validation.ts +++ b/src/composable/validation.ts @@ -3,9 +3,11 @@ import _ from 'lodash'; import { type Ref, reactive, watch } from 'vue'; type ValidatorReturnType = unknown; +type GetErrorMessageReturnType = string; export interface UseValidationRule { validator: (value: T) => ValidatorReturnType + getErrorMessage?: (value: T) => GetErrorMessageReturnType message: string } @@ -24,6 +26,15 @@ export function isFalsyOrHasThrown(cb: () => ValidatorReturnType): boolean { } } +export function getErrorMessageOrThrown(cb: () => GetErrorMessageReturnType): string { + try { + return cb() || ''; + } + catch (e: any) { + return e.toString(); + } +} + export interface ValidationAttrs { feedback: string validationStatus: string | undefined @@ -61,7 +72,13 @@ export function useValidation({ for (const rule of get(rules)) { if (isFalsyOrHasThrown(() => rule.validator(source.value))) { - state.message = rule.message; + if (rule.getErrorMessage) { + const getErrorMessage = rule.getErrorMessage; + state.message = rule.message.replace('{0}', getErrorMessageOrThrown(() => getErrorMessage(source.value))); + } + else { + state.message = rule.message; + } state.status = 'error'; } } diff --git a/src/layouts/base.layout.vue b/src/layouts/base.layout.vue index 62ac5113..ef534209 100644 --- a/src/layouts/base.layout.vue +++ b/src/layouts/base.layout.vue @@ -81,7 +81,7 @@ const tools = computed(() => [
© {{ new Date().getFullYear() }} - + Corentin Thomasset
diff --git a/src/main.ts b/src/main.ts index 36ba3b7f..19d28bf2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,6 +3,7 @@ import { createPinia } from 'pinia'; import { createHead } from '@vueuse/head'; import { registerSW } from 'virtual:pwa-register'; +import shadow from 'vue-shadow-dom'; import { plausible } from './plugins/plausible.plugin'; import 'virtual:uno.css'; @@ -23,5 +24,6 @@ app.use(i18nPlugin); app.use(router); app.use(naive); app.use(plausible); +app.use(shadow); app.mount('#app'); diff --git a/src/modules/i18n/components/locale-selector.vue b/src/modules/i18n/components/locale-selector.vue index 29dc0e5d..45732bf9 100644 --- a/src/modules/i18n/components/locale-selector.vue +++ b/src/modules/i18n/components/locale-selector.vue @@ -3,11 +3,14 @@ const { availableLocales, locale } = useI18n(); const localesLong: Record = { en: 'English', + de: 'Deutsch', es: 'Español', fr: 'Français', pt: 'PortuguĂȘs', ru: 'РуссĐșĐžĐč', + uk: 'ĐŁĐșŃ€Đ°Ń—ĐœŃŃŒĐșа', zh: 'äž­æ–‡', + vi: 'Tiáșżng Việt', }; const localeOptions = computed(() => diff --git a/src/pages/Home.page.vue b/src/pages/Home.page.vue index 859418ef..dfd12b60 100644 --- a/src/pages/Home.page.vue +++ b/src/pages/Home.page.vue @@ -13,76 +13,60 @@ const { t } = useI18n(); diff --git a/src/tools/regex-tester/index.ts b/src/tools/regex-tester/index.ts new file mode 100644 index 00000000..62a5e234 --- /dev/null +++ b/src/tools/regex-tester/index.ts @@ -0,0 +1,12 @@ +import { Language } from '@vicons/tabler'; +import { defineTool } from '../tool'; + +export const tool = defineTool({ + name: 'Regex Tester', + path: '/regex-tester', + description: 'Test your regular expressions with sample text.', + keywords: ['regex', 'tester', 'sample', 'expression'], + component: () => import('./regex-tester.vue'), + icon: Language, + createdAt: new Date('2024-09-20'), +}); diff --git a/src/tools/regex-tester/regex-tester.service.test.ts b/src/tools/regex-tester/regex-tester.service.test.ts new file mode 100644 index 00000000..bd4efbbc --- /dev/null +++ b/src/tools/regex-tester/regex-tester.service.test.ts @@ -0,0 +1,106 @@ +import { describe, expect, it } from 'vitest'; +import { matchRegex } from './regex-tester.service'; + +const regexesData = [ + { + regex: '', + text: '', + flags: '', + result: [], + }, + { + regex: '.*', + text: '', + flags: '', + result: [], + }, + { + regex: '', + text: 'aaa', + flags: '', + result: [], + }, + { + regex: 'a', + text: 'baaa', + flags: '', + result: [ + { + captures: [], + groups: [], + index: 1, + value: 'a', + }, + ], + }, + { + regex: '(.)(?r)', + text: 'azertyr', + flags: 'g', + result: [ + { + captures: [ + { + end: 3, + name: '1', + start: 2, + value: 'e', + }, + { + end: 4, + name: '2', + start: 3, + value: 'r', + }, + ], + groups: [ + { + end: 4, + name: 'g', + start: 3, + value: 'r', + }, + ], + index: 2, + value: 'er', + }, + { + captures: [ + { + end: 6, + name: '1', + start: 5, + value: 'y', + }, + { + end: 7, + name: '2', + start: 6, + value: 'r', + }, + ], + groups: [ + { + end: 7, + name: 'g', + start: 6, + value: 'r', + }, + ], + index: 5, + value: 'yr', + }, + ], + }, +]; + +describe('regex-tester', () => { + for (const reg of regexesData) { + const { regex, text, flags, result: expected_result } = reg; + it(`Should matchRegex("${regex}","${text}","${flags}") return correct result`, async () => { + const result = matchRegex(regex, text, `${flags}d`); + + expect(result).to.deep.equal(expected_result); + }); + } +}); diff --git a/src/tools/regex-tester/regex-tester.service.ts b/src/tools/regex-tester/regex-tester.service.ts new file mode 100644 index 00000000..ec8682c5 --- /dev/null +++ b/src/tools/regex-tester/regex-tester.service.ts @@ -0,0 +1,61 @@ +interface RegExpGroupIndices { + [name: string]: [number, number] +} +interface RegExpIndices extends Array<[number, number]> { + groups: RegExpGroupIndices +} +interface RegExpExecArrayWithIndices extends RegExpExecArray { + indices: RegExpIndices +} +interface GroupCapture { + name: string + value: string + start: number + end: number +}; + +export function matchRegex(regex: string, text: string, flags: string) { + // if (regex === '' || text === '') { + // return []; + // } + + let lastIndex = -1; + const re = new RegExp(regex, flags); + const results = []; + let match = re.exec(text) as RegExpExecArrayWithIndices; + while (match !== null) { + if (re.lastIndex === lastIndex || match[0] === '') { + break; + } + const indices = match.indices; + const captures: Array = []; + Object.entries(match).forEach(([captureName, captureValue]) => { + if (captureName !== '0' && captureName.match(/\d+/)) { + captures.push({ + name: captureName, + value: captureValue, + start: indices[Number(captureName)][0], + end: indices[Number(captureName)][1], + }); + } + }); + const groups: Array = []; + Object.entries(match.groups || {}).forEach(([groupName, groupValue]) => { + groups.push({ + name: groupName, + value: groupValue, + start: indices.groups[groupName][0], + end: indices.groups[groupName][1], + }); + }); + results.push({ + index: match.index, + value: match[0], + captures, + groups, + }); + lastIndex = re.lastIndex; + match = re.exec(text) as RegExpExecArrayWithIndices; + } + return results; +} diff --git a/src/tools/regex-tester/regex-tester.vue b/src/tools/regex-tester/regex-tester.vue new file mode 100644 index 00000000..a1fa7958 --- /dev/null +++ b/src/tools/regex-tester/regex-tester.vue @@ -0,0 +1,193 @@ + + + diff --git a/src/tools/roman-numeral-converter/index.ts b/src/tools/roman-numeral-converter/index.ts index f2dbdc0a..6929747f 100644 --- a/src/tools/roman-numeral-converter/index.ts +++ b/src/tools/roman-numeral-converter/index.ts @@ -1,10 +1,11 @@ import { LetterX } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'Roman numeral converter', + name: translate('tools.roman-numeral-converter.title'), path: '/roman-numeral-converter', - description: 'Convert Roman numerals to numbers and convert numbers to Roman numerals.', + description: translate('tools.roman-numeral-converter.description'), keywords: ['roman', 'arabic', 'converter', 'X', 'I', 'V', 'L', 'C', 'D', 'M'], component: () => import('./roman-numeral-converter.vue'), icon: LetterX, diff --git a/src/tools/rsa-key-pair-generator/index.ts b/src/tools/rsa-key-pair-generator/index.ts index c8ab4cdb..3d034e5b 100644 --- a/src/tools/rsa-key-pair-generator/index.ts +++ b/src/tools/rsa-key-pair-generator/index.ts @@ -1,10 +1,11 @@ import { Certificate } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'RSA key pair generator', + name: translate('tools.rsa-key-pair-generator.title'), path: '/rsa-key-pair-generator', - description: 'Generate new random RSA private and public key pem certificates.', + description: translate('tools.rsa-key-pair-generator.description'), keywords: ['rsa', 'key', 'pair', 'generator', 'public', 'private', 'secret', 'ssh', 'pem'], component: () => import('./rsa-key-pair-generator.vue'), icon: Certificate, diff --git a/src/tools/safelink-decoder/index.ts b/src/tools/safelink-decoder/index.ts new file mode 100644 index 00000000..ef865108 --- /dev/null +++ b/src/tools/safelink-decoder/index.ts @@ -0,0 +1,12 @@ +import { Mailbox } from '@vicons/tabler'; +import { defineTool } from '../tool'; + +export const tool = defineTool({ + name: 'Outlook Safelink decoder', + path: '/safelink-decoder', + description: 'Decode Outlook SafeLink links', + keywords: ['outlook', 'safelink', 'decoder'], + component: () => import('./safelink-decoder.vue'), + icon: Mailbox, + createdAt: new Date('2024-03-11'), +}); diff --git a/src/tools/safelink-decoder/safelink-decoder.service.test.ts b/src/tools/safelink-decoder/safelink-decoder.service.test.ts new file mode 100644 index 00000000..b601f01e --- /dev/null +++ b/src/tools/safelink-decoder/safelink-decoder.service.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, it } from 'vitest'; +import { decodeSafeLinksURL } from './safelink-decoder.service'; + +describe('safelink-decoder', () => { + describe('decodeSafeLinksURL', () => { + describe('decode outlook safelink urls', () => { + it('should decode basic safelink urls', () => { + expect(decodeSafeLinksURL('https://aus01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3Dsafelink%26rlz%3D1&data=05%7C02%7C%7C1ed07253975b46da1d1508dc3443752a%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C638442711583216725%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata=%2BQY0HBnnxfI7pzZoxzlhZdDvYu80LwQB0zUUjrffVnk%3D&reserved=0')) + .toBe('https://www.google.com/search?q=safelink&rlz=1'); + }); + it('should decode encoded safelink urls', () => { + expect(decodeSafeLinksURL('https://aus01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3Dsafelink%26rlz%3D1&data=05%7C02%7C%7C1ed07253975b46da1d1508dc3443752a%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C638442711583216725%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata=%2BQY0HBnnxfI7pzZoxzlhZdDvYu80LwQB0zUUjrffVnk%3D&reserved=0')) + .toBe('https://www.google.com/search?q=safelink&rlz=1'); + }); + it('throw on not outlook safelink urls', () => { + expect(() => decodeSafeLinksURL('https://google.com')) + .toThrow('Invalid SafeLinks URL provided'); + }); + }); + }); +}); diff --git a/src/tools/safelink-decoder/safelink-decoder.service.ts b/src/tools/safelink-decoder/safelink-decoder.service.ts new file mode 100644 index 00000000..96be00ab --- /dev/null +++ b/src/tools/safelink-decoder/safelink-decoder.service.ts @@ -0,0 +1,7 @@ +export function decodeSafeLinksURL(safeLinksUrl: string) { + if (!safeLinksUrl.match(/\.safelinks\.protection\.outlook\.com/)) { + throw new Error('Invalid SafeLinks URL provided'); + } + + return new URL(safeLinksUrl).searchParams.get('url'); +} diff --git a/src/tools/safelink-decoder/safelink-decoder.vue b/src/tools/safelink-decoder/safelink-decoder.vue new file mode 100644 index 00000000..01337eb2 --- /dev/null +++ b/src/tools/safelink-decoder/safelink-decoder.vue @@ -0,0 +1,32 @@ + + + diff --git a/src/tools/slugify-string/index.ts b/src/tools/slugify-string/index.ts index 8dabcdb1..1f1bfcf3 100644 --- a/src/tools/slugify-string/index.ts +++ b/src/tools/slugify-string/index.ts @@ -1,10 +1,11 @@ import { AbcRound } from '@vicons/material'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'Slugify string', + name: translate('tools.slugify-string.title'), path: '/slugify-string', - description: 'Make a string url, filename and id safe.', + description: translate('tools.slugify-string.description'), keywords: ['slugify', 'string', 'escape', 'emoji', 'special', 'character', 'space', 'trim'], component: () => import('./slugify-string.vue'), icon: AbcRound, diff --git a/src/tools/sql-prettify/index.ts b/src/tools/sql-prettify/index.ts index 426845fb..96bff0fe 100644 --- a/src/tools/sql-prettify/index.ts +++ b/src/tools/sql-prettify/index.ts @@ -1,10 +1,11 @@ import { Database } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'SQL prettify and format', + name: translate('tools.sql-prettify.title'), path: '/sql-prettify', - description: 'Format and prettify your SQL queries online (it supports various SQL dialects).', + description: translate('tools.sql-prettify.description'), keywords: [ 'sql', 'prettify', diff --git a/src/tools/string-obfuscator/index.ts b/src/tools/string-obfuscator/index.ts index d5b45318..67f1995c 100644 --- a/src/tools/string-obfuscator/index.ts +++ b/src/tools/string-obfuscator/index.ts @@ -1,10 +1,11 @@ import { EyeOff } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'String obfuscator', + name: translate('tools.string-obfuscator.title'), path: '/string-obfuscator', - description: 'Obfuscate a string (like a secret, an IBAN, or a token) to make it shareable and identifiable without revealing its content.', + description: translate('tools.string-obfuscator.description'), keywords: ['string', 'obfuscator', 'secret', 'token', 'hide', 'obscure', 'mask', 'masking'], component: () => import('./string-obfuscator.vue'), icon: EyeOff, diff --git a/src/tools/svg-placeholder-generator/index.ts b/src/tools/svg-placeholder-generator/index.ts index d676294c..37a709eb 100644 --- a/src/tools/svg-placeholder-generator/index.ts +++ b/src/tools/svg-placeholder-generator/index.ts @@ -1,10 +1,11 @@ import { ImageOutlined } from '@vicons/material'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'SVG placeholder generator', + name: translate('tools.svg-placeholder-generator.title'), path: '/svg-placeholder-generator', - description: 'Generate svg images to use as placeholder in your applications.', + description: translate('tools.svg-placeholder-generator.description'), keywords: ['svg', 'placeholder', 'generator', 'image', 'size', 'mockup'], component: () => import('./svg-placeholder-generator.vue'), icon: ImageOutlined, diff --git a/src/tools/temperature-converter/index.ts b/src/tools/temperature-converter/index.ts index 60192b41..3f526ee2 100644 --- a/src/tools/temperature-converter/index.ts +++ b/src/tools/temperature-converter/index.ts @@ -1,11 +1,11 @@ import { Temperature } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'Temperature converter', + name: translate('tools.temperature-converter.title'), path: '/temperature-converter', - description: - 'Temperature degrees conversions for Kelvin, Celsius, Fahrenheit, Rankine, Delisle, Newton, RĂ©aumur and RĂžmer.', + description: translate('tools.temperature-converter.description'), keywords: [ 'temperature', 'converter', diff --git a/src/tools/text-diff/index.ts b/src/tools/text-diff/index.ts index 992acbae..de124ee6 100644 --- a/src/tools/text-diff/index.ts +++ b/src/tools/text-diff/index.ts @@ -1,10 +1,11 @@ import { FileDiff } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'Text diff', + name: translate('tools.text-diff.title'), path: '/text-diff', - description: 'Compare two texts and see the differences between them.', + description: translate('tools.text-diff.description'), keywords: ['text', 'diff', 'compare', 'string', 'text diff', 'code'], component: () => import('./text-diff.vue'), icon: FileDiff, diff --git a/src/tools/text-statistics/index.ts b/src/tools/text-statistics/index.ts index 0e54b71b..23937839 100644 --- a/src/tools/text-statistics/index.ts +++ b/src/tools/text-statistics/index.ts @@ -1,10 +1,11 @@ import { FileText } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'Text statistics', + name: translate('tools.text-statistics.title'), path: '/text-statistics', - description: 'Get information about a text, the amount of characters, the amount of words, it\'s size, ...', + description: translate('tools.text-statistics.description'), keywords: ['text', 'statistics', 'length', 'characters', 'count', 'size', 'bytes'], component: () => import('./text-statistics.vue'), icon: FileText, diff --git a/src/tools/text-to-binary/index.ts b/src/tools/text-to-binary/index.ts index 40ac93d6..ce0f87ea 100644 --- a/src/tools/text-to-binary/index.ts +++ b/src/tools/text-to-binary/index.ts @@ -1,10 +1,11 @@ import { Binary } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'Text to ASCII binary', + name: translate('tools.text-to-binary.title'), path: '/text-to-binary', - description: 'Convert text to its ASCII binary representation and vice versa.', + description: translate('tools.text-to-binary.description'), keywords: ['text', 'to', 'binary', 'converter', 'encode', 'decode', 'ascii'], component: () => import('./text-to-binary.vue'), icon: Binary, diff --git a/src/tools/text-to-nato-alphabet/index.ts b/src/tools/text-to-nato-alphabet/index.ts index 100476a0..43b72fb4 100644 --- a/src/tools/text-to-nato-alphabet/index.ts +++ b/src/tools/text-to-nato-alphabet/index.ts @@ -1,10 +1,11 @@ import { Speakerphone } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'Text to NATO alphabet', + name: translate('tools.text-to-nato-alphabet.title'), path: '/text-to-nato-alphabet', - description: 'Transform text into NATO phonetic alphabet for oral transmission.', + description: translate('tools.text-to-nato-alphabet.description'), keywords: ['string', 'nato', 'alphabet', 'phonetic', 'oral', 'transmission'], component: () => import('./text-to-nato-alphabet.vue'), icon: Speakerphone, diff --git a/src/tools/text-to-unicode/index.ts b/src/tools/text-to-unicode/index.ts new file mode 100644 index 00000000..80396026 --- /dev/null +++ b/src/tools/text-to-unicode/index.ts @@ -0,0 +1,13 @@ +import { TextWrap } from '@vicons/tabler'; +import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; + +export const tool = defineTool({ + name: translate('tools.text-to-unicode.title'), + path: '/text-to-unicode', + description: translate('tools.text-to-unicode.description'), + keywords: ['text', 'to', 'unicode'], + component: () => import('./text-to-unicode.vue'), + icon: TextWrap, + createdAt: new Date('2024-01-31'), +}); diff --git a/src/tools/text-to-unicode/text-to-unicode.e2e.spec.ts b/src/tools/text-to-unicode/text-to-unicode.e2e.spec.ts new file mode 100644 index 00000000..761828fd --- /dev/null +++ b/src/tools/text-to-unicode/text-to-unicode.e2e.spec.ts @@ -0,0 +1,25 @@ +import { expect, test } from '@playwright/test'; + +test.describe('Tool - Text to Unicode', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/text-to-unicode'); + }); + + test('Has correct title', async ({ page }) => { + await expect(page).toHaveTitle('Text to Unicode - IT Tools'); + }); + + test('Text to unicode conversion', async ({ page }) => { + await page.getByTestId('text-to-unicode-input').fill('it-tools'); + const unicode = await page.getByTestId('text-to-unicode-output').inputValue(); + + expect(unicode).toEqual('it-tools'); + }); + + test('Unicode to text conversion', async ({ page }) => { + await page.getByTestId('unicode-to-text-input').fill('it-tools'); + const text = await page.getByTestId('unicode-to-text-output').inputValue(); + + expect(text).toEqual('it-tools'); + }); +}); diff --git a/src/tools/text-to-unicode/text-to-unicode.service.test.ts b/src/tools/text-to-unicode/text-to-unicode.service.test.ts new file mode 100644 index 00000000..bda4fa7a --- /dev/null +++ b/src/tools/text-to-unicode/text-to-unicode.service.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, it } from 'vitest'; +import { convertTextToUnicode, convertUnicodeToText } from './text-to-unicode.service'; + +describe('text-to-unicode', () => { + describe('convertTextToUnicode', () => { + it('a text string is converted to unicode representation', () => { + expect(convertTextToUnicode('A')).toBe('A'); + expect(convertTextToUnicode('linke the string convert to unicode')).toBe('linke the string convert to unicode'); + expect(convertTextToUnicode('')).toBe(''); + }); + }); + + describe('convertUnicodeToText', () => { + it('an unicode string is converted to its text representation', () => { + expect(convertUnicodeToText('A')).toBe('A'); + expect(convertUnicodeToText('linke the string convert to unicode')).toBe('linke the string convert to unicode'); + expect(convertUnicodeToText('')).toBe(''); + }); + }); +}); diff --git a/src/tools/text-to-unicode/text-to-unicode.service.ts b/src/tools/text-to-unicode/text-to-unicode.service.ts new file mode 100644 index 00000000..e7772cf8 --- /dev/null +++ b/src/tools/text-to-unicode/text-to-unicode.service.ts @@ -0,0 +1,9 @@ +function convertTextToUnicode(text: string): string { + return text.split('').map(value => `&#${value.charCodeAt(0)};`).join(''); +} + +function convertUnicodeToText(unicodeStr: string): string { + return unicodeStr.replace(/&#(\d+);/g, (match, dec) => String.fromCharCode(dec)); +} + +export { convertTextToUnicode, convertUnicodeToText }; diff --git a/src/tools/text-to-unicode/text-to-unicode.vue b/src/tools/text-to-unicode/text-to-unicode.vue new file mode 100644 index 00000000..be9bed86 --- /dev/null +++ b/src/tools/text-to-unicode/text-to-unicode.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/tools/token-generator/locales/en.yml b/src/tools/token-generator/locales/en.yml deleted file mode 100644 index 7a06f3dd..00000000 --- a/src/tools/token-generator/locales/en.yml +++ /dev/null @@ -1,15 +0,0 @@ -tools: - token-generator: - title: Token generator - description: Generate random string with the chars you want, uppercase or lowercase letters, numbers and/or symbols. - - uppercase: Uppercase (ABC...) - lowercase: Lowercase (abc...) - numbers: Numbers (123...) - symbols: Symbols (!-;...) - length: Length - tokenPlaceholder: 'The token...' - copied: Token copied to the clipboard - button: - copy: Copy - refresh: Refresh \ No newline at end of file diff --git a/src/tools/token-generator/locales/fr.yml b/src/tools/token-generator/locales/fr.yml deleted file mode 100644 index e9605567..00000000 --- a/src/tools/token-generator/locales/fr.yml +++ /dev/null @@ -1,16 +0,0 @@ -tools: - token-generator: - title: GĂ©nĂ©rateur de token - description: >- - GĂ©nĂšre une chaĂźne alĂ©atoire avec les caractĂšres que vous voulez, lettres - majuscules ou minuscules, chiffres et/ou symboles. - uppercase: Majuscules (ABC...) - lowercase: Minuscules (abc...) - numbers: Chiffres (123...) - symbols: Symboles (!-;...) - button: - copy: Copier - refresh: Rafraichir - copied: Le token a Ă©tĂ© copiĂ© - length: Longueur - tokenPlaceholder: Le token... diff --git a/src/tools/token-generator/token-generator.service.ts b/src/tools/token-generator/token-generator.service.ts index 3733a884..f928a415 100644 --- a/src/tools/token-generator/token-generator.service.ts +++ b/src/tools/token-generator/token-generator.service.ts @@ -20,7 +20,7 @@ export function createToken({ withLowercase ? 'abcdefghijklmopqrstuvwxyz' : '', withNumbers ? '0123456789' : '', withSymbols ? '.,;:!?./-"\'#{([-|\\@)]=}*+' : '', - ].join(''); ; + ].join(''); return shuffleString(allAlphabet.repeat(length)).substring(0, length); } diff --git a/src/tools/toml-to-json/index.ts b/src/tools/toml-to-json/index.ts index 653b432f..77a1b26e 100644 --- a/src/tools/toml-to-json/index.ts +++ b/src/tools/toml-to-json/index.ts @@ -1,11 +1,12 @@ import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; import BracketIcon from '~icons/mdi/code-brackets'; export const tool = defineTool({ - name: 'TOML to JSON', + name: translate('tools.toml-to-json.title'), path: '/toml-to-json', - description: 'Parse and convert TOML to JSON.', + description: translate('tools.toml-to-json.description'), keywords: ['toml', 'json', 'convert', 'online', 'transform', 'parser'], component: () => import('./toml-to-json.vue'), icon: BracketIcon, diff --git a/src/tools/toml-to-yaml/index.ts b/src/tools/toml-to-yaml/index.ts index 69f9459c..2ee0958b 100644 --- a/src/tools/toml-to-yaml/index.ts +++ b/src/tools/toml-to-yaml/index.ts @@ -1,10 +1,11 @@ import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; import BracketIcon from '~icons/mdi/code-brackets'; export const tool = defineTool({ - name: 'TOML to YAML', + name: translate('tools.toml-to-yaml.title'), path: '/toml-to-yaml', - description: 'Parse and convert TOML to YAML.', + description: translate('tools.toml-to-yaml.description'), keywords: ['toml', 'yaml', 'convert', 'online', 'transform', 'parse'], component: () => import('./toml-to-yaml.vue'), icon: BracketIcon, diff --git a/src/tools/ulid-generator/index.ts b/src/tools/ulid-generator/index.ts index 6a5408dd..c12679a7 100644 --- a/src/tools/ulid-generator/index.ts +++ b/src/tools/ulid-generator/index.ts @@ -1,10 +1,11 @@ import { SortDescendingNumbers } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'ULID generator', + name: translate('tools.ulid-generator.title'), path: '/ulid-generator', - description: 'Generate random Universally Unique Lexicographically Sortable Identifier (ULID).', + description: translate('tools.ulid-generator.description'), keywords: ['ulid', 'generator', 'random', 'id', 'alphanumeric', 'identity', 'token', 'string', 'identifier', 'unique'], component: () => import('./ulid-generator.vue'), icon: SortDescendingNumbers, diff --git a/src/tools/url-encoder/index.ts b/src/tools/url-encoder/index.ts index bd19b890..ab85118c 100644 --- a/src/tools/url-encoder/index.ts +++ b/src/tools/url-encoder/index.ts @@ -1,10 +1,11 @@ import { Link } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'Encode/decode url formatted strings', + name: translate('tools.url-encoder.title'), path: '/url-encoder', - description: 'Encode to url-encoded format (also known as "percent-encoded") or decode from it.', + description: translate('tools.url-encoder.description'), keywords: ['url', 'encode', 'decode', 'percent', '%20', 'format'], component: () => import('./url-encoder.vue'), icon: Link, diff --git a/src/tools/url-encoder/url-encoder.vue b/src/tools/url-encoder/url-encoder.vue index c43f8193..19025190 100644 --- a/src/tools/url-encoder/url-encoder.vue +++ b/src/tools/url-encoder/url-encoder.vue @@ -23,7 +23,7 @@ const decodeInput = ref('Hello%20world%20%3A)'); const decodeOutput = computed(() => withDefaultOnError(() => decodeURIComponent(decodeInput.value), '')); const decodeValidation = useValidation({ - source: encodeInput, + source: decodeInput, rules: [ { validator: value => isNotThrowing(() => decodeURIComponent(value)), diff --git a/src/tools/url-parser/index.ts b/src/tools/url-parser/index.ts index d1c8dfe8..77976a24 100644 --- a/src/tools/url-parser/index.ts +++ b/src/tools/url-parser/index.ts @@ -1,11 +1,11 @@ import { Unlink } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'Url parser', + name: translate('tools.url-parser.title'), path: '/url-parser', - description: - 'Parse an url string to get all the different parts (protocol, origin, params, port, username-password, ...)', + description: translate('tools.url-parser.description'), keywords: ['url', 'parser', 'protocol', 'origin', 'params', 'port', 'username', 'password', 'href'], component: () => import('./url-parser.vue'), icon: Unlink, diff --git a/src/tools/user-agent-parser/index.ts b/src/tools/user-agent-parser/index.ts index 1ae05d14..4d026145 100644 --- a/src/tools/user-agent-parser/index.ts +++ b/src/tools/user-agent-parser/index.ts @@ -1,10 +1,11 @@ import { Browser } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'User-agent parser', + name: translate('tools.user-agent-parser.title'), path: '/user-agent-parser', - description: 'Detect and parse Browser, Engine, OS, CPU, and Device type/model from an user-agent string.', + description: translate('tools.user-agent-parser.description'), keywords: ['user', 'agent', 'parser', 'browser', 'engine', 'os', 'cpu', 'device', 'user-agent', 'client'], component: () => import('./user-agent-parser.vue'), icon: Browser, diff --git a/src/tools/uuid-generator/index.ts b/src/tools/uuid-generator/index.ts index 9289b902..54ec479f 100644 --- a/src/tools/uuid-generator/index.ts +++ b/src/tools/uuid-generator/index.ts @@ -1,11 +1,11 @@ import { Fingerprint } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'UUIDs generator', + name: translate('tools.uuid-generator.title'), path: '/uuid-generator', - description: - 'A Universally Unique Identifier (UUID) is a 128-bit number used to identify information in computer systems. The number of possible UUIDs is 16^32, which is 2^128 or about 3.4x10^38 (which is a lot!).', + description: translate('tools.uuid-generator.description'), keywords: ['uuid', 'v4', 'random', 'id', 'alphanumeric', 'identity', 'token', 'string', 'identifier', 'unique', 'v1', 'v3', 'v5', 'nil'], component: () => import('./uuid-generator.vue'), icon: Fingerprint, diff --git a/src/tools/wifi-qr-code-generator/index.ts b/src/tools/wifi-qr-code-generator/index.ts index ad0135c3..b59b95df 100644 --- a/src/tools/wifi-qr-code-generator/index.ts +++ b/src/tools/wifi-qr-code-generator/index.ts @@ -1,11 +1,11 @@ import { Qrcode } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'WiFi QR Code generator', + name: translate('tools.wifi-qrcode-generator.title'), path: '/wifi-qrcode-generator', - description: - 'Generate and download QR-codes for quick connections to WiFi networks.', + description: translate('tools.wifi-qrcode-generator.description'), keywords: ['qr', 'code', 'generator', 'square', 'color', 'link', 'low', 'medium', 'quartile', 'high', 'transparent', 'wifi'], component: () => import('./wifi-qr-code-generator.vue'), icon: Qrcode, diff --git a/src/tools/xml-formatter/index.ts b/src/tools/xml-formatter/index.ts index fe28d3ae..7aa096da 100644 --- a/src/tools/xml-formatter/index.ts +++ b/src/tools/xml-formatter/index.ts @@ -1,10 +1,11 @@ import { Code } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'XML formatter', + name: translate('tools.xml-formatter.title'), path: '/xml-formatter', - description: 'Prettify your XML string to a human friendly readable format.', + description: translate('tools.xml-formatter.description'), keywords: ['xml', 'prettify', 'format'], component: () => import('./xml-formatter.vue'), icon: Code, diff --git a/src/tools/xml-to-json/index.ts b/src/tools/xml-to-json/index.ts new file mode 100644 index 00000000..8d83f4fe --- /dev/null +++ b/src/tools/xml-to-json/index.ts @@ -0,0 +1,12 @@ +import { Braces } from '@vicons/tabler'; +import { defineTool } from '../tool'; + +export const tool = defineTool({ + name: 'XML to JSON', + path: '/xml-to-json', + description: 'Convert XML to JSON', + keywords: ['xml', 'json'], + component: () => import('./xml-to-json.vue'), + icon: Braces, + createdAt: new Date('2024-08-09'), +}); diff --git a/src/tools/xml-to-json/xml-to-json.vue b/src/tools/xml-to-json/xml-to-json.vue new file mode 100644 index 00000000..e1e5a477 --- /dev/null +++ b/src/tools/xml-to-json/xml-to-json.vue @@ -0,0 +1,32 @@ + + + diff --git a/src/tools/yaml-to-json-converter/index.ts b/src/tools/yaml-to-json-converter/index.ts index 724ecdb7..60110f09 100644 --- a/src/tools/yaml-to-json-converter/index.ts +++ b/src/tools/yaml-to-json-converter/index.ts @@ -1,10 +1,11 @@ import { AlignJustified } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'YAML to JSON converter', + name: translate('tools.yaml-to-json-converter.title'), path: '/yaml-to-json-converter', - description: 'Simply convert YAML to JSON with this live online converter.', + description: translate('tools.yaml-to-json-converter.description'), keywords: ['yaml', 'to', 'json'], component: () => import('./yaml-to-json.vue'), icon: AlignJustified, diff --git a/src/tools/yaml-to-toml/index.ts b/src/tools/yaml-to-toml/index.ts index b6a7077f..d788887e 100644 --- a/src/tools/yaml-to-toml/index.ts +++ b/src/tools/yaml-to-toml/index.ts @@ -1,10 +1,11 @@ import { AlignJustified } from '@vicons/tabler'; import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; export const tool = defineTool({ - name: 'YAML to TOML', + name: translate('tools.yaml-to-toml.title'), path: '/yaml-to-toml', - description: 'Parse and convert YAML to TOML.', + description: translate('tools.yaml-to-toml.description'), keywords: ['yaml', 'to', 'toml', 'convert', 'transform'], component: () => import('./yaml-to-toml.vue'), icon: AlignJustified, diff --git a/src/tools/yaml-viewer/index.ts b/src/tools/yaml-viewer/index.ts new file mode 100644 index 00000000..f3043270 --- /dev/null +++ b/src/tools/yaml-viewer/index.ts @@ -0,0 +1,13 @@ +import { AlignJustified } from '@vicons/tabler'; +import { defineTool } from '../tool'; +import { translate } from '@/plugins/i18n.plugin'; + +export const tool = defineTool({ + name: translate('tools.yaml-prettify.title'), + path: '/yaml-prettify', + description: translate('tools.yaml-prettify.description'), + keywords: ['yaml', 'viewer', 'prettify', 'format'], + component: () => import('./yaml-viewer.vue'), + icon: AlignJustified, + createdAt: new Date('2024-01-31'), +}); diff --git a/src/tools/yaml-viewer/yaml-models.ts b/src/tools/yaml-viewer/yaml-models.ts new file mode 100644 index 00000000..54569db8 --- /dev/null +++ b/src/tools/yaml-viewer/yaml-models.ts @@ -0,0 +1,24 @@ +import { type MaybeRef, get } from '@vueuse/core'; + +import yaml from 'yaml'; + +export { formatYaml }; + +function formatYaml({ + rawYaml, + sortKeys = false, + indentSize = 2, +}: { + rawYaml: MaybeRef + sortKeys?: MaybeRef + indentSize?: MaybeRef +}) { + const parsedYaml = yaml.parse(get(rawYaml)); + + const formattedYAML = yaml.stringify(parsedYaml, { + sortMapEntries: get(sortKeys), + indent: get(indentSize), + }); + + return formattedYAML; +} diff --git a/src/tools/yaml-viewer/yaml-viewer.vue b/src/tools/yaml-viewer/yaml-viewer.vue new file mode 100644 index 00000000..3385eee2 --- /dev/null +++ b/src/tools/yaml-viewer/yaml-viewer.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/utils/base64.test.ts b/src/utils/base64.test.ts index 994f1b1b..51d15239 100644 --- a/src/utils/base64.test.ts +++ b/src/utils/base64.test.ts @@ -38,7 +38,8 @@ describe('base64 utils', () => { it('should throw for incorrect base64 string', () => { expect(() => base64ToText('a')).to.throw('Incorrect base64 string'); - expect(() => base64ToText(' ')).to.throw('Incorrect base64 string'); + // should not really be false because trimming of space is now implied + // expect(() => base64ToText(' ')).to.throw('Incorrect base64 string'); expect(() => base64ToText('Ă©')).to.throw('Incorrect base64 string'); // missing final '=' expect(() => base64ToText('bG9yZW0gaXBzdW0')).to.throw('Incorrect base64 string'); @@ -56,17 +57,17 @@ describe('base64 utils', () => { it('should return false for incorrect base64 string', () => { expect(isValidBase64('a')).to.eql(false); - expect(isValidBase64(' ')).to.eql(false); expect(isValidBase64('Ă©')).to.eql(false); expect(isValidBase64('data:text/plain;notbase64,YQ==')).to.eql(false); // missing final '=' expect(isValidBase64('bG9yZW0gaXBzdW0')).to.eql(false); }); - it('should return false for untrimmed correct base64 string', () => { - expect(isValidBase64('bG9yZW0gaXBzdW0= ')).to.eql(false); - expect(isValidBase64(' LTE=')).to.eql(false); - expect(isValidBase64(' YQ== ')).to.eql(false); + it('should return true for untrimmed correct base64 string', () => { + expect(isValidBase64('bG9yZW0gaXBzdW0= ')).to.eql(true); + expect(isValidBase64(' LTE=')).to.eql(true); + expect(isValidBase64(' YQ== ')).to.eql(true); + expect(isValidBase64(' ')).to.eql(true); }); }); diff --git a/src/utils/base64.ts b/src/utils/base64.ts index 16912ee3..44e59f41 100644 --- a/src/utils/base64.ts +++ b/src/utils/base64.ts @@ -1,7 +1,9 @@ +import { Base64 } from 'js-base64'; + export { textToBase64, base64ToText, isValidBase64, removePotentialDataAndMimePrefix }; function textToBase64(str: string, { makeUrlSafe = false }: { makeUrlSafe?: boolean } = {}) { - const encoded = window.btoa(str); + const encoded = Base64.encode(str); return makeUrlSafe ? makeUriSafe(encoded) : encoded; } @@ -16,7 +18,7 @@ function base64ToText(str: string, { makeUrlSafe = false }: { makeUrlSafe?: bool } try { - return window.atob(cleanStr); + return Base64.decode(cleanStr); } catch (_) { throw new Error('Incorrect base64 string'); @@ -34,10 +36,11 @@ function isValidBase64(str: string, { makeUrlSafe = false }: { makeUrlSafe?: boo } try { + const reEncodedBase64 = Base64.fromUint8Array(Base64.toUint8Array(cleanStr)); if (makeUrlSafe) { - return removePotentialPadding(window.btoa(window.atob(cleanStr))) === cleanStr; + return removePotentialPadding(reEncodedBase64) === cleanStr; } - return window.btoa(window.atob(cleanStr)) === cleanStr; + return reEncodedBase64 === cleanStr.replace(/\s/g, ''); } catch (err) { return false; diff --git a/vite.config.ts b/vite.config.ts index 00f90c33..42a2cb29 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,20 +1,20 @@ -import { URL, fileURLToPath } from 'node:url'; import { resolve } from 'node:path'; +import { URL, fileURLToPath } from 'node:url'; -import { defineConfig } from 'vite'; +import VueI18n from '@intlify/unplugin-vue-i18n/vite'; import vue from '@vitejs/plugin-vue'; import vueJsx from '@vitejs/plugin-vue-jsx'; +import Unocss from 'unocss/vite'; +import AutoImport from 'unplugin-auto-import/vite'; +import IconsResolver from 'unplugin-icons/resolver'; +import Icons from 'unplugin-icons/vite'; +import { NaiveUiResolver } from 'unplugin-vue-components/resolvers'; +import Components from 'unplugin-vue-components/vite'; +import { defineConfig } from 'vite'; +import { VitePWA } from 'vite-plugin-pwa'; import markdown from 'vite-plugin-vue-markdown'; import svgLoader from 'vite-svg-loader'; -import { VitePWA } from 'vite-plugin-pwa'; -import AutoImport from 'unplugin-auto-import/vite'; -import Components from 'unplugin-vue-components/vite'; -import { NaiveUiResolver } from 'unplugin-vue-components/resolvers'; -import Unocss from 'unocss/vite'; import { configDefaults } from 'vitest/config'; -import Icons from 'unplugin-icons/vite'; -import IconsResolver from 'unplugin-icons/resolver'; -import VueI18n from '@intlify/unplugin-vue-i18n/vite'; const baseUrl = process.env.BASE_URL ?? '/'; @@ -23,9 +23,13 @@ export default defineConfig({ plugins: [ VueI18n({ runtimeOnly: true, + jitCompilation: true, compositionOnly: true, fullInstall: true, - include: [resolve(__dirname, 'locales/**')], + strictMessage: false, + include: [ + resolve(__dirname, 'locales/**'), + ], }), AutoImport({ imports: [