From 44668dc953381a9bcbe2fa9570826e82a7ff7909 Mon Sep 17 00:00:00 2001 From: David Helkowski Date: Thu, 9 Jul 2020 17:36:01 +0000 Subject: [PATCH 01/12] Updating gulp, webpack, and Dockerfile Unstable commit; committing to track and save progress. Add Dockerfile to .dockerignore to prevent changes to the Dockfile itself from triggering rebuild of earlier steps of the Dockerfile Move to Ubuntu 18 for Dockerfile instead of 16. Not yet moving to Ubuntu 20 as Node 8 is not supported on Ubuntu 20. Rewrote Dockerfile as a multi-stage build to both prevent constant rebuild of everything on small changes and also to only copy needed files into the end runtime. Moved a number of modules from bower.json to package.json as updated webpack was not able to recognize those specific modules and do dynamic module resolution correctly with them unless the npm version of those modules are used. Moved to using a different lato font package as the specific module was/is not on npm. Split webpack config up into two files as it was done in a non-standard looking way to begin with. Now the webpack config file contains only the standard looking webpack config as it should. Updated gulp to a new version and rewrote the old incompatible bits of the gulpfile to work with the new version. Temporarily removed deletion of /res/build from clean step of the gulpfile. Corrected hardcoded module references to modules that are now in node_modules/@devicefarmer Moved prepublish step of package.json into Dockerfile. This could confuse users not using docker though and may have to be changed back. Updated to a new version of webpack and altered the webpack file to work with the new way. Angular is still broken and will need to be updated. The old angular method in webpack doesn't work with the new webpack version. TODO Using versions of less-loader and sass-loader a major version behind as the latest versions require node 10. Added '-loader' to all the various webpack loaders used not only in webpack config but also in a few module require lines. Removed the commons.entry.js script lines as the new webpack build doesn't create a commons script. Attempted to fix the way ngRoute/app is loaded by angular in auth/mock. Still isn't working. Am going to switch to newer angular... Ran lang/translations json files through a JSON pretty printer as it looked horrible and lack of spaces is not user / curious person friendly. webpack config file still in progress of changes. --- .dockerignore | 1 + Dockerfile | 112 +++--- bower.json | 26 +- gulpfile.js | 111 +++--- lib/units/app/index.js | 4 +- lib/units/app/middleware/appstore-icons.js | 2 +- lib/units/app/middleware/browser-icons.js | 2 +- lib/units/app/middleware/device-icons.js | 2 +- lib/units/app/middleware/webpack.js | 2 +- package.json | 38 +- .../components/stf/common-ui/table/index.js | 2 +- .../control-panes/performance/cpu/index.js | 2 +- res/app/views/index.pug | 1 - res/auth/ldap/views/index.pug | 1 - res/auth/mock/scripts/entry.js | 5 +- res/auth/mock/views/index.pug | 1 - res/common/lang/translations/stf.es.json | 293 +++++++++++++- res/common/lang/translations/stf.fr.json | 376 +++++++++++++++++- res/common/lang/translations/stf.ja.json | 332 +++++++++++++++- res/common/lang/translations/stf.ko_KR.json | 343 +++++++++++++++- res/common/lang/translations/stf.pl.json | 203 +++++++++- res/common/lang/translations/stf.pt_BR.json | 376 +++++++++++++++++- res/common/lang/translations/stf.ru_RU.json | 297 +++++++++++++- res/common/lang/translations/stf.zh-Hant.json | 273 ++++++++++++- res/common/lang/translations/stf.zh_CN.json | 372 ++++++++++++++++- res/common/status/webpack.config.js | 2 +- res/web_modules/nine-bootstrap/index.js | 2 +- res/web_modules/ui-bootstrap/index.js | 2 +- webpack.config.js | 202 +++++----- webpackserver.config.js | 9 + 30 files changed, 3125 insertions(+), 269 deletions(-) create mode 100644 webpackserver.config.js diff --git a/.dockerignore b/.dockerignore index 868d0d8a2..59c5a4c09 100644 --- a/.dockerignore +++ b/.dockerignore @@ -12,3 +12,4 @@ rethinkdb_data/ temp/ tmp/ .eslintcache +Dockerfile diff --git a/Dockerfile b/Dockerfile index 29766b82b..448c4bb76 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,67 +1,77 @@ -FROM ubuntu:16.04 +FROM ubuntu:18.04 AS nodebase -# Sneak the stf executable into $PATH. -ENV PATH /app/bin:$PATH +# Install base packages +RUN export DEBIAN_FRONTEND=noninteractive && \ + apt-get update && \ + apt-get -y --no-install-recommends install curl wget libxml-bare-perl libzmq3-dev libprotobuf-dev graphicsmagick ca-certificates -# Work in app dir by default. -WORKDIR /app +# Install node +RUN export DEBIAN_FRONTEND=noninteractive && \ + curl -sL -o /tmp/install_node.sh https://deb.nodesource.com/setup_8.x && \ + /bin/bash /tmp/install_node.sh && \ + apt install --no-install-recommends -y nodejs -# Export default app port, not enough for all processes but it should do -# for now. -EXPOSE 3000 +FROM nodebase as builder -# Install app requirements. Trying to optimize push speed for dependant apps -# by reducing layers as much as possible. Note that one of the final steps -# installs development files for node-gyp so that npm install won't have to -# wait for them on the first native module installation. +# Install additional packages for building things RUN export DEBIAN_FRONTEND=noninteractive && \ - useradd --system \ - --create-home \ - --shell /usr/sbin/nologin \ - stf-build && \ - useradd --system \ - --create-home \ - --shell /usr/sbin/nologin \ - stf && \ - sed -i'' 's@http://archive.ubuntu.com/ubuntu/@mirror://mirrors.ubuntu.com/mirrors.txt@' /etc/apt/sources.list && \ - apt-get update && \ - apt-get -y install wget python build-essential && \ - cd /tmp && \ - wget --progress=dot:mega \ - https://nodejs.org/dist/v8.9.3/node-v8.9.3-linux-x64.tar.xz && \ - tar -xJf node-v*.tar.xz --strip-components 1 -C /usr/local && \ - rm node-v*.tar.xz && \ - su stf-build -s /bin/bash -c '/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js install' && \ - apt-get -y install libzmq3-dev libprotobuf-dev git graphicsmagick yasm && \ - apt-get clean && \ - rm -rf /var/cache/apt/* /var/lib/apt/lists/* - -# Copy app source. -COPY . /tmp/build/ - -# Give permissions to our build user. -RUN mkdir -p /app && \ - chown -R stf-build:stf-build /tmp/build /app + apt-get -y --no-install-recommends install build-essential git yasm jq python vim -# Switch over to the build user. -USER stf-build +# Install node-gyp ahead of time to avoid installation on native module install +# RUN /bin/bash -c '/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js install' -# Run the build. +# Install just the package dependencies before copying in the full source +RUN mkdir -p /tmp/build/res/build +COPY ./package*.json /tmp/build/ RUN set -x && \ cd /tmp/build && \ export PATH=$PWD/node_modules/.bin:$PATH && \ npm install --loglevel http && \ - npm pack && \ - tar xzf devicefarmer-stf-*.tgz --strip-components 1 -C /app && \ - bower cache clean && \ + curl -sf https://gobinaries.com/tj/node-prune | sh + +# Removed this from package.json -> "prepublish": "bower install && not-in-install && gulp build || in-install" + +# Install bower dependencies +WORKDIR /tmp/build +COPY ./bower.json /tmp/build/ +RUN echo '{ "allow_root": true }' > /root/.bowerrc && \ + ./node_modules/.bin/bower install + +# Copy the rest of the app source in +COPY . /tmp/build/ + +# Package and cleanup +RUN ./node_modules/.bin/gulp build && \ npm prune --production && \ - mv node_modules /app && \ - rm -rf ~/.node-gyp && \ - cd /app && \ - rm -rf /tmp/* + node-prune && \ + npm pack && \ + mv devicefarmer-stf-$(jq .version package.json -j).tgz stf.tgz + +FROM nodebase as runtime -# Switch to the app user. -USER stf +EXPOSE 3000 +# Setup user +RUN useradd --system --create-home --shell /usr/sbin/nologin stf +RUN mkdir -p /app && chown stf:stf /app +#USER stf + +WORKDIR /app + +COPY ./webpack.config.js /app/ +COPY --from=builder --chown=stf:stf /tmp/build/stf.tgz /tmp/stf.tgz +COPY --from=builder --chown=stf:stf /tmp/build/node_modules /app/node_modules +COPY --from=builder --chown=stf:stf /tmp/build/res/build /app/res/build +RUN tar xf /tmp/stf.tgz --strip-components 1 -C /app && \ + chown stf:stf /app/* -R && \ + rm /tmp/stf.tgz && \ + npm prune --production + +#USER root +#RUN apt-get -y --no-install-recommends install ncdu + +# Add stf executable dir into $PATH +ENV PATH /app/bin:$PATH + # Show help by default. CMD stf --help diff --git a/bower.json b/bower.json index 9fea32c57..6c6f118c0 100644 --- a/bower.json +++ b/bower.json @@ -2,14 +2,14 @@ "name": "stf", "version": "0.1.0", "dependencies": { - "angular": "~1.5.0-rc.2", - "angular-cookies": "~1.5.0-rc.2", - "angular-route": "~1.5.0-rc.2", - "angular-sanitize": "~1.5.0-rc.2", - "angular-animate": "~1.5.0-rc.2", - "angular-touch": "~1.5.0-rc.2", + "angular": "~1.8.0", + "angular-cookies": "~1.8.0", + "angular-route": "~1.8.0", + "angular-sanitize": "~1.8.0", + "angular-animate": "~1.8.0", + "angular-touch": "~1.8.0", "lodash": "~3.10.1", - "oboe": "~2.1.2", + "oboe": "~2.1.5", "ng-table": "~1.0.0-beta.9", "angular-gettext": "~2.2.0", "angular-ui-ace": "~0.2.3", @@ -18,22 +18,16 @@ "angular-growl-v2": "JanStevens/angular-growl-2#~0.7.9", "underscore.string": "~3.2.3", "bootstrap": "~3.3.6", - "font-lato-2-subset": "~0.4.0", "packery": "~1.4.3", - "draggabilly": "~1.2.4", "angular-elastic": "~2.5.1", "angular-hotkeys": "chieffancypants/angular-hotkeys#~1.6.0", "angular-borderlayout": "git://github.com/filearts/angular-borderlayout.git#7c9716aebd9260763f798561ca49d6fbfd4a5c67", "angular-ui-bootstrap": "~1.1.1", "ng-context-menu": "AdiDahan/ng-context-menu#~1.0.5", "components-font-awesome": "~4.5.0", - "epoch": "~0.8.4", - "ng-epoch": "~1.0.7", "eventEmitter": "~4.3.0", "angular-ladda": "~0.3.1", - "d3": "~3.5.14", - "spin.js": "~2.3.2", - "angular-xeditable": "~0.1.9" + "angular-xeditable": "~0.1.9" }, "private": true, "devDependencies": { @@ -42,8 +36,8 @@ "resolutions": { "angular": "~1.5.0-rc.2", "d3": "~3.5.5", - "spin.js": "~2.3.2", "eventEmitter": "~4.3.0", - "epoch": "~0.8.4" + "epoch": "~0.8.4", + "get-size": "~2.0.3" } } diff --git a/gulpfile.js b/gulpfile.js index efc1f9187..71461b5e4 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -6,7 +6,7 @@ var jsonlint = require('gulp-jsonlint') var eslint = require('gulp-eslint') var EslintCLIEngine = require('eslint').CLIEngine var webpack = require('webpack') -var webpackConfig = require('./webpack.config').webpack +var webpackConfig = require('./webpack.config') var webpackStatusConfig = require('./res/common/status/webpack.config') var gettext = require('gulp-angular-gettext') var pug = require('gulp-pug') @@ -75,16 +75,55 @@ gulp.task('eslint-cli', function(done) { } }) +gulp.task('clean', function(done) { + gutil.log("clean") + del.sync([ + './tmp' + //, './res/build' + , '.eslintcache' + ]) + done() +} ) -gulp.task('lint', ['jsonlint', 'eslint-cli']) -gulp.task('test', ['lint', 'run:checkversion']) -gulp.task('build', ['clean', 'webpack:build']) - -gulp.task('run:checkversion', function() { +gulp.task('check_stf_version', function() { gutil.log('Checking STF version...') return run('./bin/stf -V').exec() }) +gulp.task('webpack:build', function(callback) { + gutil.log('webpack:build') + var myConfig = webpackConfig + myConfig.plugins = myConfig.plugins.concat( + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify('production') + } + }) + ) + myConfig.devtool = false + + webpack(myConfig, function(err, stats) { + if (err) { + throw new gutil.PluginError('webpack:build', err) + } + + gutil.log('[webpack:build]', stats.toString({ + colors: true + })) + + // Save stats to a json file + // Can be analyzed in http://webpack.github.io/analyse/ + fromString('stats.json', JSON.stringify(stats.toJson())) + .pipe(gulp.dest('./tmp/')) + + callback() + }) +} ) + +gulp.task('lint', gulp.series( 'jsonlint', 'eslint-cli' ) ) +gulp.task('test', gulp.series( 'lint', 'check_stf_version' ) ) +gulp.task('build', gulp.series( 'clean', 'webpack:build' ) ) + gulp.task('karma_ci', function(done) { karma.start({ configFile: path.join(__dirname, karmaConfig) @@ -113,7 +152,7 @@ gulp.task('protractor-explorer', function(callback) { }, callback) }) -gulp.task('protractor', ['webdriver-update'], function(callback) { +gulp.task('protractor', gulp.series( 'webdriver-update', function(callback) { gulp.src(['./res/test/e2e/**/*.js']) .pipe(protractor.protractor({ configFile: protractorConfig @@ -126,7 +165,7 @@ gulp.task('protractor', ['webdriver-update'], function(callback) { /* eslint no-console: 0 */ }) .on('end', callback) -}) +} ) ) // For piping strings function fromString(filename, string) { @@ -143,37 +182,6 @@ function fromString(filename, string) { return src } - -// For production -gulp.task('webpack:build', function(callback) { - var myConfig = Object.create(webpackConfig) - myConfig.plugins = myConfig.plugins.concat( - new webpack.DefinePlugin({ - 'process.env': { - NODE_ENV: JSON.stringify('production') - } - }) - ) - myConfig.devtool = false - - webpack(myConfig, function(err, stats) { - if (err) { - throw new gutil.PluginError('webpack:build', err) - } - - gutil.log('[webpack:build]', stats.toString({ - colors: true - })) - - // Save stats to a json file - // Can be analyzed in http://webpack.github.io/analyse/ - fromString('stats.json', JSON.stringify(stats.toJson())) - .pipe(gulp.dest('./tmp/')) - - callback() - }) -}) - gulp.task('webpack:others', function(callback) { var myConfig = Object.create(webpackStatusConfig) myConfig.plugins = myConfig.plugins.concat( @@ -197,13 +205,6 @@ gulp.task('webpack:others', function(callback) { }) }) -gulp.task('translate', [ - 'translate:extract' -, 'translate:push' -, 'translate:pull' -, 'translate:compile' -]) - gulp.task('pug', function() { return gulp.src([ './res/**/*.pug' @@ -221,7 +222,7 @@ gulp.task('pug', function() { .pipe(gulp.dest('./tmp/html/')) }) -gulp.task('translate:extract', ['pug'], function() { +gulp.task('translate:extract', gulp.series( 'pug', function(done) { return gulp.src([ './tmp/html/**/*.html' , './res/**/*.js' @@ -230,7 +231,8 @@ gulp.task('translate:extract', ['pug'], function() { ]) .pipe(gettext.extract('stf.pot')) .pipe(gulp.dest('./res/common/lang/po/')) -}) + done() +})) gulp.task('translate:compile', function() { return gulp.src('./res/common/lang/po/**/*.po') @@ -250,10 +252,9 @@ gulp.task('translate:pull', function() { return run('tx pull').exec() }) -gulp.task('clean', function(cb) { - del([ - './tmp' - , './res/build' - , '.eslintcache' - ], cb) -}) +gulp.task('translate', gulp.series( + 'translate:extract' +, 'translate:push' +, 'translate:pull' +, 'translate:compile' +)) \ No newline at end of file diff --git a/lib/units/app/index.js b/lib/units/app/index.js index 981b6ff0d..6656a7676 100644 --- a/lib/units/app/index.js +++ b/lib/units/app/index.js @@ -27,7 +27,7 @@ module.exports = function(options) { var server = http.createServer(app) app.use('/static/wiki', markdownServe.middleware({ - rootDirectory: pathutil.root('node_modules/stf-wiki') + rootDirectory: pathutil.root('node_modules/@devicefarmer/stf-wiki') , view: 'docs' })) @@ -50,7 +50,7 @@ module.exports = function(options) { log.info('Using webpack') // Keep webpack-related requires here, as our prebuilt package won't // have them at all. - var webpackServerConfig = require('./../../../webpack.config').webpackServer + var webpackServerConfig = require('./../../../webpackserver.config').webpackServer app.use('/static/app/build', require('./middleware/webpack')(webpackServerConfig)) } diff --git a/lib/units/app/middleware/appstore-icons.js b/lib/units/app/middleware/appstore-icons.js index e23783a7b..971a11ade 100644 --- a/lib/units/app/middleware/appstore-icons.js +++ b/lib/units/app/middleware/appstore-icons.js @@ -4,7 +4,7 @@ var pathutil = require('../../../util/pathutil') module.exports = function() { return serveStatic( - pathutil.root('node_modules/stf-appstore-db/dist') + pathutil.root('node_modules/@devicefarmer/stf-appstore-db/dist') , { maxAge: '30d' } diff --git a/lib/units/app/middleware/browser-icons.js b/lib/units/app/middleware/browser-icons.js index 4a4808b98..33d36302e 100644 --- a/lib/units/app/middleware/browser-icons.js +++ b/lib/units/app/middleware/browser-icons.js @@ -4,7 +4,7 @@ var pathutil = require('../../../util/pathutil') module.exports = function() { return serveStatic( - pathutil.root('node_modules/stf-browser-db/dist') + pathutil.root('node_modules/@devicefarmer/stf-browser-db/dist') , { maxAge: '30d' } diff --git a/lib/units/app/middleware/device-icons.js b/lib/units/app/middleware/device-icons.js index e9b81e286..9776fbe18 100644 --- a/lib/units/app/middleware/device-icons.js +++ b/lib/units/app/middleware/device-icons.js @@ -4,7 +4,7 @@ var pathutil = require('../../../util/pathutil') module.exports = function() { return serveStatic( - pathutil.root('node_modules/stf-device-db/dist') + pathutil.root('node_modules/@devicefarmer/stf-device-db/dist') , { maxAge: '30d' } diff --git a/lib/units/app/middleware/webpack.js b/lib/units/app/middleware/webpack.js index e8d4a6824..6a22f9b73 100644 --- a/lib/units/app/middleware/webpack.js +++ b/lib/units/app/middleware/webpack.js @@ -9,7 +9,7 @@ var MemoryFileSystem = require('memory-fs') var logger = require('../../../util/logger') var lifecycle = require('../../../util/lifecycle') -var globalOptions = require('../../../../webpack.config').webpack +var globalOptions = require('../../../../webpack.config') // Similar to webpack-dev-middleware, but integrates with our custom // lifecycle, behaves more like normal express middleware, and removes diff --git a/package.json b/package.json index fb7e8821f..e8b0c9dcc 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,7 @@ "duplicate-arguments-array": false }, "scripts": { - "test": "gulp test", - "prepublish": "bower install && not-in-install && gulp build || in-install" + "test": "gulp test" }, "dependencies": { "@slack/client": "^3.5.4", @@ -97,34 +96,38 @@ "uuid": "^3.0.0", "ws": "^3.0.0", "yargs": "^6.6.0", - "zmq": "^2.14.0" + "zmq": "^2.14.0", + "d3": "~5.16.0", + "draggabilly": "~2.3.0", + "spin.js": "~2.0.2", + "fontsource-lato": "~2.1.4", + "jquery": "~3.5.1", + "epoch-charting": "~0.8.4" }, "devDependencies": { "async": "^2.0.1", "bower": "^1.8.8", "chai": "^3.4.1", "css-loader": "^0.23.1", - "del": "^2.0.1", + "del": "^5.1.0", "eslint": "^3.2.2", "event-stream": "^3.3.2", "exports-loader": "^0.6.2", "extract-text-webpack-plugin": "^1.0.1", - "file-loader": "^0.9.0", "fs-extra": "^8.1.0", - "gulp": "^3.8.11", + "gulp": "^4.0.2", "gulp-angular-gettext": "^2.1.0", - "gulp-eslint": "^3.0.1", - "gulp-jsonlint": "^1.0.2", - "gulp-protractor": "^3.0.0", - "gulp-pug": "^3.0.4", - "gulp-run": "^1.6.12", + "gulp-eslint": "^6.0.0", + "gulp-jsonlint": "^1.3.2", + "gulp-protractor": "^4.1.1", + "gulp-pug": "^4.0.1", + "gulp-run": "^1.7.1", "gulp-util": "^3.0.7", "html-loader": "^0.4.0", "http-https": "^1.0.0", "imports-loader": "^0.6.5", "jasmine-core": "^2.4.1", "jasmine-reporters": "^2.3.2", - "json-loader": "^0.5.4", "karma": "^1.7.1", "karma-chrome-launcher": "^2.2.0", "karma-firefox-launcher": "^1.0.0", @@ -136,7 +139,6 @@ "karma-safari-launcher": "^1.0.0", "karma-webpack": "^1.8.0", "less": "^2.4.0", - "less-loader": "^2.2.2", "memory-fs": "^0.3.0", "node-libs-browser": "^1.0.0", "node-sass": "^4.13.1", @@ -144,7 +146,6 @@ "protractor": "^5.4.1", "protractor-html-reporter-2": "1.0.4", "raw-loader": "^0.5.1", - "sass-loader": "^4.0.0", "script-loader": "^0.7.0", "sinon": "^1.17.2", "sinon-chai": "^2.7.0", @@ -152,9 +153,12 @@ "style-loader": "^0.13.0", "template-html-loader": "^0.0.3", "then-jade": "^2.4.1", - "url-loader": "^0.5.7", - "webpack": "^1.12.11", - "webpack-dev-server": "^3.1.11" + "webpack": "^4.43.0", + "webpack-dev-server": "^3.11.0", + "file-loader": "^6.0.0", + "less-loader": "5.x.x", + "sass-loader": "8.x.x", + "url-loader": "^4.1.0" }, "engines": { "node": ">= 6.9" diff --git a/res/app/components/stf/common-ui/table/index.js b/res/app/components/stf/common-ui/table/index.js index eb1056f67..7c71079df 100644 --- a/res/app/components/stf/common-ui/table/index.js +++ b/res/app/components/stf/common-ui/table/index.js @@ -1,5 +1,5 @@ require('./table.css') -require('script!ng-table/dist/ng-table') +require('script-loader!ng-table/dist/ng-table') module.exports = angular.module('stf/common-ui/table', [ 'ngTable' diff --git a/res/app/control-panes/performance/cpu/index.js b/res/app/control-panes/performance/cpu/index.js index f68c3ec17..252aae804 100644 --- a/res/app/control-panes/performance/cpu/index.js +++ b/res/app/control-panes/performance/cpu/index.js @@ -1,7 +1,7 @@ require('./cpu.css') module.exports = angular.module('stf.cpu', [ - require('epoch').name + require('epoch-charting').name ]) .run(['$templateCache', function($templateCache) { $templateCache.put('control-panes/performance/cpu/cpu.pug', diff --git a/res/app/views/index.pug b/res/app/views/index.pug index f9b54404f..e86de78f3 100644 --- a/res/app/views/index.pug +++ b/res/app/views/index.pug @@ -27,5 +27,4 @@ html(ng-app='app') div(ng-view).fill-height script(src='/app/api/v1/state.js') - script(src='static/app/build/entry/commons.entry.js') script(src='static/app/build/entry/app.entry.js') diff --git a/res/auth/ldap/views/index.pug b/res/auth/ldap/views/index.pug index 79e47bf39..b3a2e0ff7 100644 --- a/res/auth/ldap/views/index.pug +++ b/res/auth/ldap/views/index.pug @@ -7,5 +7,4 @@ html(ng-app='app') meta(name='viewport', content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui') body(ng-cloak) div(ng-view) - script(src='static/app/build/entry/commons.entry.js') script(src='static/app/build/entry/authldap.entry.js') diff --git a/res/auth/mock/scripts/entry.js b/res/auth/mock/scripts/entry.js index a007f1b0a..39fdc8b50 100644 --- a/res/auth/mock/scripts/entry.js +++ b/res/auth/mock/scripts/entry.js @@ -2,11 +2,12 @@ require.ensure([], function(require) { require('nine-bootstrap') require('angular') - require('angular-route') + //require('angular-route') + var ngRoute = require('angular-route').ngRoute require('angular-touch') angular.module('app', [ - 'ngRoute', + ngRoute, 'ngTouch', require('gettext').name, require('./signin').name diff --git a/res/auth/mock/views/index.pug b/res/auth/mock/views/index.pug index dc10113f6..794674747 100644 --- a/res/auth/mock/views/index.pug +++ b/res/auth/mock/views/index.pug @@ -7,5 +7,4 @@ html(ng-app='app') meta(name='viewport', content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui') body(ng-cloak) div(ng-view) - script(src='static/app/build/entry/commons.entry.js') script(src='static/app/build/entry/authmock.entry.js') diff --git a/res/common/lang/translations/stf.es.json b/res/common/lang/translations/stf.es.json index 7e701ab50..13cb4b178 100644 --- a/res/common/lang/translations/stf.es.json +++ b/res/common/lang/translations/stf.es.json @@ -1 +1,292 @@ -{"es":{"A new version of STF is available":"Una nueva versión de STF está disponible","A package is already installed with the same name.":"Ya hay un paquete instalado con el mismo nombre","A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).":"Se ha instalado un paquete previamente con el mismo nombre pero con una firma diferente a la del nuevo paquete (y el paquete antiguo no ha sido eliminado).","A secure container mount point couldn't be accessed on external media.":"Un punto de montaje de contenedor seguro no puede ser accedido desde un medio externo.","Access Tokens":"Tokens de acceso","Account":"Cuenta","Action":"Acción","Actions":"Acciones","Activity":"Actividad","Add":"Añadir","Add ADB Key":"Añadir Llave de ADB","Add Key":"Añadir Llave","Add the following ADB Key to STF?":"¿Añadir las siguientes llaves ADB a STF?","Admin mode has been disabled.":"El modo administrador se ha desactivado","Admin mode has been enabled.":"El modo administrador se ha activado","Advanced":"Avanzado","Airplane Mode":"Modo avión","App Store":"Tienda de aplicaciones","App Upload":"Subir aplicación","Apps":"Aplicaciones","Are you sure you want to reboot this device?":"¿Estás seguro de querer reiniciar este dispositivo?","Automating":"Automatizando","Automation":"Automatización","Available":"Disponible","Back":"Atrás","Battery":"Batería","Battery Health":"Salud de la batería","Battery Level":"Nivel de batería","Battery Source":"Fuente de batería","Battery Status":"Estado de la batería","Battery Temp":"Temperatura de batería","Bluetooth":"Bluetooth","Browser":"Navegador","Busy":"En uso","Busy Devices":"Dispositivos en uso","CPU":"CPU","Camera":"Cámara","Cancel":"Cancelar","Cannot access specified URL":"No se puedo accecer a la URL especificada","Category":"Categoría","Charging":"Cargando","Check errors below":"Comprueba los siguientes errores","Clear":"Limpiar","Clipboard":"Portapapeles","Cold":"Frío","Connected":"Conectado","Connected successfully.":"Conectado con éxito","Control":"Control","Cookies":"Cookies","Cores":"Núcleos","Current rotation:":"Rotación actual","Customize":"Personalizar","Dashboard":"Tablero","Data":"Datos","Date":"Fecha","Dead":"Muerto","Delete":"Borrar","Density":"Densidad","Details":"Detalles","Developer":"Desarrollador","Device":"Dispositivo","Device Photo":"Foto de dispositivo","Device Settings":"Configuración de Dispositivo","Device cannot get kicked from the group":"El dispositivo no puede ser expulsado del grupo","Device is not present anymore for some reason.":"Por algún motivo el dispositivo ya no está presente","Device is present but offline.":"El dispositivo está presente pero no disponible","Device was disconnected":"El dispositivo se ha desconectado","Device was kicked by automatic timeout.":"El dispositivo fue expulsado por un exceso de tiempo automático","Devices":"Dispositivos","Disable WiFi":"Deshabilitar WIFI","Discharging":"Descargando","Disconnected":"Desconectado","Display":"Pantalla","Domain":"Dominio","Drop file to upload":"Suelta aquí el fichero a subir","Enable WiFi":"Habilitar WIFI","Enable notifications":"Habilitar notificaciones","Encrypted":"Encriptado","Error":"Error","Error while getting data":"Error obteniendo datos","Error while reconnecting":"Error al reconectar","Ethernet":"Ethernet","Executes remote shell commands":"Ejecuta comandos de terminal remota","Failed to download file":"Fallo al descargar el fichero","Fast Forward":"Avance rápido","File Explorer":"Explorador de fichero","Filter":"Filtro","Find Device":"Encontrar dispositivo","Fingerprint":"Huella","Frequency":"Frecuencia","Full":"Lleno","General":"General","Generate Access Token":"Genera testimonio de acceso","Generate Login for VNC":"Genera inicio de sesión para VNC","Generate New Token":"Generar nuevo token","Get":"Obtener","Get clipboard contents":"Obtener contenido del portapapeles","Go Back":"Ir atrás","Go Forward":"Ir adelante","Go to Device List":"Ir a la lista de dispositivos","Good":"Bueno","Hardware":"Hardware","Health":"Salud","Height":"Ancho","Help":"Ayuda","Hide Screen":"Ocultar pantalla","Home":"Home","Host":"Terminal","Hostname":"Nombre de terminal","ICCID":"ICCID","ID":"ID","IMEI":"IMEI","IMSI":"IMSI","Incorrect login details":"Datos de inicio de sesión incorrectos","Info":"Información","Inspect Device":"Inspeccionar dispositivo","Inspecting is currently only supported in WebView":"La inspección sólo está soportada para WebView actualmente","Inspector":"Inspector","Installation canceled by user.":"Instalación cancelada por el usuario","Installation failed due to an unknown error.":"La instalación falló debido a un error desconocido","Installation succeeded.":"Instalado con éxito","Installation timed out.":"La instalación superó el tiempo de espera","Installing app...":"Instalando aplicación...","Key":"Llave","Keys":"Llaves","Language":"Idioma","Launch Activity":"Iniciar actividad","Launching activity...":"Iniciando actividad","Level":"Nivel","Location":"Posición","Lock Rotation":"Bloquear rotación","Logs":"Trazas","Maintenance":"Mantenimiento","Make sure to copy your access token now. You won't be able to see it again.":"Asegúrate de copiar el testigo de acceso ahora. Si lo pierde no se podrá recuperar.","Manage Apps":"Gestionar aplicaciones","Media":"Medio","Memory":"Memoria","Menu":"Menú","Mobile":"Móvil","Model":"Modelo","More about ADB Keys":"Más sobre llaves ADB","More about Access Tokens":"Más sobre Tokens de acceso","Mute":"Silencio","Name":"Nombre","Native":"Nativo","Navigation":"Navegación","Network":"Red","Next":"Siguiente","No":"No","No ADB keys":"No hay llaves ADB","No Ports Forwarded":"No hay puertos redirigidos","No access tokens":"Sin tokens de acceso","No clipboard data":"No hay datos en el portapapeles","No cookies to show":"No hay cookies que mostrar","No devices connected":"No hay dispositivos conectados","No photo available":"No hay imagen disponible","No screenshots taken":"No hay capturas de pantalla","Normal Mode":"Modo normal","Not Charging":"No se está cargando","Notes":"Notas","Nothing to inspect":"No hay nada que inspeccionar","Notifications":"Notificaciones","Number":"Número","Offline":"Offline","Oops!":"¡Ups!","Open":"Abrir","Orientation":"Orientación","Over Voltage":"Exceso de voltaje","Overheat":"Exceso de temperatura","PID":"PID","Package":"Paquete","Password":"Contraseña","Permissions":"Permisos","Phone":"Teléfono","Phone ICCID":"ICCID del teléfono","Phone IMEI":"IMEI del teléfono","Phone IMSI":"IMSI del teléfono","Physical Device":"Dispositivo físico","Place":"Lugar","Platform":"Plataforma","Play/Pause":"Inicio/Pausa","Please enter a valid email":"Por favor, introduce un email válido","Please enter your LDAP username":"Por favor, introduce tu usuario de LDAP","Please enter your Store password":"Por favor, introduce tu contraseña","Please enter your Store username":"Por favor, introduce to nombre de usuario","Please enter your email":"Por favor, introduce tu email","Please enter your name":"Por favor, introduce tu nombre","Please enter your password":"Por favor, introduce tu contraseña","Port":"Puerto","Port Forwarding":"Puerto de reenvío","Preparing":"Preparando","Press Back button":"Pulsa el botón Volver","Press Home button":"Pulsa el botón Home","Press Menu button":"Pulsa el botón Menú","Previous":"Anterior","Processing...":"Procesando...","Product":"Producto","RAM":"RAM","ROM":"ROM","Ready":"Listo","Reconnected successfully.":"Reconectado con éxito","Refresh":"Actualizar","Reload":"Recargar","Remote debug":"Conexión remota","Remove":"Eliminar","Reset":"Reiniciar","Reset Settings":"Restablecer ajustes","Reset all browser settings":"Restablecer todos los ajustes del navegador","Restart Device":"Reiniciar dispositivo","Retry":"Reintentar","Rotate Left":"Rotar a la izquierda","Rotate Right":"Rotar a la derecha","Run":"Ejecutar","Run JavaScript":"Ejecutar JavaScript","Run this command to copy the key to your clipboard":"Ejecuta este comando para copiar la clave al portapapeles","SDK":"SDK","SIM":"SIM","Save ScreenShot":"Guardar captura de pantalla","Save...":"Guardar","Screen":"Pantalla","Screenshot":"Captura de pantalla","Screenshots":"Capturas de Pantalla","Search":"Buscar","Serial":"Serie","Server":"Servidor","Settings":"Configuración","Shell":"Línea de Comandos","Show Screen":"Mostar pantalla","Sign In":"Acceder","Sign Out":"Desconectar","Silent Mode":"Modo silencio","Size":"Tamaño","Socket connection was lost":"Se perdió la conexión con el socket","Someone stole your device.":"Alguien robó tu dispositivo","Special Keys":"Teclas especiales","Status":"Estado","Stop":"Parar","Sub Type":"Subtipo","Tag":"Etiqueta","Take Screenshot":"Capturar pantalla","Temperature":"Temperatura","Text":"Texto","The current view is marked secure and cannot be viewed remotely.":"La vista actual está marcada como segura y no puede ser vista de forma remota","The device will be unavailable for a moment.":"El dispositivo no estará disponible durante unos instantes","The existing package could not be deleted.":"El paquete no se pudo eliminar","The new package couldn't be installed because the verification did not succeed.":"El nuevo paquete no se pudo instalar porque no se pudo verificar","The new package couldn't be installed because the verification timed out.":"El nuevo paquete no se pudo instalar porque se excedió el tiempo de espera al verificarlo","The new package couldn't be installed in the specified install location.":"El nuevo paquete no se pudo instalar en el sitio especificado para su instalación","The new package failed because the current SDK version is newer than that required by the package.":"El nuevo paquete falló porque la versión actual del SDK es más reciente que la que requiere el paquete","The new package failed because the current SDK version is older than that required by the package.":"El nuevo paquete falló porque la versión actual del SDK es más antigua que la que requiere el paquete","The new package has an older version code than the currently installed package.":"El nuevo paquete tiene una versión de código más antigua que el paquete instalado actualmente.","The new package uses a feature that is not available.":"El nuevo paquete utiliza una característica que no está disponible.","The package archive file is invalid.":"El archivo del paquete no es válido","The package being installed contains native code, but none that is compatible with the device's CPU_ABI.":"El paquete que se está instalando contiene código nativo que no es compatible con el CPU_ABI del dispositivo.","The package is already installed.":"El paquete ya está instalado","Tip:":"Truco:","Title":"Título","Total Devices":"Dispositivos Totales","Try to reconnect":"Volver a conectar","Type":"Tipo","USB":"USB","Unauthorized":"No autorizado","Uninstall":"Desinstalar","Unknown":"Desconocido","Unknown reason.":"Razón desconocida.","Unlock Rotation":"Desbloquear rotación","Unspecified Failure":"Fallo no especificado","Upload From Link":"Subir desde enlace","Upload failed":"Subida fallida","Upload unknown error":"Error de subida desconocido","Uploaded file is not valid":"El fichero de subida no es válido","Uploading...":"Subiendo...","Usb speed":"Velocidad de USB","Use":"Uso","User":"Usuario","Username":"Nombre de usuario","Using":"En uso","Version":"Versión","Vibrate Mode":"Modo vibración","Volume":"Volumen","Volume Down":"Bajar volumen","Volume Up":"Subir volumen","Warning:":"Atención:","Web":"Web","WiFi":"WIFI","Width":"Ancho","Yes":"Sí","translate":"traducir"}} +{ + "es": { + "A new version of STF is available": "Una nueva versi\u00f3n de STF est\u00e1 disponible", + "A package is already installed with the same name.": "Ya hay un paquete instalado con el mismo nombre", + "A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).": "Se ha instalado un paquete previamente con el mismo nombre pero con una firma diferente a la del nuevo paquete (y el paquete antiguo no ha sido eliminado).", + "A secure container mount point couldn't be accessed on external media.": "Un punto de montaje de contenedor seguro no puede ser accedido desde un medio externo.", + "Access Tokens": "Tokens de acceso", + "Account": "Cuenta", + "Action": "Acci\u00f3n", + "Actions": "Acciones", + "Activity": "Actividad", + "Add": "A\u00f1adir", + "Add ADB Key": "A\u00f1adir Llave de ADB", + "Add Key": "A\u00f1adir Llave", + "Add the following ADB Key to STF?": "\u00bfA\u00f1adir las siguientes llaves ADB a STF?", + "Admin mode has been disabled.": "El modo administrador se ha desactivado", + "Admin mode has been enabled.": "El modo administrador se ha activado", + "Advanced": "Avanzado", + "Airplane Mode": "Modo avi\u00f3n", + "App Store": "Tienda de aplicaciones", + "App Upload": "Subir aplicaci\u00f3n", + "Apps": "Aplicaciones", + "Are you sure you want to reboot this device?": "\u00bfEst\u00e1s seguro de querer reiniciar este dispositivo?", + "Automating": "Automatizando", + "Automation": "Automatizaci\u00f3n", + "Available": "Disponible", + "Back": "Atr\u00e1s", + "Battery": "Bater\u00eda", + "Battery Health": "Salud de la bater\u00eda", + "Battery Level": "Nivel de bater\u00eda", + "Battery Source": "Fuente de bater\u00eda", + "Battery Status": "Estado de la bater\u00eda", + "Battery Temp": "Temperatura de bater\u00eda", + "Bluetooth": "Bluetooth", + "Browser": "Navegador", + "Busy": "En uso", + "Busy Devices": "Dispositivos en uso", + "CPU": "CPU", + "Camera": "C\u00e1mara", + "Cancel": "Cancelar", + "Cannot access specified URL": "No se puedo accecer a la URL especificada", + "Category": "Categor\u00eda", + "Charging": "Cargando", + "Check errors below": "Comprueba los siguientes errores", + "Clear": "Limpiar", + "Clipboard": "Portapapeles", + "Cold": "Fr\u00edo", + "Connected": "Conectado", + "Connected successfully.": "Conectado con \u00e9xito", + "Control": "Control", + "Cookies": "Cookies", + "Cores": "N\u00facleos", + "Current rotation:": "Rotaci\u00f3n actual", + "Customize": "Personalizar", + "Dashboard": "Tablero", + "Data": "Datos", + "Date": "Fecha", + "Dead": "Muerto", + "Delete": "Borrar", + "Density": "Densidad", + "Details": "Detalles", + "Developer": "Desarrollador", + "Device": "Dispositivo", + "Device Photo": "Foto de dispositivo", + "Device Settings": "Configuraci\u00f3n de Dispositivo", + "Device cannot get kicked from the group": "El dispositivo no puede ser expulsado del grupo", + "Device is not present anymore for some reason.": "Por alg\u00fan motivo el dispositivo ya no est\u00e1 presente", + "Device is present but offline.": "El dispositivo est\u00e1 presente pero no disponible", + "Device was disconnected": "El dispositivo se ha desconectado", + "Device was kicked by automatic timeout.": "El dispositivo fue expulsado por un exceso de tiempo autom\u00e1tico", + "Devices": "Dispositivos", + "Disable WiFi": "Deshabilitar WIFI", + "Discharging": "Descargando", + "Disconnected": "Desconectado", + "Display": "Pantalla", + "Domain": "Dominio", + "Drop file to upload": "Suelta aqu\u00ed el fichero a subir", + "Enable WiFi": "Habilitar WIFI", + "Enable notifications": "Habilitar notificaciones", + "Encrypted": "Encriptado", + "Error": "Error", + "Error while getting data": "Error obteniendo datos", + "Error while reconnecting": "Error al reconectar", + "Ethernet": "Ethernet", + "Executes remote shell commands": "Ejecuta comandos de terminal remota", + "Failed to download file": "Fallo al descargar el fichero", + "Fast Forward": "Avance r\u00e1pido", + "File Explorer": "Explorador de fichero", + "Filter": "Filtro", + "Find Device": "Encontrar dispositivo", + "Fingerprint": "Huella", + "Frequency": "Frecuencia", + "Full": "Lleno", + "General": "General", + "Generate Access Token": "Genera testimonio de acceso", + "Generate Login for VNC": "Genera inicio de sesi\u00f3n para VNC", + "Generate New Token": "Generar nuevo token", + "Get": "Obtener", + "Get clipboard contents": "Obtener contenido del portapapeles", + "Go Back": "Ir atr\u00e1s", + "Go Forward": "Ir adelante", + "Go to Device List": "Ir a la lista de dispositivos", + "Good": "Bueno", + "Hardware": "Hardware", + "Health": "Salud", + "Height": "Ancho", + "Help": "Ayuda", + "Hide Screen": "Ocultar pantalla", + "Home": "Home", + "Host": "Terminal", + "Hostname": "Nombre de terminal", + "ICCID": "ICCID", + "ID": "ID", + "IMEI": "IMEI", + "IMSI": "IMSI", + "Incorrect login details": "Datos de inicio de sesi\u00f3n incorrectos", + "Info": "Informaci\u00f3n", + "Inspect Device": "Inspeccionar dispositivo", + "Inspecting is currently only supported in WebView": "La inspecci\u00f3n s\u00f3lo est\u00e1 soportada para WebView actualmente", + "Inspector": "Inspector", + "Installation canceled by user.": "Instalaci\u00f3n cancelada por el usuario", + "Installation failed due to an unknown error.": "La instalaci\u00f3n fall\u00f3 debido a un error desconocido", + "Installation succeeded.": "Instalado con \u00e9xito", + "Installation timed out.": "La instalaci\u00f3n super\u00f3 el tiempo de espera", + "Installing app...": "Instalando aplicaci\u00f3n...", + "Key": "Llave", + "Keys": "Llaves", + "Language": "Idioma", + "Launch Activity": "Iniciar actividad", + "Launching activity...": "Iniciando actividad", + "Level": "Nivel", + "Location": "Posici\u00f3n", + "Lock Rotation": "Bloquear rotaci\u00f3n", + "Logs": "Trazas", + "Maintenance": "Mantenimiento", + "Make sure to copy your access token now. You won't be able to see it again.": "Aseg\u00farate de copiar el testigo de acceso ahora. Si lo pierde no se podr\u00e1 recuperar.", + "Manage Apps": "Gestionar aplicaciones", + "Media": "Medio", + "Memory": "Memoria", + "Menu": "Men\u00fa", + "Mobile": "M\u00f3vil", + "Model": "Modelo", + "More about ADB Keys": "M\u00e1s sobre llaves ADB", + "More about Access Tokens": "M\u00e1s sobre Tokens de acceso", + "Mute": "Silencio", + "Name": "Nombre", + "Native": "Nativo", + "Navigation": "Navegaci\u00f3n", + "Network": "Red", + "Next": "Siguiente", + "No": "No", + "No ADB keys": "No hay llaves ADB", + "No Ports Forwarded": "No hay puertos redirigidos", + "No access tokens": "Sin tokens de acceso", + "No clipboard data": "No hay datos en el portapapeles", + "No cookies to show": "No hay cookies que mostrar", + "No devices connected": "No hay dispositivos conectados", + "No photo available": "No hay imagen disponible", + "No screenshots taken": "No hay capturas de pantalla", + "Normal Mode": "Modo normal", + "Not Charging": "No se est\u00e1 cargando", + "Notes": "Notas", + "Nothing to inspect": "No hay nada que inspeccionar", + "Notifications": "Notificaciones", + "Number": "N\u00famero", + "Offline": "Offline", + "Oops!": "\u00a1Ups!", + "Open": "Abrir", + "Orientation": "Orientaci\u00f3n", + "Over Voltage": "Exceso de voltaje", + "Overheat": "Exceso de temperatura", + "PID": "PID", + "Package": "Paquete", + "Password": "Contrase\u00f1a", + "Permissions": "Permisos", + "Phone": "Tel\u00e9fono", + "Phone ICCID": "ICCID del tel\u00e9fono", + "Phone IMEI": "IMEI del tel\u00e9fono", + "Phone IMSI": "IMSI del tel\u00e9fono", + "Physical Device": "Dispositivo f\u00edsico", + "Place": "Lugar", + "Platform": "Plataforma", + "Play/Pause": "Inicio/Pausa", + "Please enter a valid email": "Por favor, introduce un email v\u00e1lido", + "Please enter your LDAP username": "Por favor, introduce tu usuario de LDAP", + "Please enter your Store password": "Por favor, introduce tu contrase\u00f1a", + "Please enter your Store username": "Por favor, introduce to nombre de usuario", + "Please enter your email": "Por favor, introduce tu email", + "Please enter your name": "Por favor, introduce tu nombre", + "Please enter your password": "Por favor, introduce tu contrase\u00f1a", + "Port": "Puerto", + "Port Forwarding": "Puerto de reenv\u00edo", + "Preparing": "Preparando", + "Press Back button": "Pulsa el bot\u00f3n Volver", + "Press Home button": "Pulsa el bot\u00f3n Home", + "Press Menu button": "Pulsa el bot\u00f3n Men\u00fa", + "Previous": "Anterior", + "Processing...": "Procesando...", + "Product": "Producto", + "RAM": "RAM", + "ROM": "ROM", + "Ready": "Listo", + "Reconnected successfully.": "Reconectado con \u00e9xito", + "Refresh": "Actualizar", + "Reload": "Recargar", + "Remote debug": "Conexi\u00f3n remota", + "Remove": "Eliminar", + "Reset": "Reiniciar", + "Reset Settings": "Restablecer ajustes", + "Reset all browser settings": "Restablecer todos los ajustes del navegador", + "Restart Device": "Reiniciar dispositivo", + "Retry": "Reintentar", + "Rotate Left": "Rotar a la izquierda", + "Rotate Right": "Rotar a la derecha", + "Run": "Ejecutar", + "Run JavaScript": "Ejecutar JavaScript", + "Run this command to copy the key to your clipboard": "Ejecuta este comando para copiar la clave al portapapeles", + "SDK": "SDK", + "SIM": "SIM", + "Save ScreenShot": "Guardar captura de pantalla", + "Save...": "Guardar", + "Screen": "Pantalla", + "Screenshot": "Captura de pantalla", + "Screenshots": "Capturas de Pantalla", + "Search": "Buscar", + "Serial": "Serie", + "Server": "Servidor", + "Settings": "Configuraci\u00f3n", + "Shell": "L\u00ednea de Comandos", + "Show Screen": "Mostar pantalla", + "Sign In": "Acceder", + "Sign Out": "Desconectar", + "Silent Mode": "Modo silencio", + "Size": "Tama\u00f1o", + "Socket connection was lost": "Se perdi\u00f3 la conexi\u00f3n con el socket", + "Someone stole your device.": "Alguien rob\u00f3 tu dispositivo", + "Special Keys": "Teclas especiales", + "Status": "Estado", + "Stop": "Parar", + "Sub Type": "Subtipo", + "Tag": "Etiqueta", + "Take Screenshot": "Capturar pantalla", + "Temperature": "Temperatura", + "Text": "Texto", + "The current view is marked secure and cannot be viewed remotely.": "La vista actual est\u00e1 marcada como segura y no puede ser vista de forma remota", + "The device will be unavailable for a moment.": "El dispositivo no estar\u00e1 disponible durante unos instantes", + "The existing package could not be deleted.": "El paquete no se pudo eliminar", + "The new package couldn't be installed because the verification did not succeed.": "El nuevo paquete no se pudo instalar porque no se pudo verificar", + "The new package couldn't be installed because the verification timed out.": "El nuevo paquete no se pudo instalar porque se excedi\u00f3 el tiempo de espera al verificarlo", + "The new package couldn't be installed in the specified install location.": "El nuevo paquete no se pudo instalar en el sitio especificado para su instalaci\u00f3n", + "The new package failed because the current SDK version is newer than that required by the package.": "El nuevo paquete fall\u00f3 porque la versi\u00f3n actual del SDK es m\u00e1s reciente que la que requiere el paquete", + "The new package failed because the current SDK version is older than that required by the package.": "El nuevo paquete fall\u00f3 porque la versi\u00f3n actual del SDK es m\u00e1s antigua que la que requiere el paquete", + "The new package has an older version code than the currently installed package.": "El nuevo paquete tiene una versi\u00f3n de c\u00f3digo m\u00e1s antigua que el paquete instalado actualmente.", + "The new package uses a feature that is not available.": "El nuevo paquete utiliza una caracter\u00edstica que no est\u00e1 disponible.", + "The package archive file is invalid.": "El archivo del paquete no es v\u00e1lido", + "The package being installed contains native code, but none that is compatible with the device's CPU_ABI.": "El paquete que se est\u00e1 instalando contiene c\u00f3digo nativo que no es compatible con el CPU_ABI del dispositivo.", + "The package is already installed.": "El paquete ya est\u00e1 instalado", + "Tip:": "Truco:", + "Title": "T\u00edtulo", + "Total Devices": "Dispositivos Totales", + "Try to reconnect": "Volver a conectar", + "Type": "Tipo", + "USB": "USB", + "Unauthorized": "No autorizado", + "Uninstall": "Desinstalar", + "Unknown": "Desconocido", + "Unknown reason.": "Raz\u00f3n desconocida.", + "Unlock Rotation": "Desbloquear rotaci\u00f3n", + "Unspecified Failure": "Fallo no especificado", + "Upload From Link": "Subir desde enlace", + "Upload failed": "Subida fallida", + "Upload unknown error": "Error de subida desconocido", + "Uploaded file is not valid": "El fichero de subida no es v\u00e1lido", + "Uploading...": "Subiendo...", + "Usb speed": "Velocidad de USB", + "Use": "Uso", + "User": "Usuario", + "Username": "Nombre de usuario", + "Using": "En uso", + "Version": "Versi\u00f3n", + "Vibrate Mode": "Modo vibraci\u00f3n", + "Volume": "Volumen", + "Volume Down": "Bajar volumen", + "Volume Up": "Subir volumen", + "Warning:": "Atenci\u00f3n:", + "Web": "Web", + "WiFi": "WIFI", + "Width": "Ancho", + "Yes": "S\u00ed", + "translate": "traducir" + } +} diff --git a/res/common/lang/translations/stf.fr.json b/res/common/lang/translations/stf.fr.json index 558b13d2c..39cf16f8b 100644 --- a/res/common/lang/translations/stf.fr.json +++ b/res/common/lang/translations/stf.fr.json @@ -1 +1,375 @@ -{"fr":{"-":"-","A new version of STF is available":"Une nouvelle version de STF est disponible","A package is already installed with the same name.":"Un paquet est déjà installé avec le même nom","A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).":"Un paquet précédemment installée du même nom a une signature différente de celle du nouveau paquet (et les données de l'ancien paquet n'a pas été supprimée).","A secure container mount point couldn't be accessed on external media.":"Un conteneur sécurisé équipé ne peut pas être accessible sur un support externe.","ABI":"IBP","AC":"AC","ADB Keys":"Clefs ADB","Access Tokens":"Jetons d'Accès","Account":"Compte","Action":"Action","Actions":"Actions","Activity":"Activité","Add":"Ajouter","Add ADB Key":"Ajouter une Clef ADB","Add Key":"Ajouter une Clef","Add the following ADB Key to STF?":"Ajouter la Clef ADB suivante dans STF?","Admin mode has been disabled.":"Le Mode Administrateur a été désactivé","Admin mode has been enabled.":"Le Mode Administrateur a été activé","Advanced":"Avancé","Advanced Input":"Entrée Avancé","Airplane Mode":"Mode Avion","App Store":"App Store","App Upload":"Téléverser une Application","Apps":"Applications","Are you sure you want to reboot this device?":"Est vous sûr de vouloir redémarrer ce terminal?","Automating":"En cours d'automatisation","Automation":"Automatisation","Available":"Disponible","Back":"Précédent","Battery":"Batterie","Battery Health":"Santé de la Batterie","Battery Level":"Niveau de la Batterie","Battery Source":"Source de la Batterie","Battery Status":"Statut de la Batterie","Battery Temp":"Température de la Batterie","Bluetooth":"Bluetooth","Browser":"Navigateur","Busy":"Occupé","Busy Devices":"Terminaux Occupés","CPU":"CPU","Camera":"Caméra","Cancel":"Annuler","Cannot access specified URL":"Impossible d’accéder à l'URL spécifiée","Carrier":"Opérateur","Category":"Catégorie","Charging":"Chargement","Check errors below":"Vérifier les erreurs ci-dessous","Clear":"Nettoyer","Clipboard":"Presse-papier","Cold":"Froid","Connected":"Connecté","Connected successfully.":"Connexion réussie","Control":"Contrôle","Cookies":"Cookies","Cores":"Coeurs","Current rotation:":"Rotation actuelle","Customize":"Personnaliser","D-pad Center":"D-pad Centre","D-pad Down":"D-pad Bas","D-pad Left":"D-pad Gauche","D-pad Right":"D-pad Droite","D-pad Up":"D-pad Haut","Dashboard":"Tableau","Data":"Données","Date":"Date","Dead":"Mort","Delete":"Supprimer","Density":"Densité","Details":"Détails","Developer":"Développeur","Device":"Terminal","Device Photo":"Photos du Terminal","Device Settings":"Paramètres du Terminal","Device cannot get kicked from the group":"Le Terminal ne peut pas être exclu du groupe","Device is not present anymore for some reason.":"Le Terminal n'est plus présent pour certaines raisons","Device is present but offline.":"Le Terminal est présent mais Hors-Ligne","Device was disconnected":"Le Terminal était déconnecté","Device was kicked by automatic timeout.":"Le Terminal a été exclu par le Timeout automatique","Devices":"Terminaux","Disable WiFi":"Désactiver le Wifi","Discharging":"En Décharge","Disconnected":"Déconnecté","Display":"écran","Domain":"Domaine","Drop file to upload":"Déposer le fichier à téléverser","Dummy":"Mannequin","Enable WiFi":"Activer le Wifi","Enable notifications":"Activer les notifications","Encrypted":"Crypté","Error":"Erreur","Error while getting data":"Erreur lors de l'obtention de données","Error while reconnecting":"Erreur lors de la reconnexion","Ethernet":"Ethernet","Executes remote shell commands":"Exécute des commandes Shell à distance","FPS":"FPS","Failed to download file":"Impossible de télécharger le fichier","Fast Forward":"Avance Rapide","File Explorer":"Explorateur de Fichiers","Filter":"Filtrer","Find Device":"Trouver un Terminal","Fingerprint":"Empreinte Digitale","Frequency":"Fréquence","Full":"Rempli","General":"Général","Generate Access Token":"Générer un Jeton d'Accès","Generate Login for VNC":"Générer un identifiant pour VNC","Generate New Token":"Générer un Nouveau Jeton","Get":"Obtenir","Get clipboard contents":"Obtenir le contenu du Presse-Papier","Go Back":"Retour","Go Forward":"Avancer","Go to Device List":"Aller à la Liste des Terminaux","Good":"Bien","Hardware":"Matériel","Health":"Santé","Height":"Taille","Help":"Aide","Hide Screen":"Cacher l'écran","Home":"Accueil","Host":"Hôte","Hostname":"Nom de l'Hôte","ICCID":"ICCID","ID":"ID","IMEI":"IMEI","IMSI":"IMSI","Incorrect login details":"Informations de connexion incorrectes","Info":"Informations","Inspect Device":"Inspecter le Terminal","Inspecting is currently only supported in WebView":"L'inspection est actuellement pris en charge uniquement dans WebView","Inspector":"Inspecteur","Installation canceled by user.":"Installation annulée par l'utilisateur","Installation failed due to an unknown error.":"Installation échouée due à une erreur inconnue","Installation succeeded.":"Installation réussie","Installation timed out.":"L'installation a expirée.","Installing app...":"En cours d'installation de l'application","Key":"Clef","Keys":"Clefs","Landscape":"Paysage","Language":"Langage","Launch Activity":"Lancer l'Activité","Launching activity...":"En cours de lancement de l'activité ...","Level":"Niveau","Local Settings":"Paramètres locaux","Location":"Localisation","Lock Rotation":"Bloquer la Rotation","Logs":"Logs","Maintenance":"Maintenance","Make sure to copy your access token now. You won't be able to see it again.":"Assurez-vous de copier votre jeton d'accès maintenant. Vous ne serez pas en mesure de le voir à nouveau.","Manage Apps":"Gérer les Applications","Manner Mode":"Mode Silencieux","Manufacturer":"Fabricant","Media":"Médias","Memory":"Mémoire","Menu":"Menu","Mobile":"Mobile","Mobile DUN":"Réseau Commuté","Mobile High Priority":"Mobile en Priorité Haute","Mobile MMS":"MMS","Mobile SUPL":"SUPL","Model":"Modèle","More about ADB Keys":"En savoir plus sur les Clefs ADB","More about Access Tokens":"En savoir plus sur les Jetons d'Accès","Mute":"Muet","Name":"Nom","Native":"Natif","Navigation":"Navigation","Network":"Réseau","Next":"Suivant","No":"Non","No ADB keys":"Pas de clefs ADB","No Ports Forwarded":"Pas de ports redirigés","No access tokens":"Pas d'accès aux jetons","No clipboard data":"Pas de données dans le Presse-Papier","No cookies to show":"Pas de cookies à afficher","No device screen":"Pas d'écran de terminal","No devices connected":"Pas de terminaux connectés","No photo available":"Pas de photos disponibles","No screenshots taken":"Pas de captures d'écran prises","Normal Mode":"Mode Normal","Not Charging":"Pas en charge","Notes":"Notes","Nothing to inspect":"Rien à inspecter","Notifications":"Notifications","Number":"Nombre","OS":"OS","Offline":"Hors Ligne","Oops!":"Oups!","Open":"Ouvrir","Orientation":"Orientation","Over Voltage":"Surtension","Overheat":"Surchauffe","PID":"PID","Package":"Paquet","Password":"Mot de Passe","Path":"Chemin","Permissions":"Permissions","Phone":"Téléphone","Phone ICCID":"ICCID du Téléphone","Phone IMEI":"IMEI du Téléphone","Phone IMSI":"IMSI du Téléphone","Physical Device":"Terminal Physique","Place":"Place","Platform":"Plateforme","Play/Pause":"Jouer/Pause","Please enter a valid email":"S'il vous plaît entrez un e-mail valide","Please enter your LDAP username":"S'il vous plaît entrez vôtre compte LDAP","Please enter your Store password":"S'il vous plaît entrez vôtre mot de passe du Store","Please enter your Store username":"S'il vous plaît entrez vôtre identifiant du Store","Please enter your email":"S'il vous plaît entrez vôtre e-mail","Please enter your name":"S'il vous plaît entrez vôtre nom","Please enter your password":"S'il vous plaît entrez vôtre mot de passe","Port":"Port","Port Forwarding":"Redirection de Ports","Portrait":"Portrait","Power":"Alimentation","Power Source":"Source d'Alimentation","Preparing":"En Préparation","Press Back button":"Appuyer sur le bouton Retour","Press Home button":"Appuyer sur le bouton Accueil","Press Menu button":"Appuyer sur le bouton Menu","Previous":"Précédent","Processing...":"En Traitement ....","Product":"Produit","Pushing app...":"En cours de téléversement des Applications ....","RAM":"RAM","ROM":"ROM","Ready":"Prêt","Reconnected successfully.":"Reconnexions réussis","Refresh":"Rafraîchir","Released":"Versionée","Reload":"Recharger","Remote debug":"Débogage à distance","Remove":"Enlever","Reset":"Réinitialiser","Reset Settings":"Réinitialiser les paramètres","Reset all browser settings":"Réinitialiser tous les paramètres des navigateurs","Restart Device":"Redémarrer le Terminal","Retrieving the device screen has timed out.":"La récupération de l'écran de l'appareil a expiré.","Retry":"Recommencer","Rewind":"Rembobiner","Roaming":"Roaming","Rotate Left":"Tourner vers la gauche","Rotate Right":"Tourner vers la droite","Run":"Exécuter","Run JavaScript":"Exécuter JavaScript","Run the following on your command line to debug the device from your Browser":"Exécutez la commande suivante sur la ligne de commande pour déboguer le périphérique de votre navigateur","Run the following on your command line to debug the device from your IDE":"Exécutez la commande suivante sur la ligne de commande pour déboguer le périphérique de votre IDE","Run this command to copy the key to your clipboard":"Exécutez cette commande pour copier la clef de votre presse-papier","SD Card Mounted":"Carte SD Monté","SDK":"SDK","SIM":"SIM","Save ScreenShot":"Sauver la capture d'écran","Save...":"Sauvegarde ...","Screen":"écran","Screenshot":"Capture d'écran","Screenshots":"Captures d'écran","Search":"Rechercher","Secure":"Protéger","Selects Next IME":"Sélectionner le prochain IME","Serial":"Sériel","Server":"Serveur","Server error. Check log output.":"Erreur Serveur. Vérifier les logs de sortie.","Set":"Paramétrer","Set Cookie":"Paramétrer le Cookie","Settings":"Paramètres","Shell":"Shell","Show Screen":"Afficher l'écran","Sign In":"S'enregistrer","Sign Out":"Se déconnecter","Silent Mode":"Mode Silencieux","Size":"Taille","Socket connection was lost":"La connexion au Socket a été perdu","Someone stole your device.":"Quelqu'un a volé votre terminal.","Special Keys":"Clefs spéciales","Start/Stop Logging":"Démarrer/Arrêter les logs","Status":"Statut","Stop":"Arrêter","Stop Automation":"Arrêter l'automatisation","Stop Using":"Cesser d'utiliser","Store Account":"Compte du Store","Sub Type":"Sous Type","Switch Charset":"Permuter le Charset","TID":"TID","Tag":"étiquette","Take Pageshot (Needs WebView running)":"Prendre une Prise de vue de la page (besoin de WebView)","Take Screenshot":"Prendre une Capture d'écran","Temperature":"Température","Text":"Texte","The URI passed in is invalid.":"L'URI transmise n'est pas invalide.","The current view is marked secure and cannot be viewed remotely.":"La vue actuelle est marqué sécurisé et ne peut être consulté à distance.","The device will be unavailable for a moment.":"Le terminal ne sera pas disponible pour un moment","The existing package could not be deleted.":"Le package existant ne peut pas être supprimé.","The new package couldn't be installed because the verification did not succeed.":"Le nouveau paquet n'a pas pu être installé car la vérification n'a pas réussi.","The new package couldn't be installed because the verification timed out.":"Le nouveau paquet n'a pas pu être installé car la vérification a expiré.","The new package couldn't be installed in the specified install location because the media is not available.":"Le nouveau paquet n'a pas pu être installé à l'emplacement spécifié pour l'installation parce que les médias ne sont pas disponibles.","The new package couldn't be installed in the specified install location.":"Le nouveau paquet n'a pas pu être installé à l'emplacement spécifié pour installation.","The new package failed because it contains a content provider with thesame authority as a provider already installed in the system.":"Le nouveau paquet a échoué car it contient un fournisseur de contenu avec la même autorité en tant que fournisseur déjà installé dans le système.","The new package failed because it has specified that it is a test-only package and the caller has not supplied the INSTALL_ALLOW_TEST flag.":"Le nouveau paquet a échoué car il a précisé qu'il est un paquet de test uniquement et l'appelant n'a pas fourni le drapeau INSTALL_ALLOW_TEST.","The new package failed because the current SDK version is newer than that required by the package.":"Le nouveau paquet a échoué parce que la version actuelle du SDK est plus récente que celle requise par le paquet.","The new package failed because the current SDK version is older than that required by the package.":"Le nouveau paquet a échoué parce que la version actuelle du SDK est plus ancienne que celle requise par le paquet.","The new package failed while optimizing and validating its dex files, either because there was not enough storage or the validation failed.":"Le nouveau paquet a échoué lors de l'optimisation et l'évaluation de ses fichiers dex, soit parce qu'il n'y avait pas assez de stockage ou la validation a échoué.","The new package has an older version code than the currently installed package.":"Le nouveau paquet a un code de version plus ancien que le paquet actuellement installé.","The new package is assigned a different UID than it previously held.":"Le nouveau paquet est affecté un ID différent qu'il détenait auparavant.","The new package uses a feature that is not available.":"Le nouveau paquet utilise une fonctionnalité qui n'est pas disponible.","The new package uses a shared library that is not available.":"Le nouveau paquet utilise une bibliothèque partagée qui n'est pas disponible.","The package archive file is invalid.":"Le fichier d'archive de paquet est invalide.","The package being installed contains native code, but none that is compatible with the device's CPU_ABI.":"Le package installé contient du code natif, mais aucun qui soit compatible avec le CPU_ABI du terminal.","The package changed from what the calling program expected.":"Le paquet a changé de ce que le programme appelant avait prévu.","The package is already installed.":"Le paquet est déjà installé","The package manager service found that the device didn't have enough storage space to install the app.":"Le service de gestionnaire de paquets a constaté que le terminal ne dispose pas de suffisamment d'espace de stockage pour installer l'application.","The parser did not find any actionable tags (instrumentation or application) in the manifest.":"L'analyseur n'a pas trouvé toutes les tags actionnables (de l'instrumentation et des applications) dans le manifest.","The parser did not find any certificates in the .apk.":"L'analyseur n'a pas trouvé de certificat dans le fichier .apk.","The parser encountered a CertificateEncodingException in one of the files in the .apk.":"L'analyseur a rencontré une CertificateEncodingException dans l'un des fichiers de l'apk.","The parser encountered a bad or missing package name in the manifest.":"L'analyseur a rencontré un mauvais ou manquant nom du paquet dans le manifest.","The parser encountered a bad shared user id name in the manifest.":"L'analyseur a rencontré un mauvais nom d'utilisateur partagé dans le manifest.","The parser encountered an unexpected exception.":"L'analyseur a rencontré une exception inattendue.","The parser encountered some structural problem in the manifest.":"L'analyseur a rencontré un problème structurel dans le manifest.","The parser found inconsistent certificates on the files in the .apk.":"L'analyseur a trouvé des certificats contradictoires sur les fichiers de l'apk.","The parser was given a path that is not a file, or does not end with the expected '.apk' extension.":"L'analyseur a donné un chemin qui n'est pas un fichier, ou ne se termine pas avec le \".apk\" extension attendue.","The parser was unable to retrieve the AndroidManifest.xml file.":"L'analyseur n'a pas pu extraire le fichier AndroidManifest.xml.","The requested shared user does not exist.":"L'utilisateur requêté partagé n'existe pas.","The system failed to install the package because its packaged native code did not match any of the ABIs supported by the system.":"Le système n'a pas réussi à installer le paquet parce que son code natif emballé ne correspond à aucune ABI supporté par le système.","The system failed to install the package because of system issues.":"Le système n'a pas réussi à installer le paquet en raison de problèmes du système.","The system failed to install the package because the user is restricted from installing apps.":"Le système n'a pas réussi à installer le paquet parce que l'utilisateur est limité à partir de l'installation d'applications.","Time":"Temps","Tip:":"Astuce:","Title":"Titre","Toggle Web/Native":"Basculer de Web/Natif","Total Devices":"Nombre total de Terminaux","Try to reconnect":"Essayer de se reconnecter","Type":"Type","USB":"USB","Unauthorized":"Non Autorisé","Uninstall":"Désinstaller","Unknown":"Inconnu","Unknown reason.":"Raison inconnue.","Unlock Rotation":"Débloquer la Rotation","Unspecified Failure":"Défaillance non spécifiée","Upload From Link":"Téléverser depuis le Lien","Upload failed":"Téléversement raté","Upload unknown error":"Erreur inconnue lors du Téléversement","Uploaded file is not valid":"Le fichier téléversé n'est pas valide","Uploading...":"En cours de téléversement ...","Usable Devices":"Terminaux utilisables","Usb speed":"Vitesse USB","Use":"Utiliser","User":"Utilisateur","Username":"Nom de l'utilisateur","Using":"En Utilisation","Using Fallback":"Reprise de l'Utilisation","VNC":"VNC","Value":"Valeur","Version":"Version","Version Update":"Version de la mise à jour","Vibrate Mode":"Mode Vibration","Voltage":"Tension","Volume":"Volume","Volume Down":"Baisser le Volume","Volume Up":"Augmenter le Volume","Warning:":"Avertissement:","Web":"Web","WiFi":"Wifi","WiMAX":"WiMax","Width":"Largeur","Wireless":"Sans Fil","X DPI":"X DPI","Y DPI":"Y DPI","Yes":"Oui","You (or someone else) kicked the device.":"Vous (ou quelqu'un d'autre) a exclu le Terminal.","translate":"Traduire"}} +{ + "fr": { + "-": "-", + "A new version of STF is available": "Une nouvelle version de STF est disponible", + "A package is already installed with the same name.": "Un paquet est d\u00e9j\u00e0 install\u00e9 avec le m\u00eame nom", + "A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).": "Un paquet pr\u00e9c\u00e9demment install\u00e9e du m\u00eame nom a une signature diff\u00e9rente de celle du nouveau paquet (et les donn\u00e9es de l'ancien paquet n'a pas \u00e9t\u00e9 supprim\u00e9e).", + "A secure container mount point couldn't be accessed on external media.": "Un conteneur s\u00e9curis\u00e9 \u00e9quip\u00e9 ne peut pas \u00eatre accessible sur un support externe.", + "ABI": "IBP", + "AC": "AC", + "ADB Keys": "Clefs ADB", + "Access Tokens": "Jetons d'Acc\u00e8s", + "Account": "Compte", + "Action": "Action", + "Actions": "Actions", + "Activity": "Activit\u00e9", + "Add": "Ajouter", + "Add ADB Key": "Ajouter une Clef ADB", + "Add Key": "Ajouter une Clef", + "Add the following ADB Key to STF?": "Ajouter la Clef ADB suivante dans STF?", + "Admin mode has been disabled.": "Le Mode Administrateur a \u00e9t\u00e9 d\u00e9sactiv\u00e9", + "Admin mode has been enabled.": "Le Mode Administrateur a \u00e9t\u00e9 activ\u00e9", + "Advanced": "Avanc\u00e9", + "Advanced Input": "Entr\u00e9e Avanc\u00e9", + "Airplane Mode": "Mode Avion", + "App Store": "App Store", + "App Upload": "T\u00e9l\u00e9verser une Application", + "Apps": "Applications", + "Are you sure you want to reboot this device?": "Est vous s\u00fbr de vouloir red\u00e9marrer ce terminal?", + "Automating": "En cours d'automatisation", + "Automation": "Automatisation", + "Available": "Disponible", + "Back": "Pr\u00e9c\u00e9dent", + "Battery": "Batterie", + "Battery Health": "Sant\u00e9 de la Batterie", + "Battery Level": "Niveau de la Batterie", + "Battery Source": "Source de la Batterie", + "Battery Status": "Statut de la Batterie", + "Battery Temp": "Temp\u00e9rature de la Batterie", + "Bluetooth": "Bluetooth", + "Browser": "Navigateur", + "Busy": "Occup\u00e9", + "Busy Devices": "Terminaux Occup\u00e9s", + "CPU": "CPU", + "Camera": "Cam\u00e9ra", + "Cancel": "Annuler", + "Cannot access specified URL": "Impossible d\u2019acc\u00e9der \u00e0 l'URL sp\u00e9cifi\u00e9e", + "Carrier": "Op\u00e9rateur", + "Category": "Cat\u00e9gorie", + "Charging": "Chargement", + "Check errors below": "V\u00e9rifier les erreurs ci-dessous", + "Clear": "Nettoyer", + "Clipboard": "Presse-papier", + "Cold": "Froid", + "Connected": "Connect\u00e9", + "Connected successfully.": "Connexion r\u00e9ussie", + "Control": "Contr\u00f4le", + "Cookies": "Cookies", + "Cores": "Coeurs", + "Current rotation:": "Rotation actuelle", + "Customize": "Personnaliser", + "D-pad Center": "D-pad Centre", + "D-pad Down": "D-pad Bas", + "D-pad Left": "D-pad Gauche", + "D-pad Right": "D-pad Droite", + "D-pad Up": "D-pad Haut", + "Dashboard": "Tableau", + "Data": "Donn\u00e9es", + "Date": "Date", + "Dead": "Mort", + "Delete": "Supprimer", + "Density": "Densit\u00e9", + "Details": "D\u00e9tails", + "Developer": "D\u00e9veloppeur", + "Device": "Terminal", + "Device Photo": "Photos du Terminal", + "Device Settings": "Param\u00e8tres du Terminal", + "Device cannot get kicked from the group": "Le Terminal ne peut pas \u00eatre exclu du groupe", + "Device is not present anymore for some reason.": "Le Terminal n'est plus pr\u00e9sent pour certaines raisons", + "Device is present but offline.": "Le Terminal est pr\u00e9sent mais Hors-Ligne", + "Device was disconnected": "Le Terminal \u00e9tait d\u00e9connect\u00e9", + "Device was kicked by automatic timeout.": "Le Terminal a \u00e9t\u00e9 exclu par le Timeout automatique", + "Devices": "Terminaux", + "Disable WiFi": "D\u00e9sactiver le Wifi", + "Discharging": "En D\u00e9charge", + "Disconnected": "D\u00e9connect\u00e9", + "Display": "\u00e9cran", + "Domain": "Domaine", + "Drop file to upload": "D\u00e9poser le fichier \u00e0 t\u00e9l\u00e9verser", + "Dummy": "Mannequin", + "Enable WiFi": "Activer le Wifi", + "Enable notifications": "Activer les notifications", + "Encrypted": "Crypt\u00e9", + "Error": "Erreur", + "Error while getting data": "Erreur lors de l'obtention de donn\u00e9es", + "Error while reconnecting": "Erreur lors de la reconnexion", + "Ethernet": "Ethernet", + "Executes remote shell commands": "Ex\u00e9cute des commandes Shell \u00e0 distance", + "FPS": "FPS", + "Failed to download file": "Impossible de t\u00e9l\u00e9charger le fichier", + "Fast Forward": "Avance Rapide", + "File Explorer": "Explorateur de Fichiers", + "Filter": "Filtrer", + "Find Device": "Trouver un Terminal", + "Fingerprint": "Empreinte Digitale", + "Frequency": "Fr\u00e9quence", + "Full": "Rempli", + "General": "G\u00e9n\u00e9ral", + "Generate Access Token": "G\u00e9n\u00e9rer un Jeton d'Acc\u00e8s", + "Generate Login for VNC": "G\u00e9n\u00e9rer un identifiant pour VNC", + "Generate New Token": "G\u00e9n\u00e9rer un Nouveau Jeton", + "Get": "Obtenir", + "Get clipboard contents": "Obtenir le contenu du Presse-Papier", + "Go Back": "Retour", + "Go Forward": "Avancer", + "Go to Device List": "Aller \u00e0 la Liste des Terminaux", + "Good": "Bien", + "Hardware": "Mat\u00e9riel", + "Health": "Sant\u00e9", + "Height": "Taille", + "Help": "Aide", + "Hide Screen": "Cacher l'\u00e9cran", + "Home": "Accueil", + "Host": "H\u00f4te", + "Hostname": "Nom de l'H\u00f4te", + "ICCID": "ICCID", + "ID": "ID", + "IMEI": "IMEI", + "IMSI": "IMSI", + "Incorrect login details": "Informations de connexion incorrectes", + "Info": "Informations", + "Inspect Device": "Inspecter le Terminal", + "Inspecting is currently only supported in WebView": "L'inspection est actuellement pris en charge uniquement dans WebView", + "Inspector": "Inspecteur", + "Installation canceled by user.": "Installation annul\u00e9e par l'utilisateur", + "Installation failed due to an unknown error.": "Installation \u00e9chou\u00e9e due \u00e0 une erreur inconnue", + "Installation succeeded.": "Installation r\u00e9ussie", + "Installation timed out.": "L'installation a expir\u00e9e.", + "Installing app...": "En cours d'installation de l'application", + "Key": "Clef", + "Keys": "Clefs", + "Landscape": "Paysage", + "Language": "Langage", + "Launch Activity": "Lancer l'Activit\u00e9", + "Launching activity...": "En cours de lancement de l'activit\u00e9 ...", + "Level": "Niveau", + "Local Settings": "Param\u00e8tres locaux", + "Location": "Localisation", + "Lock Rotation": "Bloquer la Rotation", + "Logs": "Logs", + "Maintenance": "Maintenance", + "Make sure to copy your access token now. You won't be able to see it again.": "Assurez-vous de copier votre jeton d'acc\u00e8s maintenant. Vous ne serez pas en mesure de le voir \u00e0 nouveau.", + "Manage Apps": "G\u00e9rer les Applications", + "Manner Mode": "Mode Silencieux", + "Manufacturer": "Fabricant", + "Media": "M\u00e9dias", + "Memory": "M\u00e9moire", + "Menu": "Menu", + "Mobile": "Mobile", + "Mobile DUN": "R\u00e9seau Commut\u00e9", + "Mobile High Priority": "Mobile en Priorit\u00e9 Haute", + "Mobile MMS": "MMS", + "Mobile SUPL": "SUPL", + "Model": "Mod\u00e8le", + "More about ADB Keys": "En savoir plus sur les Clefs ADB", + "More about Access Tokens": "En savoir plus sur les Jetons d'Acc\u00e8s", + "Mute": "Muet", + "Name": "Nom", + "Native": "Natif", + "Navigation": "Navigation", + "Network": "R\u00e9seau", + "Next": "Suivant", + "No": "Non", + "No ADB keys": "Pas de clefs ADB", + "No Ports Forwarded": "Pas de ports redirig\u00e9s", + "No access tokens": "Pas d'acc\u00e8s aux jetons", + "No clipboard data": "Pas de donn\u00e9es dans le Presse-Papier", + "No cookies to show": "Pas de cookies \u00e0 afficher", + "No device screen": "Pas d'\u00e9cran de terminal", + "No devices connected": "Pas de terminaux connect\u00e9s", + "No photo available": "Pas de photos disponibles", + "No screenshots taken": "Pas de captures d'\u00e9cran prises", + "Normal Mode": "Mode Normal", + "Not Charging": "Pas en charge", + "Notes": "Notes", + "Nothing to inspect": "Rien \u00e0 inspecter", + "Notifications": "Notifications", + "Number": "Nombre", + "OS": "OS", + "Offline": "Hors Ligne", + "Oops!": "Oups!", + "Open": "Ouvrir", + "Orientation": "Orientation", + "Over Voltage": "Surtension", + "Overheat": "Surchauffe", + "PID": "PID", + "Package": "Paquet", + "Password": "Mot de Passe", + "Path": "Chemin", + "Permissions": "Permissions", + "Phone": "T\u00e9l\u00e9phone", + "Phone ICCID": "ICCID du T\u00e9l\u00e9phone", + "Phone IMEI": "IMEI du T\u00e9l\u00e9phone", + "Phone IMSI": "IMSI du T\u00e9l\u00e9phone", + "Physical Device": "Terminal Physique", + "Place": "Place", + "Platform": "Plateforme", + "Play/Pause": "Jouer/Pause", + "Please enter a valid email": "S'il vous pla\u00eet entrez un e-mail valide", + "Please enter your LDAP username": "S'il vous pla\u00eet entrez v\u00f4tre compte LDAP", + "Please enter your Store password": "S'il vous pla\u00eet entrez v\u00f4tre mot de passe du Store", + "Please enter your Store username": "S'il vous pla\u00eet entrez v\u00f4tre identifiant du Store", + "Please enter your email": "S'il vous pla\u00eet entrez v\u00f4tre e-mail", + "Please enter your name": "S'il vous pla\u00eet entrez v\u00f4tre nom", + "Please enter your password": "S'il vous pla\u00eet entrez v\u00f4tre mot de passe", + "Port": "Port", + "Port Forwarding": "Redirection de Ports", + "Portrait": "Portrait", + "Power": "Alimentation", + "Power Source": "Source d'Alimentation", + "Preparing": "En Pr\u00e9paration", + "Press Back button": "Appuyer sur le bouton Retour", + "Press Home button": "Appuyer sur le bouton Accueil", + "Press Menu button": "Appuyer sur le bouton Menu", + "Previous": "Pr\u00e9c\u00e9dent", + "Processing...": "En Traitement ....", + "Product": "Produit", + "Pushing app...": "En cours de t\u00e9l\u00e9versement des Applications ....", + "RAM": "RAM", + "ROM": "ROM", + "Ready": "Pr\u00eat", + "Reconnected successfully.": "Reconnexions r\u00e9ussis", + "Refresh": "Rafra\u00eechir", + "Released": "Version\u00e9e", + "Reload": "Recharger", + "Remote debug": "D\u00e9bogage \u00e0 distance", + "Remove": "Enlever", + "Reset": "R\u00e9initialiser", + "Reset Settings": "R\u00e9initialiser les param\u00e8tres", + "Reset all browser settings": "R\u00e9initialiser tous les param\u00e8tres des navigateurs", + "Restart Device": "Red\u00e9marrer le Terminal", + "Retrieving the device screen has timed out.": "La r\u00e9cup\u00e9ration de l'\u00e9cran de l'appareil a expir\u00e9.", + "Retry": "Recommencer", + "Rewind": "Rembobiner", + "Roaming": "Roaming", + "Rotate Left": "Tourner vers la gauche", + "Rotate Right": "Tourner vers la droite", + "Run": "Ex\u00e9cuter", + "Run JavaScript": "Ex\u00e9cuter JavaScript", + "Run the following on your command line to debug the device from your Browser": "Ex\u00e9cutez la commande suivante sur la ligne de commande pour d\u00e9boguer le p\u00e9riph\u00e9rique de votre navigateur", + "Run the following on your command line to debug the device from your IDE": "Ex\u00e9cutez la commande suivante sur la ligne de commande pour d\u00e9boguer le p\u00e9riph\u00e9rique de votre IDE", + "Run this command to copy the key to your clipboard": "Ex\u00e9cutez cette commande pour copier la clef de votre presse-papier", + "SD Card Mounted": "Carte SD Mont\u00e9", + "SDK": "SDK", + "SIM": "SIM", + "Save ScreenShot": "Sauver la capture d'\u00e9cran", + "Save...": "Sauvegarde ...", + "Screen": "\u00e9cran", + "Screenshot": "Capture d'\u00e9cran", + "Screenshots": "Captures d'\u00e9cran", + "Search": "Rechercher", + "Secure": "Prot\u00e9ger", + "Selects Next IME": "S\u00e9lectionner le prochain IME", + "Serial": "S\u00e9riel", + "Server": "Serveur", + "Server error. Check log output.": "Erreur Serveur. V\u00e9rifier les logs de sortie.", + "Set": "Param\u00e9trer", + "Set Cookie": "Param\u00e9trer le Cookie", + "Settings": "Param\u00e8tres", + "Shell": "Shell", + "Show Screen": "Afficher l'\u00e9cran", + "Sign In": "S'enregistrer", + "Sign Out": "Se d\u00e9connecter", + "Silent Mode": "Mode Silencieux", + "Size": "Taille", + "Socket connection was lost": "La connexion au Socket a \u00e9t\u00e9 perdu", + "Someone stole your device.": "Quelqu'un a vol\u00e9 votre terminal.", + "Special Keys": "Clefs sp\u00e9ciales", + "Start/Stop Logging": "D\u00e9marrer/Arr\u00eater les logs", + "Status": "Statut", + "Stop": "Arr\u00eater", + "Stop Automation": "Arr\u00eater l'automatisation", + "Stop Using": "Cesser d'utiliser", + "Store Account": "Compte du Store", + "Sub Type": "Sous Type", + "Switch Charset": "Permuter le Charset", + "TID": "TID", + "Tag": "\u00e9tiquette", + "Take Pageshot (Needs WebView running)": "Prendre une Prise de vue de la page (besoin de WebView)", + "Take Screenshot": "Prendre une Capture d'\u00e9cran", + "Temperature": "Temp\u00e9rature", + "Text": "Texte", + "The URI passed in is invalid.": "L'URI transmise n'est pas invalide.", + "The current view is marked secure and cannot be viewed remotely.": "La vue actuelle est marqu\u00e9 s\u00e9curis\u00e9 et ne peut \u00eatre consult\u00e9 \u00e0 distance.", + "The device will be unavailable for a moment.": "Le terminal ne sera pas disponible pour un moment", + "The existing package could not be deleted.": "Le package existant ne peut pas \u00eatre supprim\u00e9.", + "The new package couldn't be installed because the verification did not succeed.": "Le nouveau paquet n'a pas pu \u00eatre install\u00e9 car la v\u00e9rification n'a pas r\u00e9ussi.", + "The new package couldn't be installed because the verification timed out.": "Le nouveau paquet n'a pas pu \u00eatre install\u00e9 car la v\u00e9rification a expir\u00e9.", + "The new package couldn't be installed in the specified install location because the media is not available.": "Le nouveau paquet n'a pas pu \u00eatre install\u00e9 \u00e0 l'emplacement sp\u00e9cifi\u00e9 pour l'installation parce que les m\u00e9dias ne sont pas disponibles.", + "The new package couldn't be installed in the specified install location.": "Le nouveau paquet n'a pas pu \u00eatre install\u00e9 \u00e0 l'emplacement sp\u00e9cifi\u00e9 pour installation.", + "The new package failed because it contains a content provider with thesame authority as a provider already installed in the system.": "Le nouveau paquet a \u00e9chou\u00e9 car it contient un fournisseur de contenu avec la m\u00eame autorit\u00e9 en tant que fournisseur d\u00e9j\u00e0 install\u00e9 dans le syst\u00e8me.", + "The new package failed because it has specified that it is a test-only package and the caller has not supplied the INSTALL_ALLOW_TEST flag.": "Le nouveau paquet a \u00e9chou\u00e9 car il a pr\u00e9cis\u00e9 qu'il est un paquet de test uniquement et l'appelant n'a pas fourni le drapeau INSTALL_ALLOW_TEST.", + "The new package failed because the current SDK version is newer than that required by the package.": "Le nouveau paquet a \u00e9chou\u00e9 parce que la version actuelle du SDK est plus r\u00e9cente que celle requise par le paquet.", + "The new package failed because the current SDK version is older than that required by the package.": "Le nouveau paquet a \u00e9chou\u00e9 parce que la version actuelle du SDK est plus ancienne que celle requise par le paquet.", + "The new package failed while optimizing and validating its dex files, either because there was not enough storage or the validation failed.": "Le nouveau paquet a \u00e9chou\u00e9 lors de l'optimisation et l'\u00e9valuation de ses fichiers dex, soit parce qu'il n'y avait pas assez de stockage ou la validation a \u00e9chou\u00e9.", + "The new package has an older version code than the currently installed package.": "Le nouveau paquet a un code de version plus ancien que le paquet actuellement install\u00e9.", + "The new package is assigned a different UID than it previously held.": "Le nouveau paquet est affect\u00e9 un ID diff\u00e9rent qu'il d\u00e9tenait auparavant.", + "The new package uses a feature that is not available.": "Le nouveau paquet utilise une fonctionnalit\u00e9 qui n'est pas disponible.", + "The new package uses a shared library that is not available.": "Le nouveau paquet utilise une biblioth\u00e8que partag\u00e9e qui n'est pas disponible.", + "The package archive file is invalid.": "Le fichier d'archive de paquet est invalide.", + "The package being installed contains native code, but none that is compatible with the device's CPU_ABI.": "Le package install\u00e9 contient du code natif, mais aucun qui soit compatible avec le CPU_ABI du terminal.", + "The package changed from what the calling program expected.": "Le paquet a chang\u00e9 de ce que le programme appelant avait pr\u00e9vu.", + "The package is already installed.": "Le paquet est d\u00e9j\u00e0 install\u00e9", + "The package manager service found that the device didn't have enough storage space to install the app.": "Le service de gestionnaire de paquets a constat\u00e9 que le terminal ne dispose pas de suffisamment d'espace de stockage pour installer l'application.", + "The parser did not find any actionable tags (instrumentation or application) in the manifest.": "L'analyseur n'a pas trouv\u00e9 toutes les tags actionnables (de l'instrumentation et des applications) dans le manifest.", + "The parser did not find any certificates in the .apk.": "L'analyseur n'a pas trouv\u00e9 de certificat dans le fichier .apk.", + "The parser encountered a CertificateEncodingException in one of the files in the .apk.": "L'analyseur a rencontr\u00e9 une CertificateEncodingException dans l'un des fichiers de l'apk.", + "The parser encountered a bad or missing package name in the manifest.": "L'analyseur a rencontr\u00e9 un mauvais ou manquant nom du paquet dans le manifest.", + "The parser encountered a bad shared user id name in the manifest.": "L'analyseur a rencontr\u00e9 un mauvais nom d'utilisateur partag\u00e9 dans le manifest.", + "The parser encountered an unexpected exception.": "L'analyseur a rencontr\u00e9 une exception inattendue.", + "The parser encountered some structural problem in the manifest.": "L'analyseur a rencontr\u00e9 un probl\u00e8me structurel dans le manifest.", + "The parser found inconsistent certificates on the files in the .apk.": "L'analyseur a trouv\u00e9 des certificats contradictoires sur les fichiers de l'apk.", + "The parser was given a path that is not a file, or does not end with the expected '.apk' extension.": "L'analyseur a donn\u00e9 un chemin qui n'est pas un fichier, ou ne se termine pas avec le \".apk\" extension attendue.", + "The parser was unable to retrieve the AndroidManifest.xml file.": "L'analyseur n'a pas pu extraire le fichier AndroidManifest.xml.", + "The requested shared user does not exist.": "L'utilisateur requ\u00eat\u00e9 partag\u00e9 n'existe pas.", + "The system failed to install the package because its packaged native code did not match any of the ABIs supported by the system.": "Le syst\u00e8me n'a pas r\u00e9ussi \u00e0 installer le paquet parce que son code natif emball\u00e9 ne correspond \u00e0 aucune ABI support\u00e9 par le syst\u00e8me.", + "The system failed to install the package because of system issues.": "Le syst\u00e8me n'a pas r\u00e9ussi \u00e0 installer le paquet en raison de probl\u00e8mes du syst\u00e8me.", + "The system failed to install the package because the user is restricted from installing apps.": "Le syst\u00e8me n'a pas r\u00e9ussi \u00e0 installer le paquet parce que l'utilisateur est limit\u00e9 \u00e0 partir de l'installation d'applications.", + "Time": "Temps", + "Tip:": "Astuce:", + "Title": "Titre", + "Toggle Web/Native": "Basculer de Web/Natif", + "Total Devices": "Nombre total de Terminaux", + "Try to reconnect": "Essayer de se reconnecter", + "Type": "Type", + "USB": "USB", + "Unauthorized": "Non Autoris\u00e9", + "Uninstall": "D\u00e9sinstaller", + "Unknown": "Inconnu", + "Unknown reason.": "Raison inconnue.", + "Unlock Rotation": "D\u00e9bloquer la Rotation", + "Unspecified Failure": "D\u00e9faillance non sp\u00e9cifi\u00e9e", + "Upload From Link": "T\u00e9l\u00e9verser depuis le Lien", + "Upload failed": "T\u00e9l\u00e9versement rat\u00e9", + "Upload unknown error": "Erreur inconnue lors du T\u00e9l\u00e9versement", + "Uploaded file is not valid": "Le fichier t\u00e9l\u00e9vers\u00e9 n'est pas valide", + "Uploading...": "En cours de t\u00e9l\u00e9versement ...", + "Usable Devices": "Terminaux utilisables", + "Usb speed": "Vitesse USB", + "Use": "Utiliser", + "User": "Utilisateur", + "Username": "Nom de l'utilisateur", + "Using": "En Utilisation", + "Using Fallback": "Reprise de l'Utilisation", + "VNC": "VNC", + "Value": "Valeur", + "Version": "Version", + "Version Update": "Version de la mise \u00e0 jour", + "Vibrate Mode": "Mode Vibration", + "Voltage": "Tension", + "Volume": "Volume", + "Volume Down": "Baisser le Volume", + "Volume Up": "Augmenter le Volume", + "Warning:": "Avertissement:", + "Web": "Web", + "WiFi": "Wifi", + "WiMAX": "WiMax", + "Width": "Largeur", + "Wireless": "Sans Fil", + "X DPI": "X DPI", + "Y DPI": "Y DPI", + "Yes": "Oui", + "You (or someone else) kicked the device.": "Vous (ou quelqu'un d'autre) a exclu le Terminal.", + "translate": "Traduire" + } +} diff --git a/res/common/lang/translations/stf.ja.json b/res/common/lang/translations/stf.ja.json index 08754d1dc..ace5fe4d8 100644 --- a/res/common/lang/translations/stf.ja.json +++ b/res/common/lang/translations/stf.ja.json @@ -1 +1,331 @@ -{"ja":{"-":"-","A new version of STF is available":"STFの新しいバージョンがリリースされました","ABI":"ABI","AC":"AC","Access Tokens":"アクセストークン","Account":"アカウント","Action":"アクション","Actions":"アクション","Activity":"アクティビティ","ADB Keys":"ADBキー","Add":"追加","Add ADB Key":"ADBキーを追加","Add Key":"キー追加","Add the following ADB Key to STF?":"STFに下記のADBキーを追加しますか?","Admin mode has been disabled.":"管理モードは無効になりました。","Admin mode has been enabled.":"管理モードは有効になりました。","Advanced":"高度機能","Advanced Input":"高度な入力","Airplane Mode":"機内モード","App Store":"アプリストア","App Upload":"アプリアップロード","Apps":"アプリ","Are you sure you want to reboot this device?":"この端末を再起動しますか?","Automation":"自動化","Available":"利用可能","Back":"戻る","Battery":"バッテリー","Battery Health":"バッテリー健康状態","Battery Level":"バッテリーレベル","Battery Source":"バッテリー電力源","Battery Status":"バッテリー状態","Battery Temp":"バッテリー温度","Bluetooth":"Bluetooth","Browser":"ブラウザ","Busy":"貸し出し中","Busy Devices":"貸出し中","Camera":"カメラ","Cancel":"キャンセル","Cannot access specified URL":"指定されたURLはアクセスできません","Carrier":"キャリア","Category":"カテゴリー","Charging":"充電中","Check errors below":"下記エラーがありました","Clear":"クリア","Clipboard":"クリップボード","Cold":"コールド","Connected":"接続中","Connected successfully.":"接続できました。","Control":"リモート操作","Cookies":"クッキー","Cores":"コア数","CPU":"CPU","Customize":"カスタマイズ","D-pad Center":"D-padセンター","D-pad Down":"D-pad下","D-pad Left":"D-pad左","D-pad Right":"D-pad右","D-pad Up":"D-pad上","Dashboard":"ダッシュボード","Data":"データ","Date":"日付","Dead":"残量なし","Delete":"削除","Density":"表示密度","Details":"詳細","Developer":"開発者","Device":"デバイス","Device cannot get kicked from the group":"このデバイスはグループからキックできません。","Device is not present anymore for some reason.":"実機が見えなくなりました。","Device is present but offline.":"デバイスは接続されているが、オフラインになっています。","Device Photo":"実機写真","Device Settings":"実機設定","Device was disconnected":"デバイスへの接続が切れました","Device was kicked by automatic timeout.":"デバイスは自動タイムアウトにより切断されました。","Devices":"端末リスト","Disable WiFi":"無線LANを無効にする","Discharging":"放電中","Disconnected":"切断中","Display":"ディスプレー","Drop file to upload":"ここにファイルをドロップ","Dummy":"ダミー","Enable notifications":"通知を有効にする","Enable WiFi":"無線LANを有効にする","Encrypted":"暗号化","Error":"エラー","Error while getting data":"データ取得中にエラーが発生しました。","Error while reconnecting":"再接続時にエラーが発生しました","Ethernet":"イーサーネット","Executes remote shell commands":"リモートシェルコマンドを実行する","Failed to download file":"ファイルのダウンロードが失敗しした。","Fast Forward":"早送り","File Explorer":"エクスプローラー","File Name":"ファイル名","Filter":"フィルター","Find Device":"実機を探す","Fingerprint":"指紋","FPS":"FPS","Frequency":"クロック","Full":"フル","General":"一般","Generate Access Token":"アクセストークン生成","Generate Login for VNC":"VNC用にログイン情報生成","Generate New Token":"新規トークン生成","Get":"取得","Get clipboard contents":"クリップボードの中身を取得する","Go Back":"戻る","Go Forward":"進む","Go to Device List":"端末リストへ","Good":"良い","Hardware":"ハードウェア","Health":"健康状態","Height":"高さ","Help":"ヘルプ","Hide Screen":"画面を非表しない","Home":"ホーム","Host":"ホスト","Hostname":"ホスト名","ICCID":"ICCID","ID":"ID","IMEI":"IMEI","Incorrect login details":"不正ログイン情報","Info":"情報","Inspect Device":"端末の要素検証","Inspecting is currently only supported in WebView":"要素の検証機能は、現在WebViewのみ対応","Inspector":"要素の検証","Installation canceled by user.":"インストールはユーザーによってキャンセルされました。","Installation failed due to an unknown error.":"インストールが未知のエラーで失敗しました。","Installation succeeded.":"インストールが完了しました。","Installation timed out.":"インストールがタイムアウトしました。","Installing app...":"アプリをインストール中...","Key":"キー","Keys":"認証キー","Landscape":"横","Language":"言語","Launch Activity":"アクティビティを起動する","Launching activity...":"アクティビティを起動中...","Level":"レベル","Local Settings":"ローカル設定","Location":"場所","Lock Rotation":"回転ロック","Logs":"ログ","Maintenance":"メンテナンス","Manage Apps":"アプリ管理","Manner Mode":"マナーモード","Manufacturer":"メーカー","Media":"メディア","Memory":"メモリー","Menu":"メニュー","Mobile":"モバイル","Mobile DUN":"モバイルDUN","Mobile High Priority":"モバイル最優先","Mobile MMS":"モバイルMMS","Mobile SUPL":"モバイルSUPL","Model":"機種名","More about Access Tokens":"アクセストークンについて","More about ADB Keys":"ADBキーについて","Mute":"音を消す","Name":"名称","Native":"Native","Navigation":"ブラウジング","Network":"ネットワーク","Next":"次","No":"いいえ","No access tokens":"アクセストークンはありません","No ADB keys":"ADBキーはありません","No clipboard data":"クリップボードデータはありません","No cookies to show":"クッキーはありません","No device screen":"画面が表示できません","No devices connected":"端末が接続されていません","No photo available":"写真はありません","No Ports Forwarded":"フォワードされたポートはありません","No screenshots taken":"キャプチャはありません","Normal Mode":"通常モード","Not Charging":"充電されていない","Notes":"注釈","Nothing to inspect":"要素の検証対象はありません","Notifications":"通知","Number":"番号","Offline":"オフライン","Oops!":"おっと!","Open":"開く","Orientation":"方向","OS":"OS","Over Voltage":"過電圧","Overheat":"過熱","Package":"パッケージ","Password":"パスワード","Permissions":"権限","Phone":"電話番号","Phone ICCID":"携帯ICCID","Phone IMEI":"携帯IMEI","Physical Device":"物理デバイス","PID":"PID","Place":"場所","Platform":"プラットホーム","Play/Pause":"再生/停止","Please enter a valid email":"有効なメールアドレスを入力してください","Please enter your email":"メールアドレスを入力してください","Please enter your LDAP username":"LDAPユーザー名を入力してください","Please enter your name":"お名前を入力してください","Please enter your password":"パスワードを入力してください","Please enter your Store password":"ストアのパスワードを入力してください","Please enter your Store username":"ストアのユーザ名を入力してください","Port":"ポート","Port Forwarding":"ポートフォワーディング","Portrait":"縦","Power":"電源","Power Source":"電力源","Preparing":"準備中","Press Back button":"戻るボタンを押す","Press Home button":"ホームボタンを押す","Press Menu button":"メニューボタンを押す","Previous":"前","Processing...":"処理中...","Product":"型番","Pushing app...":"アプリをプッシュ中...","RAM":"RAM","Ready":"利用可能","Reconnected successfully.":"正常に再接続しました。","Refresh":"更新","Released":"発売日","Reload":"再読込","Remote debug":"リモートデバッグ","Remove":"削除","Reset":"初期化","Reset all browser settings":"ブラウザの設定をリセットする","Reset Settings":"すべての設定をリセット","Restart Device":"端末を再起動","Retrieving the device screen has timed out.":"実機画面の取得はタイムアウトになりました。","Retry":"再試行","Rewind":"巻き戻す","Roaming":"ローミング","ROM":"ROM","Rotate Left":"左回りに回転","Rotate Right":"右回りに回転","Run":"実行","Run JavaScript":"JavaScript注入","Run the following on your command line to debug the device from your Browser":"次のコマンドをコマンドラインで実行しますと、お使いのブラウザより端末のデバッグができます。","Run the following on your command line to debug the device from your IDE":"次のコマンドをコマンドラインで実行しますと、お使いのIDEより端末のデバッグができます。","Run this command to copy the key to your clipboard":"次のコマンドを実行しますと、キーがコピーされます","Sample of log format":"ログ形式のサンプル","Save Logs":"ログを保存する","Save ScreenShot":"スクリーンショットを保存する","Save...":"保存する...","Screen":"解像度","Screenshot":"キャプチャ","Screenshots":"キャプチャ","SD Card Mounted":"SDカード","SDK":"SDK","Search":"検索","Selects Next IME":"入力モードの切り替え","Serial":"シリアル","Server":"サーバー","Server error. Check log output.":"サーバーエラー。ログを確認してください。","Set":"設定","Set Cookie":"クッキー設定","Settings":"設定","Shell":"シェル","Show Screen":"画面を表示する","Sign In":"サインイン","Sign Out":"サインアウト","Silent Mode":"マナーモード","SIM":"SIM","Size":"サイズ","Socket connection was lost":"ソケットへの接続が切れました","Someone stole your device.":"誰かはデバイスを盗みました。","Special Keys":"特別なキー","Start/Stop Logging":"ログ取得の開始/停止","Status":"ステータス","Stop":"停止","Stop Using":"停止する","Store Account":"ストアアカウント","Sub Type":"サブタイプ","Switch Charset":"文字入力の切り替え","Tag":"タグ","Take Pageshot (Needs WebView running)":"ページ全体ショットを撮る(現在はWebViewのみ対応)","Take Screenshot":"スクリーンショットを撮る","Temperature":"温度","Text":"テキスト","The device will be unavailable for a moment.":"しばらく端末が利用できなくなります。","The existing package could not be deleted.":"既存のパッケージは削除できませんでした。","The URI passed in is invalid.":"渡されたURIは無効です。","TID":"TID","Time":"時刻","Tip:":"ヒント:","Title":"タイトル","Toggle Web/Native":"ウェブ/ネイティブを選択","Total Devices":"全機種","Try to reconnect":"再接続する","Type":"タイプ","Unauthorized":"権限外","Uninstall":"削除","Unknown":"未知","Unknown reason.":"未知。","Unlock Rotation":"回転アンロック","Unspecified Failure":"未定義の失敗","Upload failed":"アップロードが失敗しました","Upload From Link":"リンク先よりアップロードする","Upload unknown error":"アップロード未知エラー","Uploaded file is not valid":"アップロードされたファイル","Uploading...":"アップロード中...","Usable Devices":"利用可能","USB":"USB","Usb speed":"USB速度","Use":"利用する","User":"ユーザ","Username":"ユーザ名","Using":"利用中","Using Fallback":"フォールバックを使用中","Version":"バージョン","Version Update":"バージョンアップ","Vibrate Mode":"マナーモード(バイブON)","VNC":"VNC","Voltage":"電圧","Volume":"音量","Volume Down":"音量↓","Volume Up":"音量↑","Warning:":"注意:","Web":"Web","Width":"幅","WiFi":"無線LAN","WiMAX":"WiMAX","Wireless":"無線","X DPI":"X DPI","Y DPI":"Y DPI","Yes":"はい","You (or someone else) kicked the device.":"この実機はキックされました。"}} \ No newline at end of file +{ + "ja": { + "-": "-", + "A new version of STF is available": "STF\u306e\u65b0\u3057\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u307e\u3057\u305f", + "ABI": "ABI", + "AC": "AC", + "Access Tokens": "\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3", + "Account": "\u30a2\u30ab\u30a6\u30f3\u30c8", + "Action": "\u30a2\u30af\u30b7\u30e7\u30f3", + "Actions": "\u30a2\u30af\u30b7\u30e7\u30f3", + "Activity": "\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3", + "ADB Keys": "ADB\u30ad\u30fc", + "Add": "\u8ffd\u52a0", + "Add ADB Key": "ADB\u30ad\u30fc\u3092\u8ffd\u52a0", + "Add Key": "\u30ad\u30fc\u8ffd\u52a0", + "Add the following ADB Key to STF?": "STF\u306b\u4e0b\u8a18\u306eADB\u30ad\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059\u304b\uff1f", + "Admin mode has been disabled.": "\u7ba1\u7406\u30e2\u30fc\u30c9\u306f\u7121\u52b9\u306b\u306a\u308a\u307e\u3057\u305f\u3002", + "Admin mode has been enabled.": "\u7ba1\u7406\u30e2\u30fc\u30c9\u306f\u6709\u52b9\u306b\u306a\u308a\u307e\u3057\u305f\u3002", + "Advanced": "\u9ad8\u5ea6\u6a5f\u80fd", + "Advanced Input": "\u9ad8\u5ea6\u306a\u5165\u529b", + "Airplane Mode": "\u6a5f\u5185\u30e2\u30fc\u30c9", + "App Store": "\u30a2\u30d7\u30ea\u30b9\u30c8\u30a2", + "App Upload": "\u30a2\u30d7\u30ea\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9", + "Apps": "\u30a2\u30d7\u30ea", + "Are you sure you want to reboot this device?": "\u3053\u306e\u7aef\u672b\u3092\u518d\u8d77\u52d5\u3057\u307e\u3059\u304b\uff1f", + "Automation": "\u81ea\u52d5\u5316", + "Available": "\u5229\u7528\u53ef\u80fd", + "Back": "\u623b\u308b", + "Battery": "\u30d0\u30c3\u30c6\u30ea\u30fc", + "Battery Health": "\u30d0\u30c3\u30c6\u30ea\u30fc\u5065\u5eb7\u72b6\u614b", + "Battery Level": "\u30d0\u30c3\u30c6\u30ea\u30fc\u30ec\u30d9\u30eb", + "Battery Source": "\u30d0\u30c3\u30c6\u30ea\u30fc\u96fb\u529b\u6e90", + "Battery Status": "\u30d0\u30c3\u30c6\u30ea\u30fc\u72b6\u614b", + "Battery Temp": "\u30d0\u30c3\u30c6\u30ea\u30fc\u6e29\u5ea6", + "Bluetooth": "Bluetooth", + "Browser": "\u30d6\u30e9\u30a6\u30b6", + "Busy": "\u8cb8\u3057\u51fa\u3057\u4e2d", + "Busy Devices": "\u8cb8\u51fa\u3057\u4e2d", + "Camera": "\u30ab\u30e1\u30e9", + "Cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb", + "Cannot access specified URL": "\u6307\u5b9a\u3055\u308c\u305fURL\u306f\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u305b\u3093", + "Carrier": "\u30ad\u30e3\u30ea\u30a2", + "Category": "\u30ab\u30c6\u30b4\u30ea\u30fc", + "Charging": "\u5145\u96fb\u4e2d", + "Check errors below": "\u4e0b\u8a18\u30a8\u30e9\u30fc\u304c\u3042\u308a\u307e\u3057\u305f", + "Clear": "\u30af\u30ea\u30a2", + "Clipboard": "\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9", + "Cold": "\u30b3\u30fc\u30eb\u30c9", + "Connected": "\u63a5\u7d9a\u4e2d", + "Connected successfully.": "\u63a5\u7d9a\u3067\u304d\u307e\u3057\u305f\u3002", + "Control": "\u30ea\u30e2\u30fc\u30c8\u64cd\u4f5c", + "Cookies": "\u30af\u30c3\u30ad\u30fc", + "Cores": "\u30b3\u30a2\u6570", + "CPU": "CPU", + "Customize": "\u30ab\u30b9\u30bf\u30de\u30a4\u30ba", + "D-pad Center": "D-pad\u30bb\u30f3\u30bf\u30fc", + "D-pad Down": "D-pad\u4e0b", + "D-pad Left": "D-pad\u5de6", + "D-pad Right": "D-pad\u53f3", + "D-pad Up": "D-pad\u4e0a", + "Dashboard": "\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9", + "Data": "\u30c7\u30fc\u30bf", + "Date": "\u65e5\u4ed8", + "Dead": "\u6b8b\u91cf\u306a\u3057", + "Delete": "\u524a\u9664", + "Density": "\u8868\u793a\u5bc6\u5ea6", + "Details": "\u8a73\u7d30", + "Developer": "\u958b\u767a\u8005", + "Device": "\u30c7\u30d0\u30a4\u30b9", + "Device cannot get kicked from the group": "\u3053\u306e\u30c7\u30d0\u30a4\u30b9\u306f\u30b0\u30eb\u30fc\u30d7\u304b\u3089\u30ad\u30c3\u30af\u3067\u304d\u307e\u305b\u3093\u3002", + "Device is not present anymore for some reason.": "\u5b9f\u6a5f\u304c\u898b\u3048\u306a\u304f\u306a\u308a\u307e\u3057\u305f\u3002", + "Device is present but offline.": "\u30c7\u30d0\u30a4\u30b9\u306f\u63a5\u7d9a\u3055\u308c\u3066\u3044\u308b\u304c\u3001\u30aa\u30d5\u30e9\u30a4\u30f3\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002", + "Device Photo": "\u5b9f\u6a5f\u5199\u771f", + "Device Settings": "\u5b9f\u6a5f\u8a2d\u5b9a", + "Device was disconnected": "\u30c7\u30d0\u30a4\u30b9\u3078\u306e\u63a5\u7d9a\u304c\u5207\u308c\u307e\u3057\u305f", + "Device was kicked by automatic timeout.": "\u30c7\u30d0\u30a4\u30b9\u306f\u81ea\u52d5\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u306b\u3088\u308a\u5207\u65ad\u3055\u308c\u307e\u3057\u305f\u3002", + "Devices": "\u7aef\u672b\u30ea\u30b9\u30c8", + "Disable WiFi": "\u7121\u7ddaLAN\u3092\u7121\u52b9\u306b\u3059\u308b", + "Discharging": "\u653e\u96fb\u4e2d", + "Disconnected": "\u5207\u65ad\u4e2d", + "Display": "\u30c7\u30a3\u30b9\u30d7\u30ec\u30fc", + "Drop file to upload": "\u3053\u3053\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u30c9\u30ed\u30c3\u30d7", + "Dummy": "\u30c0\u30df\u30fc", + "Enable notifications": "\u901a\u77e5\u3092\u6709\u52b9\u306b\u3059\u308b", + "Enable WiFi": "\u7121\u7ddaLAN\u3092\u6709\u52b9\u306b\u3059\u308b", + "Encrypted": "\u6697\u53f7\u5316", + "Error": "\u30a8\u30e9\u30fc", + "Error while getting data": "\u30c7\u30fc\u30bf\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002", + "Error while reconnecting": "\u518d\u63a5\u7d9a\u6642\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f", + "Ethernet": "\u30a4\u30fc\u30b5\u30fc\u30cd\u30c3\u30c8", + "Executes remote shell commands": "\u30ea\u30e2\u30fc\u30c8\u30b7\u30a7\u30eb\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b", + "Failed to download file": "\u30d5\u30a1\u30a4\u30eb\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u304c\u5931\u6557\u3057\u3057\u305f\u3002", + "Fast Forward": "\u65e9\u9001\u308a", + "File Explorer": "\u30a8\u30af\u30b9\u30d7\u30ed\u30fc\u30e9\u30fc", + "File Name": "\u30d5\u30a1\u30a4\u30eb\u540d", + "Filter": "\u30d5\u30a3\u30eb\u30bf\u30fc", + "Find Device": "\u5b9f\u6a5f\u3092\u63a2\u3059", + "Fingerprint": "\u6307\u7d0b", + "FPS": "FPS", + "Frequency": "\u30af\u30ed\u30c3\u30af", + "Full": "\u30d5\u30eb", + "General": "\u4e00\u822c", + "Generate Access Token": "\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u751f\u6210", + "Generate Login for VNC": "VNC\u7528\u306b\u30ed\u30b0\u30a4\u30f3\u60c5\u5831\u751f\u6210", + "Generate New Token": "\u65b0\u898f\u30c8\u30fc\u30af\u30f3\u751f\u6210", + "Get": "\u53d6\u5f97", + "Get clipboard contents": "\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306e\u4e2d\u8eab\u3092\u53d6\u5f97\u3059\u308b", + "Go Back": "\u623b\u308b", + "Go Forward": "\u9032\u3080", + "Go to Device List": "\u7aef\u672b\u30ea\u30b9\u30c8\u3078", + "Good": "\u826f\u3044", + "Hardware": "\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2", + "Health": "\u5065\u5eb7\u72b6\u614b", + "Height": "\u9ad8\u3055", + "Help": "\u30d8\u30eb\u30d7", + "Hide Screen": "\u753b\u9762\u3092\u975e\u8868\u3057\u306a\u3044", + "Home": "\u30db\u30fc\u30e0", + "Host": "\u30db\u30b9\u30c8", + "Hostname": "\u30db\u30b9\u30c8\u540d", + "ICCID": "ICCID", + "ID": "ID", + "IMEI": "IMEI", + "Incorrect login details": "\u4e0d\u6b63\u30ed\u30b0\u30a4\u30f3\u60c5\u5831", + "Info": "\u60c5\u5831", + "Inspect Device": "\u7aef\u672b\u306e\u8981\u7d20\u691c\u8a3c", + "Inspecting is currently only supported in WebView": "\u8981\u7d20\u306e\u691c\u8a3c\u6a5f\u80fd\u306f\u3001\u73fe\u5728WebView\u306e\u307f\u5bfe\u5fdc", + "Inspector": "\u8981\u7d20\u306e\u691c\u8a3c", + "Installation canceled by user.": "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306f\u30e6\u30fc\u30b6\u30fc\u306b\u3088\u3063\u3066\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002", + "Installation failed due to an unknown error.": "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u304c\u672a\u77e5\u306e\u30a8\u30e9\u30fc\u3067\u5931\u6557\u3057\u307e\u3057\u305f\u3002", + "Installation succeeded.": "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002", + "Installation timed out.": "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u304c\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3057\u307e\u3057\u305f\u3002", + "Installing app...": "\u30a2\u30d7\u30ea\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u4e2d...", + "Key": "\u30ad\u30fc", + "Keys": "\u8a8d\u8a3c\u30ad\u30fc", + "Landscape": "\u6a2a", + "Language": "\u8a00\u8a9e", + "Launch Activity": "\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u3092\u8d77\u52d5\u3059\u308b", + "Launching activity...": "\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u3092\u8d77\u52d5\u4e2d...", + "Level": "\u30ec\u30d9\u30eb", + "Local Settings": "\u30ed\u30fc\u30ab\u30eb\u8a2d\u5b9a", + "Location": "\u5834\u6240", + "Lock Rotation": "\u56de\u8ee2\u30ed\u30c3\u30af", + "Logs": "\u30ed\u30b0", + "Maintenance": "\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9", + "Manage Apps": "\u30a2\u30d7\u30ea\u7ba1\u7406", + "Manner Mode": "\u30de\u30ca\u30fc\u30e2\u30fc\u30c9", + "Manufacturer": "\u30e1\u30fc\u30ab\u30fc", + "Media": "\u30e1\u30c7\u30a3\u30a2", + "Memory": "\u30e1\u30e2\u30ea\u30fc", + "Menu": "\u30e1\u30cb\u30e5\u30fc", + "Mobile": "\u30e2\u30d0\u30a4\u30eb", + "Mobile DUN": "\u30e2\u30d0\u30a4\u30ebDUN", + "Mobile High Priority": "\u30e2\u30d0\u30a4\u30eb\u6700\u512a\u5148", + "Mobile MMS": "\u30e2\u30d0\u30a4\u30ebMMS", + "Mobile SUPL": "\u30e2\u30d0\u30a4\u30ebSUPL", + "Model": "\u6a5f\u7a2e\u540d", + "More about Access Tokens": "\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u306b\u3064\u3044\u3066", + "More about ADB Keys": "ADB\u30ad\u30fc\u306b\u3064\u3044\u3066", + "Mute": "\u97f3\u3092\u6d88\u3059", + "Name": "\u540d\u79f0", + "Native": "Native", + "Navigation": "\u30d6\u30e9\u30a6\u30b8\u30f3\u30b0", + "Network": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af", + "Next": "\u6b21", + "No": "\u3044\u3044\u3048", + "No access tokens": "\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u306f\u3042\u308a\u307e\u305b\u3093", + "No ADB keys": "ADB\u30ad\u30fc\u306f\u3042\u308a\u307e\u305b\u3093", + "No clipboard data": "\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u30c7\u30fc\u30bf\u306f\u3042\u308a\u307e\u305b\u3093", + "No cookies to show": "\u30af\u30c3\u30ad\u30fc\u306f\u3042\u308a\u307e\u305b\u3093", + "No device screen": "\u753b\u9762\u304c\u8868\u793a\u3067\u304d\u307e\u305b\u3093", + "No devices connected": "\u7aef\u672b\u304c\u63a5\u7d9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093", + "No photo available": "\u5199\u771f\u306f\u3042\u308a\u307e\u305b\u3093", + "No Ports Forwarded": "\u30d5\u30a9\u30ef\u30fc\u30c9\u3055\u308c\u305f\u30dd\u30fc\u30c8\u306f\u3042\u308a\u307e\u305b\u3093", + "No screenshots taken": "\u30ad\u30e3\u30d7\u30c1\u30e3\u306f\u3042\u308a\u307e\u305b\u3093", + "Normal Mode": "\u901a\u5e38\u30e2\u30fc\u30c9", + "Not Charging": "\u5145\u96fb\u3055\u308c\u3066\u3044\u306a\u3044", + "Notes": "\u6ce8\u91c8", + "Nothing to inspect": "\u8981\u7d20\u306e\u691c\u8a3c\u5bfe\u8c61\u306f\u3042\u308a\u307e\u305b\u3093", + "Notifications": "\u901a\u77e5", + "Number": "\u756a\u53f7", + "Offline": "\u30aa\u30d5\u30e9\u30a4\u30f3", + "Oops!": "\u304a\u3063\u3068\uff01", + "Open": "\u958b\u304f", + "Orientation": "\u65b9\u5411", + "OS": "OS", + "Over Voltage": "\u904e\u96fb\u5727", + "Overheat": "\u904e\u71b1", + "Package": "\u30d1\u30c3\u30b1\u30fc\u30b8", + "Password": "\u30d1\u30b9\u30ef\u30fc\u30c9", + "Permissions": "\u6a29\u9650", + "Phone": "\u96fb\u8a71\u756a\u53f7", + "Phone ICCID": "\u643a\u5e2fICCID", + "Phone IMEI": "\u643a\u5e2fIMEI", + "Physical Device": "\u7269\u7406\u30c7\u30d0\u30a4\u30b9", + "PID": "PID", + "Place": "\u5834\u6240", + "Platform": "\u30d7\u30e9\u30c3\u30c8\u30db\u30fc\u30e0", + "Play/Pause": "\u518d\u751f/\u505c\u6b62", + "Please enter a valid email": "\u6709\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044", + "Please enter your email": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044", + "Please enter your LDAP username": "LDAP\u30e6\u30fc\u30b6\u30fc\u540d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044", + "Please enter your name": "\u304a\u540d\u524d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044", + "Please enter your password": "\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044", + "Please enter your Store password": "\u30b9\u30c8\u30a2\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044", + "Please enter your Store username": "\u30b9\u30c8\u30a2\u306e\u30e6\u30fc\u30b6\u540d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044", + "Port": "\u30dd\u30fc\u30c8", + "Port Forwarding": "\u30dd\u30fc\u30c8\u30d5\u30a9\u30ef\u30fc\u30c7\u30a3\u30f3\u30b0", + "Portrait": "\u7e26", + "Power": "\u96fb\u6e90", + "Power Source": "\u96fb\u529b\u6e90", + "Preparing": "\u6e96\u5099\u4e2d", + "Press Back button": "\u623b\u308b\u30dc\u30bf\u30f3\u3092\u62bc\u3059", + "Press Home button": "\u30db\u30fc\u30e0\u30dc\u30bf\u30f3\u3092\u62bc\u3059", + "Press Menu button": "\u30e1\u30cb\u30e5\u30fc\u30dc\u30bf\u30f3\u3092\u62bc\u3059", + "Previous": "\u524d", + "Processing...": "\u51e6\u7406\u4e2d...", + "Product": "\u578b\u756a", + "Pushing app...": "\u30a2\u30d7\u30ea\u3092\u30d7\u30c3\u30b7\u30e5\u4e2d...", + "RAM": "RAM", + "Ready": "\u5229\u7528\u53ef\u80fd", + "Reconnected successfully.": "\u6b63\u5e38\u306b\u518d\u63a5\u7d9a\u3057\u307e\u3057\u305f\u3002", + "Refresh": "\u66f4\u65b0", + "Released": "\u767a\u58f2\u65e5", + "Reload": "\u518d\u8aad\u8fbc", + "Remote debug": "\u30ea\u30e2\u30fc\u30c8\u30c7\u30d0\u30c3\u30b0", + "Remove": "\u524a\u9664", + "Reset": "\u521d\u671f\u5316", + "Reset all browser settings": "\u30d6\u30e9\u30a6\u30b6\u306e\u8a2d\u5b9a\u3092\u30ea\u30bb\u30c3\u30c8\u3059\u308b", + "Reset Settings": "\u3059\u3079\u3066\u306e\u8a2d\u5b9a\u3092\u30ea\u30bb\u30c3\u30c8", + "Restart Device": "\u7aef\u672b\u3092\u518d\u8d77\u52d5", + "Retrieving the device screen has timed out.": "\u5b9f\u6a5f\u753b\u9762\u306e\u53d6\u5f97\u306f\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u306b\u306a\u308a\u307e\u3057\u305f\u3002", + "Retry": "\u518d\u8a66\u884c", + "Rewind": "\u5dfb\u304d\u623b\u3059", + "Roaming": "\u30ed\u30fc\u30df\u30f3\u30b0", + "ROM": "ROM", + "Rotate Left": "\u5de6\u56de\u308a\u306b\u56de\u8ee2", + "Rotate Right": "\u53f3\u56de\u308a\u306b\u56de\u8ee2", + "Run": "\u5b9f\u884c", + "Run JavaScript": "JavaScript\u6ce8\u5165", + "Run the following on your command line to debug the device from your Browser": "\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u3067\u5b9f\u884c\u3057\u307e\u3059\u3068\u3001\u304a\u4f7f\u3044\u306e\u30d6\u30e9\u30a6\u30b6\u3088\u308a\u7aef\u672b\u306e\u30c7\u30d0\u30c3\u30b0\u304c\u3067\u304d\u307e\u3059\u3002", + "Run the following on your command line to debug the device from your IDE": "\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u3067\u5b9f\u884c\u3057\u307e\u3059\u3068\u3001\u304a\u4f7f\u3044\u306eIDE\u3088\u308a\u7aef\u672b\u306e\u30c7\u30d0\u30c3\u30b0\u304c\u3067\u304d\u307e\u3059\u3002", + "Run this command to copy the key to your clipboard": "\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u307e\u3059\u3068\u3001\u30ad\u30fc\u304c\u30b3\u30d4\u30fc\u3055\u308c\u307e\u3059", + "Sample of log format": "\u30ed\u30b0\u5f62\u5f0f\u306e\u30b5\u30f3\u30d7\u30eb", + "Save Logs": "\u30ed\u30b0\u3092\u4fdd\u5b58\u3059\u308b", + "Save ScreenShot": "\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u3092\u4fdd\u5b58\u3059\u308b", + "Save...": "\u4fdd\u5b58\u3059\u308b...", + "Screen": "\u89e3\u50cf\u5ea6", + "Screenshot": "\u30ad\u30e3\u30d7\u30c1\u30e3", + "Screenshots": "\u30ad\u30e3\u30d7\u30c1\u30e3", + "SD Card Mounted": "SD\u30ab\u30fc\u30c9", + "SDK": "SDK", + "Search": "\u691c\u7d22", + "Selects Next IME": "\u5165\u529b\u30e2\u30fc\u30c9\u306e\u5207\u308a\u66ff\u3048", + "Serial": "\u30b7\u30ea\u30a2\u30eb", + "Server": "\u30b5\u30fc\u30d0\u30fc", + "Server error. Check log output.": "\u30b5\u30fc\u30d0\u30fc\u30a8\u30e9\u30fc\u3002\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002", + "Set": "\u8a2d\u5b9a", + "Set Cookie": "\u30af\u30c3\u30ad\u30fc\u8a2d\u5b9a", + "Settings": "\u8a2d\u5b9a", + "Shell": "\u30b7\u30a7\u30eb", + "Show Screen": "\u753b\u9762\u3092\u8868\u793a\u3059\u308b", + "Sign In": "\u30b5\u30a4\u30f3\u30a4\u30f3", + "Sign Out": "\u30b5\u30a4\u30f3\u30a2\u30a6\u30c8", + "Silent Mode": "\u30de\u30ca\u30fc\u30e2\u30fc\u30c9", + "SIM": "SIM", + "Size": "\u30b5\u30a4\u30ba", + "Socket connection was lost": "\u30bd\u30b1\u30c3\u30c8\u3078\u306e\u63a5\u7d9a\u304c\u5207\u308c\u307e\u3057\u305f", + "Someone stole your device.": "\u8ab0\u304b\u306f\u30c7\u30d0\u30a4\u30b9\u3092\u76d7\u307f\u307e\u3057\u305f\u3002", + "Special Keys": "\u7279\u5225\u306a\u30ad\u30fc", + "Start/Stop Logging": "\u30ed\u30b0\u53d6\u5f97\u306e\u958b\u59cb\uff0f\u505c\u6b62", + "Status": "\u30b9\u30c6\u30fc\u30bf\u30b9", + "Stop": "\u505c\u6b62", + "Stop Using": "\u505c\u6b62\u3059\u308b", + "Store Account": "\u30b9\u30c8\u30a2\u30a2\u30ab\u30a6\u30f3\u30c8", + "Sub Type": "\u30b5\u30d6\u30bf\u30a4\u30d7", + "Switch Charset": "\u6587\u5b57\u5165\u529b\u306e\u5207\u308a\u66ff\u3048", + "Tag": "\u30bf\u30b0", + "Take Pageshot (Needs WebView running)": "\u30da\u30fc\u30b8\u5168\u4f53\u30b7\u30e7\u30c3\u30c8\u3092\u64ae\u308b\uff08\u73fe\u5728\u306fWebView\u306e\u307f\u5bfe\u5fdc\uff09", + "Take Screenshot": "\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u3092\u64ae\u308b", + "Temperature": "\u6e29\u5ea6", + "Text": "\u30c6\u30ad\u30b9\u30c8", + "The device will be unavailable for a moment.": "\u3057\u3070\u3089\u304f\u7aef\u672b\u304c\u5229\u7528\u3067\u304d\u306a\u304f\u306a\u308a\u307e\u3059\u3002", + "The existing package could not be deleted.": "\u65e2\u5b58\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u306f\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002", + "The URI passed in is invalid.": "\u6e21\u3055\u308c\u305fURI\u306f\u7121\u52b9\u3067\u3059\u3002", + "TID": "TID", + "Time": "\u6642\u523b", + "Tip:": "\u30d2\u30f3\u30c8\uff1a", + "Title": "\u30bf\u30a4\u30c8\u30eb", + "Toggle Web/Native": "\u30a6\u30a7\u30d6/\u30cd\u30a4\u30c6\u30a3\u30d6\u3092\u9078\u629e", + "Total Devices": "\u5168\u6a5f\u7a2e", + "Try to reconnect": "\u518d\u63a5\u7d9a\u3059\u308b", + "Type": "\u30bf\u30a4\u30d7", + "Unauthorized": "\u6a29\u9650\u5916", + "Uninstall": "\u524a\u9664", + "Unknown": "\u672a\u77e5", + "Unknown reason.": "\u672a\u77e5\u3002", + "Unlock Rotation": "\u56de\u8ee2\u30a2\u30f3\u30ed\u30c3\u30af", + "Unspecified Failure": "\u672a\u5b9a\u7fa9\u306e\u5931\u6557", + "Upload failed": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u304c\u5931\u6557\u3057\u307e\u3057\u305f", + "Upload From Link": "\u30ea\u30f3\u30af\u5148\u3088\u308a\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3059\u308b", + "Upload unknown error": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u672a\u77e5\u30a8\u30e9\u30fc", + "Uploaded file is not valid": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb", + "Uploading...": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u4e2d...", + "Usable Devices": "\u5229\u7528\u53ef\u80fd", + "USB": "USB", + "Usb speed": "USB\u901f\u5ea6", + "Use": "\u5229\u7528\u3059\u308b", + "User": "\u30e6\u30fc\u30b6", + "Username": "\u30e6\u30fc\u30b6\u540d", + "Using": "\u5229\u7528\u4e2d", + "Using Fallback": "\u30d5\u30a9\u30fc\u30eb\u30d0\u30c3\u30af\u3092\u4f7f\u7528\u4e2d", + "Version": "\u30d0\u30fc\u30b8\u30e7\u30f3", + "Version Update": "\u30d0\u30fc\u30b8\u30e7\u30f3\u30a2\u30c3\u30d7", + "Vibrate Mode": "\u30de\u30ca\u30fc\u30e2\u30fc\u30c9\uff08\u30d0\u30a4\u30d6ON\uff09", + "VNC": "VNC", + "Voltage": "\u96fb\u5727", + "Volume": "\u97f3\u91cf", + "Volume Down": "\u97f3\u91cf\u2193", + "Volume Up": "\u97f3\u91cf\u2191", + "Warning:": "\u6ce8\u610f:", + "Web": "Web", + "Width": "\u5e45", + "WiFi": "\u7121\u7ddaLAN", + "WiMAX": "WiMAX", + "Wireless": "\u7121\u7dda", + "X DPI": "X DPI", + "Y DPI": "Y DPI", + "Yes": "\u306f\u3044", + "You (or someone else) kicked the device.": "\u3053\u306e\u5b9f\u6a5f\u306f\u30ad\u30c3\u30af\u3055\u308c\u307e\u3057\u305f\u3002" + } +} diff --git a/res/common/lang/translations/stf.ko_KR.json b/res/common/lang/translations/stf.ko_KR.json index b12bcde89..57b309b03 100644 --- a/res/common/lang/translations/stf.ko_KR.json +++ b/res/common/lang/translations/stf.ko_KR.json @@ -1 +1,342 @@ -{"ko_KR":{"-":"-","A new version of STF is available":"새 버전의 STF를 사용 가능 합니다","A package is already installed with the same name.":"동일한 패키지가 설치되어 있습니다.","A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).":"이전에 설치된 패키지와 새로운 패키지의 서명이 다릅니다(또한 이전에 설치된 패키지 데이터가 삭제되지 않았습니다).","ABI":"ABI","AC":"AC","Access Tokens":"액세스 토큰","Account":"계정","Action":"동작","Actions":"동작","Activity":"액티비티","ADB Keys":"ADB 키","Add":"추가","Add ADB Key":"ADB 키 추가","Add Key":"키 추가","Add the following ADB Key to STF?":"다음 ADB 키를 STF에 추가 하시겠습니까?","Admin mode has been disabled.":"관리자 모드가 비활성화 되었습니다.","Admin mode has been enabled.":"관리자 모드가 활성화 되었습니다.","Advanced":"고급","Advanced Input":"고급 입력","Airplane Mode":"비행기 모드","App Store":"앱 스토어","App Upload":"앱 업로드","Apps":"앱","Are you sure you want to reboot this device?":"해당 단말기를 재시작 하시겠습니까?","Automation":"자동화","Available":"사용 가능","Back":"뒤로 가기","Battery":"배터리","Battery Health":"베터리 상태","Battery Level":"베터리 수준","Battery Source":"베터리 종류","Battery Status":"배터리 충전 상태","Battery Temp":"배터리 온도","Bluetooth":"블루투스","Browser":"브라우저","Busy":"점유중","Busy Devices":"사용 중인 단말기","Camera":"카메라","Cancel":"취소","Cannot access specified URL":"지정한 URL에 접근 할 수 없습니다","Carrier":"통신사","Category":"범주","Charging":"충전중","Check errors below":"아래 오류를 확인 하세요","Clear":"지우기","Clipboard":"클립보드","Cold":"양호","Connected":"연결","Connected successfully.":"연결했습니다","Control":"컨트롤 화면","Cookies":"쿠키","Cores":"코어 종류","CPU":"CPU","Customize":"사용자 지정","D-pad Center":"D-pad 가운데","D-pad Down":"D-pad 아래쪽","D-pad Left":"D-pad 왼쪽","D-pad Right":"D-pad 오른쪽","D-pad Up":"D-pad 위쪽","Dashboard":"대시보드","Data":"데이터","Date":"날짜","Dead":"정지","Delete":"삭제","Density":"해상도","Details":"세부 정보","Developer":"개발자 옵션","Device":"단말기","Device is not present anymore for some reason.":"더이상 단말기가 존재하지 않습니다.","Device is present but offline.":"장치가 연결되어 있지만 오프라인 상태입니다.","Device Photo":"단말기 사진","Device Settings":"단말기 설정","Device was disconnected":"연결이 끊어졌습니다","Device was kicked by automatic timeout.":"시간초과로 인해 단말기 사용이 종료되었습니다.","Devices":"단말기 리스트","Disable WiFi":"WiFi 비활성화","Discharging":"충전중이 아님","Disconnected":"연결 끊김","Display":"화면","Drop file to upload":"업로드 할 파일을 올려놓으세요","Dummy":"더미","Enable notifications":"알림 사용","Enable WiFi":"WiFi 활성화","Encrypted":"암호화","Error":"오류","Error while getting data":"데이터를 얻어오는데 실패했습니다","Error while reconnecting":"재연결이 실패 했습니다","Ethernet":"이더넷","Executes remote shell commands":"원격 쉘 명령을 실행합니다","Failed to download file":"파일을 다운로드 할 수 없습니다","Fast Forward":"빨리 감기","File Explorer":"파일 탐색기","File Name":"파일 이름","Filter":"필터","Find Device":"장치 찾기","Fingerprint":"지문","FPS":"FPS","Frequency":"속도","Full":"전체","General":"일반","Generate Access Token":"액세스 토큰 생성","Generate Login for VNC":"VNC 로그인 생성","Generate New Token":"새로운 토큰 생성","Get":"시작","Get clipboard contents":"클립보드 내용을 가져옵니다","Go Back":"뒤로 이동","Go Forward":"앞으로 이동","Go to Device List":"단말기 목록으로 이동","Good":"양호","Hardware":"하드웨어","Health":"상태","Height":"높이","Help":"도움말","Hide Screen":"화면 숨김","Home":"홈","Host":"호스트","Hostname":"호스트이름","ICCID":"ICCID","ID":"ID","IMEI":"IMEI","Incorrect login details":"잘못된 로그인 정보","Info":"단말기 정보","Inspect Device":"단말기 검사","Inspecting is currently only supported in WebView":"검사는 웹뷰에서만 지원합니다","Inspector":"검사기","Installation canceled by user.":"사용자가 설치를 취소했습니다","Installation failed due to an unknown error.":"알 수 없는 오류로 설치가 실패했습니다","Installation succeeded.":"설치가 성공했습니다","Installation timed out.":"설치 시간 초과","Installing app...":"앱 설치중...","Key":"키","Keys":"키","Landscape":"가로","Language":"언어","Launch Activity":"액티비티 실행","Launching activity...":"액티비티 실행중...","Level":"수준","Local Settings":"로컬 설정","Location":"위치","Lock Rotation":"화면 잠금","Logs":"로그","Maintenance":"유지 관리","Make sure to copy your access token now. You won't be able to see it again!":"엑세스 토큰을 복사하세요. 다시 확인할 수 없습니다!","Manage Apps":"앱 관리","Manner Mode":"매너 모드","Manufacturer":"제조사","Media":"미디어","Memory":"메모리","Menu":"메뉴","Mobile":"모바일","Mobile DUN":"모바일 DUN","Mobile MMS":"모바일 MMS","Mobile SUPL":"모바일 SUPL","Model":"모델","More about Access Tokens":"좀 더 자세한 엑세스 토큰에 대해서 확인하기","More about ADB Keys":"좀 더 자세하게 ADB 키에 대해서 확인하기","Mute":"음소거","Name":"이름","Native":"네이티브","Navigation":"탐색","Network":"네트워크","Next":"다음","No":"아니오","No access tokens":"등록된 엑세스 토큰이 없습니다","No ADB keys":"등록된 ADB 키가 없습니다","No clipboard data":"클립보드 데이터가 없습니다","No cookies to show":"어떤 쿠키도 없습니다","No devices connected":"연결된 단말기가 없습니다","No photo available":"이용 가능한 사진이 없습니다","No Ports Forwarded":"포트 포워딩 설정이 없습니다","No screenshots taken":"저장된 스크린샷이 없습니다","Normal Mode":"표준 모드","Not Charging":"충전 안함","Notes":"메모","Notifications":"알림","Number":"전화번호","Offline":"오프라인","Oops!":"웁스!","Open":"열기","Orientation":"화면 방향","OS":"운영체제","Over Voltage":"과전압","Overheat":"과열","Package":"패키지","Password":"비밀번호","Permissions":"권한","Phone":"휴대폰","Phone ICCID":"휴대폰 ICCID","Phone IMEI":"휴대폰 IMEI","Physical Device":"물리 단말기","PID":"PID","Place":"위치","Platform":"플랫폼","Play/Pause":"재생/일시 중지","Please enter a valid email":"유효한 이메일 주소를 입력하세요","Please enter your email":"이메일 주소를 입력하세요","Please enter your LDAP username":"LDAP 사용자 이름을 입력하세요","Please enter your name":"이름을 입력하세요","Please enter your password":"비밀번호를 입력하세요","Please enter your Store password":"앱 스토어 비밀번호를 입력하세요","Please enter your Store username":"앱 스토어 아이디를 입력하세요","Port":"포트","Port Forwarding":"포트 포워딩","Portrait":"세로","Power":"전력","Power Source":"전력원","Preparing":"준비중","Press Back button":"뒤로가기 버튼을 누르세요","Press Home button":"홈 버튼을 누르세요","Press Menu button":"메뉴 버튼을 누르세요","Previous":"이전","Processing...":"처리중...","Product":"제품명","Pushing app...":"앱 전송중...","RAM":"RAM","Reconnected successfully.":"재연결이 성공했습니다","Refresh":"새로고침","Released":"릴리즈","Reload":"다시 로드","Remote debug":"원격 디버그","Remove":"제거","Reset":"초기화","Reset all browser settings":"모든 브라우저 설정 초기화","Reset Settings":"설정 초기화","Restart Device":"단말기 재시작","Retrieving the device screen has timed out.":"단말기 화면을 가져 오는 시간이 초과 되었습니다.","Retry":"재시도","Rewind":"되감기","Roaming":"로밍","ROM":"ROM","Rotate Left":"왼쪽으로 회전","Rotate Right":"오른쪽으로 회전","Run":"실행","Run JavaScript":"자바스크립트 실행","Run the following on your command line to debug the device from your IDE":"아래의 명령줄을 실행하여 IDE에서 디버그를 실행하세요","Sample of log format":"로그 형식의 샘플","Save Logs":"로그 샘플","Save ScreenShot":"스크린 샷 저장","Save...":"저장...","Screen":"화면","Screenshot":"스크린 샷","Screenshots":"스크린 샷","SD Card Mounted":"SD카드 마운트","SDK":"SDK","Search":"검색","Serial":"일련 번호","Server":"서버","Server error. Check log output.":"서버 에러. 로그를 확인하세요","Set":"Set","Set Cookie":"쿠키 설정","Settings":"설정","Shell":"셸","Show Screen":"화면 표시","Sign In":"로그인","Sign Out":"로그아웃","Silent Mode":"음소거","SIM":"SIM","Size":"크기","Socket connection was lost":"소켓 연결이 끊겼습니다","Special Keys":"특수 키","Start/Stop Logging":"시작/종료 로깅","Status":"상태","Stop":"정지","Stop Using":"사용 종료","Store Account":"저장소 계정","Sub Type":"하위 유형","Switch Charset":"문자 집합 변경","Tag":"태그","Take Screenshot":"스크린샷 캡처","Temperature":"온도","Text":"텍스트","The device will be unavailable for a moment.":"이 단말기는 잠시동안 사용 할 수 없습니다.","The existing package could not be deleted.":"기존 패키지를 삭제 할 수 없습니다.","The new package couldn't be installed because the verification did not succeed.":"검증되지 않은 새로운 패키지는 설치 할 수 없습니다.","The new package couldn't be installed because the verification timed out.":"검증 시간이 초과하여 새로운 패키지를 설치 할 수 없습니다.","The new package couldn't be installed in the specified install location because the media is not available.":"미디어를 사용할 수 없어 지정한 위치에 새로운 패키지를 설치 할 수 없습니다.","The new package couldn't be installed in the specified install location.":"지정한 위치에 새로운 패키지를 설치 할 수 없습니다.","The new package failed because it contains a content provider with thesame authority as a provider already installed in the system.":"이미 동일한 패키지가 설치되어 있어 설치 할 수 없습니다.","The new package failed because the current SDK version is newer than that required by the package.":"SDK 버전이 높아 새로운 패키지를 설치 할 수 없습니다.","The new package failed because the current SDK version is older than that required by the package.":"SDK 버전이 낮아 새로운 패키지를 설치 할 수 없습니다.","The new package has an older version code than the currently installed package.":"새로운 패키지에 오래된 버전의 코드가 존재하여 설치 할 수 없습니다.","The new package is assigned a different UID than it previously held.":"새로운 패키지는 이전 패키지와 다른 UID가 할당 됐습니다.","The package archive file is invalid.":"패키지 아카이브 파일이 잘못 되었습니다.","The package is already installed.":"패키지가 이미 설치 되어 있습니다.","The parser encountered a bad or missing package name in the manifest.":"매니페스트에 잘못되거나 누락된 패키지 이름을 발견했습니다.","The parser encountered a bad shared user id name in the manifest.":"매니페스트에 잘못된 아이디나 이름을 발견했습니다.","The parser encountered an unexpected exception.":"예상하지 못한 예외가 발생하였습니다.","The parser encountered some structural problem in the manifest.":"매니페스트에 몇 가지 구조적인 문제가 발생 했습니다.","The parser found inconsistent certificates on the files in the .apk.":".apk 파일에서 일치하지 않은 인증서를 발견 했습니다.","The requested shared user does not exist.":"요청된 공용 사용자가 존재하지 않습니다.","The URI passed in is invalid.":"URL이 잘못 전달 됐습니다.","TID":"TID","Time":"시간","Tip:":"팁","Title":"제목","Toggle Web/Native":"웹/네이티브 전환","Total Devices":"총 단말기 수","translate":"번역","Try to reconnect":"다시 연결","Type":"유형","Unauthorized":"미인증","Uninstall":"설치 제거","Unknown":"알 수 없음","Unknown reason.":"알 수 없는 이유","Unlock Rotation":"회전 잠금 해제","Unspecified Failure":"지정되지 않은 오류","Upload failed":"업로드 실패","Upload From Link":"링크로 업로드","Upload unknown error":"업로드시 알수 없는 에러가 발생하였습니다","Uploaded file is not valid":"업로드된 파일이 유효하지 않습니다","Uploading...":"업로드중...","Usable Devices":"사용 가능한 단말기","USB":"USB","Usb speed":"Usb 속도","Use":"사용","User":"사용자","Username":"사용자 이름","Using":"사용중","Using Fallback":"대체","Version":"버전","Version Update":"버전 업데이트","Vibrate Mode":"진동","VNC":"VNC","Voltage":"전압","Volume":"음량","Volume Down":"음량 줄이기","Volume Up":"음량 올리기","Warning:":"경고","Web":"웹","Width":"너비","WiFi":"WiFi","WiMAX":"WiMAX","Wireless":"무선","X DPI":"X DPI","Y DPI":"Y DPI","Yes":"네","You (or someone else) kicked the device.":"당신(혹은 다른 누군가)이 단말기를 사용 종료 하였습니다."}} \ No newline at end of file +{ + "ko_KR": { + "-": "-", + "A new version of STF is available": "\uc0c8 \ubc84\uc804\uc758 STF\ub97c \uc0ac\uc6a9 \uac00\ub2a5 \ud569\ub2c8\ub2e4", + "A package is already installed with the same name.": "\ub3d9\uc77c\ud55c \ud328\ud0a4\uc9c0\uac00 \uc124\uce58\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.", + "A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).": "\uc774\uc804\uc5d0 \uc124\uce58\ub41c \ud328\ud0a4\uc9c0\uc640 \uc0c8\ub85c\uc6b4 \ud328\ud0a4\uc9c0\uc758 \uc11c\uba85\uc774 \ub2e4\ub985\ub2c8\ub2e4(\ub610\ud55c \uc774\uc804\uc5d0 \uc124\uce58\ub41c \ud328\ud0a4\uc9c0 \ub370\uc774\ud130\uac00 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4).", + "ABI": "ABI", + "AC": "AC", + "Access Tokens": "\uc561\uc138\uc2a4 \ud1a0\ud070", + "Account": "\uacc4\uc815", + "Action": "\ub3d9\uc791", + "Actions": "\ub3d9\uc791", + "Activity": "\uc561\ud2f0\ube44\ud2f0", + "ADB Keys": "ADB \ud0a4", + "Add": "\ucd94\uac00", + "Add ADB Key": "ADB \ud0a4 \ucd94\uac00", + "Add Key": "\ud0a4 \ucd94\uac00", + "Add the following ADB Key to STF?": "\ub2e4\uc74c ADB \ud0a4\ub97c STF\uc5d0 \ucd94\uac00 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", + "Admin mode has been disabled.": "\uad00\ub9ac\uc790 \ubaa8\ub4dc\uac00 \ube44\ud65c\uc131\ud654 \ub418\uc5c8\uc2b5\ub2c8\ub2e4.", + "Admin mode has been enabled.": "\uad00\ub9ac\uc790 \ubaa8\ub4dc\uac00 \ud65c\uc131\ud654 \ub418\uc5c8\uc2b5\ub2c8\ub2e4.", + "Advanced": "\uace0\uae09", + "Advanced Input": "\uace0\uae09 \uc785\ub825", + "Airplane Mode": "\ube44\ud589\uae30 \ubaa8\ub4dc", + "App Store": "\uc571 \uc2a4\ud1a0\uc5b4", + "App Upload": "\uc571 \uc5c5\ub85c\ub4dc", + "Apps": "\uc571", + "Are you sure you want to reboot this device?": "\ud574\ub2f9 \ub2e8\ub9d0\uae30\ub97c \uc7ac\uc2dc\uc791 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", + "Automation": "\uc790\ub3d9\ud654", + "Available": "\uc0ac\uc6a9 \uac00\ub2a5", + "Back": "\ub4a4\ub85c \uac00\uae30", + "Battery": "\ubc30\ud130\ub9ac", + "Battery Health": "\ubca0\ud130\ub9ac \uc0c1\ud0dc", + "Battery Level": "\ubca0\ud130\ub9ac \uc218\uc900", + "Battery Source": "\ubca0\ud130\ub9ac \uc885\ub958", + "Battery Status": "\ubc30\ud130\ub9ac \ucda9\uc804 \uc0c1\ud0dc", + "Battery Temp": "\ubc30\ud130\ub9ac \uc628\ub3c4", + "Bluetooth": "\ube14\ub8e8\ud22c\uc2a4", + "Browser": "\ube0c\ub77c\uc6b0\uc800", + "Busy": "\uc810\uc720\uc911", + "Busy Devices": "\uc0ac\uc6a9 \uc911\uc778 \ub2e8\ub9d0\uae30", + "Camera": "\uce74\uba54\ub77c", + "Cancel": "\ucde8\uc18c", + "Cannot access specified URL": "\uc9c0\uc815\ud55c URL\uc5d0 \uc811\uadfc \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4", + "Carrier": "\ud1b5\uc2e0\uc0ac", + "Category": "\ubc94\uc8fc", + "Charging": "\ucda9\uc804\uc911", + "Check errors below": "\uc544\ub798 \uc624\ub958\ub97c \ud655\uc778 \ud558\uc138\uc694", + "Clear": "\uc9c0\uc6b0\uae30", + "Clipboard": "\ud074\ub9bd\ubcf4\ub4dc", + "Cold": "\uc591\ud638", + "Connected": "\uc5f0\uacb0", + "Connected successfully.": "\uc5f0\uacb0\ud588\uc2b5\ub2c8\ub2e4", + "Control": "\ucee8\ud2b8\ub864 \ud654\uba74", + "Cookies": "\ucfe0\ud0a4", + "Cores": "\ucf54\uc5b4 \uc885\ub958", + "CPU": "CPU", + "Customize": "\uc0ac\uc6a9\uc790 \uc9c0\uc815", + "D-pad Center": "D-pad \uac00\uc6b4\ub370", + "D-pad Down": "D-pad \uc544\ub798\ucabd", + "D-pad Left": "D-pad \uc67c\ucabd", + "D-pad Right": "D-pad \uc624\ub978\ucabd", + "D-pad Up": "D-pad \uc704\ucabd", + "Dashboard": "\ub300\uc2dc\ubcf4\ub4dc", + "Data": "\ub370\uc774\ud130", + "Date": "\ub0a0\uc9dc", + "Dead": "\uc815\uc9c0", + "Delete": "\uc0ad\uc81c", + "Density": "\ud574\uc0c1\ub3c4", + "Details": "\uc138\ubd80 \uc815\ubcf4", + "Developer": "\uac1c\ubc1c\uc790 \uc635\uc158", + "Device": "\ub2e8\ub9d0\uae30", + "Device is not present anymore for some reason.": "\ub354\uc774\uc0c1 \ub2e8\ub9d0\uae30\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.", + "Device is present but offline.": "\uc7a5\uce58\uac00 \uc5f0\uacb0\ub418\uc5b4 \uc788\uc9c0\ub9cc \uc624\ud504\ub77c\uc778 \uc0c1\ud0dc\uc785\ub2c8\ub2e4.", + "Device Photo": "\ub2e8\ub9d0\uae30 \uc0ac\uc9c4", + "Device Settings": "\ub2e8\ub9d0\uae30 \uc124\uc815", + "Device was disconnected": "\uc5f0\uacb0\uc774 \ub04a\uc5b4\uc84c\uc2b5\ub2c8\ub2e4", + "Device was kicked by automatic timeout.": "\uc2dc\uac04\ucd08\uacfc\ub85c \uc778\ud574 \ub2e8\ub9d0\uae30 \uc0ac\uc6a9\uc774 \uc885\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", + "Devices": "\ub2e8\ub9d0\uae30 \ub9ac\uc2a4\ud2b8", + "Disable WiFi": "WiFi \ube44\ud65c\uc131\ud654", + "Discharging": "\ucda9\uc804\uc911\uc774 \uc544\ub2d8", + "Disconnected": "\uc5f0\uacb0 \ub04a\uae40", + "Display": "\ud654\uba74", + "Drop file to upload": "\uc5c5\ub85c\ub4dc \ud560 \ud30c\uc77c\uc744 \uc62c\ub824\ub193\uc73c\uc138\uc694", + "Dummy": "\ub354\ubbf8", + "Enable notifications": "\uc54c\ub9bc \uc0ac\uc6a9", + "Enable WiFi": "WiFi \ud65c\uc131\ud654", + "Encrypted": "\uc554\ud638\ud654", + "Error": "\uc624\ub958", + "Error while getting data": "\ub370\uc774\ud130\ub97c \uc5bb\uc5b4\uc624\ub294\ub370 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4", + "Error while reconnecting": "\uc7ac\uc5f0\uacb0\uc774 \uc2e4\ud328 \ud588\uc2b5\ub2c8\ub2e4", + "Ethernet": "\uc774\ub354\ub137", + "Executes remote shell commands": "\uc6d0\uaca9 \uc258 \uba85\ub839\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4", + "Failed to download file": "\ud30c\uc77c\uc744 \ub2e4\uc6b4\ub85c\ub4dc \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4", + "Fast Forward": "\ube68\ub9ac \uac10\uae30", + "File Explorer": "\ud30c\uc77c \ud0d0\uc0c9\uae30", + "File Name": "\ud30c\uc77c \uc774\ub984", + "Filter": "\ud544\ud130", + "Find Device": "\uc7a5\uce58 \ucc3e\uae30", + "Fingerprint": "\uc9c0\ubb38", + "FPS": "FPS", + "Frequency": "\uc18d\ub3c4", + "Full": "\uc804\uccb4", + "General": "\uc77c\ubc18", + "Generate Access Token": "\uc561\uc138\uc2a4 \ud1a0\ud070 \uc0dd\uc131", + "Generate Login for VNC": "VNC \ub85c\uadf8\uc778 \uc0dd\uc131", + "Generate New Token": "\uc0c8\ub85c\uc6b4 \ud1a0\ud070 \uc0dd\uc131", + "Get": "\uc2dc\uc791", + "Get clipboard contents": "\ud074\ub9bd\ubcf4\ub4dc \ub0b4\uc6a9\uc744 \uac00\uc838\uc635\ub2c8\ub2e4", + "Go Back": "\ub4a4\ub85c \uc774\ub3d9", + "Go Forward": "\uc55e\uc73c\ub85c \uc774\ub3d9", + "Go to Device List": "\ub2e8\ub9d0\uae30 \ubaa9\ub85d\uc73c\ub85c \uc774\ub3d9", + "Good": "\uc591\ud638", + "Hardware": "\ud558\ub4dc\uc6e8\uc5b4", + "Health": "\uc0c1\ud0dc", + "Height": "\ub192\uc774", + "Help": "\ub3c4\uc6c0\ub9d0", + "Hide Screen": "\ud654\uba74 \uc228\uae40", + "Home": "\ud648", + "Host": "\ud638\uc2a4\ud2b8", + "Hostname": "\ud638\uc2a4\ud2b8\uc774\ub984", + "ICCID": "ICCID", + "ID": "ID", + "IMEI": "IMEI", + "Incorrect login details": "\uc798\ubabb\ub41c \ub85c\uadf8\uc778 \uc815\ubcf4", + "Info": "\ub2e8\ub9d0\uae30 \uc815\ubcf4", + "Inspect Device": "\ub2e8\ub9d0\uae30 \uac80\uc0ac", + "Inspecting is currently only supported in WebView": "\uac80\uc0ac\ub294 \uc6f9\ubdf0\uc5d0\uc11c\ub9cc \uc9c0\uc6d0\ud569\ub2c8\ub2e4", + "Inspector": "\uac80\uc0ac\uae30", + "Installation canceled by user.": "\uc0ac\uc6a9\uc790\uac00 \uc124\uce58\ub97c \ucde8\uc18c\ud588\uc2b5\ub2c8\ub2e4", + "Installation failed due to an unknown error.": "\uc54c \uc218 \uc5c6\ub294 \uc624\ub958\ub85c \uc124\uce58\uac00 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4", + "Installation succeeded.": "\uc124\uce58\uac00 \uc131\uacf5\ud588\uc2b5\ub2c8\ub2e4", + "Installation timed out.": "\uc124\uce58 \uc2dc\uac04 \ucd08\uacfc", + "Installing app...": "\uc571 \uc124\uce58\uc911...", + "Key": "\ud0a4", + "Keys": "\ud0a4", + "Landscape": "\uac00\ub85c", + "Language": "\uc5b8\uc5b4", + "Launch Activity": "\uc561\ud2f0\ube44\ud2f0 \uc2e4\ud589", + "Launching activity...": "\uc561\ud2f0\ube44\ud2f0 \uc2e4\ud589\uc911...", + "Level": "\uc218\uc900", + "Local Settings": "\ub85c\uceec \uc124\uc815", + "Location": "\uc704\uce58", + "Lock Rotation": "\ud654\uba74 \uc7a0\uae08", + "Logs": "\ub85c\uadf8", + "Maintenance": "\uc720\uc9c0 \uad00\ub9ac", + "Make sure to copy your access token now. You won't be able to see it again!": "\uc5d1\uc138\uc2a4 \ud1a0\ud070\uc744 \ubcf5\uc0ac\ud558\uc138\uc694. \ub2e4\uc2dc \ud655\uc778\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4!", + "Manage Apps": "\uc571 \uad00\ub9ac", + "Manner Mode": "\ub9e4\ub108 \ubaa8\ub4dc", + "Manufacturer": "\uc81c\uc870\uc0ac", + "Media": "\ubbf8\ub514\uc5b4", + "Memory": "\uba54\ubaa8\ub9ac", + "Menu": "\uba54\ub274", + "Mobile": "\ubaa8\ubc14\uc77c", + "Mobile DUN": "\ubaa8\ubc14\uc77c DUN", + "Mobile MMS": "\ubaa8\ubc14\uc77c MMS", + "Mobile SUPL": "\ubaa8\ubc14\uc77c SUPL", + "Model": "\ubaa8\ub378", + "More about Access Tokens": "\uc880 \ub354 \uc790\uc138\ud55c \uc5d1\uc138\uc2a4 \ud1a0\ud070\uc5d0 \ub300\ud574\uc11c \ud655\uc778\ud558\uae30", + "More about ADB Keys": "\uc880 \ub354 \uc790\uc138\ud558\uac8c ADB \ud0a4\uc5d0 \ub300\ud574\uc11c \ud655\uc778\ud558\uae30", + "Mute": "\uc74c\uc18c\uac70", + "Name": "\uc774\ub984", + "Native": "\ub124\uc774\ud2f0\ube0c", + "Navigation": "\ud0d0\uc0c9", + "Network": "\ub124\ud2b8\uc6cc\ud06c", + "Next": "\ub2e4\uc74c", + "No": "\uc544\ub2c8\uc624", + "No access tokens": "\ub4f1\ub85d\ub41c \uc5d1\uc138\uc2a4 \ud1a0\ud070\uc774 \uc5c6\uc2b5\ub2c8\ub2e4", + "No ADB keys": "\ub4f1\ub85d\ub41c ADB \ud0a4\uac00 \uc5c6\uc2b5\ub2c8\ub2e4", + "No clipboard data": "\ud074\ub9bd\ubcf4\ub4dc \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4", + "No cookies to show": "\uc5b4\ub5a4 \ucfe0\ud0a4\ub3c4 \uc5c6\uc2b5\ub2c8\ub2e4", + "No devices connected": "\uc5f0\uacb0\ub41c \ub2e8\ub9d0\uae30\uac00 \uc5c6\uc2b5\ub2c8\ub2e4", + "No photo available": "\uc774\uc6a9 \uac00\ub2a5\ud55c \uc0ac\uc9c4\uc774 \uc5c6\uc2b5\ub2c8\ub2e4", + "No Ports Forwarded": "\ud3ec\ud2b8 \ud3ec\uc6cc\ub529 \uc124\uc815\uc774 \uc5c6\uc2b5\ub2c8\ub2e4", + "No screenshots taken": "\uc800\uc7a5\ub41c \uc2a4\ud06c\ub9b0\uc0f7\uc774 \uc5c6\uc2b5\ub2c8\ub2e4", + "Normal Mode": "\ud45c\uc900 \ubaa8\ub4dc", + "Not Charging": "\ucda9\uc804 \uc548\ud568", + "Notes": "\uba54\ubaa8", + "Notifications": "\uc54c\ub9bc", + "Number": "\uc804\ud654\ubc88\ud638", + "Offline": "\uc624\ud504\ub77c\uc778", + "Oops!": "\uc6c1\uc2a4!", + "Open": "\uc5f4\uae30", + "Orientation": "\ud654\uba74 \ubc29\ud5a5", + "OS": "\uc6b4\uc601\uccb4\uc81c", + "Over Voltage": "\uacfc\uc804\uc555", + "Overheat": "\uacfc\uc5f4", + "Package": "\ud328\ud0a4\uc9c0", + "Password": "\ube44\ubc00\ubc88\ud638", + "Permissions": "\uad8c\ud55c", + "Phone": "\ud734\ub300\ud3f0", + "Phone ICCID": "\ud734\ub300\ud3f0 ICCID", + "Phone IMEI": "\ud734\ub300\ud3f0 IMEI", + "Physical Device": "\ubb3c\ub9ac \ub2e8\ub9d0\uae30", + "PID": "PID", + "Place": "\uc704\uce58", + "Platform": "\ud50c\ub7ab\ud3fc", + "Play/Pause": "\uc7ac\uc0dd/\uc77c\uc2dc \uc911\uc9c0", + "Please enter a valid email": "\uc720\ud6a8\ud55c \uc774\uba54\uc77c \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uc138\uc694", + "Please enter your email": "\uc774\uba54\uc77c \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uc138\uc694", + "Please enter your LDAP username": "LDAP \uc0ac\uc6a9\uc790 \uc774\ub984\uc744 \uc785\ub825\ud558\uc138\uc694", + "Please enter your name": "\uc774\ub984\uc744 \uc785\ub825\ud558\uc138\uc694", + "Please enter your password": "\ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\uc138\uc694", + "Please enter your Store password": "\uc571 \uc2a4\ud1a0\uc5b4 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\uc138\uc694", + "Please enter your Store username": "\uc571 \uc2a4\ud1a0\uc5b4 \uc544\uc774\ub514\ub97c \uc785\ub825\ud558\uc138\uc694", + "Port": "\ud3ec\ud2b8", + "Port Forwarding": "\ud3ec\ud2b8 \ud3ec\uc6cc\ub529", + "Portrait": "\uc138\ub85c", + "Power": "\uc804\ub825", + "Power Source": "\uc804\ub825\uc6d0", + "Preparing": "\uc900\ube44\uc911", + "Press Back button": "\ub4a4\ub85c\uac00\uae30 \ubc84\ud2bc\uc744 \ub204\ub974\uc138\uc694", + "Press Home button": "\ud648 \ubc84\ud2bc\uc744 \ub204\ub974\uc138\uc694", + "Press Menu button": "\uba54\ub274 \ubc84\ud2bc\uc744 \ub204\ub974\uc138\uc694", + "Previous": "\uc774\uc804", + "Processing...": "\ucc98\ub9ac\uc911...", + "Product": "\uc81c\ud488\uba85", + "Pushing app...": "\uc571 \uc804\uc1a1\uc911...", + "RAM": "RAM", + "Reconnected successfully.": "\uc7ac\uc5f0\uacb0\uc774 \uc131\uacf5\ud588\uc2b5\ub2c8\ub2e4", + "Refresh": "\uc0c8\ub85c\uace0\uce68", + "Released": "\ub9b4\ub9ac\uc988", + "Reload": "\ub2e4\uc2dc \ub85c\ub4dc", + "Remote debug": "\uc6d0\uaca9 \ub514\ubc84\uadf8", + "Remove": "\uc81c\uac70", + "Reset": "\ucd08\uae30\ud654", + "Reset all browser settings": "\ubaa8\ub4e0 \ube0c\ub77c\uc6b0\uc800 \uc124\uc815 \ucd08\uae30\ud654", + "Reset Settings": "\uc124\uc815 \ucd08\uae30\ud654", + "Restart Device": "\ub2e8\ub9d0\uae30 \uc7ac\uc2dc\uc791", + "Retrieving the device screen has timed out.": "\ub2e8\ub9d0\uae30 \ud654\uba74\uc744 \uac00\uc838 \uc624\ub294 \uc2dc\uac04\uc774 \ucd08\uacfc \ub418\uc5c8\uc2b5\ub2c8\ub2e4.", + "Retry": "\uc7ac\uc2dc\ub3c4", + "Rewind": "\ub418\uac10\uae30", + "Roaming": "\ub85c\ubc0d", + "ROM": "ROM", + "Rotate Left": "\uc67c\ucabd\uc73c\ub85c \ud68c\uc804", + "Rotate Right": "\uc624\ub978\ucabd\uc73c\ub85c \ud68c\uc804", + "Run": "\uc2e4\ud589", + "Run JavaScript": "\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \uc2e4\ud589", + "Run the following on your command line to debug the device from your IDE": "\uc544\ub798\uc758 \uba85\ub839\uc904\uc744 \uc2e4\ud589\ud558\uc5ec IDE\uc5d0\uc11c \ub514\ubc84\uadf8\ub97c \uc2e4\ud589\ud558\uc138\uc694", + "Sample of log format": "\ub85c\uadf8 \ud615\uc2dd\uc758 \uc0d8\ud50c", + "Save Logs": "\ub85c\uadf8 \uc0d8\ud50c", + "Save ScreenShot": "\uc2a4\ud06c\ub9b0 \uc0f7 \uc800\uc7a5", + "Save...": "\uc800\uc7a5...", + "Screen": "\ud654\uba74", + "Screenshot": "\uc2a4\ud06c\ub9b0 \uc0f7", + "Screenshots": "\uc2a4\ud06c\ub9b0 \uc0f7", + "SD Card Mounted": "SD\uce74\ub4dc \ub9c8\uc6b4\ud2b8", + "SDK": "SDK", + "Search": "\uac80\uc0c9", + "Serial": "\uc77c\ub828 \ubc88\ud638", + "Server": "\uc11c\ubc84", + "Server error. Check log output.": "\uc11c\ubc84 \uc5d0\ub7ec. \ub85c\uadf8\ub97c \ud655\uc778\ud558\uc138\uc694", + "Set": "Set", + "Set Cookie": "\ucfe0\ud0a4 \uc124\uc815", + "Settings": "\uc124\uc815", + "Shell": "\uc178", + "Show Screen": "\ud654\uba74 \ud45c\uc2dc", + "Sign In": "\ub85c\uadf8\uc778", + "Sign Out": "\ub85c\uadf8\uc544\uc6c3", + "Silent Mode": "\uc74c\uc18c\uac70", + "SIM": "SIM", + "Size": "\ud06c\uae30", + "Socket connection was lost": "\uc18c\ucf13 \uc5f0\uacb0\uc774 \ub04a\uacbc\uc2b5\ub2c8\ub2e4", + "Special Keys": "\ud2b9\uc218 \ud0a4", + "Start/Stop Logging": "\uc2dc\uc791/\uc885\ub8cc \ub85c\uae45", + "Status": "\uc0c1\ud0dc", + "Stop": "\uc815\uc9c0", + "Stop Using": "\uc0ac\uc6a9 \uc885\ub8cc", + "Store Account": "\uc800\uc7a5\uc18c \uacc4\uc815", + "Sub Type": "\ud558\uc704 \uc720\ud615", + "Switch Charset": "\ubb38\uc790 \uc9d1\ud569 \ubcc0\uacbd", + "Tag": "\ud0dc\uadf8", + "Take Screenshot": "\uc2a4\ud06c\ub9b0\uc0f7 \ucea1\ucc98", + "Temperature": "\uc628\ub3c4", + "Text": "\ud14d\uc2a4\ud2b8", + "The device will be unavailable for a moment.": "\uc774 \ub2e8\ub9d0\uae30\ub294 \uc7a0\uc2dc\ub3d9\uc548 \uc0ac\uc6a9 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "The existing package could not be deleted.": "\uae30\uc874 \ud328\ud0a4\uc9c0\ub97c \uc0ad\uc81c \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "The new package couldn't be installed because the verification did not succeed.": "\uac80\uc99d\ub418\uc9c0 \uc54a\uc740 \uc0c8\ub85c\uc6b4 \ud328\ud0a4\uc9c0\ub294 \uc124\uce58 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "The new package couldn't be installed because the verification timed out.": "\uac80\uc99d \uc2dc\uac04\uc774 \ucd08\uacfc\ud558\uc5ec \uc0c8\ub85c\uc6b4 \ud328\ud0a4\uc9c0\ub97c \uc124\uce58 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "The new package couldn't be installed in the specified install location because the media is not available.": "\ubbf8\ub514\uc5b4\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc5b4 \uc9c0\uc815\ud55c \uc704\uce58\uc5d0 \uc0c8\ub85c\uc6b4 \ud328\ud0a4\uc9c0\ub97c \uc124\uce58 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "The new package couldn't be installed in the specified install location.": "\uc9c0\uc815\ud55c \uc704\uce58\uc5d0 \uc0c8\ub85c\uc6b4 \ud328\ud0a4\uc9c0\ub97c \uc124\uce58 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "The new package failed because it contains a content provider with thesame authority as a provider already installed in the system.": "\uc774\ubbf8 \ub3d9\uc77c\ud55c \ud328\ud0a4\uc9c0\uac00 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4 \uc124\uce58 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "The new package failed because the current SDK version is newer than that required by the package.": "SDK \ubc84\uc804\uc774 \ub192\uc544 \uc0c8\ub85c\uc6b4 \ud328\ud0a4\uc9c0\ub97c \uc124\uce58 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "The new package failed because the current SDK version is older than that required by the package.": "SDK \ubc84\uc804\uc774 \ub0ae\uc544 \uc0c8\ub85c\uc6b4 \ud328\ud0a4\uc9c0\ub97c \uc124\uce58 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "The new package has an older version code than the currently installed package.": "\uc0c8\ub85c\uc6b4 \ud328\ud0a4\uc9c0\uc5d0 \uc624\ub798\ub41c \ubc84\uc804\uc758 \ucf54\ub4dc\uac00 \uc874\uc7ac\ud558\uc5ec \uc124\uce58 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "The new package is assigned a different UID than it previously held.": "\uc0c8\ub85c\uc6b4 \ud328\ud0a4\uc9c0\ub294 \uc774\uc804 \ud328\ud0a4\uc9c0\uc640 \ub2e4\ub978 UID\uac00 \ud560\ub2f9 \ub410\uc2b5\ub2c8\ub2e4.", + "The package archive file is invalid.": "\ud328\ud0a4\uc9c0 \uc544\uce74\uc774\ube0c \ud30c\uc77c\uc774 \uc798\ubabb \ub418\uc5c8\uc2b5\ub2c8\ub2e4.", + "The package is already installed.": "\ud328\ud0a4\uc9c0\uac00 \uc774\ubbf8 \uc124\uce58 \ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.", + "The parser encountered a bad or missing package name in the manifest.": "\ub9e4\ub2c8\ud398\uc2a4\ud2b8\uc5d0 \uc798\ubabb\ub418\uac70\ub098 \ub204\ub77d\ub41c \ud328\ud0a4\uc9c0 \uc774\ub984\uc744 \ubc1c\uacac\ud588\uc2b5\ub2c8\ub2e4.", + "The parser encountered a bad shared user id name in the manifest.": "\ub9e4\ub2c8\ud398\uc2a4\ud2b8\uc5d0 \uc798\ubabb\ub41c \uc544\uc774\ub514\ub098 \uc774\ub984\uc744 \ubc1c\uacac\ud588\uc2b5\ub2c8\ub2e4.", + "The parser encountered an unexpected exception.": "\uc608\uc0c1\ud558\uc9c0 \ubabb\ud55c \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc600\uc2b5\ub2c8\ub2e4.", + "The parser encountered some structural problem in the manifest.": "\ub9e4\ub2c8\ud398\uc2a4\ud2b8\uc5d0 \uba87 \uac00\uc9c0 \uad6c\uc870\uc801\uc778 \ubb38\uc81c\uac00 \ubc1c\uc0dd \ud588\uc2b5\ub2c8\ub2e4.", + "The parser found inconsistent certificates on the files in the .apk.": ".apk \ud30c\uc77c\uc5d0\uc11c \uc77c\uce58\ud558\uc9c0 \uc54a\uc740 \uc778\uc99d\uc11c\ub97c \ubc1c\uacac \ud588\uc2b5\ub2c8\ub2e4.", + "The requested shared user does not exist.": "\uc694\uccad\ub41c \uacf5\uc6a9 \uc0ac\uc6a9\uc790\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.", + "The URI passed in is invalid.": "URL\uc774 \uc798\ubabb \uc804\ub2ec \ub410\uc2b5\ub2c8\ub2e4.", + "TID": "TID", + "Time": "\uc2dc\uac04", + "Tip:": "\ud301", + "Title": "\uc81c\ubaa9", + "Toggle Web/Native": "\uc6f9/\ub124\uc774\ud2f0\ube0c \uc804\ud658", + "Total Devices": "\ucd1d \ub2e8\ub9d0\uae30 \uc218", + "translate": "\ubc88\uc5ed", + "Try to reconnect": "\ub2e4\uc2dc \uc5f0\uacb0", + "Type": "\uc720\ud615", + "Unauthorized": "\ubbf8\uc778\uc99d", + "Uninstall": "\uc124\uce58 \uc81c\uac70", + "Unknown": "\uc54c \uc218 \uc5c6\uc74c", + "Unknown reason.": "\uc54c \uc218 \uc5c6\ub294 \uc774\uc720", + "Unlock Rotation": "\ud68c\uc804 \uc7a0\uae08 \ud574\uc81c", + "Unspecified Failure": "\uc9c0\uc815\ub418\uc9c0 \uc54a\uc740 \uc624\ub958", + "Upload failed": "\uc5c5\ub85c\ub4dc \uc2e4\ud328", + "Upload From Link": "\ub9c1\ud06c\ub85c \uc5c5\ub85c\ub4dc", + "Upload unknown error": "\uc5c5\ub85c\ub4dc\uc2dc \uc54c\uc218 \uc5c6\ub294 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud558\uc600\uc2b5\ub2c8\ub2e4", + "Uploaded file is not valid": "\uc5c5\ub85c\ub4dc\ub41c \ud30c\uc77c\uc774 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4", + "Uploading...": "\uc5c5\ub85c\ub4dc\uc911...", + "Usable Devices": "\uc0ac\uc6a9 \uac00\ub2a5\ud55c \ub2e8\ub9d0\uae30", + "USB": "USB", + "Usb speed": "Usb \uc18d\ub3c4", + "Use": "\uc0ac\uc6a9", + "User": "\uc0ac\uc6a9\uc790", + "Username": "\uc0ac\uc6a9\uc790 \uc774\ub984", + "Using": "\uc0ac\uc6a9\uc911", + "Using Fallback": "\ub300\uccb4", + "Version": "\ubc84\uc804", + "Version Update": "\ubc84\uc804 \uc5c5\ub370\uc774\ud2b8", + "Vibrate Mode": "\uc9c4\ub3d9", + "VNC": "VNC", + "Voltage": "\uc804\uc555", + "Volume": "\uc74c\ub7c9", + "Volume Down": "\uc74c\ub7c9 \uc904\uc774\uae30", + "Volume Up": "\uc74c\ub7c9 \uc62c\ub9ac\uae30", + "Warning:": "\uacbd\uace0", + "Web": "\uc6f9", + "Width": "\ub108\ube44", + "WiFi": "WiFi", + "WiMAX": "WiMAX", + "Wireless": "\ubb34\uc120", + "X DPI": "X DPI", + "Y DPI": "Y DPI", + "Yes": "\ub124", + "You (or someone else) kicked the device.": "\ub2f9\uc2e0(\ud639\uc740 \ub2e4\ub978 \ub204\uad70\uac00)\uc774 \ub2e8\ub9d0\uae30\ub97c \uc0ac\uc6a9 \uc885\ub8cc \ud558\uc600\uc2b5\ub2c8\ub2e4." + } +} diff --git a/res/common/lang/translations/stf.pl.json b/res/common/lang/translations/stf.pl.json index 3f951f448..872a7a323 100644 --- a/res/common/lang/translations/stf.pl.json +++ b/res/common/lang/translations/stf.pl.json @@ -1 +1,202 @@ -{"pl":{"-":"-","A new version of STF is available":"Nowa wersja STF jest dostępna","A package is already installed with the same name.":"Pakiet o tej samej nazwie jest już zainstalowany","A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).":"Poprzednio zainstalowana paczka o tej samej nazwie ma inną sygnaturę od nowej (oraz dane starej paczki nie zostały usunięte).","A secure container mount point couldn't be accessed on external media.":"Zewnętrzne media nie mogą uzyskać dostępu do punktu montowania zabezpieczonego kontenera.","ABI":"ABI","AC":"AC","Access Tokens":"Tokeny dostępu","Account":"Konto","Action":"Akcja","Actions":"Akcje","Activity":"Aktywność","ADB Keys":"Klucze ADB","Add":"Dodaj","Add ADB Key":"Dodaj klucz ADB","Add Key":"Dodaj klucz","Add the following ADB Key to STF?":"Dodać następujący klucz ADB do STF?","Admin mode has been disabled.":"Tryb admina został wyłączony.","Admin mode has been enabled.":"Tryb admina został włączony","Advanced":"Zaawansowany","Advanced Input":"Wprowadzanie zaawansowane","Airplane Mode":"Tryb samolotowy","App Store":"Sklep","App Upload":"Wysyłanie aplikacji","Apps":"Aplikacje","Are you sure you want to reboot this device?":"Czy na pewno chcesz zrestartować to urządzenie?","Automation":"Automatyzacja","Available":"Dostępny","Back":"Wróć","Battery":"Bateria","Battery Health":"Kondycja baterii","Battery Level":"Poziom baterii","Battery Source":"Źródło baterii","Battery Status":"Status baterii","Battery Temp":"Temperatura baterii","Bluetooth":"Bluetooth","Browser":"Przeglądarka","Busy":"Zajęty","Busy Devices":"Zajęte urządzenia","Camera":"Aparat","Cancel":"Anuluj","Cannot access specified URL":"Nie można uzyskać dostępu do podanego adresu URL","Carrier":"Operator","Category":"Kategoria","Charging":"Ładowanie","Check errors below":"Zwróć uwagę na błędy","Clear":"Wyczyść logi","Clipboard":"Schowek","Cold":"Chłodny","Connected":"Połączony","Connected successfully.":"Połączono pomyślnie.","Control":"Kontrola","Cookies":"Ciasteczka","Cores":"Liczba Rdzeni","CPU":"CPU","Customize":"Personalizuj","D-pad Center":"D-Pad Środek","D-pad Down":"D-pad Dół","D-pad Left":"D-pad Lewo","D-pad Right":"D-pad Prawo","D-pad Up":"D-pad Góra","Dashboard":"Kokpit","Data":"Dane","Dead":"Martwy","Delete":"Usuń","Density":"Gęstość","Details":"Szczegóły","Developer":"Developer","Device":"Urządzenie","Device cannot get kicked from the group":"Urządzenie nie może zostać wyrzucone z grupy","Device is not present anymore for some reason.":"Urządzenie z jakiegoś powodu nie jest już dostępne","Device is present but offline.":"Urządzenie jest dostępne, lecz jest offline.","Device Photo":"Zdjęcie urządzenia","Device Settings":"Ustawienia urządzenia","Device was disconnected":"Urządzenie zostało odłączone","Device was kicked by automatic timeout.":"Urządzenie zostało wyrzucone z powodu braku aktywności.","Devices":"Urządzenia","Disable WiFi":"Wyłącz WiFi","Discharging":"Rozładowywanie","Disconnected":"Odłączone","Display":"Wyświetlacz","Drop file to upload":"Upuść plik aby go wysłać","Dummy":"Głupie","Enable notifications":"Włącz powiadomienia","Enable WiFi":"Włącz WiFi","Encrypted":"Zaszyfrowane","Error":"Błąd","Error while getting data":"Zapytanie o dane zakończone błędem","Error while reconnecting":"Ponowne połączenie nie powiodło się","Ethernet":"Ethernet","Executes remote shell commands":"Wykonuje zdalne polecenia powłoki","Failed to download file":"Pobieranie zakończone niepowodzeniem","Fast Forward":"Przekaż do","File Explorer":"Przeglądaj pliki","File Name":"Nazwa pliku","Filter":"Filtr","Find Device":"Znajdź urządzenie","Fingerprint":"Odcisk palca","FPS":"FPS","Frequency":"Częstotliwość","Full":"Pełny","General":"Ogólne","Generate Access Token":"Generuj token dostępu","Generate Login for VNC":"Generuj login do VNC","Generate New Token":"Wygeneruj nowy token","Get":"Pobierz","Get clipboard contents":"Kopiuj zawartość schowka","Go Back":"Wróć","Go Forward":"Przejdź do","Go to Device List":"Przejdź do listy urządzeń","Good":"Dobrze","Hardware":"Hardware","Health":"Kondycja","Height":"Wysokość","Help":"Pomoc","Hide Screen":"Ukryj ekran","Home":"Dom","Host":"Gospodarz","Hostname":"Nazwa gospodarza","ICCID":"ICCID","ID":"ID","IMEI":"IMEI","Incorrect login details":"Niepoprawne dane logowania","Info":"Info","Inspect Device":"Zbadaj urządzenie","Inspector":"Inspektor","Installation canceled by user.":"Instalacja anulowana przez użytkownika.","Installation failed due to an unknown error.":"Instalacja nie powiodła się z powodu nieznanego błedu.","Installation succeeded.":"Instalacja powiodła się.","Installing app...":"Instalowanie aplikacji..","Key":"Klucz","Keys":"Klucze","Language":"Język","Launch Activity":"Uruchom aktywność","Launching activity...":"Uruchamianie aktywności..","Level":"Poziom","Local Settings":"Ustawienia lokalne","Location":"Lokacja","Lock Rotation":"Zablokuj rotację","Logs":"Logi","Manage Apps":"Zarządzaj aplikacjami","Memory":"Pamięć","Menu":"Menu","Model":"Model","Mute":"Wycisz","Name":"Nazwa","Navigation":"Nawigacja","Network":"Sieć","Next":"Dalej","No":"Nie","No access tokens":"Brak kluczy dostępu","No ADB keys":"Brak kluczy ADB","No clipboard data":"Brak danych w schowku","No cookies to show":"Brak ciastek do pokazania","No device screen":"Brak obrazu urządzenia","No devices connected":"Brak podłączonych urządzeń","No photo available":"Brak zdjęć","No Ports Forwarded":"Brak przekierowań portów","Notifications":"Notyfikacje","Offline":"Offline","Oops!":"Ups!","Open":"Otwórz","Orientation":"Orientacja","OS":"OS","Package":"Paczka","Password":"Hasło","Permissions":"Pozwolenia","PID":"PID","Place":"Lokalizacja","Platform":"Platforma","Please enter a valid email":"Proszę wpisać poprawny adres email","Please enter your email":"Proszę wpisać adres email","Please enter your password":"Proszę wpisać swoje hasło","Please enter your Store password":"Proszę wpisać swoje hasło do sklepu","Port":"Port","Port Forwarding":"Przekierowanie portów","Power":"Zasilanie","Power Source":"Źródło zasilania","Preparing":"Przygotowywanie","Press Back button":"Naciśnij klawisz \"Wstecz\"","Press Home button":"Naciśnij klawicz \"Home\"","Press Menu button":"Naciśnij klawicz \"Menu\"","Previous":"Poprzednie","Processing...":"Przetwarzanie..","Product":"Produkt","Pushing app...":"Pushowanie aplikacji..","RAM":"RAM","Ready":"Gotowe","Refresh":"Odśwież","Remove":"Usuń","Sample of log format":"Przykładowy zapis logów","Save Logs": "Zapisz logi","Settings":"Ustawienia","Size":"Rozmiar","Temperature":"Temperatura","User":"Użytkownik","Width":"Szerokość","Version":"Wersja"}} \ No newline at end of file +{ + "pl": { + "-": "-", + "A new version of STF is available": "Nowa wersja STF jest dost\u0119pna", + "A package is already installed with the same name.": "Pakiet o tej samej nazwie jest ju\u017c zainstalowany", + "A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).": "Poprzednio zainstalowana paczka o tej samej nazwie ma inn\u0105 sygnatur\u0119 od nowej (oraz dane starej paczki nie zosta\u0142y usuni\u0119te).", + "A secure container mount point couldn't be accessed on external media.": "Zewn\u0119trzne media nie mog\u0105 uzyska\u0107 dost\u0119pu do punktu montowania zabezpieczonego kontenera.", + "ABI": "ABI", + "AC": "AC", + "Access Tokens": "Tokeny dost\u0119pu", + "Account": "Konto", + "Action": "Akcja", + "Actions": "Akcje", + "Activity": "Aktywno\u015b\u0107", + "ADB Keys": "Klucze ADB", + "Add": "Dodaj", + "Add ADB Key": "Dodaj klucz ADB", + "Add Key": "Dodaj klucz", + "Add the following ADB Key to STF?": "Doda\u0107 nast\u0119puj\u0105cy klucz ADB do STF?", + "Admin mode has been disabled.": "Tryb admina zosta\u0142 wy\u0142\u0105czony.", + "Admin mode has been enabled.": "Tryb admina zosta\u0142 w\u0142\u0105czony", + "Advanced": "Zaawansowany", + "Advanced Input": "Wprowadzanie zaawansowane", + "Airplane Mode": "Tryb samolotowy", + "App Store": "Sklep", + "App Upload": "Wysy\u0142anie aplikacji", + "Apps": "Aplikacje", + "Are you sure you want to reboot this device?": "Czy na pewno chcesz zrestartowa\u0107 to urz\u0105dzenie?", + "Automation": "Automatyzacja", + "Available": "Dost\u0119pny", + "Back": "Wr\u00f3\u0107", + "Battery": "Bateria", + "Battery Health": "Kondycja baterii", + "Battery Level": "Poziom baterii", + "Battery Source": "\u0179r\u00f3d\u0142o baterii", + "Battery Status": "Status baterii", + "Battery Temp": "Temperatura baterii", + "Bluetooth": "Bluetooth", + "Browser": "Przegl\u0105darka", + "Busy": "Zaj\u0119ty", + "Busy Devices": "Zaj\u0119te urz\u0105dzenia", + "Camera": "Aparat", + "Cancel": "Anuluj", + "Cannot access specified URL": "Nie mo\u017cna uzyska\u0107 dost\u0119pu do podanego adresu URL", + "Carrier": "Operator", + "Category": "Kategoria", + "Charging": "\u0141adowanie", + "Check errors below": "Zwr\u00f3\u0107 uwag\u0119 na b\u0142\u0119dy", + "Clear": "Wyczy\u015b\u0107 logi", + "Clipboard": "Schowek", + "Cold": "Ch\u0142odny", + "Connected": "Po\u0142\u0105czony", + "Connected successfully.": "Po\u0142\u0105czono pomy\u015blnie.", + "Control": "Kontrola", + "Cookies": "Ciasteczka", + "Cores": "Liczba Rdzeni", + "CPU": "CPU", + "Customize": "Personalizuj", + "D-pad Center": "D-Pad \u015arodek", + "D-pad Down": "D-pad D\u00f3\u0142", + "D-pad Left": "D-pad Lewo", + "D-pad Right": "D-pad Prawo", + "D-pad Up": "D-pad G\u00f3ra", + "Dashboard": "Kokpit", + "Data": "Dane", + "Dead": "Martwy", + "Delete": "Usu\u0144", + "Density": "G\u0119sto\u015b\u0107", + "Details": "Szczeg\u00f3\u0142y", + "Developer": "Developer", + "Device": "Urz\u0105dzenie", + "Device cannot get kicked from the group": "Urz\u0105dzenie nie mo\u017ce zosta\u0107 wyrzucone z grupy", + "Device is not present anymore for some reason.": "Urz\u0105dzenie z jakiego\u015b powodu nie jest ju\u017c dost\u0119pne", + "Device is present but offline.": "Urz\u0105dzenie jest dost\u0119pne, lecz jest offline.", + "Device Photo": "Zdj\u0119cie urz\u0105dzenia", + "Device Settings": "Ustawienia urz\u0105dzenia", + "Device was disconnected": "Urz\u0105dzenie zosta\u0142o od\u0142\u0105czone", + "Device was kicked by automatic timeout.": "Urz\u0105dzenie zosta\u0142o wyrzucone z powodu braku aktywno\u015bci.", + "Devices": "Urz\u0105dzenia", + "Disable WiFi": "Wy\u0142\u0105cz WiFi", + "Discharging": "Roz\u0142adowywanie", + "Disconnected": "Od\u0142\u0105czone", + "Display": "Wy\u015bwietlacz", + "Drop file to upload": "Upu\u015b\u0107 plik aby go wys\u0142a\u0107", + "Dummy": "G\u0142upie", + "Enable notifications": "W\u0142\u0105cz powiadomienia", + "Enable WiFi": "W\u0142\u0105cz WiFi", + "Encrypted": "Zaszyfrowane", + "Error": "B\u0142\u0105d", + "Error while getting data": "Zapytanie o dane zako\u0144czone b\u0142\u0119dem", + "Error while reconnecting": "Ponowne po\u0142\u0105czenie nie powiod\u0142o si\u0119", + "Ethernet": "Ethernet", + "Executes remote shell commands": "Wykonuje zdalne polecenia pow\u0142oki", + "Failed to download file": "Pobieranie zako\u0144czone niepowodzeniem", + "Fast Forward": "Przeka\u017c do", + "File Explorer": "Przegl\u0105daj pliki", + "File Name": "Nazwa pliku", + "Filter": "Filtr", + "Find Device": "Znajd\u017a urz\u0105dzenie", + "Fingerprint": "Odcisk palca", + "FPS": "FPS", + "Frequency": "Cz\u0119stotliwo\u015b\u0107", + "Full": "Pe\u0142ny", + "General": "Og\u00f3lne", + "Generate Access Token": "Generuj token dost\u0119pu", + "Generate Login for VNC": "Generuj login do VNC", + "Generate New Token": "Wygeneruj nowy token", + "Get": "Pobierz", + "Get clipboard contents": "Kopiuj zawarto\u015b\u0107 schowka", + "Go Back": "Wr\u00f3\u0107", + "Go Forward": "Przejd\u017a do", + "Go to Device List": "Przejd\u017a do listy urz\u0105dze\u0144", + "Good": "Dobrze", + "Hardware": "Hardware", + "Health": "Kondycja", + "Height": "Wysoko\u015b\u0107", + "Help": "Pomoc", + "Hide Screen": "Ukryj ekran", + "Home": "Dom", + "Host": "Gospodarz", + "Hostname": "Nazwa gospodarza", + "ICCID": "ICCID", + "ID": "ID", + "IMEI": "IMEI", + "Incorrect login details": "Niepoprawne dane logowania", + "Info": "Info", + "Inspect Device": "Zbadaj urz\u0105dzenie", + "Inspector": "Inspektor", + "Installation canceled by user.": "Instalacja anulowana przez u\u017cytkownika.", + "Installation failed due to an unknown error.": "Instalacja nie powiod\u0142a si\u0119 z powodu nieznanego b\u0142edu.", + "Installation succeeded.": "Instalacja powiod\u0142a si\u0119.", + "Installing app...": "Instalowanie aplikacji..", + "Key": "Klucz", + "Keys": "Klucze", + "Language": "J\u0119zyk", + "Launch Activity": "Uruchom aktywno\u015b\u0107", + "Launching activity...": "Uruchamianie aktywno\u015bci..", + "Level": "Poziom", + "Local Settings": "Ustawienia lokalne", + "Location": "Lokacja", + "Lock Rotation": "Zablokuj rotacj\u0119", + "Logs": "Logi", + "Manage Apps": "Zarz\u0105dzaj aplikacjami", + "Memory": "Pami\u0119\u0107", + "Menu": "Menu", + "Model": "Model", + "Mute": "Wycisz", + "Name": "Nazwa", + "Navigation": "Nawigacja", + "Network": "Sie\u0107", + "Next": "Dalej", + "No": "Nie", + "No access tokens": "Brak kluczy dost\u0119pu", + "No ADB keys": "Brak kluczy ADB", + "No clipboard data": "Brak danych w schowku", + "No cookies to show": "Brak ciastek do pokazania", + "No device screen": "Brak obrazu urz\u0105dzenia", + "No devices connected": "Brak pod\u0142\u0105czonych urz\u0105dze\u0144", + "No photo available": "Brak zdj\u0119\u0107", + "No Ports Forwarded": "Brak przekierowa\u0144 port\u00f3w", + "Notifications": "Notyfikacje", + "Offline": "Offline", + "Oops!": "Ups!", + "Open": "Otw\u00f3rz", + "Orientation": "Orientacja", + "OS": "OS", + "Package": "Paczka", + "Password": "Has\u0142o", + "Permissions": "Pozwolenia", + "PID": "PID", + "Place": "Lokalizacja", + "Platform": "Platforma", + "Please enter a valid email": "Prosz\u0119 wpisa\u0107 poprawny adres email", + "Please enter your email": "Prosz\u0119 wpisa\u0107 adres email", + "Please enter your password": "Prosz\u0119 wpisa\u0107 swoje has\u0142o", + "Please enter your Store password": "Prosz\u0119 wpisa\u0107 swoje has\u0142o do sklepu", + "Port": "Port", + "Port Forwarding": "Przekierowanie port\u00f3w", + "Power": "Zasilanie", + "Power Source": "\u0179r\u00f3d\u0142o zasilania", + "Preparing": "Przygotowywanie", + "Press Back button": "Naci\u015bnij klawisz \"Wstecz\"", + "Press Home button": "Naci\u015bnij klawicz \"Home\"", + "Press Menu button": "Naci\u015bnij klawicz \"Menu\"", + "Previous": "Poprzednie", + "Processing...": "Przetwarzanie..", + "Product": "Produkt", + "Pushing app...": "Pushowanie aplikacji..", + "RAM": "RAM", + "Ready": "Gotowe", + "Refresh": "Od\u015bwie\u017c", + "Remove": "Usu\u0144", + "Sample of log format": "Przyk\u0142adowy zapis log\u00f3w", + "Save Logs": "Zapisz logi", + "Settings": "Ustawienia", + "Size": "Rozmiar", + "Temperature": "Temperatura", + "User": "U\u017cytkownik", + "Width": "Szeroko\u015b\u0107", + "Version": "Wersja" + } +} diff --git a/res/common/lang/translations/stf.pt_BR.json b/res/common/lang/translations/stf.pt_BR.json index 34550dac9..5a74f1b1f 100644 --- a/res/common/lang/translations/stf.pt_BR.json +++ b/res/common/lang/translations/stf.pt_BR.json @@ -1 +1,375 @@ -{"pt_BR":{"-":"-","A new version of STF is available":"Uma nova versão do STF está disponível","A package is already installed with the same name.":"Já existe um pacote instalado com este nome.","A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).":"Um pacote instalado anteriormente com o mesmo nome tem uma assinatura diferente do novo pacote (e os dados do pacote antigo não foram removidos).","A secure container mount point couldn't be accessed on external media.":"Não foi possível acessar um ponto de montagem de um contêiner seguro em uma mídia externa.","ABI":"ABI","AC":"ACI","ADB Keys":"Chaves ADB","Access Tokens":"Tokens de Acesso","Account":"Conta","Action":"Ação","Actions":"Ações","Activity":"Atividades","Add":"Adicionar","Add ADB Key":"Adicionar chave ADB","Add Key":"Adicionar chave","Add the following ADB Key to STF?":"Adicionar esta chave ADB no STF?","Admin mode has been disabled.":"Modo administrador foi desabilitado","Admin mode has been enabled.":"Modo administrador foi habilitado","Advanced":"Avançado","Advanced Input":"Entrada Avançada","Airplane Mode":"Modo Avião","App Store":"App Store","App Upload":"Instalar Aplicativo","Apps":"Aplicativos","Are you sure you want to reboot this device?":"Você tem certeza que deseja reiniciar o dispositivo?","Automating":"Automatizando","Automation":"Automação","Available":"Disponível","Back":"Voltar","Battery":"Bateria","Battery Health":"Saúde da Bateria","Battery Level":"Nível da Bateria","Battery Source":"Fonte da Bateria","Battery Status":"Estado da Bateria","Battery Temp":"Temperatura da Bateria","Bluetooth":"Bluetooth","Browser":"Navegador","Busy":"Ocupado","Busy Devices":"Devices Ocupados","CPU":"CPU","Camera":"Câmera","Cancel":"Cancelar","Cannot access specified URL":"Não pode acessar a URL inserida","Carrier":"Operadora","Category":"Categoria","Charging":"Carregando","Check errors below":"Verifique os erros abaixo","Clear":"Limpar","Clipboard":"Área de Transferência","Cold":"Frio","Connected":"Conectado","Connected successfully.":"Conectado com sucesso.","Control":"Controlar","Cookies":"Cookies","Cores":"Núcleos","Current rotation:":"Rotação atual","Customize":"Customizar","D-pad Center":"D-pad Centralizado","D-pad Down":"D-pad abaixo","D-pad Left":"D-pad Esquerda","D-pad Right":"D-pad Direita","D-pad Up":"D-pad Acima","Dashboard":"Painel de Controle","Data":"Dados","Date":"Data","Dead":"Parado","Delete":"Deletar","Density":"Densidade","Details":"Detalhes","Developer":"Desenvolvedor","Device":"Dispositivo","Device Photo":"Foto do Dispositivo","Device Settings":"Configurações do Dispositivo","Device cannot get kicked from the group":"O dispositivo não pode ser removido do grupo","Device is not present anymore for some reason.":"O dispositivo não está mais disponível por algum motivo.","Device is present but offline.":"Dispositivo presenta mas está indisponível","Device was disconnected":"Dispositivo desconectado","Device was kicked by automatic timeout.":"Dispositivo foi removido por tempo limite automático.","Devices":"Dispositivos","Disable WiFi":"Desabilitar WiFi","Discharging":"Descarregando","Disconnected":"Disconectado","Display":"Exibição","Domain":"Domínio","Drop file to upload":"Arrastar arquivo para instalar","Dummy":"Modelo","Enable WiFi":"Ativar Wifi","Enable notifications":"Habilitar notificações","Encrypted":"Encriptar","Error":"Erro","Error while getting data":"Erro ao pegar os dados","Error while reconnecting":"Erro ao reconectar","Ethernet":"Ethernet","Executes remote shell commands":"Executar comandos shell remotos","FPS":"FPS","Failed to download file":"Falha ao baixar arquivo","Fast Forward":"Avanço Rápido ","File Explorer":"Explorar Arquivo","Filter":"Filtrar","Find Device":"Encontrar Dispositivo","Fingerprint":"Impressão Digital","Frequency":"Frequencia","Full":"Completo","General":"Geral","Generate Access Token":"Gerar Token de Acesso","Generate Login for VNC":"Gerar acesso por VNC","Generate New Token":"Gerar Novo Token","Get":"Obter","Get clipboard contents":"Obter conteúdo da área de transferência","Go Back":"Voltar","Go Forward":"Avançar","Go to Device List":"Ir para Lista de Dispositivos","Good":"Bom","Hardware":"Hardware","Health":"Saúde","Height":"Altura","Help":"Ajuda","Hide Screen":"Ocultar Tela","Home":"Início","Host":"Host","Hostname":"Nome do Host","ICCID":"ICCID","ID":"ID","IMEI":"IMEI","IMSI":"IMSI","Incorrect login details":"Informações de acesso incorretas","Info":"Informações","Inspect Device":"Inspecionar Dispositivo","Inspecting is currently only supported in WebView":"Atualmente a inspeção só é suportada no WebView","Inspector":"Inspetor","Installation canceled by user.":"Instalação cancelada pelo usuário.","Installation failed due to an unknown error.":"A instalação falhou devido a um erro desconhecido.","Installation succeeded.":"Instalado com sucesso.","Installation timed out.":"Timeout durante instalacão.","Installing app...":"Instalando aplicativo...","Key":"Chave","Keys":"Chaves","Landscape":"Paisagem","Language":"Idioma","Launch Activity":"Abrir Activity","Launching activity...":"Abrindo activity...","Level":"Nível","Local Settings":"Configurações Locais","Location":"Localização","Lock Rotation":"Desabilitar Rotação da Tela","Logs":"Logs","Maintenance":"Manutenção","Make sure to copy your access token now. You won't be able to see it again.":"Certifique-se de copiar o seu token de acesso agora. Você não será capaz de vê-lo novamente.","Manage Apps":"Gerenciar Aplicativos","Manner Mode":"Manner Mode","Manufacturer":"Fabricante","Media":"Mídia","Memory":"Memória","Menu":"Menu","Mobile":"Dispositivo","Mobile DUN":"DUN do Dispositivo","Mobile High Priority":"Dispositivo com Prioridade Alta","Mobile MMS":"MMS do Dispositivo","Mobile SUPL":"SUPL do Dispositivo","Model":"Modelo","More about ADB Keys":"Mais sobre Chaves ADB","More about Access Tokens":"Mais sobre Token de Acesso","Mute":"Mudo","Name":"Nome","Native":"Nativo","Navigation":"Navegação","Network":"Rede","Next":"Próximo","No":"Não","No ADB keys":"Nenhuma chave ADB","No Ports Forwarded":"Sem portas","No access tokens":"Nenhum token de acesso","No clipboard data":"Nenhum dado na área de transferencia","No cookies to show":"Sem cookies para mostrar","No device screen":"Nenhuma tela de dispositivo","No devices connected":"Nenhum device conectado","No photo available":"Nenhuma foto disponível ","No screenshots taken":"Nenhuma captura de tela","Normal Mode":"Modo Normal","Not Charging":"Nada Carregando","Notes":"Notas","Nothing to inspect":"Nada para inspecionar","Notifications":"Notificações","Number":"Número","OS":"SO","Offline":"Indisponível","Oops!":"Oops!","Open":"Aberto","Orientation":"Orientação","Over Voltage":"Tensão excessiva","Overheat":"Superaquecimento","PID":"PID","Package":"Pacote","Password":"Senha","Path":"Caminho","Permissions":"Permissões","Phone":"Telefone","Phone ICCID":"ICCID do Dispositivo","Phone IMEI":"IMEI do Dispositivo","Phone IMSI":"IMSI do Dispositivo","Physical Device":"Dispositivo Físico","Place":"Lugar","Platform":"Plataforma","Play/Pause":"Play/Pause","Please enter a valid email":"Por Favor, insira um e-mail válido","Please enter your LDAP username":"Por Favor entre com seu usuário LDAP","Please enter your Store password":"Por Favor entre com sua senha da Loja","Please enter your Store username":"Por Favor entre com seu usuário da Loja","Please enter your email":"Por Favor entre com seu e-mail","Please enter your name":"Por Favor entre com seu nome","Please enter your password":"Por Favor entre com sua senha","Port":"Porta","Port Forwarding":"Porta de envio","Portrait":"Retrato","Power":"Ligar","Power Source":"Fonte de energia","Preparing":"Preparando","Press Back button":"Pressionar botão Voltar","Press Home button":"Pressionar botão Início","Press Menu button":"Pressionar botão Menu","Previous":"Anterior","Processing...":"Processando...","Product":"Produto","Pushing app...":"Publicando aplicativo...","RAM":"RAM","ROM":"ROM","Ready":"Pronto","Reconnected successfully.":"Reconectado com sucesso.","Refresh":"Atualizar","Released":"Liberado","Reload":"Recaregar","Remote debug":"Dupurar remotamente","Remove":"Remover","Reset":"Resetar","Reset Settings":"Limpar Configurações","Reset all browser settings":"Restar todas as configurações do navegador","Restart Device":"Reiniciar Dipositivo","Retrieving the device screen has timed out.":"Recuperar a tela do dispositivo que expirou.","Retry":"Tentar novamente","Rewind":"Rebobinar","Roaming":"Roaming","Rotate Left":"Rotar para Esquerda","Rotate Right":"Rodar para Direita","Run":"Rodar","Run JavaScript":"Rodar JavaScript","Run the following on your command line to debug the device from your Browser":"Executar a seguinte linha de comando para depurar o navegador do seu dispositivo","Run the following on your command line to debug the device from your IDE":"Executar a seguinte linha de comando para depurar o IDE do seu dispositivo","Run this command to copy the key to your clipboard":"Executar este comando para copiar a chave para a área de transferência","SD Card Mounted":"Catão SD Montado","SDK":"DSK","SIM":"Cartão SIM","Save ScreenShot":"Salvar Captura da Tela","Save...":"Salvar...","Screen":"Tela","Screenshot":"Captura da Tela","Screenshots":"Capturas das Telas","Search":"Buscar","Secure":"Seguro","Selects Next IME":"Selecionar Próximo IME","Serial":"Serial","Server":"Servidor","Server error. Check log output.":"Servidor com erro. Verifique o log de saída","Set":"Inserir","Set Cookie":"Inserir Cookie","Settings":"Configurações","Shell":"Shell","Show Screen":"Mostrar Tela","Sign In":"Entrar","Sign Out":"Sair","Silent Mode":"Modo Silencioso","Size":"Tamanho","Socket connection was lost":"Conexão Socket foi perdida","Someone stole your device.":"Alguém roubou seu dispositivo.","Special Keys":"Chaves Especiais","Start/Stop Logging":"Iniciar/Pausar Entrada","Status":"Estado","Stop":"Parar","Stop Automation":"Parar Automação","Stop Using":"Parar de Usar","Store Account":"Conta da Loja","Sub Type":"Sub Tipo","Switch Charset":"Switch Charset","TID":"TID","Tag":"Tag","Take Pageshot (Needs WebView running)":"Capturar a Página (Necessita que o WebView seja executado)","Take Screenshot":"Captura Tela","Temperature":"Temperatura","Text":"Texto","The URI passed in is invalid.":"URI informada é invalida.","The current view is marked secure and cannot be viewed remotely.":"A visualização atual foi marcada como segura e não pode ser visualizada remotamente.","The device will be unavailable for a moment.":"Este dispositivo estará indisponível por algum momento.","The existing package could not be deleted.":"O pacote existente não pode ser deletado.","The new package couldn't be installed because the verification did not succeed.":"O novo pacote não pode ser instalado porque o arquivo verificado não está correto.","The new package couldn't be installed because the verification timed out.":"O novo pacote não pode ser instalado porque o tempo de verificação expirou.","The new package couldn't be installed in the specified install location because the media is not available.":"O novo pacote não pode ser instalado no local específico porque a mídia não está disponível.","The new package couldn't be installed in the specified install location.":"O novo pacote não pode ser instalado no local específico.","The new package failed because it contains a content provider with thesame authority as a provider already installed in the system.":"O novo pacote falhou porque ele contém um provedor de conteúdo com a mesma autoridade como um provedor já instalado no sistema.","The new package failed because it has specified that it is a test-only package and the caller has not supplied the INSTALL_ALLOW_TEST flag.":"O novo pacote falhou porque ele especificou que ele é um pacote test-only e a função que chama não forneceu o sinalizador INSTALL_ALLOW_TEST.","The new package failed because the current SDK version is newer than that required by the package.":"O novo pacote falhou porque a versão atual do SDK é mais recente do que a exigida pelo pacote.","The new package failed because the current SDK version is older than that required by the package.":"The new package failed because the current SDK version is older than that required by the package.","The new package failed while optimizing and validating its dex files, either because there was not enough storage or the validation failed.":"O novo pacote falhou ao otimizar e validar seus arquivos dex, porque não havia armazenamento suficiente ou a validação falhou.","The new package has an older version code than the currently installed package.":"O novo pacote falhou para otimizar e validar os seus arquivos dex, porque não existe uma exploração suficiente ou uma validação falhou.","The new package is assigned a different UID than it previously held.":"O novo pacote é atribuído um UID diferente do que anteriormente realizada.","The new package uses a feature that is not available.":"O novo pacote usa um recurso que não está disponível.","The new package uses a shared library that is not available.":"O novo pacote usa uma biblioteca compartilhada que não está disponível.","The package archive file is invalid.":"Arquivo no pacote é inválido.","The package being installed contains native code, but none that is compatible with the device's CPU_ABI.":"O pacote que está sendo instalado contém código nativo, mas nenhum compatível com o CPU_ABI do dispositivo.","The package changed from what the calling program expected.":"O pacote mudou do que o programa esperava.","The package is already installed.":"Pacote já instalado.","The package manager service found that the device didn't have enough storage space to install the app.":"O serviço gerenciador de pacotes descobriu que o dispositivo não tinha espaço de armazenamento suficiente para instalar o aplicativo.","The parser did not find any actionable tags (instrumentation or application) in the manifest.":"A análise não encontrou nenhum marcador acionável (instrumentação ou aplicação) no manifesto.","The parser did not find any certificates in the .apk.":"A análise não encontrou nenhum certificado no .apk.","The parser encountered a CertificateEncodingException in one of the files in the .apk.":"A Análise encontrou o CertificateEncodingException em um dos arquivos no .apk.","The parser encountered a bad or missing package name in the manifest.":"A análise encontrou um nome de pacote incorreto ou ausente no manifesto.","The parser encountered a bad shared user id name in the manifest.":"A análise encontrou um nome de ID de usuário compartilhado incorreto no manifesto.","The parser encountered an unexpected exception.":"A análise encontrou uma exceção não esperada. ","The parser encountered some structural problem in the manifest.":"A análise encontrou algum problema na estrutura do manifesto.","The parser found inconsistent certificates on the files in the .apk.":"A análise encontrou uma inconsistência no certificado presente nos arquivos do .apk.","The parser was given a path that is not a file, or does not end with the expected '.apk' extension.":"A análise encontrou: foi dado um caminho que não é um arquivo, ou não termina com a extensão '.apk' esperado.","The parser was unable to retrieve the AndroidManifest.xml file.":"Não foi possível analizar o arquivo AndroidManifest.xml.","The requested shared user does not exist.":"O usuário compartilhado solicitado não existe.","The system failed to install the package because its packaged native code did not match any of the ABIs supported by the system.":"O sistema falhou ao instalar o pacote porque seu código nativo não correspondia a nenhuma das ABIs suportadas pelo sistema.","The system failed to install the package because of system issues.":"O sistema falhou ao instalar o pacote devido a problemas do sistema.","The system failed to install the package because the user is restricted from installing apps.":"O sistema falhou ao instalar o pacote porque o usuário não é autorizado a instalar aplicativos.","Time":"Horário","Tip:":"Dica:","Title":"Título","Toggle Web/Native":"Alterar entre Web e Nativo","Total Devices":"Total de Dispositivos","Try to reconnect":"Tentar reconectar","Type":"Tipo","USB":"USB","Unauthorized":"Não Autorizado","Uninstall":"Desinstalar","Unknown":"Desconhecido","Unknown reason.":"Razão desconhecida.","Unlock Rotation":"Desabilitar Rotação","Unspecified Failure":"Falha não especificada","Upload From Link":"Fazer envio por Link","Upload failed":"Envio falhou","Upload unknown error":"Envio com erro desconhecido","Uploaded file is not valid":"Arquivo enviado não é válido","Uploading...":"Enviado...","Usable Devices":"Dispositivos Utilizáveis","Usb speed":"Velocidade do USB","Use":"Usar","User":"Usuário","Username":"Usuário","Using":"Usando","Using Fallback":"Retornar verssão","VNC":"VNC","Value":"Valor","Version":"Versão","Version Update":"Atualização da Versão","Vibrate Mode":"Modo vibrar","Voltage":"Voltage","Volume":"Volume","Volume Down":"Baixar Volume","Volume Up":"Aumentar Volume","Warning:":"Atenção:","Web":"Web","WiFi":"WiFi","WiMAX":"WiMAX","Width":"Largura","Wireless":"Wireless","X DPI":"DPI X","Y DPI":"DPI Y","Yes":"Sim","You (or someone else) kicked the device.":"Você removeu o dispositivo.","translate":"traduzir"}} \ No newline at end of file +{ + "pt_BR": { + "-": "-", + "A new version of STF is available": "Uma nova vers\u00e3o do STF est\u00e1 dispon\u00edvel", + "A package is already installed with the same name.": "J\u00e1 existe um pacote instalado com este nome.", + "A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).": "Um pacote instalado anteriormente com o mesmo nome tem uma assinatura diferente do novo pacote (e os dados do pacote antigo n\u00e3o foram removidos).", + "A secure container mount point couldn't be accessed on external media.": "N\u00e3o foi poss\u00edvel acessar um ponto de montagem de um cont\u00eainer seguro em uma m\u00eddia externa.", + "ABI": "ABI", + "AC": "ACI", + "ADB Keys": "Chaves ADB", + "Access Tokens": "Tokens de Acesso", + "Account": "Conta", + "Action": "A\u00e7\u00e3o", + "Actions": "A\u00e7\u00f5es", + "Activity": "Atividades", + "Add": "Adicionar", + "Add ADB Key": "Adicionar chave ADB", + "Add Key": "Adicionar chave", + "Add the following ADB Key to STF?": "Adicionar esta chave ADB no STF?", + "Admin mode has been disabled.": "Modo administrador foi desabilitado", + "Admin mode has been enabled.": "Modo administrador foi habilitado", + "Advanced": "Avan\u00e7ado", + "Advanced Input": "Entrada Avan\u00e7ada", + "Airplane Mode": "Modo Avi\u00e3o", + "App Store": "App Store", + "App Upload": "Instalar Aplicativo", + "Apps": "Aplicativos", + "Are you sure you want to reboot this device?": "Voc\u00ea tem certeza que deseja reiniciar o dispositivo?", + "Automating": "Automatizando", + "Automation": "Automa\u00e7\u00e3o", + "Available": "Dispon\u00edvel", + "Back": "Voltar", + "Battery": "Bateria", + "Battery Health": "Sa\u00fade da Bateria", + "Battery Level": "N\u00edvel da Bateria", + "Battery Source": "Fonte da Bateria", + "Battery Status": "Estado da Bateria", + "Battery Temp": "Temperatura da Bateria", + "Bluetooth": "Bluetooth", + "Browser": "Navegador", + "Busy": "Ocupado", + "Busy Devices": "Devices Ocupados", + "CPU": "CPU", + "Camera": "C\u00e2mera", + "Cancel": "Cancelar", + "Cannot access specified URL": "N\u00e3o pode acessar a URL inserida", + "Carrier": "Operadora", + "Category": "Categoria", + "Charging": "Carregando", + "Check errors below": "Verifique os erros abaixo", + "Clear": "Limpar", + "Clipboard": "\u00c1rea de Transfer\u00eancia", + "Cold": "Frio", + "Connected": "Conectado", + "Connected successfully.": "Conectado com sucesso.", + "Control": "Controlar", + "Cookies": "Cookies", + "Cores": "N\u00facleos", + "Current rotation:": "Rota\u00e7\u00e3o atual", + "Customize": "Customizar", + "D-pad Center": "D-pad Centralizado", + "D-pad Down": "D-pad abaixo", + "D-pad Left": "D-pad Esquerda", + "D-pad Right": "D-pad Direita", + "D-pad Up": "D-pad Acima", + "Dashboard": "Painel de Controle", + "Data": "Dados", + "Date": "Data", + "Dead": "Parado", + "Delete": "Deletar", + "Density": "Densidade", + "Details": "Detalhes", + "Developer": "Desenvolvedor", + "Device": "Dispositivo", + "Device Photo": "Foto do Dispositivo", + "Device Settings": "Configura\u00e7\u00f5es do Dispositivo", + "Device cannot get kicked from the group": "O dispositivo n\u00e3o pode ser removido do grupo", + "Device is not present anymore for some reason.": "O dispositivo n\u00e3o est\u00e1 mais dispon\u00edvel por algum motivo.", + "Device is present but offline.": "Dispositivo presenta mas est\u00e1 indispon\u00edvel", + "Device was disconnected": "Dispositivo desconectado", + "Device was kicked by automatic timeout.": "Dispositivo foi removido por tempo limite autom\u00e1tico.", + "Devices": "Dispositivos", + "Disable WiFi": "Desabilitar WiFi", + "Discharging": "Descarregando", + "Disconnected": "Disconectado", + "Display": "Exibi\u00e7\u00e3o", + "Domain": "Dom\u00ednio", + "Drop file to upload": "Arrastar arquivo para instalar", + "Dummy": "Modelo", + "Enable WiFi": "Ativar Wifi", + "Enable notifications": "Habilitar notifica\u00e7\u00f5es", + "Encrypted": "Encriptar", + "Error": "Erro", + "Error while getting data": "Erro ao pegar os dados", + "Error while reconnecting": "Erro ao reconectar", + "Ethernet": "Ethernet", + "Executes remote shell commands": "Executar comandos shell remotos", + "FPS": "FPS", + "Failed to download file": "Falha ao baixar arquivo", + "Fast Forward": "Avan\u00e7o R\u00e1pido ", + "File Explorer": "Explorar Arquivo", + "Filter": "Filtrar", + "Find Device": "Encontrar Dispositivo", + "Fingerprint": "Impress\u00e3o Digital", + "Frequency": "Frequencia", + "Full": "Completo", + "General": "Geral", + "Generate Access Token": "Gerar Token de Acesso", + "Generate Login for VNC": "Gerar acesso por VNC", + "Generate New Token": "Gerar Novo Token", + "Get": "Obter", + "Get clipboard contents": "Obter conte\u00fado da \u00e1rea de transfer\u00eancia", + "Go Back": "Voltar", + "Go Forward": "Avan\u00e7ar", + "Go to Device List": "Ir para Lista de Dispositivos", + "Good": "Bom", + "Hardware": "Hardware", + "Health": "Sa\u00fade", + "Height": "Altura", + "Help": "Ajuda", + "Hide Screen": "Ocultar Tela", + "Home": "In\u00edcio", + "Host": "Host", + "Hostname": "Nome do Host", + "ICCID": "ICCID", + "ID": "ID", + "IMEI": "IMEI", + "IMSI": "IMSI", + "Incorrect login details": "Informa\u00e7\u00f5es de acesso incorretas", + "Info": "Informa\u00e7\u00f5es", + "Inspect Device": "Inspecionar Dispositivo", + "Inspecting is currently only supported in WebView": "Atualmente a inspe\u00e7\u00e3o s\u00f3 \u00e9 suportada no WebView", + "Inspector": "Inspetor", + "Installation canceled by user.": "Instala\u00e7\u00e3o cancelada pelo usu\u00e1rio.", + "Installation failed due to an unknown error.": "A instala\u00e7\u00e3o falhou devido a um erro desconhecido.", + "Installation succeeded.": "Instalado com sucesso.", + "Installation timed out.": "Timeout durante instalac\u00e3o.", + "Installing app...": "Instalando aplicativo...", + "Key": "Chave", + "Keys": "Chaves", + "Landscape": "Paisagem", + "Language": "Idioma", + "Launch Activity": "Abrir Activity", + "Launching activity...": "Abrindo activity...", + "Level": "N\u00edvel", + "Local Settings": "Configura\u00e7\u00f5es Locais", + "Location": "Localiza\u00e7\u00e3o", + "Lock Rotation": "Desabilitar Rota\u00e7\u00e3o da Tela", + "Logs": "Logs", + "Maintenance": "Manuten\u00e7\u00e3o", + "Make sure to copy your access token now. You won't be able to see it again.": "Certifique-se de copiar o seu token de acesso agora. Voc\u00ea n\u00e3o ser\u00e1 capaz de v\u00ea-lo novamente.", + "Manage Apps": "Gerenciar Aplicativos", + "Manner Mode": "Manner Mode", + "Manufacturer": "Fabricante", + "Media": "M\u00eddia", + "Memory": "Mem\u00f3ria", + "Menu": "Menu", + "Mobile": "Dispositivo", + "Mobile DUN": "DUN do Dispositivo", + "Mobile High Priority": "Dispositivo com Prioridade Alta", + "Mobile MMS": "MMS do Dispositivo", + "Mobile SUPL": "SUPL do Dispositivo", + "Model": "Modelo", + "More about ADB Keys": "Mais sobre Chaves ADB", + "More about Access Tokens": "Mais sobre Token de Acesso", + "Mute": "Mudo", + "Name": "Nome", + "Native": "Nativo", + "Navigation": "Navega\u00e7\u00e3o", + "Network": "Rede", + "Next": "Pr\u00f3ximo", + "No": "N\u00e3o", + "No ADB keys": "Nenhuma chave ADB", + "No Ports Forwarded": "Sem portas", + "No access tokens": "Nenhum token de acesso", + "No clipboard data": "Nenhum dado na \u00e1rea de transferencia", + "No cookies to show": "Sem cookies para mostrar", + "No device screen": "Nenhuma tela de dispositivo", + "No devices connected": "Nenhum device conectado", + "No photo available": "Nenhuma foto dispon\u00edvel ", + "No screenshots taken": "Nenhuma captura de tela", + "Normal Mode": "Modo Normal", + "Not Charging": "Nada Carregando", + "Notes": "Notas", + "Nothing to inspect": "Nada para inspecionar", + "Notifications": "Notifica\u00e7\u00f5es", + "Number": "N\u00famero", + "OS": "SO", + "Offline": "Indispon\u00edvel", + "Oops!": "Oops!", + "Open": "Aberto", + "Orientation": "Orienta\u00e7\u00e3o", + "Over Voltage": "Tens\u00e3o excessiva", + "Overheat": "Superaquecimento", + "PID": "PID", + "Package": "Pacote", + "Password": "Senha", + "Path": "Caminho", + "Permissions": "Permiss\u00f5es", + "Phone": "Telefone", + "Phone ICCID": "ICCID do Dispositivo", + "Phone IMEI": "IMEI do Dispositivo", + "Phone IMSI": "IMSI do Dispositivo", + "Physical Device": "Dispositivo F\u00edsico", + "Place": "Lugar", + "Platform": "Plataforma", + "Play/Pause": "Play/Pause", + "Please enter a valid email": "Por Favor, insira um e-mail v\u00e1lido", + "Please enter your LDAP username": "Por Favor entre com seu usu\u00e1rio LDAP", + "Please enter your Store password": "Por Favor entre com sua senha da Loja", + "Please enter your Store username": "Por Favor entre com seu usu\u00e1rio da Loja", + "Please enter your email": "Por Favor entre com seu e-mail", + "Please enter your name": "Por Favor entre com seu nome", + "Please enter your password": "Por Favor entre com sua senha", + "Port": "Porta", + "Port Forwarding": "Porta de envio", + "Portrait": "Retrato", + "Power": "Ligar", + "Power Source": "Fonte de energia", + "Preparing": "Preparando", + "Press Back button": "Pressionar bot\u00e3o Voltar", + "Press Home button": "Pressionar bot\u00e3o In\u00edcio", + "Press Menu button": "Pressionar bot\u00e3o Menu", + "Previous": "Anterior", + "Processing...": "Processando...", + "Product": "Produto", + "Pushing app...": "Publicando aplicativo...", + "RAM": "RAM", + "ROM": "ROM", + "Ready": "Pronto", + "Reconnected successfully.": "Reconectado com sucesso.", + "Refresh": "Atualizar", + "Released": "Liberado", + "Reload": "Recaregar", + "Remote debug": "Dupurar remotamente", + "Remove": "Remover", + "Reset": "Resetar", + "Reset Settings": "Limpar Configura\u00e7\u00f5es", + "Reset all browser settings": "Restar todas as configura\u00e7\u00f5es do navegador", + "Restart Device": "Reiniciar Dipositivo", + "Retrieving the device screen has timed out.": "Recuperar a tela do dispositivo que expirou.", + "Retry": "Tentar novamente", + "Rewind": "Rebobinar", + "Roaming": "Roaming", + "Rotate Left": "Rotar para Esquerda", + "Rotate Right": "Rodar para Direita", + "Run": "Rodar", + "Run JavaScript": "Rodar JavaScript", + "Run the following on your command line to debug the device from your Browser": "Executar a seguinte linha de comando para depurar o navegador do seu dispositivo", + "Run the following on your command line to debug the device from your IDE": "Executar a seguinte linha de comando para depurar o IDE do seu dispositivo", + "Run this command to copy the key to your clipboard": "Executar este comando para copiar a chave para a \u00e1rea de transfer\u00eancia", + "SD Card Mounted": "Cat\u00e3o SD Montado", + "SDK": "DSK", + "SIM": "Cart\u00e3o SIM", + "Save ScreenShot": "Salvar Captura da Tela", + "Save...": "Salvar...", + "Screen": "Tela", + "Screenshot": "Captura da Tela", + "Screenshots": "Capturas das Telas", + "Search": "Buscar", + "Secure": "Seguro", + "Selects Next IME": "Selecionar Pr\u00f3ximo IME", + "Serial": "Serial", + "Server": "Servidor", + "Server error. Check log output.": "Servidor com erro. Verifique o log de sa\u00edda", + "Set": "Inserir", + "Set Cookie": "Inserir Cookie", + "Settings": "Configura\u00e7\u00f5es", + "Shell": "Shell", + "Show Screen": "Mostrar Tela", + "Sign In": "Entrar", + "Sign Out": "Sair", + "Silent Mode": "Modo Silencioso", + "Size": "Tamanho", + "Socket connection was lost": "Conex\u00e3o Socket foi perdida", + "Someone stole your device.": "Algu\u00e9m roubou seu dispositivo.", + "Special Keys": "Chaves Especiais", + "Start/Stop Logging": "Iniciar/Pausar Entrada", + "Status": "Estado", + "Stop": "Parar", + "Stop Automation": "Parar Automa\u00e7\u00e3o", + "Stop Using": "Parar de Usar", + "Store Account": "Conta da Loja", + "Sub Type": "Sub Tipo", + "Switch Charset": "Switch Charset", + "TID": "TID", + "Tag": "Tag", + "Take Pageshot (Needs WebView running)": "Capturar a P\u00e1gina (Necessita que o WebView seja executado)", + "Take Screenshot": "Captura Tela", + "Temperature": "Temperatura", + "Text": "Texto", + "The URI passed in is invalid.": "URI informada \u00e9 invalida.", + "The current view is marked secure and cannot be viewed remotely.": "A visualiza\u00e7\u00e3o atual foi marcada como segura e n\u00e3o pode ser visualizada remotamente.", + "The device will be unavailable for a moment.": "Este dispositivo estar\u00e1 indispon\u00edvel por algum momento.", + "The existing package could not be deleted.": "O pacote existente n\u00e3o pode ser deletado.", + "The new package couldn't be installed because the verification did not succeed.": "O novo pacote n\u00e3o pode ser instalado porque o arquivo verificado n\u00e3o est\u00e1 correto.", + "The new package couldn't be installed because the verification timed out.": "O novo pacote n\u00e3o pode ser instalado porque o tempo de verifica\u00e7\u00e3o expirou.", + "The new package couldn't be installed in the specified install location because the media is not available.": "O novo pacote n\u00e3o pode ser instalado no local espec\u00edfico porque a m\u00eddia n\u00e3o est\u00e1 dispon\u00edvel.", + "The new package couldn't be installed in the specified install location.": "O novo pacote n\u00e3o pode ser instalado no local espec\u00edfico.", + "The new package failed because it contains a content provider with thesame authority as a provider already installed in the system.": "O novo pacote falhou porque ele cont\u00e9m um provedor de conte\u00fado com a mesma autoridade como um provedor j\u00e1 instalado no sistema.", + "The new package failed because it has specified that it is a test-only package and the caller has not supplied the INSTALL_ALLOW_TEST flag.": "O novo pacote falhou porque ele especificou que ele \u00e9 um pacote test-only e a fun\u00e7\u00e3o que chama n\u00e3o forneceu o sinalizador INSTALL_ALLOW_TEST.", + "The new package failed because the current SDK version is newer than that required by the package.": "O novo pacote falhou porque a vers\u00e3o atual do SDK \u00e9 mais recente do que a exigida pelo pacote.", + "The new package failed because the current SDK version is older than that required by the package.": "The new package failed because the current SDK version is older than that required by the package.", + "The new package failed while optimizing and validating its dex files, either because there was not enough storage or the validation failed.": "O novo pacote falhou ao otimizar e validar seus arquivos dex, porque n\u00e3o havia armazenamento suficiente ou a valida\u00e7\u00e3o falhou.", + "The new package has an older version code than the currently installed package.": "O novo pacote falhou para otimizar e validar os seus arquivos dex, porque n\u00e3o existe uma explora\u00e7\u00e3o suficiente ou uma valida\u00e7\u00e3o falhou.", + "The new package is assigned a different UID than it previously held.": "O novo pacote \u00e9 atribu\u00eddo um UID diferente do que anteriormente realizada.", + "The new package uses a feature that is not available.": "O novo pacote usa um recurso que n\u00e3o est\u00e1 dispon\u00edvel.", + "The new package uses a shared library that is not available.": "O novo pacote usa uma biblioteca compartilhada que n\u00e3o est\u00e1 dispon\u00edvel.", + "The package archive file is invalid.": "Arquivo no pacote \u00e9 inv\u00e1lido.", + "The package being installed contains native code, but none that is compatible with the device's CPU_ABI.": "O pacote que est\u00e1 sendo instalado cont\u00e9m c\u00f3digo nativo, mas nenhum compat\u00edvel com o CPU_ABI do dispositivo.", + "The package changed from what the calling program expected.": "O pacote mudou do que o programa esperava.", + "The package is already installed.": "Pacote j\u00e1 instalado.", + "The package manager service found that the device didn't have enough storage space to install the app.": "O servi\u00e7o gerenciador de pacotes descobriu que o dispositivo n\u00e3o tinha espa\u00e7o de armazenamento suficiente para instalar o aplicativo.", + "The parser did not find any actionable tags (instrumentation or application) in the manifest.": "A an\u00e1lise n\u00e3o encontrou nenhum marcador acion\u00e1vel (instrumenta\u00e7\u00e3o ou aplica\u00e7\u00e3o) no manifesto.", + "The parser did not find any certificates in the .apk.": "A an\u00e1lise n\u00e3o encontrou nenhum certificado no .apk.", + "The parser encountered a CertificateEncodingException in one of the files in the .apk.": "A An\u00e1lise encontrou o CertificateEncodingException em um dos arquivos no .apk.", + "The parser encountered a bad or missing package name in the manifest.": "A an\u00e1lise encontrou um nome de pacote incorreto ou ausente no manifesto.", + "The parser encountered a bad shared user id name in the manifest.": "A an\u00e1lise encontrou um nome de ID de usu\u00e1rio compartilhado incorreto no manifesto.", + "The parser encountered an unexpected exception.": "A an\u00e1lise encontrou uma exce\u00e7\u00e3o n\u00e3o esperada. ", + "The parser encountered some structural problem in the manifest.": "A an\u00e1lise encontrou algum problema na estrutura do manifesto.", + "The parser found inconsistent certificates on the files in the .apk.": "A an\u00e1lise encontrou uma inconsist\u00eancia no certificado presente nos arquivos do .apk.", + "The parser was given a path that is not a file, or does not end with the expected '.apk' extension.": "A an\u00e1lise encontrou: foi dado um caminho que n\u00e3o \u00e9 um arquivo, ou n\u00e3o termina com a extens\u00e3o '.apk' esperado.", + "The parser was unable to retrieve the AndroidManifest.xml file.": "N\u00e3o foi poss\u00edvel analizar o arquivo AndroidManifest.xml.", + "The requested shared user does not exist.": "O usu\u00e1rio compartilhado solicitado n\u00e3o existe.", + "The system failed to install the package because its packaged native code did not match any of the ABIs supported by the system.": "O sistema falhou ao instalar o pacote porque seu c\u00f3digo nativo n\u00e3o correspondia a nenhuma das ABIs suportadas pelo sistema.", + "The system failed to install the package because of system issues.": "O sistema falhou ao instalar o pacote devido a problemas do sistema.", + "The system failed to install the package because the user is restricted from installing apps.": "O sistema falhou ao instalar o pacote porque o usu\u00e1rio n\u00e3o \u00e9 autorizado a instalar aplicativos.", + "Time": "Hor\u00e1rio", + "Tip:": "Dica:", + "Title": "T\u00edtulo", + "Toggle Web/Native": "Alterar entre Web e Nativo", + "Total Devices": "Total de Dispositivos", + "Try to reconnect": "Tentar reconectar", + "Type": "Tipo", + "USB": "USB", + "Unauthorized": "N\u00e3o Autorizado", + "Uninstall": "Desinstalar", + "Unknown": "Desconhecido", + "Unknown reason.": "Raz\u00e3o desconhecida.", + "Unlock Rotation": "Desabilitar Rota\u00e7\u00e3o", + "Unspecified Failure": "Falha n\u00e3o especificada", + "Upload From Link": "Fazer envio por Link", + "Upload failed": "Envio falhou", + "Upload unknown error": "Envio com erro desconhecido", + "Uploaded file is not valid": "Arquivo enviado n\u00e3o \u00e9 v\u00e1lido", + "Uploading...": "Enviado...", + "Usable Devices": "Dispositivos Utiliz\u00e1veis", + "Usb speed": "Velocidade do USB", + "Use": "Usar", + "User": "Usu\u00e1rio", + "Username": "Usu\u00e1rio", + "Using": "Usando", + "Using Fallback": "Retornar verss\u00e3o", + "VNC": "VNC", + "Value": "Valor", + "Version": "Vers\u00e3o", + "Version Update": "Atualiza\u00e7\u00e3o da Vers\u00e3o", + "Vibrate Mode": "Modo vibrar", + "Voltage": "Voltage", + "Volume": "Volume", + "Volume Down": "Baixar Volume", + "Volume Up": "Aumentar Volume", + "Warning:": "Aten\u00e7\u00e3o:", + "Web": "Web", + "WiFi": "WiFi", + "WiMAX": "WiMAX", + "Width": "Largura", + "Wireless": "Wireless", + "X DPI": "DPI X", + "Y DPI": "DPI Y", + "Yes": "Sim", + "You (or someone else) kicked the device.": "Voc\u00ea removeu o dispositivo.", + "translate": "traduzir" + } +} diff --git a/res/common/lang/translations/stf.ru_RU.json b/res/common/lang/translations/stf.ru_RU.json index b73c03367..dddcc7861 100644 --- a/res/common/lang/translations/stf.ru_RU.json +++ b/res/common/lang/translations/stf.ru_RU.json @@ -1 +1,296 @@ -{"ru_RU":{"A new version of STF is available":"Доступна новая версия STF","A package is already installed with the same name.":"Пакет уже установлен с таким же названием.","A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).":"Ранее установленный пакет с таким же названием имеет отличающуюся цифровую подпись (также не удалены данные старого пакета)","Account":"Учетная запись","Action":"Действие","Actions":"Действия","ADB Keys":"Ключи ADB","Add":"Добавить","Add ADB Key":"Добавить ADB ключ","Add Key":"Добавить ключ","Add the following ADB Key to STF?":"Добавить ADB ключ к STF?","Admin mode has been disabled.":"Режим администратора отключен.","Admin mode has been enabled.":"Режим администратора включен.","Advanced":"Расширенный","Advanced Input":"Расширенный ввод","Airplane Mode":"Режим В самолёте","App Store":"Play Маркет","App Upload":"Загрузка приложения","Apps":"Приложения","Are you sure you want to reboot this device?":"Вы уверены, что хотите перезагрузить устройство?","Automation":"Автоматизация","Available":"Доступен","Back":"Назад","Battery":"Аккумулятор","Battery Health":"Состояние батареи","Battery Level":"Уровень зарядки аккумулятора","Battery Status":"Статус аккумулятора","Battery Temp":"Температура аккумулятора","Browser":"Браузер","Busy":"Занято","Busy Devices":"Используемые устройства","Camera":"Камера","Cancel":"Отменить","Cannot access specified URL":"Невозможно отрыть заданный URL","Carrier":"Оператор","Category":"Категория","Charging":"Заряжается","Check errors below":"Проверьте сообщения об ошибках ниже","Clear":"Очистить","Clipboard":"Буфер обмена","Cold":"Холодно","Connected":"Подключено","Connected successfully.":"Подключено успешно.","Cores":"Ядер","CPU":"Процессор","Customize":"Настроить","D-pad Center":"Центральная кнопка D-pad","D-pad Down":"Вниз","D-pad Left":"Влево","D-pad Right":"Вправо","D-pad Up":"Вверх","Dashboard":"Приборная панель","Data":"Данные","Dead":"Не отвечает","Delete":"Удалить","Density":"Плотность","Details":"Детали","Developer":"Разработчик","Device":"Устройство","Device cannot get kicked from the group":"Устройство не может быть исключено из группы","Device is not present anymore for some reason.":"Подключение к устройству отсутствует по неизвестной причине.","Device is present but offline.":"Устройство подключено, но не активно.","Device Photo":"Фото устройства","Device Settings":"Настройки устройства","Device was disconnected":"Устройство было отключено","Device was kicked by automatic timeout.":"Устройство было отключено по таймауту.","Devices":"Устройства","Disable WiFi":"Отключить WiFi","Discharging":"Разряжается","Disconnected":"Отключено","Display":"Экран","Drop file to upload":"Перетащите файл для загрузки","Dummy":"Макет","Enable notifications":"Включить уведомления","Enable WiFi":"Включить WiFi","Encrypted":"Зашифровано","Error":"Ошибка","Error while getting data":"Ошибка во время получения данных","Error while reconnecting":"Ошибка переподключения","Ethernet":"Проводная сеть","Executes remote shell commands":"Выполняет удалённые команды shell","Failed to download file":"Не удалось загрузить файл","Fast Forward":"Перемотка вперёд","File Name":"Имя файла","Filter":"Фильтр","Find Device":"Обнаружить устройство","Fingerprint":"Отпечаток пальца","Frequency":"Частота","Full":"Полный","General":"Общие","Get":"Получить","Get clipboard contents":"Получить содержимое буфера обмена","Go Back":"Назад","Go Forward":"Вперёд","Go to Device List":"Открыть список устройств","Good":"Хорошее","Hardware":"Железо","Health":"Состояние","Height":"Высота","Help":"Помощь","Hide Screen":"Спрятать экран","Home":"Домашний экран","Hostname":"Имя хоста","Incorrect login details":"Некорректные логин или пароль","Info":"Инфо","Inspect Device":"Инспектировать устройство","Inspecting is currently only supported in WebView":"Инспектирование пока поддерживается в WebView","Inspector":"Инспекто","Installation canceled by user.":"Установка отменена пользователем.","Installation failed due to an unknown error.":"Установка не удалась по неизвестной причине.","Installation succeeded.":"Установка прошла успешно.","Installation timed out.":"Время установки истекло.","Installing app...":"Устанавливаем приложение...","Key":"Ключ","Keys":"Ключи","Landscape":"Ландшафт","Language":"Язык","Launch Activity":"Запустить приложение","Launching activity...":"Приложение запускается...","Level":"Уровень","Local Settings":"Локальные настройки","Location":"Местоположение","Logs":"Журнал","Maintenance":"Обслуживание","Manage Apps":"Управление приложениями","Manufacturer":"Производитель","Memory":"Память","Menu":"Меню","Mobile":"Мобильный","Model":"Модель","More about Access Tokens":"Подробнее о ключах доступа","More about ADB Keys":"Подробнее о ADB ключах","Mute":"Выключить звук","Name":"Имя","Native":"Нативный","Navigation":"Навигация","Network":"Сеть","Next":"Следующий","No":"Нет","No access tokens":"Ключи доступа отсутствуют","No ADB keys":"ADB ключи отсутствуют","No clipboard data":"В буфере обмена нет данных","No cookies to show":"Отсутствуют cookies","No devices connected":"Нет подключенных устройств","No photo available":"Отсутствует фото","No Ports Forwarded":"Отсутствуют перенаправленные порты","No screenshots taken":"Снимки экрана отсутствуют","Normal Mode":"Нормальный режим","Not Charging":"Не заряжается","Notes":"Записи","Notifications":"Уведомления","Number":"Число","Oops!":"Ой","Open":"Открыть","Orientation":"Ориентация","Package":"Пакет","Password":"Пароль","Phone":"Телефон","Physical Device":"Физическое устройство","Place":"Место","Platform":"Платформа","Play/Pause":"Играть/Пауза","Please enter a valid email":"Пожалуйста, введите корректный email","Please enter your email":"Пожалуйста, введите email","Please enter your name":"Пожалуйста введите ваше имя","Please enter your password":"Пожалуйста введите пароль","Port":"Порт","Port Forwarding":"Перенаправление портов","Portrait":"Портетный","Power":"Энергия","Power Source":"Источник энергии","Preparing":"Подготовка","Press Back button":"Нажмите кнопку Назад","Press Home button":"Нажмите кнопку Домой","Press Menu button":"Нажмите кнопку Меню","Previous":"Предыдущий","Processing...":"Обрабатываю...","Product":"Продукт","Pushing app...":"Загружаю приложение на устройство...","Ready":"Готово","Reconnected successfully.":"Переподключился успешно.","Refresh":"Обновить","Released":"Свободно","Reload":"Перезагрузить","Remote debug":"Удалённая отладка","Remove":"Удалить","Reset":"Сбросить","Reset all browser settings":"Сбросить все настройки браузера","Reset Settings":"Сбросить настройки","Restart Device":"Перезагрузить устройство","Retrieving the device screen has timed out.":"Попытка получить снимок устройства не завершилась вовремя.","Retry":"Повторить","Rewind":"Перемотать назад","Rotate Left":"Повернуть влево","Rotate Right":"Повернуть вправо","Run":"Выполнить","Run JavaScript":"Выполнить JavaScript","Run the following on your command line to debug the device from your Browser":"Выполните эту команду, чтобы отладить устройство из вашего Браузера","Run the following on your command line to debug the device from your IDE":"Выполните эту команду, чтобы отладить устройство из вашего IDE","Run this command to copy the key to your clipboard":"Выполните эту команду, чтобы скопировать ключ в буфер обмена","Sample of log format":"Образец формата журнал","Save Logs": "сохранить журнал","Save ScreenShot":"Сохранить скриншот","Save...":"Сохранить..","Screen":"Экран","Screenshot":"Снимок экрана","Screenshots":"Снимки экрана","SD Card Mounted":"SD карта подключена","Search":"Поиск","Serial":"Серийный номер","Server error. Check log output.":"Ошибка сервера. Проверьте журнал.","Set":"Установить","Set Cookie":"Установить cookie","Settings":"Настройки","Shell":"Командная оболочка","Show Screen":"Показать экран","Sign In":"Войти","Sign Out":"Выйти","Silent Mode":"Тихий режим","Size":"Размер","Socket connection was lost":"Подключение через socket потеряно","Someone stole your device.":"Кто-то утащил ваше устройство","Special Keys":"Специальные кнопки","Start/Stop Logging":"Начать/Остановить журналирование","Status":"Статус","Stop":"Стоп","Stop Using":"Освободить","Store Account":"Учетная запись магазина приложений","Sub Type":"Подтип","Switch Charset":"Переключить кодировку","Take Pageshot (Needs WebView running)":"Сделать снимок странички (WebView должен быть запущен)","Take Screenshot":"Сделать снимок экрана","Temperature":"Температура","Text":"Текст","The current view is marked secure and cannot be viewed remotely.":"Текущий просмотр отмечен как безопасный и к нему нельзя получить доступ удалённо.","The device will be unavailable for a moment.":"Устройство будет временно недоступно.","The existing package could not be deleted.":"Существующий пакет не может быть удалён.","The new package couldn't be installed because the verification did not succeed.":"Пакет не может быть установлен из-за ошибки верификации.","The new package couldn't be installed because the verification timed out.":"Пакет не может быть установлен из-за превышения времени верификации.","The new package couldn't be installed in the specified install location because the media is not available.":"Пакет не может быть установлен в указанное место поскольку оно недоступно.","The new package couldn't be installed in the specified install location.":"Пакет не может быть установлен в указанное место.","The new package has an older version code than the currently installed package.":"Новый пакет имеет более старую версию, чем уже установленный.","The package archive file is invalid.":"Файл архива программы повреждён.","The package is already installed.":"Пакет уже установлен.","The parser encountered an unexpected exception.":"Возникла непредвиденная исключительная ситуация во время работы синтаксического анализатора.","The parser encountered some structural problem in the manifest.":"Синтаксический анализатор обнаружил структурные проблемы в манифесте.","The parser found inconsistent certificates on the files in the .apk.":"Синтаксический анализатор обнаружил несовместимый сертификат в .apk файле","The parser was given a path that is not a file, or does not end with the expected '.apk' extension.":"Синтаксическому анализатору был передан не путь к файлу, или имя файла не заканчивается на '.apk'.","The parser was unable to retrieve the AndroidManifest.xml file.":"Синтаксический анализатор не смог получить файл AndroidManifest.xml","The requested shared user does not exist.":"Требуемый общий пользователь не существует.","The system failed to install the package because of system issues.":"Не удалось установить пакет по причине системной ошибки","The system failed to install the package because the user is restricted from installing apps.":"Не удалось установить пакет, так как данному пользователю запрещена установка приложений.","The URI passed in is invalid.":"Невалидный URI.","TID":"TID","Time":"Время","Tip:":"Подсказка:","Toggle Web/Native":"Переключить Web/Native","Total Devices":"Всего устройств","Try to reconnect":"Попробовать подключиться","Type":"Тип","Unauthorized":"Неавторизован","Uninstall":"Удалить","Unknown":"Неизвестный","Unknown reason.":"Неизвестная причина.","Upload failed":"Загрузка завершилась неудачно","Upload From Link":"Загрузить по ссылке","Upload unknown error":"Неизвестная ошибка загрузки","Uploaded file is not valid":"Загруженный файл не валиден","Uploading...":"Загружается...","Usable Devices":"Доступные устройства","USB":"USB","Usb speed":"Скорость USB","Use":"Использовать","User":"Пользователь","Username":"Имя пользователя","Using":"Используется","Version":"Версия","Version Update":"Обновление версии","Vibrate Mode":"Режим вибрации","Voltage":"Напряжение","Volume":"Звук","Volume Down":"Тише","Volume Up":"Громче","Web":"Интернет","Width":"Ширина","WiFi":"WiFi","WiMAX":"WiMAX","Wireless":"Беспроводное","X DPI":"X DPI","Y DPI":"Y DPI","Yes":"Да","You (or someone else) kicked the device.":"Вы (или кто-то еще) отключили устройство."}} \ No newline at end of file +{ + "ru_RU": { + "A new version of STF is available": "\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f STF", + "A package is already installed with the same name.": "\u041f\u0430\u043a\u0435\u0442 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c.", + "A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).": "\u0420\u0430\u043d\u0435\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u044c (\u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430)", + "Account": "\u0423\u0447\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c", + "Action": "\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435", + "Actions": "\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f", + "ADB Keys": "\u041a\u043b\u044e\u0447\u0438 ADB", + "Add": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c", + "Add ADB Key": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c ADB \u043a\u043b\u044e\u0447", + "Add Key": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u044e\u0447", + "Add the following ADB Key to STF?": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c ADB \u043a\u043b\u044e\u0447 \u043a STF?", + "Admin mode has been disabled.": "\u0420\u0435\u0436\u0438\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d.", + "Admin mode has been enabled.": "\u0420\u0435\u0436\u0438\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d.", + "Advanced": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439", + "Advanced Input": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u0432\u0432\u043e\u0434", + "Airplane Mode": "\u0420\u0435\u0436\u0438\u043c \u0412 \u0441\u0430\u043c\u043e\u043b\u0451\u0442\u0435", + "App Store": "Play \u041c\u0430\u0440\u043a\u0435\u0442", + "App Upload": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", + "Apps": "\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", + "Are you sure you want to reboot this device?": "\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e?", + "Automation": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f", + "Available": "\u0414\u043e\u0441\u0442\u0443\u043f\u0435\u043d", + "Back": "\u041d\u0430\u0437\u0430\u0434", + "Battery": "\u0410\u043a\u043a\u0443\u043c\u0443\u043b\u044f\u0442\u043e\u0440", + "Battery Health": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u0430\u0442\u0430\u0440\u0435\u0438", + "Battery Level": "\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0437\u0430\u0440\u044f\u0434\u043a\u0438 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430", + "Battery Status": "\u0421\u0442\u0430\u0442\u0443\u0441 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430", + "Battery Temp": "\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430", + "Browser": "\u0411\u0440\u0430\u0443\u0437\u0435\u0440", + "Busy": "\u0417\u0430\u043d\u044f\u0442\u043e", + "Busy Devices": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", + "Camera": "\u041a\u0430\u043c\u0435\u0440\u0430", + "Cancel": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c", + "Cannot access specified URL": "\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0440\u044b\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 URL", + "Carrier": "\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440", + "Category": "\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f", + "Charging": "\u0417\u0430\u0440\u044f\u0436\u0430\u0435\u0442\u0441\u044f", + "Check errors below": "\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u043d\u0438\u0436\u0435", + "Clear": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c", + "Clipboard": "\u0411\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430", + "Cold": "\u0425\u043e\u043b\u043e\u0434\u043d\u043e", + "Connected": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e", + "Connected successfully.": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e.", + "Cores": "\u042f\u0434\u0435\u0440", + "CPU": "\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440", + "Customize": "\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c", + "D-pad Center": "\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 D-pad", + "D-pad Down": "\u0412\u043d\u0438\u0437", + "D-pad Left": "\u0412\u043b\u0435\u0432\u043e", + "D-pad Right": "\u0412\u043f\u0440\u0430\u0432\u043e", + "D-pad Up": "\u0412\u0432\u0435\u0440\u0445", + "Dashboard": "\u041f\u0440\u0438\u0431\u043e\u0440\u043d\u0430\u044f \u043f\u0430\u043d\u0435\u043b\u044c", + "Data": "\u0414\u0430\u043d\u043d\u044b\u0435", + "Dead": "\u041d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442", + "Delete": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c", + "Density": "\u041f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u044c", + "Details": "\u0414\u0435\u0442\u0430\u043b\u0438", + "Developer": "\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a", + "Device": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e", + "Device cannot get kicked from the group": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0433\u0440\u0443\u043f\u043f\u044b", + "Device is not present anymore for some reason.": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435.", + "Device is present but offline.": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e, \u043d\u043e \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e.", + "Device Photo": "\u0424\u043e\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", + "Device Settings": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", + "Device was disconnected": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e", + "Device was kicked by automatic timeout.": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043f\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443.", + "Devices": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", + "Disable WiFi": "\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c WiFi", + "Discharging": "\u0420\u0430\u0437\u0440\u044f\u0436\u0430\u0435\u0442\u0441\u044f", + "Disconnected": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e", + "Display": "\u042d\u043a\u0440\u0430\u043d", + "Drop file to upload": "\u041f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438", + "Dummy": "\u041c\u0430\u043a\u0435\u0442", + "Enable notifications": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f", + "Enable WiFi": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c WiFi", + "Encrypted": "\u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043e", + "Error": "\u041e\u0448\u0438\u0431\u043a\u0430", + "Error while getting data": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445", + "Error while reconnecting": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f", + "Ethernet": "\u041f\u0440\u043e\u0432\u043e\u0434\u043d\u0430\u044f \u0441\u0435\u0442\u044c", + "Executes remote shell commands": "\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b shell", + "Failed to download file": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b", + "Fast Forward": "\u041f\u0435\u0440\u0435\u043c\u043e\u0442\u043a\u0430 \u0432\u043f\u0435\u0440\u0451\u0434", + "File Name": "\u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430", + "Filter": "\u0424\u0438\u043b\u044c\u0442\u0440", + "Find Device": "\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e", + "Fingerprint": "\u041e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a \u043f\u0430\u043b\u044c\u0446\u0430", + "Frequency": "\u0427\u0430\u0441\u0442\u043e\u0442\u0430", + "Full": "\u041f\u043e\u043b\u043d\u044b\u0439", + "General": "\u041e\u0431\u0449\u0438\u0435", + "Get": "\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c", + "Get clipboard contents": "\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430", + "Go Back": "\u041d\u0430\u0437\u0430\u0434", + "Go Forward": "\u0412\u043f\u0435\u0440\u0451\u0434", + "Go to Device List": "\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432", + "Good": "\u0425\u043e\u0440\u043e\u0448\u0435\u0435", + "Hardware": "\u0416\u0435\u043b\u0435\u0437\u043e", + "Health": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435", + "Height": "\u0412\u044b\u0441\u043e\u0442\u0430", + "Help": "\u041f\u043e\u043c\u043e\u0449\u044c", + "Hide Screen": "\u0421\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u044d\u043a\u0440\u0430\u043d", + "Home": "\u0414\u043e\u043c\u0430\u0448\u043d\u0438\u0439 \u044d\u043a\u0440\u0430\u043d", + "Hostname": "\u0418\u043c\u044f \u0445\u043e\u0441\u0442\u0430", + "Incorrect login details": "\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u043b\u043e\u0433\u0438\u043d \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c", + "Info": "\u0418\u043d\u0444\u043e", + "Inspect Device": "\u0418\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e", + "Inspecting is currently only supported in WebView": "\u0418\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 WebView", + "Inspector": "\u0418\u043d\u0441\u043f\u0435\u043a\u0442\u043e", + "Installation canceled by user.": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c.", + "Installation failed due to an unknown error.": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c \u043f\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435.", + "Installation succeeded.": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e.", + "Installation timed out.": "\u0412\u0440\u0435\u043c\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438\u0441\u0442\u0435\u043a\u043b\u043e.", + "Installing app...": "\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435...", + "Key": "\u041a\u043b\u044e\u0447", + "Keys": "\u041a\u043b\u044e\u0447\u0438", + "Landscape": "\u041b\u0430\u043d\u0434\u0448\u0430\u0444\u0442", + "Language": "\u042f\u0437\u044b\u043a", + "Launch Activity": "\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435", + "Launching activity...": "\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f...", + "Level": "\u0423\u0440\u043e\u0432\u0435\u043d\u044c", + "Local Settings": "\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", + "Location": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435", + "Logs": "\u0416\u0443\u0440\u043d\u0430\u043b", + "Maintenance": "\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435", + "Manage Apps": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438", + "Manufacturer": "\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c", + "Memory": "\u041f\u0430\u043c\u044f\u0442\u044c", + "Menu": "\u041c\u0435\u043d\u044e", + "Mobile": "\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439", + "Model": "\u041c\u043e\u0434\u0435\u043b\u044c", + "More about Access Tokens": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043a\u043b\u044e\u0447\u0430\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u0430", + "More about ADB Keys": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e ADB \u043a\u043b\u044e\u0447\u0430\u0445", + "Mute": "\u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0432\u0443\u043a", + "Name": "\u0418\u043c\u044f", + "Native": "\u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0439", + "Navigation": "\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f", + "Network": "\u0421\u0435\u0442\u044c", + "Next": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439", + "No": "\u041d\u0435\u0442", + "No access tokens": "\u041a\u043b\u044e\u0447\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442", + "No ADB keys": "ADB \u043a\u043b\u044e\u0447\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442", + "No clipboard data": "\u0412 \u0431\u0443\u0444\u0435\u0440\u0435 \u043e\u0431\u043c\u0435\u043d\u0430 \u043d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445", + "No cookies to show": "\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 cookies", + "No devices connected": "\u041d\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432", + "No photo available": "\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0444\u043e\u0442\u043e", + "No Ports Forwarded": "\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0440\u0442\u044b", + "No screenshots taken": "\u0421\u043d\u0438\u043c\u043a\u0438 \u044d\u043a\u0440\u0430\u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442", + "Normal Mode": "\u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c", + "Not Charging": "\u041d\u0435 \u0437\u0430\u0440\u044f\u0436\u0430\u0435\u0442\u0441\u044f", + "Notes": "\u0417\u0430\u043f\u0438\u0441\u0438", + "Notifications": "\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f", + "Number": "\u0427\u0438\u0441\u043b\u043e", + "Oops!": "\u041e\u0439", + "Open": "\u041e\u0442\u043a\u0440\u044b\u0442\u044c", + "Orientation": "\u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f", + "Package": "\u041f\u0430\u043a\u0435\u0442", + "Password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "Phone": "\u0422\u0435\u043b\u0435\u0444\u043e\u043d", + "Physical Device": "\u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e", + "Place": "\u041c\u0435\u0441\u0442\u043e", + "Platform": "\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430", + "Play/Pause": "\u0418\u0433\u0440\u0430\u0442\u044c/\u041f\u0430\u0443\u0437\u0430", + "Please enter a valid email": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 email", + "Please enter your email": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 email", + "Please enter your name": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448\u0435 \u0438\u043c\u044f", + "Please enter your password": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c", + "Port": "\u041f\u043e\u0440\u0442", + "Port Forwarding": "\u041f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u043e\u0432", + "Portrait": "\u041f\u043e\u0440\u0442\u0435\u0442\u043d\u044b\u0439", + "Power": "\u042d\u043d\u0435\u0440\u0433\u0438\u044f", + "Power Source": "\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u044d\u043d\u0435\u0440\u0433\u0438\u0438", + "Preparing": "\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430", + "Press Back button": "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u041d\u0430\u0437\u0430\u0434", + "Press Home button": "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u0414\u043e\u043c\u043e\u0439", + "Press Menu button": "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u041c\u0435\u043d\u044e", + "Previous": "\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439", + "Processing...": "\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e...", + "Product": "\u041f\u0440\u043e\u0434\u0443\u043a\u0442", + "Pushing app...": "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e...", + "Ready": "\u0413\u043e\u0442\u043e\u0432\u043e", + "Reconnected successfully.": "\u041f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e.", + "Refresh": "\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c", + "Released": "\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e", + "Reload": "\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c", + "Remote debug": "\u0423\u0434\u0430\u043b\u0451\u043d\u043d\u0430\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0430", + "Remove": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c", + "Reset": "\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c", + "Reset all browser settings": "\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430", + "Reset Settings": "\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", + "Restart Device": "\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e", + "Retrieving the device screen has timed out.": "\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0432\u0440\u0435\u043c\u044f.", + "Retry": "\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c", + "Rewind": "\u041f\u0435\u0440\u0435\u043c\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0437\u0430\u0434", + "Rotate Left": "\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043b\u0435\u0432\u043e", + "Rotate Right": "\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043f\u0440\u0430\u0432\u043e", + "Run": "\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c", + "Run JavaScript": "\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c JavaScript", + "Run the following on your command line to debug the device from your Browser": "\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438\u0437 \u0432\u0430\u0448\u0435\u0433\u043e \u0411\u0440\u0430\u0443\u0437\u0435\u0440\u0430", + "Run the following on your command line to debug the device from your IDE": "\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438\u0437 \u0432\u0430\u0448\u0435\u0433\u043e IDE", + "Run this command to copy the key to your clipboard": "\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430", + "Sample of log format": "\u041e\u0431\u0440\u0430\u0437\u0435\u0446 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0436\u0443\u0440\u043d\u0430\u043b", + "Save Logs": "\u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b", + "Save ScreenShot": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442", + "Save...": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c..", + "Screen": "\u042d\u043a\u0440\u0430\u043d", + "Screenshot": "\u0421\u043d\u0438\u043c\u043e\u043a \u044d\u043a\u0440\u0430\u043d\u0430", + "Screenshots": "\u0421\u043d\u0438\u043c\u043a\u0438 \u044d\u043a\u0440\u0430\u043d\u0430", + "SD Card Mounted": "SD \u043a\u0430\u0440\u0442\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430", + "Search": "\u041f\u043e\u0438\u0441\u043a", + "Serial": "\u0421\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440", + "Server error. Check log output.": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0436\u0443\u0440\u043d\u0430\u043b.", + "Set": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c", + "Set Cookie": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c cookie", + "Settings": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", + "Shell": "\u041a\u043e\u043c\u0430\u043d\u0434\u043d\u0430\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430", + "Show Screen": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u043a\u0440\u0430\u043d", + "Sign In": "\u0412\u043e\u0439\u0442\u0438", + "Sign Out": "\u0412\u044b\u0439\u0442\u0438", + "Silent Mode": "\u0422\u0438\u0445\u0438\u0439 \u0440\u0435\u0436\u0438\u043c", + "Size": "\u0420\u0430\u0437\u043c\u0435\u0440", + "Socket connection was lost": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 socket \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043e", + "Someone stole your device.": "\u041a\u0442\u043e-\u0442\u043e \u0443\u0442\u0430\u0449\u0438\u043b \u0432\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e", + "Special Keys": "\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043d\u043e\u043f\u043a\u0438", + "Start/Stop Logging": "\u041d\u0430\u0447\u0430\u0442\u044c/\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435", + "Status": "\u0421\u0442\u0430\u0442\u0443\u0441", + "Stop": "\u0421\u0442\u043e\u043f", + "Stop Using": "\u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c", + "Store Account": "\u0423\u0447\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439", + "Sub Type": "\u041f\u043e\u0434\u0442\u0438\u043f", + "Switch Charset": "\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443", + "Take Pageshot (Needs WebView running)": "\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0438 (WebView \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d)", + "Take Screenshot": "\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u044d\u043a\u0440\u0430\u043d\u0430", + "Temperature": "\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430", + "Text": "\u0422\u0435\u043a\u0441\u0442", + "The current view is marked secure and cannot be viewed remotely.": "\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u0442\u043c\u0435\u0447\u0435\u043d \u043a\u0430\u043a \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0438 \u043a \u043d\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e.", + "The device will be unavailable for a moment.": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e.", + "The existing package could not be deleted.": "\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0451\u043d.", + "The new package couldn't be installed because the verification did not succeed.": "\u041f\u0430\u043a\u0435\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0438\u0437-\u0437\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.", + "The new package couldn't be installed because the verification timed out.": "\u041f\u0430\u043a\u0435\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0438\u0437-\u0437\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.", + "The new package couldn't be installed in the specified install location because the media is not available.": "\u041f\u0430\u043a\u0435\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e.", + "The new package couldn't be installed in the specified install location.": "\u041f\u0430\u043a\u0435\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e.", + "The new package has an older version code than the currently installed package.": "\u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0447\u0435\u043c \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439.", + "The package archive file is invalid.": "\u0424\u0430\u0439\u043b \u0430\u0440\u0445\u0438\u0432\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0451\u043d.", + "The package is already installed.": "\u041f\u0430\u043a\u0435\u0442 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d.", + "The parser encountered an unexpected exception.": "\u0412\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430.", + "The parser encountered some structural problem in the manifest.": "\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435.", + "The parser found inconsistent certificates on the files in the .apk.": "\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432 .apk \u0444\u0430\u0439\u043b\u0435", + "The parser was given a path that is not a file, or does not end with the expected '.apk' extension.": "\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0443 \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0435 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443, \u0438\u043b\u0438 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u043d\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 '.apk'.", + "The parser was unable to retrieve the AndroidManifest.xml file.": "\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0430\u0439\u043b AndroidManifest.xml", + "The requested shared user does not exist.": "\u0422\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u043e\u0431\u0449\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.", + "The system failed to install the package because of system issues.": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438", + "The system failed to install the package because the user is restricted from installing apps.": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.", + "The URI passed in is invalid.": "\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 URI.", + "TID": "TID", + "Time": "\u0412\u0440\u0435\u043c\u044f", + "Tip:": "\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430:", + "Toggle Web/Native": "\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c Web/Native", + "Total Devices": "\u0412\u0441\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432", + "Try to reconnect": "\u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f", + "Type": "\u0422\u0438\u043f", + "Unauthorized": "\u041d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d", + "Uninstall": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c", + "Unknown": "\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439", + "Unknown reason.": "\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430.", + "Upload failed": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e", + "Upload From Link": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435", + "Upload unknown error": "\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438", + "Uploaded file is not valid": "\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0435 \u0432\u0430\u043b\u0438\u0434\u0435\u043d", + "Uploading...": "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f...", + "Usable Devices": "\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", + "USB": "USB", + "Usb speed": "\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c USB", + "Use": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c", + "User": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c", + "Username": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f", + "Using": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f", + "Version": "\u0412\u0435\u0440\u0441\u0438\u044f", + "Version Update": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438", + "Vibrate Mode": "\u0420\u0435\u0436\u0438\u043c \u0432\u0438\u0431\u0440\u0430\u0446\u0438\u0438", + "Voltage": "\u041d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435", + "Volume": "\u0417\u0432\u0443\u043a", + "Volume Down": "\u0422\u0438\u0448\u0435", + "Volume Up": "\u0413\u0440\u043e\u043c\u0447\u0435", + "Web": "\u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442", + "Width": "\u0428\u0438\u0440\u0438\u043d\u0430", + "WiFi": "WiFi", + "WiMAX": "WiMAX", + "Wireless": "\u0411\u0435\u0441\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u043e\u0435", + "X DPI": "X DPI", + "Y DPI": "Y DPI", + "Yes": "\u0414\u0430", + "You (or someone else) kicked the device.": "\u0412\u044b (\u0438\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0435\u0449\u0435) \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e." + } +} diff --git a/res/common/lang/translations/stf.zh-Hant.json b/res/common/lang/translations/stf.zh-Hant.json index e34c2bca4..595fca5eb 100644 --- a/res/common/lang/translations/stf.zh-Hant.json +++ b/res/common/lang/translations/stf.zh-Hant.json @@ -1 +1,272 @@ -{"zh-Hant":{"-":"-","A new version of STF is available":"STF有新版本可下载","A package is already installed with the same name.":"已安裝相同名稱的軟體囉。","Access Tokens":"存取憑證","Account":"帳號","Action":"動作","Actions":"更多動作","Activity":"活動","Add":"新增","Admin mode has been disabled.":"停用 Admin 模式","Admin mode has been enabled.":"啟用 Admin 模式","Advanced":"進階","Airplane Mode":"飛行模式","App Store":"App Store","App Upload":"上傳 App","Apps":"Apps","Are you sure you want to reboot this device?":"你確定要重開這台裝置 ?","Automation":"自動化","Available":"可用","Back":"返回","Battery":"電池","Battery Health":"電池健康","Battery Level":"電池電量","Battery Source":"電池電源","Battery Status":"電池狀態","Battery Temp":"電池溫度","Bluetooth":"藍芽","Browser":"瀏覽器","Busy":"忙碌","Busy Devices":"忙碌中的裝置","Camera":"相機","Cancel":"取消","Cannot access specified URL":"無法進入指定網址","Carrier":"電信商","Category":"分類","Charging":"充電中","Check errors below":"請確認下面的錯誤","Clear":"清除","Clipboard":"剪貼簿","Connected":"已連線","Connected successfully.":"連線成功","Control":"控制","Cores":"核心","CPU":"CPU","Current rotation:":"目前螢幕方向:","Customize":"自訂","Data":"資料","Date":"日期","Delete":"刪除","Details":"細項","Developer":"開發者","Device":"裝置","Device Photo":"裝置相片","Device Settings":"裝置設定","Device was disconnected":"裝置已離線","Devices":"裝置","Disable WiFi":"關閉 WiFi","Discharging":"放電中","Disconnected":"離線","Display":"顯示","Drop file to upload":"拖曳到此上傳","Enable notifications":"開啟通知","Enable WiFi":"開啟 WiFi","Error":"錯誤","Error while getting data":"取得資料時錯誤","Error while reconnecting":"重新連線時錯誤","Failed to download file":"下載檔案失敗","Fast Forward":"快轉","File Explorer":"檔案瀏覽器","File Name":"文件名","Filter":"篩選","Find Device":"尋找裝置","Fingerprint":"指紋","FPS":"FPS","Frequency":"頻率","General":"一般","Generate Access Token":"產生存取憑證","Get":"擷取","Get clipboard contents":"取得剪貼簿內容","Go Back":"返回","Go to Device List":"前往裝置清單","Good":"良好","Hardware":"硬體","Health":"健康","Height":"高度","Help":"幫助","Hide Screen":"隱藏畫面","ID":"ID","IMEI":"IMEI","Incorrect login details":"不正確的登入資訊","Info":"資訊","Inspect Device":"查看裝置","Inspector":"檢查器","Installation canceled by user.":"使用者取消安裝","Installation failed due to an unknown error.":"不明原因的安裝錯誤","Installation succeeded.":"安裝成功","Installation timed out.":"安裝超時","Installing app...":"App 安裝中...","Landscape":"橫式","Language":"語言","Launch Activity":"執行活動","Launching activity...":"活動執行中","Level":"電量","Local Settings":"本機設定","Location":"位置","Lock Rotation":"鎖定螢幕旋轉","Maintenance":"維護","Manage Apps":"管理 Apps","Manner Mode":"管理模式","Manufacturer":"製造商","Media":"媒體","Memory":"記憶體","Menu":"選單","Model":"型號","More about Access Tokens":"關於存取憑證","Mute":"靜音","Name":"名稱","Navigation":"導航","Network":"網路","Next":"下一首","No access tokens":"沒有存取憑證","No clipboard data":"剪貼簿無資料","No device screen":"沒有裝置畫面","No devices connected":"無裝置連線","No photo available":"沒有可用的照片","No screenshots taken":"尚未拍截圖","Normal Mode":"正常模式","Not Charging":"未充電","Notes":"備註","Notifications":"通知","Offline":"離線","Oops!":"糟糕了!有錯誤發生","Open":"開啟","Orientation":"螢幕方向","OS":"平台","Overheat":"過熱","Package":"套件","Password":"密碼","Permissions":"權限","Phone":"手機","Phone ICCID":"手機 ICCID","Phone IMEI":"手機 IMEI","Physical Device":"實體裝置","Place":"位置","Platform":"平台","Play/Pause":"播放 / 暫停","Please enter a valid email":"請輸入正確的 email","Please enter your email":"請輸入你的 email","Please enter your LDAP username":"請輸入你的 LDAP 帳號","Please enter your name":"請輸入你的名字","Please enter your password":"請輸入你的密碼","Please enter your Store password":"請輸入你儲存的密碼","Please enter your Store username":"請輸入你儲存的帳號","Power":"電源鍵","Power Source":"電源","Preparing":"準備中","Press Back button":"按返回鍵","Press Home button":"按主目錄鍵","Press Menu button":"按選單鍵","Previous":"上一首","Processing...":"處理中...","Product":"產品","Pushing app...":"App 傳送中...","RAM":"記憶體","Ready":"就緒","Reconnected successfully.":"重新連線成功","Refresh":"更新","Released":"發佈","Reload":"重新讀取","Remote debug":"遠端除蟲","Remove":"移除","Reset":"重設","Reset all browser settings":"重設所有瀏覽器設定","Reset Settings":"重設設定","Restart Device":"裝置重新啟動","Retrieving the device screen has timed out.":"取得裝置畫面已超時","Retry":"重試","Rewind":"倒帶","ROM":"唯讀記憶體","Rotate Left":"向左旋轉","Rotate Right":"向右旋轉","Run":"執行","Run JavaScript":"執行 JavaScript","Sample of log format":"日誌格式示例","Save Logs":"保存日誌","Save ScreenShot":"儲存螢幕截圖","Screen":"螢幕尺寸","Screenshot":"螢幕截圖","Screenshots":"更多螢幕截圖","SD Card Mounted":"已安裝 SD 卡","Search":"搜尋","Selects Next IME":"選擇下一個輸入法","Serial":"序號","Server":"伺服器","Server error. Check log output.":"伺服器錯誤. 請確認輸出的紀錄","Settings":"設定","Show Screen":"顯示畫面","Sign In":"登入","Sign Out":"登出","Silent Mode":"靜音模式","SIM":"SIM","Size":"尺寸","Socket connection was lost":"Socket 失去連線","Someone stole your device.":"別人偷了你的裝置.","Special Keys":"特殊按鍵","Start/Stop Logging":"開始 / 停止 紀錄","Status":"狀態","Stop":"停止","Stop Using":"停止使用","Store Account":"儲存帳號","Sub Type":"次類別","Switch Charset":"切換大小寫","Tag":"標籤","Take Pageshot (Needs WebView running)":"取得頁面截圖 (需執行 WebView)","Take Screenshot":"截圖","Temperature":"溫度","Text":"文字","The current view is marked secure and cannot be viewed remotely.":"目前的畫面已被保護,無法從遠端監看","The device will be unavailable for a moment.":"此裝置暫時無法使用","The existing package could not be deleted.":"現存的套件無法刪除","The new package couldn't be installed because the verification did not succeed.":"新套件無法安裝,驗證不成功.","The new package couldn't be installed because the verification timed out.":"驗證超時,新套件無法安裝","The new package couldn't be installed in the specified install location because the media is not available.":"目前媒體無法使用,無法安裝新套件到指定位置","The new package couldn't be installed in the specified install location.":"無法安裝新套件到指定位置","The new package failed because it contains a content provider with thesame authority as a provider already installed in the system.":"新套件安裝失敗,相同的內容供應商授權已存在.","The new package failed because the current SDK version is newer than that required by the package.":" 新套件安裝失敗,因為目前的 SDK 版本太新","The new package failed because the current SDK version is older than that required by the package.":"新套件安裝失敗,目前 SDK 版本太舊","The new package uses a feature that is not available.":"新套件使用尚未支援的功能","The package is already installed.":"套件已安裝","Time":"時間","Tip:":"提示:","Title":"標題","Toggle Web/Native":"切換 Web / Native","Total Devices":"所有裝置","translate":"翻譯","Try to reconnect":"嘗試重新連線","Type":"類型","Unauthorized":"未授權","Uninstall":"移除","Unknown":"未知","Unknown reason.":"未知原因","Unlock Rotation":"解除螢幕旋轉","Upload failed":"上傳失敗","Upload From Link":"從連結上傳","Upload unknown error":"未知的上傳錯誤","Uploaded file is not valid":"上傳的檔案無效","Uploading...":"上傳中...","Usable Devices":"可用的裝置","USB":"USB","Usb speed":"Usb 速度","Use":"使用","User":"使用者","Username":"帳號","Using":"使用中","Version":"版本","Version Update":"版本更新","Vibrate Mode":"震動模式","VNC":"VNC","Voltage":"電壓","Volume":"音量","Volume Down":"降低音量","Volume Up":"提高音量","Warning:":"警告:","Web":"網頁","Width":"寬度","WiFi":"WiFi","WiMAX":"WiMAX","You (or someone else) kicked the device.":"你 (或別人) 把裝置踢掉了."}} \ No newline at end of file +{ + "zh-Hant": { + "-": "-", + "A new version of STF is available": "STF\u6709\u65b0\u7248\u672c\u53ef\u4e0b\u8f7d", + "A package is already installed with the same name.": "\u5df2\u5b89\u88dd\u76f8\u540c\u540d\u7a31\u7684\u8edf\u9ad4\u56c9\u3002", + "Access Tokens": "\u5b58\u53d6\u6191\u8b49", + "Account": "\u5e33\u865f", + "Action": "\u52d5\u4f5c", + "Actions": "\u66f4\u591a\u52d5\u4f5c", + "Activity": "\u6d3b\u52d5", + "Add": "\u65b0\u589e", + "Admin mode has been disabled.": "\u505c\u7528 Admin \u6a21\u5f0f", + "Admin mode has been enabled.": "\u555f\u7528 Admin \u6a21\u5f0f", + "Advanced": "\u9032\u968e", + "Airplane Mode": "\u98db\u884c\u6a21\u5f0f", + "App Store": "App Store", + "App Upload": "\u4e0a\u50b3 App", + "Apps": "Apps", + "Are you sure you want to reboot this device?": "\u4f60\u78ba\u5b9a\u8981\u91cd\u958b\u9019\u53f0\u88dd\u7f6e ?", + "Automation": "\u81ea\u52d5\u5316", + "Available": "\u53ef\u7528", + "Back": "\u8fd4\u56de", + "Battery": "\u96fb\u6c60", + "Battery Health": "\u96fb\u6c60\u5065\u5eb7", + "Battery Level": "\u96fb\u6c60\u96fb\u91cf", + "Battery Source": "\u96fb\u6c60\u96fb\u6e90", + "Battery Status": "\u96fb\u6c60\u72c0\u614b", + "Battery Temp": "\u96fb\u6c60\u6eab\u5ea6", + "Bluetooth": "\u85cd\u82bd", + "Browser": "\u700f\u89bd\u5668", + "Busy": "\u5fd9\u788c", + "Busy Devices": "\u5fd9\u788c\u4e2d\u7684\u88dd\u7f6e", + "Camera": "\u76f8\u6a5f", + "Cancel": "\u53d6\u6d88", + "Cannot access specified URL": "\u7121\u6cd5\u9032\u5165\u6307\u5b9a\u7db2\u5740", + "Carrier": "\u96fb\u4fe1\u5546", + "Category": "\u5206\u985e", + "Charging": "\u5145\u96fb\u4e2d", + "Check errors below": "\u8acb\u78ba\u8a8d\u4e0b\u9762\u7684\u932f\u8aa4", + "Clear": "\u6e05\u9664", + "Clipboard": "\u526a\u8cbc\u7c3f", + "Connected": "\u5df2\u9023\u7dda", + "Connected successfully.": "\u9023\u7dda\u6210\u529f", + "Control": "\u63a7\u5236", + "Cores": "\u6838\u5fc3", + "CPU": "CPU", + "Current rotation:": "\u76ee\u524d\u87a2\u5e55\u65b9\u5411\uff1a", + "Customize": "\u81ea\u8a02", + "Data": "\u8cc7\u6599", + "Date": "\u65e5\u671f", + "Delete": "\u522a\u9664", + "Details": "\u7d30\u9805", + "Developer": "\u958b\u767c\u8005", + "Device": "\u88dd\u7f6e", + "Device Photo": "\u88dd\u7f6e\u76f8\u7247", + "Device Settings": "\u88dd\u7f6e\u8a2d\u5b9a", + "Device was disconnected": "\u88dd\u7f6e\u5df2\u96e2\u7dda", + "Devices": "\u88dd\u7f6e", + "Disable WiFi": "\u95dc\u9589 WiFi", + "Discharging": "\u653e\u96fb\u4e2d", + "Disconnected": "\u96e2\u7dda", + "Display": "\u986f\u793a", + "Drop file to upload": "\u62d6\u66f3\u5230\u6b64\u4e0a\u50b3", + "Enable notifications": "\u958b\u555f\u901a\u77e5", + "Enable WiFi": "\u958b\u555f WiFi", + "Error": "\u932f\u8aa4", + "Error while getting data": "\u53d6\u5f97\u8cc7\u6599\u6642\u932f\u8aa4", + "Error while reconnecting": "\u91cd\u65b0\u9023\u7dda\u6642\u932f\u8aa4", + "Failed to download file": "\u4e0b\u8f09\u6a94\u6848\u5931\u6557", + "Fast Forward": "\u5feb\u8f49", + "File Explorer": "\u6a94\u6848\u700f\u89bd\u5668", + "File Name": "\u6587\u4ef6\u540d", + "Filter": "\u7be9\u9078", + "Find Device": "\u5c0b\u627e\u88dd\u7f6e", + "Fingerprint": "\u6307\u7d0b", + "FPS": "FPS", + "Frequency": "\u983b\u7387", + "General": "\u4e00\u822c", + "Generate Access Token": "\u7522\u751f\u5b58\u53d6\u6191\u8b49", + "Get": "\u64f7\u53d6", + "Get clipboard contents": "\u53d6\u5f97\u526a\u8cbc\u7c3f\u5167\u5bb9", + "Go Back": "\u8fd4\u56de", + "Go to Device List": "\u524d\u5f80\u88dd\u7f6e\u6e05\u55ae", + "Good": "\u826f\u597d", + "Hardware": "\u786c\u9ad4", + "Health": "\u5065\u5eb7", + "Height": "\u9ad8\u5ea6", + "Help": "\u5e6b\u52a9", + "Hide Screen": "\u96b1\u85cf\u756b\u9762", + "ID": "ID", + "IMEI": "IMEI", + "Incorrect login details": "\u4e0d\u6b63\u78ba\u7684\u767b\u5165\u8cc7\u8a0a", + "Info": "\u8cc7\u8a0a", + "Inspect Device": "\u67e5\u770b\u88dd\u7f6e", + "Inspector": "\u6aa2\u67e5\u5668", + "Installation canceled by user.": "\u4f7f\u7528\u8005\u53d6\u6d88\u5b89\u88dd", + "Installation failed due to an unknown error.": "\u4e0d\u660e\u539f\u56e0\u7684\u5b89\u88dd\u932f\u8aa4", + "Installation succeeded.": "\u5b89\u88dd\u6210\u529f", + "Installation timed out.": "\u5b89\u88dd\u8d85\u6642", + "Installing app...": "App \u5b89\u88dd\u4e2d...", + "Landscape": "\u6a6b\u5f0f", + "Language": "\u8a9e\u8a00", + "Launch Activity": "\u57f7\u884c\u6d3b\u52d5", + "Launching activity...": "\u6d3b\u52d5\u57f7\u884c\u4e2d", + "Level": "\u96fb\u91cf", + "Local Settings": "\u672c\u6a5f\u8a2d\u5b9a", + "Location": "\u4f4d\u7f6e", + "Lock Rotation": "\u9396\u5b9a\u87a2\u5e55\u65cb\u8f49", + "Maintenance": "\u7dad\u8b77", + "Manage Apps": "\u7ba1\u7406 Apps", + "Manner Mode": "\u7ba1\u7406\u6a21\u5f0f", + "Manufacturer": "\u88fd\u9020\u5546", + "Media": "\u5a92\u9ad4", + "Memory": "\u8a18\u61b6\u9ad4", + "Menu": "\u9078\u55ae", + "Model": "\u578b\u865f", + "More about Access Tokens": "\u95dc\u65bc\u5b58\u53d6\u6191\u8b49", + "Mute": "\u975c\u97f3", + "Name": "\u540d\u7a31", + "Navigation": "\u5c0e\u822a", + "Network": "\u7db2\u8def", + "Next": "\u4e0b\u4e00\u9996", + "No access tokens": "\u6c92\u6709\u5b58\u53d6\u6191\u8b49", + "No clipboard data": "\u526a\u8cbc\u7c3f\u7121\u8cc7\u6599", + "No device screen": "\u6c92\u6709\u88dd\u7f6e\u756b\u9762", + "No devices connected": "\u7121\u88dd\u7f6e\u9023\u7dda", + "No photo available": "\u6c92\u6709\u53ef\u7528\u7684\u7167\u7247", + "No screenshots taken": "\u5c1a\u672a\u62cd\u622a\u5716", + "Normal Mode": "\u6b63\u5e38\u6a21\u5f0f", + "Not Charging": "\u672a\u5145\u96fb", + "Notes": "\u5099\u8a3b", + "Notifications": "\u901a\u77e5", + "Offline": "\u96e2\u7dda", + "Oops!": "\u7cdf\u7cd5\u4e86\uff01\u6709\u932f\u8aa4\u767c\u751f", + "Open": "\u958b\u555f", + "Orientation": "\u87a2\u5e55\u65b9\u5411", + "OS": "\u5e73\u53f0", + "Overheat": "\u904e\u71b1", + "Package": "\u5957\u4ef6", + "Password": "\u5bc6\u78bc", + "Permissions": "\u6b0a\u9650", + "Phone": "\u624b\u6a5f", + "Phone ICCID": "\u624b\u6a5f ICCID", + "Phone IMEI": "\u624b\u6a5f IMEI", + "Physical Device": "\u5be6\u9ad4\u88dd\u7f6e", + "Place": "\u4f4d\u7f6e", + "Platform": "\u5e73\u53f0", + "Play/Pause": "\u64ad\u653e / \u66ab\u505c", + "Please enter a valid email": "\u8acb\u8f38\u5165\u6b63\u78ba\u7684 email", + "Please enter your email": "\u8acb\u8f38\u5165\u4f60\u7684 email", + "Please enter your LDAP username": "\u8acb\u8f38\u5165\u4f60\u7684 LDAP \u5e33\u865f", + "Please enter your name": "\u8acb\u8f38\u5165\u4f60\u7684\u540d\u5b57", + "Please enter your password": "\u8acb\u8f38\u5165\u4f60\u7684\u5bc6\u78bc", + "Please enter your Store password": "\u8acb\u8f38\u5165\u4f60\u5132\u5b58\u7684\u5bc6\u78bc", + "Please enter your Store username": "\u8acb\u8f38\u5165\u4f60\u5132\u5b58\u7684\u5e33\u865f", + "Power": "\u96fb\u6e90\u9375", + "Power Source": "\u96fb\u6e90", + "Preparing": "\u6e96\u5099\u4e2d", + "Press Back button": "\u6309\u8fd4\u56de\u9375", + "Press Home button": "\u6309\u4e3b\u76ee\u9304\u9375", + "Press Menu button": "\u6309\u9078\u55ae\u9375", + "Previous": "\u4e0a\u4e00\u9996", + "Processing...": "\u8655\u7406\u4e2d...", + "Product": "\u7522\u54c1", + "Pushing app...": "App \u50b3\u9001\u4e2d...", + "RAM": "\u8a18\u61b6\u9ad4", + "Ready": "\u5c31\u7dd2", + "Reconnected successfully.": "\u91cd\u65b0\u9023\u7dda\u6210\u529f", + "Refresh": "\u66f4\u65b0", + "Released": "\u767c\u4f48", + "Reload": "\u91cd\u65b0\u8b80\u53d6", + "Remote debug": "\u9060\u7aef\u9664\u87f2", + "Remove": "\u79fb\u9664", + "Reset": "\u91cd\u8a2d", + "Reset all browser settings": "\u91cd\u8a2d\u6240\u6709\u700f\u89bd\u5668\u8a2d\u5b9a", + "Reset Settings": "\u91cd\u8a2d\u8a2d\u5b9a", + "Restart Device": "\u88dd\u7f6e\u91cd\u65b0\u555f\u52d5", + "Retrieving the device screen has timed out.": "\u53d6\u5f97\u88dd\u7f6e\u756b\u9762\u5df2\u8d85\u6642", + "Retry": "\u91cd\u8a66", + "Rewind": "\u5012\u5e36", + "ROM": "\u552f\u8b80\u8a18\u61b6\u9ad4", + "Rotate Left": "\u5411\u5de6\u65cb\u8f49", + "Rotate Right": "\u5411\u53f3\u65cb\u8f49", + "Run": "\u57f7\u884c", + "Run JavaScript": "\u57f7\u884c JavaScript", + "Sample of log format": "\u65e5\u8a8c\u683c\u5f0f\u793a\u4f8b", + "Save Logs": "\u4fdd\u5b58\u65e5\u8a8c", + "Save ScreenShot": "\u5132\u5b58\u87a2\u5e55\u622a\u5716", + "Screen": "\u87a2\u5e55\u5c3a\u5bf8", + "Screenshot": "\u87a2\u5e55\u622a\u5716", + "Screenshots": "\u66f4\u591a\u87a2\u5e55\u622a\u5716", + "SD Card Mounted": "\u5df2\u5b89\u88dd SD \u5361", + "Search": "\u641c\u5c0b", + "Selects Next IME": "\u9078\u64c7\u4e0b\u4e00\u500b\u8f38\u5165\u6cd5", + "Serial": "\u5e8f\u865f", + "Server": "\u4f3a\u670d\u5668", + "Server error. Check log output.": "\u4f3a\u670d\u5668\u932f\u8aa4. \u8acb\u78ba\u8a8d\u8f38\u51fa\u7684\u7d00\u9304", + "Settings": "\u8a2d\u5b9a", + "Show Screen": "\u986f\u793a\u756b\u9762", + "Sign In": "\u767b\u5165", + "Sign Out": "\u767b\u51fa", + "Silent Mode": "\u975c\u97f3\u6a21\u5f0f", + "SIM": "SIM", + "Size": "\u5c3a\u5bf8", + "Socket connection was lost": "Socket \u5931\u53bb\u9023\u7dda", + "Someone stole your device.": "\u5225\u4eba\u5077\u4e86\u4f60\u7684\u88dd\u7f6e.", + "Special Keys": "\u7279\u6b8a\u6309\u9375", + "Start/Stop Logging": "\u958b\u59cb / \u505c\u6b62 \u7d00\u9304", + "Status": "\u72c0\u614b", + "Stop": "\u505c\u6b62", + "Stop Using": "\u505c\u6b62\u4f7f\u7528", + "Store Account": "\u5132\u5b58\u5e33\u865f", + "Sub Type": "\u6b21\u985e\u5225", + "Switch Charset": "\u5207\u63db\u5927\u5c0f\u5beb", + "Tag": "\u6a19\u7c64", + "Take Pageshot (Needs WebView running)": "\u53d6\u5f97\u9801\u9762\u622a\u5716 (\u9700\u57f7\u884c WebView)", + "Take Screenshot": "\u622a\u5716", + "Temperature": "\u6eab\u5ea6", + "Text": "\u6587\u5b57", + "The current view is marked secure and cannot be viewed remotely.": "\u76ee\u524d\u7684\u756b\u9762\u5df2\u88ab\u4fdd\u8b77\uff0c\u7121\u6cd5\u5f9e\u9060\u7aef\u76e3\u770b", + "The device will be unavailable for a moment.": "\u6b64\u88dd\u7f6e\u66ab\u6642\u7121\u6cd5\u4f7f\u7528", + "The existing package could not be deleted.": "\u73fe\u5b58\u7684\u5957\u4ef6\u7121\u6cd5\u522a\u9664", + "The new package couldn't be installed because the verification did not succeed.": "\u65b0\u5957\u4ef6\u7121\u6cd5\u5b89\u88dd\uff0c\u9a57\u8b49\u4e0d\u6210\u529f\uff0e", + "The new package couldn't be installed because the verification timed out.": "\u9a57\u8b49\u8d85\u6642\uff0c\u65b0\u5957\u4ef6\u7121\u6cd5\u5b89\u88dd", + "The new package couldn't be installed in the specified install location because the media is not available.": "\u76ee\u524d\u5a92\u9ad4\u7121\u6cd5\u4f7f\u7528\uff0c\u7121\u6cd5\u5b89\u88dd\u65b0\u5957\u4ef6\u5230\u6307\u5b9a\u4f4d\u7f6e", + "The new package couldn't be installed in the specified install location.": "\u7121\u6cd5\u5b89\u88dd\u65b0\u5957\u4ef6\u5230\u6307\u5b9a\u4f4d\u7f6e", + "The new package failed because it contains a content provider with thesame authority as a provider already installed in the system.": "\u65b0\u5957\u4ef6\u5b89\u88dd\u5931\u6557\uff0c\u76f8\u540c\u7684\u5167\u5bb9\u4f9b\u61c9\u5546\u6388\u6b0a\u5df2\u5b58\u5728\uff0e", + "The new package failed because the current SDK version is newer than that required by the package.": " \u65b0\u5957\u4ef6\u5b89\u88dd\u5931\u6557\uff0c\u56e0\u70ba\u76ee\u524d\u7684 SDK \u7248\u672c\u592a\u65b0", + "The new package failed because the current SDK version is older than that required by the package.": "\u65b0\u5957\u4ef6\u5b89\u88dd\u5931\u6557\uff0c\u76ee\u524d SDK \u7248\u672c\u592a\u820a", + "The new package uses a feature that is not available.": "\u65b0\u5957\u4ef6\u4f7f\u7528\u5c1a\u672a\u652f\u63f4\u7684\u529f\u80fd", + "The package is already installed.": "\u5957\u4ef6\u5df2\u5b89\u88dd", + "Time": "\u6642\u9593", + "Tip:": "\u63d0\u793a:", + "Title": "\u6a19\u984c", + "Toggle Web/Native": "\u5207\u63db Web / Native", + "Total Devices": "\u6240\u6709\u88dd\u7f6e", + "translate": "\u7ffb\u8b6f", + "Try to reconnect": "\u5617\u8a66\u91cd\u65b0\u9023\u7dda", + "Type": "\u985e\u578b", + "Unauthorized": "\u672a\u6388\u6b0a", + "Uninstall": "\u79fb\u9664", + "Unknown": "\u672a\u77e5", + "Unknown reason.": "\u672a\u77e5\u539f\u56e0", + "Unlock Rotation": "\u89e3\u9664\u87a2\u5e55\u65cb\u8f49", + "Upload failed": "\u4e0a\u50b3\u5931\u6557", + "Upload From Link": "\u5f9e\u9023\u7d50\u4e0a\u50b3", + "Upload unknown error": "\u672a\u77e5\u7684\u4e0a\u50b3\u932f\u8aa4", + "Uploaded file is not valid": "\u4e0a\u50b3\u7684\u6a94\u6848\u7121\u6548", + "Uploading...": "\u4e0a\u50b3\u4e2d...", + "Usable Devices": "\u53ef\u7528\u7684\u88dd\u7f6e", + "USB": "USB", + "Usb speed": "Usb \u901f\u5ea6", + "Use": "\u4f7f\u7528", + "User": "\u4f7f\u7528\u8005", + "Username": "\u5e33\u865f", + "Using": "\u4f7f\u7528\u4e2d", + "Version": "\u7248\u672c", + "Version Update": "\u7248\u672c\u66f4\u65b0", + "Vibrate Mode": "\u9707\u52d5\u6a21\u5f0f", + "VNC": "VNC", + "Voltage": "\u96fb\u58d3", + "Volume": "\u97f3\u91cf", + "Volume Down": "\u964d\u4f4e\u97f3\u91cf", + "Volume Up": "\u63d0\u9ad8\u97f3\u91cf", + "Warning:": "\u8b66\u544a\uff1a", + "Web": "\u7db2\u9801", + "Width": "\u5bec\u5ea6", + "WiFi": "WiFi", + "WiMAX": "WiMAX", + "You (or someone else) kicked the device.": "\u4f60 (\u6216\u5225\u4eba) \u628a\u88dd\u7f6e\u8e22\u6389\u4e86." + } +} diff --git a/res/common/lang/translations/stf.zh_CN.json b/res/common/lang/translations/stf.zh_CN.json index 36c48c38e..b6380ad94 100644 --- a/res/common/lang/translations/stf.zh_CN.json +++ b/res/common/lang/translations/stf.zh_CN.json @@ -1 +1,371 @@ -{"zh_CN":{"-":"VNC(虚拟网络计算机远程工具)远程登录","A new version of STF is available":"STF有新版本可下载","A package is already installed with the same name.":"已经安装了一个相同名字的安装包","A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).":"新安装包同之前的某个同名安装包发生了签名冲突(老的安装包的数据没有移除)","A secure container mount point couldn't be accessed on external media.":"外部存储无法访问安全容器挂载点","ABI":"ABI","AC":"AC","Access Tokens":"访问令牌","Account":"帐户","Action":"动作","Actions":"更多动作","Activity":"活动","ADB Keys":"安卓调试桥密钥","Add":"添加","Add ADB Key":"添加ADB Key","Add Key":"添加Key","Add the following ADB Key to STF?":"添加以下的ADB Key到STF?","Admin mode has been disabled.":"管理员模式已关闭","Admin mode has been enabled.":"管理员模式已启用","Advanced":"高级","Advanced Input":"高级输入","Airplane Mode":"飞行模式","App Store":"应用商店","App Upload":"上传APP","Apps":"应用程序","Are you sure you want to reboot this device?":"你确定要重启这台设备么?","Automation":"自动化","Available":"可用","Back":"返回","Battery":"电池","Battery Health":"电池健康","Battery Level":"电池电量","Battery Source":"电池电源","Battery Status":"电池状态","Battery Temp":"电池温度","Bluetooth":"蓝牙","Browser":"浏览器","Busy":"繁忙","Busy Devices":"繁忙的设备","Camera":"相机","Cancel":"取消","Cannot access specified URL":"无法访问指定的URL","Carrier":"信号","Category":"分类","Charging":"充电中","Check errors below":"检查下列错误","Clear":"清除","Clipboard":"剪贴板","Cold":"冷却","Connected":"已连接","Connected successfully.":"连接成功","Control":"控制","Cookies":"Cookies","Cores":"核","CPU":"CPU","CPU Platform":"CPU平台","Current rotation:":"当前屏幕旋转","Customize":"自定义","D-pad Center":"模拟键--中间","D-pad Down":"模拟键--下","D-pad Left":"模拟键--左","D-pad Right":"模拟键--右","D-pad Up":"模拟键--上","Dashboard":"控制面板","Data":"数据","Date":"日期","Dead":"无效","Delete":"删除","Density":"密度","Details":"细节","Developer":"开发者","Device":"设备","Device cannot get kicked from the group":"设备无法从该组移出","Device is not present anymore for some reason.":"设备由于某些原因找不到","Device is present but offline.":"设备已找到但处于离线状态","Device Photo":"设备照片","Device Settings":"设备设置","Device was disconnected":"设备已断开连接","Device was kicked by automatic timeout.":"设备由于超时已被移出","Devices":"设备","Disable WiFi":"关闭WIFI","Discharging":"未充电","Disconnected":"断开连接","Display":"播放","Drop file to upload":"拖放文件到这里以上传","Dummy":"虚拟的","Enable notifications":"允许提醒","Enable WiFi":"启用WIFI","Encrypted":"加密的","Error":"错误","Error while getting data":"获取数据时发生错误","Error while reconnecting":"重新连接时发生错误","Ethernet":"以太网","Executes remote shell commands":"执行远程shell命令","Failed to download file":"文件下载失败","Fast Forward":"快进","File Explorer":"文件管理器","File Name":"文件名","Filter":"过滤器","Find Device":"查找设备","Fingerprint":"指纹","FPS":"FPS","Frequency":"频率","Full":"全部","General":"通用","Generate Access Token":"生成访问令牌","Generate Login for VNC":"生成登录VNC","Generate New Token":"生成新令牌","Get":"获取","Get clipboard contents":"获取剪贴板内容","Go Back":"返回","Go Forward":"前进","Go to Device List":"跳转到设备列表","Good":"良好","Hardware":"硬件","Health":"健康","Height":"高度","Help":"帮助","Hide Screen":"隐藏屏幕","Home":"主屏界面","Host":"主机地址","Hostname":"主机名","ICCID":"集成电路卡识别码","ID":"ID","IMEI":"IMEI","Incorrect login details":"登录信息错误","Info":"信息","Inspect Device":"被检查设备","Inspecting is currently only supported in WebView":"检查目前只支持网页视图","Inspector":"检查器","Installation canceled by user.":"用户已取消安装。","Installation failed due to an unknown error.":"未知原因导致安装失败","Installation succeeded.":"安装成功","Installation timed out.":"安装超时","Installing app...":"安装 app...","Key":"密钥","Keys":"按键","Landscape":"横排","Language":"语言","Launch Activity":"启动活动","Launching activity...":"活动启动中...","Level":"等级","Local Settings":"本地设置","Location":"位置","Lock Rotation":"锁定屏幕旋转","Logs":"日志","Maintenance":"维护","Make sure to copy your access token now. You won't be able to see it again.":"请确保已备份您的身份验证凭证,此凭证后续将不再显示!","Manage Apps":"管理Apps","Manner Mode":"管理模式","Manufacturer":"制造商","Media":"媒体","Memory":"内存","Menu":"菜单","Mobile":"手机","Mobile DUN":"手机网络桥接","Mobile High Priority":"移动网络最高优先级","Mobile MMS":"手机彩信","Mobile SUPL":"平面定位特定移动数据连接","Model":"型号","More about Access Tokens":"关于身份验证凭证","More about ADB Keys":"更多关于安卓调试桥密钥","Mute":"静音","Name":"名称","Native":"本地","Navigation":"导航","Network":"网络","Next":"下一步","No":"否","No access tokens":"没有身份验证凭证","No ADB keys":"没有安卓调试桥的密钥","No clipboard data":"剪贴板没有数据","No cookies to show":"没有本地cookies缓存","No device screen":"没有设备画面","No devices connected":"无设备连接","No photo available":"沒有可用的照片","No Ports Forwarded":"没有端口转发","No screenshots taken":"未拍截图","Normal Mode":"正常模式\"","Not Charging":"未充电","Notes":"标注","Nothing to inspect":"无需检查","Notifications":"通知","Number":"数字","Offline":"离线","Oops!":"出错了!","Open":"打开","Orientation":"屏幕方向","OS":"操作系统","Over Voltage":"电压过高","Overheat":"过热","Package":"程序安装包","Password":"密码","Permissions":"权限","Phone":"手机","Phone ICCID":"手机集成电路卡识别码(手机SIM卡唯一识别码)","Phone IMEI":"手机国际移动设备标识","Physical Device":"物理设备","PID":"进程号","Place":"位置","Platform":"平台","Play/Pause":"播放/暂停","Please enter a valid email":"请输入正确格式的 email","Please enter your email":"请输入您的 email","Please enter your LDAP username":"请输入您的LDAP用户名","Please enter your name":"请输入您的姓名","Please enter your password":"请输入您的密码","Please enter your Store password":"请输入您所保存的密码","Please enter your Store username":"输入您所保存的用户名","Port":"端口","Port Forwarding":"转发端口","Portrait":"竖排","Power":"电源","Power Source":"电源来源","Preparing":"准备中","Press Back button":"按后退键","Press Home button":"按Home键","Press Menu button":"按菜单键","Previous":"先前的","Processing...":"处理中...","Product":"产品","Pushing app...":"正在推送 app...","RAM":"随机存取存储器","Ready":"就绪","Reconnected successfully.":"重新连接成功","Refresh":"刷新","Released":"释放","Reload":"重新加载","Remote debug":"远程调试","Remove":"移除","Reset":"重置","Reset all browser settings":"重置所有浏览器设置","Reset Settings":"重置设置","Restart Device":"重启设备","Retrieving the device screen has timed out.":"获取设备画面超时","Retry":"重试","Rewind":"回滚","Roaming":"漫游状态","ROM":"ROM","Rotate Left":"向左翻转","Rotate Right":"向右翻转","Run":"运行","Run JavaScript":"运行 JavaScript","Run the following on your command line to debug the device from your Browser":"运行下面的命令行从您的浏览器中调试设备","Run the following on your command line to debug the device from your IDE":"运行下面命令行从您的IDE调试设备","Run this command to copy the key to your clipboard":"运行此命令将密钥复制到剪贴板","Sample of log format":"日志格式示例","Save Logs":"保存日志","Save ScreenShot":"保存屏幕截图","Save...":"正在保存","Screen":"屏幕","Screenshot":"屏幕截图","Screenshots":"更多屏幕截图","SD Card Mounted":"SD卡已加载","SDK":"SDK","Search":"搜索","Selects Next IME":"选择下一个输入法","Serial":"串行","Server":"服务器","Server error. Check log output.":"服务器错误,请检查输出的日志纪录。","Set":"设置","Set Cookie":"设置cookies缓存","Settings":"设置","Shell":"Shell脚本","Show Screen":"显示屏幕","Sign In":"登录","Sign Out":"注销","Silent Mode":"静音模式","SIM":"SIM","Size":"大小","Socket connection was lost":"双向的通信连接丢失","Someone stole your device.":"有人占用了你的设备","Special Keys":"特殊要点","Start/Stop Logging":"开始 / 停止 日志纪录","Status":"状态","Stop":"停止","Stop Using":"停止使用","Store Account":"保存账号","Sub Type":"子类型","Switch Charset":"切换字符集","Tag":"标签","Take Pageshot (Needs WebView running)":"使用截图(需要WebView 运行)","Take Screenshot":"屏幕截图","Temperature":"温度","Text":"文字","The current view is marked secure and cannot be viewed remotely.":"当前视图有安全标记,并且不能远程查看","The device will be unavailable for a moment.":"此设备将暂时无法使用","The existing package could not be deleted.":"现有的程序包可能不会被删除","The new package couldn't be installed because the verification did not succeed.":"新包不能安装,因为验证没有成功。","The new package couldn't be installed because the verification timed out.":"新包不能安装,因为验证超时。","The new package couldn't be installed in the specified install location because the media is not available.":"新包不能安装在指定的安装位置,因为媒体是不可用。","The new package couldn't be installed in the specified install location.":"新包不能安装在指定的安装位置。","The new package failed because it contains a content provider with thesame authority as a provider already installed in the system.":"新的包安装失败,因为它包含了相同名字的认证已经安装在系统中提供一个内容提供商。","The new package failed because it has specified that it is a test-only package and the caller has not supplied the INSTALL_ALLOW_TEST flag.":"新包安装失败,因为它已被指定,它是一个用于测试的包和调用者并没有给它提供INSTALL_ALLOW_TEST标志。","The new package failed because the current SDK version is newer than that required by the package.":"新的包安装失败,因为当前的SDK版本比程序包所依赖的版本高。","The new package failed because the current SDK version is older than that required by the package.":"新的包安装失败,因为当前的SDK比安装包所依赖的版本低。","The new package failed while optimizing and validating its dex files, either because there was not enough storage or the validation failed.":"新的包安装失败,可能没有验证dex文件或者没有足够的存储导致验证失败。","The new package has an older version code than the currently installed package.":"新的软件包比目前安装的软件包代码版本旧。","The new package is assigned a different UID than it previously held.":"新包分配置的UID与它以前持有的不同。","The new package uses a feature that is not available.":"新包使用功能不可用。","The new package uses a shared library that is not available.":"新包使用的共享库不可用","The package archive file is invalid.":"包存档文件无效。","The package being installed contains native code, but none that is compatible with the device's CPU_ABI.":"正在安装软件包中包含源生内核,但都没有与该设备的CPU_ABI兼容。","The package changed from what the calling program expected.":"程序包被预期调用的程序所修改。","The package is already installed.":"程序包已经安装。","The package manager service found that the device didn't have enough storage space to install the app.":"包管理器服务发现该设备没有足够的存储空间来安装应用程序。","The parser did not find any actionable tags (instrumentation or application) in the manifest.":"解析器没有发现清单任何可操作的标签(工具或应用程序) 。","The parser did not find any certificates in the .apk.":"解析器没有发现在.apk文件的任何证书。","The parser encountered a bad or missing package name in the manifest.":"分析器在清单中遇到损坏或丢失的包名。","The parser encountered a bad shared user id name in the manifest.":"分析器在清单中遇到坏共享的用户ID名称。","The parser encountered a CertificateEncodingException in one of the files in the .apk.":"解析器在的apk的一个文件时遇到证书编码异常。","The parser encountered an unexpected exception.":"解析器遇到意外的异常。","The parser encountered some structural problem in the manifest.":"分析器在清单中遇到的一些结构性问题。","The parser found inconsistent certificates on the files in the .apk.":"分析器发现在的apk文件不一致的证书。","The parser was given a path that is not a file, or does not end with the expected '.apk' extension.":"解析器所获得的是一个路径而不是一个文件,或者文件没有以‘.apk’结尾。","The parser was unable to retrieve the AndroidManifest.xml file.":"分析器无法检索AndroidManifest.xml文件。","The requested shared user does not exist.":"所请求的共享用户不存在","The system failed to install the package because its packaged native code did not match any of the ABIs supported by the system.":"该系统无法安装此软件包,因为其包装原生内核没有匹配到应系统所支持的的ABI。","The system failed to install the package because of system issues.":"因为系统问题无法安装程序。","The system failed to install the package because the user is restricted from installing apps.":"程序安装失败,因为用户被限制安装该应用软件","The URI passed in is invalid.":"该URI传递无效","TID":"线程号","Time":"时间","Tip:":"提示:","Title":"标题","Toggle Web/Native":"切换网络/本地","Total Devices":"设备总数","translate":"翻译","Try to reconnect":"尝试重新连接","Type":"类型","Unauthorized":"未授权的","Uninstall":"卸载","Unknown":"未知","Unknown reason.":"未知的原因。","Unlock Rotation":"旋转解锁","Unspecified Failure":"未指定的故障","Upload failed":"上传失败","Upload From Link":"从超链接上传","Upload unknown error":"未知的上传错误","Uploaded file is not valid":"上传的文件是无效的","Uploading...":"上传中...","Usable Devices":"可用的设备","USB":"USB","Usb speed":"USB速度","Use":"使用","User":"用户","Username":"用户名","Using":"使用中","Using Fallback":"使用回退","Version":"版本","Version Update":"版本更新","Vibrate Mode":"振动模式","VNC":"VNC","Voltage":"电压","Volume":"音量","Volume Down":"减小音量","Volume Up":"增加音量","Warning:":"警告:","Web":"Web","Width":"宽度","WiFi":"WiFi","WiMAX":"WiMAX","Wireless":"无线","X DPI":"X DPI","Y DPI":"Y DPI","Yes":"是","You (or someone else) kicked the device.":"你 (或別人) 已移出了该设备。"}} +{ + "zh_CN": { + "-": "VNC\uff08\u865a\u62df\u7f51\u7edc\u8ba1\u7b97\u673a\u8fdc\u7a0b\u5de5\u5177\uff09\u8fdc\u7a0b\u767b\u5f55", + "A new version of STF is available": "STF\u6709\u65b0\u7248\u672c\u53ef\u4e0b\u8f7d", + "A package is already installed with the same name.": "\u5df2\u7ecf\u5b89\u88c5\u4e86\u4e00\u4e2a\u76f8\u540c\u540d\u5b57\u7684\u5b89\u88c5\u5305", + "A previously installed package of the same name has a different signature than the new package (and the old package's data was not removed).": "\u65b0\u5b89\u88c5\u5305\u540c\u4e4b\u524d\u7684\u67d0\u4e2a\u540c\u540d\u5b89\u88c5\u5305\u53d1\u751f\u4e86\u7b7e\u540d\u51b2\u7a81(\u8001\u7684\u5b89\u88c5\u5305\u7684\u6570\u636e\u6ca1\u6709\u79fb\u9664)", + "A secure container mount point couldn't be accessed on external media.": "\u5916\u90e8\u5b58\u50a8\u65e0\u6cd5\u8bbf\u95ee\u5b89\u5168\u5bb9\u5668\u6302\u8f7d\u70b9", + "ABI": "ABI", + "AC": "AC", + "Access Tokens": "\u8bbf\u95ee\u4ee4\u724c", + "Account": "\u5e10\u6237", + "Action": "\u52a8\u4f5c", + "Actions": "\u66f4\u591a\u52a8\u4f5c", + "Activity": "\u6d3b\u52a8", + "ADB Keys": "\u5b89\u5353\u8c03\u8bd5\u6865\u5bc6\u94a5", + "Add": "\u6dfb\u52a0", + "Add ADB Key": "\u6dfb\u52a0ADB Key", + "Add Key": "\u6dfb\u52a0Key", + "Add the following ADB Key to STF?": "\u6dfb\u52a0\u4ee5\u4e0b\u7684ADB Key\u5230STF?", + "Admin mode has been disabled.": "\u7ba1\u7406\u5458\u6a21\u5f0f\u5df2\u5173\u95ed", + "Admin mode has been enabled.": "\u7ba1\u7406\u5458\u6a21\u5f0f\u5df2\u542f\u7528", + "Advanced": "\u9ad8\u7ea7", + "Advanced Input": "\u9ad8\u7ea7\u8f93\u5165", + "Airplane Mode": "\u98de\u884c\u6a21\u5f0f", + "App Store": "\u5e94\u7528\u5546\u5e97", + "App Upload": "\u4e0a\u4f20APP", + "Apps": "\u5e94\u7528\u7a0b\u5e8f", + "Are you sure you want to reboot this device?": "\u4f60\u786e\u5b9a\u8981\u91cd\u542f\u8fd9\u53f0\u8bbe\u5907\u4e48\uff1f", + "Automation": "\u81ea\u52a8\u5316", + "Available": "\u53ef\u7528", + "Back": "\u8fd4\u56de", + "Battery": "\u7535\u6c60", + "Battery Health": "\u7535\u6c60\u5065\u5eb7", + "Battery Level": "\u7535\u6c60\u7535\u91cf", + "Battery Source": "\u7535\u6c60\u7535\u6e90", + "Battery Status": "\u7535\u6c60\u72b6\u6001", + "Battery Temp": "\u7535\u6c60\u6e29\u5ea6", + "Bluetooth": "\u84dd\u7259", + "Browser": "\u6d4f\u89c8\u5668", + "Busy": "\u7e41\u5fd9", + "Busy Devices": "\u7e41\u5fd9\u7684\u8bbe\u5907", + "Camera": "\u76f8\u673a", + "Cancel": "\u53d6\u6d88", + "Cannot access specified URL": "\u65e0\u6cd5\u8bbf\u95ee\u6307\u5b9a\u7684URL", + "Carrier": "\u4fe1\u53f7", + "Category": "\u5206\u7c7b", + "Charging": "\u5145\u7535\u4e2d", + "Check errors below": "\u68c0\u67e5\u4e0b\u5217\u9519\u8bef", + "Clear": "\u6e05\u9664", + "Clipboard": "\u526a\u8d34\u677f", + "Cold": "\u51b7\u5374", + "Connected": "\u5df2\u8fde\u63a5", + "Connected successfully.": "\u8fde\u63a5\u6210\u529f", + "Control": "\u63a7\u5236", + "Cookies": "Cookies", + "Cores": "\u6838", + "CPU": "CPU", + "CPU Platform": "CPU\u5e73\u53f0", + "Current rotation:": "\u5f53\u524d\u5c4f\u5e55\u65cb\u8f6c", + "Customize": "\u81ea\u5b9a\u4e49", + "D-pad Center": "\u6a21\u62df\u952e--\u4e2d\u95f4", + "D-pad Down": "\u6a21\u62df\u952e--\u4e0b", + "D-pad Left": "\u6a21\u62df\u952e--\u5de6", + "D-pad Right": "\u6a21\u62df\u952e--\u53f3", + "D-pad Up": "\u6a21\u62df\u952e--\u4e0a", + "Dashboard": "\u63a7\u5236\u9762\u677f", + "Data": "\u6570\u636e", + "Date": "\u65e5\u671f", + "Dead": "\u65e0\u6548", + "Delete": "\u5220\u9664", + "Density": "\u5bc6\u5ea6", + "Details": "\u7ec6\u8282", + "Developer": "\u5f00\u53d1\u8005", + "Device": "\u8bbe\u5907", + "Device cannot get kicked from the group": "\u8bbe\u5907\u65e0\u6cd5\u4ece\u8be5\u7ec4\u79fb\u51fa", + "Device is not present anymore for some reason.": "\u8bbe\u5907\u7531\u4e8e\u67d0\u4e9b\u539f\u56e0\u627e\u4e0d\u5230", + "Device is present but offline.": "\u8bbe\u5907\u5df2\u627e\u5230\u4f46\u5904\u4e8e\u79bb\u7ebf\u72b6\u6001", + "Device Photo": "\u8bbe\u5907\u7167\u7247", + "Device Settings": "\u8bbe\u5907\u8bbe\u7f6e", + "Device was disconnected": "\u8bbe\u5907\u5df2\u65ad\u5f00\u8fde\u63a5", + "Device was kicked by automatic timeout.": "\u8bbe\u5907\u7531\u4e8e\u8d85\u65f6\u5df2\u88ab\u79fb\u51fa", + "Devices": "\u8bbe\u5907", + "Disable WiFi": "\u5173\u95edWIFI", + "Discharging": "\u672a\u5145\u7535", + "Disconnected": "\u65ad\u5f00\u8fde\u63a5", + "Display": "\u64ad\u653e", + "Drop file to upload": "\u62d6\u653e\u6587\u4ef6\u5230\u8fd9\u91cc\u4ee5\u4e0a\u4f20", + "Dummy": "\u865a\u62df\u7684", + "Enable notifications": "\u5141\u8bb8\u63d0\u9192", + "Enable WiFi": "\u542f\u7528WIFI", + "Encrypted": "\u52a0\u5bc6\u7684", + "Error": "\u9519\u8bef", + "Error while getting data": "\u83b7\u53d6\u6570\u636e\u65f6\u53d1\u751f\u9519\u8bef", + "Error while reconnecting": "\u91cd\u65b0\u8fde\u63a5\u65f6\u53d1\u751f\u9519\u8bef", + "Ethernet": "\u4ee5\u592a\u7f51", + "Executes remote shell commands": "\u6267\u884c\u8fdc\u7a0bshell\u547d\u4ee4", + "Failed to download file": "\u6587\u4ef6\u4e0b\u8f7d\u5931\u8d25", + "Fast Forward": "\u5feb\u8fdb", + "File Explorer": "\u6587\u4ef6\u7ba1\u7406\u5668", + "File Name": "\u6587\u4ef6\u540d", + "Filter": "\u8fc7\u6ee4\u5668", + "Find Device": "\u67e5\u627e\u8bbe\u5907", + "Fingerprint": "\u6307\u7eb9", + "FPS": "FPS", + "Frequency": "\u9891\u7387", + "Full": "\u5168\u90e8", + "General": "\u901a\u7528", + "Generate Access Token": "\u751f\u6210\u8bbf\u95ee\u4ee4\u724c", + "Generate Login for VNC": "\u751f\u6210\u767b\u5f55VNC", + "Generate New Token": "\u751f\u6210\u65b0\u4ee4\u724c", + "Get": "\u83b7\u53d6", + "Get clipboard contents": "\u83b7\u53d6\u526a\u8d34\u677f\u5185\u5bb9", + "Go Back": "\u8fd4\u56de", + "Go Forward": "\u524d\u8fdb", + "Go to Device List": "\u8df3\u8f6c\u5230\u8bbe\u5907\u5217\u8868", + "Good": "\u826f\u597d", + "Hardware": "\u786c\u4ef6", + "Health": "\u5065\u5eb7", + "Height": "\u9ad8\u5ea6", + "Help": "\u5e2e\u52a9", + "Hide Screen": "\u9690\u85cf\u5c4f\u5e55", + "Home": "\u4e3b\u5c4f\u754c\u9762", + "Host": "\u4e3b\u673a\u5730\u5740", + "Hostname": "\u4e3b\u673a\u540d", + "ICCID": "\u96c6\u6210\u7535\u8def\u5361\u8bc6\u522b\u7801", + "ID": "ID", + "IMEI": "IMEI", + "Incorrect login details": "\u767b\u5f55\u4fe1\u606f\u9519\u8bef", + "Info": "\u4fe1\u606f", + "Inspect Device": "\u88ab\u68c0\u67e5\u8bbe\u5907", + "Inspecting is currently only supported in WebView": "\u68c0\u67e5\u76ee\u524d\u53ea\u652f\u6301\u7f51\u9875\u89c6\u56fe", + "Inspector": "\u68c0\u67e5\u5668", + "Installation canceled by user.": "\u7528\u6237\u5df2\u53d6\u6d88\u5b89\u88c5\u3002", + "Installation failed due to an unknown error.": "\u672a\u77e5\u539f\u56e0\u5bfc\u81f4\u5b89\u88c5\u5931\u8d25", + "Installation succeeded.": "\u5b89\u88c5\u6210\u529f", + "Installation timed out.": "\u5b89\u88c5\u8d85\u65f6", + "Installing app...": "\u5b89\u88c5 app...", + "Key": "\u5bc6\u94a5", + "Keys": "\u6309\u952e", + "Landscape": "\u6a2a\u6392", + "Language": "\u8bed\u8a00", + "Launch Activity": "\u542f\u52a8\u6d3b\u52a8", + "Launching activity...": "\u6d3b\u52a8\u542f\u52a8\u4e2d...", + "Level": "\u7b49\u7ea7", + "Local Settings": "\u672c\u5730\u8bbe\u7f6e", + "Location": "\u4f4d\u7f6e", + "Lock Rotation": "\u9501\u5b9a\u5c4f\u5e55\u65cb\u8f6c", + "Logs": "\u65e5\u5fd7", + "Maintenance": "\u7ef4\u62a4", + "Make sure to copy your access token now. You won't be able to see it again.": "\u8bf7\u786e\u4fdd\u5df2\u5907\u4efd\u60a8\u7684\u8eab\u4efd\u9a8c\u8bc1\u51ed\u8bc1\uff0c\u6b64\u51ed\u8bc1\u540e\u7eed\u5c06\u4e0d\u518d\u663e\u793a\uff01", + "Manage Apps": "\u7ba1\u7406Apps", + "Manner Mode": "\u7ba1\u7406\u6a21\u5f0f", + "Manufacturer": "\u5236\u9020\u5546", + "Media": "\u5a92\u4f53", + "Memory": "\u5185\u5b58", + "Menu": "\u83dc\u5355", + "Mobile": "\u624b\u673a", + "Mobile DUN": "\u624b\u673a\u7f51\u7edc\u6865\u63a5", + "Mobile High Priority": "\u79fb\u52a8\u7f51\u7edc\u6700\u9ad8\u4f18\u5148\u7ea7", + "Mobile MMS": "\u624b\u673a\u5f69\u4fe1", + "Mobile SUPL": "\u5e73\u9762\u5b9a\u4f4d\u7279\u5b9a\u79fb\u52a8\u6570\u636e\u8fde\u63a5", + "Model": "\u578b\u53f7", + "More about Access Tokens": "\u5173\u4e8e\u8eab\u4efd\u9a8c\u8bc1\u51ed\u8bc1", + "More about ADB Keys": "\u66f4\u591a\u5173\u4e8e\u5b89\u5353\u8c03\u8bd5\u6865\u5bc6\u94a5", + "Mute": "\u9759\u97f3", + "Name": "\u540d\u79f0", + "Native": "\u672c\u5730", + "Navigation": "\u5bfc\u822a", + "Network": "\u7f51\u7edc", + "Next": "\u4e0b\u4e00\u6b65", + "No": "\u5426", + "No access tokens": "\u6ca1\u6709\u8eab\u4efd\u9a8c\u8bc1\u51ed\u8bc1", + "No ADB keys": "\u6ca1\u6709\u5b89\u5353\u8c03\u8bd5\u6865\u7684\u5bc6\u94a5", + "No clipboard data": "\u526a\u8d34\u677f\u6ca1\u6709\u6570\u636e", + "No cookies to show": "\u6ca1\u6709\u672c\u5730cookies\u7f13\u5b58", + "No device screen": "\u6ca1\u6709\u8bbe\u5907\u753b\u9762", + "No devices connected": "\u65e0\u8bbe\u5907\u8fde\u63a5", + "No photo available": "\u6c92\u6709\u53ef\u7528\u7684\u7167\u7247", + "No Ports Forwarded": "\u6ca1\u6709\u7aef\u53e3\u8f6c\u53d1", + "No screenshots taken": "\u672a\u62cd\u622a\u56fe", + "Normal Mode": "\u6b63\u5e38\u6a21\u5f0f\"", + "Not Charging": "\u672a\u5145\u7535", + "Notes": "\u6807\u6ce8", + "Nothing to inspect": "\u65e0\u9700\u68c0\u67e5", + "Notifications": "\u901a\u77e5", + "Number": "\u6570\u5b57", + "Offline": "\u79bb\u7ebf", + "Oops!": "\u51fa\u9519\u4e86\uff01", + "Open": "\u6253\u5f00", + "Orientation": "\u5c4f\u5e55\u65b9\u5411", + "OS": "\u64cd\u4f5c\u7cfb\u7edf", + "Over Voltage": "\u7535\u538b\u8fc7\u9ad8", + "Overheat": "\u8fc7\u70ed", + "Package": "\u7a0b\u5e8f\u5b89\u88c5\u5305", + "Password": "\u5bc6\u7801", + "Permissions": "\u6743\u9650", + "Phone": "\u624b\u673a", + "Phone ICCID": "\u624b\u673a\u96c6\u6210\u7535\u8def\u5361\u8bc6\u522b\u7801\uff08\u624b\u673aSIM\u5361\u552f\u4e00\u8bc6\u522b\u7801\uff09", + "Phone IMEI": "\u624b\u673a\u56fd\u9645\u79fb\u52a8\u8bbe\u5907\u6807\u8bc6", + "Physical Device": "\u7269\u7406\u8bbe\u5907", + "PID": "\u8fdb\u7a0b\u53f7", + "Place": "\u4f4d\u7f6e", + "Platform": "\u5e73\u53f0", + "Play/Pause": "\u64ad\u653e/\u6682\u505c", + "Please enter a valid email": "\u8bf7\u8f93\u5165\u6b63\u786e\u683c\u5f0f\u7684 email", + "Please enter your email": "\u8bf7\u8f93\u5165\u60a8\u7684 email", + "Please enter your LDAP username": "\u8bf7\u8f93\u5165\u60a8\u7684LDAP\u7528\u6237\u540d", + "Please enter your name": "\u8bf7\u8f93\u5165\u60a8\u7684\u59d3\u540d", + "Please enter your password": "\u8bf7\u8f93\u5165\u60a8\u7684\u5bc6\u7801", + "Please enter your Store password": "\u8bf7\u8f93\u5165\u60a8\u6240\u4fdd\u5b58\u7684\u5bc6\u7801", + "Please enter your Store username": "\u8f93\u5165\u60a8\u6240\u4fdd\u5b58\u7684\u7528\u6237\u540d", + "Port": "\u7aef\u53e3", + "Port Forwarding": "\u8f6c\u53d1\u7aef\u53e3", + "Portrait": "\u7ad6\u6392", + "Power": "\u7535\u6e90", + "Power Source": "\u7535\u6e90\u6765\u6e90", + "Preparing": "\u51c6\u5907\u4e2d", + "Press Back button": "\u6309\u540e\u9000\u952e", + "Press Home button": "\u6309Home\u952e", + "Press Menu button": "\u6309\u83dc\u5355\u952e", + "Previous": "\u5148\u524d\u7684", + "Processing...": "\u5904\u7406\u4e2d...", + "Product": "\u4ea7\u54c1", + "Pushing app...": "\u6b63\u5728\u63a8\u9001 app...", + "RAM": "\u968f\u673a\u5b58\u53d6\u5b58\u50a8\u5668", + "Ready": "\u5c31\u7eea", + "Reconnected successfully.": "\u91cd\u65b0\u8fde\u63a5\u6210\u529f", + "Refresh": "\u5237\u65b0", + "Released": "\u91ca\u653e", + "Reload": "\u91cd\u65b0\u52a0\u8f7d", + "Remote debug": "\u8fdc\u7a0b\u8c03\u8bd5", + "Remove": "\u79fb\u9664", + "Reset": "\u91cd\u7f6e", + "Reset all browser settings": "\u91cd\u7f6e\u6240\u6709\u6d4f\u89c8\u5668\u8bbe\u7f6e", + "Reset Settings": "\u91cd\u7f6e\u8bbe\u7f6e", + "Restart Device": "\u91cd\u542f\u8bbe\u5907", + "Retrieving the device screen has timed out.": "\u83b7\u53d6\u8bbe\u5907\u753b\u9762\u8d85\u65f6", + "Retry": "\u91cd\u8bd5", + "Rewind": "\u56de\u6eda", + "Roaming": "\u6f2b\u6e38\u72b6\u6001", + "ROM": "ROM", + "Rotate Left": "\u5411\u5de6\u7ffb\u8f6c", + "Rotate Right": "\u5411\u53f3\u7ffb\u8f6c", + "Run": "\u8fd0\u884c", + "Run JavaScript": "\u8fd0\u884c JavaScript", + "Run the following on your command line to debug the device from your Browser": "\u8fd0\u884c\u4e0b\u9762\u7684\u547d\u4ee4\u884c\u4ece\u60a8\u7684\u6d4f\u89c8\u5668\u4e2d\u8c03\u8bd5\u8bbe\u5907", + "Run the following on your command line to debug the device from your IDE": "\u8fd0\u884c\u4e0b\u9762\u547d\u4ee4\u884c\u4ece\u60a8\u7684IDE\u8c03\u8bd5\u8bbe\u5907", + "Run this command to copy the key to your clipboard": "\u8fd0\u884c\u6b64\u547d\u4ee4\u5c06\u5bc6\u94a5\u590d\u5236\u5230\u526a\u8d34\u677f", + "Sample of log format": "\u65e5\u5fd7\u683c\u5f0f\u793a\u4f8b", + "Save Logs": "\u4fdd\u5b58\u65e5\u5fd7", + "Save ScreenShot": "\u4fdd\u5b58\u5c4f\u5e55\u622a\u56fe", + "Save...": "\u6b63\u5728\u4fdd\u5b58", + "Screen": "\u5c4f\u5e55", + "Screenshot": "\u5c4f\u5e55\u622a\u56fe", + "Screenshots": "\u66f4\u591a\u5c4f\u5e55\u622a\u56fe", + "SD Card Mounted": "SD\u5361\u5df2\u52a0\u8f7d", + "SDK": "SDK", + "Search": "\u641c\u7d22", + "Selects Next IME": "\u9009\u62e9\u4e0b\u4e00\u4e2a\u8f93\u5165\u6cd5", + "Serial": "\u4e32\u884c", + "Server": "\u670d\u52a1\u5668", + "Server error. Check log output.": "\u670d\u52a1\u5668\u9519\u8bef\uff0c\u8bf7\u68c0\u67e5\u8f93\u51fa\u7684\u65e5\u5fd7\u7eaa\u5f55\u3002", + "Set": "\u8bbe\u7f6e", + "Set Cookie": "\u8bbe\u7f6ecookies\u7f13\u5b58", + "Settings": "\u8bbe\u7f6e", + "Shell": "Shell\u811a\u672c", + "Show Screen": "\u663e\u793a\u5c4f\u5e55", + "Sign In": "\u767b\u5f55", + "Sign Out": "\u6ce8\u9500", + "Silent Mode": "\u9759\u97f3\u6a21\u5f0f", + "SIM": "SIM", + "Size": "\u5927\u5c0f", + "Socket connection was lost": "\u53cc\u5411\u7684\u901a\u4fe1\u8fde\u63a5\u4e22\u5931", + "Someone stole your device.": "\u6709\u4eba\u5360\u7528\u4e86\u4f60\u7684\u8bbe\u5907", + "Special Keys": "\u7279\u6b8a\u8981\u70b9", + "Start/Stop Logging": "\u5f00\u59cb / \u505c\u6b62 \u65e5\u5fd7\u7eaa\u5f55", + "Status": "\u72b6\u6001", + "Stop": "\u505c\u6b62", + "Stop Using": "\u505c\u6b62\u4f7f\u7528", + "Store Account": "\u4fdd\u5b58\u8d26\u53f7", + "Sub Type": "\u5b50\u7c7b\u578b", + "Switch Charset": "\u5207\u6362\u5b57\u7b26\u96c6", + "Tag": "\u6807\u7b7e", + "Take Pageshot (Needs WebView running)": "\u4f7f\u7528\u622a\u56fe(\u9700\u8981WebView \u8fd0\u884c)", + "Take Screenshot": "\u5c4f\u5e55\u622a\u56fe", + "Temperature": "\u6e29\u5ea6", + "Text": "\u6587\u5b57", + "The current view is marked secure and cannot be viewed remotely.": "\u5f53\u524d\u89c6\u56fe\u6709\u5b89\u5168\u6807\u8bb0\uff0c\u5e76\u4e14\u4e0d\u80fd\u8fdc\u7a0b\u67e5\u770b", + "The device will be unavailable for a moment.": "\u6b64\u8bbe\u5907\u5c06\u6682\u65f6\u65e0\u6cd5\u4f7f\u7528", + "The existing package could not be deleted.": "\u73b0\u6709\u7684\u7a0b\u5e8f\u5305\u53ef\u80fd\u4e0d\u4f1a\u88ab\u5220\u9664", + "The new package couldn't be installed because the verification did not succeed.": "\u65b0\u5305\u4e0d\u80fd\u5b89\u88c5\uff0c\u56e0\u4e3a\u9a8c\u8bc1\u6ca1\u6709\u6210\u529f\u3002", + "The new package couldn't be installed because the verification timed out.": "\u65b0\u5305\u4e0d\u80fd\u5b89\u88c5\uff0c\u56e0\u4e3a\u9a8c\u8bc1\u8d85\u65f6\u3002", + "The new package couldn't be installed in the specified install location because the media is not available.": "\u65b0\u5305\u4e0d\u80fd\u5b89\u88c5\u5728\u6307\u5b9a\u7684\u5b89\u88c5\u4f4d\u7f6e\uff0c\u56e0\u4e3a\u5a92\u4f53\u662f\u4e0d\u53ef\u7528\u3002", + "The new package couldn't be installed in the specified install location.": "\u65b0\u5305\u4e0d\u80fd\u5b89\u88c5\u5728\u6307\u5b9a\u7684\u5b89\u88c5\u4f4d\u7f6e\u3002", + "The new package failed because it contains a content provider with thesame authority as a provider already installed in the system.": "\u65b0\u7684\u5305\u5b89\u88c5\u5931\u8d25\uff0c\u56e0\u4e3a\u5b83\u5305\u542b\u4e86\u76f8\u540c\u540d\u5b57\u7684\u8ba4\u8bc1\u5df2\u7ecf\u5b89\u88c5\u5728\u7cfb\u7edf\u4e2d\u63d0\u4f9b\u4e00\u4e2a\u5185\u5bb9\u63d0\u4f9b\u5546\u3002", + "The new package failed because it has specified that it is a test-only package and the caller has not supplied the INSTALL_ALLOW_TEST flag.": "\u65b0\u5305\u5b89\u88c5\u5931\u8d25\uff0c\u56e0\u4e3a\u5b83\u5df2\u88ab\u6307\u5b9a\uff0c\u5b83\u662f\u4e00\u4e2a\u7528\u4e8e\u6d4b\u8bd5\u7684\u5305\u548c\u8c03\u7528\u8005\u5e76\u6ca1\u6709\u7ed9\u5b83\u63d0\u4f9bINSTALL_ALLOW_TEST\u6807\u5fd7\u3002", + "The new package failed because the current SDK version is newer than that required by the package.": "\u65b0\u7684\u5305\u5b89\u88c5\u5931\u8d25\uff0c\u56e0\u4e3a\u5f53\u524d\u7684SDK\u7248\u672c\u6bd4\u7a0b\u5e8f\u5305\u6240\u4f9d\u8d56\u7684\u7248\u672c\u9ad8\u3002", + "The new package failed because the current SDK version is older than that required by the package.": "\u65b0\u7684\u5305\u5b89\u88c5\u5931\u8d25\uff0c\u56e0\u4e3a\u5f53\u524d\u7684SDK\u6bd4\u5b89\u88c5\u5305\u6240\u4f9d\u8d56\u7684\u7248\u672c\u4f4e\u3002", + "The new package failed while optimizing and validating its dex files, either because there was not enough storage or the validation failed.": "\u65b0\u7684\u5305\u5b89\u88c5\u5931\u8d25\uff0c\u53ef\u80fd\u6ca1\u6709\u9a8c\u8bc1dex\u6587\u4ef6\u6216\u8005\u6ca1\u6709\u8db3\u591f\u7684\u5b58\u50a8\u5bfc\u81f4\u9a8c\u8bc1\u5931\u8d25\u3002", + "The new package has an older version code than the currently installed package.": "\u65b0\u7684\u8f6f\u4ef6\u5305\u6bd4\u76ee\u524d\u5b89\u88c5\u7684\u8f6f\u4ef6\u5305\u4ee3\u7801\u7248\u672c\u65e7\u3002", + "The new package is assigned a different UID than it previously held.": "\u65b0\u5305\u5206\u914d\u7f6e\u7684UID\u4e0e\u5b83\u4ee5\u524d\u6301\u6709\u7684\u4e0d\u540c\u3002", + "The new package uses a feature that is not available.": "\u65b0\u5305\u4f7f\u7528\u529f\u80fd\u4e0d\u53ef\u7528\u3002", + "The new package uses a shared library that is not available.": "\u65b0\u5305\u4f7f\u7528\u7684\u5171\u4eab\u5e93\u4e0d\u53ef\u7528", + "The package archive file is invalid.": "\u5305\u5b58\u6863\u6587\u4ef6\u65e0\u6548\u3002", + "The package being installed contains native code, but none that is compatible with the device's CPU_ABI.": "\u6b63\u5728\u5b89\u88c5\u8f6f\u4ef6\u5305\u4e2d\u5305\u542b\u6e90\u751f\u5185\u6838\uff0c\u4f46\u90fd\u6ca1\u6709\u4e0e\u8be5\u8bbe\u5907\u7684CPU_ABI\u517c\u5bb9\u3002", + "The package changed from what the calling program expected.": "\u7a0b\u5e8f\u5305\u88ab\u9884\u671f\u8c03\u7528\u7684\u7a0b\u5e8f\u6240\u4fee\u6539\u3002", + "The package is already installed.": "\u7a0b\u5e8f\u5305\u5df2\u7ecf\u5b89\u88c5\u3002", + "The package manager service found that the device didn't have enough storage space to install the app.": "\u5305\u7ba1\u7406\u5668\u670d\u52a1\u53d1\u73b0\u8be5\u8bbe\u5907\u6ca1\u6709\u8db3\u591f\u7684\u5b58\u50a8\u7a7a\u95f4\u6765\u5b89\u88c5\u5e94\u7528\u7a0b\u5e8f\u3002", + "The parser did not find any actionable tags (instrumentation or application) in the manifest.": "\u89e3\u6790\u5668\u6ca1\u6709\u53d1\u73b0\u6e05\u5355\u4efb\u4f55\u53ef\u64cd\u4f5c\u7684\u6807\u7b7e(\u5de5\u5177\u6216\u5e94\u7528\u7a0b\u5e8f) \u3002", + "The parser did not find any certificates in the .apk.": "\u89e3\u6790\u5668\u6ca1\u6709\u53d1\u73b0\u5728.apk\u6587\u4ef6\u7684\u4efb\u4f55\u8bc1\u4e66\u3002", + "The parser encountered a bad or missing package name in the manifest.": "\u5206\u6790\u5668\u5728\u6e05\u5355\u4e2d\u9047\u5230\u635f\u574f\u6216\u4e22\u5931\u7684\u5305\u540d\u3002", + "The parser encountered a bad shared user id name in the manifest.": "\u5206\u6790\u5668\u5728\u6e05\u5355\u4e2d\u9047\u5230\u574f\u5171\u4eab\u7684\u7528\u6237ID\u540d\u79f0\u3002", + "The parser encountered a CertificateEncodingException in one of the files in the .apk.": "\u89e3\u6790\u5668\u5728\u7684apk\u7684\u4e00\u4e2a\u6587\u4ef6\u65f6\u9047\u5230\u8bc1\u4e66\u7f16\u7801\u5f02\u5e38\u3002", + "The parser encountered an unexpected exception.": "\u89e3\u6790\u5668\u9047\u5230\u610f\u5916\u7684\u5f02\u5e38\u3002", + "The parser encountered some structural problem in the manifest.": "\u5206\u6790\u5668\u5728\u6e05\u5355\u4e2d\u9047\u5230\u7684\u4e00\u4e9b\u7ed3\u6784\u6027\u95ee\u9898\u3002", + "The parser found inconsistent certificates on the files in the .apk.": "\u5206\u6790\u5668\u53d1\u73b0\u5728\u7684apk\u6587\u4ef6\u4e0d\u4e00\u81f4\u7684\u8bc1\u4e66\u3002", + "The parser was given a path that is not a file, or does not end with the expected '.apk' extension.": "\u89e3\u6790\u5668\u6240\u83b7\u5f97\u7684\u662f\u4e00\u4e2a\u8def\u5f84\u800c\u4e0d\u662f\u4e00\u4e2a\u6587\u4ef6\uff0c\u6216\u8005\u6587\u4ef6\u6ca1\u6709\u4ee5\u2018.apk\u2019\u7ed3\u5c3e\u3002", + "The parser was unable to retrieve the AndroidManifest.xml file.": "\u5206\u6790\u5668\u65e0\u6cd5\u68c0\u7d22AndroidManifest.xml\u6587\u4ef6\u3002", + "The requested shared user does not exist.": "\u6240\u8bf7\u6c42\u7684\u5171\u4eab\u7528\u6237\u4e0d\u5b58\u5728", + "The system failed to install the package because its packaged native code did not match any of the ABIs supported by the system.": "\u8be5\u7cfb\u7edf\u65e0\u6cd5\u5b89\u88c5\u6b64\u8f6f\u4ef6\u5305\uff0c\u56e0\u4e3a\u5176\u5305\u88c5\u539f\u751f\u5185\u6838\u6ca1\u6709\u5339\u914d\u5230\u5e94\u7cfb\u7edf\u6240\u652f\u6301\u7684\u7684ABI\u3002", + "The system failed to install the package because of system issues.": "\u56e0\u4e3a\u7cfb\u7edf\u95ee\u9898\u65e0\u6cd5\u5b89\u88c5\u7a0b\u5e8f\u3002", + "The system failed to install the package because the user is restricted from installing apps.": "\u7a0b\u5e8f\u5b89\u88c5\u5931\u8d25\uff0c\u56e0\u4e3a\u7528\u6237\u88ab\u9650\u5236\u5b89\u88c5\u8be5\u5e94\u7528\u8f6f\u4ef6", + "The URI passed in is invalid.": "\u8be5URI\u4f20\u9012\u65e0\u6548", + "TID": "\u7ebf\u7a0b\u53f7", + "Time": "\u65f6\u95f4", + "Tip:": "\u63d0\u793a\uff1a", + "Title": "\u6807\u9898", + "Toggle Web/Native": "\u5207\u6362\u7f51\u7edc/\u672c\u5730", + "Total Devices": "\u8bbe\u5907\u603b\u6570", + "translate": "\u7ffb\u8bd1", + "Try to reconnect": "\u5c1d\u8bd5\u91cd\u65b0\u8fde\u63a5", + "Type": "\u7c7b\u578b", + "Unauthorized": "\u672a\u6388\u6743\u7684", + "Uninstall": "\u5378\u8f7d", + "Unknown": "\u672a\u77e5", + "Unknown reason.": "\u672a\u77e5\u7684\u539f\u56e0\u3002", + "Unlock Rotation": "\u65cb\u8f6c\u89e3\u9501", + "Unspecified Failure": "\u672a\u6307\u5b9a\u7684\u6545\u969c", + "Upload failed": "\u4e0a\u4f20\u5931\u8d25", + "Upload From Link": "\u4ece\u8d85\u94fe\u63a5\u4e0a\u4f20", + "Upload unknown error": "\u672a\u77e5\u7684\u4e0a\u4f20\u9519\u8bef", + "Uploaded file is not valid": "\u4e0a\u4f20\u7684\u6587\u4ef6\u662f\u65e0\u6548\u7684", + "Uploading...": "\u4e0a\u4f20\u4e2d...", + "Usable Devices": "\u53ef\u7528\u7684\u8bbe\u5907", + "USB": "USB", + "Usb speed": "USB\u901f\u5ea6", + "Use": "\u4f7f\u7528", + "User": "\u7528\u6237", + "Username": "\u7528\u6237\u540d", + "Using": "\u4f7f\u7528\u4e2d", + "Using Fallback": "\u4f7f\u7528\u56de\u9000", + "Version": "\u7248\u672c", + "Version Update": "\u7248\u672c\u66f4\u65b0", + "Vibrate Mode": "\u632f\u52a8\u6a21\u5f0f", + "VNC": "VNC", + "Voltage": "\u7535\u538b", + "Volume": "\u97f3\u91cf", + "Volume Down": "\u51cf\u5c0f\u97f3\u91cf", + "Volume Up": "\u589e\u52a0\u97f3\u91cf", + "Warning:": "\u8b66\u544a\uff1a", + "Web": "Web", + "Width": "\u5bbd\u5ea6", + "WiFi": "WiFi", + "WiMAX": "WiMAX", + "Wireless": "\u65e0\u7ebf", + "X DPI": "X DPI", + "Y DPI": "Y DPI", + "Yes": "\u662f", + "You (or someone else) kicked the device.": "\u4f60 (\u6216\u5225\u4eba) \u5df2\u79fb\u51fa\u4e86\u8be5\u8bbe\u5907\u3002" + } +} diff --git a/res/common/status/webpack.config.js b/res/common/status/webpack.config.js index df7f8c186..b22706f4b 100644 --- a/res/common/status/webpack.config.js +++ b/res/common/status/webpack.config.js @@ -1,5 +1,5 @@ var pathutil = require('./../../../lib/util/pathutil') -var options = require('./../../../webpack.config').webpack +var options = require('./../../../webpack.config') var _ = require('lodash') module.exports = _.defaults(options, { diff --git a/res/web_modules/nine-bootstrap/index.js b/res/web_modules/nine-bootstrap/index.js index 139ef38b0..17c83826e 100644 --- a/res/web_modules/nine-bootstrap/index.js +++ b/res/web_modules/nine-bootstrap/index.js @@ -4,4 +4,4 @@ require('nine-bootstrap/nine-bootstrap.scss') require('components-font-awesome/css/font-awesome.css') -require('font-lato-2-subset') +require('fontsource-lato') diff --git a/res/web_modules/ui-bootstrap/index.js b/res/web_modules/ui-bootstrap/index.js index d2a17c44e..cd4c4019e 100644 --- a/res/web_modules/ui-bootstrap/index.js +++ b/res/web_modules/ui-bootstrap/index.js @@ -1,4 +1,4 @@ -require('script!angular-bootstrap/ui-bootstrap-tpls') +require('script-loader!angular-bootstrap/ui-bootstrap-tpls') module.exports = { name: 'ui.bootstrap' diff --git a/webpack.config.js b/webpack.config.js index 2782560ae..ba3489459 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,117 +1,109 @@ var _ = require('lodash') var webpack = require('webpack') -var CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin') +//var CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin') var ProgressPlugin = require('webpack/lib/ProgressPlugin') var pathutil = require('./lib/util/pathutil') +var path = require('path') var log = require('./lib/util/logger').createLogger('webpack:config') module.exports = { - webpack: { - context: __dirname - , cache: true - , entry: { - app: pathutil.resource('app/app.js') - , authldap: pathutil.resource('auth/ldap/scripts/entry.js') - , authmock: pathutil.resource('auth/mock/scripts/entry.js') + mode: 'production', + context: __dirname, + cache: true, + entry: { + app: pathutil.resource('app/app.js'), + authldap: pathutil.resource('auth/ldap/scripts/entry.js'), + authmock: pathutil.resource('auth/mock/scripts/entry.js') + }, + output: { + //path: pathutil.resource('build'), + path: '/tmp/build/res/build', + publicPath: '/static/app/build/', + filename: 'entry/[name].entry.js', + chunkFilename: '[id].[hash].chunk.js' + }, + stats: { + colors: true + }, + + resolve: { + modules: [ + "node_modules", + //path.resolve(__dirname, "bower_components"), // works + '/tmp/build/bower_components', + //path.resolve(__dirname, "res/web_modules" ), // works + '/tmp/build/res/web_modules', + //path.resolve(__dirname, "res/app/components" )// works + '/tmp/build/res/app/components' + ], + /*root: [ + pathutil.resource('app/components') + ], + modulesDirectories: [ + 'web_modules', + 'bower_components', + 'node_modules' + ],*/ + alias: { + 'angular-bootstrap': 'angular-bootstrap/ui-bootstrap-tpls', + localforage: 'localforage/dist/localforage.js', + 'socket.io': 'socket.io-client', + stats: 'stats.js/src/Stats.js', + 'underscore.string': 'underscore.string/index', + 'ngRoute': 'angular-route' } - , output: { - path: pathutil.resource('build') - , publicPath: '/static/app/build/' - , filename: 'entry/[name].entry.js' - , chunkFilename: '[id].[hash].chunk.js' - } - , stats: { - colors: true - } - , resolve: { - root: [ - pathutil.resource('app/components') - ] - , modulesDirectories: [ - 'web_modules' - , 'bower_components' - , 'node_modules' - ] - , alias: { - 'angular-bootstrap': 'angular-bootstrap/ui-bootstrap-tpls' - , localforage: 'localforage/dist/localforage.js' - , 'socket.io': 'socket.io-client' - , stats: 'stats.js/src/Stats.js' - , 'underscore.string': 'underscore.string/index' - } - } - , module: { - loaders: [ - {test: /\.css$/, loader: 'style!css'} - , {test: /\.scss$/, loader: 'style!css!sass'} - , {test: /\.less$/, loader: 'style!css!less'} - , {test: /\.json$/, loader: 'json'} - , {test: /\.jpg$/, loader: 'url?limit=1000&mimetype=image/jpeg'} - , {test: /\.png$/, loader: 'url?limit=1000&mimetype=image/png'} - , {test: /\.gif$/, loader: 'url?limit=1000&mimetype=image/gif'} - , {test: /\.svg/, loader: 'url?limit=1&mimetype=image/svg+xml'} - , {test: /\.woff/, loader: 'url?limit=1&mimetype=application/font-woff'} - , {test: /\.otf/, loader: 'url?limit=1&mimetype=application/font-woff'} - , {test: /\.ttf/, loader: 'url?limit=1&mimetype=application/font-woff'} - , {test: /\.eot/, loader: 'url?limit=1&mimetype=vnd.ms-fontobject'} - , {test: /\.pug$/, loader: 'template-html-loader?engine=jade'} - , {test: /\.html$/, loader: 'html-loader'} - , {test: /angular\.js$/, loader: 'exports?angular'} - , {test: /angular-cookies\.js$/, loader: 'imports?angular=angular'} - , {test: /angular-route\.js$/, loader: 'imports?angular=angular'} - , {test: /angular-touch\.js$/, loader: 'imports?angular=angular'} - , {test: /angular-animate\.js$/, loader: 'imports?angular=angular'} - , {test: /angular-growl\.js$/, loader: 'imports?angular=angular'} - , {test: /dialogs\.js$/, loader: 'script'} - ] - // TODO: enable when its sane - // preLoaders: [ - // { - // test: /\.js$/, - // exclude: /node_modules|bower_components/, - // loader: 'eslint-loader' - // } - // ], - , noParse: [ - // pathutil.resource('bower_components') - ] - } - , plugins: [ - new webpack.ResolverPlugin( - new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin( - 'bower.json' - , ['main'] - ) - ) - , new webpack.ResolverPlugin( - new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin( - '.bower.json' - , ['main'] - ) - ) - , new CommonsChunkPlugin('entry/commons.entry.js') - , new ProgressPlugin(_.throttle( - function(progress, message) { - var msg - if (message) { - msg = message - } - else { - msg = progress >= 1 ? 'complete' : 'unknown' - } - log.info('Build progress %d%% (%s)', Math.floor(progress * 100), msg) - } - , 1000 - )) + }, + module: { + rules: [ + {test: /\.css$/, loader: 'css-loader'}, + {test: /\.scss$/, loader: 'css-loader!sass-loader'} + , {test: /\.less$/, loader: 'css-loader!less-loader'} + //, {test: /\.json$/, loader: 'json-loader'} + , {test: /\.jpg$/, loader: 'url-loader', options: { limit: 1000, mimetype: 'image/jpeg' } } + , {test: /\.png$/, loader: 'url-loader', options: { limit: 1000, mimetype: 'image/png' } } + , {test: /\.gif$/, loader: 'url-loader', options: { limit: 1000, mimetype: 'image/gif' } } + , {test: /\.svg/, loader: 'url-loader', options: { limit: 1, mimetype: 'image/svg+xml' } } + , {test: /\.woff/, loader: 'url-loader', options: { limit: 1, mimetype: 'application/font-woff' } } + , {test: /\.otf/, loader: 'url-loader', options: { limit: 1, mimetype: 'application/font-woff' } } + , {test: /\.ttf/, loader: 'url-loader', options: { limit: 1, mimetype: 'application/font-woff' } } + , {test: /\.eot/, loader: 'url-loader', options: { limit: 1, mimetype: 'vnd.ms-fontobject' } } + , {test: /\.pug$/, loader: 'template-html-loader?engine=jade'} + , {test: /\.html$/, loader: 'html-loader'} + , {test: /angular\.js$/, loader: 'exports-loader?exports=angular'} + , {test: /angular-cookies\.js$/, loader: 'imports-loader?angular'} + , {test: /angular-route\.js$/, loader: 'imports-loader?angular'} + , {test: /angular-touch\.js$/, loader: 'imports-loader?angular'} + , {test: /angular-animate\.js$/, loader: 'imports-loader?angular'} + , {test: /angular-growl\.js$/, loader: 'imports-loader?angular'} + , {test: /dialogs\.js$/, loader: 'script-loader'} + ], + // TODO: enable when its sane + // preLoaders: [ + // { + // test: /\.js$/, + // exclude: /node_modules|bower_components/, + // loader: 'eslint-loader' + // } + // ], + noParse: [ + pathutil.resource('bower_components') ] - } - , webpackServer: { - debug: true - , devtool: 'eval' - , stats: { - colors: true - } - } + }, + plugins: [ + new ProgressPlugin(_.throttle( + function(progress, message) { + var msg + if (message) { + msg = message + } + else { + msg = progress >= 1 ? 'complete' : 'unknown' + } + log.info('Build progress %d%% (%s)', Math.floor(progress * 100), msg) + } + , 1000 + )) + ] } diff --git a/webpackserver.config.js b/webpackserver.config.js new file mode 100644 index 000000000..adce56a22 --- /dev/null +++ b/webpackserver.config.js @@ -0,0 +1,9 @@ +module.exports = { + webpackServer: { + debug: true, + devtool: 'eval', + stats: { + colors: true + } + } +} From 2a996310f6b51120ea3390068c83e7813240d10d Mon Sep 17 00:00:00 2001 From: David Helkowski Date: Tue, 14 Jul 2020 21:36:18 +0000 Subject: [PATCH 02/12] Continuing to get updated build/frontend working Updated Dockerfile to use even more stages to separate frontend build from backend build. The 'res' folder has mixed stuff in it for both the frontend and backend so this process is still not complete. Moved all the angular modules into their own grouping in bower.json for readability. Previously attempted to move all the angular modules into npm package.json but that failed so they have to remain here in bower.json for now. Updated angular to version 1.8.0. This works "for the most part" with various things broken here and there that am in process of fixing. Added ng-annotate to webpack process, so as to use ngInject to get some dependencies running in places where old webpack 2.0 process was handling it. Updated a few places that need njInject annotation so far. Added missing d3 import into app.js Updated signinController to use `then` instead of deprecated ( and no longer working ) success and error functions. Continued to update webpack config so that it has what is needed to startup the frontend using webpack 4. Login screen works now but is missing styling. Main page after login is currently broken on angular-hotkeys and/or mousetrap. That is being worked on. --- Dockerfile | 70 +++++++++++++------ bower.json | 35 +++++----- package.json | 9 ++- res/app/app.js | 2 + res/auth/mock/scripts/entry.js | 7 +- .../mock/scripts/signin/signin-controller.js | 17 ++--- webpack.config.js | 32 +++++++-- 7 files changed, 114 insertions(+), 58 deletions(-) diff --git a/Dockerfile b/Dockerfile index 448c4bb76..05b3ada4f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \ /bin/bash /tmp/install_node.sh && \ apt install --no-install-recommends -y nodejs -FROM nodebase as builder +RUN useradd --system --create-home --shell /usr/sbin/nologin stf + +FROM nodebase as with_packages # Install additional packages for building things RUN export DEBIAN_FRONTEND=noninteractive && \ @@ -23,13 +25,15 @@ RUN export DEBIAN_FRONTEND=noninteractive && \ # Install just the package dependencies before copying in the full source RUN mkdir -p /tmp/build/res/build COPY ./package*.json /tmp/build/ +WORKDIR /tmp/build RUN set -x && \ - cd /tmp/build && \ export PATH=$PWD/node_modules/.bin:$PATH && \ npm install --loglevel http && \ curl -sf https://gobinaries.com/tj/node-prune | sh -# Removed this from package.json -> "prepublish": "bower install && not-in-install && gulp build || in-install" +# ********* FRONTEND ********** + +FROM with_packages as frontend # Install bower dependencies WORKDIR /tmp/build @@ -37,36 +41,62 @@ COPY ./bower.json /tmp/build/ RUN echo '{ "allow_root": true }' > /root/.bowerrc && \ ./node_modules/.bin/bower install -# Copy the rest of the app source in -COPY . /tmp/build/ +# Copy the app ( res ) in +COPY ./bower.json /tmp/build/ +COPY ./gulpfile.js /tmp/build/ +COPY ./webpack.config.js /tmp/build/ +COPY ./res /tmp/build/res +COPY ./lib/util /tmp/build/lib/util + +RUN ./node_modules/.bin/gulp build + +# ********* BACKEND ********** + +FROM with_packages as backend + +COPY ./lib /tmp/build/lib # Package and cleanup -RUN ./node_modules/.bin/gulp build && \ - npm prune --production && \ - node-prune && \ - npm pack && \ +WORKDIR /tmp/build +RUN npm pack 2>&1 | grep -v "npm notice [1-9]" && \ mv devicefarmer-stf-$(jq .version package.json -j).tgz stf.tgz +#npm prune --production && \ +# node-prune && \ + +FROM alpine as app + +RUN mkdir -p /app +COPY --from=backend /tmp/build/stf.tgz /tmp/stf.tgz +RUN tar xf /tmp/stf.tgz --strip-components 1 -C /app + +# ********* RUNTIME ********** + FROM nodebase as runtime EXPOSE 3000 # Setup user -RUN useradd --system --create-home --shell /usr/sbin/nologin stf RUN mkdir -p /app && chown stf:stf /app -#USER stf WORKDIR /app -COPY ./webpack.config.js /app/ -COPY --from=builder --chown=stf:stf /tmp/build/stf.tgz /tmp/stf.tgz -COPY --from=builder --chown=stf:stf /tmp/build/node_modules /app/node_modules -COPY --from=builder --chown=stf:stf /tmp/build/res/build /app/res/build -RUN tar xf /tmp/stf.tgz --strip-components 1 -C /app && \ - chown stf:stf /app/* -R && \ - rm /tmp/stf.tgz && \ - npm prune --production - +# Copy in node_modules and prune them +COPY --from=with_packages --chown=stf:stf /tmp/build/node_modules /app/node_modules +COPY --from=with_packages --chown=stf:stf /tmp/build/package.json /app/package.json +RUN npm prune --production + +# Copy in resources needed by backend +COPY --chown=stf:stf ./res/common /app/res/common +COPY --chown=stf:stf ./res/app/views /app/res/app/views +COPY --chown=stf:stf ./res/auth/mock/views /app/res/auth/mock/views + +# Copy in the backend +COPY --from=app --chown=stf:stf /app /app + +# Copy in the frontend +COPY --from=frontend --chown=stf:stf /tmp/build/res/build /app/res/build + #USER root #RUN apt-get -y --no-install-recommends install ncdu diff --git a/bower.json b/bower.json index 6c6f118c0..6153f01ff 100644 --- a/bower.json +++ b/bower.json @@ -2,42 +2,43 @@ "name": "stf", "version": "0.1.0", "dependencies": { - "angular": "~1.8.0", - "angular-cookies": "~1.8.0", - "angular-route": "~1.8.0", - "angular-sanitize": "~1.8.0", - "angular-animate": "~1.8.0", - "angular-touch": "~1.8.0", "lodash": "~3.10.1", "oboe": "~2.1.5", "ng-table": "~1.0.0-beta.9", - "angular-gettext": "~2.2.0", - "angular-ui-ace": "~0.2.3", - "angular-dialog-service": "~5.2.11", "ng-file-upload": "~2.0.5", - "angular-growl-v2": "JanStevens/angular-growl-2#~0.7.9", "underscore.string": "~3.2.3", "bootstrap": "~3.3.6", "packery": "~1.4.3", - "angular-elastic": "~2.5.1", - "angular-hotkeys": "chieffancypants/angular-hotkeys#~1.6.0", - "angular-borderlayout": "git://github.com/filearts/angular-borderlayout.git#7c9716aebd9260763f798561ca49d6fbfd4a5c67", - "angular-ui-bootstrap": "~1.1.1", "ng-context-menu": "AdiDahan/ng-context-menu#~1.0.5", "components-font-awesome": "~4.5.0", "eventEmitter": "~4.3.0", + + "angular": "~1.8.0", + "angular-cookies": "~1.8.0", + "angular-route": "~1.8.0", + "angular-sanitize": "~1.8.0", + "angular-animate": "~1.8.0", + "angular-touch": "~1.8.0", "angular-ladda": "~0.3.1", - "angular-xeditable": "~0.1.9" + "angular-xeditable": "~0.1.9", + "angular-elastic": "~2.5.1", + "angular-ui-bootstrap": "~1.1.1", + "angular-gettext": "~2.4.1", + "angular-ui-ace": "~0.2.3", + "angular-dialog-service": "~5.2.11", + "angular-growl-v2": "JanStevens/angular-growl-2#~0.7.9", + "angular-borderlayout": "git://github.com/filearts/angular-borderlayout.git#7c9716aebd9260763f798561ca49d6fbfd4a5c67", + "mousetrap": "~1.5.2" }, "private": true, "devDependencies": { "angular-mocks": "~1.5.0-rc.2" }, "resolutions": { - "angular": "~1.5.0-rc.2", "d3": "~3.5.5", "eventEmitter": "~4.3.0", "epoch": "~0.8.4", - "get-size": "~2.0.3" + "get-size": "~2.0.3", + "angular": "~1.8.0" } } diff --git a/package.json b/package.json index e8b0c9dcc..be2f36ed7 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "eslint": "^3.2.2", "event-stream": "^3.3.2", "exports-loader": "^0.6.2", - "extract-text-webpack-plugin": "^1.0.1", + "extract-text-webpack-plugin": "^3.0.2", "fs-extra": "^8.1.0", "gulp": "^4.0.2", "gulp-angular-gettext": "^2.1.0", @@ -158,7 +158,12 @@ "file-loader": "^6.0.0", "less-loader": "5.x.x", "sass-loader": "8.x.x", - "url-loader": "^4.1.0" + "url-loader": "^4.1.0", + + "ng-annotate-patched": "1.12.0", + "ng-annotate": "1.2.2", + "ng-annotate-loader": "0.7.0", + "angular-hotkeys": "^1.7.0" }, "engines": { "node": ">= 6.9" diff --git a/res/app/app.js b/res/app/app.js index f5073847e..8a6a602a9 100644 --- a/res/app/app.js +++ b/res/app/app.js @@ -2,6 +2,8 @@ * Copyright © 2019 contains code contributed by Orange SA, authors: Denis Barbaron - Licensed under the Apache license 2.0 **/ +import * as d3 from "d3"; + require.ensure([], function(require) { require('angular') require('angular-route') diff --git a/res/auth/mock/scripts/entry.js b/res/auth/mock/scripts/entry.js index 39fdc8b50..25516ebdd 100644 --- a/res/auth/mock/scripts/entry.js +++ b/res/auth/mock/scripts/entry.js @@ -2,12 +2,11 @@ require.ensure([], function(require) { require('nine-bootstrap') require('angular') - //require('angular-route') - var ngRoute = require('angular-route').ngRoute + require('angular-route') require('angular-touch') angular.module('app', [ - ngRoute, + 'ngRoute', 'ngTouch', require('gettext').name, require('./signin').name @@ -19,4 +18,4 @@ require.ensure([], function(require) { redirectTo: '/auth/mock/' }) }) -}) +}) \ No newline at end of file diff --git a/res/auth/mock/scripts/signin/signin-controller.js b/res/auth/mock/scripts/signin/signin-controller.js index 410c4d35a..bc1acff66 100644 --- a/res/auth/mock/scripts/signin/signin-controller.js +++ b/res/auth/mock/scripts/signin/signin-controller.js @@ -3,7 +3,8 @@ **/ module.exports = function SignInCtrl($scope, $http, CommonService) { - + "ngInject"; + $scope.error = null $scope.submit = function() { @@ -12,13 +13,13 @@ module.exports = function SignInCtrl($scope, $http, CommonService) { , email: $scope.signin.email.$modelValue } $scope.invalid = false - $http.post('/auth/api/v1/mock', data) - .success(function(response) { + $http.post('/auth/api/v1/mock', data).then( + function successCallback(response) { $scope.error = null - location.replace(response.redirect) - }) - .error(function(response) { - switch (response.error) { + location.replace(response.data.redirect) + }, + function errorCallback(response) { + switch (response.data.error) { case 'ValidationError': $scope.error = { $invalid: true @@ -45,4 +46,4 @@ module.exports = function SignInCtrl($scope, $http, CommonService) { $http.get('/auth/contact').then(function(response) { $scope.contactEmail = response.data.contact.email }) -} +} \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index ba3489459..5b188bc11 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -9,7 +9,7 @@ var path = require('path') var log = require('./lib/util/logger').createLogger('webpack:config') module.exports = { - mode: 'production', + mode: 'development', context: __dirname, cache: true, entry: { @@ -71,13 +71,31 @@ module.exports = { , {test: /\.eot/, loader: 'url-loader', options: { limit: 1, mimetype: 'vnd.ms-fontobject' } } , {test: /\.pug$/, loader: 'template-html-loader?engine=jade'} , {test: /\.html$/, loader: 'html-loader'} - , {test: /angular\.js$/, loader: 'exports-loader?exports=angular'} - , {test: /angular-cookies\.js$/, loader: 'imports-loader?angular'} - , {test: /angular-route\.js$/, loader: 'imports-loader?angular'} - , {test: /angular-touch\.js$/, loader: 'imports-loader?angular'} - , {test: /angular-animate\.js$/, loader: 'imports-loader?angular'} - , {test: /angular-growl\.js$/, loader: 'imports-loader?angular'} + , {test: /mousetrap\.js$/, loader: 'exports-loader?Mousetrap'} + , {test: /\/angular\.js$/, loader: 'exports-loader?angular'} + , {test: /angular-cookies\.js$/, loader: 'imports-loader?angular=angular'} + , {test: /angular-route\.js$/, loader: 'imports-loader?angular=angular'} + , {test: /angular-touch\.js$/, loader: 'imports-loader?angular=angular'} + , {test: /angular-animate\.js$/, loader: 'imports-loader?angular=angular'} + , {test: /angular-growl\.js$/, loader: 'imports-loader?angular=angular'} + , {test: /angular-gettext\.js$/, loader: 'imports-loader?angular=angular'} , {test: /dialogs\.js$/, loader: 'script-loader'} + , {test: /hotkeys\.js$/, loader: 'imports-loader?Mousetrap=Mousetrap'} + , {test: /epoch\.js$/, loader: 'imports-loader?d3=d3'} + //, {test: /\.ts$/, loader: 'ng-annotate-loader?ngAnnotate=ng-annotate-patched!ts-loader` + , { + test: /\.js$/, + use: { + loader: 'ng-annotate-loader', + options: { + ngAnnotate: 'ng-annotate-patched', + es6: true, + explicityOnly: false + } + }, + exclude: /node_modules/ + } + ], // TODO: enable when its sane // preLoaders: [ From 56fc25c9952a26c89c947c58b61b87ddc60415f2 Mon Sep 17 00:00:00 2001 From: David Helkowski Date: Tue, 21 Jul 2020 22:42:57 +0000 Subject: [PATCH 03/12] Many fixes for updated build The updated build is nearly complete / fully functional. There are still some broken bits here and there but loading, styling, login, navigation are working correctly now. Changed naming of bower installed module directory to 'bower_modules' and hardcoded it for the moment to /tmp/build rather than locating it within the res/ directory. Initially this change was made for testing purposes and to make the docker image build process easier/cleaner. Leaving it this way for the moment but it is problematic in that the /tmp directory is wiped on boot in some cases so if using in a non-dockerized way this is trouble. TODO: Change it back. Added a bowerc file in initial attempts to use a proxy for fetching bower modules. Fetching bower modules through a proxy is nearly useless for what I intended ( caching ) because https is used. A MITM caching https proxy would need to be used. A caching proxy is not super important as long as you avoid running the docker build process hundreds of times in a row... Changed back to using slightly older version of oboe. Why? The newer oboe 2.1.5 doesn't understand relative URLs; demanding all urls passed to it to start with http or https. Added in spin.js dependency as it is needed and doesn't work without it. ( how did it work before? ) Using newly rewritten mousetrap module ( I basically rewrote it entirely as an ES6 module as the old version was a global and confusing and horrible and I disliked it very much ) Added in dependencies on epoch and ng-epoch. For whatever reason they weren't getting pulled in automatically. Changed to using newer/updated angular-borderlayout2. This causes a 44 pixel blank space at the top of STF. Unsure quite sure how to get rid of it yet besides altering the css provided by the new module not to have that space. May fork the module temporarily to avoid this space in a clean way. Added typescript and ts processing as some newer modules need it. Added babel and babel processing of jsx files to handle the es6 jsx within the mousetrap module, and to support future use and updates to the newer cleaner es6 class notation. Module loading via the "require(x).name" method has been tweaked in a few places to detect when it fails to get a module name to pass to angular. Really the way this is done currently should be changed everywhere as it is hard to debug when modules don't work correctly and/or don't return a module name. Epoch is now "epoch-charting". Changed some references to it. I think the old version may be getting pulled in also now? Need to check this further. TODO Changes font loading to use esModule: false option so that all fonts get loaded from their font files as a URL fetch instead of whatever was happening before ( the before of which simply didn't work ) Fixed style loading ( was missing style-loader ) --- .bowerrc | 8 +- Dockerfile | 4 +- bower.json | 13 ++- gulpfile.js | 6 +- package.json | 20 +++-- res/app/app.js | 9 +- res/app/control-panes/cpu/index.js | 9 +- .../control-panes/performance/cpu/index.js | 4 +- res/app/layout/index.js | 41 ++++++--- res/web_modules/angular-borderlayout/index.js | 4 +- webpack.config.js | 89 ++++++++++++++----- 11 files changed, 144 insertions(+), 63 deletions(-) diff --git a/.bowerrc b/.bowerrc index 24dc4049b..7638f18b3 100644 --- a/.bowerrc +++ b/.bowerrc @@ -1,4 +1,8 @@ { - "registry": "https://registry.bower.io", - "directory": "res/bower_components" + "registry": "http://registry.bower.io", + "directory": "/tmp/build/bower_modules", + "allow_root": true, + "off_proxy": "http://127.0.0.1:8080", + "off_https-proxy": "http://127.0.0.1:8080", + "strict-ssl": false } diff --git a/Dockerfile b/Dockerfile index 05b3ada4f..2d8713a0c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,13 +38,15 @@ FROM with_packages as frontend # Install bower dependencies WORKDIR /tmp/build COPY ./bower.json /tmp/build/ -RUN echo '{ "allow_root": true }' > /root/.bowerrc && \ +COPY ./.bowerrc /tmp/build/ +RUN mkdir bower_modules && \ ./node_modules/.bin/bower install # Copy the app ( res ) in COPY ./bower.json /tmp/build/ COPY ./gulpfile.js /tmp/build/ COPY ./webpack.config.js /tmp/build/ +COPY ./.babelrc.json /tmp/build/ COPY ./res /tmp/build/res COPY ./lib/util /tmp/build/lib/util diff --git a/bower.json b/bower.json index 6153f01ff..08aaeadc2 100644 --- a/bower.json +++ b/bower.json @@ -3,7 +3,7 @@ "version": "0.1.0", "dependencies": { "lodash": "~3.10.1", - "oboe": "~2.1.5", + "oboe": "~2.1.2", "ng-table": "~1.0.0-beta.9", "ng-file-upload": "~2.0.5", "underscore.string": "~3.2.3", @@ -19,7 +19,8 @@ "angular-sanitize": "~1.8.0", "angular-animate": "~1.8.0", "angular-touch": "~1.8.0", - "angular-ladda": "~0.3.1", + "angular-ladda": "~0.4.3", + "spin.js": "~4.1.0", "angular-xeditable": "~0.1.9", "angular-elastic": "~2.5.1", "angular-ui-bootstrap": "~1.1.1", @@ -27,8 +28,12 @@ "angular-ui-ace": "~0.2.3", "angular-dialog-service": "~5.2.11", "angular-growl-v2": "JanStevens/angular-growl-2#~0.7.9", - "angular-borderlayout": "git://github.com/filearts/angular-borderlayout.git#7c9716aebd9260763f798561ca49d6fbfd4a5c67", - "mousetrap": "~1.5.2" + "angular-borderlayout2": "~0.9.1", + "angular-hotkeys": "https://github.com/nanoscopic/angular-hotkeys.git#2.0.27", + "mousetrap": "https://github.com/nanoscopic/mousetrap.git#1.7.17", + + "epoch": "~0.8.4", + "ng-epoch": "~2.0.1" }, "private": true, "devDependencies": { diff --git a/gulpfile.js b/gulpfile.js index 71461b5e4..895967c4e 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -35,7 +35,7 @@ gulp.task('eslint', function() { return gulp.src([ 'lib/**/*.js' , 'res/**/*.js' - , '!res/bower_components/**' + , '!cache/bower/**' , '*.js' ]) // eslint() attaches the lint output to the "eslint" property @@ -208,7 +208,7 @@ gulp.task('webpack:others', function(callback) { gulp.task('pug', function() { return gulp.src([ './res/**/*.pug' - , '!./res/bower_components/**' + , '!./bower_modules/**' ]) .pipe(pug({ locals: { @@ -226,7 +226,7 @@ gulp.task('translate:extract', gulp.series( 'pug', function(done) { return gulp.src([ './tmp/html/**/*.html' , './res/**/*.js' - , '!./res/bower_components/**' + , '!./bower_modules/**' , '!./res/build/**' ]) .pipe(gettext.extract('stf.pot')) diff --git a/package.json b/package.json index be2f36ed7..d7b5d637b 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "duplicate-arguments-array": false }, "scripts": { - "test": "gulp test" + "test": "gulp test" }, "dependencies": { "@slack/client": "^3.5.4", @@ -56,7 +56,7 @@ "hipchatter": "^0.3.1", "http-proxy": "^1.11.2", "in-publish": "^2.0.0", - "@devicefarmer/jpeg-turbo": "^0.4.0", + "@julusian/jpeg-turbo": "^0.5.4", "jws": "^3.1.0", "ldapjs": "^1.0.0", "lodash": "^4.14.2", @@ -141,7 +141,7 @@ "less": "^2.4.0", "memory-fs": "^0.3.0", "node-libs-browser": "^1.0.0", - "node-sass": "^4.13.1", + "node-sass": "^4.14.1", "phantomjs-prebuilt": "^2.1.11", "protractor": "^5.4.1", "protractor-html-reporter-2": "1.0.4", @@ -157,13 +157,21 @@ "webpack-dev-server": "^3.11.0", "file-loader": "^6.0.0", "less-loader": "5.x.x", - "sass-loader": "8.x.x", + "sass-loader": "^9.0.2", "url-loader": "^4.1.0", - + "typescript": "^3.9.7", + "ts-loader": "^8.0.1", "ng-annotate-patched": "1.12.0", "ng-annotate": "1.2.2", "ng-annotate-loader": "0.7.0", - "angular-hotkeys": "^1.7.0" + "@babel/cli": "7.10.5", + "@babel/core": "7.10.5", + "@babel/node": "7.10.5", + "@babel/preset-env": "7.10.4", + "@babel/register": "7.10.5", + "@babel/plugin-proposal-class-properties": "7.10.4", + "@babel/plugin-proposal-private-methods": "7.10.4", + "babel-loader": "8.1.0" }, "engines": { "node": ">= 6.9" diff --git a/res/app/app.js b/res/app/app.js index 8a6a602a9..bcfcf53ef 100644 --- a/res/app/app.js +++ b/res/app/app.js @@ -1,6 +1,4 @@ -/** -* Copyright © 2019 contains code contributed by Orange SA, authors: Denis Barbaron - Licensed under the Apache license 2.0 -**/ +// Copyright © 2019 contains code contributed by Orange SA, authors: Denis Barbaron - Licensed under the Apache license 2.0 import * as d3 from "d3"; @@ -8,12 +6,13 @@ require.ensure([], function(require) { require('angular') require('angular-route') require('angular-touch') - + require('angular-hotkeys') + angular.module('app', [ 'ngRoute', 'ngTouch', require('gettext').name, - require('angular-hotkeys').name, + 'cfp.hotkeys', require('./layout').name, require('./device-list').name, require('./group-list').name, diff --git a/res/app/control-panes/cpu/index.js b/res/app/control-panes/cpu/index.js index 87721c3ba..d20a0dd68 100644 --- a/res/app/control-panes/cpu/index.js +++ b/res/app/control-panes/cpu/index.js @@ -1,11 +1,10 @@ require('./cpu.css') -module.exports = angular.module('stf.cpu', [ - -]) - .run(['$templateCache', function($templateCache) { +module.exports = angular.module('stf.cpu', []) + .run( function($templateCache) { + "ngInject"; $templateCache.put('control-panes/cpu/cpu.pug', require('./cpu.pug') ) - }]) + }) .controller('CpuCtrl', require('./cpu-controller')) diff --git a/res/app/control-panes/performance/cpu/index.js b/res/app/control-panes/performance/cpu/index.js index 252aae804..9c6258b88 100644 --- a/res/app/control-panes/performance/cpu/index.js +++ b/res/app/control-panes/performance/cpu/index.js @@ -1,7 +1,7 @@ require('./cpu.css') -module.exports = angular.module('stf.cpu', [ - require('epoch-charting').name +module.exports = angular.module('stf.perf.cpu', [ + require('epoch').name ]) .run(['$templateCache', function($templateCache) { $templateCache.put('control-panes/performance/cpu/cpu.pug', diff --git a/res/app/layout/index.js b/res/app/layout/index.js index 4ec7fe7ba..4d3735086 100644 --- a/res/app/layout/index.js +++ b/res/app/layout/index.js @@ -4,16 +4,37 @@ require('./cursor.css') require('./small.css') require('./stf-styles.css') -module.exports = angular.module('layout', [ - require('stf/landscape').name, - require('stf/basic-mode').name, - require('ui-bootstrap').name, - require('angular-borderlayout').name, - require('stf/common-ui').name, - require('stf/socket/socket-state').name, - require('stf/common-ui/modals/socket-disconnected').name, - require('stf/browser-info').name -]) +var modFiles = [ + 'stf/landscape', + 'stf/basic-mode', + 'ui-bootstrap', + 'angular-borderlayout2', + 'stf/common-ui', + 'stf/socket/socket-state', + 'stf/common-ui/modals/socket-disconnected', + 'stf/browser-info' +]; +var mods = [ + require('stf/landscape'), + require('stf/basic-mode'), + require('ui-bootstrap'), + require('angular-borderlayout2'), + require('stf/common-ui'), + require('stf/socket/socket-state'), + require('stf/common-ui/modals/socket-disconnected'), + require('stf/browser-info') +]; + +var modnames = []; +for( var i=0;i Date: Tue, 28 Jul 2020 01:47:36 +0000 Subject: [PATCH 04/12] Get updated modules working Use exact version of oboe. Use newer ng-table and new capital import name for NgTableParams. Use angular-borderlayout2 instead of angular-borderlayout as it is updated more. Fix hardcoded js links to angular-hotkeys to be correct to new non pre-built version. Fix hardcoded ladda links. Remove non-functioning transform code in webpack. Reorder dependency resolve in webpack as the order matters due to equally named local modules. --- bower.json | 7 ++++--- package.json | 3 ++- .../store-account/store-account-controller.js | 3 ++- res/app/layout/index.js | 4 ++-- res/web_modules/angular-hotkeys/index.js | 4 ++-- res/web_modules/ladda/index.js | 6 +++--- webpack.config.js | 11 ++--------- 7 files changed, 17 insertions(+), 21 deletions(-) diff --git a/bower.json b/bower.json index 08aaeadc2..dd1523675 100644 --- a/bower.json +++ b/bower.json @@ -3,8 +3,8 @@ "version": "0.1.0", "dependencies": { "lodash": "~3.10.1", - "oboe": "~2.1.2", - "ng-table": "~1.0.0-beta.9", + "oboe": "2.1.2", + "ng-table": "~1.0.0", "ng-file-upload": "~2.0.5", "underscore.string": "~3.2.3", "bootstrap": "~3.3.6", @@ -44,6 +44,7 @@ "eventEmitter": "~4.3.0", "epoch": "~0.8.4", "get-size": "~2.0.3", - "angular": "~1.8.0" + "angular": "~1.8.0", + "oboe": "2.1.2" } } diff --git a/package.json b/package.json index d7b5d637b..1f9d3d6ee 100644 --- a/package.json +++ b/package.json @@ -171,7 +171,8 @@ "@babel/register": "7.10.5", "@babel/plugin-proposal-class-properties": "7.10.4", "@babel/plugin-proposal-private-methods": "7.10.4", - "babel-loader": "8.1.0" + "babel-loader": "8.1.0", + "ng-table": "~3.0.1" }, "engines": { "node": ">= 6.9" diff --git a/res/app/control-panes/automation/store-account/store-account-controller.js b/res/app/control-panes/automation/store-account/store-account-controller.js index 83ebda30f..151f45538 100644 --- a/res/app/control-panes/automation/store-account/store-account-controller.js +++ b/res/app/control-panes/automation/store-account/store-account-controller.js @@ -1,4 +1,5 @@ -module.exports = function StoreAccountCtrl($scope, ngTableParams, $timeout) { +module.exports = function StoreAccountCtrl($scope, NgTableParams, $timeout) { + "ngInject"; // TODO: This should come from the DB $scope.currentAppStore = 'google-play-store' $scope.deviceAppStores = { diff --git a/res/app/layout/index.js b/res/app/layout/index.js index 4d3735086..402ecd96d 100644 --- a/res/app/layout/index.js +++ b/res/app/layout/index.js @@ -8,7 +8,7 @@ var modFiles = [ 'stf/landscape', 'stf/basic-mode', 'ui-bootstrap', - 'angular-borderlayout2', + 'angular-borderlayout', 'stf/common-ui', 'stf/socket/socket-state', 'stf/common-ui/modals/socket-disconnected', @@ -18,7 +18,7 @@ var mods = [ require('stf/landscape'), require('stf/basic-mode'), require('ui-bootstrap'), - require('angular-borderlayout2'), + require('angular-borderlayout'), require('stf/common-ui'), require('stf/socket/socket-state'), require('stf/common-ui/modals/socket-disconnected'), diff --git a/res/web_modules/angular-hotkeys/index.js b/res/web_modules/angular-hotkeys/index.js index c5efaded0..30f980fb1 100644 --- a/res/web_modules/angular-hotkeys/index.js +++ b/res/web_modules/angular-hotkeys/index.js @@ -1,6 +1,6 @@ -require('angular-hotkeys/build/hotkeys.css') +require('angular-hotkeys/src/hotkeys.css') //require('./hotkeys.css') -require('angular-hotkeys/build/hotkeys.js') +require('angular-hotkeys/src/hotkeys.js') module.exports = { name: 'cfp.hotkeys' diff --git a/res/web_modules/ladda/index.js b/res/web_modules/ladda/index.js index c6517886b..1f1871ad9 100644 --- a/res/web_modules/ladda/index.js +++ b/res/web_modules/ladda/index.js @@ -1,3 +1,3 @@ -require('ladda/dist/ladda-themeless.min.css') -require('ladda/dist/spin.min.js') -require('ladda/dist/ladda.min.js') +require('ladda/css/ladda.scss') +//require('spin.js/spin.ts') +require('ladda/js/ladda.js') diff --git a/webpack.config.js b/webpack.config.js index 7dbfc1e99..40aced488 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -8,14 +8,6 @@ var pathutil = require('./lib/util/pathutil') var path = require('path') var log = require('./lib/util/logger').createLogger('webpack:config') -require("@babel/core").transform("code", { - "presets": [ - "@babel/preset-env" - ], - "plugins": [ - "@babel/plugin-proposal-class-properties" - ] -}); require("@babel/register"); module.exports = { @@ -42,8 +34,9 @@ module.exports = { modules: [ "node_modules", //path.resolve(__dirname, "bower_modules"), // works - '/tmp/build/bower_modules', path.join(__dirname, "res/web_modules" ), // works + '/tmp/build/bower_modules', + //'/tmp/build/res/web_modules', path.resolve(__dirname, "res/app/components" )// works //'/tmp/build/res/app/components' From 3578b0491652964c8194a72f40acf99d3ed18c84 Mon Sep 17 00:00:00 2001 From: David Helkowski Date: Thu, 30 Jul 2020 19:10:14 +0000 Subject: [PATCH 05/12] Random small fixes. Added IPA install support. Minor tweaks to Dockerfile. Addition of chown to /app/res as it was ending up owned by root instead of stf. Added webpackserver.config.js because it is looked at by the backend app in some cases. Using latest mousetrap via angular-hotkeys. Changed references to angular-borderlayout to all have it without a 2 at the end. Using custom fork as the original was broken with current browsers / node. Added mime type setting to express; but it isn't needed. The MIME issue I was encountering was due to an error message being served out in place of a JS file, and that having MIME text/html. TODO: Remove this added line. Added log of static file serving via express because there was no log anywhere of files being served and it made debugging difficult. TODO: Make this tied to a debug log level instead of always logging all the requests and cleanup the commented out bits. Changed require('request') lines in various places to not use strict SSL, so that the self-signed / auto created certs of a demo / testing environment can actually work. This should be changed to use a custom single instance shared module that has configuration for specifying the root CA that created these certs, or at the very least making this options as it weakens security. TODO Added logging of websocket requests to the frontend for debugging purposes. These can stay in place as they aren't visible unless someone goes looking for them in the console. --- Dockerfile | 4 +- bower.json | 6 +- lib/units/app/index.js | 26 +++++- lib/units/storage/plugins/apk/index.js | 2 +- .../storage/plugins/apk/task/manifest.js | 15 +++- lib/units/storage/temp.js | 9 +- lib/util/download.js | 13 ++- lib/util/ipareader.js | 90 +++++++++++++++++++ package.json | 13 ++- .../components/stf/control/control-service.js | 2 + .../components/stf/install/install-service.js | 7 +- .../components/stf/storage/storage-service.js | 3 + .../dashboard/install/install-controller.js | 7 +- res/web_modules/angular-borderlayout/index.js | 4 +- webpack.config.js | 4 +- 15 files changed, 180 insertions(+), 25 deletions(-) create mode 100644 lib/util/ipareader.js diff --git a/Dockerfile b/Dockerfile index 2d8713a0c..8bbeeeaf1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -79,7 +79,7 @@ FROM nodebase as runtime EXPOSE 3000 # Setup user -RUN mkdir -p /app && chown stf:stf /app +RUN mkdir -p /app/res && chown stf:stf /app && chown stf:stf /app/res WORKDIR /app @@ -99,6 +99,8 @@ COPY --from=app --chown=stf:stf /app /app # Copy in the frontend COPY --from=frontend --chown=stf:stf /tmp/build/res/build /app/res/build +COPY ./webpackserver.config.js /app/ + #USER root #RUN apt-get -y --no-install-recommends install ncdu diff --git a/bower.json b/bower.json index dd1523675..be308c999 100644 --- a/bower.json +++ b/bower.json @@ -28,9 +28,9 @@ "angular-ui-ace": "~0.2.3", "angular-dialog-service": "~5.2.11", "angular-growl-v2": "JanStevens/angular-growl-2#~0.7.9", - "angular-borderlayout2": "~0.9.1", - "angular-hotkeys": "https://github.com/nanoscopic/angular-hotkeys.git#2.0.27", - "mousetrap": "https://github.com/nanoscopic/mousetrap.git#1.7.17", + "angular-borderlayout": "https://github.com/nanoscopic/angular-borderlayout.git#0.9.2", + "angular-hotkeys": "https://github.com/nanoscopic/angular-hotkeys.git#2.0.29", + "mousetrap": "https://github.com/nanoscopic/mousetrap.git#1.7.19", "epoch": "~0.8.4", "ng-epoch": "~2.0.1" diff --git a/lib/units/app/index.js b/lib/units/app/index.js index 6656a7676..a52dad95a 100644 --- a/lib/units/app/index.js +++ b/lib/units/app/index.js @@ -3,6 +3,7 @@ var url = require('url') var fs = require('fs') var express = require('express') +var path = require('path') var validator = require('express-validator') var cookieSession = require('cookie-session') var bodyParser = require('body-parser') @@ -23,9 +24,32 @@ var markdownServe = require('markdown-serve') module.exports = function(options) { var log = logger.createLogger('app') + + express.static.mime.define({'application/javascript': ['js']}); + var app = express() + var server = http.createServer(app) - + + /*app.use(function (req, res, next) { + var filename = path.basename(req.url); + var extension = path.extname(filename); + if (extension === '.css') + console.log("Request: " + filename); + next(); + });*/ + app.use(express.static('/static', { + index: false, + setHeaders: (response, file_path, file_stats) => { + // This function is called when “serve-static” makes a response. + // Note that `file_path` is an absolute path. + + // Logging work + //const relative_path = path.join(asset_dir_path, path.relative(asset_dir_path, file_path)); + console.info(`@${Date.now()}`, "GAVE\t\t", file_path); + } + })); + app.use('/static/wiki', markdownServe.middleware({ rootDirectory: pathutil.root('node_modules/@devicefarmer/stf-wiki') , view: 'docs' diff --git a/lib/units/storage/plugins/apk/index.js b/lib/units/storage/plugins/apk/index.js index 9ed22bca0..daf8193e2 100644 --- a/lib/units/storage/plugins/apk/index.js +++ b/lib/units/storage/plugins/apk/index.js @@ -3,7 +3,7 @@ var url = require('url') var util = require('util') var express = require('express') -var request = require('request') +var request = require('request').defaults({ rejectUnauthorized: false }) var logger = require('../../../../util/logger') var download = require('../../../../util/download') diff --git a/lib/units/storage/plugins/apk/task/manifest.js b/lib/units/storage/plugins/apk/task/manifest.js index c6d3faf4d..3cfa3a167 100644 --- a/lib/units/storage/plugins/apk/task/manifest.js +++ b/lib/units/storage/plugins/apk/task/manifest.js @@ -1,7 +1,16 @@ var ApkReader = require('@devicefarmer/adbkit-apkreader') +var IpaReader = require('../../../../../util/ipareader') module.exports = function(file) { - return ApkReader.open(file.path).then(function(reader) { - return reader.readManifest() - }) + if(file.path.endsWith('.apk')){ + return ApkReader.open(file.path).then(function(reader) { + return reader.readManifest() + }) + } + else if(file.path.endsWith('.ipa')){ + var ipaReader = new IpaReader(file.path) + return ipaReader.ReadInfoPlist().then(function(res){ + return res + }) + } } diff --git a/lib/units/storage/temp.js b/lib/units/storage/temp.js index f5df76bb3..ce1cb1f0b 100644 --- a/lib/units/storage/temp.js +++ b/lib/units/storage/temp.js @@ -82,6 +82,11 @@ module.exports = function(options) { }) }) }) + + function get_file_extension(source) { + var typestr = source.toLowerCase().substring(source.lastIndexOf('.') + 1) + return typestr + } app.post('/s/upload/:plugin', function(req, res) { var form = new formidable.IncomingForm({ @@ -92,7 +97,9 @@ module.exports = function(options) { } form.on('fileBegin', function(name, file) { var md5 = crypto.createHash('md5') - file.name = md5.update(file.name).digest('hex') + var extension = get_file_extension(file.name) + file.name = md5.update(file.name).digest('hex') + '.' + extension + log.info("Saving with extension ", file.name ) }) Promise.promisify(form.parse, form)(req) .spread(function(fields, files) { diff --git a/lib/util/download.js b/lib/util/download.js index 372345e82..83663e469 100644 --- a/lib/util/download.js +++ b/lib/util/download.js @@ -1,18 +1,27 @@ var fs = require('fs') var Promise = require('bluebird') -var request = require('request') +var request = require('request').defaults({ rejectUnauthorized: false }) var progress = require('request-progress') var temp = require('temp') +var logger = require('./logger') +var log = logger.createLogger('util:download') module.exports = function download(url, options) { var resolver = Promise.defer() var path = temp.path(options) + if(url.endsWith('.apk')){ + path += '.apk' + } + else if(url.endsWith('.ipa')){ + path += '.ipa' + } + log.info("Downloading " + url + " to " + path ) function errorListener(err) { resolver.reject(err) } - + function progressListener(state) { if (state.total !== null) { resolver.progress({ diff --git a/lib/util/ipareader.js b/lib/util/ipareader.js new file mode 100644 index 000000000..bcf876693 --- /dev/null +++ b/lib/util/ipareader.js @@ -0,0 +1,90 @@ +'use strict' + +const Promise = require('bluebird') +var bplist = require('bplist') +var plist = require('plist') +var fs = require('fs') +var unzipper = require('unzipper') +var os = require('os') +var util = require('util') +var execSync = require('child_process').execSync; +var EventEmitter = require('eventemitter3') +var logger = require('./logger') +var log = logger.createLogger('util:ipareader') + +function IpaReader(filepath) { + EventEmitter.call(this) + this.file = filepath + this.cachedir = os.tmpdir()+'/ipa' +} + +util.inherits(IpaReader, EventEmitter) + +IpaReader.prototype.parsePlist = function(){ + var manifest = {} + + var destdir = this.cachedir+'/Payload' + var dirs = fs.readdirSync(destdir) + destdir = util.format("%s/%s",destdir,dirs[0]) + var destfile = destdir+'/Info.plist' + var content = fs.readFileSync(destfile) + return new Promise((resolve,reject)=>{ + var process = function(err,result){ + if(err){ + return reject(err) + } + manifest = result[0] + manifest.package = result[0].CFBundleIdentifier + manifest.versionCode = parseInt(result[0].CFBundleInfoDictionaryVersion) + manifest.versionName = result[0].CFBundleShortVersionString + return resolve(manifest) + }; + + console.log( typeof( content ) ); + var firstSix = content.toString( 'ascii', 0, 6 ); + if( firstSix == "bplist" ) { + bplist.parseBuffer( content, process ) + } + else { + var data = plist.parse( content.toString('utf-8') ); + process( 0, [data] ); + } + } ) +} + +IpaReader.prototype.UnzipIpa = function(){ + this.cachedir = os.tmpdir()+'/ipa' + if(fs.existsSync(this.cachedir)){ + var cmd = 'rm -rf '+this.cachedir + console.log(cmd) + execSync(cmd,{}); + } + fs.mkdirSync(this.cachedir) + + log.info("Extracting " + this.file + " to " + this.cachedir ); + + return new Promise((resolve,reject)=>{ + var extractor = unzipper.Extract({ + path: this.cachedir + }); + extractor.on('error', function(err) { + throw err; + }); + extractor.promise().then(function() { + return resolve() + }); + fs.createReadStream( this.file ).pipe( extractor ) + }) +} + +IpaReader.prototype.ReadInfoPlist = function(){ + return new Promise((resolve,reject)=>{ + this.UnzipIpa().then(()=>{ + this.parsePlist().then(function(res){ + return resolve(res) + }) + }) + }) +} + +module.exports = IpaReader \ No newline at end of file diff --git a/package.json b/package.json index 1f9d3d6ee..20f5c6c35 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "duplicate-arguments-array": false }, "scripts": { - "test": "gulp test" + "test": "gulp test" }, "dependencies": { "@slack/client": "^3.5.4", @@ -41,6 +41,8 @@ "basic-auth": "^1.0.3", "bluebird": "^2.10.1", "body-parser": "^1.13.3", + "bplist": "0.0.4", + "plist": "3.0.1", "bufferutil": "^1.2.1", "chalk": "~1.1.1", "compression": "^1.5.2", @@ -102,7 +104,8 @@ "spin.js": "~2.0.2", "fontsource-lato": "~2.1.4", "jquery": "~3.5.1", - "epoch-charting": "~0.8.4" + "epoch-charting": "~0.8.4", + "unzipper": "~0.10.11" }, "devDependencies": { "async": "^2.0.1", @@ -161,9 +164,12 @@ "url-loader": "^4.1.0", "typescript": "^3.9.7", "ts-loader": "^8.0.1", + "node-unzip-2": "0.2.8", + "ng-annotate-patched": "1.12.0", "ng-annotate": "1.2.2", "ng-annotate-loader": "0.7.0", + "@babel/cli": "7.10.5", "@babel/core": "7.10.5", "@babel/node": "7.10.5", @@ -171,8 +177,7 @@ "@babel/register": "7.10.5", "@babel/plugin-proposal-class-properties": "7.10.4", "@babel/plugin-proposal-private-methods": "7.10.4", - "babel-loader": "8.1.0", - "ng-table": "~3.0.1" + "babel-loader": "8.1.0" }, "engines": { "node": ">= 6.9" diff --git a/res/app/components/stf/control/control-service.js b/res/app/components/stf/control/control-service.js index a274030a7..f4f96bd04 100644 --- a/res/app/components/stf/control/control-service.js +++ b/res/app/components/stf/control/control-service.js @@ -12,10 +12,12 @@ module.exports = function ControlServiceFactory( function ControlService(target, channel) { function sendOneWay(action, data) { + console.log("sentOneWay",action,data); socket.emit(action, channel, data) } function sendTwoWay(action, data) { + console.log("sentTwoWay",action,data); var tx = TransactionService.create(target) socket.emit(action, channel, tx.channel, data) return tx.promise diff --git a/res/app/components/stf/install/install-service.js b/res/app/components/stf/install/install-service.js index cd9902f29..800f2156d 100644 --- a/res/app/components/stf/install/install-service.js +++ b/res/app/components/stf/install/install-service.js @@ -92,7 +92,12 @@ module.exports = function InstallService( $rootScope.$broadcast('installation', installation) return StorageService.storeFile('apk', $files, { filter: function(file) { - return /\.apk$/i.test(file.name) + if(file.name.indexOf('.apk')!=-1){ + return /\.apk$/i.test(file.name) + } + else { + return /\.ipa$/i.test(file.name) + } } }) .progressed(function(e) { diff --git a/res/app/components/stf/storage/storage-service.js b/res/app/components/stf/storage/storage-service.js index 7c3a1f76b..97ebe8de9 100644 --- a/res/app/components/stf/storage/storage-service.js +++ b/res/app/components/stf/storage/storage-service.js @@ -18,6 +18,9 @@ module.exports = function StorageServiceFactory($http, $upload) { var input = options.filter ? files.filter(options.filter) : files if (input.length) { + if(input.indexOf('.ipa')!=-1) + type='ipa' + $upload.upload({ url: '/s/upload/' + type , method: 'POST' diff --git a/res/app/control-panes/dashboard/install/install-controller.js b/res/app/control-panes/dashboard/install/install-controller.js index a49193c63..ab45c3edd 100644 --- a/res/app/control-panes/dashboard/install/install-controller.js +++ b/res/app/control-panes/dashboard/install/install-controller.js @@ -1,7 +1,6 @@ -module.exports = function InstallCtrl( - $scope -, InstallService -) { +module.exports = function InstallCtrl( $scope, InstallService ) { + "ngInject"; + $scope.accordionOpen = true $scope.installation = null diff --git a/res/web_modules/angular-borderlayout/index.js b/res/web_modules/angular-borderlayout/index.js index 47b8fef34..924e69697 100644 --- a/res/web_modules/angular-borderlayout/index.js +++ b/res/web_modules/angular-borderlayout/index.js @@ -1,5 +1,5 @@ -require('angular-borderlayout2/dist/borderLayout.js') -require('angular-borderlayout2/dist/borderLayout.css') +require('angular-borderlayout/dist/borderLayout.js') +require('angular-borderlayout/dist/borderLayout.css') require('./style.css') module.exports = { diff --git a/webpack.config.js b/webpack.config.js index 40aced488..0a46edc27 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -20,8 +20,8 @@ module.exports = { authmock: pathutil.resource('auth/mock/scripts/entry.js') }, output: { - //path: pathutil.resource('build'), - path: '/tmp/build/res/build', + path: pathutil.resource('build'), + //path: '/tmp/build/res/build', publicPath: '/static/app/build/', filename: 'entry/[name].entry.js', chunkFilename: '[id].[hash].chunk.js' From 87992be683f0aea4cd8ae4ca719aff24b285ff4a Mon Sep 17 00:00:00 2001 From: David Helkowski Date: Thu, 6 Aug 2020 18:12:58 +0000 Subject: [PATCH 06/12] Alert response functionality The advanced section has a new button now to show a dialog for responding to an on-screen alert. Initial mouse wheel support for scrolling screen vertically has been added, but it has issues. If you scroll more than a single "notch" at a time it can freeze the WDA. For now have added in console logging of messages via the websocket to the backend. This makes events far easier to debug and also generally see what is happening. --- lib/units/websocket/index.js | 50 +++++++++ lib/wire/wire.proto | 23 ++++ package.json | 43 +++---- .../components/stf/control/control-service.js | 51 ++++++++- .../components/stf/screen/screen-directive.js | 6 + res/app/control-panes/advanced/advanced.pug | 2 + res/app/control-panes/advanced/index.js | 1 + .../advanced/input/alert-dialog.css | 106 ++++++++++++++++++ .../advanced/input/alert-dialog.pug | 17 +++ res/app/control-panes/advanced/input/index.js | 5 +- .../advanced/input/input-controller.js | 52 ++++++++- .../control-panes/advanced/input/input.pug | 5 + 12 files changed, 335 insertions(+), 26 deletions(-) create mode 100644 res/app/control-panes/advanced/input/alert-dialog.css create mode 100644 res/app/control-panes/advanced/input/alert-dialog.pug diff --git a/lib/units/websocket/index.js b/lib/units/websocket/index.js index b7071d034..d82aa30d8 100644 --- a/lib/units/websocket/index.js +++ b/lib/units/websocket/index.js @@ -1001,6 +1001,56 @@ module.exports = function(options) { ) ]) }) + .on('alert.text', function(channel, responseChannel) { + joinChannel(responseChannel) + push.send([ + channel + , wireutil.transaction( + responseChannel + , new wire.AlertTextMessage() + ) + ]) + }) + .on('alert.buttons', function(channel, responseChannel) { + joinChannel(responseChannel) + push.send([ + channel + , wireutil.transaction( + responseChannel + , new wire.AlertButtonsMessage() + ) + ]) + }) + .on('alert.accept', function(channel, responseChannel, data) { + joinChannel(responseChannel) + push.send([ + channel + , wireutil.transaction( + responseChannel + , new wire.AlertAcceptMessage(data) + ) + ]) + }) + .on('alert.dismiss', function(channel, responseChannel, data) { + joinChannel(responseChannel) + push.send([ + channel + , wireutil.transaction( + responseChannel + , new wire.AlertDismissMessage(data) + ) + ]) + }) + .on('input.wheel', function(channel, responseChannel, data) { + joinChannel(responseChannel) + push.send([ + channel + , wireutil.transaction( + responseChannel + , new wire.InputWheelMessage(data) + ) + ]) + }) }) .finally(function() { // Clean up all listeners and subscriptions diff --git a/lib/wire/wire.proto b/lib/wire/wire.proto index 3bc8cdf5d..85ffa5b3f 100644 --- a/lib/wire/wire.proto +++ b/lib/wire/wire.proto @@ -90,6 +90,11 @@ enum MessageType { GroupChangeMessage = 1205; UserChangeMessage = 1206; DeviceChangeMessage = 1207; + AlertTextMessage = 1300; + AlertButtonsMessage = 1301; + AlertAcceptMessage = 1302; + AlertDismissMessage = 1303; + InputWheelMessage = 1304; } message UpdateAccessTokenMessage { @@ -749,3 +754,21 @@ message RotationEvent { required string serial = 1; required int32 rotation = 2; } + +message AlertTextMessage { +} + +message AlertButtonsMessage { +} + +message AlertAcceptMessage { + required string name = 1; +} + +message AlertDismissMessage { + required string name = 1; +} + +message InputWheelMessage { + required uint32 dist = 1; +} diff --git a/package.json b/package.json index 20f5c6c35..1db7890fc 100644 --- a/package.json +++ b/package.json @@ -29,50 +29,63 @@ "duplicate-arguments-array": false }, "scripts": { - "test": "gulp test" + "test": "gulp test" }, "dependencies": { - "@slack/client": "^3.5.4", "@devicefarmer/adbkit": "^2.11.1", "@devicefarmer/adbkit-apkreader": "^3.1.1", "@devicefarmer/adbkit-monkey": "^1.0.1", + "@devicefarmer/minicap-prebuilt": "^2.4.0", + "@devicefarmer/minitouch-prebuilt": "^1.3.0", + "@devicefarmer/stf-appstore-db": "^1.0.0", + "@devicefarmer/stf-browser-db": "^1.0.2", + "@devicefarmer/stf-device-db": "^1.2.0", + "@devicefarmer/stf-syrup": "^1.0.0", + "@devicefarmer/stf-wiki": "^1.0.0", + "@julusian/jpeg-turbo": "^0.5.4", + "@slack/client": "^3.5.4", "android-device-list": "^1.2.1", "aws-sdk": "^2.4.13", "basic-auth": "^1.0.3", "bluebird": "^2.10.1", "body-parser": "^1.13.3", "bplist": "0.0.4", - "plist": "3.0.1", "bufferutil": "^1.2.1", "chalk": "~1.1.1", "compression": "^1.5.2", "cookie-session": "^2.0.0-alpha.1", "csurf": "^1.7.0", + "d3": "~5.16.0", "debug": "^2.2.0", + "dom-cascade": "git+https://github.com/nanoscopic/DomCascade.git#1.0.3", + "draggabilly": "~2.3.0", + "epoch-charting": "~0.8.4", "eventemitter3": "^1.2.0", "express": "^4.14.0", "express-validator": "^2.20.8", "file-saver": "1.3.3", + "fontsource-lato": "~2.1.4", "formidable": "^1.2.0", "gm": "^1.23.0", "hipchatter": "^0.3.1", "http-proxy": "^1.11.2", "in-publish": "^2.0.0", - "@julusian/jpeg-turbo": "^0.5.4", + "jquery": "~3.5.1", "jws": "^3.1.0", "ldapjs": "^1.0.0", "lodash": "^4.14.2", "markdown-serve": "^0.3.2", + "micromodal": "~0.4.6", "mime": "^1.3.4", - "@devicefarmer/minicap-prebuilt": "^2.4.0", "minimatch": "^3.0.3", - "@devicefarmer/minitouch-prebuilt": "^1.3.0", + "minlib": "git+https://github.com/nanoscopic/minlib.git#1.0.2", "my-local-ip": "^1.0.0", "openid": "^2.0.1", "passport": "^0.3.2", "passport-oauth2": "^1.1.2", "passport-saml": "^0.15.0", "please-update-dependencies": "^2.0.0", + "plist": "3.0.1", "protobufjs": "^3.8.2", "proxy-addr": "^1.0.10", "pug": "^2.0.0-beta4", @@ -83,29 +96,19 @@ "serve-favicon": "^2.2.0", "serve-static": "^1.9.2", "socket.io": "^2.0.3", + "spin.js": "~2.0.2", "split": "^1.0.0", - "@devicefarmer/stf-appstore-db": "^1.0.0", - "@devicefarmer/stf-browser-db": "^1.0.2", - "@devicefarmer/stf-device-db": "^1.2.0", - "@devicefarmer/stf-syrup": "^1.0.0", - "@devicefarmer/stf-wiki": "^1.0.0", "swagger-express-mw": "^0.7.0", "swagger-tools": "^0.10.3", "temp": "^0.8.1", "transliteration": "^1.1.6", + "unzipper": "~0.10.11", "url-join": "1.1.0", "utf-8-validate": "^1.2.1", "uuid": "^3.0.0", "ws": "^3.0.0", "yargs": "^6.6.0", - "zmq": "^2.14.0", - "d3": "~5.16.0", - "draggabilly": "~2.3.0", - "spin.js": "~2.0.2", - "fontsource-lato": "~2.1.4", - "jquery": "~3.5.1", - "epoch-charting": "~0.8.4", - "unzipper": "~0.10.11" + "zmq": "^2.14.0" }, "devDependencies": { "async": "^2.0.1", @@ -165,11 +168,9 @@ "typescript": "^3.9.7", "ts-loader": "^8.0.1", "node-unzip-2": "0.2.8", - "ng-annotate-patched": "1.12.0", "ng-annotate": "1.2.2", "ng-annotate-loader": "0.7.0", - "@babel/cli": "7.10.5", "@babel/core": "7.10.5", "@babel/node": "7.10.5", diff --git a/res/app/components/stf/control/control-service.js b/res/app/components/stf/control/control-service.js index f4f96bd04..c0285096e 100644 --- a/res/app/components/stf/control/control-service.js +++ b/res/app/components/stf/control/control-service.js @@ -3,6 +3,7 @@ module.exports = function ControlServiceFactory( , $http , socket , TransactionService +, TransactionError , $rootScope , gettext , KeycodesMapped @@ -12,12 +13,12 @@ module.exports = function ControlServiceFactory( function ControlService(target, channel) { function sendOneWay(action, data) { - console.log("sentOneWay",action,data); + console.log("sendOneWay",action,data); socket.emit(action, channel, data) } function sendTwoWay(action, data) { - console.log("sentTwoWay",action,data); + console.log("sendTwoWay",action,data); var tx = TransactionService.create(target) socket.emit(action, channel, tx.channel, data) return tx.promise @@ -294,7 +295,51 @@ module.exports = function ControlServiceFactory( this.getWifiStatus = function() { return sendTwoWay('wifi.get') } - + + this.getAlertInfo = function() { + return new Promise( function( resolve, reject ) { + sendTwoWay('alert.text',{}).then( function( res ) { + console.log( 'alert.text result', res ); + sendTwoWay('alert.buttons',{}).then( function( res2 ) { + console.log( 'alert.buttons results', res2 ); + resolve( [ res, res2 ] ); + } ) + .catch(TransactionError, function() { + throw new Error('alert.buttons failure') + }); + } ) + .catch(TransactionError, function() { + throw new Error('alert.text failure') + }); + } ); + } + + this.alertAccept = function( name ) { + return new Promise( function( resolve, reject ) { + sendTwoWay('alert.accept',{ name: name }) + .then( function( res ) { + console.log( 'alert.accept result', res ); + resolve( res ); + } ) + .catch(TransactionError, function() { + reject(); + }); + } ); + } + + this.wheel = function( dist ) { + return new Promise( function( resolve, reject ) { + sendTwoWay('input.wheel',{ dist: dist }) + .then( function( res ) { + console.log( 'input.wheel result', res ); + resolve( res ); + } ) + .catch(TransactionError, function() { + reject(); + }); + } ); + } + window.cc = this } diff --git a/res/app/components/stf/screen/screen-directive.js b/res/app/components/stf/screen/screen-directive.js index 47e0f296b..8f0f76546 100644 --- a/res/app/components/stf/screen/screen-directive.js +++ b/res/app/components/stf/screen/screen-directive.js @@ -573,6 +573,11 @@ module.exports = function DeviceScreenDirective( } } + function mouseWheelListener(event) { + event.preventDefault(); + control.wheel( event.deltaY ); + } + function mouseDownListener(event) { var e = event if (e.originalEvent) { @@ -928,6 +933,7 @@ module.exports = function DeviceScreenDirective( element.on('touchstart', touchStartListener) element.on('mousedown', mouseDownListener) element.on('mouseup', mouseUpBugWorkaroundListener) + element.on('wheel', mouseWheelListener) createSlots() })() diff --git a/res/app/control-panes/advanced/advanced.pug b/res/app/control-panes/advanced/advanced.pug index b277b7b38..9d548a47e 100644 --- a/res/app/control-panes/advanced/advanced.pug +++ b/res/app/control-panes/advanced/advanced.pug @@ -11,3 +11,5 @@ .col-md-6 div(ng-include='"control-panes/advanced/maintenance/maintenance.pug"') + +div(ng-include='"control-panes/advanced/input/alert-dialog.pug"') diff --git a/res/app/control-panes/advanced/index.js b/res/app/control-panes/advanced/index.js index 78dc569a1..7a79dff49 100644 --- a/res/app/control-panes/advanced/index.js +++ b/res/app/control-panes/advanced/index.js @@ -1,4 +1,5 @@ require('./advanced.css') +require('./input/alert-dialog.css') module.exports = angular.module('stf.advanced', [ require('./input').name, diff --git a/res/app/control-panes/advanced/input/alert-dialog.css b/res/app/control-panes/advanced/input/alert-dialog.css new file mode 100644 index 000000000..dd5bb09ba --- /dev/null +++ b/res/app/control-panes/advanced/input/alert-dialog.css @@ -0,0 +1,106 @@ +/**************************\ + Basic Modal Styles +\**************************/ + + +.modal { + display: none; +} + +.modal.is-open { + display: block; +} + +.modal { + font-family: -apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica neue,helvetica,ubuntu,roboto,noto,segoe ui,arial,sans-serif; +} + +.modal__overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0,0,0,0.6); + display: flex; + justify-content: center; + align-items: center; +} + +.modal__container { + background-color: #fff; + padding: 30px; + max-width: 500px; + max-height: 100vh; + border-radius: 4px; + overflow-y: auto; + box-sizing: border-box; +} + +.modal__header { + display: flex; + justify-content: space-between; + align-items: center; +} + +.modal__title { + margin-top: 0; + margin-bottom: 0; + font-weight: 600; + font-size: 1.25rem; + line-height: 1.25; + color: #00449e; + box-sizing: border-box; +} + +.modal__close { + background: transparent; + border: 0; +} + +.modal__header .modal__close:before { content: "\2715"; } + +.modal__content { + margin-top: 2rem; + margin-bottom: 2rem; + line-height: 1.5; + color: rgba(0,0,0,.8); +} + +.modal__btn { + font-size: .875rem; + padding-left: 1rem; + padding-right: 1rem; + padding-top: .5rem; + padding-bottom: .5rem; + background-color: #e6e6e6; + color: rgba(0,0,0,.8); + border-radius: .25rem; + border-style: none; + border-width: 0; + cursor: pointer; + -webkit-appearance: button; + text-transform: none; + overflow: visible; + line-height: 1.15; + margin: 0; + will-change: transform; + -moz-osx-font-smoothing: grayscale; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform: translateZ(0); + transform: translateZ(0); + transition: -webkit-transform .25s ease-out; + transition: transform .25s ease-out; + transition: transform .25s ease-out,-webkit-transform .25s ease-out; +} + +.modal__btn:focus, .modal__btn:hover { + -webkit-transform: scale(1.05); + transform: scale(1.05); +} + +.modal__btn-primary { + background-color: #00449e; + color: #fff; +} \ No newline at end of file diff --git a/res/app/control-panes/advanced/input/alert-dialog.pug b/res/app/control-panes/advanced/input/alert-dialog.pug new file mode 100644 index 000000000..9316da163 --- /dev/null +++ b/res/app/control-panes/advanced/input/alert-dialog.pug @@ -0,0 +1,17 @@ +#alertModal.modal.micromodal-slide(aria-hidden="true") + .modal__overlay(tabindex="-1" data-micromodal-close="") + .modal__container(role="dialog" aria-modal="true" aria-labelledby="modal-1-title") + header.modal__header + h2#alertModal-title.modal__title + | Micromodal + button.modal__close(aria-label="Close modal" data-micromodal-close="") + main#alertModal-content.modal__content + p + | Try hitting the + code tab + | key and notice how the focus stays within the modal itself. Also, + code esc + | to close modal. + footer#alertModal-footer.modal__footer + button.modal__btn.modal__btn-primary Continue + button.modal__btn(data-micromodal-close="" aria-label="Close this dialog window") Close diff --git a/res/app/control-panes/advanced/input/index.js b/res/app/control-panes/advanced/input/index.js index e6ecd193e..cff753abd 100644 --- a/res/app/control-panes/advanced/input/index.js +++ b/res/app/control-panes/advanced/input/index.js @@ -6,5 +6,8 @@ module.exports = angular.module('stf.advanced.input', [ $templateCache.put('control-panes/advanced/input/input.pug', require('./input.pug') ) + $templateCache.put('control-panes/advanced/input/alert-dialog.pug', + require('./alert-dialog.pug') + ) }]) - .controller('InputAdvancedCtrl', require('./input-controller')) + .controller('InputAdvancedCtrl', require('./input-controller').default) diff --git a/res/app/control-panes/advanced/input/input-controller.js b/res/app/control-panes/advanced/input/input-controller.js index d941424bb..ff38e9e65 100644 --- a/res/app/control-panes/advanced/input/input-controller.js +++ b/res/app/control-panes/advanced/input/input-controller.js @@ -1,6 +1,56 @@ -module.exports = function InputCtrl($scope) { +import MicroModal from 'micromodal';//require('micromodal'); +import DomCascade from 'dom-cascade'; +import MinLib from 'minlib'; +export default function InputCtrl($scope) { $scope.press = function(key) { $scope.control.keyPress(key) } + + $scope.handle_alert = function() { + MicroModal.init(); + + var dc = new DomCascade(); + var ml = new MinLib(); + + $scope.control.getAlertInfo().then( function( arr ) { + // + // + + var text = arr[0].body.value; + var parts = text.split('\n'); + var title = parts.shift(); + ml.gel('alertModal-title').innerHTML = title; + + var dcParts = []; + for( var i=0;i Date: Fri, 7 Aug 2020 07:04:11 +0000 Subject: [PATCH 07/12] Remove babelrc copy breaking Docker image build --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 8bbeeeaf1..617f655ed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -46,7 +46,6 @@ RUN mkdir bower_modules && \ COPY ./bower.json /tmp/build/ COPY ./gulpfile.js /tmp/build/ COPY ./webpack.config.js /tmp/build/ -COPY ./.babelrc.json /tmp/build/ COPY ./res /tmp/build/res COPY ./lib/util /tmp/build/lib/util From a16ed644706db52635c7c686ec3f9ec55a221b13 Mon Sep 17 00:00:00 2001 From: David Helkowski Date: Thu, 13 Aug 2020 01:56:35 +0000 Subject: [PATCH 08/12] Fix mousewheel The wheel wire protocol was using an unsigned int but a signed in was being passed. That was causing huge values instead of small negatives --- lib/wire/wire.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/wire/wire.proto b/lib/wire/wire.proto index 85ffa5b3f..ceceffe6a 100644 --- a/lib/wire/wire.proto +++ b/lib/wire/wire.proto @@ -770,5 +770,5 @@ message AlertDismissMessage { } message InputWheelMessage { - required uint32 dist = 1; + required int32 dist = 1; } From 87d7a36a477731d9566dde7bd43380dbef8a4b31 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 28 Sep 2020 23:55:42 +0200 Subject: [PATCH 09/12] Bump then-jade from 2.4.3 to 2.4.4 (#115) Bumps [then-jade](https://github.com/then/then-jade) from 2.4.3 to 2.4.4. - [Release notes](https://github.com/then/then-jade/releases) - [Commits](https://github.com/then/then-jade/compare/v2.4.3...v2.4.4) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- yarn.lock | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/yarn.lock b/yarn.lock index f618e6035..f258900cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3187,6 +3187,13 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + figures@^1.3.5: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -9618,8 +9625,9 @@ text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" then-jade@^2.4.1: - version "2.4.3" - resolved "https://registry.yarnpkg.com/then-jade/-/then-jade-2.4.3.tgz#2875b792983e98e673dc076ec537831b9b559071" + version "2.4.4" + resolved "https://registry.yarnpkg.com/then-jade/-/then-jade-2.4.4.tgz#5bb0046b3818d861108287d15b9dad5dfc4e4e69" + integrity sha1-W7AEazgY2GEQgofRW52tXfxOTmk= dependencies: barrage "~1.1.0" jade "1.11.0" @@ -10803,6 +10811,14 @@ yauzl@2.4.1: dependencies: fd-slicer "~1.0.1" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yauzl@^2.7.0: version "2.8.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.8.0.tgz#79450aff22b2a9c5a41ef54e02db907ccfbf9ee2" From 582d38ff296a36cbc55541cbcc1bfbc3f3048bca Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 29 Sep 2020 01:02:09 +0200 Subject: [PATCH 10/12] Bump imports-loader from 0.6.5 to 0.8.0 (#117) Bumps [imports-loader](https://github.com/webpack-contrib/imports-loader) from 0.6.5 to 0.8.0. - [Release notes](https://github.com/webpack-contrib/imports-loader/releases) - [Changelog](https://github.com/webpack-contrib/imports-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/imports-loader/compare/v0.6.5...v0.8.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 27 ++++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 23254ce20..69e174827 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,7 @@ "gulp-util": "^3.0.7", "html-loader": "^0.5.5", "http-https": "^1.0.0", - "imports-loader": "^0.6.5", + "imports-loader": "^0.8.0", "jasmine-core": "^2.4.1", "jasmine-reporters": "^2.3.2", "json-loader": "^0.5.4", diff --git a/yarn.lock b/yarn.lock index f258900cd..c5c37fa9e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4395,12 +4395,13 @@ import-local@^2.0.0: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" -imports-loader@^0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.6.5.tgz#ae74653031d59e37b3c2fb2544ac61aeae3530a6" +imports-loader@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.8.0.tgz#030ea51b8ca05977c40a3abfd9b4088fe0be9a69" + integrity sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ== dependencies: - loader-utils "0.2.x" - source-map "0.1.x" + loader-utils "^1.0.2" + source-map "^0.6.1" imurmurhash@^0.1.4: version "0.1.4" @@ -5394,7 +5395,7 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" -loader-utils@0.2.x, loader-utils@^0.2.11, loader-utils@^0.2.15, loader-utils@^0.2.3, loader-utils@^0.2.5, loader-utils@~0.2.1, loader-utils@~0.2.2, loader-utils@~0.2.5: +loader-utils@^0.2.11, loader-utils@^0.2.15, loader-utils@^0.2.3, loader-utils@^0.2.5, loader-utils@~0.2.1, loader-utils@~0.2.2, loader-utils@~0.2.5: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" dependencies: @@ -9078,12 +9079,6 @@ source-map@0.1.32: dependencies: amdefine ">=0.0.4" -source-map@0.1.x, source-map@^0.1.41, source-map@~0.1.7: - version "0.1.43" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - dependencies: - amdefine ">=0.0.4" - source-map@0.4.x, source-map@^0.4.2, source-map@~0.4.1: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" @@ -9095,11 +9090,17 @@ source-map@0.5.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.0.tgz#0fe96503ac86a5adb5de63f4e412ae4872cdbe86" integrity sha1-D+llA6yGpa213mP05BKuSHLNvoY= +source-map@^0.1.41, source-map@~0.1.7: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.3: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" -source-map@~0.6.0, source-map@~0.6.1: +source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== From 3206e320e9bcf5e488575381ad28f71c77a3a59f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 29 Sep 2020 01:41:06 +0200 Subject: [PATCH 11/12] Bump rethinkdb from 2.3.3 to 2.4.2 (#116) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [rethinkdb](https://github.com/rethinkdb/rethinkdb) from 2.3.3 to 2.4.2. - [Release notes](https://github.com/rethinkdb/rethinkdb/releases) - [Commits](https://github.com/rethinkdb/rethinkdb/commits) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> Co-authored-by: Karol Wrótniak --- yarn.lock | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index c5c37fa9e..2c9b9a807 100644 --- a/yarn.lock +++ b/yarn.lock @@ -836,15 +836,11 @@ bluebird@3.4.x, bluebird@~3.4.1: version "2.11.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" -bluebird@^3: +bluebird@^3, bluebird@^3.3.0, bluebird@^3.3.3, bluebird@^3.4.7: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bluebird@^3.3.0, bluebird@^3.3.3, bluebird@^3.4.7: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" - bluebird@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-1.1.1.tgz#744e9980145e2ebc41a9e34826f913096667fb33" @@ -8419,8 +8415,9 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.14.tgz#58c636837b12e161f8a380cf081c6a230fd1664e" rethinkdb@^2.0.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/rethinkdb/-/rethinkdb-2.3.3.tgz#3dc6586e22fa1dabee0d254e64bd0e379fad2f72" + version "2.4.2" + resolved "https://registry.yarnpkg.com/rethinkdb/-/rethinkdb-2.4.2.tgz#9c5d8dde3300ddacfdfae0fc8ded3754602d447a" + integrity sha512-6DzwqEpFc8cqesAdo07a845oBRxLiHvWzopTKBo/uY2ypGWIsJQFJk3wjRDtSEhczxJqLS0jnf37rwgzYAw8NQ== dependencies: bluebird ">= 2.3.2 < 3" From be1552a8c0597647485aea80fea5810c607810c3 Mon Sep 17 00:00:00 2001 From: David Helkowski Date: Thu, 1 Oct 2020 18:29:51 -0700 Subject: [PATCH 12/12] Re-add .aab installation support This commit is essentially a conflict-resolved merge of https://github.com/DeviceFarmer/stf/commit/841b092d25ab3e7daf28f4c2df8d0d74f73db23d Previous upstream merge did not include this feature in order to merge more cleanly. --- Dockerfile | 13 +- lib/cli/storage-temp/index.js | 63 ++++++- lib/units/storage/temp.js | 25 ++- package.json | 1 + .../components/stf/install/install-service.js | 7 +- .../components/stf/screen/screen-directive.js | 174 ++++++++++-------- 6 files changed, 189 insertions(+), 94 deletions(-) diff --git a/Dockerfile b/Dockerfile index 617f655ed..15fc86681 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ FROM ubuntu:18.04 AS nodebase # Install base packages RUN export DEBIAN_FRONTEND=noninteractive && \ apt-get update && \ - apt-get -y --no-install-recommends install curl wget libxml-bare-perl libzmq3-dev libprotobuf-dev graphicsmagick ca-certificates + apt-get -y --no-install-recommends install curl wget libxml-bare-perl libzmq3-dev libprotobuf-dev graphicsmagick ca-certificates openjdk-8-jdk # Install node RUN export DEBIAN_FRONTEND=noninteractive && \ @@ -31,6 +31,10 @@ RUN set -x && \ npm install --loglevel http && \ curl -sf https://gobinaries.com/tj/node-prune | sh +wget --progress=dot:mega \ + https://github.com/google/bundletool/releases/download/1.2.0/bundletool-all-1.2.0.jar \ + -O /tmp/bundletool.jar + # ********* FRONTEND ********** FROM with_packages as frontend @@ -78,7 +82,7 @@ FROM nodebase as runtime EXPOSE 3000 # Setup user -RUN mkdir -p /app/res && chown stf:stf /app && chown stf:stf /app/res +RUN mkdir -p /app/res && mkdir -p /app/bundletool && chown stf:stf /app && chown stf:stf /app/* WORKDIR /app @@ -97,7 +101,10 @@ COPY --from=app --chown=stf:stf /app /app # Copy in the frontend COPY --from=frontend --chown=stf:stf /tmp/build/res/build /app/res/build - + +# Copy in bundletool +COPY --from=with_packages --chown=stf:stf /tmp/bundletool.jar /app/bundletool/bundletool.jar + COPY ./webpackserver.config.js /app/ #USER root diff --git a/lib/cli/storage-temp/index.js b/lib/cli/storage-temp/index.js index c3be46ccc..33139c536 100644 --- a/lib/cli/storage-temp/index.js +++ b/lib/cli/storage-temp/index.js @@ -25,6 +25,52 @@ module.exports.builder = function(yargs) { , type: 'string' , default: os.tmpdir() }) + .option('bundletool-path', { + describe: 'The path to bundletool binary.' + , type: 'string' + , default: '/app/bundletool/bundletool.jar' + }) + .option('ks', { + describe: 'The name of the keystore to sign APKs built from AAB.' + , type: 'string' + , default: 'openstf' + }) + .option('ks-key-alias', { + describe: 'Indicates the alias to be used in the future to refer to the keystore.' + , type: 'string' + , default: 'mykey' + }) + .option('ks-pass', { + describe: 'The password of the keystore.' + , type: 'string' + , default: 'openstf' + }) + .option('ks-key-pass', { + describe: 'The password of the private key contained in keystore.' + , type: 'string' + , default: 'openstf' + }) + .option('ks-keyalg', { + describe: 'The algorithm that is used to generate the key.' + , type: 'string' + , default: 'RSA' + }) + .option('ks-validity', { + describe: 'Number of days of keystore validity.' + , type: 'number' + , default: '90' + }) + .option('ks-keysize', { + describe: 'Key size of the keystore.' + , type: 'number' + , default: '2048' + }) + .option('ks-dname', { + describe: 'Keystore Distinguished Name, contain Common Name(CN), ' + + 'Organizational Unit (OU), Oranization(O), Locality (L), State (S) and Country (C).' + , type: 'string' + , default: 'CN=openstf.io, OU=openstf, O=openstf, L=PaloAlto, S=California, C=US' + }) .epilog('Each option can be be overwritten with an environment variable ' + 'by converting the option to uppercase, replacing dashes with ' + 'underscores and prefixing it with `STF_STORAGE_TEMP_` (e.g. ' + @@ -33,8 +79,19 @@ module.exports.builder = function(yargs) { module.exports.handler = function(argv) { return require('../../units/storage/temp')({ - port: argv.port - , saveDir: argv.saveDir - , maxFileSize: argv.maxFileSize + port: argv.port, + saveDir: argv.saveDir, + maxFileSize: argv.maxFileSize, + bundletoolPath: argv.bundletoolPath, + keystore: { + ksPath: `/tmp/${argv.ks}.keystore`, + ksKeyAlias: argv.ksKeyAlias, + ksPass: argv.ksPass, + ksKeyPass: argv.ksKeyPass, + ksKeyalg: argv.ksKeyalg, + ksValidity: argv.ksValidity, + ksKeysize: argv.ksKeysize, + ksDname: argv.ksDname + } }) } diff --git a/lib/units/storage/temp.js b/lib/units/storage/temp.js index ce1cb1f0b..aafdc0e2b 100644 --- a/lib/units/storage/temp.js +++ b/lib/units/storage/temp.js @@ -13,6 +13,7 @@ var logger = require('../../util/logger') var Storage = require('../../util/storage') var requtil = require('../../util/requtil') var download = require('../../util/download') +var bundletool = require('../../util/bundletool') module.exports = function(options) { var log = logger.createLogger('storage:temp') @@ -96,6 +97,9 @@ module.exports = function(options) { form.uploadDir = options.saveDir } form.on('fileBegin', function(name, file) { + if (/\.aab$/.test(file.name)) { + file.isAab = true + } var md5 = crypto.createHash('md5') var extension = get_file_extension(file.name) file.name = md5.update(file.name).digest('hex') + '.' + extension @@ -107,12 +111,27 @@ module.exports = function(options) { var file = files[field] log.info('Uploaded "%s" to "%s"', file.name, file.path) return { - field: field - , id: storage.store(file) - , name: file.name + field: field, + id: storage.store(file), + name: file.name, + path: file.path, + isAab: ( file.isAab || false ) } }) }) + .then(function(storedFiles) { + return Promise.all( + storedFiles.map( + function(file) { + return bundletool( { + bundletoolPath: options.bundletoolPath, + keystore: options.keystore, + file: file + } ) + } + ) + ) + }) .then(function(storedFiles) { res.status(201) .json({ diff --git a/package.json b/package.json index 7cb57b6ac..4959f1b75 100644 --- a/package.json +++ b/package.json @@ -109,6 +109,7 @@ "uuid": "^3.0.0", "ws": "^3.0.0", "yargs": "^6.6.0", + "yauzl": "^2.10.0", "zmq": "^2.14.0" }, "devDependencies": { diff --git a/res/app/components/stf/install/install-service.js b/res/app/components/stf/install/install-service.js index 800f2156d..bee0d87d5 100644 --- a/res/app/components/stf/install/install-service.js +++ b/res/app/components/stf/install/install-service.js @@ -92,12 +92,7 @@ module.exports = function InstallService( $rootScope.$broadcast('installation', installation) return StorageService.storeFile('apk', $files, { filter: function(file) { - if(file.name.indexOf('.apk')!=-1){ - return /\.apk$/i.test(file.name) - } - else { - return /\.ipa$/i.test(file.name) - } + return /\.(apk|aab|ipa)$/i.test(file.name) } }) .progressed(function(e) { diff --git a/res/app/components/stf/screen/screen-directive.js b/res/app/components/stf/screen/screen-directive.js index 8f0f76546..cfe12cefa 100644 --- a/res/app/components/stf/screen/screen-directive.js +++ b/res/app/components/stf/screen/screen-directive.js @@ -3,21 +3,21 @@ var rotator = require('./rotator') var ImagePool = require('./imagepool') module.exports = function DeviceScreenDirective( - $document -, ScalingService -, VendorUtil -, PageVisibilityService -, $timeout -, $window + $document, + ScalingService, + VendorUtil, + PageVisibilityService, + $timeout, + $window ) { return { - restrict: 'E' - , template: require('./screen.pug') - , scope: { - control: '&' - , device: '&' - } - , link: function(scope, element) { + restrict: 'E', + template: require('./screen.pug'), + scope: { + control: '&', + device: '&' + }, + link: function(scope, element) { var URL = window.URL || window.webkitURL var BLANK_IMG = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==' @@ -29,19 +29,11 @@ module.exports = function DeviceScreenDirective( var input = element.find('input') var screen = scope.screen = { - rotation: 0 - , bounds: { - x: 0 - , y: 0 - , w: 0 - , h: 0 - } + rotation: 0, + bounds: { x: 0, y: 0, w: 0, h: 0 } } - - var scaler = ScalingService.coordinator( - device.display.width - , device.display.height - ) + + var scaler = ScalingService.coordinator( device.display.width, device.display.height ) /** * SCREEN HANDLING @@ -90,9 +82,9 @@ module.exports = function DeviceScreenDirective( var frontBackRatio = devicePixelRatio / backingStoreRatio var options = { - autoScaleForRetina: true - , density: Math.max(1, Math.min(1.5, devicePixelRatio || 1)) - , minscale: 0.36 + autoScaleForRetina: true, + density: Math.max(1, Math.min(1.5, devicePixelRatio || 1)), + minscale: 0.36 } var adjustedBoundSize @@ -114,10 +106,7 @@ module.exports = function DeviceScreenDirective( sh *= f / sh } - return { - w: Math.ceil(sw) - , h: Math.ceil(sh) - } + return { w: Math.ceil(sw), h: Math.ceil(sh) } } // FIXME: element is an object HTMLUnknownElement in IE9 @@ -205,13 +194,8 @@ module.exports = function DeviceScreenDirective( ws.onmessage = (function() { var cachedScreen = { - rotation: 0 - , bounds: { - x: 0 - , y: 0 - , w: 0 - , h: 0 - } + rotation: 0, + bounds: { x: 0, y: 0, w: 0, h: 0 } } var cachedImageWidth = 0 @@ -222,7 +206,9 @@ module.exports = function DeviceScreenDirective( function applyQuirks(banner) { element[0].classList.toggle( - 'quirk-always-upright', alwaysUpright = banner.quirks.alwaysUpright) + 'quirk-always-upright', + alwaysUpright = banner.quirks.alwaysUpright + ) } function hasImageAreaChanged(img) { @@ -411,16 +397,16 @@ module.exports = function DeviceScreenDirective( // Chrome/Safari/Opera if ( // Mac | Kinesis keyboard | Karabiner | Latin key, Kana key - e.keyCode === 0 && e.keyIdentifier === 'U+0010' || + e.keyCode === 0 && e.keyIdentifier === 'U+0010' || // Mac | MacBook Pro keyboard | Latin key, Kana key - e.keyCode === 0 && e.keyIdentifier === 'U+0020' || + e.keyCode === 0 && e.keyIdentifier === 'U+0020' || // Win | Lenovo X230 keyboard | Alt+Latin key - e.keyCode === 246 && e.keyIdentifier === 'U+00F6' || + e.keyCode === 246 && e.keyIdentifier === 'U+00F6' || // Win | Lenovo X230 keyboard | Convert key - e.keyCode === 28 && e.keyIdentifier === 'U+001C' + e.keyCode === 28 && e.keyIdentifier === 'U+001C' ) { return true } @@ -598,20 +584,28 @@ module.exports = function DeviceScreenDirective( var x = e.pageX - screen.bounds.x var y = e.pageY - screen.bounds.y - var pressure = 0.5 + + var pressure = 0.5; + if( e.shiftKey ) pressure = 1; + var scaled = scaler.coords( - screen.bounds.w - , screen.bounds.h - , x - , y - , screen.rotation - ) + screen.bounds.w, + screen.bounds.h, + x, + y, + screen.rotation + ) control.touchDown(nextSeq(), 0, scaled.xP, scaled.yP, pressure) if (fakePinch) { - control.touchDown(nextSeq(), 1, 1 - scaled.xP, 1 - scaled.yP, - pressure) + control.touchDown( + nextSeq(), + 1, + 1 - scaled.xP, + 1 - scaled.yP, + pressure + ) } control.touchCommit(nextSeq()) @@ -619,16 +613,22 @@ module.exports = function DeviceScreenDirective( activateFinger(0, x, y, pressure) if (fakePinch) { - activateFinger(1, -e.pageX + screen.bounds.x + screen.bounds.w, - -e.pageY + screen.bounds.y + screen.bounds.h, pressure) + activateFinger( + 1, + -e.pageX + screen.bounds.x + screen.bounds.w, + -e.pageY + screen.bounds.y + screen.bounds.h, + pressure + ) } element.bind('mousemove', mouseMoveListener) $document.bind('mouseup', mouseUpListener) $document.bind('mouseleave', mouseUpListener) - if (lastPossiblyBuggyMouseUpEvent && - lastPossiblyBuggyMouseUpEvent.timeStamp > e.timeStamp) { + if ( + lastPossiblyBuggyMouseUpEvent && + lastPossiblyBuggyMouseUpEvent.timeStamp > e.timeStamp + ) { // We got mouseup before mousedown. See mouseUpBugWorkaroundListener // for details. mouseUpListener(lastPossiblyBuggyMouseUpEvent) @@ -659,23 +659,35 @@ module.exports = function DeviceScreenDirective( var y = e.pageY - screen.bounds.y var pressure = 0.5 var scaled = scaler.coords( - screen.bounds.w - , screen.bounds.h - , x - , y - , screen.rotation - ) + screen.bounds.w, + screen.bounds.h, + x, + y, + screen.rotation + ) control.touchMove(nextSeq(), 0, scaled.xP, scaled.yP, pressure) if (addGhostFinger) { - control.touchDown(nextSeq(), 1, 1 - scaled.xP, 1 - scaled.yP, pressure) + control.touchDown( + nextSeq(), + 1, + 1 - scaled.xP, + 1 - scaled.yP, + pressure + ) } else if (deleteGhostFinger) { control.touchUp(nextSeq(), 1) } else if (fakePinch) { - control.touchMove(nextSeq(), 1, 1 - scaled.xP, 1 - scaled.yP, pressure) + control.touchMove( + nextSeq(), + 1, + 1 - scaled.xP, + 1 - scaled.yP, + pressure + ) } control.touchCommit(nextSeq()) @@ -686,8 +698,12 @@ module.exports = function DeviceScreenDirective( deactivateFinger(1) } else if (fakePinch) { - activateFinger(1, -e.pageX + screen.bounds.x + screen.bounds.w, - -e.pageY + screen.bounds.y + screen.bounds.h, pressure) + activateFinger( + 1, + -e.pageX + screen.bounds.x + screen.bounds.w, + -e.pageY + screen.bounds.y + screen.bounds.h, + pressure + ) } } @@ -839,12 +855,12 @@ module.exports = function DeviceScreenDirective( var y = touch.pageY - screen.bounds.y var pressure = touch.force || 0.5 var scaled = scaler.coords( - screen.bounds.w - , screen.bounds.h - , x - , y - , screen.rotation - ) + screen.bounds.w, + screen.bounds.h, + x, + y, + screen.rotation + ) slotted[touch.identifier] = slot control.touchDown(nextSeq(), slot, scaled.xP, scaled.yP, pressure) @@ -873,12 +889,12 @@ module.exports = function DeviceScreenDirective( var y = touch.pageY - screen.bounds.y var pressure = touch.force || 0.5 var scaled = scaler.coords( - screen.bounds.w - , screen.bounds.h - , x - , y - , screen.rotation - ) + screen.bounds.w, + screen.bounds.h, + x, + y, + screen.rotation + ) control.touchMove(nextSeq(), slot, scaled.xP, scaled.yP, pressure) activateFinger(slot, x, y, pressure)