Merge branch 'master' of https://github.com/ethereum/remix-project into git4
commit
f8a72e6043
@ -0,0 +1,74 @@ |
||||
import EventEmitter from 'events' |
||||
import { NightwatchBrowser, NightwatchContractContent } from 'nightwatch' |
||||
|
||||
class AddFileSnekmate extends EventEmitter { |
||||
command(this: NightwatchBrowser, name: string, content: NightwatchContractContent): NightwatchBrowser { |
||||
this.api.perform((done) => { |
||||
addFileSnekmate(this.api, name, content, () => { |
||||
done() |
||||
this.emit('complete') |
||||
}) |
||||
}) |
||||
return this |
||||
} |
||||
} |
||||
|
||||
function addFileSnekmate(browser: NightwatchBrowser, name: string, content: NightwatchContractContent, done: VoidFunction) { |
||||
browser |
||||
.isVisible({ |
||||
selector: "//*[@data-id='sidePanelSwapitTitle' and contains(.,'File explorer')]", |
||||
locateStrategy: 'xpath', |
||||
suppressNotFoundErrors: true, |
||||
timeout: 1000 |
||||
}, (okVisible) => { |
||||
if (!okVisible.value) { |
||||
browser.clickLaunchIcon('filePanel') |
||||
} |
||||
}) |
||||
.scrollInto('li[data-id="treeViewLitreeViewItemREADME.txt"]') |
||||
.waitForElementVisible('li[data-id="treeViewLitreeViewItemLICENSE"]') |
||||
.click('li[data-id="treeViewLitreeViewItemLICENSE"]').pause(1000) // focus on root directory
|
||||
.isVisible({ |
||||
selector: `//*[@data-id="treeViewLitreeViewItem${name}"]`, |
||||
locateStrategy: 'xpath', |
||||
abortOnFailure: false, |
||||
suppressNotFoundErrors: true, |
||||
timeout: 2000 |
||||
}, (okVisible) => { |
||||
// @ts-ignore
|
||||
// status === -1 means the element is not visible, 0 means it is visible.
|
||||
if (okVisible.status === 0) { |
||||
browser.openFile(name) |
||||
.perform(function () { |
||||
done() |
||||
}) |
||||
} else { |
||||
browser.click('[data-id="fileExplorerNewFilecreateNewFile"]') |
||||
.waitForElementContainsText('*[data-id$="fileExplorerTreeItemInput"]', '', 60000) |
||||
.sendKeys('*[data-id$="fileExplorerTreeItemInput"]', name) |
||||
.sendKeys('*[data-id$="fileExplorerTreeItemInput"]', browser.Keys.ENTER) |
||||
// isvisible is protocol action called isDisplayed https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/WebElement.html#isDisplayed--
|
||||
.isVisible({ |
||||
selector: `li[data-id="treeViewLitreeViewItem${name}"]`, |
||||
abortOnFailure: false, |
||||
suppressNotFoundErrors: true, |
||||
timeout: 60000 |
||||
}) |
||||
.waitForElementVisible({ |
||||
selector: `//*[@data-id='tab-active' and contains(@data-path, "${name}")]`, |
||||
locateStrategy: 'xpath' |
||||
}) |
||||
.setEditorValue(content.content) |
||||
.getEditorValue((result) => { |
||||
if(result != content.content) { |
||||
browser.setEditorValue(content.content) |
||||
} |
||||
}) |
||||
.perform(function () { |
||||
done() |
||||
}) |
||||
} |
||||
}) |
||||
} |
||||
|
||||
module.exports = AddFileSnekmate |
@ -0,0 +1,22 @@ |
||||
import EventEmitter from "events" |
||||
import { NightwatchBrowser } from "nightwatch" |
||||
|
||||
class SelectFiles extends EventEmitter { |
||||
command (this: NightwatchBrowser, selectedElements: any[]): NightwatchBrowser { |
||||
const browser = this.api |
||||
|
||||
browser.perform(function () { |
||||
const actions = this.actions({ async: true }) |
||||
actions.keyDown(this.Keys.SHIFT) |
||||
for(let i = 0; i < selectedElements.length; i++) { |
||||
actions.click(selectedElements[i].value) |
||||
} |
||||
return actions.contextClick(selectedElements[0].value) |
||||
}) |
||||
this.emit('complete') |
||||
return this |
||||
} |
||||
} |
||||
|
||||
|
||||
module.exports = SelectFiles |
@ -0,0 +1,27 @@ |
||||
import { NightwatchBrowser } from 'nightwatch' |
||||
import init from '../helpers/init' |
||||
|
||||
module.exports = { |
||||
before: function (browser: NightwatchBrowser, done: VoidFunction) { |
||||
init(browser, done) |
||||
}, |
||||
|
||||
'Should select multiple items in file explorer #group1': function (browser: NightwatchBrowser) { |
||||
const selectedElements = [] |
||||
browser |
||||
.openFile('contracts') |
||||
.click({ selector: '//*[@data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]', locateStrategy: 'xpath' }) |
||||
.findElement({ selector: '//*[@data-id="treeViewLitreeViewItemcontracts/2_Owner.sol"]', locateStrategy: 'xpath' }, (el) => { |
||||
selectedElements.push(el) |
||||
}) |
||||
browser.findElement({ selector: '//*[@data-id="treeViewLitreeViewItemtests"]', locateStrategy: 'xpath' }, |
||||
(el: any) => { |
||||
selectedElements.push(el) |
||||
}) |
||||
browser.selectFiles(selectedElements) |
||||
.assert.visible('.bg-secondary[data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]') |
||||
.assert.visible('.bg-secondary[data-id="treeViewLitreeViewItemcontracts/2_Owner.sol"]') |
||||
.assert.visible('.bg-secondary[data-id="treeViewLitreeViewItemtests"]') |
||||
.end() |
||||
} |
||||
} |
@ -0,0 +1,244 @@ |
||||
|
||||
import React from 'react' |
||||
import { ViewPlugin } from '@remixproject/engine-web' |
||||
import { PluginViewWrapper } from '@remix-ui/helper' |
||||
import { RemixAppManager } from '../../remixAppManager' |
||||
import { RemixUIGridView } from '@remix-ui/remix-ui-grid-view' |
||||
import { RemixUIGridSection } from '@remix-ui/remix-ui-grid-section' |
||||
import { RemixUIGridCell } from '@remix-ui/remix-ui-grid-cell' |
||||
import { ThemeKeys, ThemeObject } from '@microlink/react-json-view' |
||||
//@ts-ignore
|
||||
const _paq = (window._paq = window._paq || []) |
||||
|
||||
const profile = { |
||||
name: 'remixGuide', |
||||
displayName: 'Remix Guide', |
||||
description: 'Learn remix with videos', |
||||
location: 'mainPanel', |
||||
methods: ['showDetails'], |
||||
events: [] |
||||
} |
||||
|
||||
export class RemixGuidePlugin extends ViewPlugin { |
||||
dispatch: React.Dispatch<any> = () => { } |
||||
appManager: RemixAppManager |
||||
element: HTMLDivElement |
||||
payload: any |
||||
themeStyle: any |
||||
theme: ThemeKeys | ThemeObject |
||||
constructor(appManager: RemixAppManager) { |
||||
super(profile) |
||||
this.appManager = appManager |
||||
this.element = document.createElement('div') |
||||
this.element.setAttribute('id', 'remixGuideEl')
|
||||
} |
||||
|
||||
async onActivation() { |
||||
this.handleThemeChange() |
||||
await this.call('tabs', 'focus', 'remixGuide') |
||||
this.renderComponent() |
||||
_paq.push(['trackEvent', 'plugin', 'activated', 'remixGuide']) |
||||
} |
||||
|
||||
onDeactivation(): void { |
||||
} |
||||
|
||||
async showDetails(sentPayload: any) { |
||||
const contractName = Object.entries(sentPayload).find(([key, value]) => key) |
||||
await this.call('tabs', 'focus', 'remixGuide') |
||||
this.profile.displayName = `${contractName[0]}` |
||||
this.payload = sentPayload |
||||
const active = await this.call('theme', 'currentTheme') |
||||
|
||||
this.renderComponent() |
||||
} |
||||
|
||||
private handleThemeChange() { |
||||
this.on('theme', 'themeChanged', (theme: any) => { |
||||
|
||||
this.renderComponent() |
||||
}) |
||||
} |
||||
|
||||
setDispatch(dispatch: React.Dispatch<any>): void { |
||||
this.dispatch = dispatch |
||||
this.renderComponent() |
||||
} |
||||
render() { |
||||
return ( |
||||
<div className="bg-dark" id="remixGuide"> |
||||
<PluginViewWrapper plugin={this} /> |
||||
</div> |
||||
) |
||||
} |
||||
|
||||
renderComponent() { |
||||
this.dispatch({ |
||||
...this, |
||||
...this.payload, |
||||
themeStyle: this.themeStyle, |
||||
theme: this.theme |
||||
}) |
||||
} |
||||
|
||||
updateComponent(state: any) { |
||||
return ( |
||||
<RemixUIGridView |
||||
plugin={this} |
||||
styleList={""} |
||||
logo='/assets/img/YouTubeLogo.webp' |
||||
enableFilter={true} |
||||
showUntagged={true} |
||||
showPin={true} |
||||
tagList={[ |
||||
['beginner', 'danger'], |
||||
['advanced', 'warning'], |
||||
['AI', 'success'], |
||||
['plugins', 'secondary'], |
||||
['solidity', 'primary'], |
||||
['vyper', 'info'], |
||||
['L2', 'danger'] |
||||
]} |
||||
title='Remix Guide' |
||||
description="Streamlined access to categorized video tutorials for mastering Remix IDE. From fundamentals to advanced techniques, level up your development skills with ease." |
||||
//themeStyle={state.themeStyle}
|
||||
> |
||||
<RemixUIGridSection |
||||
plugin={this} |
||||
title='Basics' |
||||
hScrollable= {true} |
||||
> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="first item" |
||||
tagList={['L2', 'AI']} |
||||
logo='/assets/img/soliditySurvey2023.webp' |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="next" |
||||
pinned={true} |
||||
tagList={['L2', 'plugins']} |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> <RemixUIGridCell |
||||
plugin={this} |
||||
title="something" |
||||
pinned={false} |
||||
tagList={['solidity', 'plugins']} |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
tagList={['solidity']} |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> <RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="Something very very long" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> <RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
</RemixUIGridSection> |
||||
<RemixUIGridSection |
||||
plugin={this} |
||||
title='Basics not scrollable' |
||||
hScrollable= {false} |
||||
> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="first item" |
||||
logo='/assets/img/soliditySurvey2023.webp' |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="next" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> <RemixUIGridCell |
||||
plugin={this} |
||||
title="something" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> <RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> <RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
</RemixUIGridSection> |
||||
</RemixUIGridView> |
||||
) |
||||
} |
||||
|
||||
} |
@ -0,0 +1,15 @@ |
||||
{ |
||||
"circuit.compiler": "Компилятор", |
||||
"circuit.autoCompile": "Автокомпиляция", |
||||
"circuit.hideWarnings": "Скрыть предупреждения", |
||||
"circuit.advancedConfigurations": "Расширенные настройки", |
||||
"circuit.compilerConfiguration": "Настройки компилятора", |
||||
"circuit.prime": "Изначально", |
||||
"circuit.useConfigurationFile": "Использовать файл настроек", |
||||
"circuit.compile": "Скомпилировать", |
||||
"circuit.noFileSelected": "нет выбранных файлов", |
||||
"circuit.generateR1cs": "Сгенерировать R1CS", |
||||
"circuit.computeWitness": "Вычислить Witness", |
||||
"circuit.signalInput": "Сигнал ввода", |
||||
"circuit.compute": "Вычислить" |
||||
} |
@ -0,0 +1,26 @@ |
||||
{ |
||||
"debugger.displayName": "Отладчик", |
||||
"debugger.debuggerConfiguration": "Настройки отладчика", |
||||
"debugger.stopDebugging": "Завершить отладку", |
||||
"debugger.provideTxNumber": "Пожалуйста, укажите действительный хэш транзакции", |
||||
"debugger.startDebugging": "Начать отладку", |
||||
"debugger.placeholder": "Хэш транзакции, должен начинаться с 0x", |
||||
"debugger.debugLocaNodeLabel": "Принудительное использование локального узла", |
||||
"debugger.useGeneratedSources": "Использовать сгенерированные источники", |
||||
"debugger.debugWithGeneratedSources": "Когда флажок установлен, то отладчик проверит скомпилированный файл .yul, если он существует.", |
||||
"debugger.introduction": "При отладке с хэшем транзакции, если контракт проверен, Remix попытается получить исходный код из Sourcify или Etherscan. Укажите API ключ Etherscan в настройках Remix. Поддерживаемые сети смотрите в", |
||||
"debugger.forceToUseCurrentLocalNode": "Заставить отладчик использовать текущий локальный узел", |
||||
"debugger.sourceLocationStatus1": "Поиск контрольной точки. Это может занять некоторое время...", |
||||
"debugger.sourceLocationStatus2": "Местоположение источника недоступно ни в Sourcify ни в Etherscan. Пожалуйста, убедитесь, что ключ api Etherscan указан в настройках.", |
||||
"debugger.sourcifyDocs": "Документации Sourcify", |
||||
"debugger.noDataAvailable": "Данные отсутствуют", |
||||
"debugger.loadMore": "Загрузить еще", |
||||
"debugger.copy": "Копировать", |
||||
"debugger.stepOverBack": "Шаг назад", |
||||
"debugger.stepBack": "Назад", |
||||
"debugger.stepInto": "Шаг в", |
||||
"debugger.stepOverForward": "Шаг вперед", |
||||
"debugger.jumpPreviousBreakpoint": "Перейти к предыдущей контрольной точке", |
||||
"debugger.jumpOut": "Выпрыгнуть", |
||||
"debugger.jumpNextBreakpoint": "Перейти к предыдущей контрольной точке" |
||||
} |
@ -0,0 +1,134 @@ |
||||
{ |
||||
"filePanel.displayName": "Файловый менеджер", |
||||
"filePanel.workspace": "ПРОЕКТЫ", |
||||
"filePanel.create": "Создать", |
||||
"filePanel.clone": "Клонировать", |
||||
"filePanel.download": "Скачать", |
||||
"filePanel.backup": "Резервная копия", |
||||
"filePanel.restore": "Восстановить", |
||||
"filePanel.workspace.create": "Создать проект", |
||||
"filePanel.workspace.rename": "Переименовать проект", |
||||
"filePanel.workspace.save_workspace": "Сохранить проект", |
||||
"filePanel.workspace.delete": "Удалить проект", |
||||
"filePanel.workspace.deleteConfirm": "Вы уверены, что хотите удалить текущий проект?", |
||||
"filePanel.workspace.download": "Скачать проект", |
||||
"filePanel.workspace.downloadConfirm": "Текущий проект будет загружен в виде zip-файла. Вы хотите продолжить?", |
||||
"filePanel.workspace.deleteAll": "Удалить все проекты", |
||||
"filePanel.workspace.deleteAllConfirm1": "Вы уверены, что хотите удалить все ваши проекты?", |
||||
"filePanel.workspace.deleteAllConfirm2": "Удаленные проекты не могут быть восстановлены каким-либо образом.", |
||||
"filePanel.workspace.name": "Название проекта", |
||||
"filePanel.workspace.chooseTemplate": "Выбрать шаблон", |
||||
"filePanel.workspace.backup": "Резервное копирование всех проектов", |
||||
"filePanel.workspace.restore": "Восстановить проекты из резервной копии", |
||||
"filePanel.workspace.clone": "Клонировать репозиторий", |
||||
"filePanel.workspace.cloneMessage": "Пожалуйста, укажите действительный url git репозитория.", |
||||
"filePanel.workspace.enterGitUrl": "Введите url git репозитория", |
||||
"filePanel.workspace.switch": "Переключиться на проект", |
||||
"filePanel.workspace.solghaction": "Добавляет предустановленный yml файл для запуска модульных тестов Solidity в действиях github CI.", |
||||
"filePanel.solghaction": "Рабочий процесс тестирования Solidity", |
||||
"filePanel.workspace.tssoltestghaction": "Добавляет предустановленный yml файл для запуска mocha и chai тестов на прочность CI действий на github", |
||||
"filePanel.tssoltestghaction": "Рабочий процесс Mocha Chai Test", |
||||
"filePanel.workspace.addscriptetherscan": "Добавляет скрипты, которые могут использоваться для взаимодействия с Etherscan API", |
||||
"filePanel.addscriptetherscan": "Добавить скрипты Etherscan", |
||||
"filePanel.workspace.addscriptdeployer": "Добавляет скрипты, которые могут использоваться для развертывания контрактов", |
||||
"filePanel.addscriptdeployer": "Добавить скрипты развертывания контракта", |
||||
"filePanel.workspace.slitherghaction": "Добавляет предустановленный yml файл для запуска модульных тестов Solidity в действиях github CI", |
||||
"filePanel.slitherghaction": "Рабочий процесс Slither", |
||||
"filePanel.workspace.helperscripts": "Добавляет удобные скрипты в директорию 'scripts'", |
||||
"filePanel.helperscripts": "Web3 скрипты", |
||||
"filePanel.newFile": "Новый файл", |
||||
"filePanel.newFolder": "Новая папка", |
||||
"filePanel.rename": "Переименовать", |
||||
"filePanel.delete": "Удалить", |
||||
"filePanel.deleteAll": "Удалить всё", |
||||
"filePanel.run": "Запустить", |
||||
"filePanel.pushChangesToGist": "Отправить изменения в Gist", |
||||
"filePanel.publishFolderToGist": "Опубликовать папку в Gist", |
||||
"filePanel.publishFileToGist": "Опубликовать файл в Gist", |
||||
"filePanel.copy": "Копировать", |
||||
"filePanel.copyFileName": "Копировать название", |
||||
"filePanel.copyFilePath": "Копировать путь", |
||||
"filePanel.contractflattener": "Сведение", |
||||
"filePanel.nahmii-compiler": "Компиляция Nahmii", |
||||
"filePanel.solidityumlgen": "Сгенерировать UML", |
||||
"filePanel.doc-gen": "Генерировать документы", |
||||
"filePanel.solidity": "Скомпилировать", |
||||
"filePanel.paste": "Вставить", |
||||
"filePanel.compile": "Скомпилировать", |
||||
"filePanel.compileForNahmii": "Компиляция для Nahmii", |
||||
"filePanel.createNewFile": "Создать новый файл", |
||||
"filePanel.createNewFolder": "Создать новую папку", |
||||
"filePanel.publishToGist": "Опубликовать все файлы в GitHub Gist", |
||||
"filePanel.uploadFile": "Загрузить файлы", |
||||
"filePanel.uploadFolder": "Загрузка папки", |
||||
"filePanel.updateGist": "Обновить текущий обозреватель [gist]", |
||||
"filePanel.viewAllBranches": "Просмотреть все ветки", |
||||
"filePanel.createBranch": "Создать ветку", |
||||
"filePanel.switchBranches": "Переключить ветку", |
||||
"filePanel.checkoutGitBranch": "Проверьте Git ветку", |
||||
"filePanel.findOrCreateABranch": "Найти или создать ветку.", |
||||
"filePanel.initGitRepositoryLabel": "Инициализировать рабочую область как новый git репозиторий", |
||||
"filePanel.initGitRepositoryWarning": "Чтобы использовать функции Git, добавьте имя пользователя и адрес электронной почты в раздел Github на Панели настроек.", |
||||
"filePanel.workspaceName": "Название рабочей области", |
||||
"filePanel.customizeTemplate": "Настроить шаблон", |
||||
"filePanel.features": "Особенности", |
||||
"filePanel.upgradeability": "Улучшение", |
||||
"filePanel.ok": "OK", |
||||
"filePanel.yes": "Да", |
||||
"filePanel.cancel": "Отменить", |
||||
"filePanel.createNewWorkspace": "создать новую рабочую область", |
||||
"filePanel.connectToLocalhost": "подключиться к локальному хосту", |
||||
"filePanel.copiedToClipboard": "Скопировано в буфер обмена {path}", |
||||
"filePanel.downloadFailed": "Ошибка загрузки", |
||||
"filePanel.downloadFailedMsg": "Непредвиденная ошибка при загрузке: {error}", |
||||
"filePanel.close": "Закрыть", |
||||
"filePanel.copyFileFailed": "Ошибка копирования файла", |
||||
"filePanel.copyFileFailedMsg": "Непредвиденная ошибка при копировании файла: {src}", |
||||
"filePanel.copyFolderFailed": "Ошибка копирования папки", |
||||
"filePanel.copyFolderFailedMsg": "Непредвиденная ошибка при копировании папки: {src}", |
||||
"filePanel.runScriptFailed": "Не удалось запустить скрипт", |
||||
"filePanel.createPublicGist": "Создать публичный Gist", |
||||
"filePanel.createPublicGistMsg1": "Вы уверены, что хотите отправить изменения в удалённый файл gist на github.com?", |
||||
"filePanel.createPublicGistMsg2": "Вы уверены, что хотите анонимно опубликовать все ваши файлы в папке {path} как публичный файл на github.com?", |
||||
"filePanel.createPublicGistMsg3": "Вы уверены, что хотите анонимно опубликовать все ваши файлы в папке {path} как публичный файл на github.com?", |
||||
"filePanel.createPublicGistMsg4": "Вы уверены, что хотите анонимно опубликовать все ваши файлы в папке {name} как публичный файл на github.com?", |
||||
"filePanel.deleteMsg": "Вы уверены, что хотите удалить?", |
||||
"filePanel.theseItems": "эти элементы", |
||||
"filePanel.thisItem": "этот элемент", |
||||
"filePanel.deleteItems": "Удалить элементы", |
||||
"filePanel.deleteItem": "Удалить элемент", |
||||
"filePanel.globalToast": "Невозможно записать/изменить файловую систему в режиме только для чтения.", |
||||
"filePanel.basic": "Основной", |
||||
"filePanel.blank": "Пустой", |
||||
"filePanel.multiSigWallet": "Кошелек с мультиподписью", |
||||
"filePanel.mintable": "Чеканный", |
||||
"filePanel.burnable": "Ожигаемый", |
||||
"filePanel.pausable": "Пауза", |
||||
"filePanel.semaphore": "Семафор", |
||||
"filePanel.hashchecker": "Хэш-чекер", |
||||
"filePanel.rln": "Обнулитель ограничения частоты запросов", |
||||
"filePanel.breakthroughLabsUniswapv4Hooks": "Breakthrough-Labs Hooks", |
||||
"filePanel.uniswapV4Periphery": "V4 периферия", |
||||
"filePanel.uniswapV4HookBookMultiSigSwapHook": "HookBook MultiSigSwapHook", |
||||
"filePanel.transparent": "Прозрачный", |
||||
"filePanel.initGitRepoTitle": "Установите флажок для активизации рабочей области как нового git репозитория", |
||||
"filePanel.switchToBranchTitle1": "Проверить новую ветку из удалённой ветки", |
||||
"filePanel.switchToBranchTitle2": "Выдать в локальную ветку", |
||||
"filePanel.readOnly": "только для чтения", |
||||
"filePanel.renameFileFailed": "Не удалось переименовать файл", |
||||
"filePanel.renameFileFailedMsg": "Непредвиденная ошибка при переименовании: {error}", |
||||
"filePanel.fileCreationFailed": "Ошибка создания файла", |
||||
"filePanel.folderCreationFailed": "Ошибка создания папки", |
||||
"filePanel.validationError": "Ошибка проверки", |
||||
"filePanel.validationErrorMsg": "Нельзя использовать специальные символы", |
||||
"filePanel.reservedKeyword": "Зарезервированное ключевое слово", |
||||
"filePanel.reservedKeywordMsg": "Имя файла содержит зарезервированные ключевые слова Remix \".{content}\"", |
||||
"filePanel.moveFile": "Перемещение файлов", |
||||
"filePanel.moveFileMsg1": "Вы уверены, что хотите переместить {src} в {dest}?", |
||||
"filePanel.movingFileFailed": "Не удалось переместить файл", |
||||
"filePanel.movingFileFailedMsg": "Непредвиденная ошибка при перемещении файла: {src}", |
||||
"filePanel.movingFolderFailed": "Не удалось переместить папку", |
||||
"filePanel.movingFolderFailedMsg": "Непредвиденная ошибка при перемещении папки: {src}", |
||||
"filePanel.workspaceActions": "Действия в рабочей области", |
||||
"filePanel.saveCodeSample": "Эта рабочая область примера кода не будет сохранена. Нажмите здесь, чтобы сохранить." |
||||
} |
@ -0,0 +1,69 @@ |
||||
{ |
||||
"home.scamAlert": "Предупреждение о мошенничестве", |
||||
"home.scamAlertText": "Единственный URL, который использует Remix, - это remix.ethereum.org", |
||||
"home.scamAlertText2": "Остерегайтесь видеороликов, рекламирующих \"ботов-передовиков ликвидности\"", |
||||
"home.scamAlertText3": "Дополнительные советы по технике безопасности", |
||||
"home.learnMore": "Узнать больше", |
||||
"home.here": "здесь", |
||||
"home.featured": "Рекомендуемые", |
||||
"home.jumpIntoWeb3": "Перейти в WEB3", |
||||
"home.jumpIntoWeb3More": "Подробнее", |
||||
"home.jumpIntoWeb3Text": "Remix IDE является частью проекта Remix, широкий выбор инструментов которого, может быть использован для всего путешествия по разработке контракта пользователями любого уровня знаний. Узнайте больше на сайте проекта Remix.", |
||||
"home.remixYouTube": "СМОТРИМ И УЧИМСЯ", |
||||
"home.remixYouTubeText1": "Видео советы от команды Remix", |
||||
"home.remixYouTubeMore": "Смотреть", |
||||
"home.remixYouTubeText2": "У Remix растущая библиотека видео, содержащая множество советов по использованию инструмента. Проверьте их и подпишитесь, чтобы получить наши последние обновления.", |
||||
"home.betaTesting": "БЕТА-ТЕСТИРОВАНИЕ", |
||||
"home.betaTestingText1": "Наше сообщество поддерживает нас.", |
||||
"home.betaTestingText2": "Помогите нам запустить бета-тестирование прямо сейчас и ознакомьтесь с новыми функциями", |
||||
"home.betaTestingMore": "Зарегистрироваться", |
||||
"home.featuredPlugins": "Рекомендуемые плагины", |
||||
"home.solidityPluginDesc": "Компиляция, тестирование и анализ смарт-контрактов.", |
||||
"home.cookbookDesc": "Найти смарт-контракты, solidity библиотеки и обнаружить протоколы.", |
||||
"home.codeAnalyizerPluginDesc": "Анализируйте ваш код с помощью Remix, Solhint и Slither.", |
||||
"home.starkNetPluginDesc": "Компиляция и развертывание контрактов с Cairo, родным языком StarkNet.", |
||||
"home.solhintPluginDesc": "Solhint — проект с открытым исходным кодом для линейки кода Solidity.", |
||||
"home.sourcifyPluginDesc": "Контракт Solidity и сервис проверки метаданных.", |
||||
"home.unitTestPluginDesc": "Напишите и запустите модульные тесты для ваших контрактов в Solidity.", |
||||
"home.dgitPluginDesc": "Добавить контроль за исходным кодом в ваши проекты.", |
||||
"home.oneClickDappDesc": "Быстрое создание смарт-контрактных интерфейсов", |
||||
"home.getStarted": "Приступить к работе", |
||||
"home.projectTemplates": "Шаблоны проектов", |
||||
"home.blankTemplateDesc": "Создать пустую рабочую область.", |
||||
"home.remixDefaultTemplateDesc": "Создать рабочую область с файлами примеров.", |
||||
"home.ozerc20TemplateDesc": "Создайте ERC20 токен, импортируя библиотеку OpenZeppelin.", |
||||
"home.ozerc721TemplateDesc": "Создайте NFT токен, импортируя библиотеку OpenZeppelin.", |
||||
"home.ozerc1155TemplateDesc": "Создайте ERC1155 токен, импортируя библиотеку OpenZeppelin.", |
||||
"home.gnosisSafeMultisigTemplateDesc": "Создайте кошельки с мульти-подписью с использованием этого шаблона.", |
||||
"home.zeroxErc20TemplateDesc": "Создайте токен ERC20, импортируя контракт с 0xProject.", |
||||
"home.learn": "Обучение", |
||||
"home.learnEth1": "Основы Remix", |
||||
"home.learnEth1Desc": "Введение в интерфейс Remix-а и основные операции.", |
||||
"home.learnEth2": "Введение в Solidity", |
||||
"home.learnEth2Desc": "Интерактивное изучение концепции Solidity для начинающих.", |
||||
"home.remixAdvanced": "Развертывание с Библиотеками", |
||||
"home.remixAdvancedDesc": "Научитесь развертывать с библиотеками в Remix", |
||||
"home.remixYoutubePlaylist": "Плейлист Remix на Youtube", |
||||
"home.remixTwitterProfile": "Remix Twitter Профиль", |
||||
"home.remixLinkedinProfile": "Remix Linkedin профиль", |
||||
"home.remixMediumPosts": "Remix Medium публикации", |
||||
"home.joinUsOnDiscord": "Присоединяйтесь к нам в Discord", |
||||
"home.nativeIDE": "Родная IDE для разработки WEB3.", |
||||
"home.website": "Веб-сайт", |
||||
"home.documentation": "Документация", |
||||
"home.remixPlugin": "Remix плагин", |
||||
"home.remixDesktop": "Remix Desktop", |
||||
"home.searchDocumentation": "Поиск документации", |
||||
"home.files": "Файлы", |
||||
"home.newFile": "Новый файл", |
||||
"home.startCoding": "Начать кодирование", |
||||
"home.startCodingPlayground": "Откройте площадку для прототипирования и простого обучения", |
||||
"home.openFile": "Открыть файл", |
||||
"home.openFileTooltip": "Откройте файл из вашей файловой системы", |
||||
"home.accessFileSystem": "Доступ к файловой системе", |
||||
"home.loadFrom": "Загрузить из", |
||||
"home.resources": "Источники", |
||||
"home.connectToLocalhost": "Подключиться к локальному хосту", |
||||
"home.seeAllTutorials": "Посмотреть все уроки", |
||||
"home.maintainedByRemix": "Поддерживается Remix" |
||||
} |
@ -0,0 +1,17 @@ |
||||
import enJson from '../en' |
||||
|
||||
function readAndCombineJsonFiles() { |
||||
const dataContext = require.context('./', true, /\.json$/) |
||||
|
||||
let combinedData = {} |
||||
dataContext.keys().forEach((key) => { |
||||
const jsonData = dataContext(key) |
||||
combinedData = {...combinedData, ...jsonData} |
||||
}) |
||||
|
||||
return combinedData |
||||
} |
||||
|
||||
// There may have some un-translated content. Always fill in the gaps with EN JSON.
|
||||
// No need for a defaultMessage prop when render a FormattedMessage component.
|
||||
export default Object.assign({}, enJson, readAndCombineJsonFiles()) |
@ -0,0 +1,10 @@ |
||||
{ |
||||
"panel.author": "Автор", |
||||
"panel.maintainedBy": "Поддерживается", |
||||
"panel.documentation": "Документация", |
||||
"panel.description": "Описание", |
||||
"panel.maintainedByRemix": "Поддерживается Remix", |
||||
"panel.pluginInfo": "Информация о плагине", |
||||
"panel.linkToDoc": "Ссылка на документацию", |
||||
"panel.makeAnissue": "Создать задачу" |
||||
} |
@ -0,0 +1,13 @@ |
||||
{ |
||||
"permissionHandler.allPermissionsReset": "Все разрешения были сброшены.", |
||||
"permissionHandler.rememberText": "изменено и", |
||||
"permissionHandler.permissionHandlerMessage": "\"{from}\" {rememberText} хочет получить доступ к \"{method}\" из \"{to}\"`", |
||||
"permissionHandler.description": "Описание", |
||||
"permissionHandler.noDescriptionProvided": "Описание отсутствует", |
||||
"permissionHandler.makeSureYouTrustThisPlugin": "Убедитесь, что Вы доверяете этому плагину перед обработкой этого вызова. Если Вы запомните выбор для этого вызова, то значение будет сохранено только для текущей сессии.", |
||||
"permissionHandler.rememberThisChoice": "Запомнить этот выбор", |
||||
"permissionHandler.resetAllPermissions": "Сбросить все разрешения", |
||||
"permissionHandler.permissionNeededFor": "Для {to} необходимо разрешение", |
||||
"permissionHandler.accept": "Принять", |
||||
"permissionHandler.decline": "Отклонить" |
||||
} |
@ -0,0 +1,43 @@ |
||||
{ |
||||
"pluginManager.displayName": "Менеджер плагинов", |
||||
"pluginManager.activate": "Активировать", |
||||
"pluginManager.deactivate": "Деактивировать", |
||||
"pluginManager.activeModules": "Активные модули", |
||||
"pluginManager.inactiveModules": "Неактивные модули", |
||||
"pluginManager.connectLocal": "Подключиться к локальному плагину", |
||||
"pluginManager.localForm.title": "Локальный плагин", |
||||
"pluginManager.localForm.pluginName": "Название плагина", |
||||
"pluginManager.localForm.shouldBeCamelCase": "Должно быть в camelCase", |
||||
"pluginManager.localForm.displayName": "Отображаемое название", |
||||
"pluginManager.localForm.nameInTheHeader": "Название в заголовке", |
||||
"pluginManager.localForm.required": "требуется", |
||||
"pluginManager.localForm.commaSeparatedMethod": "список методов через запятую", |
||||
"pluginManager.localForm.commaSeparatedPlugin": "список названий плагинов через запятую", |
||||
"pluginManager.localForm.pluginsItCanActivate": "Плагины, которые могут быть активированы", |
||||
"pluginManager.localForm.typeOfConnection": "Тип соединения", |
||||
"pluginManager.localForm.locationInRemix": "Расположение в Remix", |
||||
"pluginManager.localForm.sidePanel": "Боковая панель", |
||||
"pluginManager.localForm.mainPanel": "Главная панель", |
||||
"pluginManager.localForm.none": "Пусто", |
||||
"pluginManager.localForm.methods": "Методы", |
||||
"pluginManager.localForm.pluginNames": "Имя плагина", |
||||
"pluginManager.localForm.ok": "OK", |
||||
"pluginManager.localForm.cancel": "Отменить", |
||||
"pluginManager.Permissions": "Разрешения", |
||||
"pluginManager.permissions": "разрешения", |
||||
"pluginManager.pluginManagerPermissions": "Разрешения менеджера плагинов", |
||||
"pluginManager.currentPermissionSettings": "Текущие настройки разрешений", |
||||
"pluginManager.noPermissionRequestedYet": "Пока нет запрошенных разрешений.", |
||||
"pluginManager.allow": "Разрешить", |
||||
"pluginManager.toCall": "чтобы вызвать", |
||||
"pluginManager.ok": "OK", |
||||
"pluginManager.cancel": "Отменить", |
||||
"pluginManager.maintainedByRemix": "Поддерживается Remix", |
||||
"pluginManager.linkToDoc": "Ссылка на документацию", |
||||
"pluginManager.versionAlpha": "Альфа-версия", |
||||
"pluginManager.versionBeta": "Бета-версия", |
||||
"pluginManager.deactivatePlugin": "Отключить {pluginName}", |
||||
"pluginManager.activatePlugin": "Включить {pluginName}", |
||||
"pluginManager.search": "Поиск", |
||||
"pluginManager.managePluginsPermissions": "Управление разрешениями плагинов" |
||||
} |
@ -0,0 +1,3 @@ |
||||
{ |
||||
"remixApp.scrollToSeeAllTabs": "Прокрутите, чтобы увидеть все вкладки" |
||||
} |
@ -0,0 +1,7 @@ |
||||
{ |
||||
"remixUiTabs.tooltipText1": "Запуск скрипта (CTRL + SHIFT + S)", |
||||
"remixUiTabs.tooltipText2": "Компилировать CTRL + S", |
||||
"remixUiTabs.tooltipText3": "Выберите файл c расширением .sol или .yul для компиляции или файл .ts или .js для запуска", |
||||
"remixUiTabs.zoomOut": "Уменьшить", |
||||
"remixUiTabs.zoomIn": "Увеличить" |
||||
} |
@ -0,0 +1,24 @@ |
||||
{ |
||||
"search.displayName": "Поиск в файлах", |
||||
"search.replace": "Заменить", |
||||
"search.replaceAll": "Заменить все", |
||||
"search.placeholder1": "Искать ( Введите для поиска )", |
||||
"search.placeholder2": "Включить ie *.sol ( Введите для включения)", |
||||
"search.placeholder3": "Исключить ie .git/**/* ( Введите для исключения )", |
||||
"search.matchCase": "Учитывать регистр", |
||||
"search.matchWholeWord": "Только слово целиком", |
||||
"search.useRegularExpression": "Использовать регулярные выражения", |
||||
"search.replaceWithoutConfirmation": "заменить без подтверждения", |
||||
"search.filesToInclude": "Файлы для включения", |
||||
"search.filesToExclude": "Файлы для исключения", |
||||
"search.toggleReplace": "Переключить замену", |
||||
"search.replaceInFiles": "заменить в файлах", |
||||
"search.stop": "Стоп", |
||||
"search.undoChanges": "Отменить изменения {path}", |
||||
"search.confirmreplaceMsg": "Вы уверены, что вы хотите заменить \"{find}\" на \"{replace}\" в {filename}?", |
||||
"search.yes": "Да", |
||||
"search.no": "Нет", |
||||
"search.loading": "Загрузка", |
||||
"search.text1": "Показать {count} результаты в {fileCount} файлах", |
||||
"search.text2": "Слишком много результатов для отображения...{br} Пожалуйста, сузьте поиск." |
||||
} |
@ -0,0 +1,44 @@ |
||||
{ |
||||
"settings.displayName": "Настройки", |
||||
"settings.reset": "Сбросить до настроек по умолчанию", |
||||
"settings.general": "Общие настройки", |
||||
"settings.generateContractMetadataText": "Генерирует метаданные договора. Генерирует JSON-файл в папке с договором. Позволяет указать адреса библиотек, от которых зависит контракт. Если ничего не указано, то Remix развертывает библиотеки автоматически.", |
||||
"settings.ethereunVMText": "Всегда использовать виртуальную машину Remix при загрузке", |
||||
"settings.wordWrapText": "Обводка слов в редакторе", |
||||
"settings.useAutoCompleteText": "Включение завершения кода в редакторе.", |
||||
"settings.useShowGasInEditorText": "Отобразить в редакторе расчеты газа.", |
||||
"settings.displayErrorsText": "Отображать ошибки в редакторе при вводе текста.", |
||||
"settings.matomoAnalytics": "Включение Matomo Analytics. Мы не собираем личную информацию (ПД). Эта информация используется для улучшения UX и пользовательского интерфейса сайта. Узнайте больше ", |
||||
"settings.enablePersonalModeText": " Включение персонального режима для провайдера web3. Транзакция, отправленная через Web 3, будет использовать web 3.personal API.", |
||||
"settings.warnText": "Убедитесь, что конечная точка открыта перед включением. Этот режим позволяет пользователю предоставить парольную фразу в интерфейсе Remix без необходимости разблокировать аккаунт. Несмотря на то, что это очень удобно, вы должны полностью доверять бэкэнду, к которому вы подключены (Geth, Parity, ...). Remix никогда не будет сохраняться парольная фраза", |
||||
"settings.gitAccessTokenTitle": "Учетные данные Github", |
||||
"settings.gitAccessTokenText": "Токен доступа используется для публикации Gist и получения содержимого GitHub. Возможно, вам потребуется ввести имя пользователя/электронную почту.", |
||||
"settings.gitAccessTokenText2": "Перейдите на страницу токенов github (ссылка ниже), создайте новый токен и сохраните его в Remix. Убедитесь, что этот токен имеет только право 'create gist'", |
||||
"settings.etherscanTokenTitle": "Токен доступа EtherScan", |
||||
"settings.etherscanAccessTokenText": "Управляйте ключом api, используемым для взаимодействия с Etherscan.", |
||||
"settings.etherscanAccessTokenText2": "Перейдите на страницу api ключей Etherscan (ссылка ниже), чтобы создать новый api ключ и сохраните его в Remix.", |
||||
"settings.save": "Сохранить", |
||||
"settings.remove": "Удалить", |
||||
"settings.themes": "Темы", |
||||
"settings.locales": "Язык", |
||||
"settings.swarm": "Настройки Swarm", |
||||
"settings.ipfs": "Настройки IPFS", |
||||
"settings.token": "ТОКЕН", |
||||
"settings.copy": "Копировать", |
||||
"settings.deleteEtherscanToken": "Удалить Etherscan токен", |
||||
"settings.username": "ИМЯ ПОЛЬЗОВАТЕЛЯ", |
||||
"settings.email": "Электронная почта", |
||||
"settings.deleteGithubCredentials": "Удалить учетные данные Github", |
||||
"settings.privateBeeAddress": "ПРИВАТНЫЙ BEE АДРЕС", |
||||
"settings.postageStampID": "ID почтового штампа", |
||||
"settings.host": "Хост", |
||||
"settings.protocol": "Протокол", |
||||
"settings.port": "ПОРТ", |
||||
"settings.projectID": "ID ПРОЕКТА", |
||||
"settings.projectSecret": "СЕКРЕТ ПРОЕКТА", |
||||
"settings.analyticsInRemix": "Аналитика в Remix IDE", |
||||
"settings.copilot": "Solidity второй пилот - Альфа", |
||||
"settings.copilot.activate": "Загрузка и активация копилота", |
||||
"settings.copilot.max_new_tokens": "Максимальное количество слов для генерации", |
||||
"settings.copilot.temperature": "Температура" |
||||
} |
@ -0,0 +1,81 @@ |
||||
{ |
||||
"solidity.displayName": "Компилятор Solidity", |
||||
"solidity._comment_compiler-container.tsx": "libs/remix-ui/solidity-compiler/src/lib/compiler-container.tsx", |
||||
"solidity.compiler": "Компилятор", |
||||
"solidity.addACustomCompiler": "Добавить пользовательский компилятор", |
||||
"solidity.addACustomCompilerWithURL": "Добавить пользовательский компилятор со ссылкой URL", |
||||
"solidity.includeNightlyBuilds": "Включить ночные сборки", |
||||
"solidity.autoCompile": "Автокомпиляция", |
||||
"solidity.hideWarnings": "Скрыть предупреждения", |
||||
"solidity.enableHardhat": "Включить Hardhat компиляцию", |
||||
"solidity.learnHardhat": "Узнайте, как использовать аппаратную компиляцию", |
||||
"solidity.enableTruffle": "Включить компиляцию Truffle", |
||||
"solidity.learnTruffle": "Узнайте, как использовать Truffle компиляцию", |
||||
"solidity.advancedConfigurations": "Расширенные конфигурации", |
||||
"solidity.compilerConfiguration": "Конфигурация Компилятора", |
||||
"solidity.compilationDetails": "Подробности компиляции", |
||||
"solidity.language": "Язык", |
||||
"solidity.evmVersion": "Версия EVM", |
||||
"solidity.enableOptimization": "Включить оптимизацию", |
||||
"solidity.useConfigurationFile": "Использовать файл настроек", |
||||
"solidity.change": "Изменить", |
||||
"solidity.compile": "Скомпилировать", |
||||
"solidity.noFileSelected": "файл не выбран", |
||||
"solidity.compileAndRunScript": "Компиляция и запуск скрипта", |
||||
"solidity.newConfigFileTitle": "Новый файл конфигурации", |
||||
"solidity.newConfigFileMessage": "Файл \"{configFilePathInput}\" который вы ввели не существует. Хотите создать новый?", |
||||
"solidity.create": "Создать", |
||||
"solidity.ok": "OK", |
||||
"solidity.cancel": "Отменить", |
||||
"solidity.noFileSelected1": "Нет выбранных файлов.", |
||||
"solidity.toCompile": "скомпилировать", |
||||
"solidity.noConfigFileSelected": "Не выбран файл конфигурации", |
||||
"solidity.copyNatSpecTag": "Нажмите, чтобы скопировать пользовательский тег NatSpec", |
||||
"solidity.inputTitle1": "Если файл, который вы ввели, не существует, вы сможете создать его на следующем шаге.", |
||||
"solidity.inputTitle2": "Расчетное количество раз, когда каждый опцион развернутого кода будет выполняться в течение всего срока действия контракта.", |
||||
"solidity.tooltipText1": "Выберите сценарий для выполнения сразу после компиляции, добавив тег `dev-run-script` natspec как в:", |
||||
"solidity.tooltipText2": "Нажмите на значок \"i\", чтобы узнать больше", |
||||
"solidity.tooltipText3": "для компиляции и выполнения скрипта", |
||||
"solidity.tooltipText4": "Нажмите, чтобы открыть файл конфигурации", |
||||
"solidity.tooltipText5": "Не удается загрузить список версий компилятора. Возможно, он заблокирован блокировщиком рекламы. Пожалуйста, попробуйте отключить любой из них с этой страницы и перезагрузить. Ошибка: ", |
||||
"solidity.tooltipText6": "Спецификация языка доступна от Компилятора >= v0.5.7", |
||||
"solidity.toastMessage": "Обновление версии компилятора, чтобы соответствовать текущему файлу контракта pragma т.е. {version}", |
||||
"solidity.compileIconAttribute": "компилятор загружается, пожалуйста, подождите несколько минут.", |
||||
"solidity.compilerLicense": "Лицензия Компилятора", |
||||
"solidity.compilerLicenseMsg1": "Загрузка компилятора. Лицензия будет отображаться после загрузки компилятора", |
||||
"solidity.compilerLicenseMsg2": "Не удалось получить лицензию для выбранной версии компилятора", |
||||
"solidity.compilerLicenseMsg3": "Лицензия недоступна", |
||||
"solidity.seeCompilerLicense": "Посмотреть лицензию компилятора", |
||||
"solidity._comment_contract-selection.tsx": "libs/remix-ui/solidity-compiler/src/lib/contract-selection.tsx", |
||||
"solidity.publishOn": "Опубликовано на", |
||||
"solidity.flatten": "Сглаживание контракта до генерации UML.", |
||||
"solidity.generateUML": "Создать UML диаграмму вашего контракта.", |
||||
"solidity.flattenLabel": "Сведение", |
||||
"solidity.generateUMLLabel": "Генерировать UML диаграмму", |
||||
"solidity.copy": "Копировать", |
||||
"solidity.copyABI": "Копировать ABI в буфер обмена", |
||||
"solidity.copyBytecode": "Копировать Bytecode в буфер обмена", |
||||
"solidity.unableToDisplay": "Не удается отобразить", |
||||
"solidity.download": "Скачать", |
||||
"solidity.compileDetails": "Скачать информацию о компиляции (формат JSON)", |
||||
"solidity.close": "Закрыть", |
||||
"solidity.contract": "Контракт", |
||||
"solidity.displayContractDetails": "Показать детали контракта", |
||||
"solidity.noContractCompiled": "Контракт еще не компилирован", |
||||
"solidity.Assembly": "Коды сборки, описывающие контракт, включая соответствующий исходный код Solidity", |
||||
"solidity.Opcodes": "Коды сборки с описанием контракта", |
||||
"solidity.name": "Название скомпилированного контракта", |
||||
"solidity.metadata": "Содержит всю информацию, относящуюся к компиляции", |
||||
"solidity.bytecode": "Байт-код, выполняемый при создании контракта", |
||||
"solidity.abi": "ABI: описание всех функций (входные и выходные параметры, область применения, ...)", |
||||
"solidity.web3Deploy": "Скопируйте или вставьте этот код в любую консоль JavaScript/Web3 для развертывания этого контракта", |
||||
"solidity.metadataHash": "Хэш представляющий всю метаинформацию", |
||||
"solidity.functionHashes": "Список объявленных функций и их соответствующий хэш", |
||||
"solidity.gasEstimates": "Оценка газа для каждого вызова функции", |
||||
"solidity.Runtime Bytecode": "Байт-код хранит состояние и выполняется во время обычного вызова контракта", |
||||
"solidity.storageLayout": "См. документацию по схеме хранилища.", |
||||
"solidity.devdoc": "Документация для разработчиков (natspec)", |
||||
"solidity.userdoc": "Документация пользователя (natspec)", |
||||
"solidity.compilerInput": "Ввод в компилятор Solidity", |
||||
"solidity.swarmLocation": "Url - адрес Swarm в котором можно найти всю информацию о метаданных (контракт должен быть опубликован первым)" |
||||
} |
@ -0,0 +1,41 @@ |
||||
{ |
||||
"solidityUnitTesting.displayName": "Модульное тестирование Solidity", |
||||
"solidityUnitTesting.testDirectory": "Тестовая директория", |
||||
"solidityUnitTesting.testYourSmartContract": "Проверьте ваш смарт - контракт в Solidity.", |
||||
"solidityUnitTesting.selectDirectory": "Выберите директорию для загрузки и создания тестовых файлов.", |
||||
"solidityUnitTesting.uiPathInputTooltip": "Нажмите 'Enter', чтобы изменить путь к тестовым файлами.", |
||||
"solidityUnitTesting.uiPathInputButtonTooltip": "Создать тестовую папку", |
||||
"solidityUnitTesting.create": "Создать", |
||||
"solidityUnitTesting.generateTestsButtonTooltip": "Создать пример тестового файла", |
||||
"solidityUnitTesting.generate": "Генерировать", |
||||
"solidityUnitTesting.generateTestsLinkTooltip": "Ознакомьтесь с документацией.", |
||||
"solidityUnitTesting.howToUse": "Как использовать...", |
||||
"solidityUnitTesting.runButtonTitle1": "Начать тесты", |
||||
"solidityUnitTesting.runButtonTitle2": "Пожалуйста, выберите версию компилятора Solidity выше чем 0.4.12.", |
||||
"solidityUnitTesting.runButtonTitle3": "Не выбран Solidity файл", |
||||
"solidityUnitTesting.runButtonTitle4": "Solidity плагин должен быть активирован", |
||||
"solidityUnitTesting.runButtonTitle5": "Тестовый файл не выбран", |
||||
"solidityUnitTesting.stopButtonLabel1": "Стоп", |
||||
"solidityUnitTesting.stopButtonLabel2": "Останавливается", |
||||
"solidityUnitTesting.run": "Запустить", |
||||
"solidityUnitTesting.runTestsTabStopActionTooltip": "Остановить запуск тестов", |
||||
"solidityUnitTesting.selectAll": "Выбрать все", |
||||
"solidityUnitTesting.testTabTestsExecutionStopped": "Выполнение теста остановлено", |
||||
"solidityUnitTesting.testTabTestsExecutionStoppedError": "Выполнение теста остановлено из-за ошибки(ошибок) в вашем тестовом файле", |
||||
"solidityUnitTesting.progress": "Прогресс: {readyTestsNumber} завершён (из {runningTestsNumber})", |
||||
"solidityUnitTesting.resultFor": "Результат для", |
||||
"solidityUnitTesting.passed": "Успешно", |
||||
"solidityUnitTesting.failed": "Сбой", |
||||
"solidityUnitTesting.timeTaken": "Затраченное время", |
||||
"solidityUnitTesting.errorMessage": "Сообщение об ошибке", |
||||
"solidityUnitTesting.assertion": "Утверждение", |
||||
"solidityUnitTesting.expectedValueShouldBe": "Ожидаемое значение должно быть", |
||||
"solidityUnitTesting.receivedValue": "Полученные значения", |
||||
"solidityUnitTesting.skippingTheRemainingTests": "Пропуск оставшихся тестов функции.", |
||||
"solidityUnitTesting.toasterMsg": "Папка успешно создана", |
||||
"solidityUnitTesting.tooltipText1": "Не удалось выполнить тест по крайней мере одного контракта", |
||||
"solidityUnitTesting.tooltipText2": "Все контрактные тесты пройдены", |
||||
"solidityUnitTesting.tooltipText3": "Начать отладку", |
||||
"solidityUnitTesting.fail": "НЕПРОЙДЕН", |
||||
"solidityUnitTesting.pass": "ПРОЙДЕН" |
||||
} |
@ -0,0 +1,43 @@ |
||||
{ |
||||
"terminal.listen": "прослушивание всех транзакций", |
||||
"terminal.listenTitle": "Если флажок установлен, то Remix будет прослушивать все транзакции, добытые в текущей среде, а не только транзакции, созданные вами", |
||||
"terminal.search": "Поиск по хэшу или адресу транзакции", |
||||
"terminal.used": "используется", |
||||
"terminal.debug": "Отладка", |
||||
"terminal.welcomeText1": "Добро пожаловать в", |
||||
"terminal.welcomeText2": "Ваши файлы хранятся в", |
||||
"terminal.welcomeText3": "Вы можете использовать этот терминал для", |
||||
"terminal.welcomeText4": "Проверьте детали транзакций и начните отладку", |
||||
"terminal.welcomeText5": "Выполнение скриптов JavaScript", |
||||
"terminal.welcomeText6": "Введите сценарий непосредственно в интерфейсе командной строки", |
||||
"terminal.welcomeText7": "Выберите файл Javascript в проводнике файлов, а затем запустите \"remix.execute()\" или \"remix.exeCurrent()\" в интерфейсе командной строки", |
||||
"terminal.welcomeText8": "Щелкните правой кнопкой мыши на файл JavaScript в проводнике и затем нажмите `Выполнить`", |
||||
"terminal.welcomeText9": "Доступны следующие библиотеки", |
||||
"terminal.welcomeText10": "Введите имя библиотеки, чтобы увидеть доступные команды", |
||||
"terminal.text1": "Этот тип команды устарел и больше не функционирует. Пожалуйста, запустите remix.help(), чтобы получить список доступных команд.", |
||||
"terminal.hideTerminal": "Скрыть терминал", |
||||
"terminal.showTerminal": "Показать терминал", |
||||
"terminal.clearConsole": "Очистить консоль", |
||||
"terminal.pendingTransactions": "Ожидающие транзакции", |
||||
"terminal.toasterMsg1": "нет контента для выполнения", |
||||
"terminal.toasterMsg2": "не найден поставщик пути {fileName}", |
||||
"terminal.vmMode": "Режим VM", |
||||
"terminal.vmModeMsg": "Не удается отладить этот вызов. Отладка вызовов возможна только в режиме Remix VM.", |
||||
"terminal.ok": "Ok", |
||||
"terminal.cancel": "Отменить", |
||||
"terminal.callWarning": "(Применяется только в случае вызова контракта)", |
||||
"terminal.msg1": "Транзакция добыта, но выполнение не удалось", |
||||
"terminal.msg2": "Успешное выполнение транзакций", |
||||
"terminal.msg3": "Статус недоступен в данный момент", |
||||
"terminal.status": "статус", |
||||
"terminal.transactionHash": "хеш транзакции", |
||||
"terminal.blockHash": "хеш блока", |
||||
"terminal.blockNumber": "номер блока", |
||||
"terminal.contractAddress": "адрес контракта", |
||||
"terminal.transactionCost": "стоимость транзакции", |
||||
"terminal.executionCost": "стоимость исполнения", |
||||
"terminal.input": "ввод", |
||||
"terminal.decodedInput": "декодированный ввод", |
||||
"terminal.decodedOutput": "декодированный вывод", |
||||
"terminal.logs": "журналы" |
||||
} |
@ -0,0 +1,139 @@ |
||||
{ |
||||
"udapp.displayName": "Развертывание и запуск транзакций", |
||||
"udapp._comment_gasPrice.tsx": "libs/remix-ui/run-tab/src/lib/components/gasPrice.tsx", |
||||
"udapp.gasLimit": "Лимит газа", |
||||
"udapp.tooltipText4": "Стандартный газовой лимит составляет 3М. Регулировка по мере необходимости.", |
||||
"udapp._comment_value.tsx": "libs/remix-ui/run-tab/src/lib/components/value.tsx", |
||||
"udapp.value": "Значение", |
||||
"udapp.tooltipText5": "Введите сумму и выберите ее единицу", |
||||
"udapp._comment_contractDropdownUI.tsx": "libs/remix-ui/run-tab/src/lib/components/contractDropdownUI.tsx", |
||||
"udapp.contract": "Контракт", |
||||
"udapp.compiledBy": "скомпилировано {compilerName}", |
||||
"udapp.warningEvmVersion": "Пожалуйста, убедитесь, что выбранная сеть совместима с данной Evm версией: {evmVersion}. В противном случае развёртывание закончится неудачно.", |
||||
"udapp.infoSyncCompiledContractTooltip": "Нажмите здесь, чтобы импортировать контакты, скомпилированные из внешней платформы.\nЭто действие включается, когда Remix подключён к внешнему фреймворку (hardhat, truffle, foundry) через remixd", |
||||
"udapp.remixIpfsUdappTooltip": "Публикация исходного кода и метаданных IPFS облегчает верификацию исходного кода с помощью Sourcify и значительно ускоряет принятие контракта (аудит, отладка, вызов и т.д...)", |
||||
"udapp.deploy": "Развернуть", |
||||
"udapp.publishTo": "Опубликовать в", |
||||
"udapp.atAddress": "At Address", |
||||
"udapp.atAddressOptionsTitle1": "адрес контракта", |
||||
"udapp.atAddressOptionsTitle2": "Для взаимодействия с развёрнутым контрактом, необходимо выбрать в редакторе файл .abi или скомпилированный файл .sol (с той же конфигурацией компилятора)", |
||||
"udapp.atAddressOptionsTitle3": "Компилируйте *.sol файл или выберите файл *.abi.", |
||||
"udapp.atAddressOptionsTitle4": "Для взаимодействия с развёрнутым контрактом, либо введите его адрес и скомпилируйте исходный файл *.sol (с такими же настройками компилятора) или выберите его .abi файл в редакторе.", |
||||
"udapp.contractOptionsTitle1": "Пожалуйста, скомпилируйте *.sol файл для развертывания или доступа к контракту", |
||||
"udapp.contractOptionsTitle2": "Выберите скомпилированный контракт для развертывания или используйте по адресу.", |
||||
"udapp.contractOptionsTitle3": "Выберите и скомпилируйте *.sol файл для развертывания или доступа к контракту.", |
||||
"udapp.contractOptionsTitle4": "При наличии скомпилированного файла .sol, выберите контракт для развертывания или использования с параметром \"At Address\".", |
||||
"udapp.checkSumWarning": "Похоже вы не используете адрес с контрольной суммой. Адрес с контрольной суммой это адрес который состоит из заглавных букв, как указано в {a}. Контрольные адреса предназначены для предотвращения отправки пользователями транзакций по ошибочному адресу.", |
||||
"udapp.isOverSizePromptEip170": "Инициализация создания контракта возвращает данные длиной более 24576 байт. Развёртывание скорее всего завершится неудачей, если текущая сеть активировала eip 170. Дополнительная информация: {a}", |
||||
"udapp.isOverSizePromptEip3860": "Код инициализации контракта превышает допустимый максимальный размер кода 49152 байта. Развёртывание скорее всего не будет выполнено, если текущая сеть активировала eip 3860. Дополнительная информация: {a}", |
||||
"udapp.thisContractMayBeAbstract": "Этот контракт может быть абстрактным, он может не полностью применять методы абстрактного родительского объекта или он может неправильно вызывать унаследованный конструктор контракта.", |
||||
"udapp.noCompiledContracts": "Компилированных контрактов нет", |
||||
"udapp.addressOfContract": "Адрес контракта", |
||||
"udapp.loadContractFromAddress": "Загрузить контракт из адреса", |
||||
"udapp.ok": "OK", |
||||
"udapp.alert": "Предупреждение", |
||||
"udapp.proceed": "Продолжить", |
||||
"udapp.cancel": "Отменить", |
||||
"udapp.abiFileSelected": "Выбран файл ABI", |
||||
"udapp.evmVersion": "версия EVM", |
||||
"udapp.addressNotValid": "Адрес не действителен", |
||||
"udapp._comment_account.tsx": "libs/remix-ui/run-tab/src/lib/components/account.tsx", |
||||
"udapp.account": "Аккаунт", |
||||
"udapp.signAMessage": "Подписать сообщение", |
||||
"udapp.enterAMessageToSign": "Введите сообщение для подписания", |
||||
"udapp.hash": "хэш", |
||||
"udapp.signature": "подпись", |
||||
"udapp.injectedTitle": "К сожалению, невозможно создать учетную запись с помощью внедрённого провайдера. Пожалуйста, создайте аккаунт непосредственно у вашего провайдера (т.е. Metamask или другого такого же типа).", |
||||
"udapp.createNewAccount": "Создать новый аккаунт", |
||||
"udapp.web3Title": "Создание учетной записи возможно только в Личном режиме. Пожалуйста, перейдите в Настройки, чтобы включить ее.", |
||||
"udapp.defaultTitle": "К сожалению, невозможно создать учетную запись с помощью внешнего кошелька ({selectExEnv}).", |
||||
"udapp.text1": "Пожалуйста, укажите пароль для создания учетной записи", |
||||
"udapp.tooltipText1": "Список учётных записей пуст, пожалуйста, убедитесь, что текущий провайдер правильно подключен к remix", |
||||
"udapp.modalTitle1": "Парольная фраза для подписания сообщения", |
||||
"udapp.modalMessage1": "Введите ваш пароль для этой учётной записи чтобы подписания сообщения", |
||||
"udapp.copyAccount": "Копировать аккаунт в буфер обмена", |
||||
"udapp.signMsgUsingAccount": "Подписать сообщение, используя эту учетную запись", |
||||
"udapp._comment_environment.tsx": "libs/remix-ui/run-tab/src/lib/components/environment.tsx", |
||||
"udapp.environment": "Среда", |
||||
"udapp.environmentDocs": "Нажмите для получения документации о Среде", |
||||
"udapp.tooltipText2": "Откройте chainlist.org и получите данные подключения к цепочке, с которой вы хотите взаимодействовать.", |
||||
"udapp.tooltipText3": "Нажмите, чтобы открыть мост для преобразования L1 mainnet ETH в выбранную сетевую валюту.", |
||||
"udapp._comment_instanceContainerUI.tsx": "libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx", |
||||
"udapp.deployedContracts": "Развернутые контракты", |
||||
"udapp.deployAndRunClearInstances": "Очистить список экземпляров и сбросить рекордер", |
||||
"udapp.deployAndRunNoInstanceText": "В настоящее время у вас нет экземпляров контракта для взаимодействия.", |
||||
"udapp.tooltipText6": "Автоматически создаваемые пользовательские интерфейсы для взаимодействия с развернутыми контрактами", |
||||
"udapp._comment_recorderCardUI.tsx": "libs/remix-ui/run-tab/src/lib/components/recorderCardUI.tsx", |
||||
"udapp.transactionsRecorded": "Транзакции записаны", |
||||
"udapp.transactionsCountTooltip": "Количество записанных транзакций", |
||||
"udapp.transactionSaveTooltip1": "Нет транзакций для сохранения", |
||||
"udapp.transactionSaveTooltip2": "Сохранить транзакцию {count} как файл сценария", |
||||
"udapp.transactionSaveTooltip3": "Сохранить транзакции {count} как файл сценария", |
||||
"udapp.transactionsWalkthroughTooltip": "Начать пошаговое описание для записи.", |
||||
"udapp.infoRecorderTooltip": "Сохранить транзакции (развернутые контракты и выполнение функций) и повторить их в другой среде. Например, транзакции, созданные в Remix VM, могут воспроизводиться во внутреннем провайдере (Injected Provider).", |
||||
"udapp.livemodeRecorderTooltip": "Если контракты обновляются после записи транзакций, то установка этого флажка приведёт к запуску записанных транзакций с последней копией скомпилированных контрактов", |
||||
"udapp.livemodeRecorderLabel": "Выполнить транзакции с использованием последнего результата компиляции", |
||||
"udapp.runRecorderTooltip": "Выполнить транзакцию(и) из текущего файла сценария", |
||||
"udapp.save": "Сохранить", |
||||
"udapp.run": "Запустить", |
||||
"udapp._comment_contractGUI.tsx": "libs/remix-ui/run-tab/src/lib/components/contractGUI.tsx", |
||||
"udapp.parameters": "Параметры", |
||||
"udapp.copyParameters": "Копировать параметры ввода в буфер обмена", |
||||
"udapp.copyCalldata": "Копировать данные вызова в буфер обмена", |
||||
"udapp.deployWithProxy": "Развернуть с прокси", |
||||
"udapp.upgradeWithProxy": "Обновить с прокси", |
||||
"udapp.getEncodedCallError": "невозможно кодировать пустые аргументы", |
||||
"udapp.proxyAddressError1": "прокси адрес не может быть пустым", |
||||
"udapp.proxyAddressError2": "недействительный адрес контракта", |
||||
"udapp.tooltipText11": "Прокси адрес не может быть пустым", |
||||
"udapp.tooltipText12": "Требуется ввод", |
||||
"udapp.tooltipText13": "Развернуто {date}", |
||||
"udapp._comment_universalDappUI.tsx": "libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx", |
||||
"udapp.tooltipText7": "Удалить из списка", |
||||
"udapp.tooltipText8": "Нажмите для просмотра документации об использовании функций 'receive'/'fallback'", |
||||
"udapp.tooltipText9": "Данные вызова для отправки в резервную функцию контракта.", |
||||
"udapp.tooltipText10": "Отправить данные контракту.", |
||||
"udapp.balance": "Баланс", |
||||
"udapp.lowLevelInteractions": "Взаимодействия низкого уровня", |
||||
"udapp.llIError1": "Отправляемое значение должно быть числом", |
||||
"udapp.llIError2": "Для получения перевода Ether контракт должен иметь функцию 'receive' или оплачиваемую функцию 'fallback'", |
||||
"udapp.llIError3": "Вызываемые данные должны быть допустимым шестнадцатеричным значением с размером не менее одного байта.", |
||||
"udapp.llIError4": "Вызываемые данные должны быть допустимым шестнадцатеричным значением.", |
||||
"udapp.llIError5": "Функция 'Fallback' не определена", |
||||
"udapp.llIError6": "Обе функции 'receive' и 'fallback' не определены", |
||||
"udapp.llIError7": "Пожалуйста, определите функцию 'Fallback' для отправки вызываемых данных или 'Receive' или оплачиваемую функцию 'Fallback' для отправки эфира", |
||||
"udapp.copy": "Копировать", |
||||
"udapp._comment_mainnet.tsx": "libs/remix-ui/run-tab/src/lib/components/mainnet.tsx", |
||||
"udapp.mainnetText1": "Вы собираетесь создать транзакцию в сети {name}. Подтвердите данные для отправки информации вашему провайдеру.", |
||||
"udapp.mainnetText2": "Провайдером для многих пользователей является MetaMask. Провайдер попросит вас подписать транзакцию перед отправкой ее в сеть {name}.", |
||||
"udapp.amount": "Количество", |
||||
"udapp.gasEstimation": "Оценка газа", |
||||
"udapp.maxPriorityFee": "Максимальная плата за приоритет", |
||||
"udapp.maxFee": "Максимальная комиссия (не меньше базовой комиссии {baseFeePerGas} Gwei)", |
||||
"udapp.contractCreation": "Создание контракта", |
||||
"udapp.transactionFee": "Недопустимая операция. Максимальная комиссия не должна быть меньше базовой комиссии", |
||||
"udapp.title1": "Представляет собой часть комиссии, которая направляется майнеру", |
||||
"udapp.title2": "Представляет максимальную сумму комиссии, которую вы платите за эту транзакцию. Минимальная сумма должна быть равной базовой комиссии.", |
||||
"udapp.gasPrice": "Цена газа", |
||||
"udapp.gweiText": "посетите {a} для информации о текущей цене газа.", |
||||
"udapp.maxTransactionFee": "Максимальная комиссия за транзакцию", |
||||
"udapp.mainnetText3": "Больше не показывать это предупреждение.", |
||||
"udapp._comment_run-tab.tsx": "libs/remix-ui/run-tab/src/lib/run-tab.tsx", |
||||
"udapp.gasEstimationPromptText": "При оценке газа произошла ошибка со следующим сообщением (см. ниже). Выполнение транзакции скорее всего закончится неудачно. Хотите принудительно отправить?", |
||||
"udapp._comment_custom-dropdown.tsx": "libs/remix-ui/helper/src/lib/components/custom-dropdown.tsx", |
||||
"udapp.enterProxyAddress": "Введите адрес прокси", |
||||
"udapp._comment_provider": "apps/remix-ide/src/app/providers", |
||||
"udapp.customVmForkProviderText": "Пожалуйста, предоставьте информацию о пользовательском форке. Если URL-адрес узла не указан, Виртуальная Машина запустится с пустого состояния.", |
||||
"udapp.nodeUrl": "URL узла", |
||||
"udapp.blockNumber": "Номер блока (или \"последний\")", |
||||
"udapp.externalHttpProviderText1": "Примечание: Для использования Geth и https://remix.ethereum.org, настройте его так, чтобы он разрешал запросы от Remix:(см. <a>Geth Docs на сервере rpc</a>)", |
||||
"udapp.externalHttpProviderText2": "Для запуска Remix и локального тестового узла Geth используйте эту команду: (см. <a>Geth Docs в режиме Dev mode </a>)", |
||||
"udapp.externalHttpProviderText3": "<b>ВНИМАНИЕ:</b> Не безопасно использование флага --http.corsdomain с подстановочным символом: <b>--http.corsdomain *</b>", |
||||
"udapp.externalHttpProviderText4": "Для дополнительной информации: <a>Remix Docs на внешнем HTTP провайдере</a>", |
||||
"udapp.foundryProviderText1": "Примечание: Чтобы запустить Anvil в системе, запустите:", |
||||
"udapp.foundryProviderText2": "Для получения дополнительной информации, посетите <a>Документация по инструментарию разработки смарт-контрактов (Foundry) </a>", |
||||
"udapp.ganacheProviderText1": "Примечание: Чтобы запустить Ganache в системе, запустите:", |
||||
"udapp.ganacheProviderText2": "Для получения дополнительной информации, посетите: <a>Документация по Ganache</a>", |
||||
"udapp.hardhatProviderText1": "Примечание: Для запуска узла Hardhat в вашей системе, перейдите в папку hardhat проекта и запустите команду:", |
||||
"udapp.hardhatProviderText2": "Для получения дополнительной информации, посетите: <a>Документация по Hardhat</a>" |
||||
} |
@ -0,0 +1,4 @@ |
||||
export * from './lib/remix-ui-grid-view' |
||||
export * from './lib/remix-ui-grid-section' |
||||
export * from './lib/remix-ui-grid-cell' |
||||
|
@ -0,0 +1,42 @@ |
||||
/* eslint-disable @typescript-eslint/no-unused-vars */ |
||||
import React from 'react' |
||||
import { useContext } from 'react' |
||||
import FiltersContext from ".././filtersContext" |
||||
|
||||
interface CustomCheckboxProps { |
||||
label: string |
||||
color?: string |
||||
} |
||||
|
||||
export const CustomCheckbox = (props: CustomCheckboxProps) => { |
||||
const filterCon = useContext(FiltersContext) |
||||
let textColor = props.color |
||||
let defChecked = true |
||||
if (filterCon.keyValueMap[props.label]) defChecked = filterCon.keyValueMap[props.label].enabled |
||||
if (!textColor || textColor == '') textColor = filterCon.keyValueMap[props.label].color |
||||
|
||||
return ( |
||||
<div id={textColor + props.label} className="h-80 mx-1 align-items-center custom-control custom-checkbox" style={{minWidth: '4rem'}}> |
||||
<input |
||||
className="custom-control-input" |
||||
id={"GVCheckbox" + props.label} |
||||
defaultChecked={defChecked} |
||||
onChange={e => { |
||||
if (props.label == 'no tag') |
||||
filterCon.showUntagged = ! filterCon.showUntagged |
||||
else filterCon.updateValue(props.label, e.target.checked, textColor)}} |
||||
type="checkbox" |
||||
/> |
||||
<label |
||||
className={"form-check-label custom-control-label text-nowrap text-" + textColor} |
||||
style={{ paddingTop: '0.125rem' }} |
||||
htmlFor={"GVCheckbox" + props.label} |
||||
data-id={"GVCheckboxLabel" + props.label} |
||||
> |
||||
{ props.label } |
||||
</label> |
||||
</div> |
||||
) |
||||
} |
||||
|
||||
export default CustomCheckbox |
@ -0,0 +1,18 @@ |
||||
import React, { createContext, useState, useContext } from 'react'; |
||||
|
||||
interface FilterContextType { |
||||
showUntagged: boolean |
||||
showPin: boolean |
||||
keyValueMap: Record<string, { enabled: boolean; color: string; }>; |
||||
updateValue: (key: string, enabled: boolean, color: string) => void |
||||
addValue: (key: string, enabled: boolean, color: string) => void |
||||
} |
||||
const FiltersContext = createContext<FilterContextType>({ |
||||
showUntagged: false, |
||||
showPin: false, |
||||
keyValueMap: {}, |
||||
updateValue: () => {}, |
||||
addValue: () => {}, |
||||
}); |
||||
|
||||
export default FiltersContext |
@ -0,0 +1,46 @@ |
||||
.remixui_grid_cell { |
||||
font-weight: normal; |
||||
} |
||||
|
||||
.remixui_grid_cell_container { |
||||
width: fit-content; |
||||
} |
||||
|
||||
.remixui_grid_cell_title{ |
||||
font-size: 0.8rem; |
||||
font-style: italic; |
||||
} |
||||
|
||||
.remixui_grid_cell_btn { |
||||
width: 32px; |
||||
} |
||||
|
||||
.remixui_grid_cell_logo { |
||||
width: 3rem; |
||||
height: 3rem; |
||||
} |
||||
|
||||
.remixui_grid_cell_pin:focus { |
||||
outline: none; |
||||
} |
||||
.remixui_grid_cell_pin { |
||||
width: 1rem; |
||||
height: 1rem; |
||||
position: relative; |
||||
right: 1rem; |
||||
top: -0.5rem; |
||||
background: transparent; |
||||
} |
||||
|
||||
.remixui_grid_cell_tags { |
||||
position: relative; |
||||
right: 1rem; |
||||
top: 0.1rem; |
||||
} |
||||
|
||||
.remixui_grid_cell_tag { |
||||
font-size: x-small; |
||||
font-weight: bolder; |
||||
width: 0.4rem; |
||||
height: 1.2rem; |
||||
} |
@ -0,0 +1,86 @@ |
||||
import React, {useState, useEffect, useContext, useRef, ReactNode} from 'react' // eslint-disable-line
|
||||
|
||||
import './remix-ui-grid-cell.css' |
||||
import FiltersContext from "./filtersContext" |
||||
import { CustomTooltip } from '@remix-ui/helper' |
||||
|
||||
|
||||
declare global { |
||||
interface Window { |
||||
_paq: any |
||||
} |
||||
} |
||||
const _paq = window._paq = window._paq || [] |
||||
|
||||
interface RemixUIGridCellProps { |
||||
plugin: any |
||||
pinned?: boolean |
||||
pinStateCallback?: any |
||||
logo?: string |
||||
title?: string
|
||||
tagList?: string[] // max 8, others will be ignored
|
||||
classList?: string |
||||
styleList?: any |
||||
children?: ReactNode |
||||
} |
||||
|
||||
export const RemixUIGridCell = (props: RemixUIGridCellProps) => { |
||||
const filterCon = useContext(FiltersContext) |
||||
const [anyEnabled, setAnyEnabled] = useState(false) |
||||
const [pinned, setPinned] = useState<boolean>(props.pinned) |
||||
|
||||
useEffect(() => { |
||||
if (props.tagList) setAnyEnabled(props.tagList.some((key) => filterCon.keyValueMap[key]?.enabled)) |
||||
else setAnyEnabled(filterCon.showUntagged)
|
||||
}, [filterCon, props.tagList]) |
||||
|
||||
return ( |
||||
<div className='mr-2 mt-3'> |
||||
{ anyEnabled && <div className='d-flex flex-grid'> |
||||
<div className={"d-flex mx-0 p-2 bg-light border border-secondary remixui_grid_cell_container " + props.classList || ''} data-id={"remixUIGS" + props.title}> |
||||
<div className="d-flex remixui_grid_cell flex-column"> |
||||
<div className='d-flex flex-row pb-1 align-items-end' style={{width: '8rem', height: '1rem'}}> |
||||
{ props.logo && <img className='remixui_grid_view_logo mr-1' src={props.logo} style={{width: '1rem', height: '1rem'}}/> } |
||||
{ props.title && <label |
||||
className='m-0 p-0 align-items-left' |
||||
style={{overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', fontSize: 'xx-small'}} |
||||
> |
||||
{ props.title } |
||||
</label> } |
||||
</div> |
||||
{ props.children } |
||||
</div> |
||||
</div> |
||||
{ filterCon.showPin && <button |
||||
className={`${pinned ? 'fa-duotone' : 'fa-light'}` + ` fa-map-pin text-info border-0 mb-0 remixui_grid_cell_pin`} |
||||
onClick={() => { |
||||
setPinned(!pinned) |
||||
props.pinStateCallback() |
||||
}} |
||||
></button>} |
||||
{ props.tagList && <div className='d-flex flex-column align-items-begin remixui_grid_cell_tags'> |
||||
{ Object.keys(props.tagList).map((key) => ( |
||||
filterCon.keyValueMap[props.tagList[key]].enabled && ( |
||||
<CustomTooltip |
||||
placement="right" |
||||
tooltipId="pluginManagerInactiveTitleLinkToDoc" |
||||
tooltipClasses="text-nowrap" |
||||
tooltipText={props.tagList[key]} |
||||
> |
||||
<span key={props.tagList[key]} |
||||
className={'remixui_grid_cell_tag bg-' + filterCon.keyValueMap[props.tagList[key]].color} |
||||
> |
||||
</span> |
||||
</CustomTooltip> |
||||
) |
||||
)) } |
||||
</div> } |
||||
{ !props.tagList && <span |
||||
className={'remixui_grid_cell_tags'}> |
||||
</span> } |
||||
</div> } |
||||
</div> |
||||
) |
||||
} |
||||
|
||||
export default RemixUIGridCell |
@ -0,0 +1,26 @@ |
||||
.remixui_grid_section { |
||||
font-weight: normal; |
||||
} |
||||
|
||||
.remixui_grid_section_container { |
||||
width: fit-content; |
||||
} |
||||
|
||||
.remixui_grid_section_title{ |
||||
font-size: 0.8rem; |
||||
font-style: italic; |
||||
} |
||||
|
||||
.remixui_grid_section_btn { |
||||
width: 32px; |
||||
} |
||||
|
||||
.remixui_grid_section_logo { |
||||
width: 3rem; |
||||
height: 3rem; |
||||
} |
||||
|
||||
* { |
||||
scrollbar-width: thin; |
||||
scrollbar-color: var(--bg-dark) var(--bg-light); |
||||
} |
@ -0,0 +1,38 @@ |
||||
import React, {useState, useEffect, useContext, useRef, ReactNode} from 'react' // eslint-disable-line
|
||||
|
||||
import './remix-ui-grid-section.css' |
||||
|
||||
declare global { |
||||
interface Window { |
||||
_paq: any |
||||
} |
||||
} |
||||
const _paq = window._paq = window._paq || [] |
||||
|
||||
interface RemixUIGridSectionProps { |
||||
plugin: any |
||||
title?: string |
||||
hScrollable: boolean |
||||
classList?: string |
||||
styleList?: any |
||||
children?: ReactNode |
||||
} |
||||
|
||||
export const RemixUIGridSection = (props: RemixUIGridSectionProps) => { |
||||
return ( |
||||
<div |
||||
className={`d-flex px-4 py-2 flex-column w-100 remixui_grid_section_container ${props.classList}`} |
||||
data-id={"remixUIGS" + props.title} |
||||
style={{ overflowX: 'auto' }} |
||||
> |
||||
<div className="d-flex flex-column w-100 remixui_grid_section"> |
||||
{ props.title && <h6 className='mt-1 mb-0 align-items-left '>{ props.title }</h6> } |
||||
<div className={(props.hScrollable) ? `d-flex flex-row pb-2 overflow-auto` : `d-flex flex-wrap`}> |
||||
{ props.children } |
||||
</div> |
||||
</div> |
||||
</div> |
||||
) |
||||
} |
||||
|
||||
export default RemixUIGridSection |
@ -0,0 +1,25 @@ |
||||
.remixui_grid_view { |
||||
font-weight: normal; |
||||
} |
||||
|
||||
.remixui_grid_view_container { |
||||
overflow: auto; |
||||
} |
||||
|
||||
.remixui_grid_view_title{ |
||||
font-size: 0.8rem; |
||||
font-style: italic; |
||||
} |
||||
|
||||
.remixui_grid_view_btn { |
||||
width: 32px; |
||||
} |
||||
|
||||
.remixui_grid_view_logo { |
||||
width: 3rem; |
||||
height: 3rem; |
||||
} |
||||
|
||||
.remixui_grid_view_titlebar { |
||||
min-width: max-content; |
||||
} |
@ -0,0 +1,147 @@ |
||||
import React, {useState, useEffect, useContext, useRef, ReactNode} from 'react' // eslint-disable-line
|
||||
|
||||
import './remix-ui-grid-view.css' |
||||
import {ThemeContext, themes} from './themeContext' |
||||
import CustomCheckbox from './components/customCheckbox' |
||||
import FiltersContext from "./filtersContext" |
||||
|
||||
declare global { |
||||
interface Window { |
||||
_paq: any |
||||
} |
||||
} |
||||
const _paq = window._paq = window._paq || [] |
||||
|
||||
interface RemixUIGridViewProps { |
||||
plugin: any |
||||
logo?: string |
||||
title?: string |
||||
enableFilter?: boolean |
||||
tagList?: [string, string][] // max 8, others will be ignored
|
||||
showUntagged?: boolean |
||||
showPin?: boolean |
||||
classList?: string |
||||
styleList?: any |
||||
description?: string |
||||
children?: ReactNode |
||||
} |
||||
|
||||
export const RemixUIGridView = (props: RemixUIGridViewProps) => { |
||||
const [keyValueMap, setKeyValueMap] = useState<Record<string, { enabled: boolean; color: string; }>>({}); |
||||
|
||||
const showUntagged = props.showUntagged || false |
||||
const showPin = props.showPin || false |
||||
const updateValue = (key: string, enabled: boolean, color?: string) => { |
||||
if (!color || color === '') color = setKeyValueMap[key].color |
||||
setKeyValueMap((prevMap) => ({ |
||||
...prevMap, |
||||
[key]: {color, enabled}, |
||||
})) |
||||
} |
||||
|
||||
const addValue = (key: string, enabled: boolean, color: string) => { |
||||
// Check if the key already exists, if so, do not add
|
||||
if (key in keyValueMap) { |
||||
return |
||||
} |
||||
|
||||
// Add the new key-value pair
|
||||
setKeyValueMap((prevMap) => ({ |
||||
...prevMap, |
||||
[key]: { enabled, color }, |
||||
})) |
||||
} |
||||
|
||||
const {plugin} = props.plugin |
||||
const searchInputRef = useRef(null) |
||||
|
||||
const [state, setState] = useState<{ |
||||
themeQuality: {filter: string; name: string} |
||||
}>({ |
||||
themeQuality: themes.light |
||||
}) |
||||
|
||||
// Initialize filters context with data from props
|
||||
useEffect(() => { |
||||
if (props.tagList && Array.isArray(props.tagList)) { |
||||
const initialKeyValueMap: Record<string, { enabled: boolean; color: string; }> = {}; |
||||
|
||||
// Limit to first 8 elements, ignoring the rest
|
||||
for (let i = 0; i < props.tagList.length; i++) { |
||||
const [key, color] = props.tagList[i] |
||||
initialKeyValueMap[key] = { enabled: true, color }
|
||||
} |
||||
if (showUntagged) initialKeyValueMap['no tag'] = { enabled: true, color: 'primary' }
|
||||
setKeyValueMap(initialKeyValueMap) |
||||
} |
||||
}, []) |
||||
|
||||
useEffect(() => { |
||||
plugin?.call('theme', 'currentTheme').then((theme) => { |
||||
// update theme quality. To be used for for images
|
||||
setState((prevState) => { |
||||
return { |
||||
...prevState, |
||||
themeQuality: theme.quality === 'dark' ? themes.dark : themes.light |
||||
} |
||||
}) |
||||
}) |
||||
plugin?.on('theme', 'themeChanged', (theme) => { |
||||
// update theme quality. To be used for for images
|
||||
setState((prevState) => { |
||||
return { |
||||
...prevState, |
||||
themeQuality: theme.quality === 'dark' ? themes.dark : themes.light |
||||
} |
||||
}) |
||||
}) |
||||
}, [plugin]) |
||||
|
||||
return ( |
||||
<FiltersContext.Provider value={{ showUntagged, showPin, keyValueMap, updateValue, addValue }}> |
||||
<div className={"d-flex flex-column bg-dark w-100 h-100 remixui_grid_view_container " + props.classList || ''} data-id="remixUIGV"> |
||||
<ThemeContext.Provider value={state.themeQuality}> |
||||
<div className="d-flex flex-column w-100 remixui_grid_view"> |
||||
<div className='d-flex p-4 bg-light flex-column remixui_grid_view_titlebar'> |
||||
<div className='d-flex flex-row align-items-center mb-2'> |
||||
{ props.logo && <img className='remixui_grid_view_logo mr-2' src={props.logo} /> } |
||||
{ props.title && <h3 className='mb-0'>{ props.title }</h3> } |
||||
</div> |
||||
{ props.description && <div className='pb-3 remixui_grid_view_title'>{ props.description }</div> } |
||||
{ props.enableFilter && <div className='d-flex flex-row'> |
||||
<div className="d-flex flex-row pr-2 pb-1 align-items-center justify-content-between"> |
||||
<div className='d-flex' id="GVFilter"> |
||||
<button |
||||
className="remixui_grid_view_btn text-secondary form-control bg-light border d-flex align-items-center p-2 justify-content-center fas fa-filter bg-light" |
||||
onClick={(e) => { |
||||
_paq.push(['trackEvent', 'GridView' + props.title ? props.title : '', 'filter', searchInputRef.current.value]) |
||||
//setstate
|
||||
}} |
||||
></button> |
||||
<input |
||||
ref={searchInputRef} |
||||
type="text" |
||||
style={{minWidth: '100px'}} |
||||
className="border form-control border-right-0 mr-4" |
||||
id="GVFilterInput" |
||||
placeholder={"Filter the list"} |
||||
data-id="RemixGVFilterInput" |
||||
/> |
||||
</div> |
||||
<div className='d-flex flex-row'> |
||||
{ Object.keys(keyValueMap).map((key) => ( |
||||
<CustomCheckbox label={key} /> |
||||
)) } |
||||
</div> |
||||
</div> |
||||
</div> } |
||||
</div> |
||||
{ props.children } |
||||
</div> |
||||
</ThemeContext.Provider> |
||||
</div> |
||||
</FiltersContext.Provider> |
||||
) |
||||
} |
||||
|
||||
export default RemixUIGridView |
@ -0,0 +1,16 @@ |
||||
import React from 'react' // eslint-disable-line
|
||||
|
||||
export const themes = { |
||||
light: { |
||||
filter: 'invert(0)', |
||||
name: 'light' |
||||
}, |
||||
dark: { |
||||
filter: 'invert(1)', |
||||
name: 'dark' |
||||
} |
||||
} |
||||
|
||||
export const ThemeContext = React.createContext( |
||||
themes.dark // default value
|
||||
) |
@ -0,0 +1,82 @@ |
||||
// eslint-disable-next-line no-use-before-define
|
||||
import {CustomTooltip} from '@remix-ui/helper' |
||||
import React, { useEffect, useRef, useState } from 'react' |
||||
import {FormattedMessage} from 'react-intl' |
||||
import {GasPriceProps} from '../types' |
||||
|
||||
const defaultGasLimit = 3000000 |
||||
export function GasLimitUI(props: GasPriceProps) { |
||||
const inputComponent = useRef<HTMLInputElement>(null) |
||||
const currentGasLimit = useRef(defaultGasLimit) |
||||
const [gasLimitAuto, setGasLimitAuto] = useState(true) |
||||
|
||||
useEffect(() => { |
||||
handleGasLimitAuto() |
||||
}, []) |
||||
|
||||
useEffect(() => { |
||||
handleGasLimitAuto() |
||||
}, [gasLimitAuto]) |
||||
|
||||
const handleGasLimit = (e) => { |
||||
props.setGasFee(e.target.value) |
||||
} |
||||
|
||||
const handleGasLimitAuto = () => { |
||||
if (gasLimitAuto) { |
||||
currentGasLimit.current = parseInt(inputComponent.current.value) |
||||
props.setGasFee(0) |
||||
} else { |
||||
props.setGasFee(currentGasLimit.current) |
||||
}
|
||||
} |
||||
|
||||
return ( |
||||
<div className="udapp_crow"> |
||||
<label className="udapp_settingsLabel"> |
||||
<FormattedMessage id="udapp.gasLimit" /> |
||||
</label> |
||||
<div className='pl-0 custom-control custom-checkbox udapp_col2 udapp_gasNval'> |
||||
<div className="d-flex pb-1 custom-control custom-radio"> |
||||
<input |
||||
className="custom-control-input" |
||||
type="radio" |
||||
name="gasLimitRadio" |
||||
value="auto" |
||||
onChange={() => setGasLimitAuto(!gasLimitAuto)} |
||||
checked={gasLimitAuto} |
||||
id="glAutoConfig" |
||||
/> |
||||
<label className="form-check-label custom-control-label" htmlFor="glAutoConfig" data-id="glAutoConfiguration"> |
||||
<FormattedMessage id="udapp.gasLimitAuto" /> |
||||
</label> |
||||
</div> |
||||
<div className="d-flex pb-1 custom-control custom-radio"> |
||||
<input |
||||
className="custom-control-input" |
||||
type="radio" |
||||
name="gasLimitRadio" |
||||
value="manual" |
||||
onChange={() => setGasLimitAuto(!gasLimitAuto)} |
||||
checked={!gasLimitAuto} |
||||
id="glManualConfig" |
||||
/> |
||||
<label className="mb-1 w-100 form-check-label custom-control-label" htmlFor="glManualConfig" data-id="glManualConfiguration"> |
||||
<FormattedMessage id="udapp.gasLimitManual" /> |
||||
<CustomTooltip placement={'right'} tooltipClasses="text-nowrap" tooltipId="remixGasPriceTooltip" tooltipText={<FormattedMessage id="udapp.tooltipText4" />}> |
||||
<input |
||||
type="number" |
||||
ref={inputComponent} |
||||
disabled={gasLimitAuto} |
||||
className="mt-2 form-control" |
||||
id="gasLimit" |
||||
value={props.gasLimit === 0 ? currentGasLimit.current : props.gasLimit} |
||||
onChange={handleGasLimit} |
||||
/> |
||||
</CustomTooltip> |
||||
</label> |
||||
</div> |
||||
</div> |
||||
</div>
|
||||
) |
||||
} |
@ -1,22 +0,0 @@ |
||||
// eslint-disable-next-line no-use-before-define
|
||||
import {CustomTooltip} from '@remix-ui/helper' |
||||
import React from 'react' |
||||
import {FormattedMessage} from 'react-intl' |
||||
import {GasPriceProps} from '../types' |
||||
|
||||
export function GasPriceUI(props: GasPriceProps) { |
||||
const handleGasLimit = (e) => { |
||||
props.setGasFee(e.target.value) |
||||
} |
||||
|
||||
return ( |
||||
<div className="udapp_crow"> |
||||
<label className="udapp_settingsLabel"> |
||||
<FormattedMessage id="udapp.gasLimit" /> |
||||
</label> |
||||
<CustomTooltip placement={'right'} tooltipClasses="text-nowrap" tooltipId="remixGasPriceTooltip" tooltipText={<FormattedMessage id="udapp.tooltipText4" />}> |
||||
<input type="number" className="form-control udapp_gasNval udapp_col2" id="gasLimit" value={props.gasLimit} onChange={handleGasLimit} /> |
||||
</CustomTooltip> |
||||
</div> |
||||
) |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue