add inputs adornment and fix title for mobile

This commit is contained in:
nikk gitanes
2021-07-17 00:56:14 +03:00
parent 57d71cc5ad
commit 8298e66b59
12 changed files with 127 additions and 99 deletions

View File

@@ -61,12 +61,12 @@ var Staticjs265f701bfchunkjsLICENSEtxt []byte
var Staticjs265f701bfchunkjsmap []byte var Staticjs265f701bfchunkjsmap []byte
//go:embed pages/static/js/main.fcf298ee.chunk.js //go:embed pages/static/js/main.3ecebe04.chunk.js
var Staticjsmainfcf298eechunkjs []byte var Staticjsmain3ecebe04chunkjs []byte
//go:embed pages/static/js/main.fcf298ee.chunk.js.map //go:embed pages/static/js/main.3ecebe04.chunk.js.map
var Staticjsmainfcf298eechunkjsmap []byte var Staticjsmain3ecebe04chunkjsmap []byte
//go:embed pages/static/js/runtime-main.8bda5920.js //go:embed pages/static/js/runtime-main.8bda5920.js

View File

@@ -1,7 +1,7 @@
{ {
"files": { "files": {
"main.js": "/static/js/main.fcf298ee.chunk.js", "main.js": "/static/js/main.3ecebe04.chunk.js",
"main.js.map": "/static/js/main.fcf298ee.chunk.js.map", "main.js.map": "/static/js/main.3ecebe04.chunk.js.map",
"runtime-main.js": "/static/js/runtime-main.8bda5920.js", "runtime-main.js": "/static/js/runtime-main.8bda5920.js",
"runtime-main.js.map": "/static/js/runtime-main.8bda5920.js.map", "runtime-main.js.map": "/static/js/runtime-main.8bda5920.js.map",
"static/js/2.65f701bf.chunk.js": "/static/js/2.65f701bf.chunk.js", "static/js/2.65f701bf.chunk.js": "/static/js/2.65f701bf.chunk.js",
@@ -12,6 +12,6 @@
"entrypoints": [ "entrypoints": [
"static/js/runtime-main.8bda5920.js", "static/js/runtime-main.8bda5920.js",
"static/js/2.65f701bf.chunk.js", "static/js/2.65f701bf.chunk.js",
"static/js/main.fcf298ee.chunk.js" "static/js/main.3ecebe04.chunk.js"
] ]
} }

View File

@@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"/><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png"><link rel="manifest" href="/site.webmanifest"><meta name="msapplication-TileColor" content="#da532c"><meta name="theme-color" content="#ffffff"><link rel="preconnect" href="https://fonts.gstatic.com"><link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;600&display=swap" rel="stylesheet"><meta name="viewport" content="width=device-width,shrink-to-fit=no"><meta name="description" content="TorrServer - torrent to http stream"/><title>TorrServer</title></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script src="https://cdn.lordicon.com/libs/frhvbuzj/lord-icon-2.0.2.js"></script><script src="https://www.gstatic.com/firebasejs/8.1.2/firebase-app.js"></script><script src="https://www.gstatic.com/firebasejs/8.1.2/firebase-analytics.js"></script><script>const firebaseConfig={apiKey:"AIzaSyDivIsadtzAmp3SIY4yArNcFugUmr63rvo",authDomain:"torrserve.firebaseapp.com",databaseURL:"https://torrserve.firebaseio.com",projectId:"torrserve",storageBucket:"torrserve.appspot.com",messagingSenderId:"400168070412",appId:"1:400168070412:web:82c8e43dd7fc8f807aed29",measurementId:"G-T4RC2BFRSF"};firebase.initializeApp(firebaseConfig),firebase.analytics()</script><script>!function(e){function r(r){for(var n,l,f=r[0],i=r[1],a=r[2],c=0,s=[];c<f.length;c++)l=f[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,f=1;f<t.length;f++){var i=t[f];0!==o[i]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={1:0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var f=this.webpackJsonptorrserver_web=this.webpackJsonptorrserver_web||[],i=f.push.bind(f);f.push=r,f=f.slice();for(var a=0;a<f.length;a++)r(f[a]);var p=i;t()}([])</script><script src="/static/js/2.65f701bf.chunk.js"></script><script src="/static/js/main.fcf298ee.chunk.js"></script></body></html> <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"/><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png"><link rel="manifest" href="/site.webmanifest"><meta name="msapplication-TileColor" content="#da532c"><meta name="theme-color" content="#ffffff"><link rel="preconnect" href="https://fonts.gstatic.com"><link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;600&display=swap" rel="stylesheet"><meta name="viewport" content="width=device-width,shrink-to-fit=no"><meta name="description" content="TorrServer - torrent to http stream"/><title>TorrServer</title></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script src="https://cdn.lordicon.com/libs/frhvbuzj/lord-icon-2.0.2.js"></script><script src="https://www.gstatic.com/firebasejs/8.1.2/firebase-app.js"></script><script src="https://www.gstatic.com/firebasejs/8.1.2/firebase-analytics.js"></script><script>const firebaseConfig={apiKey:"AIzaSyDivIsadtzAmp3SIY4yArNcFugUmr63rvo",authDomain:"torrserve.firebaseapp.com",databaseURL:"https://torrserve.firebaseio.com",projectId:"torrserve",storageBucket:"torrserve.appspot.com",messagingSenderId:"400168070412",appId:"1:400168070412:web:82c8e43dd7fc8f807aed29",measurementId:"G-T4RC2BFRSF"};firebase.initializeApp(firebaseConfig),firebase.analytics()</script><script>!function(e){function r(r){for(var n,l,f=r[0],i=r[1],a=r[2],c=0,s=[];c<f.length;c++)l=f[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,f=1;f<t.length;f++){var i=t[f];0!==o[i]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={1:0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var f=this.webpackJsonptorrserver_web=this.webpackJsonptorrserver_web||[],i=f.push.bind(f);f.push=r,f=f.slice();for(var a=0;a<f.length;a++)r(f[a]);var p=i;t()}([])</script><script src="/static/js/2.65f701bf.chunk.js"></script><script src="/static/js/main.3ecebe04.chunk.js"></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -9,86 +9,6 @@ func RouteWebPages(route *gin.RouterGroup) {
c.Data(200, "text/html; charset=utf-8", Indexhtml) c.Data(200, "text/html; charset=utf-8", Indexhtml)
}) })
route.GET("/static/js/2.65f701bf.chunk.js", func(c *gin.Context) {
c.Data(200, "application/javascript", Staticjs265f701bfchunkjs)
})
route.GET("/static/js/main.fcf298ee.chunk.js.map", func(c *gin.Context) {
c.Data(200, "application/json", Staticjsmainfcf298eechunkjsmap)
})
route.GET("/static/js/runtime-main.8bda5920.js", func(c *gin.Context) {
c.Data(200, "application/javascript", Staticjsruntimemain8bda5920js)
})
route.GET("/favicon-32x32.png", func(c *gin.Context) {
c.Data(200, "image/png", Favicon32x32png)
})
route.GET("/favicon.ico", func(c *gin.Context) {
c.Data(200, "image/x-icon", Faviconico)
})
route.GET("/favicon-16x16.png", func(c *gin.Context) {
c.Data(200, "image/png", Favicon16x16png)
})
route.GET("/index.html", func(c *gin.Context) {
c.Data(200, "text/html; charset=utf-8", Indexhtml)
})
route.GET("/site.webmanifest", func(c *gin.Context) {
c.Data(200, "application/manifest+json", Sitewebmanifest)
})
route.GET("/static/js/2.65f701bf.chunk.js.LICENSE.txt", func(c *gin.Context) {
c.Data(200, "text/plain; charset=utf-8", Staticjs265f701bfchunkjsLICENSEtxt)
})
route.GET("/static/js/runtime-main.8bda5920.js.map", func(c *gin.Context) {
c.Data(200, "application/json", Staticjsruntimemain8bda5920jsmap)
})
route.GET("/android-chrome-192x192.png", func(c *gin.Context) {
c.Data(200, "image/png", Androidchrome192x192png)
})
route.GET("/asset-manifest.json", func(c *gin.Context) {
c.Data(200, "application/json", Assetmanifestjson)
})
route.GET("/static/js/2.65f701bf.chunk.js.map", func(c *gin.Context) {
c.Data(200, "application/json", Staticjs265f701bfchunkjsmap)
})
route.GET("/browserconfig.xml", func(c *gin.Context) {
c.Data(200, "application/xml", Browserconfigxml)
})
route.GET("/mstile-150x150.png", func(c *gin.Context) {
c.Data(200, "image/png", Mstile150x150png)
})
route.GET("/static/js/main.fcf298ee.chunk.js", func(c *gin.Context) {
c.Data(200, "application/javascript", Staticjsmainfcf298eechunkjs)
})
route.GET("/android-chrome-512x512.png", func(c *gin.Context) { route.GET("/android-chrome-512x512.png", func(c *gin.Context) {
c.Data(200, "image/png", Androidchrome512x512png) c.Data(200, "image/png", Androidchrome512x512png)
}) })
@@ -98,4 +18,84 @@ func RouteWebPages(route *gin.RouterGroup) {
c.Data(200, "image/png", Appletouchiconpng) c.Data(200, "image/png", Appletouchiconpng)
}) })
route.GET("/browserconfig.xml", func(c *gin.Context) {
c.Data(200, "application/xml", Browserconfigxml)
})
route.GET("/static/js/runtime-main.8bda5920.js", func(c *gin.Context) {
c.Data(200, "application/javascript", Staticjsruntimemain8bda5920js)
})
route.GET("/asset-manifest.json", func(c *gin.Context) {
c.Data(200, "application/json", Assetmanifestjson)
})
route.GET("/favicon-16x16.png", func(c *gin.Context) {
c.Data(200, "image/png", Favicon16x16png)
})
route.GET("/site.webmanifest", func(c *gin.Context) {
c.Data(200, "application/manifest+json", Sitewebmanifest)
})
route.GET("/favicon.ico", func(c *gin.Context) {
c.Data(200, "image/x-icon", Faviconico)
})
route.GET("/index.html", func(c *gin.Context) {
c.Data(200, "text/html; charset=utf-8", Indexhtml)
})
route.GET("/mstile-150x150.png", func(c *gin.Context) {
c.Data(200, "image/png", Mstile150x150png)
})
route.GET("/static/js/2.65f701bf.chunk.js.LICENSE.txt", func(c *gin.Context) {
c.Data(200, "text/plain; charset=utf-8", Staticjs265f701bfchunkjsLICENSEtxt)
})
route.GET("/static/js/main.3ecebe04.chunk.js", func(c *gin.Context) {
c.Data(200, "application/javascript", Staticjsmain3ecebe04chunkjs)
})
route.GET("/static/js/main.3ecebe04.chunk.js.map", func(c *gin.Context) {
c.Data(200, "application/json", Staticjsmain3ecebe04chunkjsmap)
})
route.GET("/android-chrome-192x192.png", func(c *gin.Context) {
c.Data(200, "image/png", Androidchrome192x192png)
})
route.GET("/favicon-32x32.png", func(c *gin.Context) {
c.Data(200, "image/png", Favicon32x32png)
})
route.GET("/static/js/2.65f701bf.chunk.js", func(c *gin.Context) {
c.Data(200, "application/javascript", Staticjs265f701bfchunkjs)
})
route.GET("/static/js/2.65f701bf.chunk.js.map", func(c *gin.Context) {
c.Data(200, "application/json", Staticjs265f701bfchunkjsmap)
})
route.GET("/static/js/runtime-main.8bda5920.js.map", func(c *gin.Context) {
c.Data(200, "application/json", Staticjsruntimemain8bda5920jsmap)
})
} }

View File

@@ -19,7 +19,7 @@ export const HeaderSection = styled.section`
} }
@media (max-width: 930px) { @media (max-width: 930px) {
font-size: 30px; font-size: 24px;
padding: 10px 20px; padding: 10px 20px;
img { img {

View File

@@ -1,6 +1,6 @@
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import TextField from '@material-ui/core/TextField' import TextField from '@material-ui/core/TextField'
import { FormControlLabel, InputLabel, Select, Switch } from '@material-ui/core' import { FormControlLabel, InputAdornment, InputLabel, Select, Switch } from '@material-ui/core'
import { SecondarySettingsContent, SettingSectionLabel } from './style' import { SecondarySettingsContent, SettingSectionLabel } from './style'
@@ -59,6 +59,11 @@ export default function SecondarySettingsComponent({ settings, inputForm }) {
margin='normal' margin='normal'
id='TorrentDisconnectTimeout' id='TorrentDisconnectTimeout'
label={t('SettingsDialog.TorrentDisconnectTimeout')} label={t('SettingsDialog.TorrentDisconnectTimeout')}
InputProps={{
endAdornment: (
<InputAdornment position='end'>{t('Seconds')}</InputAdornment>
),
}}
value={TorrentDisconnectTimeout} value={TorrentDisconnectTimeout}
type='number' type='number'
variant='outlined' variant='outlined'
@@ -70,6 +75,11 @@ export default function SecondarySettingsComponent({ settings, inputForm }) {
margin='normal' margin='normal'
id='ConnectionsLimit' id='ConnectionsLimit'
label={t('SettingsDialog.ConnectionsLimit')} label={t('SettingsDialog.ConnectionsLimit')}
InputProps={{
endAdornment: (
<InputAdornment position='end'>{t('SettingsDialog.ConnectionsLimitHint')}</InputAdornment>
),
}}
value={ConnectionsLimit} value={ConnectionsLimit}
type='number' type='number'
variant='outlined' variant='outlined'
@@ -97,6 +107,11 @@ export default function SecondarySettingsComponent({ settings, inputForm }) {
margin='normal' margin='normal'
id='DownloadRateLimit' id='DownloadRateLimit'
label={t('SettingsDialog.DownloadRateLimit')} label={t('SettingsDialog.DownloadRateLimit')}
InputProps={{
endAdornment: (
<InputAdornment position='end'>{t('Kilobytes')}</InputAdornment>
),
}}
value={DownloadRateLimit} value={DownloadRateLimit}
type='number' type='number'
variant='outlined' variant='outlined'
@@ -113,6 +128,11 @@ export default function SecondarySettingsComponent({ settings, inputForm }) {
margin='normal' margin='normal'
id='UploadRateLimit' id='UploadRateLimit'
label={t('SettingsDialog.UploadRateLimit')} label={t('SettingsDialog.UploadRateLimit')}
InputProps={{
endAdornment: (
<InputAdornment position='end'>{t('Kilobytes')}</InputAdornment>
),
}}
value={UploadRateLimit} value={UploadRateLimit}
type='number' type='number'
variant='outlined' variant='outlined'

View File

@@ -52,6 +52,7 @@
"Full": "Full", "Full": "Full",
"Host": "Host", "Host": "Host",
"Info": "Info", "Info": "Info",
"Kilobytes": "Kilobytes",
"LatestFilePlayed": "Latest file played:", "LatestFilePlayed": "Latest file played:",
"Links": "Links", "Links": "Links",
"Name": "Name", "Name": "Name",
@@ -71,6 +72,7 @@
"Save": "Save", "Save": "Save",
"ScrollDown": "scroll down", "ScrollDown": "scroll down",
"Season": "Season", "Season": "Season",
"Seconds": "Seconds",
"SelectSeason": "Select Season", "SelectSeason": "Select Season",
"SettingsDialog": { "SettingsDialog": {
"AddRetrackers": "Add retrackers", "AddRetrackers": "Add retrackers",
@@ -81,11 +83,12 @@
"CacheSettings": "Cache Settings", "CacheSettings": "Cache Settings",
"CacheStorageLocation": "Cache Storage Location", "CacheStorageLocation": "Cache Storage Location",
"ConnectionsLimit": "Connections Limit", "ConnectionsLimit": "Connections Limit",
"ConnectionsLimitHint": "20-25 recommended",
"DHT": "DHT (Distributed Hash Table)", "DHT": "DHT (Distributed Hash Table)",
"DhtConnectionLimit": "DHT Connection Limit", "DhtConnectionLimit": "DHT Connection Limit",
"Disk": "Disk", "Disk": "Disk",
"DontAddRetrackers": "Don`t add retrackers", "DontAddRetrackers": "Don`t add retrackers",
"DownloadRateLimit": "Download Rate Limit (Kilobytes)", "DownloadRateLimit": "Download Rate Limit",
"ForceEncrypt": "Force Encrypt Headers", "ForceEncrypt": "Force Encrypt Headers",
"PeersListenPort": "Peers Listen Port", "PeersListenPort": "Peers Listen Port",
"PreloadCache": "Preload Cache Before Play", "PreloadCache": "Preload Cache Before Play",
@@ -102,7 +105,7 @@
"TorrentDisconnectTimeout": "Torrent Disconnect Timeout", "TorrentDisconnectTimeout": "Torrent Disconnect Timeout",
"TorrentsSavePath": "Torrents Save Path", "TorrentsSavePath": "Torrents Save Path",
"Upload": "Upload (not recommended to disable)", "Upload": "Upload (not recommended to disable)",
"UploadRateLimit": "Upload Rate Limit (Kilobytes)", "UploadRateLimit": "Upload Rate Limit",
"UseDiskDesc": "Better use RAM or external storage on flash-based devices", "UseDiskDesc": "Better use RAM or external storage on flash-based devices",
"Tabs": { "Tabs": {
"Main": "Main", "Main": "Main",

View File

@@ -52,6 +52,8 @@
"Full": "Полный", "Full": "Полный",
"Host": "Хост", "Host": "Хост",
"Info": "Инфо", "Info": "Инфо",
"KB": "КБ",
"Kilobytes": "Килобайты",
"LatestFilePlayed": "Последний воспроизведенный файл:", "LatestFilePlayed": "Последний воспроизведенный файл:",
"Links": "Ссылки", "Links": "Ссылки",
"Name": "Название", "Name": "Название",
@@ -71,6 +73,8 @@
"Save": "Сохранить", "Save": "Сохранить",
"ScrollDown": "прокрутить вниз", "ScrollDown": "прокрутить вниз",
"Season": "Сезон", "Season": "Сезон",
"Sec": "Cек.",
"Seconds": "Секунды",
"SelectSeason": "Выбор сезона", "SelectSeason": "Выбор сезона",
"SettingsDialog": { "SettingsDialog": {
"AddRetrackers": "Добавлять", "AddRetrackers": "Добавлять",
@@ -80,12 +84,13 @@
"CacheSize": "Размер кеша", "CacheSize": "Размер кеша",
"CacheSettings": "Настройки кеша", "CacheSettings": "Настройки кеша",
"CacheStorageLocation": "Место хранения кеша", "CacheStorageLocation": "Место хранения кеша",
"ConnectionsLimit": "Торрент-соединения (рек. 20-25)", "ConnectionsLimit": "Торрент-соединения",
"ConnectionsLimitHint": "рекомендуется 20-25",
"DHT": "DHT (Distributed Hash Table)", "DHT": "DHT (Distributed Hash Table)",
"DhtConnectionLimit": "Лимит подключений DHT", "DhtConnectionLimit": "Лимит подключений DHT",
"Disk": "Накопитель", "Disk": "Накопитель",
"DontAddRetrackers": "Ничего не делать", "DontAddRetrackers": "Ничего не делать",
"DownloadRateLimit": "Ограничение скорости загрузки (Килобайты)", "DownloadRateLimit": "Ограничение скорости загрузки",
"ForceEncrypt": "Принудительное шифрование заголовков", "ForceEncrypt": "Принудительное шифрование заголовков",
"PeersListenPort": "Порт для входящих подключений", "PeersListenPort": "Порт для входящих подключений",
"PreloadCache": "Буфер предзагрузки", "PreloadCache": "Буфер предзагрузки",
@@ -99,10 +104,10 @@
"RetrackersMode": "Ретрекеры", "RetrackersMode": "Ретрекеры",
"ResetToDefault": "Настройки по умолчанию", "ResetToDefault": "Настройки по умолчанию",
"Settings": "Настройки", "Settings": "Настройки",
"TorrentDisconnectTimeout": "Тайм-аут отключения торрента (секунды)", "TorrentDisconnectTimeout": "Тайм-аут отключения торрента",
"TorrentsSavePath": "Путь хранения кеша", "TorrentsSavePath": "Путь хранения кеша",
"Upload": "Отдача (не рекомендуется отключать)", "Upload": "Отдача (не рекомендуется отключать)",
"UploadRateLimit": "Ограничение скорости отдачи (Килобайты)", "UploadRateLimit": "Ограничение скорости отдачи",
"UseDiskDesc": "Рекомендуется использовать оперативную память или внешние носители на устройствах с flash-памятью", "UseDiskDesc": "Рекомендуется использовать оперативную память или внешние носители на устройствах с flash-памятью",
"Tabs": { "Tabs": {
"Main": "Основные", "Main": "Основные",