mirror of
https://github.com/arduino/arduino-ide.git
synced 2025-12-14 19:17:18 +00:00
Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
96e5eae492 | ||
|
|
1fa0fd31c8 | ||
|
|
086f4b825a | ||
|
|
cff91e4215 | ||
|
|
8a83878785 | ||
|
|
46aba1385b | ||
|
|
aa7c6d6976 | ||
|
|
4e684e25fe | ||
|
|
7c9ad70a56 | ||
|
|
4d6cfad0ff | ||
|
|
11b2460199 | ||
|
|
93d27ea72a | ||
|
|
155f0aebaf | ||
|
|
3d8f3fa3e3 | ||
|
|
c1e5fbc8a5 | ||
|
|
ee4f74d566 | ||
|
|
0f9f0d07b7 | ||
|
|
2f0414a5a1 | ||
|
|
e3319dab1a | ||
|
|
a669a43449 | ||
|
|
56ab874177 | ||
|
|
e36f393682 | ||
|
|
4d52bb2843 | ||
|
|
39c8db8e90 |
16
.github/workflows/build.yml
vendored
16
.github/workflows/build.yml
vendored
@@ -103,7 +103,7 @@ env:
|
||||
name: Linux_X86-64_app_image
|
||||
- config:
|
||||
name: macOS x86
|
||||
runs-on: macos-13
|
||||
runs-on: macos-15-intel
|
||||
container: |
|
||||
null
|
||||
# APPLE_SIGNING_CERTIFICATE_P12 secret was produced by following the procedure from:
|
||||
@@ -317,7 +317,7 @@ jobs:
|
||||
if not exist "${{ matrix.config.working-directory }}" mklink /d "${{ matrix.config.working-directory }}" "C:\actions-runner\_work\arduino-ide\arduino-ide"
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
|
||||
- name: Install Node.js
|
||||
@@ -441,10 +441,10 @@ jobs:
|
||||
echo "CHANNEL_FILES_PATH=${{ runner.temp }}/channel-files" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Download staged-for-merge channel file artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
merge-multiple: true
|
||||
path: ${{ env.CHANNEL_FILES_PATH }}
|
||||
@@ -513,7 +513,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Download job transfer artifact that contains ${{ matrix.artifact.name }} tester build
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}${{ matrix.artifact.job-transfer-artifact-suffix }}
|
||||
path: ${{ env.BUILD_ARTIFACTS_FOLDER }}
|
||||
@@ -533,7 +533,7 @@ jobs:
|
||||
BODY: ${{ steps.changelog.outputs.BODY }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0 # To fetch all history for all branches and tags.
|
||||
|
||||
@@ -600,7 +600,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Download all job transfer artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
merge-multiple: true
|
||||
path: ${{ env.ARTIFACTS_FOLDER }}
|
||||
@@ -643,7 +643,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Download all job transfer artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
merge-multiple: true
|
||||
path: ${{ env.ARTIFACTS_FOLDER }}
|
||||
|
||||
2
.github/workflows/check-containers.yml
vendored
2
.github/workflows/check-containers.yml
vendored
@@ -40,7 +40,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Build and push to local registry
|
||||
uses: docker/build-push-action@v6
|
||||
|
||||
2
.github/workflows/check-i18n-task.yml
vendored
2
.github/workflows/check-i18n-task.yml
vendored
@@ -56,7 +56,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Install Node.js 18.17
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
2
.github/workflows/check-javascript.yml
vendored
2
.github/workflows/check-javascript.yml
vendored
@@ -65,7 +65,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
2
.github/workflows/check-yarn.yml
vendored
2
.github/workflows/check-yarn.yml
vendored
@@ -64,7 +64,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
8
.github/workflows/compose-full-changelog.yml
vendored
8
.github/workflows/compose-full-changelog.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Install Node.js
|
||||
uses: actions/setup-node@v4
|
||||
@@ -29,6 +29,12 @@ jobs:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
||||
- name: Install Dependencies (Linux only)
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev
|
||||
|
||||
- name: Get Tag
|
||||
id: tag_name
|
||||
run: |
|
||||
|
||||
2
.github/workflows/i18n-nightly-push.yml
vendored
2
.github/workflows/i18n-nightly-push.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Install Node.js 18.17
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
2
.github/workflows/i18n-weekly-pull.yml
vendored
2
.github/workflows/i18n-weekly-pull.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Install Node.js 18.17
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
2
.github/workflows/push-container-images.yml
vendored
2
.github/workflows/push-container-images.yml
vendored
@@ -43,7 +43,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@v3
|
||||
|
||||
6
.github/workflows/sync-labels.yml
vendored
6
.github/workflows/sync-labels.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Download JSON schema for labels configuration file
|
||||
id: download-schema
|
||||
@@ -106,10 +106,10 @@ jobs:
|
||||
echo "flag=--dry-run" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Download configuration file artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
merge-multiple: true
|
||||
pattern: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}*
|
||||
|
||||
2
.github/workflows/test-javascript.yml
vendored
2
.github/workflows/test-javascript.yml
vendored
@@ -82,7 +82,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
2
.github/workflows/themes-weekly-pull.yml
vendored
2
.github/workflows/themes-weekly-pull.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Install Node.js
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
@@ -46,9 +46,9 @@ See [**the contributor guide**](docs/CONTRIBUTING.md#contributor-guide) for more
|
||||
|
||||
See the [**development guide**](docs/development.md) for a technical overview of the application and instructions for building the code.
|
||||
|
||||
## Donations
|
||||
### Support the project
|
||||
|
||||
This open source code was written by the Arduino team and is maintained on a daily basis with the help of the community. We invest a considerable amount of time in development, testing and optimization. Please consider [donating](https://www.arduino.cc/en/donate/) or [sponsoring](https://github.com/sponsors/arduino) to support our work, as well as [buying original Arduino boards](https://store.arduino.cc/) which is the best way to make sure our effort can continue in the long term.
|
||||
This open source code was written by the Arduino team and is maintained on a daily basis with the help of the community. We invest a considerable amount of time in development, testing and optimization. Please consider [buying original Arduino boards](https://store.arduino.cc/) to support our work on the project.
|
||||
|
||||
## License
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "arduino-ide-extension",
|
||||
"version": "2.3.5",
|
||||
"version": "2.3.7",
|
||||
"description": "An extension for Theia building the Arduino IDE",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"scripts": {
|
||||
@@ -67,7 +67,6 @@
|
||||
"cross-fetch": "^3.1.5",
|
||||
"dateformat": "^3.0.3",
|
||||
"deepmerge": "^4.2.2",
|
||||
"dompurify": "^2.4.7",
|
||||
"drivelist": "^9.2.4",
|
||||
"electron-updater": "^4.6.5",
|
||||
"fast-deep-equal": "^3.1.3",
|
||||
@@ -172,7 +171,7 @@
|
||||
],
|
||||
"arduino": {
|
||||
"arduino-cli": {
|
||||
"version": "1.2.0"
|
||||
"version": "1.3.1"
|
||||
},
|
||||
"arduino-fwuploader": {
|
||||
"version": "2.4.1"
|
||||
|
||||
@@ -368,10 +368,6 @@ import { DebugConfigurationWidget } from './theia/debug/debug-configuration-widg
|
||||
import { DebugConfigurationWidget as TheiaDebugConfigurationWidget } from '@theia/debug/lib/browser/view/debug-configuration-widget';
|
||||
import { DebugToolBar } from '@theia/debug/lib/browser/view/debug-toolbar-widget';
|
||||
|
||||
import {
|
||||
VersionWelcomeDialog,
|
||||
VersionWelcomeDialogProps,
|
||||
} from './dialogs/version-welcome-dialog';
|
||||
import { TestViewContribution as TheiaTestViewContribution } from '@theia/test/lib/browser/view/test-view-contribution';
|
||||
import { TestViewContribution } from './theia/test/test-view-contribution';
|
||||
|
||||
@@ -987,11 +983,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
||||
title: 'IDEUpdater',
|
||||
});
|
||||
|
||||
bind(VersionWelcomeDialog).toSelf().inSingletonScope();
|
||||
bind(VersionWelcomeDialogProps).toConstantValue({
|
||||
title: 'VersionWelcomeDialog',
|
||||
});
|
||||
|
||||
bind(UserFieldsDialog).toSelf().inSingletonScope();
|
||||
bind(UserFieldsDialogProps).toConstantValue({
|
||||
title: 'UserFields',
|
||||
|
||||
@@ -8,7 +8,6 @@ import {
|
||||
} from '../../common/protocol/ide-updater';
|
||||
import { IDEUpdaterDialog } from '../dialogs/ide-updater/ide-updater-dialog';
|
||||
import { Contribution } from './contribution';
|
||||
import { VersionWelcomeDialog } from '../dialogs/version-welcome-dialog';
|
||||
import { AppService } from '../app-service';
|
||||
import { SemVer } from 'semver';
|
||||
|
||||
@@ -20,9 +19,6 @@ export class CheckForIDEUpdates extends Contribution {
|
||||
@inject(IDEUpdaterDialog)
|
||||
private readonly updaterDialog: IDEUpdaterDialog;
|
||||
|
||||
@inject(VersionWelcomeDialog)
|
||||
private readonly versionWelcomeDialog: VersionWelcomeDialog;
|
||||
|
||||
@inject(LocalStorageService)
|
||||
private readonly localStorage: LocalStorageService;
|
||||
|
||||
@@ -59,13 +55,8 @@ export class CheckForIDEUpdates extends Contribution {
|
||||
return this.updater.checkForUpdates(true);
|
||||
})
|
||||
.then(async (updateInfo) => {
|
||||
if (!updateInfo) {
|
||||
const isNewVersion = await this.isNewStableVersion();
|
||||
if (isNewVersion) {
|
||||
this.versionWelcomeDialog.open();
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!updateInfo) return;
|
||||
|
||||
const versionToSkip = await this.localStorage.getData<string>(
|
||||
SKIP_IDE_VERSION
|
||||
);
|
||||
@@ -86,6 +77,11 @@ export class CheckForIDEUpdates extends Contribution {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* This value is set in localStorage but currently not used.
|
||||
* We keep this logic running anyway for eventual future needs
|
||||
* (eg. show a new version welcome dialog)
|
||||
*/
|
||||
private async setCurrentIDEVersion(): Promise<void> {
|
||||
try {
|
||||
const { appVersion } = await this.appService.info();
|
||||
@@ -95,29 +91,4 @@ export class CheckForIDEUpdates extends Contribution {
|
||||
// ignore invalid versions
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if user is running a new IDE version for the first time.
|
||||
* @returns true if the current IDE version is greater than the last used version
|
||||
* and both are non-prerelease versions.
|
||||
*/
|
||||
private async isNewStableVersion(): Promise<boolean> {
|
||||
try {
|
||||
const { appVersion } = await this.appService.info();
|
||||
const prevVersion = await this.localStorage.getData<string>(
|
||||
LAST_USED_IDE_VERSION
|
||||
);
|
||||
|
||||
const prevSemVer = new SemVer(prevVersion ?? '');
|
||||
const currSemVer = new SemVer(appVersion ?? '');
|
||||
|
||||
if (prevSemVer.prerelease.length || currSemVer.prerelease.length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return currSemVer.compare(prevSemVer) === 1;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,7 +61,6 @@ export class FirstStartupInstaller extends Contribution {
|
||||
try {
|
||||
await this.libraryService.install({
|
||||
item: builtInLibrary,
|
||||
installDependencies: true,
|
||||
noOverwrite: true, // We don't want to automatically replace custom libraries the user might already have in place
|
||||
installLocation: LibraryLocation.BUILTIN,
|
||||
});
|
||||
|
||||
@@ -17,7 +17,6 @@ import {
|
||||
} from '../../../common/protocol/ide-updater';
|
||||
import { LocalStorageService } from '@theia/core/lib/browser';
|
||||
import { WindowService } from '@theia/core/lib/browser/window/window-service';
|
||||
import { sanitize } from 'dompurify';
|
||||
|
||||
@injectable()
|
||||
export class IDEUpdaterDialogProps extends DialogProps {}
|
||||
@@ -166,51 +165,6 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> {
|
||||
goToDownloadPageButton.focus();
|
||||
}
|
||||
|
||||
private appendDonateFooter() {
|
||||
const footer = document.createElement('div');
|
||||
footer.classList.add('ide-updater-dialog--footer');
|
||||
const footerContent = document.createElement('div');
|
||||
footerContent.classList.add('ide-updater-dialog--footer-content');
|
||||
footer.appendChild(footerContent);
|
||||
|
||||
const footerLink = document.createElement('a');
|
||||
footerLink.innerText = sanitize(
|
||||
nls.localize('arduino/ide-updater/donateLinkText', 'donate to support us')
|
||||
);
|
||||
footerLink.classList.add('ide-updater-dialog--footer-link');
|
||||
footerLink.onclick = () =>
|
||||
this.openExternal('https://www.arduino.cc/en/donate');
|
||||
|
||||
const footerLinkIcon = document.createElement('span');
|
||||
footerLinkIcon.title = nls.localize(
|
||||
'arduino/ide-updater/donateLinkIconTitle',
|
||||
'open donation page'
|
||||
);
|
||||
footerLinkIcon.classList.add('ide-updater-dialog--footer-link-icon');
|
||||
footerLink.appendChild(footerLinkIcon);
|
||||
|
||||
const placeholderKey = '%%link%%';
|
||||
const footerText = sanitize(
|
||||
nls.localize(
|
||||
'arduino/ide-updater/donateText',
|
||||
'Open source is love, {0}',
|
||||
placeholderKey
|
||||
)
|
||||
);
|
||||
const placeholder = footerText.indexOf(placeholderKey);
|
||||
if (placeholder !== -1) {
|
||||
const parts = footerText.split(placeholderKey);
|
||||
footerContent.appendChild(document.createTextNode(parts[0]));
|
||||
footerContent.appendChild(footerLink);
|
||||
footerContent.appendChild(document.createTextNode(parts[1]));
|
||||
} else {
|
||||
footerContent.appendChild(document.createTextNode(footerText));
|
||||
footerContent.appendChild(footerLink);
|
||||
}
|
||||
|
||||
this.controlPanel.insertAdjacentElement('afterend', footer);
|
||||
}
|
||||
|
||||
private openDownloadPage(): void {
|
||||
this.openExternal('https://www.arduino.cc/en/software');
|
||||
this.close();
|
||||
@@ -233,7 +187,6 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> {
|
||||
downloadStarted: true,
|
||||
});
|
||||
this.clearButtons();
|
||||
this.appendDonateFooter();
|
||||
this.updater.downloadUpdate();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
import React from '@theia/core/shared/react';
|
||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||
import { Message } from '@theia/core/shared/@phosphor/messaging';
|
||||
import { ReactDialog } from '../theia/dialogs/dialogs';
|
||||
import { nls } from '@theia/core';
|
||||
import { DialogProps } from '@theia/core/lib/browser';
|
||||
import { WindowService } from '@theia/core/lib/browser/window/window-service';
|
||||
import { AppService } from '../app-service';
|
||||
import { sanitize } from 'dompurify';
|
||||
|
||||
@injectable()
|
||||
export class VersionWelcomeDialogProps extends DialogProps {}
|
||||
|
||||
@injectable()
|
||||
export class VersionWelcomeDialog extends ReactDialog<void> {
|
||||
@inject(AppService)
|
||||
private readonly appService: AppService;
|
||||
|
||||
@inject(WindowService)
|
||||
private readonly windowService: WindowService;
|
||||
|
||||
constructor(
|
||||
@inject(VersionWelcomeDialogProps)
|
||||
protected override readonly props: VersionWelcomeDialogProps
|
||||
) {
|
||||
super({
|
||||
title: nls.localize(
|
||||
'arduino/versionWelcome/title',
|
||||
'Welcome to a new version of the Arduino IDE!'
|
||||
),
|
||||
});
|
||||
this.node.id = 'version-welcome-dialog-container';
|
||||
this.contentNode.classList.add('version-welcome-dialog');
|
||||
}
|
||||
|
||||
protected render(): React.ReactNode {
|
||||
return (
|
||||
<div>
|
||||
<p>
|
||||
{nls.localize(
|
||||
'arduino/versionWelcome/donateMessage',
|
||||
'Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.'
|
||||
)}
|
||||
</p>
|
||||
<p className="bold">
|
||||
{nls.localize(
|
||||
'arduino/versionWelcome/donateMessage2',
|
||||
'Please consider supporting our work on the free open source Arduino IDE.'
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
override get value(): void {
|
||||
return;
|
||||
}
|
||||
|
||||
private appendButtons(): void {
|
||||
const cancelButton = this.createButton(
|
||||
nls.localize('arduino/versionWelcome/cancelButton', 'Maybe later')
|
||||
);
|
||||
cancelButton.classList.add('secondary');
|
||||
cancelButton.classList.add('cancel-button');
|
||||
this.addAction(cancelButton, this.close.bind(this), 'click');
|
||||
this.controlPanel.appendChild(cancelButton);
|
||||
|
||||
const donateButton = this.createButton(
|
||||
nls.localize('arduino/versionWelcome/donateButton', 'Donate now')
|
||||
);
|
||||
this.addAction(donateButton, this.onDonateButtonClick.bind(this), 'click');
|
||||
this.controlPanel.appendChild(donateButton);
|
||||
donateButton.focus();
|
||||
}
|
||||
|
||||
private onDonateButtonClick(): void {
|
||||
this.openDonationPage();
|
||||
this.close();
|
||||
}
|
||||
|
||||
private readonly openDonationPage = () => {
|
||||
const url = 'https://www.arduino.cc/en/donate';
|
||||
this.windowService.openNewWindow(url, { external: true });
|
||||
};
|
||||
|
||||
private async updateTitleVersion(): Promise<void> {
|
||||
const appInfo = await this.appService.info();
|
||||
const { appVersion } = appInfo;
|
||||
|
||||
if (appVersion) {
|
||||
this.titleNode.innerText = sanitize(
|
||||
nls.localize(
|
||||
'arduino/versionWelcome/titleWithVersion',
|
||||
'Welcome to the new Arduino IDE {0}!',
|
||||
appVersion
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
protected override onAfterAttach(msg: Message): void {
|
||||
this.update();
|
||||
this.appendButtons();
|
||||
this.updateTitleVersion();
|
||||
super.onAfterAttach(msg);
|
||||
}
|
||||
}
|
||||
@@ -167,23 +167,21 @@ export class LibraryListWidget extends ListWidget<
|
||||
installDependencies = false;
|
||||
}
|
||||
|
||||
if (typeof installDependencies === 'boolean') {
|
||||
await this.service.install({
|
||||
item,
|
||||
version,
|
||||
progressId,
|
||||
installDependencies,
|
||||
});
|
||||
this.messageService.info(
|
||||
nls.localize(
|
||||
'arduino/library/installedSuccessfully',
|
||||
'Successfully installed library {0}:{1}',
|
||||
item.name,
|
||||
version
|
||||
),
|
||||
{ timeout: 3000 }
|
||||
);
|
||||
}
|
||||
await this.service.install({
|
||||
item,
|
||||
version,
|
||||
progressId,
|
||||
noDeps: !installDependencies,
|
||||
});
|
||||
this.messageService.info(
|
||||
nls.localize(
|
||||
'arduino/library/installedSuccessfully',
|
||||
'Successfully installed library {0}:{1}',
|
||||
item.name,
|
||||
version
|
||||
),
|
||||
{ timeout: 3000 }
|
||||
);
|
||||
}
|
||||
|
||||
protected override async uninstall({
|
||||
|
||||
@@ -67,3 +67,7 @@ export function truncateLines(
|
||||
}
|
||||
return [lines, charCount];
|
||||
}
|
||||
|
||||
export function joinLines(lines: Line[]): string {
|
||||
return lines.map((line: Line) => line.message).join('');
|
||||
}
|
||||
@@ -52,6 +52,9 @@ export namespace SerialMonitor {
|
||||
},
|
||||
'vscode/output.contribution/clearOutput.label'
|
||||
);
|
||||
export const COPY_OUTPUT = {
|
||||
id: 'serial-monitor-copy-output',
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,6 +152,12 @@ export class MonitorViewContribution
|
||||
'Clear Output'
|
||||
),
|
||||
});
|
||||
registry.registerItem({
|
||||
id: SerialMonitor.Commands.COPY_OUTPUT.id,
|
||||
command: SerialMonitor.Commands.COPY_OUTPUT.id,
|
||||
icon: codicon('copy'),
|
||||
tooltip: nls.localize('arduino/serial/copyOutput', 'Copy Output'),
|
||||
});
|
||||
}
|
||||
|
||||
override registerCommands(commands: CommandRegistry): void {
|
||||
@@ -161,6 +170,15 @@ export class MonitorViewContribution
|
||||
}
|
||||
},
|
||||
});
|
||||
commands.registerCommand(SerialMonitor.Commands.COPY_OUTPUT, {
|
||||
isEnabled: (widget) => widget instanceof MonitorWidget,
|
||||
isVisible: (widget) => widget instanceof MonitorWidget,
|
||||
execute: (widget) => {
|
||||
if (widget instanceof MonitorWidget) {
|
||||
widget.copyOutput();
|
||||
}
|
||||
},
|
||||
});
|
||||
if (this.toggleCommand) {
|
||||
commands.registerCommand(this.toggleCommand, {
|
||||
execute: () => this.toggle(),
|
||||
|
||||
@@ -28,6 +28,7 @@ import {
|
||||
import { MonitorModel } from '../../monitor-model';
|
||||
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
||||
import { serialMonitorWidgetLabel } from '../../../common/nls';
|
||||
import { ClipboardService } from '@theia/core/lib/browser/clipboard-service';
|
||||
|
||||
@injectable()
|
||||
export class MonitorWidget extends ReactWidget {
|
||||
@@ -47,6 +48,7 @@ export class MonitorWidget extends ReactWidget {
|
||||
*/
|
||||
protected closing = false;
|
||||
protected readonly clearOutputEmitter = new Emitter<void>();
|
||||
protected readonly copyOutputEmitter = new Emitter<void>();
|
||||
|
||||
@inject(MonitorModel)
|
||||
private readonly monitorModel: MonitorModel;
|
||||
@@ -56,6 +58,8 @@ export class MonitorWidget extends ReactWidget {
|
||||
private readonly boardsServiceProvider: BoardsServiceProvider;
|
||||
@inject(FrontendApplicationStateService)
|
||||
private readonly appStateService: FrontendApplicationStateService;
|
||||
@inject(ClipboardService)
|
||||
private readonly clipboardService: ClipboardService;
|
||||
|
||||
private readonly toDisposeOnReset: DisposableCollection;
|
||||
|
||||
@@ -102,6 +106,10 @@ export class MonitorWidget extends ReactWidget {
|
||||
this.clearOutputEmitter.fire(undefined);
|
||||
this.update();
|
||||
}
|
||||
|
||||
copyOutput(): void {
|
||||
this.copyOutputEmitter.fire();
|
||||
}
|
||||
|
||||
override dispose(): void {
|
||||
this.toDisposeOnReset.dispose();
|
||||
@@ -247,6 +255,8 @@ export class MonitorWidget extends ReactWidget {
|
||||
monitorModel={this.monitorModel}
|
||||
monitorManagerProxy={this.monitorManagerProxy}
|
||||
clearConsoleEvent={this.clearOutputEmitter.event}
|
||||
copyOutputEvent={this.copyOutputEmitter.event}
|
||||
clipboardService={this.clipboardService}
|
||||
height={Math.floor(this.widgetHeight - 50)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -3,9 +3,10 @@ import { Event } from '@theia/core/lib/common/event';
|
||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||
import { areEqual, FixedSizeList as List } from 'react-window';
|
||||
import dateFormat from 'dateformat';
|
||||
import { messagesToLines, truncateLines } from './monitor-utils';
|
||||
import { messagesToLines, truncateLines, joinLines } from './monitor-utils';
|
||||
import { MonitorManagerProxyClient } from '../../../common/protocol';
|
||||
import { MonitorModel } from '../../monitor-model';
|
||||
import { ClipboardService } from '@theia/core/lib/browser/clipboard-service';
|
||||
|
||||
export type Line = { message: string; timestamp?: Date; lineLen: number };
|
||||
|
||||
@@ -74,6 +75,9 @@ export class SerialMonitorOutput extends React.Component<
|
||||
this.props.clearConsoleEvent(() =>
|
||||
this.setState({ lines: [], charCount: 0 })
|
||||
),
|
||||
this.props.copyOutputEvent(() =>
|
||||
this.props.clipboardService.writeText(joinLines(this.state.lines))
|
||||
),
|
||||
this.props.monitorModel.onChange(({ property }) => {
|
||||
if (property === 'timestamp') {
|
||||
const { timestamp } = this.props.monitorModel;
|
||||
@@ -130,6 +134,8 @@ export namespace SerialMonitorOutput {
|
||||
readonly monitorModel: MonitorModel;
|
||||
readonly monitorManagerProxy: MonitorManagerProxyClient;
|
||||
readonly clearConsoleEvent: Event<void>;
|
||||
readonly copyOutputEvent: Event<void>;
|
||||
readonly clipboardService: ClipboardService;
|
||||
readonly height: number;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,37 +34,6 @@
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.ide-updater-dialog--footer {
|
||||
display: inline-block;
|
||||
margin-top: -16px;
|
||||
padding: 12px 0 24px 0;
|
||||
border-top: 1px solid var(--theia-editorWidget-border);
|
||||
}
|
||||
.ide-updater-dialog--footer-content {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.ide-updater-dialog--footer-link {
|
||||
display: inline-block;
|
||||
color: var(--theia-textLink-foreground);
|
||||
font-weight: 500;
|
||||
line-height: 13px;
|
||||
}
|
||||
.ide-updater-dialog--footer-link:hover {
|
||||
color: var(--theia-textLink-foreground);
|
||||
cursor: pointer;
|
||||
}
|
||||
.ide-updater-dialog--footer-link-icon {
|
||||
display: inline-block;
|
||||
-webkit-mask: url(../icons/link-open-icon.svg) center no-repeat;
|
||||
background-color: var(--theia-textLink-foreground);
|
||||
height: 12px;
|
||||
width: 12px;
|
||||
cursor: pointer;
|
||||
transform: translateY(2px);
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
.ide-updater-dialog .changelog {
|
||||
color: var(--theia-editor-foreground);
|
||||
background-color: var(--theia-editor-background);
|
||||
@@ -140,7 +109,6 @@
|
||||
max-height: 100%;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
padding-bottom: 20px !important;
|
||||
}
|
||||
|
||||
#ide-updater-dialog-container .skip-version-button {
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
@import "./settings-dialog.css";
|
||||
@import "./firmware-uploader-dialog.css";
|
||||
@import "./ide-updater-dialog.css";
|
||||
@import "./version-welcome-dialog.css";
|
||||
@import "./certificate-uploader-dialog.css";
|
||||
@import "./user-fields-dialog.css";
|
||||
@import "./debug.css";
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
#version-welcome-dialog-container > .dialogBlock {
|
||||
width: 546px;
|
||||
|
||||
.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,8 @@ import { MessageService } from '@theia/core/lib/common/message-service';
|
||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||
import { ApplicationConnectionStatusContribution } from './connection-status-service';
|
||||
import { ToolbarAwareTabBar } from './tab-bars';
|
||||
import { find } from '@theia/core/shared/@phosphor/algorithm';
|
||||
import { OutputWidget } from '@theia/output/lib/browser/output-widget';
|
||||
|
||||
@injectable()
|
||||
export class ApplicationShell extends TheiaApplicationShell {
|
||||
@@ -48,6 +50,38 @@ export class ApplicationShell extends TheiaApplicationShell {
|
||||
return super.addWidget(widget, { ...options, ref });
|
||||
}
|
||||
|
||||
override doRevealWidget(id: string): Widget | undefined {
|
||||
let widget = find(this.mainPanel.widgets(), (w) => w.id === id);
|
||||
if (!widget) {
|
||||
widget = find(this.bottomPanel.widgets(), (w) => w.id === id);
|
||||
if (widget) {
|
||||
this.expandBottomPanel();
|
||||
}
|
||||
}
|
||||
if (widget) {
|
||||
const tabBar = this.getTabBarFor(widget);
|
||||
if (tabBar) {
|
||||
tabBar.currentTitle = widget.title;
|
||||
}
|
||||
}
|
||||
if (!widget) {
|
||||
widget = this.leftPanelHandler.expand(id);
|
||||
}
|
||||
if (!widget) {
|
||||
widget = this.rightPanelHandler.expand(id);
|
||||
}
|
||||
if (widget) {
|
||||
// Prevent focusing the output widget when is updated
|
||||
// See https://github.com/arduino/arduino-ide/issues/2679
|
||||
if (!(widget instanceof OutputWidget)) {
|
||||
this.windowService.focus();
|
||||
}
|
||||
return widget;
|
||||
} else {
|
||||
return this.secondaryWindowHandler.revealWidget(id);
|
||||
}
|
||||
}
|
||||
|
||||
override handleEvent(): boolean {
|
||||
// NOOP, dragging has been disabled
|
||||
return false;
|
||||
|
||||
@@ -4,6 +4,7 @@ import { nls } from '@theia/core/lib/common/nls';
|
||||
export const Unknown = nls.localize('arduino/common/unknown', 'Unknown');
|
||||
export const Later = nls.localize('arduino/common/later', 'Later');
|
||||
export const Updatable = nls.localize('arduino/common/updateable', 'Updatable');
|
||||
export const Installed = nls.localize('arduino/common/installed', 'Installed');
|
||||
export const All = nls.localize('arduino/common/all', 'All');
|
||||
export const Type = nls.localize('arduino/common/type', 'Type');
|
||||
export const Partner = nls.localize('arduino/common/partner', 'Partner');
|
||||
|
||||
@@ -8,6 +8,7 @@ import {
|
||||
Partner,
|
||||
Type as TypeLabel,
|
||||
Updatable,
|
||||
Installed
|
||||
} from '../nls';
|
||||
import type { Defined } from '../types';
|
||||
import { naturalCompare } from './../utils';
|
||||
@@ -113,6 +114,7 @@ export namespace BoardSearch {
|
||||
export const TypeLiterals = [
|
||||
'All',
|
||||
'Updatable',
|
||||
'Installed',
|
||||
'Arduino',
|
||||
'Contributed',
|
||||
'Arduino Certified',
|
||||
@@ -128,6 +130,7 @@ export namespace BoardSearch {
|
||||
export const TypeLabels: Record<Type, string> = {
|
||||
All: All,
|
||||
Updatable: Updatable,
|
||||
Installed: Installed,
|
||||
Arduino: 'Arduino',
|
||||
Contributed: Contributed,
|
||||
'Arduino Certified': nls.localize(
|
||||
|
||||
@@ -27,7 +27,7 @@ export interface LibraryService
|
||||
item: LibraryPackage;
|
||||
progressId?: string;
|
||||
version?: Installable.Version;
|
||||
installDependencies?: boolean;
|
||||
noDeps?: boolean;
|
||||
noOverwrite?: boolean;
|
||||
installLocation?: LibraryLocation.BUILTIN | LibraryLocation.USER;
|
||||
}): Promise<void>;
|
||||
|
||||
@@ -38,3 +38,26 @@ export function uint8ArrayToString(uint8Array: Uint8Array): string {
|
||||
export function stringToUint8Array(text: string): Uint8Array {
|
||||
return Uint8Array.from(text, (char) => char.charCodeAt(0));
|
||||
}
|
||||
|
||||
export function poolWhile(
|
||||
whileCondition: () => boolean,
|
||||
intervalMs: number,
|
||||
timeoutMs: number
|
||||
): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!whileCondition) {
|
||||
resolve();
|
||||
}
|
||||
|
||||
const start = Date.now();
|
||||
const interval = setInterval(() => {
|
||||
if (!whileCondition()) {
|
||||
clearInterval(interval);
|
||||
resolve();
|
||||
} else if (Date.now() - start > timeoutMs) {
|
||||
clearInterval(interval);
|
||||
reject(new Error('Timed out while polling.'));
|
||||
}
|
||||
}, intervalMs);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { ConnectionHandler } from '@theia/core/lib/common/messaging/handler';
|
||||
import { JsonRpcConnectionHandler } from '@theia/core/lib/common/messaging/proxy-factory';
|
||||
import { ElectronConnectionHandler } from '@theia/core/lib/electron-main/messaging/electron-connection-handler';
|
||||
import { RpcConnectionHandler } from '@theia/core/lib/common/messaging/proxy-factory';
|
||||
import { ElectronMainWindowService } from '@theia/core/lib/electron-common/electron-main-window-service';
|
||||
import { TheiaMainApi } from '@theia/core/lib/electron-main/electron-api-main';
|
||||
import {
|
||||
@@ -33,18 +33,15 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
||||
bind(IDEUpdaterImpl).toSelf().inSingletonScope();
|
||||
bind(IDEUpdater).toService(IDEUpdaterImpl);
|
||||
bind(ElectronMainApplicationContribution).toService(IDEUpdater);
|
||||
bind(ConnectionHandler)
|
||||
bind(ElectronConnectionHandler)
|
||||
.toDynamicValue(
|
||||
(context) =>
|
||||
new JsonRpcConnectionHandler<IDEUpdaterClient>(
|
||||
IDEUpdaterPath,
|
||||
(client) => {
|
||||
const server = context.container.get<IDEUpdater>(IDEUpdater);
|
||||
server.setClient(client);
|
||||
client.onDidCloseConnection(() => server.disconnectClient(client));
|
||||
return server;
|
||||
}
|
||||
)
|
||||
new RpcConnectionHandler<IDEUpdaterClient>(IDEUpdaterPath, (client) => {
|
||||
const server = context.container.get<IDEUpdater>(IDEUpdater);
|
||||
server.setClient(client);
|
||||
client.onDidCloseConnection(() => server.disconnectClient(client));
|
||||
return server;
|
||||
})
|
||||
)
|
||||
.inSingletonScope();
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ import type { AddressInfo } from 'node:net';
|
||||
import { isAbsolute, join, resolve } from 'node:path';
|
||||
import type { Argv } from 'yargs';
|
||||
import { Sketch } from '../../common/protocol';
|
||||
import { poolWhile } from '../../common/utils';
|
||||
import {
|
||||
AppInfo,
|
||||
appInfoPropertyLiterals,
|
||||
@@ -292,6 +293,16 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
||||
);
|
||||
if (sketchFolderPath) {
|
||||
this.openFilePromise.reject(new InterruptWorkspaceRestoreError());
|
||||
|
||||
// open-file event is triggered before the app is ready and initialWindow is created.
|
||||
// Wait for initialWindow to be set before opening the sketch on the first instance.
|
||||
// See https://github.com/arduino/arduino-ide/pull/2693
|
||||
try {
|
||||
await app.whenReady();
|
||||
if (!this.firstWindowId) {
|
||||
await poolWhile(() => !this.initialWindow, 100, 3000);
|
||||
}
|
||||
} catch {}
|
||||
await this.openSketch(sketchFolderPath);
|
||||
}
|
||||
}
|
||||
@@ -385,10 +396,11 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
||||
}
|
||||
|
||||
private async launchFromArgs(
|
||||
params: ElectronMainCommandOptions
|
||||
params: ElectronMainCommandOptions,
|
||||
argv?: string[]
|
||||
): Promise<boolean> {
|
||||
// Copy to prevent manipulation of original array
|
||||
const argCopy = [...this.argv];
|
||||
const argCopy = [...(argv || this.argv)];
|
||||
let path: string | undefined;
|
||||
for (const maybePath of argCopy) {
|
||||
const resolvedPath = await this.resolvePath(maybePath, params.cwd);
|
||||
@@ -526,7 +538,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
||||
argv: string[],
|
||||
cwd: string
|
||||
): Promise<void> {
|
||||
if (await this.launchFromArgs({ cwd, secondInstance: true })) {
|
||||
if (await this.launchFromArgs({ cwd, secondInstance: true }, argv)) {
|
||||
// Application has received a file in its arguments
|
||||
return;
|
||||
}
|
||||
@@ -889,7 +901,10 @@ const fallbackFrontendAppConfig: FrontendApplicationConfig = {
|
||||
defaultIconTheme: 'none',
|
||||
validatePreferencesSchema: false,
|
||||
defaultLocale: '',
|
||||
electron: { showWindowEarly: true, uriScheme: 'custom://arduino-ide' },
|
||||
electron: {
|
||||
showWindowEarly: true,
|
||||
uriScheme: 'arduino-ide',
|
||||
},
|
||||
reloadOnReconnect: true,
|
||||
};
|
||||
|
||||
|
||||
@@ -423,6 +423,8 @@ export class BoardsServiceImpl
|
||||
switch (options.type) {
|
||||
case 'Updatable':
|
||||
return Installable.Updateable;
|
||||
case 'Installed':
|
||||
return Installable.Installed;
|
||||
case 'Arduino':
|
||||
case 'Partner':
|
||||
case 'Arduino@Heart':
|
||||
|
||||
@@ -1139,4 +1139,5 @@ export enum LibraryLocation {
|
||||
LIBRARY_LOCATION_PLATFORM_BUILTIN = 2,
|
||||
LIBRARY_LOCATION_REFERENCED_PLATFORM_BUILTIN = 3,
|
||||
LIBRARY_LOCATION_UNMANAGED = 4,
|
||||
LIBRARY_LOCATION_PROFILE = 5,
|
||||
}
|
||||
|
||||
@@ -8652,7 +8652,8 @@ proto.cc.arduino.cli.commands.v1.LibraryLocation = {
|
||||
LIBRARY_LOCATION_USER: 1,
|
||||
LIBRARY_LOCATION_PLATFORM_BUILTIN: 2,
|
||||
LIBRARY_LOCATION_REFERENCED_PLATFORM_BUILTIN: 3,
|
||||
LIBRARY_LOCATION_UNMANAGED: 4
|
||||
LIBRARY_LOCATION_UNMANAGED: 4,
|
||||
LIBRARY_LOCATION_PROFILE: 5
|
||||
};
|
||||
|
||||
goog.object.extend(exports, proto.cc.arduino.cli.commands.v1);
|
||||
|
||||
@@ -306,7 +306,7 @@ export class LibraryServiceImpl
|
||||
item: LibraryPackage;
|
||||
progressId?: string;
|
||||
version?: Installable.Version;
|
||||
installDependencies?: boolean;
|
||||
noDeps?: boolean;
|
||||
noOverwrite?: boolean;
|
||||
installLocation?: LibraryLocation.BUILTIN | LibraryLocation.USER;
|
||||
}): Promise<void> {
|
||||
@@ -321,7 +321,7 @@ export class LibraryServiceImpl
|
||||
req.setInstance(instance);
|
||||
req.setName(item.name);
|
||||
req.setVersion(version);
|
||||
req.setNoDeps(!options.installDependencies);
|
||||
req.setNoDeps(Boolean(options.noDeps));
|
||||
req.setNoOverwrite(Boolean(options.noOverwrite));
|
||||
if (options.installLocation === LibraryLocation.BUILTIN) {
|
||||
req.setInstallLocation(
|
||||
|
||||
@@ -2,6 +2,7 @@ import { expect } from 'chai';
|
||||
import {
|
||||
messagesToLines,
|
||||
truncateLines,
|
||||
joinLines,
|
||||
} from '../../browser/serial/monitor/monitor-utils';
|
||||
import { Line } from '../../browser/serial/monitor/serial-monitor-send-output';
|
||||
import { set, reset } from 'mockdate';
|
||||
@@ -15,6 +16,7 @@ type TestLine = {
|
||||
charCount: number;
|
||||
maxCharacters?: number;
|
||||
};
|
||||
expectedJoined?: string;
|
||||
};
|
||||
|
||||
const date = new Date();
|
||||
@@ -22,6 +24,7 @@ const testLines: TestLine[] = [
|
||||
{
|
||||
messages: ['Hello'],
|
||||
expected: { lines: [{ message: 'Hello', lineLen: 5 }], charCount: 5 },
|
||||
expectedJoined: 'Hello',
|
||||
},
|
||||
{
|
||||
messages: ['Hello', 'Dog!'],
|
||||
@@ -36,6 +39,7 @@ const testLines: TestLine[] = [
|
||||
],
|
||||
charCount: 10,
|
||||
},
|
||||
expectedJoined: 'Hello\nDog!'
|
||||
},
|
||||
{
|
||||
messages: ['Dog!'],
|
||||
@@ -67,6 +71,7 @@ const testLines: TestLine[] = [
|
||||
{ message: "You're a good boy!", lineLen: 8 },
|
||||
],
|
||||
},
|
||||
expectedJoined: "Hello Dog!\n Who's a good boy?\nYou're a good boy!",
|
||||
},
|
||||
{
|
||||
messages: ['boy?\n', "You're a good boy!"],
|
||||
@@ -116,6 +121,7 @@ const testLines: TestLine[] = [
|
||||
{ message: 'Yo', lineLen: 2 },
|
||||
],
|
||||
},
|
||||
expectedJoined: "Hello Dog!\nWho's a good boy?\nYo",
|
||||
},
|
||||
];
|
||||
|
||||
@@ -165,6 +171,10 @@ describe('Monitor Utils', () => {
|
||||
});
|
||||
expect(totalCharCount).to.equal(charCount);
|
||||
}
|
||||
if (testLine.expectedJoined) {
|
||||
const joined_str = joinLines(testLine.expected.lines);
|
||||
expect(joined_str).to.equal(testLine.expectedJoined);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -6,24 +6,22 @@ Thanks for your interest in contributing to this project!
|
||||
|
||||
There are several ways you can get involved:
|
||||
|
||||
| Type of contribution | Contribution method |
|
||||
| ----------------------------------------- | -------------------------------------------------------------------------------- |
|
||||
| - Support<br/>- Question<br/>- Discussion | Post on the [**Arduino Forum**][forum] |
|
||||
| - Bug report<br/>- Feature request | Issue report (see the guide [**here**][issues]) |
|
||||
| Testing | Beta testing, PR review (see the guide [**here**][beta-testing]) |
|
||||
| Translation | See the guide [**here**][translate] |
|
||||
| - Bug fix<br/>- Enhancement | Pull request (see the guide [**here**][prs]) |
|
||||
| Monetary | - [Donate][donate]<br/>- [Sponsor][sponsor]<br/>- [Buy official products][store] |
|
||||
| Type of contribution | Contribution method |
|
||||
| ----------------------------------------- | ---------------------------------------------------------------- |
|
||||
| - Support<br/>- Question<br/>- Discussion | Post on the [**Arduino Forum**][forum] |
|
||||
| - Bug report<br/>- Feature request | Issue report (see the guide [**here**][issues]) |
|
||||
| Testing | Beta testing, PR review (see the guide [**here**][beta-testing]) |
|
||||
| Translation | See the guide [**here**][translate] |
|
||||
| - Bug fix<br/>- Enhancement | Pull request (see the guide [**here**][prs]) |
|
||||
| Monetary | [Buy official products][store] |
|
||||
|
||||
[forum]: https://forum.arduino.cc
|
||||
[issues]: contributor-guide/issues.md#issue-report-guide
|
||||
[beta-testing]: contributor-guide/beta-testing.md#beta-testing-guide
|
||||
[translate]: contributor-guide/translation.md#translator-guide
|
||||
[prs]: contributor-guide/pull-requests.md#pull-request-guide
|
||||
[donate]: https://www.arduino.cc/en/donate/
|
||||
[sponsor]: https://github.com/sponsors/arduino
|
||||
[issues]: /docs/contributor-guide/issues.md#issue-report-guide
|
||||
[beta-testing]: /docs/contributor-guide/beta-testing.md#beta-testing-guide
|
||||
[translate]: /docs/contributor-guide/translation.md#translator-guide
|
||||
[prs]: /docs/contributor-guide/pull-requests.md#pull-request-guide
|
||||
[store]: https://store.arduino.cc
|
||||
|
||||
## Resources
|
||||
|
||||
- [**Development Guide**](development.md#development-guide)
|
||||
- [**Development Guide**](/docs/development.md#development-guide)
|
||||
|
||||
@@ -66,3 +66,53 @@ If you later decide you would like to remove a 3rd party theme you installed, it
|
||||
1. If Arduino IDE is running, select **File > Quit** from the Arduino IDE menus to exit all windows.
|
||||
1. Delete the theme's `.vsix` file from [the location you installed it to](#installation). <br />
|
||||
⚠ Please be careful when deleting things from your computer. When in doubt, back up!
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Linux: Wayland Display Server Issues
|
||||
|
||||
Arduino IDE is built on [Electron](https://www.electronjs.org/), which attempts to use native Wayland rendering on Linux systems with Wayland display servers. However, some Wayland compositors (particularly Hyprland, Sway, and some configurations of KDE Plasma and GNOME) may experience crashes or initialization failures with errors such as:
|
||||
|
||||
```
|
||||
Failed to connect to Wayland display
|
||||
Failed to initialize Wayland platform
|
||||
The platform failed to initialize. Exiting.
|
||||
```
|
||||
|
||||
Or segmentation faults immediately after launching.
|
||||
|
||||
#### Workaround: Force X11/XWayland Backend
|
||||
|
||||
If you encounter Wayland-related crashes, you can force Arduino IDE to use the X11/XWayland backend instead of native Wayland rendering:
|
||||
|
||||
**Method 1: Environment Variable (Recommended)**
|
||||
|
||||
Set the `ELECTRON_OZONE_PLATFORM_HINT` environment variable before launching Arduino IDE:
|
||||
|
||||
```bash
|
||||
export ELECTRON_OZONE_PLATFORM_HINT=x11
|
||||
arduino-ide
|
||||
```
|
||||
|
||||
To make this permanent, add the export line to your shell configuration file (`~/.bashrc`, `~/.zshrc`, or equivalent).
|
||||
|
||||
**Method 2: Command Line Flag**
|
||||
|
||||
Launch Arduino IDE with the `--ozone-platform=x11` flag:
|
||||
|
||||
```bash
|
||||
arduino-ide --ozone-platform=x11
|
||||
```
|
||||
|
||||
You can create a wrapper script or shell alias for convenience:
|
||||
|
||||
```bash
|
||||
# Add to ~/.bashrc or ~/.zshrc
|
||||
alias arduino-ide='arduino-ide --ozone-platform=x11'
|
||||
```
|
||||
|
||||
#### Related Issues
|
||||
|
||||
For more information and updates on native Wayland support, see:
|
||||
- [Issue #2759: Segmentation fault when launching Arduino IDE](https://github.com/arduino/arduino-ide/issues/2759)
|
||||
- [Issue #2107: IDE crashes with segmentation fault when run under native Wayland](https://github.com/arduino/arduino-ide/issues/2107)
|
||||
|
||||
@@ -1,13 +1,43 @@
|
||||
# Translator Guide
|
||||
|
||||
The text of the Arduino IDE interface is translated into several languages. The language can be selected in the dialog opened via **File > Preferences** in the Arduino IDE menus (**Arduino IDE > Preferences** for macOS users).
|
||||
The text of the Arduino IDE user interface is translated into several languages. The language can be selected in the dialog opened via **File > Preferences** in the Arduino IDE menus (**Arduino IDE > Preferences** for macOS users).
|
||||
|
||||
Translating text and improving on existing translations is a valuable contribution to the project, helping make Arduino accessible to everyone.
|
||||
|
||||
The translations for the text found in the Arduino IDE come from several sources:
|
||||
The translations for the text found in Arduino IDE come from several sources:
|
||||
|
||||
## Arduino IDE Text
|
||||
|
||||
The text of the Arduino IDE application can be translated to the following languages:
|
||||
|
||||
- čeština (Czech)
|
||||
- Deutsch (German)
|
||||
- Dutch
|
||||
- español (Spanish)
|
||||
- français (French)
|
||||
- italiano (Italian)
|
||||
- magyar (Hungarian)
|
||||
- polski (Polish)
|
||||
- português (Portuguese)
|
||||
- Türkçe (Turkish)
|
||||
- български (Bulgarian)
|
||||
- русский (Russian)
|
||||
- українська (Ukrainian)
|
||||
- 한국어 (Korean)
|
||||
- 中文(简体) (Chinese Simplified)
|
||||
- 中文(繁體) (Chinese Traditional)
|
||||
- 日本語 (Japanese)
|
||||
|
||||
---
|
||||
|
||||
⚠ Unfortunately the 3rd party localization framework used by the Arduino IDE application imposes a technical restriction to that set of languages. Unless a language is supported by that framework, it cannot be supported in the Arduino IDE. For this reason, we are currently unable to add support to Arduino IDE for additional languages (see [`arduino/arduino-ide#1447`](https://github.com/arduino/arduino-ide/issues/1447) for details).
|
||||
If a new language becomes available through the said framework, it will be added to the above list. When that happens, we may consider adding support for that language to Arduino IDE.
|
||||
Meanwhile we will continue to accept contributions for other languages, but be aware that we cannot say if and when those languages will become available in Arduino IDE.
|
||||
|
||||
There is no technical limitation on the set of languages to which **Arduino CLI** can be translated. If you would like to contribute translations for a language not on the above list, you are welcome to [contribute to the **Arduino CLI** project](#arduino-cli-text).
|
||||
|
||||
---
|
||||
|
||||
Translations of Arduino IDE's text is done in the "**Arduino IDE 2.0**" project on the **Transifex** localization platform:
|
||||
|
||||
https://explore.transifex.com/arduino-1/ide2/
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "electron-app",
|
||||
"version": "2.3.5",
|
||||
"version": "2.3.7",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"main": "./src-gen/backend/electron-main.js",
|
||||
"dependencies": {
|
||||
@@ -19,7 +19,7 @@
|
||||
"@theia/preferences": "1.57.0",
|
||||
"@theia/terminal": "1.57.0",
|
||||
"@theia/workspace": "1.57.0",
|
||||
"arduino-ide-extension": "2.3.5"
|
||||
"arduino-ide-extension": "2.3.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@theia/cli": "1.57.0",
|
||||
@@ -67,7 +67,8 @@
|
||||
"defaultIconTheme": "none",
|
||||
"validatePreferencesSchema": false,
|
||||
"electron": {
|
||||
"showWindowEarly": true
|
||||
"showWindowEarly": true,
|
||||
"uriScheme": "arduino-ide"
|
||||
},
|
||||
"reloadOnReconnect": true,
|
||||
"preferences": {
|
||||
@@ -138,7 +139,8 @@
|
||||
"nsis",
|
||||
"zip"
|
||||
],
|
||||
"sign": "./scripts/windowsCustomSign.js"
|
||||
"sign": "./scripts/windowsCustomSign.js",
|
||||
"extraFiles": "resources/PATENT_DISCLAIMER"
|
||||
},
|
||||
"mac": {
|
||||
"darkModeSupport": true,
|
||||
@@ -148,7 +150,8 @@
|
||||
"entitlementsInherit": "resources/entitlements.mac.plist",
|
||||
"target": {
|
||||
"target": "default"
|
||||
}
|
||||
},
|
||||
"extraResources": "resources/PATENT_DISCLAIMER"
|
||||
},
|
||||
"linux": {
|
||||
"target": [
|
||||
@@ -156,7 +159,8 @@
|
||||
"AppImage"
|
||||
],
|
||||
"category": "Development",
|
||||
"icon": "resources/icons"
|
||||
"icon": "resources/icons",
|
||||
"extraFiles": "resources/PATENT_DISCLAIMER"
|
||||
},
|
||||
"msi": {
|
||||
"runAfterFinish": false
|
||||
|
||||
6
electron-app/resources/PATENT_DISCLAIMER
Normal file
6
electron-app/resources/PATENT_DISCLAIMER
Normal file
@@ -0,0 +1,6 @@
|
||||
Qualcomm neither accepts, nor undertakes any action to satisfy conditions in
|
||||
support of the acceptance of, the Alliance for Open Media Patent License 1.0.
|
||||
The license text has been retained for the benefit of our customers and
|
||||
partners, so that they receive proper notice of the license that is available
|
||||
to them by the Licensors under the AOM Patent License 1.0.
|
||||
See also: https://www.qualcomm.com/content/dam/qcomm-martech/dm-assets/documents/AOM-Statement.pdf
|
||||
@@ -8,7 +8,5 @@
|
||||
<true/>
|
||||
<key>com.apple.security.cs.disable-library-validation</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
const path = require('node:path');
|
||||
const fs = require('fs');
|
||||
const webpack = require('webpack');
|
||||
const TheiaNativeWebpackPlugin = require('@theia/native-webpack-plugin');
|
||||
const frontend = require('./gen-webpack.config');
|
||||
const backend = require('./gen-webpack.node.config');
|
||||
const {
|
||||
@@ -39,6 +41,27 @@ backend.config.entry['parcel-watcher'] = {
|
||||
},
|
||||
};
|
||||
|
||||
// Override Theia native dependency bundler to assign stricter file permissions (chmod 755)
|
||||
// https://github.com/eclipse-theia/theia/blob/9a52544fb4c1ea1d3d0d6bcbe106b97184279030/dev-packages/native-webpack-plugin/src/native-webpack-plugin.ts#L149
|
||||
class NativeWebpackPlugin extends TheiaNativeWebpackPlugin {
|
||||
// Override the method that writes/copies files
|
||||
async copyExecutable(source, target) {
|
||||
const targetDirectory = path.dirname(target);
|
||||
await fs.promises.mkdir(targetDirectory, { recursive: true });
|
||||
await fs.promises.copyFile(source, target);
|
||||
await fs.promises.chmod(target, 0o755);
|
||||
}
|
||||
}
|
||||
backend.config.plugins.push(new NativeWebpackPlugin({
|
||||
out: 'native',
|
||||
trash: true,
|
||||
ripgrep: true,
|
||||
pty: true,
|
||||
nativeBindings: {
|
||||
drivelist: 'drivelist/build/Release/drivelist.node',
|
||||
},
|
||||
}));
|
||||
|
||||
// Use a customized backend main that can enable the file logger in bundled mode.
|
||||
backend.config.entry['main'] = require.resolve('./arduino-ide-backend-main.js');
|
||||
|
||||
|
||||
28
i18n/be.json
28
i18n/be.json
@@ -13,7 +13,7 @@
|
||||
"board": {
|
||||
"board": "Плата{0}",
|
||||
"boardConfigDialogTitle": "Абярыце іншую плату і порт",
|
||||
"boardDataReloaded": "Board data reloaded.",
|
||||
"boardDataReloaded": "Дадзеныя на плату былі загружаныя нанова.",
|
||||
"boardInfo": "Інфармацыя пра плату",
|
||||
"boards": "платы",
|
||||
"configDialog1": "Абярыце як плату, так і порт, калі вы жадаеце загрузіць сцэнар.",
|
||||
@@ -32,12 +32,12 @@
|
||||
"port": "Порт{0}",
|
||||
"ports": "порты",
|
||||
"programmer": "Сродак праграмавання",
|
||||
"reloadBoardData": "Reload Board Data",
|
||||
"reloadBoardData": "Загрузіць дадзеныя на плату нанова",
|
||||
"reselectLater": "Абярыце паўторна пазней",
|
||||
"revertBoardsConfig": "Ужыта '{0}' выяўлена ў '{1}'",
|
||||
"searchBoard": "Знайсці плату",
|
||||
"selectBoard": "Знайсці плату",
|
||||
"selectBoardToReload": "Please select a board first.",
|
||||
"selectBoardToReload": "Калі ласка, спачатку абярыце плату.",
|
||||
"selectPortForInfo": "Калі ласка, абярыце порт, каб атрымаць інфармацыю пра плату.",
|
||||
"showAllAvailablePorts": "Паказвае ўсе даступныя порты, калі яны ўключаныя",
|
||||
"showAllPorts": "Паказаць усе порты",
|
||||
@@ -275,9 +275,9 @@
|
||||
"checkForUpdates": "Праверыць наяўнасць абнаўленняў Arduino IDE",
|
||||
"closeAndInstallButton": "Зачыніць і ўсталяваць",
|
||||
"closeToInstallNotice": "Зачыніце праграмнае забеспячэнне і ўсталюйце абнаўленне на свой кампутар.",
|
||||
"donateLinkIconTitle": "open donation page",
|
||||
"donateLinkText": "donate to support us",
|
||||
"donateText": "Open source is love, {0}",
|
||||
"donateLinkIconTitle": "адчыніць старонку ахвяраванняў",
|
||||
"donateLinkText": "ахвяраваць, каб падтрымаць нас",
|
||||
"donateText": "Адкрыты зыходны код - гэта любоў, {0}",
|
||||
"downloadButton": "Спампаваць",
|
||||
"downloadingNotice": "Пампуе апошнюю версію Arduino IDE.",
|
||||
"errorCheckingForUpdates": "Памылка пры праверцы абнаўленняў Arduino IDE.\n{0}",
|
||||
@@ -417,9 +417,9 @@
|
||||
"sketchbook.showAllFiles": "Калі true, адлюстроўваюцца ўсе файлы сцэнараў унутры сцэнара.\nПершапачаткова false.",
|
||||
"unofficialBoardSupport": "Пстрыкніце, каб праглядзець спіс адрасоў URL падтрымкі неафіцыйных плат",
|
||||
"upload": "выгрузіць",
|
||||
"upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.",
|
||||
"upload.autoVerify": "True, калі IDE павінна аўтаматычна правяраць код перад загрузкай.\nПершапачаткова значэнне роўнае true.\nКалі false, IDE не кампілюе код нанова перад загрузкай двайковага файла на плату.\nНастойліва рэкамендуецца ўсталяваць false толькі калі вы ведаеце, што робіце.",
|
||||
"upload.verbose": "Калі true, каб быў падрабязны вывад пры загрузцы.\nПершапачаткова false.",
|
||||
"upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.",
|
||||
"upload.verify": "Пасля загрузкі пераканайцеся, што змест памяці на плаце адпавядае загружанаму двайковаму файлу.",
|
||||
"verifyAfterUpload": "Праверыць код пасля выгрузкі",
|
||||
"window.autoScale": "Калі true, карыстальніцкі інтэрфейс аўтаматычна маштабуецца ў адпаведнасці з памерам шрыфту.",
|
||||
"window.zoomLevel": {
|
||||
@@ -523,12 +523,12 @@
|
||||
"renameSketchFolderTitle": "Хібная назва сцэнара"
|
||||
},
|
||||
"versionWelcome": {
|
||||
"cancelButton": "Maybe later",
|
||||
"donateButton": "Donate now",
|
||||
"donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.",
|
||||
"donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.",
|
||||
"title": "Welcome to a new version of the Arduino IDE!",
|
||||
"titleWithVersion": "Welcome to the new Arduino IDE {0}!"
|
||||
"cancelButton": "Можа, пазней",
|
||||
"donateButton": "Ахвераваць зараз",
|
||||
"donateMessage": "Arduino імкнецца захаваць праграмнае забеспячэнне бясплатным і з адкрытым зыходным кодам для ўсіх.\nВашыя ахвяраванні дапамагаюць нам распрацоўваць новыя функцыі, удасканальваць бібліятэкі і падтрымліваць мільёны карыстальнікаў па ўсім свеце.",
|
||||
"donateMessage2": "Калі ласка, падумайце пра падтрымку нашай працы над бясплатнай Arduino IDE з адкрытым зыходным кодам.",
|
||||
"title": "Сардэчна запрашаем у новую версію Arduino IDE!",
|
||||
"titleWithVersion": "Сардэчна запрашаем у новае асяроддзе распрацоўкі Arduino IDE {0}!"
|
||||
},
|
||||
"workspace": {
|
||||
"alreadyExists": "{0}' ужо існуе."
|
||||
|
||||
32
i18n/da.json
32
i18n/da.json
@@ -2,28 +2,28 @@
|
||||
"arduino": {
|
||||
"about": {
|
||||
"detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}",
|
||||
"label": "About {0}"
|
||||
"label": "Om 1{0}"
|
||||
},
|
||||
"account": {
|
||||
"goToCloudEditor": "Go to Cloud Editor",
|
||||
"goToIoTCloud": "Go to IoT Cloud",
|
||||
"goToProfile": "Go to Profile",
|
||||
"goToCloudEditor": "Gå til Cloud Editor",
|
||||
"goToIoTCloud": "Gå til IoT Cloud",
|
||||
"goToProfile": "Gå til Profil",
|
||||
"menuTitle": "Arduino Cloud"
|
||||
},
|
||||
"board": {
|
||||
"board": "Board{0}",
|
||||
"boardConfigDialogTitle": "Select Other Board and Port",
|
||||
"boardDataReloaded": "Board data reloaded.",
|
||||
"boardInfo": "Board Info",
|
||||
"boards": "boards",
|
||||
"configDialog1": "Select both a Board and a Port if you want to upload a sketch.",
|
||||
"configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.",
|
||||
"couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?",
|
||||
"editBoardsConfig": "Edit Board and Port...",
|
||||
"getBoardInfo": "Get Board Info",
|
||||
"inSketchbook": " (in Sketchbook)",
|
||||
"installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?",
|
||||
"noBoardsFound": "No boards found for \"{0}\"",
|
||||
"boardConfigDialogTitle": "Vælg andet Board og Port",
|
||||
"boardDataReloaded": "Board data genhentet",
|
||||
"boardInfo": "Board info",
|
||||
"boards": "Boards",
|
||||
"configDialog1": "Vælg både et Board og en Port, hvis du ønsker at oploade en skitse",
|
||||
"configDialog2": "Hvis du kun vælger et Board, vil du kunne kompilere, men ikke uploade din skitse.",
|
||||
"couldNotFindPreviouslySelected": "Kunne ikke finde tidligere valgte board '1 {0}' i installerede platform '2 {1}'. Vælg venligst det board du ønsker at anvende. Ønsker du at vælge det nu?",
|
||||
"editBoardsConfig": "Ret Board og Port...",
|
||||
"getBoardInfo": "Hent Board info",
|
||||
"inSketchbook": "(I skitsebog)",
|
||||
"installNow": "\" 1 {0} 2 {1} \" kerne skal installeres for det nuværende valgte \" 3 {2}\" board. Vil du installere det nu?",
|
||||
"noBoardsFound": "Intet board fundet for \" 1 {0} \"",
|
||||
"noNativeSerialPort": "Native serial port, can't obtain info.",
|
||||
"noPortsDiscovered": "No ports discovered",
|
||||
"nonSerialPort": "Non-serial port, can't obtain info.",
|
||||
|
||||
13
i18n/en.json
13
i18n/en.json
@@ -140,6 +140,7 @@
|
||||
"all": "All",
|
||||
"contributed": "Contributed",
|
||||
"installManually": "Install Manually",
|
||||
"installed": "Installed",
|
||||
"later": "Later",
|
||||
"noBoardSelected": "No board selected",
|
||||
"noSketchOpened": "No sketch opened",
|
||||
@@ -275,9 +276,6 @@
|
||||
"checkForUpdates": "Check for Arduino IDE Updates",
|
||||
"closeAndInstallButton": "Close and Install",
|
||||
"closeToInstallNotice": "Close the software and install the update on your machine.",
|
||||
"donateLinkIconTitle": "open donation page",
|
||||
"donateLinkText": "donate to support us",
|
||||
"donateText": "Open source is love, {0}",
|
||||
"downloadButton": "Download",
|
||||
"downloadingNotice": "Downloading the latest version of the Arduino IDE.",
|
||||
"errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}",
|
||||
@@ -435,6 +433,7 @@
|
||||
"autoscroll": "Autoscroll",
|
||||
"carriageReturn": "Carriage Return",
|
||||
"connecting": "Connecting to '{0}' on '{1}'...",
|
||||
"copyOutput": "Copy Output",
|
||||
"message": "Message (Enter to send message to '{0}' on '{1}')",
|
||||
"newLine": "New Line",
|
||||
"newLineCarriageReturn": "Both NL & CR",
|
||||
@@ -522,14 +521,6 @@
|
||||
"renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?",
|
||||
"renameSketchFolderTitle": "Invalid sketch name"
|
||||
},
|
||||
"versionWelcome": {
|
||||
"cancelButton": "Maybe later",
|
||||
"donateButton": "Donate now",
|
||||
"donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.",
|
||||
"donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.",
|
||||
"title": "Welcome to a new version of the Arduino IDE!",
|
||||
"titleWithVersion": "Welcome to the new Arduino IDE {0}!"
|
||||
},
|
||||
"workspace": {
|
||||
"alreadyExists": "'{0}' already exists."
|
||||
}
|
||||
|
||||
28
i18n/it.json
28
i18n/it.json
@@ -107,14 +107,14 @@
|
||||
"options": "Opzioni...",
|
||||
"privateVisibility": "Privato. Solo tu potrai vedere lo sketch.",
|
||||
"profilePicture": "Immagine profilo",
|
||||
"publicVisibility": "Pubblico. Chiunque abbia il link può vedere lo Sketch.",
|
||||
"publicVisibility": "Pubblico. Chiunque abbia il link può vedere lo sketch.",
|
||||
"pull": "Richiedi",
|
||||
"pullFirst": "Nel Cloud devi prima effettuare il Pull per poi poter eseguire il Push.",
|
||||
"pullSketch": "Richiedi lo Sketch",
|
||||
"pullSketchMsg": "Richiedendo questo Sketch tramite il Cloud, lo stesso sovrascriverà quello presente in locale. Sei sicuro di dover continuare?",
|
||||
"pullSketch": "Richiedi lo sketch",
|
||||
"pullSketchMsg": "Richiedendo questo sketch tramite il cloud, lo stesso sovrascriverà quello presente in locale. Sei sicuro di voler continuare?",
|
||||
"push": "Push",
|
||||
"pushSketch": "Invia lo Sketch",
|
||||
"pushSketchMsg": "Questo è uno sketch pubblico. Prima di inviarlo, verifica che tutte le informazioni sensibili siano all'interno di arduino_secrets.h. Eventualmente puoi rendere lo sketch privato dal Pannello di Condivisione.",
|
||||
"pushSketch": "Invia lo sketch",
|
||||
"pushSketchMsg": "Questo è uno sketch pubblico. Prima di inviarlo, verifica che tutte le informazioni sensibili siano all'interno di arduino_secrets.h. Eventualmente, puoi rendere lo sketch privato dal pannello della condivisione.",
|
||||
"remote": "Remoto",
|
||||
"share": "Condividi...",
|
||||
"shareSketch": "Condividi sketch",
|
||||
@@ -123,8 +123,8 @@
|
||||
"signInToCloud": "Effettua la registrazione su Arduino Cloud",
|
||||
"signOut": "Disconnetti",
|
||||
"sync": "Sincronizza",
|
||||
"syncEditSketches": "Sincronizza e modifica la tua raccolta di Sketches sul Cloud Arduino",
|
||||
"visitArduinoCloud": "Visita Arduino Cloud per creare Cloud Sketch "
|
||||
"syncEditSketches": "Sincronizza e modifica la tua raccolta degli sketch sul cloud di Arduino",
|
||||
"visitArduinoCloud": "Visita il cloud di Arduino per creare gli sketch."
|
||||
},
|
||||
"cloudSketch": {
|
||||
"alreadyExists": "Lo sketch remoto '{0}' è già presente.",
|
||||
@@ -217,7 +217,7 @@
|
||||
"debuggingNotSupported": "Il debug non è supportato da '{0}'",
|
||||
"getDebugInfo": "Acquisizione delle informazioni di debug in corso...",
|
||||
"noPlatformInstalledFor": "La piattaforma non è ancora stata installata per '{0}'",
|
||||
"optimizeForDebugging": "Ottimizzato per il Debug.",
|
||||
"optimizeForDebugging": "Ottimizzato per il debug",
|
||||
"sketchIsNotCompiled": "Lo sketch '{0}' deve essere verificato prima di avviare una sessione di debug. Verificare lo sketch e avviare nuovamente il debug. Si desidera verificare lo sketch adesso?"
|
||||
},
|
||||
"developer": {
|
||||
@@ -385,7 +385,7 @@
|
||||
"editorFontSize": "Dimensione del carattere dell'editor",
|
||||
"editorQuickSuggestions": "Suggerimenti rapidi dell'editor",
|
||||
"enterAdditionalURLs": "Aggiungi degli URLs aggiuntivi, uno per ogni riga",
|
||||
"files.inside.sketches": "Mostra i file all'interno degli Sketch",
|
||||
"files.inside.sketches": "Mostra i file all'interno degli sketch",
|
||||
"ide.updateBaseUrl": "L'URL base da cui scaricare gli aggiornamenti. Il valore predefinito è 'https://downloads.arduino.cc/arduino-ide'",
|
||||
"ide.updateChannel": "Canale di rilascio per le versioni aggiornate. 'stable' è per le versioni stabili, 'nightly' è per l'ultima versione in sviluppo.",
|
||||
"interfaceScale": "Scalabilità dell'interfaccia",
|
||||
@@ -448,7 +448,7 @@
|
||||
"archiveSketch": "Archivia sketch",
|
||||
"cantOpen": "Una cartella di nome \"{0}\" esiste già. Impossibile aprire lo sketch.",
|
||||
"compile": "Compilazione dello sketch in corso...",
|
||||
"configureAndUpload": "Configura e Carica",
|
||||
"configureAndUpload": "Configura e carica",
|
||||
"createdArchive": "Creato l'archivio '{0}'.",
|
||||
"doneCompiling": "Compilazione completata.",
|
||||
"doneUploading": "Caricamento terminato.",
|
||||
@@ -466,12 +466,12 @@
|
||||
"noTrailingPeriod": "Il nome di un file non può terminare con un punto",
|
||||
"openFolder": "Apri Cartella",
|
||||
"openRecent": "Apri recenti",
|
||||
"openSketchInNewWindow": "Apri lo sketch in una Nuova Finestra",
|
||||
"openSketchInNewWindow": "Apri lo sketch in una nuova finestra",
|
||||
"reservedFilename": "'{0}' è il nome di un file riservato.",
|
||||
"saveFolderAs": "Salva la cartella sketch come...",
|
||||
"saveSketch": "Salva il tuo sketch per riaprirlo in seguito.",
|
||||
"saveSketchAs": "Salva la cartella dello sketch come...",
|
||||
"showFolder": "Mostra la cartella dello Sketch",
|
||||
"showFolder": "Mostra la cartella dello sketch",
|
||||
"sketch": "Sketch",
|
||||
"sketchAlreadyContainsThisFileError": "Lo sketch contiene già un file denominato '{0}'",
|
||||
"sketchAlreadyContainsThisFileMessage": "Impossibile salvare lo sketch \"{0}\" come \"{1}\". {2}",
|
||||
@@ -479,7 +479,7 @@
|
||||
"titleLocalSketchbook": "Cartella degli sketch locali",
|
||||
"titleSketchbook": "Sketchbook",
|
||||
"upload": "Carica",
|
||||
"uploadUsingProgrammer": "Carica tramite Programmatore",
|
||||
"uploadUsingProgrammer": "Carica tramite programmatore",
|
||||
"uploading": "Caricamento in corso...",
|
||||
"userFieldsNotFoundError": "Non è possibile trovare i campi utente per connettere la scheda",
|
||||
"verify": "Verifica",
|
||||
@@ -487,7 +487,7 @@
|
||||
},
|
||||
"sketchbook": {
|
||||
"newCloudSketch": "Nuovo sketch remoto",
|
||||
"newSketch": "Nuovo Sketch"
|
||||
"newSketch": "Nuovo sketch"
|
||||
},
|
||||
"theme": {
|
||||
"currentThemeNotFound": "Impossibile trovare il tema attualmente selezionato: {0}. Arduino IDE ha selezionato un tema integrato compatibile con quello mancante.",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "arduino-ide",
|
||||
"version": "2.3.5",
|
||||
"version": "2.3.7",
|
||||
"description": "Arduino IDE",
|
||||
"repository": "https://github.com/arduino/arduino-ide.git",
|
||||
"author": "Arduino SA",
|
||||
|
||||
@@ -5912,7 +5912,7 @@ domexception@^4.0.0:
|
||||
dependencies:
|
||||
webidl-conversions "^7.0.0"
|
||||
|
||||
dompurify@^2.2.9, dompurify@^2.4.7:
|
||||
dompurify@^2.2.9:
|
||||
version "2.5.8"
|
||||
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.5.8.tgz#2809d89d7e528dc7a071dea440d7376df676f824"
|
||||
integrity sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw==
|
||||
|
||||
Reference in New Issue
Block a user