Compare commits

..

30 Commits

Author SHA1 Message Date
Francesco Spissu
f84c15bea0 close websocket connection after closing serial plotter 2022-11-21 11:53:56 +01:00
Alberto Iannaccone
fe3fbb189c 2.0.3 (#1687) 2022-11-17 15:03:22 +01:00
github-actions[bot]
23c7f5f848 Updated translation files (#1606)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-11-17 12:47:21 +01:00
Alberto Iannaccone
f1144efb93 Use 0.29.0 CLI in IDE2 (#1683) 2022-11-17 12:43:28 +01:00
per1234
9cec643cab Fix nightly build links in issue forms
The issue forms are configured to request the contributor to test using the nightly build of Arduino IDE before
submitting an issue in order to make sure the bug or feature request has not already been resolved.

Some time ago, the repository's readme contained a table of download links. The links in the issue forms pointed there.
That table was replaced with a link to the official "Software" page in order to reduce unnecessary verbosity and
maintenance burden of the project's documentation content.

The issue form links were not updated at that time. The resulting additional link in the chain made obtaining the
nightly build less convenient for the contributor to obtain.

The links are hereby updated to point directly to the list of nightly build download links on the arduino.cc "Software"
page.
2022-11-17 03:25:26 -08:00
Akos Kitta
1a7784a540 feat: progress for the remote sketch creation
Closes #1668

Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
2022-11-17 11:05:34 +01:00
Akos Kitta
d24a3911f8 fix: workaround for arduino/arduino-cli#1968
Do not try to parse the original `NotFound` error message, but look for
a sketch somewhere in the requested path.

Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
2022-11-11 13:19:08 +01:00
Akos Kitta
3735553003 fix: flawed timing issue when opening editors
From now on, the editor widget open promise resolution does not rely on
internal Theia events but solely on @phosphor's `isAttached`/`isVisible`
properties.
The editor widget promise resolves with the next task after a navigation
frame so the browser can render the widget.

Closes #1612

Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
2022-11-11 13:19:08 +01:00
Akos Kitta
f6d112e1f6 fix: escaped regex chars in pattern
Closes #1600

Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
2022-11-10 16:33:42 +01:00
Akos Kitta
cc2d557706 fix: relaxed condition to check if resource exists
The original (`fs-extra`-based) implementation did not check if the
file is writable either.

Resources are not writable in mounted AppImages.

Closes #1586

Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
2022-11-10 11:27:44 +01:00
Akos Kitta
103acc4b7e fix: allow second instance on macOS
Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
2022-11-10 11:27:17 +01:00
Akos Kitta
c3dc7c6307 fix: avoid ENOTDIR when opening second instance.
If the resource is a file, do not try to `readdir`, but return undefined

Closes #1590

Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
2022-11-10 11:27:17 +01:00
Akos Kitta
7d6a2d5e33 feat: Create remote sketch
Closes #1580

Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
2022-11-10 11:12:20 +01:00
Akos Kitta
6984c52b92 fix: Handle gracefully when trying to detect invalid sketch name error and folder is missing on filesystem (#1616)
- feat: generalized Node.js error handling
    - Gracefully handle when the sketch folder has been deleted
 - feat: spare detecting invalid sketch name error
    - The invalid sketch name detection requires at least one extra FS access.
       Do not try to detect the invalid sketch name error, but use the original
       `NotFound` from the CLI.
 - fix: typo

Closes #1596

Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
2022-11-10 11:11:35 +01:00
Akos Kitta
3a70547770 fix: do not trim stdout of clang-format process
Otherwise, it always causes a _no newline at the end of file_ problem.

Closes #1487

Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
2022-11-08 09:39:41 +01:00
per1234
8a85b5c3d8 Migrate workflows from deprecated set-output commands
GitHub Actions provides the capability for workflow authors to use the capabilities of the GitHub Actions ToolKit
package directly in the `run` keys of workflows via "workflow commands". One such command is `set-output`, which allows
data to be passed out of a workflow step as an output.

It has been determined that this command has potential to be a security risk in some applications. For this reason,
GitHub has deprecated the command and a warning of this is shown in the workflow run summary page of any workflow using
it:

The `set-output` command is deprecated and will be disabled soon. Please upgrade to using Environment Files. For more
information see: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/

The identical capability is now provided in a safer form via the GitHub Actions "environment files" system. Migrating
the use of the deprecated workflow commands to use the `GITHUB_OUTPUT` environment file instead fixes any potential
vulnerabilities in the workflows, resolves the warnings, and avoids the eventual complete breakage of the workflows that
would result from GitHub's planned removal of the `set-output` workflow command 2023-05-31.
2022-11-04 00:45:14 -07:00
dependabot[bot]
b998d35524 Bump actions/checkout from 2 to 3
Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-03 16:39:12 -07:00
dependabot[bot]
ddec64c4a5 Bump svenstaro/upload-release-action from 2.2.0 to 2.3.0
Bumps [svenstaro/upload-release-action](https://github.com/svenstaro/upload-release-action) from 2.2.0 to 2.3.0.
- [Release notes](https://github.com/svenstaro/upload-release-action/releases)
- [Changelog](https://github.com/svenstaro/upload-release-action/blob/master/CHANGELOG.md)
- [Commits](https://github.com/svenstaro/upload-release-action/compare/2.2.0...2.3.0)

---
updated-dependencies:
- dependency-name: svenstaro/upload-release-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-03 16:09:57 -07:00
dependabot[bot]
8fed08003e Bump actions/upload-artifact from 2 to 3
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-03 16:09:37 -07:00
dependabot[bot]
8454c625f7 Bump geekyeggo/delete-artifact from 1 to 2
Bumps [geekyeggo/delete-artifact](https://github.com/geekyeggo/delete-artifact) from 1 to 2.
- [Release notes](https://github.com/geekyeggo/delete-artifact/releases)
- [Commits](https://github.com/geekyeggo/delete-artifact/compare/v1...v2)

---
updated-dependencies:
- dependency-name: geekyeggo/delete-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-03 16:04:18 -07:00
dependabot[bot]
60df322f09 Bump actions/setup-node from 1 to 3
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 1 to 3.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v1...v3)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-03 16:03:47 -07:00
dependabot[bot]
8bfb140e7c Bump actions/setup-python from 2 to 4
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 2 to 4.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v2...v4)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-03 14:51:19 -07:00
dependabot[bot]
260227e79a Bump peter-evans/create-pull-request from 3 to 4
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 3 to 4.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v3...v4)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-03 14:30:50 -07:00
dependabot[bot]
cc310bf1a5 Bump actions/download-artifact from 2 to 3
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 2 to 3.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-03 14:25:30 -07:00
per1234
dbd52e2f34 Remove unused GitHub release download stats workflow
The "github-stats" GitHub Actions workflow periodically gathers GitHub release asset download statistics for Arduino CLI
and pushes the results to Datadog.

There are no known problems with this workflow. However, the companion "arduino-stats" workflow that did the same for
the downloads of Arduino IDE from downloads.arduino.cc was broken and thus removed from the repository.

The GitHub stats are not very valuable on their own as they only provide an unknown fraction of the total downloads of
Arduino IDE. They have also not ended up being used.

The workflow also uses deprecated Node.js 12 runtime, which currently results in warnings printed to the workflow run
summary page, but will eventually cause the complete breakage of the workflow.

Since it doesn't provide any value and represents a maintenance burden, the workflow is hereby removed from the
repository.
2022-11-03 14:13:40 -07:00
per1234
9cd03bec46 Remove broken download stats workflow
The "arduino-stats" GitHub Actions workflow was designed to periodically gather download statistics from Arduino CDN and
push results to Datadog.

The recorded stats from the identical system in the Arduino CLI repository showed a periodic decrease in total download
count. Since this is patently impossible, it is clear that something is wrong with the system and that the recorded data
is not trustworthy. An investigation into the problem
was never done.

On 2022-03-14, the runs of the "arduino-stats" GitHub Actions workflow began to fail. Because there had not been any
relevant change in the repository between the last successful run and the first failing run, it seems that some external
change caused the breakage.

The workflow also uses deprecated Node.js 12 runtime-based actions and set-output workflow command, which currently
results in warnings printed to the workflow run summary page, but will eventually cause the complete breakage of the
workflow.

Since the workflow was not ever working successfully and the lack of an investigation about that indicates that the
stats are not of immediate importance, the best course of action is to simply remove the broken infrastructure from the
repository rather than investing time into fixing something that isn't being used anyway.
2022-11-03 14:13:40 -07:00
dependabot[bot]
c29452a858 Bump carlosperate/download-file-action from 1 to 2
Bumps [carlosperate/download-file-action](https://github.com/carlosperate/download-file-action) from 1 to 2.
- [Release notes](https://github.com/carlosperate/download-file-action/releases)
- [Commits](https://github.com/carlosperate/download-file-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: carlosperate/download-file-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-03 14:05:51 -07:00
per1234
7d91f2d8cb Configure Dependabot to check for outdated actions used in workflows
Dependabot will periodically check the versions of all actions used in the repository's workflows. If any are found to
be outdated, it will submit a pull request to update them.

NOTE: Dependabot's PRs will occasionally propose to pin to the patch version of the action (e.g., updating
`uses: foo/bar@v1` to `uses: foo/bar@v2.3.4`). When the action author has provided a major version ref, use that instead
(e.g., `uses: foo/bar@v2`). Dependabot will automatically close its PR once the workflow has been updated.

More information:
https://docs.github.com/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot
2022-11-03 13:56:30 -07:00
Akos Kitta
f6275f9f62 feat: build IDE2 on darwin arm64
- Use Node.js 16+,
 - All workflow files use `.yml` instead of `.yaml`,
 - Use Arduino LS `0.7.2`,
 - Updated `electron-builder` to `23.3.3`,
 - Removed unused `conf-node-gyp.sh`,
 - Removed unused `THEIA_ELECTRON_SKIP_REPLACE_FFMPEG`, and
 - Aligned `node-gyp@9.3.0`, `electron-rebuild@3.2.9` to Theia.

Co-authored-by: per1234 <accounts@perglass.com>
Co-authored-by: Akos Kitta <a.kitta@arduino.cc>

Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
2022-11-02 15:48:04 +01:00
per1234
0d0550974a Bump version metadata post release
On every startup, the Arduino IDE checks for new versions of the IDE. If a newer version is available, a
notification/dialog is shown offering an update.

"Newer" is determined by comparing the version of the user's IDE to the latest available version on the update channel.
This comparison is done according to the Semantic Versioning Specification ("SemVer").

In order to facilitate beta testing, builds are generated of the Arduino IDE at the current stage in development. These
builds are given an identifying version of the following form:

- <version>-snapshot-<short hash> - builds generated for every push and pull request that modifies relevant files
- <version>-nightly-<YYYYMMDD> - daily builds of the tip of the default branch

In order to cause these builds to be correctly considered "newer" than the release version, the version metadata must be
bumped immediately following each release.

This will also serve as the metadata bump for the next release in the event that release is a minor release. In case it
is instead a minor or major release, the version metadata will need to be updated once more before the release tag is
created.
2022-10-28 06:42:46 -07:00
102 changed files with 2030 additions and 2581 deletions

View File

@@ -30,7 +30,7 @@ body:
description: |
Which version of the Arduino IDE are you using?
See **Help > About Arduino IDE** in the Arduino IDE menus (**Arduino IDE > About Arduino IDE** on macOS).
This should be the latest [nightly build](https://github.com/arduino/arduino-ide#nightly-builds).
This should be the latest [nightly build](https://www.arduino.cc/en/software#nightly-builds).
validations:
required: true
- type: dropdown
@@ -68,7 +68,7 @@ body:
options:
- label: I searched for previous reports in [the issue tracker](https://github.com/arduino/arduino-ide/issues?q=)
required: true
- label: I verified the problem still occurs when using the latest [nightly build](https://github.com/arduino/arduino-ide#nightly-builds)
- label: I verified the problem still occurs when using the latest [nightly build](https://www.arduino.cc/en/software#nightly-builds)
required: true
- label: My report contains all necessary details
required: true

View File

@@ -25,7 +25,7 @@ body:
description: |
Which version of the Arduino IDE are you using?
See **Help > About Arduino IDE** in the Arduino IDE menus (**Arduino IDE > About Arduino IDE** on macOS).
This should be the latest [nightly build](https://github.com/arduino/arduino-ide#nightly-builds).
This should be the latest [nightly build](https://www.arduino.cc/en/software#nightly-builds).
validations:
required: true
- type: dropdown
@@ -63,7 +63,7 @@ body:
options:
- label: I searched for previous requests in [the issue tracker](https://github.com/arduino/arduino-ide/issues?q=)
required: true
- label: I verified the feature was still missing when using the latest [nightly build](https://github.com/arduino/arduino-ide#nightly-builds)
- label: I verified the feature was still missing when using the latest [nightly build](https://www.arduino.cc/en/software#nightly-builds)
required: true
- label: My request contains all necessary details
required: true

15
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,15 @@
# See: https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#about-the-dependabotyml-file
version: 2
updates:
# Configure check for outdated GitHub Actions actions in workflows.
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/dependabot/README.md
# See: https://docs.github.com/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot
- package-ecosystem: github-actions
directory: / # Check the repository's workflows under /.github/workflows/
assignees:
- per1234
schedule:
interval: daily
labels:
- "topic: infrastructure"

View File

@@ -1,131 +0,0 @@
import boto3
import semver
import os
import logging
import uuid
import time
# logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
log = logging.getLogger()
logging.getLogger("boto3").setLevel(logging.CRITICAL)
logging.getLogger("botocore").setLevel(logging.CRITICAL)
logging.getLogger("urllib3").setLevel(logging.CRITICAL)
def execute(client, statement, dest_s3_output_location):
log.info("execute query: {} dumping in {}".format(statement, dest_s3_output_location))
result = client.start_query_execution(
QueryString=statement,
ClientRequestToken=str(uuid.uuid4()),
ResultConfiguration={
"OutputLocation": dest_s3_output_location,
},
)
execution_id = result["QueryExecutionId"]
log.info("wait for query {} completion".format(execution_id))
wait_for_query_execution_completion(client, execution_id)
log.info("operation successful")
return execution_id
def wait_for_query_execution_completion(client, query_execution_id):
query_ended = False
while not query_ended:
query_execution = client.get_query_execution(QueryExecutionId=query_execution_id)
state = query_execution["QueryExecution"]["Status"]["State"]
if state == "SUCCEEDED":
query_ended = True
elif state in ["FAILED", "CANCELLED"]:
raise BaseException(
"query failed or canceled: {}".format(query_execution["QueryExecution"]["Status"]["StateChangeReason"])
)
else:
time.sleep(1)
def valid(key):
split = key.split("_")
if len(split) < 1:
return False
try:
semver.parse(split[0])
except ValueError:
return False
return True
def get_results(client, execution_id):
results_paginator = client.get_paginator("get_query_results")
results_iter = results_paginator.paginate(QueryExecutionId=execution_id, PaginationConfig={"PageSize": 1000})
res = {}
for results_page in results_iter:
for row in results_page["ResultSet"]["Rows"][1:]:
# Loop through the JSON objects
key = row["Data"][0]["VarCharValue"]
if valid(key):
res[key] = row["Data"][1]["VarCharValue"]
return res
def convert_data(data):
result = []
for key, value in data.items():
# 0.18.0_macOS_64bit.tar.gz
split_key = key.split("_")
if len(split_key) != 3:
continue
(version, os_version, arch) = split_key
arch_split = arch.split(".")
if len(arch_split) < 1:
continue
arch = arch_split[0]
if len(arch) > 10:
# This can't be an architecture really.
# It's an ugly solution but works for now so deal with it.
continue
repo = os.environ["GITHUB_REPOSITORY"].split("/")[1]
result.append(
{
"type": "gauge",
"name": "arduino.downloads.total",
"value": value,
"host": os.environ["GITHUB_REPOSITORY"],
"tags": [
f"version:{version}",
f"os:{os_version}",
f"arch:{arch}",
"cdn:downloads.arduino.cc",
f"project:{repo}",
],
}
)
return result
if __name__ == "__main__":
DEST_S3_OUTPUT = os.environ["AWS_ATHENA_OUTPUT_LOCATION"]
AWS_ATHENA_SOURCE_TABLE = os.environ["AWS_ATHENA_SOURCE_TABLE"]
session = boto3.session.Session(region_name="us-east-1")
athena_client = session.client("athena")
# Load all partitions before querying downloads
execute(athena_client, f"MSCK REPAIR TABLE {AWS_ATHENA_SOURCE_TABLE};", DEST_S3_OUTPUT)
query = f"""SELECT replace(json_extract_scalar(url_decode(url_decode(querystring)),
'$.data.url'), 'https://downloads.arduino.cc/arduino-ide/arduino-ide_', '')
AS flavor, count(json_extract(url_decode(url_decode(querystring)),'$')) AS gauge
FROM {AWS_ATHENA_SOURCE_TABLE}
WHERE json_extract_scalar(url_decode(url_decode(querystring)),'$.data.url')
LIKE 'https://downloads.arduino.cc/arduino-ide/arduino-ide_%'
AND json_extract_scalar(url_decode(url_decode(querystring)),'$.data.url')
NOT LIKE '%latest%' -- exclude latest redirect
group by 1 ;"""
exec_id = execute(athena_client, query, DEST_S3_OUTPUT)
results = get_results(athena_client, exec_id)
result_json = convert_data(results)
print(f"::set-output name=result::{result_json}")

View File

@@ -1,57 +0,0 @@
name: arduino-stats
on:
schedule:
# run every day at 07:00 AM, 03:00 PM and 11:00 PM
- cron: "0 7,15,23 * * *"
workflow_dispatch:
repository_dispatch:
jobs:
push-stats:
# This workflow is only of value to the arduino/arduino-ide repository and
# would always fail in forks
if: github.repository == 'arduino/arduino-ide'
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Fetch downloads count form Arduino CDN using AWS Athena
id: fetch
env:
AWS_ACCESS_KEY_ID: ${{ secrets.STATS_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.STATS_AWS_SECRET_ACCESS_KEY }}
AWS_ATHENA_SOURCE_TABLE: ${{ secrets.STATS_AWS_ATHENA_SOURCE_TABLE }}
AWS_ATHENA_OUTPUT_LOCATION: ${{ secrets.STATS_AWS_ATHENA_OUTPUT_LOCATION }}
GITHUB_REPOSITORY: ${{ github.repository }}
run: |
pip install boto3 semver
python .github/tools/fetch_athena_stats.py
- name: Send metrics
uses: masci/datadog@v1
with:
api-key: ${{ secrets.DD_API_KEY }}
# Metrics input expects YAML but JSON will work just right.
metrics: ${{steps.fetch.outputs.result}}
- name: Report failure
if: failure()
uses: masci/datadog@v1
with:
api-key: ${{ secrets.DD_API_KEY }}
events: |
- title: "Arduino IDE stats failing"
text: "Stats collection failed"
alert_type: "error"
host: ${{ github.repository }}
tags:
- "project:arduino-ide"
- "cdn:downloads.arduino.cc"
- "workflow:${{ github.workflow }}"

View File

@@ -55,16 +55,16 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Install Node.js 14.x
uses: actions/setup-node@v1
- name: Install Node.js 16.x
uses: actions/setup-node@v3
with:
node-version: '14.x'
node-version: '16.x'
registry-url: 'https://registry.npmjs.org'
- name: Install Python 3.x
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: '3.x'
@@ -109,7 +109,7 @@ jobs:
yarn --cwd ./electron/packager/ package
- name: Upload [GitHub Actions]
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: ${{ env.JOB_TRANSFER_ARTIFACT }}
path: electron/build/dist/build-artifacts/
@@ -140,13 +140,13 @@ jobs:
steps:
- name: Download job transfer artifact
uses: actions/download-artifact@v2
uses: actions/download-artifact@v3
with:
name: ${{ env.JOB_TRANSFER_ARTIFACT }}
path: ${{ env.JOB_TRANSFER_ARTIFACT }}
- name: Upload tester build artifact
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: ${{ matrix.artifact.name }}
path: ${{ env.JOB_TRANSFER_ARTIFACT }}/${{ matrix.artifact.path }}
@@ -158,7 +158,7 @@ jobs:
BODY: ${{ steps.changelog.outputs.BODY }}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
fetch-depth: 0 # To fetch all history for all branches and tags.
@@ -183,12 +183,12 @@ jobs:
OUTPUT_SAFE_BODY="${BODY//'%'/'%25'}"
OUTPUT_SAFE_BODY="${OUTPUT_SAFE_BODY//$'\n'/'%0A'}"
OUTPUT_SAFE_BODY="${OUTPUT_SAFE_BODY//$'\r'/'%0D'}"
echo "::set-output name=BODY::$OUTPUT_SAFE_BODY"
echo "BODY=$OUTPUT_SAFE_BODY" >> $GITHUB_OUTPUT
echo "$BODY" > CHANGELOG.txt
- name: Upload Changelog [GitHub Actions]
if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: ${{ env.JOB_TRANSFER_ARTIFACT }}
path: CHANGELOG.txt
@@ -199,7 +199,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Download [GitHub Actions]
uses: actions/download-artifact@v2
uses: actions/download-artifact@v3
with:
name: ${{ env.JOB_TRANSFER_ARTIFACT }}
path: ${{ env.JOB_TRANSFER_ARTIFACT }}
@@ -220,7 +220,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Download [GitHub Actions]
uses: actions/download-artifact@v2
uses: actions/download-artifact@v3
with:
name: ${{ env.JOB_TRANSFER_ARTIFACT }}
path: ${{ env.JOB_TRANSFER_ARTIFACT }}
@@ -228,10 +228,10 @@ jobs:
- name: Get Tag
id: tag_name
run: |
echo ::set-output name=TAG_NAME::${GITHUB_REF#refs/tags/}
echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
- name: Publish Release [GitHub]
uses: svenstaro/upload-release-action@2.2.0
uses: svenstaro/upload-release-action@2.3.0
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
release_name: ${{ steps.tag_name.outputs.TAG_NAME }}
@@ -263,6 +263,6 @@ jobs:
steps:
- name: Remove unneeded job transfer artifact
uses: geekyeggo/delete-artifact@v1
uses: geekyeggo/delete-artifact@v2
with:
name: ${{ env.JOB_TRANSFER_ARTIFACT }}

View File

@@ -108,7 +108,7 @@ jobs:
echo "Certificate expiration date: $EXPIRATION_DATE"
echo "Days remaining before expiration: $DAYS_BEFORE_EXPIRATION"
echo "::set-output name=days::$DAYS_BEFORE_EXPIRATION"
echo "days=$DAYS_BEFORE_EXPIRATION" >> $GITHUB_OUTPUT
- name: Check if expiration notification period has been reached
id: check-expiration

View File

@@ -27,12 +27,12 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Install Node.js 14.x
uses: actions/setup-node@v2
- name: Install Node.js 16.x
uses: actions/setup-node@v3
with:
node-version: '14.x'
node-version: '16.x'
registry-url: 'https://registry.npmjs.org'
- name: Install Go

View File

@@ -8,7 +8,7 @@ on:
env:
CHANGELOG_ARTIFACTS: changelog
# See: https://github.com/actions/setup-node/#readme
NODE_VERSION: 14.x
NODE_VERSION: 16.x
jobs:
create-changelog:
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Install Node.js
uses: actions/setup-node@v3
@@ -27,7 +27,7 @@ jobs:
- name: Get Tag
id: tag_name
run: |
echo ::set-output name=TAG_NAME::${GITHUB_REF#refs/tags/}
echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
- name: Create full changelog
id: full-changelog

View File

@@ -1,96 +0,0 @@
name: github-stats
on:
schedule:
# run every 30 minutes
- cron: "*/30 * * * *"
workflow_dispatch:
repository_dispatch:
jobs:
push-stats:
# This workflow is only of value to the arduino/arduino-ide repository and
# would always fail in forks
if: github.repository == 'arduino/arduino-ide'
runs-on: ubuntu-latest
steps:
- name: Fetch downloads count
id: fetch
uses: actions/github-script@v4
with:
github-token: ${{github.token}}
script: |
let metrics = []
// Get a list of releases
const opts = github.repos.listReleases.endpoint.merge({
...context.repo
})
const releases = await github.paginate(opts)
// Get download stats for every release
for (const rel of releases) {
// Names for assets are like `arduino-ide_2.0.0-beta.12_Linux_64bit.zip`,
// we'll use this later to split the asset file name more easily
const baseName = `arduino-ide_${rel.name}_`
// Get a list of assets for this release
const opts = github.repos.listReleaseAssets.endpoint.merge({
...context.repo,
release_id: rel.id
})
const assets = await github.paginate(opts)
for (const asset of assets) {
// Ignore files that are not arduino-ide packages
if (!asset.name.startsWith(baseName)) {
continue
}
// Strip the base and remove file extension to get `Linux_32bit`
systemArch = asset.name.replace(baseName, "").split(".")[0].split("_")
// Add a metric object to the list of gathered metrics
metrics.push({
"type": "gauge",
"name": "arduino.downloads.total",
"value": asset.download_count,
"host": "${{ github.repository }}",
"tags": [
`version:${rel.name}`,
`os:${systemArch[0]}`,
`arch:${systemArch[1]}`,
"cdn:github.com",
"project:arduino-ide"
]
})
}
}
// The action will put whatever we return from this function in
// `outputs.result`, JSON encoded. So we just return the array
// of objects and GitHub will do the rest.
return metrics
- name: Send metrics
uses: masci/datadog@v1
with:
api-key: ${{ secrets.DD_API_KEY }}
# Metrics input expects YAML but JSON will work just right.
metrics: ${{steps.fetch.outputs.result}}
- name: Report failure
if: failure()
uses: masci/datadog@v1
with:
api-key: ${{ secrets.DD_API_KEY }}
events: |
- title: "Arduino IDE stats failing"
text: "Stats collection failed"
alert_type: "error"
host: ${{ github.repository }}
tags:
- "project:arduino-ide"
- "cdn:github.com"
- "workflow:${{ github.workflow }}"

View File

@@ -14,12 +14,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Install Node.js 14.x
uses: actions/setup-node@v2
- name: Install Node.js 16.x
uses: actions/setup-node@v3
with:
node-version: '14.x'
node-version: '16.x'
registry-url: 'https://registry.npmjs.org'
- name: Install Go

View File

@@ -14,12 +14,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Install Node.js 14.x
uses: actions/setup-node@v2
- name: Install Node.js 16.x
uses: actions/setup-node@v3
with:
node-version: '14.x'
node-version: '16.x'
registry-url: 'https://registry.npmjs.org'
- name: Install Go
@@ -45,7 +45,7 @@ jobs:
TRANSIFEX_API_KEY: ${{ secrets.TRANSIFEX_API_KEY }}
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
uses: peter-evans/create-pull-request@v4
with:
commit-message: Updated translation files
title: Update translation files

View File

@@ -27,11 +27,11 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Download JSON schema for labels configuration file
id: download-schema
uses: carlosperate/download-file-action@v1
uses: carlosperate/download-file-action@v2
with:
file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/arduino-tooling-gh-label-configuration-schema.json
location: ${{ runner.temp }}/label-configuration-schema
@@ -66,12 +66,12 @@ jobs:
steps:
- name: Download
uses: carlosperate/download-file-action@v1
uses: carlosperate/download-file-action@v2
with:
file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/${{ matrix.filename }}
- name: Pass configuration files to next job via workflow artifact
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
path: |
*.yaml
@@ -103,19 +103,19 @@ jobs:
run: |
# Use of this flag in the github-label-sync command will cause it to only check the validity of the
# configuration.
echo "::set-output name=flag::--dry-run"
echo "flag=--dry-run" >> $GITHUB_OUTPUT
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Download configuration files artifact
uses: actions/download-artifact@v2
uses: actions/download-artifact@v3
with:
name: ${{ env.CONFIGURATIONS_ARTIFACT }}
path: ${{ env.CONFIGURATIONS_FOLDER }}
- name: Remove unneeded artifact
uses: geekyeggo/delete-artifact@v1
uses: geekyeggo/delete-artifact@v2
with:
name: ${{ env.CONFIGURATIONS_ARTIFACT }}

View File

@@ -9,7 +9,7 @@ on:
env:
# See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml
GO_VERSION: "1.17"
NODE_VERSION: 14.x
NODE_VERSION: 16.x
jobs:
pull-from-jsonbin:

View File

@@ -1,6 +1,6 @@
{
"name": "arduino-ide-extension",
"version": "2.0.1",
"version": "2.0.3",
"description": "An extension for Theia building the Arduino IDE",
"license": "AGPL-3.0-or-later",
"scripts": {
@@ -45,7 +45,6 @@
"@types/deepmerge": "^2.2.0",
"@types/glob": "^7.2.0",
"@types/google-protobuf": "^3.7.2",
"@types/is-valid-path": "^0.1.0",
"@types/js-yaml": "^3.12.2",
"@types/keytar": "^4.4.0",
"@types/lodash.debounce": "^4.0.6",
@@ -159,7 +158,7 @@
],
"arduino": {
"cli": {
"version": "0.28.0"
"version": "0.29.0"
},
"fwuploader": {
"version": "2.2.2"
@@ -168,7 +167,7 @@
"version": "14.0.0"
},
"languageServer": {
"version": "0.7.1"
"version": "0.7.2"
}
}
}

View File

@@ -42,6 +42,9 @@
const suffix = (() => {
switch (platform) {
case 'darwin':
if (arch === 'arm64') {
return 'macOS_ARM64.tar.gz';
}
return 'macOS_64bit.tar.gz';
case 'win32':
return 'Windows_64bit.zip';

View File

@@ -76,6 +76,12 @@
lsSuffix = 'macOS_64bit.tar.gz';
clangdSuffix = 'macOS_64bit';
break;
case 'darwin-arm64':
clangdExecutablePath = path.join(build, 'clangd');
clangFormatExecutablePath = path.join(build, 'clang-format');
lsSuffix = 'macOS_ARM64.tar.gz';
clangdSuffix = 'macOS_ARM64';
break;
case 'linux-x64':
clangdExecutablePath = path.join(build, 'clangd');
clangFormatExecutablePath = path.join(build, 'clang-format');

View File

@@ -335,6 +335,8 @@ import { UserFields } from './contributions/user-fields';
import { UpdateIndexes } from './contributions/update-indexes';
import { InterfaceScale } from './contributions/interface-scale';
import { OpenHandler } from '@theia/core/lib/browser/opener-service';
import { NewCloudSketch } from './contributions/new-cloud-sketch';
import { SketchbookCompositeWidget } from './widgets/sketchbook/sketchbook-composite-widget';
const registerArduinoThemes = () => {
const themes: MonacoThemeJson[] = [
@@ -751,6 +753,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
Contribution.configure(bind, DeleteSketch);
Contribution.configure(bind, UpdateIndexes);
Contribution.configure(bind, InterfaceScale);
Contribution.configure(bind, NewCloudSketch);
bindContributionProvider(bind, StartupTaskProvider);
bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window
@@ -905,6 +908,11 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
id: 'arduino-sketchbook-widget',
createWidget: () => container.get(SketchbookWidget),
}));
bind(SketchbookCompositeWidget).toSelf();
bind<WidgetFactory>(WidgetFactory).toDynamicValue((ctx) => ({
id: 'sketchbook-composite-widget',
createWidget: () => ctx.container.get(SketchbookCompositeWidget),
}));
bind(CloudSketchbookWidget).toSelf();
rebind(SketchbookWidget).toService(CloudSketchbookWidget);

View File

@@ -65,7 +65,7 @@ export class Close extends SketchContribution {
registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, {
commandId: Close.Commands.CLOSE.id,
label: nls.localize('vscode/editor.contribution/close', 'Close'),
order: '5',
order: '6',
});
}

View File

@@ -0,0 +1,372 @@
import { DialogError } from '@theia/core/lib/browser/dialogs';
import { KeybindingRegistry } from '@theia/core/lib/browser/keybinding';
import { LabelProvider } from '@theia/core/lib/browser/label-provider';
import { CompositeTreeNode } from '@theia/core/lib/browser/tree';
import { Widget } from '@theia/core/lib/browser/widgets/widget';
import { CancellationTokenSource } from '@theia/core/lib/common/cancellation';
import {
Disposable,
DisposableCollection,
} from '@theia/core/lib/common/disposable';
import { MenuModelRegistry } from '@theia/core/lib/common/menu';
import {
Progress,
ProgressUpdate,
} from '@theia/core/lib/common/message-service-protocol';
import { nls } from '@theia/core/lib/common/nls';
import { inject, injectable } from '@theia/core/shared/inversify';
import { WorkspaceInputDialogProps } from '@theia/workspace/lib/browser/workspace-input-dialog';
import { v4 } from 'uuid';
import { MainMenuManager } from '../../common/main-menu-manager';
import type { AuthenticationSession } from '../../node/auth/types';
import { AuthenticationClientService } from '../auth/authentication-client-service';
import { CreateApi } from '../create/create-api';
import { CreateUri } from '../create/create-uri';
import { Create } from '../create/typings';
import { ArduinoMenus } from '../menu/arduino-menus';
import { WorkspaceInputDialog } from '../theia/workspace/workspace-input-dialog';
import { CloudSketchbookTree } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree';
import { CloudSketchbookTreeModel } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree-model';
import { CloudSketchbookTreeWidget } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree-widget';
import { SketchbookCommands } from '../widgets/sketchbook/sketchbook-commands';
import { SketchbookWidget } from '../widgets/sketchbook/sketchbook-widget';
import { SketchbookWidgetContribution } from '../widgets/sketchbook/sketchbook-widget-contribution';
import { Command, CommandRegistry, Contribution, URI } from './contribution';
@injectable()
export class NewCloudSketch extends Contribution {
@inject(CreateApi)
private readonly createApi: CreateApi;
@inject(SketchbookWidgetContribution)
private readonly widgetContribution: SketchbookWidgetContribution;
@inject(AuthenticationClientService)
private readonly authenticationService: AuthenticationClientService;
@inject(MainMenuManager)
private readonly mainMenuManager: MainMenuManager;
private readonly toDispose = new DisposableCollection();
private _session: AuthenticationSession | undefined;
private _enabled: boolean;
override onReady(): void {
this.toDispose.pushAll([
this.authenticationService.onSessionDidChange((session) => {
const oldSession = this._session;
this._session = session;
if (!!oldSession !== !!this._session) {
this.mainMenuManager.update();
}
}),
this.preferences.onPreferenceChanged(({ preferenceName, newValue }) => {
if (preferenceName === 'arduino.cloud.enabled') {
const oldEnabled = this._enabled;
this._enabled = Boolean(newValue);
if (this._enabled !== oldEnabled) {
this.mainMenuManager.update();
}
}
}),
]);
this._enabled = this.preferences['arduino.cloud.enabled'];
this._session = this.authenticationService.session;
if (this._session) {
this.mainMenuManager.update();
}
}
onStop(): void {
this.toDispose.dispose();
}
override registerCommands(registry: CommandRegistry): void {
registry.registerCommand(NewCloudSketch.Commands.NEW_CLOUD_SKETCH, {
execute: () => this.createNewSketch(),
isEnabled: () => !!this._session,
isVisible: () => this._enabled,
});
}
override registerMenus(registry: MenuModelRegistry): void {
registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, {
commandId: NewCloudSketch.Commands.NEW_CLOUD_SKETCH.id,
label: nls.localize('arduino/cloudSketch/new', 'New Remote Sketch'),
order: '1',
});
}
override registerKeybindings(registry: KeybindingRegistry): void {
registry.registerKeybinding({
command: NewCloudSketch.Commands.NEW_CLOUD_SKETCH.id,
keybinding: 'CtrlCmd+Alt+N',
});
}
private async createNewSketch(
initialValue?: string | undefined
): Promise<unknown> {
const widget = await this.widgetContribution.widget;
const treeModel = this.treeModelFrom(widget);
if (!treeModel) {
return undefined;
}
const rootNode = CompositeTreeNode.is(treeModel.root)
? treeModel.root
: undefined;
if (!rootNode) {
return undefined;
}
return this.openWizard(rootNode, treeModel, initialValue);
}
private withProgress(
value: string,
treeModel: CloudSketchbookTreeModel
): (progress: Progress) => Promise<unknown> {
return async (progress: Progress) => {
let result: Create.Sketch | undefined | 'conflict';
try {
progress.report({
message: nls.localize(
'arduino/cloudSketch/creating',
"Creating remote sketch '{0}'...",
value
),
});
result = await this.createApi.createSketch(value);
} catch (err) {
if (isConflict(err)) {
result = 'conflict';
} else {
throw err;
}
} finally {
if (result) {
progress.report({
message: nls.localize(
'arduino/cloudSketch/synchronizing',
"Synchronizing sketchbook, pulling '{0}'...",
value
),
});
await treeModel.refresh();
}
}
if (result === 'conflict') {
return this.createNewSketch(value);
}
if (result) {
return this.open(treeModel, result);
}
return undefined;
};
}
private async open(
treeModel: CloudSketchbookTreeModel,
newSketch: Create.Sketch
): Promise<URI | undefined> {
const id = CreateUri.toUri(newSketch).path.toString();
const node = treeModel.getNode(id);
if (!node) {
throw new Error(
`Could not find remote sketchbook tree node with Tree node ID: ${id}.`
);
}
if (!CloudSketchbookTree.CloudSketchDirNode.is(node)) {
throw new Error(
`Remote sketchbook tree node expected to represent a directory but it did not. Tree node ID: ${id}.`
);
}
try {
await treeModel.sketchbookTree().pull({ node });
} catch (err) {
if (isNotFound(err)) {
await treeModel.refresh();
this.messageService.error(
nls.localize(
'arduino/newCloudSketch/notFound',
"Could not pull the remote sketch '{0}'. It does not exist.",
newSketch.name
)
);
return undefined;
}
throw err;
}
return this.commandService.executeCommand(
SketchbookCommands.OPEN_NEW_WINDOW.id,
{ node }
);
}
private treeModelFrom(
widget: SketchbookWidget
): CloudSketchbookTreeModel | undefined {
const treeWidget = widget.getTreeWidget();
if (treeWidget instanceof CloudSketchbookTreeWidget) {
const model = treeWidget.model;
if (model instanceof CloudSketchbookTreeModel) {
return model;
}
}
return undefined;
}
private async openWizard(
rootNode: CompositeTreeNode,
treeModel: CloudSketchbookTreeModel,
initialValue?: string | undefined
): Promise<unknown> {
const existingNames = rootNode.children
.filter(CloudSketchbookTree.CloudSketchDirNode.is)
.map(({ fileStat }) => fileStat.name);
return new NewCloudSketchDialog(
{
title: nls.localize(
'arduino/newCloudSketch/newSketchTitle',
'Name of a new Remote Sketch'
),
parentUri: CreateUri.root,
initialValue,
validate: (input) => {
if (existingNames.includes(input)) {
return nls.localize(
'arduino/newCloudSketch/sketchAlreadyExists',
"Remote sketch '{0}' already exists.",
input
);
}
// This is how https://create.arduino.cc/editor/ works when renaming a sketch.
if (/^[0-9a-zA-Z_]{1,36}$/.test(input)) {
return '';
}
return nls.localize(
'arduino/newCloudSketch/invalidSketchName',
'The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.'
);
},
},
this.labelProvider,
(value) => this.withProgress(value, treeModel)
).open();
}
}
export namespace NewCloudSketch {
export namespace Commands {
export const NEW_CLOUD_SKETCH: Command = {
id: 'arduino-new-cloud-sketch',
};
}
}
function isConflict(err: unknown): boolean {
return isErrorWithStatusOf(err, 409);
}
function isNotFound(err: unknown): boolean {
return isErrorWithStatusOf(err, 404);
}
function isErrorWithStatusOf(
err: unknown,
status: number
): err is Error & { status: number } {
if (err instanceof Error) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const object = err as any;
return 'status' in object && object.status === status;
}
return false;
}
@injectable()
class NewCloudSketchDialog extends WorkspaceInputDialog {
constructor(
@inject(WorkspaceInputDialogProps)
protected override readonly props: WorkspaceInputDialogProps,
@inject(LabelProvider)
protected override readonly labelProvider: LabelProvider,
private readonly withProgress: (
value: string
) => (progress: Progress) => Promise<unknown>
) {
super(props, labelProvider);
}
protected override async accept(): Promise<void> {
if (!this.resolve) {
return;
}
this.acceptCancellationSource.cancel();
this.acceptCancellationSource = new CancellationTokenSource();
const token = this.acceptCancellationSource.token;
const value = this.value;
const error = await this.isValid(value, 'open');
if (token.isCancellationRequested) {
return;
}
if (!DialogError.getResult(error)) {
this.setErrorMessage(error);
} else {
const spinner = document.createElement('div');
spinner.classList.add('spinner');
const disposables = new DisposableCollection();
try {
this.toggleButtons(true);
disposables.push(Disposable.create(() => this.toggleButtons(false)));
const closeParent = this.closeCrossNode.parentNode;
closeParent?.removeChild(this.closeCrossNode);
disposables.push(
Disposable.create(() => {
closeParent?.appendChild(this.closeCrossNode);
})
);
this.errorMessageNode.classList.add('progress');
disposables.push(
Disposable.create(() =>
this.errorMessageNode.classList.remove('progress')
)
);
const errorParent = this.errorMessageNode.parentNode;
errorParent?.insertBefore(spinner, this.errorMessageNode);
disposables.push(
Disposable.create(() => errorParent?.removeChild(spinner))
);
const cancellationSource = new CancellationTokenSource();
const progress: Progress = {
id: v4(),
cancel: () => cancellationSource.cancel(),
report: (update: ProgressUpdate) => {
this.setProgressMessage(update);
},
result: Promise.resolve(value),
};
await this.withProgress(value)(progress);
} finally {
disposables.dispose();
}
this.resolve(value);
Widget.detach(this);
}
}
private toggleButtons(disabled: boolean): void {
if (this.acceptButton) {
this.acceptButton.disabled = disabled;
}
if (this.closeButton) {
this.closeButton.disabled = disabled;
}
}
private setProgressMessage(update: ProgressUpdate): void {
if (update.work && update.work.done === update.work.total) {
this.errorMessageNode.innerText = '';
} else {
if (update.message) {
this.errorMessageNode.innerText = update.message;
}
}
}
}

View File

@@ -21,7 +21,7 @@ export class NewSketch extends SketchContribution {
override registerMenus(registry: MenuModelRegistry): void {
registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, {
commandId: NewSketch.Commands.NEW_SKETCH.id,
label: nls.localize('arduino/sketch/new', 'New'),
label: nls.localize('arduino/sketch/new', 'New Sketch'),
order: '0',
});
}

View File

@@ -1,5 +1,5 @@
import { nls } from '@theia/core/lib/common/nls';
import { inject, injectable } from '@theia/core/shared/inversify';
import { injectable } from '@theia/core/shared/inversify';
import type { EditorOpenerOptions } from '@theia/editor/lib/browser/editor-manager';
import { Later } from '../../common/nls';
import { Sketch, SketchesError } from '../../common/protocol';
@@ -15,14 +15,9 @@ import { ApplicationError } from '@theia/core/lib/common/application-error';
import { Deferred, wait } from '@theia/core/lib/common/promise-util';
import { EditorWidget } from '@theia/editor/lib/browser/editor-widget';
import { DisposableCollection } from '@theia/core/lib/common/disposable';
import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor';
import { ContextKeyService as VSCodeContextKeyService } from '@theia/monaco-editor-core/esm/vs/platform/contextkey/browser/contextKeyService';
@injectable()
export class OpenSketchFiles extends SketchContribution {
@inject(VSCodeContextKeyService)
private readonly contextKeyService: VSCodeContextKeyService;
override registerCommands(registry: CommandRegistry): void {
registry.registerCommand(OpenSketchFiles.Commands.OPEN_SKETCH_FILES, {
execute: (uri: URI) => this.openSketchFiles(uri),
@@ -107,7 +102,7 @@ export class OpenSketchFiles extends SketchContribution {
): Promise<Sketch | undefined> {
const { invalidMainSketchUri } = err.data;
requestAnimationFrame(() => this.messageService.error(err.message));
await wait(10); // let IDE2 toast the error message.
await wait(250); // let IDE2 open the editor and toast the error message, then open the modal dialog
const movedSketch = await promptMoveSketch(invalidMainSketchUri, {
fileService: this.fileService,
sketchService: this.sketchService,
@@ -135,39 +130,36 @@ export class OpenSketchFiles extends SketchContribution {
const widget = this.editorManager.all.find(
(widget) => widget.editor.uri.toString() === uri
);
if (widget && !forceOpen) {
return widget;
}
const disposables = new DisposableCollection();
if (!widget || forceOpen) {
const deferred = new Deferred<EditorWidget>();
const deferred = new Deferred<EditorWidget>();
// An editor can be in two primary states:
// - The editor is not yet opened. The `widget` is `undefined`. With `editorManager#open`, Theia will create an editor and fire an `editorManager#onCreated` event.
// - The editor is opened. Can be active, current, or open.
// - If the editor has the focus (the cursor blinks in the editor): it's the active editor.
// - If the editor does not have the focus (the focus is on a different widget or the context menu is opened in the editor): it's the current editor.
// - If the editor is not the top editor in the main area, it's opened.
if (!widget) {
// If the widget is `undefined`, IDE2 expects one `onCreate` event. Subscribe to the `onCreated` event
// and resolve the promise with the editor only when the new editor's visibility changes.
disposables.push(
this.editorManager.onCreated((editor) => {
if (editor.editor.uri.toString() === uri) {
if (editor.isVisible) {
disposables.dispose();
if (editor.isAttached && editor.isVisible) {
deferred.resolve(editor);
} else {
// In Theia, the promise resolves after opening the editor, but the editor is neither attached to the DOM, nor visible.
// This is a hack to first get an event from monaco after the widget update request, then IDE2 waits for the next monaco context key event.
// Here, the monaco context key event is not used, but this is the first event after the editor is visible in the UI.
disposables.push(
(editor.editor as MonacoEditor).onDidResize((dimension) => {
if (dimension) {
const isKeyOwner = (
arg: unknown
): arg is { key: string } => {
if (typeof arg === 'object') {
const object = arg as Record<string, unknown>;
return typeof object['key'] === 'string';
}
return false;
};
disposables.push(
this.contextKeyService.onDidChangeContext((e) => {
// `commentIsEmpty` is the first context key change event received from monaco after the editor is for real visible in the UI.
if (isKeyOwner(e) && e.key === 'commentIsEmpty') {
deferred.resolve(editor);
disposables.dispose();
}
})
editor.onDidChangeVisibility((visible) => {
if (visible) {
// wait an animation frame. although the visible and attached props are true the editor is not there.
// let the browser render the widget
setTimeout(
() =>
requestAnimationFrame(() => deferred.resolve(editor)),
0
);
}
})
@@ -176,29 +168,41 @@ export class OpenSketchFiles extends SketchContribution {
}
})
);
this.editorManager.open(
}
this.editorManager
.open(
new URI(uri),
options ?? {
mode: 'reveal',
preview: false,
counter: 0,
}
)
.then((editorWidget) => {
// If the widget was defined, it was already opened.
// The editor is expected to be attached to the shell and visible in the UI.
// The deferred promise does not have to wait for the `editorManager#onCreated` event.
// It can resolve earlier.
if (!widget) {
deferred.resolve(editorWidget);
}
});
const timeout = 5_000; // number of ms IDE2 waits for the editor to show up in the UI
const result = await Promise.race([
deferred.promise,
wait(timeout).then(() => {
disposables.dispose();
return 'timeout';
}),
]);
if (result === 'timeout') {
console.warn(
`Timeout after ${timeout} millis. The editor has not shown up in time. URI: ${uri}`
);
const timeout = 5_000; // number of ms IDE2 waits for the editor to show up in the UI
const result = await Promise.race([
deferred.promise,
wait(timeout).then(() => {
disposables.dispose();
return 'timeout';
}),
]);
if (result === 'timeout') {
console.warn(
`Timeout after ${timeout} millis. The editor has not shown up in time. URI: ${uri}`
);
}
return result;
}
return result;
}
}
export namespace OpenSketchFiles {

View File

@@ -54,7 +54,7 @@ export class OpenSketch extends SketchContribution {
registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, {
commandId: OpenSketch.Commands.OPEN_SKETCH.id,
label: nls.localize('vscode/workspaceActions/openFileFolder', 'Open...'),
order: '1',
order: '2',
});
}

View File

@@ -24,7 +24,7 @@ export class SaveSketch extends SketchContribution {
registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, {
commandId: SaveSketch.Commands.SAVE_SKETCH.id,
label: nls.localize('vscode/fileCommands/save', 'Save'),
order: '6',
order: '7',
});
}

View File

@@ -7,7 +7,9 @@ export namespace CreateUri {
export const scheme = 'arduino-create';
export const root = toUri(posix.sep);
export function toUri(posixPathOrResource: string | Create.Resource): URI {
export function toUri(
posixPathOrResource: string | Create.Resource | Create.Sketch
): URI {
const posixPath =
typeof posixPathOrResource === 'string'
? posixPathOrResource

View File

@@ -34,7 +34,6 @@ export class LocalCacheFsProvider
@inject(AuthenticationClientService)
protected readonly authenticationService: AuthenticationClientService;
// TODO: do we need this? Cannot we `await` on the `init` call from `registerFileSystemProviders`?
readonly ready = new Deferred<void>();
private _localCacheRoot: URI;
@@ -153,7 +152,7 @@ export class LocalCacheFsProvider
return uri;
}
private toUri(session: AuthenticationSession): URI {
toUri(session: AuthenticationSession): URI {
// Hack: instead of getting the UUID only, we get `auth0|UUID` after the authentication. `|` cannot be part of filesystem path or filename.
return this._localCacheRoot.resolve(session.id.split('|')[1]);
}

View File

@@ -46,6 +46,7 @@ export class MonitorManagerProxyClientImpl
private wsPort?: number;
private lastConnectedBoard: BoardsConfig.Config;
private onBoardsConfigChanged: Disposable | undefined;
private isMonitorWidgetOpen = false;
getWebSocketPort(): number | undefined {
return this.wsPort;
@@ -174,6 +175,14 @@ export class MonitorManagerProxyClientImpl
return this.server().getCurrentSettings(board, port);
}
setMonitorWidgetStatus(value: boolean): void {
this.isMonitorWidgetOpen = value;
}
getMonitorWidgetStatus(): boolean {
return this.isMonitorWidgetOpen;
}
send(message: string): void {
if (!this.webSocket) {
return;

View File

@@ -74,6 +74,10 @@ export class MonitorWidget extends ReactWidget {
this.monitorManagerProxy.startMonitor();
}
protected override onAfterAttach(msg: Message): void {
this.monitorManagerProxy.setMonitorWidgetStatus(this.isAttached);
}
onMonitorSettingsDidChange(settings: MonitorSettings): void {
this.settings = {
...this.settings,
@@ -91,6 +95,7 @@ export class MonitorWidget extends ReactWidget {
}
override dispose(): void {
this.monitorManagerProxy.setMonitorWidgetStatus(this.isAttached);
super.dispose();
}

View File

@@ -65,6 +65,9 @@ export class PlotterFrontendContribution extends Contribution {
ipcRenderer.on(CLOSE_PLOTTER_WINDOW, async () => {
if (!!this.window) {
if (!this.monitorManagerProxy.getMonitorWidgetStatus()) {
this.monitorManagerProxy.disconnect();
}
this.window = null;
}
});

View File

@@ -55,6 +55,7 @@
align-items: center;
}
.p-Widget.dialogOverlay .dialogControl .spinner,
.p-Widget.dialogOverlay .dialogBlock .dialogContent .dialogSection .dialogRow .spinner {
background: var(--theia-icon-loading) center center no-repeat;
animation: theia-spin 1.25s linear infinite;
@@ -63,11 +64,11 @@
}
.p-Widget.dialogOverlay .dialogBlock .dialogContent .dialogSection .dialogRow:first-child {
margin-top: 0px;
margin-top: 0px;
height: 32px;
}
.fl1{
.fl1 {
flex: 1;
}
@@ -80,10 +81,13 @@
opacity: .4;
}
@media only screen and (max-height: 560px) {
.p-Widget.dialogOverlay .dialogBlock {
max-height: 400px;
}
}
.p-Widget.dialogOverlay .error.progress {
color: var(--theia-button-background);
align-self: center;
}

View File

@@ -33,6 +33,22 @@
height: 100%;
}
.sketchbook-trees-container .create-new {
min-height: 58px;
height: 58px;
display: flex;
align-items: center;
justify-content: center;
}
/*
By default, theia-button has a left-margin. IDE2 does not need the left margin
for the _New Remote? Sketch_. Otherwise, the button does not fit the default
widget width.
*/
.sketchbook-trees-container .create-new .theia-button {
margin-left: unset;
}
.sketchbook-tree__opts {
background-color: var(--theia-foreground);
-webkit-mask: url(./sketchbook-opts-icon.svg);

View File

@@ -1,78 +1,78 @@
import * as React from '@theia/core/shared/react';
import * as ReactDOM from '@theia/core/shared/react-dom';
import { inject, injectable } from '@theia/core/shared/inversify';
import { Widget } from '@theia/core/shared/@phosphor/widgets';
import { Message, MessageLoop } from '@theia/core/shared/@phosphor/messaging';
import { Disposable } from '@theia/core/lib/common/disposable';
import { BaseWidget } from '@theia/core/lib/browser/widgets/widget';
import {
inject,
injectable,
postConstruct,
} from '@theia/core/shared/inversify';
import { UserStatus } from './cloud-user-status';
import { nls } from '@theia/core/lib/common/nls';
import { CloudSketchbookTreeWidget } from './cloud-sketchbook-tree-widget';
import { AuthenticationClientService } from '../../auth/authentication-client-service';
import { CloudSketchbookTreeModel } from './cloud-sketchbook-tree-model';
import { nls } from '@theia/core/lib/common';
import { BaseSketchbookCompositeWidget } from '../sketchbook/sketchbook-composite-widget';
import { CreateNew } from '../sketchbook/create-new';
import { AuthenticationSession } from '../../../node/auth/types';
@injectable()
export class CloudSketchbookCompositeWidget extends BaseWidget {
export class CloudSketchbookCompositeWidget extends BaseSketchbookCompositeWidget<CloudSketchbookTreeWidget> {
@inject(AuthenticationClientService)
protected readonly authenticationService: AuthenticationClientService;
private readonly authenticationService: AuthenticationClientService;
@inject(CloudSketchbookTreeWidget)
protected readonly cloudSketchbookTreeWidget: CloudSketchbookTreeWidget;
private compositeNode: HTMLElement;
private cloudUserStatusNode: HTMLElement;
private readonly cloudSketchbookTreeWidget: CloudSketchbookTreeWidget;
private _session: AuthenticationSession | undefined;
constructor() {
super();
this.compositeNode = document.createElement('div');
this.compositeNode.classList.add('composite-node');
this.cloudUserStatusNode = document.createElement('div');
this.cloudUserStatusNode.classList.add('cloud-status-node');
this.compositeNode.appendChild(this.cloudUserStatusNode);
this.node.appendChild(this.compositeNode);
this.id = 'cloud-sketchbook-composite-widget';
this.title.caption = nls.localize(
'arduino/cloud/remoteSketchbook',
'Remote Sketchbook'
);
this.title.iconClass = 'cloud-sketchbook-tree-icon';
this.title.closable = false;
this.id = 'cloud-sketchbook-composite-widget';
}
public getTreeWidget(): CloudSketchbookTreeWidget {
@postConstruct()
protected init(): void {
this.toDispose.push(
this.authenticationService.onSessionDidChange((session) => {
const oldSession = this._session;
this._session = session;
if (!!oldSession !== !!this._session) {
this.updateFooter();
}
})
);
}
get treeWidget(): CloudSketchbookTreeWidget {
return this.cloudSketchbookTreeWidget;
}
protected override onAfterAttach(message: Message): void {
super.onAfterAttach(message);
Widget.attach(this.cloudSketchbookTreeWidget, this.compositeNode);
protected renderFooter(footerNode: HTMLElement): void {
ReactDOM.render(
<UserStatus
model={this.cloudSketchbookTreeWidget.model as CloudSketchbookTreeModel}
authenticationService={this.authenticationService}
/>,
this.cloudUserStatusNode
);
this.toDisposeOnDetach.push(
Disposable.create(() => Widget.detach(this.cloudSketchbookTreeWidget))
<>
{this._session && (
<CreateNew
label={nls.localize(
'arduino/sketchbook/newRemoteSketch',
'New Remote Sketch'
)}
onClick={this.onDidClickCreateNew}
/>
)}
<UserStatus
model={
this.cloudSketchbookTreeWidget.model as CloudSketchbookTreeModel
}
authenticationService={this.authenticationService}
/>
</>,
footerNode
);
}
protected override onActivateRequest(msg: Message): void {
super.onActivateRequest(msg);
/*
Sending a resize message is needed because otherwise the cloudSketchbookTreeWidget
would render empty
*/
this.onResize(Widget.ResizeMessage.UnknownSize);
}
protected override onResize(message: Widget.ResizeMessage): void {
super.onResize(message);
MessageLoop.sendMessage(
this.cloudSketchbookTreeWidget,
Widget.ResizeMessage.UnknownSize
);
}
private onDidClickCreateNew: () => void = () => {
this.commandService.executeCommand('arduino-new-cloud-sketch');
};
}

View File

@@ -1,20 +1,26 @@
import { inject, injectable, postConstruct } from '@theia/core/shared/inversify';
import { TreeNode } from '@theia/core/lib/browser/tree';
import {
inject,
injectable,
postConstruct,
} from '@theia/core/shared/inversify';
import { CompositeTreeNode, TreeNode } from '@theia/core/lib/browser/tree';
import { posixSegments, splitSketchPath } from '../../create/create-paths';
import { CreateApi } from '../../create/create-api';
import { CloudSketchbookTree } from './cloud-sketchbook-tree';
import { AuthenticationClientService } from '../../auth/authentication-client-service';
import { SketchbookTreeModel } from '../sketchbook/sketchbook-tree-model';
import { ArduinoPreferences } from '../../arduino-preferences';
import { WorkspaceNode } from '@theia/navigator/lib/browser/navigator-tree';
import { CreateUri } from '../../create/create-uri';
import { FileStat } from '@theia/filesystem/lib/common/files';
import { LocalCacheFsProvider } from '../../local-cache/local-cache-fs-provider';
import { FileService } from '@theia/filesystem/lib/browser/file-service';
import { FileChangesEvent, FileStat } from '@theia/filesystem/lib/common/files';
import {
LocalCacheFsProvider,
LocalCacheUri,
} from '../../local-cache/local-cache-fs-provider';
import URI from '@theia/core/lib/common/uri';
import { SketchCache } from './cloud-sketch-cache';
import { Create } from '../../create/typings';
import { nls } from '@theia/core/lib/common';
import { nls } from '@theia/core/lib/common/nls';
import { Deferred } from '@theia/core/lib/common/promise-util';
export function sketchBaseDir(sketch: Create.Sketch): FileStat {
// extract the sketch path
@@ -52,26 +58,16 @@ export function sketchesToFileStats(sketches: Create.Sketch[]): FileStat[] {
@injectable()
export class CloudSketchbookTreeModel extends SketchbookTreeModel {
@inject(FileService)
protected override readonly fileService: FileService;
@inject(AuthenticationClientService)
protected readonly authenticationService: AuthenticationClientService;
@inject(CreateApi)
protected readonly createApi: CreateApi;
@inject(CloudSketchbookTree)
protected readonly cloudSketchbookTree: CloudSketchbookTree;
@inject(ArduinoPreferences)
protected override readonly arduinoPreferences: ArduinoPreferences;
private readonly createApi: CreateApi;
@inject(AuthenticationClientService)
private readonly authenticationService: AuthenticationClientService;
@inject(LocalCacheFsProvider)
protected readonly localCacheFsProvider: LocalCacheFsProvider;
private readonly localCacheFsProvider: LocalCacheFsProvider;
@inject(SketchCache)
protected readonly sketchCache: SketchCache;
private readonly sketchCache: SketchCache;
private _localCacheFsProviderReady: Deferred<void> | undefined;
@postConstruct()
protected override init(): void {
@@ -81,6 +77,50 @@ export class CloudSketchbookTreeModel extends SketchbookTreeModel {
);
}
override *getNodesByUri(uri: URI): IterableIterator<TreeNode> {
if (uri.scheme === LocalCacheUri.scheme) {
const workspace = this.root;
const { session } = this.authenticationService;
if (session && WorkspaceNode.is(workspace)) {
const currentUri = this.localCacheFsProvider.to(uri);
if (currentUri) {
const rootPath = this.localCacheFsProvider
.toUri(session)
.path.toString();
const currentPath = currentUri.path.toString();
if (rootPath === currentPath) {
return workspace;
}
if (currentPath.startsWith(rootPath)) {
const id = currentPath.substring(rootPath.length);
const node = this.getNode(id);
if (node) {
yield node;
}
}
}
}
}
}
protected override isRootAffected(changes: FileChangesEvent): boolean {
return changes.changes
.map(({ resource }) => resource)
.some(
(uri) => uri.parent.toString().startsWith(LocalCacheUri.root.toString()) // all files under the root might affect the tree
);
}
override async refresh(
parent?: Readonly<CompositeTreeNode>
): Promise<CompositeTreeNode | undefined> {
if (parent) {
return super.refresh(parent);
}
await this.updateRoot();
return super.refresh();
}
override async createRoot(): Promise<TreeNode | undefined> {
const { session } = this.authenticationService;
if (!session) {
@@ -89,7 +129,10 @@ export class CloudSketchbookTreeModel extends SketchbookTreeModel {
}
this.createApi.init(this.authenticationService, this.arduinoPreferences);
this.sketchCache.init();
const sketches = await this.createApi.sketches();
const [sketches] = await Promise.all([
this.createApi.sketches(),
this.ensureLocalFsProviderReady(),
]);
const rootFileStats = sketchesToFileStats(sketches);
if (this.workspaceService.opened) {
const workspaceNode = WorkspaceNode.createRoot(
@@ -108,7 +151,9 @@ export class CloudSketchbookTreeModel extends SketchbookTreeModel {
return this.tree as CloudSketchbookTree;
}
protected override recursivelyFindSketchRoot(node: TreeNode): any {
protected override recursivelyFindSketchRoot(
node: TreeNode
): TreeNode | false {
if (node && CloudSketchbookTree.CloudSketchDirNode.is(node)) {
return node;
}
@@ -122,13 +167,25 @@ export class CloudSketchbookTreeModel extends SketchbookTreeModel {
}
override async revealFile(uri: URI): Promise<TreeNode | undefined> {
await this.localCacheFsProvider.ready.promise;
// we use remote uris as keys for the tree
// convert local URIs
const remoteuri = this.localCacheFsProvider.from(uri);
if (remoteuri) {
return super.revealFile(remoteuri);
const remoteUri = this.localCacheFsProvider.from(uri);
if (remoteUri) {
return super.revealFile(remoteUri);
} else {
return super.revealFile(uri);
}
}
private async ensureLocalFsProviderReady(): Promise<void> {
if (this._localCacheFsProviderReady) {
return this._localCacheFsProviderReady.promise;
}
this._localCacheFsProviderReady = new Deferred();
this.fileService
.access(LocalCacheUri.root)
.then(() => this._localCacheFsProviderReady?.resolve());
return this._localCacheFsProviderReady.promise;
}
}

View File

@@ -1,5 +1,5 @@
import * as React from '@theia/core/shared/react';
import { inject, injectable, postConstruct } from '@theia/core/shared/inversify';
import { inject, injectable } from '@theia/core/shared/inversify';
import { TreeModel } from '@theia/core/lib/browser/tree/tree-model';
import { CloudSketchbookTreeModel } from './cloud-sketchbook-tree-model';
import { AuthenticationClientService } from '../../auth/authentication-client-service';
@@ -27,12 +27,6 @@ export class CloudSketchbookTreeWidget extends SketchbookTreeWidget {
@inject(CloudSketchbookTree)
protected readonly cloudSketchbookTree: CloudSketchbookTree;
@postConstruct()
protected override async init(): Promise<void> {
await super.init();
this.addClass('tree-container'); // Adds `height: 100%` to the tree. Otherwise you cannot see it.
}
protected override renderTree(model: TreeModel): React.ReactNode {
if (this.shouldShowWelcomeView()) return this.renderViewWelcome();
if (this.shouldShowEmptyView()) return this.renderEmptyView();

View File

@@ -136,7 +136,7 @@ export class CloudSketchbookTree extends SketchbookTree {
return;
}
}
this.runWithState(node, 'pulling', async (node) => {
return this.runWithState(node, 'pulling', async (node) => {
const commandsCopy = node.commands;
node.commands = [];
@@ -196,7 +196,7 @@ export class CloudSketchbookTree extends SketchbookTree {
return;
}
}
this.runWithState(node, 'pushing', async (node) => {
return this.runWithState(node, 'pushing', async (node) => {
if (!CloudSketchbookTree.CloudSketchTreeNode.isSynced(node)) {
throw new Error(
nls.localize(
@@ -269,7 +269,7 @@ export class CloudSketchbookTree extends SketchbookTree {
return prev;
}
// do not map "do_not_sync" files/directoris and their descendants
// do not map "do_not_sync" files/directories and their descendants
const segments = path[1].split(posix.sep) || [];
if (
segments.some((segment) => Create.do_not_sync_files.includes(segment))

View File

@@ -2,6 +2,7 @@ import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'
import { CloudSketchbookCompositeWidget } from './cloud-sketchbook-composite-widget';
import { SketchbookWidget } from '../sketchbook/sketchbook-widget';
import { ArduinoPreferences } from '../../arduino-preferences';
import { BaseSketchbookCompositeWidget } from '../sketchbook/sketchbook-composite-widget';
@injectable()
export class CloudSketchbookWidget extends SketchbookWidget {
@@ -19,8 +20,8 @@ export class CloudSketchbookWidget extends SketchbookWidget {
override getTreeWidget(): any {
const widget: any = this.sketchbookTreesContainer.selectedWidgets().next();
if (widget && typeof widget.getTreeWidget !== 'undefined') {
return (widget as CloudSketchbookCompositeWidget).getTreeWidget();
if (widget instanceof BaseSketchbookCompositeWidget) {
return widget.treeWidget;
}
return widget;
}
@@ -30,7 +31,7 @@ export class CloudSketchbookWidget extends SketchbookWidget {
this.sketchbookTreesContainer.activateWidget(this.widget);
} else {
this.sketchbookTreesContainer.activateWidget(
this.localSketchbookTreeWidget
this.sketchbookCompositeWidget
);
}
this.setDocumentMode();

View File

@@ -0,0 +1,20 @@
import * as React from '@theia/core/shared/react';
export class CreateNew extends React.Component<CreateNew.Props> {
override render(): React.ReactNode {
return (
<div className="create-new">
<button className="theia-button secondary" onClick={this.props.onClick}>
{this.props.label}
</button>
</div>
);
}
}
export namespace CreateNew {
export interface Props {
readonly label: string;
readonly onClick: () => void;
}
}

View File

@@ -0,0 +1,93 @@
import * as React from '@theia/core/shared/react';
import * as ReactDOM from '@theia/core/shared/react-dom';
import { inject, injectable } from '@theia/core/shared/inversify';
import { nls } from '@theia/core/lib/common/nls';
import { Widget } from '@theia/core/shared/@phosphor/widgets';
import { Message, MessageLoop } from '@theia/core/shared/@phosphor/messaging';
import { Disposable } from '@theia/core/lib/common/disposable';
import { BaseWidget } from '@theia/core/lib/browser/widgets/widget';
import { CommandService } from '@theia/core/lib/common/command';
import { SketchbookTreeWidget } from './sketchbook-tree-widget';
import { CreateNew } from '../sketchbook/create-new';
@injectable()
export abstract class BaseSketchbookCompositeWidget<
TW extends SketchbookTreeWidget
> extends BaseWidget {
@inject(CommandService)
protected readonly commandService: CommandService;
private readonly compositeNode: HTMLElement;
private readonly footerNode: HTMLElement;
constructor() {
super();
this.compositeNode = document.createElement('div');
this.compositeNode.classList.add('composite-node');
this.footerNode = document.createElement('div');
this.footerNode.classList.add('footer-node');
this.compositeNode.appendChild(this.footerNode);
this.node.appendChild(this.compositeNode);
this.title.closable = false;
}
abstract get treeWidget(): TW;
protected abstract renderFooter(footerNode: HTMLElement): void;
protected updateFooter(): void {
this.renderFooter(this.footerNode);
}
protected override onAfterAttach(message: Message): void {
super.onAfterAttach(message);
Widget.attach(this.treeWidget, this.compositeNode);
this.renderFooter(this.footerNode);
this.toDisposeOnDetach.push(
Disposable.create(() => Widget.detach(this.treeWidget))
);
}
protected override onActivateRequest(message: Message): void {
super.onActivateRequest(message);
// Sending a resize message is needed because otherwise the tree widget would render empty
this.onResize(Widget.ResizeMessage.UnknownSize);
}
protected override onResize(message: Widget.ResizeMessage): void {
super.onResize(message);
MessageLoop.sendMessage(this.treeWidget, Widget.ResizeMessage.UnknownSize);
}
}
@injectable()
export class SketchbookCompositeWidget extends BaseSketchbookCompositeWidget<SketchbookTreeWidget> {
@inject(SketchbookTreeWidget)
private readonly sketchbookTreeWidget: SketchbookTreeWidget;
constructor() {
super();
this.id = 'sketchbook-composite-widget';
this.title.caption = nls.localize(
'arduino/sketch/titleLocalSketchbook',
'Local Sketchbook'
);
this.title.iconClass = 'sketchbook-tree-icon';
}
get treeWidget(): SketchbookTreeWidget {
return this.sketchbookTreeWidget;
}
protected renderFooter(footerNode: HTMLElement): void {
ReactDOM.render(
<CreateNew
label={nls.localize('arduino/sketchbook/newSketch', 'New Sketch')}
onClick={this.onDidClickCreateNew}
/>,
footerNode
);
}
private onDidClickCreateNew: () => void = () => {
this.commandService.executeCommand('arduino-new-sketch');
};
}

View File

@@ -59,6 +59,7 @@ export class SketchbookTreeWidget extends FileTreeWidget {
'Local Sketchbook'
);
this.title.closable = false;
this.addClass('tree-container'); // Adds `height: 100%` to the tree. Otherwise you cannot see it.
}
@postConstruct()

View File

@@ -11,15 +11,21 @@ import { Disposable } from '@theia/core/lib/common/disposable';
import { BaseWidget } from '@theia/core/lib/browser/widgets/widget';
import { SketchbookTreeWidget } from './sketchbook-tree-widget';
import { nls } from '@theia/core/lib/common';
import { CloudSketchbookCompositeWidget } from '../cloud-sketchbook/cloud-sketchbook-composite-widget';
import { URI } from '../../contributions/contribution';
import {
BaseSketchbookCompositeWidget,
SketchbookCompositeWidget,
} from './sketchbook-composite-widget';
@injectable()
export class SketchbookWidget extends BaseWidget {
static LABEL = nls.localize('arduino/sketch/titleSketchbook', 'Sketchbook');
static readonly LABEL = nls.localize(
'arduino/sketch/titleSketchbook',
'Sketchbook'
);
@inject(SketchbookTreeWidget)
protected readonly localSketchbookTreeWidget: SketchbookTreeWidget;
@inject(SketchbookCompositeWidget)
protected readonly sketchbookCompositeWidget: SketchbookCompositeWidget;
protected readonly sketchbookTreesContainer: DockPanel;
@@ -36,7 +42,7 @@ export class SketchbookWidget extends BaseWidget {
@postConstruct()
protected init(): void {
this.sketchbookTreesContainer.addWidget(this.localSketchbookTreeWidget);
this.sketchbookTreesContainer.addWidget(this.sketchbookCompositeWidget);
}
protected override onAfterAttach(message: Message): void {
@@ -48,7 +54,7 @@ export class SketchbookWidget extends BaseWidget {
}
getTreeWidget(): SketchbookTreeWidget {
return this.localSketchbookTreeWidget;
return this.sketchbookCompositeWidget.treeWidget;
}
activeTreeWidgetId(): string | undefined {
@@ -80,8 +86,8 @@ export class SketchbookWidget extends BaseWidget {
if (widget instanceof SketchbookTreeWidget) {
return widget;
}
if (widget instanceof CloudSketchbookCompositeWidget) {
return widget.getTreeWidget();
if (widget instanceof BaseSketchbookCompositeWidget) {
return widget.treeWidget;
}
return undefined;
};

View File

@@ -37,6 +37,8 @@ export interface MonitorManagerProxyClient {
isWSConnected(): Promise<boolean>;
startMonitor(settings?: PluggableMonitorSettings): Promise<void>;
getCurrentSettings(board: Board, port: Port): Promise<MonitorSettings>;
setMonitorWidgetStatus(value: boolean): void;
getMonitorWidgetStatus(): boolean;
send(message: string): void;
changeSettings(settings: MonitorSettings): void;
}

View File

@@ -2,8 +2,10 @@ import { inject, injectable } from '@theia/core/shared/inversify';
import * as remote from '@theia/core/electron-shared/@electron/remote';
import { isOSX } from '@theia/core/lib/common/os';
import {
ActionMenuNode,
CompositeMenuNode,
MAIN_MENU_BAR,
MenuNode,
MenuPath,
} from '@theia/core/lib/common/menu';
import {
@@ -134,7 +136,7 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory {
}
protected override handleElectronDefault(
menuNode: CompositeMenuNode,
menuNode: MenuNode,
args: any[] = [],
options?: ElectronMenuOptions
): Electron.MenuItemConstructorOptions[] {
@@ -149,4 +151,119 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory {
}
return [];
}
// Copied from 1.25.0 Theia as is to customize the enablement of the menu items.
// Source: https://github.com/eclipse-theia/theia/blob/ca417a31e402bd35717d3314bf6254049d1dae44/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts#L125-L220
// See https://github.com/arduino/arduino-ide/issues/1533
protected override fillMenuTemplate(
items: Electron.MenuItemConstructorOptions[],
menuModel: CompositeMenuNode,
args: any[] = [],
options?: ElectronMenuOptions
): Electron.MenuItemConstructorOptions[] {
const showDisabled =
options?.showDisabled === undefined ? true : options?.showDisabled;
for (const menu of menuModel.children) {
if (menu instanceof CompositeMenuNode) {
if (menu.children.length > 0) {
// do not render empty nodes
if (menu.isSubmenu) {
// submenu node
const submenu = this.fillMenuTemplate([], menu, args, options);
if (submenu.length === 0) {
continue;
}
items.push({
label: menu.label,
submenu,
});
} else {
// group node
// process children
const submenu = this.fillMenuTemplate([], menu, args, options);
if (submenu.length === 0) {
continue;
}
if (items.length > 0) {
// do not put a separator above the first group
items.push({
type: 'separator',
});
}
// render children
items.push(...submenu);
}
}
} else if (menu instanceof ActionMenuNode) {
const node =
menu.altNode && this.context.altPressed ? menu.altNode : menu;
const commandId = node.action.commandId;
// That is only a sanity check at application startup.
if (!this.commandRegistry.getCommand(commandId)) {
console.debug(
`Skipping menu item with missing command: "${commandId}".`
);
continue;
}
if (
!this.commandRegistry.isVisible(commandId, ...args) ||
(!!node.action.when &&
!this.contextKeyService.match(node.action.when))
) {
continue;
}
// We should omit rendering context-menu items which are disabled.
if (
!showDisabled &&
!this.commandRegistry.isEnabled(commandId, ...args)
) {
continue;
}
const bindings =
this.keybindingRegistry.getKeybindingsForCommand(commandId);
const accelerator = bindings[0] && this.acceleratorFor(bindings[0]);
const menuItem: Electron.MenuItemConstructorOptions = {
id: node.id,
label: node.label,
type: this.commandRegistry.getToggledHandler(commandId, ...args)
? 'checkbox'
: 'normal',
checked: this.commandRegistry.isToggled(commandId, ...args),
enabled: this.commandRegistry.isEnabled(commandId, ...args), // Unlike Theia https://github.com/eclipse-theia/theia/blob/ca417a31e402bd35717d3314bf6254049d1dae44/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts#L197
visible: true,
accelerator,
click: () => this.execute(commandId, args),
};
if (isOSX) {
const role = this.roleFor(node.id);
if (role) {
menuItem.role = role;
delete menuItem.click;
}
}
items.push(menuItem);
if (this.commandRegistry.getToggledHandler(commandId, ...args)) {
this._toggledCommands.add(commandId);
}
} else {
items.push(...this.handleElectronDefault(menu, args, options));
}
}
return items;
}
}

View File

@@ -9,7 +9,7 @@ import {
import { fork } from 'child_process';
import { AddressInfo } from 'net';
import { join, isAbsolute, resolve } from 'path';
import { promises as fs, Stats } from 'fs';
import { promises as fs } from 'fs';
import { MaybePromise } from '@theia/core/lib/common/types';
import { ElectronSecurityToken } from '@theia/core/lib/electron-common/electron-token';
import { FrontendApplicationConfig } from '@theia/application-package/lib/application-props';
@@ -27,7 +27,8 @@ import {
CLOSE_PLOTTER_WINDOW,
SHOW_PLOTTER_WINDOW,
} from '../../common/ipc-communication';
import isValidPath = require('is-valid-path');
import { ErrnoException } from '../../node/utils/errors';
import { isAccessibleSketchPath } from '../../node/sketches-service-impl';
app.commandLine.appendSwitch('disable-http-cache');
@@ -145,7 +146,10 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
event.preventDefault();
const resolvedPath = await this.resolvePath(path, cwd);
if (resolvedPath) {
const sketchFolderPath = await this.isValidSketchPath(resolvedPath);
const sketchFolderPath = await isAccessibleSketchPath(
resolvedPath,
true
);
if (sketchFolderPath) {
this.openFilePromise.reject(new InterruptWorkspaceRestoreError());
await this.openSketch(sketchFolderPath);
@@ -158,56 +162,10 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
}
}
/**
* The `path` argument is valid, if accessible and either pointing to a `.ino` file,
* or it's a directory, and one of the files in the directory is an `.ino` file.
*
* If `undefined`, `path` was pointing to neither an accessible sketch file nor a sketch folder.
*
* The sketch folder name and sketch file name can be different. This method is not sketch folder name compliant.
* The `path` must be an absolute, resolved path.
*/
private async isValidSketchPath(path: string): Promise<string | undefined> {
let stats: Stats | undefined = undefined;
try {
stats = await fs.stat(path);
} catch (err) {
if ('code' in err && err.code === 'ENOENT') {
return undefined;
}
throw err;
}
if (!stats) {
return undefined;
}
if (stats.isFile() && path.endsWith('.ino')) {
return path;
}
try {
const entries = await fs.readdir(path, { withFileTypes: true });
const sketchFilename = entries
.filter((entry) => entry.isFile() && entry.name.endsWith('.ino'))
.map(({ name }) => name)
.sort((left, right) => left.localeCompare(right))[0];
if (sketchFilename) {
return join(path, sketchFilename);
}
// If no sketches found in the folder, but the folder exists,
// return with the path of the empty folder and let IDE2's frontend
// figure out the workspace root.
return path;
} catch (err) {
throw err;
}
}
private async resolvePath(
maybePath: string,
cwd: string
): Promise<string | undefined> {
if (!isValidPath(maybePath)) {
return undefined;
}
if (isAbsolute(maybePath)) {
return maybePath;
}
@@ -215,7 +173,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
const resolved = await fs.realpath(resolve(cwd, maybePath));
return resolved;
} catch (err) {
if ('code' in err && err.code === 'ENOENT') {
if (ErrnoException.isENOENT(err)) {
return undefined;
}
throw err;
@@ -256,7 +214,10 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
if (!resolvedPath) {
continue;
}
const sketchFolderPath = await this.isValidSketchPath(resolvedPath);
const sketchFolderPath = await isAccessibleSketchPath(
resolvedPath,
true
);
if (sketchFolderPath) {
workspace.file = sketchFolderPath;
if (this.isTempSketch.is(workspace.file)) {
@@ -287,7 +248,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
if (!resolvedPath) {
continue;
}
const sketchFolderPath = await this.isValidSketchPath(resolvedPath);
const sketchFolderPath = await isAccessibleSketchPath(resolvedPath, true);
if (sketchFolderPath) {
path = sketchFolderPath;
break;
@@ -355,10 +316,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
argv: string[],
cwd: string
): Promise<void> {
if (
!os.isOSX &&
(await this.launchFromArgs({ cwd, argv, secondInstance: true }))
) {
if (await this.launchFromArgs({ cwd, argv, secondInstance: true })) {
// Application has received a file in its arguments
return;
}

View File

@@ -16,6 +16,7 @@ import { BackendApplicationContribution } from '@theia/core/lib/node/backend-app
import { ArduinoDaemon, NotificationServiceServer } from '../common/protocol';
import { CLI_CONFIG } from './cli-config';
import { getExecPath, spawnCommand } from './exec-util';
import { ErrnoException } from './utils/errors';
@injectable()
export class ArduinoDaemonImpl
@@ -184,7 +185,7 @@ export class ArduinoDaemonImpl
}
return false;
} catch (error) {
if ('code' in error && error.code === 'ENOENT') {
if (ErrnoException.isENOENT(error)) {
return false;
}
throw error;

View File

@@ -22,9 +22,6 @@ interface IArduinoCoreServiceService extends grpc.ServiceDefinition<grpc.Untyped
destroy: IArduinoCoreServiceService_IDestroy;
updateIndex: IArduinoCoreServiceService_IUpdateIndex;
updateLibrariesIndex: IArduinoCoreServiceService_IUpdateLibrariesIndex;
updateCoreLibrariesIndex: IArduinoCoreServiceService_IUpdateCoreLibrariesIndex;
outdated: IArduinoCoreServiceService_IOutdated;
upgrade: IArduinoCoreServiceService_IUpgrade;
version: IArduinoCoreServiceService_IVersion;
newSketch: IArduinoCoreServiceService_INewSketch;
loadSketch: IArduinoCoreServiceService_ILoadSketch;
@@ -106,33 +103,6 @@ interface IArduinoCoreServiceService_IUpdateLibrariesIndex extends grpc.MethodDe
responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>;
responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>;
}
interface IArduinoCoreServiceService_IUpdateCoreLibrariesIndex extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse> {
path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/UpdateCoreLibrariesIndex";
requestStream: false;
responseStream: true;
requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest>;
requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest>;
responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>;
responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>;
}
interface IArduinoCoreServiceService_IOutdated extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse> {
path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/Outdated";
requestStream: false;
responseStream: false;
requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest>;
requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest>;
responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse>;
responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse>;
}
interface IArduinoCoreServiceService_IUpgrade extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse> {
path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/Upgrade";
requestStream: false;
responseStream: true;
requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest>;
requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest>;
responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>;
responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>;
}
interface IArduinoCoreServiceService_IVersion extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.VersionRequest, cc_arduino_cli_commands_v1_commands_pb.VersionResponse> {
path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/Version";
requestStream: false;
@@ -448,9 +418,6 @@ export interface IArduinoCoreServiceServer {
destroy: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.DestroyRequest, cc_arduino_cli_commands_v1_commands_pb.DestroyResponse>;
updateIndex: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_commands_pb.UpdateIndexRequest, cc_arduino_cli_commands_v1_commands_pb.UpdateIndexResponse>;
updateLibrariesIndex: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>;
updateCoreLibrariesIndex: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>;
outdated: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse>;
upgrade: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>;
version: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.VersionRequest, cc_arduino_cli_commands_v1_commands_pb.VersionResponse>;
newSketch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.NewSketchRequest, cc_arduino_cli_commands_v1_commands_pb.NewSketchResponse>;
loadSketch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.LoadSketchRequest, cc_arduino_cli_commands_v1_commands_pb.LoadSketchResponse>;
@@ -500,13 +467,6 @@ export interface IArduinoCoreServiceClient {
updateIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateIndexRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateIndexResponse>;
updateLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>;
updateLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>;
updateCoreLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>;
updateCoreLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>;
outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall;
outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall;
outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall;
upgrade(request: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>;
upgrade(request: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>;
version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall;
version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall;
version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall;
@@ -609,13 +569,6 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor
public updateIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateIndexRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateIndexResponse>;
public updateLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>;
public updateLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse>;
public updateCoreLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>;
public updateCoreLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse>;
public outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall;
public outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall;
public outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall;
public upgrade(request: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>;
public upgrade(request: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse>;
public version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall;
public version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall;
public version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall;

View File

@@ -599,28 +599,6 @@ function deserialize_cc_arduino_cli_commands_v1_NewSketchResponse(buffer_arg) {
return cc_arduino_cli_commands_v1_commands_pb.NewSketchResponse.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_cc_arduino_cli_commands_v1_OutdatedRequest(arg) {
if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest)) {
throw new Error('Expected argument of type cc.arduino.cli.commands.v1.OutdatedRequest');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_cc_arduino_cli_commands_v1_OutdatedRequest(buffer_arg) {
return cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_cc_arduino_cli_commands_v1_OutdatedResponse(arg) {
if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse)) {
throw new Error('Expected argument of type cc.arduino.cli.commands.v1.OutdatedResponse');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_cc_arduino_cli_commands_v1_OutdatedResponse(buffer_arg) {
return cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_cc_arduino_cli_commands_v1_PlatformDownloadRequest(arg) {
if (!(arg instanceof cc_arduino_cli_commands_v1_core_pb.PlatformDownloadRequest)) {
throw new Error('Expected argument of type cc.arduino.cli.commands.v1.PlatformDownloadRequest');
@@ -775,28 +753,6 @@ function deserialize_cc_arduino_cli_commands_v1_SupportedUserFieldsResponse(buff
return cc_arduino_cli_commands_v1_upload_pb.SupportedUserFieldsResponse.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexRequest(arg) {
if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest)) {
throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexRequest(buffer_arg) {
return cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexResponse(arg) {
if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse)) {
throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexResponse(buffer_arg) {
return cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_cc_arduino_cli_commands_v1_UpdateIndexRequest(arg) {
if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpdateIndexRequest)) {
throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpdateIndexRequest');
@@ -841,28 +797,6 @@ function deserialize_cc_arduino_cli_commands_v1_UpdateLibrariesIndexResponse(buf
return cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_cc_arduino_cli_commands_v1_UpgradeRequest(arg) {
if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest)) {
throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpgradeRequest');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_cc_arduino_cli_commands_v1_UpgradeRequest(buffer_arg) {
return cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_cc_arduino_cli_commands_v1_UpgradeResponse(arg) {
if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse)) {
throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpgradeResponse');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_cc_arduino_cli_commands_v1_UpgradeResponse(buffer_arg) {
return cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_cc_arduino_cli_commands_v1_UploadRequest(arg) {
if (!(arg instanceof cc_arduino_cli_commands_v1_upload_pb.UploadRequest)) {
throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UploadRequest');
@@ -1015,42 +949,6 @@ updateLibrariesIndex: {
responseSerialize: serialize_cc_arduino_cli_commands_v1_UpdateLibrariesIndexResponse,
responseDeserialize: deserialize_cc_arduino_cli_commands_v1_UpdateLibrariesIndexResponse,
},
// Update packages indexes for both Cores and Libraries
updateCoreLibrariesIndex: {
path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/UpdateCoreLibrariesIndex',
requestStream: false,
responseStream: true,
requestType: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest,
responseType: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse,
requestSerialize: serialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexRequest,
requestDeserialize: deserialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexRequest,
responseSerialize: serialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexResponse,
responseDeserialize: deserialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexResponse,
},
// Outdated returns a message with a list of outdated Cores and Libraries
outdated: {
path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Outdated',
requestStream: false,
responseStream: false,
requestType: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest,
responseType: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse,
requestSerialize: serialize_cc_arduino_cli_commands_v1_OutdatedRequest,
requestDeserialize: deserialize_cc_arduino_cli_commands_v1_OutdatedRequest,
responseSerialize: serialize_cc_arduino_cli_commands_v1_OutdatedResponse,
responseDeserialize: deserialize_cc_arduino_cli_commands_v1_OutdatedResponse,
},
// Upgrade both Cores and Libraries
upgrade: {
path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Upgrade',
requestStream: false,
responseStream: true,
requestType: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest,
responseType: cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse,
requestSerialize: serialize_cc_arduino_cli_commands_v1_UpgradeRequest,
requestDeserialize: deserialize_cc_arduino_cli_commands_v1_UpgradeRequest,
responseSerialize: serialize_cc_arduino_cli_commands_v1_UpgradeResponse,
responseDeserialize: deserialize_cc_arduino_cli_commands_v1_UpgradeResponse,
},
// Get the version of Arduino CLI in use.
version: {
path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Version',

View File

@@ -313,166 +313,6 @@ export namespace UpdateLibrariesIndexResponse {
}
}
export class UpdateCoreLibrariesIndexRequest extends jspb.Message {
hasInstance(): boolean;
clearInstance(): void;
getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined;
setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): UpdateCoreLibrariesIndexRequest;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): UpdateCoreLibrariesIndexRequest.AsObject;
static toObject(includeInstance: boolean, msg: UpdateCoreLibrariesIndexRequest): UpdateCoreLibrariesIndexRequest.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: UpdateCoreLibrariesIndexRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): UpdateCoreLibrariesIndexRequest;
static deserializeBinaryFromReader(message: UpdateCoreLibrariesIndexRequest, reader: jspb.BinaryReader): UpdateCoreLibrariesIndexRequest;
}
export namespace UpdateCoreLibrariesIndexRequest {
export type AsObject = {
instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject,
}
}
export class UpdateCoreLibrariesIndexResponse extends jspb.Message {
hasDownloadProgress(): boolean;
clearDownloadProgress(): void;
getDownloadProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined;
setDownloadProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): UpdateCoreLibrariesIndexResponse;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): UpdateCoreLibrariesIndexResponse.AsObject;
static toObject(includeInstance: boolean, msg: UpdateCoreLibrariesIndexResponse): UpdateCoreLibrariesIndexResponse.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: UpdateCoreLibrariesIndexResponse, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): UpdateCoreLibrariesIndexResponse;
static deserializeBinaryFromReader(message: UpdateCoreLibrariesIndexResponse, reader: jspb.BinaryReader): UpdateCoreLibrariesIndexResponse;
}
export namespace UpdateCoreLibrariesIndexResponse {
export type AsObject = {
downloadProgress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject,
}
}
export class OutdatedRequest extends jspb.Message {
hasInstance(): boolean;
clearInstance(): void;
getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined;
setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): OutdatedRequest;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): OutdatedRequest.AsObject;
static toObject(includeInstance: boolean, msg: OutdatedRequest): OutdatedRequest.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: OutdatedRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): OutdatedRequest;
static deserializeBinaryFromReader(message: OutdatedRequest, reader: jspb.BinaryReader): OutdatedRequest;
}
export namespace OutdatedRequest {
export type AsObject = {
instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject,
}
}
export class OutdatedResponse extends jspb.Message {
clearOutdatedLibrariesList(): void;
getOutdatedLibrariesList(): Array<cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary>;
setOutdatedLibrariesList(value: Array<cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary>): OutdatedResponse;
addOutdatedLibraries(value?: cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary, index?: number): cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary;
clearOutdatedPlatformsList(): void;
getOutdatedPlatformsList(): Array<cc_arduino_cli_commands_v1_common_pb.Platform>;
setOutdatedPlatformsList(value: Array<cc_arduino_cli_commands_v1_common_pb.Platform>): OutdatedResponse;
addOutdatedPlatforms(value?: cc_arduino_cli_commands_v1_common_pb.Platform, index?: number): cc_arduino_cli_commands_v1_common_pb.Platform;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): OutdatedResponse.AsObject;
static toObject(includeInstance: boolean, msg: OutdatedResponse): OutdatedResponse.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: OutdatedResponse, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): OutdatedResponse;
static deserializeBinaryFromReader(message: OutdatedResponse, reader: jspb.BinaryReader): OutdatedResponse;
}
export namespace OutdatedResponse {
export type AsObject = {
outdatedLibrariesList: Array<cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary.AsObject>,
outdatedPlatformsList: Array<cc_arduino_cli_commands_v1_common_pb.Platform.AsObject>,
}
}
export class UpgradeRequest extends jspb.Message {
hasInstance(): boolean;
clearInstance(): void;
getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined;
setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): UpgradeRequest;
getSkipPostInstall(): boolean;
setSkipPostInstall(value: boolean): UpgradeRequest;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): UpgradeRequest.AsObject;
static toObject(includeInstance: boolean, msg: UpgradeRequest): UpgradeRequest.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: UpgradeRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): UpgradeRequest;
static deserializeBinaryFromReader(message: UpgradeRequest, reader: jspb.BinaryReader): UpgradeRequest;
}
export namespace UpgradeRequest {
export type AsObject = {
instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject,
skipPostInstall: boolean,
}
}
export class UpgradeResponse extends jspb.Message {
hasProgress(): boolean;
clearProgress(): void;
getProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined;
setProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): UpgradeResponse;
hasTaskProgress(): boolean;
clearTaskProgress(): void;
getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined;
setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): UpgradeResponse;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): UpgradeResponse.AsObject;
static toObject(includeInstance: boolean, msg: UpgradeResponse): UpgradeResponse.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: UpgradeResponse, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): UpgradeResponse;
static deserializeBinaryFromReader(message: UpgradeResponse, reader: jspb.BinaryReader): UpgradeResponse;
}
export namespace UpgradeResponse {
export type AsObject = {
progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject,
taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject,
}
}
export class VersionRequest extends jspb.Message {
serializeBinary(): Uint8Array;

View File

@@ -807,6 +807,9 @@ export class Library extends jspb.Message {
getCompatibleWithMap(): jspb.Map<string, boolean>;
clearCompatibleWithMap(): void;
getInDevelopment(): boolean;
setInDevelopment(value: boolean): Library;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): Library.AsObject;
@@ -847,6 +850,7 @@ export namespace Library {
providesIncludesList: Array<string>,
compatibleWithMap: Array<[string, boolean]>,
inDevelopment: boolean,
}
}

View File

@@ -5458,7 +5458,8 @@ proto.cc.arduino.cli.commands.v1.Library.toObject = function(includeInstance, ms
layout: jspb.Message.getFieldWithDefault(msg, 25, 0),
examplesList: (f = jspb.Message.getRepeatedField(msg, 26)) == null ? undefined : f,
providesIncludesList: (f = jspb.Message.getRepeatedField(msg, 27)) == null ? undefined : f,
compatibleWithMap: (f = msg.getCompatibleWithMap()) ? f.toObject(includeInstance, undefined) : []
compatibleWithMap: (f = msg.getCompatibleWithMap()) ? f.toObject(includeInstance, undefined) : [],
inDevelopment: jspb.Message.getBooleanFieldWithDefault(msg, 29, false)
};
if (includeInstance) {
@@ -5599,6 +5600,10 @@ proto.cc.arduino.cli.commands.v1.Library.deserializeBinaryFromReader = function(
jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readBool, null, "", false);
});
break;
case 29:
var value = /** @type {boolean} */ (reader.readBool());
msg.setInDevelopment(value);
break;
default:
reader.skipField();
break;
@@ -5797,6 +5802,13 @@ proto.cc.arduino.cli.commands.v1.Library.serializeBinaryToWriter = function(mess
if (f && f.getLength() > 0) {
f.serializeBinary(28, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeBool);
}
f = message.getInDevelopment();
if (f) {
writer.writeBool(
29,
f
);
}
};
@@ -6334,6 +6346,24 @@ proto.cc.arduino.cli.commands.v1.Library.prototype.clearCompatibleWithMap = func
return this;};
/**
* optional bool in_development = 29;
* @return {boolean}
*/
proto.cc.arduino.cli.commands.v1.Library.prototype.getInDevelopment = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 29, false));
};
/**
* @param {boolean} value
* @return {!proto.cc.arduino.cli.commands.v1.Library} returns this
*/
proto.cc.arduino.cli.commands.v1.Library.prototype.setInDevelopment = function(value) {
return jspb.Message.setProto3BooleanField(this, 29, value);
};

View File

@@ -26,6 +26,7 @@ import { DefaultCliConfig, CLI_CONFIG } from './cli-config';
import { Deferred } from '@theia/core/lib/common/promise-util';
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
import { deepClone } from '@theia/core';
import { ErrnoException } from './utils/errors';
const deepmerge = require('deepmerge');
@@ -146,7 +147,7 @@ export class ConfigServiceImpl
const fallbackModel = await this.getFallbackCliConfig();
return deepmerge(fallbackModel, model) as DefaultCliConfig;
} catch (error) {
if ('code' in error && error.code === 'ENOENT') {
if (ErrnoException.isENOENT(error)) {
if (initializeIfAbsent) {
await this.initCliConfigTo(dirname(cliConfigPath));
return this.loadCliConfig(false);

View File

@@ -12,7 +12,6 @@ import {
CreateRequest,
InitRequest,
InitResponse,
UpdateCoreLibrariesIndexResponse,
UpdateIndexRequest,
UpdateIndexResponse,
UpdateLibrariesIndexRequest,
@@ -347,10 +346,7 @@ export class CoreClientProvider {
}
private async doUpdateIndex<
R extends
| UpdateIndexResponse
| UpdateLibrariesIndexResponse
| UpdateCoreLibrariesIndexResponse // not used by IDE2
R extends UpdateIndexResponse | UpdateLibrariesIndexResponse
>(
responseProvider: () => grpc.ClientReadableStream<R>,
progressHandler?: IndexesUpdateProgressHandler,

View File

@@ -62,7 +62,7 @@ export function spawnCommand(
});
cp.on('exit', (code, signal) => {
if (code === 0) {
const result = Buffer.concat(outBuffers).toString('utf8').trim();
const result = Buffer.concat(outBuffers).toString('utf8');
resolve(result);
return;
}

View File

@@ -11,7 +11,6 @@ import {
ResponseService,
} from '../common/protocol/response-service';
import {
UpdateCoreLibrariesIndexResponse,
UpdateIndexResponse,
UpdateLibrariesIndexResponse,
} from './cli-protocol/cc/arduino/cli/commands/v1/commands_pb';
@@ -78,16 +77,12 @@ namespace PlatformProgressResponse {
};
}
}
type IndexProgressResponse =
| UpdateIndexResponse
| UpdateLibrariesIndexResponse
| UpdateCoreLibrariesIndexResponse;
type IndexProgressResponse = UpdateIndexResponse | UpdateLibrariesIndexResponse;
namespace IndexProgressResponse {
export function is(response: unknown): response is IndexProgressResponse {
return (
response instanceof UpdateIndexResponse ||
response instanceof UpdateLibrariesIndexResponse ||
response instanceof UpdateCoreLibrariesIndexResponse // not used by the IDE2 but available for full typings compatibility
response instanceof UpdateLibrariesIndexResponse
);
}
export function workUnit(response: IndexProgressResponse): UnitOfWork {

View File

@@ -26,6 +26,7 @@ import {
LoadSketchRequest,
} from './cli-protocol/cc/arduino/cli/commands/v1/commands_pb';
import { Deferred } from '@theia/core/lib/common/promise-util';
import { escapeRegExpCharacters } from '@theia/core/lib/common/strings';
import { ServiceError } from './service-error';
import {
IsTempSketch,
@@ -33,6 +34,7 @@ import {
TempSketchPrefix,
} from './is-temp-sketch';
import { join } from 'path';
import { ErrnoException } from './utils/errors';
const RecentSketches = 'recent-sketches.json';
const DefaultIno = `void setup() {
@@ -157,7 +159,7 @@ export class SketchesServiceImpl
const sketchName = segments[segments.length - 2];
const sketchFilename = segments[segments.length - 1];
const sketchFileExtension = segments[segments.length - 1].replace(
new RegExp(sketchName),
new RegExp(escapeRegExpCharacters(sketchName)),
''
);
if (sketchFileExtension !== '.ino' && sketchFileExtension !== '.pde') {
@@ -187,6 +189,13 @@ export class SketchesServiceImpl
}
async loadSketch(uri: string): Promise<SketchWithDetails> {
return this.doLoadSketch(uri);
}
private async doLoadSketch(
uri: string,
detectInvalidSketchNameError = true
): Promise<SketchWithDetails> {
const { client, instance } = await this.coreClient;
const req = new LoadSketchRequest();
const requestSketchPath = FileUri.fsPath(uri);
@@ -201,17 +210,19 @@ export class SketchesServiceImpl
if (err) {
let rejectWith: unknown = err;
if (isNotFoundError(err)) {
const invalidMainSketchFilePath = await isInvalidSketchNameError(
err,
requestSketchPath
);
if (invalidMainSketchFilePath) {
rejectWith = SketchesError.InvalidName(
err.details,
FileUri.create(invalidMainSketchFilePath).toString()
rejectWith = SketchesError.NotFound(err.details, uri);
// detecting the invalid sketch name error is not for free as it requires multiple filesystem access.
if (detectInvalidSketchNameError) {
const invalidMainSketchFilePath = await isInvalidSketchNameError(
err,
requestSketchPath
);
} else {
rejectWith = SketchesError.NotFound(err.details, uri);
if (invalidMainSketchFilePath) {
rejectWith = SketchesError.InvalidName(
err.details,
FileUri.create(invalidMainSketchFilePath).toString()
);
}
}
}
reject(rejectWith);
@@ -278,7 +289,7 @@ export class SketchesServiceImpl
);
}
} catch (err) {
if ('code' in err && err.code === 'ENOENT') {
if (ErrnoException.isENOENT(err)) {
this.logger.debug(
`<<< '${RecentSketches}' does not exist yet. This is normal behavior. Falling back to empty data.`
);
@@ -317,7 +328,7 @@ export class SketchesServiceImpl
let sketch: Sketch | undefined = undefined;
try {
sketch = await this.loadSketch(uri);
sketch = await this.doLoadSketch(uri, false);
this.logger.debug(
`Loaded sketch ${JSON.stringify(
sketch
@@ -390,7 +401,7 @@ export class SketchesServiceImpl
)) {
let sketch: SketchWithDetails | undefined = undefined;
try {
sketch = await this.loadSketch(uri);
sketch = await this.doLoadSketch(uri, false);
} catch {}
if (!sketch) {
needsUpdate = true;
@@ -413,14 +424,14 @@ export class SketchesServiceImpl
async cloneExample(uri: string): Promise<Sketch> {
const [sketch, parentPath] = await Promise.all([
this.loadSketch(uri),
this.doLoadSketch(uri, false),
this.createTempFolder(),
]);
const destinationUri = FileUri.create(
path.join(parentPath, sketch.name)
).toString();
const copiedSketchUri = await this.copy(sketch, { destinationUri });
return this.loadSketch(copiedSketchUri);
return this.doLoadSketch(copiedSketchUri, false);
}
async createNewSketch(): Promise<Sketch> {
@@ -477,7 +488,7 @@ export class SketchesServiceImpl
fs.mkdir(sketchDir, { recursive: true }),
]);
await fs.writeFile(sketchFile, inoContent, { encoding: 'utf8' });
return this.loadSketch(FileUri.create(sketchDir).toString());
return this.doLoadSketch(FileUri.create(sketchDir).toString(), false);
}
/**
@@ -528,7 +539,7 @@ export class SketchesServiceImpl
uri: string
): Promise<SketchWithDetails | undefined> {
try {
const sketch = await this.loadSketch(uri);
const sketch = await this.doLoadSketch(uri, false);
return sketch;
} catch (err) {
if (SketchesError.NotFound.is(err) || SketchesError.InvalidName.is(err)) {
@@ -553,7 +564,7 @@ export class SketchesServiceImpl
}
// Nothing to do when source and destination are the same.
if (sketch.uri === destinationUri) {
await this.loadSketch(sketch.uri); // Sanity check.
await this.doLoadSketch(sketch.uri, false); // Sanity check.
return sketch.uri;
}
@@ -574,7 +585,10 @@ export class SketchesServiceImpl
if (oldPath !== newPath) {
await fs.rename(oldPath, newPath);
}
await this.loadSketch(FileUri.create(destinationPath).toString()); // Sanity check.
await this.doLoadSketch(
FileUri.create(destinationPath).toString(),
false
); // Sanity check.
resolve();
} catch (e) {
reject(e);
@@ -596,7 +610,7 @@ export class SketchesServiceImpl
}
async archive(sketch: Sketch, destinationUri: string): Promise<string> {
await this.loadSketch(sketch.uri); // sanity check
await this.doLoadSketch(sketch.uri, false); // sanity check
const { client } = await this.coreClient;
const archivePath = FileUri.fsPath(destinationUri);
// The CLI cannot override existing archives, so we have to wipe it manually: https://github.com/arduino/arduino-cli/issues/1160
@@ -647,7 +661,7 @@ export class SketchesServiceImpl
private async exists(pathLike: string): Promise<boolean> {
try {
await fs.access(pathLike, constants.R_OK | constants.W_OK);
await fs.access(pathLike, constants.R_OK);
return true;
} catch {
return false;
@@ -666,7 +680,7 @@ export class SketchesServiceImpl
return this.tryParse(raw);
} catch (err) {
if ('code' in err && err.code === 'ENOENT') {
if (ErrnoException.isENOENT(err)) {
return undefined;
}
throw err;
@@ -695,7 +709,7 @@ export class SketchesServiceImpl
});
this.inoContent.resolve(inoContent);
} catch (err) {
if ('code' in err && err.code === 'ENOENT') {
if (ErrnoException.isENOENT(err)) {
// Ignored. The custom `.ino` blueprint file is optional.
} else {
throw err;
@@ -720,60 +734,68 @@ function isNotFoundError(err: unknown): err is ServiceError {
/**
* Tries to detect whether the error was caused by an invalid main sketch file name.
* IDE2 should handle gracefully when there is an invalid sketch folder name. See the [spec](https://arduino.github.io/arduino-cli/latest/sketch-specification/#sketch-root-folder) for details.
* The CLI does not have error codes (https://github.com/arduino/arduino-cli/issues/1762), so IDE2 parses the error message and tries to guess it.
* IDE2 should handle gracefully when there is an invalid sketch folder name.
* See the [spec](https://arduino.github.io/arduino-cli/latest/sketch-specification/#sketch-root-folder) for details.
* The CLI does not have error codes (https://github.com/arduino/arduino-cli/issues/1762),
* IDE2 cannot parse the error message (https://github.com/arduino/arduino-cli/issues/1968#issuecomment-1306936142)
* so it checks if a sketch even if it's invalid can be discovered from the requested path.
* Nothing guarantees that the invalid existing main sketch file still exits by the time client performs the sketch move.
*/
async function isInvalidSketchNameError(
cliErr: unknown,
requestSketchPath: string
): Promise<string | undefined> {
if (isNotFoundError(cliErr)) {
const ino = requestSketchPath.endsWith('.ino');
if (ino) {
const sketchFolderPath = path.dirname(requestSketchPath);
const sketchName = path.basename(sketchFolderPath);
const pattern = `${invalidSketchNameErrorRegExpPrefix}${path.join(
sketchFolderPath,
`${sketchName}.ino`
)}`.replace(/\\/g, '\\\\'); // make windows path separator with \\ to have a valid regexp.
if (new RegExp(pattern, 'i').test(cliErr.details)) {
try {
await fs.access(requestSketchPath);
return requestSketchPath;
} catch {
return undefined;
}
}
} else {
try {
const resources = await fs.readdir(requestSketchPath, {
withFileTypes: true,
});
return (
resources
.filter((resource) => resource.isFile())
.filter((resource) => resource.name.endsWith('.ino'))
// A folder might contain multiple sketches. It's OK to ick the first one as IDE2 cannot do much,
// but ensure a deterministic behavior as `readdir(3)` does not guarantee an order. Sort them.
.sort(({ name: left }, { name: right }) =>
left.localeCompare(right)
)
.map(({ name }) => name)
.map((name) => path.join(requestSketchPath, name))[0]
);
} catch (err) {
if ('code' in err && err.code === 'ENOTDIR') {
return undefined;
}
throw err;
}
}
}
return undefined;
return isNotFoundError(cliErr)
? isAccessibleSketchPath(requestSketchPath)
: undefined;
}
/**
* The `path` argument is valid, if accessible and either pointing to a `.ino` file,
* or it's a directory, and one of the files in the directory is an `.ino` file.
*
* `undefined` if `path` was pointing to neither an accessible sketch file nor a sketch folder.
*
* The sketch folder name and sketch file name can be different. This method is not sketch folder name compliant.
* The `path` must be an absolute, resolved path. This method does not handle EACCES (Permission denied) errors.
*
* When `fallbackToInvalidFolderPath` is `true`, and the `path` is an accessible folder without any sketch files,
* this method returns with the `path` argument instead of `undefined`.
*/
export async function isAccessibleSketchPath(
path: string,
fallbackToInvalidFolderPath = false
): Promise<string | undefined> {
let stats: Stats | undefined = undefined;
try {
stats = await fs.stat(path);
} catch (err) {
if (ErrnoException.isENOENT(err)) {
return undefined;
}
throw err;
}
if (!stats) {
return undefined;
}
if (stats.isFile()) {
return path.endsWith('.ino') ? path : undefined;
}
const entries = await fs.readdir(path, { withFileTypes: true });
const sketchFilename = entries
.filter((entry) => entry.isFile() && entry.name.endsWith('.ino'))
.map(({ name }) => name)
// A folder might contain multiple sketches. It's OK to pick the first one as IDE2 cannot do much,
// but ensure a deterministic behavior as `readdir(3)` does not guarantee an order. Sort them.
.sort((left, right) => left.localeCompare(right))[0];
if (sketchFilename) {
return join(path, sketchFilename);
}
// If no sketches found in the folder, but the folder exists,
// return with the path of the empty folder and let IDE2's frontend
// figure out the workspace root.
return fallbackToInvalidFolderPath ? path : undefined;
}
const invalidSketchNameErrorRegExpPrefix =
'.*: main file missing from sketch: ';
/*
* When a new sketch is created, add a suffix to distinguish it

View File

@@ -0,0 +1,34 @@
export type ErrnoException = Error & { code: string; errno: number };
export namespace ErrnoException {
export function is(arg: unknown): arg is ErrnoException {
if (arg instanceof Error) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const error = arg as any;
return (
'code' in error &&
'errno' in error &&
typeof error['code'] === 'string' &&
typeof error['errno'] === 'number'
);
}
return false;
}
/**
* (No such file or directory): Commonly raised by `fs` operations to indicate that a component of the specified pathname does not exist — no entity (file or directory) could be found by the given path.
*/
export function isENOENT(
arg: unknown
): arg is ErrnoException & { code: 'ENOENT' } {
return is(arg) && arg.code === 'ENOENT';
}
/**
* (Not a directory): A component of the given pathname existed, but was not a directory as expected. Commonly raised by `fs.readdir`.
*/
export function isENOTDIR(
arg: unknown
): arg is ErrnoException & { code: 'ENOTDIR' } {
return is(arg) && arg.code === 'ENOTDIR';
}
}

View File

@@ -54,7 +54,7 @@ This repository contains the main code, but two more repositories are included d
If youre familiar with TypeScript, the [Theia IDE](https://theia-ide.org/), and if you want to contribute to the
project, you should be able to build the Arduino IDE locally.
Please refer to the [Theia IDE prerequisites](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites) documentation for the setup instructions.
> **Note**: Node.js 14 must be used instead of the version 12 recommended at the link above.
> **Note**: Node.js 16 must be used instead of the version 14 recommended at the link above.
Once you have all the tools installed, you can build the editor following these steps

View File

@@ -2,14 +2,14 @@
Building the Pro IDE on Linux `armv7l` (aka `armhf`) and `aarch64` (aka `arm64`):
1. Install Node.js 14.x with [nvm](https://github.com/nvm-sh/nvm#install--update-script):
1. Install Node.js 16.x with [nvm](https://github.com/nvm-sh/nvm#install--update-script):
```
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
```
Restart your shell then:
```
nvm install 14
nvm use 14
nvm install 16
nvm use 16
```
Verify:
```

View File

@@ -18,9 +18,9 @@ sudo apt update \
build-essential \
&& wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash \
&& source ~/.bashrc \
&& nvm install 14 \
&& nvm use 14 \
&& nvm alias default 14 \
&& nvm install 16 \
&& nvm use 16 \
&& nvm alias default 16 \
&& curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list \
&& sudo apt update && sudo apt install --no-install-recommends yarn \

View File

@@ -1,7 +1,7 @@
{
"private": true,
"name": "electron-app",
"version": "2.0.1",
"version": "2.0.3",
"license": "AGPL-3.0-or-later",
"main": "src-gen/frontend/electron-main.js",
"dependencies": {
@@ -21,7 +21,7 @@
"@theia/process": "1.25.0",
"@theia/terminal": "1.25.0",
"@theia/workspace": "1.25.0",
"arduino-ide-extension": "2.0.1"
"arduino-ide-extension": "2.0.3"
},
"devDependencies": {
"@theia/cli": "1.25.0",

View File

@@ -11,7 +11,7 @@
"devDependencies": {
"@theia/cli": "1.25.0",
"cross-env": "^7.0.2",
"electron-builder": "23.0.2",
"electron-builder": "23.3.3",
"electron-notarize": "^1.1.1",
"is-ci": "^2.0.0",
"ncp": "^2.0.0",
@@ -26,7 +26,7 @@
"patch": "ncp ./patch/backend/main.js ./src-gen/backend/main.js"
},
"engines": {
"node": ">=14.0.0 <15"
"node": ">=16.0.0 <17"
},
"repository": {
"type": "git",
@@ -89,7 +89,10 @@
"hardenedRuntime": true,
"gatekeeperAssess": false,
"entitlements": "resources/entitlements.mac.plist",
"entitlementsInherit": "resources/entitlements.mac.plist"
"entitlementsInherit": "resources/entitlements.mac.plist",
"target": {
"target": "default"
}
},
"linux": {
"target": [

View File

@@ -1,11 +0,0 @@
#!/bin/sh
npm install --global node-gyp@7.0.0
if [ "$OSTYPE" = "cygwin" ] || [ "$OSTYPE" = "msys" ]; then
npm config set node_gyp "`npm prefix -g`\node_modules\node-gyp\bin\node-gyp.js"
else
npm config set node_gyp "`npm prefix -g`/lib/node_modules/node-gyp/bin/node-gyp.js"
fi
echo "npm config get node_gyp -> `npm config get node_gyp`"

View File

@@ -27,6 +27,9 @@ function artifactName() {
throw new Error(`Unsupported platform, arch: ${platform}, ${arch}`);
}
case 'darwin': {
if (arch === 'arm64') {
return `${name}_${id}_macOS_ARM64.\$\{ext}`;
}
return `${name}_${id}_macOS_64bit.\$\{ext}`;
}
case 'linux': {

View File

@@ -6,7 +6,6 @@
const shell = require('shelljs');
const glob = require('glob');
const isCI = require('is-ci');
shell.env.THEIA_ELECTRON_SKIP_REPLACE_FFMPEG = '1'; // Do not run the ffmpeg validation for the packager.
// Note, this will crash on PI if the available memory is less than desired heap size.
// https://github.com/shelljs/shelljs/issues/1024#issuecomment-1001552543
shell.env.NODE_OPTIONS = '--max_old_space_size=4096'; // Increase heap size for the CI

View File

@@ -33,7 +33,7 @@
"yargs": "^12.0.5"
},
"engines": {
"node": ">=14.0.0 <15"
"node": ">=16.0.0 <17"
},
"mocha": {
"reporter": "spec",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Sync and edit your Arduino Cloud Sketches",
"visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Netwerk",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Wys ontfoutings uitset tydens",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Sketsboek ligging",
"sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Export Compiled Binary",
"moving": "Moving",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "New",
"new": "New Sketch",
"openFolder": "Open Folder",
"openRecent": "Open Recent",
"openSketchInNewWindow": "Open Sketch in New Window",
@@ -404,6 +416,10 @@
"verify": "Verify",
"verifyOrCompile": "Verify/Compile"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "المزامنة و التعديل على مشاريعك في Arduino Cloud",
"visitArduinoCloud": "قم بزيارة Arduino Cloud من اجل انشاء ملف مشاريع على السحابة"
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "تعذر اغلاق مقبس الويب",
"unableToConnectToWebSocket": "تعذر الاتصال بمقبس الويب"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "شبكة",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "اظهر خرج مطوّل خلال",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "موقع ملف المشاريع",
"sketchbook.showAllFiles": "True لعرض كل مجلدات مشاريع داخل المشروع . False افتراضيا",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "تصدير الملف الثنائي المترجم",
"moving": "يتم النقل",
"movingMsg": "الملف \"{0}\" يجب ان يكون داخل مجلد مشروع مسمى \"{1}\"\nهل انشئ المجلد , ثم انقل الملف و اكمل ؟",
"new": "جديد",
"new": "New Sketch",
"openFolder": "فتح المجلد",
"openRecent": "فُتِحَ مؤخرا ",
"openSketchInNewWindow": "فتح المشروع في نافذة جديدة",
@@ -404,6 +416,10 @@
"verify": "تحقق",
"verifyOrCompile": "تحقق/ترجم"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "الاجابة على الاستبيان",
"dismissSurvey": "لا تظهر مرة اخرى",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Sync and edit your Arduino Cloud Sketches",
"visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Network",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Show verbose output during",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Sketchbook location",
"sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Export Compiled Binary",
"moving": "Moving",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "New",
"new": "New Sketch",
"openFolder": "Open Folder",
"openRecent": "Open Recent",
"openSketchInNewWindow": "Open Sketch in New Window",
@@ -404,6 +416,10 @@
"verify": "Verify",
"verifyOrCompile": "Verify/Compile"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Синхронизирайте и редактирайте на вашите Arduino облачни скици",
"visitArduinoCloud": "Посетете Arduino Cloud, за да създадете облачни скици."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Мрежа",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Показване на подробен изход по време на",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Местоположение на скицника",
"sketchbook.showAllFiles": "True , за да се покажат всички файлове вътре в скицата. По подразбиране е false.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Експортиране на компилиран двоичен файл",
"moving": "Преместване",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "Нов",
"new": "New Sketch",
"openFolder": "Отвори папка",
"openRecent": "Отвори Скорошен",
"openSketchInNewWindow": "Отвори скицата в нов прозорец",
@@ -404,6 +416,10 @@
"verify": "Потвърдете",
"verifyOrCompile": "Проверете/компилирайте"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Tanca la sessió de sincronització i edita els teus programes del núvol Arduino",
"visitArduinoCloud": "Visiteu Arduino Cloud per crear programes al núvol."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Xarxa",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Mostra la sortida detallada durant",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Ubicació del quadern de programes",
"sketchbook.showAllFiles": "True per mostrar tots els fitxers del programa dins del programa. És fals per defecte.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Exporta el binari compilat",
"moving": "Movent-se",
"movingMsg": "El fitxer \"{0}\" ha d'estar dins d'una carpeta deprograma anomenada \"{1}\".\nVoleu crear aquesta carpeta, moure el fitxer i continuar?",
"new": "Nou",
"new": "New Sketch",
"openFolder": "Obrir carpeta",
"openRecent": "Obre Recent",
"openSketchInNewWindow": "Obriu el programa a una finestra nova",
@@ -404,6 +416,10 @@
"verify": "Verificar",
"verifyOrCompile": "Verificar/Compilar"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -6,46 +6,46 @@
},
"board": {
"board": "Deska {0}",
"boardConfigDialogTitle": "Select Other Board and Port",
"boardConfigDialogTitle": "Zvolit jinou Desku a Port",
"boardInfo": "Info o desce",
"boards": "boards",
"boards": "Desky",
"configDialog1": "Pokud chcete nahrát sketch, musíte zvolit jak desku tak i port.",
"configDialog2": "Pokud zvolíte jen desku, budete schopni kompilovat sketch, ale nebudete ji moci nahrát do desky.",
"couldNotFindPreviouslySelected": "Dříve zvolená deska '{0}' v instalované platformě '{1}' nebyla nalezena. Zvolte prosím manuálně desku kterou chcete použít. Chcete tuto desku zvolit nyní? ",
"disconnected": "Disconnected",
"disconnected": "Odpojeno",
"getBoardInfo": "Získat info o desce.",
"inSketchbook": "(v projektech)",
"installNow": "\"{0}{1}\" jádro musí být instalováno pro aktuálně zvolenou \"{2}\" desku. Chcete ho nyní nainstalovat?",
"noBoardsFound": "No boards found for \"{0}\"",
"noBoardsFound": "Nenalezeny žádné desky pro \"{0}\"",
"noFQBN": "FQBN není dostupné pro zvolenou desku \"{0}\". Máte nainstalované příslušné jádro? ",
"noPortsDiscovered": "No ports discovered",
"noPortsDiscovered": "Nenalezeny žádné porty",
"noPortsSelected": "Nebyl zvolen port pro desku '{0}'.",
"noneSelected": "Nebyla zvolena deska.",
"openBoardsConfig": "Zvolte jinou desku a port...",
"platformMissing": "Platforma pro zvolenou desku '{0}' není nainstalována.",
"pleasePickBoard": "Vyberte prosím desku která je připojená k zvolenému portu. ",
"port": "Port {0}",
"portLabel": "Port: {0}",
"ports": "ports",
"portLabel": "Port:{0}",
"ports": "porty",
"programmer": "Programátor",
"reselectLater": "Zvolit později",
"searchBoard": "Search board",
"searchBoard": "Vyhledat desku",
"selectBoard": "Zvolit desku",
"selectBoardForInfo": "Prosím zvolte desku pro získání informací o desce.",
"selectPortForInfo": "Prosím zvolte port pro získání informací o desce.",
"showAllAvailablePorts": "Zobrazit všechny dostupné porty (pokud je zaškrtnuto)",
"showAllPorts": "Show all ports",
"showAllPorts": "Ukázat všechny porty",
"succesfullyInstalledPlatform": "Platforma {0}:{1} byla úspěšně nainstalována.",
"succesfullyUninstalledPlatform": "Platforma {0}:{1} byla úspěšně odinstalována.",
"typeOfPorts": "{0} ports"
"typeOfPorts": "{0}porty"
},
"boardsManager": "Manažér desek",
"boardsType": {
"arduinoCertified": "Arduino Certified"
"arduinoCertified": "Certifikováno Arduinem"
},
"bootloader": {
"burnBootloader": "Nahrát zavaděč",
"burningBootloader": "Burning bootloader...",
"burnBootloader": "Vypálit zavaděč",
"burningBootloader": "Vypalování zavaděče...",
"doneBurningBootloader": "Nahrání zavaděče bylo dokončeno. "
},
"burnBootloader": {
@@ -69,20 +69,20 @@
"uploadingCertificates": "Nahrávám certifikát."
},
"checkForUpdates": {
"checkForUpdates": "Check for Arduino Updates",
"installAll": "Install All",
"noUpdates": "There are no recent updates available.",
"promptUpdateBoards": "Updates are available for some of your boards.",
"checkForUpdates": "Kontrola pro aktualizace",
"installAll": "Instalovat vše",
"noUpdates": "Nejsou k dispozici žádné aktualizace",
"promptUpdateBoards": "Jsou k dispozici aktualizace pro některé z vašich desek ",
"promptUpdateLibraries": "Updates are available for some of your libraries.",
"updatingBoards": "Updating boards...",
"updatingLibraries": "Updating libraries..."
"updatingBoards": "Aktualizuji desky...",
"updatingLibraries": "Aktualizuji knihovny..."
},
"cli-error-parser": {
"keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?",
"mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?"
},
"cloud": {
"account": "Account",
"account": "Účet",
"chooseSketchVisibility": "Zvolte viditelnost sketche:",
"connected": "Připojen",
"continue": "Pokračovat",
@@ -90,7 +90,7 @@
"donePushing": "Odesílání dokončeno {0}.",
"embed": "Vložit: ",
"emptySketchbook": "Umístění projektů je prázdné",
"goToCloud": "Go to Cloud",
"goToCloud": "Jít na Cloud",
"learnMore": "Zjistit více",
"link": "Adresa: ",
"notYetPulled": "Nemohu odeslat do cloudu jelikož z něj ještě nebylo staženo.",
@@ -108,19 +108,22 @@
"pushSketch": "Odeslat sketch",
"pushSketchMsg": "Toto je veřejná sketch. Před odesláním se prosím ujistěte že jsou smazané citlivé informace ze souboru arduino_secrets.h . Tuto sketch můžete změnit na soukromou v panelu pro sdílení. ",
"remote": "Vzdálený",
"remoteSketchbook": "Remote Sketchbook",
"remoteSketchbook": "Odstranit Sketchbook",
"share": "Sdílet...",
"shareSketch": "Sdílet sketch",
"showHideRemoveSketchbook": "Zobrazit/skrýt vzdálenou sketch",
"signIn": "Přihlásit se",
"signInToCloud": "Přihlásit se do Arduino Cloud",
"signOut": "Odhlásit se",
"sync": "Sync",
"sync": "Synchronizovat",
"syncEditSketches": "Synchronizovat a editovat sketche v Arduino Cloud",
"visitArduinoCloud": "Navštivte Arduino Cloud pro vytvoření cloudové sketche"
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"all": "Vše",
"contributed": "Contributed",
"installManually": "Instalovat ručně",
"later": "Později",
@@ -130,11 +133,11 @@
"oldFormat": "{0}používá stále starý formát `.pde`. Chcete ho převést na soubor s příponou `.ino`?",
"partner": "Partner",
"processing": "Zpracovávám",
"recommended": "Recommended",
"retired": "Retired",
"recommended": "Doporučené",
"retired": "Zastaralý",
"selectedOn": "zapnuto{0}",
"serialMonitor": "Seriový monitor",
"type": "Type",
"type": "typ",
"unknown": "Neznámý",
"updateable": "Updatable"
},
@@ -162,10 +165,10 @@
},
"core": {
"compilerWarnings": {
"all": "All",
"default": "Default",
"more": "More",
"none": "None"
"all": "Vše",
"default": "Výchozí",
"more": "Více",
"none": "Žádný"
}
},
"coreContribution": {
@@ -174,8 +177,8 @@
},
"daemon": {
"restart": "Restart Daemon",
"start": "Start Daemon",
"stop": "Stop Daemon"
"start": "Spustit Daemon",
"stop": "Zastavit Daemon"
},
"debug": {
"debugWithMessage": "Debug - {0}",
@@ -194,8 +197,8 @@
"decreaseIndent": "Zmenšit odrážku",
"increaseFontSize": "Zvýšit velikost písma",
"increaseIndent": "Zvětšit odrážku",
"nextError": "Next Error",
"previousError": "Previous Error",
"nextError": "Další chyba",
"previousError": "Předchozí chyba",
"revealError": "Reveal Error"
},
"electron": {
@@ -234,7 +237,7 @@
"visit": "Navštívit Arduino.cc"
},
"ide-updater": {
"checkForUpdates": "Check for Arduino IDE Updates",
"checkForUpdates": "Zkontrolovat aktualizace",
"closeAndInstallButton": "Zavřít a nainstalovat",
"closeToInstallNotice": "Vypněte program a nainstalujte update na Váš stroj. ",
"downloadButton": "Stáhnout",
@@ -255,7 +258,7 @@
"arduinoLibraries": "Arduino knihovny",
"contributedLibraries": "Přispěné knihovny",
"include": "Zahrnout knihovnu",
"installAll": "Install All",
"installAll": "Instalovat vše",
"installLibraryDependencies": "Install library dependencies",
"installMissingDependencies": "Chcete nainstalovat všechny chybějící závislosti? ",
"installOneMissingDependency": "Chcete nainstalovat chybějící závislost? ",
@@ -273,7 +276,7 @@
"zipLibrary": "Knihovna"
},
"librarySearchProperty": {
"topic": "Topic"
"topic": "Téma"
},
"libraryTopic": {
"communication": "Communication",
@@ -281,17 +284,17 @@
"dataStorage": "Data Storage",
"deviceControl": "Device Control",
"display": "Display",
"other": "Other",
"sensors": "Sensors",
"other": "Jiné",
"sensors": "Senzory",
"signalInputOutput": "Signal Input/Output",
"timing": "Timing",
"timing": "Časování",
"uncategorized": "Uncategorized"
},
"libraryType": {
"installed": "Installed"
},
"menu": {
"advanced": "Advanced",
"advanced": "Pokročilé",
"sketch": "Sketch",
"tools": "Nástroje"
},
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Síť",
"serial": "Serial"
@@ -332,7 +341,7 @@
"files.inside.sketches": "Zobrazit soubory uvnitř sketche",
"ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'",
"ide.updateChannel": "Výběr kanálu pro aktualizace. 'stable' pro stabilní vydání, 'nightly' pro nejnovější vývojové verze.",
"interfaceScale": "Měřítko prostředí",
"interfaceScale": "Velikost rozhraní",
"invalid.editorFontSize": "Neplatná velikost editoru písem: Toto číslo musí být kladné.",
"invalid.sketchbook.location": "Neplatné umístění projektů:{0}",
"invalid.theme": "Neplatné téma.",
@@ -343,12 +352,15 @@
"newSketchbookLocation": "Zvolit nové umístění projektů",
"noProxy": "Bez proxy",
"proxySettings": {
"hostname": "Host name",
"password": "Password",
"port": "Port number",
"username": "Username"
"hostname": "Jméno hosta",
"password": "Heslo",
"port": "Číslo portu",
"username": "Uživatelské jméno"
},
"showVerbose": "Zobrazit podrobný výstup během",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Umístění sketche",
"sketchbook.showAllFiles": "Ano pro zobrazení všech souborů sketche. Ne je výchozí hodnota. ",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,12 +397,12 @@
"exportBinary": "Exportovat kompilované soubory",
"moving": "Přesouvám",
"movingMsg": "Soubor \"{0}\" musí být uvnitř složky která je shodná názvem \"{1}\".\nVytvořit složku, přesunout tam- soubor a pokračovat? ",
"new": "Nový",
"new": "New Sketch",
"openFolder": "Otevřít složku",
"openRecent": "Otevřít nedávné",
"openSketchInNewWindow": "Otevřít sketch v novém okně",
"saveFolderAs": "Uložit složku sketche jako...",
"saveSketch": "Save your sketch to open it again later.",
"saveSketch": "Uložte svůj sketch, abyste ho mohli znovu otevřít později.",
"saveSketchAs": "Uložit složku sketche jako...",
"showFolder": "Zobrazit složku sketche",
"sketch": "Sketch",
@@ -399,14 +411,18 @@
"titleSketchbook": "Projekty",
"upload": "Nahrát",
"uploadUsingProgrammer": "Nahrát pomocí programátoru",
"uploading": "Uploading...",
"uploading": "Nahrávám...",
"userFieldsNotFoundError": "Nemohu nalézt uživatelská pole pro připojenou desku",
"verify": "Ověřit",
"verifyOrCompile": "Ověřit/Kompilovat"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",
"dismissSurvey": "Znovu nezobrazovat",
"surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better."
},
"updateIndexes": {
@@ -430,7 +446,7 @@
"couldNotSave": "Nebylo možné uložit sketch. Zkopírujte prosím neuloženou práci do Vašeho oblíbeného textového editoru a restartujte IDE. ",
"daemonOffline": "CLI Daemon nepřipojen",
"offline": "Nepřipojen",
"quitTitle": "Are you sure you want to quit?"
"quitTitle": "Jste si jisti že chcete odejít"
},
"debug": {
"start": "Start...",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Synchronisiere und editiere deine Arduino Cloud Sketches.",
"visitArduinoCloud": "Besuche Arduino Cloud um Cloud Sketche zu erstellen."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "Alle",
"contributed": "Beigetragen",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Websocket wurde nicht geschlossen",
"unableToConnectToWebSocket": "Websocket wurde nicht verbunden"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Netzwerk",
"serial": "Seriell"
@@ -349,6 +358,9 @@
"username": "Benutzername"
},
"showVerbose": "Compiler-Meldungen anzeigen beim",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Dateipfad des Sketchbooks",
"sketchbook.showAllFiles": "Wenn aktiviert, werden alle Sketch-Dateien innerhalb des Sketch angezeigt. Standardgemäß deaktiviert. ",
"survey.notification": "Wenn aktiviert, werden Nutzer benachrichtigt, wenn eine Umfrage verfügbar ist. Standardgemäß aktiviert.",
@@ -385,7 +397,7 @@
"exportBinary": "Kompilierte Binärdatei exportieren",
"moving": "Übertragen...",
"movingMsg": "Die Datei \"{0}\" muss sich in einen Sketch Ordner \"{1}\" befinden.\nOrdner erstellen, Datei verschieben und fortfahren?",
"new": "Neu",
"new": "New Sketch",
"openFolder": "Ordner öffnen",
"openRecent": "Zuletzt geöffnet",
"openSketchInNewWindow": "Sketch in neuen Fenster öffnen",
@@ -404,6 +416,10 @@
"verify": "Überprüfen",
"verifyOrCompile": "Überprüfen/Kompilieren"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Umfrage beantworten",
"dismissSurvey": "Nicht erneut anzeigen",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Συγχρονισμός και τροποποίηση των Arduino Cloud Σχεδίων σου.",
"visitArduinoCloud": "Επισκέψου το Arduino Cloud για δημιουργία Σχεδίων Cloud."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Δίκτυο",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Εμφάνιση λεπτομερούς εξόδου κατά τη διάρκεια",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Τοποθεσία σχεδίων",
"sketchbook.showAllFiles": "Αληθές για εμφάνιση όλων των αρχείων σχεδίου μεσα στο σχέδιο. Είναι ψευδές απο προεπιλογή.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Export Compiled Binary",
"moving": "Moving",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "Νέο",
"new": "New Sketch",
"openFolder": "Άνοιγμα φακέλου",
"openRecent": "Άνοιγμα πρόσφατου",
"openSketchInNewWindow": "Open Sketch in New Window",
@@ -404,6 +416,10 @@
"verify": "Επαλήθευση",
"verifyOrCompile": "Επικύρωση"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -119,6 +119,11 @@
"syncEditSketches": "Sync and edit your Arduino Cloud Sketches",
"visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches."
},
"cloudSketch": {
"creating": "Creating remote sketch '{0}'...",
"new": "New Remote Sketch",
"synchronizing": "Synchronizing sketchbook, pulling '{0}'..."
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +304,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Network",
"serial": "Serial"
@@ -388,7 +399,7 @@
"exportBinary": "Export Compiled Binary",
"moving": "Moving",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "New",
"new": "New Sketch",
"openFolder": "Open Folder",
"openRecent": "Open Recent",
"openSketchInNewWindow": "Open Sketch in New Window",
@@ -407,6 +418,10 @@
"verify": "Verify",
"verifyOrCompile": "Verify/Compile"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -6,9 +6,9 @@
},
"board": {
"board": "Placa{0}",
"boardConfigDialogTitle": "Select Other Board and Port",
"boardConfigDialogTitle": "Seleccionar Otra Placa y Puerto",
"boardInfo": "Información de la placa",
"boards": "boards",
"boards": "Placas",
"configDialog1": "Selecciona tanto una placa como un puerto si quieres cargar un sketch.",
"configDialog2": "Si seleccionas solo una placa podrás compilar, pero no cargar tu sketch.",
"couldNotFindPreviouslySelected": "No se ha podido encontrar la placa previamente seleccionada '{0}' en la plataforma instalada '{1}'. Por favor, vuelve a seleccionar manualmente la placa que quieres utilizar. ¿Quieres volver a seleccionarla ahora?",
@@ -16,9 +16,9 @@
"getBoardInfo": "Obtener información de la placa",
"inSketchbook": " (en el Sketchbook)",
"installNow": "Hay que instalar el núcleo \"{0} {1} \" para la placa \"{2}\" actualmente seleccionada. ¿Quieres instalarlo ahora?",
"noBoardsFound": "No boards found for \"{0}\"",
"noBoardsFound": "No se han encotrado placas para \"{0}\"",
"noFQBN": "El FQBN no está disponible para la placa seleccionada \"{0}\". ¿Tienes instalado el núcleo correspondiente?",
"noPortsDiscovered": "No ports discovered",
"noPortsDiscovered": "No se ha descubierto ningún puerto",
"noPortsSelected": "No se han seleccionado puertos para la placa: '{0}'.",
"noneSelected": "Ninguna placa seleccionada.",
"openBoardsConfig": "Seleccione otra placa y puerto...",
@@ -26,26 +26,26 @@
"pleasePickBoard": "Por favor, elija una placa conectada al puerto que haya seleccionado.",
"port": "Puerto {0}",
"portLabel": "Puerto: {0}",
"ports": "ports",
"ports": "puertos",
"programmer": "Programador",
"reselectLater": "Vuelve a seleccionar más tarde",
"searchBoard": "Search board",
"searchBoard": "Buscar placa",
"selectBoard": "Seleccionar Placa",
"selectBoardForInfo": "Por favor, seleccione una placa para obtener información sobre ella.",
"selectPortForInfo": "Por favor, seleccione un puerto para obtener información sobre la placa.",
"showAllAvailablePorts": "Muestra todos los puertos disponibles cuando está activado",
"showAllPorts": "Show all ports",
"showAllPorts": "Mostrar todos los puertos",
"succesfullyInstalledPlatform": "Plataforma {0}:{1} instalada correctamente",
"succesfullyUninstalledPlatform": "Plataforma {0}:{1} desinstalada correctamente",
"typeOfPorts": "{0} ports"
"typeOfPorts": "{0} puertos"
},
"boardsManager": "Gestor de placas",
"boardsType": {
"arduinoCertified": "Arduino Certified"
"arduinoCertified": "Certificado Arduino"
},
"bootloader": {
"burnBootloader": "Grabar Bootloader",
"burningBootloader": "Burning bootloader...",
"burningBootloader": "Grabando bootloader...",
"doneBurningBootloader": "Finalizada la grabación del bootloader."
},
"burnBootloader": {
@@ -69,13 +69,13 @@
"uploadingCertificates": "Cargando certificados."
},
"checkForUpdates": {
"checkForUpdates": "Check for Arduino Updates",
"installAll": "Install All",
"noUpdates": "There are no recent updates available.",
"promptUpdateBoards": "Updates are available for some of your boards.",
"promptUpdateLibraries": "Updates are available for some of your libraries.",
"updatingBoards": "Updating boards...",
"updatingLibraries": "Updating libraries..."
"checkForUpdates": "Comprobar Actualizaciones para Arduino",
"installAll": "Instalar todo",
"noUpdates": "No se han encontrado actualizaciones recientes disponibles",
"promptUpdateBoards": "Actualizaciones disponibles para alguna de tus placas",
"promptUpdateLibraries": "Actualizaciones disponibles para algunas de tus librerías",
"updatingBoards": "Actualizando placas...",
"updatingLibraries": "Actualizando librerías..."
},
"cli-error-parser": {
"keyboardError": "'Keyboard' no encontrado. ¿Tiene tu proyecto incluida la linea '#include <Keyboard.h>'?",
@@ -90,7 +90,7 @@
"donePushing": "Envío a '{0}' realizado.",
"embed": "Incrustado:",
"emptySketchbook": "Tu Sketchbook está vacío",
"goToCloud": "Go to Cloud",
"goToCloud": "Ir al Cloud",
"learnMore": "Aprender más",
"link": "Enlace:",
"notYetPulled": "No se puede cargar a las nube. Todavía no ha sido descargado",
@@ -119,34 +119,37 @@
"syncEditSketches": "Sincroniza y edita tus Arduino Cloud Sketches",
"visitArduinoCloud": "Visita Arduino Cloud para crear Cloud Sketches. "
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
"all": "Todo",
"contributed": "Contribuido",
"installManually": "Instalar manualmente",
"later": "Más tarde",
"noBoardSelected": "Ninguna placa seleccionada.",
"notConnected": "[no conectado]",
"offlineIndicator": "Al parecer no estás en línea. Sin una conexión a internet, el CLI de Arduino no podrá descargar los recursos necesarios, lo cual puede ocasionar fallos. Por favor, conecte a internet y reinicie la aplicación.",
"oldFormat": "La página '{0}' sigue utilizando el formato antiguo `.pde`. ¿Quieres cambiar a la nueva extensión `.ino`?",
"partner": "Partner",
"partner": "Socio",
"processing": "Procesando",
"recommended": "Recommended",
"retired": "Retired",
"recommended": "Recomendado",
"retired": "Retirado",
"selectedOn": "on 1{0}\n ",
"serialMonitor": "Monitor Serie",
"type": "Type",
"type": "Tipo",
"unknown": "Desconocido",
"updateable": "Updatable"
"updateable": "Actualizable"
},
"compile": {
"error": "Error de compilación: {0}"
},
"component": {
"boardsIncluded": "Boards included in this package:",
"boardsIncluded": "Placas incluidas en este paquete:",
"by": "de",
"filterSearch": "Filtre su búsqueda...",
"install": "Instalar",
"installed": "Installed",
"installed": "Instalado",
"moreInfo": "Más información",
"uninstall": "Desinstalar",
"uninstallMsg": "¿Quieres desinstalar {0}?",
@@ -156,21 +159,21 @@
"addFile": "Añadir fichero...",
"fileAdded": "Un archivo añadido al sketch.",
"plotter": {
"couldNotOpen": "Couldn't open serial plotter"
"couldNotOpen": "No se puede abrir el plotter serial"
},
"replaceTitle": "Reemplazar"
},
"core": {
"compilerWarnings": {
"all": "All",
"default": "Default",
"more": "More",
"none": "None"
"all": "Todo",
"default": "Predeterminado",
"more": "Más",
"none": "Niguno"
}
},
"coreContribution": {
"copyError": "Copiar mensajes de error",
"noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu."
"noBoardSelected": "Ninguna placa seleccionada. Por favor selecciona una placa Arduino en el menú Herramientas > Placas"
},
"daemon": {
"restart": "Reiniciar Daemon",
@@ -196,7 +199,7 @@
"increaseIndent": "Aumentar sangría",
"nextError": "Siguiente Error",
"previousError": "Error Anterior",
"revealError": "Reveal Error"
"revealError": "Revelar Error"
},
"electron": {
"couldNotSave": "No se ha podido guardar el sketch. Por favor, copia tu trabajo no guardado en tu editor de texto favorito y reinicia el IDE.",
@@ -234,7 +237,7 @@
"visit": "Visitar Arduino.cc"
},
"ide-updater": {
"checkForUpdates": "Check for Arduino IDE Updates",
"checkForUpdates": "Comprobar actualizaciones para Arduino IDE",
"closeAndInstallButton": "Cerrar e instalar",
"closeToInstallNotice": "Cierra el programa e instala la actualización en tu máquina.",
"downloadButton": "Descargar",
@@ -255,11 +258,11 @@
"arduinoLibraries": "Bibliotecas de Arduino",
"contributedLibraries": "Bibliotecas aportadas",
"include": "Incluir biblioteca",
"installAll": "Install All",
"installLibraryDependencies": "Install library dependencies",
"installAll": "Instalar todo",
"installLibraryDependencies": "Instalar las dependencias de la biblioteca",
"installMissingDependencies": "¿Quieres instalar todas las dependencias faltantes?",
"installOneMissingDependency": "¿Quieres instalar la dependencia faltante?",
"installWithoutDependencies": "Install without dependencies",
"installWithoutDependencies": "Instalar sin dependencias",
"installedSuccessfully": "Biblioteca {0}:{1} instalada correctamente",
"libraryAlreadyExists": "Ya existe una biblioteca. ¿Quieres sobrescribirla?",
"manageLibraries": "Gestionar bibliotecas...",
@@ -273,22 +276,22 @@
"zipLibrary": "Biblioteca"
},
"librarySearchProperty": {
"topic": "Topic"
"topic": "Tema"
},
"libraryTopic": {
"communication": "Communication",
"dataProcessing": "Data Processing",
"dataStorage": "Data Storage",
"deviceControl": "Device Control",
"display": "Display",
"other": "Other",
"sensors": "Sensors",
"signalInputOutput": "Signal Input/Output",
"timing": "Timing",
"uncategorized": "Uncategorized"
"communication": "Comunicación",
"dataProcessing": "Procesando datos",
"dataStorage": "Almacenamiento de datos",
"deviceControl": "Control de dispositivo",
"display": "Pantalla",
"other": "Otro",
"sensors": "Sensores",
"signalInputOutput": "Señal Entrada/Salida",
"timing": "Temporización",
"uncategorized": "Descategorizado"
},
"libraryType": {
"installed": "Installed"
"installed": "Instalado"
},
"menu": {
"advanced": "Avanzado",
@@ -299,9 +302,15 @@
"unableToCloseWebSocket": " No se puede cerrar websocket",
"unableToConnectToWebSocket": " No se puede conectar al websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Red",
"serial": "Serial"
"serial": "Serie"
},
"preferences": {
"additionalManagerURLs": "URLs adicionales de gestor de placas",
@@ -312,7 +321,7 @@
"automatic": "Automático",
"board.certificates": "Listado de certificados que pueden ser cargados en las placas",
"browse": "Explorar",
"checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.",
"checkForUpdate": "Recibe notificaciones sobre actualizaciones disponibles del IDE, placas y librerías. Requiere reiniciar el IDE despues de hacer cambios. Por defecto está habilitado.",
"choose": "Elija",
"cli.daemonDebug": "Habilitar logueo de depuración de las llamadas gRPC al Arduino CLI. Requiere un reinicio del IDE para tener efecto. Deshabilitado por defecto.",
"cloud.enabled": "Verdadero si las funciones de sincronización del sketch están activadas. Verdadero por defecto.",
@@ -343,12 +352,15 @@
"newSketchbookLocation": "Selecciona la nueva ruta del sketchbook",
"noProxy": "Sin Proxy",
"proxySettings": {
"hostname": "Host name",
"password": "Password",
"port": "Port number",
"username": "Username"
"hostname": "nombre del host",
"password": "Contraseña",
"port": "Numero del puerto",
"username": "Nombre de usuario"
},
"showVerbose": "Mostrar salida verbosa durante",
"sketch": {
"inoBlueprint": "Ruta absoluta del sistema de archivos al archivo blueprint `.ino` por defecto. Si se especifica, el contenido del archivo blueprint se utilizará para cada nuevo sketch creado por el IDE. Los sketches se generarán con el contenido por defecto de Arduino si no se especifica. Los archivos blueprint no accesibles son ignorados. **Se necesita reiniciar el IDE** para que este ajuste surta efecto."
},
"sketchbook.location": "Ruta del Sketchbook",
"sketchbook.showAllFiles": "Verdadero para mostrar todos los archivos de bocetos dentro del boceto. Por defecto es falso.",
"survey.notification": "Verdadero si usuarios deberían ser notificados cuando una encuesta esté disponible. Verdadero es predeterminado.",
@@ -364,7 +376,7 @@
"serial": {
"autoscroll": "Autoscroll",
"carriageReturn": "Retorno de carro",
"message": "Message (Enter to send message to '{0}' on '{1}')",
"message": "Mensaje (Intro para mandar el mensaje de '{0}' a '{1}')",
"newLine": "Nueva línea",
"newLineCarriageReturn": "Ambos NL & CR",
"noLineEndings": "Sin ajuste de línea",
@@ -377,15 +389,15 @@
"archiveSketch": "Archivo de programa",
"cantOpen": "Ya existe una carpeta con el nombre \"{0}\". No se puede abrir.",
"close": "¿Estás seguro de que quieres cerrar el sketch?",
"compile": "Compiling sketch...",
"configureAndUpload": "Configure and Upload",
"compile": "Compilando proyecto...",
"configureAndUpload": "Configura y Subir",
"createdArchive": "Archivo '{0}' creado.",
"doneCompiling": "Compilación completada.",
"doneUploading": "Carga completada.",
"exportBinary": "Exportar binario compilado",
"moving": "Moviendo",
"movingMsg": "El archivo \"{0}\" tiene que estar dentro de una carpeta de bocetos llamada \"{1}\".\n¿Crear esta carpeta, mover el archivo y continuar?",
"new": "Nuevo",
"new": "New Sketch",
"openFolder": "Abrir carpeta",
"openRecent": "Abierto recientemente",
"openSketchInNewWindow": "Abrir Sketch en una ventana nueva",
@@ -399,27 +411,31 @@
"titleSketchbook": "Sketchbook",
"upload": "Cargar",
"uploadUsingProgrammer": "Cargar usando el programador",
"uploading": "Uploading...",
"uploading": "Actualizando...",
"userFieldsNotFoundError": "No se pueden encontrar campos de usuario para la placa conectada",
"verify": "Verificar",
"verifyOrCompile": "Verificar/Compilar"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Completar encuesta",
"dismissSurvey": "No volver a mostrar",
"surveyMessage": "Por favor ayudenos mejorar completando esta breve encuesta. Valoramos nuestra comunidad y nos gustaría conocer algo mejor a los que nos apoyan."
},
"updateIndexes": {
"updateIndexes": "Update Indexes",
"updateLibraryIndex": "Update Library Index",
"updatePackageIndex": "Update Package Index"
"updateIndexes": "Actualizar indices",
"updateLibraryIndex": "Actualizar Indice de librerías",
"updatePackageIndex": "Actualizar índice de paquete"
},
"upload": {
"error": "1{0} error: 2{1}"
},
"userFields": {
"cancel": "Cancelar",
"enterField": "Enter {0}",
"enterField": "Introduce {0}",
"upload": "Cargar"
}
},

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Sinkronizatu eta editatu zure Arduino Cloud-eko programak",
"visitArduinoCloud": "Bisitatu Arduino Cloud hodeiko programak sortzeko."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Sarea",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Erakutsi irteera xehatua honetan zehar:",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Programa bildumaren kokalekua",
"sketchbook.showAllFiles": "Egia programaren barruko programa-fitxategi guztiak erakusteko. Lehenetsia gezurra da.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Esportatu konpilatutako bitarra",
"moving": "Lekuz aldatzen",
"movingMsg": "\"{0}\" fitxategiak \"{1}\" izeneko programa-karpetaren barruan egon behar du.\nSortu karpeta, eraman fitxategia bertara eta jarraitu?",
"new": "Berria",
"new": "New Sketch",
"openFolder": "Ireki karpeta",
"openRecent": "Ireki azkenaldikoa",
"openSketchInNewWindow": "Ireki programa leiho berrian",
@@ -404,6 +416,10 @@
"verify": "Egiaztatu",
"verifyOrCompile": "Egiaztatu/Konpilatu"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -8,7 +8,7 @@
"board": "بورد {0}",
"boardConfigDialogTitle": "انتخاب یک بورد و پورت دیگر",
"boardInfo": "مشخصات برد",
"boards": "boards",
"boards": "بردها",
"configDialog1": "اگر می‌خواهید طرحی را آپلود کنید، هم یک تابلو و هم یک پورت انتخاب کنید.",
"configDialog2": "اگر فقط تابلو را انتخاب کنید، می توانید کامپایل کنید، اما نمی توانید طرح خود را آپلود کنید.",
"couldNotFindPreviouslySelected": "نمی توان برد انتخاب شده قبلی '{0}' در پلتفرم نصب شده '{1}' را پیدا کرد. لطفاً تابلویی را که می‌خواهید استفاده کنید، مجدداً به‌صورت دستی انتخاب کنید. آیا اکنون می خواهید آن را مجدداً انتخاب کنید؟",
@@ -16,7 +16,7 @@
"getBoardInfo": "دریافت راهنمای برد",
"inSketchbook": "(در منبع طرح ها)",
"installNow": "هسته \"{0}{1}\" باید برای برد \"{2}\" انتخاب شده فعلی نصب شود. آیا الان می خواهید نصبش کنید؟",
"noBoardsFound": "No boards found for \"{0}\"",
"noBoardsFound": "هیچ بردی پیدا نشد برای{0}",
"noFQBN": "FQBN برای برد انتخاب شده \"{0}\" موجود نیست. آیا هسته مربوطه را نصب کرده اید؟",
"noPortsDiscovered": "هیچ پورتی پیدا نشد",
"noPortsSelected": "هیچ پورتی برای برد انتخاب نشده است.{0}",
@@ -26,7 +26,7 @@
"pleasePickBoard": "لطفاً یک برد متصل به پورتی که انتخاب کرده اید را انتخاب کنید.",
"port": "پورت {0}",
"portLabel": "پورت: {0}",
"ports": "ports",
"ports": "پورت ها",
"programmer": "برنامه ریز",
"reselectLater": "بعدا انتخاب کنید",
"searchBoard": "جستجوی بورد",
@@ -34,18 +34,18 @@
"selectBoardForInfo": "لطفاً یک برد را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.",
"selectPortForInfo": "لطفاً یک پورت را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.",
"showAllAvailablePorts": "نمایش تمام پورت های موجود در صورت فعال بودن",
"showAllPorts": "Show all ports",
"showAllPorts": "نمایش تمام پورت ها",
"succesfullyInstalledPlatform": "نصب پلتفرم موفقیت آمیز بود {0}:{1}",
"succesfullyUninstalledPlatform": "لغو نصب پلتفرم موفقیت آمیز بود. {0}:{1}",
"typeOfPorts": "{0} ports"
"typeOfPorts": "پورت ها{0}"
},
"boardsManager": "مدیریت برد ها",
"boardsType": {
"arduinoCertified": "Arduino Certified"
"arduinoCertified": "گواهی آردینو"
},
"bootloader": {
"burnBootloader": "بارگذاری بوت لودر.",
"burningBootloader": "Burning bootloader...",
"burningBootloader": "بارگذاری بوت لودر",
"doneBurningBootloader": "اتمام بارگذاری بوت لودر."
},
"burnBootloader": {
@@ -69,20 +69,20 @@
"uploadingCertificates": "در حال بارگذاری سند."
},
"checkForUpdates": {
"checkForUpdates": "Check for Arduino Updates",
"installAll": "Install All",
"noUpdates": "There are no recent updates available.",
"promptUpdateBoards": "Updates are available for some of your boards.",
"promptUpdateLibraries": "Updates are available for some of your libraries.",
"updatingBoards": "Updating boards...",
"updatingLibraries": "Updating libraries..."
"checkForUpdates": "بررسی به روزرسانی برای آردینو",
"installAll": "همه را نصب کنید",
"noUpdates": "هیچ به روز رسانی اخیر در دسترس نیست",
"promptUpdateBoards": "به روز رسانی برای برخی از بردها شما در دسترس است.",
"promptUpdateLibraries": "به روز رسانی برای برخی از کتابخانه های شما در دسترس است.",
"updatingBoards": "در حال به روز رسانی بردها ...",
"updatingLibraries": "در حال به روز رسانی کتابخانه ها..."
},
"cli-error-parser": {
"keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?",
"mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?"
"keyboardError": "صفحه کلید پیدا نشد. آیا طرح شما شامل خط \"#include <Keyboard.h>\" است؟",
"mouseError": "\"موس\" پیدا نشد. آیا طرح شما شامل خط \"#include <Mouse.h>\" است؟"
},
"cloud": {
"account": "Account",
"account": "حساب کاربری",
"chooseSketchVisibility": "قابلیت مشاهده طرح خود را انتخاب کنید:",
"connected": "متصل",
"continue": "ادامه",
@@ -90,7 +90,7 @@
"donePushing": "پایان ارسال {0}",
"embed": "قرار دادن:",
"emptySketchbook": "طرح شما خالی است",
"goToCloud": "Go to Cloud",
"goToCloud": "به فضای ابری بروید",
"learnMore": "یادگیری بیشتر",
"link": "لینک:",
"notYetPulled": "نمی توان به ابر ارسال کرد. هنوز دریافت نشده است.",
@@ -108,45 +108,48 @@
"pushSketch": "ارسال طرح",
"pushSketchMsg": "این یک طرح عمومی است. قبل از ارسال، مطمئن شوید که اطلاعات حساس در فایل‌های arduino_secrets.h تعریف شده است. می‌توانید از پانل اشتراک‌گذاری یک طرح را خصوصی کنید.",
"remote": "از راه دور",
"remoteSketchbook": "Remote Sketchbook",
"remoteSketchbook": "کتاب طراحی از راه دور",
"share": "اشتراک گذاری...",
"shareSketch": "اشتراک طرح",
"showHideRemoveSketchbook": "نمایش/پنهان کردن از راه دور منبع طرح ها",
"signIn": "ورود کاربر",
"signInToCloud": "ورود به ابر آردوینو",
"signOut": "خروج کاربر",
"sync": "Sync",
"sync": "همگام سازی",
"syncEditSketches": "طرح های ابر آردوینو خود را همگام سازی و ویرایش کنید",
"visitArduinoCloud": "بازدید از ابر آردوینو برای ساخت ابر طرح ها"
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
"all": "همه",
"contributed": "کمک کرد",
"installManually": "دستی نصب کن",
"later": "بعدا",
"noBoardSelected": "بردی انتخاب نشده",
"notConnected": "[متصل نشد]",
"offlineIndicator": "به نظر می رسد آفلاین هستید. بدون اتصال به اینترنت، رابط ترمینال آردوینو ممکن است نتواند منابع مورد نیاز را دانلود کند و باعث اختلال در عملکرد شود. لطفاً به اینترنت متصل شوید و برنامه را مجدداً راه اندازی کنید.",
"oldFormat": "'{0}' هنوز از قالب قدیمی `.pde` استفاده می کند. آیا می‌خواهید به برنامه افزودنی «.ino» جدید بروید؟",
"partner": "Partner",
"partner": "شریک",
"processing": "در حال محاسبه",
"recommended": "Recommended",
"retired": "Retired",
"recommended": "توصیه شده",
"retired": "بازنشسته",
"selectedOn": "روشن {0}",
"serialMonitor": "نمایشگر ترمینال سریال",
"type": "Type",
"type": "نوع",
"unknown": "نامعلوم",
"updateable": "Updatable"
"updateable": "قابل به روز رسانی"
},
"compile": {
"error": "خطای کامپایل : {0}"
},
"component": {
"boardsIncluded": "Boards included in this package:",
"boardsIncluded": "بردهای موجود در این بسته :",
"by": "توسط",
"filterSearch": "محدود کردن جستجوی شما ...",
"install": "نصب",
"installed": "Installed",
"installed": "نصب شده است",
"moreInfo": "اطلاعات بیشتر",
"uninstall": "لغو نصب",
"uninstallMsg": "آیا شما می خواهید {0} را لغو نصب کنید؟",
@@ -156,26 +159,26 @@
"addFile": "فایل اظافه کن",
"fileAdded": "یک فایل به طرح افزوده شد.",
"plotter": {
"couldNotOpen": "Couldn't open serial plotter"
"couldNotOpen": "پلاتر سریال باز نشد"
},
"replaceTitle": "جایگذاری"
},
"core": {
"compilerWarnings": {
"all": "All",
"default": "Default",
"more": "More",
"none": "None"
"all": "همه",
"default": "پیش فرض",
"more": "بیشتر",
"none": "هیچ یک"
}
},
"coreContribution": {
"copyError": "Copy error messages",
"noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu."
"copyError": "کپی پیام های خطا",
"noBoardSelected": "هیچ بردی انتخاب نشده است. لطفاً برد آردوینو خود را از منوی Tools > Board انتخاب کنید"
},
"daemon": {
"restart": "Restart Daemon",
"start": "Start Daemon",
"stop": "Stop Daemon"
"restart": "راه اندازی مجدد Daemon",
"start": "شروع Daemon",
"stop": " متوقف کردن Daemon"
},
"debug": {
"debugWithMessage": "رفع خطا {0}",
@@ -194,9 +197,9 @@
"decreaseIndent": "برداشتن دندانه",
"increaseFontSize": "افزایش اندازه فونت",
"increaseIndent": "افزودن دندانه",
"nextError": "Next Error",
"previousError": "Previous Error",
"revealError": "Reveal Error"
"nextError": "خطای بعدی",
"previousError": "خطای قبلی",
"revealError": "فاش کردن خطا"
},
"electron": {
"couldNotSave": "ابر طرح را ذخیره نکرد. لطفا کار ذخیره نشده خود را به ویرایشگر متن مورد علاقه خود کپی کنید، و آردوینو را دوباره راه اندازی کنید.",
@@ -234,7 +237,7 @@
"visit": "بازدید از Arduino.cc"
},
"ide-updater": {
"checkForUpdates": "Check for Arduino IDE Updates",
"checkForUpdates": "به روز رسانی آردوینو IDE را بررسی کنید",
"closeAndInstallButton": "بستن و نصب",
"closeToInstallNotice": "نرم افزار را ببندید و به روز رسانی را روی دستگاه خود نصب کنید.",
"downloadButton": "دانلود",
@@ -255,11 +258,11 @@
"arduinoLibraries": "کتابخانه های آردوینو",
"contributedLibraries": "کتابخانه های اشتراکی",
"include": "اضافه کتابخانه",
"installAll": "Install All",
"installLibraryDependencies": "Install library dependencies",
"installAll": "همه را نصب کنید",
"installLibraryDependencies": "وابستگی های کتابخانه را نصب کنید",
"installMissingDependencies": "آیا می خواهید تمام وابستگی های از دست رفته را نصب کنید؟",
"installOneMissingDependency": "آیا می خواهید وابستگی از دست رفته را نصب کنید؟",
"installWithoutDependencies": "Install without dependencies",
"installWithoutDependencies": "بدون وابستگی نصب کنید",
"installedSuccessfully": "نصب کتابخانه {0}:{1} موفقیت آمیز بود.",
"libraryAlreadyExists": "یک کتابخانه از قبل وجود دارد. آیا میخواهید آن را بازنویسی کنید؟",
"manageLibraries": "مدیریت کتابخانه ها...",
@@ -273,35 +276,41 @@
"zipLibrary": "کتابخانه"
},
"librarySearchProperty": {
"topic": "Topic"
"topic": "موضوع"
},
"libraryTopic": {
"communication": "Communication",
"dataProcessing": "Data Processing",
"dataStorage": "Data Storage",
"deviceControl": "Device Control",
"display": "Display",
"other": "Other",
"sensors": "Sensors",
"signalInputOutput": "Signal Input/Output",
"timing": "Timing",
"uncategorized": "Uncategorized"
"communication": "ارتباط",
"dataProcessing": "پردازش داده ها",
"dataStorage": "ذخیره سازی داده ها",
"deviceControl": "کنترل دستگاه",
"display": "نمایش دادن",
"other": "دیگر",
"sensors": "سنسورها",
"signalInputOutput": "سیگنال ورودی/خروجی",
"timing": "زمان سنجی",
"uncategorized": "دسته بندی نشده"
},
"libraryType": {
"installed": "Installed"
"installed": "نصب شده است"
},
"menu": {
"advanced": "Advanced",
"advanced": "پیشرفته",
"sketch": "طرح",
"tools": "ابزار ها"
},
"monitor": {
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
"unableToCloseWebSocket": "بسته شدن وب سوکت ممکن نیست",
"unableToConnectToWebSocket": "اتصال به وب سوکت امکان پذیر نیست"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "نتورک",
"serial": "Serial"
"serial": "سریال"
},
"preferences": {
"additionalManagerURLs": "نشانی‌های اینترنتی مدیر تابلوهای افزوده",
@@ -312,17 +321,17 @@
"automatic": "اتوماتیک",
"board.certificates": "فهرست گواهی‌هایی که می‌توان در تابلوها بارگذاری کرد",
"browse": "مرور کردن",
"checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.",
"checkForUpdate": "اعلان‌های به‌روزرسانی‌های موجود برای IDE، بردها و کتابخانه‌ها را دریافت کنید. پس از تغییر نیاز به راه اندازی مجدد IDE دارد. به طور پیش فرض درست است.",
"choose": "انتخاب",
"cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.",
"cli.daemonDebug": "ثبت اشکال زدایی تماس های gRPC به Arduino CLI را فعال کنید. برای اعمال این تنظیم به راه اندازی مجدد IDE نیاز است. به طور پیش فرض نادرست است",
"cloud.enabled": "اگر فعال بودن توابع همگام سازی طرح درست می باشد ، پیش فرض ها درست است",
"cloud.pull.warn": "اگر هشدار دادن به کاربران قبل از کشیدن یک طرح ابری درست می باشد ، پیش فرض ها صحیح است.",
"cloud.push.warn": "اگر هشدار دادن به کاربران قبل از ارسال یک طرح ابری درست است پیش فرض ها درست می باشد",
"cloud.pushpublic.warn": "اگر هشدار دادن به کاربران قبل از ارسال یک طرح عمومی به فضای درست می باشد پیش فرض ها درست است.",
"cloud.sketchSyncEndpoint": "نقطه ای برای ارسال و دریافت طرح ها استفاده می شود . به طور پیش فرض به رابط ابر آردوینو استفاده می کند.",
"compile": "کامپایل",
"compile.experimental": "True if the IDE should handle multiple compiler errors. False by default",
"compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.",
"compile.experimental": "درست است اگر IDE باید چندین خطای کامپایلر را مدیریت کند. به طور پیش فرض نادرست است",
"compile.revealRange": "نحوه آشکار شدن خطاهای کامپایلر در ویرایشگر پس از تأیید/آپلود ناموفق را تنظیم می کند. مقادیر ممکن: 'auto': در صورت لزوم به صورت عمودی اسکرول کنید و یک خط را نشان دهید. 'مرکز': در صورت لزوم به صورت عمودی اسکرول کنید و یک خط را در مرکز عمودی نشان دهید. 'بالا': در صورت لزوم به صورت عمودی اسکرول کنید و یک خط نزدیک به بالای نمای درگاه را نشان دهید که برای مشاهده تعریف کد بهینه شده است. 'centerIfOutsideViewport': در صورت لزوم به صورت عمودی اسکرول کنید و یک خط در مرکز عمودی را فقط در صورتی نشان دهید که خارج از درگاه دید قرار داشته باشد. مقدار پیش فرض است{0}",
"compile.verbose": "برای خروجی کامپایل پرمخاطب درست است. به طور پیش فرض نادرست است",
"compile.warnings": "به gcc می گوید از کدام سطح هشدار استفاده کند. به طور پیش فرض \"هیچ\" است",
"compilerWarnings": "هشدار های کامپایلر",
@@ -330,28 +339,31 @@
"editorQuickSuggestions": "پیشنهادات سریع ویرایشگر",
"enterAdditionalURLs": "نشانی‌های وب اضافی، یکی برای هر ردیف وارد کنید",
"files.inside.sketches": "نمایش فایل ها در داخل طرح ها",
"ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'",
"ide.updateBaseUrl": "نشانی وب سایت که از آن برای به‌روزرسانی‌ها را دانلود کنیم. پیش‌فرض «https://downloads.arduino.cc/arduino-ide» است",
"ide.updateChannel": "برای به روز رسانی کانال را منتشر کنید 'stable' نسخه پایدار است، 'nightly' جدیدترین ساخت توسعه است.",
"interfaceScale": "مقیاس رابط",
"invalid.editorFontSize": "اندازه فونت ویرایشگر نامعتبر است. باید یک عدد صحیح مثبت باشد.",
"invalid.sketchbook.location": "مکان نامعتبر منبع طرح ها: {0}",
"invalid.theme": "طرح زمینه موجود نیست",
"language.log": "اگر سرور زبان آردوینو باید فایل های گزارش را در پوشه طرح ایجاد کند درست می باشد. در غیر این صورت، نادرست است. به طور پیش فرض نادرست است.",
"language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.",
"language.realTimeDiagnostics": "اگر درست باشد، سرور زبان هنگام تایپ در ویرایشگر، عیب‌یابی بی‌درنگ ارائه می‌کند. به طور پیش فرض نادرست است.",
"manualProxy": "پیکربندی دستی پروکسی",
"network": "نتورک",
"newSketchbookLocation": "مکان جدید منبع طرح ها را مشخص کنید",
"noProxy": "بدون پروکسی",
"proxySettings": {
"hostname": "Host name",
"password": "Password",
"port": "Port number",
"username": "Username"
"hostname": "نام میزبان",
"password": "رمز عبور",
"port": "شماره پورت",
"username": "نام کاربری"
},
"showVerbose": "نمایش خروجی پرمخاطب در طول",
"sketch": {
"inoBlueprint": "مسیر سیستم فایل مطلق به فایل طرح اولیه «.ino». در صورت مشخص شدن، محتوای فایل طرح اولیه برای هر طرح جدید ایجاد شده توسط IDE استفاده خواهد شد. اسکچ ها با محتوای پیش فرض آردوینو در صورتی که مشخص نشده باشند تولید می شوند. فایل های طرح اولیه غیرقابل دسترسی نادیده گرفته می شوند. **برای اعمال این تنظیم به راه اندازی مجدد IDE نیاز است**."
},
"sketchbook.location": "مکان منبع طرح ها",
"sketchbook.showAllFiles": "همه فایل‌های طرح را در داخل طرح نشان دهد درست است. به طور پیش فرض نادرست است.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
"survey.notification": "درست است اگر در صورت وجود نظرسنجی به کاربران اطلاع داده شود. به طور پیش فرض درست است.",
"unofficialBoardSupport": "برای لیستی از آدرس های اینترنتی پشتیبانی هیئت مدیره غیررسمی کلیک کنید",
"upload": "آپلود",
"upload.verbose": "برای خروجی آپلود پرمخاطب درست است. به طور پیش فرض نادرست است.",
@@ -364,12 +376,12 @@
"serial": {
"autoscroll": "پیمایش خودکار",
"carriageReturn": "رفتن به سر سطر",
"message": "Message (Enter to send message to '{0}' on '{1}')",
"message": "پیام (برای ارسال پیام به '' د{0}ر '' وارد شوید{1})",
"newLine": "خط جدید",
"newLineCarriageReturn": "هم NL و هم CR",
"noLineEndings": "بدون پایان خط",
"notConnected": "متصل نشد. برد و پورت را انتخاب کنید تا بطور خودکار متصل شود.",
"openSerialPlotter": "Serial Plotter",
"openSerialPlotter": "سریال رسام",
"timestamp": "برچسب زمانی",
"toggleTimestamp": "اتصال برچسب زمان"
},
@@ -377,20 +389,20 @@
"archiveSketch": "آرشیو طرح",
"cantOpen": "پوشه ای با نام \"{0}\" از قبل وجود دارد. طرح را نمی توان باز کرد",
"close": "آیا شما می خواهید این طرح را ببندید؟",
"compile": "Compiling sketch...",
"configureAndUpload": "Configure and Upload",
"compile": "تدوین طرح...",
"configureAndUpload": "پیکری بندی و بارگذاری",
"createdArchive": "آرشیو {0} ایجاد شد.",
"doneCompiling": "پایان کامپایل کردن",
"doneUploading": "پایان بارگذاری",
"exportBinary": "دریافت خروجی باینری کامپایل شده",
"moving": "جابجا کردن",
"movingMsg": "فایل \"{0}\" باید داخل یک پوشه طرح به نام \"{1}\" باشد.\nاین پوشه را ایجاد کنید، فایل را منتقل کنید و ادامه دهید؟",
"new": "جدید",
"new": "New Sketch",
"openFolder": "بازکردن پوشه",
"openRecent": "باز کردن آخرین ها",
"openSketchInNewWindow": "باز کردن طرح در پنجره جدید.",
"saveFolderAs": "ذخیره پوشه طرح در ...",
"saveSketch": "Save your sketch to open it again later.",
"saveSketch": "طرح خود را ذخیره کنید تا بعداً دوباره باز شود.",
"saveSketchAs": "ذخیره پوشه طرح در ...",
"showFolder": "نمایش پوشه ظرح",
"sketch": "طرح",
@@ -399,27 +411,31 @@
"titleSketchbook": "منبع طرح ها",
"upload": "آپلود",
"uploadUsingProgrammer": "بارگذاری با استفاده از پروگرامر",
"uploading": "Uploading...",
"uploading": "درحال بارگذاری...",
"userFieldsNotFoundError": "عدم یافت شدن فیلد های کاربر برای برد متصل",
"verify": "تائید",
"verifyOrCompile": "تائید / کامپایل"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",
"surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better."
"answerSurvey": "به نظرسنجی پاسخ دهید",
"dismissSurvey": "دیگر نشان نده",
"surveyMessage": "لطفاً با پاسخ دادن به این نظرسنجی فوق العاده کوتاه ما را در پیشرفت خود یاری کنید. ما برای جامعه خود ارزش قائلیم و دوست داریم حامیان خود را کمی بهتر بشناسیم."
},
"updateIndexes": {
"updateIndexes": "Update Indexes",
"updateLibraryIndex": "Update Library Index",
"updatePackageIndex": "Update Package Index"
"updateIndexes": "به روز رسانی شاخص ها",
"updateLibraryIndex": "به روز رسانی فهرست کتابخانه",
"updatePackageIndex": "به روز رسانی فهرست بسته"
},
"upload": {
"error": "خطا {0} : {1}"
},
"userFields": {
"cancel": "لغو",
"enterField": "Enter {0}",
"enterField": "ورود{0}",
"upload": "بارگذاری"
}
},
@@ -430,7 +446,7 @@
"couldNotSave": "ابر طرح را ذخیره نکرد. لطفا کار ذخیره نشده خود را به ویرایشگر متن مورد علاقه خود کپی کنید، و آردوینو را دوباره راه اندازی کنید.",
"daemonOffline": "CLI آفلاین پس زمینه",
"offline": "آفلاین",
"quitTitle": "Are you sure you want to quit?"
"quitTitle": "آیا مطمئن هستید که می خواهید خارج شوید؟"
},
"debug": {
"start": "شروع...",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Sync and edit your Arduino Cloud Sketches",
"visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Network",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Show verbose output during",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Sketchbook location",
"sketchbook.showAllFiles": "True para ipakita lahat ng sketch files sa loob ng isang sketch. Ito ay false by default.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Export Compiled Binary",
"moving": "Moving",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "New",
"new": "New Sketch",
"openFolder": "Open Folder",
"openRecent": "Open Recent",
"openSketchInNewWindow": "Open Sketch in New Window",
@@ -404,6 +416,10 @@
"verify": "Verify",
"verifyOrCompile": "Verify/Compile"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Synchroniser et éditer vos croquis Arduino Cloud.",
"visitArduinoCloud": "Visitez Arduino Cloud pour créer des croquis sut le cloud."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Impossible de fermer le web socket",
"unableToConnectToWebSocket": "Impossible de se connecter au web socket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Réseau",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Afficher la sortie de débogage verbeuse pendant",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Localisation du croquis.",
"sketchbook.showAllFiles": "Vrai pour montrer tous les fichiers croquis à l'intérieur du croquis. La valeur par défaut est faux.",
"survey.notification": "Vrai si les utilisateurs doivent être avertis si une enquête est disponible. Vrai par défaut.",
@@ -385,7 +397,7 @@
"exportBinary": "Exporter les binaires compilés",
"moving": "Déplacement",
"movingMsg": "Le fichier \"{0}\" à besoin d'être à l'intérieur d'un dossier de croquis appelé \"{1}\".\nCréer ce dossier, déplacer le fichier et continuer ?",
"new": "Nouveau",
"new": "New Sketch",
"openFolder": "Ouvrir le dossier",
"openRecent": "Ouvrir les récents",
"openSketchInNewWindow": "Ouvrir le croquis dans une nouvelle fenêtre",
@@ -404,6 +416,10 @@
"verify": "Vérifier",
"verifyOrCompile": "Vérifier / Compiler"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Enquête sur les réponses",
"dismissSurvey": "Ne pas montrer de nouveau",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "סנכרון ועריכת הסקיצה בענן של ארדואינו",
"visitArduinoCloud": "כנס.י לענן של ארדואינו ליצור סקיצה בענן"
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "הכל",
"contributed": "נתרם",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "רשת",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Show verbose output during",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Sketchbook location",
"sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "ייצוא בינארי מקומפל.",
"moving": "מעביר",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "חדש",
"new": "New Sketch",
"openFolder": "פתח תיקיה",
"openRecent": "נפתח לאחרונה",
"openSketchInNewWindow": "Open Sketch in New Window",
@@ -404,6 +416,10 @@
"verify": "בדיקה",
"verifyOrCompile": "בדיקה\\קומפילציה"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "ענה על סקר",
"dismissSurvey": "אל תראה שוב.",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Arduino felhővázlatok szinkronizálása és szerkesztése",
"visitArduinoCloud": "Látogasd meg az Arduino Cloud webhelyet, hogy a felhőben vázlatokat hozhass létre. "
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Hálózat",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Részletes kimenet megjelenítése eközben: ",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "SketchBook elérési helye ",
"sketchbook.showAllFiles": "Kipipálva: az összes vázlatfájl/sketch megjelenítése a vázlaton/sketch-en belül. Alapértelmezés szerint: nincs kipipálva.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Összeállított bináris exportálása",
"moving": "Mozgatás",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "Új",
"new": "New Sketch",
"openFolder": "Mappa megnyitása",
"openRecent": "Legutóbbi megnyitása",
"openSketchInNewWindow": "Vázlat/sketch megnyitása új ablakban",
@@ -404,6 +416,10 @@
"verify": "Ellenőrzés",
"verifyOrCompile": "Ellenőrzés/fordítás"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Sync and edit your Arduino Cloud Sketches",
"visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Network",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Show verbose output during",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Sketchbook location",
"sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Export Compiled Binary",
"moving": "Moving",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "New",
"new": "New Sketch",
"openFolder": "Open Folder",
"openRecent": "Open Recent",
"openSketchInNewWindow": "Open Sketch in New Window",
@@ -404,6 +416,10 @@
"verify": "Verify",
"verifyOrCompile": "Verify/Compile"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -8,7 +8,7 @@
"board": "Scheda{0}",
"boardConfigDialogTitle": "Seleziona un'altra scheda e un'altra porta",
"boardInfo": "Informazioni sulla scheda",
"boards": "boards",
"boards": "schede",
"configDialog1": "Seleziona una scheda ed una porta se vuoi caricare uno sketch.",
"configDialog2": "Se selezioni solo una scheda, potrai compilare, ma non potrai caricare il tuo sketch.",
"couldNotFindPreviouslySelected": "Impossibile trovare la scheda selezionata '{0}' nella piattaforma installata '{1}'. Scegli nuovamente la scheda che vuoi utilizzare. Vuoi sceglierla ora?",
@@ -16,7 +16,7 @@
"getBoardInfo": "Acquisisci informazioni sulla scheda",
"inSketchbook": "(nella raccolta degli sketch)",
"installNow": "Il \"{0} {1}\" core non è installato per la scheda \"{2}\" . Vuoi installarlo ora?",
"noBoardsFound": "Nessuna scheda è stata trovata per \"{0}\"",
"noBoardsFound": "Nessuna scheda trovata per \"{0}\"",
"noFQBN": "La FQBN non è disponibile per la scheda selezionata\"{0}\". Sei sicuro che il core specifico sia stato installato?",
"noPortsDiscovered": "Nessuna porta rilevata",
"noPortsSelected": "Nessuna porta selezionata per la scheda: '{0}'.",
@@ -26,7 +26,7 @@
"pleasePickBoard": "Scegli la scheda collegata alla porta che hai selezionato.",
"port": "Porta{0}",
"portLabel": "Porta: {0}",
"ports": "ports",
"ports": "porte",
"programmer": "Programmatore",
"reselectLater": "Riselezionare più tardi",
"searchBoard": "Seleziona la scheda",
@@ -34,10 +34,10 @@
"selectBoardForInfo": "Seleziona la scheda per la quale desideri informazioni.",
"selectPortForInfo": "Selezionare la porta per ottenere info sulla scheda.",
"showAllAvailablePorts": "Quando abilitato, mostra tutte le porte disponibili",
"showAllPorts": "Show all ports",
"showAllPorts": "Mostra tutte le porte",
"succesfullyInstalledPlatform": "Piattaforma installata correttamente {0}:{1}",
"succesfullyUninstalledPlatform": "Piattaforma disinstallata correttamente {0}:{1}",
"typeOfPorts": "{0} ports"
"typeOfPorts": "{0} porte"
},
"boardsManager": "Gestore schede",
"boardsType": {
@@ -90,7 +90,7 @@
"donePushing": "Invio terminato {0}.",
"embed": "Includi:",
"emptySketchbook": "La raccolta degli sketch è vuota",
"goToCloud": "Go to Cloud",
"goToCloud": "Vai al Cloud",
"learnMore": "Più informazioni",
"link": "Link:",
"notYetPulled": "Sul Cloud non puoi effettuare il push se non hai ancora fatto il pull",
@@ -119,6 +119,9 @@
"syncEditSketches": "Sincronizza e modifica la tua raccolta di Sketches sul Cloud Arduino",
"visitArduinoCloud": "Visita Arduino Cloud per creare Cloud Sketch "
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "Tutti",
"contributed": "Fornita da terzi",
@@ -156,16 +159,16 @@
"addFile": "Aggiungi file...",
"fileAdded": "Aggiunto un file allo sketch.",
"plotter": {
"couldNotOpen": "Couldn't open serial plotter"
"couldNotOpen": "Impossibile aprire la porta seriale"
},
"replaceTitle": "Sostituisci"
},
"core": {
"compilerWarnings": {
"all": "Tutti",
"default": "Default",
"more": "More",
"none": "None"
"default": "Predefinito",
"more": "Altro",
"none": "Nessuno"
}
},
"coreContribution": {
@@ -256,10 +259,10 @@
"contributedLibraries": "Librerie di terze parti",
"include": "Includi Libreria",
"installAll": "Installa tutto",
"installLibraryDependencies": "Install library dependencies",
"installLibraryDependencies": "Installa le dipendenze della libreria",
"installMissingDependencies": "Vorresti installare tutte le dipendenze mancanti?",
"installOneMissingDependency": "Vorresti installare le dipendenze mancanti?",
"installWithoutDependencies": "Install without dependencies",
"installWithoutDependencies": "Installa senza le dipendenze",
"installedSuccessfully": "Libreria installata correttamente 1{0} : 2{1} ",
"libraryAlreadyExists": "Libreria già presente. Vuoi sovrascriverla?",
"manageLibraries": "Gestisci Librerie",
@@ -299,9 +302,15 @@
"unableToCloseWebSocket": "Impossibile chiudere il websocket",
"unableToConnectToWebSocket": "Impossibile connettersi al websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Rete",
"serial": "Serial"
"serial": "Seriale"
},
"preferences": {
"additionalManagerURLs": "URL aggiuntive per il Gestore schede",
@@ -343,12 +352,15 @@
"newSketchbookLocation": "Seleziona un percorso per il nuovo sketchbook",
"noProxy": "Nessun proxy",
"proxySettings": {
"hostname": "Host name",
"hostname": "Nome host",
"password": "Password",
"port": "Port number",
"username": "Username"
"port": "Numero di porta",
"username": "Nome utente"
},
"showVerbose": "Mostra un output dettagliato durante",
"sketch": {
"inoBlueprint": "Percorso assoluto del filesystem per il file predefinito blueprint `.ino`. Se specificato, il contenuto del file blueprint sarà utilizzato per ogni nuovo sketch creato dall'IDE. Se non specificato, gli sketch saranno generati con il contenuto predefinito di Arduino. I file blueprint non accessibili saranno ignorati. **È necessario un riavvio dell'IDE** affinché questa impostazione abbia effetto."
},
"sketchbook.location": "Posizione della raccolta degli sketch",
"sketchbook.showAllFiles": "Vero per mostrare tutti i file relativi contenuti all'interno dello sketch. L'opzione predefinita è falso.",
"survey.notification": "Vero se gli utenti devono essere avvisati quando è disponibile un sondaggio. Vero per impostazione predefinita.",
@@ -378,14 +390,14 @@
"cantOpen": "Una cartella di nome \"{0}\" esiste già. Impossibile aprire lo sketch.",
"close": "Sei sicuro di voler chiudere lo sketch?",
"compile": "Compilazione dello sketch in corso...",
"configureAndUpload": "Configure and Upload",
"configureAndUpload": "Configura e Carica",
"createdArchive": "Creato l'archivio '{0}'.",
"doneCompiling": "Compilazione completata.",
"doneUploading": "Caricamento terminato.",
"exportBinary": "Esporta sketch compilato",
"moving": "Spostando",
"movingMsg": "Il file \"{0}\" deve essere all'interno della cartella \"{1}\".\nCreare questa cartella, spostare il file e continuare?",
"new": "Nuovo",
"new": "New Sketch",
"openFolder": "Apri Cartella",
"openRecent": "Apri recenti",
"openSketchInNewWindow": "Apri lo sketch in una Nuova Finestra.",
@@ -404,15 +416,19 @@
"verify": "Verifica",
"verifyOrCompile": "Verifica/Compila"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Rispondi al questionario",
"dismissSurvey": "Non mostrare più",
"surveyMessage": "Aiutaci a migliorare rispondendo a questo brevissimo questionario. Abbiamo a cuore la nostra comunità e vorremmo conoscere meglio chi ci supporta!"
},
"updateIndexes": {
"updateIndexes": "Update Indexes",
"updateLibraryIndex": "Update Library Index",
"updatePackageIndex": "Update Package Index"
"updateIndexes": "Aggiorna gli indici",
"updateLibraryIndex": "Aggiorna l'indice di libreria",
"updatePackageIndex": "Aggiorna l'indice del pacchetto"
},
"upload": {
"error": "1 {0} errore: 2 {1}"

View File

@@ -90,7 +90,7 @@
"donePushing": "{0}’のプッシュが完了しました。",
"embed": "埋め込み:",
"emptySketchbook": "スケッチブックは空です",
"goToCloud": "Go to Cloud",
"goToCloud": "クラウドへ",
"learnMore": "詳細はこちら",
"link": "リンク:",
"notYetPulled": "クラウドにプッシュできません。まだプルされていません。",
@@ -119,6 +119,9 @@
"syncEditSketches": "Arduinoクラウドスケッチの同期と編集",
"visitArduinoCloud": "Arduino Cloudにアクセスしてクラウドスケッチを作成する"
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "全て",
"contributed": "提供された",
@@ -256,10 +259,10 @@
"contributedLibraries": "提供されたライブラリ",
"include": "ライブラリをインクルード",
"installAll": "全てをインストール",
"installLibraryDependencies": "Install library dependencies",
"installLibraryDependencies": "ライブラリの依存関係をインストール",
"installMissingDependencies": "不足している全ての依存関係をインストールしますか?",
"installOneMissingDependency": "不足している依存関係をインストールしますか?",
"installWithoutDependencies": "Install without dependencies",
"installWithoutDependencies": "依存関係なしにインストール",
"installedSuccessfully": "ライブラリ{0}:{1}のインストールに成功しました。",
"libraryAlreadyExists": "ライブラリはすでに存在しています。上書きしますか?",
"manageLibraries": "ライブラリを管理...",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "websocketを閉じることができません",
"unableToConnectToWebSocket": "websocketに接続することができません"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "ネットワーク",
"serial": "シリアル"
@@ -349,6 +358,9 @@
"username": "ユーザ名"
},
"showVerbose": "より詳細な情報を表示する",
"sketch": {
"inoBlueprint": "デフォルトの `.ino` ブループリント・ファイルへの絶対ファイルシステムパス。指定された場合、IDEによって作成されるすべての新しいスケッチに、ブループリント・ファイルの内容が使用されます。指定されない場合、スケッチはArduinoデフォルトの内容で生成されます。アクセスできないブループリント・ファイルは無視されます。この設定を有効にするには**IDE の再起動が必要**です。"
},
"sketchbook.location": "スケッチブックの場所",
"sketchbook.showAllFiles": "スケッチ内のすべてのスケッチファイルを表示するにはtrueを指定。デフォルトではfalse。",
"survey.notification": "アンケートが利用可能になったとき、通知を受け取る場合はTrueを指定します。デフォルトではTrue。",
@@ -385,7 +397,7 @@
"exportBinary": "コンパイル済みバイナリをエクスポート",
"moving": "移動",
"movingMsg": "ファイル\"{0}\"は、\"{1}\"という名前のスケッチフォルダの中にあることが必要です。\nこのフォルダを作成し、ファイルを移動させ、継続しますか",
"new": "新規",
"new": "New Sketch",
"openFolder": "フォルダを開く",
"openRecent": "最近使った項目を開く",
"openSketchInNewWindow": "新規ウィンドウでスケッチを開く",
@@ -404,6 +416,10 @@
"verify": "検証",
"verifyOrCompile": "検証・コンパイル"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "アンケートに回答する",
"dismissSurvey": "次回から表示しない",

View File

@@ -83,7 +83,7 @@
},
"cloud": {
"account": "계정",
"chooseSketchVisibility": "Choose visibility of your Sketch:",
"chooseSketchVisibility": "보여질 스케치를 선택하세요",
"connected": "연결됨",
"continue": "계속",
"donePulling": "pulling 완료 {0}.",
@@ -119,16 +119,19 @@
"syncEditSketches": "아두이노 클라우드 스케치 동기화 및 편집",
"visitArduinoCloud": "아두이노 클라우드를 방문하여 클라우드 스케치를 만드십시오."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "전체",
"contributed": "Contributed",
"contributed": "공헌된",
"installManually": "수동설치",
"later": "나중에",
"noBoardSelected": "선택된 보드 없음",
"notConnected": "[연결되지 않음]",
"offlineIndicator": "오프라인 상태인 것 같습니다. 인터넷 연결이 없으면 Arduino CLI가 필요한 리소스를 다운로드하지 못하고 오작동을 일으킬 수 있습니다. 인터넷에 연결하고 애플리케이션을 다시 시작해주세요.",
"oldFormat": "'{0}' 파일은 오래된 `.pde` 확장자로 되어있어요. 새로운 `.ino` 확장자로 변경하시겠어요?",
"partner": "Partner",
"partner": "파트너",
"processing": "처리 중",
"recommended": "추천됨",
"retired": "Retired",
@@ -144,7 +147,7 @@
"component": {
"boardsIncluded": "이 패키지에 포함된 보드:",
"by": "by",
"filterSearch": "Filter your search...",
"filterSearch": "필터 검색...",
"install": "설치",
"installed": "설치됨",
"moreInfo": "더 많은 정보",
@@ -163,9 +166,9 @@
"core": {
"compilerWarnings": {
"all": "전체",
"default": "Default",
"more": "More",
"none": "None"
"default": "기본",
"more": "추가",
"none": "없음"
}
},
"coreContribution": {
@@ -253,10 +256,10 @@
"library": {
"addZip": ".ZIP 라이브러리 추가...",
"arduinoLibraries": "아두이노 라이브러리",
"contributedLibraries": "Contributed libraries",
"contributedLibraries": "공헌된 라이브러리들",
"include": "라이브러리 포함",
"installAll": "모두 설치",
"installLibraryDependencies": "Install library dependencies",
"installLibraryDependencies": "라이브러리 종속성 설치",
"installMissingDependencies": "누락된 모든 종속성을 설치하시겠습니까?",
"installOneMissingDependency": "Would you like to install the missing dependency?",
"installWithoutDependencies": "Install without dependencies",
@@ -267,7 +270,7 @@
"needsMultipleDependencies": "라이브러리 <b>{0}:{1}</b> 는 현재 설치되지 않은 다른 종속성이 필요합니다.",
"needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:",
"overwriteExistingLibrary": "기존 라이브러리를 덮어쓰시겠습니까?",
"successfullyInstalledZipLibrary": "Successfully installed library from {0} archive",
"successfullyInstalledZipLibrary": "라이브러리가 {0} 저장소에 성공적으로 설치됨",
"title": "라이브러리 매니저",
"uninstalledSuccessfully": "라이브러리가 성공적으로 제거됨 {0}:{1}",
"zipLibrary": "라이브러리"
@@ -291,7 +294,7 @@
"installed": "설치됨"
},
"menu": {
"advanced": "Advanced",
"advanced": "고급",
"sketch": "스케치",
"tools": "도구"
},
@@ -299,9 +302,15 @@
"unableToCloseWebSocket": "웹소켓을 닫을 수 없습니다.",
"unableToConnectToWebSocket": "웹소켓에 연결 할 수 없습니다."
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "네트워크",
"serial": "Serial"
"serial": "시리얼"
},
"preferences": {
"additionalManagerURLs": "추가 보드 관리자 URL",
@@ -349,6 +358,9 @@
"username": "사용자이름"
},
"showVerbose": "출력 중 자세한 표시",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "스케치북 위치",
"sketchbook.showAllFiles": "스케치 내부의 모든 스케치 파일을 표시하려면 True입니다. 기본은 false입니다.",
"survey.notification": "설문조사를 사용할 수 있는 경우 사용자에게 알림을 보내야 하는 경우 True입니다. 기본은 True입니다.",
@@ -363,18 +375,18 @@
"selectZip": "추가하려는 라이브러리가 포함된 zip 파일을 선택하세요.",
"serial": {
"autoscroll": "자동스크롤",
"carriageReturn": "Carriage Return",
"carriageReturn": "캐리지 리턴",
"message": "Message (Enter to send message to '{0}' on '{1}')",
"newLine": "새 줄",
"newLineCarriageReturn": "Both NL & CR",
"noLineEndings": "No Line Ending",
"notConnected": "연결되지 않음. 자동으로 연결할 보드와 포트를 선택합니다.",
"openSerialPlotter": "시리얼 플로터",
"timestamp": "Timestamp",
"toggleTimestamp": "Toggle Timestamp"
"timestamp": "타임스탬프",
"toggleTimestamp": "타임스탬프 표시"
},
"sketch": {
"archiveSketch": "Archive Sketch",
"archiveSketch": "스케치 압축저장",
"cantOpen": "이름이 \"{0}\" 인 폴더가 이미 존재합니다. 스케치를 열 수 없습니다.",
"close": "스케치를 닫으시겠습니까?",
"compile": "스케치 컴파일중...",
@@ -385,7 +397,7 @@
"exportBinary": "컴파일된 바이너리 내보내기",
"moving": "Moving",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "새 파일",
"new": "New Sketch",
"openFolder": "폴더 열기",
"openRecent": "최근 파일 열기",
"openSketchInNewWindow": "새 창에서 스케치 열기",
@@ -404,6 +416,10 @@
"verify": "확인",
"verifyOrCompile": "확인/컴파일"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "설문조사 응답",
"dismissSurvey": "다시보지 않기",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "သင်၏Arduino Cloud ကုတ်ဖိုင်လ်များကို အင်တာနက်မှတဆင့် အချိန်နှင့်တပြေးညီ ရယူကိုက်ညီစေပြီး တည်းဖြတ်လိုက်ပါ",
"visitArduinoCloud": "ကလောက်ကုတ်ဖိုင်ဖန်တီးရန် Arduino Cloudသို့သွားပါ။"
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "အားလုံး",
"contributed": "ကူညီရေးသားထားသည်များ",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "ဝက်ဘ်ဆော့ကတ်ကိုမပိတ်နိုင်ပါ",
"unableToConnectToWebSocket": "ဝက်ဘ်ဆော့ကတ်သို့မချိတ်ဆက်နိုင်ပါ"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "ကွန်ရက်",
"serial": "အတန်းလိုက်"
@@ -349,6 +358,9 @@
"username": "အသုံးပြုသူအမည်"
},
"showVerbose": "နောက်ပါလုပ်နေစဉ် အချက်အလက်များပိုမိုများပြားစွာပြမည်",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "ကုတ်ဖိုင်လ်စာအုပ်တည်နေရာ",
"sketchbook.showAllFiles": "အမှန်ဖြစ်ပါက ကုတ်ဖိုင်လ်အတွင်း ဖိုင်လ်အားလုံးပြမည်။ မူရင်းတန်ဖိုး - အမှား",
"survey.notification": "စစ်တမ်းကောက်ပါက အသုံးပြုသူကို အသိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်",
@@ -385,7 +397,7 @@
"exportBinary": "ကုတ်ပေါင်းထားသောဘိုင်နရီဖိုင် ထုတ်ပို့မည်",
"moving": "ရွှေ့နေသည်",
"movingMsg": "ဖိုင်လ် \"{0}\" သည် ကုတ်ဖိုင်လ်ဖိုလ်ဒါ \"{1}\"အတွင်းရှိရန်လိုသည်။\nဖိုလ်ဒါတည်ဆောက်ပြီးဖိုင်လ်ကိုရွှေ့မည်လား။",
"new": "အသစ်",
"new": "New Sketch",
"openFolder": "ဖိုလ်ဒါဖွင့်မည်",
"openRecent": "လတ်တလောဖိုင်လ်ဖွင့်မည်",
"openSketchInNewWindow": "ကုတ်ဖိုင်လ်ကို ဝင်းဒိုးအသစ်တွင်ဖွင့်မည်",
@@ -404,6 +416,10 @@
"verify": "စစ်ဆေး",
"verifyOrCompile": "စစ်ဆေး/ကုတ်ပေါင်း"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "စစ်တမ်းကိုဖြေဆိုပါ",
"dismissSurvey": "နောက်ထပ်မပြပါနှင့်",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Sync and edit your Arduino Cloud Sketches",
"visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Network",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Show verbose output during",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Sketchbook location",
"sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Export Compiled Binary",
"moving": "Moving",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "New",
"new": "New Sketch",
"openFolder": "Open Folder",
"openRecent": "Open Recent",
"openSketchInNewWindow": "Open Sketch in New Window",
@@ -404,6 +416,10 @@
"verify": "Verify",
"verifyOrCompile": "Verify/Compile"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Synchroniseer en bewerk uw Arduino Cloud Sketches",
"visitArduinoCloud": "Bezoek Arduino Cloud om Cloud Sketches te maken."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "Alle",
"contributed": "Bijgedragen",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Kan websocket niet sluiten",
"unableToConnectToWebSocket": "Kan geen verbinding maken met websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Netwerk",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Uitgebreide uitvoer weergeven tijdens",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Schetsboek locatie",
"sketchbook.showAllFiles": "Waar om al de schets bestanden in de schets weer te geven. Standaard ingesteld op onwaar.",
"survey.notification": "Waar als gebruikers een melding moeten krijgen als er een enquête beschikbaar is. Standaard is dit waar.",
@@ -385,7 +397,7 @@
"exportBinary": "Gecompileerd binair bestand exporteren",
"moving": "Verplaatsten",
"movingMsg": "Het bestand \"{0}\" moet binnen een schetsmap met de naam \"{1}\" staan.\nMaak deze map, verplaats het bestand, en ga verder?",
"new": "Nieuw",
"new": "New Sketch",
"openFolder": "Map Openen",
"openRecent": "Recentelijk geopend",
"openSketchInNewWindow": "Schets openen in nieuw venster",
@@ -404,6 +416,10 @@
"verify": "Verifiëren",
"verifyOrCompile": "Verifiëren/Compileren"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Antwoord enquête",
"dismissSurvey": "Niet meer laten zien",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Synchronizuj i edytuj swoje szkice w chmurze Arduino",
"visitArduinoCloud": "Odwiedź chmurę Arduino, aby tworzyć szkice w chmurze."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "Wszytko",
"contributed": "Przyczynił się",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Nie można zamknąć gniazda sieciowego",
"unableToConnectToWebSocket": "Nie można połączyć się z gniazdem sieciowym"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Sieć",
"serial": "Szaregowy"
@@ -349,6 +358,9 @@
"username": "Nazwa Użytkownika"
},
"showVerbose": "Pokazuj informacje zwrotne podczas:",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Lokalizacja szkicownika",
"sketchbook.showAllFiles": "Prawda, aby wyświetlać wszystkie pliki ze szkicu. Fałsz jest wartością domyślną.",
"survey.notification": "Prawdziwy, jeśli użytkownicy powinni być powiadamiani o dostępności ankiety. Domyślnie prawdwdziwy.",
@@ -385,7 +397,7 @@
"exportBinary": "Eksportuj skompilowane binarnie",
"moving": "Przenoszenie",
"movingMsg": "Plik \"{0}\" musi znajdować się w folderze szkiców o nazwie \"{1}\".\nCzy utworzyć ten folder, przenieść podany plik i kontynuować?",
"new": "Nowy",
"new": "New Sketch",
"openFolder": "Otwórz folder",
"openRecent": "Otwórz ostatnie",
"openSketchInNewWindow": "Otwórz szkic w nowym oknie.",
@@ -404,6 +416,10 @@
"verify": "Weryfikuj",
"verifyOrCompile": "Weryfikuj/Kompiluj"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Odpowiedz na ankietę",
"dismissSurvey": "Pomóż nam się rozwijać wypełniając tą super krótką ankietę. Cenimy naszą społeczność i chcielibyśmy lepiej poznać tych którzy nas wspierają.",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Sincronizar e editar seus Sketches no Arduino Cloud",
"visitArduinoCloud": "Visite Arduino Cloud para criar Cloud Sketches."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contribuído",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Impossível fechar websocket",
"unableToConnectToWebSocket": "Impossível conectar ao websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Rede",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Mostrar a saída detalhada durante",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Localização dos Sketchbooks",
"sketchbook.showAllFiles": "Verdadeiro para mostrar todos os arquivos de sketch dentro do sketch. Falso é padrão.",
"survey.notification": "Verdadeiro se o usuário deve ser notificado se uma pesquisa estiver disponível. Verdadeiro por padrão",
@@ -385,7 +397,7 @@
"exportBinary": "Exportar Binário Compilado",
"moving": "Movendo",
"movingMsg": "O ficheiro \"{0}\" tem que estar dentro de uma pasta de esboços chamada \"{1}\".\nCriar esta pasta, mover o ficheiro e continuar?",
"new": "Novo",
"new": "New Sketch",
"openFolder": "Abrir Pasta",
"openRecent": "Abrir Recente",
"openSketchInNewWindow": "Abrir sketch em uma nova janela",
@@ -404,6 +416,10 @@
"verify": "Verificar",
"verifyOrCompile": "Verificar/Compilar"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Responder a pesquisa",
"dismissSurvey": "Não mostrar novamente",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Sync and edit your Arduino Cloud Sketches",
"visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Rețea",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Show verbose output during",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Sketchbook location",
"sketchbook.showAllFiles": "Adevărat pentru a afișa toate fișierele tip schița din interiorul schiței. Este fals în modul implicit.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Export Compiled Binary",
"moving": "Moving",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "Nou",
"new": "New Sketch",
"openFolder": "Deschide Folder",
"openRecent": "Deschide Recente",
"openSketchInNewWindow": "Open Sketch in New Window",
@@ -404,6 +416,10 @@
"verify": "Verifică",
"verifyOrCompile": "Verify/Compile"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Синхронизировать и редактировать скетчи в Arduino Cloud",
"visitArduinoCloud": "Посетите Arduino Cloud, чтобы создать скетчи в облаке."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Не удалось закрыть веб-сокет.",
"unableToConnectToWebSocket": "Не удается подключиться к веб-сокету."
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Сеть",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Показывать детализированный вывод при",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Путь к альбому со скетчами",
"sketchbook.showAllFiles": "True - показывать все файлы внутри скетча. По умолчанию - false.",
"survey.notification": "Включите, если пользователи должны получать уведомления, когда появится новый опрос. Включено по умолчанию.",
@@ -385,7 +397,7 @@
"exportBinary": "Экспортировать скомпилированный бинарный файл",
"moving": "Переместить",
"movingMsg": "Файл «{0}» должен быть в папке с именем скетча «{1}». \nСоздать эту папку, переместить файл и продолжить?",
"new": "Новый скетч",
"new": "New Sketch",
"openFolder": "Открыть папку",
"openRecent": "Открыть предыдущий",
"openSketchInNewWindow": "Открыть скетч в новом окне",
@@ -404,6 +416,10 @@
"verify": "Проверить",
"verifyOrCompile": "Проверить/Скомпилировать"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Ответить на опрос",
"dismissSurvey": "Больше не показывать",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Sync and edit your Arduino Cloud Sketches",
"visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Мрежа",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Прикажи детаљан испис током",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Локација радне свеске",
"sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Export Compiled Binary",
"moving": "Премјешта се",
"movingMsg": "Датотека \"{0}\" мора да буде унутар радног директоријума \"{1}\".\nКреирај овај директоријум, премјести датотеку, и настави?",
"new": "Нови",
"new": "New Sketch",
"openFolder": "Отвори директоријум",
"openRecent": "Отвори недавно",
"openSketchInNewWindow": "Отвори рад у новом прозору",
@@ -404,6 +416,10 @@
"verify": "Провјери",
"verifyOrCompile": "Провјери/Преведи"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Arduino Cloud eskizlerinizi eşitleyin ve düzenleyin",
"visitArduinoCloud": "Bulut Eskizleri oluşturmak için Arduino Cloud'u ziyaret edin."
},
"cloudSketch": {
"new": "Yeni Uzak Eskiz"
},
"common": {
"all": "Tümü",
"contributed": "Eklenen",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Websocket kapatılamadı ",
"unableToConnectToWebSocket": "Websocket'e bağlanılamadı"
},
"newCloudSketch": {
"invalidSketchName": "İsim harfler, rakamlar veya altçizgiden oluşmalıdır. Azami uzunluk 36 karakterdir.",
"newSketchTitle": "Yeni bir Uzak Eskiz'in adı",
"notFound": "Uzak eskiz '{0}' çekilemedi. Böyle bir eskiz yok.",
"sketchAlreadyExists": "'{0}' adlı uzak eskiz zaten mevcut."
},
"portProtocol": {
"network": "Ağ",
"serial": "Seri"
@@ -349,6 +358,9 @@
"username": "Kullanıcı adı"
},
"showVerbose": "Ayrıntılı çıktıyı görüntüle",
"sketch": {
"inoBlueprint": "Örnek `.ino` dosyasının tam dosya yoludur. Açıldığında IDE'de oluşturulan her yeni eskizde bu örnek dosya içeriği kullanılır. Açılmadığında eskizler varsayılan Arduino içeriği ile oluşturulur. Ulaşılamayan örnek dosyalar yoksayılır. Bu ayarın etkili olması için **IDE'nin yeniden başlatılması** gerekir."
},
"sketchbook.location": "Eskiz Defteri konumu",
"sketchbook.showAllFiles": "Tüm eskiz dosyalarını eskiz içinde görüntülemek için açın. Varsayılan: kapalı.",
"survey.notification": "Bir anket bulunduğunda kullanıcılara gösterilecekse açın. Varsayılan olarak açıktır.",
@@ -385,7 +397,7 @@
"exportBinary": "Derlenmiş Dosyayı Dışa Aktar",
"moving": "Taşınıyor",
"movingMsg": "\"{0}\" dosyasının \"{1}\" isminde bir eskiz klasörünün içinde olması gerekiyor.\nKlasörü oluştur, dosyayı taşı ve devam et?",
"new": "Yeni",
"new": "Yeni Eskiz",
"openFolder": "Klasörü Aç",
"openRecent": "Yakın Geçmiş",
"openSketchInNewWindow": "Eskizi Yeni Pencerede Aç",
@@ -404,6 +416,10 @@
"verify": "Doğrula",
"verifyOrCompile": "Doğrula/Derle"
},
"sketchbook": {
"newRemoteSketch": "Yeni Uzak Eskiz",
"newSketch": "Yeni Eskiz"
},
"survey": {
"answerSurvey": "Anketi yanıtla",
"dismissSurvey": "Tekrar gösterme",

View File

@@ -8,18 +8,18 @@
"board": "Плата {0}",
"boardConfigDialogTitle": "Оберіть іншу плату або порт",
"boardInfo": "Інформація про плату",
"boards": "boards",
"boards": "плати",
"configDialog1": "Оберіть плату та порт якщо бажаєте завантажити скетч",
"configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.",
"configDialog2": "Якщо вибрати лише плату, ви зможете скомпілювати, але не завантажити свій ескіз.",
"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?",
"disconnected": "Disconnected",
"disconnected": "Від’єднано",
"getBoardInfo": "Отримати інформацію про плату",
"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}\"",
"noBoardsFound": "Для \"{0}\" не знайдено плат",
"noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?",
"noPortsDiscovered": "No ports discovered",
"noPortsSelected": "No ports selected for board: '{0}'.",
"noPortsDiscovered": "Порти не знайдено",
"noPortsSelected": "Немає вибраних портів для плати: '{0}'.",
"noneSelected": "Не обрана плата",
"openBoardsConfig": "Оберіть іншу плату або порт",
"platformMissing": "The platform for the selected '{0}' board is not installed.",
@@ -29,9 +29,9 @@
"ports": "ports",
"programmer": "Programmer",
"reselectLater": "Reselect later",
"searchBoard": "Search board",
"searchBoard": "Шукати плату",
"selectBoard": "Оберіть плату",
"selectBoardForInfo": "Please select a board to obtain board info.",
"selectBoardForInfo": "Виберіть плату, щоб отримати інформацію про плату.",
"selectPortForInfo": "Please select a port to obtain board info.",
"showAllAvailablePorts": "Shows all available ports when enabled",
"showAllPorts": "Show all ports",
@@ -119,6 +119,9 @@
"syncEditSketches": "Sync and edit your Arduino Cloud Sketches",
"visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "Все",
"contributed": "Contributed",
@@ -207,7 +210,7 @@
"couldNotInitializeExamples": "Could not initialize built-in examples.",
"customLibrary": "Examples from Custom Libraries",
"for": "Examples for {0}",
"forAny": "Examples for any board",
"forAny": "Приклади для будь-якої плати",
"menu": "Приклади"
},
"firmware": {
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Мережа",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Show verbose output during",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Sketchbook location",
"sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Export Compiled Binary",
"moving": "Moving",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "Новий",
"new": "New Sketch",
"openFolder": "Відкрити папку",
"openRecent": "Open Recent",
"openSketchInNewWindow": "Open Sketch in New Window",
@@ -404,6 +416,10 @@
"verify": "Перевірити ",
"verifyOrCompile": "Verify/Compile"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Đồng bộ và chỉnh sửa các Arduino Cloud Sketch của bạn",
"visitArduinoCloud": "Truy cập Arduino Cloud để tạo Cloud Sketch."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Mạng",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Hiển thị đầu ra chi tiết trong khi",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Địa điểm chứa sketchbook",
"sketchbook.showAllFiles": "'True' để hiển thị tất cả các tệp sketch trong sketch. Mặc định là 'false'.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Xuất tệp nhị phân đã biên dịch",
"moving": "Chuyển",
"movingMsg": "Tệp \"{0}\" cần phải được chứa trong thư mục sketch tên \"{1}\".\nTạo thư mục này, chuyển tệp tin vào đó, và tiếp tục?",
"new": "Tạo mới",
"new": "New Sketch",
"openFolder": "Mở thư mục",
"openRecent": "Mở gần đây",
"openSketchInNewWindow": "Mở sketch trong cửa sổ mới",
@@ -404,6 +416,10 @@
"verify": "Xác thực",
"verifyOrCompile": "Xác thực/Biên dịch"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "Sync and edit your Arduino Cloud Sketches",
"visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches."
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "All",
"contributed": "Contributed",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "Unable to close websocket",
"unableToConnectToWebSocket": "Unable to connect to websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "Network",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "Show verbose output during",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "Sketchbook location",
"sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "Export Compiled Binary",
"moving": "Moving",
"movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?",
"new": "New",
"new": "New Sketch",
"openFolder": "Open Folder",
"openRecent": "Open Recent",
"openSketchInNewWindow": "Open Sketch in New Window",
@@ -404,6 +416,10 @@
"verify": "Verify",
"verifyOrCompile": "Verify/Compile"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "Answer survey",
"dismissSurvey": "Don't show again",

View File

@@ -90,7 +90,7 @@
"donePushing": "已完成推送 {0}’。",
"embed": "嵌入:",
"emptySketchbook": "你的项目文件夹是空的",
"goToCloud": "Go to Cloud",
"goToCloud": "前往 Cloud",
"learnMore": "查看更多",
"link": "链接:",
"notYetPulled": "无法推送到 Cloud。未被拉取。",
@@ -119,6 +119,9 @@
"syncEditSketches": "同步和编辑 Arduino Cloud 项目",
"visitArduinoCloud": "访问 Arduino Cloud 以创建云项目。"
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "全部",
"contributed": "已贡献",
@@ -132,7 +135,7 @@
"processing": "正在处理中",
"recommended": "推荐",
"retired": "不再支持的",
"selectedOn": "on {0}",
"selectedOn": "{0}",
"serialMonitor": "串口监视器",
"type": "类型",
"unknown": "未知",
@@ -146,7 +149,7 @@
"by": "by",
"filterSearch": "筛选搜索结果......",
"install": "安装",
"installed": "安装",
"installed": "安装",
"moreInfo": "更多信息",
"uninstall": "卸载",
"uninstallMsg": "是否要卸载 {0}",
@@ -256,10 +259,10 @@
"contributedLibraries": "贡献库",
"include": "包含库",
"installAll": "全部安装",
"installLibraryDependencies": "Install library dependencies",
"installLibraryDependencies": "安装库的依赖",
"installMissingDependencies": "是否安装所有缺少的依赖?",
"installOneMissingDependency": "是否安装缺少的依赖?",
"installWithoutDependencies": "Install without dependencies",
"installWithoutDependencies": "仅安装库 (跳过依赖)",
"installedSuccessfully": "已成功安装 {0} 库:{1}",
"libraryAlreadyExists": "库已经存在。是否要覆盖它?",
"manageLibraries": "管理库...",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "无法关闭 websocket",
"unableToConnectToWebSocket": "无法连接 websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "网络",
"serial": "串口"
@@ -349,6 +358,9 @@
"username": "用户名"
},
"showVerbose": "显示详细输出",
"sketch": {
"inoBlueprint": "指定默认 “.ino” 模板文件的绝对路径。如果指定,则该模板文件的内容将被用于 IDE 创建的每一个新 sketch。如果未指定则使用Arduino默认的内容来创建新 sketch。不可用的模板文件将被自动忽略。**需要重启IDE** 以使此设置生效。"
},
"sketchbook.location": "项目文件夹地址",
"sketchbook.showAllFiles": "True 则显示项目中的所有项目文件。默认情况下为 False。",
"survey.notification": "True 则在有调查时应通知用户。默认为 True。",
@@ -385,7 +397,7 @@
"exportBinary": "导出已编译的二进制文件",
"moving": "移动",
"movingMsg": "“{0}” 文件需要位于 “{1}” 项目文件夹中。\n创建此文件夹移动文件然后继续",
"new": "新建",
"new": "New Sketch",
"openFolder": "打开文件夹",
"openRecent": "打开最近",
"openSketchInNewWindow": "在新窗口打开项目",
@@ -404,15 +416,19 @@
"verify": "验证",
"verifyOrCompile": "验证/编译"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "回答问卷",
"dismissSurvey": "不要再显示",
"surveyMessage": "请回答这份很短的调查来帮助我们改进。我们重视我们的社区,也希望能够更好地了解我们的支持者。"
},
"updateIndexes": {
"updateIndexes": "Update Indexes",
"updateLibraryIndex": "Update Library Index",
"updatePackageIndex": "Update Package Index"
"updateIndexes": "更新索引",
"updateLibraryIndex": "更新库索引",
"updatePackageIndex": "更新包索引"
},
"upload": {
"error": "{0} 错误:{1}"

View File

@@ -119,6 +119,9 @@
"syncEditSketches": "同步和編輯您的Arduino Clou草稿",
"visitArduinoCloud": "前往Arduino Cloud建立雲端草稿。"
},
"cloudSketch": {
"new": "New Remote Sketch"
},
"common": {
"all": "所有",
"contributed": "已貢獻",
@@ -299,6 +302,12 @@
"unableToCloseWebSocket": "無法關閉 websocket",
"unableToConnectToWebSocket": "無法連接到 websocket"
},
"newCloudSketch": {
"invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.",
"newSketchTitle": "Name of a new Remote Sketch",
"notFound": "Could not pull the remote sketch '{0}'. It does not exist.",
"sketchAlreadyExists": "Remote sketch '{0}' already exists."
},
"portProtocol": {
"network": "網路",
"serial": "Serial"
@@ -349,6 +358,9 @@
"username": "Username"
},
"showVerbose": "顯示詳細輸出",
"sketch": {
"inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect."
},
"sketchbook.location": "草稿資料夾位置",
"sketchbook.showAllFiles": "True則顯示所有草稿中的草稿檔案。預設為false。",
"survey.notification": "True if users should be notified if a survey is available. True by default.",
@@ -385,7 +397,7 @@
"exportBinary": "會出已編譯的二進位檔",
"moving": "移動",
"movingMsg": "\"{0}\"必須在命名為\"{1}\"的草稿資料夾中。建立這個資料夾,移動草稿並繼續?",
"new": "新增",
"new": "New Sketch",
"openFolder": "打開資料夾",
"openRecent": "開啟最近的",
"openSketchInNewWindow": "在新視窗開啟草稿",
@@ -404,6 +416,10 @@
"verify": "驗證",
"verifyOrCompile": "驗證/編譯"
},
"sketchbook": {
"newRemoteSketch": "New Remote Sketch",
"newSketch": "New Sketch"
},
"survey": {
"answerSurvey": "回覆問卷",
"dismissSurvey": "不要再顯示",

View File

@@ -1,13 +1,13 @@
{
"name": "arduino-ide",
"version": "2.0.1",
"version": "2.0.3",
"description": "Arduino IDE",
"repository": "https://github.com/arduino/arduino-ide.git",
"author": "Arduino SA",
"license": "AGPL-3.0-or-later",
"private": true,
"engines": {
"node": ">=14.0.0 <15"
"node": ">=16.0.0 <17"
},
"devDependencies": {
"@theia/cli": "1.25.0",
@@ -26,7 +26,7 @@
"ignore-styles": "^5.0.1",
"lerna": "^3.20.2",
"lint-staged": "^11.0.0",
"node-gyp": "^9.0.0",
"node-gyp": "^9.3.0",
"prettier": "^2.3.1",
"reflect-metadata": "^0.1.10",
"rimraf": "^2.6.1",
@@ -37,7 +37,8 @@
"xhr2": "^0.2.1"
},
"resolutions": {
"@types/react": "16.14.25"
"@types/react": "16.14.25",
"electron-rebuild": "3.2.9"
},
"scripts": {
"prepare": "lerna run prepare && yarn download:plugins",

Some files were not shown because too many files have changed in this diff Show More