diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index bb33abf648..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,8 +0,0 @@ -# ESLint ignores node_modules, dotfolders and dotfiles by default -dist -dist-browser -release - -**/*.log -**/*.xml -**/*.html diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index e6e0831198..0000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "extends": ["plugin:react/recommended", "@appium/eslint-config-appium"], - "parser": "@babel/eslint-parser", - "plugins": ["import", "react", "react-native", "@babel"], - "env": { - "browser": true, - "mocha": true, - "node": true - }, - "settings": { - "react": { - "version": "detect" - } - }, - "rules": { - "@babel/arrow-parens": 0, - "import/no-unresolved": [ - 2, - { - "ignore": ["electron"] - } - ], - "react/prop-types": 0, - "react-native/no-inline-styles": 2 - } -} diff --git a/.github/labeler.yml b/.github/labeler.yml index 5fd8e698f6..84e1cb2bc3 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -5,6 +5,10 @@ labels: matcher: title: '^feat.*?:' + - label: 'style' + matcher: + title: '^style.*?:' + - label: 'fix' matcher: title: '^fix.*?:' @@ -24,4 +28,4 @@ labels: - label: 'i18n' matcher: - files: ['assets/locales/**'] + files: ['app/common/public/locales/**'] diff --git a/.github/release.yml b/.github/release.yml index 7fb4c62412..0a3c52a74c 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -1,13 +1,13 @@ # Configuration for automatically generated release notes changelog: - exclude: - labels: - - dependencies categories: - title: 🚀 New Features labels: - enhancement + - title: 🎨 Design Changes + labels: + - style - title: 🛠 Fixes labels: - fix @@ -20,3 +20,6 @@ changelog: - title: 🔍 Other Changes labels: - '*' + exclude: + authors: + - renovate[bot] diff --git a/.github/workflows/auto-labeler.yml b/.github/workflows/auto-labeler.yml index 600e521347..c2f92a3005 100644 --- a/.github/workflows/auto-labeler.yml +++ b/.github/workflows/auto-labeler.yml @@ -13,4 +13,4 @@ jobs: name: Auto-Label PRs runs-on: ubuntu-latest steps: - - uses: fuxingloh/multi-labeler@v4 + - uses: fuxingloh/multi-labeler@v5.0.0 diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 562f5075ea..6a05ebeb1d 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -18,14 +18,14 @@ jobs: name: Build Docs runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7.0.0 - name: Use Node.js LTS - uses: actions/setup-node@v4 + uses: actions/setup-node@v6.4.0 with: node-version: lts/* cache: 'npm' - name: Install dependencies (Node.js) - run: npm install + run: npm ci - name: Install dependencies (Python) run: npm run install-docs-deps - name: Build Docs diff --git a/.github/workflows/crowdin-sync-translations.yml b/.github/workflows/crowdin-sync-translations.yml index fc762175e0..6134e17c7a 100644 --- a/.github/workflows/crowdin-sync-translations.yml +++ b/.github/workflows/crowdin-sync-translations.yml @@ -12,9 +12,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7.0.0 - name: Use Node.js LTS - uses: actions/setup-node@v4 + uses: actions/setup-node@v6.4.0 with: node-version: lts/* cache: 'npm' @@ -27,7 +27,7 @@ jobs: CROWDIN_PROJECT_ID: 346705 CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }} - name: Create Pull Request - uses: peter-evans/create-pull-request@v6.0.0 + uses: peter-evans/create-pull-request@v8.1.1 with: token: ${{ github.token }} commit-message: 'chore: Update translations' diff --git a/.github/workflows/crowdin-update-resources.yml b/.github/workflows/crowdin-update-resources.yml index 7f63b7e82e..e35a7d5a73 100644 --- a/.github/workflows/crowdin-update-resources.yml +++ b/.github/workflows/crowdin-update-resources.yml @@ -1,4 +1,4 @@ -# Updates Crowdin with any changes in the English translation file (/assets/locales/en/translation.json) +# Updates Crowdin with any changes in the English translation file (/app/common/public/locales/en/translation.json) name: Update Crowdin English Resources @@ -6,7 +6,7 @@ on: push: branches: [main] paths: - - 'assets/locales/en/translation.json' + - 'app/common/public/locales/en/translation.json' - '.github/workflows/crowdin-update-resources.yml' # this file jobs: @@ -14,9 +14,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7.0.0 - name: Use Node.js LTS - uses: actions/setup-node@v4 + uses: actions/setup-node@v6.4.0 with: node-version: lts/* cache: 'npm' diff --git a/.github/workflows/main-commit-validation.yml b/.github/workflows/main-commit-validation.yml index a63ad72bf8..fe47adc8a5 100644 --- a/.github/workflows/main-commit-validation.yml +++ b/.github/workflows/main-commit-validation.yml @@ -8,9 +8,8 @@ on: branches: [main] paths-ignore: - '.github/ISSUE_TEMPLATE/**' - - 'assets/locales/**' + - 'app/common/public/locales/**' - 'docs/**' - - 'sample-session-files/**' - '.gitignore' - 'LICENSE' - 'README.md' @@ -22,9 +21,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7.0.0 - name: Use Node.js LTS - uses: actions/setup-node@v4 + uses: actions/setup-node@v6.4.0 with: node-version: lts/* cache: 'npm' diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml new file mode 100644 index 0000000000..764079f77e --- /dev/null +++ b/.github/workflows/package.yml @@ -0,0 +1,66 @@ +# Builds the desktop and plugin versions of the app. +# The plugin version is published to npm, while the desktop app packages +# are uploaded to a GitHub release for the latest app version tag. + +name: Package and Publish + +on: + workflow_dispatch: + push: + tags: + - '*' + +permissions: + contents: write + pull-requests: write + issues: write + id-token: write # to enable use of OIDC for trusted publishing and npm provenance + +jobs: + electron: + strategy: + matrix: + image: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.image }} + + env: + CSC_IDENTITY_AUTO_DISCOVERY: true + CSC_LINK: ${{ secrets.CSC_LINK }} + CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v7.0.0 + - name: Use Node.js LTS + uses: actions/setup-node@v6.4.0 + with: + node-version: lts/* + cache: 'npm' + - name: Install dependencies (Node.js) + run: npm ci + - name: Build electron app + run: npm run build:electron + - name: build package + run: npx electron-builder build --x64 --arm64 --publish always + - name: Upload built packages + uses: actions/upload-artifact@v7.0.1 + with: + name: artifact-${{ matrix.image }} + path: release/ + + plugin: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7.0.0 + - name: Use Node.js LTS + uses: actions/setup-node@v6.4.0 + with: + node-version: lts/* + cache: 'npm' + - name: Install dependencies (Node.js) + run: npm ci + - name: generate contents + run: npm run build:plugin + - name: publish + run: npm publish + working-directory: plugins diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml new file mode 100644 index 0000000000..f8609e4ccf --- /dev/null +++ b/.github/workflows/pr-title.yml @@ -0,0 +1,17 @@ +# Checks that the PR title follows conventional commit standards + +name: Conventional Commits +on: + pull_request: + types: [opened, edited, synchronize, reopened] + +jobs: + conventional: + name: PR Title + runs-on: ubuntu-latest + steps: + - uses: beemojs/conventional-pr-action@v3.0.0 + with: + config-preset: angular + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/pr-validation-lint.yml b/.github/workflows/pr-validation-lint.yml new file mode 100644 index 0000000000..f1481d2715 --- /dev/null +++ b/.github/workflows/pr-validation-lint.yml @@ -0,0 +1,27 @@ +# Code validation job, executed on pull request +# Runs linting and formatting tests + +name: PR Validation + +on: + pull_request: + branches: [main] + +jobs: + lint: + name: Lint & Format + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v7.0.0 + - name: Use Node.js LTS + uses: actions/setup-node@v6.4.0 + with: + node-version: lts/* + cache: 'npm' + - name: Install Dependencies + run: npm ci + - name: Lint + run: npm run test:lint + - name: Format + run: npm run test:format diff --git a/.github/workflows/pr-validation.yml b/.github/workflows/pr-validation.yml index fcd9dca1a4..2cda5a93e8 100644 --- a/.github/workflows/pr-validation.yml +++ b/.github/workflows/pr-validation.yml @@ -1,5 +1,5 @@ # Code validation job, executed on pull request -# Builds the app, and runs lint, unit and integration tests +# Builds the app, and runs unit and integration tests name: PR Validation @@ -8,9 +8,8 @@ on: branches: [main] paths-ignore: - '.github/ISSUE_TEMPLATE/**' - - 'assets/locales/**' + - 'app/common/public/locales/**' - 'docs/**' - - 'sample-session-files/**' - '.gitignore' - 'LICENSE' - 'README.md' @@ -25,9 +24,9 @@ jobs: runs-on: ${{ matrix.image }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7.0.0 - name: Use Node.js LTS - uses: actions/setup-node@v4 + uses: actions/setup-node@v6.4.0 with: node-version: lts/* cache: 'npm' @@ -37,21 +36,3 @@ jobs: run: npm run build --if-present - name: Test run: npm run test:unit && npm run test:integration - - lint: - name: Lint & Format - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Use Node.js LTS - uses: actions/setup-node@v4 - with: - node-version: lts/* - cache: 'npm' - - name: Install Dependencies - run: npm ci - - name: Lint - run: npm run test:lint - - name: Format - run: npm run test:format diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index ae96b2462f..3328eec76e 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -1,27 +1,34 @@ # Builds and publishes the Appium Inspector MkDocs documentation +# Executed on-demand, or after publishing new version packages name: Publish Docs on: workflow_dispatch: + workflow_run: + workflows: ['Package and Publish'] + types: + - completed jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7.0.0 - name: Use GH Actions credentials run: | git config user.name github-actions git config user.email github-actions@github.com - name: Use Node.js LTS - uses: actions/setup-node@v4 + uses: actions/setup-node@v6.4.0 with: node-version: lts/* cache: 'npm' - name: Install dependencies (Node.js) - run: npm install + run: npm ci - name: Install dependencies (Python) run: npm run install-docs-deps + - name: Fetch docs branch + run: git fetch origin docs-site:docs-site || true - name: Build and deploy docs run: npm run publish:docs diff --git a/.gitignore b/.gitignore index 918e0689e8..39e5416d01 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ dist dist-browser release site +plugins/package-lock.json main.map *.log diff --git a/.lessrc b/.lessrc deleted file mode 100644 index f8e14dc469..0000000000 --- a/.lessrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "javascriptEnabled": true -} diff --git a/.mocharc.js b/.mocharc.js deleted file mode 100644 index 46e3aa7cf6..0000000000 --- a/.mocharc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - require: '@babel/register', - timeout: 60 * 1000, // 1 minute timeout -}; diff --git a/LICENSE b/LICENSE index 607c81441f..d4db1bf81f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,13 +1,201 @@ -Copyright 2021 OpenJS Foundation. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - http://www.apache.org/licenses/LICENSE-2.0 + 1. Definitions. -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright OpenJS Foundation and other contributors, https://openjsf.org/ + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 3983b6407d..d3887eb6ac 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,15 @@ GUI Inspector tool for all kinds of apps, powered by Appium.

+
+ ![Current Version](https://img.shields.io/github/package-json/v/appium/appium-inspector) +![Current Version GitHub Downloads](https://img.shields.io/github/downloads/appium/appium-inspector/latest/total) ![Total GitHub Downloads](https://img.shields.io/github/downloads/appium/appium-inspector/total) [![Crowdin](https://badges.crowdin.net/appium-desktop/localized.svg)](https://crowdin.com/project/appium-desktop) +
+ ---

@@ -28,7 +33,7 @@ various features for interacting with the app. When inspecting a mobile app, the Inspector looks like this: -![Appium Inspector screenshot](./docs/assets/images/inspector-window.png) +![Appium Inspector screenshot](./docs/assets/images/session-inspector.png) ## Installation @@ -36,14 +41,17 @@ Appium Inspector is released in two formats: 1. Standalone desktop application for macOS, Windows, and Linux - download it from the [**Releases**](https://github.com/appium/appium-inspector/releases) section -2. Web application - **** (note that - [CORS must be enabled](https://appium.github.io/appium-inspector/latest/troubleshooting/#cannot-start-a-session-using-browser-inspector) - in order to connect to an Appium server) +2. Appium server plugin - see the [**plugin README**](./plugins/README.md) for details Check the [System Requirements](https://appium.github.io/appium-inspector/latest/quickstart/requirements/) and [Installation](https://appium.github.io/appium-inspector/latest/quickstart/installation/) documentation for more details. +> [!NOTE] +> +> The Inspector was also formerly released as a web application hosted at . The Appium team no longer has developer access to this site, so even though it remains operational, it is highly unlikely to be updated to a newer Inspector version, and may be taken down without notice. We recommend migrating to the standalone app or the plugin version. +> The Appium team is exploring the idea of hosting an up-to-date version of the web app in the future. + ## Features The Inspector has many features in addition to its app inspection abilities: @@ -65,73 +73,157 @@ The Inspector has built-in integrations with various cloud service provider plat - SauceLabs + + + + SauceLabs + - HeadSpin + HeadSpin - BrowserStack + + + + BrowserStack + - - LambdaTest + + + + + TestMu AI (formerly LambdaTest) + - TestingBot + + + + TestingBot + - - ExperiTest + + ExperiTest - - RobotQA + + + + + RobotQA + - Remote TestKit + Remote TestKit - BitBar + BitBar - Kobiton + + + + Kobiton + - Perfecto + Perfecto - Pcloudy + + + + Pcloudy + + + + + + + + Mobitru + + + + + + + + TV Labs + + + + + + + + + Testcribe + + + + + + + + + Webmate + - - Mobitru + + + + + Fireflink Devicefarm + + + + + + + + + RabbitQA + + + + + + + + + RobotActions + diff --git a/app/.postcssrc b/app/.postcssrc deleted file mode 100644 index 050061e108..0000000000 --- a/app/.postcssrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "modules": true -} diff --git a/app/common/index.html b/app/common/index.html new file mode 100644 index 0000000000..b4d191f426 --- /dev/null +++ b/app/common/index.html @@ -0,0 +1,12 @@ + + + + + Appium Inspector + + + +

+ + + diff --git a/assets/locales/ar/translation.json b/app/common/public/locales/ar/translation.json similarity index 73% rename from assets/locales/ar/translation.json rename to app/common/public/locales/ar/translation.json index 840c14813e..3e72909034 100644 --- a/assets/locales/ar/translation.json +++ b/app/common/public/locales/ar/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "Bring All to Front", "Help": "المساعدة", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Save Server Arguments Preset", "Save": "حفظ", "Cancel": "إلغاء", - "datetimeFormat": "MMM Do YYYY, h:mma", "updateDetails": "تاريخ الإصدار: {{pubDate}}\n\nملاحظات الإصدار: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} is available", "updateIsBeingDownloaded": "يتم تحميل التحديث الآن. سيتم إعلامك مرة أخرى عند اكتمال التحديث", @@ -68,20 +66,11 @@ "Could not start session": "تعذر بَدْء الجلسة", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "Sauce username and access key are required!", - "testingbotCredentialsRequired": "TestingBot key and secret are required!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken is required", - "browserstackCredentialsRequired": "Browserstack username and access key are required!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "Bitbar API key required!", - "kobitonCredentialsRequired": "KOBITON username and api key are required!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "استراتيجية محددات المواقع:", "selector": "المحدد:", "couldNotObtainScreenshot": "تعذر الحصول على لقطة الشاشة: {{screenshotError}}", - "selectElementInSource": "Select an element in the source to begin.", "Press Home Button": "اضغط على زر الصفحة الرئيسية", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "إيقاف التسجيل مؤقتا", "Search for element": "Search for element", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", - "quitSessionAndClose": "Quit Session & Close Inspector", "Session Inactive": "Session Inactive", "Keep Session Running": "ترك الجَلسة مفتوحة", "Quit Session": "إنهاء الجَلسة", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "استخدام محدد المواقع XPath غير مستحسن ويمكن أن يؤدي إلى اختبارات هشه. اطلب من فريق التطوير الخاص بك توفير مواقع الوصول الفريدة بدلاً من ذلك!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Tap", "Gathering initial app source…": "Gathering initial app source…", "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "boolean", "number": "number", "JSON object": "JSON object", - "filepath": "filepath", "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", - "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Allow Unauthorized Certificates", "Use Proxy": "Use Proxy", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "Attach to Session…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Port", @@ -195,16 +184,19 @@ "Remote Path": "Remote Path", "BrowserStack Username": "BrowserStack Username", "BrowserStack Access Key": "BrowserStack Access Key", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Bitbar API Key", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Name", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Enter your session ID here", + "searchSessions": "Search discovered sessions", "Proxy URL": "Proxy URL", "Source": "Source", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "Save Capability Set As…", "Edit Raw JSON": "Edit Raw JSON", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "Clipboard", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "Performance Data", - "System": "System", "Session": "الجَلسة", "Web": "الويب", "Context": "Context", - "Window (W3C)": "نافذة (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "خطأ", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Call to '{{methodName}}' failed", - "methodCallResult": "'{{methodName}}' result", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "TestingBot Key", "TestingBot Secret": "TestingBot Secret", "Appium Server": "خادم Appium", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/fi/translation.json b/app/common/public/locales/da/translation.json similarity index 72% rename from assets/locales/fi/translation.json rename to app/common/public/locales/da/translation.json index a0dd36cde1..9ad71e149c 100644 --- a/assets/locales/fi/translation.json +++ b/app/common/public/locales/da/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "Bring All to Front", "Help": "Help", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Save Server Arguments Preset", "Save": "Save", "Cancel": "Cancel", - "datetimeFormat": "MMM Do YYYY, h:mma", "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} is available", "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", @@ -68,20 +66,11 @@ "Could not start session": "Could not start session", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "Sauce username and access key are required!", - "testingbotCredentialsRequired": "TestingBot key and secret are required!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken is required", - "browserstackCredentialsRequired": "Browserstack username and access key are required!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "Bitbar API key required!", - "kobitonCredentialsRequired": "KOBITON username and api key are required!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "Locator Strategy:", "selector": "Selector:", "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", - "selectElementInSource": "Select an element in the source to begin.", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "Pause Recording", "Search for element": "Search for element", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", - "quitSessionAndClose": "Quit Session & Close Inspector", "Session Inactive": "Session Inactive", "Keep Session Running": "Keep Session Running", "Quit Session": "Quit Session", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Tap", "Gathering initial app source…": "Gathering initial app source…", "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "boolean", "number": "number", "JSON object": "JSON object", - "filepath": "filepath", "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", - "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Allow Unauthorized Certificates", "Use Proxy": "Use Proxy", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "Attach to Session…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Port", @@ -195,16 +184,19 @@ "Remote Path": "Remote Path", "BrowserStack Username": "BrowserStack Username", "BrowserStack Access Key": "BrowserStack Access Key", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Bitbar API Key", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Name", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Enter your session ID here", + "searchSessions": "Search discovered sessions", "Proxy URL": "Proxy URL", "Source": "Source", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "Save Capability Set As…", "Edit Raw JSON": "Edit Raw JSON", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "Clipboard", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "Performance Data", - "System": "System", "Session": "Session", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "Error", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Call to '{{methodName}}' failed", - "methodCallResult": "'{{methodName}}' result", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "TestingBot Key", "TestingBot Secret": "TestingBot Secret", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/de/translation.json b/app/common/public/locales/de/translation.json similarity index 73% rename from assets/locales/de/translation.json rename to app/common/public/locales/de/translation.json index c97ce652fe..80379c69aa 100644 --- a/assets/locales/de/translation.json +++ b/app/common/public/locales/de/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "Alle nach vorne bringen", "Help": "Hilfe", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Voreinstellungen von Serverargumente sichern", "Save": "Sichern", "Cancel": "Abbrechen", - "datetimeFormat": "D.M.YYYY, HH:mm", "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} ist verfügbar", "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", @@ -68,20 +66,11 @@ "Could not start session": "Die Session konnte nicht gestartet werden", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "Sauce username and access key are required!", - "testingbotCredentialsRequired": "TestingBot key and secret are required!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken is required", - "browserstackCredentialsRequired": "Browserstack username and access key are required!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "Bitbar API key required!", - "kobitonCredentialsRequired": "KOBITON username and api key are required!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "Locator-Strategie:", "selector": "Selektor:", "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", - "selectElementInSource": "Select an element in the source to begin.", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "Aufnahme anhalten", "Search for element": "Nach Element suchen", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "Die XML-Quelle in der Zwischenablage kopieren", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", - "quitSessionAndClose": "Session beenden und Inspektor schließen", "Session Inactive": "Die Session ist inaktiv", "Keep Session Running": "Keep Session Running", "Quit Session": "Session beenden", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Tippen", "Gathering initial app source…": "Die Anfangsquelle des Programms wird gesammelt…", "couldNotObtainSource": "Die XML-Quelle wurde nicht erhalten: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "einen Booleschen Wert", "number": "Nummer", "JSON object": "JSON-Objekt", - "filepath": "Dateipfad", "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", - "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Allow Unauthorized Certificates", "Use Proxy": "Proxy verwenden", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "Attach to Session…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Port", @@ -195,16 +184,19 @@ "Remote Path": "Remote Path", "BrowserStack Username": "BrowserStack Username", "BrowserStack Access Key": "BrowserStack Access Key", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Bitbar API Key", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Name", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Enter your session ID here", + "searchSessions": "Search discovered sessions", "Proxy URL": "Proxy-URL", "Source": "Source", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "Save Capability Set As…", "Edit Raw JSON": "Edit Raw JSON", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "Zwischenablage", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "Leistungsdaten", - "System": "System", "Session": "Session", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "Fehler", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Call to '{{methodName}}' failed", - "methodCallResult": "Ergebnis von '{{methodName}}'", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "TestingBot-Schlüssel", "TestingBot Secret": "TestingBot Secret", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/en/translation.json b/app/common/public/locales/en/translation.json similarity index 72% rename from assets/locales/en/translation.json rename to app/common/public/locales/en/translation.json index a0dd36cde1..9ad71e149c 100644 --- a/assets/locales/en/translation.json +++ b/app/common/public/locales/en/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "Bring All to Front", "Help": "Help", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Save Server Arguments Preset", "Save": "Save", "Cancel": "Cancel", - "datetimeFormat": "MMM Do YYYY, h:mma", "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} is available", "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", @@ -68,20 +66,11 @@ "Could not start session": "Could not start session", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "Sauce username and access key are required!", - "testingbotCredentialsRequired": "TestingBot key and secret are required!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken is required", - "browserstackCredentialsRequired": "Browserstack username and access key are required!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "Bitbar API key required!", - "kobitonCredentialsRequired": "KOBITON username and api key are required!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "Locator Strategy:", "selector": "Selector:", "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", - "selectElementInSource": "Select an element in the source to begin.", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "Pause Recording", "Search for element": "Search for element", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", - "quitSessionAndClose": "Quit Session & Close Inspector", "Session Inactive": "Session Inactive", "Keep Session Running": "Keep Session Running", "Quit Session": "Quit Session", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Tap", "Gathering initial app source…": "Gathering initial app source…", "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "boolean", "number": "number", "JSON object": "JSON object", - "filepath": "filepath", "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", - "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Allow Unauthorized Certificates", "Use Proxy": "Use Proxy", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "Attach to Session…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Port", @@ -195,16 +184,19 @@ "Remote Path": "Remote Path", "BrowserStack Username": "BrowserStack Username", "BrowserStack Access Key": "BrowserStack Access Key", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Bitbar API Key", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Name", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Enter your session ID here", + "searchSessions": "Search discovered sessions", "Proxy URL": "Proxy URL", "Source": "Source", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "Save Capability Set As…", "Edit Raw JSON": "Edit Raw JSON", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "Clipboard", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "Performance Data", - "System": "System", "Session": "Session", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "Error", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Call to '{{methodName}}' failed", - "methodCallResult": "'{{methodName}}' result", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "TestingBot Key", "TestingBot Secret": "TestingBot Secret", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/es-ES/translation.json b/app/common/public/locales/es-ES/translation.json similarity index 72% rename from assets/locales/es-ES/translation.json rename to app/common/public/locales/es-ES/translation.json index b0f2443188..323a26a1e0 100644 --- a/assets/locales/es-ES/translation.json +++ b/app/common/public/locales/es-ES/translation.json @@ -14,10 +14,9 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "Traer todo al frente", "Help": "Ayuda", - "Appium Documentation": "Appium Documentation", + "Appium Documentation": "Documentación de Appium", "Inspector Documentation": "Inspector Documentation", "Appium Discussion Forum": "Appium Discussion Forum", "Report Issues": "Report Issues", @@ -26,8 +25,8 @@ "Improve Translations": "Improve Translations", "Check for Updates…": "Check for Updates…", "File": "Archivo", - "New Window": "New Window", - "Hide Appium Inspector": "Hide Appium Inspector", + "New Window": "Nueva ventana", + "Hide Appium Inspector": "Ocultar inspector de Appium", "Hide Others": "Ocultar otras", "Show All": "Mostrar todo", "Quit Appium Inspector": "Quit Appium Inspector", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Guardar ajuste del servidor", "Save": "Guardar", "Cancel": "Cancelar", - "datetimeFormat": "MMM Do YYYYY, h:mma", "updateDetails": "Fecha de lanzamiento: {{pubDate}}\n\nnotas: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} está disponible", "updateIsBeingDownloaded": "La actualización está siendo descargada ahora. Se le notificará de nuevo cuando esté completa", @@ -68,20 +66,11 @@ "Could not start session": "No se pudo iniciar la sesión", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "¡Se requiere nombre de usuario y clave de acceso para Saucelabs!", - "testingbotCredentialsRequired": "TestingBot key and secret are required!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken es requerido", - "browserstackCredentialsRequired": "¡Se requiere nombre de usuario y clave de acceso para Browserstack!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "¡Clave API de Bitbar requerida!", - "kobitonCredentialsRequired": "¡Se requiere nombre de usuario y clave api para KOBITON!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "Estrategia de localizador:", "selector": "Selector:", "couldNotObtainScreenshot": "No se pudo obtener captura de pantalla: {{screenshotError}}", - "selectElementInSource": "Select an element in the source to begin.", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -93,18 +82,18 @@ "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates", "Download Screenshot": "Download Screenshot", "Back": "Atrás", - "Start Refreshing Source": "Start Refreshing Source", + "Start Refreshing Source": "Empezar a actualizar la fuente", "Pause Refreshing Source": "Pause Refreshing Source", "refreshSource": "Refrescar fuente y captura de pantalla", "Start Recording": "Iniciar grabación", "Pause Recording": "Pausar grabación", "Search for element": "Buscar elemento", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "Copiar fuente XML al portapapeles", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", - "quitSessionAndClose": "Salir de Sesión y Cerrar Inspector", "Session Inactive": "Sesión inactiva", "Keep Session Running": "Mantener sesión en ejecución", "Quit Session": "Salir de sesión", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "El uso de los localizadores XPath no es recomendado y puede llevar a pruebas frágiles. ¡Pide a tu equipo de desarrollo que proporcione a los localizadores de accesibilidad únicos en su lugar!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Tap", "Gathering initial app source…": "Recolectando código fuente inicial de la aplicación…", "couldNotObtainSource": "No se pudo obtener fuente: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "booleano", "number": "número", "JSON object": "objeto JSON", - "filepath": "ruta", "connectToExistingSessionInstructions": "Si tiene una sesión ya en ejecución, puedes adjuntar un inspector directamente a él.", - "selectSessionIDInDropdown": "Seleccione la ID de sesión en el desplegable a continuación.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Permitir certificados no autorizados", "Use Proxy": "Usar proxy", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "Adjuntar a la sesión…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Puerto", @@ -195,16 +184,19 @@ "Remote Path": "Ruta Remota", "BrowserStack Username": "Usuario de BrowserStack", "BrowserStack Access Key": "Clave de Acceso de BrowserStack", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Clave de la API de Bitbar", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Nombre", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Introduce tu ID de sesión aquí", + "searchSessions": "Search discovered sessions", "Proxy URL": "URL del proxy", "Source": "Origen", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "Guardar el conjunto de capacidades como…", "Edit Raw JSON": "Editar JSON sin procesar", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "Portapapeles", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "Datos de rendimiento", - "System": "Sistema", "Session": "Sesión", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "Error", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Llamada a '{{methodName}}' falló", - "methodCallResult": "Resultado de '{{methodName}}'", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "Clave de TestingBot", "TestingBot Secret": "Secreto de TestingBot", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/fa/translation.json b/app/common/public/locales/fa/translation.json similarity index 75% rename from assets/locales/fa/translation.json rename to app/common/public/locales/fa/translation.json index 9a38a7808e..147a4216d6 100644 --- a/assets/locales/fa/translation.json +++ b/app/common/public/locales/fa/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "آوردن همه به جلو", "Help": "راهنما", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "ذخیره آرگومان های از پیش تعیین شده سرور", "Save": "ذخیره سازی", "Cancel": "انصراف", - "datetimeFormat": "MMM یا YYYY و یا h:mma", "updateDetails": "تاریخ انتشار: {{pubDate}}\n\nیادداشت انتشار: {{notes}}", "appiumIsAvailable": "نرم‌افزار Appium Inspector {{name}} در دسترس است", "updateIsBeingDownloaded": "بروزرسانی دانلود شده است. هنگام تکمیل به شما اطلاع داده خواهد شد", @@ -68,20 +66,11 @@ "Could not start session": "امکان شروع جلسه کاری وجود ندارد", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "نام کاربری و کلید دسترسی مورد نیاز است!", - "testingbotCredentialsRequired": "کاید و رمز TestingBot مورد نیاز است!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken مورد نیاز است", - "browserstackCredentialsRequired": "نام کاربری و کلید دسترسی Browserstack مورد نیاز است!", - "lambdatestCredentialsRequired": "نام کاربری و کلید دسترسی Lambdatest مورد نیاز است!", - "bitbarCredentialsRequired": "کلید دسترسی سرویس Bitbar مورد نیاز است!", - "kobitonCredentialsRequired": "نام کاربری و کلید دسترسی KOBITON مورد نیاز است!", - "experitestAccessKeyURLRequired": "کلید دسترسی و آدرس Experitest مورد نیاز است", "experitestAccessKey": "کلید دسترسی Experitest", "experitestUrl": "آدرس Experitest", "locatorStrategy": "استراتژی مکان یاب:", "selector": "گزینشگر (selector):", "couldNotObtainScreenshot": "امکان گرفتن تصویر صفحه وجود ندارد: {{screenshotError}}", - "selectElementInSource": "برای شروع یک عنصر در کد منبع را انتخاب کنید.", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "مکث در ضبط", "Search for element": "جستجو برای عنصر", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "منبع XML را در كليپ برد كپي کن", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "ویژگی ها را در کلیپ بورد کپی کنید", - "quitSessionAndClose": "ترک جلسه و بستن بازرسی", "Session Inactive": "جلسه غیر فعال", "Keep Session Running": "جلسه را در حال اجرا نگه دار", "Quit Session": "ترک جلسه", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "استفاده از مکان یاب XPath توصیه نمی شود و می تواند منجر به تست های شکننده شود. از تیم توسعه خود بخواهید به جای آن مکان یاب های دسترسی منحصر به فرد را ارائه دهند!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "ضربه", "Gathering initial app source…": "در حال جمع‌آوری منبع اولیه برنامه…", "couldNotObtainSource": "امکان گرفتن کد منبع وجود ندارد: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "مقدار بولین", "number": "شماره", "JSON object": "شی JSON", - "filepath": "آدرس فایل", "connectToExistingSessionInstructions": "اگر یک session از نوع سرور بالا در حال حاضر در حال اجرا دارید، می توانید یک inspector را مستقیماً به آن متصل کنید.", - "selectSessionIDInDropdown": "یک Session ID از انتخابگر زیر انتخاب کنید.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "اجازه دادن به گواهینامه های غیر مجاز", "Use Proxy": "استفاده از پروکسی", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "اتصال به یک Session…", + "Attach": "Attach", "localhost": "localhost", "Host": "میزبان", "Port": "پورت", @@ -195,16 +184,19 @@ "Remote Path": "مسیر راه دور", "BrowserStack Username": "نام کاربری BrowserStack", "BrowserStack Access Key": "کلید دسترسی BrowserStack", - "LambdaTest Username": "نام کاربری LambdaTest", - "LambdaTest Access Key": "کلید دسترسی LambdaTest", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "کلید API برای Bitbar", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "نام", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "شناسه‌ی Session خود را وارد کنید", + "searchSessions": "Search discovered sessions", "Proxy URL": "آدرس URL پروکسی", "Source": "منبع", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "ذخیره Capability Set به عنوان…", "Edit Raw JSON": "ویرایش JSON خام", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "کلیپ‌بورد", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "Performance Data", - "System": "System", "Session": "Session", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "Error", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Call to '{{methodName}}' failed", - "methodCallResult": "'{{methodName}}' result", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "TestingBot Key", "TestingBot Secret": "TestingBot Secret", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/da/translation.json b/app/common/public/locales/fi/translation.json similarity index 72% rename from assets/locales/da/translation.json rename to app/common/public/locales/fi/translation.json index a0dd36cde1..9ad71e149c 100644 --- a/assets/locales/da/translation.json +++ b/app/common/public/locales/fi/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "Bring All to Front", "Help": "Help", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Save Server Arguments Preset", "Save": "Save", "Cancel": "Cancel", - "datetimeFormat": "MMM Do YYYY, h:mma", "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} is available", "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", @@ -68,20 +66,11 @@ "Could not start session": "Could not start session", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "Sauce username and access key are required!", - "testingbotCredentialsRequired": "TestingBot key and secret are required!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken is required", - "browserstackCredentialsRequired": "Browserstack username and access key are required!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "Bitbar API key required!", - "kobitonCredentialsRequired": "KOBITON username and api key are required!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "Locator Strategy:", "selector": "Selector:", "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", - "selectElementInSource": "Select an element in the source to begin.", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "Pause Recording", "Search for element": "Search for element", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", - "quitSessionAndClose": "Quit Session & Close Inspector", "Session Inactive": "Session Inactive", "Keep Session Running": "Keep Session Running", "Quit Session": "Quit Session", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Tap", "Gathering initial app source…": "Gathering initial app source…", "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "boolean", "number": "number", "JSON object": "JSON object", - "filepath": "filepath", "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", - "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Allow Unauthorized Certificates", "Use Proxy": "Use Proxy", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "Attach to Session…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Port", @@ -195,16 +184,19 @@ "Remote Path": "Remote Path", "BrowserStack Username": "BrowserStack Username", "BrowserStack Access Key": "BrowserStack Access Key", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Bitbar API Key", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Name", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Enter your session ID here", + "searchSessions": "Search discovered sessions", "Proxy URL": "Proxy URL", "Source": "Source", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "Save Capability Set As…", "Edit Raw JSON": "Edit Raw JSON", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "Clipboard", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "Performance Data", - "System": "System", "Session": "Session", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "Error", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Call to '{{methodName}}' failed", - "methodCallResult": "'{{methodName}}' result", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "TestingBot Key", "TestingBot Secret": "TestingBot Secret", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/fr/translation.json b/app/common/public/locales/fr/translation.json similarity index 70% rename from assets/locales/fr/translation.json rename to app/common/public/locales/fr/translation.json index 54e35d35a7..82809b0e3a 100644 --- a/assets/locales/fr/translation.json +++ b/app/common/public/locales/fr/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "Tout ramener au premier plan", "Help": "Aide", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Save Server Arguments Preset", "Save": "Sauvegarder", "Cancel": "Annuler", - "datetimeFormat": "MMM Do YYYY, h:mma", "updateDetails": "Date de sortie : {{pubDate}}\n\nNotes de sortie : {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} est disponible", "updateIsBeingDownloaded": "La mise à jour est en cours de téléchargement. Vous serez informé une fois terminée", @@ -68,43 +66,34 @@ "Could not start session": "Impossible de démarrer la session", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "URL invalide :", - "sauceCredentialsRequired": "Le nom d'utilisateur Sauce et la clé d'accès sont requis !", - "testingbotCredentialsRequired": "TestingBot key and secret are required!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken is required", - "browserstackCredentialsRequired": "Browserstack username and access key are required!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "Bitbar API key required!", - "kobitonCredentialsRequired": "KOBITON username and api key are required!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "Locator Strategy:", "selector": "Selector:", "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", - "selectElementInSource": "Select an element in the source to begin.", - "Press Home Button": "Press Home Button", + "Press Home Button": "Appuyez sur le bouton Accueil", "Execute Siri Command": "Exécuter la commande Siri", "Press Back Button": "Appuyer sur le bouton Retour", - "Press App Switch Button": "Press App Switch Button", - "Command": "Command", - "Show Element Handles": "Show Element Handles", - "Hide Element Handles": "Hide Element Handles", - "Select Elements": "Select Elements", + "Press App Switch Button": "Appuyez sur le bouton de changement d'application", + "Command": "Commande", + "Show Element Handles": "Afficher les poignées d'éléments", + "Hide Element Handles": "Masquer les poignées d'éléments", + "Select Elements": "Sélectionner les éléments", "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates", "Download Screenshot": "Télécharger la capture d'écran", "Back": "Précédent", "Start Refreshing Source": "Commencer à actualiser la source", "Pause Refreshing Source": "Pause Refreshing Source", "refreshSource": "Refresh Source & Screenshot", - "Start Recording": "Start Recording", + "Start Recording": "Commencer l'enregistrement", "Pause Recording": "Mettre en pause l'enregistrement", "Search for element": "Rechercher un élément", "App Source": "Source de l'application", + "Collapse All": "Collapse All", "Toggle Attributes": "Afficher/Masquer les attributs", "Copy XML Source to Clipboard": "Copier la source XML dans le presse-papier", "Download Source as .XML File": "Télécharger la source comme fichier .XML", "Copy Attributes to Clipboard": "Copier les attributs dans le presse-papiers", - "quitSessionAndClose": "Quitter la session et fermer l'inspecteur", "Session Inactive": "Session inactive", "Keep Session Running": "Garder la session active", "Quit Session": "Quitter la session", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "L'utilisation des localisateurs XPath n'est pas recommandée et peut conduire à des tests fragiles. Demandez à votre équipe de développement de fournir des localisateurs d'accessibilité uniques à la place !", "noAdditionalContextsFound": "Aucun contexte supplémentaire n'a été trouvé", "contextDropdownInfo": "Multiples contextes trouvés ; certains éléments pourraient n'être accessibles qu'après changement de contexte. Note : l'inspection webview avec Appium Inspector est moins précise qu'avec DevTools de Chrome ou Safari. Pour en savoir plus, consulter :", - "idAutocompletionCanBeDisabled": "Le sélecteur d'id demandé n'a pas de préfixe de nom de paquet. Cette session Appium a activé l'auto-complétion du nom du paquet, ce qui peut être la raison pour laquelle aucun élément n'a été trouvé. Pour désactiver ce comportement, relancez cette session avec la capacité 'appium:disableIdLocatorAutocompletion' à 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Tap", "Gathering initial app source…": "Gathering initial app source…", "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "boolean", "number": "number", "JSON object": "JSON object", - "filepath": "filepath", "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", - "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Allow Unauthorized Certificates", "Use Proxy": "Use Proxy", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "Attach to Session…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Port", @@ -195,16 +184,19 @@ "Remote Path": "Remote Path", "BrowserStack Username": "BrowserStack Username", "BrowserStack Access Key": "BrowserStack Access Key", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Bitbar API Key", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Name", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Enter your session ID here", + "searchSessions": "Search discovered sessions", "Proxy URL": "Proxy URL", "Source": "Source", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "Save Capability Set As…", "Edit Raw JSON": "Edit Raw JSON", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "Clipboard", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "Performance Data", - "System": "System", "Session": "Session", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Émulateur/simulateur uniquement", "minAndroidSDK": "Version du SDK Android minimum", "Error": "Erreur", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Call to '{{methodName}}' failed", - "methodCallResult": "'{{methodName}}' result", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "TestingBot Key", "TestingBot Secret": "TestingBot Secret", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/hi/translation.json b/app/common/public/locales/hi/translation.json similarity index 77% rename from assets/locales/hi/translation.json rename to app/common/public/locales/hi/translation.json index b718d7a907..c43ddfc8dc 100644 --- a/assets/locales/hi/translation.json +++ b/app/common/public/locales/hi/translation.json @@ -1,20 +1,19 @@ { - "appiumInspector": "Appium Inspector", + "appiumInspector": "start", "Edit": "संपादित करें", "Redo": "फिर से करें", "Cut": "काटें", "Copy": "प्रतिलिपि बनाएँ", "Paste": "चिपकाएँ", - "Delete": "Delete", + "Delete": "डिलीट करें", "Select All": "सभी का चयन करें", "Window": "खिडकी", "Minimize": "न्यूनतम", - "Zoom": "Zoom", + "Zoom": "ज़ूम", "Zoom In": "Zoom In", "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "सभी को सामने लाओ", "Help": "सहायता", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "पूर्व निर्धारित सर्वर आर्गुमेंट सहेजें", "Save": "सहेजें", "Cancel": "रद्द करें", - "datetimeFormat": "MMM Do YYYY, h:mma", "updateDetails": "रिलीज़ की तारीख: {{pubDate}}\n\nरिलीज़ नोट्स: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} is available", "updateIsBeingDownloaded": "अपडेट अब डाउनलोड किया जा रहा है। पूरा होने पर आपको फिर से सूचित किया जाएगा", @@ -68,20 +66,11 @@ "Could not start session": "सत्र शुरू नहीं हो सका", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "सॉस उपयोगकर्ता नाम और एक्सेस कुंजी की आवश्यकता है!", - "testingbotCredentialsRequired": "टेस्टिंगबोट कुंजी और रहस्य की आवश्यकता है!", - "Perfecto SecurityToken is required": "परफेक्टो सिक्योरिटी टोकन की आवश्यकता है", - "browserstackCredentialsRequired": "ब्राउज़र स्टैक उपयोगकर्ता नाम और एक्सेस कुंजी की आवश्यकता है!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "बिटबार एपीआई कुंजी की आवश्यकता!", - "kobitonCredentialsRequired": "कोबिटों उपयोगकर्ता नाम और एक्सेस कुंजी की आवश्यकता है!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "लोकेटर कार्यनीति:", "selector": "चुननेवाला", "couldNotObtainScreenshot": "स्क्रीनशॉट प्राप्त नहीं किया जा सका: {{screenshotError}}", - "selectElementInSource": "शुरू करने के लिए स्रोत में एक एलिमेंट का चयन करें", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "रिकॉर्डिंग रोकें", "Search for element": "एलिमेंट की खोज करें", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "XML स्रोत को क्लिपबोर्ड पर कॉपी करें", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "ऐट्रिब्यूट्स को क्लिपबोर्ड पर कॉपी करें", - "quitSessionAndClose": "सत्र छोड़ो और इंस्पेक्टर बंद करे", "Session Inactive": "सत्र निष्क्रिय", "Keep Session Running": "सत्र चालू रखें", "Quit Session": "सत्र छोड़ो", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "XPath लोकेटर का उपयोग करने की अनुशंसा नहीं की जाती है और इससे tests नाजुक हो सकते हैं। इसके बजाय अनूठा एक्सेसिबिलिटी लोकेटर उपलब्ध कराने के लिए अपनी डेवलपमेंट टीम से पूछें!", "noAdditionalContextsFound": "किसी अतिरिक्त संदर्भ का पता नहीं चला है", "contextDropdownInfo": "अनेक संधर्ब पाए गए। कुछ तत्व केवल एक अलग संदर्भ को बदलने पर सुलभ हो सकते हैं। ध्यान दें कि एपियम इंस्पेक्टर में वेबव्यू निरीक्षण, क्रोम या सफारी के डेवटूल्स की तुलना में कम सटीक है। अधिक जानकारी के लिए, देखेंः", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "टेप करें", "Gathering initial app source…": "प्रारंभिक एप्लिकेशन स्रोत प्राप्त कर रहा है...", "couldNotObtainSource": "स्रोत प्राप्त नहीं कर सका:{{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "बूलियन", "number": "क्रमांक", "JSON object": "JSON ऑब्जेक्ट", - "filepath": "फ़ाइल पथ", "connectToExistingSessionInstructions": "यदि आपके पास उपरोक्त सर्वर प्रकार का एक पहले से चल रहा सत्र है, तो आप इसे सीधे एक निरीक्षक संलग्न कर सकते हैं।", - "selectSessionIDInDropdown": "नीचे दिए गए ड्रॉपडाउन में सत्र आईडी का चयन करें।", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "अनधिकृत प्रमाणपत्रों की अनुमति दें", "Use Proxy": "प्रॉक्सी उपयोग करें", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "सत्र के लिए संलग्न करें", + "Attach": "Attach", "localhost": "लोकलहोस्ट", "Host": "होस्ट", "Port": "पोर्ट", @@ -195,16 +184,19 @@ "Remote Path": "दूरस्थ पथ", "BrowserStack Username": "ब्राउज़र स्टैक उपयोगकर्ता नाम", "BrowserStack Access Key": "ब्राउज़र स्टैक एक्सेस कुंजी", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "बिटबार एपीआई कुंजी", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "जोड़ें", "Name": "नाम", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "यहां अपना सत्र आईडी दर्ज करें", + "searchSessions": "Search discovered sessions", "Proxy URL": "प्रॉक्सी URL", "Source": "स्रोत", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -231,32 +225,26 @@ "Gesture saved": "Gesture saved", "Gesture saved as": "Gesture saved as '{{gestureName}}'", "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed", - "Left": "Left", + "Left": "बायां", "Right": "Right", - "Play": "Play", + "Play": "चलाएँ", + "Export to File": "Export to File", "Save Capability Set As": "इस रूप में क्षमता सहेजें…", "Edit Raw JSON": "कच्चे JSON संपादित करें", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "क्लिपबोर्ड", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "प्रदर्शन डेटा", - "System": "प्रणाली", "Session": "सत्र", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "त्रुटि", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "'{{methodName}}' पर कॉल विफल रहा", - "methodCallResult": "{{methodName}} परिणाम", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "टेस्टिंगबोट की", "TestingBot Secret": "टेस्टिंगबोट सीक्रेट", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/hu/translation.json b/app/common/public/locales/hu/translation.json similarity index 72% rename from assets/locales/hu/translation.json rename to app/common/public/locales/hu/translation.json index cd4a262e55..b973087a29 100644 --- a/assets/locales/hu/translation.json +++ b/app/common/public/locales/hu/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "Összes előtérbe helyezése", "Help": "Segítség", "Appium Documentation": "Appium dokumentáció", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Save Server Arguments Preset", "Save": "Mentés", "Cancel": "Mégse", - "datetimeFormat": "YYYY.MMM.Do, h:mma", "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} is available", "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", @@ -68,20 +66,11 @@ "Could not start session": "Munkamenet elindítása nem lehetséges", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Érvénytelen URL:", - "sauceCredentialsRequired": "Sauce username and access key are required!", - "testingbotCredentialsRequired": "TestingBot key and secret are required!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken is required", - "browserstackCredentialsRequired": "Browserstack username and access key are required!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "Bitbar API key required!", - "kobitonCredentialsRequired": "KOBITON username and api key are required!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "Locator Strategy:", "selector": "Selector:", "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", - "selectElementInSource": "Select an element in the source to begin.", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "Pause Recording", "Search for element": "Search for element", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", - "quitSessionAndClose": "Quit Session & Close Inspector", "Session Inactive": "Session Inactive", "Keep Session Running": "Keep Session Running", "Quit Session": "Quit Session", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Tap", "Gathering initial app source…": "Gathering initial app source…", "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "boolean", "number": "number", "JSON object": "JSON object", - "filepath": "filepath", "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", - "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Allow Unauthorized Certificates", "Use Proxy": "Use Proxy", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "Munkamenethez csatlakozás…", + "Attach": "Attach", "localhost": "localhost", "Host": "Kiszolgáló", "Port": "Port", @@ -195,16 +184,19 @@ "Remote Path": "Remote Path", "BrowserStack Username": "BrowserStack Username", "BrowserStack Access Key": "BrowserStack Access Key", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Bitbar API Key", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Név", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Enter your session ID here", + "searchSessions": "Search discovered sessions", "Proxy URL": "Proxy URL", "Source": "Forrás", "Commands": "Parancsok", @@ -212,12 +204,14 @@ "Gestures": "Gesztusok", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Mentett gesztusok", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Parancs végrehajtás", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Bal", "Right": "Jobb", "Play": "Lejátszás", + "Export to File": "Export to File", "Save Capability Set As": "Save Capability Set As…", "Edit Raw JSON": "Edit Raw JSON", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Érvénytelen JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "Vágólap", "File Transfer": "Fájlátvitel", "Device Interaction": "Device Interaction", - "Keyboard": "Billentyűzet", - "Connectivity": "Connectivity", - "Performance Data": "Performance Data", - "System": "Rendszer", "Session": "Munkamenet", "Web": "Web", "Context": "Kontextus", - "Window (W3C)": "Ablak (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK verzió", "Error": "Hiba", "findingElementInSourceFailed": "A meghatározott elem nem található. A jelenlegi alkalmazás forrás vagy elem ID megváltozhatott, vagy túl sok elem rendelkezik azonos koordinátákkal.", "callToMethodFailed": "Call to '{{methodName}}' failed", - "methodCallResult": "'{{methodName}}' eredmény", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "TestingBot Key", "TestingBot Secret": "TestingBot Secret", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/it/translation.json b/app/common/public/locales/it/translation.json similarity index 72% rename from assets/locales/it/translation.json rename to app/common/public/locales/it/translation.json index b4d43f55f8..fccf1359c2 100644 --- a/assets/locales/it/translation.json +++ b/app/common/public/locales/it/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "Porta tutto in primo piano", "Help": "Aiuto", "Appium Documentation": "Documentazione di Appium", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Salva le variabili predefinite del server", "Save": "Salva", "Cancel": "Annulla", - "datetimeFormat": "MMM Do YYYY, h:mma", "updateDetails": "Data di rilascio: {{pubDate}}\n\nNote di rilascio: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} è disponibile", "updateIsBeingDownloaded": "L'aggiornamento è in fase di scaricamento. Sarai avvisato di nuovo quando sarà completato", @@ -68,20 +66,11 @@ "Could not start session": "Impossibile avviare la sessione", "couldNotConnect": "Impossibile connettersi all'URL del server Appium '{{url}}'. Si prega di controllare se il server è in esecuzione e l'URL è corretto (URL validi possono essere trovati all'inizio del log del server Appium). Se stai usando la versione browser dell' Inspector, assicurati che il server sia stato avviato con '--allow-cors'.", "Invalid URL:": "URL non valido:", - "sauceCredentialsRequired": "Username e access key di saucelabs sono obbligatori!", - "testingbotCredentialsRequired": "Chiave e secret di TestingBot sono obbligatori!", - "Perfecto SecurityToken is required": "Il SecurityToken di Perfecto è obbligatorio", - "browserstackCredentialsRequired": "Username e access key di Browserstack sono obbligatori!", - "lambdatestCredentialsRequired": "Username e access key di Lambdatest sono obbligatori!", - "bitbarCredentialsRequired": "Bitmarm API key è obbligatoria!", - "kobitonCredentialsRequired": "Username e api key di KOBITON sono obbligatori!", - "experitestAccessKeyURLRequired": "AccessKey e URL di Experitest sono obbligatori", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "Strategia di localizzazione:", "selector": "Selettore:", "couldNotObtainScreenshot": "Impossibile ottenere screenshot: {{screenshotError}}", - "selectElementInSource": "Seleziona un elemento nel codice per iniziare.", "Press Home Button": "Premere il pulsante Home", "Execute Siri Command": "Esegui comando Siri", "Press Back Button": "Premere il pulsante indietro", @@ -100,11 +89,11 @@ "Pause Recording": "Metti in pausa la registrazione", "Search for element": "Cerca un elemento", "App Source": "Sorgente dell'app", + "Collapse All": "Collapse All", "Toggle Attributes": "Attiva/disattiva attributi", "Copy XML Source to Clipboard": "Copia il sorgente XML negli appunti", "Download Source as .XML File": "Scarica Sorgente come file .XML", "Copy Attributes to Clipboard": "Copia gli attributi negli appunti", - "quitSessionAndClose": "Termina la sessione e chiudi l'inspector", "Session Inactive": "Sessione Inattiva", "Keep Session Running": "Mantieni Sessione In Esecuzione", "Quit Session": "Termina Sessione", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "L'utilizzo di localizzatori XPath non è raccomandato e può portare a test fragili. Chiedi invece al tuo team di sviluppo di fornire localizzatori unici di accessibilità!", "noAdditionalContextsFound": "Non sono stati rilevati contesti aggiuntivi", "contextDropdownInfo": "Rilevati contesti multipli; alcuni elementi potrebbero essere accessibili solo dopo il passaggio a un contesto diverso. Si noti che l'ispezione di visualizzazione web in Appium Inspector è meno accurata rispetto ai DevTools di Chrome o Safari. Per maggiori informazioni, consultare:", - "idAutocompletionCanBeDisabled": "Il selettore id richiesto non ha un prefisso per il nome del pacchetto. Questa sessione Appium ha l'autocompletamento abilitato per il nome del pacchetto, che può essere il motivo per cui nessun elemento è stato trovato. Per disabilitare questo comportamento, riavvia questa sessione con la funzionalità 'appium:disableIdLocatorAutocompletion' impostata su 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Potrebbero essere disponibili strategie di localizzatore aggiuntive. Per visualizzarle, aggiungi la funzionalità 'appium:automationName' all'avvio della sessione. Si noti che questa capability è obbligatoria con Appium2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Tocco", "Gathering initial app source…": "Ottenendo il sorgente iniziale dell'app…", "couldNotObtainSource": "Impossibile ottenere il sorgente: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "booleano", "number": "numero", "JSON object": "Oggetto JSON", - "filepath": "percorso", "connectToExistingSessionInstructions": "Se si dispone di una sessione già in esecuzione del tipo di server sopra, è possibile connettere un Inspector ad essa direttamente.", - "selectSessionIDInDropdown": "Seleziona l'ID di sessione nel menu a tendina qui sotto.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Consenti Certificati Non Autorizzati", "Use Proxy": "Usa Proxy", "JSON Representation": "Rappresentazione JSON", "Capability Builder": "Costruttore delle capability", "Saved Capability Sets": "Capability Salvate", - "Attach to Session": "Collegati alla sessione…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Porta", @@ -195,16 +184,19 @@ "Remote Path": "Percorso remoto", "BrowserStack Username": "Username di BrowserStack", "BrowserStack Access Key": "Access Key di BrowserStack", - "LambdaTest Username": "Username di LambdaTest", - "LambdaTest Access Key": "Access Key di LambdaTest", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "API Key di Bitbar", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Nome", "Description": "Descrizione", "Created": "Creato", "Actions": "Azioni", - "enterYourSessionId": "Inserisci qui l'ID della sessione", + "searchSessions": "Search discovered sessions", "Proxy URL": "Proxy URL", "Source": "Sorgente", "Commands": "Comandi", @@ -212,12 +204,14 @@ "Gestures": "Gesture", "Gesture Builder": "Costruttore Gesture", "Saved Gestures": "Gesture Salvate", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Qui crea, salva ed esegui gesti personalizzati. I gesti sono identici alle catene di azione nell'API delle azioni WebDriver W3C.", "Session Information": "Informazioni sulla sessione", "Execute Command": "Esegui il comando", "commandsDescription": "Esegue vari comandi usando il driver Appium corrente. Nota che non tutti i driver supportano tutti i comandi.", - "Click to Set Coordinates": "Fare clic per impostare le coordinate", - "Set Coordinates Via Field": "Imposta le coordinate tramite l'apposito campo", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Tipo di Azione", "Pointer Up": "Puntatore Su", "Pointer Down": "Puntatore Giù", @@ -234,29 +228,23 @@ "Left": "Sinistra", "Right": "Destra", "Play": "Avvia", + "Export to File": "Export to File", "Save Capability Set As": "Salva il set di capability come…", "Edit Raw JSON": "Modifica JSON", - "Enter Parameters for:": "Inserisci i parametri per:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "JSON non valido", - "Execute Script": "Esegui script", "App Management": "Gestione app", - "Clipboard": "Appunti", "File Transfer": "Trasferimento file", "Device Interaction": "Interazione con il dispositivo", - "Keyboard": "Tastiera", - "Connectivity": "Connettività", - "Performance Data": "Dati sulle prestazioni", - "System": "Sistema", "Session": "Sessione", "Web": "Web", "Context": "Contesto", - "Window (W3C)": "Finestra (W3C)", "simulatorOnly": "Solo emulatore/simulatore", "minAndroidSDK": "Livello minimo SDK Android", "Error": "Errore", "findingElementInSourceFailed": "Impossibile trovare l'elemento specificato. L'attuale sorgente dell'app o l'ID potrebbe essere cambiato, o ci possono essere troppi elementi con le stesse coordinate.", "callToMethodFailed": "Chiamata a '{{methodName}}' fallita", - "methodCallResult": "Risultato di '{{methodName}}'", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "Key di TestingBot", "TestingBot Secret": "Secret di TestingBot", "Appium Server": "Server Appium", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Unità Di Fatturazione Mobitru", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "La chiave di accesso di Mobitru è richiesta", "Session URL": "URL della sessione", "Server Details": "Dettagli del server", "Session Length": "Durata della sessione", "Session Details": "Dettagli della sessione", "Currently Active App ID": "Id App Attualmente Attivo", - "Session ID": "ID Sessione", "confirmDeletion": "Sei sicuro di voler eliminare questo elemento ?", "Copied!": "Copiato!", "Error Fetching Session URL": "Errore Nel Recupero Url Della Sessione", - "noResultsFound": "Nessun risultato trovato", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Tipo di capability non valido: {{type}}", - "whitespaceDetected": "Il testo inizia e/o termina con uno spazio bianco" + "whitespaceDetected": "Il testo inizia e/o termina con uno spazio bianco", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/ja/translation.json b/app/common/public/locales/ja/translation.json similarity index 71% rename from assets/locales/ja/translation.json rename to app/common/public/locales/ja/translation.json index 676045d94e..2d0c236b36 100644 --- a/assets/locales/ja/translation.json +++ b/app/common/public/locales/ja/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "縮小", "Reset Zoom Level": "拡大/縮小のリセット", "Close Window": "閉じる", - "Open Session File…": "セッションファイルを開く", "Bring All to Front": "すべてを手前に移動", "Help": "ヘルプ", "Appium Documentation": "Appium 関連のドキュメント", @@ -41,11 +40,10 @@ "Save Server Arguments Preset": "サーバー構成を事前設定として保存する", "Save": "保存", "Cancel": "キャンセル", - "datetimeFormat": "YYYY MMM Do, h:mma", "updateDetails": "リリース日: {{pubDate}}\n\nリリースノート: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} が入手可能です", "updateIsBeingDownloaded": "更新をダウンロードし始めました。完了し次第、お知らせします。", - "updateIsDownloaded": "Appium Inspector {{releaseName}} のダウンロードが完了しました。適用するにはアプリを再起動してください(Appium Inspectorをインストール、再起動するまでに数分かかることがあります)", + "updateIsDownloaded": "Appium Inspector {{releaseName}} のダウンロードが完了しました。適用するにはアプリを再起動してください(Appium Inspectorをインストール、再起動するまでに数分かかることがあります)", "updateDownloadFailed": "{{message}} のため更新のダウンロードに失敗しました", "OK": "OK", "Install Now": "今すぐインストールする", @@ -66,22 +64,13 @@ "frameworkNotSupported": "フレームワーク '{{framework}}' がサポートされていません", "findElementFailure": "'{{methodName}}' の要素検索に失敗しました。ページを更新しやり直してください。", "Could not start session": "セッションを開始できませんでした。", - "couldNotConnect": "'{{url}}' に接続できませんでした。 Appiumサーバーが起動、URLが正しいかどうかを確認してください(Appiumサーバーログの先頭に有効なURLが表示されています)。 Browser版Appium Inspectorを使用している場合は、サーバーが '--allow-cors' で起動されていることを確認してください。", + "couldNotConnect": "'{{url}}' に接続できませんでした。 Appiumサーバーが起動、URLが正しいかどうかを確認してください(Appiumサーバーログの先頭に有効なURLが表示されています)。 Browser版Appium Inspectorを使用している場合は、サーバーが '--allow-cors' で起動されていることを確認してください。", "Invalid URL:": "無効なURLです:", - "sauceCredentialsRequired": "Sauceのユーザー名とアクセス キーが必要です", - "testingbotCredentialsRequired": "TestingBotのキーとシークレットが必要です", - "Perfecto SecurityToken is required": "PerfectoのSecurityTokenが必要です", - "browserstackCredentialsRequired": "Browserstackのユーザ名とアクセスキーが必要です", - "lambdatestCredentialsRequired": "Lambdatest のユーザー名とアクセスキーが必要です", - "bitbarCredentialsRequired": "BitbarのAPIキーが必要です", - "kobitonCredentialsRequired": "Kobitonのユーザ名とアクセスキーが必要です", - "experitestAccessKeyURLRequired": "ExperitestのAccessKeyとURLが必要です", "experitestAccessKey": "ExperitestのAccessKey", "experitestUrl": "ExperitestのURL", "locatorStrategy": "ロケーター:", "selector": "セレクタ:", "couldNotObtainScreenshot": "スクリーンショットの取得に失敗しました: {{screenshotError}}", - "selectElementInSource": "ソース中の要素を選択してください", "Press Home Button": "ホームボタンを押す", "Execute Siri Command": "Siri コマンドを実行する", "Press Back Button": "戻るボタンを押す", @@ -100,11 +89,11 @@ "Pause Recording": "記録を一時停止", "Search for element": "要素を検索する", "App Source": "アプリのソース", + "Collapse All": "Collapse All", "Toggle Attributes": "属性の切り替え", "Copy XML Source to Clipboard": "XML形式でソースをクリップボードにコピーする", "Download Source as .XML File": ".XML ファイルとしてソースをダウンロードする", "Copy Attributes to Clipboard": "クリップボードに属性をコピーします", - "quitSessionAndClose": "セッションを閉じ、インスペクターを閉じます", "Session Inactive": "非アクティブなセッション", "Keep Session Running": "実行中のセッションを維持します", "Quit Session": "セッションを閉じる", @@ -120,7 +109,7 @@ "Start this Kind of Session with Code": "この種のセッションをコードで開始", "Clear Actions": "操作をクリアする", "Close Recorder": "レコーダーを閉じる", - "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here", + "enableRecordingAndPerformActions": "記録を有効にし、行なった操作に関するコードを表示します", "Recorder": "レコーダー", "Attribute": "属性", "Value": "値", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "壊れやすいテストになりやすいため、XPathロケータの利用はおすすめされません。開発者と協力してユニークなaccessibilityロケータへの置き換えを検討してください。", "noAdditionalContextsFound": "追加のコンテキストはありません", "contextDropdownInfo": "複数のコンテキストが検出されています。特定の要素は、適切なコンテキストに切り替えた後に操作可能です。 Appium Inspector のWebviewサポートはChromeまたはSafariのDevToolsよりも正確ではないことに注意してください。詳細については、次を参照してください:", - "idAutocompletionCanBeDisabled": "要求された id セレクターにはパッケージ名の接頭辞がありません。 このAppiumセッションにはパッケージ名の自動補完が有効なため、自動保管により要素が見つからなかった可能性があります。 この自動補完機能を無効にするには、'appium:disableIdLocatorAutocompletion' を 'true' に設定してセッションを開始してください。", + "idAutocompletionCanBeDisabled": "要求された id セレクターにはパッケージ名の接頭辞がありません。 このAppiumセッションにはパッケージ名の自動補完が有効なため、自動補完により要素が見つからなかった可能性があります。 この自動補完機能を無効にするには、'appium:disableIdLocatorAutocompletion' を 'true' に設定してセッションを開始してください。", "missingAutomationNameForStrategies": "追加のロケーターが利用できるかもしれません。これらを表示するには、セッションを起動するときに”appium:automationName\"を追加します。 Appium 2ではこの機能が必須であることに注意してください。", + "snapshotMaxDepthReached": "この要素はソースの最深部 {{selectedElementDepth}} に位置しますが、子要素は何も表示されていません。取得可能な子要素を表示するには、Settings API から'snapshotMaxDepth' の値を {{selectedElementDepth}} より大きな値変更してください。可能な最大値はドライバーのドキュメントを確認してください。", "Tap": "タップ", "Gathering initial app source…": "アプリのソースを取得しています…", "couldNotObtainSource": "ソースを取得できませんでした: {{errorMsg}}", @@ -144,7 +134,7 @@ "saveAs": "名前をつけて保存", "attachToSession": "セッションに接続する", "selectedElement": "選択された要素", - "unnamed": "(Unnamed)", + "unnamed": "(名前なし)", "No Description": "説明なし", "couldNotFindEntryWithId": "ID {{id}} の要素が見つかりませんでした", "couldNotFindAnyElements": "要素を見つけられませんでした", @@ -161,15 +151,14 @@ "boolean": "ブール値", "number": "数字", "JSON object": "JSONオブジェクト", - "filepath": "ファイルパス", - "connectToExistingSessionInstructions": "上記のサーバタイプにおける実行中セッションがある場合、インスペクタを直接接続することができます", - "selectSessionIDInDropdown": "以下のドロップダウンからセッションIDを選択してください", + "connectToExistingSessionInstructions": "上記のサーバーに実行中のセッションがすでにある場合、インスペクタを直接接続することができます", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "認可されていない証明書を許可する", "Use Proxy": "プロキシを使用する", "JSON Representation": "JSONで表示", "Capability Builder": "Capability生成", "Saved Capability Sets": "保存されたCapability", - "Attach to Session": "実行中のセッションに接続…", + "Attach": "Attach", "localhost": "ローカルホスト", "Host": "ホスト", "Port": "ポート", @@ -195,16 +184,19 @@ "Remote Path": "リモートパス", "BrowserStack Username": "Browserstackのユーザ名", "BrowserStack Access Key": "Browserstackのアクセスキー", - "LambdaTest Username": "LambdaTest のユーザー名", - "LambdaTest Access Key": "LambdaTest のアクセスキー", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "BitbarのAPIキー", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "追加", "Name": "キー名", - "Description": "Description", - "Created": "Created", + "Description": "備考", + "Created": "作成日", "Actions": "操作", - "enterYourSessionId": "セッションIDを入力してください", + "searchSessions": "Search discovered sessions", "Proxy URL": "プロキシURL", "Source": "ソース", "Commands": "コマンド", @@ -212,12 +204,14 @@ "Gestures": "ジェスチャー", "Gesture Builder": "ジェスチャーの構築", "Saved Gestures": "保存されたジェスチャー", + "Create New Gesture": "新しい操作を記録する", "gesturesDescription": "ここでカスタムジェスチャーを作成、保存、実行します。ジェスチャーは W3C WebDriver Actions API と同じです。", "Session Information": "セッション情報", "Execute Command": "コマンドを実行", "commandsDescription": "現在のAppiumドライバを使用してさまざまなコマンドを実行します。すべてのドライバがすべてのコマンドをサポートしているわけではありません。", - "Click to Set Coordinates": "クリックして座標を設定する", - "Set Coordinates Via Field": "フィールドで座標を設定する", + "showMoveActionCoordsInPercentage": "画面の寸法%に移動アクションの座標を表示する", + "showMoveActionCoordsInPixels": "移動アクションの座標をピクセルで表示する", + "toggleMoveActionCoordPicker": "スクリーンショットをクリックして座標を設定する", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "名前をつけてCapabilityを保存", "Edit Raw JSON": "直接JSONを編集する", - "Enter Parameters for:": "パラメータを入力する:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "無効なJSON形式です", - "Execute Script": "スクリプトを実行する", "App Management": "アプリ操作", - "Clipboard": "クリップボード", "File Transfer": "ファイル転送", "Device Interaction": "端末操作", - "Keyboard": "キーボード", - "Connectivity": "接続", - "Performance Data": "パフォーマンスデータ", - "System": "システム", "Session": "セッション", "Web": "Web", "Context": "コンテキスト", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "エミュレータ/シミュレータのみ", "minAndroidSDK": "最小のAndroid SDK", "Error": "エラー", "findingElementInSourceFailed": "指定した要素が見つかりませんでした。 現在のアプリケーションのソースまたは要素IDが変更されているか、または同じ座標を持つ要素が多すぎる可能性があります。", "callToMethodFailed": "'{{methodName}}'の実行に失敗しました", - "methodCallResult": "'{{methodName}}' の結果", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "TestingBotキー", "TestingBot Secret": "TestingBotシークレット", "Appium Server": "Appiumサーバー", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru 課金ユニット", "Mobitru Access Key": "Mobitru のアクセスキー", - "mobitruCredentialsRequired": "Mobitru のアクセスキーが必要です", "Session URL": "Session URL", "Server Details": "サーバーの詳細", "Session Length": "セッションの長さ", "Session Details": "セッションの詳細", "Currently Active App ID": "現在アクティブなアプリID", - "Session ID": "セッション ID", "confirmDeletion": "削除してもよろしいですか?", "Copied!": "コピーしました", "Error Fetching Session URL": "セッションURLの取得に失敗しました", - "noResultsFound": "一致する結果が見つかりませんでした", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "無効な Capability: {{type}}", - "whitespaceDetected": "空白文字で開始または終了します" + "whitespaceDetected": "空白文字で開始または終了します", + "duplicateCapabilityNameError": "同じ名前のcapabilitiesが既に存在します", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "無効なセッションファイル", + "TV Labs API Key": "TV LabsのAPIキー", + "TestcribeAPIKey": "Testcribe APIキー", + "sessionTestcribeApiKeyDescription": "APIキーは https://app.testcribe.com/settings/apiKeys から入手できます", + "missingVendorProperties": "{{vendorName}} に関する以下の情報を入力してください : {{vendorProps}}", + "missingServerInfo": "サーバー情報がありません。セッションをクエリできませんでした", + "Username": "ユーザ名", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API キー", + "Access Key": "アクセスキー", + "SecurityToken": "セキュリティトークン", + "AccessToken": "アクセストークン", + "Token": "トークン", + "Key": "キー", + "Secret": "シークレット", + "Theme": "Theme", + "Light Theme": "ライトテーマ", + "Dark Theme": "ダークテーマ", + "System Theme": "システムテーマ", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/kn/translation.json b/app/common/public/locales/kn/translation.json similarity index 78% rename from assets/locales/kn/translation.json rename to app/common/public/locales/kn/translation.json index 62c06aacf6..39801d6889 100644 --- a/assets/locales/kn/translation.json +++ b/app/common/public/locales/kn/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "ಎಲ್ಲಾವನ್ನು ಮುಂದೆ ತನ್ನಿ", "Help": "ಸಹಾಯ", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "ಸರ್ವರ್ ಆರ್ಗ್ಯುಮೆಂಟ್ಸ್ ಪ್ರಿಸೆಟ್ನ ಸಂಗ್ರಹಿಸಿ", "Save": "ಸಂಗ್ರಹಿಸಿ", "Cancel": "ರದ್ದು ಮಾಡಿ", - "datetimeFormat": "MMM Do YYYY, h:mma", "updateDetails": "ಬಿಡುಗಡೆ ದಿನಾಂಕ: {{pubDate}}\n\nಬಿಡುಗಡೆ ಕೈಪತ್ರ: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} is available", "updateIsBeingDownloaded": "ನವೀಕರಣಗಳು ಡೌನ್ಲೋಡ್ ಆಗುತ್ತಿವೆ. ಡೌನ್ಲೋಡ್ ಮುಗಿದ ನಂತರ ನಿಮಗೆ ತಿಳಿಸಲಾಗುವುದು.", @@ -68,20 +66,11 @@ "Could not start session": "ಸೆಷನ್ ಶುರು ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "ಸೌಸ್ ವ್ಯವಹಾರಾಂಕಿತ ಮತ್ತು ಆಕ್ಸೆಸ್ ಕೀ ಅವಶ್ಯ ಬೇಕಿದೆ!", - "testingbotCredentialsRequired": "ಟೆಸ್ಟಿಂಗ್ ಬೋಟ್ ಕೀ ಮತ್ತು ಸೀಕ್ರೆಟ್ ಕೀ ಅವಶ್ಯ ಬೇಕಿದೆ!", - "Perfecto SecurityToken is required": "ಪೆರ್ಫೆಕ್ಟೋ ಸೆಕ್ಯೂರಿಟಿ ಟೋಕನ್ ಅವಶ್ಯ ಬೇಕಿದೆ", - "browserstackCredentialsRequired": "ಬ್ರೌಸರ್ಸ್ಟ್ಯಾಕ್ ವ್ಯವಹಾರಾಂಕಿತ ಮತ್ತು ಆಕ್ಸೆಸ್ ಕೀ ಅವಶ್ಯ ಬೇಕಿದೆ!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "ಬಿಟ್ಬಾರ್ API ಕೀ ಅವಶ್ಯ ಬೇಕಿದೆ!", - "kobitonCredentialsRequired": "ಕೋಬಿಟೋನ್ ವ್ಯವಹಾರಾಂಕಿತ ಮತ್ತು API ಕೀ ಅವಶ್ಯ ಬೇಕಿದೆ!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "ಲೊಕೇಟರ್ ಸ್ಟ್ರಾಟೆಜಿ:", "selector": "ಸೆಲೆಕ್ಟರ್:", "couldNotObtainScreenshot": "ಸ್ಕ್ರೀನ್ ಶಾಟ್ ಪಡೆಯಲಾಗಲಿಲ್ಲ: {{screenshotError}}", - "selectElementInSource": "ಶುರು ಮಾಡಲಿಕ್ಕೆ ಸೌರ್ಸ್ನಲ್ಲಿರುವ ಎಲಿಮೆಂಟ್ನ ಆಯ್ಕೆ ಮಾಡಿ.", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "ರೆಕಾರ್ಡಿಂಗ್ನನ್ನು ವಿರಾಮಿಸಿ", "Search for element": "ಈ ಎಲಿಮೆಂಟ್ನನ್ನು ಹುಡುಕಿ", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "XML ಸೋರ್ಸ್ನನ್ನು ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ನಕಲು ಮಾಡಿ", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "ಅಟ್ರಿಬ್ಯೂಟ್ಸ್ನನ್ನು ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ನಕಲು ಮಾಡಿ", - "quitSessionAndClose": "ಇನ್ಸ್ಪೆಕ್ಟರ್ನನ್ನು ಮುಚ್ಚಿ ಸೆಷನ್ನಿಂದ ನಿರ್ಗಮಿಸಿ", "Session Inactive": "ಸೆಷನ್ ನಿಷ್ಕ್ರಿಯವಾಗಿದೆ", "Keep Session Running": "ಸೆಷನ್ನನ್ನು ಚಾಲ್ತಿಯಲ್ಲಿಡಿ", "Quit Session": "ಸೆಷನ್ನನ್ನು ನಿರ್ಗಮಿಸಿ", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "XPath ಲೋಕೆಟರ್ಸ್ ಬಳಸಬೇಕು ಎಂಬುದು ನಮ್ಮ ಸಲಹೆಯಲ್ಲ ಹಾಗು ಇದು ಟೆಸ್ಟ್ನನ್ನ ಅಸ್ಥಿರ ಮಾಡಬಹುದು. ಅನುಪಮವಾದ ಅಕ್ಸೆಸೆಸಿಬಿಲಿಟಿ ಲೋಕೆಟರ್ಸ್ನನ್ನು ನಿಮ್ಮ ಡೆವಲಪ್ಮೆಂಟ್ ತಂಡದಿಂದ ಕೇಳಿ ಪಡೆದು ಬಳಸಿ!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "ಟ್ಯಾಪ್", "Gathering initial app source…": "ಅಪ್ಪ್ ಆರಂಭಿಕ ಮೂಲವನ್ನು ಸಂಗ್ರಹಿಸಲಾಗುತ್ತಿದೆ…", "couldNotObtainSource": "ಮೂಲ ವಿವರವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "ಬೂಲಿಯನ್", "number": "ನಂಬರ್", "JSON object": "JSON ಆಬ್ಜೆಕ್ಟ್", - "filepath": "ಫೈಲ್ ಪಥ್", "connectToExistingSessionInstructions": "ನಿಮ್ಮ ಬಳಿ ಮೇಲೆ ಆಯ್ಕೆಯಾದ ಸರ್ವರ್ನ ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಸೆಷನ್ ಇದ್ದಾರೆ, ಅದಕ್ಕೆ ಇನ್ಸ್ಪೆಕ್ಟರ್ನ ನೀವು ಲಗತ್ತಿಸಬಹುದು.", - "selectSessionIDInDropdown": "ಸೆಷನ್ ಸಂಖ್ಯೆಯನ್ನು ಡ್ರಾಪ್ ಡೌನ್ ಬಾಕ್ಸ್ನಿಂದ ಆಯ್ಕೆ ಮಾಡಿ.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "ಅನಧಿಕೃತ ಸರ್ಟಿಫೀಕೆಟ್ಸ್ನನ್ನು ಅನುಮತಿಸಿ", "Use Proxy": "ಪ್ರೋಕ್ಸಿ ಬಳಸಿ", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "ಈ ಸರ್ವರ್ ಸೆಷನ್ಗೆ ಲಗತ್ತಿಸಿ…", + "Attach": "Attach", "localhost": "ಲೋಕಲ್ ಹೋಸ್ಟ್", "Host": "ಹೋಸ್ಟ್", "Port": "ಪೋರ್ಟ್", @@ -195,16 +184,19 @@ "Remote Path": "ರಿಮೋಟ್ ವಿಳಾಸ ಪಥ", "BrowserStack Username": "ಬ್ರೌಸರ್ಸ್ಟ್ಯಾಕ್ ಯೂಸರ್ ನೇಮ್", "BrowserStack Access Key": "ಬ್ರೌಸರ್ಸ್ಟ್ಯಾಕ್ ಪ್ರವೇಶ ಕೀ", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "ಬಿಟ್ಬಾರ್ API ಕೀ", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "ಹೆಸರು", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "ನಿಮ್ಮ ಸೆಷನ್ ID ಇಲ್ಲಿ ಬರೆಯಿರಿ", + "searchSessions": "Search discovered sessions", "Proxy URL": "ಪ್ರೋಕ್ಸಿ URL", "Source": "ಸೌರ್ಸ್", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "ಕ್ಯಾಪೆಬಿಲಿಟಿ ಸೆಟ್ನನ್ನ ಈ ಹೆಸರಲಿ ಸಂಗ್ರಹಿಸಿ…", "Edit Raw JSON": "ಮೂಲ JSON ತಿದ್ದಿರಿ", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "ಕ್ಲಿಪ್ಬೋರ್ಡ್", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "ಪರ್ಫಾರ್ಮೆನ್ಸ್ ಡಾಟಾ", - "System": "ಸಿಸ್ಟಮ್", "Session": "ಸೆಷನ್", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "ಎರರ್", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "ಈ ಮೆಥಡ್ಗೆ '{{methodName}}' ಕರೆ ವಿಫಲವಾಗಿದೆ", - "methodCallResult": "'{{methodName}}' ಫಲಿತಾಂಶ", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "ಟೆಸ್ಟಿಂಗ್ ಬೋಟ್ ಕೀ", "TestingBot Secret": "ಟೆಸ್ಟಿಂಗ್ ಬೋಟ್ ಸೀಕ್ರೆಟ್", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/app/common/public/locales/ko/translation.json b/app/common/public/locales/ko/translation.json new file mode 100644 index 0000000000..af239b53c7 --- /dev/null +++ b/app/common/public/locales/ko/translation.json @@ -0,0 +1,331 @@ +{ + "appiumInspector": "Appium Inspector", + "Edit": "변경", + "Redo": "재실행", + "Cut": "자르기", + "Copy": "복사", + "Paste": "붙여넣기", + "Delete": "삭제", + "Select All": "전체 선택", + "Window": "윈도우", + "Minimize": "축소하기", + "Zoom": "줌", + "Zoom In": "줌 인", + "Zoom Out": "줌 아웃", + "Reset Zoom Level": "줌 레벨 리셋", + "Close Window": "창 닫기", + "Bring All to Front": "모두 전면으로 가져오기", + "Help": "도움", + "Appium Documentation": "Appium 문서", + "Inspector Documentation": "Inspector 문서", + "Appium Discussion Forum": "Appium 토론 포럼", + "Report Issues": "문제 신고", + "About Appium Inspector": "Appium Inspector 대해", + "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n", + "Improve Translations": "번역 개선", + "Check for Updates…": "업데이트 확인", + "File": "파일", + "New Window": "새 창 열기", + "Hide Appium Inspector": "Appium Inspector 숨기기", + "Hide Others": "다른 프로그램 숨기기", + "Show All": "모두 보이기", + "Quit Appium Inspector": "Appium Inspector 닫기", + "Toggle Full Screen": "풀 스크린", + "Languages": "언어", + "View": "보기", + "Reload": "새로 고침", + "Toggle Developer Tools": "Developer Tools 열기", + "Undo": "실행 취소", + "Restart Now": "지금 재시작하기", + "Save Server Arguments Preset": "서버 인수 프리셋 저장", + "Save": "저장", + "Cancel": "취소", + "updateDetails": "출시일: {{pubDate}}\n\n릴리즈 정보: {{notes}}", + "appiumIsAvailable": "Appium Inspector {{name}} 사용이 가능합니다", + "updateIsBeingDownloaded": "업데이트를 다운로드 중 입니다. 다운로드가 완료되면 다시 알려드립니다.", + "updateIsDownloaded": "Appium Inspector {{releaseName}} 다운로드가 완료되었습니다. 업데이트를 적용하려면 다시 시작해야합니다. (참고 : Appium Inspector을 설치하고 다시 시작하는 데 몇 분 정도 걸릴 수 있습니다.)", + "updateDownloadFailed": "업데이트 다운로드에 실패했습니다. 이유: {{message}}", + "OK": "OK", + "Install Now": "지금 설치하기", + "Install Later": "나중에 설치하기", + "Update Download Started": "업데이트 다운로드 시작", + "No update available": "다운로드가 가능한 업데이트가 없습니다", + "Appium Inspector is up-to-date": "최신 버전의 Appium Inspector를 사용중입니다", + "Later": "나중에", + "Update Downloaded": "업데이트 다운로드", + "Could not download update": "업데이트를 다운로드 할 수 없습니다", + "Unexpected Error:": "예기치 않은 오류", + "Please report this issue at:": "이 문제를 신고해 주세요:", + "Full error trace:": "전체 오류 추적:", + "Copy Error Trace": "오류 추척 복사", + "Inspect element": "Element 점검", + "Session closed due to inactivity": "비활성으로 인해 세션이 닫혔습니다", + "Session has been terminated": "세션이 종료되었습니다", + "frameworkNotSupported": "'{{framework}}' 프레임워크는 지원되지 않습니다", + "findElementFailure": "'{{methodName}}'에 대한 element를 찾지 못했습니다. 페이지를 새로고침하고 다시 시도해보세요.", + "Could not start session": "세션을 시작할 수 없습니다", + "couldNotConnect": "Appium 서버 URL '{{url}}'에 연결할 수 없습니다. 서버가 실행 중이고 URL이 올바른지 확인해 주세요(유효한 URL은 Appium 서버 로그 시작 시 확인할 수 있습니다). 인스펙터의 브라우저 버전을 사용하는 경우, 서버가 '--allow-cors'로 시작되었는지 확인하세요.", + "Invalid URL:": "잘못된 URL:", + "experitestAccessKey": "Experitest AccessKey", + "experitestUrl": "Experitest Url", + "locatorStrategy": "Locator Strategy:", + "selector": "Selector:", + "couldNotObtainScreenshot": "스크린샷을 가져올 수 없습니다: {{screenshotError}}", + "Press Home Button": "홈 버튼 누르기", + "Execute Siri Command": "Siri 명령 실행", + "Press Back Button": "이전 버튼 누르기", + "Press App Switch Button": "앱 전환 버튼 누르기", + "Command": "커맨드", + "Show Element Handles": "요소 핸들 표시", + "Hide Element Handles": "요소 핸들 숨기기", + "Select Elements": "Element 선택하기", + "Tap/Swipe By Coordinates": "좌표별 탭/스와이프", + "Download Screenshot": "스크린샷 다운로드", + "Back": "뒤로가기", + "Start Refreshing Source": "소스 새로고침 시작", + "Pause Refreshing Source": "소스 새로고침 중지", + "refreshSource": "소스 & 스크린샷 새로고침", + "Start Recording": "녹화 시작하기", + "Pause Recording": "녹화 일시정지", + "Search for element": "Element 검색하기", + "App Source": "앱 소스", + "Collapse All": "모두 접기", + "Toggle Attributes": "토글 속성", + "Copy XML Source to Clipboard": "XML Source 클립보드에 복사", + "Download Source as .XML File": " .XML File로 다운로드", + "Copy Attributes to Clipboard": "Attributes 클립보드애 복사하기", + "Session Inactive": "세션 비활성", + "Keep Session Running": "실행중인 세션 유지", + "Quit Session": "세션 종료", + "Your session is about to expire": "세션이 곧 만료됩니다", + "Enter Keys to Send": "전송할 키 입력", + "Find and Select in Source": "소스 찾기 및 선택", + "Clear": "Clear", + "Send Keys": "Send Keys", + "Done": "완료", + "Search": "검색", + "Show/Hide Boilerplate Code": "Boilerplate Code 보이기/숨기기", + "Copy code to clipboard": "Code 클립보드에 복사", + "Start this Kind of Session with Code": "이 유형의 세션을 코드로 시작", + "Clear Actions": "Clear Actions", + "Close Recorder": "Recorder 닫기", + "enableRecordingAndPerformActions": "애플리케이션 헤더에서 녹화를 활성화한 뒤, 여기 코드가 표시되도록 몇 가지 동작을 수행하세요", + "Recorder": "Recorder", + "Attribute": "속성", + "Value": "값", + "Find By": "Find By", + "Selector": "Selector", + "Time": "시간 (ms)", + "Get Timing": "타이밍 확인하기", + "interactionsNotAvailable": "이 요소와의 상호작용을 사용할 수 없을 수 있습니다.", + "usingXPathNotRecommended": "XPath 로케이터를 사용하는 것은 권장하지 않으며, 불안정한 테스트로 이어질 수 있습니다. Accessibility 로케이터를 제공하도록 개발 팀에 요청하세요!", + "noAdditionalContextsFound": "추가 컨텍스트가 감지되지 않았습니다", + "contextDropdownInfo": "여러 컨텍스트가 감지되었습니다. 일부 요소는 다른 컨텍스트로 전환한 후에만 접근할 수 있습니다. Appium Inspector에서의 웹뷰 검사는 Chrome 또는 Safari의 DevTools보다 정확도가 떨어질 수 있습니다. 자세한 내용은 아래를 참조하세요:", + "idAutocompletionCanBeDisabled": "요청한 ID 셀렉터에는 패키지 이름 접두사가 없습니다. 이 Appium 세션에서는 패키지 이름 자동 완성 기능이 활성화되어 있어, 이 때문에 요소를 찾지 못했을 수 있습니다. 이 동작을 비활성화하려면 'disableIdLocatorAutocompletion' 설정을 'true'로 변경하세요", + "missingAutomationNameForStrategies": "추가 로케이터 전략을 사용할 수 있습니다. 이러한 전략을 보려면 세션을 시작할 때 'appium:automationName' 기능(capability)을 추가하세요. 이 기능은 Appium 2에서 필수입니다", + "snapshotMaxDepthReached": "이 요소는 소스 트리의 최대 깊이 {{selectedElementDepth}}에 위치해 있어, 자식 요소(있는 경우)는 표시되지 않습니다. 자식 요소를 보려면 'snapshotMaxDepth' 설정 값을 {{selectedElementDepth}}보다 크게 변경하세요. 설정 가능한 최대 값은 사용하는 드라이버의 문서를 참고하세요.", + "Tap": "탭", + "Gathering initial app source…": "초기 어플리케이션 소스 수집중…", + "couldNotObtainSource": "소스를 얻을 수 없습니다: {{errorMsg}}", + "iOS": "iOS", + "Android": "Android", + "desiredCapabilitiesDocumentation": "Capabilities 문서", + "startSession": "세션 시작하기", + "saveAs": "새로 저장하기", + "attachToSession": "세션에 연결하기", + "selectedElement": "선택된 Element", + "unnamed": "(이름없음)", + "No Description": "설명 없음", + "couldNotFindEntryWithId": "ID {{id}}에 해당하는 항목을 찾을 수 없습니다", + "couldNotFindAnyElements": "어떠한 element도 찾을 수 없습니다", + "elementsCount": "요소 찾기", + "xCoordinate": "X: {{x}}", + "yCoordinate": "Y: {{y}}", + "SauceLabs Data Center": "SauceLabs 데이터 센터", + "US-West": "US West 1", + "US-East": "US East 4", + "EU-Central": "EU Central 1", + "proxyThroughSC": "Sauce Connect의 Selenium Relay를 통한 프록시", + "SSL": "SSL", + "text": "text", + "boolean": "boolean", + "number": "number", + "JSON object": "JSON object", + "connectToExistingSessionInstructions": "위의 서버 유형에 대해 이미 실행중인 세션이있는 경우, Inspector에 직접 연결 할 수 있습니다.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", + "allowUnauthorizedCerts": "승인되지 않은 인증서 허용", + "Use Proxy": "Proxy 사용", + "JSON Representation": "JSON 표현", + "Capability Builder": "Capability 빌더", + "Saved Capability Sets": "저장된 Capability 세트", + "Attach": "Attach", + "localhost": "localhost", + "Host": "호스트", + "Port": "포트", + "usingDataFoundIn": "{{environmentVariable}}에서 발견된 데이터 사용", + "yourUsername": "사용자 이름", + "Sauce Username": "Sauce 사용자 이름", + "Sauce Access Key": "Sauce 엑세스 키", + "yourAccessKey": "Your 엑세스 키", + "yourApiKey": "Your API 키", + "Perfecto Host": "Perfecto 호스트", + "Perfecto Port": "Perfecto 포트", + "Pcloudy User Name": "Pcloudy 사용자 이름", + "Pcloudy Host": "Pcloudy 호스트", + "Pcloudy API Key": "Pcloudy API 키", + "Add your token": "토큰을 추가하세요", + "Perfecto Token": "Perfecto 토큰", + "Your Kobiton Username": "Kobiton 사용자 이름", + "Kobiton Access Key": "Kobiton 엑세스 키", + "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL", + "sessionHeadspinWebDriverURLDescription": "자동화 구성 경로를 사용하여 HeadSpin UI 또는 HeadSpin API에서 URL 가져오기", + "Remote Host": "원격 호스트", + "Remote Port": "원격 포트", + "Remote Path": "원격 경로", + "BrowserStack Username": "BrowserStack 사용자 이름", + "BrowserStack Access Key": "BrowserStack 엑세스 키", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", + "Bitbar API Key": "Bitbar API 키", + "RemoteTestKit AccessToken": "RemoteTestKit 액세스 토큰", + "RobotQA Token": "RobotQA 토큰", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "추가", + "Name": "이름", + "Description": "설명", + "Created": "생성", + "Actions": "액션", + "searchSessions": "Search discovered sessions", + "Proxy URL": "프록시 URL", + "Source": "소스", + "Commands": "커맨드", + "Execute Commands": "커맨드 실행", + "Gestures": "제스처", + "Gesture Builder": "제스처 빌더", + "Saved Gestures": "제스처 저장", + "Create New Gesture": "새 제스처 만들기", + "gesturesDescription": "여기에서 사용자 정의 제스처를 생성·저장하고 실행할 수 있습니다. 제스처는 W3C WebDriver Actions API의 액션 체인과 동일합니다", + "Session Information": "세션 정보", + "Execute Command": "커맨드 실행", + "commandsDescription": "현재 Appium 드라이버를 사용해 다양한 명령을 실행할 수 있습니다. 모든 드라이버가 모든 명령을 지원하는 것은 아니라는 점에 유의하세요.", + "showMoveActionCoordsInPercentage": "이동 동작의 좌표를 화면 크기 대비 백분율로 표시", + "showMoveActionCoordsInPixels": "이동 동작의 좌표를 픽셀 단위로 표시", + "toggleMoveActionCoordPicker": "스크린샷 클릭으로 좌표 설정 기능을 켜기/끄기", + "Action Type": "액션 타입", + "Pointer Up": "포인터 위로", + "Pointer Down": "포인터 아래로", + "Pause": "일시정지", + "Move": "이동", + "Action Type Not Defined": "액션 타입이 정의되지 않음", + "Duration": "지속시간", + "Button": "버튼", + "Untitled Gesture": "이름없는 제스처", + "Add Description": "설명 추가", + "Gesture saved": "제스처 저장됨", + "Gesture saved as": " '{{gestureName}}'로 제스처 저장됨", + "Duplicate pointer names are not allowed": "포인터 이름이 중복될 수 없습니다", + "Left": "왼쪽", + "Right": "오른쪽", + "Play": "플레이", + "Export to File": "Export to File", + "Save Capability Set As": "Capability 셋 새로 저장하기", + "Edit Raw JSON": "Raw JSON 변경", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", + "invalidJson": "잘못된 JSON", + "App Management": "앱 관리", + "File Transfer": "파일 전송", + "Device Interaction": "디바이스 상호작용", + "Session": "세션", + "Web": "웹", + "Context": "컨텍스트", + "simulatorOnly": "에뮬레이터/시뮬레이터 전용", + "minAndroidSDK": "최소 Android SDK 레벨", + "Error": "에러", + "findingElementInSourceFailed": "지정된 요소를 찾을 수 없습니다. 현재 애플리케이션 소스나 요소 ID가 변경되었거나, 동일 좌표에 여러 요소가 존재할 수 있습니다.", + "callToMethodFailed": "'{{methodName}}' 호출에 실패했습니다", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", + "TestingBot Key": "TestingBot 키", + "TestingBot Secret": "TestingBot 시크릿", + "Appium Server": "Appium 서버", + "Select Cloud Providers": "클라우스 서비스 선택", + "Advanced Settings": "고급 설정", + "Native App Mode": "Native App 모드", + "Web/Hybrid App Mode": "Web/Hybrid App 모드", + "autoAddPrefixes": "시작 시 필요한 Appium 벤더 프리픽스를 자동으로 추가", + "attachSessionNotRunning": "제공된 서버에서 세션 {{attachSessId}}가 실행 중인지 확인할 수 없습니다. 다시 세션에 연결하기 전에 정보를 확인해 주세요.", + "Mobitru WebDriver URL": "Mobitru WebDriver 주소", + "Mobitru Billing Unit": "Mobitru 요금 단위", + "Mobitru Access Key": "Mobitru 엑세스 키", + "Session URL": "세션 URL", + "Server Details": "서버 세부 정보", + "Session Length": "세션 길이", + "Session Details": "세션 세부 정보", + "Currently Active App ID": "현재 활성화된 앱 ID", + "confirmDeletion": "정말 이 항목을 삭제하시겠습니까?", + "Copied!": "복사됨!", + "Error Fetching Session URL": "세션 URL 조회 오류", + "noRunningSessionsFound": "No running sessions found", + "invalidCapType": "유효하지 않은 capability 타입: {{type}}", + "whitespaceDetected": "텍스트의 시작 또는 끝에 공백이 있습니다.", + "duplicateCapabilityNameError": "같은 이름의 capability 세트가 이미 존재합니다.", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "잘못된 세션 파일", + "TV Labs API Key": "TV Labs API 키", + "TestcribeAPIKey": "Testcribe API 키", + "sessionTestcribeApiKeyDescription": "API 키는 https://app.testcribe.com/settings/apiKeys에서 확인할 수 있습니다", + "missingVendorProperties": "{{vendorName}}의 서버 정보를 다음과 같이 입력해 주세요: {{vendorProps}}", + "missingServerInfo": "서버 정보가 누락되어 세션을 조회할 수 없습니다", + "Username": "사용자 이름", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "액세스 키", + "SecurityToken": "보안 토큰", + "AccessToken": "액세스 토큰", + "Token": "토큰", + "Key": "키", + "Secret": "시크릿", + "Theme": "Theme", + "Light Theme": "라이트 테마", + "Dark Theme": "다크 테마", + "System Theme": "시스템 테마", + "Search Source": "검색 소스", + "Matching Elements": "요소 매칭", + "webmateApiKey": "webmate API 키", + "yourProjectId": "당신의 Project ID", + "webmateProjectId": "webmate 프로젝트ID", + "specifyWebmateHostExplicitly": "webmate 호스트를 명시적으로 지정", + "webmateHost": "webmate 호스트", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "당신의 Fireflink DeviceFarm 도메인 (예: cloud.fireflink.com)", + "yourLicenseId": "당신의 라이센스 ID", + "yourProjectName": "당신의 프로젝트 이름", + "License ID": "라이센스ID", + "Project Name": "프로젝트 이름", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm 도메인", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm 액세스 키", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm 라이센스ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm 프로젝트 이름", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "디바이스 연결이 끊어졌습니다 – 세션을 재시작합니다…", + "ToggleRestartSession": "디바이스 연결 해제 시 세션 리로드 토글", + "toggleTableFormatting": "테이블 서식 토글", + "copyResultToClipboard": "결과를 클립보드에 복사", + "Property": "속성", + "noCapsFound": "세션 capability 정보를 찾을 수 없습니다. Capability Builder를 사용해 capability 세트를 편집, 추가, 저장하세요. 자세한 내용은 {{url}}의 튜토리얼을 참고하세요", + "executeMethods": "메서드 실행", + "dynamicCommandsDescription": "현재 활성 드라이버 및 플러그인이 지원하는 명령어만 실행할 수 있습니다. 일부 명령어는 특정 컨텍스트에서만 동작할 수 있으니 유의하세요. WebdriverIO에서 지원하지 않는 명령어는 이 목록에 포함되어 있지 않습니다", + "dynamicExecuteMethodsDescription": "현재 활성화된 드라이버와 플러그인에서 지원하는 모든 execute 메서드를 실행할 수 있습니다", + "methodDeprecated": "이 메서드는 더 이상 권장되지 않습니다", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" +} diff --git a/assets/locales/nl/translation.json b/app/common/public/locales/lt/translation.json similarity index 72% rename from assets/locales/nl/translation.json rename to app/common/public/locales/lt/translation.json index a0dd36cde1..9ad71e149c 100644 --- a/assets/locales/nl/translation.json +++ b/app/common/public/locales/lt/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "Bring All to Front", "Help": "Help", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Save Server Arguments Preset", "Save": "Save", "Cancel": "Cancel", - "datetimeFormat": "MMM Do YYYY, h:mma", "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} is available", "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", @@ -68,20 +66,11 @@ "Could not start session": "Could not start session", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "Sauce username and access key are required!", - "testingbotCredentialsRequired": "TestingBot key and secret are required!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken is required", - "browserstackCredentialsRequired": "Browserstack username and access key are required!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "Bitbar API key required!", - "kobitonCredentialsRequired": "KOBITON username and api key are required!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "Locator Strategy:", "selector": "Selector:", "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", - "selectElementInSource": "Select an element in the source to begin.", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "Pause Recording", "Search for element": "Search for element", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", - "quitSessionAndClose": "Quit Session & Close Inspector", "Session Inactive": "Session Inactive", "Keep Session Running": "Keep Session Running", "Quit Session": "Quit Session", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Tap", "Gathering initial app source…": "Gathering initial app source…", "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "boolean", "number": "number", "JSON object": "JSON object", - "filepath": "filepath", "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", - "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Allow Unauthorized Certificates", "Use Proxy": "Use Proxy", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "Attach to Session…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Port", @@ -195,16 +184,19 @@ "Remote Path": "Remote Path", "BrowserStack Username": "BrowserStack Username", "BrowserStack Access Key": "BrowserStack Access Key", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Bitbar API Key", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Name", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Enter your session ID here", + "searchSessions": "Search discovered sessions", "Proxy URL": "Proxy URL", "Source": "Source", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "Save Capability Set As…", "Edit Raw JSON": "Edit Raw JSON", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "Clipboard", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "Performance Data", - "System": "System", "Session": "Session", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "Error", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Call to '{{methodName}}' failed", - "methodCallResult": "'{{methodName}}' result", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "TestingBot Key", "TestingBot Secret": "TestingBot Secret", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/ml-IN/translation.json b/app/common/public/locales/ml-IN/translation.json similarity index 72% rename from assets/locales/ml-IN/translation.json rename to app/common/public/locales/ml-IN/translation.json index e48b16ab8d..268a69baae 100644 --- a/assets/locales/ml-IN/translation.json +++ b/app/common/public/locales/ml-IN/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "എല്ലാം മുന്നിലേക്ക് കൊണ്ടുവരുക", "Help": "സഹായം", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Save Server Arguments Preset", "Save": "Save", "Cancel": "Cancel", - "datetimeFormat": "MMM Do YYYY, h:mma", "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} is available", "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", @@ -68,20 +66,11 @@ "Could not start session": "Could not start session", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "Sauce username and access key are required!", - "testingbotCredentialsRequired": "TestingBot key and secret are required!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken is required", - "browserstackCredentialsRequired": "Browserstack username and access key are required!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "Bitbar API key required!", - "kobitonCredentialsRequired": "KOBITON username and api key are required!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "Locator Strategy:", "selector": "Selector:", "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", - "selectElementInSource": "Select an element in the source to begin.", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "Pause Recording", "Search for element": "Search for element", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", - "quitSessionAndClose": "Quit Session & Close Inspector", "Session Inactive": "Session Inactive", "Keep Session Running": "Keep Session Running", "Quit Session": "Quit Session", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Tap", "Gathering initial app source…": "Gathering initial app source…", "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "boolean", "number": "number", "JSON object": "JSON object", - "filepath": "filepath", "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", - "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Allow Unauthorized Certificates", "Use Proxy": "Use Proxy", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "Attach to Session…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Port", @@ -195,16 +184,19 @@ "Remote Path": "Remote Path", "BrowserStack Username": "BrowserStack Username", "BrowserStack Access Key": "BrowserStack Access Key", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Bitbar API Key", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Name", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Enter your session ID here", + "searchSessions": "Search discovered sessions", "Proxy URL": "Proxy URL", "Source": "Source", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "Save Capability Set As…", "Edit Raw JSON": "Edit Raw JSON", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "Clipboard", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "Performance Data", - "System": "System", "Session": "Session", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "Error", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Call to '{{methodName}}' failed", - "methodCallResult": "'{{methodName}}' result", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "TestingBot Key", "TestingBot Secret": "TestingBot Secret", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/app/common/public/locales/nl/translation.json b/app/common/public/locales/nl/translation.json new file mode 100644 index 0000000000..9ad71e149c --- /dev/null +++ b/app/common/public/locales/nl/translation.json @@ -0,0 +1,331 @@ +{ + "appiumInspector": "Appium Inspector", + "Edit": "Edit", + "Redo": "Redo", + "Cut": "Cut", + "Copy": "Copy", + "Paste": "Paste", + "Delete": "Delete", + "Select All": "Select All", + "Window": "Window", + "Minimize": "Minimize", + "Zoom": "Zoom", + "Zoom In": "Zoom In", + "Zoom Out": "Zoom Out", + "Reset Zoom Level": "Reset Zoom Level", + "Close Window": "Close Window", + "Bring All to Front": "Bring All to Front", + "Help": "Help", + "Appium Documentation": "Appium Documentation", + "Inspector Documentation": "Inspector Documentation", + "Appium Discussion Forum": "Appium Discussion Forum", + "Report Issues": "Report Issues", + "About Appium Inspector": "About Appium Inspector", + "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n", + "Improve Translations": "Improve Translations", + "Check for Updates…": "Check for Updates…", + "File": "File", + "New Window": "New Window", + "Hide Appium Inspector": "Hide Appium Inspector", + "Hide Others": "Hide Others", + "Show All": "Show All", + "Quit Appium Inspector": "Quit Appium Inspector", + "Toggle Full Screen": "Toggle Full Screen", + "Languages": "Languages", + "View": "View", + "Reload": "Reload", + "Toggle Developer Tools": "Toggle Developer Tools", + "Undo": "Undo", + "Restart Now": "Restart Now", + "Save Server Arguments Preset": "Save Server Arguments Preset", + "Save": "Save", + "Cancel": "Cancel", + "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", + "appiumIsAvailable": "Appium Inspector {{name}} is available", + "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", + "updateIsDownloaded": "Appium Inspector {{releaseName}} has been downloaded. Must restart to apply the updates (note: it may take several minutes for Appium Inspector to install and restart)", + "updateDownloadFailed": "Failed to download update. Reason: {{message}}", + "OK": "OK", + "Install Now": "Install Now", + "Install Later": "Install Later", + "Update Download Started": "Update Download Started", + "No update available": "No update available", + "Appium Inspector is up-to-date": "Appium Inspector is up-to-date", + "Later": "Later", + "Update Downloaded": "Update Downloaded", + "Could not download update": "Could not download update", + "Unexpected Error:": "Unexpected Error:", + "Please report this issue at:": "Please report this issue at:", + "Full error trace:": "Full error trace:", + "Copy Error Trace": "Copy Error Trace", + "Inspect element": "Inspect element", + "Session closed due to inactivity": "Session closed due to inactivity", + "Session has been terminated": "Session has been terminated", + "frameworkNotSupported": "Framework '{{framework}}' not supported", + "findElementFailure": "Failed to find element for '{{methodName}}'. Please refresh page and try again.", + "Could not start session": "Could not start session", + "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", + "Invalid URL:": "Invalid URL:", + "experitestAccessKey": "Experitest AccessKey", + "experitestUrl": "Experitest Url", + "locatorStrategy": "Locator Strategy:", + "selector": "Selector:", + "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", + "Press Home Button": "Press Home Button", + "Execute Siri Command": "Execute Siri Command", + "Press Back Button": "Press Back Button", + "Press App Switch Button": "Press App Switch Button", + "Command": "Command", + "Show Element Handles": "Show Element Handles", + "Hide Element Handles": "Hide Element Handles", + "Select Elements": "Select Elements", + "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates", + "Download Screenshot": "Download Screenshot", + "Back": "Back", + "Start Refreshing Source": "Start Refreshing Source", + "Pause Refreshing Source": "Pause Refreshing Source", + "refreshSource": "Refresh Source & Screenshot", + "Start Recording": "Start Recording", + "Pause Recording": "Pause Recording", + "Search for element": "Search for element", + "App Source": "App Source", + "Collapse All": "Collapse All", + "Toggle Attributes": "Toggle Attributes", + "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", + "Download Source as .XML File": "Download Source as .XML File", + "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", + "Session Inactive": "Session Inactive", + "Keep Session Running": "Keep Session Running", + "Quit Session": "Quit Session", + "Your session is about to expire": "Your session is about to expire", + "Enter Keys to Send": "Enter Keys to Send", + "Find and Select in Source": "Find and Select in Source", + "Clear": "Clear", + "Send Keys": "Send Keys", + "Done": "Done", + "Search": "Search", + "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code", + "Copy code to clipboard": "Copy code to clipboard", + "Start this Kind of Session with Code": "Start this Kind of Session with Code", + "Clear Actions": "Clear Actions", + "Close Recorder": "Close Recorder", + "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here", + "Recorder": "Recorder", + "Attribute": "Attribute", + "Value": "Value", + "Find By": "Find By", + "Selector": "Selector", + "Time": "Time (ms)", + "Get Timing": "Get Timing", + "interactionsNotAvailable": "Interactions for this element may not be available", + "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", + "noAdditionalContextsFound": "No additional contexts have been detected", + "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", + "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", + "Tap": "Tap", + "Gathering initial app source…": "Gathering initial app source…", + "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", + "iOS": "iOS", + "Android": "Android", + "desiredCapabilitiesDocumentation": "Capabilities Documentation", + "startSession": "Start Session", + "saveAs": "Save As…", + "attachToSession": "Attach to Session", + "selectedElement": "Selected Element", + "unnamed": "(Unnamed)", + "No Description": "No Description", + "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}", + "couldNotFindAnyElements": "Could not find any elements", + "elementsCount": "Elements found:", + "xCoordinate": "X: {{x}}", + "yCoordinate": "Y: {{y}}", + "SauceLabs Data Center": "SauceLabs Data Center", + "US-West": "US West 1", + "US-East": "US East 4", + "EU-Central": "EU Central 1", + "proxyThroughSC": "Proxy through Sauce Connect's Selenium Relay", + "SSL": "SSL", + "text": "text", + "boolean": "boolean", + "number": "number", + "JSON object": "JSON object", + "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", + "allowUnauthorizedCerts": "Allow Unauthorized Certificates", + "Use Proxy": "Use Proxy", + "JSON Representation": "JSON Representation", + "Capability Builder": "Capability Builder", + "Saved Capability Sets": "Saved Capability Sets", + "Attach": "Attach", + "localhost": "localhost", + "Host": "Host", + "Port": "Port", + "usingDataFoundIn": "Using data found in {{environmentVariable}}", + "yourUsername": "Your Username", + "Sauce Username": "Sauce Username", + "Sauce Access Key": "Sauce Access Key", + "yourAccessKey": "Your Access Key", + "yourApiKey": "Your API Key", + "Perfecto Host": "Perfecto Host", + "Perfecto Port": "Perfecto Port", + "Pcloudy User Name": "Pcloudy User Name", + "Pcloudy Host": "Pcloudy Host", + "Pcloudy API Key": "Pcloudy API Key", + "Add your token": "Add your token", + "Perfecto Token": "Perfecto Token", + "Your Kobiton Username": "Your Kobiton Username", + "Kobiton Access Key": "Kobiton Access Key", + "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL", + "sessionHeadspinWebDriverURLDescription": "Get the URL from the HeadSpin UI or the HeadSpin API using the automation configuration route", + "Remote Host": "Remote Host", + "Remote Port": "Remote Port", + "Remote Path": "Remote Path", + "BrowserStack Username": "BrowserStack Username", + "BrowserStack Access Key": "BrowserStack Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", + "Bitbar API Key": "Bitbar API Key", + "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", + "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", + "Name": "Name", + "Description": "Description", + "Created": "Created", + "Actions": "Actions", + "searchSessions": "Search discovered sessions", + "Proxy URL": "Proxy URL", + "Source": "Source", + "Commands": "Commands", + "Execute Commands": "Execute Commands", + "Gestures": "Gestures", + "Gesture Builder": "Gesture Builder", + "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", + "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", + "Session Information": "Session Information", + "Execute Command": "Execute Command", + "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", + "Action Type": "Action Type", + "Pointer Up": "Pointer Up", + "Pointer Down": "Pointer Down", + "Pause": "Pause", + "Move": "Move", + "Action Type Not Defined": "Action Type Not Defined", + "Duration": "Duration", + "Button": "Button", + "Untitled Gesture": "Untitled Gesture", + "Add Description": "Add Description", + "Gesture saved": "Gesture saved", + "Gesture saved as": "Gesture saved as '{{gestureName}}'", + "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed", + "Left": "Left", + "Right": "Right", + "Play": "Play", + "Export to File": "Export to File", + "Save Capability Set As": "Save Capability Set As…", + "Edit Raw JSON": "Edit Raw JSON", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", + "invalidJson": "Invalid JSON", + "App Management": "App Management", + "File Transfer": "File Transfer", + "Device Interaction": "Device Interaction", + "Session": "Session", + "Web": "Web", + "Context": "Context", + "simulatorOnly": "Emulator/simulator only", + "minAndroidSDK": "Minimum Android SDK level", + "Error": "Error", + "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", + "callToMethodFailed": "Call to '{{methodName}}' failed", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", + "TestingBot Key": "TestingBot Key", + "TestingBot Secret": "TestingBot Secret", + "Appium Server": "Appium Server", + "Select Cloud Providers": "Select Cloud Providers", + "Advanced Settings": "Advanced Settings", + "Native App Mode": "Native App Mode", + "Web/Hybrid App Mode": "Web/Hybrid App Mode", + "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start", + "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.", + "Mobitru WebDriver URL": "Mobitru WebDriver URL", + "Mobitru Billing Unit": "Mobitru Billing Unit", + "Mobitru Access Key": "Mobitru Access Key", + "Session URL": "Session URL", + "Server Details": "Server Details", + "Session Length": "Session Length", + "Session Details": "Session Details", + "Currently Active App ID": "Currently Active App ID", + "confirmDeletion": "Are you sure you want to delete this?", + "Copied!": "Copied!", + "Error Fetching Session URL": "Error Fetching Session URL", + "noRunningSessionsFound": "No running sessions found", + "invalidCapType": "Invalid capability type: {{type}}", + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" +} diff --git a/app/common/public/locales/no/translation.json b/app/common/public/locales/no/translation.json new file mode 100644 index 0000000000..9ad71e149c --- /dev/null +++ b/app/common/public/locales/no/translation.json @@ -0,0 +1,331 @@ +{ + "appiumInspector": "Appium Inspector", + "Edit": "Edit", + "Redo": "Redo", + "Cut": "Cut", + "Copy": "Copy", + "Paste": "Paste", + "Delete": "Delete", + "Select All": "Select All", + "Window": "Window", + "Minimize": "Minimize", + "Zoom": "Zoom", + "Zoom In": "Zoom In", + "Zoom Out": "Zoom Out", + "Reset Zoom Level": "Reset Zoom Level", + "Close Window": "Close Window", + "Bring All to Front": "Bring All to Front", + "Help": "Help", + "Appium Documentation": "Appium Documentation", + "Inspector Documentation": "Inspector Documentation", + "Appium Discussion Forum": "Appium Discussion Forum", + "Report Issues": "Report Issues", + "About Appium Inspector": "About Appium Inspector", + "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n", + "Improve Translations": "Improve Translations", + "Check for Updates…": "Check for Updates…", + "File": "File", + "New Window": "New Window", + "Hide Appium Inspector": "Hide Appium Inspector", + "Hide Others": "Hide Others", + "Show All": "Show All", + "Quit Appium Inspector": "Quit Appium Inspector", + "Toggle Full Screen": "Toggle Full Screen", + "Languages": "Languages", + "View": "View", + "Reload": "Reload", + "Toggle Developer Tools": "Toggle Developer Tools", + "Undo": "Undo", + "Restart Now": "Restart Now", + "Save Server Arguments Preset": "Save Server Arguments Preset", + "Save": "Save", + "Cancel": "Cancel", + "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", + "appiumIsAvailable": "Appium Inspector {{name}} is available", + "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", + "updateIsDownloaded": "Appium Inspector {{releaseName}} has been downloaded. Must restart to apply the updates (note: it may take several minutes for Appium Inspector to install and restart)", + "updateDownloadFailed": "Failed to download update. Reason: {{message}}", + "OK": "OK", + "Install Now": "Install Now", + "Install Later": "Install Later", + "Update Download Started": "Update Download Started", + "No update available": "No update available", + "Appium Inspector is up-to-date": "Appium Inspector is up-to-date", + "Later": "Later", + "Update Downloaded": "Update Downloaded", + "Could not download update": "Could not download update", + "Unexpected Error:": "Unexpected Error:", + "Please report this issue at:": "Please report this issue at:", + "Full error trace:": "Full error trace:", + "Copy Error Trace": "Copy Error Trace", + "Inspect element": "Inspect element", + "Session closed due to inactivity": "Session closed due to inactivity", + "Session has been terminated": "Session has been terminated", + "frameworkNotSupported": "Framework '{{framework}}' not supported", + "findElementFailure": "Failed to find element for '{{methodName}}'. Please refresh page and try again.", + "Could not start session": "Could not start session", + "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", + "Invalid URL:": "Invalid URL:", + "experitestAccessKey": "Experitest AccessKey", + "experitestUrl": "Experitest Url", + "locatorStrategy": "Locator Strategy:", + "selector": "Selector:", + "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", + "Press Home Button": "Press Home Button", + "Execute Siri Command": "Execute Siri Command", + "Press Back Button": "Press Back Button", + "Press App Switch Button": "Press App Switch Button", + "Command": "Command", + "Show Element Handles": "Show Element Handles", + "Hide Element Handles": "Hide Element Handles", + "Select Elements": "Select Elements", + "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates", + "Download Screenshot": "Download Screenshot", + "Back": "Back", + "Start Refreshing Source": "Start Refreshing Source", + "Pause Refreshing Source": "Pause Refreshing Source", + "refreshSource": "Refresh Source & Screenshot", + "Start Recording": "Start Recording", + "Pause Recording": "Pause Recording", + "Search for element": "Search for element", + "App Source": "App Source", + "Collapse All": "Collapse All", + "Toggle Attributes": "Toggle Attributes", + "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", + "Download Source as .XML File": "Download Source as .XML File", + "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", + "Session Inactive": "Session Inactive", + "Keep Session Running": "Keep Session Running", + "Quit Session": "Quit Session", + "Your session is about to expire": "Your session is about to expire", + "Enter Keys to Send": "Enter Keys to Send", + "Find and Select in Source": "Find and Select in Source", + "Clear": "Clear", + "Send Keys": "Send Keys", + "Done": "Done", + "Search": "Search", + "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code", + "Copy code to clipboard": "Copy code to clipboard", + "Start this Kind of Session with Code": "Start this Kind of Session with Code", + "Clear Actions": "Clear Actions", + "Close Recorder": "Close Recorder", + "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here", + "Recorder": "Recorder", + "Attribute": "Attribute", + "Value": "Value", + "Find By": "Find By", + "Selector": "Selector", + "Time": "Time (ms)", + "Get Timing": "Get Timing", + "interactionsNotAvailable": "Interactions for this element may not be available", + "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", + "noAdditionalContextsFound": "No additional contexts have been detected", + "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", + "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", + "Tap": "Tap", + "Gathering initial app source…": "Gathering initial app source…", + "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", + "iOS": "iOS", + "Android": "Android", + "desiredCapabilitiesDocumentation": "Capabilities Documentation", + "startSession": "Start Session", + "saveAs": "Save As…", + "attachToSession": "Attach to Session", + "selectedElement": "Selected Element", + "unnamed": "(Unnamed)", + "No Description": "No Description", + "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}", + "couldNotFindAnyElements": "Could not find any elements", + "elementsCount": "Elements found:", + "xCoordinate": "X: {{x}}", + "yCoordinate": "Y: {{y}}", + "SauceLabs Data Center": "SauceLabs Data Center", + "US-West": "US West 1", + "US-East": "US East 4", + "EU-Central": "EU Central 1", + "proxyThroughSC": "Proxy through Sauce Connect's Selenium Relay", + "SSL": "SSL", + "text": "text", + "boolean": "boolean", + "number": "number", + "JSON object": "JSON object", + "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", + "allowUnauthorizedCerts": "Allow Unauthorized Certificates", + "Use Proxy": "Use Proxy", + "JSON Representation": "JSON Representation", + "Capability Builder": "Capability Builder", + "Saved Capability Sets": "Saved Capability Sets", + "Attach": "Attach", + "localhost": "localhost", + "Host": "Host", + "Port": "Port", + "usingDataFoundIn": "Using data found in {{environmentVariable}}", + "yourUsername": "Your Username", + "Sauce Username": "Sauce Username", + "Sauce Access Key": "Sauce Access Key", + "yourAccessKey": "Your Access Key", + "yourApiKey": "Your API Key", + "Perfecto Host": "Perfecto Host", + "Perfecto Port": "Perfecto Port", + "Pcloudy User Name": "Pcloudy User Name", + "Pcloudy Host": "Pcloudy Host", + "Pcloudy API Key": "Pcloudy API Key", + "Add your token": "Add your token", + "Perfecto Token": "Perfecto Token", + "Your Kobiton Username": "Your Kobiton Username", + "Kobiton Access Key": "Kobiton Access Key", + "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL", + "sessionHeadspinWebDriverURLDescription": "Get the URL from the HeadSpin UI or the HeadSpin API using the automation configuration route", + "Remote Host": "Remote Host", + "Remote Port": "Remote Port", + "Remote Path": "Remote Path", + "BrowserStack Username": "BrowserStack Username", + "BrowserStack Access Key": "BrowserStack Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", + "Bitbar API Key": "Bitbar API Key", + "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", + "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", + "Name": "Name", + "Description": "Description", + "Created": "Created", + "Actions": "Actions", + "searchSessions": "Search discovered sessions", + "Proxy URL": "Proxy URL", + "Source": "Source", + "Commands": "Commands", + "Execute Commands": "Execute Commands", + "Gestures": "Gestures", + "Gesture Builder": "Gesture Builder", + "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", + "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", + "Session Information": "Session Information", + "Execute Command": "Execute Command", + "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", + "Action Type": "Action Type", + "Pointer Up": "Pointer Up", + "Pointer Down": "Pointer Down", + "Pause": "Pause", + "Move": "Move", + "Action Type Not Defined": "Action Type Not Defined", + "Duration": "Duration", + "Button": "Button", + "Untitled Gesture": "Untitled Gesture", + "Add Description": "Add Description", + "Gesture saved": "Gesture saved", + "Gesture saved as": "Gesture saved as '{{gestureName}}'", + "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed", + "Left": "Left", + "Right": "Right", + "Play": "Play", + "Export to File": "Export to File", + "Save Capability Set As": "Save Capability Set As…", + "Edit Raw JSON": "Edit Raw JSON", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", + "invalidJson": "Invalid JSON", + "App Management": "App Management", + "File Transfer": "File Transfer", + "Device Interaction": "Device Interaction", + "Session": "Session", + "Web": "Web", + "Context": "Context", + "simulatorOnly": "Emulator/simulator only", + "minAndroidSDK": "Minimum Android SDK level", + "Error": "Error", + "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", + "callToMethodFailed": "Call to '{{methodName}}' failed", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", + "TestingBot Key": "TestingBot Key", + "TestingBot Secret": "TestingBot Secret", + "Appium Server": "Appium Server", + "Select Cloud Providers": "Select Cloud Providers", + "Advanced Settings": "Advanced Settings", + "Native App Mode": "Native App Mode", + "Web/Hybrid App Mode": "Web/Hybrid App Mode", + "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start", + "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.", + "Mobitru WebDriver URL": "Mobitru WebDriver URL", + "Mobitru Billing Unit": "Mobitru Billing Unit", + "Mobitru Access Key": "Mobitru Access Key", + "Session URL": "Session URL", + "Server Details": "Server Details", + "Session Length": "Session Length", + "Session Details": "Session Details", + "Currently Active App ID": "Currently Active App ID", + "confirmDeletion": "Are you sure you want to delete this?", + "Copied!": "Copied!", + "Error Fetching Session URL": "Error Fetching Session URL", + "noRunningSessionsFound": "No running sessions found", + "invalidCapType": "Invalid capability type: {{type}}", + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" +} diff --git a/app/common/public/locales/pa-IN/translation.json b/app/common/public/locales/pa-IN/translation.json new file mode 100644 index 0000000000..9ad71e149c --- /dev/null +++ b/app/common/public/locales/pa-IN/translation.json @@ -0,0 +1,331 @@ +{ + "appiumInspector": "Appium Inspector", + "Edit": "Edit", + "Redo": "Redo", + "Cut": "Cut", + "Copy": "Copy", + "Paste": "Paste", + "Delete": "Delete", + "Select All": "Select All", + "Window": "Window", + "Minimize": "Minimize", + "Zoom": "Zoom", + "Zoom In": "Zoom In", + "Zoom Out": "Zoom Out", + "Reset Zoom Level": "Reset Zoom Level", + "Close Window": "Close Window", + "Bring All to Front": "Bring All to Front", + "Help": "Help", + "Appium Documentation": "Appium Documentation", + "Inspector Documentation": "Inspector Documentation", + "Appium Discussion Forum": "Appium Discussion Forum", + "Report Issues": "Report Issues", + "About Appium Inspector": "About Appium Inspector", + "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n", + "Improve Translations": "Improve Translations", + "Check for Updates…": "Check for Updates…", + "File": "File", + "New Window": "New Window", + "Hide Appium Inspector": "Hide Appium Inspector", + "Hide Others": "Hide Others", + "Show All": "Show All", + "Quit Appium Inspector": "Quit Appium Inspector", + "Toggle Full Screen": "Toggle Full Screen", + "Languages": "Languages", + "View": "View", + "Reload": "Reload", + "Toggle Developer Tools": "Toggle Developer Tools", + "Undo": "Undo", + "Restart Now": "Restart Now", + "Save Server Arguments Preset": "Save Server Arguments Preset", + "Save": "Save", + "Cancel": "Cancel", + "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", + "appiumIsAvailable": "Appium Inspector {{name}} is available", + "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", + "updateIsDownloaded": "Appium Inspector {{releaseName}} has been downloaded. Must restart to apply the updates (note: it may take several minutes for Appium Inspector to install and restart)", + "updateDownloadFailed": "Failed to download update. Reason: {{message}}", + "OK": "OK", + "Install Now": "Install Now", + "Install Later": "Install Later", + "Update Download Started": "Update Download Started", + "No update available": "No update available", + "Appium Inspector is up-to-date": "Appium Inspector is up-to-date", + "Later": "Later", + "Update Downloaded": "Update Downloaded", + "Could not download update": "Could not download update", + "Unexpected Error:": "Unexpected Error:", + "Please report this issue at:": "Please report this issue at:", + "Full error trace:": "Full error trace:", + "Copy Error Trace": "Copy Error Trace", + "Inspect element": "Inspect element", + "Session closed due to inactivity": "Session closed due to inactivity", + "Session has been terminated": "Session has been terminated", + "frameworkNotSupported": "Framework '{{framework}}' not supported", + "findElementFailure": "Failed to find element for '{{methodName}}'. Please refresh page and try again.", + "Could not start session": "Could not start session", + "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", + "Invalid URL:": "Invalid URL:", + "experitestAccessKey": "Experitest AccessKey", + "experitestUrl": "Experitest Url", + "locatorStrategy": "Locator Strategy:", + "selector": "Selector:", + "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", + "Press Home Button": "Press Home Button", + "Execute Siri Command": "Execute Siri Command", + "Press Back Button": "Press Back Button", + "Press App Switch Button": "Press App Switch Button", + "Command": "Command", + "Show Element Handles": "Show Element Handles", + "Hide Element Handles": "Hide Element Handles", + "Select Elements": "Select Elements", + "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates", + "Download Screenshot": "Download Screenshot", + "Back": "Back", + "Start Refreshing Source": "Start Refreshing Source", + "Pause Refreshing Source": "Pause Refreshing Source", + "refreshSource": "Refresh Source & Screenshot", + "Start Recording": "Start Recording", + "Pause Recording": "Pause Recording", + "Search for element": "Search for element", + "App Source": "App Source", + "Collapse All": "Collapse All", + "Toggle Attributes": "Toggle Attributes", + "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", + "Download Source as .XML File": "Download Source as .XML File", + "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", + "Session Inactive": "Session Inactive", + "Keep Session Running": "Keep Session Running", + "Quit Session": "Quit Session", + "Your session is about to expire": "Your session is about to expire", + "Enter Keys to Send": "Enter Keys to Send", + "Find and Select in Source": "Find and Select in Source", + "Clear": "Clear", + "Send Keys": "Send Keys", + "Done": "Done", + "Search": "Search", + "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code", + "Copy code to clipboard": "Copy code to clipboard", + "Start this Kind of Session with Code": "Start this Kind of Session with Code", + "Clear Actions": "Clear Actions", + "Close Recorder": "Close Recorder", + "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here", + "Recorder": "Recorder", + "Attribute": "Attribute", + "Value": "Value", + "Find By": "Find By", + "Selector": "Selector", + "Time": "Time (ms)", + "Get Timing": "Get Timing", + "interactionsNotAvailable": "Interactions for this element may not be available", + "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", + "noAdditionalContextsFound": "No additional contexts have been detected", + "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", + "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", + "Tap": "Tap", + "Gathering initial app source…": "Gathering initial app source…", + "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", + "iOS": "iOS", + "Android": "Android", + "desiredCapabilitiesDocumentation": "Capabilities Documentation", + "startSession": "Start Session", + "saveAs": "Save As…", + "attachToSession": "Attach to Session", + "selectedElement": "Selected Element", + "unnamed": "(Unnamed)", + "No Description": "No Description", + "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}", + "couldNotFindAnyElements": "Could not find any elements", + "elementsCount": "Elements found:", + "xCoordinate": "X: {{x}}", + "yCoordinate": "Y: {{y}}", + "SauceLabs Data Center": "SauceLabs Data Center", + "US-West": "US West 1", + "US-East": "US East 4", + "EU-Central": "EU Central 1", + "proxyThroughSC": "Proxy through Sauce Connect's Selenium Relay", + "SSL": "SSL", + "text": "text", + "boolean": "boolean", + "number": "number", + "JSON object": "JSON object", + "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", + "allowUnauthorizedCerts": "Allow Unauthorized Certificates", + "Use Proxy": "Use Proxy", + "JSON Representation": "JSON Representation", + "Capability Builder": "Capability Builder", + "Saved Capability Sets": "Saved Capability Sets", + "Attach": "Attach", + "localhost": "localhost", + "Host": "Host", + "Port": "Port", + "usingDataFoundIn": "Using data found in {{environmentVariable}}", + "yourUsername": "Your Username", + "Sauce Username": "Sauce Username", + "Sauce Access Key": "Sauce Access Key", + "yourAccessKey": "Your Access Key", + "yourApiKey": "Your API Key", + "Perfecto Host": "Perfecto Host", + "Perfecto Port": "Perfecto Port", + "Pcloudy User Name": "Pcloudy User Name", + "Pcloudy Host": "Pcloudy Host", + "Pcloudy API Key": "Pcloudy API Key", + "Add your token": "Add your token", + "Perfecto Token": "Perfecto Token", + "Your Kobiton Username": "Your Kobiton Username", + "Kobiton Access Key": "Kobiton Access Key", + "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL", + "sessionHeadspinWebDriverURLDescription": "Get the URL from the HeadSpin UI or the HeadSpin API using the automation configuration route", + "Remote Host": "Remote Host", + "Remote Port": "Remote Port", + "Remote Path": "Remote Path", + "BrowserStack Username": "BrowserStack Username", + "BrowserStack Access Key": "BrowserStack Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", + "Bitbar API Key": "Bitbar API Key", + "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", + "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", + "Name": "Name", + "Description": "Description", + "Created": "Created", + "Actions": "Actions", + "searchSessions": "Search discovered sessions", + "Proxy URL": "Proxy URL", + "Source": "Source", + "Commands": "Commands", + "Execute Commands": "Execute Commands", + "Gestures": "Gestures", + "Gesture Builder": "Gesture Builder", + "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", + "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", + "Session Information": "Session Information", + "Execute Command": "Execute Command", + "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", + "Action Type": "Action Type", + "Pointer Up": "Pointer Up", + "Pointer Down": "Pointer Down", + "Pause": "Pause", + "Move": "Move", + "Action Type Not Defined": "Action Type Not Defined", + "Duration": "Duration", + "Button": "Button", + "Untitled Gesture": "Untitled Gesture", + "Add Description": "Add Description", + "Gesture saved": "Gesture saved", + "Gesture saved as": "Gesture saved as '{{gestureName}}'", + "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed", + "Left": "Left", + "Right": "Right", + "Play": "Play", + "Export to File": "Export to File", + "Save Capability Set As": "Save Capability Set As…", + "Edit Raw JSON": "Edit Raw JSON", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", + "invalidJson": "Invalid JSON", + "App Management": "App Management", + "File Transfer": "File Transfer", + "Device Interaction": "Device Interaction", + "Session": "Session", + "Web": "Web", + "Context": "Context", + "simulatorOnly": "Emulator/simulator only", + "minAndroidSDK": "Minimum Android SDK level", + "Error": "Error", + "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", + "callToMethodFailed": "Call to '{{methodName}}' failed", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", + "TestingBot Key": "TestingBot Key", + "TestingBot Secret": "TestingBot Secret", + "Appium Server": "Appium Server", + "Select Cloud Providers": "Select Cloud Providers", + "Advanced Settings": "Advanced Settings", + "Native App Mode": "Native App Mode", + "Web/Hybrid App Mode": "Web/Hybrid App Mode", + "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start", + "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.", + "Mobitru WebDriver URL": "Mobitru WebDriver URL", + "Mobitru Billing Unit": "Mobitru Billing Unit", + "Mobitru Access Key": "Mobitru Access Key", + "Session URL": "Session URL", + "Server Details": "Server Details", + "Session Length": "Session Length", + "Session Details": "Session Details", + "Currently Active App ID": "Currently Active App ID", + "confirmDeletion": "Are you sure you want to delete this?", + "Copied!": "Copied!", + "Error Fetching Session URL": "Error Fetching Session URL", + "noRunningSessionsFound": "No running sessions found", + "invalidCapType": "Invalid capability type: {{type}}", + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" +} diff --git a/assets/locales/pl/translation.json b/app/common/public/locales/pl/translation.json similarity index 66% rename from assets/locales/pl/translation.json rename to app/common/public/locales/pl/translation.json index 4300b6f802..601bdf14d6 100644 --- a/assets/locales/pl/translation.json +++ b/app/common/public/locales/pl/translation.json @@ -5,32 +5,31 @@ "Cut": "Wytnij", "Copy": "Kopiuj", "Paste": "Wklej", - "Delete": "Delete", + "Delete": "Usuń", "Select All": "Zaznacz wszystko", "Window": "Okno", "Minimize": "Minimalizuj", - "Zoom": "Zoom", - "Zoom In": "Zoom In", - "Zoom Out": "Zoom Out", - "Reset Zoom Level": "Reset Zoom Level", - "Close Window": "Close Window", - "Open Session File…": "Open Session File…", + "Zoom": "", + "Zoom In": "Przybliż", + "Zoom Out": "Oddal", + "Reset Zoom Level": "Wyzeruj poziom powiększenia", + "Close Window": "Zamknij okno", "Bring All to Front": "Umieść wszystko na wierzchu", "Help": "Pomoc", "Appium Documentation": "Dokumentacja Appium", "Inspector Documentation": "Dokumentacja inspektora", - "Appium Discussion Forum": "Appium Discussion Forum", - "Report Issues": "Report Issues", - "About Appium Inspector": "About Appium Inspector", + "Appium Discussion Forum": "Forum dyskusyjne Appium", + "Report Issues": "Zgłoś problemy", + "About Appium Inspector": "O Appium Inspector", "showAppInfo": "Wersja aplikacji: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n", - "Improve Translations": "Improve Translations", - "Check for Updates…": "Check for Updates…", + "Improve Translations": "Popraw tłumaczenia", + "Check for Updates…": "Sprawdź dostępność aktualizacji…", "File": "Plik", - "New Window": "New Window", - "Hide Appium Inspector": "Hide Appium Inspector", + "New Window": "Nowe okno", + "Hide Appium Inspector": "Ukryj Appium Inspector", "Hide Others": "Ukryj pozostałe", "Show All": "Pokaż wszystkie", - "Quit Appium Inspector": "Quit Appium Inspector", + "Quit Appium Inspector": "Wyłącz Appium Inspector", "Toggle Full Screen": "Przełącz pełny ekran", "Languages": "Języki", "View": "Widok", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Zapisz ustawienia argumentów serwera", "Save": "Zapisz", "Cancel": "Anuluj", - "datetimeFormat": "D MMM YYYY h:mm", "updateDetails": "Data wydania: {{pubDate}}\n\nInformacje o wydaniu: {{notes}}", "appiumIsAvailable": "Dostępny jest Inspektor Appium {{name}}", "updateIsBeingDownloaded": "Aktualizacja jest teraz pobierana. Zostaniesz powiadomiony ponownie po jej zakończeniu", @@ -58,30 +56,21 @@ "Could not download update": "Nie można pobrać aktualizacji", "Unexpected Error:": "Nieoczekiwany błąd:", "Please report this issue at:": "Prosimy zgłosić ten problem na stronie:", - "Full error trace:": "Full error trace:", - "Copy Error Trace": "Copy Error Trace", + "Full error trace:": "Pełny ślad błędu:", + "Copy Error Trace": "Skopiuj ślad błędu", "Inspect element": "Zbadaj element", "Session closed due to inactivity": "Sesja zamknięta z powodu braku aktywności", "Session has been terminated": "Sesja została zakończona", "frameworkNotSupported": "Framework '{{framework}}' nie jest obsługiwany", "findElementFailure": "Nie udało się znaleźć elementu dla '{{methodName}}'. Odśwież stronę i spróbuj ponownie.", "Could not start session": "Nie można uruchomić sesji", - "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", + "couldNotConnect": "Nie można było połączyć się z URL serwera Appium '{{url}}'. Sprawdź, czy serwer działa poprawnie i adres URL jest prawidłowy (listę adresów URL można znaleźć na początku logów serwera Appium). Jeśli używasz Inspectora w wersji przeglądarkowej, upewnij się, że serwer został uruchomiony z argumentem '--allow-cors'.", "Invalid URL:": "Nieprawidłowy adres URL:", - "sauceCredentialsRequired": "Nazwa użytkownika i klucz dostępu Sauce są wymagane!", - "testingbotCredentialsRequired": "Klucz i sekret TestingBota są wymagane!", - "Perfecto SecurityToken is required": "Wymagany jest Perfecto SecurityToken", - "browserstackCredentialsRequired": "Login i klucz dostępu do Browserstack są wymagane!", - "lambdatestCredentialsRequired": "Nazwa użytkownika i klucz dostępu Lambdatest są wymagane!", - "bitbarCredentialsRequired": "Wymagany klucz API Bitbar!", - "kobitonCredentialsRequired": "Nazwa użytkownika i klucz API KOBITON są wymagane!", - "experitestAccessKeyURLRequired": "Klucz dostępu i adres URL Experitest są wymagane", "experitestAccessKey": "Klucz dostępu Experitest", "experitestUrl": "Adres URL Experitest", "locatorStrategy": "Strategia lokalizacji:", "selector": "Selektor:", "couldNotObtainScreenshot": "Nie można uzyskać zrzutu ekranu: {{screenshotError}}", - "selectElementInSource": "Wybierz element w źródle, aby rozpocząć.", "Press Home Button": "Naciśnij przycisk domowy", "Execute Siri Command": "Wykonaj polecenie Siri", "Press Back Button": "Naciśnij przycisk Wstecz", @@ -90,7 +79,7 @@ "Show Element Handles": "Pokaż uchwyty elementu", "Hide Element Handles": "Ukryj uchwyty elementu", "Select Elements": "Wybierz elementy", - "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates", + "Tap/Swipe By Coordinates": "Naciśnij/Przesuń na podstawie współrzędnych", "Download Screenshot": "Pobierz zrzut ekranu", "Back": "Wstecz", "Start Refreshing Source": "Rozpocznij odświeżanie źródła", @@ -100,11 +89,11 @@ "Pause Recording": "Wstrzymaj nagrywanie", "Search for element": "Szukaj elementu", "App Source": "Źródło aplikacji", + "Collapse All": "Collapse All", "Toggle Attributes": "Przełącz atrybuty", "Copy XML Source to Clipboard": "Skopiuj źródło XML do schowka", "Download Source as .XML File": "Pobierz źródło jako plik .XML", "Copy Attributes to Clipboard": "Kopiuj atrybuty do schowka", - "quitSessionAndClose": "Zakończ sesję i zamknij inspektor", "Session Inactive": "Sesja nieaktywna", "Keep Session Running": "Kontynuuj sesję", "Quit Session": "Zakończ sesję", @@ -115,7 +104,7 @@ "Send Keys": "Wyślij klucze", "Done": "Gotowe", "Search": "Szukaj", - "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code", + "Show/Hide Boilerplate Code": "Pokaż/Ukryj przykładowy kod", "Copy code to clipboard": "Skopiuj kod do schowka", "Start this Kind of Session with Code": "Start this Kind of Session with Code", "Clear Actions": "Wyczyść akcje", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Naciśnij", "Gathering initial app source…": "Gathering initial app source…", "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "boolean", "number": "numer", "JSON object": "Obiekt JSON", - "filepath": "ścieżka pliku", "connectToExistingSessionInstructions": "Jeśli masz już uruchomioną sesję powyższego typu serwera, możesz do niej bezpośrednio dołączyć inspektora.", - "selectSessionIDInDropdown": "Wybierz ID sesji z rozwijanej listy poniżej.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Zezwalaj na nieautoryzowane certyfikaty", "Use Proxy": "Użyj serwera proxy", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Zapisane zestawy możliwości", - "Attach to Session": "Dołącz do sesji…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Port", @@ -195,16 +184,19 @@ "Remote Path": "Zdalna ścieżka", "BrowserStack Username": "Nazwa użytkownika BrowserStack", "BrowserStack Access Key": "Klucz dostępu BrowserStack", - "LambdaTest Username": "Nazwa użytkownika LambdaTest", - "LambdaTest Access Key": "Klucz dostępu LambdaTest", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Klucz API Bitbar", "RemoteTestKit AccessToken": "Token dostępu RemoteTestKit", "RobotQA Token": "Token RobotQA", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Nazwa", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Wprowadź tutaj ID sesji", + "searchSessions": "Search discovered sessions", "Proxy URL": "Adres URL serwera proxy", "Source": "Źródło", "Commands": "Komendy", @@ -212,12 +204,14 @@ "Gestures": "Gesty", "Gesture Builder": "Kreator gestów", "Saved Gestures": "Zapisane gesty", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Informacje o sesji", "Execute Command": "Wykonaj komendę", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Kliknij, aby ustawić współrzędne", - "Set Coordinates Via Field": "Ustaw współrzędne przez pola", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Rodzaj czynności", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Lewo", "Right": "Prawo", "Play": "Odtwórz", + "Export to File": "Export to File", "Save Capability Set As": "Zapisz zestaw możliwości jako…", "Edit Raw JSON": "Edytuj Raw JSON", - "Enter Parameters for:": "Wprowadź parametry dla:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Nieprawidłowy JSON", - "Execute Script": "Wykonaj skrypt", "App Management": "Zarządzanie aplikacjami", - "Clipboard": "Schowek", "File Transfer": "Przesyłanie plików", "Device Interaction": "Interakcja urządzenia", - "Keyboard": "Klawiatura", - "Connectivity": "Łączność", - "Performance Data": "Dane o wydajności", - "System": "System", "Session": "Sesja", "Web": "Przeglądarka", "Context": "Kontekst", - "Window (W3C)": "Okno (W3C)", "simulatorOnly": "Tylko emulator/symulator", "minAndroidSDK": "Minimalny poziom SDK systemu Android", "Error": "Błąd", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Połączenie do '{{methodName}}' nie powiodło się", - "methodCallResult": "wynik '{{methodName}}'", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "Klucz TestingBot", "TestingBot Secret": "TestingBot Secret", "Appium Server": "Serwer Appium", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Adres URL Mobitru WebDriver", "Mobitru Billing Unit": "Jednostka rozliczeniowa Mobitru", "Mobitru Access Key": "Klucz dostępu Mobitru", - "mobitruCredentialsRequired": "Klucz dostępu Mobitru jest wymagany", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/pt-BR/translation.json b/app/common/public/locales/pt-BR/translation.json similarity index 68% rename from assets/locales/pt-BR/translation.json rename to app/common/public/locales/pt-BR/translation.json index ba4b61d888..f2886feb16 100644 --- a/assets/locales/pt-BR/translation.json +++ b/app/common/public/locales/pt-BR/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Diminuir zoom", "Reset Zoom Level": "Redefinir nível de zoom", "Close Window": "Fechar Janela", - "Open Session File…": "Abrir Arquivo de Sessão…", "Bring All to Front": "Trazer Tudo para Frente", "Help": "Ajuda", "Appium Documentation": "•‎ Documentação do Appium", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Salvar Preset de Argumentos do Servidor", "Save": "Salvar", "Cancel": "Cancelar", - "datetimeFormat": "DD de MMMM de YYYY hh:mm", "updateDetails": "Data de Lançamento: {{pubDate}}\n\nNotas de Lançamento: {{notes}}", "appiumIsAvailable": "Inspetor do Appium {{name}} está disponível", "updateIsBeingDownloaded": "A atualização está sendo baixada agora. Você será notificado novamente quando estiver concluída", @@ -68,20 +66,11 @@ "Could not start session": "Não foi possível iniciar a sessão", "couldNotConnect": "Não foi possível conectar-se ao URL do servidor Appium '{{url}}'. Verifique se o servidor está em execução e se o URL está correto (URLs válidos podem ser encontrados no início do log do servidor Appium). Se você estiver usando a versão do navegador do Inspector, certifique-se de que o servidor tenha sido iniciado com '--allow-cors'.", "Invalid URL:": "URL inválida:", - "sauceCredentialsRequired": "Nome de usuário e chave de acesso SauceLabs são necessários!", - "testingbotCredentialsRequired": "Chave e segredo do TestingBot são necessários!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken é necessário", - "browserstackCredentialsRequired": "Nome de usuário e chave de acesso BrowserStack são necessários!", - "lambdatestCredentialsRequired": "Nome de usuário e chave de acesso Lambdatest são necessários!", - "bitbarCredentialsRequired": "Chave API do Bitbar necessária!", - "kobitonCredentialsRequired": "É necessário o nome de usuário e a chave de api do KOBITON!", - "experitestAccessKeyURLRequired": "Experitest AccessKey e URL são necessários", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "Estratégia de Localizadores:", "selector": "Seletor:", "couldNotObtainScreenshot": "Não foi possível obter captura de tela: {{screenshotError}}", - "selectElementInSource": "Selecione um elemento no código fonte para começar.", "Press Home Button": "Pressione o botão Home", "Execute Siri Command": "Executar Comando Siri", "Press Back Button": "Pressione o botão voltar", @@ -90,7 +79,7 @@ "Show Element Handles": "Mostrar Identificadores de Elementos", "Hide Element Handles": "Ocultar Identificadores de Elementos", "Select Elements": "Selecionar Elementos", - "Tap/Swipe By Coordinates": "Toque/deslize por coordenadas.", + "Tap/Swipe By Coordinates": "Toque/deslize por coordenadas", "Download Screenshot": "Baixar Captura de Tela", "Back": "Voltar", "Start Refreshing Source": "Iniciar Atualização do Código Fonte", @@ -100,11 +89,11 @@ "Pause Recording": "Pausar gravação", "Search for element": "Pesquisar por elemento", "App Source": "Fonte do aplicativo", + "Collapse All": "Recolher Todos", "Toggle Attributes": "Alternar Atributos", "Copy XML Source to Clipboard": "Copiar Código XML para Área de Transferência", "Download Source as .XML File": "Baixar Fonte como Arquivo .XML", "Copy Attributes to Clipboard": "Copiar Atributos para Área de Transferência", - "quitSessionAndClose": "Sair da sessão e Fechar Inspetor", "Session Inactive": "Sessão inativa", "Keep Session Running": "Manter sessão em execução", "Quit Session": "Sair da Sessão", @@ -120,7 +109,7 @@ "Start this Kind of Session with Code": "Inicie este tipo de sessão com código", "Clear Actions": "Limpar Ações", "Close Recorder": "Fechar Gravador", - "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here", + "enableRecordingAndPerformActions": "Ative a gravação no cabeçalho do aplicativo e, em seguida, execute algumas ações para ver o código exibido aqui", "Recorder": "Gravador", "Attribute": "Atributo", "Value": "Valor", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "Usar localizadores XPath não é recomendado e pode levar a testes frágeis. Peça a sua equipe de desenvolvimento para fornecer localizadores de acessibilidade únicos!", "noAdditionalContextsFound": "Nenhum contexto adicional foi detectado", "contextDropdownInfo": "Múltiplos contextos detectados; certos elementos só podem ser acessíveis após mudar para um contexto diferente. Note que a inspeção da web no Appium Inspector é menos precisa do que o DevTools do Chrome ou do Safari. Para mais informações, consulte:", - "idAutocompletionCanBeDisabled": "O seletor de ID solicitado não tem um prefixo de nome de pacote. Esta sessão Appium tem a auto-completar do nome de pacote habilitada, que pode ser a razão pela qual nenhum elemento foi encontrado. Para desativar esse comportamento, reinicie esta sessão com o recurso 'appium:disableIdLocatorAutocompletion' definido como 'true'.", + "idAutocompletionCanBeDisabled": "O id de seletor solicitado não tem um prefixo de nome de pacote. Esta sessão Appium tem a auto-conclusão do nome de pacote habilitada, que pode ser a razão pela qual nenhum elemento foi encontrado. Para desativar esse comportamento, altere a definição 'disableIdLocatorAutocompletion' para 'true'.", "missingAutomationNameForStrategies": "Estratégias de localizador adicionais podem estar disponíveis. Para visualizá-las, adicione o recurso 'appium:automationName' ao iniciar a sessão. Note que este recurso é obrigatório no Appium 2.", + "snapshotMaxDepthReached": "Esse elemento está localizado na profundidade máxima da fonte {{selectedElementDepth}}, portanto seus elementos filhos (se houver) não serão mostrados. Para revelá-los, altere a configuração 'snapshotMaxDepth' para um valor maior que {{selectedElementDepth}}. Verifique sua documentação de driver para ver o valor máximo suportado.", "Tap": "Tocar", "Gathering initial app source…": "Coletando o fonte inicial do app…", "couldNotObtainSource": "Não foi possível obter o fonte: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "boleano", "number": "número", "JSON object": "Objeto JSON", - "filepath": "caminho do arquivo", "connectToExistingSessionInstructions": "Se você já tiver uma sessão em execução do tipo de servidor acima, você pode anexar um inspetor diretamente a ele.", - "selectSessionIDInDropdown": "Selecione o ID da sessão no dropdown abaixo.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Permitir Certificados Não Autorizados", "Use Proxy": "Usar Proxy", "JSON Representation": "Representação JSON", - "Capability Builder": "Capability Builder", + "Capability Builder": "Construtor de Recursos", "Saved Capability Sets": "Conjuntos de Recursos Salvos", - "Attach to Session": "Anexar à Sessão…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Porta", @@ -195,16 +184,19 @@ "Remote Path": "Caminho Remoto", "BrowserStack Username": "Nome de usuário do BrowserStack", "BrowserStack Access Key": "Chave de acesso BrowserStack", - "LambdaTest Username": "Nome de usuário do LambdaTest", - "LambdaTest Access Key": "Chave de Acesso LambdaTest", + "TestMu AI Username": "Usuário TestMu AI", + "TestMu AI Access Key": "Chave de acesso TestMu AI", "Bitbar API Key": "Chave API da Bitbar", "RemoteTestKit AccessToken": "Token de Acesso Remoto TestKit", "RobotQA Token": "Token de RobotQA", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Adicionar", "Name": "Nome", "Description": "Descrição", "Created": "Criado", "Actions": "Ações", - "enterYourSessionId": "Digite seu ID da sessão aqui", + "searchSessions": "Pesquisar sessões descobertas", "Proxy URL": "URL do proxy", "Source": "Fonte", "Commands": "Comandos", @@ -212,12 +204,14 @@ "Gestures": "Gestos", "Gesture Builder": "Construtor de Gesto", "Saved Gestures": "Gestos salvos", + "Create New Gesture": "Criar novo gesto", "gesturesDescription": "Crie, salve e execute gestos personalizados aqui. Gestos são idênticos às cadeias de ações na API de ações do W3C WebDriver.", "Session Information": "Informações da Sessão", "Execute Command": "Executar Comando", "commandsDescription": "Executa vários comandos usando o driver de Appium. Observe que nem todos os drivers suportam todos os comandos.", - "Click to Set Coordinates": "Clique para definir coordenadas", - "Set Coordinates Via Field": "Definir Coordenadas Via Campo", + "showMoveActionCoordsInPercentage": "Mostrar Coordenadas de Ações de Mover no Percentual de Dimensão da Tela", + "showMoveActionCoordsInPixels": "Mostrar Coordenadas das Ações de mover em Pixels", + "toggleMoveActionCoordPicker": "Alternar Configurações de Coordenadas clicando na Captura de Tela", "Action Type": "Tipo da Ação", "Pointer Up": "Liberar toque", "Pointer Down": "Tocar e segurar", @@ -234,29 +228,23 @@ "Left": "Esquerda", "Right": "Direita", "Play": "Executar", + "Export to File": "Exportar para Arquivo", "Save Capability Set As": "Salvar Conjunto de Recursos como…", "Edit Raw JSON": "Editar JSON bruto", - "Enter Parameters for:": "Digite os parâmetros para:", + "enterMethodParameters": "Inserir parâmetros para: '{{methodName}}'", "invalidJson": "JSON inválido", - "Execute Script": "Executar script", "App Management": "Gerenciamento de aplicativos", - "Clipboard": "Área de Transferência", "File Transfer": "Transferência de Arquivo", "Device Interaction": "Interação do dispositivo", - "Keyboard": "Teclado", - "Connectivity": "Conectividade", - "Performance Data": "Dados de desempenho", - "System": "Sistema", "Session": "Sessão", "Web": "Web", "Context": "Contexto", - "Window (W3C)": "Janela (W3C)", "simulatorOnly": "Somente emulador/simulador", "minAndroidSDK": "Nível mínimo de SDK do Android", "Error": "Erro", "findingElementInSourceFailed": "Não foi possível encontrar o elemento especificado. O ID atual do aplicativo fonte ou do elemento pode ter sido alterado, ou pode haver muitos elementos com as mesmas coordenadas.", "callToMethodFailed": "Chamada para '{{methodName}}' falhou", - "methodCallResult": "resultado '{{methodName}}'", + "methodCallResult": "Resultado para: '{{methodName}}' (tipo: {{resultType}})", "TestingBot Key": "Chave TestingBot", "TestingBot Secret": "Segredo TestingBot", "Appium Server": "Servidor Appium", @@ -266,20 +254,78 @@ "Web/Hybrid App Mode": "Modo Web / Híbrido do App", "autoAddPrefixes": "Adicionar automaticamente os prefixos necessários do fornecedor de Appium ao iniciar", "attachSessionNotRunning": "Não foi possível confirmar que a sessão {{attachSessId}} está em execução no servidor fornecido. Por favor, verifique os detalhes antes de tentar anexar a sessão novamente.", - "Mobitru WebDriver URL": "Mobitru WebDriver URL", - "Mobitru Billing Unit": "Mobitru Billing Unit", - "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", + "Mobitru WebDriver URL": "URL do WebDrive Mobitru", + "Mobitru Billing Unit": "Unidade de Cobrança Mobitru", + "Mobitru Access Key": "Chave de Acesso Mobitru", "Session URL": "URL da sessão", "Server Details": "Detalhes do servidor", "Session Length": "Duração da Sessão", "Session Details": "Detalhes da Sessão", "Currently Active App ID": "ID do App ativo atualmente", - "Session ID": "ID da sessão", "confirmDeletion": "Você tem certeza de que deseja apagar isto?", "Copied!": "Copiado!", "Error Fetching Session URL": "Erro ao buscar URL da sessão", - "noResultsFound": "Nenhum resultado encontrado", + "noRunningSessionsFound": "Nenhuma sessão em execução encontrada", "invalidCapType": "Tipo de recurso inválido: {{type}}", - "whitespaceDetected": "Texto começa e/ou termina com espaço em branco" + "whitespaceDetected": "Texto começa e/ou termina com espaço em branco", + "duplicateCapabilityNameError": "Já existe um conjunto de recursos com o mesmo nome", + "unableToImportGestureFiles": "Não foi possível importar os gestos dos seguintes arquivos: {{fileNames}}", + "invalidSessionFile": "Arquivo de sessão inválido", + "TV Labs API Key": "Chave API do TV Labs", + "TestcribeAPIKey": "Chave API do Testcribe", + "sessionTestcribeApiKeyDescription": "Você pode obter sua chave de api em https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Por favor, forneça os seguintes detalhes do servidor para {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Informações do servidor faltando, não foi possível pesquisar por sessões", + "Username": "Nome de Usuário", + "URL": "URL", + "WebDriver URL": "URL do WebDrive", + "API Key": "Chave de API", + "Access Key": "Chave de Acesso", + "SecurityToken": "Token de Segurança", + "AccessToken": "Token de Acesso", + "Token": "Token", + "Key": "Chave", + "Secret": "Segredo", + "Theme": "Tema", + "Light Theme": "Tema Claro", + "Dark Theme": "Tema Escuro", + "System Theme": "Tema do Sistema", + "Search Source": "Procurar Fonte", + "Matching Elements": "Elementos correspondentes", + "webmateApiKey": "Chave de API da Webmate", + "yourProjectId": "ID do seu Projeto", + "webmateProjectId": "ID do Projeto Webmate", + "specifyWebmateHostExplicitly": "Especificar host Webmate explicitamente", + "webmateHost": "Host Webmate", + "Enable": "Ativar", + "yourFireflinkDevicefarmDomain": "Seu domínio DeviceFarm Fireflink (por exemplo, cloud.fireflink.com)", + "yourLicenseId": "Seu ID da licença", + "yourProjectName": "Nome do seu projeto", + "License ID": "ID da licença", + "Project Name": "Nome do Projeto", + "Fireflink DeviceFarm Domain": "Domínio da DeviceFarm Fireflink", + "Fireflink DeviceFarm Access Key": "Chave de acesso da DeviceFarm Fireflink", + "Fireflink DeviceFarm License ID": "ID da licença da DeviceFarm Fireflink", + "Fireflink DeviceFarm Project Name": "Nome do Projeto da DeviceFarm Fireflink", + "RabbitQA API Key": "Chave da API RabbitQA", + "RestartSessionMessage": "Conexão com dispositivo perdida - Reiniciando a Sessão…", + "ToggleRestartSession": "Disparar recarregamento de sessão após desconectar dispositivo", + "toggleTableFormatting": "Alternar formatação da tabela", + "copyResultToClipboard": "Copiar Resultado para Área de Transferência", + "Property": "Propriedade", + "noCapsFound": "Nenhum recurso de sessão encontrado. Por favor, use o Criador de recursos para editar, adicionar e salvar seu conjunto de recursos. Consulte o tutorial em {{url}}", + "executeMethods": "Executar Métodos", + "dynamicCommandsDescription": "Execute comandos suportados pelo driver ativo atualmente e plugin(s). Observe que alguns comandos só podem funcionar em contextos específicos. Qualquer comando não suportado pelo WebdriverIO não está incluído nesta lista.", + "dynamicExecuteMethodsDescription": "Execute qualquer método de execução suportado pelos driver e plugin(s) ativos atualmente.", + "methodDeprecated": "Este método está obsoleto", + "App Settings": "Configurações do Aplicativo", + "unableToImportSessionFiles": "Não foi possível importar os gestos dos seguintes arquivos: {{fileNames}}", + "Import from File": "Importar de Arquivo", + "useMjpegStream": "Usar stream MJPEG", + "useScreenshotApi": "Usar API de Captura de tela", + "Box Model": "Modelo da caixa", + "detachFromSession": "Desanexar da sessão", + "enterSessionID": "Insira a ID de sessão para anexar manualmente", + "refreshDiscoveredSessions": "Atualizar Sessões Descobertas", + "toggleMultiDisplayMode": "Ativar/desativar Modo Exibição Múltipla" } diff --git a/assets/locales/pt-PT/translation.json b/app/common/public/locales/pt-PT/translation.json similarity index 73% rename from assets/locales/pt-PT/translation.json rename to app/common/public/locales/pt-PT/translation.json index add6c10e25..b63f0015ba 100644 --- a/assets/locales/pt-PT/translation.json +++ b/app/common/public/locales/pt-PT/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "Trazer Tudo para Frente", "Help": "Ajuda", "Appium Documentation": "Documentação do Appium", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Salvar predefinição de argumentos do servidor", "Save": "Salvar", "Cancel": "Cancelar", - "datetimeFormat": "D MMM YYYY, h:m", "updateDetails": "Data de Lançamento: {{pubDate}}\n\nNotas de Lançamento: {{notes}}", "appiumIsAvailable": "Inspetor Appium {{name}} está disponível", "updateIsBeingDownloaded": "A atualização está sendo baixada agora. Você será notificado novamente quando estiver concluída", @@ -68,20 +66,11 @@ "Could not start session": "Não foi possível iniciar a sessão", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "Nome de usuário e chave de acesso Sauce são necessários!", - "testingbotCredentialsRequired": "TestingBot key and secret are required!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken is required", - "browserstackCredentialsRequired": "Nome de usuário e chave de acesso Browserstack são necessários!", - "lambdatestCredentialsRequired": "Nome de usuário e chave de acesso Lambdatest são necessários!", - "bitbarCredentialsRequired": "Chave da API Bitbar necessária!", - "kobitonCredentialsRequired": "Nome de usuário e chave de API KOBITON são necessários!", - "experitestAccessKeyURLRequired": "Chaves de acesso Experitest e URL são necessários", "experitestAccessKey": "Chave de acesso Experitest", "experitestUrl": "Experitest Url", "locatorStrategy": "Locator Strategy:", "selector": "Seletor:", "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", - "selectElementInSource": "Select an element in the source to begin.", "Press Home Button": "Pressione o botão Home", "Execute Siri Command": "Executar Comando Siri", "Press Back Button": "Pressione o botão Voltar", @@ -100,11 +89,11 @@ "Pause Recording": "Pausar Gravação", "Search for element": "Procurar pelo elemento", "App Source": "Fonte do aplicativo", + "Collapse All": "Collapse All", "Toggle Attributes": "Alternar atributos", "Copy XML Source to Clipboard": "Copiar XML Fonte para Área de Transferência", "Download Source as .XML File": "Baixar Fonte como Arquivo .XML", "Copy Attributes to Clipboard": "Copiar Atributos para Área de Transferência", - "quitSessionAndClose": "Sair da Sessão & Fechar o Inspetor", "Session Inactive": "Sessão Inativa", "Keep Session Running": "Manter Sessão em Execução", "Quit Session": "Sair da Sessão", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Tocar", "Gathering initial app source…": "Gathering initial app source…", "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "booleano", "number": "número", "JSON object": "Objeto JSON", - "filepath": "filepath", "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", - "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Permitir Certificados Não Autorizados", "Use Proxy": "Use Proxy", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "Anexar à sessão…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Porto", @@ -195,16 +184,19 @@ "Remote Path": "Caminho Remoto", "BrowserStack Username": "Usuário BrowserStack", "BrowserStack Access Key": "Chave de acesso BrowserStack", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Bitbar API Key", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Nome", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Enter your session ID here", + "searchSessions": "Search discovered sessions", "Proxy URL": "Proxy URL", "Source": "Fonte", "Commands": "Comandos", @@ -212,12 +204,14 @@ "Gestures": "Gestos", "Gesture Builder": "Construtor de Gesto", "Saved Gestures": "Gestos salvos", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Crie, salve e execute gestos personalizados aqui. Gestos são idênticos às cadeias de ação na API de ações do W3C WebDriver.", "Session Information": "Informação da sessão", "Execute Command": "Executar Comando", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Clique para definir coordenadas", - "Set Coordinates Via Field": "Definir Coordenadas Via Campo", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Tipo de Ação", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Esquerda", "Right": "Direita", "Play": "Reproduzir", + "Export to File": "Export to File", "Save Capability Set As": "Save Capability Set As…", "Edit Raw JSON": "Edit Raw JSON", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "Área de Transferência", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "Dados de Desempenho", - "System": "Sistema", "Session": "Sessão", "Web": "Web", "Context": "Contexto", - "Window (W3C)": "Janela (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "Erro", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Chamada para '{{methodName}}' falhou", - "methodCallResult": "Resultado de '{{methodName}}'", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "Chave TestingBot", "TestingBot Secret": "Segredo TestingBot", "Appium Server": "Servidor Appium", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/ru/translation.json b/app/common/public/locales/ru/translation.json similarity index 71% rename from assets/locales/ru/translation.json rename to app/common/public/locales/ru/translation.json index b63b9e1b29..33f2eaa169 100644 --- a/assets/locales/ru/translation.json +++ b/app/common/public/locales/ru/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Отдалить", "Reset Zoom Level": "Сброс масштаба", "Close Window": "Закрыть окно", - "Open Session File…": "Открыть файл сессии…", "Bring All to Front": "На передний план", "Help": "Помощь", "Appium Documentation": "Документация Appium", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Сохранить пресет аргументов сервера", "Save": "Сохранить", "Cancel": "Отмена", - "datetimeFormat": "MMM Do YYYY, h:mma", "updateDetails": "Дата релиза: {{pubDate}}\n\nПримечания к релизу: {{notes}}", "appiumIsAvailable": "Доступен инспектор Appium {{name}}", "updateIsBeingDownloaded": "Обновление загружается. Вы будете уведомлены сразу по завершению", @@ -67,21 +65,12 @@ "findElementFailure": "Не удалось найти элемент для '{{methodName}}'. Пожалуйста, обновите страницу и повторите попытку.", "Could not start session": "Не удалось запустить сессию", "couldNotConnect": "Не удалось подключиться к URL сервера Appium '{{url}}'. Пожалуйста, проверьте, работает ли сервер и правилен ли URL. Корректные адреса можно найти в начале журнала сервера Appium. Если используется версия браузера Inspector, убедитесь, что сервер запущен с флагом --allow-cors.", - "Invalid URL:": "Неверный URL:", - "sauceCredentialsRequired": "Требуется имя пользователя и ключ доступа к Sauce!", - "testingbotCredentialsRequired": "Требуется ключ и секрет API TestingBot!", - "Perfecto SecurityToken is required": "Требуется SecurityToken Perfecto", - "browserstackCredentialsRequired": "Требуется имя пользователя и ключ доступа Browserstack!", - "lambdatestCredentialsRequired": "Требуется имя пользователя и ключ доступа LambdaTest!", - "bitbarCredentialsRequired": "Требуется ключ API Bitbar!", - "kobitonCredentialsRequired": "Требуется имя пользователя и ключ API KOBITON!", - "experitestAccessKeyURLRequired": "Требуются URL и ключ доступа к Experitest", + "Invalid URL:": "Негодный URL:", "experitestAccessKey": "Ключ доступа к Experitest", "experitestUrl": "URL Experitest", "locatorStrategy": "Стратегия поиска:", "selector": "Селектор:", "couldNotObtainScreenshot": "Не удалось получить скриншот: {{screenshotError}}", - "selectElementInSource": "Выберите элемент в источнике.", "Press Home Button": "Нажать кнопку \"Домой\"", "Execute Siri Command": "Выполнить команду Siri", "Press Back Button": "Нажать кнопку \"Назад\"", @@ -100,11 +89,11 @@ "Pause Recording": "Приостановить запись", "Search for element": "Поиск элемента", "App Source": "Источник приложения", + "Collapse All": "Свернуть все", "Toggle Attributes": "Свернуть/развернуть атрибуты", "Copy XML Source to Clipboard": "Копировать XML в буфер обмена", "Download Source as .XML File": "Скачать исходный код как .XML файл", "Copy Attributes to Clipboard": "Копировать атрибуты в буфер обмена", - "quitSessionAndClose": "Выйти из сессии и закрыть инспектор", "Session Inactive": "Сессия неактивна", "Keep Session Running": "Оставить сессию запущенной", "Quit Session": "Покинуть сессию", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "XPath не рекомендуется и может привести к \"хрупким\" тестам. Попросите вашу команду разработчиков предоставить уникальные локаторы для поиска элементов!", "noAdditionalContextsFound": "Дополнительные контексты не были обнаружены", "contextDropdownInfo": "Обнаружено несколько контекстов; некоторые элементы могут быть доступны только после переключения на другой контекст. Обратите внимание, что осмотр webview в Appium Inspector менее точен, чем в DevTools Chrome или Safari. Подробнее:", - "idAutocompletionCanBeDisabled": "Запрошенный id-селектор не имеет префикса имени пакета. Эта сессия автоматически дополняет имя пакета. Возможно, поэтому элементы не найдены. Чтобы отключить автодополнение, перезапустите сессию с возможностью 'appium:disableIdLocatorAutocompletion' и ее значением 'true'.", + "idAutocompletionCanBeDisabled": "Запрошенный id-селектор не имеет префикса имени пакета. Эта сессия автоматически дополняет имя пакета, и, возможно, поэтому элементы не найдены. Чтобы отключить автодополнение, измените параметр 'disableIdLocatorAutocompletion' на 'true'.", "missingAutomationNameForStrategies": "Возможно, доступны дополнительные стратегии локаторов. Для их просмотра при запуске сессии добавьте возможность 'appium:automationName'. Обратите внимание, что эта возможность в Appium 2 обязательна.", + "snapshotMaxDepthReached": "Этот элемент находится на максимальной глубине источника {{selectedElementDepth}}, поэтому его дочерние элементы (если таковые имеются) не отображаются. Чтобы показать их, измените параметр 'snapshotMaxDepth' на значение больше {{selectedElementDepth}}. Обращаетесь в документацию вашего драйвера для максимально поддерживаемого значения.", "Tap": "Нажать", "Gathering initial app source…": "Сбор исходного кода приложения…", "couldNotObtainSource": "Не удалось получить исходный код: {{errorMsg}}", @@ -161,19 +151,18 @@ "boolean": "логическое значение", "number": "число", "JSON object": "JSON-объект", - "filepath": "путь к файлу", "connectToExistingSessionInstructions": "Если у вас уже есть выполняемая сессия, можно напрямую подключить к ней инспектор.", - "selectSessionIDInDropdown": "Выберите идентификатор сессии в выпадающем списке ниже", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Неавторизованные сертификаты", "Use Proxy": "Использовать прокси", "JSON Representation": "Представление в JSON", "Capability Builder": "Создатель возможностей", "Saved Capability Sets": "Сохраненные наборы возможностей", - "Attach to Session": "Прикрепиться к сессии…", + "Attach": "Attach", "localhost": "localhost", "Host": "Хост", "Port": "Порт", - "usingDataFoundIn": "Использование данных из переменной среды {{environmentVariable}}", + "usingDataFoundIn": "Подстановка данных из переменной среды {{environmentVariable}}", "yourUsername": "Ваше имя пользователя", "Sauce Username": "Имя пользователя Sauce", "Sauce Access Key": "Ключ доступа Sauce", @@ -195,16 +184,19 @@ "Remote Path": "Удаленный путь", "BrowserStack Username": "Имя пользователя BrowserStack", "BrowserStack Access Key": "Ключ доступа BrowserStack", - "LambdaTest Username": "Имя пользователя LambdaTest", - "LambdaTest Access Key": "Ключ доступа LambdaTest", + "TestMu AI Username": "Имя пользователя TestMU AI", + "TestMu AI Access Key": "Ключ доступа TestMu AI", "Bitbar API Key": "Ключ API Bitbar", "RemoteTestKit AccessToken": "Токен доступа RemoteTestKit", "RobotQA Token": "Токен RobotQA", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Добавить", "Name": "Название", "Description": "Описание", "Created": "Создано", "Actions": "Действия", - "enterYourSessionId": "Введите идентификатор сессии здесь", + "searchSessions": "Search discovered sessions", "Proxy URL": "URL прокси-сервера", "Source": "Источник", "Commands": "Команды", @@ -212,12 +204,14 @@ "Gestures": "Жесты", "Gesture Builder": "Конструктор жестов", "Saved Gestures": "Сохраненные жесты", + "Create New Gesture": "Создать новый жест", "gesturesDescription": "Создавайте, сохраняйте и выполняйте пользовательские жесты здесь. Жесты идентичны цепочкам действий в API веб-драйвера Actions стандарта W3C.", "Session Information": "Информация о сессии", "Execute Command": "Выполнить команду", "commandsDescription": "Выполняйте различные команды с помощью текущего драйвера Appium. Обратите внимание, что не все драйверы поддерживают все команды.", - "Click to Set Coordinates": "Кликните, чтобы установить координаты", - "Set Coordinates Via Field": "Установить координаты через поле", + "showMoveActionCoordsInPercentage": "Показать координаты перемещений в процентах от размеров экрана", + "showMoveActionCoordsInPixels": "Показать координаты перемещений в пикселях", + "toggleMoveActionCoordPicker": "Вкл./выкл. настройку координат при нажатии на скриншот", "Action Type": "Тип действия", "Pointer Up": "Указатель вверх", "Pointer Down": "Указатель вниз", @@ -234,29 +228,23 @@ "Left": "Левая", "Right": "Правая", "Play": "Воспроизвести", + "Export to File": "Экспортировать в файл", "Save Capability Set As": "Сохранить набор возможностей как…", "Edit Raw JSON": "Изменить JSON", - "Enter Parameters for:": "Введите параметры для:", + "enterMethodParameters": "Введите параметры для: '{{methodName}}'", "invalidJson": "Неверный JSON", - "Execute Script": "Выполнение скрипта", "App Management": "Управление приложениями", - "Clipboard": "Буфер обмена", "File Transfer": "Передача файлов", "Device Interaction": "Взаимодействие с устройством", - "Keyboard": "Клавиатура", - "Connectivity": "Подключения", - "Performance Data": "Данные производительности", - "System": "Система", "Session": "Сессия", "Web": "Веб", "Context": "Контекст", - "Window (W3C)": "Окно (W3C)", "simulatorOnly": "Только эмулятор/симулятор", "minAndroidSDK": "Минимальный уровень Android SDK", "Error": "Ошибка", "findingElementInSourceFailed": "Не удалось найти указанный элемент. Возможно, текущий источник приложения или ID элемента изменился, или в источнике слишком много элементов с одинаковыми координатами.", "callToMethodFailed": "Вызов '{{methodName}}' не удался", - "methodCallResult": "Результат '{{methodName}}'", + "methodCallResult": "Результат для: '{{methodName}}' (тип: {{resultType}})", "TestingBot Key": "Ключ API TestingBot", "TestingBot Secret": "Секрет API TestingBot", "Appium Server": "Сервер Appium", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "URL вебдрайвера Mobitru", "Mobitru Billing Unit": "Блок биллинга Mobitru", "Mobitru Access Key": "Ключ доступа Mobitru", - "mobitruCredentialsRequired": "Требуется ключ доступа Mobitru", "Session URL": "URL сессии", "Server Details": "Детали сервера", "Session Length": "Длина сессии", "Session Details": "Детали сессии", "Currently Active App ID": "Идентификатор активного приложения", - "Session ID": "ID сессии", "confirmDeletion": "Вы уверены, что хотите удалить это?", "Copied!": "Скопировано!", "Error Fetching Session URL": "Ошибка извлечения URL сессии", - "noResultsFound": "Результатов не найдено", - "invalidCapType": "Неверный тип возможности: {{type}}", - "whitespaceDetected": "Текст начинается и/или заканчивается с пробелом" + "noRunningSessionsFound": "No running sessions found", + "invalidCapType": "Негодный тип возможности: {{type}}", + "whitespaceDetected": "Текст начинается и/или заканчивается с пробелом", + "duplicateCapabilityNameError": "Набор возможностей с таким именем уже существует", + "unableToImportGestureFiles": "Не удалось импортировать жесты из следующих файлов: {{fileNames}}", + "invalidSessionFile": "Негодный файл сессии", + "TV Labs API Key": "API ключ TV Labs", + "TestcribeAPIKey": "API ключ Testcribe", + "sessionTestcribeApiKeyDescription": "Вы можете получить ваш ключ API от https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Пожалуйста, укажите следующие данные сервера для {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Отсутствует информация о сервере, не удалось запросить сессии", + "Username": "Имя пользователя", + "URL": "URL", + "WebDriver URL": "URL вебдрайвера", + "API Key": "Ключ API", + "Access Key": "Ключ доступа", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Токен", + "Key": "Ключ", + "Secret": "Секрет", + "Theme": "Тема", + "Light Theme": "Светлая тема", + "Dark Theme": "Тёмная тема", + "System Theme": "Системная тема", + "Search Source": "Искать в источнике", + "Matching Elements": "Совпадающие элементы", + "webmateApiKey": "API ключ webmate", + "yourProjectId": "ID вашего проекта", + "webmateProjectId": "ID проекта webmate", + "specifyWebmateHostExplicitly": "Указать конкретный хост webmate", + "webmateHost": "Хост webmate", + "Enable": "Включить", + "yourFireflinkDevicefarmDomain": "Ваш домен Fireflink DeviceFarm (например, cloud.fireflink.com)", + "yourLicenseId": "ID вашей лицензии", + "yourProjectName": "Название вашего проекта", + "License ID": "ID лицензии", + "Project Name": "Название проекта", + "Fireflink DeviceFarm Domain": "Домен Fireflink DeviceFarm", + "Fireflink DeviceFarm Access Key": "Ключ доступа Fireflink DeviceFarm", + "Fireflink DeviceFarm License ID": "ID лицензии Fireflink DeviceFarm", + "Fireflink DeviceFarm Project Name": "Имя проекта Fireflink DeviceFarm", + "RabbitQA API Key": "API ключ RabbitQA", + "RestartSessionMessage": "Соединение с устройством потеряно – сессия перезагружается…", + "ToggleRestartSession": "Перезагрузить сессию при потере соединения с устройством", + "toggleTableFormatting": "Переключить форматирование таблицей", + "copyResultToClipboard": "Копировать результат", + "Property": "Свойство", + "noCapsFound": "Способности сеанса не найдены. Пожалуйста, используйте конструктор способностей для редактирования, добавления и сохранения набора возможностей. Больше информации: {{url}}", + "executeMethods": "Методы выполнения", + "dynamicCommandsDescription": "Исполняете команды, поддерживаемые активным драйвером и плагином(-ами). Обратите внимание, что некоторые команды могут работать только в определенных контекстах. Любые команды, не поддерживаемые WebdriverIO, не включены в этот список.", + "dynamicExecuteMethodsDescription": "Исполняете любой метод выполнения, поддерживаемый активным драйвером и плагином(-ами).", + "methodDeprecated": "Этот метод устарел", + "App Settings": "Настройки приложения", + "unableToImportSessionFiles": "Не удалось импортировать сессии из следующих файлов: {{fileNames}}", + "Import from File": "Импортировать из файла", + "useMjpegStream": "Использовать поток MJPEG", + "useScreenshotApi": "Использовать скриншот API", + "Box Model": "Модель блока", + "detachFromSession": "Отсоединиться от сессии", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/app/common/public/locales/sv-SE/translation.json b/app/common/public/locales/sv-SE/translation.json new file mode 100644 index 0000000000..9ad71e149c --- /dev/null +++ b/app/common/public/locales/sv-SE/translation.json @@ -0,0 +1,331 @@ +{ + "appiumInspector": "Appium Inspector", + "Edit": "Edit", + "Redo": "Redo", + "Cut": "Cut", + "Copy": "Copy", + "Paste": "Paste", + "Delete": "Delete", + "Select All": "Select All", + "Window": "Window", + "Minimize": "Minimize", + "Zoom": "Zoom", + "Zoom In": "Zoom In", + "Zoom Out": "Zoom Out", + "Reset Zoom Level": "Reset Zoom Level", + "Close Window": "Close Window", + "Bring All to Front": "Bring All to Front", + "Help": "Help", + "Appium Documentation": "Appium Documentation", + "Inspector Documentation": "Inspector Documentation", + "Appium Discussion Forum": "Appium Discussion Forum", + "Report Issues": "Report Issues", + "About Appium Inspector": "About Appium Inspector", + "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n", + "Improve Translations": "Improve Translations", + "Check for Updates…": "Check for Updates…", + "File": "File", + "New Window": "New Window", + "Hide Appium Inspector": "Hide Appium Inspector", + "Hide Others": "Hide Others", + "Show All": "Show All", + "Quit Appium Inspector": "Quit Appium Inspector", + "Toggle Full Screen": "Toggle Full Screen", + "Languages": "Languages", + "View": "View", + "Reload": "Reload", + "Toggle Developer Tools": "Toggle Developer Tools", + "Undo": "Undo", + "Restart Now": "Restart Now", + "Save Server Arguments Preset": "Save Server Arguments Preset", + "Save": "Save", + "Cancel": "Cancel", + "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", + "appiumIsAvailable": "Appium Inspector {{name}} is available", + "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", + "updateIsDownloaded": "Appium Inspector {{releaseName}} has been downloaded. Must restart to apply the updates (note: it may take several minutes for Appium Inspector to install and restart)", + "updateDownloadFailed": "Failed to download update. Reason: {{message}}", + "OK": "OK", + "Install Now": "Install Now", + "Install Later": "Install Later", + "Update Download Started": "Update Download Started", + "No update available": "No update available", + "Appium Inspector is up-to-date": "Appium Inspector is up-to-date", + "Later": "Later", + "Update Downloaded": "Update Downloaded", + "Could not download update": "Could not download update", + "Unexpected Error:": "Unexpected Error:", + "Please report this issue at:": "Please report this issue at:", + "Full error trace:": "Full error trace:", + "Copy Error Trace": "Copy Error Trace", + "Inspect element": "Inspect element", + "Session closed due to inactivity": "Session closed due to inactivity", + "Session has been terminated": "Session has been terminated", + "frameworkNotSupported": "Framework '{{framework}}' not supported", + "findElementFailure": "Failed to find element for '{{methodName}}'. Please refresh page and try again.", + "Could not start session": "Could not start session", + "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", + "Invalid URL:": "Invalid URL:", + "experitestAccessKey": "Experitest AccessKey", + "experitestUrl": "Experitest Url", + "locatorStrategy": "Locator Strategy:", + "selector": "Selector:", + "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", + "Press Home Button": "Press Home Button", + "Execute Siri Command": "Execute Siri Command", + "Press Back Button": "Press Back Button", + "Press App Switch Button": "Press App Switch Button", + "Command": "Command", + "Show Element Handles": "Show Element Handles", + "Hide Element Handles": "Hide Element Handles", + "Select Elements": "Select Elements", + "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates", + "Download Screenshot": "Download Screenshot", + "Back": "Back", + "Start Refreshing Source": "Start Refreshing Source", + "Pause Refreshing Source": "Pause Refreshing Source", + "refreshSource": "Refresh Source & Screenshot", + "Start Recording": "Start Recording", + "Pause Recording": "Pause Recording", + "Search for element": "Search for element", + "App Source": "App Source", + "Collapse All": "Collapse All", + "Toggle Attributes": "Toggle Attributes", + "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", + "Download Source as .XML File": "Download Source as .XML File", + "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", + "Session Inactive": "Session Inactive", + "Keep Session Running": "Keep Session Running", + "Quit Session": "Quit Session", + "Your session is about to expire": "Your session is about to expire", + "Enter Keys to Send": "Enter Keys to Send", + "Find and Select in Source": "Find and Select in Source", + "Clear": "Clear", + "Send Keys": "Send Keys", + "Done": "Done", + "Search": "Search", + "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code", + "Copy code to clipboard": "Copy code to clipboard", + "Start this Kind of Session with Code": "Start this Kind of Session with Code", + "Clear Actions": "Clear Actions", + "Close Recorder": "Close Recorder", + "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here", + "Recorder": "Recorder", + "Attribute": "Attribute", + "Value": "Value", + "Find By": "Find By", + "Selector": "Selector", + "Time": "Time (ms)", + "Get Timing": "Get Timing", + "interactionsNotAvailable": "Interactions for this element may not be available", + "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", + "noAdditionalContextsFound": "No additional contexts have been detected", + "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", + "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", + "Tap": "Tap", + "Gathering initial app source…": "Gathering initial app source…", + "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", + "iOS": "iOS", + "Android": "Android", + "desiredCapabilitiesDocumentation": "Capabilities Documentation", + "startSession": "Start Session", + "saveAs": "Save As…", + "attachToSession": "Attach to Session", + "selectedElement": "Selected Element", + "unnamed": "(Unnamed)", + "No Description": "No Description", + "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}", + "couldNotFindAnyElements": "Could not find any elements", + "elementsCount": "Elements found:", + "xCoordinate": "X: {{x}}", + "yCoordinate": "Y: {{y}}", + "SauceLabs Data Center": "SauceLabs Data Center", + "US-West": "US West 1", + "US-East": "US East 4", + "EU-Central": "EU Central 1", + "proxyThroughSC": "Proxy through Sauce Connect's Selenium Relay", + "SSL": "SSL", + "text": "text", + "boolean": "boolean", + "number": "number", + "JSON object": "JSON object", + "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", + "allowUnauthorizedCerts": "Allow Unauthorized Certificates", + "Use Proxy": "Use Proxy", + "JSON Representation": "JSON Representation", + "Capability Builder": "Capability Builder", + "Saved Capability Sets": "Saved Capability Sets", + "Attach": "Attach", + "localhost": "localhost", + "Host": "Host", + "Port": "Port", + "usingDataFoundIn": "Using data found in {{environmentVariable}}", + "yourUsername": "Your Username", + "Sauce Username": "Sauce Username", + "Sauce Access Key": "Sauce Access Key", + "yourAccessKey": "Your Access Key", + "yourApiKey": "Your API Key", + "Perfecto Host": "Perfecto Host", + "Perfecto Port": "Perfecto Port", + "Pcloudy User Name": "Pcloudy User Name", + "Pcloudy Host": "Pcloudy Host", + "Pcloudy API Key": "Pcloudy API Key", + "Add your token": "Add your token", + "Perfecto Token": "Perfecto Token", + "Your Kobiton Username": "Your Kobiton Username", + "Kobiton Access Key": "Kobiton Access Key", + "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL", + "sessionHeadspinWebDriverURLDescription": "Get the URL from the HeadSpin UI or the HeadSpin API using the automation configuration route", + "Remote Host": "Remote Host", + "Remote Port": "Remote Port", + "Remote Path": "Remote Path", + "BrowserStack Username": "BrowserStack Username", + "BrowserStack Access Key": "BrowserStack Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", + "Bitbar API Key": "Bitbar API Key", + "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", + "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", + "Name": "Name", + "Description": "Description", + "Created": "Created", + "Actions": "Actions", + "searchSessions": "Search discovered sessions", + "Proxy URL": "Proxy URL", + "Source": "Source", + "Commands": "Commands", + "Execute Commands": "Execute Commands", + "Gestures": "Gestures", + "Gesture Builder": "Gesture Builder", + "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", + "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", + "Session Information": "Session Information", + "Execute Command": "Execute Command", + "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", + "Action Type": "Action Type", + "Pointer Up": "Pointer Up", + "Pointer Down": "Pointer Down", + "Pause": "Pause", + "Move": "Move", + "Action Type Not Defined": "Action Type Not Defined", + "Duration": "Duration", + "Button": "Button", + "Untitled Gesture": "Untitled Gesture", + "Add Description": "Add Description", + "Gesture saved": "Gesture saved", + "Gesture saved as": "Gesture saved as '{{gestureName}}'", + "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed", + "Left": "Left", + "Right": "Right", + "Play": "Play", + "Export to File": "Export to File", + "Save Capability Set As": "Save Capability Set As…", + "Edit Raw JSON": "Edit Raw JSON", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", + "invalidJson": "Invalid JSON", + "App Management": "App Management", + "File Transfer": "File Transfer", + "Device Interaction": "Device Interaction", + "Session": "Session", + "Web": "Web", + "Context": "Context", + "simulatorOnly": "Emulator/simulator only", + "minAndroidSDK": "Minimum Android SDK level", + "Error": "Error", + "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", + "callToMethodFailed": "Call to '{{methodName}}' failed", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", + "TestingBot Key": "TestingBot Key", + "TestingBot Secret": "TestingBot Secret", + "Appium Server": "Appium Server", + "Select Cloud Providers": "Select Cloud Providers", + "Advanced Settings": "Advanced Settings", + "Native App Mode": "Native App Mode", + "Web/Hybrid App Mode": "Web/Hybrid App Mode", + "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start", + "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.", + "Mobitru WebDriver URL": "Mobitru WebDriver URL", + "Mobitru Billing Unit": "Mobitru Billing Unit", + "Mobitru Access Key": "Mobitru Access Key", + "Session URL": "Session URL", + "Server Details": "Server Details", + "Session Length": "Session Length", + "Session Details": "Session Details", + "Currently Active App ID": "Currently Active App ID", + "confirmDeletion": "Are you sure you want to delete this?", + "Copied!": "Copied!", + "Error Fetching Session URL": "Error Fetching Session URL", + "noRunningSessionsFound": "No running sessions found", + "invalidCapType": "Invalid capability type: {{type}}", + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" +} diff --git a/assets/locales/te/translation.json b/app/common/public/locales/te/translation.json similarity index 80% rename from assets/locales/te/translation.json rename to app/common/public/locales/te/translation.json index 84939b4e10..c2f6a6b2ee 100644 --- a/assets/locales/te/translation.json +++ b/app/common/public/locales/te/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "అందరినీ ముందుకి తీసుకురండి", "Help": "సహాయం", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "సేవ్ సర్వర్ ఆర్గ్యుమెంట్స్ ప్రీసెట్", "Save": "సేవ్ చేయండి", "Cancel": "రద్దు చేయండి", - "datetimeFormat": "నెల తేదీ సంవత్సరం,గంట:నిమిషం> MMM Do YYYY, h:mma", "updateDetails": "విడుదల తారీఖు: {{pubDate}}\nవిడుదల గమనికలు: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} అందుబాటులో ఉంది", "updateIsBeingDownloaded": "అప్‌డేట్ ఇప్పుడు డౌన్‌లోడ్ చేయబడుతోంది. ఇది పూర్తయిన తర్వాత మీకు మళ్లీ తెలియజేయబడుతుంది", @@ -68,20 +66,11 @@ "Could not start session": "సెషన్‌ను ప్రారంభించడం సాధ్యపడలేదు", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "సాస్ వినియోగదారు పేరు మరియు యాక్సెస్ కీ అవసరం!", - "testingbotCredentialsRequired": "TestingBot కీ మరియు రహస్యం అవసరం!", - "Perfecto SecurityToken is required": "పర్ఫెక్టో సెక్యూరిటీ టోకెన్ అవసరం", - "browserstackCredentialsRequired": "బ్రౌజర్‌స్టాక్ వినియోగదారు పేరు మరియు యాక్సెస్ కీ అవసరం!", - "lambdatestCredentialsRequired": "లాంబ్డా పరీక్ష వినియోగదారు పేరు మరియు యాక్సెస్ కీ అవసరం!", - "bitbarCredentialsRequired": "బిట్ బార్ API కీ అవసరం!", - "kobitonCredentialsRequired": "KOBITON వినియోగదారు పేరు మరియు api కీ అవసరం!", - "experitestAccessKeyURLRequired": "Experitest యాక్సెస్‌కీ మరియు URL అవసరం", "experitestAccessKey": "Experitest యాక్సెస్‌కీ", "experitestUrl": "Experitest యొక్క Url", "locatorStrategy": "లొకేటర్ వ్యూహం:", "selector": "సెలెక్టర్:", "couldNotObtainScreenshot": "'{{screenshotError}}' దీని కారణంగా స్క్రీన్‌షాట్‌ను పొందడం సాధ్యపడలేదు", - "selectElementInSource": "ప్రారంభించడానికి మూలంలో ఒక మూలకాన్ని ఎంచుకోండి.", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "రికార్డింగ్‌ను పాజ్ చేయండి", "Search for element": "మూలకం కోసం శోధించండి", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "XML మూలాన్ని క్లిప్‌బోర్డ్‌కి కాపీ చేయండి", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "అట్రిబ్యూట్‌లను క్లిప్‌బోర్డ్‌కి కాపీ చేయండి", - "quitSessionAndClose": "సెషన్ నుండి నిష్క్రమించండి & ఇన్స్పెక్టర్ మూసివేయండి", "Session Inactive": "సెషన్ నిష్క్రియంగా ఉంది", "Keep Session Running": "సెషన్‌ను కొనసాగించండి", "Quit Session": "సెషన్ నుండి నిష్క్రమించండి", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "XPath లొకేటర్‌లను ఉపయోగించడం సిఫారసు చేయబడలేదు మరియు పెళుసుగా ఉండే పరీక్షలకు దారితీయవచ్చు. బదులుగా ప్రత్యేకమైన యాక్సెసిబిలిటీ లొకేటర్‌లను అందించమని మీ డెవలప్‌మెంట్ బృందాన్ని అడగండి!", "noAdditionalContextsFound": "అదనపు సందర్భాలు ఏవీ కనుగొనబడలేదు", "contextDropdownInfo": "బహుళ సందర్భాలు కనుగొనబడ్డాయి; కొన్ని అంశాలు వేరే సందర్భానికి మారిన తర్వాత మాత్రమే ప్రాప్తించును. Appium ఇన్‌స్పెక్టర్‌లోని వెబ్‌వ్యూ తనిఖీ, Chrome లేదా Safari యొక్క DevTools కంటే తక్కువ ఖచ్చితమైనదని గమనించండి. మరింత సమాచారం కోసం, చూడండి:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "నొక్కండి", "Gathering initial app source…": "ప్రారంభ అప్లికేషన్ మూలాన్ని సేకరిస్తోంది…", "couldNotObtainSource": "'{{errorMsg}}' కారణంగా మూలాన్ని పొందడం సాధ్యపడలేదు", @@ -161,15 +151,14 @@ "boolean": "బూలియన్", "number": "సంఖ్య", "JSON object": "JSON వస్తువు", - "filepath": "ఫైల్ మార్గం", "connectToExistingSessionInstructions": "మీరు పై సర్వర్ రకానికి చెందిన సెషన్‌ను ఇప్పటికే అమలు చేస్తున్నట్లయితే, మీరు నేరుగా దానికి ఇన్‌స్పెక్టర్‌ని జోడించవచ్చు.", - "selectSessionIDInDropdown": "దిగువ డ్రాప్‌డౌన్‌లో సెషన్ IDని ఎంచుకోండి.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "అనధికార ధృవపత్రాలను అనుమతించండి", "Use Proxy": "ప్రతినిధిని ఉపయోగించండి", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "సెషన్‌కు అటాచ్ చేయండి…", + "Attach": "Attach", "localhost": "స్థానిక హోస్ట్", "Host": "హోస్ట్", "Port": "పోర్ట్", @@ -195,16 +184,19 @@ "Remote Path": "రిమోట్ మార్గం", "BrowserStack Username": "బ్రౌజర్‌స్టాక్ వినియోగదారు పేరు", "BrowserStack Access Key": "బ్రౌజర్‌స్టాక్ యాక్సెస్ కీ", - "LambdaTest Username": "లాంబ్డా టెస్ట్ వినియోగదారు పేరు", - "LambdaTest Access Key": "లాంబ్డా టెస్ట్ యాక్సెస్ కీ", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "బిట్ బార్ API కీ", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "పేరు", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "మీ సెషన్ IDని ఇక్కడ నమోదు చేయండి", + "searchSessions": "Search discovered sessions", "Proxy URL": "బదులుగా నియమించు URL", "Source": "మూలం", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "సామర్థ్యాన్ని ఇలా సెట్ చేయండి...", "Edit Raw JSON": "రా JSONని సవరించండి", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "క్లిప్‌బోర్డ్", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "పనితీరు డేటా", - "System": "వ్యవస్థ", "Session": "సెషన్", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "లోపం", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "'{{methodName}}'కి కాల్ విఫలమైంది", - "methodCallResult": "'{{methodName}}' ఫలితం", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "టెస్టింగ్‌బాట్ కీ", "TestingBot Secret": "టెస్టింగ్‌బాట్ సీక్రెట్", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/tr/translation.json b/app/common/public/locales/tr/translation.json similarity index 71% rename from assets/locales/tr/translation.json rename to app/common/public/locales/tr/translation.json index c6ee79a5d5..dc5b491161 100644 --- a/assets/locales/tr/translation.json +++ b/app/common/public/locales/tr/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "Bring All to Front", "Help": "Help", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Save Server Arguments Preset", "Save": "Save", "Cancel": "Cancel", - "datetimeFormat": "MMM Do YYYY, h:mma", "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} is available", "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", @@ -68,20 +66,11 @@ "Could not start session": "Could not start session", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "Sauce username and access key are required!", - "testingbotCredentialsRequired": "TestingBot key and secret are required!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken is required", - "browserstackCredentialsRequired": "Browserstack username and access key are required!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "Bitbar API key required!", - "kobitonCredentialsRequired": "KOBITON username and api key are required!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "Locator Strategy:", "selector": "Selector:", "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", - "selectElementInSource": "Select an element in the source to begin.", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "Kaydı Duraklat", "Search for element": "Öğe Ara", "App Source": "Uygulama kaynağı", + "Collapse All": "Collapse All", "Toggle Attributes": "Nitelikleri Değiştir", "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", - "quitSessionAndClose": "Quit Session & Close Inspector", "Session Inactive": "Session Inactive", "Keep Session Running": "Keep Session Running", "Quit Session": "Quit Session", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "XPath konumlayıcıların kullanılması önerilmez ve hassas testlere yol açabilir. Bunun yerine geliştirme ekibinizden benzersiz erişilebilirlik konum belirleyicileri sağlamasını isteyin!", "noAdditionalContextsFound": "Hiçbir ek bağlam algılanmadı", "contextDropdownInfo": "Birden fazla bağlam algılandı; belirli öğelere yalnızca farklı bir bağlama geçtikten sonra erişilebilir. Appium Inspector'daki web görünümü denetiminin Chrome veya Safari'nin DevTools'una göre daha az doğru olduğunu unutmayın. Daha fazla bilgi için bakınız:", - "idAutocompletionCanBeDisabled": "İstenen kimlik seçicinin paket adı öneki yok. Bu Appium oturumunda paket adı otomatik tamamlama özelliği etkinleştirildi; hiçbir öğenin bulunamamasının nedeni bu olabilir. Bu davranışı devre dışı bırakmak için, bu oturumu 'appium:disableIdLocatorAutocompletion' özelliği 'true' olarak ayarlanmış şekilde yeniden başlatın.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Ek konum belirleme stratejileri mevcut olabilir. Bunları görüntülemek için oturumu başlatırken 'appium:automationName' özelliğini ekleyin. Bu yeteneğin Appium 2'de zorunlu olduğunu unutmayın.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Zamanla", "Gathering initial app source…": "Gathering initial app source…", "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "boolean", "number": "number", "JSON object": "JSON object", - "filepath": "filepath", "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", - "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Allow Unauthorized Certificates", "Use Proxy": "Use Proxy", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "Attach to Session…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Port", @@ -195,16 +184,19 @@ "Remote Path": "Remote Path", "BrowserStack Username": "BrowserStack Username", "BrowserStack Access Key": "BrowserStack Access Key", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Bitbar API Key", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Name", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Enter your session ID here", + "searchSessions": "Search discovered sessions", "Proxy URL": "Proxy URL", "Source": "Source", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "Save Capability Set As…", "Edit Raw JSON": "Edit Raw JSON", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "Clipboard", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "Performance Data", - "System": "System", "Session": "Session", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "Error", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Call to '{{methodName}}' failed", - "methodCallResult": "'{{methodName}}' result", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "TestingBot Key", "TestingBot Secret": "TestingBot Secret", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/assets/locales/uk/translation.json b/app/common/public/locales/uk/translation.json similarity index 70% rename from assets/locales/uk/translation.json rename to app/common/public/locales/uk/translation.json index 6cbedc0000..912cf8707c 100644 --- a/assets/locales/uk/translation.json +++ b/app/common/public/locales/uk/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Зменшити", "Reset Zoom Level": "Скинути рівень масштабування", "Close Window": "Закрити вікно", - "Open Session File…": "Відкрити файл сесії…", "Bring All to Front": "Помістити все на передній план", "Help": "Допомога", "Appium Documentation": "Документація Appium", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Зберегти налаштування параметрів сервера", "Save": "Зберегти", "Cancel": "Скасувати", - "datetimeFormat": "D.M.YYYY, HH:mm", "updateDetails": "Дата релізу: {{pubDate}}\n\nНотатки до релізу: {{notes}}", "appiumIsAvailable": "Appium інспектор {{name}} доступний", "updateIsBeingDownloaded": "Оновлення завантажується. Ви будете повідомлені, щойно процес завершиться", @@ -68,20 +66,11 @@ "Could not start session": "Не вдалося почати сеанс", "couldNotConnect": "Не вдалося з'єднатися з Appium сервером за URL-адресою '{{url}}. Перевірте, чи сервер запущений і чи правильний URL (дійсні URL-адреси можна знайти на початку журнала Appium). Якщо ви використовуєте Inspector версію браузера, переконайтеся, що сервер запущено з '--allow-cors'.", "Invalid URL:": "Невірний URL:", - "sauceCredentialsRequired": "Необхідні ім'я користувача та ключ доступу від Sauce!", - "testingbotCredentialsRequired": "Необхідні ключ та секрет від TestingBot!", - "Perfecto SecurityToken is required": "Необхідний Perfecto SecurityToken", - "browserstackCredentialsRequired": "Необхідні ім'я користувача та ключ доступу від Browserstack!", - "lambdatestCredentialsRequired": "Необхідні ім'я користувача та ключ доступу від Lambdatest!", - "bitbarCredentialsRequired": "Потрібен API ключ Bitbar!", - "kobitonCredentialsRequired": "Необхідні ім'я користувача та API ключ від KOBITON!", - "experitestAccessKeyURLRequired": "Ключ доступу Experitest та адреса є обов'язковими", "experitestAccessKey": "Ключ доступу Experitest", "experitestUrl": "Адреса Experitest", "locatorStrategy": "Стратегія локатора:", "selector": "Селектор:", "couldNotObtainScreenshot": "Не вдалося отримати скриншот: {{screenshotError}}", - "selectElementInSource": "Виберіть елемент у джерелі, щоб почати.", "Press Home Button": "Натисніть кнопку \"Додому\"", "Execute Siri Command": "Виконати команду Siri", "Press Back Button": "Натисніть кнопку \"Назад\"", @@ -100,11 +89,11 @@ "Pause Recording": "Призупинити запис", "Search for element": "Пошук елемента", "App Source": "Джерело програми", + "Collapse All": "Згорнути все", "Toggle Attributes": "Перемкнути атрибути", "Copy XML Source to Clipboard": "Скопіювати XML в буфер обміну", "Download Source as .XML File": "Завантажити джерело як .XML файл", "Copy Attributes to Clipboard": "Скопіювати атрибути в буфер обміну", - "quitSessionAndClose": "Завершити сесію та закрити інспектор", "Session Inactive": "Сесія неактивна", "Keep Session Running": "Зберігати сесію активною", "Quit Session": "Завершити сесію", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "Використання локаторів XPath не рекомендується і може призвести до нестабільності тестів. Попросіть свою команду розробників натомість присвоїти елементам унікальні локатори.", "noAdditionalContextsFound": "Додаткові контексти не були виявлені", "contextDropdownInfo": "Виявлено декілька контекстів; певні елементи можуть бути доступні лише після перемикання в інший контекст. Зауважте, що перевірка веб-перегляду в Appium Inspector менш точна, ніж інструменти розробника Chrome або Safari. Для отримання додаткової інформації дивіться:", - "idAutocompletionCanBeDisabled": "Запитаний код селектора не має префіксу назви пакета. Цей сеанс Appium має увімкнену функцію автозавершення назви пакета. Це може бути причиною того, що не знайдено елементів. Для відключення цієї поведінки, перезапустіть цей сеанс з можливістю 'appium:disableIdLocatorAutocompletion' встановлено в 'true'.", + "idAutocompletionCanBeDisabled": "Запитаний селектор ідентифікатора не має префіксу назви пакета. Цей сеанс Appium має увімкнену функцію автозавершення назви пакета. Це може бути причиною того, що елементи не знайдено. Щоб вимкнути таку поведінку, змініть параметр 'disableIdLocatorAutocompletion' у значення 'true'.", "missingAutomationNameForStrategies": "Додаткові стратегії розташування можуть бути доступні. Для їх перегляду додайте «appium:automationName» під час запуску сесії. Зауважте, що ця можливість обов'язкова в Appium 2.", + "snapshotMaxDepthReached": "Цей елемент розташований на максимальній глибині джерела {{selectedElementDepth}}, тому його дочірні елементи (якщо такі є) не відображаються. Щоб розкрити їх, змініть параметр \"snapshotMaxDepth\" на значення, більше ніж {{selectedElementDepth}}. Перевірте документацію драйвера щодо максимального підтримуваного значення.", "Tap": "Торкніться", "Gathering initial app source…": "Збирання початкового коду програми…", "couldNotObtainSource": "Не вдалося отримати вихідний код: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "логічний тип", "number": "число", "JSON object": "JSON-об'єкт", - "filepath": "шлях до файлу", "connectToExistingSessionInstructions": "Якщо у вас вже є сесія вищевказаного типу сервера, ви можете приєднатися інспектором безпосередньо до неї.", - "selectSessionIDInDropdown": "Виберіть ID сесії у списку нижче.", + "selectSessionID": "Ви можете вручну ввести ідентифікатор сесії, або якщо сервер підтримує виявлення сесії, просто виберіть зі списку активних сесій.", "allowUnauthorizedCerts": "Дозволити не довірені сертифікати", "Use Proxy": "Використовувати проксі", "JSON Representation": "Представлення JSON", "Capability Builder": "Конструктор можливостей", "Saved Capability Sets": "Збережені набори сесійних опцій", - "Attach to Session": "Приєднатись до сесії…", + "Attach": "Прикріпити", "localhost": "localhost", "Host": "Хост", "Port": "Порт", @@ -195,16 +184,19 @@ "Remote Path": "Віддалений шлях", "BrowserStack Username": "Логін від BrowserStack", "BrowserStack Access Key": "Ключ доступу для BrowserStack", - "LambdaTest Username": "Логін від LambdaTest", - "LambdaTest Access Key": "Ключ доступу від LambdaTest", + "TestMu AI Username": "Імʼя користувача TestMu AI", + "TestMu AI Access Key": "Ключ доступу TestMu AI", "Bitbar API Key": "API-ключ Bitbar", "RemoteTestKit AccessToken": "Токен доступу RemoteTestKit", "RobotQA Token": "RobotQA токен", + "RobotActions Host": "RobotActions хост", + "RobotActions Token": "RobotActions токен", + "Add": "Додати", "Name": "Ім’я", "Description": "Опис", "Created": "Створено", "Actions": "Дії", - "enterYourSessionId": "Введіть свій ідентифікатор сесії тут", + "searchSessions": "Пошук відкритих сесій", "Proxy URL": "Адреса проксі", "Source": "Вихідний код", "Commands": "Команди", @@ -212,12 +204,14 @@ "Gestures": "Жести", "Gesture Builder": "Конструктор жестів", "Saved Gestures": "Збережені жести", + "Create New Gesture": "Створити новий жест", "gesturesDescription": "Створюйте, зберігайте та виконувати користувацькі жести тут. Жести ідентичні ланцюжкам дій в W3C WebDriver Actions API.", "Session Information": "Інформація про сеанс користувача", "Execute Command": "Виконати команду", "commandsDescription": "Виконайте різні команди, використовуючи поточний драйвер Appium. Зверніть увагу, що не всі драйвера підтримують всі команди.", - "Click to Set Coordinates": "Натисніть, щоб встановити координати", - "Set Coordinates Via Field": "Встановити координатне полів Via", + "showMoveActionCoordsInPercentage": "Показати координати дій переміщення у відсотках до розмірів екрана", + "showMoveActionCoordsInPixels": "Показувати координати дії переміщення в пікселях", + "toggleMoveActionCoordPicker": "Перемкнути налаштування координат через натискання на скріншот", "Action Type": "Тип дії", "Pointer Up": "Підняти вказівник", "Pointer Down": "Опустити вказівник", @@ -234,29 +228,23 @@ "Left": "Ліва", "Right": "Права", "Play": "Запустити", + "Export to File": "Експорт у файл", "Save Capability Set As": "Зберегти набір опцій як…", "Edit Raw JSON": "Редагувати сирий JSON", - "Enter Parameters for:": "Введіть параметри для:", + "enterMethodParameters": "Введіть параметри для: '{{methodName}}'", "invalidJson": "Невалідний JSON", - "Execute Script": "Виконати скрипт", "App Management": "Керування додатками", - "Clipboard": "Буфер обміну", "File Transfer": "Передавання файлів", "Device Interaction": "Пристрій взаємодії", - "Keyboard": "Клавіатура", - "Connectivity": "Підключення", - "Performance Data": "Дані про продуктивність", - "System": "Система", "Session": "Сесія", "Web": "Веб", "Context": "Контекст", - "Window (W3C)": "Вікно (W3C)", "simulatorOnly": "Лише емулятор / симулятор", "minAndroidSDK": "Мінімальний рівень Android SDK", "Error": "Помилка", "findingElementInSourceFailed": "Не вдалося знайти вказаний елемент. Можливо, було змінено поточний вихідний код додатка або ідентифікатор елемента, або ж може бути забагато елементів з тими ж координатами.", "callToMethodFailed": "Не вдалося викликати '{{methodName}}'", - "methodCallResult": "'{{methodName}} результат", + "methodCallResult": "Результат для: '{{methodName}}' (тип: {{resultType}})", "TestingBot Key": "Ключ TestingBot", "TestingBot Secret": "Секрет TestingBot", "Appium Server": "Appium сервер", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver посилання", "Mobitru Billing Unit": "Платіжний блок Mobitru", "Mobitru Access Key": "Mobitru ключ доступу", - "mobitruCredentialsRequired": "Потрібен ключ доступу Mobitru", "Session URL": "URL сесії", "Server Details": "Деталі сервера", "Session Length": "Тривалість сесії", "Session Details": "Деталі сесії", "Currently Active App ID": "Поточний Активний ID додатка", - "Session ID": "ID сесії", "confirmDeletion": "Ви дійсно бажаєте видалити це?", "Copied!": "Скопійовано!", "Error Fetching Session URL": "Помилка отримання URL-адреси сесії", - "noResultsFound": "Результатів не знайдено", + "noRunningSessionsFound": "Не знайдено запущених сесій", "invalidCapType": "Недійсний тип можливості: {{type}}", - "whitespaceDetected": "Текст починається та/або закінчується пробілом" + "whitespaceDetected": "Текст починається та/або закінчується пробілом", + "duplicateCapabilityNameError": "Набір можливостей з таким ім'ям вже існує", + "unableToImportGestureFiles": "Неможливо імпортувати жести з наступних файлів: {{fileNames}}", + "invalidSessionFile": "Некоректний файл сеансу", + "TV Labs API Key": "TV Labs API ключ", + "TestcribeAPIKey": "Тестування API-ключа", + "sessionTestcribeApiKeyDescription": "Ви можете отримати свій API-ключ з https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Будь ласка, надайте наступну інформацію про сервер для {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Немає інформації про сервер, не вдалося отримати запит сесій", + "Username": "Ім'я користувача", + "URL": "URL-адреса", + "WebDriver URL": "URL-адреса WebDriver", + "API Key": "API ключ", + "Access Key": "Ключ доступу", + "SecurityToken": "Token безпеки", + "AccessToken": "Token доступу", + "Token": "Токен", + "Key": "Ключ", + "Secret": "Секретний ключ", + "Theme": "Тема", + "Light Theme": "Світла тема", + "Dark Theme": "Темна тема", + "System Theme": "Тема системи", + "Search Source": "Пошук джерела", + "Matching Elements": "Відповідні елементи", + "webmateApiKey": "ключ API webmate", + "yourProjectId": "ID вашого проекту", + "webmateProjectId": "ID проекту webmate", + "specifyWebmateHostExplicitly": "Укажіть хост webmate явно", + "webmateHost": "webmate хост", + "Enable": "Увімкнути", + "yourFireflinkDevicefarmDomain": "Ваш домен для Fireflink DeviceFarm (напр., cloud.fireflink.com)", + "yourLicenseId": "Ваш код ліцензії", + "yourProjectName": "Назва вашого проекту", + "License ID": "Ідентифікатор ліцензії", + "Project Name": "Назва проєкту", + "Fireflink DeviceFarm Domain": "Домен Fireflink DeviceFarm", + "Fireflink DeviceFarm Access Key": "Ключ доступу на Fireflink DeviceFarm", + "Fireflink DeviceFarm License ID": "Ідентифікатор ліцензії на DeviceFarm Fireflink", + "Fireflink DeviceFarm Project Name": "Назва проекту Fireflink DeviceFarm", + "RabbitQA API Key": "Ключ API для RabbitQA", + "RestartSessionMessage": "Втрачено підключення до пристрою – перезавантаження сесії…", + "ToggleRestartSession": "Перемикання сесії після відключення пристрою", + "toggleTableFormatting": "Перемкнути таблицю форматувань", + "copyResultToClipboard": "Копіювати результат до буфера обміну", + "Property": "Властивість", + "noCapsFound": "Можливості сеансу не знайдено. Будь ласка, скористайтеся Конструктором можливостей, щоб редагувати, додавати та зберігати свій набір можливостей. Див. навчальний посібник за адресою {{url}}", + "executeMethods": "Виконати методи", + "dynamicCommandsDescription": "Запустити команди, які підтримуються зараз активним драйвером та плагінами. Зверніть увагу, що деякі команди можуть працювати лише в певних контекстах. Будь-які команди, які не підтримуються WebdriverIO не включені в цей список.", + "dynamicExecuteMethodsDescription": "Запустити будь-який процес, який підтримується активним драйвером та плагінами.", + "methodDeprecated": "Цей метод є застарілим", + "App Settings": "Налаштування застосунку", + "unableToImportSessionFiles": "Неможливо імпортувати сеанси з наступних файлів: {{fileNames}}", + "Import from File": "Імпорт з файлу", + "useMjpegStream": "Використовувати MJPEG потік", + "useScreenshotApi": "Використовувати API знімки екрану", + "Box Model": "Коробкова модель", + "detachFromSession": "Відʼєднатися від сесії", + "enterSessionID": "Введіть ідентифікатор сесії для приєднання вручну", + "refreshDiscoveredSessions": "Оновити відкриті сесії", + "toggleMultiDisplayMode": "Перемкнути багатоекранний режим" } diff --git a/app/common/public/locales/vi/translation.json b/app/common/public/locales/vi/translation.json new file mode 100644 index 0000000000..9ad71e149c --- /dev/null +++ b/app/common/public/locales/vi/translation.json @@ -0,0 +1,331 @@ +{ + "appiumInspector": "Appium Inspector", + "Edit": "Edit", + "Redo": "Redo", + "Cut": "Cut", + "Copy": "Copy", + "Paste": "Paste", + "Delete": "Delete", + "Select All": "Select All", + "Window": "Window", + "Minimize": "Minimize", + "Zoom": "Zoom", + "Zoom In": "Zoom In", + "Zoom Out": "Zoom Out", + "Reset Zoom Level": "Reset Zoom Level", + "Close Window": "Close Window", + "Bring All to Front": "Bring All to Front", + "Help": "Help", + "Appium Documentation": "Appium Documentation", + "Inspector Documentation": "Inspector Documentation", + "Appium Discussion Forum": "Appium Discussion Forum", + "Report Issues": "Report Issues", + "About Appium Inspector": "About Appium Inspector", + "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n", + "Improve Translations": "Improve Translations", + "Check for Updates…": "Check for Updates…", + "File": "File", + "New Window": "New Window", + "Hide Appium Inspector": "Hide Appium Inspector", + "Hide Others": "Hide Others", + "Show All": "Show All", + "Quit Appium Inspector": "Quit Appium Inspector", + "Toggle Full Screen": "Toggle Full Screen", + "Languages": "Languages", + "View": "View", + "Reload": "Reload", + "Toggle Developer Tools": "Toggle Developer Tools", + "Undo": "Undo", + "Restart Now": "Restart Now", + "Save Server Arguments Preset": "Save Server Arguments Preset", + "Save": "Save", + "Cancel": "Cancel", + "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", + "appiumIsAvailable": "Appium Inspector {{name}} is available", + "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", + "updateIsDownloaded": "Appium Inspector {{releaseName}} has been downloaded. Must restart to apply the updates (note: it may take several minutes for Appium Inspector to install and restart)", + "updateDownloadFailed": "Failed to download update. Reason: {{message}}", + "OK": "OK", + "Install Now": "Install Now", + "Install Later": "Install Later", + "Update Download Started": "Update Download Started", + "No update available": "No update available", + "Appium Inspector is up-to-date": "Appium Inspector is up-to-date", + "Later": "Later", + "Update Downloaded": "Update Downloaded", + "Could not download update": "Could not download update", + "Unexpected Error:": "Unexpected Error:", + "Please report this issue at:": "Please report this issue at:", + "Full error trace:": "Full error trace:", + "Copy Error Trace": "Copy Error Trace", + "Inspect element": "Inspect element", + "Session closed due to inactivity": "Session closed due to inactivity", + "Session has been terminated": "Session has been terminated", + "frameworkNotSupported": "Framework '{{framework}}' not supported", + "findElementFailure": "Failed to find element for '{{methodName}}'. Please refresh page and try again.", + "Could not start session": "Could not start session", + "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", + "Invalid URL:": "Invalid URL:", + "experitestAccessKey": "Experitest AccessKey", + "experitestUrl": "Experitest Url", + "locatorStrategy": "Locator Strategy:", + "selector": "Selector:", + "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", + "Press Home Button": "Press Home Button", + "Execute Siri Command": "Execute Siri Command", + "Press Back Button": "Press Back Button", + "Press App Switch Button": "Press App Switch Button", + "Command": "Command", + "Show Element Handles": "Show Element Handles", + "Hide Element Handles": "Hide Element Handles", + "Select Elements": "Select Elements", + "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates", + "Download Screenshot": "Download Screenshot", + "Back": "Back", + "Start Refreshing Source": "Start Refreshing Source", + "Pause Refreshing Source": "Pause Refreshing Source", + "refreshSource": "Refresh Source & Screenshot", + "Start Recording": "Start Recording", + "Pause Recording": "Pause Recording", + "Search for element": "Search for element", + "App Source": "App Source", + "Collapse All": "Collapse All", + "Toggle Attributes": "Toggle Attributes", + "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", + "Download Source as .XML File": "Download Source as .XML File", + "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", + "Session Inactive": "Session Inactive", + "Keep Session Running": "Keep Session Running", + "Quit Session": "Quit Session", + "Your session is about to expire": "Your session is about to expire", + "Enter Keys to Send": "Enter Keys to Send", + "Find and Select in Source": "Find and Select in Source", + "Clear": "Clear", + "Send Keys": "Send Keys", + "Done": "Done", + "Search": "Search", + "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code", + "Copy code to clipboard": "Copy code to clipboard", + "Start this Kind of Session with Code": "Start this Kind of Session with Code", + "Clear Actions": "Clear Actions", + "Close Recorder": "Close Recorder", + "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here", + "Recorder": "Recorder", + "Attribute": "Attribute", + "Value": "Value", + "Find By": "Find By", + "Selector": "Selector", + "Time": "Time (ms)", + "Get Timing": "Get Timing", + "interactionsNotAvailable": "Interactions for this element may not be available", + "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", + "noAdditionalContextsFound": "No additional contexts have been detected", + "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", + "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", + "Tap": "Tap", + "Gathering initial app source…": "Gathering initial app source…", + "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", + "iOS": "iOS", + "Android": "Android", + "desiredCapabilitiesDocumentation": "Capabilities Documentation", + "startSession": "Start Session", + "saveAs": "Save As…", + "attachToSession": "Attach to Session", + "selectedElement": "Selected Element", + "unnamed": "(Unnamed)", + "No Description": "No Description", + "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}", + "couldNotFindAnyElements": "Could not find any elements", + "elementsCount": "Elements found:", + "xCoordinate": "X: {{x}}", + "yCoordinate": "Y: {{y}}", + "SauceLabs Data Center": "SauceLabs Data Center", + "US-West": "US West 1", + "US-East": "US East 4", + "EU-Central": "EU Central 1", + "proxyThroughSC": "Proxy through Sauce Connect's Selenium Relay", + "SSL": "SSL", + "text": "text", + "boolean": "boolean", + "number": "number", + "JSON object": "JSON object", + "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", + "allowUnauthorizedCerts": "Allow Unauthorized Certificates", + "Use Proxy": "Use Proxy", + "JSON Representation": "JSON Representation", + "Capability Builder": "Capability Builder", + "Saved Capability Sets": "Saved Capability Sets", + "Attach": "Attach", + "localhost": "localhost", + "Host": "Host", + "Port": "Port", + "usingDataFoundIn": "Using data found in {{environmentVariable}}", + "yourUsername": "Your Username", + "Sauce Username": "Sauce Username", + "Sauce Access Key": "Sauce Access Key", + "yourAccessKey": "Your Access Key", + "yourApiKey": "Your API Key", + "Perfecto Host": "Perfecto Host", + "Perfecto Port": "Perfecto Port", + "Pcloudy User Name": "Pcloudy User Name", + "Pcloudy Host": "Pcloudy Host", + "Pcloudy API Key": "Pcloudy API Key", + "Add your token": "Add your token", + "Perfecto Token": "Perfecto Token", + "Your Kobiton Username": "Your Kobiton Username", + "Kobiton Access Key": "Kobiton Access Key", + "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL", + "sessionHeadspinWebDriverURLDescription": "Get the URL from the HeadSpin UI or the HeadSpin API using the automation configuration route", + "Remote Host": "Remote Host", + "Remote Port": "Remote Port", + "Remote Path": "Remote Path", + "BrowserStack Username": "BrowserStack Username", + "BrowserStack Access Key": "BrowserStack Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", + "Bitbar API Key": "Bitbar API Key", + "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", + "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", + "Name": "Name", + "Description": "Description", + "Created": "Created", + "Actions": "Actions", + "searchSessions": "Search discovered sessions", + "Proxy URL": "Proxy URL", + "Source": "Source", + "Commands": "Commands", + "Execute Commands": "Execute Commands", + "Gestures": "Gestures", + "Gesture Builder": "Gesture Builder", + "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", + "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", + "Session Information": "Session Information", + "Execute Command": "Execute Command", + "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", + "Action Type": "Action Type", + "Pointer Up": "Pointer Up", + "Pointer Down": "Pointer Down", + "Pause": "Pause", + "Move": "Move", + "Action Type Not Defined": "Action Type Not Defined", + "Duration": "Duration", + "Button": "Button", + "Untitled Gesture": "Untitled Gesture", + "Add Description": "Add Description", + "Gesture saved": "Gesture saved", + "Gesture saved as": "Gesture saved as '{{gestureName}}'", + "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed", + "Left": "Left", + "Right": "Right", + "Play": "Play", + "Export to File": "Export to File", + "Save Capability Set As": "Save Capability Set As…", + "Edit Raw JSON": "Edit Raw JSON", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", + "invalidJson": "Invalid JSON", + "App Management": "App Management", + "File Transfer": "File Transfer", + "Device Interaction": "Device Interaction", + "Session": "Session", + "Web": "Web", + "Context": "Context", + "simulatorOnly": "Emulator/simulator only", + "minAndroidSDK": "Minimum Android SDK level", + "Error": "Error", + "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", + "callToMethodFailed": "Call to '{{methodName}}' failed", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", + "TestingBot Key": "TestingBot Key", + "TestingBot Secret": "TestingBot Secret", + "Appium Server": "Appium Server", + "Select Cloud Providers": "Select Cloud Providers", + "Advanced Settings": "Advanced Settings", + "Native App Mode": "Native App Mode", + "Web/Hybrid App Mode": "Web/Hybrid App Mode", + "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start", + "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.", + "Mobitru WebDriver URL": "Mobitru WebDriver URL", + "Mobitru Billing Unit": "Mobitru Billing Unit", + "Mobitru Access Key": "Mobitru Access Key", + "Session URL": "Session URL", + "Server Details": "Server Details", + "Session Length": "Session Length", + "Session Details": "Session Details", + "Currently Active App ID": "Currently Active App ID", + "confirmDeletion": "Are you sure you want to delete this?", + "Copied!": "Copied!", + "Error Fetching Session URL": "Error Fetching Session URL", + "noRunningSessionsFound": "No running sessions found", + "invalidCapType": "Invalid capability type: {{type}}", + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" +} diff --git a/app/common/public/locales/zh-CN/translation.json b/app/common/public/locales/zh-CN/translation.json new file mode 100644 index 0000000000..954243c6e5 --- /dev/null +++ b/app/common/public/locales/zh-CN/translation.json @@ -0,0 +1,331 @@ +{ + "appiumInspector": "Appium Inspector", + "Edit": "编辑", + "Redo": "恢复", + "Cut": "剪切", + "Copy": "复制", + "Paste": "粘贴", + "Delete": "删除", + "Select All": "全部选择", + "Window": "窗口", + "Minimize": "最小化", + "Zoom": "缩放", + "Zoom In": "放大", + "Zoom Out": "缩小", + "Reset Zoom Level": "重置缩放级别", + "Close Window": "关闭窗口", + "Bring All to Front": "前置全部窗口", + "Help": "帮助", + "Appium Documentation": "Appium 文档", + "Inspector Documentation": "Inspector 文档", + "Appium Discussion Forum": "Appium论坛", + "Report Issues": "报告问题", + "About Appium Inspector": "关于Appium Inspector", + "showAppInfo": "App 版本: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n", + "Improve Translations": "帮助我们翻译", + "Check for Updates…": "检查更新", + "File": "文件", + "New Window": "新窗口", + "Hide Appium Inspector": "隐藏Appium Inspector", + "Hide Others": "隐藏其他窗口", + "Show All": "显示全部窗口", + "Quit Appium Inspector": "退出 Appium Inspector", + "Toggle Full Screen": "切换至全屏", + "Languages": "切换语言", + "View": "视图", + "Reload": "重新加载", + "Toggle Developer Tools": "切换开发者工具", + "Undo": "撤销", + "Restart Now": "立即重启", + "Save Server Arguments Preset": "保存服务器预设参数", + "Save": "保存", + "Cancel": "取消", + "updateDetails": "发布日期: {{pubDate}}\n\n版本注释: {{notes}}", + "appiumIsAvailable": "Appium Inspector {{name}} 可用", + "updateIsBeingDownloaded": "更新正在下载。完成后将再次通知您", + "updateIsDownloaded": "Appium Inspector {{releaseName}} 已经下载。必须重新启动以应用更新(注意:它可能需要几分钟时间,以便安装并重启)", + "updateDownloadFailed": "下载更新失败。原因: {{message}}", + "OK": "OK", + "Install Now": "马上安装", + "Install Later": "稍后安装", + "Update Download Started": "已经成功下载更新", + "No update available": "没有可用的更新", + "Appium Inspector is up-to-date": "Appium Inspector 是最新的", + "Later": "稍后", + "Update Downloaded": "已经成功下载更新", + "Could not download update": "无法下载更新", + "Unexpected Error:": "意外错误:", + "Please report this issue at:": "请在以下地方报告这个问题:", + "Full error trace:": "完整错误跟踪:", + "Copy Error Trace": "复制错误跟踪", + "Inspect element": "检查元素", + "Session closed due to inactivity": "会话因无活动而关闭", + "Session has been terminated": "会话已终止", + "frameworkNotSupported": "框架 \"{{framework}}\" 不受支持", + "findElementFailure": "找不到 '{{methodName}}' 的元素。请刷新页面并重试。", + "Could not start session": "无法启动会话", + "couldNotConnect": "无法连接到 Appium 服务器: URL '{{url}}'. 请检查服务器是否正在运行 并且 URL 是否正确 (正确的 URLs 可以在Appium的服务器日志开头中找到). 如果你使用的是Inspector的web版本,确保服务器以'--allow-cors'选项启动", + "Invalid URL:": "无效链接", + "experitestAccessKey": "AccessKey", + "experitestUrl": "Url", + "locatorStrategy": "定位策略:", + "selector": "选择器:", + "couldNotObtainScreenshot": "无法获取屏幕截图: {{screenshotError}}", + "Press Home Button": "按主页按钮", + "Execute Siri Command": "执行 Siri 命令", + "Press Back Button": "按返回按钮", + "Press App Switch Button": "按下应用切换按钮", + "Command": "Command 键", + "Show Element Handles": "显示元素处理器", + "Hide Element Handles": "隐藏元素处理器", + "Select Elements": "选择元素", + "Tap/Swipe By Coordinates": "根据坐标点击/滑动", + "Download Screenshot": "下载屏幕截图", + "Back": "返回", + "Start Refreshing Source": "开始刷新源", + "Pause Refreshing Source": "暂停刷新源", + "refreshSource": "刷新源和屏幕截图", + "Start Recording": "开始录制", + "Pause Recording": "暂停录制", + "Search for element": "搜索元素", + "App Source": "应用源", + "Collapse All": "折叠全部", + "Toggle Attributes": "切换属性", + "Copy XML Source to Clipboard": "将 XML 源复制到剪贴板", + "Download Source as .XML File": "下载源文件为 .XML 文件", + "Copy Attributes to Clipboard": "复制属性到剪贴板", + "Session Inactive": "会话不活动", + "Keep Session Running": "保持会话运行", + "Quit Session": "退出会话", + "Your session is about to expire": "您的会话即将过期", + "Enter Keys to Send": "输入要发送的密钥", + "Find and Select in Source": "选择文件", + "Clear": "清空", + "Send Keys": "发送密钥", + "Done": "完成", + "Search": "查找", + "Show/Hide Boilerplate Code": "显示/隐藏样板代码", + "Copy code to clipboard": "将代码复制到剪贴板", + "Start this Kind of Session with Code": "用代码开始这个类别的会话", + "Clear Actions": "清除操作", + "Close Recorder": "关闭录制", + "enableRecordingAndPerformActions": "在应用程序标题栏中启用录制,然后执行一些操作以查看此处显示的代码", + "Recorder": "录制", + "Attribute": "属性", + "Value": "值", + "Find By": "查找", + "Selector": "选择器", + "Time": "时间 (ms)", + "Get Timing": "获取计时", + "interactionsNotAvailable": "此元素的交互可能不可用", + "usingXPathNotRecommended": "不建议使用 XPath 定位器,这可能会导致脆弱的测试。请您的开发团队提供独特的辅助定位器!", + "noAdditionalContextsFound": "没有检测到其他环境", + "contextDropdownInfo": "检测到多个上下文;某些元素可能只有在切换到不同的上下文后才能访问。请注意,Appium Inspector 中的 webview 检查不如 Chrome 或 Safari 的开发者工具准确。更多信息,请参见:", + "idAutocompletionCanBeDisabled": "请求的 id 选择器没有包名前缀。此 Appium 会话启用了包名自动完成功能,这可能是找不到元素的原因。要禁用此行为,请将 'disableIdLocatorAutocompletion' 设置更改为 'true'。", + "missingAutomationNameForStrategies": "可能有更多的定位器策略。要查看它们,请在启动会话时添加名为“appium:automationName”的capability选项。 注意,在Appium 2中这种能力是强制性的。", + "snapshotMaxDepthReached": "此元素位于最大源深度 {{selectedElementDepth}},因此不显示其子元素(如果有)。要显示它们,请将 'snapshotMaxDepth' 设置更改为大于 {{selectedElementDepth}} 的值。查看驱动程序文档以了解支持的最大值。", + "Tap": "点击", + "Gathering initial app source…": "收集初始应用源…", + "couldNotObtainSource": "无法获取源代码: {{errorMsg}}", + "iOS": "iOS", + "Android": "Android", + "desiredCapabilitiesDocumentation": "Capabilities文档", + "startSession": "启动会话", + "saveAs": "另存为...", + "attachToSession": "附加到会话", + "selectedElement": "选定的元素", + "unnamed": "(未命名)", + "No Description": "暂无描述", + "couldNotFindEntryWithId": "找不到 ID 为 {{id}} 的条目", + "couldNotFindAnyElements": "找不到任何元素", + "elementsCount": "查找到的元素", + "xCoordinate": "X: {{x}}", + "yCoordinate": "Y: {{y}}", + "SauceLabs Data Center": "SauceLabs 数据中心", + "US-West": "美国西部1", + "US-East": "美国西部4", + "EU-Central": "欧洲中部1", + "proxyThroughSC": "通过 Sauce Connect 的 Selenium Relay 代理", + "SSL": "SSL", + "text": "文本", + "boolean": "布尔值", + "number": "数字", + "JSON object": "JSON 对象", + "connectToExistingSessionInstructions": "如果您有上述服务器类型的已运行会话, 则可以直接将检查器附加到该会话。", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", + "allowUnauthorizedCerts": "允许未经授权的证书", + "Use Proxy": "使用代理", + "JSON Representation": "JSON表示", + "Capability Builder": "能力构建器", + "Saved Capability Sets": "已保存的能力集", + "Attach": "添加", + "localhost": "本地主机", + "Host": "主机", + "Port": "端口", + "usingDataFoundIn": "使用在 {{environmentVariable}} 中找到的数据", + "yourUsername": "您的用户名", + "Sauce Username": "Sauce 用户名", + "Sauce Access Key": "Sauce 访问密钥", + "yourAccessKey": "您的访问密钥", + "yourApiKey": "您的 API 密钥", + "Perfecto Host": "Perfecto 主机", + "Perfecto Port": "Perfecto 端口", + "Pcloudy User Name": "Pcloudy 用户名", + "Pcloudy Host": "Pcloudy 主机", + "Pcloudy API Key": "Pcloudy API 密钥", + "Add your token": "添加您的 Token", + "Perfecto Token": "Perfecto Token", + "Your Kobiton Username": "您的 Kobiton 用户名", + "Kobiton Access Key": "Kobiton 访问密钥", + "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL", + "sessionHeadspinWebDriverURLDescription": "使用自动配置路由从 HeadSpin UI 或 HeadSpin API获取 URL", + "Remote Host": "远程主机", + "Remote Port": "远程端口", + "Remote Path": "远程路径", + "BrowserStack Username": "BrowserStack 用户名", + "BrowserStack Access Key": "BrowserStack 访问密钥", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI 访问密钥", + "Bitbar API Key": "Bitbar API 密钥", + "RemoteTestKit AccessToken": "RemoteTestKit 访问令牌", + "RobotQA Token": "RobotQA 令牌", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "添加", + "Name": "名称", + "Description": "描述", + "Created": "已创建", + "Actions": "操作", + "searchSessions": "搜索发现的会话", + "Proxy URL": "代理 URL", + "Source": "源", + "Commands": "命令", + "Execute Commands": "执行命令", + "Gestures": "手势", + "Gesture Builder": "手势构建器", + "Saved Gestures": "已保存的手势", + "Create New Gesture": "Create New Gesture", + "gesturesDescription": "在此创建、保存和执行自定义手势。手势与 W3C WebDriver Actions API 中的动作链相同。", + "Session Information": "会话信息", + "Execute Command": "执行命令", + "commandsDescription": "使用当前 Appium 驱动程序运行各种命令。请注意,并非所有驱动程序都支持所有命令。", + "showMoveActionCoordsInPercentage": "以屏幕尺寸百分比显示移动动作的坐标", + "showMoveActionCoordsInPixels": "以像素显示移动动作的坐标", + "toggleMoveActionCoordPicker": "通过点击截图切换设置坐标", + "Action Type": "操作类型", + "Pointer Up": "指针抬起", + "Pointer Down": "指针按下", + "Pause": "暂停", + "Move": "移动", + "Action Type Not Defined": "操作类型未定义", + "Duration": "期限", + "Button": "按钮", + "Untitled Gesture": "未命名手势", + "Add Description": "添加描述", + "Gesture saved": "手势已保存", + "Gesture saved as": "手势已保存为 '{{gestureName}}'", + "Duplicate pointer names are not allowed": "不允许重复的指针名称", + "Left": "左方向键", + "Right": "右方向键", + "Play": "播放", + "Export to File": "导出至文件", + "Save Capability Set As": "保存能力设置为…", + "Edit Raw JSON": "直接编辑 JSON", + "enterMethodParameters": "输入此方法的参数: '{{methodName}}'", + "invalidJson": "无效的 JSON", + "App Management": "应用管理", + "File Transfer": "文件传输", + "Device Interaction": "设备交互", + "Session": "Session会话", + "Web": "Web", + "Context": "上下文", + "simulatorOnly": "模拟器/仅模拟器", + "minAndroidSDK": "最小的Android SDK版本", + "Error": "错误", + "findingElementInSourceFailed": "找不到指定的元素。 当前应用程序来源或元素 ID 可能已经改变,或者可能有太多具有相同坐标的元素。", + "callToMethodFailed": "调用 '{{methodName}}' 失败", + "methodCallResult": "'{{methodName}}' 方法的执行结果(类型为: {{resultType}})", + "TestingBot Key": "TestingBot 键", + "TestingBot Secret": "TestingBot Secret", + "Appium Server": "Appium 服务", + "Select Cloud Providers": "选择云提供商", + "Advanced Settings": "高级设置", + "Native App Mode": "Native App Mode", + "Web/Hybrid App Mode": "Web/Hybrid App Mode", + "autoAddPrefixes": "启动时自动添加必要的 Appium 供应商前缀", + "attachSessionNotRunning": "无法确认会话 {{attachSessId}} 在提供的服务器上运行。请在尝试再次附加到会话之前检查详细信息。", + "Mobitru WebDriver URL": "Mobitru WebDriver URL", + "Mobitru Billing Unit": "Mobitru 计费单位", + "Mobitru Access Key": "Mobitru 访问密钥", + "Session URL": "会话URL", + "Server Details": "服务器详细信息", + "Session Length": "会话长度", + "Session Details": "会话详情", + "Currently Active App ID": "当前活动的应用程序 ID", + "confirmDeletion": "您确定要删除吗?", + "Copied!": "复制成功!", + "Error Fetching Session URL": "获取会话URL 时出错", + "noRunningSessionsFound": "未找到正在运行的会话", + "invalidCapType": "无效的capability类型: {{type}}", + "whitespaceDetected": "文本开始和/或以空格结束", + "duplicateCapabilityNameError": "已存在同名的能力设置", + "unableToImportGestureFiles": "无法从{{fileNames}}中导入手势文件", + "invalidSessionFile": "无效的会话文件", + "TV Labs API Key": "TV Labs API 密钥", + "TestcribeAPIKey": "Testcribe API 密钥", + "sessionTestcribeApiKeyDescription": "你可以从 https://app.testcribe.com/settings/apiKeys 获取你的 API 密钥", + "missingVendorProperties": "请提供以下 {{vendorName}} 的服务器详细信息:{{vendorProps}}", + "missingServerInfo": "缺少服务器信息,无法查询会话", + "Username": "用户名", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API 密钥", + "Access Key": "访问密钥", + "SecurityToken": "安全令牌", + "AccessToken": "访问令牌", + "Token": "令牌", + "Key": "密钥", + "Secret": "密钥", + "Theme": "主题", + "Light Theme": "浅色主题", + "Dark Theme": "深色主题", + "System Theme": "系统主题", + "Search Source": "搜索来源", + "Matching Elements": "匹配元素", + "webmateApiKey": "webmate API 密钥", + "yourProjectId": "您的项目 ID", + "webmateProjectId": "webmate 项目 ID", + "specifyWebmateHostExplicitly": "明确指定webmate 主机", + "webmateHost": "webmate 主机", + "Enable": "启用", + "yourFireflinkDevicefarmDomain": "您的 Fireflink 设备域名(例如,Cloud.fireflink.com)", + "yourLicenseId": "您的许可证ID", + "yourProjectName": "您的项目名称", + "License ID": "许可证ID", + "Project Name": "项目名称", + "Fireflink DeviceFarm Domain": "Fireflink 设备农场域名", + "Fireflink DeviceFarm Access Key": "Fireflink 设备农场访问密钥", + "Fireflink DeviceFarm License ID": "Fireflink 设备农场许可证ID", + "Fireflink DeviceFarm Project Name": "Fireflink 设备农场项目名称", + "RabbitQA API Key": "RabbitQA API 密钥", + "RestartSessionMessage": "设备连接丢失——重启会话…", + "ToggleRestartSession": "设备断开时切换会话重新加载", + "toggleTableFormatting": "切换表格式", + "copyResultToClipboard": "复制结果到剪贴板", + "Property": "属性", + "noCapsFound": "未找到会话支持的功能。请使用功能构建器以编辑,添加并保存你的功能集。参考教程 {{url}}", + "executeMethods": "执行方法", + "dynamicCommandsDescription": "运行当前活动驱动程序和插件支持的命令。请注意,某些命令只能在特定环境中工作。 所有WebdriverIO 不支持的命令都不包含在这个列表中。", + "dynamicExecuteMethodsDescription": "运行当前活动驱动程序和插件支持的任何执行方法。", + "methodDeprecated": "此方法已被弃用", + "App Settings": "应用设置", + "unableToImportSessionFiles": "无法从以下文件中导入会话: {{fileNames}}", + "Import from File": "从文件导入", + "useMjpegStream": "使用 MJPEG 流", + "useScreenshotApi": "使用屏幕截图 API", + "Box Model": "方框模型", + "detachFromSession": "从会话中分离", + "enterSessionID": "请输入会话ID以手动连接", + "refreshDiscoveredSessions": "刷新发现的会话", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" +} diff --git a/assets/locales/zh-TW/translation.json b/app/common/public/locales/zh-TW/translation.json similarity index 72% rename from assets/locales/zh-TW/translation.json rename to app/common/public/locales/zh-TW/translation.json index 8e16c818b0..22537d9892 100644 --- a/assets/locales/zh-TW/translation.json +++ b/app/common/public/locales/zh-TW/translation.json @@ -14,7 +14,6 @@ "Zoom Out": "Zoom Out", "Reset Zoom Level": "Reset Zoom Level", "Close Window": "Close Window", - "Open Session File…": "Open Session File…", "Bring All to Front": "全部移到最上層", "Help": "說明", "Appium Documentation": "Appium Documentation", @@ -41,7 +40,6 @@ "Save Server Arguments Preset": "Save Server Arguments Preset", "Save": "Save", "Cancel": "Cancel", - "datetimeFormat": "MMM Do YYYY, h:mma", "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}", "appiumIsAvailable": "Appium Inspector {{name}} is available", "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete", @@ -68,20 +66,11 @@ "Could not start session": "Could not start session", "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.", "Invalid URL:": "Invalid URL:", - "sauceCredentialsRequired": "Sauce username and access key are required!", - "testingbotCredentialsRequired": "TestingBot key and secret are required!", - "Perfecto SecurityToken is required": "Perfecto SecurityToken is required", - "browserstackCredentialsRequired": "Browserstack username and access key are required!", - "lambdatestCredentialsRequired": "Lambdatest username and access key are required!", - "bitbarCredentialsRequired": "Bitbar API key required!", - "kobitonCredentialsRequired": "KOBITON username and api key are required!", - "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required", "experitestAccessKey": "Experitest AccessKey", "experitestUrl": "Experitest Url", "locatorStrategy": "Locator Strategy:", "selector": "Selector:", "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}", - "selectElementInSource": "Select an element in the source to begin.", "Press Home Button": "Press Home Button", "Execute Siri Command": "Execute Siri Command", "Press Back Button": "Press Back Button", @@ -100,11 +89,11 @@ "Pause Recording": "Pause Recording", "Search for element": "Search for element", "App Source": "App Source", + "Collapse All": "Collapse All", "Toggle Attributes": "Toggle Attributes", "Copy XML Source to Clipboard": "Copy XML Source to Clipboard", "Download Source as .XML File": "Download Source as .XML File", "Copy Attributes to Clipboard": "Copy Attributes to Clipboard", - "quitSessionAndClose": "Quit Session & Close Inspector", "Session Inactive": "Session Inactive", "Keep Session Running": "Keep Session Running", "Quit Session": "Quit Session", @@ -132,8 +121,9 @@ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!", "noAdditionalContextsFound": "No additional contexts have been detected", "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:", - "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.", + "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.", "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.", + "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.", "Tap": "Tap", "Gathering initial app source…": "Gathering initial app source…", "couldNotObtainSource": "Could not obtain source: {{errorMsg}}", @@ -161,15 +151,14 @@ "boolean": "boolean", "number": "number", "JSON object": "JSON object", - "filepath": "filepath", "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.", - "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.", + "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.", "allowUnauthorizedCerts": "Allow Unauthorized Certificates", "Use Proxy": "Use Proxy", "JSON Representation": "JSON Representation", "Capability Builder": "Capability Builder", "Saved Capability Sets": "Saved Capability Sets", - "Attach to Session": "Attach to Session…", + "Attach": "Attach", "localhost": "localhost", "Host": "Host", "Port": "Port", @@ -195,16 +184,19 @@ "Remote Path": "Remote Path", "BrowserStack Username": "BrowserStack Username", "BrowserStack Access Key": "BrowserStack Access Key", - "LambdaTest Username": "LambdaTest Username", - "LambdaTest Access Key": "LambdaTest Access Key", + "TestMu AI Username": "TestMu AI Username", + "TestMu AI Access Key": "TestMu AI Access Key", "Bitbar API Key": "Bitbar API Key", "RemoteTestKit AccessToken": "RemoteTestKit AccessToken", "RobotQA Token": "RobotQA Token", + "RobotActions Host": "RobotActions Host", + "RobotActions Token": "RobotActions Token", + "Add": "Add", "Name": "Name", "Description": "Description", "Created": "Created", "Actions": "Actions", - "enterYourSessionId": "Enter your session ID here", + "searchSessions": "Search discovered sessions", "Proxy URL": "Proxy URL", "Source": "Source", "Commands": "Commands", @@ -212,12 +204,14 @@ "Gestures": "Gestures", "Gesture Builder": "Gesture Builder", "Saved Gestures": "Saved Gestures", + "Create New Gesture": "Create New Gesture", "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.", "Session Information": "Session Information", "Execute Command": "Execute Command", "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.", - "Click to Set Coordinates": "Click to Set Coordinates", - "Set Coordinates Via Field": "Set Coordinates Via Field", + "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages", + "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels", + "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot", "Action Type": "Action Type", "Pointer Up": "Pointer Up", "Pointer Down": "Pointer Down", @@ -234,29 +228,23 @@ "Left": "Left", "Right": "Right", "Play": "Play", + "Export to File": "Export to File", "Save Capability Set As": "Save Capability Set As…", "Edit Raw JSON": "Edit Raw JSON", - "Enter Parameters for:": "Enter Parameters for:", + "enterMethodParameters": "Enter Parameters for: '{{methodName}}'", "invalidJson": "Invalid JSON", - "Execute Script": "Execute Script", "App Management": "App Management", - "Clipboard": "Clipboard", "File Transfer": "File Transfer", "Device Interaction": "Device Interaction", - "Keyboard": "Keyboard", - "Connectivity": "Connectivity", - "Performance Data": "Performance Data", - "System": "System", "Session": "Session", "Web": "Web", "Context": "Context", - "Window (W3C)": "Window (W3C)", "simulatorOnly": "Emulator/simulator only", "minAndroidSDK": "Minimum Android SDK level", "Error": "Error", "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.", "callToMethodFailed": "Call to '{{methodName}}' failed", - "methodCallResult": "'{{methodName}}' result", + "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})", "TestingBot Key": "TestingBot Key", "TestingBot Secret": "TestingBot Secret", "Appium Server": "Appium Server", @@ -269,17 +257,75 @@ "Mobitru WebDriver URL": "Mobitru WebDriver URL", "Mobitru Billing Unit": "Mobitru Billing Unit", "Mobitru Access Key": "Mobitru Access Key", - "mobitruCredentialsRequired": "Mobitru Access Key is required", "Session URL": "Session URL", "Server Details": "Server Details", "Session Length": "Session Length", "Session Details": "Session Details", "Currently Active App ID": "Currently Active App ID", - "Session ID": "Session ID", "confirmDeletion": "Are you sure you want to delete this?", "Copied!": "Copied!", "Error Fetching Session URL": "Error Fetching Session URL", - "noResultsFound": "No results found", + "noRunningSessionsFound": "No running sessions found", "invalidCapType": "Invalid capability type: {{type}}", - "whitespaceDetected": "Text Starts and/or Ends With Whitespace" + "whitespaceDetected": "Text Starts and/or Ends With Whitespace", + "duplicateCapabilityNameError": "A capability set with the same name already exists", + "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}", + "invalidSessionFile": "Invalid session file", + "TV Labs API Key": "TV Labs API Key", + "TestcribeAPIKey": "Testcribe API Key", + "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys", + "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}", + "missingServerInfo": "Missing server info, could not query sessions", + "Username": "Username", + "URL": "URL", + "WebDriver URL": "WebDriver URL", + "API Key": "API Key", + "Access Key": "Access Key", + "SecurityToken": "SecurityToken", + "AccessToken": "AccessToken", + "Token": "Token", + "Key": "Key", + "Secret": "Secret", + "Theme": "Theme", + "Light Theme": "Light Theme", + "Dark Theme": "Dark Theme", + "System Theme": "System Theme", + "Search Source": "Search Source", + "Matching Elements": "Matching Elements", + "webmateApiKey": "webmate API Key", + "yourProjectId": "Your Project ID", + "webmateProjectId": "webmate Project ID", + "specifyWebmateHostExplicitly": "Specify webmate host explicitly", + "webmateHost": "webmate Host", + "Enable": "Enable", + "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)", + "yourLicenseId": "Your License ID", + "yourProjectName": "Your Project Name", + "License ID": "License ID", + "Project Name": "Project Name", + "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain", + "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key", + "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID", + "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name", + "RabbitQA API Key": "RabbitQA API Key", + "RestartSessionMessage": "Device Connection Lost – Restarting the Session…", + "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect", + "toggleTableFormatting": "Toggle Table Formatting", + "copyResultToClipboard": "Copy Result to Clipboard", + "Property": "Property", + "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}", + "executeMethods": "Execute Methods", + "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.", + "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).", + "methodDeprecated": "This method is deprecated", + "App Settings": "App Settings", + "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}", + "Import from File": "Import from File", + "useMjpegStream": "Use MJPEG Stream", + "useScreenshotApi": "Use Screenshot API", + "Box Model": "Box Model", + "detachFromSession": "Detach from Session", + "enterSessionID": "Enter session ID for attaching manually", + "refreshDiscoveredSessions": "Refresh Discovered Sessions", + "toggleMultiDisplayMode": "Toggle Multi-Display Mode" } diff --git a/app/common/renderer/actions/SessionBuilder.js b/app/common/renderer/actions/SessionBuilder.js new file mode 100644 index 0000000000..2072c49356 --- /dev/null +++ b/app/common/renderer/actions/SessionBuilder.js @@ -0,0 +1,1108 @@ +import _ from 'lodash'; +import sanitize from 'sanitize-filename'; + +import { + SAVED_SESSIONS, + SERVER_ARGS, + SESSION_SERVER_PARAMS, + SESSION_SERVER_TYPE, + VISIBLE_PROVIDERS, +} from '../../shared/setting-defs.js'; +import { + DEFAULT_SESSION_NAME, + SERVER_TYPES, + SESSION_BUILDER_TABS, + SESSION_FILE_VERSIONS, +} from '../constants/session-builder.js'; +import {APP_MODE} from '../constants/session-inspector.js'; +import {DEFAULT_SERVER_PROPS} from '../constants/webdriver.js'; +import i18n from '../i18next.js'; +import WDSessionStarter from '../lib/appium/session-starter.js'; +import {VENDOR_MAP} from '../lib/vendor/map.js'; +import {getSetting, loadSessionFileIfOpened, setSetting} from '../polyfills.js'; +import { + fetchSessionInformation, + formatSeleniumGridSessions, +} from '../utils/attaching-to-session.js'; +import {downloadFile, readTextFromUploadedFiles} from '../utils/file-handling.js'; +import {log} from '../utils/logger.js'; +import {notification} from '../utils/notification.js'; +import {addVendorPrefixes, getRandomId} from '../utils/other.js'; +import {parseSessionFileContents} from '../utils/sessionfile-parsing.js'; +import {quitSession, setSessionDetails} from './SessionInspector.js'; + +export const NEW_SESSION_REQUESTED = 'NEW_SESSION_REQUESTED'; +export const NEW_SESSION_LOADING = 'NEW_SESSION_LOADING'; +export const NEW_SESSION_DONE = 'NEW_SESSION_DONE'; +export const CHANGE_CAPABILITY = 'CHANGE_CAPABILITY'; +export const SAVE_SESSION_REQUESTED = 'SAVE_SESSION_REQUESTED'; +export const SAVE_SESSION_DONE = 'SAVE_SESSION_DONE'; +export const GET_SAVED_SESSIONS_REQUESTED = 'GET_SAVED_SESSIONS_REQUESTED'; +export const GET_SAVED_SESSIONS_DONE = 'GET_SAVED_SESSIONS_DONE'; +export const SET_CAPABILITY_PARAM = 'SET_CAPABILITY_PARAM'; +export const ADD_CAPABILITY = 'ADD_CAPABILITY'; +export const REMOVE_CAPABILITY = 'REMOVE_CAPABILITY'; +export const SWITCHED_TABS = 'SWITCHED_TABS'; +export const SET_CAPS_AND_SERVER = 'SET_CAPS_AND_SERVER'; +export const SAVE_AS_MODAL_REQUESTED = 'SAVE_AS_MODAL_REQUESTED'; +export const HIDE_SAVE_AS_MODAL_REQUESTED = 'HIDE_SAVE_AS_MODAL_REQUESTED'; +export const SET_SAVE_AS_TEXT = 'SET_SAVE_AS_TEXT'; +export const DELETE_SAVED_SESSION_REQUESTED = 'DELETE_SAVED_SESSION_REQUESTED'; +export const DELETE_SAVED_SESSION_DONE = 'DELETE_SAVED_SESSION_DONE'; +export const CHANGE_SERVER_TYPE = 'CHANGE_SERVER_TYPE'; +export const SET_SERVER_PARAM = 'SET_SERVER_PARAM'; +export const SET_SERVER = 'SET_SERVER'; + +export const GET_SESSIONS_REQUESTED = 'GET_SESSIONS_REQUESTED'; +export const GET_SESSIONS_DONE = 'GET_SESSIONS_DONE'; + +export const ENABLE_DESIRED_CAPS_NAME_EDITOR = 'ENABLE_DESIRED_CAPS_NAME_EDITOR'; +export const ABORT_DESIRED_CAPS_NAME_EDITOR = 'ABORT_DESIRED_CAPS_NAME_EDITOR'; +export const SAVE_DESIRED_CAPS_NAME = 'SAVE_DESIRED_CAPS_NAME'; +export const SET_DESIRED_CAPS_NAME = 'SET_DESIRED_CAPS_NAME'; + +export const ENABLE_DESIRED_CAPS_EDITOR = 'ENABLE_DESIRED_CAPS_EDITOR'; +export const ABORT_DESIRED_CAPS_EDITOR = 'ABORT_DESIRED_CAPS_EDITOR'; +export const SAVE_RAW_DESIRED_CAPS = 'SAVE_RAW_DESIRED_CAPS'; +export const SET_RAW_DESIRED_CAPS = 'SET_RAW_DESIRED_CAPS'; +export const SHOW_DESIRED_CAPS_JSON_ERROR = 'SHOW_DESIRED_CAPS_JSON_ERROR'; + +export const IS_ADDING_CLOUD_PROVIDER = 'IS_ADDING_CLOUD_PROVIDER'; + +export const SET_PROVIDERS = 'SET_PROVIDERS'; + +export const SET_ADD_VENDOR_PREFIXES = 'SET_ADD_VENDOR_PREFIXES'; + +export const SET_CAPABILITY_NAME_ERROR = 'SET_CAPABILITY_NAME_ERROR'; +export const SET_STATE_FROM_URL = 'SET_STATE_FROM_URL'; +export const SET_STATE_FROM_FILE = 'SET_STATE_FROM_FILE'; + +export const SESSION_UPLOAD_REQUESTED = 'SESSION_UPLOAD_REQUESTED'; +export const SESSION_UPLOAD_DONE = 'SESSION_UPLOAD_DONE'; + +const CAPS_NEW_COMMAND = 'appium:newCommandTimeout'; +const CAPS_CONNECT_HARDWARE_KEYBOARD = 'appium:connectHardwareKeyboard'; +const CAPS_NATIVE_WEB_SCREENSHOT = 'appium:nativeWebScreenshot'; +const CAPS_ENSURE_WEBVIEW_HAVE_PAGES = 'appium:ensureWebviewsHavePages'; +const CAPS_INCLUDE_SAFARI_IN_WEBVIEWS = 'appium:includeSafariInWebviews'; + +const AUTO_START_URL_PARAM = '1'; // what should be passed in to ?autoStart= to turn it on + +const MJPEG_CAP = 'mjpegScreenshotUrl'; +const MJPEG_PORT_CAP = 'mjpegServerPort'; + +// Multiple requests sometimes send a new session request +// after establishing a session. +// This situation could happen easier on cloud vendors, +// so let's set zero so far. +// TODO: increase this retry when we get issues +export const CONN_RETRIES = 0; +const CONN_TIMEOUT = 5 * 60 * 1000; + +// 1 hour default newCommandTimeout +const NEW_COMMAND_TIMEOUT_SEC = 3600; + +/** + * Unwraps nested capability structures returned by the TestMu AI server. + * The server may wrap capabilities under a 'capabilities' key and/or a 'desired' key. + */ +function unwrapTestMuAICaps(caps) { + if (!caps) { + return caps; + } + if ('capabilities' in caps) { + caps = caps.capabilities; + } + if ('desired' in caps) { + caps = caps.desired; + } + return caps; +} + +let isFirstRun = true; // we only want to auto start a session on a first run + +const JSON_TYPES = ['object', 'number', 'boolean']; + +export function getCapsObject(caps) { + return Object.assign( + {}, + ...caps + .filter((cap) => cap.enabled) + .map((cap) => { + if (JSON_TYPES.indexOf(cap.type) !== -1) { + try { + let obj = JSON.parse(cap.value); + return {[cap.name]: obj}; + } catch {} + } + return {[cap.name]: cap.value}; + }), + ); +} + +export function showError(e, params = {methodName: null, secs: 5, url: null}) { + const {secs, url} = params; + let {methodName} = params; + let errMessage; + if (e['jsonwire-error'] && e['jsonwire-error'].status === 7) { + // FIXME: we probably should set 'findElement' as the method name + // if it is also number. + if (methodName === 10) { + methodName = 'findElements'; + } + errMessage = i18n.t('findElementFailure', {methodName}); + if (e.message) { + errMessage += ` Original error: '${e.message}'`; + } + } else if (e.data) { + try { + e.data = JSON.parse(e.data); + } catch {} + if (e.data.value?.message) { + errMessage = e.data.value.message; + } else { + errMessage = e.data; + } + } else if (e.message) { + errMessage = e.message; + } else if (e.code) { + errMessage = e.code; + } else { + errMessage = i18n.t('Could not start session'); + } + if ( + errMessage === 'ECONNREFUSED' || + _.includes(errMessage, 'Failed to fetch') || + _.includes(errMessage, 'The requested resource could not be found') + ) { + errMessage = i18n.t('couldNotConnect', {url}); + } + + log.error(errMessage); + notification.error({ + title: methodName ? i18n.t('callToMethodFailed', {methodName}) : i18n.t('Error'), + description: errMessage, + duration: secs, + }); +} + +/** + * Change the caps object, along with the server details and then go back to the new session tab + */ +export function setCapsAndServer(server, serverType, caps, uuid, name) { + return (dispatch) => { + dispatch({type: SET_CAPS_AND_SERVER, server, serverType, caps, uuid, name}); + }; +} + +/** + * Change a single desired capability + */ +export function changeCapability(key, value) { + return (dispatch) => { + dispatch({type: CHANGE_CAPABILITY, key, value}); + }; +} + +/** + * Push a capability to the list + */ +export function addCapability() { + return (dispatch) => { + dispatch({type: ADD_CAPABILITY}); + }; +} + +/** + * Update value of a capability parameter + */ +export function setCapabilityParam(id, name, value) { + return (dispatch) => { + dispatch({type: SET_CAPABILITY_PARAM, id, name, value}); + }; +} + +/** + * Delete a capability from the list + */ +export function removeCapability(id) { + return (dispatch) => { + dispatch({type: REMOVE_CAPABILITY, id}); + }; +} + +/** + * Start a new appium session with the given caps + */ +export function newSession(originalCaps, attachSessId = null) { + return async (dispatch, getState) => { + let session = getState().builder; + + // first add vendor prefixes to caps if requested + let prefixedCaps = originalCaps; + if (!attachSessId && session.addVendorPrefixes) { + const {server, serverType, capsUUID, capsName} = session; + prefixedCaps = addVendorPrefixes(originalCaps); + setCapsAndServer(server, serverType, prefixedCaps, capsUUID, capsName)(dispatch); + } + + dispatch({type: NEW_SESSION_REQUESTED}); + + let sessionCaps = prefixedCaps ? getCapsObject(prefixedCaps) : {}; + sessionCaps = addCustomCaps(sessionCaps); + + const vendorProperties = await retrieveVendorProperties({ + server: session.server, + serverType: session.serverType, + sessionCaps, + }); + + if (!vendorProperties) { + return false; + } + + dispatch({type: NEW_SESSION_LOADING}); + + // Assemble server options from the vendor properties + + let {host, port, username, accessKey, https, path, headers} = vendorProperties; + const protocol = https ? 'https' : 'http'; + + // if the server path is '' (or any other kind of falsy) set it to default + path = path || DEFAULT_SERVER_PROPS.path; + host = host || DEFAULT_SERVER_PROPS.hostname; + port = port || DEFAULT_SERVER_PROPS.port; + + const serverUrl = `${protocol}://${host}:${port}${path === '/' ? '' : path}`; + + const serverOpts = { + hostname: host, + port: parseInt(port, 10), + protocol, + path, + headers, + connectionRetryCount: CONN_RETRIES, + connectionRetryTimeout: CONN_TIMEOUT, + logLevel: DEFAULT_SERVER_PROPS.logLevel, + }; + if (username && accessKey) { + serverOpts.user = username; + serverOpts.key = accessKey; + } + + // If a newCommandTimeout wasn't provided, set it to 60 * 60 so that sessions don't close on users in short term. + // I saw sometimes infinite session timeout was not so good for cloud providers. + // So, let me define this value as NEW_COMMAND_TIMEOUT_SEC by default. + if (_.isUndefined(sessionCaps[CAPS_NEW_COMMAND])) { + sessionCaps[CAPS_NEW_COMMAND] = NEW_COMMAND_TIMEOUT_SEC; + } + + // If someone didn't specify connectHardwareKeyboard, set it to true by + // default + if (_.isUndefined(sessionCaps[CAPS_CONNECT_HARDWARE_KEYBOARD])) { + sessionCaps[CAPS_CONNECT_HARDWARE_KEYBOARD] = true; + } + + let driver; + try { + if (attachSessId) { + // When attaching to a session id, webdriver does not fully populate client information, so + // we should supplement by attaching session capabilities that we are attaching to, if they + // exist in our cache of running appium sessions. Otherwise (in the case where we are + // autostarting and attaching to a new session, retrieve session details via a server call) + serverOpts.isMobile = true; + const attachedSession = session.runningAppiumSessions.find( + (session) => session.id === attachSessId, + ); + let attachedSessionCaps = {}; + if (attachedSession) { + attachedSessionCaps = attachedSession.capabilities; + if (session.serverType === SERVER_TYPES.TESTMUAI) { + attachedSessionCaps = unwrapTestMuAICaps(attachedSessionCaps); + } + } else { + try { + const detailsUrl = `${serverUrl}/session/${attachSessId}`; + const res = await fetchSessionInformation({ + url: detailsUrl, + headers, + timeout: CONN_TIMEOUT, + }); + attachedSessionCaps = + session.serverType === SERVER_TYPES.TESTMUAI + ? unwrapTestMuAICaps(res.value) + : res.value; + } catch (err) { + // rethrow the error as session not running, but first log the original error to console + log.error(err); + throw new Error(i18n.t('attachSessionNotRunning', {attachSessId}), {cause: err}); + } + } + // Chrome MJSONWP mode returns "platform" instead of "platformName" + const platformName = attachedSessionCaps.platformName || attachedSessionCaps.platform; + serverOpts.isIOS = Boolean(platformName.match(/iOS/i)); + serverOpts.isAndroid = Boolean(platformName.match(/Android/i)); + driver = WDSessionStarter.attachToSession(attachSessId, serverOpts, attachedSessionCaps); + } else { + driver = await WDSessionStarter.newSession(serverOpts, sessionCaps); + } + } catch (err) { + showError(err, {secs: 0, url: serverUrl}); + return false; + } finally { + dispatch({type: NEW_SESSION_DONE}); + // Save the current server settings + await setSetting(SESSION_SERVER_PARAMS, session.server); + } + + // The homepage arg in ChromeDriver is not working with Appium. iOS can have a default url, but + // we want to keep the process equal to prevent complexity so we launch a default url here to make + // sure we don't start with an empty page which will not show proper HTML in the inspector + // When attaching to an existing session, sessionCaps doesn't carry browserName, + // so read it from driver.capabilities (populated from the running session after attach). + const {browserName = ''} = attachSessId ? driver.capabilities : sessionCaps; + let appMode = APP_MODE.NATIVE; + + if (browserName.trim() !== '') { + appMode = APP_MODE.WEB_HYBRID; + // Don't hijack the page when attaching to an existing session. + if (!attachSessId) { + try { + await driver.navigateTo('https://appium.io'); + } catch {} + } + } + + let mjpegScreenshotUrl = + driver.capabilities[`appium:${MJPEG_CAP}`] || driver.capabilities[MJPEG_CAP] || null; + + let mjpegScreenshotPort = + driver.capabilities[`appium:${MJPEG_PORT_CAP}`] || + driver.capabilities[MJPEG_PORT_CAP] || + null; + + if (session.serverType === SERVER_TYPES.FIREFLINKDEVICEFARM) { + mjpegScreenshotUrl = null; + mjpegScreenshotPort = null; + } + + // Build mjpegScreenshotUrl if mjpegServerPort in session capabilities + if (!mjpegScreenshotUrl && mjpegScreenshotPort) { + mjpegScreenshotUrl = `${protocol}://${host}:${mjpegScreenshotPort}`; + } + + const action = setSessionDetails({ + serverDetails: { + username, + accessKey, + headers, + serverUrl, + serverUrlParts: { + protocol, + host, + port, + path, + }, + mjpegScreenshotUrl, + }, + driver, + sessionCaps, + appMode, + isUsingMjpegMode: mjpegScreenshotUrl !== null, + }); + action(dispatch); + return true; + }; +} + +/** + * Saves the caps and server details + */ +export function saveSession(sessionParams, checkDuplicateName = false) { + return async (dispatch) => { + const {server, serverType, caps, name, uuid: foundUUID} = sessionParams; + const savedSessions = (await getSetting(SAVED_SESSIONS)) || []; + if (checkDuplicateName) { + const duplicateSessionNameExists = savedSessions.some((session) => session.name === name); + if (duplicateSessionNameExists) { + return dispatch({type: SET_CAPABILITY_NAME_ERROR}); + } + } + dispatch({type: SAVE_SESSION_REQUESTED}); + + let uuid = foundUUID; + if (!uuid) { + // If it's a new session, add it to the list + uuid = getRandomId(); + const newSavedSession = { + date: Date.now(), + name, + uuid, + caps, + server, + serverType, + }; + savedSessions.push(newSavedSession); + } else { + // If it's an existing session, overwrite it + for (const session of savedSessions) { + if (session.uuid === uuid) { + session.name = name; + session.caps = caps; + session.server = server; + session.serverType = serverType; + break; + } + } + } + await setSetting(SAVED_SESSIONS, savedSessions); + await getSavedSessions()(dispatch); + dispatch({type: SET_CAPS_AND_SERVER, server, serverType, caps, uuid, name}); + dispatch({type: SAVE_SESSION_DONE}); + }; +} + +/** + * Get the sessions saved by the user + */ +export function getSavedSessions() { + return async (dispatch) => { + dispatch({type: GET_SAVED_SESSIONS_REQUESTED}); + let savedSessions = await getSetting(SAVED_SESSIONS); + dispatch({type: GET_SAVED_SESSIONS_DONE, savedSessions}); + }; +} + +/** + * Switch to a different Session Builder tab + */ +export function switchTabs(key) { + return (dispatch, getState) => { + dispatch({type: SWITCHED_TABS, key}); + // if switching to Attach to Session tab, also retrieve the running sessions + if (key === SESSION_BUILDER_TABS.ATTACH_TO_SESSION) { + getRunningSessions()(dispatch, getState); + } + }; +} + +/** + * Open a 'Save As' modal + */ +export function requestSaveAsModal() { + return (dispatch) => { + dispatch({type: SAVE_AS_MODAL_REQUESTED}); + }; +} + +/** + * Hide the 'Save As' modal + */ +export function hideSaveAsModal() { + return (dispatch) => { + dispatch({type: HIDE_SAVE_AS_MODAL_REQUESTED}); + }; +} + +/** + * Set the text to save capabilities as + */ +export function setSaveAsText(saveAsText) { + return (dispatch) => { + dispatch({type: SET_SAVE_AS_TEXT, saveAsText}); + }; +} + +/** + * Delete a saved session + */ +export function deleteSavedSession(uuid) { + return async (dispatch) => { + dispatch({type: DELETE_SAVED_SESSION_REQUESTED, uuid}); + let savedSessions = await getSetting(SAVED_SESSIONS); + let newSessions = savedSessions.filter((session) => session.uuid !== uuid); + await setSetting(SAVED_SESSIONS, newSessions); + dispatch({type: DELETE_SAVED_SESSION_DONE}); + dispatch({type: GET_SAVED_SESSIONS_DONE, savedSessions: newSessions}); + }; +} + +/** + * Change the server type + */ +export function changeServerType(serverType) { + return async (dispatch) => { + await setSetting(SESSION_SERVER_TYPE, serverType); + dispatch({type: CHANGE_SERVER_TYPE, serverType}); + }; +} + +/** + * Set a server parameter (host, port, etc...) + */ +export function setServerParam(name, value, serverType) { + return async (dispatch, getState) => { + serverType = serverType || getState().builder.serverType; + await setSetting(SESSION_SERVER_TYPE, serverType); + dispatch({type: SET_SERVER_PARAM, serverType, name, value}); + }; +} + +/** + * Set the local server hostname and port to whatever was saved in 'actions/StartServer.js' so that it + * defaults to what the currently running appium server is + */ +export function setLocalServerParams() { + return async (dispatch, getState) => { + let serverArgs = await getSetting(SERVER_ARGS); + // Get saved server args from settings and set local server settings to it. If there are no saved args, set local + // host and port to undefined + if (serverArgs) { + dispatch({ + type: SET_SERVER_PARAM, + serverType: SERVER_TYPES.LOCAL, + name: 'port', + value: serverArgs.port, + }); + dispatch({ + type: SET_SERVER_PARAM, + serverType: SERVER_TYPES.LOCAL, + name: 'hostname', + value: 'localhost', + }); + } else { + dispatch({ + type: SET_SERVER_PARAM, + serverType: SERVER_TYPES.LOCAL, + name: 'port', + value: undefined, + }); + dispatch({ + type: SET_SERVER_PARAM, + serverType: SERVER_TYPES.LOCAL, + name: 'hostname', + value: undefined, + }); + if (getState().builder.serverType === 'local') { + const action = changeServerType('remote'); + await action(dispatch, getState); + } + } + }; +} + +/** + * Set the server parameters to whatever they were last saved as. + * Params are saved whenever there's a new session + */ +export function setSavedServerParams() { + return async (dispatch, getState) => { + let server = await getSetting(SESSION_SERVER_PARAMS); + let serverType = await getSetting(SESSION_SERVER_TYPE); + let currentProviders = getState().builder.visibleProviders; + + if (server) { + // if we have a cloud provider as a saved server, but for some reason the + // cloud provider is no longer in the list, revert server type to remote + if (_.values(SERVER_TYPES).includes(serverType) && !currentProviders.includes(serverType)) { + serverType = SERVER_TYPES.REMOTE; + } + dispatch({type: SET_SERVER, server, serverType}); + } + }; +} + +/** + * Checks if the app was launched by opening a file - + * if yes, switch to capability builder and set the current details from the file contents + */ +export function initFromSessionFile() { + return async (dispatch, getState) => { + let sessionFileString; + try { + sessionFileString = await loadSessionFileIfOpened(); + } catch (err) { + log.warn(`Error loading session file on startup: ${err.message}`); + } + if (!sessionFileString) { + return null; + } + const sessionJSON = parseAndValidateSessionFileString(sessionFileString); + if (sessionJSON) { + dispatch({type: SET_STATE_FROM_FILE, sessionJSON}); + switchTabs(SESSION_BUILDER_TABS.CAPS_BUILDER)(dispatch, getState); + } else { + notification.error({ + title: i18n.t('invalidSessionFile'), + duration: 0, + }); + } + }; +} + +/** + * Reads one or more .appiumsession files, then extracts, validates, and saves + * their details as new session sets. + * Duplicate session names are intentionally OK + */ +export function importSessionFiles(fileList) { + return async (dispatch) => { + dispatch({type: SESSION_UPLOAD_REQUESTED}); + const sessions = await readTextFromUploadedFiles(fileList); + const invalidSessionFiles = []; + const parsedSessions = []; + for (const session of sessions) { + const {fileName, content, error} = session; + // Some error occurred while reading the uploaded file + if (error) { + invalidSessionFiles.push(fileName); + continue; + } + const sessionJSON = parseAndValidateSessionFileString(content); + if (!sessionJSON) { + invalidSessionFiles.push(fileName); + continue; + } + parsedSessions.push(sessionJSON); + } + + for (const parsedSession of parsedSessions) { + await saveSession(parsedSession)(dispatch); + } + dispatch({type: SESSION_UPLOAD_DONE}); + + if (!_.isEmpty(invalidSessionFiles)) { + notification.error({ + title: i18n.t('unableToImportSessionFiles', {fileNames: invalidSessionFiles.join(', ')}), + duration: 0, + }); + } + }; +} + +/** + * Packages the current server and capability details in an .appiumsession file + */ +export function exportSavedSession(session) { + return async () => { + const cleanedName = session.name?.trim() || DEFAULT_SESSION_NAME; + const cleanedServer = { + [session.serverType]: session.server[session.serverType], + [SERVER_TYPES.ADVANCED]: session.server[SERVER_TYPES.ADVANCED], + }; + const cleanedCaps = session.caps.map((cap) => _.omit(cap, 'id')); + const sessionFileDetails = { + version: SESSION_FILE_VERSIONS.LATEST, + name: cleanedName, + server: cleanedServer, + caps: cleanedCaps, + }; + const href = `data:text/json;charset=utf-8,${encodeURIComponent( + JSON.stringify(sessionFileDetails, null, 2), + )}`; + const escapedName = sanitize(cleanedName, {replacement: '_'}); + const fileName = `${escapedName}.appiumsession`; + downloadFile(href, fileName); + }; +} + +/** + * Retrieve all running sessions for the currently configured server details + */ +export function getRunningSessions() { + return async (dispatch, getState) => { + const avoidServerTypes = ['sauce']; + const state = getState().builder; + const {server, serverType} = state; + const vendorProperties = await retrieveVendorProperties({ + server, + serverType, + sessionCaps: {}, + }); + + if (!vendorProperties) { + return; + } + + let {path, host, port, username, accessKey, https, headers} = vendorProperties; + + if (username && accessKey) { + const authToken = btoa(`${username}:${accessKey}`); + + headers = { + ...headers, + Authorization: `Basic ${authToken}`, + }; + } + + // if we have a standard remote server, fill out connection info based on placeholder defaults + // in case the user hasn't adjusted those fields + if (serverType === SERVER_TYPES.REMOTE) { + host = host || DEFAULT_SERVER_PROPS.hostname; + port = port || DEFAULT_SERVER_PROPS.port; + path = path || DEFAULT_SERVER_PROPS.path; + } + + // no need to get sessions if we don't have complete server info + if (!host || !port || !path) { + showError(new Error(i18n.t('missingServerInfo'))); + return; + } + + dispatch({type: GET_SESSIONS_REQUESTED}); + if (avoidServerTypes.includes(serverType)) { + dispatch({type: GET_SESSIONS_DONE}); + return; + } + + if (serverType === SERVER_TYPES.TESTMUAI) { + const sessions = await fetchTestMuAISessions(host, headers); + dispatch({type: GET_SESSIONS_DONE, sessions}); + return; + } + + const protocol = https ? 'https' : 'http'; + const adjPath = path.endsWith('/') ? path : `${path}/`; + const baseUrl = `${protocol}://${host}:${port}${adjPath}`; + const sessions = await fetchAllSessions(baseUrl, headers); + dispatch({type: GET_SESSIONS_DONE, sessions}); + }; +} + +export function startDesiredCapsNameEditor() { + return (dispatch) => { + dispatch({type: ENABLE_DESIRED_CAPS_NAME_EDITOR}); + }; +} + +export function abortDesiredCapsNameEditor() { + return (dispatch) => { + dispatch({type: ABORT_DESIRED_CAPS_NAME_EDITOR}); + }; +} + +export function saveDesiredCapsName() { + return (dispatch, getState) => { + const {server, serverType, caps, capsUUID, desiredCapsName} = getState().builder; + dispatch({type: SAVE_DESIRED_CAPS_NAME, name: desiredCapsName}); + saveSession({server, serverType, caps, name: desiredCapsName, uuid: capsUUID}, true)(dispatch); + }; +} + +export function setDesiredCapsName(desiredCapsName) { + return (dispatch) => { + dispatch({type: SET_DESIRED_CAPS_NAME, desiredCapsName}); + }; +} + +export function startDesiredCapsEditor() { + return (dispatch) => { + dispatch({type: ENABLE_DESIRED_CAPS_EDITOR}); + }; +} + +export function abortDesiredCapsEditor() { + return (dispatch) => { + dispatch({type: ABORT_DESIRED_CAPS_EDITOR}); + }; +} + +// Overwrite the current caps array with the raw data: +// * New caps get a new id, type, and enabled state set to true; +// * Existing caps keep their id and enabled state, but their type is updated. +export function saveRawDesiredCaps(currentCapsArray, rawDesiredCaps) { + return (dispatch) => { + try { + const rawCapsObj = JSON.parse(rawDesiredCaps); + + // Since the user may change the order of existing caps in the raw array, + // we cannot use the element index - however, since the raw cap names are unique + // (due to being JSON keys), use that as the identifier. + // But if the user has changed the name of an existing cap, treat it as a new cap. + + // First, convert the current caps array to an object, in order to use name indexing. + // This also removes any entries with duplicate names (the capability builder allows duplicates), + // which is fine, since JSON only allows the latest entry anyway. + const currentCapsObj = _.fromPairs( + currentCapsArray.map((cap) => [cap.name, _.omit(cap, 'name')]), + ); + + // Translate the raw caps JSON to array format + const newCapsArray = Object.entries(rawCapsObj).map(([name, value]) => ({ + id: getRandomId(), + enabled: true, + ...currentCapsObj[name], // overrides id and enabled, if present + type: typeof value === 'string' ? 'text' : typeof value, + name, + value, + })); + dispatch({type: SAVE_RAW_DESIRED_CAPS, caps: newCapsArray}); + } catch (e) { + dispatch({type: SHOW_DESIRED_CAPS_JSON_ERROR, message: e.message}); + } + }; +} + +export function setRawDesiredCaps(rawDesiredCaps) { + return (dispatch, getState) => { + const state = getState().builder; + let isValidCapsJson = true; + let invalidCapsJsonReason; + if (state.isValidatingCapsJson) { + try { + JSON.parse(rawDesiredCaps); + } catch (e) { + isValidCapsJson = false; + invalidCapsJsonReason = e.message; + } + } + dispatch({type: SET_RAW_DESIRED_CAPS, rawDesiredCaps, isValidCapsJson, invalidCapsJsonReason}); + }; +} + +export function addCloudProvider() { + return (dispatch) => { + dispatch({type: IS_ADDING_CLOUD_PROVIDER, isAddingProvider: true}); + }; +} + +export function stopAddCloudProvider() { + return (dispatch) => { + dispatch({type: IS_ADDING_CLOUD_PROVIDER, isAddingProvider: false}); + }; +} + +export function addVisibleProvider(provider) { + return async (dispatch, getState) => { + let currentProviders = getState().builder.visibleProviders; + const providers = _.union(currentProviders, [provider]); + await setSetting(VISIBLE_PROVIDERS, providers); + dispatch({type: SET_PROVIDERS, providers}); + }; +} + +export function removeVisibleProvider(provider) { + return async (dispatch, getState) => { + const {serverType, visibleProviders} = getState().builder; + if (serverType === provider) { + const action = changeServerType('remote'); + await action(dispatch, getState); + } + const providers = _.without(visibleProviders, provider); + await setSetting(VISIBLE_PROVIDERS, providers); + dispatch({type: SET_PROVIDERS, providers}); + }; +} + +export function setVisibleProviders() { + return async (dispatch) => { + const providers = await getSetting(VISIBLE_PROVIDERS); + dispatch({type: SET_PROVIDERS, providers}); + }; +} + +export function bindWindowClose() { + return (dispatch, getState) => { + window.addEventListener('beforeunload', async () => { + let {driver} = getState().inspector; + if (driver) { + try { + const action = quitSession(); + await action(dispatch, getState); + } catch {} + } + }); + }; +} + +export function setAddVendorPrefixes(addVendorPrefixes) { + return (dispatch) => { + dispatch({type: SET_ADD_VENDOR_PREFIXES, addVendorPrefixes}); + }; +} + +/** + * Extract port from URL and set it in server state when running in browser/plugin mode + * This is useful when the inspector is accessed via the plugin at http://localhost:PORT/inspector + * The port from the URL takes precedence when running in plugin mode + */ +export function setPortFromUrl() { + return async (dispatch, getState) => { + if (typeof window === 'undefined' || !window.location) { + return; + } + + try { + const url = new URL(window.location.href); + const port = url.port; + + if (port && (url.pathname === '/inspector' || url.pathname.startsWith('/inspector/'))) { + const parsedPort = parseInt(port, 10); + if (!isNaN(parsedPort) && parsedPort > 0 && parsedPort <= 65535) { + await setServerParam('port', parsedPort.toString())(dispatch, getState); + } + } + } catch (e) { + log.debug('Could not extract port from URL:', e); + } + }; +} + +export function initFromQueryString(loadNewSession) { + return (dispatch, getState) => { + if (!isFirstRun) { + return; + } + + isFirstRun = false; + + const url = new URL(window.location.href); + const initialState = url.searchParams.get('state'); + const autoStartSession = url.searchParams.get('autoStart'); + + if (initialState) { + try { + const state = JSON.parse(initialState); + dispatch({type: SET_STATE_FROM_URL, state}); + } catch { + showError(new Error('Could not parse initial state from URL'), {secs: 0}); + } + } + + if (autoStartSession === AUTO_START_URL_PARAM) { + // at this point these can only be set using SET_STATE_FROM_URL + const {attachSessId, caps} = getState().builder; + if (attachSessId) { + return loadNewSession(null, attachSessId); + } + loadNewSession(caps); + } + }; +} + +function parseAndValidateSessionFileString(sessionFileString) { + const sessionJSON = parseSessionFileContents(sessionFileString); + if (sessionJSON === null) { + return null; + } + sessionJSON.serverType = Object.keys(sessionJSON.server).find( + (type) => type !== SERVER_TYPES.ADVANCED, + ); + sessionJSON.visibleProviders = + sessionJSON.serverType !== SERVER_TYPES.REMOTE ? [sessionJSON.serverType] : []; + return sessionJSON; +} + +/** + * @returns {Promise} + */ +async function retrieveVendorProperties({server, serverType, sessionCaps}) { + // + // To register a new session vendor: + // - Implement a new class inherited from BaseVendor in app/common/renderer/lib/vendor/.ts + // - Add the newly created class to the VENDOR_MAP defined in app/common/renderer/lib/vendor/map.ts + // + const VendorClass = VENDOR_MAP[serverType]; + + if (!VendorClass) { + log.info(`No vendor mapping is defined for the server type '${serverType}'. Using defaults`); + + return {}; + } + + log.info(`Using ${VendorClass.name}`); + + try { + const vendor = new VendorClass(server, sessionCaps); + return await vendor.apply(); + } catch (e) { + showError(e); + return false; + } +} + +async function fetchAllSessions(baseUrl, headers) { + const appiumSessionsEndpoint = `${baseUrl}appium/sessions`; // Appium 3+ + const oldAppiumSessionsEndpoint = `${baseUrl}sessions`; // Appium 1-2 + const seleniumSessionsEndpoint = `${baseUrl}status`; + + async function fetchSessionsFromEndpoint(url) { + try { + const res = await fetchSessionInformation({url, headers}); + return url === seleniumSessionsEndpoint ? formatSeleniumGridSessions(res) : (res.value ?? []); + } catch { + return []; + } + } + + const [appiumSessions, oldAppiumSessions, seleniumSessions] = await Promise.all([ + fetchSessionsFromEndpoint(appiumSessionsEndpoint), + fetchSessionsFromEndpoint(oldAppiumSessionsEndpoint), + fetchSessionsFromEndpoint(seleniumSessionsEndpoint), + ]); + + return [...appiumSessions, ...oldAppiumSessions, ...seleniumSessions]; +} + +/** + * Fetch running sessions for a TestMu AI server. + * + * Combines the provider's session-list API (derived from the hub host) with the + * standard /wd/hub/sessions endpoint, tolerating failures from either source so + * one unavailable endpoint doesn't hide the sessions from the other. + * + * @param {string} host + * @param {object} headers + * @returns {Promise} + */ +async function fetchTestMuAISessions(host, headers) { + const sessionListHost = host + .replace(/^mobile-hub\./, 'api.') + .replace(/^mobile-hub-/, 'api-') + .replace(/^hub-/, 'api-'); + const sessionListUrl = `https://${sessionListHost}/automation/api/v1/appium/inspector/sessions`; + const hubSessionsUrl = `https://${host}/wd/hub/sessions`; + + async function fetchSessionsFromEndpoint(url) { + try { + const res = await fetchSessionInformation({url, headers}); + return res.value ?? []; + } catch (err) { + log.error(`Failed to fetch running sessions from ${url}`, err); + return []; + } + } + + const [webSessions, appSessions] = await Promise.all([ + fetchSessionsFromEndpoint(sessionListUrl), + fetchSessionsFromEndpoint(hubSessionsUrl), + ]); + + return [...webSessions, ...appSessions]; +} + +/** + * Add custom capabilities + * + * @param {object} caps + */ +function addCustomCaps(caps) { + const {platformName = ''} = caps; + const androidCustomCaps = {}; + // @TODO: remove when this is defaulted in the newest Appium 1.8.x release + androidCustomCaps[CAPS_ENSURE_WEBVIEW_HAVE_PAGES] = true; + // Make sure the screenshot is taken of the whole screen when the ChromeDriver is used + androidCustomCaps[CAPS_NATIVE_WEB_SCREENSHOT] = true; + + const iosCustomCaps = {}; + // Always add the includeSafariInWebviews for future HTML detection + // This will ensure that if you use AD to switch between App and browser + // that it can detect Safari as a webview + iosCustomCaps[CAPS_INCLUDE_SAFARI_IN_WEBVIEWS] = true; + + return { + ...caps, + ...(platformName.toLowerCase() === 'android' ? androidCustomCaps : {}), + ...(platformName.toLowerCase() === 'ios' ? iosCustomCaps : {}), + }; +} diff --git a/app/renderer/actions/Inspector.js b/app/common/renderer/actions/SessionInspector.js similarity index 61% rename from app/renderer/actions/Inspector.js rename to app/common/renderer/actions/SessionInspector.js index ba864622cb..ebe2855ce0 100644 --- a/app/renderer/actions/Inspector.js +++ b/app/common/renderer/actions/SessionInspector.js @@ -1,16 +1,30 @@ import _ from 'lodash'; -import {v4 as UUID} from 'uuid'; - -import i18n from '../../configs/i18next.config.renderer'; -import {SAVED_FRAMEWORK, SET_SAVED_GESTURES, getSetting, setSetting} from '../../shared/settings'; -import {APP_MODE, getLocators} from '../components/Inspector/shared'; -import AppiumClient, {NATIVE_APP} from '../lib/appium-client'; -import frameworks from '../lib/client-frameworks'; -import {xmlToJSON} from '../util'; -import {showError} from './Session'; +import sanitize from 'sanitize-filename'; + +import {SAVED_CLIENT_FRAMEWORK, SET_SAVED_GESTURES} from '../../shared/setting-defs.js'; +import {APP_MODE, NATIVE_APP, UNKNOWN_ERROR} from '../constants/session-inspector.js'; +import i18n from '../i18next.js'; +import InspectorDriver from '../lib/appium/inspector-driver.js'; +import {CLIENT_FRAMEWORK_MAP} from '../lib/client-frameworks/map.js'; +import {getSetting, setSetting} from '../polyfills.js'; +import {downloadFile, readTextFromUploadedFiles} from '../utils/file-handling.js'; +import {parseGestureFileContents} from '../utils/gesturefile-parsing.js'; +import {getSuggestedLocators} from '../utils/locator-generation/common.js'; +import {getOptimalXPath} from '../utils/locator-generation/xpath.js'; +import {log} from '../utils/logger.js'; +import {notification} from '../utils/notification.js'; +import {getRandomId} from '../utils/other.js'; +import { + findDOMNodeByPath, + findJSONElementByPath, + xmlToDOM, + xmlToJSON, +} from '../utils/source-parsing.js'; +import {newSession, showError} from './SessionBuilder.js'; export const SET_SESSION_DETAILS = 'SET_SESSION_DETAILS'; export const SET_SOURCE_AND_SCREENSHOT = 'SET_SOURCE_AND_SCREENSHOT'; +export const STORE_SESSION_SETTINGS = 'STORE_SESSION_SETTINGS'; export const SESSION_DONE = 'SESSION_DONE'; export const SELECT_ELEMENT = 'SELECT_ELEMENT'; export const UNSELECT_ELEMENT = 'UNSELECT_ELEMENT'; @@ -19,11 +33,8 @@ export const SET_INTERACTIONS_NOT_AVAILABLE = 'SET_INTERACTIONS_NOT_AVAILABLE'; export const METHOD_CALL_REQUESTED = 'METHOD_CALL_REQUESTED'; export const METHOD_CALL_DONE = 'METHOD_CALL_DONE'; export const SET_EXPANDED_PATHS = 'SET_EXPANDED_PATHS'; -export const SELECT_HOVERED_ELEMENT = 'SELECT_HOVERED_ELEMENT'; -export const UNSELECT_HOVERED_ELEMENT = 'UNSELECT_HOVERED_ELEMENT'; +export const SET_OPTIMAL_LOCATORS = 'SET_OPTIMAL_LOCATORS'; -export const SELECT_HOVERED_CENTROID = 'SELECT_HOVERED_CENTROID'; -export const UNSELECT_HOVERED_CENTROID = 'UNSELECT_HOVERED_CENTROID'; export const SELECT_CENTROID = 'SELECT_CENTROID'; export const UNSELECT_CENTROID = 'UNSELECT_CENTROID'; export const SET_SHOW_CENTROIDS = 'SET_SHOW_CENTROIDS'; @@ -35,7 +46,7 @@ export const SET_SESSION_TIME = 'SET_SESSION_TIME'; export const START_RECORDING = 'START_RECORDING'; export const PAUSE_RECORDING = 'PAUSE_RECORDING'; export const CLEAR_RECORDING = 'CLEAR_RECORDING'; -export const SET_ACTION_FRAMEWORK = 'SET_ACTION_FRAMEWORK'; +export const SET_CLIENT_FRAMEWORK = 'SET_CLIENT_FRAMEWORK'; export const RECORD_ACTION = 'RECORD_ACTION'; export const SET_SHOW_BOILERPLATE = 'SET_SHOW_BOILERPLATE'; @@ -56,10 +67,13 @@ export const FINDING_ELEMENT_IN_SOURCE_COMPLETED = 'FINDING_ELEMENT_IN_SOURCE_CO export const CLEAR_SEARCH_RESULTS = 'CLEAR_SEARCH_RESULTS'; export const ADD_ASSIGNED_VAR_CACHE = 'ADD_ASSIGNED_VAR_CACHE'; export const CLEAR_ASSIGNED_VAR_CACHE = 'CLEAR_ASSIGNED_VAR_CACHE'; +export const SET_MJPEG_STATE = 'SET_MJPEG_STATE'; export const SET_SCREENSHOT_INTERACTION_MODE = 'SET_SCREENSHOT_INTERACTION_MODE'; export const SET_APP_MODE = 'SET_APP_MODE'; export const SET_SEARCHED_FOR_ELEMENT_BOUNDS = 'SET_SEARCHED_FOR_ELEMENT_BOUNDS'; export const CLEAR_SEARCHED_FOR_ELEMENT_BOUNDS = 'CLEAR_SEARCHED_FOR_ELEMENT_BOUNDS'; +export const SET_FOUND_DISPLAYS = 'SET_FOUND_DISPLAYS'; +export const SET_CURRENT_DISPLAY_ID = 'SET_CURRENT_DISPLAY_ID'; export const SET_COORD_START = 'SET_COORD_START'; export const SET_COORD_END = 'SET_COORD_END'; @@ -67,25 +81,22 @@ export const CLEAR_COORD_ACTION = 'CLEAR_COORD_ACTION'; export const PROMPT_KEEP_ALIVE = 'PROMPT_KEEP_ALIVE'; export const HIDE_PROMPT_KEEP_ALIVE = 'HIDE_PROMPT_KEEP_ALIVE'; -export const SELECT_INTERACTION_MODE = 'SELECT_INTERACTION_MODE'; - -export const ENTERING_COMMAND_ARGS = 'ENTERING_COMMAND_ARGS'; -export const CANCEL_PENDING_COMMAND = 'CANCEL_PENDING_COMMAND'; -export const SET_COMMAND_ARG = 'SET_COMMAND_ARG'; +export const SELECT_INSPECTOR_TAB = 'SELECT_INSPECTOR_TAB'; export const SET_CONTEXT = 'SET_CONTEXT'; export const SET_APP_ID = 'SET_APP_ID'; export const SET_SERVER_STATUS = 'SET_SERVER_STATUS'; +export const SET_FLAT_SESSION_CAPS = 'SET_FLAT_SESSION_CAPS'; export const SET_KEEP_ALIVE_INTERVAL = 'SET_KEEP_ALIVE_INTERVAL'; export const SET_USER_WAIT_TIMEOUT = 'SET_USER_WAIT_TIMEOUT'; export const SET_LAST_ACTIVE_MOMENT = 'SET_LAST_ACTIVE_MOMENT'; -export const SET_VISIBLE_COMMAND_RESULT = 'SET_VISIBLE_COMMAND_RESULT'; - export const SET_AWAITING_MJPEG_STREAM = 'SET_AWAITING_MJPEG_STREAM'; +export const GESTURE_UPLOAD_REQUESTED = 'GESTURE_UPLOAD_REQUESTED'; +export const GESTURE_UPLOAD_DONE = 'GESTURE_UPLOAD_DONE'; export const SHOW_GESTURE_EDITOR = 'SHOW_GESTURE_EDITOR'; export const HIDE_GESTURE_EDITOR = 'HIDE_GESTURE_EDITOR'; export const GET_SAVED_GESTURES_REQUESTED = 'GET_SAVED_GESTURES_REQUESTED'; @@ -102,7 +113,9 @@ export const SET_GESTURE_TAP_COORDS_MODE = 'SET_GESTURE_TAP_COORDS_MODE'; export const CLEAR_TAP_COORDINATES = 'CLEAR_TAP_COORDINATES'; export const TOGGLE_SHOW_ATTRIBUTES = 'TOGGLE_SHOW_ATTRIBUTES'; -export const TOGGLE_REFRESHING_STATE = 'TOGGLE_REFRESHING_STATE'; +export const SET_REFRESHING_STATE = 'SET_REFRESHING_STATE'; + +export const SET_AUTO_SESSION_RESTART = 'SET_AUTO_SESSION_RESTART'; const KEEP_ALIVE_PING_INTERVAL = 20 * 1000; const NO_NEW_COMMAND_LIMIT = 24 * 60 * 60 * 1000; // Set timeout to 24 hours @@ -115,12 +128,12 @@ const findElement = _.debounce(async function (strategyMap, dispatch, getState, strategy, selector, }); - let {elementId, variableName, variableType} = await action(dispatch, getState); + let {elementId} = await action(dispatch, getState); - // Set the elementId, variableName and variableType for the selected element + // Set the elementId for the selected element // (check first that the selectedElementPath didn't change, to avoid race conditions) if (elementId && getState().inspector.selectedElementPath === path) { - return dispatch({type: SET_SELECTED_ELEMENT_ID, elementId, variableName, variableType}); + return dispatch({type: SET_SELECTED_ELEMENT_ID, elementId}); } } @@ -129,9 +142,12 @@ const findElement = _.debounce(async function (strategyMap, dispatch, getState, export function selectElement(path) { return async (dispatch, getState) => { + const {sourceJSON, sourceXML, expandedPaths, currentContext, automationName} = + getState().inspector; + const isNative = currentContext === NATIVE_APP; // Set the selected element in the source tree - dispatch({type: SELECT_ELEMENT, path}); - const {selectedElement, sourceXML, expandedPaths} = getState().inspector; + const selectedElement = findJSONElementByPath(path, sourceJSON); + dispatch({type: SELECT_ELEMENT, selectedElement}); // Expand all of this element's ancestors so that it's visible in the source tree // Make a copy of the array to avoid state mutation @@ -146,9 +162,9 @@ export function selectElement(path) { } dispatch({type: SET_EXPANDED_PATHS, paths: copiedExpandedPaths}); - // Find the optimal selection strategy. If none found, fall back to XPath. - const strategyMap = _.toPairs(getLocators(selectedElement.attributes, sourceXML)); - strategyMap.push(['xpath', selectedElement.xpath]); + // Calculate the recommended locator strategies + const strategyMap = getSuggestedLocators(selectedElement, sourceXML, isNative, automationName); + dispatch({type: SET_OPTIMAL_LOCATORS, strategyMap}); // Debounce find element so that if another element is selected shortly after, cancel the previous search await findElement(strategyMap, dispatch, getState, path); @@ -173,101 +189,100 @@ export function unselectCentroid() { }; } -export function selectHoveredCentroid(path) { - return (dispatch) => { - dispatch({type: SELECT_HOVERED_CENTROID, path}); - }; -} - -export function unselectHoveredCentroid() { - return (dispatch) => { - dispatch({type: UNSELECT_HOVERED_CENTROID}); - }; -} - -export function selectHoveredElement(path) { - return (dispatch) => { - dispatch({type: SELECT_HOVERED_ELEMENT, path}); - }; -} - -export function unselectHoveredElement() { - return (dispatch) => { - dispatch({type: UNSELECT_HOVERED_ELEMENT}); - }; -} - /** * Requests a method call on appium */ export function applyClientMethod(params) { return async (dispatch, getState) => { const isRecording = - params.methodName !== 'quit' && + params.methodName !== 'deleteSession' && params.methodName !== 'getPageSource' && params.methodName !== 'gesture' && - params.methodName !== 'status' && getState().inspector.isRecording; - try { - dispatch({type: METHOD_CALL_REQUESTED}); - const callAction = callClientMethod(params); - const { + dispatch({type: METHOD_CALL_REQUESTED}); + const callAction = callClientMethod(params); + const { + contexts, + contextsError, + commandRes, + currentContext, + currentContextError, + source, + screenshot, + windowSize, + sourceError, + screenshotError, + windowSizeError, + variableName, + variableIndex, + strategy, + selector, + } = await callAction(dispatch, getState); + + // TODO: Implement recorder code for gestures + if (isRecording) { + // Add 'findAndAssign' line of code. Don't do it for arrays though. Arrays already have 'find' expression + if (strategy && selector && !variableIndex && variableIndex !== 0) { + const findAction = findAndAssign(strategy, selector, variableName, false); + findAction(dispatch, getState); + } + + // now record the actual action + let args = [variableName, variableIndex]; + args = args.concat(params.args || []); + dispatch({type: RECORD_ACTION, action: params.methodName, params: args}); + } + dispatch({type: METHOD_CALL_DONE}); + + if (source) { + dispatch({ + type: SET_SOURCE_AND_SCREENSHOT, contexts, - contextsError, - commandRes, currentContext, - currentContextError, - source, + sourceJSON: xmlToJSON(source), + sourceXML: source, screenshot, windowSize, + contextsError, + currentContextError, sourceError, screenshotError, windowSizeError, - variableName, - variableIndex, - strategy, - selector, - } = await callAction(dispatch, getState); - - // TODO: Implement recorder code for gestures - if (isRecording) { - // Add 'findAndAssign' line of code. Don't do it for arrays though. Arrays already have 'find' expression - if (strategy && selector && !variableIndex && variableIndex !== 0) { - const findAction = findAndAssign(strategy, selector, variableName, false); - findAction(dispatch, getState); - } - - // now record the actual action - let args = [variableName, variableIndex]; - args = args.concat(params.args || []); - dispatch({type: RECORD_ACTION, action: params.methodName, params: args}); - } - dispatch({type: METHOD_CALL_DONE}); + }); + } + window.dispatchEvent(new Event('resize')); + return commandRes; + }; +} - if (source) { - dispatch({ - type: SET_SOURCE_AND_SCREENSHOT, - contexts, - currentContext, - source: source && xmlToJSON(source), - sourceXML: source, - screenshot, - windowSize, - contextsError, - currentContextError, - sourceError, - screenshotError, - windowSizeError, - }); - } - window.dispatchEvent(new Event('resize')); - return commandRes; - } catch (error) { - console.log(error); // eslint-disable-line no-console - let methodName = params.methodName === 'click' ? 'tap' : params.methodName; - showError(error, {methodName, secs: 10}); - dispatch({type: METHOD_CALL_DONE}); +export function restartSession(error, params) { + return async (dispatch, getState) => { + if (error?.name !== UNKNOWN_ERROR) { + showError(error, {methodName: params.methodName, secs: 10}); + return dispatch({type: METHOD_CALL_DONE}); } + showError(error, {methodName: params.methodName, secs: 3}); + notification.info({ + title: i18n.t('RestartSessionMessage'), + duration: 3, + }); + const quitSes = quitSession(); + const newSes = newSession(getState().builder.caps); + const getPageSrc = applyClientMethod({methodName: 'getPageSource'}); + const storeSessionSet = storeSessionSettings(); + const getSavedClientFrame = getSavedClientFramework(); + const runKeepAliveLp = runKeepAliveLoop(); + const setSesTime = setSessionTime(Date.now()); + + await quitSes(dispatch, getState); + await newSes(dispatch, getState); + await getPageSrc(dispatch, getState); + await storeSessionSet(dispatch, getState); + await getSavedClientFrame(dispatch); + runKeepAliveLp(dispatch, getState); + setSesTime(dispatch); + dispatch({type: SET_AUTO_SESSION_RESTART, autoSessionRestart: true}); + dispatch({type: METHOD_CALL_DONE}); }; } @@ -286,14 +301,17 @@ export function setExpandedPaths(paths) { /** * Quit the session and go back to the new session window */ -export function quitSession(reason, killedByUser = true) { +export function quitSession({reason, manualQuit = true, detachOnly = false} = {}) { return async (dispatch, getState) => { const killAction = killKeepAliveLoop(); killAction(dispatch, getState); - const applyAction = applyClientMethod({methodName: 'quit'}); - await applyAction(dispatch, getState); + if (!detachOnly) { + const applyAction = applyClientMethod({methodName: 'deleteSession'}); + await applyAction(dispatch, getState); + } dispatch({type: QUIT_SESSION_DONE}); - if (!killedByUser) { + InspectorDriver.clearInstance(); // clear the 'cached' driver instance + if (!manualQuit) { showError(new Error(reason || i18n.t('Session has been terminated')), {secs: 0}); } }; @@ -318,20 +336,20 @@ export function clearRecording() { }; } -export function getSavedActionFramework() { +export function getSavedClientFramework() { return async (dispatch) => { - let framework = await getSetting(SAVED_FRAMEWORK); - dispatch({type: SET_ACTION_FRAMEWORK, framework}); + let framework = await getSetting(SAVED_CLIENT_FRAMEWORK); + dispatch({type: SET_CLIENT_FRAMEWORK, framework}); }; } -export function setActionFramework(framework) { +export function setClientFramework(framework) { return async (dispatch) => { - if (!frameworks[framework]) { + if (!CLIENT_FRAMEWORK_MAP[framework]) { throw new Error(i18n.t('frameworkNotSupported', {framework})); } - await setSetting(SAVED_FRAMEWORK, framework); - dispatch({type: SET_ACTION_FRAMEWORK, framework}); + await setSetting(SAVED_CLIENT_FRAMEWORK, framework); + dispatch({type: SET_CLIENT_FRAMEWORK, framework}); }; } @@ -348,9 +366,30 @@ export function toggleShowBoilerplate() { }; } -export function setSessionDetails({driver, sessionDetails, mode, mjpegScreenshotUrl}) { +export function setSessionDetails({serverDetails, driver, sessionCaps, appMode, isUsingMjpegMode}) { return (dispatch) => { - dispatch({type: SET_SESSION_DETAILS, driver, sessionDetails, mode, mjpegScreenshotUrl}); + dispatch({ + type: SET_SESSION_DETAILS, + serverDetails, + driver, + sessionCaps, + appMode, + isUsingMjpegMode, + }); + }; +} + +export function storeSessionSettings(updatedSessionSettings = null) { + return async (dispatch, getState) => { + let sessionSettings = updatedSessionSettings; + if (sessionSettings === null) { + const action = applyClientMethod({ + methodName: 'getSettings', + skipRefresh: true, + }); + sessionSettings = await action(dispatch, getState); + } + dispatch({type: STORE_SESSION_SETTINGS, sessionSettings}); }; } @@ -384,6 +423,38 @@ export function setSiriCommandValue(siriCommandValue) { }; } +export function toggleMultiDisplayMode(displays) { + return async (dispatch, getState) => { + if (displays) { + // Toggling off: reset to the default display (0), then set displays to null + await setCurrentDisplayId(0)(dispatch, getState); + return dispatch({type: SET_FOUND_DISPLAYS, displays: null}); + } + // Toggling on: run search, set displays and currentDisplayId + // Any errors will be surfaced as part of callClientMethod + const action = applyClientMethod({ + methodName: 'executeScript', + args: ['mobile:listDisplays', []], + skipRefresh: true, + }); + const foundDisplays = await action(dispatch, getState); + dispatch({type: SET_FOUND_DISPLAYS, displays: foundDisplays}); + dispatch({type: SET_CURRENT_DISPLAY_ID, displayId: 0}); + }; +} + +export function setCurrentDisplayId(displayId) { + return async (dispatch, getState) => { + const action = applyClientMethod({ + methodName: 'updateSettings', + // without enableMultiWindows: true, app source is retrieved from default display + args: [{currentDisplayId: displayId, enableMultiWindows: true}], + }); + await action(dispatch, getState); + dispatch({type: SET_CURRENT_DISPLAY_ID, displayId}); + }; +} + export function setLocatorTestValue(locatorTestValue) { return (dispatch) => { dispatch({type: SET_LOCATOR_TEST_VALUE, locatorTestValue}); @@ -404,12 +475,15 @@ export function setContext(context) { export function searchForElement(strategy, selector) { return async (dispatch, getState) => { + const isRecording = getState().inspector.isRecording; dispatch({type: SEARCHING_FOR_ELEMENTS}); try { const callAction = callClientMethod({strategy, selector, fetchArray: true}); let {elements, variableName, executionTime} = await callAction(dispatch, getState); - const findAction = findAndAssign(strategy, selector, variableName, true); - findAction(dispatch, getState); + if (isRecording) { + const findAction = findAndAssign(strategy, selector, variableName, true); + findAction(dispatch, getState); + } elements = elements.map((el) => el.id); dispatch({type: SEARCHING_FOR_ELEMENTS_COMPLETED, elements, executionTime}); } catch (error) { @@ -469,10 +543,9 @@ export function setLocatorTestElement(elementId) { try { const action = callClientMethod({ elementId, - methodName: 'getRect', + methodName: 'getElementRect', skipRefresh: true, skipRecord: true, - ignoreResult: true, }); const {commandRes} = await action(dispatch, getState); dispatch({ @@ -480,7 +553,7 @@ export function setLocatorTestElement(elementId) { location: {x: commandRes.x, y: commandRes.y}, size: {width: commandRes.width, height: commandRes.height}, }); - } catch (ign) {} + } catch {} } }; } @@ -489,30 +562,30 @@ export function setLocatorTestElement(elementId) { * Given an element ID found through search, and its bounds, * attempt to find and select this element in the source tree */ -export function selectLocatedElement(source, bounds, id) { +export function selectLocatedElement(sourceJSON, sourceXML, bounds, id) { const UPPER_FILTER_LIMIT = 10; // Parse the source tree and find all nodes whose bounds match the expected bounds - // Return the path + xpath of each node + // Return the path of each node function findPathsMatchingBounds() { - if (!bounds || !source.children || !source.children[0].attributes) { + if (!bounds || !sourceJSON.children?.[0]?.attributes) { return null; } - if (source.children[0].attributes.bounds) { + if (sourceJSON.children[0].attributes.bounds) { const [endX, endY] = [ bounds.location.x + bounds.size.width, bounds.location.y + bounds.size.height, ]; const coords = `[${bounds.location.x},${bounds.location.y}][${endX},${endY}]`; - return findPathsFromCoords(source.children, coords); - } else if (source.children[0].attributes.x) { + return findPathsFromCoords(sourceJSON.children, coords); + } else if (sourceJSON.children[0].attributes.x) { const combinedBounds = { x: String(bounds.location.x), y: String(bounds.location.y), height: String(bounds.size.height), width: String(bounds.size.width), }; - return findPathsFromBounds(source.children, combinedBounds); + return findPathsFromBounds(sourceJSON.children, combinedBounds); } return null; } @@ -522,7 +595,7 @@ export function selectLocatedElement(source, bounds, id) { let collectedPaths = []; for (const tree of trees) { if (tree.attributes.bounds === coords) { - collectedPaths.push([tree.path, tree.xpath]); + collectedPaths.push(tree.path); } if (tree.children.length) { collectedPaths.push(...findPathsFromCoords(tree.children, coords)); @@ -541,7 +614,7 @@ export function selectLocatedElement(source, bounds, id) { tree.attributes.height === bounds.height && tree.attributes.width === bounds.width ) { - collectedPaths.push([tree.path, tree.xpath]); + collectedPaths.push(tree.path); } if (tree.children.length) { collectedPaths.push(...findPathsFromBounds(tree.children, bounds)); @@ -557,21 +630,24 @@ export function selectLocatedElement(source, bounds, id) { return null; } if (foundPaths.length === 1) { - return foundPaths[0][0]; + return foundPaths[0]; } else if (foundPaths.length !== 0 && foundPaths.length <= UPPER_FILTER_LIMIT) { return await findElementWithMatchingId(foundPaths, dispatch, getState); } return null; } - // Calls Appium findElement for each provided xpath, and returns the path - // of the element whose ID matches the expected ID + // For each provided path, get its xpath and call Appium findElement + // Return the path of the element whose ID matches the expected ID async function findElementWithMatchingId(foundPaths, dispatch, getState) { + const sourceDoc = xmlToDOM(sourceXML); for (const path of foundPaths) { - const action = callClientMethod({strategy: 'xpath', selector: path[1]}); + const domNode = findDOMNodeByPath(path, sourceDoc); + const xpath = getOptimalXPath(sourceDoc, domNode); + const action = callClientMethod({strategy: 'xpath', selector: xpath}); const {el} = await action(dispatch, getState); if (el && el.elementId === id) { - return path[0]; + return path; } } return null; @@ -598,15 +674,21 @@ export function clearSearchResults() { }; } +export function setMjpegState(targetMjpegState) { + return (dispatch) => { + dispatch({type: SET_MJPEG_STATE, targetMjpegState}); + }; +} + export function selectScreenshotInteractionMode(screenshotInteractionMode) { return (dispatch) => { dispatch({type: SET_SCREENSHOT_INTERACTION_MODE, screenshotInteractionMode}); }; } -export function toggleRefreshingState() { +export function setRefreshingState(refreshStates) { return (dispatch) => { - dispatch({type: TOGGLE_REFRESHING_STATE}); + dispatch({type: SET_REFRESHING_STATE, refreshStates}); }; } @@ -620,7 +702,7 @@ export function selectAppMode(mode) { await action(dispatch, getState); } if (appMode !== mode && mode === APP_MODE.NATIVE) { - const action = applyClientMethod({methodName: 'switchContext', args: [NATIVE_APP]}); + const action = applyClientMethod({methodName: 'switchAppiumContext', args: [NATIVE_APP]}); await action(dispatch, getState); } }; @@ -641,30 +723,42 @@ export function getActiveAppId(isIOS, isAndroid) { const action = applyClientMethod({ methodName: 'executeScript', args: ['mobile:activeAppInfo', []], + skipRefresh: true, }); const {bundleId} = await action(dispatch, getState); dispatch({type: SET_APP_ID, appId: bundleId}); } if (isAndroid) { - const action = applyClientMethod({methodName: 'getCurrentPackage'}); + const action = applyClientMethod({ + methodName: 'executeScript', + args: ['mobile:getCurrentPackage', []], + skipRefresh: true, + }); const appPackage = await action(dispatch, getState); dispatch({type: SET_APP_ID, appId: appPackage}); } } catch (err) { - // eslint-disable-next-line no-console - console.error(`Could not Retrieve Active App ID: ${err}`); + log.error(`Could not Retrieve Active App ID: ${err}`); } }; } export function getServerStatus() { return async (dispatch, getState) => { - const status = applyClientMethod({methodName: 'status'}); + const status = applyClientMethod({methodName: 'status', skipRefresh: true}); const {build} = await status(dispatch, getState); dispatch({type: SET_SERVER_STATUS, status: build}); }; } +export function getFlatSessionCaps() { + return async (dispatch, getState) => { + const action = applyClientMethod({methodName: 'getSession', skipRefresh: true}); + const flatSessionCaps = await action(dispatch, getState); + dispatch({type: SET_FLAT_SESSION_CAPS, flatSessionCaps}); + }; +} + // Start the session timer once session starts export function setSessionTime(time) { return (dispatch) => { @@ -690,27 +784,29 @@ export function clearCoordAction() { }; } -export function selectInteractionMode(interaction) { +export function selectInspectorTab(interaction) { return (dispatch) => { - dispatch({type: SELECT_INTERACTION_MODE, interaction}); + dispatch({type: SELECT_INSPECTOR_TAB, interaction}); }; } -export function startEnteringCommandArgs(commandName, command) { - return (dispatch) => { - dispatch({type: ENTERING_COMMAND_ARGS, commandName, command}); - }; -} - -export function cancelPendingCommand() { - return (dispatch) => { - dispatch({type: CANCEL_PENDING_COMMAND}); - }; -} +export function getSupportedSessionMethods() { + return async (_dispatch, getState) => { + async function safelyCallCommand(methodName) { + try { + const action = executeDriverCommand({methodName}); + const {commandRes} = await action(getState); + return commandRes; + } catch { + return []; + } + } -export function setCommandArg(index, value) { - return (dispatch) => { - dispatch({type: SET_COMMAND_ARG, index, value}); + const [commands, executeMethods] = await Promise.all([ + safelyCallCommand('getAppiumCommands'), + safelyCallCommand('getAppiumExtensions'), + ]); + return {commands, executeMethods}; }; } @@ -730,10 +826,10 @@ export function runKeepAliveLoop() { const keepAliveInterval = setInterval(async () => { const {lastActiveMoment, showKeepAlivePrompt} = getState().inspector; - console.log('Pinging Appium server to keep session active'); // eslint-disable-line no-console + log.info('Pinging Appium server to keep session active'); try { await driver.getTimeouts(); // Pings the Appium server to keep it alive - } catch (ign) {} + } catch {} const now = Date.now(); // If the new command limit has been surpassed, prompt user if they want to keep session going @@ -750,13 +846,9 @@ export function runKeepAliveLoop() { */ export function killKeepAliveLoop() { return (dispatch, getState) => { - const {keepAliveInterval, userWaitTimeout} = getState().inspector; + const {keepAliveInterval} = getState().inspector; clearInterval(keepAliveInterval); - if (userWaitTimeout) { - clearTimeout(userWaitTimeout); - } dispatch({type: SET_KEEP_ALIVE_INTERVAL, keepAliveInterval: null}); - dispatch({type: SET_USER_WAIT_TIMEOUT, userWaitTimeout: null}); }; } @@ -777,12 +869,13 @@ export function keepSessionAlive() { export function callClientMethod(params) { return async (dispatch, getState) => { - const {driver, appMode, mjpegScreenshotUrl, isSourceRefreshOn} = getState().inspector; - const {methodName, ignoreResult = true} = params; + const {driver, appMode, isUsingMjpegMode, isSourceRefreshOn, autoSessionRestart} = + getState().inspector; params.appMode = appMode; + params.autoSessionRestart = autoSessionRestart; // don't retrieve screenshot if we're already using the mjpeg stream - if (mjpegScreenshotUrl) { + if (isUsingMjpegMode) { params.skipScreenshot = true; } @@ -790,36 +883,35 @@ export function callClientMethod(params) { params.skipRefresh = true; } - console.log(`Calling client method with params:`); // eslint-disable-line no-console - console.log(params); // eslint-disable-line no-console - const action = keepSessionAlive(); - action(dispatch, getState); - const client = AppiumClient.instance(driver); - const res = await client.run(params); - let {commandRes} = res; - - // Ignore empty objects - if (_.isObject(res) && _.isEmpty(res)) { - commandRes = null; - } - - if (!ignoreResult) { - // if the user is running actions manually, we want to show the full response with the - // ability to scroll etc... - const result = JSON.stringify(commandRes, null, ' '); - const truncatedResult = _.truncate(result, {length: 2000}); - console.log(`Result of client command was:`); // eslint-disable-line no-console - console.log(truncatedResult); // eslint-disable-line no-console - setVisibleCommandResult(result, methodName)(dispatch); + log.info(`Calling client method with params:`); + log.info(params); + try { + const action = keepSessionAlive(); + action(dispatch, getState); + const inspectorDriver = InspectorDriver.instance(driver); + const res = await inspectorDriver.run(params); + res.elementId = res.id; + return res; + } catch (error) { + log.error(error); + if (getState().inspector.autoSessionRestart) { + const restartSes = restartSession(error, params); + return await restartSes(dispatch, getState); + } + showError(error, {methodName: params.methodName, secs: 10}); + dispatch({type: METHOD_CALL_DONE}); } - res.elementId = res.id; - return res; }; } -export function setVisibleCommandResult(result, methodName) { - return (dispatch) => { - dispatch({type: SET_VISIBLE_COMMAND_RESULT, result, methodName}); +// Simple alternative to callClientMethod, for when we only want to +// run the command without any side-effects +export function executeDriverCommand(params) { + return async (getState) => { + const {driver} = getState().inspector; + params.skipRefresh = true; + const inspectorDriver = InspectorDriver.instance(driver); + return await inspectorDriver.run(params); }; } @@ -829,22 +921,74 @@ export function setAwaitingMjpegStream(isAwaiting) { }; } -export function saveGesture(params) { +export function importGestureFiles(fileList) { return async (dispatch) => { - let savedGestures = (await getSetting(SET_SAVED_GESTURES)) || []; - if (!params.id) { - params.id = UUID(); - params.date = Date.now(); - savedGestures.push(params); - } else { - for (const gesture of savedGestures) { - if (gesture.id === params.id) { - gesture.name = params.name; - gesture.description = params.description; - gesture.actions = params.actions; + dispatch({type: GESTURE_UPLOAD_REQUESTED}); + const gestures = await readTextFromUploadedFiles(fileList); + const invalidGestureFiles = []; + const parsedGestures = []; + for (const gesture of gestures) { + const {fileName, content, error} = gesture; + // Some error occurred while reading the uploaded file + if (error) { + invalidGestureFiles.push(fileName); + continue; + } + const gestureJSON = parseAndValidateGestureFileString(content); + if (!gestureJSON) { + invalidGestureFiles.push(fileName); + continue; + } + parsedGestures.push(gestureJSON); + } + + for (const parsedGesture of parsedGestures) { + await saveGesture(parsedGesture)(dispatch); + } + dispatch({type: GESTURE_UPLOAD_DONE}); + + if (!_.isEmpty(invalidGestureFiles)) { + notification.error({ + title: i18n.t('unableToImportGestureFiles', {fileNames: invalidGestureFiles.join(', ')}), + duration: 0, + }); + } + }; +} + +export function exportSavedGesture(gestureJSON) { + return async () => { + const cleanedName = `gesture-${gestureJSON.name}`; + const gestureToExport = _.omit(gestureJSON, ['id', 'date']); + const href = `data:text/json;charset=utf-8,${encodeURIComponent( + JSON.stringify(gestureToExport, null, 2), + )}`; + const escapedName = sanitize(cleanedName, {replacement: '_'}); + const fileName = `${escapedName}.json`; + downloadFile(href, fileName); + }; +} + +export function saveGesture(gesture) { + return async (dispatch) => { + const savedGestures = (await getSetting(SET_SAVED_GESTURES)) || []; + + if (gesture.id) { + // Editing an already saved gesture + for (const savedGesture of savedGestures) { + if (savedGesture.id === gesture.id) { + savedGesture.name = gesture.name; + savedGesture.description = gesture.description; + savedGesture.actions = gesture.actions; } } + } else { + // Adding a new gesture + gesture.id = getRandomId(); + gesture.date = Date.now(); + savedGestures.push(gesture); } + await setSetting(SET_SAVED_GESTURES, savedGestures); const action = getSavedGestures(); await action(dispatch); @@ -938,3 +1082,18 @@ export function toggleShowAttributes() { dispatch({type: TOGGLE_SHOW_ATTRIBUTES}); }; } + +export function toggleAutoSessionRestart() { + return (dispatch, getState) => { + const autoSessionRestart = !getState().inspector.autoSessionRestart; + dispatch({type: SET_AUTO_SESSION_RESTART, autoSessionRestart}); + }; +} + +function parseAndValidateGestureFileString(gestureFileString) { + const gestureJSON = parseGestureFileContents(gestureFileString); + if (gestureJSON === null) { + return null; + } + return _.omit(gestureJSON, ['id', 'date']); +} diff --git a/app/common/renderer/actions/index.js b/app/common/renderer/actions/index.js new file mode 100644 index 0000000000..33277c6120 --- /dev/null +++ b/app/common/renderer/actions/index.js @@ -0,0 +1,7 @@ +import * as sessionBuilderActions from './SessionBuilder.js'; +import * as sessionInspectorActions from './SessionInspector.js'; + +export default { + ...sessionInspectorActions, + ...sessionBuilderActions, +}; diff --git a/app/renderer/images/bitbar_logo.svg b/app/common/renderer/assets/images/bitbar_logo.svg similarity index 100% rename from app/renderer/images/bitbar_logo.svg rename to app/common/renderer/assets/images/bitbar_logo.svg diff --git a/app/common/renderer/assets/images/browserstack_logo.svg b/app/common/renderer/assets/images/browserstack_logo.svg new file mode 100644 index 0000000000..dfd660b64a --- /dev/null +++ b/app/common/renderer/assets/images/browserstack_logo.svg @@ -0,0 +1,33 @@ + + BrowserStack Logo + An illustration of BrowserStack Logo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/browserstack_logo_dark.svg b/app/common/renderer/assets/images/browserstack_logo_dark.svg new file mode 100644 index 0000000000..94af15fa24 --- /dev/null +++ b/app/common/renderer/assets/images/browserstack_logo_dark.svg @@ -0,0 +1,33 @@ + + BrowserStack Logo + An illustration of BrowserStack Logo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/renderer/images/experitest_logo.svg b/app/common/renderer/assets/images/experitest_logo.svg similarity index 100% rename from app/renderer/images/experitest_logo.svg rename to app/common/renderer/assets/images/experitest_logo.svg diff --git a/app/common/renderer/assets/images/fireflink_devicefarm_logo.svg b/app/common/renderer/assets/images/fireflink_devicefarm_logo.svg new file mode 100644 index 0000000000..825bfb0df5 --- /dev/null +++ b/app/common/renderer/assets/images/fireflink_devicefarm_logo.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/fireflink_devicefarm_logo_dark.svg b/app/common/renderer/assets/images/fireflink_devicefarm_logo_dark.svg new file mode 100644 index 0000000000..b4fa09af52 --- /dev/null +++ b/app/common/renderer/assets/images/fireflink_devicefarm_logo_dark.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/headspin_logo.svg b/app/common/renderer/assets/images/headspin_logo.svg new file mode 100644 index 0000000000..3399edf48e --- /dev/null +++ b/app/common/renderer/assets/images/headspin_logo.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/icon.png b/app/common/renderer/assets/images/icon.png new file mode 100644 index 0000000000..91bc513520 Binary files /dev/null and b/app/common/renderer/assets/images/icon.png differ diff --git a/app/common/renderer/assets/images/kobiton_logo.svg b/app/common/renderer/assets/images/kobiton_logo.svg new file mode 100644 index 0000000000..f390de94d6 --- /dev/null +++ b/app/common/renderer/assets/images/kobiton_logo.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/kobiton_logo_dark.svg b/app/common/renderer/assets/images/kobiton_logo_dark.svg new file mode 100644 index 0000000000..69c29ff82f --- /dev/null +++ b/app/common/renderer/assets/images/kobiton_logo_dark.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/renderer/images/loader.svg b/app/common/renderer/assets/images/loader.svg similarity index 100% rename from app/renderer/images/loader.svg rename to app/common/renderer/assets/images/loader.svg diff --git a/app/renderer/images/mobitru_logo.svg b/app/common/renderer/assets/images/mobitru_logo.svg similarity index 99% rename from app/renderer/images/mobitru_logo.svg rename to app/common/renderer/assets/images/mobitru_logo.svg index 25e100e650..cb4da6fe7b 100644 --- a/app/renderer/images/mobitru_logo.svg +++ b/app/common/renderer/assets/images/mobitru_logo.svg @@ -1,4 +1,4 @@ - + @@ -116,4 +116,4 @@ - + \ No newline at end of file diff --git a/app/common/renderer/assets/images/pcloudy_logo.svg b/app/common/renderer/assets/images/pcloudy_logo.svg new file mode 100644 index 0000000000..a09214d78e --- /dev/null +++ b/app/common/renderer/assets/images/pcloudy_logo.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/pcloudy_logo_dark.svg b/app/common/renderer/assets/images/pcloudy_logo_dark.svg new file mode 100644 index 0000000000..ed49b07c14 --- /dev/null +++ b/app/common/renderer/assets/images/pcloudy_logo_dark.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/renderer/images/perfecto_logo.svg b/app/common/renderer/assets/images/perfecto_logo.svg similarity index 100% rename from app/renderer/images/perfecto_logo.svg rename to app/common/renderer/assets/images/perfecto_logo.svg diff --git a/app/common/renderer/assets/images/rabbitqa_logo.svg b/app/common/renderer/assets/images/rabbitqa_logo.svg new file mode 100644 index 0000000000..cb4d2b1437 --- /dev/null +++ b/app/common/renderer/assets/images/rabbitqa_logo.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/rabbitqa_logo_dark.svg b/app/common/renderer/assets/images/rabbitqa_logo_dark.svg new file mode 100644 index 0000000000..a11fa133a8 --- /dev/null +++ b/app/common/renderer/assets/images/rabbitqa_logo_dark.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/remotetestkit_logo.svg b/app/common/renderer/assets/images/remotetestkit_logo.svg new file mode 100644 index 0000000000..f282345fed --- /dev/null +++ b/app/common/renderer/assets/images/remotetestkit_logo.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/robotactions_logo.svg b/app/common/renderer/assets/images/robotactions_logo.svg new file mode 100644 index 0000000000..14e364647b --- /dev/null +++ b/app/common/renderer/assets/images/robotactions_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/common/renderer/assets/images/robotactions_logo_dark.svg b/app/common/renderer/assets/images/robotactions_logo_dark.svg new file mode 100644 index 0000000000..cb88492cf4 --- /dev/null +++ b/app/common/renderer/assets/images/robotactions_logo_dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/common/renderer/assets/images/robotqa_logo.svg b/app/common/renderer/assets/images/robotqa_logo.svg new file mode 100644 index 0000000000..92452c40d5 --- /dev/null +++ b/app/common/renderer/assets/images/robotqa_logo.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/robotqa_logo_dark.svg b/app/common/renderer/assets/images/robotqa_logo_dark.svg new file mode 100644 index 0000000000..d9e2e6f188 --- /dev/null +++ b/app/common/renderer/assets/images/robotqa_logo_dark.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/sauce_logo.svg b/app/common/renderer/assets/images/sauce_logo.svg new file mode 100644 index 0000000000..e6557105ec --- /dev/null +++ b/app/common/renderer/assets/images/sauce_logo.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/sauce_logo_dark.svg b/app/common/renderer/assets/images/sauce_logo_dark.svg new file mode 100644 index 0000000000..7e829759a6 --- /dev/null +++ b/app/common/renderer/assets/images/sauce_logo_dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/testcribe_logo.svg b/app/common/renderer/assets/images/testcribe_logo.svg new file mode 100644 index 0000000000..d5e2e3347f --- /dev/null +++ b/app/common/renderer/assets/images/testcribe_logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/testcribe_logo_dark.svg b/app/common/renderer/assets/images/testcribe_logo_dark.svg new file mode 100644 index 0000000000..0cea881bda --- /dev/null +++ b/app/common/renderer/assets/images/testcribe_logo_dark.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/renderer/images/testingbot_logo.svg b/app/common/renderer/assets/images/testingbot_logo.svg similarity index 99% rename from app/renderer/images/testingbot_logo.svg rename to app/common/renderer/assets/images/testingbot_logo.svg index 7acf719f9d..0c957f9aa3 100644 --- a/app/renderer/images/testingbot_logo.svg +++ b/app/common/renderer/assets/images/testingbot_logo.svg @@ -1,5 +1,5 @@ - + Untitled Created with Sketch. diff --git a/app/common/renderer/assets/images/testingbot_logo_dark.svg b/app/common/renderer/assets/images/testingbot_logo_dark.svg new file mode 100644 index 0000000000..b41137c4df --- /dev/null +++ b/app/common/renderer/assets/images/testingbot_logo_dark.svg @@ -0,0 +1,11 @@ + + + Untitled + Created with Sketch. + + + + TestingBot + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/testmuai_logo.svg b/app/common/renderer/assets/images/testmuai_logo.svg new file mode 100644 index 0000000000..017998d231 --- /dev/null +++ b/app/common/renderer/assets/images/testmuai_logo.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/common/renderer/assets/images/testmuai_logo_dark.svg b/app/common/renderer/assets/images/testmuai_logo_dark.svg new file mode 100644 index 0000000000..1e94f42f0b --- /dev/null +++ b/app/common/renderer/assets/images/testmuai_logo_dark.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/common/renderer/assets/images/tvlabs_logo.svg b/app/common/renderer/assets/images/tvlabs_logo.svg new file mode 100644 index 0000000000..d1a4256ec4 --- /dev/null +++ b/app/common/renderer/assets/images/tvlabs_logo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/common/renderer/assets/images/tvlabs_logo_dark.svg b/app/common/renderer/assets/images/tvlabs_logo_dark.svg new file mode 100644 index 0000000000..e4d703bf16 --- /dev/null +++ b/app/common/renderer/assets/images/tvlabs_logo_dark.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + diff --git a/app/common/renderer/assets/images/webmate_logo.svg b/app/common/renderer/assets/images/webmate_logo.svg new file mode 100644 index 0000000000..ac97134c34 --- /dev/null +++ b/app/common/renderer/assets/images/webmate_logo.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + diff --git a/app/common/renderer/assets/images/webmate_logo_dark.svg b/app/common/renderer/assets/images/webmate_logo_dark.svg new file mode 100644 index 0000000000..2a65ac7352 --- /dev/null +++ b/app/common/renderer/assets/images/webmate_logo_dark.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + diff --git a/app/common/renderer/assets/stylesheets/main.css b/app/common/renderer/assets/stylesheets/main.css new file mode 100644 index 0000000000..495c6ad103 --- /dev/null +++ b/app/common/renderer/assets/stylesheets/main.css @@ -0,0 +1,93 @@ +@import 'antd/dist/reset.css'; + +body.dark { + color-scheme: dark; +} + +body { + min-height: 610px; + min-width: 870px; + color: #222 !important; + box-sizing: border-box; +} + +body::-webkit-scrollbar { + width: 0px; + background: transparent; +} + +body::-webkit-scrollbar-corner { + background: transparent; +} + +#root, +.ant-app, +.ant-layout { + height: 100%; +} + +.window { + background-color: #cde4f5 !important; + width: 100%; + height: 100%; +} + +.list-group-item.active { + background-color: #662d91 !important; +} + +.ant-spin, +.ant-spin-container { + height: 100%; +} + +.ant-input-group .ant-select { + height: 100%; +} + +.ant-input-group .ant-select-selection { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + height: 100%; + padding-top: 0; +} + +.ant-input-group .ant-select-selection .ant-select-selection-selected-value { + padding-top: 2px; +} + +.ant-input-group .ant-input-group-addon { + padding-left: 8px; +} + +.ant-input-group .select-container { + height: 32px; +} + +.ant-space-addon { + padding: 0 8px; + white-space: nowrap; +} + +.ant-btn-icon { + font-size: 14px; + display: flex; + justify-content: center; +} + +.anticon { + font-size: 14px; +} + +.ant-switch .anticon { + font-size: 12px; +} + +.ant-switch-inner-checked, +.ant-switch-inner-unchecked { + font-size: 12px !important; +} + +.ant-splitter-bar { + margin: 6px; +} diff --git a/app/common/renderer/assets/stylesheets/prism-dark.css b/app/common/renderer/assets/stylesheets/prism-dark.css new file mode 100644 index 0000000000..e99f94e6b9 --- /dev/null +++ b/app/common/renderer/assets/stylesheets/prism-dark.css @@ -0,0 +1,200 @@ +/** + * One Dark theme for prism.js + * Based on Atom's One Dark theme: https://github.com/atom/atom/tree/master/packages/one-dark-syntax + * Modified from https://github.com/PrismJS/prism-themes/blob/master/themes/prism-one-dark.css + */ + +/** + * The MIT License (MIT) + * + * Copyright (c) 2015 PrismJS + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +code[class*='language-'], +pre[class*='language-'] { + color: hsl(220, 14%, 71%); + direction: ltr; + text-align: left; + white-space: pre-wrap; + word-spacing: normal; + word-break: break-word; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +/* Selection */ +code[class*='language-']::-moz-selection, +code[class*='language-'] *::-moz-selection, +pre[class*='language-'] *::-moz-selection { + background: hsl(220, 13%, 28%); + color: inherit; + text-shadow: none; +} + +code[class*='language-']::selection, +code[class*='language-'] *::selection, +pre[class*='language-'] *::selection { + background: hsl(220, 13%, 28%); + color: inherit; + text-shadow: none; +} + +/* Inline code */ +:not(pre) > code[class*='language-'] { + padding: 0.2em 0.3em; + border-radius: 0.3em; + white-space: normal; +} + +/* Print */ +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} + +.token.comment, +.token.prolog, +.token.cdata { + color: hsl(220, 10%, 40%); +} + +.token.doctype, +.token.punctuation, +.token.entity { + color: hsl(220, 14%, 71%); +} + +.token.attr-name, +.token.class-name, +.token.boolean, +.token.constant, +.token.number, +.token.atrule { + color: hsl(29, 54%, 61%); +} + +.token.keyword { + color: hsl(286, 60%, 67%); +} + +.token.property, +.token.tag, +.token.symbol, +.token.deleted, +.token.important { + color: hsl(355, 65%, 65%); +} + +.token.selector, +.token.string, +.token.char, +.token.builtin, +.token.inserted, +.token.regex, +.token.attr-value, +.token.attr-value > .token.punctuation { + color: hsl(95, 38%, 62%); +} + +.token.variable, +.token.operator, +.token.function { + color: hsl(207, 82%, 66%); +} + +.token.url { + color: hsl(187, 47%, 55%); +} + +/* HTML overrides */ +.token.attr-value > .token.punctuation.attr-equals, +.token.special-attr > .token.attr-value > .token.value.css { + color: hsl(220, 14%, 71%); +} + +/* CSS overrides */ +.language-css .token.selector { + color: hsl(355, 65%, 65%); +} + +.language-css .token.property { + color: hsl(220, 14%, 71%); +} + +.language-css .token.function, +.language-css .token.url > .token.function { + color: hsl(187, 47%, 55%); +} + +.language-css .token.url > .token.string.url { + color: hsl(95, 38%, 62%); +} + +.language-css .token.important, +.language-css .token.atrule .token.rule { + color: hsl(286, 60%, 67%); +} + +/* JS overrides */ +.language-javascript .token.operator { + color: hsl(286, 60%, 67%); +} + +.language-javascript + .token.template-string + > .token.interpolation + > .token.interpolation-punctuation.punctuation { + color: hsl(5, 48%, 51%); +} + +/* JSON overrides */ +.language-json .token.operator { + color: hsl(220, 14%, 71%); +} + +.language-json .token.null.keyword { + color: hsl(29, 54%, 61%); +} + +/* General */ +.token.bold { + font-weight: bold; +} + +.token.comment, +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +.token.namespace { + opacity: 0.8; +} diff --git a/app/common/renderer/assets/stylesheets/prism-light.css b/app/common/renderer/assets/stylesheets/prism-light.css new file mode 100644 index 0000000000..64be18c58c --- /dev/null +++ b/app/common/renderer/assets/stylesheets/prism-light.css @@ -0,0 +1,190 @@ +/** + * One Light theme for prism.js + * Based on Atom's One Light theme: https://github.com/atom/atom/tree/master/packages/one-light-syntax + * Modified from https://github.com/PrismJS/prism-themes/blob/master/themes/prism-one-light.css + */ + +/** + * The MIT License (MIT) + * + * Copyright (c) 2015 PrismJS + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +code[class*='language-'], +pre[class*='language-'] { + color: hsl(230, 8%, 24%); + direction: ltr; + text-align: left; + white-space: pre-wrap; + word-spacing: normal; + word-break: break-word; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +/* Selection */ +code[class*='language-']::-moz-selection, +code[class*='language-'] *::-moz-selection, +pre[class*='language-'] *::-moz-selection { + background: hsl(230, 1%, 90%); + color: inherit; +} + +code[class*='language-']::selection, +code[class*='language-'] *::selection, +pre[class*='language-'] *::selection { + background: hsl(230, 1%, 90%); + color: inherit; +} + +/* Inline code */ +:not(pre) > code[class*='language-'] { + padding: 0.2em 0.3em; + border-radius: 0.3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.cdata { + color: hsl(230, 4%, 64%); +} + +.token.doctype, +.token.punctuation, +.token.entity { + color: hsl(230, 8%, 24%); +} + +.token.attr-name, +.token.class-name, +.token.boolean, +.token.constant, +.token.number, +.token.atrule { + color: hsl(35, 99%, 36%); +} + +.token.keyword { + color: hsl(301, 63%, 40%); +} + +.token.property, +.token.tag, +.token.symbol, +.token.deleted, +.token.important { + color: hsl(5, 74%, 59%); +} + +.token.selector, +.token.string, +.token.char, +.token.builtin, +.token.inserted, +.token.regex, +.token.attr-value, +.token.attr-value > .token.punctuation { + color: hsl(119, 34%, 47%); +} + +.token.variable, +.token.operator, +.token.function { + color: hsl(221, 87%, 60%); +} + +.token.url { + color: hsl(198, 99%, 37%); +} + +/* HTML overrides */ +.token.attr-value > .token.punctuation.attr-equals, +.token.special-attr > .token.attr-value > .token.value.css { + color: hsl(230, 8%, 24%); +} + +/* CSS overrides */ +.language-css .token.selector { + color: hsl(5, 74%, 59%); +} + +.language-css .token.property { + color: hsl(230, 8%, 24%); +} + +.language-css .token.function, +.language-css .token.url > .token.function { + color: hsl(198, 99%, 37%); +} + +.language-css .token.url > .token.string.url { + color: hsl(119, 34%, 47%); +} + +.language-css .token.important, +.language-css .token.atrule .token.rule { + color: hsl(301, 63%, 40%); +} + +/* JS overrides */ +.language-javascript .token.operator { + color: hsl(301, 63%, 40%); +} + +.language-javascript + .token.template-string + > .token.interpolation + > .token.interpolation-punctuation.punctuation { + color: hsl(344, 84%, 43%); +} + +/* JSON overrides */ +.language-json .token.operator { + color: hsl(230, 8%, 24%); +} + +.language-json .token.null.keyword { + color: hsl(35, 99%, 36%); +} + +/* General */ +.token.bold { + font-weight: bold; +} + +.token.comment, +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +.token.namespace { + opacity: 0.8; +} diff --git a/app/renderer/stylesheets/splash.global.less b/app/common/renderer/assets/stylesheets/splash.css similarity index 86% rename from app/renderer/stylesheets/splash.global.less rename to app/common/renderer/assets/stylesheets/splash.css index af48ac9f49..dce6c4ac32 100644 --- a/app/renderer/stylesheets/splash.global.less +++ b/app/common/renderer/assets/stylesheets/splash.css @@ -1,5 +1,3 @@ -@import './common.global.less'; - #root { display: flex; flex-direction: column; @@ -10,6 +8,7 @@ #splashImage { height: 150px; width: 150px; + margin-top: 35px; } #loader { diff --git a/app/renderer/components/ErrorBoundary/ErrorBoundary.js b/app/common/renderer/components/ErrorBoundary/ErrorBoundary.jsx similarity index 66% rename from app/renderer/components/ErrorBoundary/ErrorBoundary.js rename to app/common/renderer/components/ErrorBoundary/ErrorBoundary.jsx index 3cb6631b21..70b4a41a26 100644 --- a/app/renderer/components/ErrorBoundary/ErrorBoundary.js +++ b/app/common/renderer/components/ErrorBoundary/ErrorBoundary.jsx @@ -1,13 +1,13 @@ -import React from 'react'; +import {Component} from 'react'; -import {clipboard} from '../../polyfills'; -import ErrorMessage from './ErrorMessage'; +import {copyToClipboard} from '../../utils/other.js'; +import ErrorMessage from './ErrorMessage.jsx'; const copyTrace = (trace) => { - clipboard.writeText(trace); + copyToClipboard(trace); }; -export default class ErrorBoundary extends React.Component { +export default class ErrorBoundary extends Component { constructor(props) { super(props); this.state = { diff --git a/app/common/renderer/components/ErrorBoundary/ErrorMessage.jsx b/app/common/renderer/components/ErrorBoundary/ErrorMessage.jsx new file mode 100644 index 0000000000..1e3bb955d1 --- /dev/null +++ b/app/common/renderer/components/ErrorBoundary/ErrorMessage.jsx @@ -0,0 +1,47 @@ +import {IconFiles} from '@tabler/icons-react'; +import {Alert, Button, Tooltip} from 'antd'; +import {useTranslation} from 'react-i18next'; + +import {ALERT} from '../../constants/antd-types.js'; +import {LINKS} from '../../constants/common.js'; +import {openLink} from '../../polyfills.js'; +import styles from './ErrorMessage.module.css'; + +const ErrorMessage = ({error, copyTrace}) => { + const {t} = useTranslation(); + + return ( +
+ + {t('Unexpected Error:')} {error.message} + + } + type={ALERT.ERROR} + showIcon + description={ + <> + {t('Please report this issue at:')}  + e.preventDefault() || openLink(LINKS.CREATE_ISSUE)}> + {LINKS.CREATE_ISSUE} + +
+ {t('Full error trace:')} + +
+ ); +}; + +export default ErrorMessage; diff --git a/app/renderer/components/ErrorBoundary/ErrorMessage.css b/app/common/renderer/components/ErrorBoundary/ErrorMessage.module.css similarity index 100% rename from app/renderer/components/ErrorBoundary/ErrorMessage.css rename to app/common/renderer/components/ErrorBoundary/ErrorMessage.module.css diff --git a/app/common/renderer/components/FileUploader.jsx b/app/common/renderer/components/FileUploader.jsx new file mode 100644 index 0000000000..c633330287 --- /dev/null +++ b/app/common/renderer/components/FileUploader.jsx @@ -0,0 +1,35 @@ +import {IconFileImport} from '@tabler/icons-react'; +import {Button, Upload} from 'antd'; +import {useRef} from 'react'; + +const FileUploader = (props) => { + const {multiple, onUpload, type, title} = props; + + const fileCounterRef = useRef(1); + + // If multiple files are uploaded at once, this function is called once for every file. + // In order to upload everything only once, use a counter to track invocation count. + const beforeUpload = (_file, list) => { + if (fileCounterRef.current >= list.length) { + onUpload(list); + fileCounterRef.current = 1; + } else { + fileCounterRef.current += 1; + } + return false; + }; + + return ( + + + + ); +}; + +export default FileUploader; diff --git a/app/common/renderer/components/Notification.jsx b/app/common/renderer/components/Notification.jsx new file mode 100644 index 0000000000..9c959c692f --- /dev/null +++ b/app/common/renderer/components/Notification.jsx @@ -0,0 +1,23 @@ +import {App} from 'antd'; +import {useEffect} from 'react'; + +import {NOTIFICATION_EVENT} from '../utils/notification.js'; + +export default function Notification() { + const {notification} = App.useApp(); + + useEffect(() => { + const handleMessage = (event) => { + const {args, type} = event.detail; + notification[type](args); + }; + + document.addEventListener(NOTIFICATION_EVENT, handleMessage); + + return () => { + document.removeEventListener(NOTIFICATION_EVENT, handleMessage); + }; + }, [notification]); + + return null; +} diff --git a/app/common/renderer/components/SessionBuilder/AppSettings/AppSettings.jsx b/app/common/renderer/components/SessionBuilder/AppSettings/AppSettings.jsx new file mode 100644 index 0000000000..cab886c650 --- /dev/null +++ b/app/common/renderer/components/SessionBuilder/AppSettings/AppSettings.jsx @@ -0,0 +1,36 @@ +import {IconSettings} from '@tabler/icons-react'; +import {Button, Form, Modal, Tooltip} from 'antd'; +import {useState} from 'react'; +import {useTranslation} from 'react-i18next'; + +import ChangeLanguage from './ChangeLanguage.jsx'; +import ToggleTheme from './ToggleTheme.jsx'; + +const AppSettings = () => { + const [modalOpen, setModalOpen] = useState(false); + const {t} = useTranslation(); + + return ( + <> + + + + + + + ); +}; + +export default ManualIdInputAndRefreshBtn; diff --git a/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityBuilderTab.module.css b/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityBuilderTab.module.css new file mode 100644 index 0000000000..d6507bd04e --- /dev/null +++ b/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityBuilderTab.module.css @@ -0,0 +1,21 @@ +.capsBoxFont { + font-family: monospace; +} + +.newSessionForm { + overflow-y: auto; + overflow-x: hidden; + height: 100%; +} + +.newSessionForm::-webkit-scrollbar { + width: 0px; +} + +.newSessionForm :global(.ant-form-item) { + margin-bottom: 0.5em; +} + +.addCapabilityButton { + float: right; +} diff --git a/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityControl.jsx b/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityControl.jsx new file mode 100644 index 0000000000..32e459d3bf --- /dev/null +++ b/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityControl.jsx @@ -0,0 +1,72 @@ +import {Input, Switch} from 'antd'; +import {useTranslation} from 'react-i18next'; + +import {INPUT} from '../../../constants/antd-types.js'; +import {CAPABILITY_TYPES} from '../../../constants/session-builder.js'; +import styles from './CapabilityBuilderTab.module.css'; + +const CapabilityControl = ({cap, onSetCapabilityParam, onPressEnter, isEditingDesiredCaps, id}) => { + const {t} = useTranslation(); + + switch (cap.type) { + case CAPABILITY_TYPES.TEXT: + case CAPABILITY_TYPES.FILE: + return ( + onSetCapabilityParam(e.target.value)} + onPressEnter={onPressEnter} + className={styles.capsBoxFont} + /> + ); + case CAPABILITY_TYPES.BOOL: + return ( + onSetCapabilityParam(value)} + /> + ); + case CAPABILITY_TYPES.NUM: + return ( + + !isNaN(parseInt(e.target.value, 10)) + ? onSetCapabilityParam(parseInt(e.target.value, 10)) + : onSetCapabilityParam(undefined) + } + onPressEnter={onPressEnter} + className={styles.capsBoxFont} + /> + ); + case CAPABILITY_TYPES.OBJECT: + case CAPABILITY_TYPES.JSON_OBJECT: + return ( + onSetCapabilityParam(e.target.value)} + className={styles.capsBoxFont} + /> + ); + default: + throw new Error(t('invalidCapType', {type: cap.type})); + } +}; + +export default CapabilityControl; diff --git a/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityEditor.jsx b/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityEditor.jsx new file mode 100644 index 0000000000..300ef69965 --- /dev/null +++ b/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityEditor.jsx @@ -0,0 +1,221 @@ +import {IconPlus, IconTrash} from '@tabler/icons-react'; +import { + Button, + Checkbox, + Col, + Form, + Input, + Modal, + Row, + Select, + Space, + Splitter, + Tooltip, +} from 'antd'; +import {useEffect, useRef} from 'react'; +import {useTranslation} from 'react-i18next'; + +import {CAPABILITY_TYPES} from '../../../constants/session-builder.js'; +import CapabilityJSON from '../CapabilityJSON/CapabilityJSON.jsx'; +import builderStyles from '../SessionBuilder.module.css'; +import styles from './CapabilityBuilderTab.module.css'; +import CapabilityControl from './CapabilityControl.jsx'; + +const whitespaces = /^\s|\s$/; + +const whitespaceMsg = (value, t) => { + const leadingSpace = /^\s/.test(value); + const trailingSpace = /\s$/.test(value); + + if (leadingSpace || trailingSpace) { + return t('whitespaceDetected'); + } +}; + +// Callback when the type of a capability is changed +const handleSetType = (setCapabilityParam, cap, typeVal) => { + setCapabilityParam(cap.id, 'type', typeVal); + + // Translate the current value to the new type + let translatedValue = cap.value; + switch (typeVal) { + case CAPABILITY_TYPES.BOOL: + if (translatedValue === 'true') { + translatedValue = true; + } else if (translatedValue === 'false') { + translatedValue = false; + } else { + translatedValue = !!translatedValue; + } + break; + case CAPABILITY_TYPES.NUM: + translatedValue = parseInt(translatedValue, 10) || 0; + break; + case CAPABILITY_TYPES.TEXT: + case CAPABILITY_TYPES.OBJECT: + translatedValue = translatedValue + ''; + break; + default: + break; + } + setCapabilityParam(cap.id, 'value', translatedValue); +}; + +const CapabilityEditor = (props) => { + const { + setCapabilityParam, + caps, + addCapability, + removeCapability, + saveSession, + hideSaveAsModal, + saveAsText, + showSaveAsModal, + setSaveAsText, + isEditingDesiredCaps, + setAddVendorPrefixes, + addVendorPrefixes, + server, + serverType, + isDuplicateCapsName, + } = props; + + const onSaveAsOk = () => saveSession({server, serverType, caps, name: saveAsText}, true); + const latestCapFieldRef = useRef(null); + const {t} = useTranslation(); + + // if we have more than one cap and the most recent cap name is empty, + // it means we've just added a new cap field, so focus that input element + useEffect(() => { + if (caps.length > 1 && latestCapFieldRef.current && !latestCapFieldRef.current.input.value) { + latestCapFieldRef.current.focus(); + } + }, [caps.length, latestCapFieldRef]); + + return ( + + +
+ {caps.map((cap, index) => ( + + + + + setCapabilityParam(cap.id, 'name', e.target.value)} + ref={index === caps.length - 1 ? latestCapFieldRef : null} + className={styles.capsBoxFont} + /> + + + + + + setSaveAsText(e.target.value)} + value={saveAsText} + onPressEnter={onSaveAsOk} + status={isDuplicateCapsName ? 'error' : ''} + /> + + {isDuplicateCapsName && ( +

{t('duplicateCapabilityNameError')}

+ )} + + + + ); +}; + +export default CapabilityEditor; diff --git a/app/common/renderer/components/SessionBuilder/CapabilityJSON/CapabilityJSON.jsx b/app/common/renderer/components/SessionBuilder/CapabilityJSON/CapabilityJSON.jsx new file mode 100644 index 0000000000..d56811ad76 --- /dev/null +++ b/app/common/renderer/components/SessionBuilder/CapabilityJSON/CapabilityJSON.jsx @@ -0,0 +1,157 @@ +import {IconDeviceFloppy, IconEdit, IconX} from '@tabler/icons-react'; +import {Alert, Button, Card, Input, Row, Tooltip} from 'antd'; +import {useTranslation} from 'react-i18next'; +import {Refractor, registerLanguage} from 'react-refractor'; +import json from 'refractor/json'; + +import {getCapsObject} from '../../../actions/SessionBuilder.js'; +import {ALERT} from '../../../constants/antd-types.js'; +import builderStyles from '../SessionBuilder.module.css'; +import styles from './CapabilityJSON.module.css'; + +registerLanguage(json); + +const CapabilityJSON = (props) => { + const { + caps, + title, + desiredCapsName, + isEditingDesiredCapsName, + isEditingDesiredCaps, + startDesiredCapsEditor, + abortDesiredCapsEditor, + saveRawDesiredCaps, + setRawDesiredCaps, + rawDesiredCaps, + isValidCapsJson, + invalidCapsJsonReason, + isDuplicateCapsName, + } = props; + + const {t} = useTranslation(); + + const getHighlightedCaps = (caps) => { + const formattedJson = JSON.stringify(getCapsObject(caps), null, 2); + return ; + }; + + const setCapsTitle = () => { + const {setDesiredCapsName, saveDesiredCapsName} = props; + if (!title) { + return t('JSON Representation'); + } else if (!isEditingDesiredCapsName) { + return title; + } else { + return ( + + setDesiredCapsName(e.target.value)} + value={desiredCapsName} + className={styles.capsEditorTitleInput} + onPressEnter={saveDesiredCapsName} + status={isDuplicateCapsName ? 'error' : ''} + /> + {isDuplicateCapsName && ( +

{t('duplicateCapabilityNameError')}

+ )} +
+ ); + } + }; + + const setCapsTitleButtons = () => { + const {startDesiredCapsNameEditor, abortDesiredCapsNameEditor, saveDesiredCapsName} = props; + if (!title) { + return null; + } else if (!isEditingDesiredCapsName) { + return ( + +