From e4a826592f2dd749a138e844f759f990d003350d Mon Sep 17 00:00:00 2001 From: willyb321 Date: Fri, 27 Sep 2019 07:15:13 +1000 Subject: [PATCH 01/66] remove ads, trial didnt work --- src/index.ejs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/index.ejs b/src/index.ejs index 72d966b1..bf87243c 100644 --- a/src/index.ejs +++ b/src/index.ejs @@ -2,13 +2,6 @@ Coriolis EDCD Edition - - From 67409a613bf535b7862f57c214a2f32b7dedf961 Mon Sep 17 00:00:00 2001 From: willyb321 Date: Fri, 27 Sep 2019 07:45:03 +1000 Subject: [PATCH 02/66] add migrate page, need to make it redirect still --- src/migrate.html | 98 ++++++++++++++++++++++++++++++++++++++++++ webpack.config.dev.js | 5 +++ webpack.config.prod.js | 4 ++ 3 files changed, 107 insertions(+) create mode 100644 src/migrate.html diff --git a/src/migrate.html b/src/migrate.html new file mode 100644 index 00000000..7a847b74 --- /dev/null +++ b/src/migrate.html @@ -0,0 +1,98 @@ + + + + Coriolis EDCD Edition + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + diff --git a/webpack.config.dev.js b/webpack.config.dev.js index 44b8a02b..bd09fa55 100644 --- a/webpack.config.dev.js +++ b/webpack.config.dev.js @@ -42,6 +42,11 @@ module.exports = { date: buildDate, gapiKey: process.env.CORIOLIS_GAPI_KEY || '' }), + new HtmlWebpackPlugin({ + inject: false, + template: path.join(__dirname, 'src/migrate.html'), + filename: 'migrate.html' + }), new ExtractTextPlugin({ filename: 'app.css', disable: false, diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 97b3b85c..27a777f0 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -45,6 +45,10 @@ module.exports = { date: buildDate, version: pkgJson.version }), + new HtmlWebpackPlugin({ + inject: true, + template: path.join(__dirname, 'src/migrate.html') + }), new ExtractTextPlugin({ filename: '[hash:6].css', disable: false, From 1b8c460876767a0b374dd65d0693a1265fac1b1f Mon Sep 17 00:00:00 2001 From: willyb321 Date: Sun, 13 Oct 2019 07:16:19 +1100 Subject: [PATCH 03/66] orbis fixes --- src/app/Coriolis.jsx | 6 +++--- src/app/components/Header.jsx | 5 ++++- src/app/pages/OutfittingPage.jsx | 9 ++++----- src/app/utils/ShortenUrl.js | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/app/Coriolis.jsx b/src/app/Coriolis.jsx index 8b544b1f..79ec5838 100644 --- a/src/app/Coriolis.jsx +++ b/src/app/Coriolis.jsx @@ -113,9 +113,9 @@ export default class Coriolis extends React.Component { async _getAnnouncements() { try { - const announces = await request.get('https://orbis.zone/api/announcement') - .query({ showInCoriolis: true }); - this.setState({ announcements: announces.body }); + const announces = await request.get('https://api.orbis.zone/announcements') + .query({ coriolis: true }); + this.setState({ announcements: announces }); } catch (err) { console.error(err) } diff --git a/src/app/components/Header.jsx b/src/app/components/Header.jsx index 37456526..6c56e504 100644 --- a/src/app/components/Header.jsx +++ b/src/app/components/Header.jsx @@ -426,7 +426,10 @@ export default class Header extends TranslatedComponent { if (this.props.announcements) { announcements = []; for (let announce of this.props.announcements) { - announcements.push(); + if (announce.expiry < Date.now()) { + continue; + } + announcements.push(); announcements.push(
); } } diff --git a/src/app/pages/OutfittingPage.jsx b/src/app/pages/OutfittingPage.jsx index 94c786b3..3b709258 100644 --- a/src/app/pages/OutfittingPage.jsx +++ b/src/app/pages/OutfittingPage.jsx @@ -686,13 +686,12 @@ export default class OutfittingPage extends Page { _genOrbis() { const data = {}; const ship = this.state.ship; - ship.coriolisId = ship.id; - data.coriolisShip = ship; - data.url = window.location.href; data.title = this.state.buildName || ship.id; data.description = this.state.buildName || ship.id; - data.ShipName = ship.id; - data.Ship = ship.id; + data.body = ship; + data.url = `https://coriolis.io${outfitURL(ship.id, ship.toString(), data.title)}`; + ship.type = ship.id; + console.log(data); this.context.showModal(); } diff --git a/src/app/utils/ShortenUrl.js b/src/app/utils/ShortenUrl.js index 2846db50..1097f3d1 100644 --- a/src/app/utils/ShortenUrl.js +++ b/src/app/utils/ShortenUrl.js @@ -105,7 +105,7 @@ function orbisShorten(url, success, error) { } } -const API_ORBIS = 'https://orbis.zone/api/builds/add'; +const API_ORBIS = 'https://api.orbis.zone/ships'; /** * Upload to Orbis * @param {object} ship The URL to shorten From c3b0e8d949b82e91a53fe4a7aaae23338ce9620b Mon Sep 17 00:00:00 2001 From: willyb321 Date: Sun, 13 Oct 2019 07:39:05 +1100 Subject: [PATCH 04/66] fix announcements --- src/app/Coriolis.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/Coriolis.jsx b/src/app/Coriolis.jsx index 79ec5838..52f2cc08 100644 --- a/src/app/Coriolis.jsx +++ b/src/app/Coriolis.jsx @@ -115,7 +115,7 @@ export default class Coriolis extends React.Component { try { const announces = await request.get('https://api.orbis.zone/announcements') .query({ coriolis: true }); - this.setState({ announcements: announces }); + this.setState({ announcements: announces.body }); } catch (err) { console.error(err) } @@ -394,13 +394,13 @@ export default class Coriolis extends React.Component { */ render() { let currentMenu = this.state.currentMenu; - + console.log(this.state) return
{this.state.announcements.map(a => )}
+ text={a.text}/>)}
{this.state.error ? this.state.error : this.state.page ? React.createElement(this.state.page, { currentMenu }) : } {this.state.modal} From fc5db94f9aaf3cce90ab3ab751dc7b7677f45650 Mon Sep 17 00:00:00 2001 From: VAKazakov <47143965+VAKazakov@users.noreply.github.com> Date: Mon, 4 Nov 2019 13:28:30 +0300 Subject: [PATCH 05/66] Localisation fixes Changed ru localisation for params "ammo" and "clip" to in-game variants https://media.discordapp.net/attachments/301454399597969409/640856772952850462/001.PNG --- src/app/i18n/ru.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/i18n/ru.json b/src/app/i18n/ru.json index b3edcff0..34850dfe 100644 --- a/src/app/i18n/ru.json +++ b/src/app/i18n/ru.json @@ -165,12 +165,12 @@ "external protection": "Внешняя защита", "engagement range": "Боевое расстояние", "total": "Всего", - "ammo": "Боекомплект", + "ammo": "Макс. боекомплект", "boot": "Время загрузки", "brokenregen": "Скорость восстановления при пробое", "burst": "Длина очереди", "burstrof": "Скорострельность очереди", - "clip": "Боекомплект", + "clip": "Размер боекомплекта", "damage": "Урон", "distdraw": "Тяга распределителя", "duration": "Продолжительность", From baace95f834f1c7bceb0d86aeaef14328aac903b Mon Sep 17 00:00:00 2001 From: Thomas Hurst Date: Sat, 30 Nov 2019 01:19:00 +0000 Subject: [PATCH 06/66] Shield engineering should not modify max mass (#473) --- src/app/shipyard/Module.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shipyard/Module.js b/src/app/shipyard/Module.js index 22466f93..fc702603 100755 --- a/src/app/shipyard/Module.js +++ b/src/app/shipyard/Module.js @@ -694,7 +694,7 @@ export default class Module { let result = 0; if (this['maxmass']) { result = this['maxmass']; - if (result && modified) { + if (result && modified && !ModuleUtils.isShieldGenerator(this['grp'])) { let mult = this.getModValue('optmass') / 10000; if (mult) { result = result * (1 + mult); } } From 9ebe5dc786b483c32a13efa58c6bc4022b1a36f0 Mon Sep 17 00:00:00 2001 From: William Date: Wed, 15 Jan 2020 08:08:38 +1100 Subject: [PATCH 07/66] update paypal donation --- src/app/pages/AboutPage.jsx | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/src/app/pages/AboutPage.jsx b/src/app/pages/AboutPage.jsx index 9b0977f2..2040036f 100644 --- a/src/app/pages/AboutPage.jsx +++ b/src/app/pages/AboutPage.jsx @@ -105,28 +105,7 @@ export default class AboutPage extends Page { , which will be used to keep Coriolis up to date and the servers running.

-
- - - - -
+ ); } From a77d991cf9259949368e048febe8659eb1c897e4 Mon Sep 17 00:00:00 2001 From: William Date: Thu, 23 Jan 2020 07:28:59 +1100 Subject: [PATCH 08/66] Update Dockerfile --- Dockerfile | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index b95ca63a..fc2aeacf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,12 @@ ### STAGE 1: Build ### FROM node:9.11.1-alpine as builder -ARG branch=develop -ENV BRANCH=$branch +ENV BRANCH=master WORKDIR /src/app RUN mkdir -p /src/app/coriolis RUN mkdir -p /src/app/coriolis-data RUN apk add --update git -COPY . /src/app/coriolis - RUN npm i -g npm # Set up coriolis-data @@ -21,6 +18,7 @@ RUN npm start # Set up coriolis WORKDIR /src/app/coriolis +RUN git clone https://github.com/EDCD/coriolis.git . RUN git checkout ${BRANCH} RUN npm install --no-package-lock RUN npm run build From a3feb42fd777e15ed56b7a44dab2d3909d56d679 Mon Sep 17 00:00:00 2001 From: William Date: Thu, 23 Jan 2020 07:29:20 +1100 Subject: [PATCH 09/66] Create Dockerfile.dev --- Dockerfile.dev | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 Dockerfile.dev diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 00000000..c8562528 --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,33 @@ +### STAGE 1: Build ### +FROM node:9.11.1-alpine as builder +ENV BRANCH=develop +WORKDIR /src/app +RUN mkdir -p /src/app/coriolis +RUN mkdir -p /src/app/coriolis-data + +RUN apk add --update git + +RUN npm i -g npm + +# Set up coriolis-data +WORKDIR /src/app/coriolis-data +RUN git clone https://github.com/EDCD/coriolis-data.git . +RUN git checkout ${BRANCH} +RUN npm install --no-package-lock +RUN npm start + +# Set up coriolis +WORKDIR /src/app/coriolis +RUN git clone https://github.com/EDCD/coriolis.git . +RUN git checkout ${BRANCH} +RUN npm install --no-package-lock +RUN npm run build + + +### STAGE 2: Production Environment ### +FROM fholzer/nginx-brotli as web +COPY nginx.conf /etc/nginx/nginx.conf +COPY --from=builder /src/app/coriolis/build /usr/share/nginx/html +WORKDIR /usr/share/nginx/html +EXPOSE 80 +CMD ["nginx", "-c", "/etc/nginx/nginx.conf", "-g", "daemon off;"] From 3a63e08f80cfd2706bb8fbf4ff52ac144e84efe5 Mon Sep 17 00:00:00 2001 From: William Date: Thu, 23 Jan 2020 07:29:42 +1100 Subject: [PATCH 10/66] Update docker-compose.yml --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 7496605d..5ca32b79 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,7 +22,7 @@ services: coriolis_dev: image: edcd/coriolis:develop build: - dockerfile: Dockerfile + dockerfile: Dockerfile.dev args: branch: develop restart: always From b3f320e69f8f3990fe0b8513cd424a34af19d2bc Mon Sep 17 00:00:00 2001 From: William Date: Thu, 23 Jan 2020 07:32:16 +1100 Subject: [PATCH 11/66] Update docker-compose.yml --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5ca32b79..fd052122 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: '2.2' +version: '2' services: coriolis_prod: From 304ddf9ea8163713c62d385f19642b4071e7297d Mon Sep 17 00:00:00 2001 From: William Date: Thu, 23 Jan 2020 07:33:23 +1100 Subject: [PATCH 12/66] Update docker-compose.yml --- docker-compose.yml | 46 +++++++++++++++++----------------------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index fd052122..8a60cb6a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,55 +1,43 @@ version: '2' services: - coriolis_prod: + master: image: edcd/coriolis:master build: dockerfile: Dockerfile + context: . args: branch: master restart: always volumes: - - ./nginx.conf:/etc/nginx/nginx.conf + - ./nginx.conf:/etc/nginx/nginx.conf networks: - - web + - web labels: - - "traefik.docker.network=web" - - "traefik.enable=true" - - "traefik.basic.frontend.rule=Host:coriolis.io,coriolis.edcd.io" - - "traefik.basic.port=80" - - "traefik.basic.protocol=http" + - "traefik.docker.network=web" + - "traefik.enable=true" + - "traefik.basic.frontend.rule=Host:coriolis.io,coriolis.edcd.io" + - "traefik.basic.port=80" + - "traefik.basic.protocol=http" - coriolis_dev: + develop: image: edcd/coriolis:develop build: dockerfile: Dockerfile.dev + context: . args: branch: develop restart: always volumes: - ./nginx.conf:/etc/nginx/nginx.conf networks: - - web + - web labels: - - "traefik.docker.network=web" - - "traefik.enable=true" - - "traefik.basic.frontend.rule=Host:beta.coriolis.io,beta.coriolis.edcd.io" - - "traefik.basic.port=80" - - "traefik.basic.protocol=http" - - coriolis_dw2: - image: edcd/coriolis:dw2 - restart: always - volumes: - - ./nginx.conf:/etc/nginx/nginx.conf - networks: - - web - labels: - - "traefik.docker.network=web" - - "traefik.enable=true" - - "traefik.basic.frontend.rule=Host:dw2.coriolis.io" - - "traefik.basic.port=80" - - "traefik.basic.protocol=http" + - "traefik.docker.network=web" + - "traefik.enable=true" + - "traefik.basic.frontend.rule=Host:beta.coriolis.io,beta.coriolis.edcd.io" + - "traefik.basic.port=80" + - "traefik.basic.protocol=http" networks: web: From ab671b0af54bd7155977ecd8d13154dea1ae89ff Mon Sep 17 00:00:00 2001 From: William Date: Thu, 23 Jan 2020 07:33:53 +1100 Subject: [PATCH 13/66] Update docker-compose.yml --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 8a60cb6a..4fbaee70 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: '2' +version: '3.6' services: master: From 14bb49a2bc8cd7f8a1bf8dcfef77a1a1d215eee0 Mon Sep 17 00:00:00 2001 From: William Date: Sun, 1 Mar 2020 10:27:39 +1100 Subject: [PATCH 14/66] Update index.ejs --- src/index.ejs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ejs b/src/index.ejs index bf87243c..6fb49e96 100644 --- a/src/index.ejs +++ b/src/index.ejs @@ -3,6 +3,7 @@ Coriolis EDCD Edition +
- + + + + From 25d4520eee407e0243a02b67fee980d09855c0e2 Mon Sep 17 00:00:00 2001 From: William Date: Sun, 1 Mar 2020 19:13:13 +1100 Subject: [PATCH 16/66] Update index.ejs --- src/index.ejs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/index.ejs b/src/index.ejs index ff3ca8b8..65d034d3 100644 --- a/src/index.ejs +++ b/src/index.ejs @@ -53,8 +53,8 @@ -
- + + (adsbygoogle = window.adsbygoogle || []).push({}); +
From d322a475925f2554535b4c6889e4db0f5e288120 Mon Sep 17 00:00:00 2001 From: willyb321 Date: Thu, 12 Mar 2020 05:30:37 +1100 Subject: [PATCH 17/66] fix --- src/app/pages/AboutPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/pages/AboutPage.jsx b/src/app/pages/AboutPage.jsx index 2040036f..3d2e8f86 100644 --- a/src/app/pages/AboutPage.jsx +++ b/src/app/pages/AboutPage.jsx @@ -105,7 +105,7 @@ export default class AboutPage extends Page { , which will be used to keep Coriolis up to date and the servers running.

- + ); } From ebf44919013211e069eed3fd812f132e83a68ce9 Mon Sep 17 00:00:00 2001 From: willyb321 Date: Thu, 12 Mar 2020 05:57:47 +1100 Subject: [PATCH 18/66] test --- src/app/Router.js | 7 +++++++ src/index.ejs | 15 +-------------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/app/Router.js b/src/app/Router.js index 1bac3386..143475a4 100644 --- a/src/app/Router.js +++ b/src/app/Router.js @@ -72,6 +72,7 @@ Router.go = function(path, state) { gaTrack(path); let ctx = new Context(path, state); Router.dispatch(ctx); + if (!ctx.unhandled) { if (isStandAlone()) { Persist.setState(ctx); @@ -87,6 +88,12 @@ Router.go = function(path, state) { location.reload(); } } + try { + (window.adsbygoogle = window.adsbygoogle || []).push({ + google_ad_client: "ca-pub-3709458261881414", + enable_page_level_ads: true + }); + } catch (error) {} return ctx; }; diff --git a/src/index.ejs b/src/index.ejs index 65d034d3..b71c5905 100644 --- a/src/index.ejs +++ b/src/index.ejs @@ -3,7 +3,6 @@ Coriolis EDCD Edition - - + - - - - -
From 1f9b1e5d27ffb7d371020f5b2f3d2dcde0f4b8a3 Mon Sep 17 00:00:00 2001 From: willyb321 Date: Thu, 12 Mar 2020 06:01:11 +1100 Subject: [PATCH 19/66] invalidate docker cache for git pull --- Dockerfile | 3 +++ Dockerfile.dev | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Dockerfile b/Dockerfile index fc2aeacf..fb4d3284 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,6 +8,7 @@ RUN mkdir -p /src/app/coriolis-data RUN apk add --update git RUN npm i -g npm +ADD https://api.github.com/repos/edcd/coriolis-data/git/refs/heads/master /tmp/version.json # Set up coriolis-data WORKDIR /src/app/coriolis-data @@ -16,6 +17,8 @@ RUN git checkout ${BRANCH} RUN npm install --no-package-lock RUN npm start + +ADD https://api.github.com/repos/edcd/coriolis/git/refs/heads/master /tmp/version.json # Set up coriolis WORKDIR /src/app/coriolis RUN git clone https://github.com/EDCD/coriolis.git . diff --git a/Dockerfile.dev b/Dockerfile.dev index c8562528..9934de70 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -9,6 +9,7 @@ RUN apk add --update git RUN npm i -g npm +ADD https://api.github.com/repos/edcd/coriolis-data/git/refs/heads/develop /tmp/version.json # Set up coriolis-data WORKDIR /src/app/coriolis-data RUN git clone https://github.com/EDCD/coriolis-data.git . @@ -16,6 +17,8 @@ RUN git checkout ${BRANCH} RUN npm install --no-package-lock RUN npm start + +ADD https://api.github.com/repos/edcd/coriolis/git/refs/heads/develop /tmp/version.json # Set up coriolis WORKDIR /src/app/coriolis RUN git clone https://github.com/EDCD/coriolis.git . From 7f5c652f491469a4ff1797ecf47f9b37d76fc59e Mon Sep 17 00:00:00 2001 From: willyb321 Date: Thu, 12 Mar 2020 06:33:27 +1100 Subject: [PATCH 20/66] test --- src/app/Coriolis.jsx | 5 +++-- src/app/Router.js | 6 ------ src/app/pages/Page.jsx | 8 ++++++++ src/index.ejs | 9 +++++++-- src/migrate.html | 6 ++++++ 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/app/Coriolis.jsx b/src/app/Coriolis.jsx index 52f2cc08..b0d7cb1d 100644 --- a/src/app/Coriolis.jsx +++ b/src/app/Coriolis.jsx @@ -22,6 +22,7 @@ import ComparisonPage from './pages/ComparisonPage'; import ShipyardPage from './pages/ShipyardPage'; import ErrorDetails from './pages/ErrorDetails'; + const zlib = require('pako'); const request = require('superagent'); @@ -72,7 +73,7 @@ export default class Coriolis extends React.Component { route: {}, sizeRatio: Persist.getSizeRatio() }; - this._getAnnouncements(); + // this._getAnnouncements(); Router('', (r) => this._setPage(ShipyardPage, r)); Router('/import?', (r) => this._importBuild(r)); Router('/import/:data', (r) => this._importBuild(r)); @@ -394,7 +395,6 @@ export default class Coriolis extends React.Component { */ render() { let currentMenu = this.state.currentMenu; - console.log(this.state) return
+
{window.CORIOLIS_VERSION} - {window.CORIOLIS_DATE} diff --git a/src/app/Router.js b/src/app/Router.js index 143475a4..b9881f60 100644 --- a/src/app/Router.js +++ b/src/app/Router.js @@ -88,12 +88,6 @@ Router.go = function(path, state) { location.reload(); } } - try { - (window.adsbygoogle = window.adsbygoogle || []).push({ - google_ad_client: "ca-pub-3709458261881414", - enable_page_level_ads: true - }); - } catch (error) {} return ctx; }; diff --git a/src/app/pages/Page.jsx b/src/app/pages/Page.jsx index 76c86c5f..bcb4eaad 100644 --- a/src/app/pages/Page.jsx +++ b/src/app/pages/Page.jsx @@ -62,6 +62,14 @@ export default class Page extends React.Component { */ componentDidMount() { document.title = this.state.title || 'Coriolis'; + try { + (window.adsbygoogle = window.adsbygoogle || []).push({ + google_ad_client: "ca-pub-3709458261881414", + enable_page_level_ads: true + }); + } catch (error) { + + } } /** diff --git a/src/index.ejs b/src/index.ejs index b71c5905..def4272e 100644 --- a/src/index.ejs +++ b/src/index.ejs @@ -8,6 +8,9 @@ + + + @@ -25,7 +28,7 @@ - + -
+
+ +
diff --git a/src/migrate.html b/src/migrate.html index 7a847b74..0c867137 100644 --- a/src/migrate.html +++ b/src/migrate.html @@ -24,6 +24,12 @@ type="image/png" href="/192x192.png" /> + + + From 38f72438dde5ecf33f0024e4006251a8232fb070 Mon Sep 17 00:00:00 2001 From: William Date: Wed, 25 Mar 2020 15:13:18 +1100 Subject: [PATCH 21/66] Update index.ejs --- src/index.ejs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/index.ejs b/src/index.ejs index def4272e..af1f263e 100644 --- a/src/index.ejs +++ b/src/index.ejs @@ -8,8 +8,7 @@ - - + From 3966f9245469c143ac6af931db85a377dde592bc Mon Sep 17 00:00:00 2001 From: willyb321 Date: Sun, 5 Apr 2020 05:22:35 +1000 Subject: [PATCH 22/66] fix webpack config --- webpack.config.dev.js | 5 ----- webpack.config.prod.js | 4 ---- 2 files changed, 9 deletions(-) diff --git a/webpack.config.dev.js b/webpack.config.dev.js index bd09fa55..44b8a02b 100644 --- a/webpack.config.dev.js +++ b/webpack.config.dev.js @@ -42,11 +42,6 @@ module.exports = { date: buildDate, gapiKey: process.env.CORIOLIS_GAPI_KEY || '' }), - new HtmlWebpackPlugin({ - inject: false, - template: path.join(__dirname, 'src/migrate.html'), - filename: 'migrate.html' - }), new ExtractTextPlugin({ filename: 'app.css', disable: false, diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 27a777f0..97b3b85c 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -45,10 +45,6 @@ module.exports = { date: buildDate, version: pkgJson.version }), - new HtmlWebpackPlugin({ - inject: true, - template: path.join(__dirname, 'src/migrate.html') - }), new ExtractTextPlugin({ filename: '[hash:6].css', disable: false, From 13ec0277729856080771ff9721ec20961f5ef4d4 Mon Sep 17 00:00:00 2001 From: Thomas Hurst Date: Tue, 10 Dec 2019 00:48:42 +0000 Subject: [PATCH 23/66] Calculate jump range with a full reserve fuel tank (#560) --- src/app/shipyard/Calculations.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/shipyard/Calculations.js b/src/app/shipyard/Calculations.js index 83718991..f979ff35 100644 --- a/src/app/shipyard/Calculations.js +++ b/src/app/shipyard/Calculations.js @@ -14,6 +14,7 @@ export function jumpRange(mass, fsd, fuel, ship) { const fsdOptimalMass = fsd instanceof Module ? fsd.getOptMass() : fsd.optmass; let jumpAddition = 0; if (ship) { + mass += ship.reserveFuelCapacity || 0; for (const module of ship.internal) { if (module && module.m && module.m.grp === 'gfsb' && ship.getSlotStatus(module) == 3) { jumpAddition += module.m.getJumpBoost(); From 34f9f28c16ce46ee96689a8018dd51d4ff36ee41 Mon Sep 17 00:00:00 2001 From: Matthew Turney Date: Sun, 14 Jun 2020 10:33:00 -0500 Subject: [PATCH 24/66] Import tests fail due to Jest API change with mock functions --- __tests__/test-import.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/__tests__/test-import.js b/__tests__/test-import.js index 2bcd2c22..d0915f6c 100644 --- a/__tests__/test-import.js +++ b/__tests__/test-import.js @@ -18,13 +18,13 @@ describe('Import Modal', function() { const mockContext = { language: getLanguage('en'), sizeRatio: 1, - openMenu: jest.genMockFunction(), - closeMenu: jest.genMockFunction(), - showModal: jest.genMockFunction(), - hideModal: jest.genMockFunction(), - tooltip: jest.genMockFunction(), - termtip: jest.genMockFunction(), - onWindowResize: jest.genMockFunction() + openMenu: jest.fn(), + closeMenu: jest.fn(), + showModal: jest.fn(), + hideModal: jest.fn(), + tooltip: jest.fn(), + termtip: jest.fn(), + onWindowResize: jest.fn() }; let modal, render, ContextProvider = Utils.createContextProvider(mockContext); From 7de304bdbed32763be0c8b5934dd119dbc44489a Mon Sep 17 00:00:00 2001 From: Matthew Turney Date: Sun, 14 Jun 2020 12:27:45 -0500 Subject: [PATCH 25/66] Tests for ImportModal are failing All of the compressed data in the Persisted storage has subtly changed. It is not entirely clear why it has changed and the imports still function correctly. Another change is the 'Import Backup' tests. At some point there was a change to just remove invalid builds instead of throwing validation errors. The tests were never updated to fit this use-case. --- __tests__/fixtures/expected-builds.json | 48 ++++++++++++------------- __tests__/test-import.js | 28 ++++++++------- 2 files changed, 40 insertions(+), 36 deletions(-) diff --git a/__tests__/fixtures/expected-builds.json b/__tests__/fixtures/expected-builds.json index 2e5498a6..c9ed326a 100644 --- a/__tests__/fixtures/expected-builds.json +++ b/__tests__/fixtures/expected-builds.json @@ -1,50 +1,50 @@ { "type_6_transporter": { - "Cargo": "A0p0tdFal8d8s8f4-----04040303430101.Iw1/kA==.Aw1/kA==.", - "Miner": "A0p5tdFal8d8s8f42l2l---040403451q0101.Iw1/kA==.Aw1/kA==.", - "Hopper": "A0p0tdFal8d0s8f41717---030302024300-.Iw1/kA==.Aw1/kA==." + "Cargo": "A0p0tdFal8d8s8f4-----04040303430101-.Iw18UA==.Aw18UA==.", + "Miner": "A0p5tdFal8d8s8f42l2l---040403451q0101-.Iw18UA==.Aw18UA==.", + "Hopper": "A0p0tdFal8d0s8f41717---030302024300--.Iw18UA==.Aw18UA==." }, "type_7_transport": { - "Cargo": "A0p0tiFfliddsdf5--------0505040403480101.Iw18aQ==.Aw18aQ==.", - "Miner": "A0pdtiFflid8sdf5--2l2l----0505041v03450000.Iw18aQ==.Aw18aQ==." + "Cargo": "A0p0tiFfliddsdf5--------0505040403480101--.Iw18eQ==.Aw18eQ==.", + "Miner": "A0pdtiFflid8sdf5--2l2l----0505041v03450000--.Iw18eQ==.Aw18eQ==." }, "federal_dropship": { - "Cargo": "A0pdtiFflnddsif4-1717------05040448--020201.Iw18eQ==.Aw18eQ==." + "Cargo": "A0pdtiFflnddsif4-1717------05040448--020201-.Iw18RQ==.Aw18RQ==." }, "asp": { - "Miner": "A2pftfFflidfskf50s0s24242l2l---04054a1q02022o27.Iw18WQ==.Aw18WQ==." + "Miner": "A2pftfFflidfskf50s0s24242l2l---04054a1q02022o27-.Iw18eQ==.Aw18eQ==." }, "imperial_clipper": { - "Cargo": "A0p5tiFflndisnf4--0s0s----0605450302020101.Iw18aQ==.Aw18aQ==.", - "Dream": "A2pktkFflndpskf40v0v0s0s0404040n4k5n5d2b29292o-.AwRj4yWU1I==.CwBhCYy6YRigzLIA.", - "Current": "A0patkFflndfskf4----------------.AwRj4yWU1I==.CwBhCYy6YRigzLIA." + "Cargo": "A0p5tiFflndisnf4--0s0s----0605450302020101-.Iw18WQ==.Aw18WQ==.", + "Dream": "A2pktkFflndpskf40v0v0s0s0404040n4k5n5d2b29292o--.AwRj4yWU1Yg=.CwBhCYy6YRigzPIA.", + "Current": "A0patkFflndfskf4-----------------.AwRj4yWU1Yg=.CwBhCYy6YRigzPIA." }, "type_9_heavy": { - "Current": "A0patsFklndnsif6---------0706054a0303020224.AwRj4yoo.EwBhEYy6dsg=." + "Current": "A0patsFklndnsif6---------0706054a0303020224--.AwRj4yo5iA==.EwBhEYy6d6g=." }, "python": { - "Cargo": "A0patnFflidsssf5---------050505040448020201.Iw18eQ==.Aw18eQ==.", - "Miner": "A0pktkFflidpspf50v0v0v2m2m0404--050505Ce4a1v02022o.Iw18eQ==.IwBhBYy6dkCYg===.", - "Dream": "A2pptkFfliduspf50v0v0v27270404040m5n5n4f2d2d032t0201.Iw1+gDBxA===.EwBhEYy6e0WEA===.", - "Missile": "A0pttoFjljdystf52f2g2d2ePh----04044j03---002h.Iw18eQ==.Aw18eQ==." + "Cargo": "A0patnFflidsssf5---------050505040448020201-.Iw18eAMQ.Aw18RQ==.", + "Miner": "A0pktkFflidpspf50v0v0v2m2m0404--050505Ce4a1v02022o-.Iw18eAMQ.IwBhBYy6dkCYRA==.", + "Dream": "A2pptkFfliduspf50v0v0v27270404040m5n5n4f2d2d032t0201-.Iw1+gDByUA==.EwBhEYy6e0VEA===.", + "Missile": "A0pttoFjljdystf52f2g2d2ePh----04044j03---00--.Iw18eAMQ.Aw18RQ==." }, "anaconda": { - "Dream": "A4putpFklndzsuf52c0o0o0o1m1m0q0q0404040l0b0100004k5n5n112d2d04-0303326b.AwRj4yo5dyg=.MwBhCYy6duvARiA=.", - "Cargo": "A0patnFklndnsxf5----------------06050505040404-45030301.Iw18ZVA=.Aw18ZVA=.", - "Current": "A0patnFklndksxf5----------------06050505040404-03034524.Iw18ZVA=.Aw18ZVA=.", - "Explorer": "A0patnFklndksxf5--------0202------f7050505040s37-2f2i4524.AwRj4yVKJ9hA.AwhMIyumQRhEA===.", - "Test": "A4putkFklkdzsuf52c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04---0303326b.Iw18ZVA=.Aw18ZVA=." + "Dream": "A4putpFklndzsuf52c0o0o0o1m1m0q0q0404040l0b0100004k5n5n112d2d04-0303326b-.AwRj4yo5dzhA.MwBhCYy6duvARhEA.", + "Cargo": "A0patnFklndnsxf5----------------06050505040404-45030301-.Iw18ZUAxA===.Aw18ZXEA.", + "Current": "A0patnFklndksxf5----------------06050505040404-03034524-.Iw18ZUAxA===.Aw18ZXEA.", + "Explorer": "A0patnFklndksxf5--------0202------f7050505040s37--2i4524-.AwRj4yVKJ9jCA===.AwhMIyumQRgkA===.", + "Test": "A4putkFklkdzsuf52c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04---0303326b-.Iw18ZUAxA===.Aw18ZXEA." }, "diamondback_explorer": { - "Explorer": "A0p0tdFfldddsdf5---0202--320p432i2f-.AwRj4zTYg===.AwiMIyoo." + "Explorer": "A0p0tdFfldddsdf5---0202--320p432i----.AwRj4zTZaA==.AwiMIyqo." }, "vulture": { - "Bounty Hunter": "A3patcFalddksff31e1e0404-0l4a-5d27662j.AwRj4z2I.MwBhBYy6oJmAjLIA." + "Bounty Hunter": "A3patcFalddksff31e1e0404-0l4a-5d27662j--.AwRj4z2Gg===.MwBhBYy6oJmAjLMQ." }, "fer_de_lance": { - "Attack": "A2pfthFalidpsff31r0s0s0s0s000404-04-4a-5d27-.Iw18aQ==.CwBhrSu8EZyA." + "Attack": "A2pfthFalidpsff31r0s0s0s0s000404-04-4a-5d27--.Iw18aAMQ.CwBhrSu8EZxEA===." }, "eagle": { - "Figther": "A4p0t5F5l3d5s5f20p0p24-4053-2j-.Iw18kA==.Aw18kA==." + "Figther": "A4p0t5F5l3d5s5f20p0p24-4053-2j---.Iw18gDJQ.Aw19kA==." } } diff --git a/__tests__/test-import.js b/__tests__/test-import.js index d0915f6c..89e77f6b 100644 --- a/__tests__/test-import.js +++ b/__tests__/test-import.js @@ -110,21 +110,25 @@ describe('Import Modal', function() { it('catches an invalid backup', function() { const importData = require('./fixtures/valid-backup'); let invalidImportData = Object.assign({}, importData); - //invalidImportData.builds.asp = null; // Remove Asp Miner build used in comparison + // Remove Asp Miner build used in comparison delete(invalidImportData.builds.asp); pasteText('"this is not valid"'); expect(modal.state.importValid).toBeFalsy(); expect(modal.state.errorMsg).toEqual('Must be an object or array!'); + pasteText('{ "builds": "Should not be a string" }'); expect(modal.state.importValid).toBeFalsy(); expect(modal.state.errorMsg).toEqual('builds must be an object!'); - pasteText(JSON.stringify(importData).replace('anaconda', 'invalid_ship')); + + pasteText(JSON.stringify(importData).replace(/anaconda/g, 'invalid_ship')); expect(modal.state.importValid).toBeFalsy(); - expect(modal.state.errorMsg).toEqual('"invalid_ship" is not a valid Ship Id!'); + expect(Object.keys(modal.state.builds)).not.toContain('anaconda'); + pasteText(JSON.stringify(importData).replace('Dream', '')); expect(modal.state.importValid).toBeFalsy(); - expect(modal.state.errorMsg).toEqual('Imperial Clipper build "" must be a string at least 1 character long!'); + expect(Object.keys(modal.state.builds.imperial_clipper).length).toEqual(3); + pasteText(JSON.stringify(invalidImportData)); expect(modal.state.importValid).toBeFalsy(); expect(modal.state.errorMsg).toEqual('asp build "Miner" data is missing!'); @@ -144,7 +148,7 @@ describe('Import Modal', function() { expect(modal.state.singleBuild).toBe(true); clickProceed(); expect(MockRouter.go.mock.calls.length).toBe(1); - expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/anaconda?code=A4putkFklkdzsuf52c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04---0303326b.AwRj4zNLaA%3D%3D.CwBhCYzBGW9qCTSqq5xA.&bn=Test%20My%20Ship'); + expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/anaconda?code=A4putkFklkdzsuf52c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04---0303326b-.AwRj4zNLeI%3D%3D.CwBhCYzBGW9qCTSqq5JA.&bn=Test%20My%20Ship'); }); it('catches an invalid build', function() { @@ -169,7 +173,7 @@ describe('Import Modal', function() { expect(modal.state.singleBuild).toBe(true); clickProceed(); expect(MockRouter.go.mock.calls.length).toBe(1); - expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/anaconda?code=A4putkFklkdzsuf52c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04---0303326b.AwRj4zNLaA%3D%3D.CwBhCYzBGW9qCTSqq5xA.H4sIAAAAAAAAA2MUe8HMwPD%2FPwMAAGvB0AkAAAA%3D&bn=Test%20My%20Ship'); + expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/anaconda?code=A4putkFklkdzsuf52c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04---0303326b-.AwRj4zNLeI%3D%3D.CwBhCYzBGW9qCTSqq5JA.H4sIAAAAAAAAE2MUe8HMwPD%2FPwMAAGvB0AkAAAA%3D&bn=Test%20My%20Ship'); }); }); @@ -186,7 +190,7 @@ describe('Import Modal', function() { expect(modal.state.singleBuild).toBe(true); clickProceed(); expect(MockRouter.go.mock.calls.length).toBe(1); - expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/asp?code=A0pftiFflfddsnf5------020202033c044002v62f2i.AwRj4yvI.CwRgDBldHnJA.H4sIAAAAAAAAA2P858DAwPCXEUhwHPvx%2F78YG5AltB7I%2F8%2F0TwImJboDSPJ%2F%2B%2Ff%2Fv%2FKlX%2F%2F%2Fi3AwMTBIfARK%2FGf%2BJwVSxArStVAYqOjvz%2F%2F%2FJVo5GRhE2IBc4SKQSSz%2FDGEmCa398P8%2F%2F2%2BgTf%2F%2FA7kMAExxqlSAAAAA&bn=Multi-purpose%20Asp%20Explorer'); + expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/asp?code=A0pftiFflfddsnf5------020202033c044002v6-2i-.AwRj4yvYg%3D%3D%3D.CwRgDBldHn5A.H4sIAAAAAAAAE2P858DAwPCXEUhwHPvx%2F78YG5AltB7I%2F8%2F0TwImJboDSPJ%2F%2B%2Ff%2Fv%2FKlX%2F%2F%2Fi3AwMTBIfARK%2FGf%2BJwVSxArStVAYqOjvz%2F%2F%2FJVo5GRhE2IBc4SKQSSz%2FDGEmCa398P8%2F%2F2%2BgTf%2F%2FA7kMAExxqlSAAAAA&bn=Multi-purpose%20Asp%20Explorer'); }); it('imports a valid v4 build with modifications', function() { @@ -198,7 +202,7 @@ describe('Import Modal', function() { expect(modal.state.singleBuild).toBe(true); clickProceed(); expect(MockRouter.go.mock.calls.length).toBe(1); - expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/imperial_courier?code=A0patzF5l0das8f31a1a270202000e402t0101-2f.AwRj4zKA.CwRgDBldLiQ%3D.H4sIAAAAAAAAA12OPUvDYBSFT1OTfkRJjUkbbC3Yj8mlODgUISAtdOlety5ODv0Vgji7O7kJ%2FgzBQX%2BEY7Gg0NKhfY%2FnHQLFDBdynufe9%2BRMCmCb06g29oCgacjiRx6gY6oWKUT8UgLaszqQfHmSnpVFN1uSeXNsJVcj%2FA2EHlZkspIUpUc6UjTXGT85qwHuSEuVc%2F16r99kDQeSSjvSbSjpyUpNK10uJJ3aYqk6smwm1lQ9bOxw71TMm8VanEqq9JW1r3Qo%2BREOLnQHvbWmb7rZIu5VLIyGQGOukPv%2F0WQk5LeEAjPOUDwtAP6bShy2HKAz0HPO%2B5KsP25I79O2I7LvD%2Bz4Il1XAQAA&bn=Multi-purpose%20Imperial%20Courier'); + expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/imperial_courier?code=A0patzF5l0das8f31a1a270202000e402t0101----.AwRj4zOYg%3D%3D%3D.CwRgDBldLuZA.H4sIAAAAAAAAE12OPUvDYBSFT1OTfkRJjUkbbC3Yj8mlODgUISAtdOlety5ODv0Vgji7O7kJ%2FgzBQX%2BEY7Gg0NKhfY%2FnHQLFDBdynufe9%2BRMCmCb06g29oCgacjiRx6gY6oWKUT8UgLaszqQfHmSnpVFN1uSeXNsJVcj%2FA2EHlZkspIUpUc6UjTXGT85qwHuSEuVc%2F16r99kDQeSSjvSbSjpyUpNK10uJJ3aYqk6smwm1lQ9bOxw71TMm8VanEqq9JW1r3Qo%2BREOLnQHvbWmb7rZIu5VLIyGQGOukPv%2F0WQk5LeEAjPOUDwtAP6bShy2HKAz0HPO%2B5KsP25I79O2I7LvD%2Bz4Il1XAQAA&bn=Multi-purpose%20Imperial%20Courier'); }); }); @@ -240,7 +244,7 @@ describe('Import Modal', function() { expect(modal.state.singleBuild).toBe(true); clickProceed(); expect(MockRouter.go.mock.calls.length).toBe(1); - expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/federal_corvette?code=A2putsFklndzsxf50x0x7l28281919040404040402020l06p05sf63c5ifr--v66g2f.AwRj4zNaqA%3D%3D.CwRgDBldUExuBiIlUA%3D%3D.H4sIAAAAAAAAA12STy8DURTFb1szU53Ga8dg2qqqDmJDIoKFxJImumYjVrVqfAALC4lNbcUnkLCoDbEQu0bSlQVhI8JHsJBIQ73rXMkwMYuT9%2Bb87nl%2F7ovoRSL6ikD6TYNINZg5XsWUo7pfrBikr2USlRyXyDuLAhr6ZHanNLOzD5tjOiskysk5dOBvfTB7bjeRW0MNG3ohSBq1bKKxKwyLLUAjmwjpPu4wJx4xVbNI57heDfbUKUAy2xaRUQZpllHoHMHxKqjhhF4LgjtJiFHDmqbrEeVnUJOax7%2FSdRfRwBNotv9wo5kAuZMD2egKyDYcdYl1OBki6z%2BZQjaFnBPyFCM1LefF%2BcgrY0es9FKwbW8ZYj9gmBbxRVRdglMh6BNqnwsk4ouoO4HSIehNoBuBRHwR1QOmsBvHmk6IfMbd2fdCEka%2BjNSexPWGoEkcyX6CnxbxRZQtd%2BPpym%2B31xFtn0iSFPkf%2BBkttZlzB9KDFyBuFRfAGV0Ogoff8SSsCfjjD5hGWtLIwZB%2FgX5Zt%2BLHMI9My7sp6nzgZzekswTxVvCOkq%2FSXqb%2F3zfLxh6HrwIAAA%3D%3D&bn=Imported%20Federal%20Corvette'); + expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/federal_corvette?code=A2putsFklndzsxf50x0x7l28281919040404040402020l06p05sf63c5ifr--v66g--.AwRj4zNapI%3D%3D.CwRgDBldUExuBiIlWIA%3D.&bn=Imported%20Federal%20Corvette'); }); it('imports a valid companion API build', function() { @@ -252,7 +256,7 @@ describe('Import Modal', function() { expect(modal.state.singleBuild).toBe(true); clickProceed(); expect(MockRouter.go.mock.calls.length).toBe(1); - expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/beluga?code=A0pktsFplCdpsnf70t0t2727270004040404043c4fmimlmm04mc0iv62i2f.AwRj4yukg%3D%3D%3D.CwRgDBldHi8IUA%3D%3D.H4sIAAAAAAAAA2P8Z8%2FAwPCXEUiIKTMxMPCv%2F%2Ff%2FP8cFIPGf6Z8YTEr0GjMDg%2FJWICERBOTzn%2Fn7%2F7%2FIO5Ai5n9SIEWsQEIoSxAolfbt%2F3%2BJPk4GBhE7YQYGYVmgcuVnf4Aq%2FwOVAAAyiFctbgAAAA%3D%3D&bn=Imported%20Beluga%20Liner'); + expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/beluga?code=A0pktsFplCdpsnf70t0t2727270004040404043c4fmimlmm04mc0iv62i--.AwRj4yusg%3D%3D%3D.CwRgDBldHi8IWIA%3D.&bn=Imported%20Beluga%20Liner'); }); it('imports a valid companion API build', function() { @@ -264,7 +268,7 @@ describe('Import Modal', function() { expect(modal.state.singleBuild).toBe(true); clickProceed(); expect(MockRouter.go.mock.calls.length).toBe(1); - expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/type_7_transport?code=A0patfFflidasdf5----0404040005050504044d2402.AwRj4yrI.CwRgDBlVK7EiA%3D%3D%3D.&bn=Imported%20Type-7%20Transporter'); + expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/type_7_transport?code=A0patfFflidasdf5----0404040005050504044d2402--.AwRj4yoo.CwRgDBlVK7HjEA%3D%3D.&bn=Imported%20Type-7%20Transporter'); }); it('imports a valid companion API build', function() { @@ -276,7 +280,7 @@ describe('Import Modal', function() { expect(modal.state.singleBuild).toBe(true); clickProceed(); expect(MockRouter.go.mock.calls.length).toBe(1); - expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/cobra_mk_iii?code=A0p0tdFaldd3sdf4------34---2f2i.AwRj4yKA.CwRgDMYExrezBUg%3D.&bn=Imported%20Cobra%20Mk%20III'); + expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/cobra_mk_iii?code=A0p0tdFaldd3sdf4------34----2i--.AwRj4yqA.CwRgDMYExrezBig%3D.&bn=Imported%20Cobra%20Mk%20III'); }); }); From 4c70806a5a02df536ab432bbc6708ed7c5954b94 Mon Sep 17 00:00:00 2001 From: Matthew Turney Date: Sun, 14 Jun 2020 09:55:34 -0500 Subject: [PATCH 26/66] Support SLEF import format for importing builds. Inara uses the [SLEF] format to export builds. This format is mostly just a wrapper around the standard journal loadout format and includes support for source app metadata and exporting of multiple loadouts at one time. This change adds support for this format in the manual importer. Eventually it would be good to support this in the import route as well so Inara (or any other apps) can link directly to coriolis. [SLEF]: https://inara.cz/inara-impexp-slef/ --- __tests__/fixtures/slef-multiple-builds.json | 366 ++++++++++++++++++ .../slef-multiple-expected-builds.json | 8 + __tests__/fixtures/slef-single-build.json | 188 +++++++++ __tests__/test-import.js | 39 +- src/app/components/ModalImport.jsx | 39 +- 5 files changed, 633 insertions(+), 7 deletions(-) create mode 100644 __tests__/fixtures/slef-multiple-builds.json create mode 100644 __tests__/fixtures/slef-multiple-expected-builds.json create mode 100644 __tests__/fixtures/slef-single-build.json diff --git a/__tests__/fixtures/slef-multiple-builds.json b/__tests__/fixtures/slef-multiple-builds.json new file mode 100644 index 00000000..d6b95126 --- /dev/null +++ b/__tests__/fixtures/slef-multiple-builds.json @@ -0,0 +1,366 @@ +[ + { + "header": { + "appName": "Inara", + "appVersion": "1.0", + "appURL": "https:\/\/inara.cz\/cmdr-fleet\/123\/123\/", + "appCustomProperties": { + "inaraCommanderID": 123, + "inaraShipID": 123 + } + }, + "data": { + "Ship": "krait_mkii", + "ShipID": 7, + "ShipName": "pancake hammer", + "ShipIdent": "PH-01", + "HullValue": 44160710, + "ModulesValue": 111274094, + "Rebuy": 7771743, + "Modules": [ + { + "Slot": "largehardpoint1", + "Item": "hpt_mininglaser_fixed_small", + "On": true + }, + { + "Slot": "largehardpoint2", + "Item": "hpt_cannon_gimbal_large", + "On": true, + "Engineering": { + "BlueprintName": "weapon_overcharged", + "Level": 2, + "Quality": 1, + "ExperimentalEffect": "special_auto_loader" + } + }, + { + "Slot": "largehardpoint3", + "Item": "hpt_cannon_gimbal_large", + "On": true, + "Engineering": { + "BlueprintName": "weapon_overcharged", + "Level": 2, + "Quality": 1, + "ExperimentalEffect": "special_auto_loader" + } + }, + { + "Slot": "mediumhardpoint1", + "Item": "hpt_basicmissilerack_fixed_medium", + "On": true, + "Engineering": { + "BlueprintName": "weapon_highcapacity", + "Level": 5, + "Quality": 1 + } + }, + { + "Slot": "mediumhardpoint2", + "Item": "hpt_basicmissilerack_fixed_medium", + "On": true + }, + { + "Slot": "tinyhardpoint1", + "Item": "hpt_heatsinklauncher_turret_tiny", + "On": true + }, + { + "Slot": "tinyhardpoint2", + "Item": "hpt_cloudscanner_size0_class3", + "On": true + }, + { + "Slot": "tinyhardpoint3", + "Item": "hpt_shieldbooster_size0_class5", + "On": true + }, + { + "Slot": "tinyhardpoint4", + "Item": "hpt_shieldbooster_size0_class5", + "On": true, + "Priority": 1 + }, + { + "Slot": "slot01_size6", + "Item": "int_cargorack_size6_class1", + "On": true, + "Priority": 1 + }, + { + "Slot": "slot02_size6", + "Item": "int_cargorack_size6_class1", + "On": true, + "Priority": 1 + }, + { + "Slot": "slot03_size5", + "Item": "int_guardianfsdbooster_size5", + "On": true + }, + { + "Slot": "slot04_size5", + "Item": "int_fighterbay_size5_class1", + "On": true + }, + { + "Slot": "slot05_size4", + "Item": "int_shieldgenerator_size4_class5", + "On": true + }, + { + "Slot": "slot06_size3", + "Item": "int_dronecontrol_collection_size3_class4", + "On": true + }, + { + "Slot": "slot07_size3", + "Item": "int_dronecontrol_collection_size3_class4", + "On": true + }, + { + "Slot": "slot08_size2", + "Item": "int_refinery_size2_class2", + "On": true + }, + { + "Slot": "slot09_size1", + "Item": "int_dronecontrol_prospector_size1_class4", + "On": true + }, + { + "Slot": "powerplant", + "Item": "int_powerplant_size7_class5", + "On": true, + "Priority": 1 + }, + { + "Slot": "mainengines", + "Item": "int_engine_size6_class5", + "On": true + }, + { + "Slot": "frameshiftdrive", + "Item": "int_hyperdrive_size5_class5", + "On": true, + "Engineering": { + "BlueprintName": "fsd_longrange", + "Level": 2, + "Quality": 0.861 + } + }, + { + "Slot": "lifesupport", + "Item": "int_lifesupport_size4_class2", + "On": true, + "Priority": 3 + }, + { + "Slot": "powerdistributor", + "Item": "int_powerdistributor_size7_class5", + "On": true + }, + { + "Slot": "radar", + "Item": "int_sensors_size6_class2", + "On": true + }, + { + "Slot": "fueltank", + "Item": "int_fueltank_size5_class3", + "On": true, + "Priority": 1 + }, + { + "Slot": "armour", + "Item": "krait_mkii_armour_grade3", + "On": true, + "Priority": 1, + "Engineering": { + "BlueprintName": "armour_heavyduty", + "Level": 5, + "Quality": 1 + } + } + ] + } + }, + { + "header": { + "appName": "Inara", + "appVersion": "1.0", + "appURL": "https:\/\/inara.cz\/cmdr-fleet\/123\/123\/", + "appCustomProperties": { + "inaraCommanderID": 123, + "inaraShipID": 123 + } + }, + "data": { + "Ship": "diamondbackxl", + "ShipID": 11, + "ShipName": "star Hopper", + "ShipIdent": "PH-02", + "HullValue": 1615649, + "ModulesValue": 16981039, + "Rebuy": 929837, + "Modules": [ + { + "Slot": "tinyhardpoint1", + "Item": "hpt_heatsinklauncher_turret_tiny", + "On": true, + "Value": 3072 + }, + { + "Slot": "slot01_size4", + "Item": "int_fuelscoop_size4_class5", + "On": true, + "Priority": 3, + "Value": 2862364 + }, + { + "Slot": "slot02_size4", + "Item": "int_guardianfsdbooster_size4", + "On": true, + "Value": 2847499 + }, + { + "Slot": "slot03_size3", + "Item": "int_shieldgenerator_size3_class2", + "On": true, + "Value": 18812, + "Engineering": { + "BlueprintName": "shieldgenerator_thermic", + "Level": 3, + "Quality": 1, + "ExperimentalEffect": "special_shield_health" + } + }, + { + "Slot": "slot04_size3", + "Item": "int_repairer_size3_class5", + "On": true, + "Value": 2302911 + }, + { + "Slot": "slot05_size2", + "Item": "int_buggybay_size2_class2", + "On": true, + "Priority": 3, + "Value": 21600 + }, + { + "Slot": "slot06_size2", + "Item": "int_cargorack_size2_class1", + "On": true, + "Priority": 1, + "Value": 2852 + }, + { + "Slot": "slot07_size1", + "Item": "int_supercruiseassist", + "On": true, + "Priority": 3, + "Value": 9121 + }, + { + "Slot": "slot08_size1", + "Item": "int_detailedsurfacescanner_tiny", + "On": true, + "Value": 250000, + "Engineering": { + "BlueprintName": "sensor_expanded", + "Level": 5, + "Quality": 1 + } + }, + { + "Slot": "powerplant", + "Item": "int_powerplant_size4_class5", + "On": true, + "Priority": 1, + "Value": 1441233, + "Engineering": { + "BlueprintName": "powerplant_boosted", + "Level": 1, + "Quality": 1 + } + }, + { + "Slot": "mainengines", + "Item": "int_engine_size4_class5", + "On": true, + "Value": 1610080, + "Engineering": { + "BlueprintName": "engine_dirty", + "Level": 5, + "Quality": 1, + "ExperimentalEffect": "special_engine_lightweight" + } + }, + { + "Slot": "frameshiftdrive", + "Item": "int_hyperdrive_size5_class5", + "On": true, + "Value": 5103953, + "Engineering": { + "BlueprintName": "fsd_longrange", + "Level": 5, + "Quality": 1, + "ExperimentalEffect": "special_fsd_lightweight" + } + }, + { + "Slot": "lifesupport", + "Item": "int_lifesupport_size3_class2", + "On": true, + "Value": 10133, + "Engineering": { + "BlueprintName": "misc_lightweight", + "Level": 3, + "Quality": 1 + } + }, + { + "Slot": "powerdistributor", + "Item": "int_powerdistributor_size4_class5", + "On": true, + "Value": 389022, + "Engineering": { + "BlueprintName": "powerdistributor_highfrequency", + "Level": 4, + "Quality": 1 + } + }, + { + "Slot": "radar", + "Item": "int_sensors_size3_class2", + "On": true, + "Value": 10133, + "Engineering": { + "BlueprintName": "sensor_lightweight", + "Level": 5, + "Quality": 1 + } + }, + { + "Slot": "fueltank", + "Item": "int_fueltank_size5_class3", + "On": true, + "Priority": 1, + "Value": 97754 + }, + { + "Slot": "armour", + "Item": "diamondbackxl_armour_grade1", + "On": true, + "Priority": 1, + "Engineering": { + "BlueprintName": "armour_heavyduty", + "Level": 5, + "Quality": 1 + } + } + ] + } + } +] diff --git a/__tests__/fixtures/slef-multiple-expected-builds.json b/__tests__/fixtures/slef-multiple-expected-builds.json new file mode 100644 index 00000000..19c2bd7f --- /dev/null +++ b/__tests__/fixtures/slef-multiple-expected-builds.json @@ -0,0 +1,8 @@ +{ + "krait_mkii": { + "Imported pancake hammer": "A2pptkFflidussf52l1o1o2g2g020g040405051Ofr45C9C91oP3.Iw18eQ==.AwRgzKIkA===." + }, + "diamondback_explorer": { + "Imported star Hopper": "A0pataFflddfsdf5---02---321P430iv6013w2i.Iw18SQ==.AwRm44GYpKg=." + } +} diff --git a/__tests__/fixtures/slef-single-build.json b/__tests__/fixtures/slef-single-build.json new file mode 100644 index 00000000..1b578b83 --- /dev/null +++ b/__tests__/fixtures/slef-single-build.json @@ -0,0 +1,188 @@ +[ + { + "header": { + "appName": "Inara", + "appVersion": "1.0", + "appURL": "https:\/\/inara.cz\/cmdr-fleet\/123\/123\/", + "appCustomProperties": { + "inaraCommanderID": 123, + "inaraShipID": 123 + } + }, + "data": { + "Ship": "krait_mkii", + "ShipID": 7, + "ShipName": "pancake hammer", + "ShipIdent": "PH-01", + "HullValue": 44160710, + "ModulesValue": 111274094, + "Rebuy": 7771743, + "Modules": [ + { + "Slot": "largehardpoint1", + "Item": "hpt_mininglaser_fixed_small", + "On": true + }, + { + "Slot": "largehardpoint2", + "Item": "hpt_cannon_gimbal_large", + "On": true, + "Engineering": { + "BlueprintName": "weapon_overcharged", + "Level": 2, + "Quality": 1, + "ExperimentalEffect": "special_auto_loader" + } + }, + { + "Slot": "largehardpoint3", + "Item": "hpt_cannon_gimbal_large", + "On": true, + "Engineering": { + "BlueprintName": "weapon_overcharged", + "Level": 2, + "Quality": 1, + "ExperimentalEffect": "special_auto_loader" + } + }, + { + "Slot": "mediumhardpoint1", + "Item": "hpt_basicmissilerack_fixed_medium", + "On": true, + "Engineering": { + "BlueprintName": "weapon_highcapacity", + "Level": 5, + "Quality": 1 + } + }, + { + "Slot": "mediumhardpoint2", + "Item": "hpt_basicmissilerack_fixed_medium", + "On": true + }, + { + "Slot": "tinyhardpoint1", + "Item": "hpt_heatsinklauncher_turret_tiny", + "On": true + }, + { + "Slot": "tinyhardpoint2", + "Item": "hpt_cloudscanner_size0_class3", + "On": true + }, + { + "Slot": "tinyhardpoint3", + "Item": "hpt_shieldbooster_size0_class5", + "On": true + }, + { + "Slot": "tinyhardpoint4", + "Item": "hpt_shieldbooster_size0_class5", + "On": true, + "Priority": 1 + }, + { + "Slot": "slot01_size6", + "Item": "int_cargorack_size6_class1", + "On": true, + "Priority": 1 + }, + { + "Slot": "slot02_size6", + "Item": "int_cargorack_size6_class1", + "On": true, + "Priority": 1 + }, + { + "Slot": "slot03_size5", + "Item": "int_guardianfsdbooster_size5", + "On": true + }, + { + "Slot": "slot04_size5", + "Item": "int_fighterbay_size5_class1", + "On": true + }, + { + "Slot": "slot05_size4", + "Item": "int_shieldgenerator_size4_class5", + "On": true + }, + { + "Slot": "slot06_size3", + "Item": "int_dronecontrol_collection_size3_class4", + "On": true + }, + { + "Slot": "slot07_size3", + "Item": "int_dronecontrol_collection_size3_class4", + "On": true + }, + { + "Slot": "slot08_size2", + "Item": "int_refinery_size2_class2", + "On": true + }, + { + "Slot": "slot09_size1", + "Item": "int_dronecontrol_prospector_size1_class4", + "On": true + }, + { + "Slot": "powerplant", + "Item": "int_powerplant_size7_class5", + "On": true, + "Priority": 1 + }, + { + "Slot": "mainengines", + "Item": "int_engine_size6_class5", + "On": true + }, + { + "Slot": "frameshiftdrive", + "Item": "int_hyperdrive_size5_class5", + "On": true, + "Engineering": { + "BlueprintName": "fsd_longrange", + "Level": 2, + "Quality": 0.861 + } + }, + { + "Slot": "lifesupport", + "Item": "int_lifesupport_size4_class2", + "On": true, + "Priority": 3 + }, + { + "Slot": "powerdistributor", + "Item": "int_powerdistributor_size7_class5", + "On": true + }, + { + "Slot": "radar", + "Item": "int_sensors_size6_class2", + "On": true + }, + { + "Slot": "fueltank", + "Item": "int_fueltank_size5_class3", + "On": true, + "Priority": 1 + }, + { + "Slot": "armour", + "Item": "krait_mkii_armour_grade3", + "On": true, + "Priority": 1, + "Engineering": { + "BlueprintName": "armour_heavyduty", + "Level": 5, + "Quality": 1 + } + } + ] + } + } +] diff --git a/__tests__/test-import.js b/__tests__/test-import.js index 89e77f6b..c7c484cc 100644 --- a/__tests__/test-import.js +++ b/__tests__/test-import.js @@ -206,7 +206,7 @@ describe('Import Modal', function() { }); }); - describe('Import Detaild Builds Array', function() { + describe('Import Detailed Builds Array', function() { beforeEach(reset); @@ -328,4 +328,41 @@ describe('Import Modal', function() { }); }); + describe('Imports SLEF data', () => { + beforeEach(reset); + + it('imports a single valid SLEF build', () => { + const importData = require('./fixtures/slef-single-build.json'); + pasteText(JSON.stringify(importData)); + + expect(modal.state.importValid).toBeTruthy(); + expect(modal.state.errorMsg).toEqual(null); + expect(modal.state.singleBuild).toBe(true); + clickProceed(); + expect(MockRouter.go.mock.calls.length).toBe(1); + expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/krait_mkii?code=A2pptkFflidussf52l1o1o2g2g020g040405051Ofr45C9C91oP3.Iw18eQ%3D%3D.AwRgzKIkA%3D%3D%3D.&bn=Imported%20pancake%20hammer'); + }); + + it('imports multiple SLEF builds', () => { + const importData = require('./fixtures/slef-multiple-builds.json'); + const expectedBuilds = require('./fixtures/slef-multiple-expected-builds.json'); + pasteText(JSON.stringify(importData)); + + expect(modal.state.importValid).toBeTruthy(); + expect(modal.state.errorMsg).toEqual(null); + expect(modal.state.singleBuild).toBe(false); + clickProceed(); + expect(modal.state.processed).toBeTruthy(); + clickImport(); + + const builds = Persist.getBuilds(); + + for (const shipModel in builds) { + for (const buildName in builds[shipModel]) { + expect(builds[shipModel][buildName]) + .toEqual(expectedBuilds[shipModel][buildName]); + } + } + }); + }); }); diff --git a/src/app/components/ModalImport.jsx b/src/app/components/ModalImport.jsx index cf48e138..4dc34b7c 100644 --- a/src/app/components/ModalImport.jsx +++ b/src/app/components/ModalImport.jsx @@ -11,7 +11,8 @@ import * as ModuleUtils from '../shipyard/ModuleUtils'; import { fromDetailedBuild } from '../shipyard/Serializer'; import { Download } from './SvgIcons'; import { outfitURL } from '../utils/UrlGenerators'; -import * as CompanionApiUtils from '../utils/CompanionApiUtils'; +import { shipFromJson, shipModelFromJson } from '../utils/CompanionApiUtils'; +import { shipFromLoadoutJSON } from '../utils/JournalUtils'; const zlib = require('pako'); @@ -214,8 +215,8 @@ export default class ModalImport extends TranslatedComponent { * @throws {string} if parse/import fails */ _importCompanionApiBuild(build) { - const shipModel = CompanionApiUtils.shipModelFromJson(build); - const ship = CompanionApiUtils.shipFromJson(build); + const shipModel = shipModelFromJson(build); + const ship = shipFromJson(build); let builds = {}; builds[shipModel] = {}; @@ -321,6 +322,30 @@ export default class ModalImport extends TranslatedComponent { this.setState({ builds, singleBuild: true }); } + /** + * Import SLEF formatted builds. Sets state to a map of the builds on success + * and flags if there was only a single build. + * + * @param {string} importData - Array of the list of builds. + * @throws {string} If parse / import fails + */ + _importSlefBuilds(importData) { + const builds = importData.reduce((memo, { data }) => { + const shipModel = shipModelFromJson(data); + const ship = shipFromLoadoutJSON(data); + const shipTemplate = Ships[shipModel]; + const shipName = data.ShipName || shipTemplate.properties.name; + + const key = `Imported ${shipName}`; + memo[shipModel] = {}; + memo[shipModel][key] = ship.toString(); + + return memo; + }, {}); + + this.setState({ builds, singleBuild: Object.keys(builds).length === 1 }); + } + /** * Validate the import string / text box contents * @param {SyntheticEvent} event Event @@ -355,8 +380,10 @@ export default class ModalImport extends TranslatedComponent { throw 'Must be an object or array!'; } - if (importData.modules != null && importData.modules.Armour != null) { // Only the companion API has this information - this._importCompanionApiBuild(importData); // Single sihp definition + if (importData?.[0]?.header?.appName) { // has SLEF envelope? + this._importSlefBuilds(importData); + } else if (importData.modules != null && importData.modules.Armour != null) { // Only the companion API has this information + this._importCompanionApiBuild(importData); // Single ship definition } else if (importData.ship != null && importData.ship.modules != null && importData.ship.modules.Armour != null) { // Only the companion API has this information this._importCompanionApiBuild(importData.ship); // Complete API dump } else if (importData instanceof Array) { // Must be detailed export json @@ -542,7 +569,7 @@ export default class ModalImport extends TranslatedComponent { {comparisonRows} - ); + ); } if(this.state.canEdit) { From 1b96c18ecb0c7a28f839ef089bb5c2623deaa46a Mon Sep 17 00:00:00 2001 From: Faiz Rahman Date: Fri, 26 Jun 2020 16:29:23 -0700 Subject: [PATCH 27/66] Minor typo fix. --- src/app/i18n/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/i18n/en.json b/src/app/i18n/en.json index a1446bcd..e50f137a 100644 --- a/src/app/i18n/en.json +++ b/src/app/i18n/en.json @@ -205,7 +205,7 @@ "internal protection": "Internal protection", "external protection": "External protection", "engagement range": "Engagement range", - "boost interval": "Boost intervall", + "boost interval": "Boost interval", "total": "Total", "ammo": "Ammunition maximum", "boot": "Boot time", From 9674aa2367adc360552f1d9b04c5414b7853ee2d Mon Sep 17 00:00:00 2001 From: Jon Taylor Date: Tue, 21 Jul 2020 17:20:23 +0100 Subject: [PATCH 28/66] Add the effective DPE for Shields and Armor to offence table --- src/app/components/Offence.jsx | 16 ++++++++++++++-- src/app/shipyard/Calculations.js | 15 +++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/app/components/Offence.jsx b/src/app/components/Offence.jsx index a21ba490..092cce6f 100644 --- a/src/app/components/Offence.jsx +++ b/src/app/components/Offence.jsx @@ -243,8 +243,13 @@ export default class Offence extends TranslatedComponent { {formats.f1(weapon.sdps.base.total)} {formats.f1(weapon.sdps.shields.total)} {formats.pct1(weapon.effectiveness.shields.total)} + + {formats.f1(weapon.effectiveness.shields.dpe)} + {formats.f1(weapon.sdps.armour.total)} {formats.pct1(weapon.effectiveness.armour.total)} + + {formats.f1(weapon.effectiveness.armour.dpe)} ); } @@ -271,15 +276,20 @@ export default class Offence extends TranslatedComponent { {translate('weapon')} {translate('overall')} - {translate('opponent\'s shields')} - {translate('opponent\'s armour')} + {translate('opponent\'s shields')} + {translate('opponent\'s armour')} {'sdps'} {'sdps'} {'eft'} + + {'dpe'} + {'sdps'} {'eft'} + + {'dpe'} @@ -290,8 +300,10 @@ export default class Offence extends TranslatedComponent { ={formats.f1(totalSDps)} ={formats.f1(totalShieldsSDps)} + ={formats.f1(totalArmourSDps)} + } diff --git a/src/app/shipyard/Calculations.js b/src/app/shipyard/Calculations.js index 83718991..014ca487 100644 --- a/src/app/shipyard/Calculations.js +++ b/src/app/shipyard/Calculations.js @@ -904,12 +904,14 @@ export function _weaponSustainedDps(m, opponent, opponentShields, opponentArmour shields: { range: 1, sys: opponentHasShields ? opponentShields.absolute.sys : 1, - resistance: 1 + resistance: 1, + dpe: 1 }, armour: { range: 1, hardness: 1, - resistance: 1 + resistance: 1, + dpe: 1 } } }; @@ -969,11 +971,20 @@ export function _weaponSustainedDps(m, opponent, opponentShields, opponentArmour weapon.damage.shields.total = weapon.damage.shields.absolute + weapon.damage.shields.explosive + weapon.damage.shields.kinetic + weapon.damage.shields.thermal; weapon.damage.armour.total = weapon.damage.armour.absolute + weapon.damage.armour.explosive + weapon.damage.armour.kinetic + weapon.damage.armour.thermal; + + weapon.effectiveness.shields.resistance *= shieldsResistance; weapon.effectiveness.armour.resistance *= armourResistance; + weapon.effectiveness.shields.total = weapon.effectiveness.shields.range * weapon.effectiveness.shields.sys * weapon.effectiveness.shields.resistance; weapon.effectiveness.armour.total = weapon.effectiveness.armour.range * weapon.effectiveness.armour.resistance * weapon.effectiveness.armour.hardness; + + weapon.effectiveness.shields.dpe = weapon.damage.shields.total / m.getEps(); + weapon.effectiveness.armour.dpe = weapon.damage.armour.total / m.getEps(); + console.log(weapon.damage.shields.dpe); + + return weapon; } From 840ce9f3e440dc972893e94b63c5e6abec2323ee Mon Sep 17 00:00:00 2001 From: Jon Taylor Date: Tue, 21 Jul 2020 17:24:06 +0100 Subject: [PATCH 29/66] Remove logging --- src/app/shipyard/Calculations.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/shipyard/Calculations.js b/src/app/shipyard/Calculations.js index 014ca487..543771a0 100644 --- a/src/app/shipyard/Calculations.js +++ b/src/app/shipyard/Calculations.js @@ -982,7 +982,6 @@ export function _weaponSustainedDps(m, opponent, opponentShields, opponentArmour weapon.effectiveness.shields.dpe = weapon.damage.shields.total / m.getEps(); weapon.effectiveness.armour.dpe = weapon.damage.armour.total / m.getEps(); - console.log(weapon.damage.shields.dpe); return weapon; From fc918d893c47bd80aa62076e64f9ef38e115c0de Mon Sep 17 00:00:00 2001 From: Felix Linker Date: Sat, 24 Oct 2020 12:37:34 +0200 Subject: [PATCH 30/66] Support SLEF on import --- src/app/Coriolis.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/Coriolis.jsx b/src/app/Coriolis.jsx index b0d7cb1d..321cfccb 100644 --- a/src/app/Coriolis.jsx +++ b/src/app/Coriolis.jsx @@ -99,14 +99,16 @@ export default class Coriolis extends React.Component { console.info('Ship import data: '); console.info(json); let ship; - if (json && json.modules) { + if (json && json[0] && json[0].data) { + ship = JournalUtils.shipFromLoadoutJSON(json[0].data); + } else if (json && json.modules) { ship = CompanionApiUtils.shipFromJson(json); } else if (json && json.Modules) { ship = JournalUtils.shipFromLoadoutJSON(json); } r.params.ship = ship.id; r.params.code = ship.toString(); - this._setPage(OutfittingPage, r) + this._setPage(OutfittingPage, r); } catch (err) { this._onError('Failed to import ship', r.path, 0, 0, err); } From 804466f88a30d5e3738787b9bafa153d82650d83 Mon Sep 17 00:00:00 2001 From: Felix Linker Date: Sat, 24 Oct 2020 13:20:02 +0200 Subject: [PATCH 31/66] Allow SLEF import of multiple builds via URL --- src/app/Coriolis.jsx | 33 +++++++++++++++++++++--------- src/app/components/ModalImport.jsx | 3 ++- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/app/Coriolis.jsx b/src/app/Coriolis.jsx index 321cfccb..c90049ad 100644 --- a/src/app/Coriolis.jsx +++ b/src/app/Coriolis.jsx @@ -98,17 +98,30 @@ export default class Coriolis extends React.Component { const json = JSON.parse(data); console.info('Ship import data: '); console.info(json); - let ship; - if (json && json[0] && json[0].data) { - ship = JournalUtils.shipFromLoadoutJSON(json[0].data); - } else if (json && json.modules) { - ship = CompanionApiUtils.shipFromJson(json); - } else if (json && json.Modules) { - ship = JournalUtils.shipFromLoadoutJSON(json); + let ship, importString; + if (json) { + if (json.length && json[0].data) { // SLEF + if (json.length > 1) { // Multiple builds, open modal + importString = data; + } else { // Single build, import directly + ship = JournalUtils.shipFromLoadoutJSON(json[0].data); + } + } else { // not SLEF + if (json.modules) { + ship = CompanionApiUtils.shipFromJson(json); + } else if (json.Modules) { + ship = JournalUtils.shipFromLoadoutJSON(json); + } + } + } + if (ship) { + r.params.ship = ship.id; + r.params.code = ship.toString(); + this._setPage(OutfittingPage, r); + } else if (importString) { + this._setPage(ShipyardPage, r); + this._showModal(); } - r.params.ship = ship.id; - r.params.code = ship.toString(); - this._setPage(OutfittingPage, r); } catch (err) { this._onError('Failed to import ship', r.path, 0, 0, err); } diff --git a/src/app/components/ModalImport.jsx b/src/app/components/ModalImport.jsx index 4dc34b7c..efb688fe 100644 --- a/src/app/components/ModalImport.jsx +++ b/src/app/components/ModalImport.jsx @@ -89,6 +89,7 @@ export default class ModalImport extends TranslatedComponent { static propTypes = { + importString: PropTypes.string, // Optional: Default data for import modal builds: PropTypes.object, // Optional: Import object }; @@ -107,7 +108,7 @@ export default class ModalImport extends TranslatedComponent { shipDiscount: null, moduleDiscount: null, errorMsg: null, - importString: null, + importString: props.importString || null, importValid: false, insurance: null }; From cf50537e3ddf5e87653cdafabf75d8eb16cb1c36 Mon Sep 17 00:00:00 2001 From: Felix Linker Date: Mon, 16 Nov 2020 23:27:24 +0100 Subject: [PATCH 32/66] Fix diminishing returns for alloys Closes #483 --- src/app/shipyard/Calculations.js | 140 ++++++++++++++----------------- 1 file changed, 62 insertions(+), 78 deletions(-) diff --git a/src/app/shipyard/Calculations.js b/src/app/shipyard/Calculations.js index 0be34d23..b237c028 100644 --- a/src/app/shipyard/Calculations.js +++ b/src/app/shipyard/Calculations.js @@ -356,9 +356,6 @@ export function shieldMetrics(ship, sys) { let boosterExplDmg = 1; let boosterKinDmg = 1; let boosterThermDmg = 1; - // const explDim = dimReturnLine(shieldGenerator.explres); - // const thermDim = dimReturnLine(shieldGenerator.thermres); - // const kinDim = dimReturnLine(shieldGenerator.kinres); for (let slot of ship.hardpoints) { if (slot.enabled && slot.m && slot.m.grp == 'sb') { boost += slot.m.getShieldBoost(); @@ -369,35 +366,14 @@ export function shieldMetrics(ship, sys) { boosterKinDmg = boosterKinDmg * (1 - slot.m.getKineticResistance()); boosterThermDmg = boosterThermDmg * (1 - slot.m.getThermalResistance()); } - if (slot.m && slot.m.grp == 'gsrp') { - - } } // Calculate diminishing returns for boosters // Diminishing returns not currently in-game // boost = Math.min(boost, (1 - Math.pow(Math.E, -0.7 * boost)) * 2.5); - // Remove base shield generator strength boost -= 1; - // if (res.expl > explDim) { - // const overage = (res.expl - explDim) * 0.5; - // res.expl = explDim + overage; - // boosterExplDmg = explDim + overage; - // } - // - // if (res.therm > thermDim) { - // const overage = (res.therm - thermDim) * 0.5; - // res.therm = thermDim + overage; - // boosterThermDmg = thermDim + overage; - // } - // - // if (res.kin > kinDim) { - // const overage = (res.kin - kinDim) * 0.5; - // res.kin = kinDim + overage; - // boosterKinDmg = kinDim + overage; - // } let shieldAddition = 0; if (ship) { for (const module of ship.internal) { @@ -499,7 +475,7 @@ export function shieldMetrics(ship, sys) { */ let sgExplosiveDmg = 1 - shieldGenerator.getExplosiveResistance(); - let sgSbExplosiveDmg = diminishDamageMult(sgExplosiveDmg * 0.7, (1 - shieldGenerator.getExplosiveResistance()) * boosterExplDmg); + let sgSbExplosiveDmg = diminishingReturnsShields(sgExplosiveDmg, sgExplosiveDmg * boosterExplDmg); /** @type {ShieldDamageMults} */ shield.explosive = { generator: sgExplosiveDmg, @@ -511,7 +487,7 @@ export function shieldMetrics(ship, sys) { }; let sgKineticDmg = 1 - shieldGenerator.getKineticResistance(); - let sgSbKineticDmg = diminishDamageMult(sgKineticDmg * 0.7, (1 - shieldGenerator.getKineticResistance()) * boosterKinDmg); + let sgSbKineticDmg = diminishingReturnsShields(sgKineticDmg, sgKineticDmg * boosterKinDmg); /** @type {ShieldDamageMults} */ shield.kinetic = { generator: sgKineticDmg, @@ -523,7 +499,7 @@ export function shieldMetrics(ship, sys) { }; let sgThermalDmg = 1 - shieldGenerator.getThermalResistance(); - let sgSbThermalDmg = diminishDamageMult(sgThermalDmg * 0.7, (1 - shieldGenerator.getThermalResistance()) * boosterThermDmg); + let sgSbThermalDmg = diminishingReturnsShields(sgThermalDmg , sgThermalDmg * boosterThermDmg); /** @type {ShieldDamageMults} */ shield.thermal = { generator: sgThermalDmg, @@ -563,16 +539,10 @@ export function armourMetrics(ship) { let moduleArmour = 0; let moduleProtection = 1; const bulkheads = ship.bulkheads.m; - let hullExplDmg = 1; - let hullKinDmg = 1; - let hullThermDmg = 1; - let hullCausDmg = 1; - // const dimReturnLine = (res) => 1 - (1 - res) * 0.7; - // let res = { - // kin: 0, - // therm: 0, - // expl: 0 - // }; + let hullExplDmgs = []; + let hullKinDmgs = []; + let hullThermDmgs = []; + let hullCausDmgs = []; // Armour from HRPs and module armour from MRPs for (let slot of ship.internal) { if (slot.m && slot.enabled && (slot.m.grp === 'hr' || slot.m.grp === 'ghrp' || slot.m.grp == 'mahr')) { @@ -582,10 +552,10 @@ export function armourMetrics(ship) { // res.expl += slot.m.getExplosiveResistance(); // res.kin += slot.m.getKineticResistance(); // res.therm += slot.m.getThermalResistance(); - hullExplDmg = hullExplDmg * (1 - slot.m.getExplosiveResistance()); - hullKinDmg = hullKinDmg * (1 - slot.m.getKineticResistance()); - hullThermDmg = hullThermDmg * (1 - slot.m.getThermalResistance()); - hullCausDmg = hullCausDmg * (1 - slot.m.getCausticResistance()); + hullExplDmgs.push(1 - slot.m.getExplosiveResistance()); + hullKinDmgs.push(1 - slot.m.getKineticResistance()); + hullThermDmgs.push(1 - slot.m.getThermalResistance()); + hullCausDmgs.push(1 - slot.m.getCausticResistance()); } if (slot.m && slot.enabled && (slot.m.grp == 'mrp' || slot.m.grp == 'gmrp')) { moduleArmour += slot.m.getIntegrity(); @@ -594,27 +564,6 @@ export function armourMetrics(ship) { } moduleProtection = 1 - moduleProtection; - // const explDim = dimReturnLine(bulkheads.explres); - // const thermDim = dimReturnLine(bulkheads.thermres); - // const kinDim = dimReturnLine(bulkheads.kinres); - // if (res.expl > explDim) { - // const overage = (res.expl - explDim) * 0.5; - // res.expl = explDim + overage; - // hullExplDmg = explDim + overage; - // } - // - // if (res.therm > thermDim) { - // const overage = (res.therm - thermDim) * 0.5; - // res.therm = thermDim + overage; - // hullThermDmg = thermDim + overage; - // } - // - // if (res.kin > kinDim) { - // const overage = (res.kin - kinDim) * 0.5; - // res.kin = kinDim + overage; - // hullKinDmg = kinDim + overage; - // } - const armour = { bulkheads: armourBulkheads, reinforcement: armourReinforcement, @@ -631,8 +580,8 @@ export function armourMetrics(ship) { total: 1 }; - let armourExplDmg = diminishDamageMult(0.7, 1 - ship.bulkheads.m.getExplosiveResistance()); - let armourReinforcedExplDmg = diminishDamageMult(0.7, (1 - ship.bulkheads.m.getExplosiveResistance()) * hullExplDmg); + let armourExplDmg = 1 - ship.bulkheads.m.getExplosiveResistance(); + let armourReinforcedExplDmg = diminishingReturnsArmour(armourExplDmg, ...hullExplDmgs); armour.explosive = { bulkheads: armourExplDmg, reinforcement: armourReinforcedExplDmg / armourExplDmg, @@ -640,8 +589,8 @@ export function armourMetrics(ship) { res: 1 - armourReinforcedExplDmg }; - let armourKinDmg = diminishDamageMult(0.7, 1 - ship.bulkheads.m.getKineticResistance()); - let armourReinforcedKinDmg = diminishDamageMult(0.7, (1 - ship.bulkheads.m.getKineticResistance()) * hullKinDmg); + let armourKinDmg = 1 - ship.bulkheads.m.getKineticResistance(); + let armourReinforcedKinDmg = diminishingReturnsArmour(armourKinDmg, ...hullKinDmgs); armour.kinetic = { bulkheads: armourKinDmg, reinforcement: armourReinforcedKinDmg / armourKinDmg, @@ -649,8 +598,8 @@ export function armourMetrics(ship) { res: 1 - armourReinforcedKinDmg }; - let armourThermDmg = diminishDamageMult(0.7, 1 - ship.bulkheads.m.getThermalResistance()); - let armourReinforcedThermDmg = diminishDamageMult(0.7, (1 - ship.bulkheads.m.getThermalResistance()) * hullThermDmg); + let armourThermDmg = 1 - ship.bulkheads.m.getThermalResistance(); + let armourReinforcedThermDmg = diminishingReturnsArmour(armourThermDmg, ...hullThermDmgs); armour.thermal = { bulkheads: armourThermDmg, reinforcement: armourReinforcedThermDmg / armourThermDmg, @@ -658,8 +607,8 @@ export function armourMetrics(ship) { res: 1 - armourReinforcedThermDmg }; - let armourCausDmg = diminishDamageMult(0.7, 1 - ship.bulkheads.m.getCausticResistance()); - let armourReinforcedCausDmg = diminishDamageMult(0.7, (1 - ship.bulkheads.m.getCausticResistance()) * hullCausDmg); + let armourCausDmg = 1 - ship.bulkheads.m.getCausticResistance(); + let armourReinforcedCausDmg = diminishingReturnsArmour(armourCausDmg, ...hullCausDmgs); armour.caustic = { bulkheads: armourCausDmg, reinforcement: armourReinforcedCausDmg / armourCausDmg, @@ -1048,15 +997,50 @@ export function timeToDeplete(amount, dps, eps, capacity, recharge) { } /** - * Applies diminishing returns to resistances. - * @param {number} diminishFrom The base resistance up to which no diminishing returns are applied. - * @param {number} damageMult Resistance as damage multiplier - * @returns {number} Actual damage multiplier + * Checks whether diminishing returns should be applied to shield damage + * multipliers and does so if necessary. + * @param {number} shieldMult Damage multiplier of shield generator + * @param {number} combinedMult Damage multiplier of shields and shield boosters + * @returns {number} Overall damage multiplier */ -export function diminishDamageMult(diminishFrom, damageMult) { - if (damageMult > diminishFrom) { - return damageMult; +export function diminishingReturnsShields(shieldMult, combinedMult) { + let max = shieldMult * 0.7; + if (combinedMult < max) { + return mapIntoDiminishingRange(max / 2, max, combinedMult); } else { - return (diminishFrom / 2) + 0.5 * damageMult; + return combinedMult; } } + +/** + * Checks whether diminishing returns should be applied to armour damage + * multipliers and does so if necessary. + * @param {...any} mults Damage multipliers of alloys and hull reinforcement + * packages + * @returns {number} Overall damage multiplier + */ +export function diminishingReturnsArmour(...mults) { + let max = Math.min(0.7, ...mults); + let combined = mults.reduce((aggr, v) => aggr * v); + let diminished = mapIntoDiminishingRange(0.35, max, combined); + if (diminished < 0.7) { + return diminished; + } else { + return combined; + } +} + +/** + * Applies diminishing returns to a damage multiplier. Effictively, the range + * [`0`, `max`]` is mapped into the range [`min`, `max`] for the value `now`. + * It can also happen, that `now` is outside of the range [`min`, `max`], then + * `now` is actually improved, i.e. enlarged. + * @param {number} min Best theoretical damage multiplier + * @param {number} max Damage multiplier from which diminishing returns start to + * be applied + * @param {number} now The current damage multiplier + * @returns {number} Remapped damage multiplier + */ +export function mapIntoDiminishingRange(min, max, now) { + return min + (max - min) * (now / max); +} From 49c827b2c8b9d5d61e9ab06bccdf7b0224cb52b0 Mon Sep 17 00:00:00 2001 From: "yevhenii.chubar" Date: Tue, 29 Dec 2020 17:47:10 +0200 Subject: [PATCH 33/66] Corrected calculations of modification values --- src/app/shipyard/Module.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/app/shipyard/Module.js b/src/app/shipyard/Module.js index fc702603..6b90c6b1 100755 --- a/src/app/shipyard/Module.js +++ b/src/app/shipyard/Module.js @@ -1,7 +1,8 @@ import * as ModuleUtils from './ModuleUtils'; import { Modifications } from 'coriolis-data/dist'; import React from 'react'; -import { STATS_FORMATTING, SI_PREFIXES } from './StatsFormatting'; +import { SI_PREFIXES, STATS_FORMATTING } from './StatsFormatting'; +import { includes } from 'lodash'; /** * Module - active module in a ship's buildout @@ -41,8 +42,7 @@ export default class Module { * @return {object} The value of the modification. If it is a numeric value then it is returned as an integer value scaled so that 1.23% == 123 */ getModValue(name, raw) { - let baseVal = this[name]; - let result = this.mods && this.mods[name] ? this.mods[name] : null; + let result = this.mods && this.mods[name] ? this.mods[name] : null; if ((!raw) && this.blueprint && this.blueprint.special) { // This module has a special effect, see if we need to alter our returned value @@ -51,7 +51,8 @@ export default class Module { // this special effect modifies our returned value const modification = Modifications.modifications[name]; const multiplier = modification.type === 'percentage' ? 10000 : 100; - if (name === 'explres' || name === 'kinres' || name === 'thermres' || name === 'causres') { + + if (includes(['explres', 'kinres', 'thermres', 'causres'], name)) { // Apply resistance modding mechanisms to special effects subsequently result = result + modifierActions[name] * (1 - (this[name] + result / multiplier)) * 100; } else if (modification.method === 'additive') { @@ -59,7 +60,7 @@ export default class Module { } else if (modification.method === 'overwrite') { result = modifierActions[name]; } else { - result = (((1 + result / multiplier) * (1 + modifierActions[name])) - 1) * multiplier; + result = result + modifierActions[name] * multiplier; } } } From 2bb55d2c3613a3422e6c63f6131c9cbef29821cb Mon Sep 17 00:00:00 2001 From: Felix Linker Date: Wed, 6 Jan 2021 12:11:44 +0100 Subject: [PATCH 34/66] Remove donation references --- src/app/pages/AboutPage.jsx | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/app/pages/AboutPage.jsx b/src/app/pages/AboutPage.jsx index 3d2e8f86..b5a01afa 100644 --- a/src/app/pages/AboutPage.jsx +++ b/src/app/pages/AboutPage.jsx @@ -94,18 +94,6 @@ export default class AboutPage extends Page { .

- -

Supporting Coriolis

-

- Coriolis is an open source project, and I work on it in my free time. - I have set up a patreon at{' '} - - patreon.com/coriolis_elite - - , which will be used to keep Coriolis up to date and the servers - running. -

-
); } From 8d9581900fde2d045f7a732ce4b819172001607c Mon Sep 17 00:00:00 2001 From: Ben Zarzycki Date: Wed, 20 Jan 2021 00:05:45 -0800 Subject: [PATCH 35/66] Remove dead code --- src/app/shipyard/Calculations.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/app/shipyard/Calculations.js b/src/app/shipyard/Calculations.js index b237c028..0b9873ff 100644 --- a/src/app/shipyard/Calculations.js +++ b/src/app/shipyard/Calculations.js @@ -341,16 +341,10 @@ export function shieldMetrics(ship, sys) { const maxSysResistance = this.sysResistance(4); let shield = {}; - const dimReturnLine = (res) => 1 - (1 - res) * 0.7; const shieldGeneratorSlot = ship.findInternalByGroup('sg'); if (shieldGeneratorSlot && shieldGeneratorSlot.enabled && shieldGeneratorSlot.m) { const shieldGenerator = shieldGeneratorSlot.m; - let res = { - kin: shieldGenerator.kinres, - therm: shieldGenerator.thermres, - expl: shieldGenerator.explres - }; // Boosters let boost = 1; let boosterExplDmg = 1; @@ -359,9 +353,6 @@ export function shieldMetrics(ship, sys) { for (let slot of ship.hardpoints) { if (slot.enabled && slot.m && slot.m.grp == 'sb') { boost += slot.m.getShieldBoost(); - res.expl += slot.m.getExplosiveResistance(); - res.kin += slot.m.getKineticResistance(); - res.therm += slot.m.getThermalResistance(); boosterExplDmg = boosterExplDmg * (1 - slot.m.getExplosiveResistance()); boosterKinDmg = boosterKinDmg * (1 - slot.m.getKineticResistance()); boosterThermDmg = boosterThermDmg * (1 - slot.m.getThermalResistance()); @@ -549,9 +540,6 @@ export function armourMetrics(ship) { armourReinforcement += slot.m.getHullReinforcement(); // Hull boost for HRPs is applied against the ship's base armour armourReinforcement += ship.baseArmour * slot.m.getModValue('hullboost') / 10000; - // res.expl += slot.m.getExplosiveResistance(); - // res.kin += slot.m.getKineticResistance(); - // res.therm += slot.m.getThermalResistance(); hullExplDmgs.push(1 - slot.m.getExplosiveResistance()); hullKinDmgs.push(1 - slot.m.getKineticResistance()); hullThermDmgs.push(1 - slot.m.getThermalResistance()); From 1db6fe1a3419c275a6a1aa5da576e0bc27c2d8c2 Mon Sep 17 00:00:00 2001 From: VAKazakov <47143965+VAKazakov@users.noreply.github.com> Date: Mon, 25 Jan 2021 21:41:32 +0300 Subject: [PATCH 36/66] Some l18n additions guardians and mining rows addition courtesy of LightEvil --- src/app/i18n/ru.json | 846 +++++++++++++++++++++++-------------------- 1 file changed, 463 insertions(+), 383 deletions(-) diff --git a/src/app/i18n/ru.json b/src/app/i18n/ru.json index 34850dfe..114aa636 100644 --- a/src/app/i18n/ru.json +++ b/src/app/i18n/ru.json @@ -1,384 +1,464 @@ { - "PHRASE_ALT_ALL": "Alt + Нажатие для заполнения всех слотов", - "PHRASE_BACKUP_DESC": "Сохраните все данные перед переносом в другой браузер или устройство", - "PHRASE_CONFIRMATION": "Вы уверены?", - "PHRASE_EXPORT_DESC": "Детальный JSON-экспорт вашей сборки для использования в других местах и инструментах", - "PHRASE_FASTEST_RANGE": "Последовательные прыжки максимальной дальности", - "PHRASE_IMPORT": "Для импорта вставьте код в эту форму", - "PHRASE_LADEN": "Масса корабля с учётом топлива и грузов", - "PHRASE_NO_BUILDS": "Нечего сравнивать", - "PHRASE_NO_RETROCH": "Нет ранних версий сборки", - "PHRASE_SELECT_BUILDS": "Выберите конфигурацию для сравнения", - "PHRASE_SG_RECHARGE": "Восстановление с 50% до 100% объема щита, учитывая полный аккумулятор СИС в начале", - "PHRASE_SG_RECOVER": "Восстановление с 0% до 50% объема щита, учитывая полный аккумулятор СИС в начале", - "PHRASE_UNLADEN": "Масса корабля без учета топлива и грузов", - "PHRASE_UPDATE_RDY": "Доступна новая версия. Нажмите для обновления.", - "PHRASE_ENGAGEMENT_RANGE": "Дистанция между кораблём и целью", - "PHRASE_SELECT_BLUEPRINT": "Нажмите чтобы выбрать чертёж", - "PHRASE_BLUEPRINT_WORST": "Худшие основные значения для чертежа", - "PHRASE_BLUEPRINT_RANDOM": "Случайный выбор между худшими и лучшими значениями для этого чертежа", - "PHRASE_BLUEPRINT_BEST": "Лучшие основные значения для чертежа", - "PHRASE_BLUEPRINT_EXTREME": "Лучшие положительные и худшие отрицательные основные значения для чертежа", - "PHRASE_BLUEPRINT_RESET": "Убрать все изменения и чертёж", - "PHRASE_SELECT_SPECIAL": "Нажмите, чтобы выбрать экспериментальный эффект", - "PHRASE_NO_SPECIAL": "Без экспериментального эффекта", - "PHRASE_SHOPPING_LIST": "Станции, что продают эту сборку", - "PHRASE_REFIT_SHOPPING_LIST": "Станции, что продают необходимые модули", - "PHRASE_TOTAL_EFFECTIVE_SHIELD": "Общий урон, что может быть нанесён в каждым типе, если используются все щитонакопители", - "PHRASE_TIME_TO_LOSE_SHIELDS": "Щиты продержатся", - "PHRASE_TIME_TO_RECOVER_SHIELDS": "Щиты восстановятся за", - "PHRASE_TIME_TO_RECHARGE_SHIELDS": "Щиты будут заряжены за", - "PHRASE_SHIELD_SOURCES": "Подробности энергии щита", - "PHRASE_EFFECTIVE_SHIELD": "Эффективная сила щита против разных типов урона", - "PHRASE_ARMOUR_SOURCES": "Подробности состава брони", - "PHRASE_EFFECTIVE_ARMOUR": "Эффективная сила брони против разных типов урона", - "PHRASE_DAMAGE_TAKEN": "% общих повреждений полученных в разных типах урона", - "PHRASE_TIME_TO_LOSE_ARMOUR": "Броня продержится", - "PHRASE_MODULE_PROTECTION_EXTERNAL": "Защита гнёзд", - "PHRASE_MODULE_PROTECTION_INTERNAL": "Защита всех остальных модулей", - "PHRASE_SHIELD_DAMAGE": "Подробности источников поддерживаемого ДПС против щитов", - "PHRASE_ARMOUR_DAMAGE": "Подробности источников поддерживаемого ДПС против брони", - "PHRASE_TIME_TO_REMOVE_SHIELDS": "Снимет щиты за", - "TT_TIME_TO_REMOVE_SHIELDS": "Непрерывным огнём из всех орудий", - "PHRASE_TIME_TO_REMOVE_ARMOUR": "Снимет броню за", - "TT_TIME_TO_REMOVE_ARMOUR": "Непрерывным огнём из всех орудий", - "PHRASE_TIME_TO_DRAIN_WEP": "Опустошит ОРУЖ за", - "TT_TIME_TO_DRAIN_WEP": "Время, за которое опустошится аккумулятор ОРУЖ при стрельбе из всех орудий", - "TT_TIME_TO_LOSE_SHIELDS": "Против поддерживаемой стрельбы из всех орудий противника", - "TT_TIME_TO_LOSE_ARMOUR": "Против поддерживаемой стрельбы из всех орудий противника", - "TT_MODULE_ARMOUR": "Броня, защищающая модули от урона", - "TT_MODULE_PROTECTION_EXTERNAL": "Процент урона, перенаправленного от гнёзд на наборы для усиления модулей", - "TT_MODULE_PROTECTION_INTERNAL": "Процент урона, перенаправленного от модулей вне гнёзд на наборы для усиления модулей", - "TT_EFFECTIVE_SDPS_SHIELDS": "Реальный поддерживаемый ДПС пока аккумулятор ОРУЖ не пуст", - "TT_EFFECTIVENESS_SHIELDS": "Эффективность в сравнении с попаданием по цели с 0-сопротивляемостью без пунктов в СИС на 0 метрах", - "TT_EFFECTIVE_SDPS_ARMOUR": "Реальный поддерживаемый ДПС пока аккумулятор ОРУЖ не пуст", - "TT_EFFECTIVENESS_ARMOUR": "Эффективность в сравнении с попаданием по цели с 0-сопротивляемостью на 0 метрах", - "PHRASE_EFFECTIVE_SDPS_SHIELDS": "ПДПС против щитов", - "PHRASE_EFFECTIVE_SDPS_ARMOUR": "ПДПС против брони", - "TT_SUMMARY_SPEED": "С полным топливным баком и 4 пунктами в ДВИ", - "TT_SUMMARY_SPEED_NONFUNCTIONAL": "Маневровые двигатели выключены или превышена максимальная масса с топливом и грузом", - "TT_SUMMARY_BOOST": "С полным топливным баком и 4 пунктами в ДВИ", - "TT_SUMMARY_BOOST_NONFUNCTIONAL": "Распределитель питания не может обеспечить достаточно энергии для форсажа", - "TT_SUMMARY_SHIELDS": "Чистая сила щита, включая усилители", - "TT_SUMMARY_SHIELDS_NONFUNCTIONAL": "Шитогенератор отсутствует или выключен", - "TT_SUMMARY_INTEGRITY": "Целостность корабля, включая переборки и наборы для усиления корпуса", - "TT_SUMMARY_HULL_MASS": "Масса корпуса без каких-либо модулей", - "TT_SUMMARY_UNLADEN_MASS": "Масса корпуса и модулей без топлива и груза", - "TT_SUMMARY_LADEN_MASS": "Масса корпуса и модулей с топливом и грузом", - "TT_SUMMARY_DPS": "Урон в секунду при стрельбе из всех орудий", - "TT_SUMMARY_EPS": "Расход аккумулятора ОРУЖ в секунду при стрельбе из всех орудий", - "TT_SUMMARY_TTD": "Время расхода аккумулятора ОРУЖ при стрельбе из всех орудий и с 4 пунктами в ОРУЖ", - "TT_SUMMARY_MAX_SINGLE_JUMP": "Самый дальний возможный прыжок без груза и с топливом, достаточным только на сам прыжок", - "TT_SUMMARY_UNLADEN_SINGLE_JUMP": "Самый дальний возможный прыжок без груза и с полным топливным баком", - "TT_SUMMARY_LADEN_SINGLE_JUMP": "Самый дальний возможный прыжок с полным грузовым отсеком и с полным топливным баком", - "TT_SUMMARY_UNLADEN_TOTAL_JUMP": "Самая дальняя общая дистанция без груза, с полным топливным баком и при прыжках на максимальное расстояние", - "TT_SUMMARY_LADEN_TOTAL_JUMP": "Самая дальняя общая дистанция с полным грузовым отсеком, с полным топливным баком и при прыжках на максимальное расстояние", - "HELP_MODIFICATIONS_MENU": "Нажмите на номер, чтобы ввести новое значение, или потяните вдоль полосы для малых изменений", - "am": "Блок Автом. Полевого Ремонта", - "bh": "Переборки", - "bl": "Пучковый лазер", - "bsg": "Двухпоточный щитогенератор", - "c": "Орудие", - "cc": "Контроллер магнитного снаряда для сбора", - "ch": "Разбрасыватель дипольных отражателей", - "cr": "Грузовой стеллаж", - "cs": "Сканер содержимого", - "dc": "Стыковочный компьютер", - "ec": "Электр. противодействие", - "fc": "Залповое орудие", - "fh": "Ангар для истребителя", - "fi": "FSD-перехватчик", - "fs": "Топливозаборник", - "fsd": "Рамочно-сместительный двигатель", - "ft": "Топливный бак", - "fx": "Контроллер магнитного снаряда для топлива", - "hb": "Контроллер магнитного снаряда для взлома трюма", - "hr": "Набор для усиления корпуса", - "hs": "Теплоотводная катапульта", - "kw": "Сканер преступников", - "ls": "Система жизнеобеспечения", - "mc": "Многоствольное орудие", - "ml": "Проходочный лазер", - "mr": "Ракетный лоток", - "mrp": "Набор для усиления модуля", - "nl": "Мины", - "pa": "Ускоритель плазмы", - "pas": "Комплект для сближения с планетой", - "pc": "Контроллер магнитного снаряда для геологоразведки", - "pce": "Каюта пассажира эконом-класса", - "pci": "Каюта пассажира бизнес-класса", - "pcm": "Каюта пассажира первого класса", - "pcq": "Каюта пассажира класса люкс", - "pd": "Распределитель питания", - "pl": "Импульсный лазер", - "po": "Точечная оборона", - "pp": "Силовая установка", - "psg": "Призматический щитогенератор", - "pv": "Гараж для планетарного транспорта", - "rf": "Устройство переработки", - "rg": "Электромагнитная пушка", - "s": "Сенсоры", - "sb": "Усилитель щита", - "sc": "Сканер обнаружения", - "scb": "Щитонакопитель", - "sg": "Щитогенератор", - "ss": "Сканер поверхностей", - "t": "Маневровые двигатели", - "tp": "Торпедная стойка", - "ul": "Пульсирующие лазеры", - "ws": "Сканер следа FSD", - "emptyrestricted": "пусто (ограниченно)", - "damage dealt to": "Урон нанесён", - "damage received from": "Урон получен от", - "against shields": "Против щитов", - "against hull": "Против корпуса", - "total effective shield": "Общие эффективные щиты", - "ammunition": "Припасы", - "secs": "с", - "rebuildsperbay": "Построек за полосу", - "worst": "Худшее", - "average": "Среднее", - "random": "Случайное", - "best": "Лучшее", - "extreme": "Экстремальное", - "reset": "Сброс", - "dpe": "Урон на МДж энергии", - "dps": "Урон в Секунду", - "sdps": "Поддерживаемый урон в секунду", - "dpssdps": "Урон в секунду (поддерживаемый урон в секунду)", - "eps": "Энергия в секунду", - "epsseps": "Энергия в секунду (поддерживаемая энергия в секунду)", - "hps": "Нагрев в секунду", - "hpsshps": "Нагрев в секунду (поддерживаемый нагрев в секунду)", - "damage by": "Урон", - "damage from": "Урон от", - "shield cells": "Щитонакопители", - "recovery": "включение", - "recharge": "перезарядка", - "engine pips": "Пункты в двигателе", - "4b": "4 пункта и Форсаж", - "speed": "скорость", - "pitch": "Тангаж", - "roll": "Крен", - "yaw": "Рыскание", - "internal protection": "Внутренняя защита", - "external protection": "Внешняя защита", - "engagement range": "Боевое расстояние", - "total": "Всего", - "ammo": "Макс. боекомплект", - "boot": "Время загрузки", - "brokenregen": "Скорость восстановления при пробое", - "burst": "Длина очереди", - "burstrof": "Скорострельность очереди", - "clip": "Размер боекомплекта", - "damage": "Урон", - "distdraw": "Тяга распределителя", - "duration": "Продолжительность", - "eff": "Эффективность", - "engcap": "Ресурс двигателей", - "engrate": "Перезарядка двигателей", - "explres": "Сопротивление взрывам", - "facinglimit": "Ограничение по направлению", - "hullboost": "Увеличение корпуса", - "hullreinforcement": "Укрепление корпуса", - "integrity": "Целостность", - "jitter": "Дрожание", - "kinres": "Сопротивление кинетическому урону", - "maxfuel": "Макс. топлива на прыжок", - "mass": "Масса", - "optmass": "Оптимизированная масса", - "optmul": "Оптимальный усилитель", - "pgen": "Мощность", - "piercing": "Бронебойность", - "power": "Мощность", - "protection": "Защита от повреждений", - "range": "Дальность", - "ranget": "Дальность", - "regen": "Скорость восстановления", - "reload": "Перезагрузить", - "rof": "Скорострельность", - "angle": "Угол сканера", - "scanrate": "Скорость сканера", - "scantime": "Время сканирования", - "shield": "Щит", - "shieldboost": "Усиление щитов", - "shieldreinforcement": "Усилитель щита", - "shotspeed": "Скорость выстрела", - "spinup": "Время раскрутки", - "syscap": "Ресурс систем", - "sysrate": "Перезарядка систем", - "thermload": "Тепловая нагрузка", - "thermres": "Сопротивление термическому урону", - "wepcap": "Орудийный ресурс", - "weprate": "Перезарядка оружия", - "minmass_sg": "Мин. масса корпуса", - "optmass_sg": "Опт. масса корпуса", - "maxmass_sg": "Макс. масса корпуса", - "minmul_sg": "Минимальная прочность", - "optmul_sg": "Оптимальная прочность", - "maxmul_sg": "Максимальная прочность", - "minmass_psg": "Мин. масса корпуса", - "optmass_psg": "Опт. масса корпуса", - "maxmass_psg": "Макс. масса корпуса", - "minmul_psg": "Минимальная прочность", - "optmul_psg": "Оптимальная прочность", - "maxmul_psg": "Максимальная прочность", - "minmass_bsg": "Мин. масса корпуса", - "optmass_bsg": "Опт. масса корпуса", - "maxmass_bsg": "Макс. масса корпуса", - "minmul_bsg": "Минимальная прочность", - "optmul_bsg": "Оптимальная прочность", - "maxmul_bsg": "Максимальная прочность", - "range_s": "Типовой диапозон выброса", - "absolute": "Общий", - "explosive": "Взрывч.", - "kinetic": "Механич.", - "thermal": "Тепл.", - "generator": "Генератор", - "boosters": "Усилители", - "cells": "Ячейки", - "bulkheads": "Переборки", - "reinforcement": "Усилители", - "power and costs": "Энергия и стоимость", - "costs": "Расходы", - "retrofit costs": "цена модификации", - "reload costs": "Стоимость перезарядки", - "profiles": "Графики", - "engine profile": "Двигатели", - "fsd profile": "FSD", - "movement profile": "Движение", - "damage to opponent's shields": "Урон щиту противника", - "damage to opponent's hull": "Урон корпусу противника", - "offence": "Нападение", - "defence": "Оборона", - "shield metrics": "Данные щита", - "raw shield strength": "Чистая мощность щита", - "shield sources": "Ресурсы щита", - "damage taken": "Полученный урон", - "effective shield": "Эффективный щит", - "armour metrics": "Данные брони", - "raw armour strength": "Чистая мощность брони", - "armour sources": "Ресурсы брони", - "raw module armour": "Чистая броня модулей", - "effective armour": "Эффективная броня", - "offence metrics": "Данные нападения", - "defence metrics": "Данные обороны", - "fuel carried": "Топливо на борту", - "cargo carried": "Груз на борту", - "ship control": "Управление кораблём", - "opponent": "Противник", - "opponent's shields": "Щит противника", - "opponent's armour": "Броня противника", - "shield damage sources": "источники урона по щиту", - "armour damage sources": "источники урона по броне", - "never": "Никогда", - "stock": "базовый", - "boost": "форсаж", - "/s": "/с", - "m/s": "м/с", - "Ls": "Св.сек", - "LY": "Св.лет", - "CR": "кр.", - "S": "M", - "M": "С", - "L": "б", - "H": "O", - "U": "B", - "small": "Малый", - "medium": "Средний", - "large": "большой", - "alpha": "Альфа", - "beta": "Бета", - "standard": "Стандартный", - "build name": "название сборки", - "compare all": "сравнить все", - "create new": "Создать новый", - "damage per second": "урон в секунду", - "delete all": "Удалить все", - "detailed export": "Подробный экспорт", - "edit data": "Редактирование", - "empty all": "пусто все", - "Enter Name": "Введите имя", - "farthest range": "быстрый диапазон", - "fuel level": "уровень топлива", - "full tank": "Полный бак", - "internal compartments": "внутренние отсеки", - "jump range": "Дальность прыжка", - "mass lock factor": "Масс. блок", - "max mass": "Максимальная масса", - "net cost": "разница в цене", - "none created": "не создано", - "refuel time": "Время дозаправки", - "retrofit from": "модификация от", - "T-Load": "Тепл.", - "utility mounts": "Вспомогательное оборудование", - "about": "О ...", - "action": "Действие", - "added": "Добавлено", - "armour": "Броня", - "available": "доступно", - "backup": "Резервная копия", - "bins": "контейнеры", - "build": "cборка", - "builds": "cборки", - "buy": "купить", - "cancel": "отменить", - "cargo": "Груз", - "close": "закрыть", - "compare": "сравнить ", - "comparison": "сравнение", - "comparisons": "сравнения", - "cost": "Стоимость", - "create": "создать", - "credits": "Кредиты", - "delete": "Удалить", - "dep": "Вып", - "deployed": "Открыты", - "disabled": "Отключено", - "discount": "Скидка", - "DPS": "УВС", - "efficiency": "Эффективность", - "empty": "пусто", - "ENG": "ДВИ", - "export": "Экспорт", - "forum": "Форум", - "fuel": "Топливо", - "hardpoints": "Орудийные порты", - "hull": "Корпус", - "import": "импортировать ", - "insurance": "Страховка", - "jumps": "Прыжков", - "laden": "Груженый", - "language": "Язык", - "maneuverability": "Маневренность", - "max": "Макс", - "no": "Нет", - "pen": "ПБ", - "permalink": "Постоянная ссылка", - "pri": "Осн", - "proceed": "продолжить", - "PWR": "Эн", - "rate": "скорость", - "rename": "Переименовать", - "repair": "Починка", - "ret": "Убр.", - "retracted": "Убрано", - "ROF": "В/сек", - "save": "Сохранить", - "sell": "Продать", - "settings": "Настройки", - "shields": "Щиты", - "ship": "Корабль", - "ships": "Корабли", - "shortened": "Укороченный", - "size": "размер", - "skip": "пропустить", - "Stock": "Стандартная комплектация", - "SYS": "СИС", - "time": "Время", - "type": "Тип", - "unladen": "Пустой", - "URL": "Ссылка", - "WEP": "ОРУЖ", - "yes": "Да" -} +"PHRASE_ALT_ALL":"Alt + ", +"PHRASE_BACKUP_DESC":" ", +"PHRASE_CONFIRMATION":" ?", +"PHRASE_EXPORT_DESC":" JSON- ", +"PHRASE_FASTEST_RANGE":" ", +"PHRASE_IMPORT":" ", +"PHRASE_LADEN":" ", +"PHRASE_NO_BUILDS":" ", +"PHRASE_NO_RETROCH":" ", +"PHRASE_SELECT_BUILDS":" ", +"PHRASE_SG_RECHARGE":" 50% 100% , ", +"PHRASE_SG_RECOVER":" 0% 50% , ", +"PHRASE_UNLADEN":" ", +"PHRASE_UPDATE_RDY":" . .", +"PHRASE_ENGAGEMENT_RANGE":" ", +"PHRASE_SELECT_BLUEPRINT":" ", +"PHRASE_BLUEPRINT_WORST":" ", +"PHRASE_BLUEPRINT_FIFTY":"50% ", +"PHRASE_BLUEPRINT_SEVEN_FIVE":"75% ", +"PHRASE_BLUEPRINT_RANDOM":" ", +"PHRASE_BLUEPRINT_BEST":" ", +"PHRASE_BLUEPRINT_EXTREME":" ", +"PHRASE_BLUEPRINT_RESET":" ", +"PHRASE_SELECT_SPECIAL":", ", +"PHRASE_NO_SPECIAL":" ", +"PHRASE_SHOPPING_LIST":", ", +"PHRASE_SHOPPING_MATS":" ", +"PHRASE_REFIT_SHOPPING_LIST":", ", +"PHRASE_TOTAL_EFFECTIVE_SHIELD":" , , ", +"PHRASE_TIME_TO_LOSE_SHIELDS":" ", +"PHRASE_TIME_TO_RECOVER_SHIELDS":" ", +"PHRASE_TIME_TO_RECHARGE_SHIELDS":" ", +"PHRASE_SHIELD_SOURCES":" ", +"PHRASE_EFFECTIVE_SHIELD":" ", +"PHRASE_ARMOUR_SOURCES":" ", +"PHRASE_EFFECTIVE_ARMOUR":" ", +"PHRASE_DAMAGE_TAKEN":"% ", +"PHRASE_TIME_TO_LOSE_ARMOUR":" ", +"PHRASE_MODULE_PROTECTION_EXTERNAL":" ", +"PHRASE_MODULE_PROTECTION_INTERNAL":" ", +"PHRASE_OVERALL_DAMAGE":" ", +"PHRASE_SHIELD_DAMAGE":" ", +"PHRASE_ARMOUR_DAMAGE":" ", +"PHRASE_TIME_TO_REMOVE_SHIELDS":" ", +"PHRASE_MULTI_CREW_CAPACITOR_POINTS":" .", +"TT_TIME_TO_REMOVE_SHIELDS":" ", +"PHRASE_TIME_TO_REMOVE_ARMOUR":" ", +"TT_TIME_TO_REMOVE_ARMOUR":" ", +"PHRASE_TIME_TO_DRAIN_WEP":" ", +"TT_TIME_TO_DRAIN_WEP":", ", +"TT_TIME_TO_LOSE_SHIELDS":" ", +"TT_TIME_TO_LOSE_ARMOUR":" ", +"TT_MODULE_ARMOUR":", ", +"TT_MODULE_PROTECTION_EXTERNAL":" , ", +"TT_MODULE_PROTECTION_INTERNAL":" , ", +"TT_EFFECTIVE_SDPS_SHIELDS":" ", +"TT_EFFECTIVENESS_SHIELDS":" 0- 0 ", +"TT_EFFECTIVE_SDPS_ARMOUR":" ", +"TT_EFFECTIVENESS_ARMOUR":" 0- 0 ", +"PHRASE_EFFECTIVE_SDPS_SHIELDS":" ", +"PHRASE_EFFECTIVE_SDPS_ARMOUR":" ", +"TT_SUMMARY_SPEED":" 4 ", +"TT_SUMMARY_SPEED_NONFUNCTIONAL":" ", +"TT_SUMMARY_BOOST":" 4 ", +"TT_SUMMARY_BOOST_INTERVAL":" 4 ", +"TT_SUMMARY_BOOST_NONFUNCTIONAL":" ", +"TT_SUMMARY_SHIELDS":" , ", +"TT_SUMMARY_SHIELDS_SCB":" , SCB", +"TT_SUMMARY_SHIELDS_NONFUNCTIONAL":" ", +"TT_SUMMARY_INTEGRITY":" , ", +"TT_SUMMARY_HULL_MASS":" - ", +"TT_SUMMARY_UNLADEN_MASS":" ", +"TT_SUMMARY_LADEN_MASS":" ", +"TT_SUMMARY_DPS":" ", +"TT_SUMMARY_EPS":" ", +"TT_SUMMARY_TTD":" 4 ", +"TT_SUMMARY_MAX_SINGLE_JUMP":" , ", +"TT_SUMMARY_UNLADEN_SINGLE_JUMP":" ", +"TT_SUMMARY_LADEN_SINGLE_JUMP":" ", +"TT_SUMMARY_UNLADEN_TOTAL_JUMP":" , ", +"TT_SUMMARY_LADEN_TOTAL_JUMP":" , ", +"HELP_MODIFICATIONS_MENU":" , , ", +"PHRASE_FAIL_EDENGINEER":" EDEngineer ( EDEngineer , API , ).", +"PHRASE_FIREFOX_EDENGINEER":" EDEngineer Firefox. , Google Chrome.", +"am":" . ", +"bh":"", +"bl":" ", +"bsg":" ", +"c":"", +"causres":"Caustic resistance", +"cc":" ", +"ch":" ", +"cr":" ", +"cs":" ", +"dc":" ", +"ec":". ", +"fc":" ", +"fh":" ", +"fi":"FSD-", +"fs":"", +"fsd":"- ", +"ft":" ", +"fx":" ", +"hb":" ", +"hr":" ", +"hs":" ", +"kw":" ", +"ls":" ", +"mc":" ", +"axmc":" ", +"ml":" ", +"mr":" ", +"axmr":" ", +"mrp":" ", +"nl":"", +"pa":" ", +"pas":" ", +"pc":" ", +"pce":" -", +"passenger capacity":" ", +"pci":" -", +"pcm":" ", +"pcq":" ", +"pd":" ", +"pl":" ", +"po":" ", +"pp":" ", +"gpp":" C", +"gpd":" ", +"gpc":" ", +"ggc":" ", +"gsrp":" ", +"gfsb":" FSD ", +"ghrp":" ", +"gmrp":" ", +"pwa":" ", +"abl":" ", +"scl":" ", +"sdm":" ", +"tbsc":" ", +"gsc":" ", +"psg":" ", +"pv":" ", +"rf":" ", +"rfl":" ( )", +"rg":" ", +"rsl":"-", +"s":"", +"sb":" ", +"sc":" ", +"scb":"", +"sfn":" ", +"sg":"", +"ss":" ", +"sua":" ", +"t":" ", +"tp":" ", +"ul":" ", +"Send To EDEngineer":" EDEngineer", +"ws":" FSD", +"rpl":"-", +"rcpl":"-", +"xs":" ", +"tbem":" ", +"tbrfl":" ", +"dtl":"-", +"mahr":" ", +"emptyrestricted":" ()", +"damage dealt to":" ", +"damage received from":" ", +"against shields":" ", +"against hull":" ", +"total effective shield":" ", +"ammunition":"", +"secs":"", +"rebuildsperbay":" ", +"mroll":"Roll", +"worst":"", +"average":"", +"random":"", +"best":"", +"extreme":"", +"reset":"", +"dpe":" ", +"dps":" ", +"sdps":" ", +"dpssdps":" ( )", +"eps":" ", +"epsseps":" ( )", +"fallofffromrange":"", +"hps":" ", +"hpsshps":" ( )", +"damage by":"", +"damage from":" ", +"shield cells":"", +"recovery":"", +"recharge":"", +"engine pips":" ", +"4b":"4 ", +"speed":"", +"pitch":"", +"roll":"", +"yaw":"", +"internal protection":" ", +"external protection":" ", +"engagement range":" ", +"boost interval":" ", +"total":"", +"ammo":". ", +"boot":" ", +"hacktime":" ", +"brokenregen":" ", +"burst":" ", +"burstrof":" ", +"clip":" ", +"damage":"", +"distdraw":" ", +"duration":"", +"eff":"", +"engcap":" ", +"engrate":" ", +"explres":" ", +"facinglimit":" ", +"hullboost":" ", +"hullreinforcement":" ", +"integrity":"", +"jitter":"", +"kinres":" ", +"maxfuel":". ", +"mass":"", +"optmass":" ", +"optmul":" ", +"pgen":"", +"piercing":"", +"power":"", +"protection":" ", +"range":"", +"ranget":"", +"regen":" ", +"reload":"", +"rof":"", +"angle":" ", +"scanrate":" ", +"proberadius":" ", +"scantime":" ", +"shield":"", +"armour":"", +"shieldboost":" ", +"shieldreinforcement":" ", +"shotspeed":" ", +"shotdmg":" (DPS)", +"spinup":" ", +"syscap":" ", +"sysrate":" ", +"thermload":" ", +"thermres":" ", +"wepcap":" ", +"weprate":" ", +"minmass_sg":". ", +"optmass_sg":". ", +"maxmass_sg":". ", +"minmul_sg":" ", +"optmul_sg":" ", +"maxmul_sg":" ", +"minmass_psg":". ", +"optmass_psg":". ", +"maxmass_psg":". ", +"minmul_psg":" ", +"optmul_psg":" ", +"maxmul_psg":" ", +"minmass_bsg":". ", +"optmass_bsg":". ", +"maxmass_bsg":". ", +"minmul_bsg":" ", +"optmul_bsg":" ", +"maxmul_bsg":" ", +"range_s":" ", +"absolute":"", +"explosive":".", +"kinetic":".", +"thermal":".", +"caustic":"", +"generator":"", +"boosters":"", +"cells":"", +"shield addition":" ", +"jump addition":" ", +"bulkheads":"", +"reinforcement":"", +"power and costs":" ", +"costs":"", +"retrofit costs":" ", +"reload costs":" ", +"profiles":"", +"engine profile":"", +"fsd profile":"FSD", +"movement profile":"", +"damage to opponent's shields":" ", +"damage to opponent's hull":" ", +"offence":"", +"defence":"", +"shield metrics":" ", +"raw shield strength":" ", +"shield sources":" ", +"damage taken":" ", +"effective shield":" ", +"armour metrics":" ", +"raw armour strength":" ", +"armour sources":" ", +"raw module armour":" ", +"effective armour":" ", +"offence metrics":" ", +"defence metrics":" ", +"fuel carried":" ", +"cargo carried":" ", +"ship control":" ", +"opponent":"", +"opponent's shields":" ", +"opponent's armour":" ", +"overall damage":"overall damage", +"shield damage sources":" ", +"armour damage sources":" ", +"never":"", +"stock":"", +"boost":"", +"tab_defence":"defence", +"federation rank 1":"", +"federation rank 2":"", +"federation rank 3":"", +"federation rank 4":"", +"federation rank 5":" ", +"federation rank 6":"-", +"federation rank 7":"", +"federation rank 8":"", +"federation rank 9":"-", +"federation rank 10":" ", +"federation rank 11":" ", +"federation rank 12":"-", +"federation rank 13":" -", +"federation rank 14":"", +"federation rank required":" ", +"empire rank 1":"", +"empire rank 2":"", +"empire rank 3":"", +"empire rank 4":"", +"empire rank 5":"", +"empire rank 6":"", +"empire rank 7":"", +"empire rank 8":"", +"empire rank 9":"", +"empire rank 10":"", +"empire rank 11":"", +"empire rank 12":"", +"empire rank 13":"", +"empire rank 14":"", +"empire rank required":" ", +"PHRASE_BLUEPRINT_RESET ":" ", +"\/s":"\/", +"m\/s":"\/", +"Ls":".", +"LY":".", +"CR":".", +"S":"M", +"M":"", +"L":"", +"H":"O", +"U":"B", +"small":"", +"medium":"", +"large":"", +"alpha":"", +"beta":"", +"standard":"", +"build name":" ", +"compare all":" ", +"create new":" ", +"damage per second":" ", +"delete all":" ", +"detailed export":" ", +"edit data":"", +"empty all":" ", +"Enter Name":" ", +"farthest range":" ", +"fuel level":" ", +"full tank":" ", +"internal compartments":" ", +"jump range":" ", +"mass lock factor":". ", +"max mass":" ", +"net cost":" ", +"none created":" ", +"refuel time":" ", +"retrofit from":" ", +"T-Load":".", +"utility mounts":" ", +"about":" ...", +"action":"", +"added":"", +"available":"", +"backup":" ", +"bins":"", +"build":"c", +"builds":"c", +"buy":"", +"cancel":"", +"cargo":"", +"close":"", +"compare":" ", +"comparison":"", +"comparisons":"", +"cost":"", +"create":"", +"credits":"", +"delete":"", +"dep":"", +"deployed":"", +"disabled":"", +"discount":"", +"DPS":"", +"efficiency":"", +"empty":"", +"ENG":"", +"export":"", +"forum":"", +"fuel":"", +"hardpoints":" ", +"hull":"", +"import":" ", +"insurance":"", +"jumps":"", +"laden":"", +"language":"", +"maneuverability":"", +"max":"", +"no":"", +"pen":"", +"permalink":" ", +"pri":"", +"proceed":"", +"PWR":"", +"rate":"", +"rename":"", +"repair":"", +"ret":".", +"retracted":"", +"ROF":"\/", +"save":"", +"sell":"", +"settings":"", +"shields":"", +"ship":"", +"ships":"", +"shortened":"", +"size":"", +"skip":"", +"Stock":" ", +"SYS":"", +"time":"", +"type":"", +"unladen":"", +"URL":"", +"WEP":"", +"yes":""} \ No newline at end of file From 0da00d38a4e175486b7527bdc21c145edf78015a Mon Sep 17 00:00:00 2001 From: VAKazakov <47143965+VAKazakov@users.noreply.github.com> Date: Mon, 25 Jan 2021 21:47:44 +0300 Subject: [PATCH 37/66] fixed indentation for easy comparing --- src/app/i18n/ru.json | 927 ++++++++++++++++++++++--------------------- 1 file changed, 464 insertions(+), 463 deletions(-) diff --git a/src/app/i18n/ru.json b/src/app/i18n/ru.json index 114aa636..77badc5d 100644 --- a/src/app/i18n/ru.json +++ b/src/app/i18n/ru.json @@ -1,464 +1,465 @@ { -"PHRASE_ALT_ALL":"Alt + ", -"PHRASE_BACKUP_DESC":" ", -"PHRASE_CONFIRMATION":" ?", -"PHRASE_EXPORT_DESC":" JSON- ", -"PHRASE_FASTEST_RANGE":" ", -"PHRASE_IMPORT":" ", -"PHRASE_LADEN":" ", -"PHRASE_NO_BUILDS":" ", -"PHRASE_NO_RETROCH":" ", -"PHRASE_SELECT_BUILDS":" ", -"PHRASE_SG_RECHARGE":" 50% 100% , ", -"PHRASE_SG_RECOVER":" 0% 50% , ", -"PHRASE_UNLADEN":" ", -"PHRASE_UPDATE_RDY":" . .", -"PHRASE_ENGAGEMENT_RANGE":" ", -"PHRASE_SELECT_BLUEPRINT":" ", -"PHRASE_BLUEPRINT_WORST":" ", -"PHRASE_BLUEPRINT_FIFTY":"50% ", -"PHRASE_BLUEPRINT_SEVEN_FIVE":"75% ", -"PHRASE_BLUEPRINT_RANDOM":" ", -"PHRASE_BLUEPRINT_BEST":" ", -"PHRASE_BLUEPRINT_EXTREME":" ", -"PHRASE_BLUEPRINT_RESET":" ", -"PHRASE_SELECT_SPECIAL":", ", -"PHRASE_NO_SPECIAL":" ", -"PHRASE_SHOPPING_LIST":", ", -"PHRASE_SHOPPING_MATS":" ", -"PHRASE_REFIT_SHOPPING_LIST":", ", -"PHRASE_TOTAL_EFFECTIVE_SHIELD":" , , ", -"PHRASE_TIME_TO_LOSE_SHIELDS":" ", -"PHRASE_TIME_TO_RECOVER_SHIELDS":" ", -"PHRASE_TIME_TO_RECHARGE_SHIELDS":" ", -"PHRASE_SHIELD_SOURCES":" ", -"PHRASE_EFFECTIVE_SHIELD":" ", -"PHRASE_ARMOUR_SOURCES":" ", -"PHRASE_EFFECTIVE_ARMOUR":" ", -"PHRASE_DAMAGE_TAKEN":"% ", -"PHRASE_TIME_TO_LOSE_ARMOUR":" ", -"PHRASE_MODULE_PROTECTION_EXTERNAL":" ", -"PHRASE_MODULE_PROTECTION_INTERNAL":" ", -"PHRASE_OVERALL_DAMAGE":" ", -"PHRASE_SHIELD_DAMAGE":" ", -"PHRASE_ARMOUR_DAMAGE":" ", -"PHRASE_TIME_TO_REMOVE_SHIELDS":" ", -"PHRASE_MULTI_CREW_CAPACITOR_POINTS":" .", -"TT_TIME_TO_REMOVE_SHIELDS":" ", -"PHRASE_TIME_TO_REMOVE_ARMOUR":" ", -"TT_TIME_TO_REMOVE_ARMOUR":" ", -"PHRASE_TIME_TO_DRAIN_WEP":" ", -"TT_TIME_TO_DRAIN_WEP":", ", -"TT_TIME_TO_LOSE_SHIELDS":" ", -"TT_TIME_TO_LOSE_ARMOUR":" ", -"TT_MODULE_ARMOUR":", ", -"TT_MODULE_PROTECTION_EXTERNAL":" , ", -"TT_MODULE_PROTECTION_INTERNAL":" , ", -"TT_EFFECTIVE_SDPS_SHIELDS":" ", -"TT_EFFECTIVENESS_SHIELDS":" 0- 0 ", -"TT_EFFECTIVE_SDPS_ARMOUR":" ", -"TT_EFFECTIVENESS_ARMOUR":" 0- 0 ", -"PHRASE_EFFECTIVE_SDPS_SHIELDS":" ", -"PHRASE_EFFECTIVE_SDPS_ARMOUR":" ", -"TT_SUMMARY_SPEED":" 4 ", -"TT_SUMMARY_SPEED_NONFUNCTIONAL":" ", -"TT_SUMMARY_BOOST":" 4 ", -"TT_SUMMARY_BOOST_INTERVAL":" 4 ", -"TT_SUMMARY_BOOST_NONFUNCTIONAL":" ", -"TT_SUMMARY_SHIELDS":" , ", -"TT_SUMMARY_SHIELDS_SCB":" , SCB", -"TT_SUMMARY_SHIELDS_NONFUNCTIONAL":" ", -"TT_SUMMARY_INTEGRITY":" , ", -"TT_SUMMARY_HULL_MASS":" - ", -"TT_SUMMARY_UNLADEN_MASS":" ", -"TT_SUMMARY_LADEN_MASS":" ", -"TT_SUMMARY_DPS":" ", -"TT_SUMMARY_EPS":" ", -"TT_SUMMARY_TTD":" 4 ", -"TT_SUMMARY_MAX_SINGLE_JUMP":" , ", -"TT_SUMMARY_UNLADEN_SINGLE_JUMP":" ", -"TT_SUMMARY_LADEN_SINGLE_JUMP":" ", -"TT_SUMMARY_UNLADEN_TOTAL_JUMP":" , ", -"TT_SUMMARY_LADEN_TOTAL_JUMP":" , ", -"HELP_MODIFICATIONS_MENU":" , , ", -"PHRASE_FAIL_EDENGINEER":" EDEngineer ( EDEngineer , API , ).", -"PHRASE_FIREFOX_EDENGINEER":" EDEngineer Firefox. , Google Chrome.", -"am":" . ", -"bh":"", -"bl":" ", -"bsg":" ", -"c":"", -"causres":"Caustic resistance", -"cc":" ", -"ch":" ", -"cr":" ", -"cs":" ", -"dc":" ", -"ec":". ", -"fc":" ", -"fh":" ", -"fi":"FSD-", -"fs":"", -"fsd":"- ", -"ft":" ", -"fx":" ", -"hb":" ", -"hr":" ", -"hs":" ", -"kw":" ", -"ls":" ", -"mc":" ", -"axmc":" ", -"ml":" ", -"mr":" ", -"axmr":" ", -"mrp":" ", -"nl":"", -"pa":" ", -"pas":" ", -"pc":" ", -"pce":" -", -"passenger capacity":" ", -"pci":" -", -"pcm":" ", -"pcq":" ", -"pd":" ", -"pl":" ", -"po":" ", -"pp":" ", -"gpp":" C", -"gpd":" ", -"gpc":" ", -"ggc":" ", -"gsrp":" ", -"gfsb":" FSD ", -"ghrp":" ", -"gmrp":" ", -"pwa":" ", -"abl":" ", -"scl":" ", -"sdm":" ", -"tbsc":" ", -"gsc":" ", -"psg":" ", -"pv":" ", -"rf":" ", -"rfl":" ( )", -"rg":" ", -"rsl":"-", -"s":"", -"sb":" ", -"sc":" ", -"scb":"", -"sfn":" ", -"sg":"", -"ss":" ", -"sua":" ", -"t":" ", -"tp":" ", -"ul":" ", -"Send To EDEngineer":" EDEngineer", -"ws":" FSD", -"rpl":"-", -"rcpl":"-", -"xs":" ", -"tbem":" ", -"tbrfl":" ", -"dtl":"-", -"mahr":" ", -"emptyrestricted":" ()", -"damage dealt to":" ", -"damage received from":" ", -"against shields":" ", -"against hull":" ", -"total effective shield":" ", -"ammunition":"", -"secs":"", -"rebuildsperbay":" ", -"mroll":"Roll", -"worst":"", -"average":"", -"random":"", -"best":"", -"extreme":"", -"reset":"", -"dpe":" ", -"dps":" ", -"sdps":" ", -"dpssdps":" ( )", -"eps":" ", -"epsseps":" ( )", -"fallofffromrange":"", -"hps":" ", -"hpsshps":" ( )", -"damage by":"", -"damage from":" ", -"shield cells":"", -"recovery":"", -"recharge":"", -"engine pips":" ", -"4b":"4 ", -"speed":"", -"pitch":"", -"roll":"", -"yaw":"", -"internal protection":" ", -"external protection":" ", -"engagement range":" ", -"boost interval":" ", -"total":"", -"ammo":". ", -"boot":" ", -"hacktime":" ", -"brokenregen":" ", -"burst":" ", -"burstrof":" ", -"clip":" ", -"damage":"", -"distdraw":" ", -"duration":"", -"eff":"", -"engcap":" ", -"engrate":" ", -"explres":" ", -"facinglimit":" ", -"hullboost":" ", -"hullreinforcement":" ", -"integrity":"", -"jitter":"", -"kinres":" ", -"maxfuel":". ", -"mass":"", -"optmass":" ", -"optmul":" ", -"pgen":"", -"piercing":"", -"power":"", -"protection":" ", -"range":"", -"ranget":"", -"regen":" ", -"reload":"", -"rof":"", -"angle":" ", -"scanrate":" ", -"proberadius":" ", -"scantime":" ", -"shield":"", -"armour":"", -"shieldboost":" ", -"shieldreinforcement":" ", -"shotspeed":" ", -"shotdmg":" (DPS)", -"spinup":" ", -"syscap":" ", -"sysrate":" ", -"thermload":" ", -"thermres":" ", -"wepcap":" ", -"weprate":" ", -"minmass_sg":". ", -"optmass_sg":". ", -"maxmass_sg":". ", -"minmul_sg":" ", -"optmul_sg":" ", -"maxmul_sg":" ", -"minmass_psg":". ", -"optmass_psg":". ", -"maxmass_psg":". ", -"minmul_psg":" ", -"optmul_psg":" ", -"maxmul_psg":" ", -"minmass_bsg":". ", -"optmass_bsg":". ", -"maxmass_bsg":". ", -"minmul_bsg":" ", -"optmul_bsg":" ", -"maxmul_bsg":" ", -"range_s":" ", -"absolute":"", -"explosive":".", -"kinetic":".", -"thermal":".", -"caustic":"", -"generator":"", -"boosters":"", -"cells":"", -"shield addition":" ", -"jump addition":" ", -"bulkheads":"", -"reinforcement":"", -"power and costs":" ", -"costs":"", -"retrofit costs":" ", -"reload costs":" ", -"profiles":"", -"engine profile":"", -"fsd profile":"FSD", -"movement profile":"", -"damage to opponent's shields":" ", -"damage to opponent's hull":" ", -"offence":"", -"defence":"", -"shield metrics":" ", -"raw shield strength":" ", -"shield sources":" ", -"damage taken":" ", -"effective shield":" ", -"armour metrics":" ", -"raw armour strength":" ", -"armour sources":" ", -"raw module armour":" ", -"effective armour":" ", -"offence metrics":" ", -"defence metrics":" ", -"fuel carried":" ", -"cargo carried":" ", -"ship control":" ", -"opponent":"", -"opponent's shields":" ", -"opponent's armour":" ", -"overall damage":"overall damage", -"shield damage sources":" ", -"armour damage sources":" ", -"never":"", -"stock":"", -"boost":"", -"tab_defence":"defence", -"federation rank 1":"", -"federation rank 2":"", -"federation rank 3":"", -"federation rank 4":"", -"federation rank 5":" ", -"federation rank 6":"-", -"federation rank 7":"", -"federation rank 8":"", -"federation rank 9":"-", -"federation rank 10":" ", -"federation rank 11":" ", -"federation rank 12":"-", -"federation rank 13":" -", -"federation rank 14":"", -"federation rank required":" ", -"empire rank 1":"", -"empire rank 2":"", -"empire rank 3":"", -"empire rank 4":"", -"empire rank 5":"", -"empire rank 6":"", -"empire rank 7":"", -"empire rank 8":"", -"empire rank 9":"", -"empire rank 10":"", -"empire rank 11":"", -"empire rank 12":"", -"empire rank 13":"", -"empire rank 14":"", -"empire rank required":" ", -"PHRASE_BLUEPRINT_RESET ":" ", -"\/s":"\/", -"m\/s":"\/", -"Ls":".", -"LY":".", -"CR":".", -"S":"M", -"M":"", -"L":"", -"H":"O", -"U":"B", -"small":"", -"medium":"", -"large":"", -"alpha":"", -"beta":"", -"standard":"", -"build name":" ", -"compare all":" ", -"create new":" ", -"damage per second":" ", -"delete all":" ", -"detailed export":" ", -"edit data":"", -"empty all":" ", -"Enter Name":" ", -"farthest range":" ", -"fuel level":" ", -"full tank":" ", -"internal compartments":" ", -"jump range":" ", -"mass lock factor":". ", -"max mass":" ", -"net cost":" ", -"none created":" ", -"refuel time":" ", -"retrofit from":" ", -"T-Load":".", -"utility mounts":" ", -"about":" ...", -"action":"", -"added":"", -"available":"", -"backup":" ", -"bins":"", -"build":"c", -"builds":"c", -"buy":"", -"cancel":"", -"cargo":"", -"close":"", -"compare":" ", -"comparison":"", -"comparisons":"", -"cost":"", -"create":"", -"credits":"", -"delete":"", -"dep":"", -"deployed":"", -"disabled":"", -"discount":"", -"DPS":"", -"efficiency":"", -"empty":"", -"ENG":"", -"export":"", -"forum":"", -"fuel":"", -"hardpoints":" ", -"hull":"", -"import":" ", -"insurance":"", -"jumps":"", -"laden":"", -"language":"", -"maneuverability":"", -"max":"", -"no":"", -"pen":"", -"permalink":" ", -"pri":"", -"proceed":"", -"PWR":"", -"rate":"", -"rename":"", -"repair":"", -"ret":".", -"retracted":"", -"ROF":"\/", -"save":"", -"sell":"", -"settings":"", -"shields":"", -"ship":"", -"ships":"", -"shortened":"", -"size":"", -"skip":"", -"Stock":" ", -"SYS":"", -"time":"", -"type":"", -"unladen":"", -"URL":"", -"WEP":"", -"yes":""} \ No newline at end of file + "PHRASE_ALT_ALL":"Alt + ", + "PHRASE_BACKUP_DESC":" ", + "PHRASE_CONFIRMATION":" ?", + "PHRASE_EXPORT_DESC":" JSON- ", + "PHRASE_FASTEST_RANGE":" ", + "PHRASE_IMPORT":" ", + "PHRASE_LADEN":" ", + "PHRASE_NO_BUILDS":" ", + "PHRASE_NO_RETROCH":" ", + "PHRASE_SELECT_BUILDS":" ", + "PHRASE_SG_RECHARGE":" 50% 100% , ", + "PHRASE_SG_RECOVER":" 0% 50% , ", + "PHRASE_UNLADEN":" ", + "PHRASE_UPDATE_RDY":" . .", + "PHRASE_ENGAGEMENT_RANGE":" ", + "PHRASE_SELECT_BLUEPRINT":" ", + "PHRASE_BLUEPRINT_WORST":" ", + "PHRASE_BLUEPRINT_FIFTY":"50% ", + "PHRASE_BLUEPRINT_SEVEN_FIVE":"75% ", + "PHRASE_BLUEPRINT_RANDOM":" ", + "PHRASE_BLUEPRINT_BEST":" ", + "PHRASE_BLUEPRINT_EXTREME":" ", + "PHRASE_BLUEPRINT_RESET":" ", + "PHRASE_SELECT_SPECIAL":", ", + "PHRASE_NO_SPECIAL":" ", + "PHRASE_SHOPPING_LIST":", ", + "PHRASE_SHOPPING_MATS":" ", + "PHRASE_REFIT_SHOPPING_LIST":", ", + "PHRASE_TOTAL_EFFECTIVE_SHIELD":" , , ", + "PHRASE_TIME_TO_LOSE_SHIELDS":" ", + "PHRASE_TIME_TO_RECOVER_SHIELDS":" ", + "PHRASE_TIME_TO_RECHARGE_SHIELDS":" ", + "PHRASE_SHIELD_SOURCES":" ", + "PHRASE_EFFECTIVE_SHIELD":" ", + "PHRASE_ARMOUR_SOURCES":" ", + "PHRASE_EFFECTIVE_ARMOUR":" ", + "PHRASE_DAMAGE_TAKEN":"% ", + "PHRASE_TIME_TO_LOSE_ARMOUR":" ", + "PHRASE_MODULE_PROTECTION_EXTERNAL":" ", + "PHRASE_MODULE_PROTECTION_INTERNAL":" ", + "PHRASE_OVERALL_DAMAGE":" ", + "PHRASE_SHIELD_DAMAGE":" ", + "PHRASE_ARMOUR_DAMAGE":" ", + "PHRASE_TIME_TO_REMOVE_SHIELDS":" ", + "PHRASE_MULTI_CREW_CAPACITOR_POINTS":" .", + "TT_TIME_TO_REMOVE_SHIELDS":" ", + "PHRASE_TIME_TO_REMOVE_ARMOUR":" ", + "TT_TIME_TO_REMOVE_ARMOUR":" ", + "PHRASE_TIME_TO_DRAIN_WEP":" ", + "TT_TIME_TO_DRAIN_WEP":", ", + "TT_TIME_TO_LOSE_SHIELDS":" ", + "TT_TIME_TO_LOSE_ARMOUR":" ", + "TT_MODULE_ARMOUR":", ", + "TT_MODULE_PROTECTION_EXTERNAL":" , ", + "TT_MODULE_PROTECTION_INTERNAL":" , ", + "TT_EFFECTIVE_SDPS_SHIELDS":" ", + "TT_EFFECTIVENESS_SHIELDS":" 0- 0 ", + "TT_EFFECTIVE_SDPS_ARMOUR":" ", + "TT_EFFECTIVENESS_ARMOUR":" 0- 0 ", + "PHRASE_EFFECTIVE_SDPS_SHIELDS":" ", + "PHRASE_EFFECTIVE_SDPS_ARMOUR":" ", + "TT_SUMMARY_SPEED":" 4 ", + "TT_SUMMARY_SPEED_NONFUNCTIONAL":" ", + "TT_SUMMARY_BOOST":" 4 ", + "TT_SUMMARY_BOOST_INTERVAL":" 4 ", + "TT_SUMMARY_BOOST_NONFUNCTIONAL":" ", + "TT_SUMMARY_SHIELDS":" , ", + "TT_SUMMARY_SHIELDS_SCB":" , SCB", + "TT_SUMMARY_SHIELDS_NONFUNCTIONAL":" ", + "TT_SUMMARY_INTEGRITY":" , ", + "TT_SUMMARY_HULL_MASS":" - ", + "TT_SUMMARY_UNLADEN_MASS":" ", + "TT_SUMMARY_LADEN_MASS":" ", + "TT_SUMMARY_DPS":" ", + "TT_SUMMARY_EPS":" ", + "TT_SUMMARY_TTD":" 4 ", + "TT_SUMMARY_MAX_SINGLE_JUMP":" , ", + "TT_SUMMARY_UNLADEN_SINGLE_JUMP":" ", + "TT_SUMMARY_LADEN_SINGLE_JUMP":" ", + "TT_SUMMARY_UNLADEN_TOTAL_JUMP":" , ", + "TT_SUMMARY_LADEN_TOTAL_JUMP":" , ", + "HELP_MODIFICATIONS_MENU":" , , ", + "PHRASE_FAIL_EDENGINEER":" EDEngineer ( EDEngineer , API , ).", + "PHRASE_FIREFOX_EDENGINEER":" EDEngineer Firefox. , Google Chrome.", + "am":" . ", + "bh":"", + "bl":" ", + "bsg":" ", + "c":"", + "causres":"Caustic resistance", + "cc":" ", + "ch":" ", + "cr":" ", + "cs":" ", + "dc":" ", + "ec":". ", + "fc":" ", + "fh":" ", + "fi":"FSD-", + "fs":"", + "fsd":"- ", + "ft":" ", + "fx":" ", + "hb":" ", + "hr":" ", + "hs":" ", + "kw":" ", + "ls":" ", + "mc":" ", + "axmc":" ", + "ml":" ", + "mr":" ", + "axmr":" ", + "mrp":" ", + "nl":"", + "pa":" ", + "pas":" ", + "pc":" ", + "pce":" -", + "passenger capacity":" ", + "pci":" -", + "pcm":" ", + "pcq":" ", + "pd":" ", + "pl":" ", + "po":" ", + "pp":" ", + "gpp":" C", + "gpd":" ", + "gpc":" ", + "ggc":" ", + "gsrp":" ", + "gfsb":" FSD ", + "ghrp":" ", + "gmrp":" ", + "pwa":" ", + "abl":" ", + "scl":" ", + "sdm":" ", + "tbsc":" ", + "gsc":" ", + "psg":" ", + "pv":" ", + "rf":" ", + "rfl":" ( )", + "rg":" ", + "rsl":"-", + "s":"", + "sb":" ", + "sc":" ", + "scb":"", + "sfn":" ", + "sg":"", + "ss":" ", + "sua":" ", + "t":" ", + "tp":" ", + "ul":" ", + "Send To EDEngineer":" EDEngineer", + "ws":" FSD", + "rpl":"-", + "rcpl":"-", + "xs":" ", + "tbem":" ", + "tbrfl":" ", + "dtl":"-", + "mahr":" ", + "emptyrestricted":" ()", + "damage dealt to":" ", + "damage received from":" ", + "against shields":" ", + "against hull":" ", + "total effective shield":" ", + "ammunition":"", + "secs":"", + "rebuildsperbay":" ", + "mroll":"Roll", + "worst":"", + "average":"", + "random":"", + "best":"", + "extreme":"", + "reset":"", + "dpe":" ", + "dps":" ", + "sdps":" ", + "dpssdps":" ( )", + "eps":" ", + "epsseps":" ( )", + "fallofffromrange":"", + "hps":" ", + "hpsshps":" ( )", + "damage by":"", + "damage from":" ", + "shield cells":"", + "recovery":"", + "recharge":"", + "engine pips":" ", + "4b":"4 ", + "speed":"", + "pitch":"", + "roll":"", + "yaw":"", + "internal protection":" ", + "external protection":" ", + "engagement range":" ", + "boost interval":" ", + "total":"", + "ammo":". ", + "boot":" ", + "hacktime":" ", + "brokenregen":" ", + "burst":" ", + "burstrof":" ", + "clip":" ", + "damage":"", + "distdraw":" ", + "duration":"", + "eff":"", + "engcap":" ", + "engrate":" ", + "explres":" ", + "facinglimit":" ", + "hullboost":" ", + "hullreinforcement":" ", + "integrity":"", + "jitter":"", + "kinres":" ", + "maxfuel":". ", + "mass":"", + "optmass":" ", + "optmul":" ", + "pgen":"", + "piercing":"", + "power":"", + "protection":" ", + "range":"", + "ranget":"", + "regen":" ", + "reload":"", + "rof":"", + "angle":" ", + "scanrate":" ", + "proberadius":" ", + "scantime":" ", + "shield":"", + "armour":"", + "shieldboost":" ", + "shieldreinforcement":" ", + "shotspeed":" ", + "shotdmg":" (DPS)", + "spinup":" ", + "syscap":" ", + "sysrate":" ", + "thermload":" ", + "thermres":" ", + "wepcap":" ", + "weprate":" ", + "minmass_sg":". ", + "optmass_sg":". ", + "maxmass_sg":". ", + "minmul_sg":" ", + "optmul_sg":" ", + "maxmul_sg":" ", + "minmass_psg":". ", + "optmass_psg":". ", + "maxmass_psg":". ", + "minmul_psg":" ", + "optmul_psg":" ", + "maxmul_psg":" ", + "minmass_bsg":". ", + "optmass_bsg":". ", + "maxmass_bsg":". ", + "minmul_bsg":" ", + "optmul_bsg":" ", + "maxmul_bsg":" ", + "range_s":" ", + "absolute":"", + "explosive":".", + "kinetic":".", + "thermal":".", + "caustic":"", + "generator":"", + "boosters":"", + "cells":"", + "shield addition":" ", + "jump addition":" ", + "bulkheads":"", + "reinforcement":"", + "power and costs":" ", + "costs":"", + "retrofit costs":" ", + "reload costs":" ", + "profiles":"", + "engine profile":"", + "fsd profile":"FSD", + "movement profile":"", + "damage to opponent's shields":" ", + "damage to opponent's hull":" ", + "offence":"", + "defence":"", + "shield metrics":" ", + "raw shield strength":" ", + "shield sources":" ", + "damage taken":" ", + "effective shield":" ", + "armour metrics":" ", + "raw armour strength":" ", + "armour sources":" ", + "raw module armour":" ", + "effective armour":" ", + "offence metrics":" ", + "defence metrics":" ", + "fuel carried":" ", + "cargo carried":" ", + "ship control":" ", + "opponent":"", + "opponent's shields":" ", + "opponent's armour":" ", + "overall damage":"overall damage", + "shield damage sources":" ", + "armour damage sources":" ", + "never":"", + "stock":"", + "boost":"", + "tab_defence":"defence", + "federation rank 1":"", + "federation rank 2":"", + "federation rank 3":"", + "federation rank 4":"", + "federation rank 5":" ", + "federation rank 6":"-", + "federation rank 7":"", + "federation rank 8":"", + "federation rank 9":"-", + "federation rank 10":" ", + "federation rank 11":" ", + "federation rank 12":"-", + "federation rank 13":" -", + "federation rank 14":"", + "federation rank required":" ", + "empire rank 1":"", + "empire rank 2":"", + "empire rank 3":"", + "empire rank 4":"", + "empire rank 5":"", + "empire rank 6":"", + "empire rank 7":"", + "empire rank 8":"", + "empire rank 9":"", + "empire rank 10":"", + "empire rank 11":"", + "empire rank 12":"", + "empire rank 13":"", + "empire rank 14":"", + "empire rank required":" ", + "PHRASE_BLUEPRINT_RESET ":" ", + "\/s":"\/", + "m\/s":"\/", + "Ls":".", + "LY":".", + "CR":".", + "S":"M", + "M":"", + "L":"", + "H":"O", + "U":"B", + "small":"", + "medium":"", + "large":"", + "alpha":"", + "beta":"", + "standard":"", + "build name":" ", + "compare all":" ", + "create new":" ", + "damage per second":" ", + "delete all":" ", + "detailed export":" ", + "edit data":"", + "empty all":" ", + "Enter Name":" ", + "farthest range":" ", + "fuel level":" ", + "full tank":" ", + "internal compartments":" ", + "jump range":" ", + "mass lock factor":". ", + "max mass":" ", + "net cost":" ", + "none created":" ", + "refuel time":" ", + "retrofit from":" ", + "T-Load":".", + "utility mounts":" ", + "about":" ...", + "action":"", + "added":"", + "available":"", + "backup":" ", + "bins":"", + "build":"c", + "builds":"c", + "buy":"", + "cancel":"", + "cargo":"", + "close":"", + "compare":" ", + "comparison":"", + "comparisons":"", + "cost":"", + "create":"", + "credits":"", + "delete":"", + "dep":"", + "deployed":"", + "disabled":"", + "discount":"", + "DPS":"", + "efficiency":"", + "empty":"", + "ENG":"", + "export":"", + "forum":"", + "fuel":"", + "hardpoints":" ", + "hull":"", + "import":" ", + "insurance":"", + "jumps":"", + "laden":"", + "language":"", + "maneuverability":"", + "max":"", + "no":"", + "pen":"", + "permalink":" ", + "pri":"", + "proceed":"", + "PWR":"", + "rate":"", + "rename":"", + "repair":"", + "ret":".", + "retracted":"", + "ROF":"\/", + "save":"", + "sell":"", + "settings":"", + "shields":"", + "ship":"", + "ships":"", + "shortened":"", + "size":"", + "skip":"", + "Stock":" ", + "SYS":"", + "time":"", + "type":"", + "unladen":"", + "URL":"", + "WEP":"", + "yes":"" +} \ No newline at end of file From 4001e1e9ac25d4fccb46bad96fc8384509338466 Mon Sep 17 00:00:00 2001 From: VAKazakov <47143965+VAKazakov@users.noreply.github.com> Date: Mon, 25 Jan 2021 21:54:43 +0300 Subject: [PATCH 38/66] changing `:` to `: ` --- src/app/i18n/ru.json | 928 +++++++++++++++++++++---------------------- 1 file changed, 464 insertions(+), 464 deletions(-) diff --git a/src/app/i18n/ru.json b/src/app/i18n/ru.json index 77badc5d..d0fcdd3f 100644 --- a/src/app/i18n/ru.json +++ b/src/app/i18n/ru.json @@ -1,465 +1,465 @@ { - "PHRASE_ALT_ALL":"Alt + ", - "PHRASE_BACKUP_DESC":" ", - "PHRASE_CONFIRMATION":" ?", - "PHRASE_EXPORT_DESC":" JSON- ", - "PHRASE_FASTEST_RANGE":" ", - "PHRASE_IMPORT":" ", - "PHRASE_LADEN":" ", - "PHRASE_NO_BUILDS":" ", - "PHRASE_NO_RETROCH":" ", - "PHRASE_SELECT_BUILDS":" ", - "PHRASE_SG_RECHARGE":" 50% 100% , ", - "PHRASE_SG_RECOVER":" 0% 50% , ", - "PHRASE_UNLADEN":" ", - "PHRASE_UPDATE_RDY":" . .", - "PHRASE_ENGAGEMENT_RANGE":" ", - "PHRASE_SELECT_BLUEPRINT":" ", - "PHRASE_BLUEPRINT_WORST":" ", - "PHRASE_BLUEPRINT_FIFTY":"50% ", - "PHRASE_BLUEPRINT_SEVEN_FIVE":"75% ", - "PHRASE_BLUEPRINT_RANDOM":" ", - "PHRASE_BLUEPRINT_BEST":" ", - "PHRASE_BLUEPRINT_EXTREME":" ", - "PHRASE_BLUEPRINT_RESET":" ", - "PHRASE_SELECT_SPECIAL":", ", - "PHRASE_NO_SPECIAL":" ", - "PHRASE_SHOPPING_LIST":", ", - "PHRASE_SHOPPING_MATS":" ", - "PHRASE_REFIT_SHOPPING_LIST":", ", - "PHRASE_TOTAL_EFFECTIVE_SHIELD":" , , ", - "PHRASE_TIME_TO_LOSE_SHIELDS":" ", - "PHRASE_TIME_TO_RECOVER_SHIELDS":" ", - "PHRASE_TIME_TO_RECHARGE_SHIELDS":" ", - "PHRASE_SHIELD_SOURCES":" ", - "PHRASE_EFFECTIVE_SHIELD":" ", - "PHRASE_ARMOUR_SOURCES":" ", - "PHRASE_EFFECTIVE_ARMOUR":" ", - "PHRASE_DAMAGE_TAKEN":"% ", - "PHRASE_TIME_TO_LOSE_ARMOUR":" ", - "PHRASE_MODULE_PROTECTION_EXTERNAL":" ", - "PHRASE_MODULE_PROTECTION_INTERNAL":" ", - "PHRASE_OVERALL_DAMAGE":" ", - "PHRASE_SHIELD_DAMAGE":" ", - "PHRASE_ARMOUR_DAMAGE":" ", - "PHRASE_TIME_TO_REMOVE_SHIELDS":" ", - "PHRASE_MULTI_CREW_CAPACITOR_POINTS":" .", - "TT_TIME_TO_REMOVE_SHIELDS":" ", - "PHRASE_TIME_TO_REMOVE_ARMOUR":" ", - "TT_TIME_TO_REMOVE_ARMOUR":" ", - "PHRASE_TIME_TO_DRAIN_WEP":" ", - "TT_TIME_TO_DRAIN_WEP":", ", - "TT_TIME_TO_LOSE_SHIELDS":" ", - "TT_TIME_TO_LOSE_ARMOUR":" ", - "TT_MODULE_ARMOUR":", ", - "TT_MODULE_PROTECTION_EXTERNAL":" , ", - "TT_MODULE_PROTECTION_INTERNAL":" , ", - "TT_EFFECTIVE_SDPS_SHIELDS":" ", - "TT_EFFECTIVENESS_SHIELDS":" 0- 0 ", - "TT_EFFECTIVE_SDPS_ARMOUR":" ", - "TT_EFFECTIVENESS_ARMOUR":" 0- 0 ", - "PHRASE_EFFECTIVE_SDPS_SHIELDS":" ", - "PHRASE_EFFECTIVE_SDPS_ARMOUR":" ", - "TT_SUMMARY_SPEED":" 4 ", - "TT_SUMMARY_SPEED_NONFUNCTIONAL":" ", - "TT_SUMMARY_BOOST":" 4 ", - "TT_SUMMARY_BOOST_INTERVAL":" 4 ", - "TT_SUMMARY_BOOST_NONFUNCTIONAL":" ", - "TT_SUMMARY_SHIELDS":" , ", - "TT_SUMMARY_SHIELDS_SCB":" , SCB", - "TT_SUMMARY_SHIELDS_NONFUNCTIONAL":" ", - "TT_SUMMARY_INTEGRITY":" , ", - "TT_SUMMARY_HULL_MASS":" - ", - "TT_SUMMARY_UNLADEN_MASS":" ", - "TT_SUMMARY_LADEN_MASS":" ", - "TT_SUMMARY_DPS":" ", - "TT_SUMMARY_EPS":" ", - "TT_SUMMARY_TTD":" 4 ", - "TT_SUMMARY_MAX_SINGLE_JUMP":" , ", - "TT_SUMMARY_UNLADEN_SINGLE_JUMP":" ", - "TT_SUMMARY_LADEN_SINGLE_JUMP":" ", - "TT_SUMMARY_UNLADEN_TOTAL_JUMP":" , ", - "TT_SUMMARY_LADEN_TOTAL_JUMP":" , ", - "HELP_MODIFICATIONS_MENU":" , , ", - "PHRASE_FAIL_EDENGINEER":" EDEngineer ( EDEngineer , API , ).", - "PHRASE_FIREFOX_EDENGINEER":" EDEngineer Firefox. , Google Chrome.", - "am":" . ", - "bh":"", - "bl":" ", - "bsg":" ", - "c":"", - "causres":"Caustic resistance", - "cc":" ", - "ch":" ", - "cr":" ", - "cs":" ", - "dc":" ", - "ec":". ", - "fc":" ", - "fh":" ", - "fi":"FSD-", - "fs":"", - "fsd":"- ", - "ft":" ", - "fx":" ", - "hb":" ", - "hr":" ", - "hs":" ", - "kw":" ", - "ls":" ", - "mc":" ", - "axmc":" ", - "ml":" ", - "mr":" ", - "axmr":" ", - "mrp":" ", - "nl":"", - "pa":" ", - "pas":" ", - "pc":" ", - "pce":" -", - "passenger capacity":" ", - "pci":" -", - "pcm":" ", - "pcq":" ", - "pd":" ", - "pl":" ", - "po":" ", - "pp":" ", - "gpp":" C", - "gpd":" ", - "gpc":" ", - "ggc":" ", - "gsrp":" ", - "gfsb":" FSD ", - "ghrp":" ", - "gmrp":" ", - "pwa":" ", - "abl":" ", - "scl":" ", - "sdm":" ", - "tbsc":" ", - "gsc":" ", - "psg":" ", - "pv":" ", - "rf":" ", - "rfl":" ( )", - "rg":" ", - "rsl":"-", - "s":"", - "sb":" ", - "sc":" ", - "scb":"", - "sfn":" ", - "sg":"", - "ss":" ", - "sua":" ", - "t":" ", - "tp":" ", - "ul":" ", - "Send To EDEngineer":" EDEngineer", - "ws":" FSD", - "rpl":"-", - "rcpl":"-", - "xs":" ", - "tbem":" ", - "tbrfl":" ", - "dtl":"-", - "mahr":" ", - "emptyrestricted":" ()", - "damage dealt to":" ", - "damage received from":" ", - "against shields":" ", - "against hull":" ", - "total effective shield":" ", - "ammunition":"", - "secs":"", - "rebuildsperbay":" ", - "mroll":"Roll", - "worst":"", - "average":"", - "random":"", - "best":"", - "extreme":"", - "reset":"", - "dpe":" ", - "dps":" ", - "sdps":" ", - "dpssdps":" ( )", - "eps":" ", - "epsseps":" ( )", - "fallofffromrange":"", - "hps":" ", - "hpsshps":" ( )", - "damage by":"", - "damage from":" ", - "shield cells":"", - "recovery":"", - "recharge":"", - "engine pips":" ", - "4b":"4 ", - "speed":"", - "pitch":"", - "roll":"", - "yaw":"", - "internal protection":" ", - "external protection":" ", - "engagement range":" ", - "boost interval":" ", - "total":"", - "ammo":". ", - "boot":" ", - "hacktime":" ", - "brokenregen":" ", - "burst":" ", - "burstrof":" ", - "clip":" ", - "damage":"", - "distdraw":" ", - "duration":"", - "eff":"", - "engcap":" ", - "engrate":" ", - "explres":" ", - "facinglimit":" ", - "hullboost":" ", - "hullreinforcement":" ", - "integrity":"", - "jitter":"", - "kinres":" ", - "maxfuel":". ", - "mass":"", - "optmass":" ", - "optmul":" ", - "pgen":"", - "piercing":"", - "power":"", - "protection":" ", - "range":"", - "ranget":"", - "regen":" ", - "reload":"", - "rof":"", - "angle":" ", - "scanrate":" ", - "proberadius":" ", - "scantime":" ", - "shield":"", - "armour":"", - "shieldboost":" ", - "shieldreinforcement":" ", - "shotspeed":" ", - "shotdmg":" (DPS)", - "spinup":" ", - "syscap":" ", - "sysrate":" ", - "thermload":" ", - "thermres":" ", - "wepcap":" ", - "weprate":" ", - "minmass_sg":". ", - "optmass_sg":". ", - "maxmass_sg":". ", - "minmul_sg":" ", - "optmul_sg":" ", - "maxmul_sg":" ", - "minmass_psg":". ", - "optmass_psg":". ", - "maxmass_psg":". ", - "minmul_psg":" ", - "optmul_psg":" ", - "maxmul_psg":" ", - "minmass_bsg":". ", - "optmass_bsg":". ", - "maxmass_bsg":". ", - "minmul_bsg":" ", - "optmul_bsg":" ", - "maxmul_bsg":" ", - "range_s":" ", - "absolute":"", - "explosive":".", - "kinetic":".", - "thermal":".", - "caustic":"", - "generator":"", - "boosters":"", - "cells":"", - "shield addition":" ", - "jump addition":" ", - "bulkheads":"", - "reinforcement":"", - "power and costs":" ", - "costs":"", - "retrofit costs":" ", - "reload costs":" ", - "profiles":"", - "engine profile":"", - "fsd profile":"FSD", - "movement profile":"", - "damage to opponent's shields":" ", - "damage to opponent's hull":" ", - "offence":"", - "defence":"", - "shield metrics":" ", - "raw shield strength":" ", - "shield sources":" ", - "damage taken":" ", - "effective shield":" ", - "armour metrics":" ", - "raw armour strength":" ", - "armour sources":" ", - "raw module armour":" ", - "effective armour":" ", - "offence metrics":" ", - "defence metrics":" ", - "fuel carried":" ", - "cargo carried":" ", - "ship control":" ", - "opponent":"", - "opponent's shields":" ", - "opponent's armour":" ", - "overall damage":"overall damage", - "shield damage sources":" ", - "armour damage sources":" ", - "never":"", - "stock":"", - "boost":"", - "tab_defence":"defence", - "federation rank 1":"", - "federation rank 2":"", - "federation rank 3":"", - "federation rank 4":"", - "federation rank 5":" ", - "federation rank 6":"-", - "federation rank 7":"", - "federation rank 8":"", - "federation rank 9":"-", - "federation rank 10":" ", - "federation rank 11":" ", - "federation rank 12":"-", - "federation rank 13":" -", - "federation rank 14":"", - "federation rank required":" ", - "empire rank 1":"", - "empire rank 2":"", - "empire rank 3":"", - "empire rank 4":"", - "empire rank 5":"", - "empire rank 6":"", - "empire rank 7":"", - "empire rank 8":"", - "empire rank 9":"", - "empire rank 10":"", - "empire rank 11":"", - "empire rank 12":"", - "empire rank 13":"", - "empire rank 14":"", - "empire rank required":" ", - "PHRASE_BLUEPRINT_RESET ":" ", - "\/s":"\/", - "m\/s":"\/", - "Ls":".", - "LY":".", - "CR":".", - "S":"M", - "M":"", - "L":"", - "H":"O", - "U":"B", - "small":"", - "medium":"", - "large":"", - "alpha":"", - "beta":"", - "standard":"", - "build name":" ", - "compare all":" ", - "create new":" ", - "damage per second":" ", - "delete all":" ", - "detailed export":" ", - "edit data":"", - "empty all":" ", - "Enter Name":" ", - "farthest range":" ", - "fuel level":" ", - "full tank":" ", - "internal compartments":" ", - "jump range":" ", - "mass lock factor":". ", - "max mass":" ", - "net cost":" ", - "none created":" ", - "refuel time":" ", - "retrofit from":" ", - "T-Load":".", - "utility mounts":" ", - "about":" ...", - "action":"", - "added":"", - "available":"", - "backup":" ", - "bins":"", - "build":"c", - "builds":"c", - "buy":"", - "cancel":"", - "cargo":"", - "close":"", - "compare":" ", - "comparison":"", - "comparisons":"", - "cost":"", - "create":"", - "credits":"", - "delete":"", - "dep":"", - "deployed":"", - "disabled":"", - "discount":"", - "DPS":"", - "efficiency":"", - "empty":"", - "ENG":"", - "export":"", - "forum":"", - "fuel":"", - "hardpoints":" ", - "hull":"", - "import":" ", - "insurance":"", - "jumps":"", - "laden":"", - "language":"", - "maneuverability":"", - "max":"", - "no":"", - "pen":"", - "permalink":" ", - "pri":"", - "proceed":"", - "PWR":"", - "rate":"", - "rename":"", - "repair":"", - "ret":".", - "retracted":"", - "ROF":"\/", - "save":"", - "sell":"", - "settings":"", - "shields":"", - "ship":"", - "ships":"", - "shortened":"", - "size":"", - "skip":"", - "Stock":" ", - "SYS":"", - "time":"", - "type":"", - "unladen":"", - "URL":"", - "WEP":"", - "yes":"" -} \ No newline at end of file + "PHRASE_ALT_ALL": "Alt + ", + "PHRASE_BACKUP_DESC": " ", + "PHRASE_CONFIRMATION": " ?", + "PHRASE_EXPORT_DESC": " JSON- ", + "PHRASE_FASTEST_RANGE": " ", + "PHRASE_IMPORT": " ", + "PHRASE_LADEN": " ", + "PHRASE_NO_BUILDS": " ", + "PHRASE_NO_RETROCH": " ", + "PHRASE_SELECT_BUILDS": " ", + "PHRASE_SG_RECHARGE": " 50% 100% , ", + "PHRASE_SG_RECOVER": " 0% 50% , ", + "PHRASE_UNLADEN": " ", + "PHRASE_UPDATE_RDY": " . .", + "PHRASE_ENGAGEMENT_RANGE": " ", + "PHRASE_SELECT_BLUEPRINT": " ", + "PHRASE_BLUEPRINT_WORST": " ", + "PHRASE_BLUEPRINT_FIFTY": "50% ", + "PHRASE_BLUEPRINT_SEVEN_FIVE": "75% ", + "PHRASE_BLUEPRINT_RANDOM": " ", + "PHRASE_BLUEPRINT_BEST": " ", + "PHRASE_BLUEPRINT_EXTREME": " ", + "PHRASE_BLUEPRINT_RESET": " ", + "PHRASE_SELECT_SPECIAL": ", ", + "PHRASE_NO_SPECIAL": " ", + "PHRASE_SHOPPING_LIST": ", ", + "PHRASE_SHOPPING_MATS": " ", + "PHRASE_REFIT_SHOPPING_LIST": ", ", + "PHRASE_TOTAL_EFFECTIVE_SHIELD": " , , ", + "PHRASE_TIME_TO_LOSE_SHIELDS": " ", + "PHRASE_TIME_TO_RECOVER_SHIELDS": " ", + "PHRASE_TIME_TO_RECHARGE_SHIELDS": " ", + "PHRASE_SHIELD_SOURCES": " ", + "PHRASE_EFFECTIVE_SHIELD": " ", + "PHRASE_ARMOUR_SOURCES": " ", + "PHRASE_EFFECTIVE_ARMOUR": " ", + "PHRASE_DAMAGE_TAKEN": "% ", + "PHRASE_TIME_TO_LOSE_ARMOUR": " ", + "PHRASE_MODULE_PROTECTION_EXTERNAL": " ", + "PHRASE_MODULE_PROTECTION_INTERNAL": " ", + "PHRASE_OVERALL_DAMAGE": " ", + "PHRASE_SHIELD_DAMAGE": " ", + "PHRASE_ARMOUR_DAMAGE": " ", + "PHRASE_TIME_TO_REMOVE_SHIELDS": " ", + "PHRASE_MULTI_CREW_CAPACITOR_POINTS": " .", + "TT_TIME_TO_REMOVE_SHIELDS": " ", + "PHRASE_TIME_TO_REMOVE_ARMOUR": " ", + "TT_TIME_TO_REMOVE_ARMOUR": " ", + "PHRASE_TIME_TO_DRAIN_WEP": " ", + "TT_TIME_TO_DRAIN_WEP": ", ", + "TT_TIME_TO_LOSE_SHIELDS": " ", + "TT_TIME_TO_LOSE_ARMOUR": " ", + "TT_MODULE_ARMOUR": ", ", + "TT_MODULE_PROTECTION_EXTERNAL": " , ", + "TT_MODULE_PROTECTION_INTERNAL": " , ", + "TT_EFFECTIVE_SDPS_SHIELDS": " ", + "TT_EFFECTIVENESS_SHIELDS": " 0- 0 ", + "TT_EFFECTIVE_SDPS_ARMOUR": " ", + "TT_EFFECTIVENESS_ARMOUR": " 0- 0 ", + "PHRASE_EFFECTIVE_SDPS_SHIELDS": " ", + "PHRASE_EFFECTIVE_SDPS_ARMOUR": " ", + "TT_SUMMARY_SPEED": " 4 ", + "TT_SUMMARY_SPEED_NONFUNCTIONAL": " ", + "TT_SUMMARY_BOOST": " 4 ", + "TT_SUMMARY_BOOST_INTERVAL": " 4 ", + "TT_SUMMARY_BOOST_NONFUNCTIONAL": " ", + "TT_SUMMARY_SHIELDS": " , ", + "TT_SUMMARY_SHIELDS_SCB": " , SCB", + "TT_SUMMARY_SHIELDS_NONFUNCTIONAL": " ", + "TT_SUMMARY_INTEGRITY": " , ", + "TT_SUMMARY_HULL_MASS": " - ", + "TT_SUMMARY_UNLADEN_MASS": " ", + "TT_SUMMARY_LADEN_MASS": " ", + "TT_SUMMARY_DPS": " ", + "TT_SUMMARY_EPS": " ", + "TT_SUMMARY_TTD": " 4 ", + "TT_SUMMARY_MAX_SINGLE_JUMP": " , ", + "TT_SUMMARY_UNLADEN_SINGLE_JUMP": " ", + "TT_SUMMARY_LADEN_SINGLE_JUMP": " ", + "TT_SUMMARY_UNLADEN_TOTAL_JUMP": " , ", + "TT_SUMMARY_LADEN_TOTAL_JUMP": " , ", + "HELP_MODIFICATIONS_MENU": " , , ", + "PHRASE_FAIL_EDENGINEER": " EDEngineer ( EDEngineer , API , ).", + "PHRASE_FIREFOX_EDENGINEER": " EDEngineer Firefox. , Google Chrome.", + "am": " . ", + "bh": "", + "bl": " ", + "bsg": " ", + "c": "", + "causres": "Caustic resistance", + "cc": " ", + "ch": " ", + "cr": " ", + "cs": " ", + "dc": " ", + "ec": ". ", + "fc": " ", + "fh": " ", + "fi": "FSD-", + "fs": "", + "fsd": "- ", + "ft": " ", + "fx": " ", + "hb": " ", + "hr": " ", + "hs": " ", + "kw": " ", + "ls": " ", + "mc": " ", + "axmc": " ", + "ml": " ", + "mr": " ", + "axmr": " ", + "mrp": " ", + "nl": "", + "pa": " ", + "pas": " ", + "pc": " ", + "pce": " -", + "passenger capacity": " ", + "pci": " -", + "pcm": " ", + "pcq": " ", + "pd": " ", + "pl": " ", + "po": " ", + "pp": " ", + "gpp": " C", + "gpd": " ", + "gpc": " ", + "ggc": " ", + "gsrp": " ", + "gfsb": " FSD ", + "ghrp": " ", + "gmrp": " ", + "pwa": " ", + "abl": " ", + "scl": " ", + "sdm": " ", + "tbsc": " ", + "gsc": " ", + "psg": " ", + "pv": " ", + "rf": " ", + "rfl": " ( )", + "rg": " ", + "rsl": "-", + "s": "", + "sb": " ", + "sc": " ", + "scb": "", + "sfn": " ", + "sg": "", + "ss": " ", + "sua": " ", + "t": " ", + "tp": " ", + "ul": " ", + "Send To EDEngineer": " EDEngineer", + "ws": " FSD", + "rpl": "-", + "rcpl": "-", + "xs": " ", + "tbem": " ", + "tbrfl": " ", + "dtl": "-", + "mahr": " ", + "emptyrestricted": " ()", + "damage dealt to": " ", + "damage received from": " ", + "against shields": " ", + "against hull": " ", + "total effective shield": " ", + "ammunition": "", + "secs": "", + "rebuildsperbay": " ", + "mroll": "Roll", + "worst": "", + "average": "", + "random": "", + "best": "", + "extreme": "", + "reset": "", + "dpe": " ", + "dps": " ", + "sdps": " ", + "dpssdps": " ( )", + "eps": " ", + "epsseps": " ( )", + "fallofffromrange": "", + "hps": " ", + "hpsshps": " ( )", + "damage by": "", + "damage from": " ", + "shield cells": "", + "recovery": "", + "recharge": "", + "engine pips": " ", + "4b": "4 ", + "speed": "", + "pitch": "", + "roll": "", + "yaw": "", + "internal protection": " ", + "external protection": " ", + "engagement range": " ", + "boost interval": " ", + "total": "", + "ammo": ". ", + "boot": " ", + "hacktime": " ", + "brokenregen": " ", + "burst": " ", + "burstrof": " ", + "clip": " ", + "damage": "", + "distdraw": " ", + "duration": "", + "eff": "", + "engcap": " ", + "engrate": " ", + "explres": " ", + "facinglimit": " ", + "hullboost": " ", + "hullreinforcement": " ", + "integrity": "", + "jitter": "", + "kinres": " ", + "maxfuel": ". ", + "mass": "", + "optmass": " ", + "optmul": " ", + "pgen": "", + "piercing": "", + "power": "", + "protection": " ", + "range": "", + "ranget": "", + "regen": " ", + "reload": "", + "rof": "", + "angle": " ", + "scanrate": " ", + "proberadius": " ", + "scantime": " ", + "shield": "", + "armour": "", + "shieldboost": " ", + "shieldreinforcement": " ", + "shotspeed": " ", + "shotdmg": " (DPS)", + "spinup": " ", + "syscap": " ", + "sysrate": " ", + "thermload": " ", + "thermres": " ", + "wepcap": " ", + "weprate": " ", + "minmass_sg": ". ", + "optmass_sg": ". ", + "maxmass_sg": ". ", + "minmul_sg": " ", + "optmul_sg": " ", + "maxmul_sg": " ", + "minmass_psg": ". ", + "optmass_psg": ". ", + "maxmass_psg": ". ", + "minmul_psg": " ", + "optmul_psg": " ", + "maxmul_psg": " ", + "minmass_bsg": ". ", + "optmass_bsg": ". ", + "maxmass_bsg": ". ", + "minmul_bsg": " ", + "optmul_bsg": " ", + "maxmul_bsg": " ", + "range_s": " ", + "absolute": "", + "explosive": ".", + "kinetic": ".", + "thermal": ".", + "caustic": "", + "generator": "", + "boosters": "", + "cells": "", + "shield addition": " ", + "jump addition": " ", + "bulkheads": "", + "reinforcement": "", + "power and costs": " ", + "costs": "", + "retrofit costs": " ", + "reload costs": " ", + "profiles": "", + "engine profile": "", + "fsd profile": "FSD", + "movement profile": "", + "damage to opponent's shields": " ", + "damage to opponent's hull": " ", + "offence": "", + "defence": "", + "shield metrics": " ", + "raw shield strength": " ", + "shield sources": " ", + "damage taken": " ", + "effective shield": " ", + "armour metrics": " ", + "raw armour strength": " ", + "armour sources": " ", + "raw module armour": " ", + "effective armour": " ", + "offence metrics": " ", + "defence metrics": " ", + "fuel carried": " ", + "cargo carried": " ", + "ship control": " ", + "opponent": "", + "opponent's shields": " ", + "opponent's armour": " ", + "overall damage": "overall damage", + "shield damage sources": " ", + "armour damage sources": " ", + "never": "", + "stock": "", + "boost": "", + "tab_defence": "defence", + "federation rank 1": "", + "federation rank 2": "", + "federation rank 3": "", + "federation rank 4": "", + "federation rank 5": " ", + "federation rank 6": "-", + "federation rank 7": "", + "federation rank 8": "", + "federation rank 9": "-", + "federation rank 10": " ", + "federation rank 11": " ", + "federation rank 12": "-", + "federation rank 13": " -", + "federation rank 14": "", + "federation rank required": " ", + "empire rank 1": "", + "empire rank 2": "", + "empire rank 3": "", + "empire rank 4": "", + "empire rank 5": "", + "empire rank 6": "", + "empire rank 7": "", + "empire rank 8": "", + "empire rank 9": "", + "empire rank 10": "", + "empire rank 11": "", + "empire rank 12": "", + "empire rank 13": "", + "empire rank 14": "", + "empire rank required": " ", + "PHRASE_BLUEPRINT_RESET ": " ", + "\/s": "\/", + "m\/s": "\/", + "Ls": ".", + "LY": ".", + "CR": ".", + "S": "M", + "M": "", + "L": "", + "H": "O", + "U": "B", + "small": "", + "medium": "", + "large": "", + "alpha": "", + "beta": "", + "standard": "", + "build name": " ", + "compare all": " ", + "create new": " ", + "damage per second": " ", + "delete all": " ", + "detailed export": " ", + "edit data": "", + "empty all": " ", + "Enter Name": " ", + "farthest range": " ", + "fuel level": " ", + "full tank": " ", + "internal compartments": " ", + "jump range": " ", + "mass lock factor": ". ", + "max mass": " ", + "net cost": " ", + "none created": " ", + "refuel time": " ", + "retrofit from": " ", + "T-Load": ".", + "utility mounts": " ", + "about": " ...", + "action": "", + "added": "", + "available": "", + "backup": " ", + "bins": "", + "build": "c", + "builds": "c", + "buy": "", + "cancel": "", + "cargo": "", + "close": "", + "compare": " ", + "comparison": "", + "comparisons": "", + "cost": "", + "create": "", + "credits": "", + "delete": "", + "dep": "", + "deployed": "", + "disabled": "", + "discount": "", + "DPS": "", + "efficiency": "", + "empty": "", + "ENG": "", + "export": "", + "forum": "", + "fuel": "", + "hardpoints": " ", + "hull": "", + "import": " ", + "insurance": "", + "jumps": "", + "laden": "", + "language": "", + "maneuverability": "", + "max": "", + "no": "", + "pen": "", + "permalink": " ", + "pri": "", + "proceed": "", + "PWR": "", + "rate": "", + "rename": "", + "repair": "", + "ret": ".", + "retracted": "", + "ROF": "\/", + "save": "", + "sell": "", + "settings": "", + "shields": "", + "ship": "", + "ships": "", + "shortened": "", + "size": "", + "skip": "", + "Stock": " ", + "SYS": "", + "time": "", + "type": "", + "unladen": "", + "URL": "", + "WEP": "", + "yes": "" +} From 6d30a549257b10091087e842c964189be38cc66d Mon Sep 17 00:00:00 2001 From: VAKazakov <47143965+VAKazakov@users.noreply.github.com> Date: Mon, 25 Jan 2021 22:10:17 +0300 Subject: [PATCH 39/66] fixing encoding and deleting excess translation --- src/app/i18n/ru.json | 909 +++++++++++++++++++++---------------------- 1 file changed, 454 insertions(+), 455 deletions(-) diff --git a/src/app/i18n/ru.json b/src/app/i18n/ru.json index d0fcdd3f..6a2f5414 100644 --- a/src/app/i18n/ru.json +++ b/src/app/i18n/ru.json @@ -1,465 +1,464 @@ { - "PHRASE_ALT_ALL": "Alt + ", - "PHRASE_BACKUP_DESC": " ", - "PHRASE_CONFIRMATION": " ?", - "PHRASE_EXPORT_DESC": " JSON- ", - "PHRASE_FASTEST_RANGE": " ", - "PHRASE_IMPORT": " ", - "PHRASE_LADEN": " ", - "PHRASE_NO_BUILDS": " ", - "PHRASE_NO_RETROCH": " ", - "PHRASE_SELECT_BUILDS": " ", - "PHRASE_SG_RECHARGE": " 50% 100% , ", - "PHRASE_SG_RECOVER": " 0% 50% , ", - "PHRASE_UNLADEN": " ", - "PHRASE_UPDATE_RDY": " . .", - "PHRASE_ENGAGEMENT_RANGE": " ", - "PHRASE_SELECT_BLUEPRINT": " ", - "PHRASE_BLUEPRINT_WORST": " ", - "PHRASE_BLUEPRINT_FIFTY": "50% ", - "PHRASE_BLUEPRINT_SEVEN_FIVE": "75% ", - "PHRASE_BLUEPRINT_RANDOM": " ", - "PHRASE_BLUEPRINT_BEST": " ", - "PHRASE_BLUEPRINT_EXTREME": " ", - "PHRASE_BLUEPRINT_RESET": " ", - "PHRASE_SELECT_SPECIAL": ", ", - "PHRASE_NO_SPECIAL": " ", - "PHRASE_SHOPPING_LIST": ", ", - "PHRASE_SHOPPING_MATS": " ", - "PHRASE_REFIT_SHOPPING_LIST": ", ", - "PHRASE_TOTAL_EFFECTIVE_SHIELD": " , , ", - "PHRASE_TIME_TO_LOSE_SHIELDS": " ", - "PHRASE_TIME_TO_RECOVER_SHIELDS": " ", - "PHRASE_TIME_TO_RECHARGE_SHIELDS": " ", - "PHRASE_SHIELD_SOURCES": " ", - "PHRASE_EFFECTIVE_SHIELD": " ", - "PHRASE_ARMOUR_SOURCES": " ", - "PHRASE_EFFECTIVE_ARMOUR": " ", - "PHRASE_DAMAGE_TAKEN": "% ", - "PHRASE_TIME_TO_LOSE_ARMOUR": " ", - "PHRASE_MODULE_PROTECTION_EXTERNAL": " ", - "PHRASE_MODULE_PROTECTION_INTERNAL": " ", - "PHRASE_OVERALL_DAMAGE": " ", - "PHRASE_SHIELD_DAMAGE": " ", - "PHRASE_ARMOUR_DAMAGE": " ", - "PHRASE_TIME_TO_REMOVE_SHIELDS": " ", - "PHRASE_MULTI_CREW_CAPACITOR_POINTS": " .", - "TT_TIME_TO_REMOVE_SHIELDS": " ", - "PHRASE_TIME_TO_REMOVE_ARMOUR": " ", - "TT_TIME_TO_REMOVE_ARMOUR": " ", - "PHRASE_TIME_TO_DRAIN_WEP": " ", - "TT_TIME_TO_DRAIN_WEP": ", ", - "TT_TIME_TO_LOSE_SHIELDS": " ", - "TT_TIME_TO_LOSE_ARMOUR": " ", - "TT_MODULE_ARMOUR": ", ", - "TT_MODULE_PROTECTION_EXTERNAL": " , ", - "TT_MODULE_PROTECTION_INTERNAL": " , ", - "TT_EFFECTIVE_SDPS_SHIELDS": " ", - "TT_EFFECTIVENESS_SHIELDS": " 0- 0 ", - "TT_EFFECTIVE_SDPS_ARMOUR": " ", - "TT_EFFECTIVENESS_ARMOUR": " 0- 0 ", - "PHRASE_EFFECTIVE_SDPS_SHIELDS": " ", - "PHRASE_EFFECTIVE_SDPS_ARMOUR": " ", - "TT_SUMMARY_SPEED": " 4 ", - "TT_SUMMARY_SPEED_NONFUNCTIONAL": " ", - "TT_SUMMARY_BOOST": " 4 ", - "TT_SUMMARY_BOOST_INTERVAL": " 4 ", - "TT_SUMMARY_BOOST_NONFUNCTIONAL": " ", - "TT_SUMMARY_SHIELDS": " , ", - "TT_SUMMARY_SHIELDS_SCB": " , SCB", - "TT_SUMMARY_SHIELDS_NONFUNCTIONAL": " ", - "TT_SUMMARY_INTEGRITY": " , ", - "TT_SUMMARY_HULL_MASS": " - ", - "TT_SUMMARY_UNLADEN_MASS": " ", - "TT_SUMMARY_LADEN_MASS": " ", - "TT_SUMMARY_DPS": " ", - "TT_SUMMARY_EPS": " ", - "TT_SUMMARY_TTD": " 4 ", - "TT_SUMMARY_MAX_SINGLE_JUMP": " , ", - "TT_SUMMARY_UNLADEN_SINGLE_JUMP": " ", - "TT_SUMMARY_LADEN_SINGLE_JUMP": " ", - "TT_SUMMARY_UNLADEN_TOTAL_JUMP": " , ", - "TT_SUMMARY_LADEN_TOTAL_JUMP": " , ", - "HELP_MODIFICATIONS_MENU": " , , ", - "PHRASE_FAIL_EDENGINEER": " EDEngineer ( EDEngineer , API , ).", - "PHRASE_FIREFOX_EDENGINEER": " EDEngineer Firefox. , Google Chrome.", - "am": " . ", - "bh": "", - "bl": " ", - "bsg": " ", - "c": "", + "PHRASE_ALT_ALL": "Alt + Нажатие для заполнения всех слотов", + "PHRASE_BACKUP_DESC": "Сохраните все данные перед переносом в другой браузер или устройство", + "PHRASE_CONFIRMATION": "Вы уверены?", + "PHRASE_EXPORT_DESC": "Детальный JSON-экспорт вашей сборки для использования в других местах и инструментах", + "PHRASE_FASTEST_RANGE": "Последовательные прыжки максимальной дальности", + "PHRASE_IMPORT": "Для импорта вставьте код в эту форму", + "PHRASE_LADEN": "Масса корабля с учётом топлива и грузов", + "PHRASE_NO_BUILDS": "Нечего сравнивать", + "PHRASE_NO_RETROCH": "Нет ранних версий сборки", + "PHRASE_SELECT_BUILDS": "Выберите конфигурацию для сравнения", + "PHRASE_SG_RECHARGE": "Восстановление с 50% до 100% объема щита, учитывая полный аккумулятор СИС в начале", + "PHRASE_SG_RECOVER": "Восстановление с 0% до 50% объема щита, учитывая полный аккумулятор СИС в начале", + "PHRASE_UNLADEN": "Масса корабля без учета топлива и грузов", + "PHRASE_UPDATE_RDY": "Доступна новая версия. Нажмите для обновления.", + "PHRASE_ENGAGEMENT_RANGE": "Дистанция между кораблём и целью", + "PHRASE_SELECT_BLUEPRINT": "Нажмите чтобы выбрать чертёж", + "PHRASE_BLUEPRINT_WORST": "Худшие основные значения для чертежа", + "PHRASE_BLUEPRINT_FIFTY": "50% значения для чертежа", + "PHRASE_BLUEPRINT_SEVEN_FIVE": "75% значения для чертежа", + "PHRASE_BLUEPRINT_RANDOM": "Случайный выбор между худшими и лучшими значениями для этого чертежа", + "PHRASE_BLUEPRINT_BEST": "Лучшие основные значения для чертежа", + "PHRASE_BLUEPRINT_EXTREME": "Лучшие положительные и худшие отрицательные основные значения для чертежа", + "PHRASE_BLUEPRINT_RESET": "Сбросить все модификаторы и чертеж", + "PHRASE_SELECT_SPECIAL": "Нажмите, чтобы выбрать экспериментальный эффект", + "PHRASE_NO_SPECIAL": "Без экспериментального эффекта", + "PHRASE_SHOPPING_LIST": "Станции, что продают эту сборку", + "PHRASE_SHOPPING_MATS": "Материалы которые нужны для сборки", + "PHRASE_REFIT_SHOPPING_LIST": "Станции, что продают необходимые модули", + "PHRASE_TOTAL_EFFECTIVE_SHIELD": "Общий урон, что может быть нанесён в каждым типе, если используются все щитонакопители", + "PHRASE_TIME_TO_LOSE_SHIELDS": "Щиты продержатся", + "PHRASE_TIME_TO_RECOVER_SHIELDS": "Щиты восстановятся за", + "PHRASE_TIME_TO_RECHARGE_SHIELDS": "Щиты будут заряжены за", + "PHRASE_SHIELD_SOURCES": "Подробности энергии щита", + "PHRASE_EFFECTIVE_SHIELD": "Эффективная сила щита против разных типов урона", + "PHRASE_ARMOUR_SOURCES": "Подробности состава брони", + "PHRASE_EFFECTIVE_ARMOUR": "Эффективная сила брони против разных типов урона", + "PHRASE_DAMAGE_TAKEN": "% общих повреждений полученных в разных типах урона", + "PHRASE_TIME_TO_LOSE_ARMOUR": "Броня продержится", + "PHRASE_MODULE_PROTECTION_EXTERNAL": "Защита гнёзд", + "PHRASE_MODULE_PROTECTION_INTERNAL": "Защита всех остальных модулей", + "PHRASE_OVERALL_DAMAGE": "Разбивка источников устойчивого ДПС", + "PHRASE_SHIELD_DAMAGE": "Подробности источников поддерживаемого ДПС против щитов", + "PHRASE_ARMOUR_DAMAGE": "Подробности источников поддерживаемого ДПС против брони", + "PHRASE_TIME_TO_REMOVE_SHIELDS": "Снимет щиты за", + "PHRASE_MULTI_CREW_CAPACITOR_POINTS": "Щелкните правой кновкой мыши чтобы объединить в группу.", + "TT_TIME_TO_REMOVE_SHIELDS": "Непрерывным огнём из всех орудий", + "PHRASE_TIME_TO_REMOVE_ARMOUR": "Снимет броню за", + "TT_TIME_TO_REMOVE_ARMOUR": "Непрерывным огнём из всех орудий", + "PHRASE_TIME_TO_DRAIN_WEP": "Опустошит ОРУЖ за", + "TT_TIME_TO_DRAIN_WEP": "Время, за которое опустошится аккумулятор ОРУЖ при стрельбе из всех орудий", + "TT_TIME_TO_LOSE_SHIELDS": "Против поддерживаемой стрельбы из всех орудий противника", + "TT_TIME_TO_LOSE_ARMOUR": "Против поддерживаемой стрельбы из всех орудий противника", + "TT_MODULE_ARMOUR": "Броня, защищающая модули от урона", + "TT_MODULE_PROTECTION_EXTERNAL": "Процент урона, перенаправленного от гнёзд на наборы для усиления модулей", + "TT_MODULE_PROTECTION_INTERNAL": "Процент урона, перенаправленного от модулей вне гнёзд на наборы для усиления модулей", + "TT_EFFECTIVE_SDPS_SHIELDS": "Реальный поддерживаемый ДПС пока аккумулятор ОРУЖ не пуст", + "TT_EFFECTIVENESS_SHIELDS": "Эффективность в сравнении с попаданием по цели с 0-сопротивляемостью без пунктов в СИС на 0 метрах", + "TT_EFFECTIVE_SDPS_ARMOUR": "Реальный поддерживаемый ДПС пока аккумулятор ОРУЖ не пуст", + "TT_EFFECTIVENESS_ARMOUR": "Эффективность в сравнении с попаданием по цели с 0-сопротивляемостью на 0 метрах", + "PHRASE_EFFECTIVE_SDPS_SHIELDS": "ПДПС против щитов", + "PHRASE_EFFECTIVE_SDPS_ARMOUR": "ПДПС против брони", + "TT_SUMMARY_SPEED": "С полным топливным баком и 4 пунктами в ДВИ", + "TT_SUMMARY_SPEED_NONFUNCTIONAL": "Маневровые двигатели выключены или превышена максимальная масса с топливом и грузом", + "TT_SUMMARY_BOOST": "С полным топливным баком и 4 пунктами в ДВИ", + "TT_SUMMARY_BOOST_INTERVAL": "Время заполнения с 4 пунктами в СИС", + "TT_SUMMARY_BOOST_NONFUNCTIONAL": "Распределитель питания не может обеспечить достаточно энергии для форсажа", + "TT_SUMMARY_SHIELDS": "Чистая сила щита, включая усилители", + "TT_SUMMARY_SHIELDS_SCB": "Прочность щита, включая бустеры и SCB", + "TT_SUMMARY_SHIELDS_NONFUNCTIONAL": "Шитогенератор отсутствует или выключен", + "TT_SUMMARY_INTEGRITY": "Целостность корабля, включая переборки и наборы для усиления корпуса", + "TT_SUMMARY_HULL_MASS": "Масса корпуса без каких-либо модулей", + "TT_SUMMARY_UNLADEN_MASS": "Масса корпуса и модулей без топлива и груза", + "TT_SUMMARY_LADEN_MASS": "Масса корпуса и модулей с топливом и грузом", + "TT_SUMMARY_DPS": "Урон в секунду при стрельбе из всех орудий", + "TT_SUMMARY_EPS": "Расход аккумулятора ОРУЖ в секунду при стрельбе из всех орудий", + "TT_SUMMARY_TTD": "Время расхода аккумулятора ОРУЖ при стрельбе из всех орудий и с 4 пунктами в ОРУЖ", + "TT_SUMMARY_MAX_SINGLE_JUMP": "Самый дальний возможный прыжок без груза и с топливом, достаточным только на сам прыжок", + "TT_SUMMARY_UNLADEN_SINGLE_JUMP": "Самый дальний возможный прыжок без груза и с полным топливным баком", + "TT_SUMMARY_LADEN_SINGLE_JUMP": "Самый дальний возможный прыжок с полным грузовым отсеком и с полным топливным баком", + "TT_SUMMARY_UNLADEN_TOTAL_JUMP": "Самая дальняя общая дистанция без груза, с полным топливным баком и при прыжках на максимальное расстояние", + "TT_SUMMARY_LADEN_TOTAL_JUMP": "Самая дальняя общая дистанция с полным грузовым отсеком, с полным топливным баком и при прыжках на максимальное расстояние", + "HELP_MODIFICATIONS_MENU": "Нажмите на номер, чтобы ввести новое значение, или потяните вдоль полосы для малых изменений", + "PHRASE_FAIL_EDENGINEER": "Не удалось отправить в EDEngineer (запустите EDEngineer и убедитесь, что API запущен, затем обновите страницу).", + "PHRASE_FIREFOX_EDENGINEER": "Отправка в EDEngineer несовместима с настройками безопасности Firefox. Пожалуйста, попробуйте еще раз в Google Chrome.", + "am": "Блок Автом. Полевого Ремонта", + "bh": "Переборки", + "bl": "Пучковый лазер", + "bsg": "Двухпоточный щитогенератор", + "c": "Орудие", "causres": "Caustic resistance", - "cc": " ", - "ch": " ", - "cr": " ", - "cs": " ", - "dc": " ", - "ec": ". ", - "fc": " ", - "fh": " ", - "fi": "FSD-", - "fs": "", - "fsd": "- ", - "ft": " ", - "fx": " ", - "hb": " ", - "hr": " ", - "hs": " ", - "kw": " ", - "ls": " ", - "mc": " ", - "axmc": " ", - "ml": " ", - "mr": " ", - "axmr": " ", - "mrp": " ", - "nl": "", - "pa": " ", - "pas": " ", - "pc": " ", - "pce": " -", - "passenger capacity": " ", - "pci": " -", - "pcm": " ", - "pcq": " ", - "pd": " ", - "pl": " ", - "po": " ", - "pp": " ", - "gpp": " C", - "gpd": " ", - "gpc": " ", - "ggc": " ", - "gsrp": " ", - "gfsb": " FSD ", - "ghrp": " ", - "gmrp": " ", - "pwa": " ", - "abl": " ", - "scl": " ", - "sdm": " ", - "tbsc": " ", - "gsc": " ", - "psg": " ", - "pv": " ", - "rf": " ", - "rfl": " ( )", - "rg": " ", - "rsl": "-", - "s": "", - "sb": " ", - "sc": " ", - "scb": "", - "sfn": " ", - "sg": "", - "ss": " ", - "sua": " ", - "t": " ", - "tp": " ", - "ul": " ", - "Send To EDEngineer": " EDEngineer", - "ws": " FSD", - "rpl": "-", - "rcpl": "-", - "xs": " ", - "tbem": " ", - "tbrfl": " ", - "dtl": "-", - "mahr": " ", - "emptyrestricted": " ()", - "damage dealt to": " ", - "damage received from": " ", - "against shields": " ", - "against hull": " ", - "total effective shield": " ", - "ammunition": "", - "secs": "", - "rebuildsperbay": " ", + "cc": "Контроллер магнитного снаряда для сбора", + "ch": "Разбрасыватель дипольных отражателей", + "cr": "Грузовой стеллаж", + "cs": "Сканер содержимого", + "dc": "Стыковочный компьютер", + "ec": "Электр. противодействие", + "fc": "Залповое орудие", + "fh": "Ангар для истребителя", + "fi": "FSD-перехватчик", + "fs": "Топливозаборник", + "fsd": "Рамочно-сместительный двигатель", + "ft": "Топливный бак", + "fx": "Контроллер магнитного снаряда для топлива", + "hb": "Контроллер магнитного снаряда для взлома трюма", + "hr": "Набор для усиления корпуса", + "hs": "Теплоотводная катапульта", + "kw": "Сканер преступников", + "ls": "Система жизнеобеспечения", + "mc": "Многоствольное орудие", + "axmc": "Многоствольное орудие АИ", + "ml": "Проходочный лазер", + "mr": "Ракетный лоток", + "axmr": "Блок ракет АИ", + "mrp": "Набор для усиления модуля", + "nl": "Мины", + "pa": "Ускоритель плазмы", + "pas": "Комплект для сближения с планетой", + "pc": "Контроллер магнитного снаряда для геологоразведки", + "pce": "Каюта пассажира эконом-класса", + "passenger capacity": "количество пассажиров", + "pci": "Каюта пассажира бизнес-класса", + "pcm": "Каюта пассажира первого класса", + "pcq": "Каюта пассажира класса люкс", + "pd": "Распределитель питания", + "pl": "Импульсный лазер", + "po": "Точечная оборона", + "pp": "Силовая установка", + "gpp": "Силовая установка Cтражей", + "gpd": "Гибридный распределитель питания Стражей", + "gpc": "Плазменная пушка Стражей", + "ggc": "Пушка Гаусса Стражей", + "gsrp": "Набор для усиления щита Стражей", + "gfsb": "Ускоритель FSD Стражей", + "ghrp": "Набор для усиления корпуса Стражей", + "gmrp": "Набор для усиления модуля Стражей", + "pwa": "Анализатор импульсных волн", + "abl": "Абразивный бластер", + "scl": "Пусковая установка для сейсмических снарядов", + "sdm": "Вытесняющая ракета для добычи глубинных залежей", + "tbsc": "Шоковое орудие", + "gsc": "Осколочное орудие Стражей", + "psg": "Призматический щитогенератор", + "pv": "Гараж для планетарного транспорта", + "rf": "Устройство переработки", + "rfl": "Зенитная установка (снаряды с дистанционным подрывом)", + "rg": "Электромагнитная пушка", + "rsl": "Дроны-исследователи", + "s": "Сенсоры", + "sb": "Усилитель щита", + "sc": "Сканер обнаружения", + "scb": "Щитонакопитель", + "sfn": "Нейтрализатор глушащего поля", + "sg": "Щитогенератор", + "ss": "Сканер поверхностей", + "sua": "Помощь в гиперкрейсерском режиме", + "t": "Маневровые двигатели", + "tp": "Торпедная стойка", + "ul": "Пульсирующие лазеры", + "Send To EDEngineer": "Отправить в EDEngineer", + "ws": "Сканер следа FSD", + "rpl": "Дроны-ремонтники", + "rcpl": "ДРоны-разведчики", + "xs": "Сканер «инопланетянин»", + "tbem": "Блок энзимных ракет", + "tbrfl": "Установка для стрельбы стреловидными снарядами с дистанционным подрывом", + "dtl": "Дроны-очистители", + "mahr": "Набор для усиления корпуса из Метасплава", + "emptyrestricted": "пусто (ограниченно)", + "damage dealt to": "Урон нанесён", + "damage received from": "Урон получен от", + "against shields": "Против щитов", + "against hull": "Против корпуса", + "total effective shield": "Общие эффективные щиты", + "ammunition": "Припасы", + "secs": "с", + "rebuildsperbay": "Построек за полосу", "mroll": "Roll", - "worst": "", - "average": "", - "random": "", - "best": "", - "extreme": "", - "reset": "", - "dpe": " ", - "dps": " ", - "sdps": " ", - "dpssdps": " ( )", - "eps": " ", - "epsseps": " ( )", - "fallofffromrange": "", - "hps": " ", - "hpsshps": " ( )", - "damage by": "", - "damage from": " ", - "shield cells": "", - "recovery": "", - "recharge": "", - "engine pips": " ", - "4b": "4 ", - "speed": "", - "pitch": "", - "roll": "", - "yaw": "", - "internal protection": " ", - "external protection": " ", - "engagement range": " ", - "boost interval": " ", - "total": "", - "ammo": ". ", - "boot": " ", - "hacktime": " ", - "brokenregen": " ", - "burst": " ", - "burstrof": " ", - "clip": " ", - "damage": "", - "distdraw": " ", - "duration": "", - "eff": "", - "engcap": " ", - "engrate": " ", - "explres": " ", - "facinglimit": " ", - "hullboost": " ", - "hullreinforcement": " ", - "integrity": "", - "jitter": "", - "kinres": " ", - "maxfuel": ". ", - "mass": "", - "optmass": " ", - "optmul": " ", - "pgen": "", - "piercing": "", - "power": "", - "protection": " ", - "range": "", - "ranget": "", - "regen": " ", - "reload": "", - "rof": "", - "angle": " ", - "scanrate": " ", - "proberadius": " ", - "scantime": " ", - "shield": "", - "armour": "", - "shieldboost": " ", - "shieldreinforcement": " ", - "shotspeed": " ", - "shotdmg": " (DPS)", - "spinup": " ", - "syscap": " ", - "sysrate": " ", - "thermload": " ", - "thermres": " ", - "wepcap": " ", - "weprate": " ", - "minmass_sg": ". ", - "optmass_sg": ". ", - "maxmass_sg": ". ", - "minmul_sg": " ", - "optmul_sg": " ", - "maxmul_sg": " ", - "minmass_psg": ". ", - "optmass_psg": ". ", - "maxmass_psg": ". ", - "minmul_psg": " ", - "optmul_psg": " ", - "maxmul_psg": " ", - "minmass_bsg": ". ", - "optmass_bsg": ". ", - "maxmass_bsg": ". ", - "minmul_bsg": " ", - "optmul_bsg": " ", - "maxmul_bsg": " ", - "range_s": " ", - "absolute": "", - "explosive": ".", - "kinetic": ".", - "thermal": ".", - "caustic": "", - "generator": "", - "boosters": "", - "cells": "", - "shield addition": " ", - "jump addition": " ", - "bulkheads": "", - "reinforcement": "", - "power and costs": " ", - "costs": "", - "retrofit costs": " ", - "reload costs": " ", - "profiles": "", - "engine profile": "", + "worst": "Худшее", + "average": "Среднее", + "random": "Случайное", + "best": "Лучшее", + "extreme": "Экстремальное", + "reset": "Сброс", + "dpe": "Урон на МДж энергии", + "dps": "Урон в Секунду", + "sdps": "Поддерживаемый урон в секунду", + "dpssdps": "Урон в секунду (поддерживаемый урон в секунду)", + "eps": "Энергия в секунду", + "epsseps": "Энергия в секунду (поддерживаемая энергия в секунду)", + "fallofffromrange": "Спад", + "hps": "Нагрев в секунду", + "hpsshps": "Нагрев в секунду (поддерживаемый нагрев в секунду)", + "damage by": "Урон", + "damage from": "Урон от", + "shield cells": "Щитонакопители", + "recovery": "включение", + "recharge": "перезарядка", + "engine pips": "Пункты в двигателе", + "4b": "4 пункта и Форсаж", + "speed": "скорость", + "pitch": "Тангаж", + "roll": "Крен", + "yaw": "Рыскание", + "internal protection": "Внутренняя защита", + "external protection": "Внешняя защита", + "engagement range": "Боевое расстояние", + "boost interval": "Интервал повышения", + "total": "Всего", + "ammo": "Макс. боекомплект", + "boot": "Время загрузки", + "hacktime": "Время взлома", + "brokenregen": "Скорость восстановления при пробое", + "burst": "Длина очереди", + "burstrof": "Скорострельность очереди", + "clip": "Размер боекомплекта", + "damage": "Урон", + "distdraw": "Тяга распределителя", + "duration": "Продолжительность", + "eff": "Эффективность", + "engcap": "Ресурс двигателей", + "engrate": "Перезарядка двигателей", + "explres": "Сопротивление взрывам", + "facinglimit": "Ограничение по направлению", + "hullboost": "Увеличение корпуса", + "hullreinforcement": "Укрепление корпуса", + "integrity": "Целостность", + "jitter": "Дрожание", + "kinres": "Сопротивление кинетическому урону", + "maxfuel": "Макс. топлива на прыжок", + "mass": "Масса", + "optmass": "Оптимизированная масса", + "optmul": "Оптимальный усилитель", + "pgen": "Мощность", + "piercing": "Бронебойность", + "power": "Мощность", + "protection": "Защита от повреждений", + "range": "Дальность", + "ranget": "Дальность", + "regen": "Скорость восстановления", + "reload": "Перезагрузить", + "rof": "Скорострельность", + "angle": "Угол сканера", + "scanrate": "Скорость сканера", + "proberadius": "Радиус зонда", + "scantime": "Время сканирования", + "shield": "Щит", + "armour": "Броня", + "shieldboost": "Усиление щитов", + "shieldreinforcement": "Усилитель щита", + "shotspeed": "Скорость выстрела", + "shotdmg": "Урон за выстрел(DPS)", + "spinup": "Время раскрутки", + "syscap": "Ресурс систем", + "sysrate": "Перезарядка систем", + "thermload": "Тепловая нагрузка", + "thermres": "Сопротивление термическому урону", + "wepcap": "Орудийный ресурс", + "weprate": "Перезарядка оружия", + "minmass_sg": "Мин. масса корпуса", + "optmass_sg": "Опт. масса корпуса", + "maxmass_sg": "Макс. масса корпуса", + "minmul_sg": "Минимальная прочность", + "optmul_sg": "Оптимальная прочность", + "maxmul_sg": "Максимальная прочность", + "minmass_psg": "Мин. масса корпуса", + "optmass_psg": "Опт. масса корпуса", + "maxmass_psg": "Макс. масса корпуса", + "minmul_psg": "Минимальная прочность", + "optmul_psg": "Оптимальная прочность", + "maxmul_psg": "Максимальная прочность", + "minmass_bsg": "Мин. масса корпуса", + "optmass_bsg": "Опт. масса корпуса", + "maxmass_bsg": "Макс. масса корпуса", + "minmul_bsg": "Минимальная прочность", + "optmul_bsg": "Оптимальная прочность", + "maxmul_bsg": "Максимальная прочность", + "range_s": "Типовой диапозон выброса", + "absolute": "Общий", + "explosive": "Взрывч.", + "kinetic": "Механич.", + "thermal": "Тепл.", + "caustic": "Каустик", + "generator": "Генератор", + "boosters": "Усилители", + "cells": "Ячейки", + "shield addition": "ДОбавления к щиту", + "jump addition": "ДОбавления к прыжку", + "bulkheads": "Переборки", + "reinforcement": "Усилители", + "power and costs": "Энергия и стоимость", + "costs": "Расходы", + "retrofit costs": "цена модификации", + "reload costs": "Стоимость перезарядки", + "profiles": "Графики", + "engine profile": "Двигатели", "fsd profile": "FSD", - "movement profile": "", - "damage to opponent's shields": " ", - "damage to opponent's hull": " ", - "offence": "", - "defence": "", - "shield metrics": " ", - "raw shield strength": " ", - "shield sources": " ", - "damage taken": " ", - "effective shield": " ", - "armour metrics": " ", - "raw armour strength": " ", - "armour sources": " ", - "raw module armour": " ", - "effective armour": " ", - "offence metrics": " ", - "defence metrics": " ", - "fuel carried": " ", - "cargo carried": " ", - "ship control": " ", - "opponent": "", - "opponent's shields": " ", - "opponent's armour": " ", + "movement profile": "Движение", + "damage to opponent's shields": "Урон щиту противника", + "damage to opponent's hull": "Урон корпусу противника", + "offence": "Нападение", + "defence": "Оборона", + "shield metrics": "Данные щита", + "raw shield strength": "Чистая мощность щита", + "shield sources": "Ресурсы щита", + "damage taken": "Полученный урон", + "effective shield": "Эффективный щит", + "armour metrics": "Данные брони", + "raw armour strength": "Чистая мощность брони", + "armour sources": "Ресурсы брони", + "raw module armour": "Чистая броня модулей", + "effective armour": "Эффективная броня", + "offence metrics": "Данные нападения", + "defence metrics": "Данные обороны", + "fuel carried": "Топливо на борту", + "cargo carried": "Груз на борту", + "ship control": "Управление кораблём", + "opponent": "Противник", + "opponent's shields": "Щит противника", + "opponent's armour": "Броня противника", "overall damage": "overall damage", - "shield damage sources": " ", - "armour damage sources": " ", - "never": "", - "stock": "", - "boost": "", + "shield damage sources": "источники урона по щиту", + "armour damage sources": "источники урона по броне", + "never": "Никогда", + "stock": "базовый", + "boost": "форсаж", "tab_defence": "defence", - "federation rank 1": "", - "federation rank 2": "", - "federation rank 3": "", - "federation rank 4": "", - "federation rank 5": " ", - "federation rank 6": "-", - "federation rank 7": "", - "federation rank 8": "", - "federation rank 9": "-", - "federation rank 10": " ", - "federation rank 11": " ", - "federation rank 12": "-", - "federation rank 13": " -", - "federation rank 14": "", - "federation rank required": " ", - "empire rank 1": "", - "empire rank 2": "", - "empire rank 3": "", - "empire rank 4": "", - "empire rank 5": "", - "empire rank 6": "", - "empire rank 7": "", - "empire rank 8": "", - "empire rank 9": "", - "empire rank 10": "", - "empire rank 11": "", - "empire rank 12": "", - "empire rank 13": "", - "empire rank 14": "", - "empire rank required": " ", - "PHRASE_BLUEPRINT_RESET ": " ", - "\/s": "\/", - "m\/s": "\/", - "Ls": ".", - "LY": ".", - "CR": ".", + "federation rank 1": "Рекрут", + "federation rank 2": "Кадет", + "federation rank 3": "Гардемарин", + "federation rank 4": "Старшина", + "federation rank 5": "Главный старшина", + "federation rank 6": "Уорент-офицер", + "federation rank 7": "Энсин", + "federation rank 8": "Лейтенант", + "federation rank 9": "Капитан-лейтенант", + "federation rank 10": "Начальник гарнизона", + "federation rank 11": "Командир корабля", + "federation rank 12": "Контр-адмирал", + "federation rank 13": " Вице-адмирал", + "federation rank 14": "Адмирал", + "federation rank required": "Минимальный ранг федерации для покупки", + "empire rank 1": "Чужак", + "empire rank 2": "Крепостной", + "empire rank 3": "Мастер", + "empire rank 4": "Оруженосец", + "empire rank 5": "Рыцарь", + "empire rank 6": "Лорд", + "empire rank 7": "Барон", + "empire rank 8": "Виконт", + "empire rank 9": "Граф", + "empire rank 10": "Эрл", + "empire rank 11": "Маркиз", + "empire rank 12": "Герцог", + "empire rank 13": "Принц", + "empire rank 14": "Король", + "empire rank required": "Минимальный ранг империи для покупки", + "\/s": "\/с", + "m\/s": "м\/с", + "Ls": "Св.сек", + "LY": "Св.лет", + "CR": "кр.", "S": "M", - "M": "", - "L": "", + "M": "С", + "L": "б", "H": "O", "U": "B", - "small": "", - "medium": "", - "large": "", - "alpha": "", - "beta": "", - "standard": "", - "build name": " ", - "compare all": " ", - "create new": " ", - "damage per second": " ", - "delete all": " ", - "detailed export": " ", - "edit data": "", - "empty all": " ", - "Enter Name": " ", - "farthest range": " ", - "fuel level": " ", - "full tank": " ", - "internal compartments": " ", - "jump range": " ", - "mass lock factor": ". ", - "max mass": " ", - "net cost": " ", - "none created": " ", - "refuel time": " ", - "retrofit from": " ", - "T-Load": ".", - "utility mounts": " ", - "about": " ...", - "action": "", - "added": "", - "available": "", - "backup": " ", - "bins": "", - "build": "c", - "builds": "c", - "buy": "", - "cancel": "", - "cargo": "", - "close": "", - "compare": " ", - "comparison": "", - "comparisons": "", - "cost": "", - "create": "", - "credits": "", - "delete": "", - "dep": "", - "deployed": "", - "disabled": "", - "discount": "", - "DPS": "", - "efficiency": "", - "empty": "", - "ENG": "", - "export": "", - "forum": "", - "fuel": "", - "hardpoints": " ", - "hull": "", - "import": " ", - "insurance": "", - "jumps": "", - "laden": "", - "language": "", - "maneuverability": "", - "max": "", - "no": "", - "pen": "", - "permalink": " ", - "pri": "", - "proceed": "", - "PWR": "", - "rate": "", - "rename": "", - "repair": "", - "ret": ".", - "retracted": "", - "ROF": "\/", - "save": "", - "sell": "", - "settings": "", - "shields": "", - "ship": "", - "ships": "", - "shortened": "", - "size": "", - "skip": "", - "Stock": " ", - "SYS": "", - "time": "", - "type": "", - "unladen": "", - "URL": "", - "WEP": "", - "yes": "" + "small": "Малый", + "medium": "Средний", + "large": "большой", + "alpha": "Альфа", + "beta": "Бета", + "standard": "Стандартный", + "build name": "название сборки", + "compare all": "сравнить все", + "create new": "Создать новый", + "damage per second": "урон в секунду", + "delete all": "Удалить все", + "detailed export": "Подробный экспорт", + "edit data": "Редактирование", + "empty all": "пусто все", + "Enter Name": "Введите имя", + "farthest range": "быстрый диапазон", + "fuel level": "уровень топлива", + "full tank": "Полный бак", + "internal compartments": "внутренние отсеки", + "jump range": "Дальность прыжка", + "mass lock factor": "Масс. блок", + "max mass": "Максимальная масса", + "net cost": "разница в цене", + "none created": "не создано", + "refuel time": "Время дозаправки", + "retrofit from": "модификация от", + "T-Load": "Тепл.", + "utility mounts": "Вспомогательное оборудование", + "about": "О ...", + "action": "Действие", + "added": "Добавлено", + "available": "доступно", + "backup": "Резервная копия", + "bins": "контейнеры", + "build": "cборка", + "builds": "cборки", + "buy": "купить", + "cancel": "отменить", + "cargo": "Груз", + "close": "закрыть", + "compare": "сравнить ", + "comparison": "сравнение", + "comparisons": "сравнения", + "cost": "Стоимость", + "create": "создать", + "credits": "Кредиты", + "delete": "Удалить", + "dep": "Вып", + "deployed": "Открыты", + "disabled": "Отключено", + "discount": "Скидка", + "DPS": "УВС", + "efficiency": "Эффективность", + "empty": "пусто", + "ENG": "ДВИ", + "export": "Экспорт", + "forum": "Форум", + "fuel": "Топливо", + "hardpoints": "Орудийные порты", + "hull": "Корпус", + "import": "импортировать ", + "insurance": "Страховка", + "jumps": "Прыжков", + "laden": "Груженый", + "language": "Язык", + "maneuverability": "Маневренность", + "max": "Макс", + "no": "Нет", + "pen": "ПБ", + "permalink": "Постоянная ссылка", + "pri": "Осн", + "proceed": "продолжить", + "PWR": "Эн", + "rate": "скорость", + "rename": "Переименовать", + "repair": "Починка", + "ret": "Убр.", + "retracted": "Убрано", + "ROF": "В\/сек", + "save": "Сохранить", + "sell": "Продать", + "settings": "Настройки", + "shields": "Щиты", + "ship": "Корабль", + "ships": "Корабли", + "shortened": "Укороченный", + "size": "размер", + "skip": "пропустить", + "Stock": "Стандартная комплектация", + "SYS": "СИС", + "time": "Время", + "type": "Тип", + "unladen": "Пустой", + "URL": "Ссылка", + "WEP": "ОРУЖ", + "yes": "Да" } From 46ba782911e5b0c27c048b6c84ca0cc563cf0d4a Mon Sep 17 00:00:00 2001 From: Felix Linker Date: Sat, 23 Jan 2021 15:15:38 +0100 Subject: [PATCH 40/66] Remove hosting from repository --- .dockerignore | 77 ------------------------------------- .gitlab-ci.yml | 13 ------- Dockerfile | 36 ----------------- Dockerfile.dev | 36 ----------------- docker-compose.yml | 44 --------------------- nginx.conf | 96 ---------------------------------------------- 6 files changed, 302 deletions(-) delete mode 100644 .dockerignore delete mode 100644 .gitlab-ci.yml delete mode 100644 Dockerfile delete mode 100644 Dockerfile.dev delete mode 100644 docker-compose.yml delete mode 100644 nginx.conf diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index c43179e2..00000000 --- a/.dockerignore +++ /dev/null @@ -1,77 +0,0 @@ -node_modules -npm-debug.log -### Node template -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless - diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 85d3a7f5..00000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,13 +0,0 @@ -image: docker:stable -services: - - docker:dind - -stages: - - Build image - -docker build: - stage: Build image - script: - - img build --build-arg branch=$CI_COMMIT_REF_NAME -t edcd/coriolis:$CI_COMMIT_REF_NAME . - - echo "$REGISTRY_PASSWORD" | img login --username "$REGISTRY_USER" --password-stdin - - img push edcd/coriolis:$CI_COMMIT_REF_NAME diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index fb4d3284..00000000 --- a/Dockerfile +++ /dev/null @@ -1,36 +0,0 @@ -### STAGE 1: Build ### -FROM node:9.11.1-alpine as builder -ENV BRANCH=master -WORKDIR /src/app -RUN mkdir -p /src/app/coriolis -RUN mkdir -p /src/app/coriolis-data - -RUN apk add --update git - -RUN npm i -g npm -ADD https://api.github.com/repos/edcd/coriolis-data/git/refs/heads/master /tmp/version.json - -# Set up coriolis-data -WORKDIR /src/app/coriolis-data -RUN git clone https://github.com/EDCD/coriolis-data.git . -RUN git checkout ${BRANCH} -RUN npm install --no-package-lock -RUN npm start - - -ADD https://api.github.com/repos/edcd/coriolis/git/refs/heads/master /tmp/version.json -# Set up coriolis -WORKDIR /src/app/coriolis -RUN git clone https://github.com/EDCD/coriolis.git . -RUN git checkout ${BRANCH} -RUN npm install --no-package-lock -RUN npm run build - - -### STAGE 2: Production Environment ### -FROM fholzer/nginx-brotli as web -COPY nginx.conf /etc/nginx/nginx.conf -COPY --from=builder /src/app/coriolis/build /usr/share/nginx/html -WORKDIR /usr/share/nginx/html -EXPOSE 80 -CMD ["nginx", "-c", "/etc/nginx/nginx.conf", "-g", "daemon off;"] diff --git a/Dockerfile.dev b/Dockerfile.dev deleted file mode 100644 index 9934de70..00000000 --- a/Dockerfile.dev +++ /dev/null @@ -1,36 +0,0 @@ -### STAGE 1: Build ### -FROM node:9.11.1-alpine as builder -ENV BRANCH=develop -WORKDIR /src/app -RUN mkdir -p /src/app/coriolis -RUN mkdir -p /src/app/coriolis-data - -RUN apk add --update git - -RUN npm i -g npm - -ADD https://api.github.com/repos/edcd/coriolis-data/git/refs/heads/develop /tmp/version.json -# Set up coriolis-data -WORKDIR /src/app/coriolis-data -RUN git clone https://github.com/EDCD/coriolis-data.git . -RUN git checkout ${BRANCH} -RUN npm install --no-package-lock -RUN npm start - - -ADD https://api.github.com/repos/edcd/coriolis/git/refs/heads/develop /tmp/version.json -# Set up coriolis -WORKDIR /src/app/coriolis -RUN git clone https://github.com/EDCD/coriolis.git . -RUN git checkout ${BRANCH} -RUN npm install --no-package-lock -RUN npm run build - - -### STAGE 2: Production Environment ### -FROM fholzer/nginx-brotli as web -COPY nginx.conf /etc/nginx/nginx.conf -COPY --from=builder /src/app/coriolis/build /usr/share/nginx/html -WORKDIR /usr/share/nginx/html -EXPOSE 80 -CMD ["nginx", "-c", "/etc/nginx/nginx.conf", "-g", "daemon off;"] diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 4fbaee70..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,44 +0,0 @@ -version: '3.6' - -services: - master: - image: edcd/coriolis:master - build: - dockerfile: Dockerfile - context: . - args: - branch: master - restart: always - volumes: - - ./nginx.conf:/etc/nginx/nginx.conf - networks: - - web - labels: - - "traefik.docker.network=web" - - "traefik.enable=true" - - "traefik.basic.frontend.rule=Host:coriolis.io,coriolis.edcd.io" - - "traefik.basic.port=80" - - "traefik.basic.protocol=http" - - develop: - image: edcd/coriolis:develop - build: - dockerfile: Dockerfile.dev - context: . - args: - branch: develop - restart: always - volumes: - - ./nginx.conf:/etc/nginx/nginx.conf - networks: - - web - labels: - - "traefik.docker.network=web" - - "traefik.enable=true" - - "traefik.basic.frontend.rule=Host:beta.coriolis.io,beta.coriolis.edcd.io" - - "traefik.basic.port=80" - - "traefik.basic.protocol=http" - -networks: - web: - external: true diff --git a/nginx.conf b/nginx.conf deleted file mode 100644 index 874aefa0..00000000 --- a/nginx.conf +++ /dev/null @@ -1,96 +0,0 @@ -worker_processes 1; -user nobody nobody; -error_log /tmp/error.log; -pid /tmp/nginx.pid; - -events { - - worker_connections 1024; -} - -http { - - include /etc/nginx/mime.types; - default_type application/octet-stream; - sendfile on; - client_body_temp_path /tmp/client_body; - fastcgi_temp_path /tmp/fastcgi_temp; - proxy_temp_path /tmp/proxy_temp; - scgi_temp_path /tmp/scgi_temp; - uwsgi_temp_path /tmp/uwsgi_temp; - access_log /tmp/access.log; - error_log /tmp/error.log; - - # https://nginx.org/en/docs/http/ngx_http_gzip_module.html - # Enable gzip compression. - # Default: off - gzip off; - - # Compression level (1-9). - # 5 is a perfect compromise between size and CPU usage, offering about - # 75% reduction for most ASCII files (almost identical to level 9). - # Default: 1 - gzip_comp_level 5; - - # Don't compress anything that's already small and unlikely to shrink much - # if at all (the default is 20 bytes, which is bad as that usually leads to - # larger files after gzipping). - # Default: 20 - gzip_min_length 256; - - # Compress data even for clients that are connecting to us via proxies, - # identified by the "Via" header (required for CloudFront). - # Default: off - gzip_proxied any; - - # Tell proxies to cache both the gzipped and regular version of a resource - # whenever the client's Accept-Encoding capabilities header varies; - # Avoids the issue where a non-gzip capable client (which is extremely rare - # today) would display gibberish if their proxy gave them the gzipped version. - # Default: off - gzip_vary on; - - # Compress all output labeled with one of the following MIME-types. - # text/html is always compressed by gzip module. - # Default: text/html - gzip_types *; - brotli on; - # brotli_static on; - brotli_types *; - # This should be turned on if you are going to have pre-compressed copies (.gz) of - # static files available. If not it should be left off as it will cause extra I/O - # for the check. It is best if you enable this in a location{} block for - # a specific directory, or on an individual server{} level. - # gzip_static on; - keepalive_timeout 3000; - server { - listen 80; - listen [::]:80; - index index.html; - server_name localhost; - root /usr/share/nginx/html; - autoindex on; - - location ~* \.(?:manifest|appcache|html?|xml|json|css|js|map|jpg|jpeg|gif|png|ico|svg|eot|ttf|woff|woff2)$ { - add_header Access-Control-Allow-Origin *; - add_header Access-Control-Allow-Credentials true; - add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; - add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; - access_log off; - } - location /service-worker.js { - expires -1; - add_header Access-Control-Allow-Origin *; - add_header Access-Control-Allow-Credentials true; - add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; - add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; - access_log off; - } - location / { - try_files $uri $uri/ /index.html =404; - } - location /iframe.html { - try_files $uri $uri/ /iframe.html =404; - } - } -} From 50401410962c80e6809d105788cb1620d54285f3 Mon Sep 17 00:00:00 2001 From: Felix Linker Date: Sun, 31 Jan 2021 16:52:40 +0100 Subject: [PATCH 41/66] Remove dead announcements code --- src/app/Coriolis.jsx | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/app/Coriolis.jsx b/src/app/Coriolis.jsx index c90049ad..47485ae4 100644 --- a/src/app/Coriolis.jsx +++ b/src/app/Coriolis.jsx @@ -73,7 +73,6 @@ export default class Coriolis extends React.Component { route: {}, sizeRatio: Persist.getSizeRatio() }; - // this._getAnnouncements(); Router('', (r) => this._setPage(ShipyardPage, r)); Router('/import?', (r) => this._importBuild(r)); Router('/import/:data', (r) => this._importBuild(r)); @@ -127,16 +126,6 @@ export default class Coriolis extends React.Component { } } - async _getAnnouncements() { - try { - const announces = await request.get('https://api.orbis.zone/announcements') - .query({ coriolis: true }); - this.setState({ announcements: announces.body }); - } catch (err) { - console.error(err) - } - } - /** * Updates / Sets the page and route context * @param {[type]} page The page to be shown From 888f807a7b418981566f79f8fc3d0eeb143b0d9a Mon Sep 17 00:00:00 2001 From: Felix Linker Date: Sun, 31 Jan 2021 16:57:55 +0100 Subject: [PATCH 42/66] Remove orbis related code --- src/app/components/Header.jsx | 39 ------- src/app/components/ModalBatchOrbis.jsx | 93 ---------------- src/app/components/ModalOrbis.jsx | 141 ------------------------- src/app/components/SvgIcons.jsx | 3 +- src/app/pages/OutfittingPage.jsx | 25 ----- src/app/stores/Persist.js | 24 ----- 6 files changed, 2 insertions(+), 323 deletions(-) delete mode 100644 src/app/components/ModalBatchOrbis.jsx delete mode 100644 src/app/components/ModalOrbis.jsx diff --git a/src/app/components/Header.jsx b/src/app/components/Header.jsx index 6c56e504..18cca21a 100644 --- a/src/app/components/Header.jsx +++ b/src/app/components/Header.jsx @@ -10,7 +10,6 @@ import { Ships } from 'coriolis-data/dist'; import Persist from '../stores/Persist'; import { toDetailedExport } from '../shipyard/Serializer'; import Ship from '../shipyard/Ship'; -import ModalBatchOrbis from './ModalBatchOrbis'; import ModalDeleteAll from './ModalDeleteAll'; import ModalExport from './ModalExport'; import ModalHelp from './ModalHelp'; @@ -241,43 +240,6 @@ export default class Header extends TranslatedComponent { />); }; - /** - * Uploads all ship-builds to orbis - * @param {e} e Event - */ - _uploadAllBuildsToOrbis(e) { - e.preventDefault(); - const data = Persist.getBuilds(); - let postObject = []; - for (const ship in data) { - for (const code in data[ship]) { - const shipModel = ship; - if (!shipModel) { - throw 'No such ship found: "' + ship + '"'; - } - const shipTemplate = Ships[shipModel]; - const shipPostObject = {}; - let shipInstance = new Ship(shipModel, shipTemplate.properties, shipTemplate.slots); - shipInstance.buildWith(null); - shipInstance.buildFrom(data[ship][code]); - shipPostObject.coriolisId = shipInstance.id; - shipPostObject.coriolisShip = shipInstance; - - shipPostObject.coriolisShip.url = window.location.origin + outfitURL(shipModel, data[ship][code], code); - shipPostObject.title = code || shipInstance.id; - shipPostObject.description = code || shipInstance.id; - shipPostObject.ShipName = shipInstance.id; - shipPostObject.Ship = shipInstance.id; - postObject.push(shipPostObject); - } - } - console.log(postObject); - - this.context.showModal(); - } - /** * Show export modal with detailed export * @param {SyntheticEvent} e Event @@ -499,7 +461,6 @@ export default class Header extends TranslatedComponent { {translate('builds')} & {translate('comparisons')}
  • {translate('backup')}
  • {translate('detailed export')}
  • -
  • {translate('upload all builds to orbis')}
  • {translate('import')}
  • {translate('delete all')}
  • diff --git a/src/app/components/ModalBatchOrbis.jsx b/src/app/components/ModalBatchOrbis.jsx deleted file mode 100644 index 3e1c9ad5..00000000 --- a/src/app/components/ModalBatchOrbis.jsx +++ /dev/null @@ -1,93 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import request from 'superagent'; -import TranslatedComponent from './TranslatedComponent'; -import { orbisUpload } from '../utils/ShortenUrl'; -import Persist from '../stores/Persist'; - -/** - * Permalink modal - */ -export default class ModalBatchOrbis extends TranslatedComponent { - - static propTypes = { - ships: PropTypes.any.isRequired - }; - - /** - * Constructor - * @param {Object} props React Component properties - */ - constructor(props) { - super(props); - - this.state = { - orbisCreds: Persist.getOrbisCreds(), - resp: '' - }; - } - - /** - * Send ship to Orbis.zone - * @param {SyntheticEvent} e React Event - * @return {Promise} Promise sending post request to orbis - */ - sendToOrbis(e) { - let agent; - try { - agent = request.agent(); // apparently this crashes somehow - } catch (e) { - console.error(e); - } - if (!agent) { - agent = request; - } - const API_ORBIS = 'https://orbis.zone/api/builds/add/batch'; - return new Promise((resolve, reject) => { - try { - agent - .post(API_ORBIS) - .withCredentials() - .redirects(0) - .set('Content-Type', 'application/json') - .send(this.props.ships) - .end((err, response) => { - console.log(response); - if (err) { - console.error(err); - this.setState({ resp: response.text }); - reject('Bad Request'); - } else { - this.setState({ resp: 'All builds uploaded. Check https://orbis.zone' }); - resolve('All builds uploaded. Check https://orbis.zone'); - } - }); - } catch (e) { - console.log(e); - reject(e.message ? e.message : e); - } - }); - } - - /** - * Render the modal - * @return {React.Component} Modal Content - */ - render() { - let translate = this.context.language.translate; - this.sendToOrbis = this.sendToOrbis.bind(this); - - return
    e.stopPropagation() }> -

    {translate('permalink')}

    -
    - Log in / signup to Orbis -

    -

    {translate('success')}

    - e.target.select() }/> -

    -

    Orbis.zone is currently in a trial period, and may be wiped at any time as development progresses. Some elements are also still placeholders.

    - - -
    ; - } -} diff --git a/src/app/components/ModalOrbis.jsx b/src/app/components/ModalOrbis.jsx deleted file mode 100644 index 9580fdfb..00000000 --- a/src/app/components/ModalOrbis.jsx +++ /dev/null @@ -1,141 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import TranslatedComponent from './TranslatedComponent'; -import { orbisUpload } from '../utils/ShortenUrl'; -import Persist from '../stores/Persist'; - -/** - * Permalink modal - */ -export default class ModalOrbis extends TranslatedComponent { - - static propTypes = { - ship: PropTypes.any.isRequired - }; - - /** - * Constructor - * @param {Object} props React Component properties - */ - constructor(props) { - super(props); - - this.state = { - orbisCreds: Persist.getOrbisCreds(), - orbisUrl: '...', - ship: this.props.ship, - authenticatedStatus: 'Checking...' - }; - this.orbisCategory = this.orbisCategory.bind(this); - } - - /** - * Send ship to Orbis.zone - * @param {SyntheticEvent} e React Event - */ - sendToOrbis(e) { - const target = e.target; - target.disabled = true; - this.setState({ orbisUrl: 'Sending...' }, () => { - orbisUpload(this.props.ship, this.state.orbisCreds) - .then(orbisUrl => { - target.disabled = false; - this.setState({ orbisUrl }); - }) - .catch(err => { - target.disabled = false; - this.setState({ orbisUrl: 'Error - ' + err }); - }); - }); - } - - /** - * Get Orbis.zone auth status - * @returns {Object} auth status - */ - getOrbisAuthStatus() { - return fetch('https://orbis.zone/api/checkauth', { - credentials: 'include', - mode: 'cors' - }) - .then(data => data.json()) - .then(res => { - this.setState({ authenticatedStatus: res.status || res.error }); - }) - .catch(err => { - console.error(err); - this.setState({ authenticatedStatus: err.message }); - }); - } - - /** - * Handler for changing cmdr name - * @param {SyntheticEvent} e React Event - */ - orbisPasswordHandler(e) { - let password = e.target.value; - this.setState({ orbisCreds: { email: this.state.orbisCreds.email, password } }, () => { - Persist.setOrbisCreds(this.state.orbisCreds); - }); - } - - /** - * Handler for changing cmdr name - * @param {SyntheticEvent} e React Event - */ - orbisUsername(e) { - let orbisUsername = e.target.value; - this.setState({ orbisCreds: { email: orbisUsername, password: this.state.orbisCreds.password } }, () => { - Persist.setOrbisCreds(this.state.orbisCreds); - }); - } - - /** - * Handler for changing category - * @param {SyntheticEvent} e React Event - */ - orbisCategory(e) { - let ship = this.state.ship; - let cat = e.target.value; - ship.category = cat; - this.setState({ship}); - } - - /** - * Render the modal - * @return {React.Component} Modal Content - */ - render() { - let translate = this.context.language.translate; - this.orbisPasswordHandler = this.orbisPasswordHandler.bind(this); - this.orbisUsername = this.orbisUsername.bind(this); - this.sendToOrbis = this.sendToOrbis.bind(this); - this.getOrbisAuthStatus(); - return
    e.stopPropagation() }> -

    {translate('upload to orbis')}

    -
    - - e.target.select() }/> -

    - Log in / signup to Orbis -

    -

    Category

    - -

    -

    {translate('Orbis link')}

    - e.target.select() }/> -

    -

    Orbis.zone is currently in a trial period, and may be wiped at any time as development progresses. Some elements are also still placeholders.

    - - -
    ; - } -} diff --git a/src/app/components/SvgIcons.jsx b/src/app/components/SvgIcons.jsx index c226f892..ce4627eb 100644 --- a/src/app/components/SvgIcons.jsx +++ b/src/app/components/SvgIcons.jsx @@ -247,7 +247,8 @@ export class OrbisIcon extends SvgIcon { - ); + + ); } } diff --git a/src/app/pages/OutfittingPage.jsx b/src/app/pages/OutfittingPage.jsx index 3b709258..adc89f58 100644 --- a/src/app/pages/OutfittingPage.jsx +++ b/src/app/pages/OutfittingPage.jsx @@ -19,7 +19,6 @@ import { LinkIcon, ShoppingIcon, MatIcon, - OrbisIcon } from '../components/SvgIcons'; import LZString from 'lz-string'; import ShipSummaryTable from '../components/ShipSummaryTable'; @@ -37,7 +36,6 @@ import OutfittingSubpages from '../components/OutfittingSubpages'; import ModalExport from '../components/ModalExport'; import ModalPermalink from '../components/ModalPermalink'; import ModalShoppingList from '../components/ModalShoppingList'; -import ModalOrbis from '../components/ModalOrbis'; /** * Document Title Generator @@ -680,22 +678,6 @@ export default class OutfittingPage extends Page { this.context.showModal(); } - /** - * Generate Orbis link - */ - _genOrbis() { - const data = {}; - const ship = this.state.ship; - data.title = this.state.buildName || ship.id; - data.description = this.state.buildName || ship.id; - data.body = ship; - data.url = `https://coriolis.io${outfitURL(ship.id, ship.toString(), data.title)}`; - ship.type = ship.id; - - console.log(data); - this.context.showModal(); - } - /** * Open up a window for EDDB with a shopping list of our components */ @@ -945,13 +927,6 @@ export default class OutfittingPage extends Page { > -