mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-03 23:53:56 +03:00
Compare commits
106 Commits
belt-print
...
feat/plugi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4e26e7233e | ||
|
|
f33bf459ba | ||
|
|
43bc76d9a9 | ||
|
|
aa7986b8d0 | ||
|
|
02799e68ed | ||
|
|
e4566d32be | ||
|
|
0918f9319c | ||
|
|
da04681289 | ||
|
|
32756f0402 | ||
|
|
6c89dd4e50 | ||
|
|
a564a01013 | ||
|
|
c00d284786 | ||
|
|
c334d05214 | ||
|
|
6fd1176661 | ||
|
|
e3c6ec309d | ||
|
|
ba41b54c4b | ||
|
|
3668b01721 | ||
|
|
db8e03dbc7 | ||
|
|
e5fd028caa | ||
|
|
adc8763099 | ||
|
|
036bd7bcec | ||
|
|
d24e7f75ef | ||
|
|
0f88b88f3b | ||
|
|
464a81d585 | ||
|
|
4c58d0adf8 | ||
|
|
ce6c2ec7ce | ||
|
|
dbe99d0d6f | ||
|
|
25b29c0b53 | ||
|
|
5bccc25705 | ||
|
|
a6ccbced03 | ||
|
|
c7b28565ef | ||
|
|
66b3e27af3 | ||
|
|
3bc2c51fe9 | ||
|
|
ecddf3d18f | ||
|
|
187beb68c3 | ||
|
|
7d62ded630 | ||
|
|
395e070a0e | ||
|
|
895488048c | ||
|
|
ff556f2867 | ||
|
|
81546a1b56 | ||
|
|
ec954696b4 | ||
|
|
f516f47c8e | ||
|
|
6b886b04f2 | ||
|
|
ac79886c5c | ||
|
|
43a83397d4 | ||
|
|
ced980e6a8 | ||
|
|
57297d5ab1 | ||
|
|
49fe64cb07 | ||
|
|
8d84204aeb | ||
|
|
9af07685fd | ||
|
|
e39be23d6d | ||
|
|
8ba9630e53 | ||
|
|
1a89c18ff2 | ||
|
|
0541918592 | ||
|
|
3c8c667dbd | ||
|
|
03568b5200 | ||
|
|
3cf0f4dba5 | ||
|
|
59e655dd1d | ||
|
|
19be9604de | ||
|
|
8e868118d2 | ||
|
|
f13f67959c | ||
|
|
ae2c36f091 | ||
|
|
14e572db5f | ||
|
|
449a4cf9fc | ||
|
|
943a75af0a | ||
|
|
02bc8969a2 | ||
|
|
c2e91cb86c | ||
|
|
a0846ec215 | ||
|
|
0e8288de36 | ||
|
|
0e4928f200 | ||
|
|
8cb2e4e01e | ||
|
|
cdc336d80c | ||
|
|
eae002da13 | ||
|
|
b7240ab1c6 | ||
|
|
1ab34a7454 | ||
|
|
7d0fd272b5 | ||
|
|
d13958ac54 | ||
|
|
599f606f6f | ||
|
|
cc6929e506 | ||
|
|
14ad533d91 | ||
|
|
981cd599d5 | ||
|
|
9ec93deeda | ||
|
|
99dea01cc3 | ||
|
|
8522cc5f67 | ||
|
|
b226919217 | ||
|
|
9ee357b77f | ||
|
|
ca388f2d9e | ||
|
|
b142da72d8 | ||
|
|
2ec8aa7b6c | ||
|
|
0b3f5050b0 | ||
|
|
a5453acdc5 | ||
|
|
6690bdf149 | ||
|
|
bb9bc04996 | ||
|
|
246d54a6bf | ||
|
|
15952edf4d | ||
|
|
8a6573db19 | ||
|
|
353e9519f0 | ||
|
|
1c8c7820c8 | ||
|
|
e87b0d57b4 | ||
|
|
7a992b397b | ||
|
|
e785f89833 | ||
|
|
8f2ff7447e | ||
|
|
25c0cf2943 | ||
|
|
59c7809ee1 | ||
|
|
caa5bb38ea | ||
|
|
78daf90c95 |
2
.github/workflows/auto-close-duplicates.yml
vendored
2
.github/workflows/auto-close-duplicates.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
|
||||
@@ -29,7 +29,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
|
||||
8
.github/workflows/build_all.yml
vendored
8
.github/workflows/build_all.yml
vendored
@@ -131,7 +131,7 @@ jobs:
|
||||
if: ${{ !cancelled() && success() }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
sparse-checkout: |
|
||||
.github
|
||||
@@ -204,7 +204,7 @@ jobs:
|
||||
- name: "Remove unneeded stuff to free disk space"
|
||||
run:
|
||||
rm -rf /usr/local/lib/android/* /usr/share/dotnet/* /opt/ghc1/* "/usr/local/share/boost1/*" /opt/hostedtoolcache1/*
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
- name: Get the version and date
|
||||
run: |
|
||||
ver_pure=$(grep 'set(SoftFever_VERSION' version.inc | cut -d '"' -f2)
|
||||
@@ -223,14 +223,14 @@ jobs:
|
||||
# Manage flatpak-builder cache externally so PRs restore but never upload
|
||||
- name: Restore flatpak-builder cache
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: actions/cache/restore@v5
|
||||
uses: actions/cache/restore@v6
|
||||
with:
|
||||
path: .flatpak-builder
|
||||
key: flatpak-builder-${{ matrix.variant.arch }}-${{ github.event.pull_request.base.sha }}
|
||||
restore-keys: flatpak-builder-${{ matrix.variant.arch }}-
|
||||
- name: Save/restore flatpak-builder cache
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: .flatpak-builder
|
||||
key: flatpak-builder-${{ matrix.variant.arch }}-${{ github.sha }}
|
||||
|
||||
4
.github/workflows/build_check_cache.yml
vendored
4
.github/workflows/build_check_cache.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
valid-cache: ${{ steps.cache_deps.outputs.cache-hit }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
lfs: 'false'
|
||||
|
||||
@@ -46,7 +46,7 @@ jobs:
|
||||
|
||||
- name: load cache
|
||||
id: cache_deps
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ${{ steps.set_outputs.outputs.cache-path }}
|
||||
key: ${{ steps.set_outputs.outputs.cache-key }}
|
||||
|
||||
4
.github/workflows/build_deps.yml
vendored
4
.github/workflows/build_deps.yml
vendored
@@ -34,12 +34,12 @@ jobs:
|
||||
|
||||
# Setup the environment
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
lfs: 'false'
|
||||
|
||||
- name: load cached deps
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ${{ inputs.cache-path }}
|
||||
key: ${{ inputs.cache-key }}
|
||||
|
||||
9
.github/workflows/build_orca.yml
vendored
9
.github/workflows/build_orca.yml
vendored
@@ -37,13 +37,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
lfs: 'false'
|
||||
|
||||
- name: load cached deps
|
||||
if: ${{ !(runner.os == 'macOS' && inputs.macos-combine-only) }}
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ${{ inputs.cache-path }}
|
||||
key: ${{ inputs.cache-key }}
|
||||
@@ -204,9 +204,14 @@ jobs:
|
||||
security list-keychain -d user -s $KEYCHAIN_PATH
|
||||
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $P12_PASSWORD $KEYCHAIN_PATH
|
||||
codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer.app
|
||||
# --deep is deprecated and signing/sealing can fail or skip files in
|
||||
# non-standard layouts (python/bin, python/lib/**, tools/uv). Verify
|
||||
# here so coverage gaps fail at CI time rather than at notarization.
|
||||
codesign --verify --deep --strict --verbose=2 ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer.app
|
||||
# Sign OrcaSlicer_profile_validator.app if it exists
|
||||
if [ -f "${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app/Contents/MacOS/OrcaSlicer_profile_validator" ]; then
|
||||
codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app
|
||||
codesign --verify --deep --strict --verbose=2 ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app
|
||||
fi
|
||||
|
||||
# Create main OrcaSlicer DMG without the profile validator helper
|
||||
|
||||
2
.github/workflows/check_locale.yml
vendored
2
.github/workflows/check_locale.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Install gettext
|
||||
run: |
|
||||
|
||||
146
.github/workflows/check_profiles.yml
vendored
146
.github/workflows/check_profiles.yml
vendored
@@ -24,7 +24,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Run extra JSON check
|
||||
id: extra_json_check
|
||||
@@ -49,17 +49,129 @@ jobs:
|
||||
set +e
|
||||
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2 2>&1 | tee ${{ runner.temp }}/validate_system.log
|
||||
exit ${PIPESTATUS[0]}
|
||||
# For now run filament subtype check only for BBL profiles until we fix other vendors' profiles.
|
||||
- name: validate filament subtype check for BBL profiles
|
||||
id: validate_filament_subtypes
|
||||
continue-on-error: true
|
||||
run: |
|
||||
set +e
|
||||
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2 -v BBL -f 2>&1 | tee ${{ runner.temp }}/validate_filament_subtypes.log
|
||||
exit ${PIPESTATUS[0]}
|
||||
# Flag inherits/compatible_printers/compatible_prints references that point at a deleted or
|
||||
# renamed preset. Opt-in per vendor for now (via -r); enabled for BBL and Qidi until other
|
||||
# vendors' profiles are cleaned up. Runs before the custom-preset injection below.
|
||||
- name: validate preset references for BBL and Qidi profiles
|
||||
id: validate_preset_references
|
||||
continue-on-error: true
|
||||
run: |
|
||||
set +e
|
||||
rc=0
|
||||
for v in BBL Qidi; do
|
||||
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2 -v "$v" -r 2>&1 | tee -a ${{ runner.temp }}/validate_preset_references.log
|
||||
[ ${PIPESTATUS[0]} -ne 0 ] && rc=1
|
||||
done
|
||||
exit $rc
|
||||
|
||||
- name: validate custom presets
|
||||
id: validate_custom
|
||||
continue-on-error: true
|
||||
working-directory: ${{ github.workspace }}
|
||||
run: |
|
||||
set +e
|
||||
curl -LJO https://github.com/OrcaSlicer/OrcaSlicer/releases/download/nightly-builds/orca_custom_preset_tests.zip
|
||||
unzip -q ./orca_custom_preset_tests.zip -d ${{ github.workspace }}/resources/profiles
|
||||
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2 2>&1 | tee ${{ runner.temp }}/validate_custom.log
|
||||
exit ${PIPESTATUS[0]}
|
||||
fixtures_dir="${{ runner.temp }}/profile-fixtures"
|
||||
output_dir="${{ runner.temp }}/custom-preset-validation"
|
||||
combined_log="${{ runner.temp }}/validate_custom.log"
|
||||
summary="${output_dir}/summary.md"
|
||||
release_url="https://github.com/OrcaSlicer/OrcaSlicer-profile-validator/releases/download/fixture-archive"
|
||||
|
||||
rm -rf "${fixtures_dir}" "${output_dir}"
|
||||
mkdir -p "${fixtures_dir}" "${output_dir}"
|
||||
|
||||
curl -fsSL -o "${fixtures_dir}/manifest.json" "${release_url}/manifest.json"
|
||||
|
||||
MANIFEST_PATH="${fixtures_dir}/manifest.json" python3 <<'PY' > "${fixtures_dir}/fixtures.tsv"
|
||||
import json
|
||||
import os
|
||||
|
||||
with open(os.environ["MANIFEST_PATH"], encoding="utf-8") as fh:
|
||||
manifest = json.load(fh)
|
||||
|
||||
if isinstance(manifest, dict):
|
||||
entries = manifest.get("fixtures", [])
|
||||
else:
|
||||
entries = manifest
|
||||
|
||||
for entry in entries:
|
||||
version = entry.get("version", "")
|
||||
asset = entry.get("asset", "")
|
||||
sha256 = entry.get("asset_sha256", "")
|
||||
if not version or not asset:
|
||||
continue
|
||||
print(f"{version}\t{asset}\t{sha256}")
|
||||
PY
|
||||
|
||||
if [ ! -s "${fixtures_dir}/fixtures.tsv" ]; then
|
||||
echo "No custom preset fixtures found in ${release_url}/manifest.json" | tee "${combined_log}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
{
|
||||
echo "## Custom Preset Fixture Validation"
|
||||
echo ""
|
||||
echo "| Version | Status | Log |"
|
||||
echo "| --- | --- | --- |"
|
||||
} > "${summary}"
|
||||
|
||||
status=0
|
||||
failed_logs=()
|
||||
|
||||
while IFS=$'\t' read -r version asset expected_sha256; do
|
||||
fixture_zip="${fixtures_dir}/${asset}"
|
||||
asset_url_name="$(python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))' "${asset}")"
|
||||
profile_tree="${output_dir}/profiles-${version}"
|
||||
log_path="${output_dir}/${version}.log"
|
||||
|
||||
curl -fsSL -o "${fixture_zip}" "${release_url}/${asset_url_name}"
|
||||
|
||||
if [ -n "${expected_sha256}" ] && [ "${expected_sha256}" != "<sha256>" ]; then
|
||||
echo "${expected_sha256} ${fixture_zip}" | sha256sum -c -
|
||||
fi
|
||||
|
||||
rm -rf "${profile_tree}"
|
||||
mkdir -p "${profile_tree}"
|
||||
cp -a "${{ github.workspace }}/resources/profiles/." "${profile_tree}/"
|
||||
rm -rf "${profile_tree}/user"
|
||||
unzip -q "${fixture_zip}" -d "${profile_tree}"
|
||||
|
||||
set +e
|
||||
./OrcaSlicer_profile_validator -p "${profile_tree}" -l 2 > "${log_path}" 2>&1
|
||||
result=$?
|
||||
set -e
|
||||
|
||||
if [ "${result}" -eq 0 ]; then
|
||||
echo "| ${version} | PASS | ${version}.log |" >> "${summary}"
|
||||
else
|
||||
echo "| ${version} | FAIL | ${version}.log |" >> "${summary}"
|
||||
failed_logs+=("${log_path}")
|
||||
status=1
|
||||
fi
|
||||
done < "${fixtures_dir}/fixtures.tsv"
|
||||
|
||||
{
|
||||
cat "${summary}"
|
||||
if [ "${#failed_logs[@]}" -gt 0 ]; then
|
||||
echo ""
|
||||
echo "## Failed Fixture Logs"
|
||||
for log_path in "${failed_logs[@]}"; do
|
||||
echo ""
|
||||
echo "### $(basename "${log_path}" .log)"
|
||||
echo '```'
|
||||
head -c 12000 "${log_path}" || echo "No output captured"
|
||||
echo '```'
|
||||
done
|
||||
fi
|
||||
} | tee "${combined_log}"
|
||||
|
||||
exit "${status}"
|
||||
|
||||
- name: Prepare PR number for comment workflow
|
||||
if: ${{ always() && github.event_name == 'pull_request' }}
|
||||
@@ -68,7 +180,7 @@ jobs:
|
||||
echo "${{ github.event.pull_request.number }}" > ${{ runner.temp }}/profile-check-results/pr_number.txt
|
||||
|
||||
- name: Prepare comment artifact
|
||||
if: ${{ always() && github.event_name == 'pull_request' && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
|
||||
if: ${{ always() && github.event_name == 'pull_request' && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_preset_references.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
|
||||
run: |
|
||||
{
|
||||
# Marker matched by check_profiles_comment.yml to delete prior comments.
|
||||
@@ -94,6 +206,24 @@ jobs:
|
||||
echo ""
|
||||
fi
|
||||
|
||||
if [ "${{ steps.validate_filament_subtypes.outcome }}" = "failure" ]; then
|
||||
echo "### BBL Filament Subtype Validation Failed"
|
||||
echo ""
|
||||
echo '```'
|
||||
head -c 30000 ${{ runner.temp }}/validate_filament_subtypes.log || echo "No output captured"
|
||||
echo '```'
|
||||
echo ""
|
||||
fi
|
||||
|
||||
if [ "${{ steps.validate_preset_references.outcome }}" = "failure" ]; then
|
||||
echo "### BBL/Qidi Preset Reference Validation Failed"
|
||||
echo ""
|
||||
echo '```'
|
||||
head -c 30000 ${{ runner.temp }}/validate_preset_references.log || echo "No output captured"
|
||||
echo '```'
|
||||
echo ""
|
||||
fi
|
||||
|
||||
if [ "${{ steps.validate_custom.outcome }}" = "failure" ]; then
|
||||
echo "### Custom Preset Validation Failed"
|
||||
echo ""
|
||||
@@ -116,7 +246,7 @@ jobs:
|
||||
retention-days: 1
|
||||
|
||||
- name: Fail if any check failed
|
||||
if: ${{ always() && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
|
||||
if: ${{ always() && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_preset_references.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
|
||||
run: |
|
||||
echo "One or more profile checks failed. See above for details."
|
||||
exit 1
|
||||
|
||||
2
.github/workflows/dedupe-issues.yml
vendored
2
.github/workflows/dedupe-issues.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Run Claude Code slash command
|
||||
uses: anthropics/claude-code-base-action@beta
|
||||
|
||||
2
.github/workflows/doxygen-docs.yml
vendored
2
.github/workflows/doxygen-docs.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
remove-existing-swap-files: true
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Install Doxygen and Graphviz
|
||||
run: |
|
||||
|
||||
4
.github/workflows/shellcheck.yml
vendored
4
.github/workflows/shellcheck.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
steps:
|
||||
- name: Cache shellcheck download
|
||||
id: cache-shellcheck-v0_11
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ~/shellcheck
|
||||
key: ${{ runner.os }}-shellcheck-v0_11
|
||||
@@ -36,7 +36,7 @@ jobs:
|
||||
tar -xvf ~/sc.tar.xz -C ~
|
||||
mv ~/shellcheck-"${INPUT_VERSION}"/shellcheck ~/shellcheck
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
|
||||
2
.github/workflows/update-translation.yml
vendored
2
.github/workflows/update-translation.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v6
|
||||
|
||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -45,4 +45,7 @@ test.js
|
||||
.clangd
|
||||
internal_docs/
|
||||
*.flatpak
|
||||
/flatpak-repo/
|
||||
/flatpak-repo/
|
||||
# Python bytecode
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
218
CMakeLists.txt
218
CMakeLists.txt
@@ -125,6 +125,131 @@ option(SLIC3R_PCH "Use precompiled headers" 1)
|
||||
option(SLIC3R_MSVC_COMPILE_PARALLEL "Compile on Visual Studio in parallel" 1)
|
||||
option(SLIC3R_MSVC_PDB "Generate PDB files on MSVC in Release mode" 1)
|
||||
option(SLIC3R_ASAN "Enable ASan on Clang and GCC" 0)
|
||||
|
||||
# Python stubgen module
|
||||
option(ORCA_BUILD_PYTHON_STUBGEN_MODULE "Build importable Python module for pybind11-stubgen" ON)
|
||||
set(ORCA_BUNDLED_UV_EXECUTABLE "" CACHE FILEPATH "Path to a uv executable to bundle for Python package installation. Leave empty to auto-download.")
|
||||
|
||||
# Auto-download uv if not provided by the user.
|
||||
# uv is pinned: the executable ships inside the signed app, so the build must
|
||||
# be reproducible and the download verified. To upgrade, bump ORCA_UV_VERSION
|
||||
# and refresh every hash below from the release's .sha256 assets, e.g.:
|
||||
# curl -sL https://github.com/astral-sh/uv/releases/download/<ver>/uv-<triple>.tar.gz.sha256
|
||||
set(ORCA_UV_VERSION "0.11.21")
|
||||
set(ORCA_UV_SHA256_aarch64-apple-darwin "1f921d491ba5ffeea774eb04d6681ecee379101341cbb1500394993b541bf3f4")
|
||||
set(ORCA_UV_SHA256_x86_64-apple-darwin "f3c8e5708a84b920c18b691214d54d2b0da6b984789caae95d47c95120cb7765")
|
||||
set(ORCA_UV_SHA256_aarch64-unknown-linux-gnu "88e800834007cc5efd4675f166eb2a51e7e3ad19876d85fa8805a6fb5c922397")
|
||||
set(ORCA_UV_SHA256_x86_64-unknown-linux-gnu "8c88519b0ef0af9801fcdee419bbb12116bd9e6b18e162ae093c932d8b264050")
|
||||
set(ORCA_UV_SHA256_x86_64-pc-windows-msvc "ace861f360c6de2babedc1607d0f454b6b09a820dbc8182dc15af927e4df9589")
|
||||
|
||||
# Version-scoped cache dir so a version bump invalidates the cached binary.
|
||||
set(ORCA_UV_DOWNLOAD_DIR "${CMAKE_BINARY_DIR}/.uv/${ORCA_UV_VERSION}")
|
||||
set(ORCA_UV_BINARY "${ORCA_UV_DOWNLOAD_DIR}/uv")
|
||||
if(WIN32)
|
||||
set(ORCA_UV_BINARY "${ORCA_UV_DOWNLOAD_DIR}/uv.exe")
|
||||
endif()
|
||||
|
||||
# Older configures FORCE-cached the auto-downloaded path; any cache entry
|
||||
# under .uv/ is that legacy value -- clear it so auto-download re-resolves
|
||||
# (user-provided paths never live under .uv/).
|
||||
if(ORCA_BUNDLED_UV_EXECUTABLE MATCHES "/\\.uv/")
|
||||
set(ORCA_BUNDLED_UV_EXECUTABLE "" CACHE FILEPATH "Path to the auto-downloaded uv executable" FORCE)
|
||||
endif()
|
||||
|
||||
if(NOT ORCA_BUNDLED_UV_EXECUTABLE)
|
||||
if(NOT EXISTS "${ORCA_UV_BINARY}")
|
||||
# Select uv by TARGET arch. On macOS universal builds each leg sets a single
|
||||
# CMAKE_OSX_ARCHITECTURES (and the x86_64 leg cross-builds on an arm64 runner),
|
||||
# so prefer it over the host CMAKE_SYSTEM_PROCESSOR -- otherwise both legs fetch
|
||||
# the same arch and the later universal lipo merge of tools/uv/uv fails.
|
||||
set(_orca_uv_proc "${CMAKE_SYSTEM_PROCESSOR}")
|
||||
if(APPLE AND CMAKE_OSX_ARCHITECTURES)
|
||||
set(_orca_uv_proc "${CMAKE_OSX_ARCHITECTURES}")
|
||||
endif()
|
||||
# All release archives are tar.gz except the Windows zip.
|
||||
set(ORCA_UV_EXT "tar.gz")
|
||||
if(_orca_uv_proc MATCHES "x86_64|AMD64|amd64")
|
||||
if(WIN32)
|
||||
set(ORCA_UV_ARCH "x86_64-pc-windows-msvc")
|
||||
set(ORCA_UV_EXT "zip")
|
||||
elseif(APPLE)
|
||||
set(ORCA_UV_ARCH "x86_64-apple-darwin")
|
||||
else()
|
||||
set(ORCA_UV_ARCH "x86_64-unknown-linux-gnu")
|
||||
endif()
|
||||
elseif(_orca_uv_proc MATCHES "aarch64|arm64|ARM64")
|
||||
if(APPLE)
|
||||
set(ORCA_UV_ARCH "aarch64-apple-darwin")
|
||||
else()
|
||||
set(ORCA_UV_ARCH "aarch64-unknown-linux-gnu")
|
||||
endif()
|
||||
else()
|
||||
message(WARNING "Unsupported architecture for auto-downloading uv: ${_orca_uv_proc}")
|
||||
endif()
|
||||
|
||||
if(ORCA_UV_ARCH)
|
||||
set(ORCA_UV_URL "https://github.com/astral-sh/uv/releases/download/${ORCA_UV_VERSION}/uv-${ORCA_UV_ARCH}.${ORCA_UV_EXT}")
|
||||
set(ORCA_UV_ARCHIVE "${ORCA_UV_DOWNLOAD_DIR}/uv-archive.${ORCA_UV_EXT}")
|
||||
file(MAKE_DIRECTORY "${ORCA_UV_DOWNLOAD_DIR}")
|
||||
message(STATUS "Downloading uv ${ORCA_UV_VERSION} from ${ORCA_UV_URL} ...")
|
||||
file(DOWNLOAD "${ORCA_UV_URL}" "${ORCA_UV_ARCHIVE}" STATUS ORCA_UV_DL_STATUS TLS_VERIFY ON)
|
||||
list(GET ORCA_UV_DL_STATUS 0 ORCA_UV_DL_CODE)
|
||||
list(GET ORCA_UV_DL_STATUS 1 ORCA_UV_DL_MSG)
|
||||
if(NOT ORCA_UV_DL_CODE EQUAL 0)
|
||||
# Network failure keeps the historical graceful degradation (uv is
|
||||
# optional at build time) -- but a hash mismatch below is fatal.
|
||||
message(WARNING "Failed to download uv: ${ORCA_UV_DL_MSG}")
|
||||
file(REMOVE "${ORCA_UV_ARCHIVE}")
|
||||
else()
|
||||
file(SHA256 "${ORCA_UV_ARCHIVE}" _orca_uv_actual_sha256)
|
||||
if(NOT _orca_uv_actual_sha256 STREQUAL "${ORCA_UV_SHA256_${ORCA_UV_ARCH}}")
|
||||
file(REMOVE "${ORCA_UV_ARCHIVE}")
|
||||
message(FATAL_ERROR
|
||||
"uv archive checksum mismatch for ${ORCA_UV_ARCH} ${ORCA_UV_VERSION}:\n"
|
||||
" expected ${ORCA_UV_SHA256_${ORCA_UV_ARCH}}\n"
|
||||
" actual ${_orca_uv_actual_sha256}\n"
|
||||
"Possible tampering or a stale pin; refusing to bundle.")
|
||||
endif()
|
||||
message(STATUS "Extracting uv ...")
|
||||
file(ARCHIVE_EXTRACT INPUT "${ORCA_UV_ARCHIVE}" DESTINATION "${ORCA_UV_DOWNLOAD_DIR}")
|
||||
file(REMOVE "${ORCA_UV_ARCHIVE}")
|
||||
# Pinned archives have a fixed layout: the tarballs hold
|
||||
# uv-<triple>/uv, the Windows zip holds uv.exe at the root
|
||||
# (already at ORCA_UV_BINARY). A layout change implies a new
|
||||
# archive, hence a hash bump -- and RENAME fails loudly.
|
||||
if(NOT WIN32)
|
||||
file(RENAME "${ORCA_UV_DOWNLOAD_DIR}/uv-${ORCA_UV_ARCH}/uv" "${ORCA_UV_BINARY}")
|
||||
file(REMOVE_RECURSE "${ORCA_UV_DOWNLOAD_DIR}/uv-${ORCA_UV_ARCH}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(EXISTS "${ORCA_UV_BINARY}")
|
||||
# Plain set (shadows the empty cache entry for this configure run):
|
||||
# the version-scoped path re-derives every configure, so a version
|
||||
# bump takes effect in warm build dirs without cache surgery.
|
||||
set(ORCA_BUNDLED_UV_EXECUTABLE "${ORCA_UV_BINARY}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Resolve ORCA_BUNDLED_UV_EXECUTABLE -> ORCA_BUNDLED_UV_EXECUTABLE_CONFIG / ORCA_BUNDLED_UV_FILENAME
|
||||
# Must run before add_subdirectory(src) so target_compile_definitions sees it.
|
||||
if(ORCA_BUNDLED_UV_EXECUTABLE)
|
||||
if(EXISTS "${ORCA_BUNDLED_UV_EXECUTABLE}")
|
||||
file(TO_CMAKE_PATH "${ORCA_BUNDLED_UV_EXECUTABLE}" ORCA_BUNDLED_UV_EXECUTABLE_CONFIG)
|
||||
get_filename_component(ORCA_BUNDLED_UV_FILENAME "${ORCA_BUNDLED_UV_EXECUTABLE}" NAME)
|
||||
else()
|
||||
message(WARNING "ORCA_BUNDLED_UV_EXECUTABLE does not exist: ${ORCA_BUNDLED_UV_EXECUTABLE}")
|
||||
set(ORCA_BUNDLED_UV_EXECUTABLE "")
|
||||
set(ORCA_BUNDLED_UV_EXECUTABLE_CONFIG "")
|
||||
set(ORCA_BUNDLED_UV_FILENAME "")
|
||||
endif()
|
||||
else()
|
||||
set(ORCA_BUNDLED_UV_EXECUTABLE_CONFIG "")
|
||||
set(ORCA_BUNDLED_UV_FILENAME "")
|
||||
endif()
|
||||
|
||||
# If SLIC3R_FHS is 1 -> SLIC3R_DESKTOP_INTEGRATION is always 0, othrewise variable.
|
||||
CMAKE_DEPENDENT_OPTION(SLIC3R_DESKTOP_INTEGRATION "Allow performing desktop integration during runtime" 1 "NOT SLIC3R_FHS" 0)
|
||||
|
||||
@@ -750,6 +875,86 @@ endforeach()
|
||||
|
||||
find_package(NLopt 1.4 REQUIRED)
|
||||
|
||||
# Use bundled Python from deps instead of system Python
|
||||
set(_bundled_python_version "3.12.13")
|
||||
set(_bundled_python_abi "312")
|
||||
string(REGEX REPLACE "^([0-9]+\\.[0-9]+)\\..*$" "\\1" _bundled_python_version_short "${_bundled_python_version}")
|
||||
set(_bundled_python_root "${CMAKE_PREFIX_PATH}/libpython")
|
||||
set(Python3_ROOT_DIR "${_bundled_python_root}" CACHE PATH "Root directory for bundled Python" FORCE)
|
||||
set(Python3_USE_STATIC_LIBS OFF)
|
||||
set(Python3_FIND_STRATEGY LOCATION)
|
||||
set(Python3_FIND_IMPLEMENTATIONS CPython)
|
||||
|
||||
if(WIN32)
|
||||
set(_bundled_python_executable "${_bundled_python_root}/python.exe")
|
||||
set(_bundled_python_library "${_bundled_python_root}/libs/python${_bundled_python_abi}.lib")
|
||||
if(EXISTS "${_bundled_python_root}/python_d.exe")
|
||||
set(_bundled_python_executable "${_bundled_python_root}/python_d.exe")
|
||||
endif()
|
||||
if(EXISTS "${_bundled_python_root}/libs/python${_bundled_python_abi}_d.lib")
|
||||
set(_bundled_python_library "${_bundled_python_root}/libs/python${_bundled_python_abi}_d.lib")
|
||||
endif()
|
||||
|
||||
set(Python3_FIND_REGISTRY NEVER)
|
||||
set(Python3_EXECUTABLE "${_bundled_python_executable}" CACHE FILEPATH "Bundled Python executable" FORCE)
|
||||
set(Python3_INCLUDE_DIR "${_bundled_python_root}/include" CACHE PATH "Bundled Python include directory" FORCE)
|
||||
set(Python3_LIBRARY "${_bundled_python_library}" CACHE FILEPATH "Bundled Python embed import library" FORCE)
|
||||
elseif(APPLE)
|
||||
set(Python3_FIND_FRAMEWORK NEVER)
|
||||
|
||||
find_program(_bundled_python_executable
|
||||
NAMES python${_bundled_python_version_short} python3
|
||||
PATHS "${_bundled_python_root}/bin"
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
find_path(_bundled_python_include_dir
|
||||
NAMES Python.h
|
||||
PATHS
|
||||
"${_bundled_python_root}/include/python${_bundled_python_version_short}"
|
||||
"${_bundled_python_root}/include"
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
find_library(_bundled_python_library
|
||||
NAMES python${_bundled_python_version_short} libpython${_bundled_python_version_short}
|
||||
PATHS "${_bundled_python_root}/lib"
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
|
||||
if(NOT _bundled_python_executable)
|
||||
message(FATAL_ERROR "Bundled Python executable not found under ${_bundled_python_root}/bin")
|
||||
endif()
|
||||
if(NOT _bundled_python_include_dir)
|
||||
message(FATAL_ERROR "Bundled Python headers not found under ${_bundled_python_root}/include")
|
||||
endif()
|
||||
if(NOT _bundled_python_library)
|
||||
message(FATAL_ERROR "Bundled Python library not found under ${_bundled_python_root}/lib")
|
||||
endif()
|
||||
|
||||
set(Python3_EXECUTABLE "${_bundled_python_executable}" CACHE FILEPATH "Bundled Python executable" FORCE)
|
||||
set(Python3_INCLUDE_DIR "${_bundled_python_include_dir}" CACHE PATH "Bundled Python include directory" FORCE)
|
||||
set(Python3_LIBRARY "${_bundled_python_library}" CACHE FILEPATH "Bundled Python embed library" FORCE)
|
||||
endif()
|
||||
|
||||
find_package(Python3 ${_bundled_python_version} EXACT REQUIRED
|
||||
COMPONENTS Interpreter Development.Embed
|
||||
)
|
||||
|
||||
# Provide a minimal pybind11::embed target sourced from deps_src/pybind11 headers.
|
||||
set(PYBIND11_SOURCE_DIR "${CMAKE_SOURCE_DIR}/deps_src/pybind11")
|
||||
if(NOT EXISTS "${PYBIND11_SOURCE_DIR}/include/pybind11/pybind11.h")
|
||||
message(FATAL_ERROR "pybind11 headers not found in ${PYBIND11_SOURCE_DIR}. Did you initialize submodules?")
|
||||
endif()
|
||||
|
||||
add_library(pybind11_headers INTERFACE)
|
||||
target_include_directories(pybind11_headers INTERFACE "${PYBIND11_SOURCE_DIR}/include")
|
||||
add_library(pybind11::headers ALIAS pybind11_headers)
|
||||
add_library(pybind11::pybind11 ALIAS pybind11_headers)
|
||||
|
||||
add_library(pybind11_embed INTERFACE)
|
||||
target_link_libraries(pybind11_embed INTERFACE pybind11_headers Python3::Python)
|
||||
target_compile_definitions(pybind11_embed INTERFACE PYBIND11_SIMPLE_GIL_MANAGEMENT)
|
||||
add_library(pybind11::embed ALIAS pybind11_embed)
|
||||
|
||||
|
||||
if(SLIC3R_STATIC)
|
||||
set(OPENVDB_USE_STATIC_LIBS ON)
|
||||
@@ -899,10 +1104,12 @@ if (NOT WIN32 AND NOT APPLE)
|
||||
configure_file(${LIBDIR}/dev-utils/platform/unix/build_appimage.sh.in ${CMAKE_CURRENT_BINARY_DIR}/build_appimage.sh USE_SOURCE_PERMISSIONS @ONLY)
|
||||
endif()
|
||||
|
||||
|
||||
# Resources install target, configure fhs.hpp on UNIX
|
||||
if (WIN32)
|
||||
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "./resources")
|
||||
if(ORCA_BUNDLED_UV_EXECUTABLE)
|
||||
install(PROGRAMS "${ORCA_BUNDLED_UV_EXECUTABLE}" DESTINATION "./resources/tools/uv" RENAME "${ORCA_BUNDLED_UV_FILENAME}")
|
||||
endif()
|
||||
set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
|
||||
include(InstallRequiredSystemLibraries)
|
||||
install (PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION ".")
|
||||
@@ -912,6 +1119,9 @@ elseif (SLIC3R_FHS)
|
||||
install(DIRECTORY ${SLIC3R_RESOURCES_DIR}/ DESTINATION ${SLIC3R_FHS_RESOURCES}
|
||||
PATTERN "*/udev" EXCLUDE
|
||||
)
|
||||
if(ORCA_BUNDLED_UV_EXECUTABLE)
|
||||
install(PROGRAMS "${ORCA_BUNDLED_UV_EXECUTABLE}" DESTINATION "${SLIC3R_FHS_RESOURCES}/tools/uv" RENAME "${ORCA_BUNDLED_UV_FILENAME}")
|
||||
endif()
|
||||
install(FILES src/dev-utils/platform/unix/com.orcaslicer.OrcaSlicer.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)
|
||||
foreach(SIZE 32 128 192)
|
||||
install(FILES ${SLIC3R_RESOURCES_DIR}/images/OrcaSlicer_${SIZE}px.png
|
||||
@@ -920,9 +1130,15 @@ elseif (SLIC3R_FHS)
|
||||
endforeach()
|
||||
elseif (CMAKE_MACOSX_BUNDLE)
|
||||
# install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/OrcaSlicer.app/Contents/resources")
|
||||
if(ORCA_BUNDLED_UV_EXECUTABLE)
|
||||
install(PROGRAMS "${ORCA_BUNDLED_UV_EXECUTABLE}" DESTINATION "${CMAKE_INSTALL_PREFIX}/OrcaSlicer.app/Contents/Resources/tools/uv" RENAME "${ORCA_BUNDLED_UV_FILENAME}")
|
||||
endif()
|
||||
else ()
|
||||
install(FILES src/dev-utils/platform/unix/com.orcaslicer.OrcaSlicer.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/resources/applications)
|
||||
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources")
|
||||
if(ORCA_BUNDLED_UV_EXECUTABLE)
|
||||
install(PROGRAMS "${ORCA_BUNDLED_UV_EXECUTABLE}" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources/tools/uv" RENAME "${ORCA_BUNDLED_UV_FILENAME}")
|
||||
endif()
|
||||
endif ()
|
||||
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/LICENSE.txt DESTINATION ".")
|
||||
|
||||
@@ -179,6 +179,45 @@ function pack_deps() {
|
||||
)
|
||||
}
|
||||
|
||||
# --- Bundled Python runtime verification --------------------------------------
|
||||
# Relocation is handled at the source: deps/python3/python3.cmake stamps
|
||||
# libpython with an @rpath id and src/CMakeLists.txt gives the app a matching
|
||||
# rpath. This gate catches regressions that would otherwise only surface as
|
||||
# launch failures on end users' machines (the absolute deps path still exists
|
||||
# on the build host, so a plain run can pass while relocation is broken --
|
||||
# hence the otool checks). The x86_64 leg runs under Rosetta on arm64 hosts.
|
||||
function verify_python_runtime() {
|
||||
local app="$1"
|
||||
local pydir="$app/Contents/MacOS/python"
|
||||
[ -d "$pydir" ] || return 0 # app doesn't bundle Python (e.g. profile validator)
|
||||
# Version-agnostic interpreter name so a CPython version bump cannot
|
||||
# silently skip the gate; if the dir exists the interpreter must too.
|
||||
local pybin="$pydir/bin/python3"
|
||||
if [ ! -x "$pybin" ]; then
|
||||
echo "ERROR: bundled python/ present but no interpreter at $pybin" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo " Verifying bundled Python runtime in $(basename "$app")..."
|
||||
local bad
|
||||
bad=$(otool -arch all -L "$pybin" "$app/Contents/MacOS/OrcaSlicer" | grep "libpython" | grep -v "@rpath/" || true)
|
||||
if [ -n "$bad" ]; then
|
||||
echo "ERROR: a bundled binary references libpython by absolute path (relocation regression):" >&2
|
||||
echo "$bad" >&2
|
||||
exit 1
|
||||
fi
|
||||
# otool -L shows load commands only; assert the consumer rpath separately.
|
||||
# Its loss is masked on the build host by CMake's absolute build-tree rpath.
|
||||
if ! otool -arch all -l "$app/Contents/MacOS/OrcaSlicer" | grep -q "path @executable_path/python/lib "; then
|
||||
echo "ERROR: OrcaSlicer lacks the @executable_path/python/lib rpath (relocation regression)" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ! "$pybin" -c "import ssl"; then
|
||||
echo "ERROR: bundled Python failed to start (libpython relocation broken," >&2
|
||||
echo " or missing Rosetta 2 for the x86_64 leg?)" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function build_slicer() {
|
||||
# iterate over two architectures: x86_64 and arm64
|
||||
for _ARCH in x86_64 arm64; do
|
||||
@@ -239,6 +278,8 @@ function build_slicer() {
|
||||
cp -R "$resources_path" ./OrcaSlicer.app/Contents/Resources
|
||||
# delete .DS_Store file
|
||||
find ./OrcaSlicer.app/ -name '.DS_Store' -delete
|
||||
|
||||
verify_python_runtime ./OrcaSlicer.app
|
||||
|
||||
# Copy OrcaSlicer_profile_validator.app if it exists
|
||||
if [ -f "../src$BUILD_DIR_CONFIG_SUBDIR/OrcaSlicer_profile_validator.app/Contents/MacOS/OrcaSlicer_profile_validator" ]; then
|
||||
@@ -247,6 +288,7 @@ function build_slicer() {
|
||||
cp -pR "../src$BUILD_DIR_CONFIG_SUBDIR/OrcaSlicer_profile_validator.app" ./OrcaSlicer_profile_validator.app
|
||||
# delete .DS_Store file
|
||||
find ./OrcaSlicer_profile_validator.app/ -name '.DS_Store' -delete
|
||||
verify_python_runtime ./OrcaSlicer_profile_validator.app
|
||||
fi
|
||||
)
|
||||
|
||||
@@ -302,6 +344,7 @@ function build_universal() {
|
||||
echo "Creating universal binaries for OrcaSlicer.app..."
|
||||
lipo_dir "$UNIVERSAL_APP" "$X86_64_APP"
|
||||
echo "Universal OrcaSlicer.app created at $UNIVERSAL_APP"
|
||||
verify_python_runtime "$UNIVERSAL_APP"
|
||||
|
||||
# Create universal binary for profile validator if it exists
|
||||
ARM64_VALIDATOR="$PROJECT_DIR/build/arm64/OrcaSlicer/OrcaSlicer_profile_validator.app"
|
||||
|
||||
2
deps/CMakeLists.txt
vendored
2
deps/CMakeLists.txt
vendored
@@ -422,6 +422,7 @@ endif ()
|
||||
|
||||
include(OCCT/OCCT.cmake)
|
||||
include(OpenCV/OpenCV.cmake)
|
||||
include(python3/python3.cmake)
|
||||
|
||||
set(_dep_list
|
||||
dep_Boost
|
||||
@@ -444,6 +445,7 @@ set(_dep_list
|
||||
${ZLIB_PKG}
|
||||
${EXPAT_PKG}
|
||||
dep_libnoise
|
||||
dep_python3
|
||||
)
|
||||
|
||||
if (MSVC)
|
||||
|
||||
269
deps/python3/python3.cmake
vendored
Normal file
269
deps/python3/python3.cmake
vendored
Normal file
@@ -0,0 +1,269 @@
|
||||
|
||||
include(ProcessorCount)
|
||||
ProcessorCount(NPROC)
|
||||
|
||||
set(_python_version "3.12.13")
|
||||
string(REGEX REPLACE "^([0-9]+\\.[0-9]+)\\..*" "\\1" _python_version_short "${_python_version}")
|
||||
set(_python_url "https://www.python.org/ftp/python/${_python_version}/Python-${_python_version}.tar.xz")
|
||||
set(_python_sha256 "c08bc65a81971c1dd5783182826503369466c7e67374d1646519adf05207b684")
|
||||
|
||||
if(WIN32)
|
||||
if(MSVC_VERSION EQUAL 1800)
|
||||
set(_python_platform_toolset v120)
|
||||
elseif(MSVC_VERSION EQUAL 1900)
|
||||
set(_python_platform_toolset v140)
|
||||
elseif(MSVC_VERSION LESS 1920)
|
||||
set(_python_platform_toolset v141)
|
||||
elseif(MSVC_VERSION LESS 1930)
|
||||
set(_python_platform_toolset v142)
|
||||
elseif(MSVC_VERSION LESS 1950)
|
||||
set(_python_platform_toolset v143)
|
||||
elseif(MSVC_VERSION LESS 1960)
|
||||
set(_python_platform_toolset v145)
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported MSVC version for CPython build: ${MSVC_VERSION}")
|
||||
endif()
|
||||
|
||||
# 64-bit-hosted MSBuild selection (see the build-step comment below). Default
|
||||
# to the amd64 host + x64 tools; only the native ARM64 build differs.
|
||||
set(_python_msbuild_host amd64)
|
||||
set(_python_tool_arch x64)
|
||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES "ARM64|aarch64")
|
||||
set(_python_pcbuild_platform ARM64)
|
||||
set(_python_layout_arch arm64)
|
||||
set(_python_pcbuild_output_dir arm64)
|
||||
set(_python_msbuild_host arm64) # native ARM64 MSBuild already hosts arm64 tools
|
||||
set(_python_tool_arch "")
|
||||
elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
set(_python_pcbuild_platform x64)
|
||||
set(_python_layout_arch amd64)
|
||||
set(_python_pcbuild_output_dir amd64)
|
||||
else()
|
||||
set(_python_pcbuild_platform Win32)
|
||||
set(_python_layout_arch win32)
|
||||
set(_python_pcbuild_output_dir win32)
|
||||
endif()
|
||||
|
||||
set(_python_pcbuild_config Release)
|
||||
set(_python_layout_debug OFF)
|
||||
if(DEFINED DEP_DEBUG AND DEP_DEBUG)
|
||||
set(_python_pcbuild_config Debug)
|
||||
set(_python_layout_debug ON)
|
||||
endif()
|
||||
|
||||
# CPython's PCbuild needs a 64-bit-hosted toolchain: find_msbuild.bat picks the
|
||||
# 32-bit Bin\MSBuild.exe, whose x86 cl.exe/link.exe run out of address space
|
||||
# (fatal C1002 "out of heap space") building the LTCG-optimized pythoncore.
|
||||
# That 32-bit MSBuild ignores PreferredToolArchitecture, so build.bat must be
|
||||
# pointed at a 64-bit MSBuild via the MSBUILD env var. The native arm64 MSBuild
|
||||
# then hosts arm64 tools on its own; the amd64 MSBuild still defaults to x86, so
|
||||
# PreferredToolArchitecture pins it to x64. Scoped to this build step, so
|
||||
# CPython's own sources stay untouched.
|
||||
set(_python_env_args "GIT_CEILING_DIRECTORIES=<SOURCE_DIR>/..")
|
||||
if(CMAKE_GENERATOR_INSTANCE) # empty for non-VS generators (e.g. Ninja)
|
||||
set(_python_msbuild "${CMAKE_GENERATOR_INSTANCE}/MSBuild/Current/Bin/${_python_msbuild_host}/MSBuild.exe")
|
||||
if(EXISTS "${_python_msbuild}")
|
||||
file(TO_NATIVE_PATH "${_python_msbuild}" _python_msbuild_native)
|
||||
list(APPEND _python_env_args "MSBUILD=${_python_msbuild_native}")
|
||||
else()
|
||||
# Loud signal: a silent fall-through to the 32-bit MSBuild reintroduces C1002.
|
||||
message(WARNING "Bundled Python: 64-bit MSBuild not found at '${_python_msbuild}'. "
|
||||
"CPython will fall back to find_msbuild.bat's default (32-bit) MSBuild, which may "
|
||||
"fail with C1002 (out of heap space) building the optimized pythoncore.")
|
||||
endif()
|
||||
endif()
|
||||
if(_python_tool_arch)
|
||||
list(APPEND _python_env_args "PreferredToolArchitecture=${_python_tool_arch}")
|
||||
endif()
|
||||
|
||||
set(_conf_cmd
|
||||
cmd /c "echo /p:PlatformToolset=${_python_platform_toolset}>PCbuild\\msbuild.rsp"
|
||||
)
|
||||
set(_build_cmd
|
||||
${CMAKE_COMMAND} -E env ${_python_env_args}
|
||||
cmd /c PCbuild\\build.bat
|
||||
-p ${_python_pcbuild_platform}
|
||||
-c ${_python_pcbuild_config}
|
||||
--no-tkinter
|
||||
)
|
||||
set(_install_cmd
|
||||
${CMAKE_COMMAND}
|
||||
-DPYTHON_SOURCE_DIR=<SOURCE_DIR>
|
||||
-DPYTHON_BUILD_DIR=<SOURCE_DIR>/PCbuild/${_python_pcbuild_output_dir}
|
||||
-DPYTHON_DEST_DIR=${DESTDIR}/libpython
|
||||
-DPYTHON_LAYOUT_ARCH=${_python_layout_arch}
|
||||
-DPYTHON_DEBUG=${_python_layout_debug}
|
||||
-P ${CMAKE_CURRENT_LIST_DIR}/stage_windows.cmake
|
||||
)
|
||||
elseif(APPLE)
|
||||
# macOS configuration
|
||||
if(CMAKE_OSX_ARCHITECTURES)
|
||||
set(_python_target_arch "${CMAKE_OSX_ARCHITECTURES}")
|
||||
else()
|
||||
set(_python_target_arch "${CMAKE_SYSTEM_PROCESSOR}")
|
||||
endif()
|
||||
|
||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES "ARM64|arm64|aarch64")
|
||||
set(_python_build_arch aarch64)
|
||||
set(_python_build_arch_flag "arm64")
|
||||
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64|amd64")
|
||||
set(_python_build_arch x86_64)
|
||||
set(_python_build_arch_flag "x86_64")
|
||||
else()
|
||||
set(_python_build_arch "${CMAKE_SYSTEM_PROCESSOR}")
|
||||
set(_python_build_arch_flag "${CMAKE_SYSTEM_PROCESSOR}")
|
||||
endif()
|
||||
|
||||
if(_python_target_arch MATCHES "ARM64|arm64|aarch64")
|
||||
set(_python_host_arch aarch64)
|
||||
set(_python_arch_flag "arm64")
|
||||
elseif(_python_target_arch MATCHES "x86_64|AMD64|amd64")
|
||||
set(_python_host_arch x86_64)
|
||||
set(_python_arch_flag "x86_64")
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported macOS Python target architecture: ${_python_target_arch}")
|
||||
endif()
|
||||
|
||||
set(_python_arch_flags "-arch ${_python_arch_flag} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}")
|
||||
# No -rpath: all other deps are static, so libpython has no shared
|
||||
# dependencies to find there. headerpad reserves load-command space for
|
||||
# the post-install -add_rpath below.
|
||||
set(_python_ldflags "${_python_arch_flags} -Wl,-headerpad_max_install_names")
|
||||
|
||||
if(IS_CROSS_COMPILE)
|
||||
set(_python_build_tgt --build=${_python_build_arch}-apple-darwin --host=${_python_host_arch}-apple-darwin)
|
||||
set(_python_build_arch_flags "-arch ${_python_build_arch_flag} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}")
|
||||
set(_python_build_ldflags "${_python_build_arch_flags} -Wl,-rpath,${DESTDIR}/lib")
|
||||
set(_python_build_python_dir "<SOURCE_DIR>/build-python-host")
|
||||
set(_python_build_python "${_python_build_python_dir}/python")
|
||||
set(_conf_cmd
|
||||
/bin/sh -c
|
||||
"rm -rf '${_python_build_python_dir}' && \
|
||||
mkdir -p '${_python_build_python_dir}' && \
|
||||
cd '${_python_build_python_dir}' && \
|
||||
env \
|
||||
CC='${CMAKE_C_COMPILER}' \
|
||||
CXX='${CMAKE_CXX_COMPILER}' \
|
||||
CFLAGS='${_python_build_arch_flags}' \
|
||||
CXXFLAGS='${_python_build_arch_flags}' \
|
||||
LDFLAGS='${_python_build_ldflags}' \
|
||||
MACOSX_DEPLOYMENT_TARGET='${CMAKE_OSX_DEPLOYMENT_TARGET}' \
|
||||
../configure \
|
||||
--prefix='${_python_build_python_dir}/install' \
|
||||
--enable-shared \
|
||||
--without-static-libpython \
|
||||
--disable-test-modules \
|
||||
--build=${_python_build_arch}-apple-darwin && \
|
||||
make -j${NPROC} python && \
|
||||
cd '<SOURCE_DIR>' && \
|
||||
env \
|
||||
CC='${CMAKE_C_COMPILER}' \
|
||||
CXX='${CMAKE_CXX_COMPILER}' \
|
||||
CFLAGS='${_python_arch_flags}' \
|
||||
CXXFLAGS='${_python_arch_flags}' \
|
||||
LDFLAGS='${_python_ldflags}' \
|
||||
MACOSX_DEPLOYMENT_TARGET='${CMAKE_OSX_DEPLOYMENT_TARGET}' \
|
||||
./configure \
|
||||
--prefix='${DESTDIR}/libpython' \
|
||||
--enable-shared \
|
||||
--enable-optimizations \
|
||||
--without-static-libpython \
|
||||
--with-openssl='${DESTDIR}' \
|
||||
--disable-test-modules \
|
||||
${_python_build_tgt} \
|
||||
--with-build-python='${_python_build_python}' \
|
||||
py_cv_module__tkinter=n/a"
|
||||
)
|
||||
else()
|
||||
set(_python_build_tgt --build=${_python_host_arch}-apple-darwin)
|
||||
set(_conf_cmd
|
||||
env
|
||||
"CC=${CMAKE_C_COMPILER}"
|
||||
"CXX=${CMAKE_CXX_COMPILER}"
|
||||
"CFLAGS=${_python_arch_flags}"
|
||||
"CXXFLAGS=${_python_arch_flags}"
|
||||
"LDFLAGS=${_python_ldflags}"
|
||||
"MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}"
|
||||
./configure
|
||||
--prefix=${DESTDIR}/libpython
|
||||
--enable-shared
|
||||
--enable-optimizations
|
||||
--without-static-libpython
|
||||
--with-openssl=${DESTDIR}
|
||||
--disable-test-modules
|
||||
${_python_build_tgt}
|
||||
# Tcl/Tk 9.0 (e.g. from Homebrew) is incompatible with CPython 3.12's
|
||||
# _tkinter; OrcaSlicer's embedded Python does not need tkinter anyway.
|
||||
py_cv_module__tkinter=n/a
|
||||
)
|
||||
endif()
|
||||
set(_build_cmd make -j${NPROC})
|
||||
|
||||
# CPython stamps libpython with an absolute install name ($prefix/lib/...),
|
||||
# which every consumer inherits at link time and which only exists on the
|
||||
# build host. Normalize once here, before anything links against the dep:
|
||||
# give the dylib an @rpath id and teach the interpreter to find it relative
|
||||
# to itself. Consumers then just need an rpath entry (src/CMakeLists.txt).
|
||||
# install_name_tool invalidates code signatures, so re-sign ad-hoc; CI
|
||||
# re-signs the whole bundle with the real identity later.
|
||||
# ld collapses '//' in -install_name (but not in -rpath) strings, while
|
||||
# ${DESTDIR} ends with a slash -- collapse slashes so -change matches the
|
||||
# recorded install name.
|
||||
string(REGEX REPLACE "/+" "/" _python_prefix "${DESTDIR}/libpython")
|
||||
set(_python_dylib "${_python_prefix}/lib/libpython${_python_version_short}.dylib")
|
||||
set(_python_bin "${_python_prefix}/bin/python${_python_version_short}")
|
||||
set(_install_cmd make install
|
||||
COMMAND install_name_tool -id "@rpath/libpython${_python_version_short}.dylib" "${_python_dylib}"
|
||||
COMMAND install_name_tool -change "${_python_dylib}" "@rpath/libpython${_python_version_short}.dylib" "${_python_bin}"
|
||||
COMMAND install_name_tool -add_rpath "@loader_path/../lib" "${_python_bin}"
|
||||
COMMAND codesign --force --sign - "${_python_dylib}"
|
||||
COMMAND codesign --force --sign - "${_python_bin}"
|
||||
)
|
||||
else()
|
||||
# Linux/Unix
|
||||
# Kept verbatim, no slash normalization (unlike the macOS branch's
|
||||
# collapsed copy): the LDFLAGS rpath below is recorded byte-for-byte in
|
||||
# the ELF, and the OLD_RPATH handed to relocate_linux.cmake must match it
|
||||
# exactly -- both derive from this one variable to make that structural.
|
||||
set(_python_prefix "${DESTDIR}/libpython")
|
||||
# The rpath points at libpython's real install dir, so the interpreter runs
|
||||
# in-tree pre-relocation -- and, critically, it reserves enough RUNPATH
|
||||
# bytes for the in-place $ORIGIN rewrite at install time (Flatpak's
|
||||
# DESTDIR is the short /app) -- see relocate_linux.cmake.
|
||||
set(_conf_cmd ./configure
|
||||
--prefix=${_python_prefix}
|
||||
--enable-shared
|
||||
--enable-optimizations
|
||||
--with-openssl=${DESTDIR}
|
||||
--without-static-libpython
|
||||
--disable-test-modules
|
||||
# Tcl/Tk 9.0 is incompatible with CPython 3.12's _tkinter; not needed here.
|
||||
py_cv_module__tkinter=n/a
|
||||
LDFLAGS=-Wl,-rpath,${_python_prefix}/lib
|
||||
)
|
||||
set(_build_cmd make -j${NPROC})
|
||||
set(_install_cmd make install
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
"-DPYTHON_BIN=${_python_prefix}/bin/python${_python_version_short}"
|
||||
"-DOLD_RPATH=${_python_prefix}/lib"
|
||||
-P "${CMAKE_CURRENT_LIST_DIR}/relocate_linux.cmake"
|
||||
)
|
||||
endif()
|
||||
|
||||
ExternalProject_Add(dep_python3
|
||||
URL "${_python_url}"
|
||||
URL_HASH SHA256=${_python_sha256}
|
||||
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/python3
|
||||
BUILD_IN_SOURCE ON
|
||||
CONFIGURE_COMMAND ${_conf_cmd}
|
||||
BUILD_COMMAND ${_build_cmd}
|
||||
INSTALL_COMMAND ${_install_cmd}
|
||||
)
|
||||
|
||||
# Python depends on OpenSSL and ZLIB
|
||||
if(TARGET dep_OpenSSL)
|
||||
add_dependencies(dep_python3 dep_OpenSSL)
|
||||
endif()
|
||||
if(TARGET dep_ZLIB)
|
||||
add_dependencies(dep_python3 dep_ZLIB)
|
||||
endif()
|
||||
10
deps/python3/relocate_linux.cmake
vendored
Normal file
10
deps/python3/relocate_linux.cmake
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# Repoint the installed interpreter's RUNPATH from the absolute deps dir to a
|
||||
# self-relative entry so the bundled runtime is relocatable (the deps tree,
|
||||
# Flatpak /app/libpython, and AppImage $APPDIR/lib/python all keep bin/ and
|
||||
# lib/ as siblings). $ORIGIN is expanded by the dynamic loader; CMake leaves
|
||||
# it alone (only ${...} is expanded here). RPATH_CHANGE edits the ELF in
|
||||
# place, so the new entry must not be longer than the old one: the reserved
|
||||
# ${DESTDIR}/libpython/lib is at least 18 bytes even for the shortest
|
||||
# supported DESTDIR (Flatpak's /app), longer than the 14-byte $ORIGIN/../lib.
|
||||
# Invoked from python3.cmake with -DPYTHON_BIN=... -DOLD_RPATH=...
|
||||
file(RPATH_CHANGE FILE "${PYTHON_BIN}" OLD_RPATH "${OLD_RPATH}" NEW_RPATH "$ORIGIN/../lib")
|
||||
72
deps/python3/stage_windows.cmake
vendored
Normal file
72
deps/python3/stage_windows.cmake
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
set(_python_abi "312")
|
||||
|
||||
foreach(_var PYTHON_SOURCE_DIR PYTHON_BUILD_DIR PYTHON_DEST_DIR PYTHON_LAYOUT_ARCH)
|
||||
if(NOT DEFINED ${_var} OR "${${_var}}" STREQUAL "")
|
||||
message(FATAL_ERROR "${_var} is required")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
set(_python_exe "${PYTHON_BUILD_DIR}/python.exe")
|
||||
if(PYTHON_DEBUG)
|
||||
set(_python_exe "${PYTHON_BUILD_DIR}/python_d.exe")
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS "${_python_exe}")
|
||||
message(FATAL_ERROR "Built Python executable not found: ${_python_exe}")
|
||||
endif()
|
||||
|
||||
file(REMOVE_RECURSE "${PYTHON_DEST_DIR}")
|
||||
file(MAKE_DIRECTORY "${PYTHON_DEST_DIR}")
|
||||
|
||||
# CPython's Windows layout helper reads LICENSE.txt from the build output.
|
||||
# Source archives ship this file as LICENSE, so provide the expected name.
|
||||
if(EXISTS "${PYTHON_SOURCE_DIR}/LICENSE" AND NOT EXISTS "${PYTHON_BUILD_DIR}/LICENSE.txt")
|
||||
configure_file("${PYTHON_SOURCE_DIR}/LICENSE" "${PYTHON_BUILD_DIR}/LICENSE.txt" COPYONLY)
|
||||
endif()
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
"${CMAKE_COMMAND}" -E env
|
||||
"PYTHONHOME="
|
||||
"PYTHONPATH=${PYTHON_SOURCE_DIR}/Lib"
|
||||
"${_python_exe}"
|
||||
"${PYTHON_SOURCE_DIR}/PC/layout"
|
||||
--source "${PYTHON_SOURCE_DIR}"
|
||||
--build "${PYTHON_BUILD_DIR}"
|
||||
--arch "${PYTHON_LAYOUT_ARCH}"
|
||||
--copy "${PYTHON_DEST_DIR}"
|
||||
--include-dev
|
||||
WORKING_DIRECTORY "${PYTHON_SOURCE_DIR}"
|
||||
RESULT_VARIABLE _layout_result
|
||||
)
|
||||
|
||||
if(NOT _layout_result EQUAL 0)
|
||||
message(FATAL_ERROR "CPython Windows layout staging failed with exit code ${_layout_result}")
|
||||
endif()
|
||||
|
||||
set(_required_files
|
||||
"${PYTHON_DEST_DIR}/Lib/encodings/__init__.py"
|
||||
"${PYTHON_DEST_DIR}/include/Python.h"
|
||||
)
|
||||
|
||||
if(PYTHON_DEBUG)
|
||||
list(APPEND _required_files
|
||||
"${PYTHON_DEST_DIR}/python_d.exe"
|
||||
"${PYTHON_DEST_DIR}/python${_python_abi}_d.dll"
|
||||
"${PYTHON_DEST_DIR}/libs/python${_python_abi}_d.lib"
|
||||
)
|
||||
else()
|
||||
list(APPEND _required_files
|
||||
"${PYTHON_DEST_DIR}/python.exe"
|
||||
"${PYTHON_DEST_DIR}/python${_python_abi}.dll"
|
||||
"${PYTHON_DEST_DIR}/libs/python${_python_abi}.lib"
|
||||
)
|
||||
endif()
|
||||
|
||||
foreach(_required_file IN LISTS _required_files)
|
||||
if(NOT EXISTS "${_required_file}")
|
||||
message(FATAL_ERROR "Staged Python file missing: ${_required_file}")
|
||||
endif()
|
||||
endforeach()
|
||||
29
deps_src/pybind11/LICENSE
Normal file
29
deps_src/pybind11/LICENSE
Normal file
@@ -0,0 +1,29 @@
|
||||
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>, All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Please also refer to the file .github/CONTRIBUTING.md, which clarifies licensing of
|
||||
external contributions to this project including patches, pull requests, etc.
|
||||
216
deps_src/pybind11/README.rst
Normal file
216
deps_src/pybind11/README.rst
Normal file
@@ -0,0 +1,216 @@
|
||||
.. figure:: https://github.com/pybind/pybind11/raw/master/docs/pybind11-logo.png
|
||||
:alt: pybind11 logo
|
||||
|
||||
**pybind11 (v3) — Seamless interoperability between C++ and Python**
|
||||
|
||||
|Latest Documentation Status| |Stable Documentation Status| |Gitter chat| |GitHub Discussions|
|
||||
|
||||
|CI| |Build status| |SPEC 4 — Using and Creating Nightly Wheels|
|
||||
|
||||
|Repology| |PyPI package| |Conda-forge| |Python Versions|
|
||||
|
||||
`Setuptools example <https://github.com/pybind/python_example>`_
|
||||
• `Scikit-build example <https://github.com/pybind/scikit_build_example>`_
|
||||
• `CMake example <https://github.com/pybind/cmake_example>`_
|
||||
|
||||
.. start
|
||||
|
||||
|
||||
**pybind11** is a lightweight header-only library that exposes C++ types
|
||||
in Python and vice versa, mainly to create Python bindings of existing
|
||||
C++ code. Its goals and syntax are similar to the excellent
|
||||
`Boost.Python <http://www.boost.org/doc/libs/1_58_0/libs/python/doc/>`_
|
||||
library by David Abrahams: to minimize boilerplate code in traditional
|
||||
extension modules by inferring type information using compile-time
|
||||
introspection.
|
||||
|
||||
The main issue with Boost.Python—and the reason for creating such a
|
||||
similar project—is Boost. Boost is an enormously large and complex suite
|
||||
of utility libraries that works with almost every C++ compiler in
|
||||
existence. This compatibility has its cost: arcane template tricks and
|
||||
workarounds are necessary to support the oldest and buggiest of compiler
|
||||
specimens. Now that C++11-compatible compilers are widely available,
|
||||
this heavy machinery has become an excessively large and unnecessary
|
||||
dependency.
|
||||
|
||||
Think of this library as a tiny self-contained version of Boost.Python
|
||||
with everything stripped away that isn't relevant for binding
|
||||
generation. Without comments, the core header files only require ~4K
|
||||
lines of code and depend on Python (CPython 3.8+, PyPy, or GraalPy) and the C++
|
||||
standard library. This compact implementation was possible thanks to some C++11
|
||||
language features (specifically: tuples, lambda functions and variadic
|
||||
templates). Since its creation, this library has grown beyond Boost.Python in
|
||||
many ways, leading to dramatically simpler binding code in many common
|
||||
situations.
|
||||
|
||||
Tutorial and reference documentation is provided at
|
||||
`pybind11.readthedocs.io <https://pybind11.readthedocs.io/en/latest>`_.
|
||||
A PDF version of the manual is available
|
||||
`here <https://pybind11.readthedocs.io/_/downloads/en/latest/pdf/>`_.
|
||||
And the source code is always available at
|
||||
`github.com/pybind/pybind11 <https://github.com/pybind/pybind11>`_.
|
||||
|
||||
|
||||
Core features
|
||||
-------------
|
||||
|
||||
|
||||
pybind11 can map the following core C++ features to Python:
|
||||
|
||||
- Functions accepting and returning custom data structures per value,
|
||||
reference, or pointer
|
||||
- Instance methods and static methods
|
||||
- Overloaded functions
|
||||
- Instance attributes and static attributes
|
||||
- Arbitrary exception types
|
||||
- Enumerations
|
||||
- Callbacks
|
||||
- Iterators and ranges
|
||||
- Custom operators
|
||||
- Single and multiple inheritance
|
||||
- STL data structures
|
||||
- Smart pointers with reference counting like ``std::shared_ptr``
|
||||
- Internal references with correct reference counting
|
||||
- C++ classes with virtual (and pure virtual) methods can be extended
|
||||
in Python
|
||||
- Integrated NumPy support (NumPy 2 requires pybind11 2.12+)
|
||||
|
||||
Goodies
|
||||
-------
|
||||
|
||||
In addition to the core functionality, pybind11 provides some extra
|
||||
goodies:
|
||||
|
||||
- CPython 3.8+, PyPy3 7.3.17+, and GraalPy 24.1+ are supported with an
|
||||
implementation-agnostic interface (see older versions for older CPython
|
||||
and PyPy versions).
|
||||
|
||||
- It is possible to bind C++11 lambda functions with captured
|
||||
variables. The lambda capture data is stored inside the resulting
|
||||
Python function object.
|
||||
|
||||
- pybind11 uses C++11 move constructors and move assignment operators
|
||||
whenever possible to efficiently transfer custom data types.
|
||||
|
||||
- It's easy to expose the internal storage of custom data types through
|
||||
Pythons' buffer protocols. This is handy e.g. for fast conversion
|
||||
between C++ matrix classes like Eigen and NumPy without expensive
|
||||
copy operations.
|
||||
|
||||
- pybind11 can automatically vectorize functions so that they are
|
||||
transparently applied to all entries of one or more NumPy array
|
||||
arguments.
|
||||
|
||||
- Python's slice-based access and assignment operations can be
|
||||
supported with just a few lines of code.
|
||||
|
||||
- Everything is contained in just a few header files; there is no need
|
||||
to link against any additional libraries.
|
||||
|
||||
- Binaries are generally smaller by a factor of at least 2 compared to
|
||||
equivalent bindings generated by Boost.Python. A recent pybind11
|
||||
conversion of PyRosetta, an enormous Boost.Python binding project,
|
||||
`reported <https://graylab.jhu.edu/Sergey/2016.RosettaCon/PyRosetta-4.pdf>`_
|
||||
a binary size reduction of **5.4x** and compile time reduction by
|
||||
**5.8x**.
|
||||
|
||||
- Function signatures are precomputed at compile time (using
|
||||
``constexpr``), leading to smaller binaries.
|
||||
|
||||
- With little extra effort, C++ types can be pickled and unpickled
|
||||
similar to regular Python objects.
|
||||
|
||||
Supported compilers
|
||||
-------------------
|
||||
|
||||
1. Clang/LLVM 3.3 or newer (for Apple Xcode's clang, this is 5.0.0 or
|
||||
newer)
|
||||
2. GCC 4.8 or newer
|
||||
3. Microsoft Visual Studio 2022 or newer (2019 probably works, but was dropped in CI)
|
||||
4. Intel classic C++ compiler 18 or newer (ICC 20.2 tested in CI)
|
||||
5. Cygwin/GCC (previously tested on 2.5.1)
|
||||
6. NVCC (CUDA 11.0 tested in CI)
|
||||
7. NVIDIA PGI (20.9 tested in CI)
|
||||
|
||||
Supported Platforms
|
||||
-------------------
|
||||
|
||||
* Windows, Linux, macOS, and iOS
|
||||
* CPython 3.8+, Pyodide, PyPy, and GraalPy
|
||||
* C++11, C++14, C++17, C++20, and C++23
|
||||
|
||||
About
|
||||
-----
|
||||
|
||||
This project was created by `Wenzel
|
||||
Jakob <http://rgl.epfl.ch/people/wjakob>`_. Significant features and/or
|
||||
improvements to the code were contributed by
|
||||
Jonas Adler,
|
||||
Lori A. Burns,
|
||||
Sylvain Corlay,
|
||||
Eric Cousineau,
|
||||
Aaron Gokaslan,
|
||||
Ralf Grosse-Kunstleve,
|
||||
Trent Houliston,
|
||||
Axel Huebl,
|
||||
@hulucc,
|
||||
Yannick Jadoul,
|
||||
Sergey Lyskov,
|
||||
Johan Mabille,
|
||||
Tomasz Miąsko,
|
||||
Dean Moldovan,
|
||||
Ben Pritchard,
|
||||
Jason Rhinelander,
|
||||
Boris Schäling,
|
||||
Pim Schellart,
|
||||
Henry Schreiner,
|
||||
Ivan Smirnov,
|
||||
Dustin Spicuzza,
|
||||
Boris Staletic,
|
||||
Ethan Steinberg,
|
||||
Patrick Stewart,
|
||||
Ivor Wanders,
|
||||
and
|
||||
Xiaofei Wang.
|
||||
|
||||
We thank Google for a generous financial contribution to the continuous
|
||||
integration infrastructure used by this project.
|
||||
|
||||
|
||||
Contributing
|
||||
~~~~~~~~~~~~
|
||||
|
||||
See the `contributing
|
||||
guide <https://github.com/pybind/pybind11/blob/master/.github/CONTRIBUTING.md>`_
|
||||
for information on building and contributing to pybind11.
|
||||
|
||||
License
|
||||
~~~~~~~
|
||||
|
||||
pybind11 is provided under a BSD-style license that can be found in the
|
||||
`LICENSE <https://github.com/pybind/pybind11/blob/master/LICENSE>`_
|
||||
file. By using, distributing, or contributing to this project, you agree
|
||||
to the terms and conditions of this license.
|
||||
|
||||
.. |Latest Documentation Status| image:: https://readthedocs.org/projects/pybind11/badge?version=latest
|
||||
:target: http://pybind11.readthedocs.org/en/latest
|
||||
.. |Stable Documentation Status| image:: https://img.shields.io/badge/docs-stable-blue.svg
|
||||
:target: http://pybind11.readthedocs.org/en/stable
|
||||
.. |Gitter chat| image:: https://img.shields.io/gitter/room/gitterHQ/gitter.svg
|
||||
:target: https://gitter.im/pybind/Lobby
|
||||
.. |CI| image:: https://github.com/pybind/pybind11/workflows/CI/badge.svg
|
||||
:target: https://github.com/pybind/pybind11/actions
|
||||
.. |Build status| image:: https://ci.appveyor.com/api/projects/status/riaj54pn4h08xy40?svg=true
|
||||
:target: https://ci.appveyor.com/project/wjakob/pybind11
|
||||
.. |PyPI package| image:: https://img.shields.io/pypi/v/pybind11.svg
|
||||
:target: https://pypi.org/project/pybind11/
|
||||
.. |Conda-forge| image:: https://img.shields.io/conda/vn/conda-forge/pybind11.svg
|
||||
:target: https://github.com/conda-forge/pybind11-feedstock
|
||||
.. |Repology| image:: https://repology.org/badge/latest-versions/python:pybind11.svg
|
||||
:target: https://repology.org/project/python:pybind11/versions
|
||||
.. |Python Versions| image:: https://img.shields.io/pypi/pyversions/pybind11.svg
|
||||
:target: https://pypi.org/project/pybind11/
|
||||
.. |GitHub Discussions| image:: https://img.shields.io/static/v1?label=Discussions&message=Ask&color=blue&logo=github
|
||||
:target: https://github.com/pybind/pybind11/discussions
|
||||
.. |SPEC 4 — Using and Creating Nightly Wheels| image:: https://img.shields.io/badge/SPEC-4-green?labelColor=%23004811&color=%235CA038
|
||||
:target: https://scientific-python.org/specs/spec-0004/
|
||||
722
deps_src/pybind11/include/pybind11/attr.h
Normal file
722
deps_src/pybind11/include/pybind11/attr.h
Normal file
@@ -0,0 +1,722 @@
|
||||
/*
|
||||
pybind11/attr.h: Infrastructure for processing custom
|
||||
type and function attributes
|
||||
|
||||
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "detail/common.h"
|
||||
#include "cast.h"
|
||||
#include "trampoline_self_life_support.h"
|
||||
|
||||
#include <functional>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
/// \addtogroup annotations
|
||||
/// @{
|
||||
|
||||
/// Annotation for methods
|
||||
struct is_method {
|
||||
handle class_;
|
||||
explicit is_method(const handle &c) : class_(c) {}
|
||||
};
|
||||
|
||||
/// Annotation for setters
|
||||
struct is_setter {};
|
||||
|
||||
/// Annotation for operators
|
||||
struct is_operator {};
|
||||
|
||||
/// Annotation for classes that cannot be subclassed
|
||||
struct is_final {};
|
||||
|
||||
/// Annotation for parent scope
|
||||
struct scope {
|
||||
handle value;
|
||||
explicit scope(const handle &s) : value(s) {}
|
||||
};
|
||||
|
||||
/// Annotation for documentation
|
||||
struct doc {
|
||||
const char *value;
|
||||
explicit doc(const char *value) : value(value) {}
|
||||
};
|
||||
|
||||
/// Annotation for function names
|
||||
struct name {
|
||||
const char *value;
|
||||
explicit name(const char *value) : value(value) {}
|
||||
};
|
||||
|
||||
/// Annotation indicating that a function is an overload associated with a given "sibling"
|
||||
struct sibling {
|
||||
handle value;
|
||||
explicit sibling(const handle &value) : value(value.ptr()) {}
|
||||
};
|
||||
|
||||
/// Annotation indicating that a class derives from another given type
|
||||
template <typename T>
|
||||
struct base {
|
||||
|
||||
PYBIND11_DEPRECATED(
|
||||
"base<T>() was deprecated in favor of specifying 'T' as a template argument to class_")
|
||||
base() = default;
|
||||
};
|
||||
|
||||
/// Keep patient alive while nurse lives
|
||||
template <size_t Nurse, size_t Patient>
|
||||
struct keep_alive {};
|
||||
|
||||
/// Annotation indicating that a class is involved in a multiple inheritance relationship
|
||||
struct multiple_inheritance {};
|
||||
|
||||
/// Annotation which enables dynamic attributes, i.e. adds `__dict__` to a class
|
||||
struct dynamic_attr {};
|
||||
|
||||
/// Annotation which enables the buffer protocol for a type
|
||||
struct buffer_protocol {};
|
||||
|
||||
/// Annotation which enables releasing the GIL before calling the C++ destructor of wrapped
|
||||
/// instances (pybind/pybind11#1446).
|
||||
struct release_gil_before_calling_cpp_dtor {};
|
||||
|
||||
/// Annotation which requests that a special metaclass is created for a type
|
||||
struct metaclass {
|
||||
handle value;
|
||||
|
||||
PYBIND11_DEPRECATED("py::metaclass() is no longer required. It's turned on by default now.")
|
||||
metaclass() = default;
|
||||
|
||||
/// Override pybind11's default metaclass
|
||||
explicit metaclass(handle value) : value(value) {}
|
||||
};
|
||||
|
||||
/// Specifies a custom callback with signature `void (PyHeapTypeObject*)` that
|
||||
/// may be used to customize the Python type.
|
||||
///
|
||||
/// The callback is invoked immediately before `PyType_Ready`.
|
||||
///
|
||||
/// Note: This is an advanced interface, and uses of it may require changes to
|
||||
/// work with later versions of pybind11. You may wish to consult the
|
||||
/// implementation of `make_new_python_type` in `detail/classes.h` to understand
|
||||
/// the context in which the callback will be run.
|
||||
struct custom_type_setup {
|
||||
using callback = std::function<void(PyHeapTypeObject *heap_type)>;
|
||||
|
||||
explicit custom_type_setup(callback value) : value(std::move(value)) {}
|
||||
|
||||
callback value;
|
||||
};
|
||||
|
||||
/// Annotation that marks a class as local to the module:
|
||||
struct module_local {
|
||||
const bool value;
|
||||
constexpr explicit module_local(bool v = true) : value(v) {}
|
||||
};
|
||||
|
||||
/// Annotation to mark enums as an arithmetic type
|
||||
struct arithmetic {};
|
||||
|
||||
/// Mark a function for addition at the beginning of the existing overload chain instead of the end
|
||||
struct prepend {};
|
||||
|
||||
/** \rst
|
||||
A call policy which places one or more guard variables (``Ts...``) around the function call.
|
||||
|
||||
For example, this definition:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
m.def("foo", foo, py::call_guard<T>());
|
||||
|
||||
is equivalent to the following pseudocode:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
m.def("foo", [](args...) {
|
||||
T scope_guard;
|
||||
return foo(args...); // forwarded arguments
|
||||
});
|
||||
\endrst */
|
||||
template <typename... Ts>
|
||||
struct call_guard;
|
||||
|
||||
template <>
|
||||
struct call_guard<> {
|
||||
using type = detail::void_type;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct call_guard<T> {
|
||||
static_assert(std::is_default_constructible<T>::value,
|
||||
"The guard type must be default constructible");
|
||||
|
||||
using type = T;
|
||||
};
|
||||
|
||||
template <typename T, typename... Ts>
|
||||
struct call_guard<T, Ts...> {
|
||||
struct type {
|
||||
T guard{}; // Compose multiple guard types with left-to-right default-constructor order
|
||||
typename call_guard<Ts...>::type next{};
|
||||
};
|
||||
};
|
||||
|
||||
/// @} annotations
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
/* Forward declarations */
|
||||
enum op_id : int;
|
||||
enum op_type : int;
|
||||
struct undefined_t;
|
||||
template <op_id id, op_type ot, typename L = undefined_t, typename R = undefined_t>
|
||||
struct op_;
|
||||
void keep_alive_impl(size_t Nurse, size_t Patient, function_call &call, handle ret);
|
||||
|
||||
/// Internal data structure which holds metadata about a keyword argument
|
||||
struct argument_record {
|
||||
const char *name; ///< Argument name
|
||||
const char *descr; ///< Human-readable version of the argument value
|
||||
handle value; ///< Associated Python object
|
||||
bool convert : 1; ///< True if the argument is allowed to convert when loading
|
||||
bool none : 1; ///< True if None is allowed when loading
|
||||
|
||||
argument_record(const char *name, const char *descr, handle value, bool convert, bool none)
|
||||
: name(name), descr(descr), value(value), convert(convert), none(none) {}
|
||||
};
|
||||
|
||||
/// Internal data structure which holds metadata about a bound function (signature, overloads,
|
||||
/// etc.)
|
||||
#define PYBIND11_DETAIL_FUNCTION_RECORD_ABI_ID "v1" // PLEASE UPDATE if the struct is changed.
|
||||
struct function_record {
|
||||
function_record()
|
||||
: is_constructor(false), is_new_style_constructor(false), is_stateless(false),
|
||||
is_operator(false), is_method(false), is_setter(false), has_args(false),
|
||||
has_kwargs(false), prepend(false) {}
|
||||
|
||||
/// Function name
|
||||
char *name = nullptr; /* why no C++ strings? They generate heavier code.. */
|
||||
|
||||
// User-specified documentation string
|
||||
char *doc = nullptr;
|
||||
|
||||
/// Human-readable version of the function signature
|
||||
char *signature = nullptr;
|
||||
|
||||
/// List of registered keyword arguments
|
||||
std::vector<argument_record> args;
|
||||
|
||||
/// Pointer to lambda function which converts arguments and performs the actual call
|
||||
handle (*impl)(function_call &) = nullptr;
|
||||
|
||||
/// Storage for the wrapped function pointer and captured data, if any
|
||||
void *data[3] = {};
|
||||
|
||||
/// Pointer to custom destructor for 'data' (if needed)
|
||||
void (*free_data)(function_record *ptr) = nullptr;
|
||||
|
||||
/// Return value policy associated with this function
|
||||
return_value_policy policy = return_value_policy::automatic;
|
||||
|
||||
/// True if name == '__init__'
|
||||
bool is_constructor : 1;
|
||||
|
||||
/// True if this is a new-style `__init__` defined in `detail/init.h`
|
||||
bool is_new_style_constructor : 1;
|
||||
|
||||
/// True if this is a stateless function pointer
|
||||
bool is_stateless : 1;
|
||||
|
||||
/// True if this is an operator (__add__), etc.
|
||||
bool is_operator : 1;
|
||||
|
||||
/// True if this is a method
|
||||
bool is_method : 1;
|
||||
|
||||
/// True if this is a setter
|
||||
bool is_setter : 1;
|
||||
|
||||
/// True if the function has a '*args' argument
|
||||
bool has_args : 1;
|
||||
|
||||
/// True if the function has a '**kwargs' argument
|
||||
bool has_kwargs : 1;
|
||||
|
||||
/// True if this function is to be inserted at the beginning of the overload resolution chain
|
||||
bool prepend : 1;
|
||||
|
||||
/// Number of arguments (including py::args and/or py::kwargs, if present)
|
||||
std::uint16_t nargs;
|
||||
|
||||
/// Number of leading positional arguments, which are terminated by a py::args or py::kwargs
|
||||
/// argument or by a py::kw_only annotation.
|
||||
std::uint16_t nargs_pos = 0;
|
||||
|
||||
/// Number of leading arguments (counted in `nargs`) that are positional-only
|
||||
std::uint16_t nargs_pos_only = 0;
|
||||
|
||||
/// Python method object
|
||||
PyMethodDef *def = nullptr;
|
||||
|
||||
/// Python handle to the parent scope (a class or a module)
|
||||
handle scope;
|
||||
|
||||
/// Python handle to the sibling function representing an overload chain
|
||||
handle sibling;
|
||||
|
||||
/// Pointer to next overload
|
||||
function_record *next = nullptr;
|
||||
};
|
||||
// The main purpose of this macro is to make it easy to pin-point the critically related code
|
||||
// sections.
|
||||
#define PYBIND11_ENSURE_PRECONDITION_FOR_FUNCTIONAL_H_PERFORMANCE_OPTIMIZATIONS(...) \
|
||||
static_assert( \
|
||||
__VA_ARGS__, \
|
||||
"Violation of precondition for pybind11/functional.h performance optimizations!")
|
||||
|
||||
/// Special data structure which (temporarily) holds metadata about a bound class
|
||||
struct type_record {
|
||||
PYBIND11_NOINLINE type_record()
|
||||
: multiple_inheritance(false), dynamic_attr(false), buffer_protocol(false),
|
||||
module_local(false), is_final(false), release_gil_before_calling_cpp_dtor(false) {}
|
||||
|
||||
/// Handle to the parent scope
|
||||
handle scope;
|
||||
|
||||
/// Name of the class
|
||||
const char *name = nullptr;
|
||||
|
||||
// Pointer to RTTI type_info data structure
|
||||
const std::type_info *type = nullptr;
|
||||
|
||||
/// How large is the underlying C++ type?
|
||||
size_t type_size = 0;
|
||||
|
||||
/// What is the alignment of the underlying C++ type?
|
||||
size_t type_align = 0;
|
||||
|
||||
/// How large is the type's holder?
|
||||
size_t holder_size = 0;
|
||||
|
||||
/// The global operator new can be overridden with a class-specific variant
|
||||
void *(*operator_new)(size_t) = nullptr;
|
||||
|
||||
/// Function pointer to class_<..>::init_instance
|
||||
void (*init_instance)(instance *, const void *) = nullptr;
|
||||
|
||||
/// Function pointer to class_<..>::dealloc
|
||||
void (*dealloc)(detail::value_and_holder &) = nullptr;
|
||||
|
||||
/// Function pointer for casting alias class (aka trampoline) pointer to
|
||||
/// trampoline_self_life_support pointer. Sidesteps cross-DSO RTTI issues
|
||||
/// on platforms like macOS (see PR #5728 for details).
|
||||
get_trampoline_self_life_support_fn get_trampoline_self_life_support
|
||||
= [](void *) -> trampoline_self_life_support * { return nullptr; };
|
||||
|
||||
/// List of base classes of the newly created type
|
||||
list bases;
|
||||
|
||||
/// Optional docstring
|
||||
const char *doc = nullptr;
|
||||
|
||||
/// Custom metaclass (optional)
|
||||
handle metaclass;
|
||||
|
||||
/// Custom type setup.
|
||||
custom_type_setup::callback custom_type_setup_callback;
|
||||
|
||||
/// Multiple inheritance marker
|
||||
bool multiple_inheritance : 1;
|
||||
|
||||
/// Does the class manage a __dict__?
|
||||
bool dynamic_attr : 1;
|
||||
|
||||
/// Does the class implement the buffer protocol?
|
||||
bool buffer_protocol : 1;
|
||||
|
||||
/// Is the class definition local to the module shared object?
|
||||
bool module_local : 1;
|
||||
|
||||
/// Is the class inheritable from python classes?
|
||||
bool is_final : 1;
|
||||
|
||||
/// Solves pybind/pybind11#1446
|
||||
bool release_gil_before_calling_cpp_dtor : 1;
|
||||
|
||||
holder_enum_t holder_enum_v = holder_enum_t::undefined;
|
||||
|
||||
PYBIND11_NOINLINE void add_base(const std::type_info &base, void *(*caster)(void *) ) {
|
||||
auto *base_info = detail::get_type_info(base, false);
|
||||
if (!base_info) {
|
||||
std::string tname(base.name());
|
||||
detail::clean_type_id(tname);
|
||||
pybind11_fail("generic_type: type \"" + std::string(name)
|
||||
+ "\" referenced unknown base type \"" + tname + "\"");
|
||||
}
|
||||
|
||||
// SMART_HOLDER_BAKEIN_FOLLOW_ON: Refine holder compatibility checks.
|
||||
bool this_has_unique_ptr_holder = (holder_enum_v == holder_enum_t::std_unique_ptr);
|
||||
bool base_has_unique_ptr_holder
|
||||
= (base_info->holder_enum_v == holder_enum_t::std_unique_ptr);
|
||||
if (this_has_unique_ptr_holder != base_has_unique_ptr_holder) {
|
||||
std::string tname(base.name());
|
||||
detail::clean_type_id(tname);
|
||||
pybind11_fail("generic_type: type \"" + std::string(name) + "\" "
|
||||
+ (this_has_unique_ptr_holder ? "does not have" : "has")
|
||||
+ " a non-default holder type while its base \"" + tname + "\" "
|
||||
+ (base_has_unique_ptr_holder ? "does not" : "does"));
|
||||
}
|
||||
|
||||
bases.append((PyObject *) base_info->type);
|
||||
|
||||
#ifdef PYBIND11_BACKWARD_COMPATIBILITY_TP_DICTOFFSET
|
||||
dynamic_attr |= base_info->type->tp_dictoffset != 0;
|
||||
#else
|
||||
dynamic_attr |= (base_info->type->tp_flags & Py_TPFLAGS_MANAGED_DICT) != 0;
|
||||
#endif
|
||||
|
||||
if (caster) {
|
||||
base_info->implicit_casts.emplace_back(type, caster);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
inline function_call::function_call(const function_record &f, handle p) : func(f), parent(p) {
|
||||
args.reserve(f.nargs);
|
||||
args_convert.reserve(f.nargs);
|
||||
}
|
||||
|
||||
/// Tag for a new-style `__init__` defined in `detail/init.h`
|
||||
struct is_new_style_constructor {};
|
||||
|
||||
/**
|
||||
* Partial template specializations to process custom attributes provided to
|
||||
* cpp_function_ and class_. These are either used to initialize the respective
|
||||
* fields in the type_record and function_record data structures or executed at
|
||||
* runtime to deal with custom call policies (e.g. keep_alive).
|
||||
*/
|
||||
template <typename T, typename SFINAE = void>
|
||||
struct process_attribute;
|
||||
|
||||
template <typename T>
|
||||
struct process_attribute_default {
|
||||
/// Default implementation: do nothing
|
||||
static void init(const T &, function_record *) {}
|
||||
static void init(const T &, type_record *) {}
|
||||
static void precall(function_call &) {}
|
||||
static void postcall(function_call &, handle) {}
|
||||
};
|
||||
|
||||
/// Process an attribute specifying the function's name
|
||||
template <>
|
||||
struct process_attribute<name> : process_attribute_default<name> {
|
||||
static void init(const name &n, function_record *r) { r->name = const_cast<char *>(n.value); }
|
||||
};
|
||||
|
||||
/// Process an attribute specifying the function's docstring
|
||||
template <>
|
||||
struct process_attribute<doc> : process_attribute_default<doc> {
|
||||
static void init(const doc &n, function_record *r) { r->doc = const_cast<char *>(n.value); }
|
||||
};
|
||||
|
||||
/// Process an attribute specifying the function's docstring (provided as a C-style string)
|
||||
template <>
|
||||
struct process_attribute<const char *> : process_attribute_default<const char *> {
|
||||
static void init(const char *d, function_record *r) { r->doc = const_cast<char *>(d); }
|
||||
static void init(const char *d, type_record *r) { r->doc = d; }
|
||||
};
|
||||
template <>
|
||||
struct process_attribute<char *> : process_attribute<const char *> {};
|
||||
|
||||
/// Process an attribute indicating the function's return value policy
|
||||
template <>
|
||||
struct process_attribute<return_value_policy> : process_attribute_default<return_value_policy> {
|
||||
static void init(const return_value_policy &p, function_record *r) { r->policy = p; }
|
||||
};
|
||||
|
||||
/// Process an attribute which indicates that this is an overloaded function associated with a
|
||||
/// given sibling
|
||||
template <>
|
||||
struct process_attribute<sibling> : process_attribute_default<sibling> {
|
||||
static void init(const sibling &s, function_record *r) { r->sibling = s.value; }
|
||||
};
|
||||
|
||||
/// Process an attribute which indicates that this function is a method
|
||||
template <>
|
||||
struct process_attribute<is_method> : process_attribute_default<is_method> {
|
||||
static void init(const is_method &s, function_record *r) {
|
||||
r->is_method = true;
|
||||
r->scope = s.class_;
|
||||
}
|
||||
};
|
||||
|
||||
/// Process an attribute which indicates that this function is a setter
|
||||
template <>
|
||||
struct process_attribute<is_setter> : process_attribute_default<is_setter> {
|
||||
static void init(const is_setter &, function_record *r) { r->is_setter = true; }
|
||||
};
|
||||
|
||||
/// Process an attribute which indicates the parent scope of a method
|
||||
template <>
|
||||
struct process_attribute<scope> : process_attribute_default<scope> {
|
||||
static void init(const scope &s, function_record *r) { r->scope = s.value; }
|
||||
};
|
||||
|
||||
/// Process an attribute which indicates that this function is an operator
|
||||
template <>
|
||||
struct process_attribute<is_operator> : process_attribute_default<is_operator> {
|
||||
static void init(const is_operator &, function_record *r) { r->is_operator = true; }
|
||||
};
|
||||
|
||||
template <>
|
||||
struct process_attribute<is_new_style_constructor>
|
||||
: process_attribute_default<is_new_style_constructor> {
|
||||
static void init(const is_new_style_constructor &, function_record *r) {
|
||||
r->is_new_style_constructor = true;
|
||||
}
|
||||
};
|
||||
|
||||
inline void check_kw_only_arg(const arg &a, function_record *r) {
|
||||
if (r->args.size() > r->nargs_pos && (!a.name || a.name[0] == '\0')) {
|
||||
pybind11_fail("arg(): cannot specify an unnamed argument after a kw_only() annotation or "
|
||||
"args() argument");
|
||||
}
|
||||
}
|
||||
|
||||
inline void append_self_arg_if_needed(function_record *r) {
|
||||
if (r->is_method && r->args.empty()) {
|
||||
r->args.emplace_back("self", nullptr, handle(), /*convert=*/true, /*none=*/false);
|
||||
}
|
||||
}
|
||||
|
||||
/// Process a keyword argument attribute (*without* a default value)
|
||||
template <>
|
||||
struct process_attribute<arg> : process_attribute_default<arg> {
|
||||
static void init(const arg &a, function_record *r) {
|
||||
append_self_arg_if_needed(r);
|
||||
r->args.emplace_back(a.name, nullptr, handle(), !a.flag_noconvert, a.flag_none);
|
||||
|
||||
check_kw_only_arg(a, r);
|
||||
}
|
||||
};
|
||||
|
||||
/// Process a keyword argument attribute (*with* a default value)
|
||||
template <>
|
||||
struct process_attribute<arg_v> : process_attribute_default<arg_v> {
|
||||
static void init(const arg_v &a, function_record *r) {
|
||||
if (r->is_method && r->args.empty()) {
|
||||
r->args.emplace_back(
|
||||
"self", /*descr=*/nullptr, /*parent=*/handle(), /*convert=*/true, /*none=*/false);
|
||||
}
|
||||
|
||||
if (!a.value) {
|
||||
#if defined(PYBIND11_DETAILED_ERROR_MESSAGES)
|
||||
std::string descr("'");
|
||||
if (a.name) {
|
||||
descr += std::string(a.name) + ": ";
|
||||
}
|
||||
descr += a.type + "'";
|
||||
if (r->is_method) {
|
||||
if (r->name) {
|
||||
descr += " in method '" + (std::string) str(r->scope) + "."
|
||||
+ (std::string) r->name + "'";
|
||||
} else {
|
||||
descr += " in method of '" + (std::string) str(r->scope) + "'";
|
||||
}
|
||||
} else if (r->name) {
|
||||
descr += " in function '" + (std::string) r->name + "'";
|
||||
}
|
||||
pybind11_fail("arg(): could not convert default argument " + descr
|
||||
+ " into a Python object (type not registered yet?)");
|
||||
#else
|
||||
pybind11_fail("arg(): could not convert default argument "
|
||||
"into a Python object (type not registered yet?). "
|
||||
"#define PYBIND11_DETAILED_ERROR_MESSAGES or compile in debug mode for "
|
||||
"more information.");
|
||||
#endif
|
||||
}
|
||||
r->args.emplace_back(a.name, a.descr, a.value.inc_ref(), !a.flag_noconvert, a.flag_none);
|
||||
|
||||
check_kw_only_arg(a, r);
|
||||
}
|
||||
};
|
||||
|
||||
/// Process a keyword-only-arguments-follow pseudo argument
|
||||
template <>
|
||||
struct process_attribute<kw_only> : process_attribute_default<kw_only> {
|
||||
static void init(const kw_only &, function_record *r) {
|
||||
append_self_arg_if_needed(r);
|
||||
if (r->has_args && r->nargs_pos != static_cast<std::uint16_t>(r->args.size())) {
|
||||
pybind11_fail("Mismatched args() and kw_only(): they must occur at the same relative "
|
||||
"argument location (or omit kw_only() entirely)");
|
||||
}
|
||||
r->nargs_pos = static_cast<std::uint16_t>(r->args.size());
|
||||
}
|
||||
};
|
||||
|
||||
/// Process a positional-only-argument maker
|
||||
template <>
|
||||
struct process_attribute<pos_only> : process_attribute_default<pos_only> {
|
||||
static void init(const pos_only &, function_record *r) {
|
||||
append_self_arg_if_needed(r);
|
||||
r->nargs_pos_only = static_cast<std::uint16_t>(r->args.size());
|
||||
if (r->nargs_pos_only > r->nargs_pos) {
|
||||
pybind11_fail("pos_only(): cannot follow a py::args() argument");
|
||||
}
|
||||
// It also can't follow a kw_only, but a static_assert in pybind11.h checks that
|
||||
}
|
||||
};
|
||||
|
||||
/// Process a parent class attribute. Single inheritance only (class_ itself already guarantees
|
||||
/// that)
|
||||
template <typename T>
|
||||
struct process_attribute<T, enable_if_t<is_pyobject<T>::value>>
|
||||
: process_attribute_default<handle> {
|
||||
static void init(const handle &h, type_record *r) { r->bases.append(h); }
|
||||
};
|
||||
|
||||
/// Process a parent class attribute (deprecated, does not support multiple inheritance)
|
||||
template <typename T>
|
||||
struct process_attribute<base<T>> : process_attribute_default<base<T>> {
|
||||
static void init(const base<T> &, type_record *r) { r->add_base(typeid(T), nullptr); }
|
||||
};
|
||||
|
||||
/// Process a multiple inheritance attribute
|
||||
template <>
|
||||
struct process_attribute<multiple_inheritance> : process_attribute_default<multiple_inheritance> {
|
||||
static void init(const multiple_inheritance &, type_record *r) {
|
||||
r->multiple_inheritance = true;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct process_attribute<dynamic_attr> : process_attribute_default<dynamic_attr> {
|
||||
static void init(const dynamic_attr &, type_record *r) { r->dynamic_attr = true; }
|
||||
};
|
||||
|
||||
template <>
|
||||
struct process_attribute<custom_type_setup> {
|
||||
static void init(const custom_type_setup &value, type_record *r) {
|
||||
r->custom_type_setup_callback = value.value;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct process_attribute<is_final> : process_attribute_default<is_final> {
|
||||
static void init(const is_final &, type_record *r) { r->is_final = true; }
|
||||
};
|
||||
|
||||
template <>
|
||||
struct process_attribute<buffer_protocol> : process_attribute_default<buffer_protocol> {
|
||||
static void init(const buffer_protocol &, type_record *r) { r->buffer_protocol = true; }
|
||||
};
|
||||
|
||||
template <>
|
||||
struct process_attribute<metaclass> : process_attribute_default<metaclass> {
|
||||
static void init(const metaclass &m, type_record *r) { r->metaclass = m.value; }
|
||||
};
|
||||
|
||||
template <>
|
||||
struct process_attribute<module_local> : process_attribute_default<module_local> {
|
||||
static void init(const module_local &l, type_record *r) { r->module_local = l.value; }
|
||||
};
|
||||
|
||||
template <>
|
||||
struct process_attribute<release_gil_before_calling_cpp_dtor>
|
||||
: process_attribute_default<release_gil_before_calling_cpp_dtor> {
|
||||
static void init(const release_gil_before_calling_cpp_dtor &, type_record *r) {
|
||||
r->release_gil_before_calling_cpp_dtor = true;
|
||||
}
|
||||
};
|
||||
|
||||
/// Process a 'prepend' attribute, putting this at the beginning of the overload chain
|
||||
template <>
|
||||
struct process_attribute<prepend> : process_attribute_default<prepend> {
|
||||
static void init(const prepend &, function_record *r) { r->prepend = true; }
|
||||
};
|
||||
|
||||
/// Process an 'arithmetic' attribute for enums (does nothing here)
|
||||
template <>
|
||||
struct process_attribute<arithmetic> : process_attribute_default<arithmetic> {};
|
||||
|
||||
template <typename... Ts>
|
||||
struct process_attribute<call_guard<Ts...>> : process_attribute_default<call_guard<Ts...>> {};
|
||||
|
||||
/**
|
||||
* Process a keep_alive call policy -- invokes keep_alive_impl during the
|
||||
* pre-call handler if both Nurse, Patient != 0 and use the post-call handler
|
||||
* otherwise
|
||||
*/
|
||||
template <size_t Nurse, size_t Patient>
|
||||
struct process_attribute<keep_alive<Nurse, Patient>>
|
||||
: public process_attribute_default<keep_alive<Nurse, Patient>> {
|
||||
template <size_t N = Nurse, size_t P = Patient, enable_if_t<N != 0 && P != 0, int> = 0>
|
||||
static void precall(function_call &call) {
|
||||
keep_alive_impl(Nurse, Patient, call, handle());
|
||||
}
|
||||
template <size_t N = Nurse, size_t P = Patient, enable_if_t<N != 0 && P != 0, int> = 0>
|
||||
static void postcall(function_call &, handle) {}
|
||||
template <size_t N = Nurse, size_t P = Patient, enable_if_t<N == 0 || P == 0, int> = 0>
|
||||
static void precall(function_call &) {}
|
||||
template <size_t N = Nurse, size_t P = Patient, enable_if_t<N == 0 || P == 0, int> = 0>
|
||||
static void postcall(function_call &call, handle ret) {
|
||||
keep_alive_impl(Nurse, Patient, call, ret);
|
||||
}
|
||||
};
|
||||
|
||||
/// Recursively iterate over variadic template arguments
|
||||
template <typename... Args>
|
||||
struct process_attributes {
|
||||
static void init(const Args &...args, function_record *r) {
|
||||
PYBIND11_WORKAROUND_INCORRECT_MSVC_C4100(r);
|
||||
PYBIND11_WORKAROUND_INCORRECT_GCC_UNUSED_BUT_SET_PARAMETER(r);
|
||||
using expander = int[];
|
||||
(void) expander{
|
||||
0, ((void) process_attribute<typename std::decay<Args>::type>::init(args, r), 0)...};
|
||||
}
|
||||
static void init(const Args &...args, type_record *r) {
|
||||
PYBIND11_WORKAROUND_INCORRECT_MSVC_C4100(r);
|
||||
PYBIND11_WORKAROUND_INCORRECT_GCC_UNUSED_BUT_SET_PARAMETER(r);
|
||||
using expander = int[];
|
||||
(void) expander{0,
|
||||
(process_attribute<typename std::decay<Args>::type>::init(args, r), 0)...};
|
||||
}
|
||||
static void precall(function_call &call) {
|
||||
PYBIND11_WORKAROUND_INCORRECT_MSVC_C4100(call);
|
||||
using expander = int[];
|
||||
(void) expander{0,
|
||||
(process_attribute<typename std::decay<Args>::type>::precall(call), 0)...};
|
||||
}
|
||||
static void postcall(function_call &call, handle fn_ret) {
|
||||
PYBIND11_WORKAROUND_INCORRECT_MSVC_C4100(call, fn_ret);
|
||||
PYBIND11_WORKAROUND_INCORRECT_GCC_UNUSED_BUT_SET_PARAMETER(fn_ret);
|
||||
using expander = int[];
|
||||
(void) expander{
|
||||
0, (process_attribute<typename std::decay<Args>::type>::postcall(call, fn_ret), 0)...};
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
using is_call_guard = is_instantiation<call_guard, T>;
|
||||
|
||||
/// Extract the ``type`` from the first `call_guard` in `Extras...` (or `void_type` if none found)
|
||||
template <typename... Extra>
|
||||
using extract_guard_t = typename exactly_one_t<is_call_guard, call_guard<>, Extra...>::type;
|
||||
|
||||
/// Check the number of named arguments at compile time
|
||||
template <typename... Extra,
|
||||
size_t named = constexpr_sum(std::is_base_of<arg, Extra>::value...),
|
||||
size_t self = constexpr_sum(std::is_same<is_method, Extra>::value...)>
|
||||
constexpr bool expected_num_args(size_t nargs, bool has_args, bool has_kwargs) {
|
||||
PYBIND11_WORKAROUND_INCORRECT_MSVC_C4100(nargs, has_args, has_kwargs);
|
||||
return named == 0 || (self + named + size_t(has_args) + size_t(has_kwargs)) == nargs;
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
208
deps_src/pybind11/include/pybind11/buffer_info.h
Normal file
208
deps_src/pybind11/include/pybind11/buffer_info.h
Normal file
@@ -0,0 +1,208 @@
|
||||
/*
|
||||
pybind11/buffer_info.h: Python buffer object interface
|
||||
|
||||
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "detail/common.h"
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
// Default, C-style strides
|
||||
inline std::vector<ssize_t> c_strides(const std::vector<ssize_t> &shape, ssize_t itemsize) {
|
||||
auto ndim = shape.size();
|
||||
std::vector<ssize_t> strides(ndim, itemsize);
|
||||
if (ndim > 0) {
|
||||
for (size_t i = ndim - 1; i > 0; --i) {
|
||||
strides[i - 1] = strides[i] * shape[i];
|
||||
}
|
||||
}
|
||||
return strides;
|
||||
}
|
||||
|
||||
// F-style strides; default when constructing an array_t with `ExtraFlags & f_style`
|
||||
inline std::vector<ssize_t> f_strides(const std::vector<ssize_t> &shape, ssize_t itemsize) {
|
||||
auto ndim = shape.size();
|
||||
std::vector<ssize_t> strides(ndim, itemsize);
|
||||
for (size_t i = 1; i < ndim; ++i) {
|
||||
strides[i] = strides[i - 1] * shape[i - 1];
|
||||
}
|
||||
return strides;
|
||||
}
|
||||
|
||||
template <typename T, typename SFINAE = void>
|
||||
struct compare_buffer_info;
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
/// Information record describing a Python buffer object
|
||||
struct buffer_info {
|
||||
void *ptr = nullptr; // Pointer to the underlying storage
|
||||
ssize_t itemsize = 0; // Size of individual items in bytes
|
||||
ssize_t size = 0; // Total number of entries
|
||||
std::string format; // For homogeneous buffers, this should be set to
|
||||
// format_descriptor<T>::format()
|
||||
ssize_t ndim = 0; // Number of dimensions
|
||||
std::vector<ssize_t> shape; // Shape of the tensor (1 entry per dimension)
|
||||
std::vector<ssize_t> strides; // Number of bytes between adjacent entries
|
||||
// (for each per dimension)
|
||||
bool readonly = false; // flag to indicate if the underlying storage may be written to
|
||||
|
||||
buffer_info() = default;
|
||||
|
||||
buffer_info(void *ptr,
|
||||
ssize_t itemsize,
|
||||
const std::string &format,
|
||||
ssize_t ndim,
|
||||
detail::any_container<ssize_t> shape_in,
|
||||
detail::any_container<ssize_t> strides_in,
|
||||
bool readonly = false)
|
||||
: ptr(ptr), itemsize(itemsize), size(1), format(format), ndim(ndim),
|
||||
shape(std::move(shape_in)), strides(std::move(strides_in)), readonly(readonly) {
|
||||
if (ndim != (ssize_t) shape.size() || ndim != (ssize_t) strides.size()) {
|
||||
pybind11_fail("buffer_info: ndim doesn't match shape and/or strides length");
|
||||
}
|
||||
for (size_t i = 0; i < (size_t) ndim; ++i) {
|
||||
size *= shape[i];
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
buffer_info(T *ptr,
|
||||
detail::any_container<ssize_t> shape_in,
|
||||
detail::any_container<ssize_t> strides_in,
|
||||
bool readonly = false)
|
||||
: buffer_info(private_ctr_tag(),
|
||||
ptr,
|
||||
sizeof(T),
|
||||
format_descriptor<T>::format(),
|
||||
static_cast<ssize_t>(shape_in->size()),
|
||||
std::move(shape_in),
|
||||
std::move(strides_in),
|
||||
readonly) {}
|
||||
|
||||
buffer_info(void *ptr,
|
||||
ssize_t itemsize,
|
||||
const std::string &format,
|
||||
ssize_t size,
|
||||
bool readonly = false)
|
||||
: buffer_info(ptr, itemsize, format, 1, {size}, {itemsize}, readonly) {}
|
||||
|
||||
template <typename T>
|
||||
buffer_info(T *ptr, ssize_t size, bool readonly = false)
|
||||
: buffer_info(ptr, sizeof(T), format_descriptor<T>::format(), size, readonly) {}
|
||||
|
||||
template <typename T>
|
||||
buffer_info(const T *ptr, ssize_t size, bool readonly = true)
|
||||
: buffer_info(
|
||||
const_cast<T *>(ptr), sizeof(T), format_descriptor<T>::format(), size, readonly) {}
|
||||
|
||||
explicit buffer_info(Py_buffer *view, bool ownview = true)
|
||||
: buffer_info(
|
||||
view->buf,
|
||||
view->itemsize,
|
||||
view->format,
|
||||
view->ndim,
|
||||
{view->shape, view->shape + view->ndim},
|
||||
/* Though buffer::request() requests PyBUF_STRIDES, ctypes objects
|
||||
* ignore this flag and return a view with NULL strides.
|
||||
* When strides are NULL, build them manually. */
|
||||
view->strides
|
||||
? std::vector<ssize_t>(view->strides, view->strides + view->ndim)
|
||||
: detail::c_strides({view->shape, view->shape + view->ndim}, view->itemsize),
|
||||
(view->readonly != 0)) {
|
||||
// NOLINTNEXTLINE(cppcoreguidelines-prefer-member-initializer)
|
||||
this->m_view = view;
|
||||
// NOLINTNEXTLINE(cppcoreguidelines-prefer-member-initializer)
|
||||
this->ownview = ownview;
|
||||
}
|
||||
|
||||
buffer_info(const buffer_info &) = delete;
|
||||
buffer_info &operator=(const buffer_info &) = delete;
|
||||
|
||||
buffer_info(buffer_info &&other) noexcept { (*this) = std::move(other); }
|
||||
|
||||
buffer_info &operator=(buffer_info &&rhs) noexcept {
|
||||
ptr = rhs.ptr;
|
||||
itemsize = rhs.itemsize;
|
||||
size = rhs.size;
|
||||
format = std::move(rhs.format);
|
||||
ndim = rhs.ndim;
|
||||
shape = std::move(rhs.shape);
|
||||
strides = std::move(rhs.strides);
|
||||
std::swap(m_view, rhs.m_view);
|
||||
std::swap(ownview, rhs.ownview);
|
||||
readonly = rhs.readonly;
|
||||
return *this;
|
||||
}
|
||||
|
||||
~buffer_info() {
|
||||
if (m_view && ownview) {
|
||||
PyBuffer_Release(m_view);
|
||||
delete m_view;
|
||||
}
|
||||
}
|
||||
|
||||
Py_buffer *view() const { return m_view; }
|
||||
Py_buffer *&view() { return m_view; }
|
||||
|
||||
/* True if the buffer item type is equivalent to `T`. */
|
||||
// To define "equivalent" by example:
|
||||
// `buffer_info::item_type_is_equivalent_to<int>(b)` and
|
||||
// `buffer_info::item_type_is_equivalent_to<long>(b)` may both be true
|
||||
// on some platforms, but `int` and `unsigned` will never be equivalent.
|
||||
// For the ground truth, please inspect `detail::compare_buffer_info<>`.
|
||||
template <typename T>
|
||||
bool item_type_is_equivalent_to() const {
|
||||
return detail::compare_buffer_info<T>::compare(*this);
|
||||
}
|
||||
|
||||
private:
|
||||
struct private_ctr_tag {};
|
||||
|
||||
buffer_info(private_ctr_tag,
|
||||
void *ptr,
|
||||
ssize_t itemsize,
|
||||
const std::string &format,
|
||||
ssize_t ndim,
|
||||
detail::any_container<ssize_t> &&shape_in,
|
||||
detail::any_container<ssize_t> &&strides_in,
|
||||
bool readonly)
|
||||
: buffer_info(
|
||||
ptr, itemsize, format, ndim, std::move(shape_in), std::move(strides_in), readonly) {}
|
||||
|
||||
Py_buffer *m_view = nullptr;
|
||||
bool ownview = false;
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
template <typename T, typename SFINAE>
|
||||
struct compare_buffer_info {
|
||||
static bool compare(const buffer_info &b) {
|
||||
// NOLINTNEXTLINE(bugprone-sizeof-expression) Needed for `PyObject *`
|
||||
return b.format == format_descriptor<T>::format() && b.itemsize == (ssize_t) sizeof(T);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct compare_buffer_info<T, detail::enable_if_t<std::is_integral<T>::value>> {
|
||||
static bool compare(const buffer_info &b) {
|
||||
return (size_t) b.itemsize == sizeof(T)
|
||||
&& (b.format == format_descriptor<T>::value
|
||||
|| ((sizeof(T) == sizeof(long))
|
||||
&& b.format == (std::is_unsigned<T>::value ? "L" : "l"))
|
||||
|| ((sizeof(T) == sizeof(size_t))
|
||||
&& b.format == (std::is_unsigned<T>::value ? "N" : "n")));
|
||||
}
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
2361
deps_src/pybind11/include/pybind11/cast.h
Normal file
2361
deps_src/pybind11/include/pybind11/cast.h
Normal file
File diff suppressed because it is too large
Load Diff
228
deps_src/pybind11/include/pybind11/chrono.h
Normal file
228
deps_src/pybind11/include/pybind11/chrono.h
Normal file
@@ -0,0 +1,228 @@
|
||||
/*
|
||||
pybind11/chrono.h: Transparent conversion between std::chrono and python's datetime
|
||||
|
||||
Copyright (c) 2016 Trent Houliston <trent@houliston.me> and
|
||||
Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pybind11.h"
|
||||
|
||||
#include <chrono>
|
||||
#include <cmath>
|
||||
#include <ctime>
|
||||
#include <datetime.h>
|
||||
#include <mutex>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
template <typename type>
|
||||
class duration_caster {
|
||||
public:
|
||||
using rep = typename type::rep;
|
||||
using period = typename type::period;
|
||||
|
||||
// signed 25 bits required by the standard.
|
||||
using days = std::chrono::duration<int_least32_t, std::ratio<86400>>;
|
||||
|
||||
bool load(handle src, bool) {
|
||||
using namespace std::chrono;
|
||||
|
||||
// Lazy initialise the PyDateTime import
|
||||
if (!PyDateTimeAPI) {
|
||||
PyDateTime_IMPORT;
|
||||
}
|
||||
|
||||
if (!src) {
|
||||
return false;
|
||||
}
|
||||
// If invoked with datetime.delta object
|
||||
if (PyDelta_Check(src.ptr())) {
|
||||
value = type(duration_cast<duration<rep, period>>(
|
||||
days(PyDateTime_DELTA_GET_DAYS(src.ptr()))
|
||||
+ seconds(PyDateTime_DELTA_GET_SECONDS(src.ptr()))
|
||||
+ microseconds(PyDateTime_DELTA_GET_MICROSECONDS(src.ptr()))));
|
||||
return true;
|
||||
}
|
||||
// If invoked with a float we assume it is seconds and convert
|
||||
if (PyFloat_Check(src.ptr())) {
|
||||
value = type(duration_cast<duration<rep, period>>(
|
||||
duration<double>(PyFloat_AsDouble(src.ptr()))));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// If this is a duration just return it back
|
||||
static const std::chrono::duration<rep, period> &
|
||||
get_duration(const std::chrono::duration<rep, period> &src) {
|
||||
return src;
|
||||
}
|
||||
static const std::chrono::duration<rep, period> &
|
||||
get_duration(const std::chrono::duration<rep, period> &&)
|
||||
= delete;
|
||||
|
||||
// If this is a time_point get the time_since_epoch
|
||||
template <typename Clock>
|
||||
static std::chrono::duration<rep, period>
|
||||
get_duration(const std::chrono::time_point<Clock, std::chrono::duration<rep, period>> &src) {
|
||||
return src.time_since_epoch();
|
||||
}
|
||||
|
||||
static handle cast(const type &src, return_value_policy /* policy */, handle /* parent */) {
|
||||
using namespace std::chrono;
|
||||
|
||||
// Use overloaded function to get our duration from our source
|
||||
// Works out if it is a duration or time_point and get the duration
|
||||
auto d = get_duration(src);
|
||||
|
||||
// Lazy initialise the PyDateTime import
|
||||
if (!PyDateTimeAPI) {
|
||||
PyDateTime_IMPORT;
|
||||
}
|
||||
|
||||
// Declare these special duration types so the conversions happen with the correct
|
||||
// primitive types (int)
|
||||
using dd_t = duration<int, std::ratio<86400>>;
|
||||
using ss_t = duration<int, std::ratio<1>>;
|
||||
using us_t = duration<int, std::micro>;
|
||||
|
||||
auto dd = duration_cast<dd_t>(d);
|
||||
auto subd = d - dd;
|
||||
auto ss = duration_cast<ss_t>(subd);
|
||||
auto us = duration_cast<us_t>(subd - ss);
|
||||
return PyDelta_FromDSU(dd.count(), ss.count(), us.count());
|
||||
}
|
||||
|
||||
PYBIND11_TYPE_CASTER(type, const_name("datetime.timedelta"));
|
||||
};
|
||||
|
||||
inline std::tm *localtime_thread_safe(const std::time_t *time, std::tm *buf) {
|
||||
#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || defined(_MSC_VER)
|
||||
if (localtime_s(buf, time))
|
||||
return nullptr;
|
||||
return buf;
|
||||
#else
|
||||
static std::mutex mtx;
|
||||
std::lock_guard<std::mutex> lock(mtx);
|
||||
std::tm *tm_ptr = std::localtime(time);
|
||||
if (tm_ptr != nullptr) {
|
||||
*buf = *tm_ptr;
|
||||
}
|
||||
return tm_ptr;
|
||||
#endif
|
||||
}
|
||||
|
||||
// This is for casting times on the system clock into datetime.datetime instances
|
||||
template <typename Duration>
|
||||
class type_caster<std::chrono::time_point<std::chrono::system_clock, Duration>> {
|
||||
public:
|
||||
using type = std::chrono::time_point<std::chrono::system_clock, Duration>;
|
||||
bool load(handle src, bool) {
|
||||
using namespace std::chrono;
|
||||
|
||||
// Lazy initialise the PyDateTime import
|
||||
if (!PyDateTimeAPI) {
|
||||
PyDateTime_IMPORT;
|
||||
}
|
||||
|
||||
if (!src) {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::tm cal;
|
||||
microseconds msecs;
|
||||
|
||||
if (PyDateTime_Check(src.ptr())) {
|
||||
cal.tm_sec = PyDateTime_DATE_GET_SECOND(src.ptr());
|
||||
cal.tm_min = PyDateTime_DATE_GET_MINUTE(src.ptr());
|
||||
cal.tm_hour = PyDateTime_DATE_GET_HOUR(src.ptr());
|
||||
cal.tm_mday = PyDateTime_GET_DAY(src.ptr());
|
||||
cal.tm_mon = PyDateTime_GET_MONTH(src.ptr()) - 1;
|
||||
cal.tm_year = PyDateTime_GET_YEAR(src.ptr()) - 1900;
|
||||
cal.tm_isdst = -1;
|
||||
msecs = microseconds(PyDateTime_DATE_GET_MICROSECOND(src.ptr()));
|
||||
} else if (PyDate_Check(src.ptr())) {
|
||||
cal.tm_sec = 0;
|
||||
cal.tm_min = 0;
|
||||
cal.tm_hour = 0;
|
||||
cal.tm_mday = PyDateTime_GET_DAY(src.ptr());
|
||||
cal.tm_mon = PyDateTime_GET_MONTH(src.ptr()) - 1;
|
||||
cal.tm_year = PyDateTime_GET_YEAR(src.ptr()) - 1900;
|
||||
cal.tm_isdst = -1;
|
||||
msecs = microseconds(0);
|
||||
} else if (PyTime_Check(src.ptr())) {
|
||||
cal.tm_sec = PyDateTime_TIME_GET_SECOND(src.ptr());
|
||||
cal.tm_min = PyDateTime_TIME_GET_MINUTE(src.ptr());
|
||||
cal.tm_hour = PyDateTime_TIME_GET_HOUR(src.ptr());
|
||||
cal.tm_mday = 1; // This date (day, month, year) = (1, 0, 70)
|
||||
cal.tm_mon = 0; // represents 1-Jan-1970, which is the first
|
||||
cal.tm_year = 70; // earliest available date for Python's datetime
|
||||
cal.tm_isdst = -1;
|
||||
msecs = microseconds(PyDateTime_TIME_GET_MICROSECOND(src.ptr()));
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
value = time_point_cast<Duration>(system_clock::from_time_t(std::mktime(&cal)) + msecs);
|
||||
return true;
|
||||
}
|
||||
|
||||
static handle cast(const std::chrono::time_point<std::chrono::system_clock, Duration> &src,
|
||||
return_value_policy /* policy */,
|
||||
handle /* parent */) {
|
||||
using namespace std::chrono;
|
||||
|
||||
// Lazy initialise the PyDateTime import
|
||||
if (!PyDateTimeAPI) {
|
||||
PyDateTime_IMPORT;
|
||||
}
|
||||
|
||||
// Get out microseconds, and make sure they are positive, to avoid bug in eastern
|
||||
// hemisphere time zones (cfr. https://github.com/pybind/pybind11/issues/2417)
|
||||
using us_t = duration<int, std::micro>;
|
||||
auto us = duration_cast<us_t>(src.time_since_epoch() % seconds(1));
|
||||
if (us.count() < 0) {
|
||||
us += duration_cast<us_t>(seconds(1));
|
||||
}
|
||||
|
||||
// Subtract microseconds BEFORE `system_clock::to_time_t`, because:
|
||||
// > If std::time_t has lower precision, it is implementation-defined whether the value is
|
||||
// rounded or truncated. (https://en.cppreference.com/w/cpp/chrono/system_clock/to_time_t)
|
||||
std::time_t tt
|
||||
= system_clock::to_time_t(time_point_cast<system_clock::duration>(src - us));
|
||||
|
||||
std::tm localtime;
|
||||
std::tm *localtime_ptr = localtime_thread_safe(&tt, &localtime);
|
||||
if (!localtime_ptr) {
|
||||
throw cast_error("Unable to represent system_clock in local time");
|
||||
}
|
||||
return PyDateTime_FromDateAndTime(localtime.tm_year + 1900,
|
||||
localtime.tm_mon + 1,
|
||||
localtime.tm_mday,
|
||||
localtime.tm_hour,
|
||||
localtime.tm_min,
|
||||
localtime.tm_sec,
|
||||
us.count());
|
||||
}
|
||||
PYBIND11_TYPE_CASTER(type, const_name("datetime.datetime"));
|
||||
};
|
||||
|
||||
// Other clocks that are not the system clock are not measured as datetime.datetime objects
|
||||
// since they are not measured on calendar time. So instead we just make them timedeltas
|
||||
// Or if they have passed us a time as a float we convert that
|
||||
template <typename Clock, typename Duration>
|
||||
class type_caster<std::chrono::time_point<Clock, Duration>>
|
||||
: public duration_caster<std::chrono::time_point<Clock, Duration>> {};
|
||||
|
||||
template <typename Rep, typename Period>
|
||||
class type_caster<std::chrono::duration<Rep, Period>>
|
||||
: public duration_caster<std::chrono::duration<Rep, Period>> {};
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
2
deps_src/pybind11/include/pybind11/common.h
Normal file
2
deps_src/pybind11/include/pybind11/common.h
Normal file
@@ -0,0 +1,2 @@
|
||||
#include "detail/common.h"
|
||||
#warning "Including 'common.h' is deprecated. It will be removed in v3.0. Use 'pybind11.h'."
|
||||
74
deps_src/pybind11/include/pybind11/complex.h
Normal file
74
deps_src/pybind11/include/pybind11/complex.h
Normal file
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
pybind11/complex.h: Complex number support
|
||||
|
||||
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pybind11.h"
|
||||
|
||||
#include <complex>
|
||||
|
||||
/// glibc defines I as a macro which breaks things, e.g., boost template names
|
||||
#ifdef I
|
||||
# undef I
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
template <typename T>
|
||||
struct format_descriptor<std::complex<T>, detail::enable_if_t<std::is_floating_point<T>::value>> {
|
||||
static constexpr const char c = format_descriptor<T>::c;
|
||||
static constexpr const char value[3] = {'Z', c, '\0'};
|
||||
static std::string format() { return std::string(value); }
|
||||
};
|
||||
|
||||
#ifndef PYBIND11_CPP17
|
||||
|
||||
template <typename T>
|
||||
constexpr const char
|
||||
format_descriptor<std::complex<T>,
|
||||
detail::enable_if_t<std::is_floating_point<T>::value>>::value[3];
|
||||
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
template <typename T>
|
||||
struct is_fmt_numeric<std::complex<T>, detail::enable_if_t<std::is_floating_point<T>::value>> {
|
||||
static constexpr bool value = true;
|
||||
static constexpr int index = is_fmt_numeric<T>::index + 3;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class type_caster<std::complex<T>> {
|
||||
public:
|
||||
bool load(handle src, bool convert) {
|
||||
if (!src) {
|
||||
return false;
|
||||
}
|
||||
if (!convert && !PyComplex_Check(src.ptr())) {
|
||||
return false;
|
||||
}
|
||||
Py_complex result = PyComplex_AsCComplex(src.ptr());
|
||||
if (result.real == -1.0 && PyErr_Occurred()) {
|
||||
PyErr_Clear();
|
||||
return false;
|
||||
}
|
||||
value = std::complex<T>((T) result.real, (T) result.imag);
|
||||
return true;
|
||||
}
|
||||
|
||||
static handle
|
||||
cast(const std::complex<T> &src, return_value_policy /* policy */, handle /* parent */) {
|
||||
return PyComplex_FromDoubles((double) src.real(), (double) src.imag());
|
||||
}
|
||||
|
||||
PYBIND11_TYPE_CASTER(std::complex<T>, const_name("complex"));
|
||||
};
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
15
deps_src/pybind11/include/pybind11/conduit/README.txt
Normal file
15
deps_src/pybind11/include/pybind11/conduit/README.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
NOTE
|
||||
----
|
||||
|
||||
The C++ code here
|
||||
|
||||
** only depends on <Python.h> **
|
||||
|
||||
and nothing else.
|
||||
|
||||
DO NOT ADD CODE WITH OTHER EXTERNAL DEPENDENCIES TO THIS DIRECTORY.
|
||||
|
||||
Read on:
|
||||
|
||||
pybind11_conduit_v1.h — Type-safe interoperability between different
|
||||
independent Python/C++ bindings systems.
|
||||
116
deps_src/pybind11/include/pybind11/conduit/pybind11_conduit_v1.h
Normal file
116
deps_src/pybind11/include/pybind11/conduit/pybind11_conduit_v1.h
Normal file
@@ -0,0 +1,116 @@
|
||||
// Copyright (c) 2024 The pybind Community.
|
||||
|
||||
/* The pybind11_conduit_v1 feature enables type-safe interoperability between
|
||||
|
||||
* different independent Python/C++ bindings systems,
|
||||
|
||||
* including pybind11 versions with different PYBIND11_INTERNALS_VERSION's.
|
||||
|
||||
* NOTE: The conduit feature
|
||||
only covers from-Python-to-C++ conversions, it
|
||||
does not cover from-C++-to-Python conversions.
|
||||
(For the latter, a different feature would have to be added.)
|
||||
|
||||
The naming of the feature is a bit misleading:
|
||||
|
||||
* The feature is in no way tied to pybind11 internals.
|
||||
|
||||
* It just happens to originate from pybind11 and currently still lives there.
|
||||
|
||||
* The only external dependency is <Python.h>.
|
||||
|
||||
The implementation is a VERY light-weight dependency. It is designed to be
|
||||
compatible with any ISO C++11 (or higher) compiler, and does NOT require
|
||||
C++ Exception Handling to be enabled.
|
||||
|
||||
Please see https://github.com/pybind/pybind11/pull/5296 for more background.
|
||||
|
||||
The implementation involves a
|
||||
|
||||
def _pybind11_conduit_v1_(
|
||||
self,
|
||||
pybind11_platform_abi_id: bytes,
|
||||
cpp_type_info_capsule: capsule,
|
||||
pointer_kind: bytes) -> capsule
|
||||
|
||||
method that is meant to be added to Python objects wrapping C++ objects
|
||||
(e.g. pybind11::class_-wrapped types).
|
||||
|
||||
The design of the _pybind11_conduit_v1_ feature provides two layers of
|
||||
protection against C++ ABI mismatches:
|
||||
|
||||
* The first and most important layer is that the pybind11_platform_abi_id's
|
||||
must match between extensions. — This will never be perfect, but is the same
|
||||
pragmatic approach used in pybind11 since 2017
|
||||
(https://github.com/pybind/pybind11/commit/96997a4b9d4ec3d389a570604394af5d5eee2557,
|
||||
PYBIND11_INTERNALS_ID).
|
||||
|
||||
* The second layer is that the typeid(std::type_info).name()'s must match
|
||||
between extensions.
|
||||
|
||||
The implementation below (which is shorter than this comment!), serves as a
|
||||
battle-tested specification. The main API is this one function:
|
||||
|
||||
auto *cpp_pointer = pybind11_conduit_v1::get_type_pointer_ephemeral<YourType>(py_obj);
|
||||
|
||||
It is meant to be a minimalistic reference implementation, intentionally
|
||||
without comprehensive error reporting. It is expected that major bindings
|
||||
systems will roll their own, compatible implementations, potentially with
|
||||
system-specific error reporting. The essential specifications all bindings
|
||||
systems need to agree on are merely:
|
||||
|
||||
* PYBIND11_PLATFORM_ABI_ID (const char* literal).
|
||||
|
||||
* The cpp_type_info capsule (see below: a void *ptr and a const char *name).
|
||||
|
||||
* The cpp_conduit capsule (see below: a void *ptr and a const char *name).
|
||||
|
||||
* "raw_pointer_ephemeral" means: the lifetime of the pointer is the lifetime
|
||||
of the py_obj.
|
||||
|
||||
*/
|
||||
|
||||
// THIS MUST STAY AT THE TOP!
|
||||
#include "pybind11_platform_abi_id.h"
|
||||
|
||||
#include <Python.h>
|
||||
#include <typeinfo>
|
||||
|
||||
namespace pybind11_conduit_v1 {
|
||||
|
||||
inline void *get_raw_pointer_ephemeral(PyObject *py_obj, const std::type_info *cpp_type_info) {
|
||||
PyObject *cpp_type_info_capsule
|
||||
= PyCapsule_New(const_cast<void *>(static_cast<const void *>(cpp_type_info)),
|
||||
typeid(std::type_info).name(),
|
||||
nullptr);
|
||||
if (cpp_type_info_capsule == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
PyObject *cpp_conduit = PyObject_CallMethod(py_obj,
|
||||
"_pybind11_conduit_v1_",
|
||||
"yOy",
|
||||
PYBIND11_PLATFORM_ABI_ID,
|
||||
cpp_type_info_capsule,
|
||||
"raw_pointer_ephemeral");
|
||||
Py_DECREF(cpp_type_info_capsule);
|
||||
if (cpp_conduit == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
void *raw_ptr = PyCapsule_GetPointer(cpp_conduit, cpp_type_info->name());
|
||||
Py_DECREF(cpp_conduit);
|
||||
if (PyErr_Occurred()) {
|
||||
return nullptr;
|
||||
}
|
||||
return raw_ptr;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T *get_type_pointer_ephemeral(PyObject *py_obj) {
|
||||
void *raw_ptr = get_raw_pointer_ephemeral(py_obj, &typeid(T));
|
||||
if (raw_ptr == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
return static_cast<T *>(raw_ptr);
|
||||
}
|
||||
|
||||
} // namespace pybind11_conduit_v1
|
||||
@@ -0,0 +1,87 @@
|
||||
#pragma once
|
||||
|
||||
// Copyright (c) 2024 The pybind Community.
|
||||
|
||||
// To maximize reusability:
|
||||
// DO NOT ADD CODE THAT REQUIRES C++ EXCEPTION HANDLING.
|
||||
|
||||
#include "wrap_include_python_h.h"
|
||||
|
||||
// Implementation details. DO NOT USE ELSEWHERE. (Unfortunately we cannot #undef them.)
|
||||
// This is duplicated here to maximize portability.
|
||||
#define PYBIND11_PLATFORM_ABI_ID_STRINGIFY(x) #x
|
||||
#define PYBIND11_PLATFORM_ABI_ID_TOSTRING(x) PYBIND11_PLATFORM_ABI_ID_STRINGIFY(x)
|
||||
|
||||
#ifdef PYBIND11_COMPILER_TYPE
|
||||
// // To maintain backward compatibility (see PR #5439).
|
||||
# define PYBIND11_COMPILER_TYPE_LEADING_UNDERSCORE ""
|
||||
#else
|
||||
# define PYBIND11_COMPILER_TYPE_LEADING_UNDERSCORE "_"
|
||||
# if defined(__MINGW32__)
|
||||
# define PYBIND11_COMPILER_TYPE "mingw"
|
||||
# elif defined(__CYGWIN__)
|
||||
# define PYBIND11_COMPILER_TYPE "gcc_cygwin"
|
||||
# elif defined(_MSC_VER)
|
||||
# define PYBIND11_COMPILER_TYPE "msvc"
|
||||
# elif defined(__clang__) || defined(__GNUC__)
|
||||
# define PYBIND11_COMPILER_TYPE "system" // Assumed compatible with system compiler.
|
||||
# else
|
||||
# error "Unknown PYBIND11_COMPILER_TYPE: PLEASE REVISE THIS CODE."
|
||||
# endif
|
||||
#endif
|
||||
|
||||
// PR #5439 made this macro obsolete. However, there are many manipulations of this macro in the
|
||||
// wild. Therefore, to maintain backward compatibility, it is kept around.
|
||||
#ifndef PYBIND11_STDLIB
|
||||
# define PYBIND11_STDLIB ""
|
||||
#endif
|
||||
|
||||
#ifndef PYBIND11_BUILD_ABI
|
||||
# if defined(_MSC_VER) // See PR #4953.
|
||||
# if defined(_MT) && defined(_DLL) // Corresponding to CL command line options /MD or /MDd.
|
||||
# if (_MSC_VER) / 100 == 19
|
||||
# define PYBIND11_BUILD_ABI "_md_mscver19"
|
||||
# else
|
||||
# error "Unknown major version for MSC_VER: PLEASE REVISE THIS CODE."
|
||||
# endif
|
||||
# elif defined(_MT) // Corresponding to CL command line options /MT or /MTd.
|
||||
# define PYBIND11_BUILD_ABI "_mt_mscver" PYBIND11_PLATFORM_ABI_ID_TOSTRING(_MSC_VER)
|
||||
# else
|
||||
# if (_MSC_VER) / 100 == 19
|
||||
# define PYBIND11_BUILD_ABI "_none_mscver19"
|
||||
# else
|
||||
# error "Unknown major version for MSC_VER: PLEASE REVISE THIS CODE."
|
||||
# endif
|
||||
# endif
|
||||
# elif defined(_LIBCPP_ABI_VERSION) // https://libcxx.llvm.org/DesignDocs/ABIVersioning.html
|
||||
# define PYBIND11_BUILD_ABI \
|
||||
"_libcpp_abi" PYBIND11_PLATFORM_ABI_ID_TOSTRING(_LIBCPP_ABI_VERSION)
|
||||
# elif defined(_GLIBCXX_USE_CXX11_ABI) // See PR #5439.
|
||||
# if defined(__NVCOMPILER)
|
||||
// // Assume that NVHPC is in the 1xxx ABI family.
|
||||
// // THIS ASSUMPTION IS NOT FUTURE PROOF but apparently the best we can do.
|
||||
// // Please let us know if there is a way to validate the assumption here.
|
||||
# elif !defined(__GXX_ABI_VERSION)
|
||||
# error \
|
||||
"Unknown platform or compiler (_GLIBCXX_USE_CXX11_ABI): PLEASE REVISE THIS CODE."
|
||||
# endif
|
||||
# if defined(__GXX_ABI_VERSION) && __GXX_ABI_VERSION < 1002 || __GXX_ABI_VERSION >= 2000
|
||||
# error "Unknown platform or compiler (__GXX_ABI_VERSION): PLEASE REVISE THIS CODE."
|
||||
# endif
|
||||
# define PYBIND11_BUILD_ABI \
|
||||
"_libstdcpp_gxx_abi_1xxx_use_cxx11_abi_" PYBIND11_PLATFORM_ABI_ID_TOSTRING( \
|
||||
_GLIBCXX_USE_CXX11_ABI)
|
||||
# else
|
||||
# error "Unknown platform or compiler: PLEASE REVISE THIS CODE."
|
||||
# endif
|
||||
#endif
|
||||
|
||||
// On MSVC, debug and release builds are not ABI-compatible!
|
||||
#if defined(_MSC_VER) && defined(_DEBUG)
|
||||
# define PYBIND11_BUILD_TYPE "_debug"
|
||||
#else
|
||||
# define PYBIND11_BUILD_TYPE ""
|
||||
#endif
|
||||
|
||||
#define PYBIND11_PLATFORM_ABI_ID \
|
||||
PYBIND11_COMPILER_TYPE PYBIND11_STDLIB PYBIND11_BUILD_ABI PYBIND11_BUILD_TYPE
|
||||
@@ -0,0 +1,72 @@
|
||||
#pragma once
|
||||
|
||||
// Copyright (c) 2024 The pybind Community.
|
||||
|
||||
// STRONG REQUIREMENT:
|
||||
// This header is a wrapper around `#include <Python.h>`, therefore it
|
||||
// MUST BE INCLUDED BEFORE ANY STANDARD HEADERS are included.
|
||||
// See also:
|
||||
// https://docs.python.org/3/c-api/intro.html#include-files
|
||||
// Quoting from there:
|
||||
// Note: Since Python may define some pre-processor definitions which affect
|
||||
// the standard headers on some systems, you must include Python.h before
|
||||
// any standard headers are included.
|
||||
|
||||
// To maximize reusability:
|
||||
// DO NOT ADD CODE THAT REQUIRES C++ EXCEPTION HANDLING.
|
||||
|
||||
// Disable linking to pythonX_d.lib on Windows in debug mode.
|
||||
#if defined(_MSC_VER) && defined(_DEBUG) && !defined(Py_DEBUG)
|
||||
// Workaround for a VS 2022 issue.
|
||||
// See https://github.com/pybind/pybind11/pull/3497 for full context.
|
||||
// NOTE: This workaround knowingly violates the Python.h include order
|
||||
// requirement (see above).
|
||||
# include <yvals.h>
|
||||
# if _MSVC_STL_VERSION >= 143
|
||||
# include <crtdefs.h>
|
||||
# endif
|
||||
# define PYBIND11_DEBUG_MARKER
|
||||
# undef _DEBUG
|
||||
#endif
|
||||
|
||||
// Don't let Python.h #define (v)snprintf as macro because they are implemented
|
||||
// properly in Visual Studio since 2015.
|
||||
#if defined(_MSC_VER)
|
||||
# define HAVE_SNPRINTF 1
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable : 4505)
|
||||
// C4505: 'PySlice_GetIndicesEx': unreferenced local function has been removed
|
||||
#endif
|
||||
|
||||
#include <Python.h>
|
||||
#include <frameobject.h>
|
||||
#include <pythread.h>
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#if defined(PYBIND11_DEBUG_MARKER)
|
||||
# define _DEBUG 1
|
||||
# undef PYBIND11_DEBUG_MARKER
|
||||
#endif
|
||||
|
||||
// Python #defines overrides on all sorts of core functions, which
|
||||
// tends to wreak havok in C++ codebases that expect these to work
|
||||
// like regular functions (potentially with several overloads).
|
||||
#if defined(isalnum)
|
||||
# undef isalnum
|
||||
# undef isalpha
|
||||
# undef islower
|
||||
# undef isspace
|
||||
# undef isupper
|
||||
# undef tolower
|
||||
# undef toupper
|
||||
#endif
|
||||
|
||||
#if defined(copysign)
|
||||
# undef copysign
|
||||
#endif
|
||||
56
deps_src/pybind11/include/pybind11/critical_section.h
Normal file
56
deps_src/pybind11/include/pybind11/critical_section.h
Normal file
@@ -0,0 +1,56 @@
|
||||
// Copyright (c) 2016-2025 The Pybind Development Team.
|
||||
// All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pytypes.h"
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
/// This does not do anything if there's a GIL. On free-threaded Python,
|
||||
/// it locks an object. This uses the CPython API, which has limits
|
||||
class scoped_critical_section {
|
||||
public:
|
||||
#ifdef Py_GIL_DISABLED
|
||||
explicit scoped_critical_section(handle obj1, handle obj2 = handle{}) {
|
||||
if (obj1) {
|
||||
if (obj2) {
|
||||
PyCriticalSection2_Begin(§ion2, obj1.ptr(), obj2.ptr());
|
||||
rank = 2;
|
||||
} else {
|
||||
PyCriticalSection_Begin(§ion, obj1.ptr());
|
||||
rank = 1;
|
||||
}
|
||||
} else if (obj2) {
|
||||
PyCriticalSection_Begin(§ion, obj2.ptr());
|
||||
rank = 1;
|
||||
}
|
||||
}
|
||||
|
||||
~scoped_critical_section() {
|
||||
if (rank == 1) {
|
||||
PyCriticalSection_End(§ion);
|
||||
} else if (rank == 2) {
|
||||
PyCriticalSection2_End(§ion2);
|
||||
}
|
||||
}
|
||||
#else
|
||||
explicit scoped_critical_section(handle, handle = handle{}) {};
|
||||
~scoped_critical_section() = default;
|
||||
#endif
|
||||
|
||||
scoped_critical_section(const scoped_critical_section &) = delete;
|
||||
scoped_critical_section &operator=(const scoped_critical_section &) = delete;
|
||||
|
||||
private:
|
||||
#ifdef Py_GIL_DISABLED
|
||||
int rank{0};
|
||||
union {
|
||||
PyCriticalSection section;
|
||||
PyCriticalSection2 section2;
|
||||
};
|
||||
#endif
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
823
deps_src/pybind11/include/pybind11/detail/class.h
Normal file
823
deps_src/pybind11/include/pybind11/detail/class.h
Normal file
@@ -0,0 +1,823 @@
|
||||
/*
|
||||
pybind11/detail/class.h: Python C API implementation details for py::class_
|
||||
|
||||
Copyright (c) 2017 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <pybind11/attr.h>
|
||||
#include <pybind11/options.h>
|
||||
|
||||
#include "exception_translation.h"
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
#if !defined(PYPY_VERSION)
|
||||
# define PYBIND11_BUILTIN_QUALNAME
|
||||
# define PYBIND11_SET_OLDPY_QUALNAME(obj, nameobj)
|
||||
#else
|
||||
// In PyPy, we still set __qualname__ so that we can produce reliable function type
|
||||
// signatures; in CPython this macro expands to nothing:
|
||||
# define PYBIND11_SET_OLDPY_QUALNAME(obj, nameobj) \
|
||||
setattr((PyObject *) obj, "__qualname__", nameobj)
|
||||
#endif
|
||||
|
||||
inline std::string get_fully_qualified_tp_name(PyTypeObject *type) {
|
||||
#if !defined(PYPY_VERSION)
|
||||
return type->tp_name;
|
||||
#else
|
||||
auto module_name = handle((PyObject *) type).attr("__module__").cast<std::string>();
|
||||
if (module_name == PYBIND11_BUILTINS_MODULE)
|
||||
return type->tp_name;
|
||||
else
|
||||
return std::move(module_name) + "." + type->tp_name;
|
||||
#endif
|
||||
}
|
||||
|
||||
inline PyTypeObject *type_incref(PyTypeObject *type) {
|
||||
Py_INCREF(type);
|
||||
return type;
|
||||
}
|
||||
|
||||
#if !defined(PYPY_VERSION)
|
||||
|
||||
/// `pybind11_static_property.__get__()`: Always pass the class instead of the instance.
|
||||
extern "C" inline PyObject *pybind11_static_get(PyObject *self, PyObject * /*ob*/, PyObject *cls) {
|
||||
return PyProperty_Type.tp_descr_get(self, cls, cls);
|
||||
}
|
||||
|
||||
/// `pybind11_static_property.__set__()`: Just like the above `__get__()`.
|
||||
extern "C" inline int pybind11_static_set(PyObject *self, PyObject *obj, PyObject *value) {
|
||||
PyObject *cls = PyType_Check(obj) ? obj : (PyObject *) Py_TYPE(obj);
|
||||
return PyProperty_Type.tp_descr_set(self, cls, value);
|
||||
}
|
||||
|
||||
// Forward declaration to use in `make_static_property_type()`
|
||||
inline void enable_dynamic_attributes(PyHeapTypeObject *heap_type);
|
||||
|
||||
/** A `static_property` is the same as a `property` but the `__get__()` and `__set__()`
|
||||
methods are modified to always use the object type instead of a concrete instance.
|
||||
Return value: New reference. */
|
||||
inline PyTypeObject *make_static_property_type() {
|
||||
constexpr auto *name = "pybind11_static_property";
|
||||
auto name_obj = reinterpret_steal<object>(PYBIND11_FROM_STRING(name));
|
||||
|
||||
/* Danger zone: from now (and until PyType_Ready), make sure to
|
||||
issue no Python C API calls which could potentially invoke the
|
||||
garbage collector (the GC will call type_traverse(), which will in
|
||||
turn find the newly constructed type in an invalid state) */
|
||||
auto *heap_type = (PyHeapTypeObject *) PyType_Type.tp_alloc(&PyType_Type, 0);
|
||||
if (!heap_type) {
|
||||
pybind11_fail("make_static_property_type(): error allocating type!");
|
||||
}
|
||||
|
||||
heap_type->ht_name = name_obj.inc_ref().ptr();
|
||||
# ifdef PYBIND11_BUILTIN_QUALNAME
|
||||
heap_type->ht_qualname = name_obj.inc_ref().ptr();
|
||||
# endif
|
||||
|
||||
auto *type = &heap_type->ht_type;
|
||||
type->tp_name = name;
|
||||
type->tp_base = type_incref(&PyProperty_Type);
|
||||
type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HEAPTYPE;
|
||||
type->tp_descr_get = pybind11_static_get;
|
||||
type->tp_descr_set = pybind11_static_set;
|
||||
|
||||
# if PY_VERSION_HEX >= 0x030C0000
|
||||
// Since Python-3.12 property-derived types are required to
|
||||
// have dynamic attributes (to set `__doc__`)
|
||||
enable_dynamic_attributes(heap_type);
|
||||
# endif
|
||||
|
||||
if (PyType_Ready(type) < 0) {
|
||||
pybind11_fail("make_static_property_type(): failure in PyType_Ready()!");
|
||||
}
|
||||
|
||||
setattr((PyObject *) type, "__module__", str(PYBIND11_DUMMY_MODULE_NAME));
|
||||
PYBIND11_SET_OLDPY_QUALNAME(type, name_obj);
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
#else // PYPY
|
||||
|
||||
/** PyPy has some issues with the above C API, so we evaluate Python code instead.
|
||||
This function will only be called once so performance isn't really a concern.
|
||||
Return value: New reference. */
|
||||
inline PyTypeObject *make_static_property_type() {
|
||||
auto d = dict();
|
||||
PyObject *result = PyRun_String(R"(\
|
||||
class pybind11_static_property(property):
|
||||
def __get__(self, obj, cls):
|
||||
return property.__get__(self, cls, cls)
|
||||
|
||||
def __set__(self, obj, value):
|
||||
cls = obj if isinstance(obj, type) else type(obj)
|
||||
property.__set__(self, cls, value)
|
||||
)",
|
||||
Py_file_input,
|
||||
d.ptr(),
|
||||
d.ptr());
|
||||
if (result == nullptr)
|
||||
throw error_already_set();
|
||||
Py_DECREF(result);
|
||||
return (PyTypeObject *) d["pybind11_static_property"].cast<object>().release().ptr();
|
||||
}
|
||||
|
||||
#endif // PYPY
|
||||
|
||||
/** Types with static properties need to handle `Type.static_prop = x` in a specific way.
|
||||
By default, Python replaces the `static_property` itself, but for wrapped C++ types
|
||||
we need to call `static_property.__set__()` in order to propagate the new value to
|
||||
the underlying C++ data structure. */
|
||||
extern "C" inline int pybind11_meta_setattro(PyObject *obj, PyObject *name, PyObject *value) {
|
||||
// Use `_PyType_Lookup()` instead of `PyObject_GetAttr()` in order to get the raw
|
||||
// descriptor (`property`) instead of calling `tp_descr_get` (`property.__get__()`).
|
||||
PyObject *descr = _PyType_Lookup((PyTypeObject *) obj, name);
|
||||
|
||||
// The following assignment combinations are possible:
|
||||
// 1. `Type.static_prop = value` --> descr_set: `Type.static_prop.__set__(value)`
|
||||
// 2. `Type.static_prop = other_static_prop` --> setattro: replace existing `static_prop`
|
||||
// 3. `Type.regular_attribute = value` --> setattro: regular attribute assignment
|
||||
auto *const static_prop = (PyObject *) get_internals().static_property_type;
|
||||
const auto call_descr_set = (descr != nullptr) && (value != nullptr)
|
||||
&& (PyObject_IsInstance(descr, static_prop) != 0)
|
||||
&& (PyObject_IsInstance(value, static_prop) == 0);
|
||||
if (call_descr_set) {
|
||||
// Call `static_property.__set__()` instead of replacing the `static_property`.
|
||||
#if !defined(PYPY_VERSION)
|
||||
return Py_TYPE(descr)->tp_descr_set(descr, obj, value);
|
||||
#else
|
||||
if (PyObject *result = PyObject_CallMethod(descr, "__set__", "OO", obj, value)) {
|
||||
Py_DECREF(result);
|
||||
return 0;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
// Replace existing attribute.
|
||||
return PyType_Type.tp_setattro(obj, name, value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Python 3's PyInstanceMethod_Type hides itself via its tp_descr_get, which prevents aliasing
|
||||
* methods via cls.attr("m2") = cls.attr("m1"): instead the tp_descr_get returns a plain function,
|
||||
* when called on a class, or a PyMethod, when called on an instance. Override that behaviour here
|
||||
* to do a special case bypass for PyInstanceMethod_Types.
|
||||
*/
|
||||
extern "C" inline PyObject *pybind11_meta_getattro(PyObject *obj, PyObject *name) {
|
||||
PyObject *descr = _PyType_Lookup((PyTypeObject *) obj, name);
|
||||
if (descr && PyInstanceMethod_Check(descr)) {
|
||||
Py_INCREF(descr);
|
||||
return descr;
|
||||
}
|
||||
return PyType_Type.tp_getattro(obj, name);
|
||||
}
|
||||
|
||||
/// metaclass `__call__` function that is used to create all pybind11 objects.
|
||||
extern "C" inline PyObject *pybind11_meta_call(PyObject *type, PyObject *args, PyObject *kwargs) {
|
||||
|
||||
// use the default metaclass call to create/initialize the object
|
||||
PyObject *self = PyType_Type.tp_call(type, args, kwargs);
|
||||
if (self == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Ensure that the base __init__ function(s) were called
|
||||
values_and_holders vhs(self);
|
||||
for (const auto &vh : vhs) {
|
||||
if (!vh.holder_constructed() && !vhs.is_redundant_value_and_holder(vh)) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%.200s.__init__() must be called when overriding __init__",
|
||||
get_fully_qualified_tp_name(vh.type->type).c_str());
|
||||
Py_DECREF(self);
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
/// Cleanup the type-info for a pybind11-registered type.
|
||||
extern "C" inline void pybind11_meta_dealloc(PyObject *obj) {
|
||||
with_internals([obj](internals &internals) {
|
||||
auto *type = (PyTypeObject *) obj;
|
||||
|
||||
// A pybind11-registered type will:
|
||||
// 1) be found in internals.registered_types_py
|
||||
// 2) have exactly one associated `detail::type_info`
|
||||
auto found_type = internals.registered_types_py.find(type);
|
||||
if (found_type != internals.registered_types_py.end() && found_type->second.size() == 1
|
||||
&& found_type->second[0]->type == type) {
|
||||
|
||||
auto *tinfo = found_type->second[0];
|
||||
auto tindex = std::type_index(*tinfo->cpptype);
|
||||
internals.direct_conversions.erase(tindex);
|
||||
|
||||
if (tinfo->module_local) {
|
||||
get_local_internals().registered_types_cpp.erase(tindex);
|
||||
} else {
|
||||
internals.registered_types_cpp.erase(tindex);
|
||||
}
|
||||
internals.registered_types_py.erase(tinfo->type);
|
||||
|
||||
// Actually just `std::erase_if`, but that's only available in C++20
|
||||
auto &cache = internals.inactive_override_cache;
|
||||
for (auto it = cache.begin(), last = cache.end(); it != last;) {
|
||||
if (it->first == (PyObject *) tinfo->type) {
|
||||
it = cache.erase(it);
|
||||
} else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
delete tinfo;
|
||||
}
|
||||
});
|
||||
|
||||
PyType_Type.tp_dealloc(obj);
|
||||
}
|
||||
|
||||
/** This metaclass is assigned by default to all pybind11 types and is required in order
|
||||
for static properties to function correctly. Users may override this using `py::metaclass`.
|
||||
Return value: New reference. */
|
||||
inline PyTypeObject *make_default_metaclass() {
|
||||
constexpr auto *name = "pybind11_type";
|
||||
auto name_obj = reinterpret_steal<object>(PYBIND11_FROM_STRING(name));
|
||||
|
||||
/* Danger zone: from now (and until PyType_Ready), make sure to
|
||||
issue no Python C API calls which could potentially invoke the
|
||||
garbage collector (the GC will call type_traverse(), which will in
|
||||
turn find the newly constructed type in an invalid state) */
|
||||
auto *heap_type = (PyHeapTypeObject *) PyType_Type.tp_alloc(&PyType_Type, 0);
|
||||
if (!heap_type) {
|
||||
pybind11_fail("make_default_metaclass(): error allocating metaclass!");
|
||||
}
|
||||
|
||||
heap_type->ht_name = name_obj.inc_ref().ptr();
|
||||
#ifdef PYBIND11_BUILTIN_QUALNAME
|
||||
heap_type->ht_qualname = name_obj.inc_ref().ptr();
|
||||
#endif
|
||||
|
||||
auto *type = &heap_type->ht_type;
|
||||
type->tp_name = name;
|
||||
type->tp_base = type_incref(&PyType_Type);
|
||||
type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HEAPTYPE;
|
||||
|
||||
type->tp_call = pybind11_meta_call;
|
||||
|
||||
type->tp_setattro = pybind11_meta_setattro;
|
||||
type->tp_getattro = pybind11_meta_getattro;
|
||||
|
||||
type->tp_dealloc = pybind11_meta_dealloc;
|
||||
|
||||
if (PyType_Ready(type) < 0) {
|
||||
pybind11_fail("make_default_metaclass(): failure in PyType_Ready()!");
|
||||
}
|
||||
|
||||
setattr((PyObject *) type, "__module__", str(PYBIND11_DUMMY_MODULE_NAME));
|
||||
PYBIND11_SET_OLDPY_QUALNAME(type, name_obj);
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
/// For multiple inheritance types we need to recursively register/deregister base pointers for any
|
||||
/// base classes with pointers that are difference from the instance value pointer so that we can
|
||||
/// correctly recognize an offset base class pointer. This calls a function with any offset base
|
||||
/// ptrs.
|
||||
inline void traverse_offset_bases(void *valueptr,
|
||||
const detail::type_info *tinfo,
|
||||
instance *self,
|
||||
bool (*f)(void * /*parentptr*/, instance * /*self*/)) {
|
||||
for (handle h : reinterpret_borrow<tuple>(tinfo->type->tp_bases)) {
|
||||
if (auto *parent_tinfo = get_type_info((PyTypeObject *) h.ptr())) {
|
||||
for (auto &c : parent_tinfo->implicit_casts) {
|
||||
if (c.first == tinfo->cpptype) {
|
||||
auto *parentptr = c.second(valueptr);
|
||||
if (parentptr != valueptr) {
|
||||
f(parentptr, self);
|
||||
}
|
||||
traverse_offset_bases(parentptr, parent_tinfo, self, f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef Py_GIL_DISABLED
|
||||
inline void enable_try_inc_ref(PyObject *obj) {
|
||||
// TODO: Replace with PyUnstable_Object_EnableTryIncRef when available.
|
||||
// See https://github.com/python/cpython/issues/128844
|
||||
if (_Py_IsImmortal(obj)) {
|
||||
return;
|
||||
}
|
||||
for (;;) {
|
||||
Py_ssize_t shared = _Py_atomic_load_ssize_relaxed(&obj->ob_ref_shared);
|
||||
if ((shared & _Py_REF_SHARED_FLAG_MASK) != 0) {
|
||||
// Nothing to do if it's in WEAKREFS, QUEUED, or MERGED states.
|
||||
return;
|
||||
}
|
||||
if (_Py_atomic_compare_exchange_ssize(
|
||||
&obj->ob_ref_shared, &shared, shared | _Py_REF_MAYBE_WEAKREF)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
inline bool register_instance_impl(void *ptr, instance *self) {
|
||||
#ifdef Py_GIL_DISABLED
|
||||
enable_try_inc_ref(reinterpret_cast<PyObject *>(self));
|
||||
#endif
|
||||
with_instance_map(ptr, [&](instance_map &instances) { instances.emplace(ptr, self); });
|
||||
return true; // unused, but gives the same signature as the deregister func
|
||||
}
|
||||
inline bool deregister_instance_impl(void *ptr, instance *self) {
|
||||
return with_instance_map(ptr, [&](instance_map &instances) {
|
||||
auto range = instances.equal_range(ptr);
|
||||
for (auto it = range.first; it != range.second; ++it) {
|
||||
if (self == it->second) {
|
||||
instances.erase(it);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
inline void register_instance(instance *self, void *valptr, const type_info *tinfo) {
|
||||
register_instance_impl(valptr, self);
|
||||
if (!tinfo->simple_ancestors) {
|
||||
traverse_offset_bases(valptr, tinfo, self, register_instance_impl);
|
||||
}
|
||||
}
|
||||
|
||||
inline bool deregister_instance(instance *self, void *valptr, const type_info *tinfo) {
|
||||
bool ret = deregister_instance_impl(valptr, self);
|
||||
if (!tinfo->simple_ancestors) {
|
||||
traverse_offset_bases(valptr, tinfo, self, deregister_instance_impl);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/// Instance creation function for all pybind11 types. It allocates the internal instance layout
|
||||
/// for holding C++ objects and holders. Allocation is done lazily (the first time the instance is
|
||||
/// cast to a reference or pointer), and initialization is done by an `__init__` function.
|
||||
inline PyObject *make_new_instance(PyTypeObject *type) {
|
||||
#if defined(PYPY_VERSION)
|
||||
// PyPy gets tp_basicsize wrong (issue 2482) under multiple inheritance when the first
|
||||
// inherited object is a plain Python type (i.e. not derived from an extension type). Fix it.
|
||||
ssize_t instance_size = static_cast<ssize_t>(sizeof(instance));
|
||||
if (type->tp_basicsize < instance_size) {
|
||||
type->tp_basicsize = instance_size;
|
||||
}
|
||||
#endif
|
||||
PyObject *self = type->tp_alloc(type, 0);
|
||||
auto *inst = reinterpret_cast<instance *>(self);
|
||||
// Allocate the value/holder internals:
|
||||
inst->allocate_layout();
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
/// Instance creation function for all pybind11 types. It only allocates space for the
|
||||
/// C++ object, but doesn't call the constructor -- an `__init__` function must do that.
|
||||
extern "C" inline PyObject *pybind11_object_new(PyTypeObject *type, PyObject *, PyObject *) {
|
||||
return make_new_instance(type);
|
||||
}
|
||||
|
||||
/// An `__init__` function constructs the C++ object. Users should provide at least one
|
||||
/// of these using `py::init` or directly with `.def(__init__, ...)`. Otherwise, the
|
||||
/// following default function will be used which simply throws an exception.
|
||||
extern "C" inline int pybind11_object_init(PyObject *self, PyObject *, PyObject *) {
|
||||
PyTypeObject *type = Py_TYPE(self);
|
||||
std::string msg = get_fully_qualified_tp_name(type) + ": No constructor defined!";
|
||||
set_error(PyExc_TypeError, msg.c_str());
|
||||
return -1;
|
||||
}
|
||||
|
||||
inline void add_patient(PyObject *nurse, PyObject *patient) {
|
||||
auto *instance = reinterpret_cast<detail::instance *>(nurse);
|
||||
instance->has_patients = true;
|
||||
Py_INCREF(patient);
|
||||
|
||||
with_internals([&](internals &internals) { internals.patients[nurse].push_back(patient); });
|
||||
}
|
||||
|
||||
inline void clear_patients(PyObject *self) {
|
||||
auto *instance = reinterpret_cast<detail::instance *>(self);
|
||||
std::vector<PyObject *> patients;
|
||||
|
||||
with_internals([&](internals &internals) {
|
||||
auto pos = internals.patients.find(self);
|
||||
|
||||
if (pos == internals.patients.end()) {
|
||||
pybind11_fail(
|
||||
"FATAL: Internal consistency check failed: Invalid clear_patients() call.");
|
||||
}
|
||||
|
||||
// Clearing the patients can cause more Python code to run, which
|
||||
// can invalidate the iterator. Extract the vector of patients
|
||||
// from the unordered_map first.
|
||||
patients = std::move(pos->second);
|
||||
internals.patients.erase(pos);
|
||||
});
|
||||
|
||||
instance->has_patients = false;
|
||||
for (PyObject *&patient : patients) {
|
||||
Py_CLEAR(patient);
|
||||
}
|
||||
}
|
||||
|
||||
/// Clears all internal data from the instance and removes it from registered instances in
|
||||
/// preparation for deallocation.
|
||||
inline void clear_instance(PyObject *self) {
|
||||
auto *instance = reinterpret_cast<detail::instance *>(self);
|
||||
|
||||
// Deallocate any values/holders, if present:
|
||||
for (auto &v_h : values_and_holders(instance)) {
|
||||
if (v_h) {
|
||||
|
||||
// We have to deregister before we call dealloc because, for virtual MI types, we still
|
||||
// need to be able to get the parent pointers.
|
||||
if (v_h.instance_registered()
|
||||
&& !deregister_instance(instance, v_h.value_ptr(), v_h.type)) {
|
||||
pybind11_fail(
|
||||
"pybind11_object_dealloc(): Tried to deallocate unregistered instance!");
|
||||
}
|
||||
|
||||
if (instance->owned || v_h.holder_constructed()) {
|
||||
v_h.type->dealloc(v_h);
|
||||
}
|
||||
} else if (v_h.holder_constructed()) {
|
||||
v_h.type->dealloc(v_h); // Disowned instance.
|
||||
}
|
||||
}
|
||||
// Deallocate the value/holder layout internals:
|
||||
instance->deallocate_layout();
|
||||
|
||||
if (instance->weakrefs) {
|
||||
PyObject_ClearWeakRefs(self);
|
||||
}
|
||||
|
||||
PyObject **dict_ptr = _PyObject_GetDictPtr(self);
|
||||
if (dict_ptr) {
|
||||
Py_CLEAR(*dict_ptr);
|
||||
}
|
||||
|
||||
if (instance->has_patients) {
|
||||
clear_patients(self);
|
||||
}
|
||||
}
|
||||
|
||||
/// Instance destructor function for all pybind11 types. It calls `type_info.dealloc`
|
||||
/// to destroy the C++ object itself, while the rest is Python bookkeeping.
|
||||
extern "C" inline void pybind11_object_dealloc(PyObject *self) {
|
||||
auto *type = Py_TYPE(self);
|
||||
|
||||
// If this is a GC tracked object, untrack it first
|
||||
// Note that the track call is implicitly done by the
|
||||
// default tp_alloc, which we never override.
|
||||
if (PyType_HasFeature(type, Py_TPFLAGS_HAVE_GC) != 0) {
|
||||
PyObject_GC_UnTrack(self);
|
||||
}
|
||||
|
||||
clear_instance(self);
|
||||
|
||||
type->tp_free(self);
|
||||
|
||||
// This was not needed before Python 3.8 (Python issue 35810)
|
||||
// https://github.com/pybind/pybind11/issues/1946
|
||||
Py_DECREF(type);
|
||||
}
|
||||
|
||||
PYBIND11_WARNING_PUSH
|
||||
PYBIND11_WARNING_DISABLE_GCC("-Wredundant-decls")
|
||||
|
||||
std::string error_string();
|
||||
|
||||
PYBIND11_WARNING_POP
|
||||
|
||||
/** Create the type which can be used as a common base for all classes. This is
|
||||
needed in order to satisfy Python's requirements for multiple inheritance.
|
||||
Return value: New reference. */
|
||||
inline PyObject *make_object_base_type(PyTypeObject *metaclass) {
|
||||
constexpr auto *name = "pybind11_object";
|
||||
auto name_obj = reinterpret_steal<object>(PYBIND11_FROM_STRING(name));
|
||||
|
||||
/* Danger zone: from now (and until PyType_Ready), make sure to
|
||||
issue no Python C API calls which could potentially invoke the
|
||||
garbage collector (the GC will call type_traverse(), which will in
|
||||
turn find the newly constructed type in an invalid state) */
|
||||
auto *heap_type = (PyHeapTypeObject *) metaclass->tp_alloc(metaclass, 0);
|
||||
if (!heap_type) {
|
||||
pybind11_fail("make_object_base_type(): error allocating type!");
|
||||
}
|
||||
|
||||
heap_type->ht_name = name_obj.inc_ref().ptr();
|
||||
#ifdef PYBIND11_BUILTIN_QUALNAME
|
||||
heap_type->ht_qualname = name_obj.inc_ref().ptr();
|
||||
#endif
|
||||
|
||||
auto *type = &heap_type->ht_type;
|
||||
type->tp_name = name;
|
||||
type->tp_base = type_incref(&PyBaseObject_Type);
|
||||
type->tp_basicsize = static_cast<ssize_t>(sizeof(instance));
|
||||
type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HEAPTYPE;
|
||||
|
||||
type->tp_new = pybind11_object_new;
|
||||
type->tp_init = pybind11_object_init;
|
||||
type->tp_dealloc = pybind11_object_dealloc;
|
||||
|
||||
/* Support weak references (needed for the keep_alive feature) */
|
||||
type->tp_weaklistoffset = offsetof(instance, weakrefs);
|
||||
|
||||
if (PyType_Ready(type) < 0) {
|
||||
pybind11_fail("PyType_Ready failed in make_object_base_type(): " + error_string());
|
||||
}
|
||||
|
||||
setattr((PyObject *) type, "__module__", str(PYBIND11_DUMMY_MODULE_NAME));
|
||||
PYBIND11_SET_OLDPY_QUALNAME(type, name_obj);
|
||||
|
||||
assert(!PyType_HasFeature(type, Py_TPFLAGS_HAVE_GC));
|
||||
return (PyObject *) heap_type;
|
||||
}
|
||||
|
||||
/// dynamic_attr: Allow the garbage collector to traverse the internal instance `__dict__`.
|
||||
extern "C" inline int pybind11_traverse(PyObject *self, visitproc visit, void *arg) {
|
||||
#if PY_VERSION_HEX >= 0x030D0000
|
||||
PyObject_VisitManagedDict(self, visit, arg);
|
||||
#else
|
||||
PyObject *&dict = *_PyObject_GetDictPtr(self);
|
||||
Py_VISIT(dict);
|
||||
#endif
|
||||
// https://docs.python.org/3/c-api/typeobj.html#c.PyTypeObject.tp_traverse
|
||||
#if PY_VERSION_HEX >= 0x03090000
|
||||
Py_VISIT(Py_TYPE(self));
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// dynamic_attr: Allow the GC to clear the dictionary.
|
||||
extern "C" inline int pybind11_clear(PyObject *self) {
|
||||
#if PY_VERSION_HEX >= 0x030D0000
|
||||
PyObject_ClearManagedDict(self);
|
||||
#else
|
||||
PyObject *&dict = *_PyObject_GetDictPtr(self);
|
||||
Py_CLEAR(dict);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// Give instances of this type a `__dict__` and opt into garbage collection.
|
||||
inline void enable_dynamic_attributes(PyHeapTypeObject *heap_type) {
|
||||
auto *type = &heap_type->ht_type;
|
||||
type->tp_flags |= Py_TPFLAGS_HAVE_GC;
|
||||
#ifdef PYBIND11_BACKWARD_COMPATIBILITY_TP_DICTOFFSET
|
||||
type->tp_dictoffset = type->tp_basicsize; // place dict at the end
|
||||
type->tp_basicsize += (ssize_t) sizeof(PyObject *); // and allocate enough space for it
|
||||
#else
|
||||
type->tp_flags |= Py_TPFLAGS_MANAGED_DICT;
|
||||
#endif
|
||||
type->tp_traverse = pybind11_traverse;
|
||||
type->tp_clear = pybind11_clear;
|
||||
|
||||
static PyGetSetDef getset[]
|
||||
= {{"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict, nullptr, nullptr},
|
||||
{nullptr, nullptr, nullptr, nullptr, nullptr}};
|
||||
type->tp_getset = getset;
|
||||
}
|
||||
|
||||
/// buffer_protocol: Fill in the view as specified by flags.
|
||||
extern "C" inline int pybind11_getbuffer(PyObject *obj, Py_buffer *view, int flags) {
|
||||
// Look for a `get_buffer` implementation in this type's info or any bases (following MRO).
|
||||
type_info *tinfo = nullptr;
|
||||
for (auto type : reinterpret_borrow<tuple>(Py_TYPE(obj)->tp_mro)) {
|
||||
tinfo = get_type_info((PyTypeObject *) type.ptr());
|
||||
if (tinfo && tinfo->get_buffer) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (view == nullptr || !tinfo || !tinfo->get_buffer) {
|
||||
if (view) {
|
||||
view->obj = nullptr;
|
||||
}
|
||||
set_error(PyExc_BufferError, "pybind11_getbuffer(): Internal error");
|
||||
return -1;
|
||||
}
|
||||
std::memset(view, 0, sizeof(Py_buffer));
|
||||
std::unique_ptr<buffer_info> info = nullptr;
|
||||
try {
|
||||
info.reset(tinfo->get_buffer(obj, tinfo->get_buffer_data));
|
||||
} catch (...) {
|
||||
try_translate_exceptions();
|
||||
raise_from(PyExc_BufferError, "Error getting buffer");
|
||||
return -1;
|
||||
}
|
||||
if (info == nullptr) {
|
||||
pybind11_fail("FATAL UNEXPECTED SITUATION: tinfo->get_buffer() returned nullptr.");
|
||||
}
|
||||
|
||||
if ((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE && info->readonly) {
|
||||
// view->obj = nullptr; // Was just memset to 0, so not necessary
|
||||
set_error(PyExc_BufferError, "Writable buffer requested for readonly storage");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Fill in all the information, and then downgrade as requested by the caller, or raise an
|
||||
// error if that's not possible.
|
||||
view->itemsize = info->itemsize;
|
||||
view->len = view->itemsize;
|
||||
for (auto s : info->shape) {
|
||||
view->len *= s;
|
||||
}
|
||||
view->ndim = static_cast<int>(info->ndim);
|
||||
view->shape = info->shape.data();
|
||||
view->strides = info->strides.data();
|
||||
view->readonly = static_cast<int>(info->readonly);
|
||||
if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
|
||||
view->format = const_cast<char *>(info->format.c_str());
|
||||
}
|
||||
|
||||
// Note, all contiguity flags imply PyBUF_STRIDES and lower.
|
||||
if ((flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS) {
|
||||
if (PyBuffer_IsContiguous(view, 'C') == 0) {
|
||||
std::memset(view, 0, sizeof(Py_buffer));
|
||||
set_error(PyExc_BufferError,
|
||||
"C-contiguous buffer requested for discontiguous storage");
|
||||
return -1;
|
||||
}
|
||||
} else if ((flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS) {
|
||||
if (PyBuffer_IsContiguous(view, 'F') == 0) {
|
||||
std::memset(view, 0, sizeof(Py_buffer));
|
||||
set_error(PyExc_BufferError,
|
||||
"Fortran-contiguous buffer requested for discontiguous storage");
|
||||
return -1;
|
||||
}
|
||||
} else if ((flags & PyBUF_ANY_CONTIGUOUS) == PyBUF_ANY_CONTIGUOUS) {
|
||||
if (PyBuffer_IsContiguous(view, 'A') == 0) {
|
||||
std::memset(view, 0, sizeof(Py_buffer));
|
||||
set_error(PyExc_BufferError, "Contiguous buffer requested for discontiguous storage");
|
||||
return -1;
|
||||
}
|
||||
|
||||
} else if ((flags & PyBUF_STRIDES) != PyBUF_STRIDES) {
|
||||
// If no strides are requested, the buffer must be C-contiguous.
|
||||
// https://docs.python.org/3/c-api/buffer.html#contiguity-requests
|
||||
if (PyBuffer_IsContiguous(view, 'C') == 0) {
|
||||
std::memset(view, 0, sizeof(Py_buffer));
|
||||
set_error(PyExc_BufferError,
|
||||
"C-contiguous buffer requested for discontiguous storage");
|
||||
return -1;
|
||||
}
|
||||
|
||||
view->strides = nullptr;
|
||||
|
||||
// Since this is a contiguous buffer, it can also pretend to be 1D.
|
||||
if ((flags & PyBUF_ND) != PyBUF_ND) {
|
||||
view->shape = nullptr;
|
||||
view->ndim = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Set these after all checks so they don't leak out into the caller, and can be automatically
|
||||
// cleaned up on error.
|
||||
view->buf = info->ptr;
|
||||
view->internal = info.release();
|
||||
view->obj = obj;
|
||||
Py_INCREF(view->obj);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// buffer_protocol: Release the resources of the buffer.
|
||||
extern "C" inline void pybind11_releasebuffer(PyObject *, Py_buffer *view) {
|
||||
delete (buffer_info *) view->internal;
|
||||
}
|
||||
|
||||
/// Give this type a buffer interface.
|
||||
inline void enable_buffer_protocol(PyHeapTypeObject *heap_type) {
|
||||
heap_type->ht_type.tp_as_buffer = &heap_type->as_buffer;
|
||||
|
||||
heap_type->as_buffer.bf_getbuffer = pybind11_getbuffer;
|
||||
heap_type->as_buffer.bf_releasebuffer = pybind11_releasebuffer;
|
||||
}
|
||||
|
||||
/** Create a brand new Python type according to the `type_record` specification.
|
||||
Return value: New reference. */
|
||||
inline PyObject *make_new_python_type(const type_record &rec) {
|
||||
auto name = reinterpret_steal<object>(PYBIND11_FROM_STRING(rec.name));
|
||||
|
||||
auto qualname = name;
|
||||
if (rec.scope && !PyModule_Check(rec.scope.ptr()) && hasattr(rec.scope, "__qualname__")) {
|
||||
qualname = reinterpret_steal<object>(
|
||||
PyUnicode_FromFormat("%U.%U", rec.scope.attr("__qualname__").ptr(), name.ptr()));
|
||||
}
|
||||
|
||||
object module_ = get_module_name_if_available(rec.scope);
|
||||
const auto *full_name = c_str(
|
||||
#if !defined(PYPY_VERSION)
|
||||
module_ ? str(module_).cast<std::string>() + "." + rec.name :
|
||||
#endif
|
||||
rec.name);
|
||||
|
||||
char *tp_doc = nullptr;
|
||||
if (rec.doc && options::show_user_defined_docstrings()) {
|
||||
/* Allocate memory for docstring (Python will free this later on) */
|
||||
size_t size = std::strlen(rec.doc) + 1;
|
||||
#if PY_VERSION_HEX >= 0x030D0000
|
||||
tp_doc = (char *) PyMem_MALLOC(size);
|
||||
#else
|
||||
tp_doc = (char *) PyObject_MALLOC(size);
|
||||
#endif
|
||||
std::memcpy((void *) tp_doc, rec.doc, size);
|
||||
}
|
||||
|
||||
auto &internals = get_internals();
|
||||
auto bases = tuple(rec.bases);
|
||||
auto *base = (bases.empty()) ? internals.instance_base : bases[0].ptr();
|
||||
|
||||
/* Danger zone: from now (and until PyType_Ready), make sure to
|
||||
issue no Python C API calls which could potentially invoke the
|
||||
garbage collector (the GC will call type_traverse(), which will in
|
||||
turn find the newly constructed type in an invalid state) */
|
||||
auto *metaclass
|
||||
= rec.metaclass.ptr() ? (PyTypeObject *) rec.metaclass.ptr() : internals.default_metaclass;
|
||||
|
||||
auto *heap_type = (PyHeapTypeObject *) metaclass->tp_alloc(metaclass, 0);
|
||||
if (!heap_type) {
|
||||
pybind11_fail(std::string(rec.name) + ": Unable to create type object!");
|
||||
}
|
||||
|
||||
heap_type->ht_name = name.release().ptr();
|
||||
#ifdef PYBIND11_BUILTIN_QUALNAME
|
||||
heap_type->ht_qualname = qualname.inc_ref().ptr();
|
||||
#endif
|
||||
|
||||
auto *type = &heap_type->ht_type;
|
||||
type->tp_name = full_name;
|
||||
type->tp_doc = tp_doc;
|
||||
type->tp_base = type_incref((PyTypeObject *) base);
|
||||
type->tp_basicsize = static_cast<ssize_t>(sizeof(instance));
|
||||
if (!bases.empty()) {
|
||||
type->tp_bases = bases.release().ptr();
|
||||
}
|
||||
|
||||
/* Don't inherit base __init__ */
|
||||
type->tp_init = pybind11_object_init;
|
||||
|
||||
/* Supported protocols */
|
||||
type->tp_as_number = &heap_type->as_number;
|
||||
type->tp_as_sequence = &heap_type->as_sequence;
|
||||
type->tp_as_mapping = &heap_type->as_mapping;
|
||||
type->tp_as_async = &heap_type->as_async;
|
||||
|
||||
/* Flags */
|
||||
type->tp_flags |= Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE;
|
||||
if (!rec.is_final) {
|
||||
type->tp_flags |= Py_TPFLAGS_BASETYPE;
|
||||
}
|
||||
|
||||
if (rec.dynamic_attr) {
|
||||
enable_dynamic_attributes(heap_type);
|
||||
}
|
||||
|
||||
if (rec.buffer_protocol) {
|
||||
enable_buffer_protocol(heap_type);
|
||||
}
|
||||
|
||||
if (rec.custom_type_setup_callback) {
|
||||
rec.custom_type_setup_callback(heap_type);
|
||||
}
|
||||
|
||||
if (PyType_Ready(type) < 0) {
|
||||
pybind11_fail(std::string(rec.name) + ": PyType_Ready failed: " + error_string());
|
||||
}
|
||||
|
||||
assert(!rec.dynamic_attr || PyType_HasFeature(type, Py_TPFLAGS_HAVE_GC));
|
||||
|
||||
/* Register type with the parent scope */
|
||||
if (rec.scope) {
|
||||
setattr(rec.scope, rec.name, (PyObject *) type);
|
||||
} else {
|
||||
Py_INCREF(type); // Keep it alive forever (reference leak)
|
||||
}
|
||||
|
||||
if (module_) { // Needed by pydoc
|
||||
setattr((PyObject *) type, "__module__", module_);
|
||||
}
|
||||
|
||||
PYBIND11_SET_OLDPY_QUALNAME(type, qualname);
|
||||
|
||||
return (PyObject *) type;
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
1348
deps_src/pybind11/include/pybind11/detail/common.h
Normal file
1348
deps_src/pybind11/include/pybind11/detail/common.h
Normal file
File diff suppressed because it is too large
Load Diff
75
deps_src/pybind11/include/pybind11/detail/cpp_conduit.h
Normal file
75
deps_src/pybind11/include/pybind11/detail/cpp_conduit.h
Normal file
@@ -0,0 +1,75 @@
|
||||
// Copyright (c) 2024 The pybind Community.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <pybind11/pytypes.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "internals.h"
|
||||
|
||||
#include <typeinfo>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
// Forward declaration needed here: Refactoring opportunity.
|
||||
extern "C" inline PyObject *pybind11_object_new(PyTypeObject *type, PyObject *, PyObject *);
|
||||
|
||||
inline bool type_is_managed_by_our_internals(PyTypeObject *type_obj) {
|
||||
#if defined(PYPY_VERSION)
|
||||
auto &internals = get_internals();
|
||||
return bool(internals.registered_types_py.find(type_obj)
|
||||
!= internals.registered_types_py.end());
|
||||
#else
|
||||
return bool(type_obj->tp_new == pybind11_object_new);
|
||||
#endif
|
||||
}
|
||||
|
||||
inline bool is_instance_method_of_type(PyTypeObject *type_obj, PyObject *attr_name) {
|
||||
PyObject *descr = _PyType_Lookup(type_obj, attr_name);
|
||||
return bool((descr != nullptr) && PyInstanceMethod_Check(descr));
|
||||
}
|
||||
|
||||
inline object try_get_cpp_conduit_method(PyObject *obj) {
|
||||
if (PyType_Check(obj)) {
|
||||
return object();
|
||||
}
|
||||
PyTypeObject *type_obj = Py_TYPE(obj);
|
||||
str attr_name("_pybind11_conduit_v1_");
|
||||
bool assumed_to_be_callable = false;
|
||||
if (type_is_managed_by_our_internals(type_obj)) {
|
||||
if (!is_instance_method_of_type(type_obj, attr_name.ptr())) {
|
||||
return object();
|
||||
}
|
||||
assumed_to_be_callable = true;
|
||||
}
|
||||
PyObject *method = PyObject_GetAttr(obj, attr_name.ptr());
|
||||
if (method == nullptr) {
|
||||
PyErr_Clear();
|
||||
return object();
|
||||
}
|
||||
if (!assumed_to_be_callable && PyCallable_Check(method) == 0) {
|
||||
Py_DECREF(method);
|
||||
return object();
|
||||
}
|
||||
return reinterpret_steal<object>(method);
|
||||
}
|
||||
|
||||
inline void *try_raw_pointer_ephemeral_from_cpp_conduit(handle src,
|
||||
const std::type_info *cpp_type_info) {
|
||||
object method = try_get_cpp_conduit_method(src.ptr());
|
||||
if (method) {
|
||||
capsule cpp_type_info_capsule(const_cast<void *>(static_cast<const void *>(cpp_type_info)),
|
||||
typeid(std::type_info).name());
|
||||
object cpp_conduit = method(bytes(PYBIND11_PLATFORM_ABI_ID),
|
||||
cpp_type_info_capsule,
|
||||
bytes("raw_pointer_ephemeral"));
|
||||
if (isinstance<capsule>(cpp_conduit)) {
|
||||
return reinterpret_borrow<capsule>(cpp_conduit).get_pointer();
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
226
deps_src/pybind11/include/pybind11/detail/descr.h
Normal file
226
deps_src/pybind11/include/pybind11/detail/descr.h
Normal file
@@ -0,0 +1,226 @@
|
||||
/*
|
||||
pybind11/detail/descr.h: Helper type for concatenating type signatures at compile time
|
||||
|
||||
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "common.h"
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
#if !defined(_MSC_VER)
|
||||
# define PYBIND11_DESCR_CONSTEXPR static constexpr
|
||||
#else
|
||||
# define PYBIND11_DESCR_CONSTEXPR const
|
||||
#endif
|
||||
|
||||
/* Concatenate type signatures at compile time */
|
||||
template <size_t N, typename... Ts>
|
||||
struct descr {
|
||||
char text[N + 1]{'\0'};
|
||||
|
||||
constexpr descr() = default;
|
||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
||||
constexpr descr(char const (&s)[N + 1]) : descr(s, make_index_sequence<N>()) {}
|
||||
|
||||
template <size_t... Is>
|
||||
constexpr descr(char const (&s)[N + 1], index_sequence<Is...>) : text{s[Is]..., '\0'} {}
|
||||
|
||||
template <typename... Chars>
|
||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
||||
constexpr descr(char c, Chars... cs) : text{c, static_cast<char>(cs)..., '\0'} {}
|
||||
|
||||
static constexpr std::array<const std::type_info *, sizeof...(Ts) + 1> types() {
|
||||
return {{&typeid(Ts)..., nullptr}};
|
||||
}
|
||||
};
|
||||
|
||||
template <size_t N1, size_t N2, typename... Ts1, typename... Ts2, size_t... Is1, size_t... Is2>
|
||||
constexpr descr<N1 + N2, Ts1..., Ts2...> plus_impl(const descr<N1, Ts1...> &a,
|
||||
const descr<N2, Ts2...> &b,
|
||||
index_sequence<Is1...>,
|
||||
index_sequence<Is2...>) {
|
||||
PYBIND11_WORKAROUND_INCORRECT_MSVC_C4100(b);
|
||||
return {a.text[Is1]..., b.text[Is2]...};
|
||||
}
|
||||
|
||||
template <size_t N1, size_t N2, typename... Ts1, typename... Ts2>
|
||||
constexpr descr<N1 + N2, Ts1..., Ts2...> operator+(const descr<N1, Ts1...> &a,
|
||||
const descr<N2, Ts2...> &b) {
|
||||
return plus_impl(a, b, make_index_sequence<N1>(), make_index_sequence<N2>());
|
||||
}
|
||||
|
||||
template <size_t N>
|
||||
constexpr descr<N - 1> const_name(char const (&text)[N]) {
|
||||
return descr<N - 1>(text);
|
||||
}
|
||||
constexpr descr<0> const_name(char const (&)[1]) { return {}; }
|
||||
|
||||
template <size_t Rem, size_t... Digits>
|
||||
struct int_to_str : int_to_str<Rem / 10, Rem % 10, Digits...> {};
|
||||
template <size_t... Digits>
|
||||
struct int_to_str<0, Digits...> {
|
||||
// WARNING: This only works with C++17 or higher.
|
||||
static constexpr auto digits = descr<sizeof...(Digits)>(('0' + Digits)...);
|
||||
};
|
||||
|
||||
// Ternary description (like std::conditional)
|
||||
template <bool B, size_t N1, size_t N2>
|
||||
constexpr enable_if_t<B, descr<N1 - 1>> const_name(char const (&text1)[N1], char const (&)[N2]) {
|
||||
return const_name(text1);
|
||||
}
|
||||
template <bool B, size_t N1, size_t N2>
|
||||
constexpr enable_if_t<!B, descr<N2 - 1>> const_name(char const (&)[N1], char const (&text2)[N2]) {
|
||||
return const_name(text2);
|
||||
}
|
||||
|
||||
template <bool B, typename T1, typename T2>
|
||||
constexpr enable_if_t<B, T1> const_name(const T1 &d, const T2 &) {
|
||||
return d;
|
||||
}
|
||||
template <bool B, typename T1, typename T2>
|
||||
constexpr enable_if_t<!B, T2> const_name(const T1 &, const T2 &d) {
|
||||
return d;
|
||||
}
|
||||
|
||||
template <size_t Size>
|
||||
auto constexpr const_name() -> remove_cv_t<decltype(int_to_str<Size / 10, Size % 10>::digits)> {
|
||||
return int_to_str<Size / 10, Size % 10>::digits;
|
||||
}
|
||||
|
||||
template <typename Type>
|
||||
constexpr descr<1, Type> const_name() {
|
||||
return {'%'};
|
||||
}
|
||||
|
||||
// Use a different name based on whether the parameter is used as input or output
|
||||
template <size_t N1, size_t N2>
|
||||
constexpr descr<N1 + N2 + 1> io_name(char const (&text1)[N1], char const (&text2)[N2]) {
|
||||
return const_name("@") + const_name(text1) + const_name("@") + const_name(text2)
|
||||
+ const_name("@");
|
||||
}
|
||||
|
||||
// Ternary description for io_name (like the numeric type_caster)
|
||||
template <bool B, size_t N1, size_t N2, size_t N3, size_t N4>
|
||||
constexpr enable_if_t<B, descr<N1 + N2 + 1>>
|
||||
io_name(char const (&text1)[N1], char const (&text2)[N2], char const (&)[N3], char const (&)[N4]) {
|
||||
return io_name(text1, text2);
|
||||
}
|
||||
|
||||
template <bool B, size_t N1, size_t N2, size_t N3, size_t N4>
|
||||
constexpr enable_if_t<!B, descr<N3 + N4 + 1>>
|
||||
io_name(char const (&)[N1], char const (&)[N2], char const (&text3)[N3], char const (&text4)[N4]) {
|
||||
return io_name(text3, text4);
|
||||
}
|
||||
|
||||
// If "_" is defined as a macro, py::detail::_ cannot be provided.
|
||||
// It is therefore best to use py::detail::const_name universally.
|
||||
// This block is for backward compatibility only.
|
||||
// (The const_name code is repeated to avoid introducing a "_" #define ourselves.)
|
||||
#ifndef _
|
||||
# define PYBIND11_DETAIL_UNDERSCORE_BACKWARD_COMPATIBILITY
|
||||
template <size_t N>
|
||||
constexpr descr<N - 1> _(char const (&text)[N]) {
|
||||
return const_name<N>(text);
|
||||
}
|
||||
template <bool B, size_t N1, size_t N2>
|
||||
constexpr enable_if_t<B, descr<N1 - 1>> _(char const (&text1)[N1], char const (&text2)[N2]) {
|
||||
return const_name<B, N1, N2>(text1, text2);
|
||||
}
|
||||
template <bool B, size_t N1, size_t N2>
|
||||
constexpr enable_if_t<!B, descr<N2 - 1>> _(char const (&text1)[N1], char const (&text2)[N2]) {
|
||||
return const_name<B, N1, N2>(text1, text2);
|
||||
}
|
||||
template <bool B, typename T1, typename T2>
|
||||
constexpr enable_if_t<B, T1> _(const T1 &d1, const T2 &d2) {
|
||||
return const_name<B, T1, T2>(d1, d2);
|
||||
}
|
||||
template <bool B, typename T1, typename T2>
|
||||
constexpr enable_if_t<!B, T2> _(const T1 &d1, const T2 &d2) {
|
||||
return const_name<B, T1, T2>(d1, d2);
|
||||
}
|
||||
|
||||
template <size_t Size>
|
||||
auto constexpr _() -> remove_cv_t<decltype(int_to_str<Size / 10, Size % 10>::digits)> {
|
||||
return const_name<Size>();
|
||||
}
|
||||
template <typename Type>
|
||||
constexpr descr<1, Type> _() {
|
||||
return const_name<Type>();
|
||||
}
|
||||
#endif // #ifndef _
|
||||
|
||||
constexpr descr<0> concat() { return {}; }
|
||||
constexpr descr<0> union_concat() { return {}; }
|
||||
|
||||
template <size_t N, typename... Ts>
|
||||
constexpr descr<N, Ts...> concat(const descr<N, Ts...> &descr) {
|
||||
return descr;
|
||||
}
|
||||
|
||||
template <size_t N, typename... Ts>
|
||||
constexpr descr<N, Ts...> union_concat(const descr<N, Ts...> &descr) {
|
||||
return descr;
|
||||
}
|
||||
|
||||
template <size_t N1, size_t N2, typename... Ts1, typename... Ts2>
|
||||
constexpr descr<N1 + N2 + 3, Ts1..., Ts2...> operator|(const descr<N1, Ts1...> &a,
|
||||
const descr<N2, Ts2...> &b) {
|
||||
return a + const_name(" | ") + b;
|
||||
}
|
||||
|
||||
#ifdef __cpp_fold_expressions
|
||||
template <size_t N1, size_t N2, typename... Ts1, typename... Ts2>
|
||||
constexpr descr<N1 + N2 + 2, Ts1..., Ts2...> operator,(const descr<N1, Ts1...> &a,
|
||||
const descr<N2, Ts2...> &b) {
|
||||
return a + const_name(", ") + b;
|
||||
}
|
||||
|
||||
template <size_t N, typename... Ts, typename... Args>
|
||||
constexpr auto concat(const descr<N, Ts...> &d, const Args &...args) {
|
||||
return (d, ..., args);
|
||||
}
|
||||
|
||||
template <size_t N, typename... Ts, typename... Args>
|
||||
constexpr auto union_concat(const descr<N, Ts...> &d, const Args &...args) {
|
||||
return (d | ... | args);
|
||||
}
|
||||
|
||||
#else
|
||||
template <size_t N, typename... Ts, typename... Args>
|
||||
constexpr auto concat(const descr<N, Ts...> &d, const Args &...args)
|
||||
-> decltype(std::declval<descr<N + 2, Ts...>>() + concat(args...)) {
|
||||
return d + const_name(", ") + concat(args...);
|
||||
}
|
||||
|
||||
template <size_t N, typename... Ts, typename... Args>
|
||||
constexpr auto union_concat(const descr<N, Ts...> &d, const Args &...args)
|
||||
-> decltype(std::declval<descr<N + 3, Ts...>>() + union_concat(args...)) {
|
||||
return d + const_name(" | ") + union_concat(args...);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
template <size_t N, typename... Ts>
|
||||
constexpr descr<N + 2, Ts...> type_descr(const descr<N, Ts...> &descr) {
|
||||
return const_name("{") + descr + const_name("}");
|
||||
}
|
||||
|
||||
template <size_t N, typename... Ts>
|
||||
constexpr descr<N + 4, Ts...> arg_descr(const descr<N, Ts...> &descr) {
|
||||
return const_name("@^") + descr + const_name("@!");
|
||||
}
|
||||
|
||||
template <size_t N, typename... Ts>
|
||||
constexpr descr<N + 4, Ts...> return_descr(const descr<N, Ts...> &descr) {
|
||||
return const_name("@$") + descr + const_name("@!");
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
@@ -0,0 +1,39 @@
|
||||
// Copyright (c) 2021 The Pybind Development Team.
|
||||
// All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
template <typename To, typename From, typename SFINAE = void>
|
||||
struct dynamic_raw_ptr_cast_is_possible : std::false_type {};
|
||||
|
||||
template <typename To, typename From>
|
||||
struct dynamic_raw_ptr_cast_is_possible<
|
||||
To,
|
||||
From,
|
||||
detail::enable_if_t<!std::is_same<To, void>::value && std::is_polymorphic<From>::value>>
|
||||
: std::true_type {};
|
||||
|
||||
template <typename To,
|
||||
typename From,
|
||||
detail::enable_if_t<!dynamic_raw_ptr_cast_is_possible<To, From>::value, int> = 0>
|
||||
To *dynamic_raw_ptr_cast_if_possible(From * /*ptr*/) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template <typename To,
|
||||
typename From,
|
||||
detail::enable_if_t<dynamic_raw_ptr_cast_is_possible<To, From>::value, int> = 0>
|
||||
To *dynamic_raw_ptr_cast_if_possible(From *ptr) {
|
||||
return dynamic_cast<To *>(ptr);
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
pybind11/detail/exception_translation.h: means to translate C++ exceptions to Python exceptions
|
||||
|
||||
Copyright (c) 2024 The Pybind Development Team.
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "common.h"
|
||||
#include "internals.h"
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
// Apply all the extensions translators from a list
|
||||
// Return true if one of the translators completed without raising an exception
|
||||
// itself. Return of false indicates that if there are other translators
|
||||
// available, they should be tried.
|
||||
inline bool apply_exception_translators(std::forward_list<ExceptionTranslator> &translators) {
|
||||
auto last_exception = std::current_exception();
|
||||
|
||||
for (auto &translator : translators) {
|
||||
try {
|
||||
translator(last_exception);
|
||||
return true;
|
||||
} catch (...) {
|
||||
last_exception = std::current_exception();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
inline void try_translate_exceptions() {
|
||||
/* When an exception is caught, give each registered exception
|
||||
translator a chance to translate it to a Python exception. First
|
||||
all module-local translators will be tried in reverse order of
|
||||
registration. If none of the module-locale translators handle
|
||||
the exception (or there are no module-locale translators) then
|
||||
the global translators will be tried, also in reverse order of
|
||||
registration.
|
||||
|
||||
A translator may choose to do one of the following:
|
||||
|
||||
- catch the exception and call py::set_error()
|
||||
to set a standard (or custom) Python exception, or
|
||||
- do nothing and let the exception fall through to the next translator, or
|
||||
- delegate translation to the next translator by throwing a new type of exception.
|
||||
*/
|
||||
|
||||
bool handled = with_exception_translators(
|
||||
[&](std::forward_list<ExceptionTranslator> &exception_translators,
|
||||
std::forward_list<ExceptionTranslator> &local_exception_translators) {
|
||||
if (detail::apply_exception_translators(local_exception_translators)) {
|
||||
return true;
|
||||
}
|
||||
if (detail::apply_exception_translators(exception_translators)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
if (!handled) {
|
||||
set_error(PyExc_SystemError, "Exception escaped from default exception translator!");
|
||||
}
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
@@ -0,0 +1,191 @@
|
||||
// Copyright (c) 2024-2025 The Pybind Development Team.
|
||||
// All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
// For background see the description of PR google/pybind11clif#30099.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <pybind11/attr.h>
|
||||
#include <pybind11/conduit/pybind11_platform_abi_id.h>
|
||||
#include <pybind11/pytypes.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <cstring>
|
||||
#include <utility>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
struct function_record_PyObject {
|
||||
PyObject_HEAD
|
||||
function_record *cpp_func_rec;
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(function_record_PyTypeObject_methods)
|
||||
|
||||
PyObject *tp_new_impl(PyTypeObject *type, PyObject *args, PyObject *kwds);
|
||||
PyObject *tp_alloc_impl(PyTypeObject *type, Py_ssize_t nitems);
|
||||
int tp_init_impl(PyObject *self, PyObject *args, PyObject *kwds);
|
||||
void tp_dealloc_impl(PyObject *self);
|
||||
void tp_free_impl(void *self);
|
||||
|
||||
static PyObject *reduce_ex_impl(PyObject *self, PyObject *, PyObject *);
|
||||
|
||||
static PyMethodDef tp_methods_impl[]
|
||||
= {{"__reduce_ex__",
|
||||
// reduce_ex_impl is a PyCFunctionWithKeywords, but PyMethodDef
|
||||
// requires a PyCFunction. The cast through void* is safe and
|
||||
// idiomatic with METH_KEYWORDS, and it successfully sidesteps
|
||||
// unhelpful compiler warnings.
|
||||
// NOLINTNEXTLINE(bugprone-casting-through-void)
|
||||
reinterpret_cast<PyCFunction>(reinterpret_cast<void *>(reduce_ex_impl)),
|
||||
METH_VARARGS | METH_KEYWORDS,
|
||||
nullptr},
|
||||
{nullptr, nullptr, 0, nullptr}};
|
||||
|
||||
// Python 3.12+ emits a DeprecationWarning for heap types whose tp_name does
|
||||
// not contain a dot ('.') and that lack a __module__ attribute. For pybind11's
|
||||
// internal function_record type, we do not have an actual module object to
|
||||
// attach, so we cannot use PyType_FromModuleAndSpec (introduced in Python 3.9)
|
||||
// to set __module__ automatically.
|
||||
//
|
||||
// As a workaround, we define a "qualified" type name that includes a dummy
|
||||
// module name (PYBIND11_DUMMY_MODULE_NAME). This is non‑idiomatic but avoids
|
||||
// the deprecation warning, and results in reprs like
|
||||
//
|
||||
// <class 'pybind11_builtins.pybind11_detail_function_record_...'>
|
||||
//
|
||||
// even though no real pybind11_builtins module exists. If pybind11 gains an
|
||||
// actual module object in the future, this code should switch to
|
||||
// PyType_FromModuleAndSpec for Python 3.9+ and drop the dummy module
|
||||
// workaround.
|
||||
//
|
||||
// Note that this name is versioned.
|
||||
#define PYBIND11_DETAIL_FUNCTION_RECORD_TP_PLAINNAME \
|
||||
"pybind11_detail_function_record_" PYBIND11_DETAIL_FUNCTION_RECORD_ABI_ID \
|
||||
"_" PYBIND11_PLATFORM_ABI_ID
|
||||
constexpr char tp_plainname_impl[] = PYBIND11_DETAIL_FUNCTION_RECORD_TP_PLAINNAME;
|
||||
constexpr char tp_qualname_impl[]
|
||||
= PYBIND11_DUMMY_MODULE_NAME "." PYBIND11_DETAIL_FUNCTION_RECORD_TP_PLAINNAME;
|
||||
|
||||
PYBIND11_NAMESPACE_END(function_record_PyTypeObject_methods)
|
||||
|
||||
static PyType_Slot function_record_PyType_Slots[] = {
|
||||
{Py_tp_dealloc,
|
||||
reinterpret_cast<void *>(function_record_PyTypeObject_methods::tp_dealloc_impl)},
|
||||
{Py_tp_methods,
|
||||
reinterpret_cast<void *>(function_record_PyTypeObject_methods::tp_methods_impl)},
|
||||
{Py_tp_init, reinterpret_cast<void *>(function_record_PyTypeObject_methods::tp_init_impl)},
|
||||
{Py_tp_alloc, reinterpret_cast<void *>(function_record_PyTypeObject_methods::tp_alloc_impl)},
|
||||
{Py_tp_new, reinterpret_cast<void *>(function_record_PyTypeObject_methods::tp_new_impl)},
|
||||
{Py_tp_free, reinterpret_cast<void *>(function_record_PyTypeObject_methods::tp_free_impl)},
|
||||
{0, nullptr}};
|
||||
|
||||
static PyType_Spec function_record_PyType_Spec
|
||||
= {function_record_PyTypeObject_methods::tp_qualname_impl,
|
||||
sizeof(function_record_PyObject),
|
||||
0,
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE,
|
||||
function_record_PyType_Slots};
|
||||
|
||||
inline PyTypeObject *get_function_record_PyTypeObject() {
|
||||
PyTypeObject *&py_type_obj = detail::get_local_internals().function_record_py_type;
|
||||
if (!py_type_obj) {
|
||||
PyObject *py_obj = PyType_FromSpec(&function_record_PyType_Spec);
|
||||
if (py_obj == nullptr) {
|
||||
throw error_already_set();
|
||||
}
|
||||
py_type_obj = reinterpret_cast<PyTypeObject *>(py_obj);
|
||||
}
|
||||
return py_type_obj;
|
||||
}
|
||||
|
||||
inline bool is_function_record_PyObject(PyObject *obj) {
|
||||
if (PyType_Check(obj) != 0) {
|
||||
return false;
|
||||
}
|
||||
PyTypeObject *obj_type = Py_TYPE(obj);
|
||||
|
||||
PyTypeObject *frtype = get_function_record_PyTypeObject();
|
||||
|
||||
// Fast path (pointer comparison).
|
||||
if (obj_type == frtype) {
|
||||
return true;
|
||||
}
|
||||
// This works across extension modules. Note that tp_name is versioned.
|
||||
if (strcmp(obj_type->tp_name, function_record_PyTypeObject_methods::tp_qualname_impl) == 0
|
||||
|| strcmp(obj_type->tp_name, function_record_PyTypeObject_methods::tp_plainname_impl)
|
||||
== 0) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
inline function_record *function_record_ptr_from_PyObject(PyObject *obj) {
|
||||
if (is_function_record_PyObject(obj)) {
|
||||
return ((detail::function_record_PyObject *) obj)->cpp_func_rec;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
inline object function_record_PyObject_New() {
|
||||
auto *py_func_rec = PyObject_New(function_record_PyObject, get_function_record_PyTypeObject());
|
||||
if (py_func_rec == nullptr) {
|
||||
throw error_already_set();
|
||||
}
|
||||
py_func_rec->cpp_func_rec = nullptr; // For clarity/purity. Redundant in practice.
|
||||
return reinterpret_steal<object>((PyObject *) py_func_rec);
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(function_record_PyTypeObject_methods)
|
||||
|
||||
// Guard against accidents & oversights, in particular when porting to future Python versions.
|
||||
inline PyObject *tp_new_impl(PyTypeObject *, PyObject *, PyObject *) {
|
||||
pybind11_fail("UNEXPECTED CALL OF function_record_PyTypeObject_methods::tp_new_impl");
|
||||
// return nullptr; // Unreachable.
|
||||
}
|
||||
|
||||
inline PyObject *tp_alloc_impl(PyTypeObject *, Py_ssize_t) {
|
||||
pybind11_fail("UNEXPECTED CALL OF function_record_PyTypeObject_methods::tp_alloc_impl");
|
||||
// return nullptr; // Unreachable.
|
||||
}
|
||||
|
||||
inline int tp_init_impl(PyObject *, PyObject *, PyObject *) {
|
||||
pybind11_fail("UNEXPECTED CALL OF function_record_PyTypeObject_methods::tp_init_impl");
|
||||
// return -1; // Unreachable.
|
||||
}
|
||||
|
||||
inline void tp_free_impl(void *) {
|
||||
pybind11_fail("UNEXPECTED CALL OF function_record_PyTypeObject_methods::tp_free_impl");
|
||||
}
|
||||
|
||||
inline PyObject *reduce_ex_impl(PyObject *self, PyObject *, PyObject *) {
|
||||
// Deliberately ignoring the arguments for simplicity (expected is `protocol: int`).
|
||||
const function_record *rec = function_record_ptr_from_PyObject(self);
|
||||
if (rec == nullptr) {
|
||||
pybind11_fail(
|
||||
"FATAL: function_record_PyTypeObject reduce_ex_impl(): cannot obtain cpp_func_rec.");
|
||||
}
|
||||
if (rec->name != nullptr && rec->name[0] != '\0' && rec->scope
|
||||
&& PyModule_Check(rec->scope.ptr()) != 0) {
|
||||
object scope_module = get_scope_module(rec->scope);
|
||||
if (scope_module) {
|
||||
auto builtins = reinterpret_borrow<dict>(PyEval_GetBuiltins());
|
||||
auto builtins_eval = builtins["eval"];
|
||||
auto reconstruct_args = make_tuple(str("__import__('importlib').import_module('")
|
||||
+ scope_module + str("')"));
|
||||
return make_tuple(std::move(builtins_eval), std::move(reconstruct_args))
|
||||
.release()
|
||||
.ptr();
|
||||
}
|
||||
}
|
||||
set_error(PyExc_RuntimeError, repr(self) + str(" is not pickleable."));
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(function_record_PyTypeObject_methods)
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
538
deps_src/pybind11/include/pybind11/detail/init.h
Normal file
538
deps_src/pybind11/include/pybind11/detail/init.h
Normal file
@@ -0,0 +1,538 @@
|
||||
/*
|
||||
pybind11/detail/init.h: init factory function implementation and support code.
|
||||
|
||||
Copyright (c) 2017 Jason Rhinelander <jason@imaginary.ca>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "class.h"
|
||||
#include "using_smart_holder.h"
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
PYBIND11_WARNING_DISABLE_MSVC(4127)
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
template <>
|
||||
class type_caster<value_and_holder> {
|
||||
public:
|
||||
bool load(handle h, bool) {
|
||||
value = reinterpret_cast<value_and_holder *>(h.ptr());
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename>
|
||||
using cast_op_type = value_and_holder &;
|
||||
explicit operator value_and_holder &() { return *value; }
|
||||
static constexpr auto name = const_name<value_and_holder>();
|
||||
|
||||
private:
|
||||
value_and_holder *value = nullptr;
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(initimpl)
|
||||
|
||||
inline void no_nullptr(const void *ptr) {
|
||||
if (!ptr) {
|
||||
throw type_error("pybind11::init(): factory function returned nullptr");
|
||||
}
|
||||
}
|
||||
|
||||
// Implementing functions for all forms of py::init<...> and py::init(...)
|
||||
template <typename Class>
|
||||
using Cpp = typename Class::type;
|
||||
template <typename Class>
|
||||
using Alias = typename Class::type_alias;
|
||||
template <typename Class>
|
||||
using Holder = typename Class::holder_type;
|
||||
|
||||
template <typename Class>
|
||||
using is_alias_constructible = std::is_constructible<Alias<Class>, Cpp<Class> &&>;
|
||||
|
||||
// Takes a Cpp pointer and returns true if it actually is a polymorphic Alias instance.
|
||||
template <typename Class, enable_if_t<Class::has_alias, int> = 0>
|
||||
bool is_alias(Cpp<Class> *ptr) {
|
||||
return dynamic_cast<Alias<Class> *>(ptr) != nullptr;
|
||||
}
|
||||
// Failing fallback version of the above for a no-alias class (always returns false)
|
||||
template <typename /*Class*/>
|
||||
constexpr bool is_alias(const void *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Constructs and returns a new object; if the given arguments don't map to a constructor, we fall
|
||||
// back to brace aggregate initialization so that for aggregate initialization can be used with
|
||||
// py::init, e.g. `py::init<int, int>` to initialize a `struct T { int a; int b; }`. For
|
||||
// non-aggregate types, we need to use an ordinary T(...) constructor (invoking as `T{...}` usually
|
||||
// works, but will not do the expected thing when `T` has an `initializer_list<T>` constructor).
|
||||
template <typename Class,
|
||||
typename... Args,
|
||||
detail::enable_if_t<std::is_constructible<Class, Args...>::value, int> = 0>
|
||||
inline Class *construct_or_initialize(Args &&...args) {
|
||||
return new Class(std::forward<Args>(args)...);
|
||||
}
|
||||
template <typename Class,
|
||||
typename... Args,
|
||||
detail::enable_if_t<!std::is_constructible<Class, Args...>::value, int> = 0>
|
||||
inline Class *construct_or_initialize(Args &&...args) {
|
||||
return new Class{std::forward<Args>(args)...};
|
||||
}
|
||||
|
||||
// Attempts to constructs an alias using a `Alias(Cpp &&)` constructor. This allows types with
|
||||
// an alias to provide only a single Cpp factory function as long as the Alias can be
|
||||
// constructed from an rvalue reference of the base Cpp type. This means that Alias classes
|
||||
// can, when appropriate, simply define a `Alias(Cpp &&)` constructor rather than needing to
|
||||
// inherit all the base class constructors.
|
||||
template <typename Class>
|
||||
void construct_alias_from_cpp(std::true_type /*is_alias_constructible*/,
|
||||
value_and_holder &v_h,
|
||||
Cpp<Class> &&base) {
|
||||
v_h.value_ptr() = new Alias<Class>(std::move(base));
|
||||
}
|
||||
template <typename Class>
|
||||
[[noreturn]] void construct_alias_from_cpp(std::false_type /*!is_alias_constructible*/,
|
||||
value_and_holder &,
|
||||
Cpp<Class> &&) {
|
||||
throw type_error("pybind11::init(): unable to convert returned instance to required "
|
||||
"alias class: no `Alias<Class>(Class &&)` constructor available");
|
||||
}
|
||||
|
||||
// Error-generating fallback for factories that don't match one of the below construction
|
||||
// mechanisms.
|
||||
template <typename Class>
|
||||
void construct(...) {
|
||||
static_assert(!std::is_same<Class, Class>::value /* always false */,
|
||||
"pybind11::init(): init function must return a compatible pointer, "
|
||||
"holder, or value");
|
||||
}
|
||||
|
||||
// Pointer return v1: the factory function returns a class pointer for a registered class.
|
||||
// If we don't need an alias (because this class doesn't have one, or because the final type is
|
||||
// inherited on the Python side) we can simply take over ownership. Otherwise we need to try to
|
||||
// construct an Alias from the returned base instance.
|
||||
template <typename Class>
|
||||
void construct(value_and_holder &v_h, Cpp<Class> *ptr, bool need_alias) {
|
||||
PYBIND11_WORKAROUND_INCORRECT_MSVC_C4100(need_alias);
|
||||
no_nullptr(ptr);
|
||||
if (Class::has_alias && need_alias && !is_alias<Class>(ptr)) {
|
||||
// We're going to try to construct an alias by moving the cpp type. Whether or not
|
||||
// that succeeds, we still need to destroy the original cpp pointer (either the
|
||||
// moved away leftover, if the alias construction works, or the value itself if we
|
||||
// throw an error), but we can't just call `delete ptr`: it might have a special
|
||||
// deleter, or might be shared_from_this. So we construct a holder around it as if
|
||||
// it was a normal instance, then steal the holder away into a local variable; thus
|
||||
// the holder and destruction happens when we leave the C++ scope, and the holder
|
||||
// class gets to handle the destruction however it likes.
|
||||
v_h.value_ptr() = ptr;
|
||||
v_h.set_instance_registered(true); // Trick to prevent init_instance from registering it
|
||||
// DANGER ZONE BEGIN: exceptions will leave v_h in an invalid state.
|
||||
v_h.type->init_instance(v_h.inst, nullptr); // Set up the holder
|
||||
Holder<Class> temp_holder(std::move(v_h.holder<Holder<Class>>())); // Steal the holder
|
||||
v_h.type->dealloc(v_h); // Destroys the moved-out holder remains, resets value ptr to null
|
||||
v_h.set_instance_registered(false);
|
||||
// DANGER ZONE END.
|
||||
|
||||
construct_alias_from_cpp<Class>(is_alias_constructible<Class>{}, v_h, std::move(*ptr));
|
||||
} else {
|
||||
// Otherwise the type isn't inherited, so we don't need an Alias
|
||||
v_h.value_ptr() = ptr;
|
||||
}
|
||||
}
|
||||
|
||||
// Pointer return v2: a factory that always returns an alias instance ptr. We simply take over
|
||||
// ownership of the pointer.
|
||||
template <typename Class, enable_if_t<Class::has_alias, int> = 0>
|
||||
void construct(value_and_holder &v_h, Alias<Class> *alias_ptr, bool) {
|
||||
no_nullptr(alias_ptr);
|
||||
v_h.value_ptr() = static_cast<Cpp<Class> *>(alias_ptr);
|
||||
}
|
||||
|
||||
// Holder return: copy its pointer, and move or copy the returned holder into the new instance's
|
||||
// holder. This also handles types like std::shared_ptr<T> and std::unique_ptr<T> where T is a
|
||||
// derived type (through those holder's implicit conversion from derived class holder
|
||||
// constructors).
|
||||
template <typename Class, detail::enable_if_t<!is_smart_holder<Holder<Class>>::value, int> = 0>
|
||||
void construct(value_and_holder &v_h, Holder<Class> holder, bool need_alias) {
|
||||
PYBIND11_WORKAROUND_INCORRECT_MSVC_C4100(need_alias);
|
||||
auto *ptr = holder_helper<Holder<Class>>::get(holder);
|
||||
no_nullptr(ptr);
|
||||
// If we need an alias, check that the held pointer is actually an alias instance
|
||||
if (Class::has_alias && need_alias && !is_alias<Class>(ptr)) {
|
||||
throw type_error("pybind11::init(): construction failed: returned holder-wrapped instance "
|
||||
"is not an alias instance");
|
||||
}
|
||||
|
||||
// Cast away constness to store in void* storage.
|
||||
// The value_and_holder storage is fundamentally untyped (void**), so we lose
|
||||
// const-correctness here by design. The const qualifier will be restored
|
||||
// when the pointer is later retrieved and cast back to the original type.
|
||||
// This explicit const_cast makes the const-removal clearly visible.
|
||||
v_h.value_ptr() = const_cast<void *>(static_cast<const void *>(ptr));
|
||||
v_h.type->init_instance(v_h.inst, &holder);
|
||||
}
|
||||
|
||||
// return-by-value version 1: returning a cpp class by value. If the class has an alias and an
|
||||
// alias is required the alias must have an `Alias(Cpp &&)` constructor so that we can construct
|
||||
// the alias from the base when needed (i.e. because of Python-side inheritance). When we don't
|
||||
// need it, we simply move-construct the cpp value into a new instance.
|
||||
template <typename Class>
|
||||
void construct(value_and_holder &v_h, Cpp<Class> &&result, bool need_alias) {
|
||||
PYBIND11_WORKAROUND_INCORRECT_MSVC_C4100(need_alias);
|
||||
static_assert(is_move_constructible<Cpp<Class>>::value,
|
||||
"pybind11::init() return-by-value factory function requires a movable class");
|
||||
if (Class::has_alias && need_alias) {
|
||||
construct_alias_from_cpp<Class>(is_alias_constructible<Class>{}, v_h, std::move(result));
|
||||
} else {
|
||||
v_h.value_ptr() = new Cpp<Class>(std::move(result));
|
||||
}
|
||||
}
|
||||
|
||||
// return-by-value version 2: returning a value of the alias type itself. We move-construct an
|
||||
// Alias instance (even if no the python-side inheritance is involved). The is intended for
|
||||
// cases where Alias initialization is always desired.
|
||||
template <typename Class>
|
||||
void construct(value_and_holder &v_h, Alias<Class> &&result, bool) {
|
||||
static_assert(
|
||||
is_move_constructible<Alias<Class>>::value,
|
||||
"pybind11::init() return-by-alias-value factory function requires a movable alias class");
|
||||
v_h.value_ptr() = new Alias<Class>(std::move(result));
|
||||
}
|
||||
|
||||
template <typename T, typename D>
|
||||
smart_holder init_smart_holder_from_unique_ptr(std::unique_ptr<T, D> &&unq_ptr,
|
||||
bool void_cast_raw_ptr) {
|
||||
void *void_ptr = void_cast_raw_ptr ? static_cast<void *>(unq_ptr.get()) : nullptr;
|
||||
return smart_holder::from_unique_ptr(std::move(unq_ptr), void_ptr);
|
||||
}
|
||||
|
||||
template <typename Class,
|
||||
typename D = std::default_delete<Cpp<Class>>,
|
||||
detail::enable_if_t<is_smart_holder<Holder<Class>>::value, int> = 0>
|
||||
void construct(value_and_holder &v_h, std::unique_ptr<Cpp<Class>, D> &&unq_ptr, bool need_alias) {
|
||||
PYBIND11_WORKAROUND_INCORRECT_MSVC_C4100(need_alias);
|
||||
auto *ptr = unq_ptr.get();
|
||||
no_nullptr(ptr);
|
||||
if (Class::has_alias && need_alias && !is_alias<Class>(ptr)) {
|
||||
throw type_error("pybind11::init(): construction failed: returned std::unique_ptr pointee "
|
||||
"is not an alias instance");
|
||||
}
|
||||
// Here and below: if the new object is a trampoline, the shared_from_this mechanism needs
|
||||
// to be prevented from accessing the smart_holder vptr, because it does not keep the
|
||||
// trampoline Python object alive. For types that don't inherit from enable_shared_from_this
|
||||
// it does not matter if void_cast_raw_ptr is true or false, therefore it's not necessary
|
||||
// to also inspect the type.
|
||||
auto smhldr = init_smart_holder_from_unique_ptr(
|
||||
std::move(unq_ptr), /*void_cast_raw_ptr*/ Class::has_alias && is_alias<Class>(ptr));
|
||||
v_h.value_ptr() = ptr;
|
||||
v_h.type->init_instance(v_h.inst, &smhldr);
|
||||
}
|
||||
|
||||
template <typename Class,
|
||||
typename D = std::default_delete<Alias<Class>>,
|
||||
detail::enable_if_t<is_smart_holder<Holder<Class>>::value, int> = 0>
|
||||
void construct(value_and_holder &v_h,
|
||||
std::unique_ptr<Alias<Class>, D> &&unq_ptr,
|
||||
bool /*need_alias*/) {
|
||||
auto *ptr = unq_ptr.get();
|
||||
no_nullptr(ptr);
|
||||
auto smhldr
|
||||
= init_smart_holder_from_unique_ptr(std::move(unq_ptr), /*void_cast_raw_ptr*/ true);
|
||||
v_h.value_ptr() = ptr;
|
||||
v_h.type->init_instance(v_h.inst, &smhldr);
|
||||
}
|
||||
|
||||
template <typename PtrType, typename Class>
|
||||
void construct_from_shared_ptr(value_and_holder &v_h,
|
||||
std::shared_ptr<PtrType> &&shd_ptr,
|
||||
bool need_alias) {
|
||||
static_assert(std::is_same<PtrType, Cpp<Class>>::value
|
||||
|| std::is_same<PtrType, const Cpp<Class>>::value,
|
||||
"Expected (const) Cpp<Class> as shared_ptr pointee");
|
||||
auto *ptr = shd_ptr.get();
|
||||
no_nullptr(ptr);
|
||||
if (Class::has_alias && need_alias && !is_alias<Class>(ptr)) {
|
||||
throw type_error("pybind11::init(): construction failed: returned std::shared_ptr pointee "
|
||||
"is not an alias instance");
|
||||
}
|
||||
// Cast to non-const if needed, consistent with internal design
|
||||
auto smhldr
|
||||
= smart_holder::from_shared_ptr(std::const_pointer_cast<Cpp<Class>>(std::move(shd_ptr)));
|
||||
v_h.value_ptr() = const_cast<Cpp<Class> *>(ptr);
|
||||
v_h.type->init_instance(v_h.inst, &smhldr);
|
||||
}
|
||||
|
||||
template <typename Class, detail::enable_if_t<is_smart_holder<Holder<Class>>::value, int> = 0>
|
||||
void construct(value_and_holder &v_h, std::shared_ptr<Cpp<Class>> &&shd_ptr, bool need_alias) {
|
||||
construct_from_shared_ptr<Cpp<Class>, Class>(v_h, std::move(shd_ptr), need_alias);
|
||||
}
|
||||
|
||||
template <typename Class, detail::enable_if_t<is_smart_holder<Holder<Class>>::value, int> = 0>
|
||||
void construct(value_and_holder &v_h,
|
||||
std::shared_ptr<const Cpp<Class>> &&shd_ptr,
|
||||
bool need_alias) {
|
||||
construct_from_shared_ptr<const Cpp<Class>, Class>(v_h, std::move(shd_ptr), need_alias);
|
||||
}
|
||||
|
||||
template <typename Class, detail::enable_if_t<is_smart_holder<Holder<Class>>::value, int> = 0>
|
||||
void construct(value_and_holder &v_h,
|
||||
std::shared_ptr<Alias<Class>> &&shd_ptr,
|
||||
bool /*need_alias*/) {
|
||||
auto *ptr = shd_ptr.get();
|
||||
no_nullptr(ptr);
|
||||
auto smhldr = smart_holder::from_shared_ptr(shd_ptr);
|
||||
v_h.value_ptr() = ptr;
|
||||
v_h.type->init_instance(v_h.inst, &smhldr);
|
||||
}
|
||||
|
||||
// Implementing class for py::init<...>()
|
||||
template <typename... Args>
|
||||
struct constructor {
|
||||
template <typename Class, typename... Extra, enable_if_t<!Class::has_alias, int> = 0>
|
||||
static void execute(Class &cl, const Extra &...extra) {
|
||||
cl.def(
|
||||
"__init__",
|
||||
[](value_and_holder &v_h,
|
||||
Args... args) { // NOLINT(performance-unnecessary-value-param)
|
||||
v_h.value_ptr() = construct_or_initialize<Cpp<Class>>(std::forward<Args>(args)...);
|
||||
},
|
||||
is_new_style_constructor(),
|
||||
extra...);
|
||||
}
|
||||
|
||||
template <
|
||||
typename Class,
|
||||
typename... Extra,
|
||||
enable_if_t<Class::has_alias && std::is_constructible<Cpp<Class>, Args...>::value, int>
|
||||
= 0>
|
||||
static void execute(Class &cl, const Extra &...extra) {
|
||||
cl.def(
|
||||
"__init__",
|
||||
[](value_and_holder &v_h, Args... args) {
|
||||
if (Py_TYPE(v_h.inst) == v_h.type->type) {
|
||||
v_h.value_ptr()
|
||||
= construct_or_initialize<Cpp<Class>>(std::forward<Args>(args)...);
|
||||
} else {
|
||||
v_h.value_ptr()
|
||||
= construct_or_initialize<Alias<Class>>(std::forward<Args>(args)...);
|
||||
}
|
||||
},
|
||||
is_new_style_constructor(),
|
||||
extra...);
|
||||
}
|
||||
|
||||
template <
|
||||
typename Class,
|
||||
typename... Extra,
|
||||
enable_if_t<Class::has_alias && !std::is_constructible<Cpp<Class>, Args...>::value, int>
|
||||
= 0>
|
||||
static void execute(Class &cl, const Extra &...extra) {
|
||||
cl.def(
|
||||
"__init__",
|
||||
[](value_and_holder &v_h, Args... args) {
|
||||
v_h.value_ptr()
|
||||
= construct_or_initialize<Alias<Class>>(std::forward<Args>(args)...);
|
||||
},
|
||||
is_new_style_constructor(),
|
||||
extra...);
|
||||
}
|
||||
};
|
||||
|
||||
// Implementing class for py::init_alias<...>()
|
||||
template <typename... Args>
|
||||
struct alias_constructor {
|
||||
template <
|
||||
typename Class,
|
||||
typename... Extra,
|
||||
enable_if_t<Class::has_alias && std::is_constructible<Alias<Class>, Args...>::value, int>
|
||||
= 0>
|
||||
static void execute(Class &cl, const Extra &...extra) {
|
||||
cl.def(
|
||||
"__init__",
|
||||
[](value_and_holder &v_h, Args... args) {
|
||||
v_h.value_ptr()
|
||||
= construct_or_initialize<Alias<Class>>(std::forward<Args>(args)...);
|
||||
},
|
||||
is_new_style_constructor(),
|
||||
extra...);
|
||||
}
|
||||
};
|
||||
|
||||
// Implementation class for py::init(Func) and py::init(Func, AliasFunc)
|
||||
template <typename CFunc,
|
||||
typename AFunc = void_type (*)(),
|
||||
typename = function_signature_t<CFunc>,
|
||||
typename = function_signature_t<AFunc>>
|
||||
struct factory;
|
||||
|
||||
// Specialization for py::init(Func)
|
||||
template <typename Func, typename Return, typename... Args>
|
||||
struct factory<Func, void_type (*)(), Return(Args...)> {
|
||||
remove_reference_t<Func> class_factory;
|
||||
|
||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
||||
factory(Func &&f) : class_factory(std::forward<Func>(f)) {}
|
||||
|
||||
// The given class either has no alias or has no separate alias factory;
|
||||
// this always constructs the class itself. If the class is registered with an alias
|
||||
// type and an alias instance is needed (i.e. because the final type is a Python class
|
||||
// inheriting from the C++ type) the returned value needs to either already be an alias
|
||||
// instance, or the alias needs to be constructible from a `Class &&` argument.
|
||||
template <typename Class, typename... Extra>
|
||||
void execute(Class &cl, const Extra &...extra) && {
|
||||
#if defined(PYBIND11_CPP14)
|
||||
cl.def(
|
||||
"__init__",
|
||||
[func = std::move(class_factory)]
|
||||
#else
|
||||
auto &func = class_factory;
|
||||
cl.def(
|
||||
"__init__",
|
||||
[func]
|
||||
#endif
|
||||
(value_and_holder &v_h, Args... args) {
|
||||
construct<Class>(
|
||||
v_h, func(std::forward<Args>(args)...), Py_TYPE(v_h.inst) != v_h.type->type);
|
||||
},
|
||||
is_new_style_constructor(),
|
||||
extra...);
|
||||
}
|
||||
};
|
||||
|
||||
// Specialization for py::init(Func, AliasFunc)
|
||||
template <typename CFunc,
|
||||
typename AFunc,
|
||||
typename CReturn,
|
||||
typename... CArgs,
|
||||
typename AReturn,
|
||||
typename... AArgs>
|
||||
struct factory<CFunc, AFunc, CReturn(CArgs...), AReturn(AArgs...)> {
|
||||
static_assert(sizeof...(CArgs) == sizeof...(AArgs),
|
||||
"pybind11::init(class_factory, alias_factory): class and alias factories "
|
||||
"must have identical argument signatures");
|
||||
static_assert(all_of<std::is_same<CArgs, AArgs>...>::value,
|
||||
"pybind11::init(class_factory, alias_factory): class and alias factories "
|
||||
"must have identical argument signatures");
|
||||
|
||||
remove_reference_t<CFunc> class_factory;
|
||||
remove_reference_t<AFunc> alias_factory;
|
||||
|
||||
factory(CFunc &&c, AFunc &&a)
|
||||
: class_factory(std::forward<CFunc>(c)), alias_factory(std::forward<AFunc>(a)) {}
|
||||
|
||||
// The class factory is called when the `self` type passed to `__init__` is the direct
|
||||
// class (i.e. not inherited), the alias factory when `self` is a Python-side subtype.
|
||||
template <typename Class, typename... Extra>
|
||||
void execute(Class &cl, const Extra &...extra) && {
|
||||
static_assert(Class::has_alias,
|
||||
"The two-argument version of `py::init()` can "
|
||||
"only be used if the class has an alias");
|
||||
#if defined(PYBIND11_CPP14)
|
||||
cl.def(
|
||||
"__init__",
|
||||
[class_func = std::move(class_factory), alias_func = std::move(alias_factory)]
|
||||
#else
|
||||
auto &class_func = class_factory;
|
||||
auto &alias_func = alias_factory;
|
||||
cl.def(
|
||||
"__init__",
|
||||
[class_func, alias_func]
|
||||
#endif
|
||||
(value_and_holder &v_h, CArgs... args) {
|
||||
if (Py_TYPE(v_h.inst) == v_h.type->type) {
|
||||
// If the instance type equals the registered type we don't have inheritance,
|
||||
// so don't need the alias and can construct using the class function:
|
||||
construct<Class>(v_h, class_func(std::forward<CArgs>(args)...), false);
|
||||
} else {
|
||||
construct<Class>(v_h, alias_func(std::forward<CArgs>(args)...), true);
|
||||
}
|
||||
},
|
||||
is_new_style_constructor(),
|
||||
extra...);
|
||||
}
|
||||
};
|
||||
|
||||
/// Set just the C++ state. Same as `__init__`.
|
||||
template <typename Class, typename T>
|
||||
void setstate(value_and_holder &v_h, T &&result, bool need_alias) {
|
||||
construct<Class>(v_h, std::forward<T>(result), need_alias);
|
||||
}
|
||||
|
||||
/// Set both the C++ and Python states
|
||||
template <typename Class,
|
||||
typename T,
|
||||
typename O,
|
||||
enable_if_t<std::is_convertible<O, handle>::value, int> = 0>
|
||||
void setstate(value_and_holder &v_h, std::pair<T, O> &&result, bool need_alias) {
|
||||
construct<Class>(v_h, std::move(result.first), need_alias);
|
||||
auto d = handle(result.second);
|
||||
if (PyDict_Check(d.ptr()) && PyDict_Size(d.ptr()) == 0) {
|
||||
// Skipping setattr below, to not force use of py::dynamic_attr() for Class unnecessarily.
|
||||
// See PR #2972 for details.
|
||||
return;
|
||||
}
|
||||
// Our tests never run into an unset dict, but being careful here for now (see #5658)
|
||||
auto dict = getattr((PyObject *) v_h.inst, "__dict__", none());
|
||||
if (dict.is_none()) {
|
||||
setattr((PyObject *) v_h.inst, "__dict__", d);
|
||||
} else {
|
||||
// Keep the original object dict and just update it
|
||||
if (PyDict_Update(dict.ptr(), d.ptr()) < 0) {
|
||||
throw error_already_set();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Implementation for py::pickle(GetState, SetState)
|
||||
template <typename Get,
|
||||
typename Set,
|
||||
typename = function_signature_t<Get>,
|
||||
typename = function_signature_t<Set>>
|
||||
struct pickle_factory;
|
||||
|
||||
template <typename Get,
|
||||
typename Set,
|
||||
typename RetState,
|
||||
typename Self,
|
||||
typename NewInstance,
|
||||
typename ArgState>
|
||||
struct pickle_factory<Get, Set, RetState(Self), NewInstance(ArgState)> {
|
||||
static_assert(std::is_same<intrinsic_t<RetState>, intrinsic_t<ArgState>>::value,
|
||||
"The type returned by `__getstate__` must be the same "
|
||||
"as the argument accepted by `__setstate__`");
|
||||
|
||||
remove_reference_t<Get> get;
|
||||
remove_reference_t<Set> set;
|
||||
|
||||
pickle_factory(Get get, Set set) : get(std::forward<Get>(get)), set(std::forward<Set>(set)) {}
|
||||
|
||||
template <typename Class, typename... Extra>
|
||||
void execute(Class &cl, const Extra &...extra) && {
|
||||
cl.def("__getstate__", std::move(get), pos_only());
|
||||
|
||||
#if defined(PYBIND11_CPP14)
|
||||
cl.def(
|
||||
"__setstate__",
|
||||
[func = std::move(set)]
|
||||
#else
|
||||
auto &func = set;
|
||||
cl.def(
|
||||
"__setstate__",
|
||||
[func]
|
||||
#endif
|
||||
(value_and_holder &v_h, ArgState state) {
|
||||
setstate<Class>(
|
||||
v_h, func(std::forward<ArgState>(state)), Py_TYPE(v_h.inst) != v_h.type->type);
|
||||
},
|
||||
is_new_style_constructor(),
|
||||
extra...);
|
||||
}
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(initimpl)
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
799
deps_src/pybind11/include/pybind11/detail/internals.h
Normal file
799
deps_src/pybind11/include/pybind11/detail/internals.h
Normal file
@@ -0,0 +1,799 @@
|
||||
/*
|
||||
pybind11/detail/internals.h: Internal data structure and related functions
|
||||
|
||||
Copyright (c) 2017 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <pybind11/conduit/pybind11_platform_abi_id.h>
|
||||
#include <pybind11/gil_simple.h>
|
||||
#include <pybind11/pytypes.h>
|
||||
#include <pybind11/trampoline_self_life_support.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "struct_smart_holder.h"
|
||||
|
||||
#include <atomic>
|
||||
#include <cstdint>
|
||||
#include <exception>
|
||||
#include <limits>
|
||||
#include <mutex>
|
||||
#include <thread>
|
||||
|
||||
/// Tracks the `internals` and `type_info` ABI version independent of the main library version.
|
||||
///
|
||||
/// Some portions of the code use an ABI that is conditional depending on this
|
||||
/// version number. That allows ABI-breaking changes to be "pre-implemented".
|
||||
/// Once the default version number is incremented, the conditional logic that
|
||||
/// no longer applies can be removed. Additionally, users that need not
|
||||
/// maintain ABI compatibility can increase the version number in order to take
|
||||
/// advantage of any functionality/efficiency improvements that depend on the
|
||||
/// newer ABI.
|
||||
///
|
||||
/// WARNING: If you choose to manually increase the ABI version, note that
|
||||
/// pybind11 may not be tested as thoroughly with a non-default ABI version, and
|
||||
/// further ABI-incompatible changes may be made before the ABI is officially
|
||||
/// changed to the new version.
|
||||
#ifndef PYBIND11_INTERNALS_VERSION
|
||||
# define PYBIND11_INTERNALS_VERSION 11
|
||||
#endif
|
||||
|
||||
#if PYBIND11_INTERNALS_VERSION < 11
|
||||
# error "PYBIND11_INTERNALS_VERSION 11 is the minimum for all platforms for pybind11v3."
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
using ExceptionTranslator = void (*)(std::exception_ptr);
|
||||
|
||||
// The old Python Thread Local Storage (TLS) API is deprecated in Python 3.7 in favor of the new
|
||||
// Thread Specific Storage (TSS) API.
|
||||
// Avoid unnecessary allocation of `Py_tss_t`, since we cannot use
|
||||
// `Py_LIMITED_API` anyway.
|
||||
#define PYBIND11_TLS_KEY_REF Py_tss_t &
|
||||
#if defined(__clang__)
|
||||
# define PYBIND11_TLS_KEY_INIT(var) \
|
||||
_Pragma("clang diagnostic push") /**/ \
|
||||
_Pragma("clang diagnostic ignored \"-Wmissing-field-initializers\"") /**/ \
|
||||
Py_tss_t var \
|
||||
= Py_tss_NEEDS_INIT; \
|
||||
_Pragma("clang diagnostic pop")
|
||||
#elif defined(__GNUC__) && !defined(__INTEL_COMPILER)
|
||||
# define PYBIND11_TLS_KEY_INIT(var) \
|
||||
_Pragma("GCC diagnostic push") /**/ \
|
||||
_Pragma("GCC diagnostic ignored \"-Wmissing-field-initializers\"") /**/ \
|
||||
Py_tss_t var \
|
||||
= Py_tss_NEEDS_INIT; \
|
||||
_Pragma("GCC diagnostic pop")
|
||||
#else
|
||||
# define PYBIND11_TLS_KEY_INIT(var) Py_tss_t var = Py_tss_NEEDS_INIT;
|
||||
#endif
|
||||
#define PYBIND11_TLS_KEY_CREATE(var) (PyThread_tss_create(&(var)) == 0)
|
||||
#define PYBIND11_TLS_GET_VALUE(key) PyThread_tss_get(&(key))
|
||||
#define PYBIND11_TLS_REPLACE_VALUE(key, value) PyThread_tss_set(&(key), (value))
|
||||
#define PYBIND11_TLS_DELETE_VALUE(key) PyThread_tss_set(&(key), nullptr)
|
||||
#define PYBIND11_TLS_FREE(key) PyThread_tss_delete(&(key))
|
||||
|
||||
/// A smart-pointer-like wrapper around a thread-specific value. get/set of the pointer applies to
|
||||
/// the current thread only.
|
||||
template <typename T>
|
||||
class thread_specific_storage {
|
||||
public:
|
||||
thread_specific_storage() {
|
||||
// NOLINTNEXTLINE(bugprone-assignment-in-if-condition)
|
||||
if (!PYBIND11_TLS_KEY_CREATE(key_)) {
|
||||
pybind11_fail(
|
||||
"thread_specific_storage constructor: could not initialize the TSS key!");
|
||||
}
|
||||
}
|
||||
|
||||
~thread_specific_storage() {
|
||||
// This destructor is often called *after* Py_Finalize(). That *SHOULD BE* fine on most
|
||||
// platforms. The following details what happens when PyThread_tss_free is called in
|
||||
// CPython. PYBIND11_TLS_FREE is PyThread_tss_free on python 3.7+. On older python, it does
|
||||
// nothing. PyThread_tss_free calls PyThread_tss_delete and PyMem_RawFree.
|
||||
// PyThread_tss_delete just calls TlsFree (on Windows) or pthread_key_delete (on *NIX).
|
||||
// Neither of those have anything to do with CPython internals. PyMem_RawFree *requires*
|
||||
// that the `key` be allocated with the CPython allocator (as it is by
|
||||
// PyThread_tss_create).
|
||||
// However, in GraalPy (as of v24.2 or older), TSS is implemented by Java and this call
|
||||
// requires a living Python interpreter.
|
||||
#ifdef GRAALVM_PYTHON
|
||||
if (!Py_IsInitialized() || _Py_IsFinalizing()) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
PYBIND11_TLS_FREE(key_);
|
||||
}
|
||||
|
||||
thread_specific_storage(thread_specific_storage const &) = delete;
|
||||
thread_specific_storage(thread_specific_storage &&) = delete;
|
||||
thread_specific_storage &operator=(thread_specific_storage const &) = delete;
|
||||
thread_specific_storage &operator=(thread_specific_storage &&) = delete;
|
||||
|
||||
T *get() const { return reinterpret_cast<T *>(PYBIND11_TLS_GET_VALUE(key_)); }
|
||||
|
||||
T &operator*() const { return *get(); }
|
||||
explicit operator T *() const { return get(); }
|
||||
explicit operator bool() const { return get() != nullptr; }
|
||||
|
||||
void set(T *val) { PYBIND11_TLS_REPLACE_VALUE(key_, reinterpret_cast<void *>(val)); }
|
||||
void reset(T *p = nullptr) { set(p); }
|
||||
thread_specific_storage &operator=(T *pval) {
|
||||
set(pval);
|
||||
return *this;
|
||||
}
|
||||
|
||||
private:
|
||||
PYBIND11_TLS_KEY_INIT(mutable key_)
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
// This does NOT actually exist as a module.
|
||||
#define PYBIND11_DUMMY_MODULE_NAME "pybind11_builtins"
|
||||
|
||||
// Forward declarations
|
||||
inline PyTypeObject *make_static_property_type();
|
||||
inline PyTypeObject *make_default_metaclass();
|
||||
inline PyObject *make_object_base_type(PyTypeObject *metaclass);
|
||||
inline void translate_exception(std::exception_ptr p);
|
||||
|
||||
// Python loads modules by default with dlopen with the RTLD_LOCAL flag; under libc++ and possibly
|
||||
// other STLs, this means `typeid(A)` from one module won't equal `typeid(A)` from another module
|
||||
// even when `A` is the same, non-hidden-visibility type (e.g. from a common include). Under
|
||||
// libstdc++, this doesn't happen: equality and the type_index hash are based on the type name,
|
||||
// which works. If not under a known-good stl, provide our own name-based hash and equality
|
||||
// functions that use the type name.
|
||||
#if !defined(_LIBCPP_VERSION)
|
||||
inline bool same_type(const std::type_info &lhs, const std::type_info &rhs) { return lhs == rhs; }
|
||||
using type_hash = std::hash<std::type_index>;
|
||||
using type_equal_to = std::equal_to<std::type_index>;
|
||||
#else
|
||||
inline bool same_type(const std::type_info &lhs, const std::type_info &rhs) {
|
||||
return lhs.name() == rhs.name() || std::strcmp(lhs.name(), rhs.name()) == 0;
|
||||
}
|
||||
|
||||
struct type_hash {
|
||||
size_t operator()(const std::type_index &t) const {
|
||||
size_t hash = 5381;
|
||||
const char *ptr = t.name();
|
||||
while (auto c = static_cast<unsigned char>(*ptr++)) {
|
||||
hash = (hash * 33) ^ c;
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
};
|
||||
|
||||
struct type_equal_to {
|
||||
bool operator()(const std::type_index &lhs, const std::type_index &rhs) const {
|
||||
return lhs.name() == rhs.name() || std::strcmp(lhs.name(), rhs.name()) == 0;
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
template <typename value_type>
|
||||
using type_map = std::unordered_map<std::type_index, value_type, type_hash, type_equal_to>;
|
||||
|
||||
struct override_hash {
|
||||
inline size_t operator()(const std::pair<const PyObject *, const char *> &v) const {
|
||||
size_t value = std::hash<const void *>()(v.first);
|
||||
value ^= std::hash<const void *>()(v.second) + 0x9e3779b9 + (value << 6) + (value >> 2);
|
||||
return value;
|
||||
}
|
||||
};
|
||||
|
||||
using instance_map = std::unordered_multimap<const void *, instance *>;
|
||||
|
||||
#ifdef Py_GIL_DISABLED
|
||||
// Wrapper around PyMutex to provide BasicLockable semantics
|
||||
class pymutex {
|
||||
PyMutex mutex;
|
||||
|
||||
public:
|
||||
pymutex() : mutex({}) {}
|
||||
void lock() { PyMutex_Lock(&mutex); }
|
||||
void unlock() { PyMutex_Unlock(&mutex); }
|
||||
};
|
||||
|
||||
// Instance map shards are used to reduce mutex contention in free-threaded Python.
|
||||
struct instance_map_shard {
|
||||
instance_map registered_instances;
|
||||
pymutex mutex;
|
||||
// alignas(64) would be better, but causes compile errors in macOS before 10.14 (see #5200)
|
||||
char padding[64 - (sizeof(instance_map) + sizeof(pymutex)) % 64];
|
||||
};
|
||||
|
||||
static_assert(sizeof(instance_map_shard) % 64 == 0,
|
||||
"instance_map_shard size is not a multiple of 64 bytes");
|
||||
|
||||
inline uint64_t round_up_to_next_pow2(uint64_t x) {
|
||||
// Round-up to the next power of two.
|
||||
// See https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
|
||||
x--;
|
||||
x |= (x >> 1);
|
||||
x |= (x >> 2);
|
||||
x |= (x >> 4);
|
||||
x |= (x >> 8);
|
||||
x |= (x >> 16);
|
||||
x |= (x >> 32);
|
||||
x++;
|
||||
return x;
|
||||
}
|
||||
#endif
|
||||
|
||||
class loader_life_support;
|
||||
|
||||
/// Internal data structure used to track registered instances and types.
|
||||
/// Whenever binary incompatible changes are made to this structure,
|
||||
/// `PYBIND11_INTERNALS_VERSION` must be incremented.
|
||||
struct internals {
|
||||
#ifdef Py_GIL_DISABLED
|
||||
pymutex mutex;
|
||||
pymutex exception_translator_mutex;
|
||||
#endif
|
||||
// std::type_index -> pybind11's type information
|
||||
type_map<type_info *> registered_types_cpp;
|
||||
// PyTypeObject* -> base type_info(s)
|
||||
std::unordered_map<PyTypeObject *, std::vector<type_info *>> registered_types_py;
|
||||
#ifdef Py_GIL_DISABLED
|
||||
std::unique_ptr<instance_map_shard[]> instance_shards; // void * -> instance*
|
||||
size_t instance_shards_mask = 0;
|
||||
#else
|
||||
instance_map registered_instances; // void * -> instance*
|
||||
#endif
|
||||
std::unordered_set<std::pair<const PyObject *, const char *>, override_hash>
|
||||
inactive_override_cache;
|
||||
type_map<std::vector<bool (*)(PyObject *, void *&)>> direct_conversions;
|
||||
std::unordered_map<const PyObject *, std::vector<PyObject *>> patients;
|
||||
std::forward_list<ExceptionTranslator> registered_exception_translators;
|
||||
std::unordered_map<std::string, void *> shared_data; // Custom data to be shared across
|
||||
// extensions
|
||||
std::forward_list<std::string> static_strings; // Stores the std::strings backing
|
||||
// detail::c_str()
|
||||
PyTypeObject *static_property_type = nullptr;
|
||||
PyTypeObject *default_metaclass = nullptr;
|
||||
PyObject *instance_base = nullptr;
|
||||
// Unused if PYBIND11_SIMPLE_GIL_MANAGEMENT is defined:
|
||||
thread_specific_storage<PyThreadState> tstate;
|
||||
thread_specific_storage<loader_life_support> loader_life_support_tls;
|
||||
// Unused if PYBIND11_SIMPLE_GIL_MANAGEMENT is defined:
|
||||
PyInterpreterState *istate = nullptr;
|
||||
|
||||
type_map<PyObject *> native_enum_type_map;
|
||||
|
||||
internals()
|
||||
: static_property_type(make_static_property_type()),
|
||||
default_metaclass(make_default_metaclass()) {
|
||||
PyThreadState *cur_tstate = PyThreadState_Get();
|
||||
tstate = cur_tstate;
|
||||
|
||||
istate = cur_tstate->interp;
|
||||
registered_exception_translators.push_front(&translate_exception);
|
||||
#ifdef Py_GIL_DISABLED
|
||||
// Scale proportional to the number of cores. 2x is a heuristic to reduce contention.
|
||||
// Make sure the number isn't unreasonable by limiting it to 16 bits (65K)
|
||||
auto num_shards = static_cast<std::uint16_t>(
|
||||
std::min<std::size_t>(round_up_to_next_pow2(2 * std::thread::hardware_concurrency()),
|
||||
std::numeric_limits<std::uint16_t>::max()));
|
||||
if (num_shards == 0) {
|
||||
num_shards = 1;
|
||||
}
|
||||
instance_shards.reset(new instance_map_shard[num_shards]);
|
||||
instance_shards_mask = num_shards - 1;
|
||||
#endif
|
||||
}
|
||||
internals(const internals &other) = delete;
|
||||
internals(internals &&other) = delete;
|
||||
internals &operator=(const internals &other) = delete;
|
||||
internals &operator=(internals &&other) = delete;
|
||||
~internals() = default;
|
||||
};
|
||||
|
||||
// the internals struct (above) is shared between all the modules. local_internals are only
|
||||
// for a single module. Any changes made to internals may require an update to
|
||||
// PYBIND11_INTERNALS_VERSION, breaking backwards compatibility. local_internals is, by design,
|
||||
// restricted to a single module. Whether a module has local internals or not should not
|
||||
// impact any other modules, because the only things accessing the local internals is the
|
||||
// module that contains them.
|
||||
struct local_internals {
|
||||
type_map<type_info *> registered_types_cpp;
|
||||
std::forward_list<ExceptionTranslator> registered_exception_translators;
|
||||
PyTypeObject *function_record_py_type = nullptr;
|
||||
};
|
||||
|
||||
enum class holder_enum_t : uint8_t {
|
||||
undefined,
|
||||
std_unique_ptr, // Default, lacking interop with std::shared_ptr.
|
||||
std_shared_ptr, // Lacking interop with std::unique_ptr.
|
||||
smart_holder, // Full std::unique_ptr / std::shared_ptr interop.
|
||||
custom_holder,
|
||||
};
|
||||
|
||||
/// Additional type information which does not fit into the PyTypeObject.
|
||||
/// Changes to this struct also require bumping `PYBIND11_INTERNALS_VERSION`.
|
||||
struct type_info {
|
||||
PyTypeObject *type;
|
||||
const std::type_info *cpptype;
|
||||
size_t type_size, type_align, holder_size_in_ptrs;
|
||||
void *(*operator_new)(size_t);
|
||||
void (*init_instance)(instance *, const void *);
|
||||
void (*dealloc)(value_and_holder &v_h);
|
||||
|
||||
// Cross-DSO-safe function pointers, to sidestep cross-DSO RTTI issues
|
||||
// on platforms like macOS (see PR #5728 for details):
|
||||
memory::get_guarded_delete_fn get_memory_guarded_delete = memory::get_guarded_delete;
|
||||
get_trampoline_self_life_support_fn get_trampoline_self_life_support = nullptr;
|
||||
|
||||
std::vector<PyObject *(*) (PyObject *, PyTypeObject *)> implicit_conversions;
|
||||
std::vector<std::pair<const std::type_info *, void *(*) (void *)>> implicit_casts;
|
||||
std::vector<bool (*)(PyObject *, void *&)> *direct_conversions;
|
||||
buffer_info *(*get_buffer)(PyObject *, void *) = nullptr;
|
||||
void *get_buffer_data = nullptr;
|
||||
void *(*module_local_load)(PyObject *, const type_info *) = nullptr;
|
||||
holder_enum_t holder_enum_v = holder_enum_t::undefined;
|
||||
/* A simple type never occurs as a (direct or indirect) parent
|
||||
* of a class that makes use of multiple inheritance.
|
||||
* A type can be simple even if it has non-simple ancestors as long as it has no descendants.
|
||||
*/
|
||||
bool simple_type : 1;
|
||||
/* True if there is no multiple inheritance in this type's inheritance tree */
|
||||
bool simple_ancestors : 1;
|
||||
/* true if this is a type registered with py::module_local */
|
||||
bool module_local : 1;
|
||||
};
|
||||
|
||||
#define PYBIND11_INTERNALS_ID \
|
||||
"__pybind11_internals_v" PYBIND11_TOSTRING(PYBIND11_INTERNALS_VERSION) \
|
||||
PYBIND11_COMPILER_TYPE_LEADING_UNDERSCORE PYBIND11_PLATFORM_ABI_ID "__"
|
||||
|
||||
#define PYBIND11_MODULE_LOCAL_ID \
|
||||
"__pybind11_module_local_v" PYBIND11_TOSTRING(PYBIND11_INTERNALS_VERSION) \
|
||||
PYBIND11_COMPILER_TYPE_LEADING_UNDERSCORE PYBIND11_PLATFORM_ABI_ID "__"
|
||||
|
||||
inline PyThreadState *get_thread_state_unchecked() {
|
||||
#if defined(PYPY_VERSION) || defined(GRAALVM_PYTHON)
|
||||
return PyThreadState_GET();
|
||||
#elif PY_VERSION_HEX < 0x030D0000
|
||||
return _PyThreadState_UncheckedGet();
|
||||
#else
|
||||
return PyThreadState_GetUnchecked();
|
||||
#endif
|
||||
}
|
||||
|
||||
/// We use this counter to figure out if there are or have been multiple subinterpreters active at
|
||||
/// any point. This must never decrease while any interpreter may be running in any thread!
|
||||
inline std::atomic<int> &get_num_interpreters_seen() {
|
||||
static std::atomic<int> counter(0);
|
||||
return counter;
|
||||
}
|
||||
|
||||
template <class T,
|
||||
enable_if_t<std::is_same<std::nested_exception, remove_cvref_t<T>>::value, int> = 0>
|
||||
bool handle_nested_exception(const T &exc, const std::exception_ptr &p) {
|
||||
std::exception_ptr nested = exc.nested_ptr();
|
||||
if (nested != nullptr && nested != p) {
|
||||
translate_exception(nested);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class T,
|
||||
enable_if_t<!std::is_same<std::nested_exception, remove_cvref_t<T>>::value, int> = 0>
|
||||
bool handle_nested_exception(const T &exc, const std::exception_ptr &p) {
|
||||
if (const auto *nep = dynamic_cast<const std::nested_exception *>(std::addressof(exc))) {
|
||||
return handle_nested_exception(*nep, p);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool raise_err(PyObject *exc_type, const char *msg) {
|
||||
if (PyErr_Occurred()) {
|
||||
raise_from(exc_type, msg);
|
||||
return true;
|
||||
}
|
||||
set_error(exc_type, msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
inline void translate_exception(std::exception_ptr p) {
|
||||
if (!p) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
std::rethrow_exception(p);
|
||||
} catch (error_already_set &e) {
|
||||
handle_nested_exception(e, p);
|
||||
e.restore();
|
||||
return;
|
||||
} catch (const builtin_exception &e) {
|
||||
// Could not use template since it's an abstract class.
|
||||
if (const auto *nep = dynamic_cast<const std::nested_exception *>(std::addressof(e))) {
|
||||
handle_nested_exception(*nep, p);
|
||||
}
|
||||
e.set_error();
|
||||
return;
|
||||
} catch (const std::bad_alloc &e) {
|
||||
handle_nested_exception(e, p);
|
||||
raise_err(PyExc_MemoryError, e.what());
|
||||
return;
|
||||
} catch (const std::domain_error &e) {
|
||||
handle_nested_exception(e, p);
|
||||
raise_err(PyExc_ValueError, e.what());
|
||||
return;
|
||||
} catch (const std::invalid_argument &e) {
|
||||
handle_nested_exception(e, p);
|
||||
raise_err(PyExc_ValueError, e.what());
|
||||
return;
|
||||
} catch (const std::length_error &e) {
|
||||
handle_nested_exception(e, p);
|
||||
raise_err(PyExc_ValueError, e.what());
|
||||
return;
|
||||
} catch (const std::out_of_range &e) {
|
||||
handle_nested_exception(e, p);
|
||||
raise_err(PyExc_IndexError, e.what());
|
||||
return;
|
||||
} catch (const std::range_error &e) {
|
||||
handle_nested_exception(e, p);
|
||||
raise_err(PyExc_ValueError, e.what());
|
||||
return;
|
||||
} catch (const std::overflow_error &e) {
|
||||
handle_nested_exception(e, p);
|
||||
raise_err(PyExc_OverflowError, e.what());
|
||||
return;
|
||||
} catch (const std::exception &e) {
|
||||
handle_nested_exception(e, p);
|
||||
raise_err(PyExc_RuntimeError, e.what());
|
||||
return;
|
||||
} catch (const std::nested_exception &e) {
|
||||
handle_nested_exception(e, p);
|
||||
raise_err(PyExc_RuntimeError, "Caught an unknown nested exception!");
|
||||
return;
|
||||
} catch (...) {
|
||||
raise_err(PyExc_RuntimeError, "Caught an unknown exception!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#if !defined(__GLIBCXX__)
|
||||
inline void translate_local_exception(std::exception_ptr p) {
|
||||
try {
|
||||
if (p) {
|
||||
std::rethrow_exception(p);
|
||||
}
|
||||
} catch (error_already_set &e) {
|
||||
e.restore();
|
||||
return;
|
||||
} catch (const builtin_exception &e) {
|
||||
e.set_error();
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
inline object get_python_state_dict() {
|
||||
object state_dict;
|
||||
#if defined(PYPY_VERSION) || defined(GRAALVM_PYTHON)
|
||||
state_dict = reinterpret_borrow<object>(PyEval_GetBuiltins());
|
||||
#else
|
||||
# if PY_VERSION_HEX < 0x03090000
|
||||
PyInterpreterState *istate = _PyInterpreterState_Get();
|
||||
# else
|
||||
PyInterpreterState *istate = PyInterpreterState_Get();
|
||||
# endif
|
||||
if (istate) {
|
||||
state_dict = reinterpret_borrow<object>(PyInterpreterState_GetDict(istate));
|
||||
}
|
||||
#endif
|
||||
if (!state_dict) {
|
||||
raise_from(PyExc_SystemError, "pybind11::detail::get_python_state_dict() FAILED");
|
||||
throw error_already_set();
|
||||
}
|
||||
return state_dict;
|
||||
}
|
||||
|
||||
template <typename InternalsType>
|
||||
class internals_pp_manager {
|
||||
public:
|
||||
using on_fetch_function = void(InternalsType *);
|
||||
internals_pp_manager(char const *id, on_fetch_function *on_fetch)
|
||||
: holder_id_(id), on_fetch_(on_fetch) {}
|
||||
|
||||
/// Get the current pointer-to-pointer, allocating it if it does not already exist. May
|
||||
/// acquire the GIL. Will never return nullptr.
|
||||
std::unique_ptr<InternalsType> *get_pp() {
|
||||
#ifdef PYBIND11_HAS_SUBINTERPRETER_SUPPORT
|
||||
if (get_num_interpreters_seen() > 1) {
|
||||
// Whenever the interpreter changes on the current thread we need to invalidate the
|
||||
// internals_pp so that it can be pulled from the interpreter's state dict. That is
|
||||
// slow, so we use the current PyThreadState to check if it is necessary.
|
||||
auto *tstate = get_thread_state_unchecked();
|
||||
if (!tstate || tstate->interp != last_istate_.get()) {
|
||||
gil_scoped_acquire_simple gil;
|
||||
if (!tstate) {
|
||||
tstate = get_thread_state_unchecked();
|
||||
}
|
||||
last_istate_ = tstate->interp;
|
||||
internals_tls_p_ = get_or_create_pp_in_state_dict();
|
||||
}
|
||||
return internals_tls_p_.get();
|
||||
}
|
||||
#endif
|
||||
if (!internals_singleton_pp_) {
|
||||
gil_scoped_acquire_simple gil;
|
||||
internals_singleton_pp_ = get_or_create_pp_in_state_dict();
|
||||
}
|
||||
return internals_singleton_pp_;
|
||||
}
|
||||
|
||||
/// Drop all the references we're currently holding.
|
||||
void unref() {
|
||||
#ifdef PYBIND11_HAS_SUBINTERPRETER_SUPPORT
|
||||
if (get_num_interpreters_seen() > 1) {
|
||||
last_istate_.reset();
|
||||
internals_tls_p_.reset();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
internals_singleton_pp_ = nullptr;
|
||||
}
|
||||
|
||||
void destroy() {
|
||||
#ifdef PYBIND11_HAS_SUBINTERPRETER_SUPPORT
|
||||
if (get_num_interpreters_seen() > 1) {
|
||||
auto *tstate = get_thread_state_unchecked();
|
||||
// this could be called without an active interpreter, just use what was cached
|
||||
if (!tstate || tstate->interp == last_istate_.get()) {
|
||||
auto tpp = internals_tls_p_.get();
|
||||
if (tpp) {
|
||||
delete tpp;
|
||||
}
|
||||
}
|
||||
unref();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
delete internals_singleton_pp_;
|
||||
unref();
|
||||
}
|
||||
|
||||
private:
|
||||
std::unique_ptr<InternalsType> *get_or_create_pp_in_state_dict() {
|
||||
error_scope err_scope;
|
||||
dict state_dict = get_python_state_dict();
|
||||
auto internals_obj
|
||||
= reinterpret_steal<object>(dict_getitemstringref(state_dict.ptr(), holder_id_));
|
||||
std::unique_ptr<InternalsType> *pp = nullptr;
|
||||
if (internals_obj) {
|
||||
void *raw_ptr = PyCapsule_GetPointer(internals_obj.ptr(), /*name=*/nullptr);
|
||||
if (!raw_ptr) {
|
||||
raise_from(PyExc_SystemError,
|
||||
"pybind11::detail::internals_pp_manager::get_pp_from_dict() FAILED");
|
||||
throw error_already_set();
|
||||
}
|
||||
pp = reinterpret_cast<std::unique_ptr<InternalsType> *>(raw_ptr);
|
||||
if (on_fetch_ && pp) {
|
||||
on_fetch_(pp->get());
|
||||
}
|
||||
} else {
|
||||
pp = new std::unique_ptr<InternalsType>;
|
||||
// NOLINTNEXTLINE(bugprone-casting-through-void)
|
||||
state_dict[holder_id_] = capsule(reinterpret_cast<void *>(pp));
|
||||
}
|
||||
return pp;
|
||||
}
|
||||
|
||||
char const *holder_id_ = nullptr;
|
||||
on_fetch_function *on_fetch_ = nullptr;
|
||||
#ifdef PYBIND11_HAS_SUBINTERPRETER_SUPPORT
|
||||
thread_specific_storage<PyInterpreterState> last_istate_;
|
||||
thread_specific_storage<std::unique_ptr<InternalsType>> internals_tls_p_;
|
||||
#endif
|
||||
std::unique_ptr<InternalsType> *internals_singleton_pp_;
|
||||
};
|
||||
|
||||
// If We loaded the internals through `state_dict`, our `error_already_set`
|
||||
// and `builtin_exception` may be different local classes than the ones set up in the
|
||||
// initial exception translator, below, so add another for our local exception classes.
|
||||
//
|
||||
// libstdc++ doesn't require this (types there are identified only by name)
|
||||
// libc++ with CPython doesn't require this (types are explicitly exported)
|
||||
// libc++ with PyPy still need it, awaiting further investigation
|
||||
#if !defined(__GLIBCXX__)
|
||||
inline void check_internals_local_exception_translator(internals *internals_ptr) {
|
||||
if (internals_ptr) {
|
||||
for (auto et : internals_ptr->registered_exception_translators) {
|
||||
if (et == &translate_local_exception) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
internals_ptr->registered_exception_translators.push_front(&translate_local_exception);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
inline internals_pp_manager<internals> &get_internals_pp_manager() {
|
||||
#if defined(__GLIBCXX__)
|
||||
# define ON_FETCH_FN nullptr
|
||||
#else
|
||||
# define ON_FETCH_FN &check_internals_local_exception_translator
|
||||
#endif
|
||||
static internals_pp_manager<internals> internals_pp_manager(PYBIND11_INTERNALS_ID,
|
||||
ON_FETCH_FN);
|
||||
#undef ON_FETCH_FN
|
||||
return internals_pp_manager;
|
||||
}
|
||||
|
||||
/// Return a reference to the current `internals` data
|
||||
PYBIND11_NOINLINE internals &get_internals() {
|
||||
auto &ppmgr = get_internals_pp_manager();
|
||||
auto &internals_ptr = *ppmgr.get_pp();
|
||||
if (!internals_ptr) {
|
||||
// Slow path, something needs fetched from the state dict or created
|
||||
gil_scoped_acquire_simple gil;
|
||||
error_scope err_scope;
|
||||
internals_ptr.reset(new internals());
|
||||
|
||||
if (!internals_ptr->instance_base) {
|
||||
// This calls get_internals, so cannot be called from within the internals constructor
|
||||
// called above because internals_ptr must be set before get_internals is called again
|
||||
internals_ptr->instance_base = make_object_base_type(internals_ptr->default_metaclass);
|
||||
}
|
||||
}
|
||||
return *internals_ptr;
|
||||
}
|
||||
|
||||
inline internals_pp_manager<local_internals> &get_local_internals_pp_manager() {
|
||||
// Use the address of this static itself as part of the key, so that the value is uniquely tied
|
||||
// to where the module is loaded in memory
|
||||
static const std::string this_module_idstr
|
||||
= PYBIND11_MODULE_LOCAL_ID
|
||||
+ std::to_string(reinterpret_cast<uintptr_t>(&this_module_idstr));
|
||||
static internals_pp_manager<local_internals> local_internals_pp_manager(
|
||||
this_module_idstr.c_str(), nullptr);
|
||||
return local_internals_pp_manager;
|
||||
}
|
||||
|
||||
/// Works like `get_internals`, but for things which are locally registered.
|
||||
inline local_internals &get_local_internals() {
|
||||
auto &ppmgr = get_local_internals_pp_manager();
|
||||
auto &internals_ptr = *ppmgr.get_pp();
|
||||
if (!internals_ptr) {
|
||||
internals_ptr.reset(new local_internals());
|
||||
}
|
||||
return *internals_ptr;
|
||||
}
|
||||
|
||||
#ifdef Py_GIL_DISABLED
|
||||
# define PYBIND11_LOCK_INTERNALS(internals) std::unique_lock<pymutex> lock((internals).mutex)
|
||||
#else
|
||||
# define PYBIND11_LOCK_INTERNALS(internals)
|
||||
#endif
|
||||
|
||||
template <typename F>
|
||||
inline auto with_internals(const F &cb) -> decltype(cb(get_internals())) {
|
||||
auto &internals = get_internals();
|
||||
PYBIND11_LOCK_INTERNALS(internals);
|
||||
return cb(internals);
|
||||
}
|
||||
|
||||
template <typename F>
|
||||
inline auto with_exception_translators(const F &cb)
|
||||
-> decltype(cb(get_internals().registered_exception_translators,
|
||||
get_local_internals().registered_exception_translators)) {
|
||||
auto &internals = get_internals();
|
||||
#ifdef Py_GIL_DISABLED
|
||||
std::unique_lock<pymutex> lock((internals).exception_translator_mutex);
|
||||
#endif
|
||||
auto &local_internals = get_local_internals();
|
||||
return cb(internals.registered_exception_translators,
|
||||
local_internals.registered_exception_translators);
|
||||
}
|
||||
|
||||
inline std::uint64_t mix64(std::uint64_t z) {
|
||||
// David Stafford's variant 13 of the MurmurHash3 finalizer popularized
|
||||
// by the SplitMix PRNG.
|
||||
// https://zimbry.blogspot.com/2011/09/better-bit-mixing-improving-on.html
|
||||
z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
|
||||
z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
|
||||
return z ^ (z >> 31);
|
||||
}
|
||||
|
||||
template <typename F>
|
||||
inline auto with_instance_map(const void *ptr, const F &cb)
|
||||
-> decltype(cb(std::declval<instance_map &>())) {
|
||||
auto &internals = get_internals();
|
||||
|
||||
#ifdef Py_GIL_DISABLED
|
||||
// Hash address to compute shard, but ignore low bits. We'd like allocations
|
||||
// from the same thread/core to map to the same shard and allocations from
|
||||
// other threads/cores to map to other shards. Using the high bits is a good
|
||||
// heuristic because memory allocators often have a per-thread
|
||||
// arena/superblock/segment from which smaller allocations are served.
|
||||
auto addr = reinterpret_cast<std::uintptr_t>(ptr);
|
||||
auto hash = mix64(static_cast<std::uint64_t>(addr >> 20));
|
||||
auto idx = static_cast<size_t>(hash & internals.instance_shards_mask);
|
||||
|
||||
auto &shard = internals.instance_shards[idx];
|
||||
std::unique_lock<pymutex> lock(shard.mutex);
|
||||
return cb(shard.registered_instances);
|
||||
#else
|
||||
(void) ptr;
|
||||
return cb(internals.registered_instances);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Returns the number of registered instances for testing purposes. The result may not be
|
||||
// consistent if other threads are registering or unregistering instances concurrently.
|
||||
inline size_t num_registered_instances() {
|
||||
auto &internals = get_internals();
|
||||
#ifdef Py_GIL_DISABLED
|
||||
size_t count = 0;
|
||||
for (size_t i = 0; i <= internals.instance_shards_mask; ++i) {
|
||||
auto &shard = internals.instance_shards[i];
|
||||
std::unique_lock<pymutex> lock(shard.mutex);
|
||||
count += shard.registered_instances.size();
|
||||
}
|
||||
return count;
|
||||
#else
|
||||
return internals.registered_instances.size();
|
||||
#endif
|
||||
}
|
||||
|
||||
/// Constructs a std::string with the given arguments, stores it in `internals`, and returns its
|
||||
/// `c_str()`. Such strings objects have a long storage duration -- the internal strings are only
|
||||
/// cleared when the program exits or after interpreter shutdown (when embedding), and so are
|
||||
/// suitable for c-style strings needed by Python internals (such as PyTypeObject's tp_name).
|
||||
template <typename... Args>
|
||||
const char *c_str(Args &&...args) {
|
||||
// GCC 4.8 doesn't like parameter unpack within lambda capture, so use
|
||||
// PYBIND11_LOCK_INTERNALS.
|
||||
auto &internals = get_internals();
|
||||
PYBIND11_LOCK_INTERNALS(internals);
|
||||
auto &strings = internals.static_strings;
|
||||
strings.emplace_front(std::forward<Args>(args)...);
|
||||
return strings.front().c_str();
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
/// Returns a named pointer that is shared among all extension modules (using the same
|
||||
/// pybind11 version) running in the current interpreter. Names starting with underscores
|
||||
/// are reserved for internal usage. Returns `nullptr` if no matching entry was found.
|
||||
PYBIND11_NOINLINE void *get_shared_data(const std::string &name) {
|
||||
return detail::with_internals([&](detail::internals &internals) {
|
||||
auto it = internals.shared_data.find(name);
|
||||
return it != internals.shared_data.end() ? it->second : nullptr;
|
||||
});
|
||||
}
|
||||
|
||||
/// Set the shared data that can be later recovered by `get_shared_data()`.
|
||||
PYBIND11_NOINLINE void *set_shared_data(const std::string &name, void *data) {
|
||||
return detail::with_internals([&](detail::internals &internals) {
|
||||
internals.shared_data[name] = data;
|
||||
return data;
|
||||
});
|
||||
}
|
||||
|
||||
/// Returns a typed reference to a shared data entry (by using `get_shared_data()`) if
|
||||
/// such entry exists. Otherwise, a new object of default-constructible type `T` is
|
||||
/// added to the shared data under the given name and a reference to it is returned.
|
||||
template <typename T>
|
||||
T &get_or_create_shared_data(const std::string &name) {
|
||||
return *detail::with_internals([&](detail::internals &internals) {
|
||||
auto it = internals.shared_data.find(name);
|
||||
T *ptr = (T *) (it != internals.shared_data.end() ? it->second : nullptr);
|
||||
if (!ptr) {
|
||||
ptr = new T();
|
||||
internals.shared_data[name] = ptr;
|
||||
}
|
||||
return ptr;
|
||||
});
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
209
deps_src/pybind11/include/pybind11/detail/native_enum_data.h
Normal file
209
deps_src/pybind11/include/pybind11/detail/native_enum_data.h
Normal file
@@ -0,0 +1,209 @@
|
||||
// Copyright (c) 2022-2025 The pybind Community.
|
||||
// All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "../pytypes.h"
|
||||
#include "common.h"
|
||||
#include "internals.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <typeindex>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
// This is a separate function only to enable easy unit testing.
|
||||
inline std::string
|
||||
native_enum_missing_finalize_error_message(const std::string &enum_name_encoded) {
|
||||
return "pybind11::native_enum<...>(\"" + enum_name_encoded + "\", ...): MISSING .finalize()";
|
||||
}
|
||||
|
||||
class native_enum_data {
|
||||
public:
|
||||
native_enum_data(const object &parent_scope,
|
||||
const char *enum_name,
|
||||
const char *native_type_name,
|
||||
const char *class_doc,
|
||||
const std::type_index &enum_type_index)
|
||||
: enum_name_encoded{enum_name}, native_type_name_encoded{native_type_name},
|
||||
enum_type_index{enum_type_index}, parent_scope(parent_scope), enum_name{enum_name},
|
||||
native_type_name{native_type_name}, class_doc(class_doc), export_values_flag{false},
|
||||
finalize_needed{false} {}
|
||||
|
||||
void finalize();
|
||||
|
||||
native_enum_data(const native_enum_data &) = delete;
|
||||
native_enum_data &operator=(const native_enum_data &) = delete;
|
||||
|
||||
#if !defined(NDEBUG)
|
||||
// This dtor cannot easily be unit tested because it terminates the process.
|
||||
~native_enum_data() {
|
||||
if (finalize_needed) {
|
||||
pybind11_fail(native_enum_missing_finalize_error_message(enum_name_encoded));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
protected:
|
||||
void disarm_finalize_check(const char *error_context) {
|
||||
if (!finalize_needed) {
|
||||
pybind11_fail("pybind11::native_enum<...>(\"" + enum_name_encoded
|
||||
+ "\"): " + error_context);
|
||||
}
|
||||
finalize_needed = false;
|
||||
}
|
||||
|
||||
void arm_finalize_check() {
|
||||
assert(!finalize_needed); // Catch redundant calls.
|
||||
finalize_needed = true;
|
||||
}
|
||||
|
||||
std::string enum_name_encoded;
|
||||
std::string native_type_name_encoded;
|
||||
std::type_index enum_type_index;
|
||||
|
||||
private:
|
||||
object parent_scope;
|
||||
str enum_name;
|
||||
str native_type_name;
|
||||
std::string class_doc;
|
||||
|
||||
protected:
|
||||
list members;
|
||||
list member_docs;
|
||||
bool export_values_flag : 1; // Attention: It is best to keep the bools together.
|
||||
|
||||
private:
|
||||
bool finalize_needed : 1;
|
||||
};
|
||||
|
||||
inline void global_internals_native_enum_type_map_set_item(const std::type_index &enum_type_index,
|
||||
PyObject *py_enum) {
|
||||
with_internals(
|
||||
[&](internals &internals) { internals.native_enum_type_map[enum_type_index] = py_enum; });
|
||||
}
|
||||
|
||||
inline handle
|
||||
global_internals_native_enum_type_map_get_item(const std::type_index &enum_type_index) {
|
||||
return with_internals([&](internals &internals) {
|
||||
auto found = internals.native_enum_type_map.find(enum_type_index);
|
||||
if (found != internals.native_enum_type_map.end()) {
|
||||
return handle(found->second);
|
||||
}
|
||||
return handle();
|
||||
});
|
||||
}
|
||||
|
||||
inline bool
|
||||
global_internals_native_enum_type_map_contains(const std::type_index &enum_type_index) {
|
||||
return with_internals([&](internals &internals) {
|
||||
return internals.native_enum_type_map.count(enum_type_index) != 0;
|
||||
});
|
||||
}
|
||||
|
||||
inline object import_or_getattr(const std::string &fully_qualified_name,
|
||||
const std::string &append_to_exception_message) {
|
||||
std::istringstream stream(fully_qualified_name);
|
||||
std::string part;
|
||||
|
||||
if (!std::getline(stream, part, '.') || part.empty()) {
|
||||
std::string msg = "Invalid fully-qualified name `";
|
||||
msg += fully_qualified_name;
|
||||
msg += "`";
|
||||
msg += append_to_exception_message;
|
||||
throw value_error(msg);
|
||||
}
|
||||
|
||||
auto curr_scope = reinterpret_steal<object>(PyImport_ImportModule(part.c_str()));
|
||||
if (!curr_scope) {
|
||||
std::string msg = "Failed to import top-level module `";
|
||||
msg += part;
|
||||
msg += "`";
|
||||
msg += append_to_exception_message;
|
||||
raise_from(PyExc_ImportError, msg.c_str());
|
||||
throw error_already_set();
|
||||
}
|
||||
|
||||
// Now recursively getattr or import remaining parts
|
||||
std::string curr_path = part;
|
||||
while (std::getline(stream, part, '.')) {
|
||||
if (part.empty()) {
|
||||
std::string msg = "Invalid fully-qualified name `";
|
||||
msg += fully_qualified_name;
|
||||
msg += "`";
|
||||
msg += append_to_exception_message;
|
||||
throw value_error(msg);
|
||||
}
|
||||
std::string next_path = curr_path;
|
||||
next_path += ".";
|
||||
next_path += part;
|
||||
auto next_scope
|
||||
= reinterpret_steal<object>(PyObject_GetAttrString(curr_scope.ptr(), part.c_str()));
|
||||
if (!next_scope) {
|
||||
error_fetch_and_normalize stored_getattr_error("getattr");
|
||||
// Try importing the next level
|
||||
next_scope = reinterpret_steal<object>(PyImport_ImportModule(next_path.c_str()));
|
||||
if (!next_scope) {
|
||||
error_fetch_and_normalize stored_import_error("import");
|
||||
std::string msg = "Failed to import or getattr `";
|
||||
msg += part;
|
||||
msg += "` from `";
|
||||
msg += curr_path;
|
||||
msg += "`";
|
||||
msg += append_to_exception_message;
|
||||
msg += "\n-------- getattr exception --------\n";
|
||||
msg += stored_getattr_error.error_string();
|
||||
msg += "\n-------- import exception --------\n";
|
||||
msg += stored_import_error.error_string();
|
||||
throw import_error(msg.c_str());
|
||||
}
|
||||
}
|
||||
curr_scope = next_scope;
|
||||
curr_path = next_path;
|
||||
}
|
||||
return curr_scope;
|
||||
}
|
||||
|
||||
inline void native_enum_data::finalize() {
|
||||
disarm_finalize_check("DOUBLE finalize");
|
||||
if (hasattr(parent_scope, enum_name)) {
|
||||
pybind11_fail("pybind11::native_enum<...>(\"" + enum_name_encoded
|
||||
+ "\"): an object with that name is already defined");
|
||||
}
|
||||
auto py_enum_type = import_or_getattr(native_type_name, " (native_type_name)");
|
||||
auto py_enum = py_enum_type(enum_name, members);
|
||||
object module_name = get_module_name_if_available(parent_scope);
|
||||
if (module_name) {
|
||||
py_enum.attr("__module__") = module_name;
|
||||
}
|
||||
if (hasattr(parent_scope, "__qualname__")) {
|
||||
const auto parent_qualname = parent_scope.attr("__qualname__").cast<std::string>();
|
||||
py_enum.attr("__qualname__") = str(parent_qualname + "." + enum_name.cast<std::string>());
|
||||
}
|
||||
parent_scope.attr(enum_name) = py_enum;
|
||||
if (export_values_flag) {
|
||||
for (auto member : members) {
|
||||
auto member_name = member[int_(0)];
|
||||
if (hasattr(parent_scope, member_name)) {
|
||||
pybind11_fail("pybind11::native_enum<...>(\"" + enum_name_encoded + "\").value(\""
|
||||
+ member_name.cast<std::string>()
|
||||
+ "\"): an object with that name is already defined");
|
||||
}
|
||||
parent_scope.attr(member_name) = py_enum[member_name];
|
||||
}
|
||||
}
|
||||
if (!class_doc.empty()) {
|
||||
py_enum.attr("__doc__") = class_doc.c_str();
|
||||
}
|
||||
for (auto doc : member_docs) {
|
||||
py_enum[doc[int_(0)]].attr("__doc__") = doc[int_(1)];
|
||||
}
|
||||
global_internals_native_enum_type_map_set_item(enum_type_index, py_enum.release().ptr());
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
@@ -0,0 +1,82 @@
|
||||
// Copyright (c) 2016-2025 The Pybind Development Team.
|
||||
// All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
#pragma once
|
||||
|
||||
// PLEASE DO NOT ADD ANY INCLUDES HERE
|
||||
|
||||
// Define some generic pybind11 helper macros for warning management.
|
||||
//
|
||||
// Note that compiler-specific push/pop pairs are baked into the
|
||||
// PYBIND11_NAMESPACE_BEGIN/PYBIND11_NAMESPACE_END pair of macros. Therefore manual
|
||||
// PYBIND11_WARNING_PUSH/PYBIND11_WARNING_POP are usually only needed in `#include` sections.
|
||||
//
|
||||
// If you find you need to suppress a warning, please try to make the suppression as local as
|
||||
// possible using these macros. Please also be sure to push/pop with the pybind11 macros. Please
|
||||
// only use compiler specifics if you need to check specific versions, e.g. Apple Clang vs. vanilla
|
||||
// Clang.
|
||||
#if defined(_MSC_VER)
|
||||
# define PYBIND11_COMPILER_MSVC
|
||||
# define PYBIND11_PRAGMA(...) __pragma(__VA_ARGS__)
|
||||
# define PYBIND11_WARNING_PUSH PYBIND11_PRAGMA(warning(push))
|
||||
# define PYBIND11_WARNING_POP PYBIND11_PRAGMA(warning(pop))
|
||||
#elif defined(__INTEL_COMPILER)
|
||||
# define PYBIND11_COMPILER_INTEL
|
||||
# define PYBIND11_PRAGMA(...) _Pragma(#__VA_ARGS__)
|
||||
# define PYBIND11_WARNING_PUSH PYBIND11_PRAGMA(warning push)
|
||||
# define PYBIND11_WARNING_POP PYBIND11_PRAGMA(warning pop)
|
||||
#elif defined(__clang__)
|
||||
# define PYBIND11_COMPILER_CLANG
|
||||
# define PYBIND11_PRAGMA(...) _Pragma(#__VA_ARGS__)
|
||||
# define PYBIND11_WARNING_PUSH PYBIND11_PRAGMA(clang diagnostic push)
|
||||
# define PYBIND11_WARNING_POP PYBIND11_PRAGMA(clang diagnostic pop)
|
||||
#elif defined(__GNUC__)
|
||||
# define PYBIND11_COMPILER_GCC
|
||||
# define PYBIND11_PRAGMA(...) _Pragma(#__VA_ARGS__)
|
||||
# define PYBIND11_WARNING_PUSH PYBIND11_PRAGMA(GCC diagnostic push)
|
||||
# define PYBIND11_WARNING_POP PYBIND11_PRAGMA(GCC diagnostic pop)
|
||||
#endif
|
||||
|
||||
#ifdef PYBIND11_COMPILER_MSVC
|
||||
# define PYBIND11_WARNING_DISABLE_MSVC(name) PYBIND11_PRAGMA(warning(disable : name))
|
||||
#else
|
||||
# define PYBIND11_WARNING_DISABLE_MSVC(name)
|
||||
#endif
|
||||
|
||||
#ifdef PYBIND11_COMPILER_CLANG
|
||||
# define PYBIND11_WARNING_DISABLE_CLANG(name) PYBIND11_PRAGMA(clang diagnostic ignored name)
|
||||
#else
|
||||
# define PYBIND11_WARNING_DISABLE_CLANG(name)
|
||||
#endif
|
||||
|
||||
#ifdef PYBIND11_COMPILER_GCC
|
||||
# define PYBIND11_WARNING_DISABLE_GCC(name) PYBIND11_PRAGMA(GCC diagnostic ignored name)
|
||||
#else
|
||||
# define PYBIND11_WARNING_DISABLE_GCC(name)
|
||||
#endif
|
||||
|
||||
#ifdef PYBIND11_COMPILER_INTEL
|
||||
# define PYBIND11_WARNING_DISABLE_INTEL(name) PYBIND11_PRAGMA(warning disable name)
|
||||
#else
|
||||
# define PYBIND11_WARNING_DISABLE_INTEL(name)
|
||||
#endif
|
||||
|
||||
#define PYBIND11_NAMESPACE_BEGIN(name) \
|
||||
namespace name { \
|
||||
PYBIND11_WARNING_PUSH
|
||||
|
||||
#define PYBIND11_NAMESPACE_END(name) \
|
||||
PYBIND11_WARNING_POP \
|
||||
}
|
||||
|
||||
// Robust support for some features and loading modules compiled against different pybind versions
|
||||
// requires forcing hidden visibility on pybind code, so we enforce this by setting the attribute
|
||||
// on the main `pybind11` namespace.
|
||||
#if !defined(PYBIND11_NAMESPACE)
|
||||
# if defined(__GNUG__) && !defined(_WIN32)
|
||||
# define PYBIND11_NAMESPACE pybind11 __attribute__((visibility("hidden")))
|
||||
# else
|
||||
# define PYBIND11_NAMESPACE pybind11
|
||||
# endif
|
||||
#endif
|
||||
378
deps_src/pybind11/include/pybind11/detail/struct_smart_holder.h
Normal file
378
deps_src/pybind11/include/pybind11/detail/struct_smart_holder.h
Normal file
@@ -0,0 +1,378 @@
|
||||
// Copyright (c) 2020-2024 The Pybind Development Team.
|
||||
// All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
/* Proof-of-Concept for smart pointer interoperability.
|
||||
|
||||
High-level aspects:
|
||||
|
||||
* Support all `unique_ptr`, `shared_ptr` interops that are feasible.
|
||||
|
||||
* Cleanly and clearly report all interops that are infeasible.
|
||||
|
||||
* Meant to fit into a `PyObject`, as a holder for C++ objects.
|
||||
|
||||
* Support a system design that makes it impossible to trigger
|
||||
C++ Undefined Behavior, especially from Python.
|
||||
|
||||
* Support a system design with clean runtime inheritance casting. From this
|
||||
it follows that the `smart_holder` needs to be type-erased (`void*`).
|
||||
|
||||
* Handling of RTTI for the type-erased held pointer is NOT implemented here.
|
||||
It is the responsibility of the caller to ensure that `static_cast<T *>`
|
||||
is well-formed when calling `as_*` member functions. Inheritance casting
|
||||
needs to be handled in a different layer (similar to the code organization
|
||||
in boost/python/object/inheritance.hpp).
|
||||
|
||||
Details:
|
||||
|
||||
* The "root holder" chosen here is a `shared_ptr<void>` (named `vptr` in this
|
||||
implementation). This choice is practically inevitable because `shared_ptr`
|
||||
has only very limited support for inspecting and accessing its deleter.
|
||||
|
||||
* If created from a raw pointer, or a `unique_ptr` without a custom deleter,
|
||||
`vptr` always uses a custom deleter, to support `unique_ptr`-like disowning.
|
||||
The custom deleters could be extended to included life-time management for
|
||||
external objects (e.g. `PyObject`).
|
||||
|
||||
* If created from an external `shared_ptr`, or a `unique_ptr` with a custom
|
||||
deleter, including life-time management for external objects is infeasible.
|
||||
|
||||
* By choice, the smart_holder is movable but not copyable, to keep the design
|
||||
simple, and to guard against accidental copying overhead.
|
||||
|
||||
* The `void_cast_raw_ptr` option is needed to make the `smart_holder` `vptr`
|
||||
member invisible to the `shared_from_this` mechanism, in case the lifetime
|
||||
of a `PyObject` is tied to the pointee.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pybind11_namespace_macros.h"
|
||||
|
||||
#include <cstring>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <type_traits>
|
||||
#include <typeinfo>
|
||||
#include <utility>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(memory)
|
||||
|
||||
// Default fallback.
|
||||
static constexpr bool type_has_shared_from_this(...) { return false; }
|
||||
|
||||
// This overload uses SFINAE to skip enable_shared_from_this checks when the
|
||||
// base is inaccessible (e.g. private inheritance).
|
||||
template <typename T>
|
||||
static auto type_has_shared_from_this(const T *ptr)
|
||||
-> decltype(static_cast<const std::enable_shared_from_this<T> *>(ptr), true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Inaccessible base → substitution failure → fallback overload selected
|
||||
template <typename T>
|
||||
static constexpr bool type_has_shared_from_this(const void *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
struct guarded_delete {
|
||||
// NOTE: PYBIND11_INTERNALS_VERSION needs to be bumped if changes are made to this struct.
|
||||
std::weak_ptr<void> released_ptr; // Trick to keep the smart_holder memory footprint small.
|
||||
std::function<void(void *)> del_fun; // Rare case.
|
||||
void (*del_ptr)(void *); // Common case.
|
||||
bool use_del_fun;
|
||||
bool armed_flag;
|
||||
guarded_delete(std::function<void(void *)> &&del_fun, bool armed_flag)
|
||||
: del_fun{std::move(del_fun)}, del_ptr{nullptr}, use_del_fun{true},
|
||||
armed_flag{armed_flag} {}
|
||||
guarded_delete(void (*del_ptr)(void *), bool armed_flag)
|
||||
: del_ptr{del_ptr}, use_del_fun{false}, armed_flag{armed_flag} {}
|
||||
void operator()(void *raw_ptr) const {
|
||||
if (armed_flag) {
|
||||
if (use_del_fun) {
|
||||
del_fun(raw_ptr);
|
||||
} else {
|
||||
del_ptr(raw_ptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
inline guarded_delete *get_guarded_delete(const std::shared_ptr<void> &ptr) {
|
||||
return std::get_deleter<guarded_delete>(ptr);
|
||||
}
|
||||
|
||||
using get_guarded_delete_fn = guarded_delete *(*) (const std::shared_ptr<void> &);
|
||||
|
||||
template <typename T, typename std::enable_if<std::is_destructible<T>::value, int>::type = 0>
|
||||
inline void std_default_delete_if_destructible(void *raw_ptr) {
|
||||
std::default_delete<T>{}(static_cast<T *>(raw_ptr));
|
||||
}
|
||||
|
||||
template <typename T, typename std::enable_if<!std::is_destructible<T>::value, int>::type = 0>
|
||||
inline void std_default_delete_if_destructible(void *) {
|
||||
// This noop operator is needed to avoid a compilation error (for `delete raw_ptr;`), but
|
||||
// throwing an exception from a destructor will std::terminate the process. Therefore the
|
||||
// runtime check for lifetime-management correctness is implemented elsewhere (in
|
||||
// ensure_pointee_is_destructible()).
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
guarded_delete make_guarded_std_default_delete(bool armed_flag) {
|
||||
return guarded_delete(std_default_delete_if_destructible<T>, armed_flag);
|
||||
}
|
||||
|
||||
template <typename T, typename D>
|
||||
struct custom_deleter {
|
||||
// NOTE: PYBIND11_INTERNALS_VERSION needs to be bumped if changes are made to this struct.
|
||||
D deleter;
|
||||
explicit custom_deleter(D &&deleter) : deleter{std::forward<D>(deleter)} {}
|
||||
void operator()(void *raw_ptr) { deleter(static_cast<T *>(raw_ptr)); }
|
||||
};
|
||||
|
||||
template <typename T, typename D>
|
||||
guarded_delete make_guarded_custom_deleter(D &&uqp_del, bool armed_flag) {
|
||||
return guarded_delete(
|
||||
std::function<void(void *)>(custom_deleter<T, D>(std::forward<D>(uqp_del))), armed_flag);
|
||||
}
|
||||
|
||||
template <typename T, typename D>
|
||||
constexpr bool uqp_del_is_std_default_delete() {
|
||||
return std::is_same<D, std::default_delete<T>>::value
|
||||
|| std::is_same<D, std::default_delete<T const>>::value;
|
||||
}
|
||||
|
||||
inline bool type_info_equal_across_dso_boundaries(const std::type_info &a,
|
||||
const std::type_info &b) {
|
||||
// RTTI pointer comparison may fail across DSOs (e.g., macOS libc++).
|
||||
// Fallback to name comparison, which is generally safe and ABI-stable enough for our use.
|
||||
return a == b || std::strcmp(a.name(), b.name()) == 0;
|
||||
}
|
||||
|
||||
struct smart_holder {
|
||||
// NOTE: PYBIND11_INTERNALS_VERSION needs to be bumped if changes are made to this struct.
|
||||
const std::type_info *rtti_uqp_del = nullptr;
|
||||
std::shared_ptr<void> vptr;
|
||||
bool vptr_is_using_noop_deleter : 1;
|
||||
bool vptr_is_using_std_default_delete : 1;
|
||||
bool vptr_is_external_shared_ptr : 1;
|
||||
bool is_populated : 1;
|
||||
bool is_disowned : 1;
|
||||
|
||||
// Design choice: smart_holder is movable but not copyable.
|
||||
smart_holder(smart_holder &&) = default;
|
||||
smart_holder(const smart_holder &) = delete;
|
||||
smart_holder &operator=(smart_holder &&) = delete;
|
||||
smart_holder &operator=(const smart_holder &) = delete;
|
||||
|
||||
smart_holder()
|
||||
: vptr_is_using_noop_deleter{false}, vptr_is_using_std_default_delete{false},
|
||||
vptr_is_external_shared_ptr{false}, is_populated{false}, is_disowned{false} {}
|
||||
|
||||
bool has_pointee() const { return vptr != nullptr; }
|
||||
|
||||
template <typename T>
|
||||
static void ensure_pointee_is_destructible(const char *context) {
|
||||
if (!std::is_destructible<T>::value) {
|
||||
throw std::invalid_argument(std::string("Pointee is not destructible (") + context
|
||||
+ ").");
|
||||
}
|
||||
}
|
||||
|
||||
void ensure_is_populated(const char *context) const {
|
||||
if (!is_populated) {
|
||||
throw std::runtime_error(std::string("Unpopulated holder (") + context + ").");
|
||||
}
|
||||
}
|
||||
void ensure_is_not_disowned(const char *context) const {
|
||||
if (is_disowned) {
|
||||
throw std::runtime_error(std::string("Holder was disowned already (") + context
|
||||
+ ").");
|
||||
}
|
||||
}
|
||||
|
||||
void ensure_vptr_is_using_std_default_delete(const char *context) const {
|
||||
if (vptr_is_external_shared_ptr) {
|
||||
throw std::invalid_argument(std::string("Cannot disown external shared_ptr (")
|
||||
+ context + ").");
|
||||
}
|
||||
if (vptr_is_using_noop_deleter) {
|
||||
throw std::invalid_argument(std::string("Cannot disown non-owning holder (") + context
|
||||
+ ").");
|
||||
}
|
||||
if (!vptr_is_using_std_default_delete) {
|
||||
throw std::invalid_argument(std::string("Cannot disown custom deleter (") + context
|
||||
+ ").");
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T, typename D>
|
||||
void ensure_compatible_uqp_del(const char *context) const {
|
||||
if (!rtti_uqp_del) {
|
||||
if (!uqp_del_is_std_default_delete<T, D>()) {
|
||||
throw std::invalid_argument(std::string("Missing unique_ptr deleter (") + context
|
||||
+ ").");
|
||||
}
|
||||
ensure_vptr_is_using_std_default_delete(context);
|
||||
return;
|
||||
}
|
||||
if (uqp_del_is_std_default_delete<T, D>() && vptr_is_using_std_default_delete) {
|
||||
return;
|
||||
}
|
||||
if (!type_info_equal_across_dso_boundaries(typeid(D), *rtti_uqp_del)) {
|
||||
throw std::invalid_argument(std::string("Incompatible unique_ptr deleter (") + context
|
||||
+ ").");
|
||||
}
|
||||
}
|
||||
|
||||
void ensure_has_pointee(const char *context) const {
|
||||
if (!has_pointee()) {
|
||||
throw std::invalid_argument(std::string("Disowned holder (") + context + ").");
|
||||
}
|
||||
}
|
||||
|
||||
void ensure_use_count_1(const char *context) const {
|
||||
if (vptr == nullptr) {
|
||||
throw std::invalid_argument(std::string("Cannot disown nullptr (") + context + ").");
|
||||
}
|
||||
// In multithreaded environments accessing use_count can lead to
|
||||
// race conditions, but in the context of Python it is a bug (elsewhere)
|
||||
// if the Global Interpreter Lock (GIL) is not being held when this code
|
||||
// is reached.
|
||||
// PYBIND11:REMINDER: This may need to be protected by a mutex in free-threaded Python.
|
||||
if (vptr.use_count() != 1) {
|
||||
throw std::invalid_argument(std::string("Cannot disown use_count != 1 (") + context
|
||||
+ ").");
|
||||
}
|
||||
}
|
||||
|
||||
void reset_vptr_deleter_armed_flag(const get_guarded_delete_fn ggd_fn, bool armed_flag) const {
|
||||
auto *gd = ggd_fn(vptr);
|
||||
if (gd == nullptr) {
|
||||
throw std::runtime_error(
|
||||
"smart_holder::reset_vptr_deleter_armed_flag() called in an invalid context.");
|
||||
}
|
||||
gd->armed_flag = armed_flag;
|
||||
}
|
||||
|
||||
// Caller is responsible for precondition: ensure_compatible_uqp_del<T, D>() must succeed.
|
||||
template <typename T, typename D>
|
||||
std::unique_ptr<D> extract_deleter(const char *context,
|
||||
const get_guarded_delete_fn ggd_fn) const {
|
||||
auto *gd = ggd_fn(vptr);
|
||||
if (gd && gd->use_del_fun) {
|
||||
const auto &custom_deleter_ptr = gd->del_fun.template target<custom_deleter<T, D>>();
|
||||
if (custom_deleter_ptr == nullptr) {
|
||||
throw std::runtime_error(
|
||||
std::string("smart_holder::extract_deleter() precondition failure (") + context
|
||||
+ ").");
|
||||
}
|
||||
static_assert(std::is_copy_constructible<D>::value,
|
||||
"Required for compatibility with smart_holder functionality.");
|
||||
return std::unique_ptr<D>(new D(custom_deleter_ptr->deleter));
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static smart_holder from_raw_ptr_unowned(void *raw_ptr) {
|
||||
smart_holder hld;
|
||||
hld.vptr.reset(raw_ptr, [](void *) {});
|
||||
hld.vptr_is_using_noop_deleter = true;
|
||||
hld.is_populated = true;
|
||||
return hld;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T *as_raw_ptr_unowned() const {
|
||||
return static_cast<T *>(vptr.get());
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static smart_holder from_raw_ptr_take_ownership(T *raw_ptr, bool void_cast_raw_ptr = false) {
|
||||
ensure_pointee_is_destructible<T>("from_raw_ptr_take_ownership");
|
||||
smart_holder hld;
|
||||
auto gd = make_guarded_std_default_delete<T>(true);
|
||||
if (void_cast_raw_ptr) {
|
||||
hld.vptr.reset(static_cast<void *>(raw_ptr), std::move(gd));
|
||||
} else {
|
||||
hld.vptr.reset(raw_ptr, std::move(gd));
|
||||
}
|
||||
hld.vptr_is_using_std_default_delete = true;
|
||||
hld.is_populated = true;
|
||||
return hld;
|
||||
}
|
||||
|
||||
// Caller is responsible for ensuring the complex preconditions
|
||||
// (see `smart_holder_type_caster_support::load_helper`).
|
||||
void disown(const get_guarded_delete_fn ggd_fn) {
|
||||
reset_vptr_deleter_armed_flag(ggd_fn, false);
|
||||
is_disowned = true;
|
||||
}
|
||||
|
||||
// Caller is responsible for ensuring the complex preconditions
|
||||
// (see `smart_holder_type_caster_support::load_helper`).
|
||||
void reclaim_disowned(const get_guarded_delete_fn ggd_fn) {
|
||||
reset_vptr_deleter_armed_flag(ggd_fn, true);
|
||||
is_disowned = false;
|
||||
}
|
||||
|
||||
// Caller is responsible for ensuring the complex preconditions
|
||||
// (see `smart_holder_type_caster_support::load_helper`).
|
||||
void release_disowned() { vptr.reset(); }
|
||||
|
||||
void ensure_can_release_ownership(const char *context = "ensure_can_release_ownership") const {
|
||||
ensure_is_not_disowned(context);
|
||||
ensure_vptr_is_using_std_default_delete(context);
|
||||
ensure_use_count_1(context);
|
||||
}
|
||||
|
||||
// Caller is responsible for ensuring the complex preconditions
|
||||
// (see `smart_holder_type_caster_support::load_helper`).
|
||||
void release_ownership(const get_guarded_delete_fn ggd_fn) {
|
||||
reset_vptr_deleter_armed_flag(ggd_fn, false);
|
||||
release_disowned();
|
||||
}
|
||||
|
||||
template <typename T, typename D>
|
||||
static smart_holder from_unique_ptr(std::unique_ptr<T, D> &&unq_ptr,
|
||||
void *void_ptr = nullptr) {
|
||||
smart_holder hld;
|
||||
hld.rtti_uqp_del = &typeid(D);
|
||||
hld.vptr_is_using_std_default_delete = uqp_del_is_std_default_delete<T, D>();
|
||||
guarded_delete gd{nullptr, false};
|
||||
if (hld.vptr_is_using_std_default_delete) {
|
||||
gd = make_guarded_std_default_delete<T>(true);
|
||||
} else {
|
||||
gd = make_guarded_custom_deleter<T, D>(std::move(unq_ptr.get_deleter()), true);
|
||||
}
|
||||
if (void_ptr != nullptr) {
|
||||
hld.vptr.reset(void_ptr, std::move(gd));
|
||||
} else {
|
||||
hld.vptr.reset(unq_ptr.get(), std::move(gd));
|
||||
}
|
||||
(void) unq_ptr.release();
|
||||
hld.is_populated = true;
|
||||
return hld;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static smart_holder from_shared_ptr(const std::shared_ptr<T> &shd_ptr) {
|
||||
smart_holder hld;
|
||||
hld.vptr = std::static_pointer_cast<void>(shd_ptr);
|
||||
hld.vptr_is_external_shared_ptr = true;
|
||||
hld.is_populated = true;
|
||||
return hld;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
std::shared_ptr<T> as_shared_ptr() const {
|
||||
return std::static_pointer_cast<T>(vptr);
|
||||
}
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(memory)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
1591
deps_src/pybind11/include/pybind11/detail/type_caster_base.h
Normal file
1591
deps_src/pybind11/include/pybind11/detail/type_caster_base.h
Normal file
File diff suppressed because it is too large
Load Diff
65
deps_src/pybind11/include/pybind11/detail/typeid.h
Normal file
65
deps_src/pybind11/include/pybind11/detail/typeid.h
Normal file
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
pybind11/detail/typeid.h: Compiler-independent access to type identifiers
|
||||
|
||||
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
|
||||
#if defined(__GNUG__)
|
||||
# include <cxxabi.h>
|
||||
#endif
|
||||
|
||||
#include "common.h"
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
/// Erase all occurrences of a substring
|
||||
inline void erase_all(std::string &string, const std::string &search) {
|
||||
for (size_t pos = 0;;) {
|
||||
pos = string.find(search, pos);
|
||||
if (pos == std::string::npos) {
|
||||
break;
|
||||
}
|
||||
string.erase(pos, search.length());
|
||||
}
|
||||
}
|
||||
|
||||
PYBIND11_NOINLINE void clean_type_id(std::string &name) {
|
||||
#if defined(__GNUG__)
|
||||
int status = 0;
|
||||
std::unique_ptr<char, void (*)(void *)> res{
|
||||
abi::__cxa_demangle(name.c_str(), nullptr, nullptr, &status), std::free};
|
||||
if (status == 0) {
|
||||
name = res.get();
|
||||
}
|
||||
#else
|
||||
detail::erase_all(name, "class ");
|
||||
detail::erase_all(name, "struct ");
|
||||
detail::erase_all(name, "enum ");
|
||||
#endif
|
||||
detail::erase_all(name, "pybind11::");
|
||||
}
|
||||
|
||||
inline std::string clean_type_id(const char *typeid_name) {
|
||||
std::string name(typeid_name);
|
||||
detail::clean_type_id(name);
|
||||
return name;
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
/// Return a string representation of a C++ type
|
||||
template <typename T>
|
||||
static std::string type_id() {
|
||||
return detail::clean_type_id(typeid(T).name());
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
@@ -0,0 +1,22 @@
|
||||
// Copyright (c) 2024 The Pybind Development Team.
|
||||
// All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "common.h"
|
||||
#include "struct_smart_holder.h"
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
using pybind11::memory::smart_holder;
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
template <typename H>
|
||||
using is_smart_holder = std::is_same<H, smart_holder>;
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
90
deps_src/pybind11/include/pybind11/detail/value_and_holder.h
Normal file
90
deps_src/pybind11/include/pybind11/detail/value_and_holder.h
Normal file
@@ -0,0 +1,90 @@
|
||||
// Copyright (c) 2016-2024 The Pybind Development Team.
|
||||
// All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <typeinfo>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
struct value_and_holder {
|
||||
instance *inst = nullptr;
|
||||
size_t index = 0u;
|
||||
const detail::type_info *type = nullptr;
|
||||
void **vh = nullptr;
|
||||
|
||||
// Main constructor for a found value/holder:
|
||||
value_and_holder(instance *i, const detail::type_info *type, size_t vpos, size_t index)
|
||||
: inst{i}, index{index}, type{type},
|
||||
vh{inst->simple_layout ? inst->simple_value_holder
|
||||
: &inst->nonsimple.values_and_holders[vpos]} {}
|
||||
|
||||
// Default constructor (used to signal a value-and-holder not found by get_value_and_holder())
|
||||
value_and_holder() = default;
|
||||
|
||||
// Used for past-the-end iterator
|
||||
explicit value_and_holder(size_t index) : index{index} {}
|
||||
|
||||
template <typename V = void>
|
||||
V *&value_ptr() const {
|
||||
return reinterpret_cast<V *&>(vh[0]);
|
||||
}
|
||||
// True if this `value_and_holder` has a non-null value pointer
|
||||
explicit operator bool() const { return value_ptr() != nullptr; }
|
||||
|
||||
template <typename H>
|
||||
H &holder() const {
|
||||
return reinterpret_cast<H &>(vh[1]);
|
||||
}
|
||||
bool holder_constructed() const {
|
||||
return inst->simple_layout
|
||||
? inst->simple_holder_constructed
|
||||
: (inst->nonsimple.status[index] & instance::status_holder_constructed) != 0u;
|
||||
}
|
||||
// NOLINTNEXTLINE(readability-make-member-function-const)
|
||||
void set_holder_constructed(bool v = true) {
|
||||
if (inst->simple_layout) {
|
||||
inst->simple_holder_constructed = v;
|
||||
} else if (v) {
|
||||
inst->nonsimple.status[index] |= instance::status_holder_constructed;
|
||||
} else {
|
||||
inst->nonsimple.status[index] &= (std::uint8_t) ~instance::status_holder_constructed;
|
||||
}
|
||||
}
|
||||
bool instance_registered() const {
|
||||
return inst->simple_layout
|
||||
? inst->simple_instance_registered
|
||||
: ((inst->nonsimple.status[index] & instance::status_instance_registered) != 0);
|
||||
}
|
||||
// NOLINTNEXTLINE(readability-make-member-function-const)
|
||||
void set_instance_registered(bool v = true) {
|
||||
if (inst->simple_layout) {
|
||||
inst->simple_instance_registered = v;
|
||||
} else if (v) {
|
||||
inst->nonsimple.status[index] |= instance::status_instance_registered;
|
||||
} else {
|
||||
inst->nonsimple.status[index] &= (std::uint8_t) ~instance::status_instance_registered;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// This is a semi-public API to check if the corresponding instance has been constructed with a
|
||||
// holder. That is, if the instance has been constructed with a holder, the `__init__` method is
|
||||
// called and the C++ object is valid. Otherwise, the C++ object might only be allocated, but not
|
||||
// initialized. This will lead to **SEGMENTATION FAULTS** if the C++ object is used in any way.
|
||||
// Example usage: https://pybind11.readthedocs.io/en/stable/advanced/classes.html#custom-type-setup
|
||||
// for `tp_traverse` and `tp_clear` implementations.
|
||||
// WARNING: The caller is responsible for ensuring that the `reinterpret_cast` is valid.
|
||||
inline bool is_holder_constructed(PyObject *obj) {
|
||||
auto *const instance = reinterpret_cast<pybind11::detail::instance *>(obj);
|
||||
return instance->get_value_and_holder().holder_constructed();
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
12
deps_src/pybind11/include/pybind11/eigen.h
Normal file
12
deps_src/pybind11/include/pybind11/eigen.h
Normal file
@@ -0,0 +1,12 @@
|
||||
/*
|
||||
pybind11/eigen.h: Transparent conversion for dense and sparse Eigen matrices
|
||||
|
||||
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "eigen/matrix.h"
|
||||
9
deps_src/pybind11/include/pybind11/eigen/common.h
Normal file
9
deps_src/pybind11/include/pybind11/eigen/common.h
Normal file
@@ -0,0 +1,9 @@
|
||||
// Copyright (c) 2023 The pybind Community.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Common message for `static_assert()`s, which are useful to easily
|
||||
// preempt much less obvious errors.
|
||||
#define PYBIND11_EIGEN_MESSAGE_POINTER_TYPES_ARE_NOT_SUPPORTED \
|
||||
"Pointer types (in particular `PyObject *`) are not supported as scalar types for Eigen " \
|
||||
"types."
|
||||
723
deps_src/pybind11/include/pybind11/eigen/matrix.h
Normal file
723
deps_src/pybind11/include/pybind11/eigen/matrix.h
Normal file
@@ -0,0 +1,723 @@
|
||||
/*
|
||||
pybind11/eigen/matrix.h: Transparent conversion for dense and sparse Eigen matrices
|
||||
|
||||
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <pybind11/numpy.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/* HINT: To suppress warnings originating from the Eigen headers, use -isystem.
|
||||
See also:
|
||||
https://stackoverflow.com/questions/2579576/i-dir-vs-isystem-dir
|
||||
https://stackoverflow.com/questions/1741816/isystem-for-ms-visual-studio-c-compiler
|
||||
*/
|
||||
PYBIND11_WARNING_PUSH
|
||||
PYBIND11_WARNING_DISABLE_MSVC(5054) // https://github.com/pybind/pybind11/pull/3741
|
||||
// C5054: operator '&': deprecated between enumerations of different types
|
||||
#if defined(__MINGW32__)
|
||||
PYBIND11_WARNING_DISABLE_GCC("-Wmaybe-uninitialized")
|
||||
#endif
|
||||
|
||||
#include <Eigen/Core>
|
||||
#include <Eigen/SparseCore>
|
||||
|
||||
PYBIND11_WARNING_POP
|
||||
|
||||
// Eigen prior to 3.2.7 doesn't have proper move constructors--but worse, some classes get implicit
|
||||
// move constructors that break things. We could detect this an explicitly copy, but an extra copy
|
||||
// of matrices seems highly undesirable.
|
||||
static_assert(EIGEN_VERSION_AT_LEAST(3, 2, 7),
|
||||
"Eigen matrix support in pybind11 requires Eigen >= 3.2.7");
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
PYBIND11_WARNING_DISABLE_MSVC(4127)
|
||||
|
||||
// Provide a convenience alias for easier pass-by-ref usage with fully dynamic strides:
|
||||
using EigenDStride = Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>;
|
||||
template <typename MatrixType>
|
||||
using EigenDRef = Eigen::Ref<MatrixType, 0, EigenDStride>;
|
||||
template <typename MatrixType>
|
||||
using EigenDMap = Eigen::Map<MatrixType, 0, EigenDStride>;
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
#if EIGEN_VERSION_AT_LEAST(3, 3, 0)
|
||||
using EigenIndex = Eigen::Index;
|
||||
template <typename Scalar, int Flags, typename StorageIndex>
|
||||
using EigenMapSparseMatrix = Eigen::Map<Eigen::SparseMatrix<Scalar, Flags, StorageIndex>>;
|
||||
#else
|
||||
using EigenIndex = EIGEN_DEFAULT_DENSE_INDEX_TYPE;
|
||||
template <typename Scalar, int Flags, typename StorageIndex>
|
||||
using EigenMapSparseMatrix = Eigen::MappedSparseMatrix<Scalar, Flags, StorageIndex>;
|
||||
#endif
|
||||
|
||||
// Matches Eigen::Map, Eigen::Ref, blocks, etc:
|
||||
template <typename T>
|
||||
using is_eigen_dense_map = all_of<is_template_base_of<Eigen::DenseBase, T>,
|
||||
std::is_base_of<Eigen::MapBase<T, Eigen::ReadOnlyAccessors>, T>>;
|
||||
template <typename T>
|
||||
using is_eigen_mutable_map = std::is_base_of<Eigen::MapBase<T, Eigen::WriteAccessors>, T>;
|
||||
template <typename T>
|
||||
using is_eigen_dense_plain
|
||||
= all_of<negation<is_eigen_dense_map<T>>, is_template_base_of<Eigen::PlainObjectBase, T>>;
|
||||
template <typename T>
|
||||
using is_eigen_sparse = is_template_base_of<Eigen::SparseMatrixBase, T>;
|
||||
// Test for objects inheriting from EigenBase<Derived> that aren't captured by the above. This
|
||||
// basically covers anything that can be assigned to a dense matrix but that don't have a typical
|
||||
// matrix data layout that can be copied from their .data(). For example, DiagonalMatrix and
|
||||
// SelfAdjointView fall into this category.
|
||||
template <typename T>
|
||||
using is_eigen_other
|
||||
= all_of<is_template_base_of<Eigen::EigenBase, T>,
|
||||
negation<any_of<is_eigen_dense_map<T>, is_eigen_dense_plain<T>, is_eigen_sparse<T>>>>;
|
||||
|
||||
// Captures numpy/eigen conformability status (returned by EigenProps::conformable()):
|
||||
template <bool EigenRowMajor>
|
||||
struct EigenConformable {
|
||||
bool conformable = false;
|
||||
EigenIndex rows = 0, cols = 0;
|
||||
EigenDStride stride{0, 0}; // Only valid if negativestrides is false!
|
||||
bool negativestrides = false; // If true, do not use stride!
|
||||
|
||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
||||
EigenConformable(bool fits = false) : conformable{fits} {}
|
||||
// Matrix type:
|
||||
EigenConformable(EigenIndex r, EigenIndex c, EigenIndex rstride, EigenIndex cstride)
|
||||
: conformable{true}, rows{r}, cols{c},
|
||||
// TODO: when Eigen bug #747 is fixed, remove the tests for non-negativity.
|
||||
// http://eigen.tuxfamily.org/bz/show_bug.cgi?id=747
|
||||
stride{EigenRowMajor ? (rstride > 0 ? rstride : 0)
|
||||
: (cstride > 0 ? cstride : 0) /* outer stride */,
|
||||
EigenRowMajor ? (cstride > 0 ? cstride : 0)
|
||||
: (rstride > 0 ? rstride : 0) /* inner stride */},
|
||||
negativestrides{rstride < 0 || cstride < 0} {}
|
||||
// Vector type:
|
||||
EigenConformable(EigenIndex r, EigenIndex c, EigenIndex stride)
|
||||
: EigenConformable(r, c, r == 1 ? c * stride : stride, c == 1 ? r : r * stride) {}
|
||||
|
||||
template <typename props>
|
||||
bool stride_compatible() const {
|
||||
// To have compatible strides, we need (on both dimensions) one of fully dynamic strides,
|
||||
// matching strides, or a dimension size of 1 (in which case the stride value is
|
||||
// irrelevant). Alternatively, if any dimension size is 0, the strides are not relevant
|
||||
// (and numpy ≥ 1.23 sets the strides to 0 in that case, so we need to check explicitly).
|
||||
if (negativestrides) {
|
||||
return false;
|
||||
}
|
||||
if (rows == 0 || cols == 0) {
|
||||
return true;
|
||||
}
|
||||
return (props::inner_stride == Eigen::Dynamic || props::inner_stride == stride.inner()
|
||||
|| (EigenRowMajor ? cols : rows) == 1)
|
||||
&& (props::outer_stride == Eigen::Dynamic || props::outer_stride == stride.outer()
|
||||
|| (EigenRowMajor ? rows : cols) == 1);
|
||||
}
|
||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
||||
operator bool() const { return conformable; }
|
||||
};
|
||||
|
||||
template <typename Type>
|
||||
struct eigen_extract_stride {
|
||||
using type = Type;
|
||||
};
|
||||
template <typename PlainObjectType, int MapOptions, typename StrideType>
|
||||
struct eigen_extract_stride<Eigen::Map<PlainObjectType, MapOptions, StrideType>> {
|
||||
using type = StrideType;
|
||||
};
|
||||
template <typename PlainObjectType, int Options, typename StrideType>
|
||||
struct eigen_extract_stride<Eigen::Ref<PlainObjectType, Options, StrideType>> {
|
||||
using type = StrideType;
|
||||
};
|
||||
|
||||
// Helper struct for extracting information from an Eigen type
|
||||
template <typename Type_>
|
||||
struct EigenProps {
|
||||
using Type = Type_;
|
||||
using Scalar = typename Type::Scalar;
|
||||
using StrideType = typename eigen_extract_stride<Type>::type;
|
||||
static constexpr EigenIndex rows = Type::RowsAtCompileTime, cols = Type::ColsAtCompileTime,
|
||||
size = Type::SizeAtCompileTime;
|
||||
static constexpr bool row_major = Type::IsRowMajor,
|
||||
vector
|
||||
= Type::IsVectorAtCompileTime, // At least one dimension has fixed size 1
|
||||
fixed_rows = rows != Eigen::Dynamic, fixed_cols = cols != Eigen::Dynamic,
|
||||
fixed = size != Eigen::Dynamic, // Fully-fixed size
|
||||
dynamic = !fixed_rows && !fixed_cols; // Fully-dynamic size
|
||||
|
||||
template <EigenIndex i, EigenIndex ifzero>
|
||||
using if_zero = std::integral_constant<EigenIndex, i == 0 ? ifzero : i>;
|
||||
static constexpr EigenIndex inner_stride
|
||||
= if_zero<StrideType::InnerStrideAtCompileTime, 1>::value,
|
||||
outer_stride = if_zero < StrideType::OuterStrideAtCompileTime,
|
||||
vector ? size
|
||||
: row_major ? cols
|
||||
: rows > ::value;
|
||||
static constexpr bool dynamic_stride
|
||||
= inner_stride == Eigen::Dynamic && outer_stride == Eigen::Dynamic;
|
||||
static constexpr bool requires_row_major
|
||||
= !dynamic_stride && !vector && (row_major ? inner_stride : outer_stride) == 1;
|
||||
static constexpr bool requires_col_major
|
||||
= !dynamic_stride && !vector && (row_major ? outer_stride : inner_stride) == 1;
|
||||
|
||||
// Takes an input array and determines whether we can make it fit into the Eigen type. If
|
||||
// the array is a vector, we attempt to fit it into either an Eigen 1xN or Nx1 vector
|
||||
// (preferring the latter if it will fit in either, i.e. for a fully dynamic matrix type).
|
||||
static EigenConformable<row_major> conformable(const array &a) {
|
||||
const auto dims = a.ndim();
|
||||
if (dims < 1 || dims > 2) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (dims == 2) { // Matrix type: require exact match (or dynamic)
|
||||
|
||||
EigenIndex np_rows = a.shape(0), np_cols = a.shape(1),
|
||||
np_rstride = a.strides(0) / static_cast<ssize_t>(sizeof(Scalar)),
|
||||
np_cstride = a.strides(1) / static_cast<ssize_t>(sizeof(Scalar));
|
||||
if ((fixed_rows && np_rows != rows) || (fixed_cols && np_cols != cols)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return {np_rows, np_cols, np_rstride, np_cstride};
|
||||
}
|
||||
|
||||
// Otherwise we're storing an n-vector. Only one of the strides will be used, but
|
||||
// whichever is used, we want the (single) numpy stride value.
|
||||
const EigenIndex n = a.shape(0),
|
||||
stride = a.strides(0) / static_cast<ssize_t>(sizeof(Scalar));
|
||||
|
||||
if (vector) { // Eigen type is a compile-time vector
|
||||
if (fixed && size != n) {
|
||||
return false; // Vector size mismatch
|
||||
}
|
||||
return {rows == 1 ? 1 : n, cols == 1 ? 1 : n, stride};
|
||||
}
|
||||
if (fixed) {
|
||||
// The type has a fixed size, but is not a vector: abort
|
||||
return false;
|
||||
}
|
||||
if (fixed_cols) {
|
||||
// Since this isn't a vector, cols must be != 1. We allow this only if it exactly
|
||||
// equals the number of elements (rows is Dynamic, and so 1 row is allowed).
|
||||
if (cols != n) {
|
||||
return false;
|
||||
}
|
||||
return {1, n, stride};
|
||||
} // Otherwise it's either fully dynamic, or column dynamic; both become a column vector
|
||||
if (fixed_rows && rows != n) {
|
||||
return false;
|
||||
}
|
||||
return {n, 1, stride};
|
||||
}
|
||||
|
||||
static constexpr bool show_writeable
|
||||
= is_eigen_dense_map<Type>::value && is_eigen_mutable_map<Type>::value;
|
||||
static constexpr bool show_order = is_eigen_dense_map<Type>::value;
|
||||
static constexpr bool show_c_contiguous = show_order && requires_row_major;
|
||||
static constexpr bool show_f_contiguous
|
||||
= !show_c_contiguous && show_order && requires_col_major;
|
||||
|
||||
static constexpr auto descriptor
|
||||
= const_name("typing.Annotated[")
|
||||
+ io_name("numpy.typing.ArrayLike, ", "numpy.typing.NDArray[")
|
||||
+ npy_format_descriptor<Scalar>::name + io_name("", "]") + const_name(", \"[")
|
||||
+ const_name<fixed_rows>(const_name<(size_t) rows>(), const_name("m")) + const_name(", ")
|
||||
+ const_name<fixed_cols>(const_name<(size_t) cols>(), const_name("n"))
|
||||
+ const_name("]\"")
|
||||
// For a reference type (e.g. Ref<MatrixXd>) we have other constraints that might need to
|
||||
// be satisfied: writeable=True (for a mutable reference), and, depending on the map's
|
||||
// stride options, possibly f_contiguous or c_contiguous. We include them in the
|
||||
// descriptor output to provide some hint as to why a TypeError is occurring (otherwise
|
||||
// it can be confusing to see that a function accepts a
|
||||
// 'typing.Annotated[numpy.typing.NDArray[numpy.float64], "[3,2]"]' and an error message
|
||||
// that you *gave* a numpy.ndarray of the right type and dimensions.
|
||||
+ const_name<show_writeable>(", \"flags.writeable\"", "")
|
||||
+ const_name<show_c_contiguous>(", \"flags.c_contiguous\"", "")
|
||||
+ const_name<show_f_contiguous>(", \"flags.f_contiguous\"", "") + const_name("]");
|
||||
};
|
||||
|
||||
// Casts an Eigen type to numpy array. If given a base, the numpy array references the src data,
|
||||
// otherwise it'll make a copy. writeable lets you turn off the writeable flag for the array.
|
||||
template <typename props>
|
||||
handle
|
||||
eigen_array_cast(typename props::Type const &src, handle base = handle(), bool writeable = true) {
|
||||
constexpr ssize_t elem_size = sizeof(typename props::Scalar);
|
||||
array a;
|
||||
if (props::vector) {
|
||||
a = array({src.size()}, {elem_size * src.innerStride()}, src.data(), base);
|
||||
} else {
|
||||
a = array({src.rows(), src.cols()},
|
||||
{elem_size * src.rowStride(), elem_size * src.colStride()},
|
||||
src.data(),
|
||||
base);
|
||||
}
|
||||
|
||||
if (!writeable) {
|
||||
array_proxy(a.ptr())->flags &= ~detail::npy_api::NPY_ARRAY_WRITEABLE_;
|
||||
}
|
||||
|
||||
return a.release();
|
||||
}
|
||||
|
||||
// Takes an lvalue ref to some Eigen type and a (python) base object, creating a numpy array that
|
||||
// reference the Eigen object's data with `base` as the python-registered base class (if omitted,
|
||||
// the base will be set to None, and lifetime management is up to the caller). The numpy array is
|
||||
// non-writeable if the given type is const.
|
||||
template <typename props, typename Type>
|
||||
handle eigen_ref_array(Type &src, handle parent = none()) {
|
||||
// none here is to get past array's should-we-copy detection, which currently always
|
||||
// copies when there is no base. Setting the base to None should be harmless.
|
||||
return eigen_array_cast<props>(src, parent, !std::is_const<Type>::value);
|
||||
}
|
||||
|
||||
// Takes a pointer to some dense, plain Eigen type, builds a capsule around it, then returns a
|
||||
// numpy array that references the encapsulated data with a python-side reference to the capsule to
|
||||
// tie its destruction to that of any dependent python objects. Const-ness is determined by
|
||||
// whether or not the Type of the pointer given is const.
|
||||
template <typename props, typename Type, typename = enable_if_t<is_eigen_dense_plain<Type>::value>>
|
||||
handle eigen_encapsulate(Type *src) {
|
||||
capsule base(src, [](void *o) { delete static_cast<Type *>(o); });
|
||||
return eigen_ref_array<props>(*src, base);
|
||||
}
|
||||
|
||||
// Type caster for regular, dense matrix types (e.g. MatrixXd), but not maps/refs/etc. of dense
|
||||
// types.
|
||||
template <typename Type>
|
||||
struct type_caster<Type, enable_if_t<is_eigen_dense_plain<Type>::value>> {
|
||||
using Scalar = typename Type::Scalar;
|
||||
static_assert(!std::is_pointer<Scalar>::value,
|
||||
PYBIND11_EIGEN_MESSAGE_POINTER_TYPES_ARE_NOT_SUPPORTED);
|
||||
using props = EigenProps<Type>;
|
||||
|
||||
bool load(handle src, bool convert) {
|
||||
// If we're in no-convert mode, only load if given an array of the correct type
|
||||
if (!convert && !isinstance<array_t<Scalar>>(src)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Coerce into an array, but don't do type conversion yet; the copy below handles it.
|
||||
auto buf = array::ensure(src);
|
||||
|
||||
if (!buf) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto dims = buf.ndim();
|
||||
if (dims < 1 || dims > 2) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto fits = props::conformable(buf);
|
||||
if (!fits) {
|
||||
return false;
|
||||
}
|
||||
|
||||
PYBIND11_WARNING_PUSH
|
||||
PYBIND11_WARNING_DISABLE_GCC("-Wmaybe-uninitialized") // See PR #5516
|
||||
// Allocate the new type, then build a numpy reference into it
|
||||
value = Type(fits.rows, fits.cols);
|
||||
PYBIND11_WARNING_POP
|
||||
auto ref = reinterpret_steal<array>(eigen_ref_array<props>(value));
|
||||
if (dims == 1) {
|
||||
ref = ref.squeeze();
|
||||
} else if (ref.ndim() == 1) {
|
||||
buf = buf.squeeze();
|
||||
}
|
||||
|
||||
int result = detail::npy_api::get().PyArray_CopyInto_(ref.ptr(), buf.ptr());
|
||||
|
||||
if (result < 0) { // Copy failed!
|
||||
PyErr_Clear();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
// Cast implementation
|
||||
template <typename CType>
|
||||
static handle cast_impl(CType *src, return_value_policy policy, handle parent) {
|
||||
switch (policy) {
|
||||
case return_value_policy::take_ownership:
|
||||
case return_value_policy::automatic:
|
||||
return eigen_encapsulate<props>(src);
|
||||
case return_value_policy::move:
|
||||
return eigen_encapsulate<props>(new CType(std::move(*src)));
|
||||
case return_value_policy::copy:
|
||||
return eigen_array_cast<props>(*src);
|
||||
case return_value_policy::reference:
|
||||
case return_value_policy::automatic_reference:
|
||||
return eigen_ref_array<props>(*src);
|
||||
case return_value_policy::reference_internal:
|
||||
return eigen_ref_array<props>(*src, parent);
|
||||
default:
|
||||
throw cast_error("unhandled return_value_policy: should not happen!");
|
||||
};
|
||||
}
|
||||
|
||||
public:
|
||||
// Normal returned non-reference, non-const value:
|
||||
static handle cast(Type &&src, return_value_policy /* policy */, handle parent) {
|
||||
return cast_impl(&src, return_value_policy::move, parent);
|
||||
}
|
||||
// If you return a non-reference const, we mark the numpy array readonly:
|
||||
static handle cast(const Type &&src, return_value_policy /* policy */, handle parent) {
|
||||
return cast_impl(&src, return_value_policy::move, parent);
|
||||
}
|
||||
// lvalue reference return; default (automatic) becomes copy
|
||||
static handle cast(Type &src, return_value_policy policy, handle parent) {
|
||||
if (policy == return_value_policy::automatic
|
||||
|| policy == return_value_policy::automatic_reference) {
|
||||
policy = return_value_policy::copy;
|
||||
}
|
||||
return cast_impl(&src, policy, parent);
|
||||
}
|
||||
// const lvalue reference return; default (automatic) becomes copy
|
||||
static handle cast(const Type &src, return_value_policy policy, handle parent) {
|
||||
if (policy == return_value_policy::automatic
|
||||
|| policy == return_value_policy::automatic_reference) {
|
||||
policy = return_value_policy::copy;
|
||||
}
|
||||
return cast(&src, policy, parent);
|
||||
}
|
||||
// non-const pointer return
|
||||
static handle cast(Type *src, return_value_policy policy, handle parent) {
|
||||
return cast_impl(src, policy, parent);
|
||||
}
|
||||
// const pointer return
|
||||
static handle cast(const Type *src, return_value_policy policy, handle parent) {
|
||||
return cast_impl(src, policy, parent);
|
||||
}
|
||||
|
||||
static constexpr auto name = props::descriptor;
|
||||
|
||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
||||
operator Type *() { return &value; }
|
||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
||||
operator Type &() { return value; }
|
||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
||||
operator Type &&() && { return std::move(value); }
|
||||
template <typename T>
|
||||
using cast_op_type = movable_cast_op_type<T>;
|
||||
|
||||
private:
|
||||
Type value;
|
||||
};
|
||||
|
||||
// Base class for casting reference/map/block/etc. objects back to python.
|
||||
template <typename MapType>
|
||||
struct eigen_map_caster {
|
||||
static_assert(!std::is_pointer<typename MapType::Scalar>::value,
|
||||
PYBIND11_EIGEN_MESSAGE_POINTER_TYPES_ARE_NOT_SUPPORTED);
|
||||
|
||||
private:
|
||||
using props = EigenProps<MapType>;
|
||||
|
||||
public:
|
||||
// Directly referencing a ref/map's data is a bit dangerous (whatever the map/ref points to has
|
||||
// to stay around), but we'll allow it under the assumption that you know what you're doing
|
||||
// (and have an appropriate keep_alive in place). We return a numpy array pointing directly at
|
||||
// the ref's data (The numpy array ends up read-only if the ref was to a const matrix type.)
|
||||
// Note that this means you need to ensure you don't destroy the object in some other way (e.g.
|
||||
// with an appropriate keep_alive, or with a reference to a statically allocated matrix).
|
||||
static handle cast(const MapType &src, return_value_policy policy, handle parent) {
|
||||
switch (policy) {
|
||||
case return_value_policy::copy:
|
||||
return eigen_array_cast<props>(src);
|
||||
case return_value_policy::reference_internal:
|
||||
return eigen_array_cast<props>(src, parent, is_eigen_mutable_map<MapType>::value);
|
||||
case return_value_policy::reference:
|
||||
case return_value_policy::automatic:
|
||||
case return_value_policy::automatic_reference:
|
||||
return eigen_array_cast<props>(src, none(), is_eigen_mutable_map<MapType>::value);
|
||||
default:
|
||||
// move, take_ownership don't make any sense for a ref/map:
|
||||
pybind11_fail("Invalid return_value_policy for Eigen Map/Ref/Block type");
|
||||
}
|
||||
}
|
||||
|
||||
// return_descr forces the use of NDArray instead of ArrayLike in args
|
||||
// since Ref<...> args can only accept arrays.
|
||||
static constexpr auto name = return_descr(props::descriptor);
|
||||
|
||||
// Explicitly delete these: support python -> C++ conversion on these (i.e. these can be return
|
||||
// types but not bound arguments). We still provide them (with an explicitly delete) so that
|
||||
// you end up here if you try anyway.
|
||||
bool load(handle, bool) = delete;
|
||||
operator MapType() = delete;
|
||||
template <typename>
|
||||
using cast_op_type = MapType;
|
||||
};
|
||||
|
||||
// We can return any map-like object (but can only load Refs, specialized next):
|
||||
template <typename Type>
|
||||
struct type_caster<Type, enable_if_t<is_eigen_dense_map<Type>::value>> : eigen_map_caster<Type> {};
|
||||
|
||||
// Loader for Ref<...> arguments. See the documentation for info on how to make this work without
|
||||
// copying (it requires some extra effort in many cases).
|
||||
template <typename PlainObjectType, typename StrideType>
|
||||
struct type_caster<
|
||||
Eigen::Ref<PlainObjectType, 0, StrideType>,
|
||||
enable_if_t<is_eigen_dense_map<Eigen::Ref<PlainObjectType, 0, StrideType>>::value>>
|
||||
: public eigen_map_caster<Eigen::Ref<PlainObjectType, 0, StrideType>> {
|
||||
private:
|
||||
using Type = Eigen::Ref<PlainObjectType, 0, StrideType>;
|
||||
using props = EigenProps<Type>;
|
||||
using Scalar = typename props::Scalar;
|
||||
static_assert(!std::is_pointer<Scalar>::value,
|
||||
PYBIND11_EIGEN_MESSAGE_POINTER_TYPES_ARE_NOT_SUPPORTED);
|
||||
using MapType = Eigen::Map<PlainObjectType, 0, StrideType>;
|
||||
using Array
|
||||
= array_t<Scalar,
|
||||
array::forcecast
|
||||
| ((props::row_major ? props::inner_stride : props::outer_stride) == 1
|
||||
? array::c_style
|
||||
: (props::row_major ? props::outer_stride : props::inner_stride) == 1
|
||||
? array::f_style
|
||||
: 0)>;
|
||||
static constexpr bool need_writeable = is_eigen_mutable_map<Type>::value;
|
||||
// Delay construction (these have no default constructor)
|
||||
std::unique_ptr<MapType> map;
|
||||
std::unique_ptr<Type> ref;
|
||||
// Our array. When possible, this is just a numpy array pointing to the source data, but
|
||||
// sometimes we can't avoid copying (e.g. input is not a numpy array at all, has an
|
||||
// incompatible layout, or is an array of a type that needs to be converted). Using a numpy
|
||||
// temporary (rather than an Eigen temporary) saves an extra copy when we need both type
|
||||
// conversion and storage order conversion. (Note that we refuse to use this temporary copy
|
||||
// when loading an argument for a Ref<M> with M non-const, i.e. a read-write reference).
|
||||
Array copy_or_ref;
|
||||
|
||||
public:
|
||||
bool load(handle src, bool convert) {
|
||||
// First check whether what we have is already an array of the right type. If not, we
|
||||
// can't avoid a copy (because the copy is also going to do type conversion).
|
||||
bool need_copy = !isinstance<Array>(src);
|
||||
|
||||
EigenConformable<props::row_major> fits;
|
||||
if (!need_copy) {
|
||||
// We don't need a converting copy, but we also need to check whether the strides are
|
||||
// compatible with the Ref's stride requirements
|
||||
auto aref = reinterpret_borrow<Array>(src);
|
||||
|
||||
if (aref && (!need_writeable || aref.writeable())) {
|
||||
fits = props::conformable(aref);
|
||||
if (!fits) {
|
||||
return false; // Incompatible dimensions
|
||||
}
|
||||
if (!fits.template stride_compatible<props>()) {
|
||||
need_copy = true;
|
||||
} else {
|
||||
copy_or_ref = std::move(aref);
|
||||
}
|
||||
} else {
|
||||
need_copy = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (need_copy) {
|
||||
// We need to copy: If we need a mutable reference, or we're not supposed to convert
|
||||
// (either because we're in the no-convert overload pass, or because we're explicitly
|
||||
// instructed not to copy (via `py::arg().noconvert()`) we have to fail loading.
|
||||
if (!convert || need_writeable) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Array copy = Array::ensure(src);
|
||||
if (!copy) {
|
||||
return false;
|
||||
}
|
||||
fits = props::conformable(copy);
|
||||
if (!fits || !fits.template stride_compatible<props>()) {
|
||||
return false;
|
||||
}
|
||||
copy_or_ref = std::move(copy);
|
||||
loader_life_support::add_patient(copy_or_ref);
|
||||
}
|
||||
|
||||
ref.reset();
|
||||
map.reset(new MapType(data(copy_or_ref),
|
||||
fits.rows,
|
||||
fits.cols,
|
||||
make_stride(fits.stride.outer(), fits.stride.inner())));
|
||||
ref.reset(new Type(*map));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
||||
operator Type *() { return ref.get(); }
|
||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
||||
operator Type &() { return *ref; }
|
||||
template <typename _T>
|
||||
using cast_op_type = pybind11::detail::cast_op_type<_T>;
|
||||
|
||||
private:
|
||||
template <typename T = Type, enable_if_t<is_eigen_mutable_map<T>::value, int> = 0>
|
||||
Scalar *data(Array &a) {
|
||||
return a.mutable_data();
|
||||
}
|
||||
|
||||
template <typename T = Type, enable_if_t<!is_eigen_mutable_map<T>::value, int> = 0>
|
||||
const Scalar *data(Array &a) {
|
||||
return a.data();
|
||||
}
|
||||
|
||||
// Attempt to figure out a constructor of `Stride` that will work.
|
||||
// If both strides are fixed, use a default constructor:
|
||||
template <typename S>
|
||||
using stride_ctor_default = bool_constant<S::InnerStrideAtCompileTime != Eigen::Dynamic
|
||||
&& S::OuterStrideAtCompileTime != Eigen::Dynamic
|
||||
&& std::is_default_constructible<S>::value>;
|
||||
// Otherwise, if there is a two-index constructor, assume it is (outer,inner) like
|
||||
// Eigen::Stride, and use it:
|
||||
template <typename S>
|
||||
using stride_ctor_dual
|
||||
= bool_constant<!stride_ctor_default<S>::value
|
||||
&& std::is_constructible<S, EigenIndex, EigenIndex>::value>;
|
||||
// Otherwise, if there is a one-index constructor, and just one of the strides is dynamic, use
|
||||
// it (passing whichever stride is dynamic).
|
||||
template <typename S>
|
||||
using stride_ctor_outer
|
||||
= bool_constant<!any_of<stride_ctor_default<S>, stride_ctor_dual<S>>::value
|
||||
&& S::OuterStrideAtCompileTime == Eigen::Dynamic
|
||||
&& S::InnerStrideAtCompileTime != Eigen::Dynamic
|
||||
&& std::is_constructible<S, EigenIndex>::value>;
|
||||
template <typename S>
|
||||
using stride_ctor_inner
|
||||
= bool_constant<!any_of<stride_ctor_default<S>, stride_ctor_dual<S>>::value
|
||||
&& S::InnerStrideAtCompileTime == Eigen::Dynamic
|
||||
&& S::OuterStrideAtCompileTime != Eigen::Dynamic
|
||||
&& std::is_constructible<S, EigenIndex>::value>;
|
||||
|
||||
template <typename S = StrideType, enable_if_t<stride_ctor_default<S>::value, int> = 0>
|
||||
static S make_stride(EigenIndex, EigenIndex) {
|
||||
return S();
|
||||
}
|
||||
template <typename S = StrideType, enable_if_t<stride_ctor_dual<S>::value, int> = 0>
|
||||
static S make_stride(EigenIndex outer, EigenIndex inner) {
|
||||
return S(outer, inner);
|
||||
}
|
||||
template <typename S = StrideType, enable_if_t<stride_ctor_outer<S>::value, int> = 0>
|
||||
static S make_stride(EigenIndex outer, EigenIndex) {
|
||||
return S(outer);
|
||||
}
|
||||
template <typename S = StrideType, enable_if_t<stride_ctor_inner<S>::value, int> = 0>
|
||||
static S make_stride(EigenIndex, EigenIndex inner) {
|
||||
return S(inner);
|
||||
}
|
||||
};
|
||||
|
||||
// type_caster for special matrix types (e.g. DiagonalMatrix), which are EigenBase, but not
|
||||
// EigenDense (i.e. they don't have a data(), at least not with the usual matrix layout).
|
||||
// load() is not supported, but we can cast them into the python domain by first copying to a
|
||||
// regular Eigen::Matrix, then casting that.
|
||||
template <typename Type>
|
||||
struct type_caster<Type, enable_if_t<is_eigen_other<Type>::value>> {
|
||||
static_assert(!std::is_pointer<typename Type::Scalar>::value,
|
||||
PYBIND11_EIGEN_MESSAGE_POINTER_TYPES_ARE_NOT_SUPPORTED);
|
||||
|
||||
protected:
|
||||
using Matrix
|
||||
= Eigen::Matrix<typename Type::Scalar, Type::RowsAtCompileTime, Type::ColsAtCompileTime>;
|
||||
using props = EigenProps<Matrix>;
|
||||
|
||||
public:
|
||||
static handle cast(const Type &src, return_value_policy /* policy */, handle /* parent */) {
|
||||
handle h = eigen_encapsulate<props>(new Matrix(src));
|
||||
return h;
|
||||
}
|
||||
static handle cast(const Type *src, return_value_policy policy, handle parent) {
|
||||
return cast(*src, policy, parent);
|
||||
}
|
||||
|
||||
static constexpr auto name = props::descriptor;
|
||||
|
||||
// Explicitly delete these: support python -> C++ conversion on these (i.e. these can be return
|
||||
// types but not bound arguments). We still provide them (with an explicitly delete) so that
|
||||
// you end up here if you try anyway.
|
||||
bool load(handle, bool) = delete;
|
||||
operator Type() = delete;
|
||||
template <typename>
|
||||
using cast_op_type = Type;
|
||||
};
|
||||
|
||||
template <typename Type>
|
||||
struct type_caster<Type, enable_if_t<is_eigen_sparse<Type>::value>> {
|
||||
using Scalar = typename Type::Scalar;
|
||||
static_assert(!std::is_pointer<Scalar>::value,
|
||||
PYBIND11_EIGEN_MESSAGE_POINTER_TYPES_ARE_NOT_SUPPORTED);
|
||||
using StorageIndex = remove_reference_t<decltype(*std::declval<Type>().outerIndexPtr())>;
|
||||
using Index = typename Type::Index;
|
||||
static constexpr bool rowMajor = Type::IsRowMajor;
|
||||
|
||||
bool load(handle src, bool) {
|
||||
if (!src) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto obj = reinterpret_borrow<object>(src);
|
||||
object sparse_module = module_::import("scipy.sparse");
|
||||
object matrix_type = sparse_module.attr(rowMajor ? "csr_matrix" : "csc_matrix");
|
||||
|
||||
if (!type::handle_of(obj).is(matrix_type)) {
|
||||
try {
|
||||
obj = matrix_type(obj);
|
||||
} catch (const error_already_set &) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
auto values = array_t<Scalar>((object) obj.attr("data"));
|
||||
auto innerIndices = array_t<StorageIndex>((object) obj.attr("indices"));
|
||||
auto outerIndices = array_t<StorageIndex>((object) obj.attr("indptr"));
|
||||
auto shape = pybind11::tuple((pybind11::object) obj.attr("shape"));
|
||||
auto nnz = obj.attr("nnz").cast<Index>();
|
||||
|
||||
if (!values || !innerIndices || !outerIndices) {
|
||||
return false;
|
||||
}
|
||||
|
||||
value = EigenMapSparseMatrix<Scalar,
|
||||
Type::Flags &(Eigen::RowMajor | Eigen::ColMajor),
|
||||
StorageIndex>(shape[0].cast<Index>(),
|
||||
shape[1].cast<Index>(),
|
||||
std::move(nnz),
|
||||
outerIndices.mutable_data(),
|
||||
innerIndices.mutable_data(),
|
||||
values.mutable_data());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static handle cast(const Type &src, return_value_policy /* policy */, handle /* parent */) {
|
||||
const_cast<Type &>(src).makeCompressed();
|
||||
|
||||
object matrix_type
|
||||
= module_::import("scipy.sparse").attr(rowMajor ? "csr_matrix" : "csc_matrix");
|
||||
|
||||
array data(src.nonZeros(), src.valuePtr());
|
||||
array outerIndices((rowMajor ? src.rows() : src.cols()) + 1, src.outerIndexPtr());
|
||||
array innerIndices(src.nonZeros(), src.innerIndexPtr());
|
||||
|
||||
return matrix_type(pybind11::make_tuple(
|
||||
std::move(data), std::move(innerIndices), std::move(outerIndices)),
|
||||
pybind11::make_tuple(src.rows(), src.cols()))
|
||||
.release();
|
||||
}
|
||||
|
||||
PYBIND11_TYPE_CASTER(Type,
|
||||
const_name<(Type::IsRowMajor) != 0>("scipy.sparse.csr_matrix[",
|
||||
"scipy.sparse.csc_matrix[")
|
||||
+ npy_format_descriptor<Scalar>::name + const_name("]"));
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
521
deps_src/pybind11/include/pybind11/eigen/tensor.h
Normal file
521
deps_src/pybind11/include/pybind11/eigen/tensor.h
Normal file
@@ -0,0 +1,521 @@
|
||||
/*
|
||||
pybind11/eigen/tensor.h: Transparent conversion for Eigen tensors
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <pybind11/numpy.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER)
|
||||
static_assert(__GNUC__ > 5, "Eigen Tensor support in pybind11 requires GCC > 5.0");
|
||||
#endif
|
||||
|
||||
// Disable warnings for Eigen
|
||||
PYBIND11_WARNING_PUSH
|
||||
PYBIND11_WARNING_DISABLE_MSVC(4554)
|
||||
PYBIND11_WARNING_DISABLE_MSVC(4127)
|
||||
#if defined(__MINGW32__)
|
||||
PYBIND11_WARNING_DISABLE_GCC("-Wmaybe-uninitialized")
|
||||
#endif
|
||||
|
||||
#include <unsupported/Eigen/CXX11/Tensor>
|
||||
|
||||
PYBIND11_WARNING_POP
|
||||
|
||||
static_assert(EIGEN_VERSION_AT_LEAST(3, 3, 0),
|
||||
"Eigen Tensor support in pybind11 requires Eigen >= 3.3.0");
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
PYBIND11_WARNING_DISABLE_MSVC(4127)
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
inline bool is_tensor_aligned(const void *data) {
|
||||
return (reinterpret_cast<std::size_t>(data) % EIGEN_DEFAULT_ALIGN_BYTES) == 0;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
constexpr int compute_array_flag_from_tensor() {
|
||||
static_assert((static_cast<int>(T::Layout) == static_cast<int>(Eigen::RowMajor))
|
||||
|| (static_cast<int>(T::Layout) == static_cast<int>(Eigen::ColMajor)),
|
||||
"Layout must be row or column major");
|
||||
return (static_cast<int>(T::Layout) == static_cast<int>(Eigen::RowMajor)) ? array::c_style
|
||||
: array::f_style;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
struct eigen_tensor_helper {};
|
||||
|
||||
template <typename Scalar_, int NumIndices_, int Options_, typename IndexType>
|
||||
struct eigen_tensor_helper<Eigen::Tensor<Scalar_, NumIndices_, Options_, IndexType>> {
|
||||
using Type = Eigen::Tensor<Scalar_, NumIndices_, Options_, IndexType>;
|
||||
using ValidType = void;
|
||||
|
||||
static Eigen::DSizes<typename Type::Index, Type::NumIndices> get_shape(const Type &f) {
|
||||
return f.dimensions();
|
||||
}
|
||||
|
||||
static constexpr bool
|
||||
is_correct_shape(const Eigen::DSizes<typename Type::Index, Type::NumIndices> & /*shape*/) {
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
struct helper {};
|
||||
|
||||
template <size_t... Is>
|
||||
struct helper<index_sequence<Is...>> {
|
||||
static constexpr auto value = ::pybind11::detail::concat(const_name(((void) Is, "?"))...);
|
||||
};
|
||||
|
||||
static constexpr auto dimensions_descriptor
|
||||
= helper<decltype(make_index_sequence<Type::NumIndices>())>::value;
|
||||
|
||||
template <typename... Args>
|
||||
static Type *alloc(Args &&...args) {
|
||||
return new Type(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
static void free(Type *tensor) { delete tensor; }
|
||||
};
|
||||
|
||||
template <typename Scalar_, typename std::ptrdiff_t... Indices, int Options_, typename IndexType>
|
||||
struct eigen_tensor_helper<
|
||||
Eigen::TensorFixedSize<Scalar_, Eigen::Sizes<Indices...>, Options_, IndexType>> {
|
||||
using Type = Eigen::TensorFixedSize<Scalar_, Eigen::Sizes<Indices...>, Options_, IndexType>;
|
||||
using ValidType = void;
|
||||
|
||||
static constexpr Eigen::DSizes<typename Type::Index, Type::NumIndices>
|
||||
get_shape(const Type & /*f*/) {
|
||||
return get_shape();
|
||||
}
|
||||
|
||||
static constexpr Eigen::DSizes<typename Type::Index, Type::NumIndices> get_shape() {
|
||||
return Eigen::DSizes<typename Type::Index, Type::NumIndices>(Indices...);
|
||||
}
|
||||
|
||||
static bool
|
||||
is_correct_shape(const Eigen::DSizes<typename Type::Index, Type::NumIndices> &shape) {
|
||||
return get_shape() == shape;
|
||||
}
|
||||
|
||||
static constexpr auto dimensions_descriptor
|
||||
= ::pybind11::detail::concat(const_name<Indices>()...);
|
||||
|
||||
template <typename... Args>
|
||||
static Type *alloc(Args &&...args) {
|
||||
Eigen::aligned_allocator<Type> allocator;
|
||||
return ::new (allocator.allocate(1)) Type(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
static void free(Type *tensor) {
|
||||
Eigen::aligned_allocator<Type> allocator;
|
||||
tensor->~Type();
|
||||
allocator.deallocate(tensor, 1);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Type, bool ShowDetails, bool NeedsWriteable = false>
|
||||
struct get_tensor_descriptor {
|
||||
static constexpr auto details
|
||||
= const_name<NeedsWriteable>(", \"flags.writeable\"", "") + const_name
|
||||
< static_cast<int>(Type::Layout)
|
||||
== static_cast<int>(Eigen::RowMajor)
|
||||
> (", \"flags.c_contiguous\"", ", \"flags.f_contiguous\"");
|
||||
static constexpr auto value
|
||||
= const_name("typing.Annotated[")
|
||||
+ io_name("numpy.typing.ArrayLike, ", "numpy.typing.NDArray[")
|
||||
+ npy_format_descriptor<typename Type::Scalar>::name + io_name("", "]")
|
||||
+ const_name(", \"[") + eigen_tensor_helper<remove_cv_t<Type>>::dimensions_descriptor
|
||||
+ const_name("]\"") + const_name<ShowDetails>(details, const_name("")) + const_name("]");
|
||||
};
|
||||
|
||||
// When EIGEN_AVOID_STL_ARRAY is defined, Eigen::DSizes<T, 0> does not have the begin() member
|
||||
// function. Falling back to a simple loop works around this issue.
|
||||
//
|
||||
// We need to disable the type-limits warning for the inner loop when size = 0.
|
||||
|
||||
PYBIND11_WARNING_PUSH
|
||||
PYBIND11_WARNING_DISABLE_GCC("-Wtype-limits")
|
||||
|
||||
template <typename T, int size>
|
||||
std::vector<T> convert_dsizes_to_vector(const Eigen::DSizes<T, size> &arr) {
|
||||
std::vector<T> result(size);
|
||||
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
result[i] = arr[i];
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T, int size>
|
||||
Eigen::DSizes<T, size> get_shape_for_array(const array &arr) {
|
||||
Eigen::DSizes<T, size> result;
|
||||
const T *shape = arr.shape();
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
result[i] = shape[i];
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
PYBIND11_WARNING_POP
|
||||
|
||||
template <typename Type>
|
||||
struct type_caster<Type, typename eigen_tensor_helper<Type>::ValidType> {
|
||||
static_assert(!std::is_pointer<typename Type::Scalar>::value,
|
||||
PYBIND11_EIGEN_MESSAGE_POINTER_TYPES_ARE_NOT_SUPPORTED);
|
||||
using Helper = eigen_tensor_helper<Type>;
|
||||
static constexpr auto temp_name = get_tensor_descriptor<Type, false>::value;
|
||||
PYBIND11_TYPE_CASTER(Type, temp_name);
|
||||
|
||||
bool load(handle src, bool convert) {
|
||||
if (!convert) {
|
||||
if (!isinstance<array>(src)) {
|
||||
return false;
|
||||
}
|
||||
array temp = array::ensure(src);
|
||||
if (!temp) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!temp.dtype().is(dtype::of<typename Type::Scalar>())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
array_t<typename Type::Scalar, compute_array_flag_from_tensor<Type>()> arr(
|
||||
reinterpret_borrow<object>(src));
|
||||
|
||||
if (arr.ndim() != Type::NumIndices) {
|
||||
return false;
|
||||
}
|
||||
auto shape = get_shape_for_array<typename Type::Index, Type::NumIndices>(arr);
|
||||
|
||||
if (!Helper::is_correct_shape(shape)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
#if EIGEN_VERSION_AT_LEAST(3, 4, 0)
|
||||
auto data_pointer = arr.data();
|
||||
#else
|
||||
// Handle Eigen bug
|
||||
auto data_pointer = const_cast<typename Type::Scalar *>(arr.data());
|
||||
#endif
|
||||
|
||||
if (is_tensor_aligned(arr.data())) {
|
||||
value = Eigen::TensorMap<const Type, Eigen::Aligned>(data_pointer, shape);
|
||||
} else {
|
||||
value = Eigen::TensorMap<const Type>(data_pointer, shape);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static handle cast(Type &&src, return_value_policy policy, handle parent) {
|
||||
if (policy == return_value_policy::reference
|
||||
|| policy == return_value_policy::reference_internal) {
|
||||
pybind11_fail("Cannot use a reference return value policy for an rvalue");
|
||||
}
|
||||
return cast_impl(&src, return_value_policy::move, parent);
|
||||
}
|
||||
|
||||
static handle cast(const Type &&src, return_value_policy policy, handle parent) {
|
||||
if (policy == return_value_policy::reference
|
||||
|| policy == return_value_policy::reference_internal) {
|
||||
pybind11_fail("Cannot use a reference return value policy for an rvalue");
|
||||
}
|
||||
return cast_impl(&src, return_value_policy::move, parent);
|
||||
}
|
||||
|
||||
static handle cast(Type &src, return_value_policy policy, handle parent) {
|
||||
if (policy == return_value_policy::automatic
|
||||
|| policy == return_value_policy::automatic_reference) {
|
||||
policy = return_value_policy::copy;
|
||||
}
|
||||
return cast_impl(&src, policy, parent);
|
||||
}
|
||||
|
||||
static handle cast(const Type &src, return_value_policy policy, handle parent) {
|
||||
if (policy == return_value_policy::automatic
|
||||
|| policy == return_value_policy::automatic_reference) {
|
||||
policy = return_value_policy::copy;
|
||||
}
|
||||
return cast(&src, policy, parent);
|
||||
}
|
||||
|
||||
static handle cast(Type *src, return_value_policy policy, handle parent) {
|
||||
if (policy == return_value_policy::automatic) {
|
||||
policy = return_value_policy::take_ownership;
|
||||
} else if (policy == return_value_policy::automatic_reference) {
|
||||
policy = return_value_policy::reference;
|
||||
}
|
||||
return cast_impl(src, policy, parent);
|
||||
}
|
||||
|
||||
static handle cast(const Type *src, return_value_policy policy, handle parent) {
|
||||
if (policy == return_value_policy::automatic) {
|
||||
policy = return_value_policy::take_ownership;
|
||||
} else if (policy == return_value_policy::automatic_reference) {
|
||||
policy = return_value_policy::reference;
|
||||
}
|
||||
return cast_impl(src, policy, parent);
|
||||
}
|
||||
|
||||
template <typename C>
|
||||
static handle cast_impl(C *src, return_value_policy policy, handle parent) {
|
||||
object parent_object;
|
||||
bool writeable = false;
|
||||
switch (policy) {
|
||||
case return_value_policy::move:
|
||||
if (std::is_const<C>::value) {
|
||||
pybind11_fail("Cannot move from a constant reference");
|
||||
}
|
||||
|
||||
src = Helper::alloc(std::move(*src));
|
||||
|
||||
parent_object
|
||||
= capsule(src, [](void *ptr) { Helper::free(reinterpret_cast<Type *>(ptr)); });
|
||||
writeable = true;
|
||||
break;
|
||||
|
||||
case return_value_policy::take_ownership:
|
||||
if (std::is_const<C>::value) {
|
||||
// This cast is ugly, and might be UB in some cases, but we don't have an
|
||||
// alternative here as we must free that memory
|
||||
Helper::free(const_cast<Type *>(src));
|
||||
pybind11_fail("Cannot take ownership of a const reference");
|
||||
}
|
||||
|
||||
parent_object
|
||||
= capsule(src, [](void *ptr) { Helper::free(reinterpret_cast<Type *>(ptr)); });
|
||||
writeable = true;
|
||||
break;
|
||||
|
||||
case return_value_policy::copy:
|
||||
writeable = true;
|
||||
break;
|
||||
|
||||
case return_value_policy::reference:
|
||||
parent_object = none();
|
||||
writeable = !std::is_const<C>::value;
|
||||
break;
|
||||
|
||||
case return_value_policy::reference_internal:
|
||||
// Default should do the right thing
|
||||
if (!parent) {
|
||||
pybind11_fail("Cannot use reference internal when there is no parent");
|
||||
}
|
||||
parent_object = reinterpret_borrow<object>(parent);
|
||||
writeable = !std::is_const<C>::value;
|
||||
break;
|
||||
|
||||
default:
|
||||
pybind11_fail("pybind11 bug in eigen.h, please file a bug report");
|
||||
}
|
||||
|
||||
auto result = array_t<typename Type::Scalar, compute_array_flag_from_tensor<Type>()>(
|
||||
convert_dsizes_to_vector(Helper::get_shape(*src)), src->data(), parent_object);
|
||||
|
||||
if (!writeable) {
|
||||
array_proxy(result.ptr())->flags &= ~detail::npy_api::NPY_ARRAY_WRITEABLE_;
|
||||
}
|
||||
|
||||
return result.release();
|
||||
}
|
||||
};
|
||||
|
||||
template <typename StoragePointerType,
|
||||
bool needs_writeable,
|
||||
enable_if_t<!needs_writeable, bool> = true>
|
||||
StoragePointerType get_array_data_for_type(array &arr) {
|
||||
#if EIGEN_VERSION_AT_LEAST(3, 4, 0)
|
||||
return reinterpret_cast<StoragePointerType>(arr.data());
|
||||
#else
|
||||
// Handle Eigen bug
|
||||
return reinterpret_cast<StoragePointerType>(const_cast<void *>(arr.data()));
|
||||
#endif
|
||||
}
|
||||
|
||||
template <typename StoragePointerType,
|
||||
bool needs_writeable,
|
||||
enable_if_t<needs_writeable, bool> = true>
|
||||
StoragePointerType get_array_data_for_type(array &arr) {
|
||||
return reinterpret_cast<StoragePointerType>(arr.mutable_data());
|
||||
}
|
||||
|
||||
template <typename T, typename = void>
|
||||
struct get_storage_pointer_type;
|
||||
|
||||
template <typename MapType>
|
||||
struct get_storage_pointer_type<MapType, void_t<typename MapType::StoragePointerType>> {
|
||||
using SPT = typename MapType::StoragePointerType;
|
||||
};
|
||||
|
||||
template <typename MapType>
|
||||
struct get_storage_pointer_type<MapType, void_t<typename MapType::PointerArgType>> {
|
||||
using SPT = typename MapType::PointerArgType;
|
||||
};
|
||||
|
||||
template <typename Type, int Options>
|
||||
struct type_caster<Eigen::TensorMap<Type, Options>,
|
||||
typename eigen_tensor_helper<remove_cv_t<Type>>::ValidType> {
|
||||
static_assert(!std::is_pointer<typename Type::Scalar>::value,
|
||||
PYBIND11_EIGEN_MESSAGE_POINTER_TYPES_ARE_NOT_SUPPORTED);
|
||||
using MapType = Eigen::TensorMap<Type, Options>;
|
||||
using Helper = eigen_tensor_helper<remove_cv_t<Type>>;
|
||||
|
||||
bool load(handle src, bool /*convert*/) {
|
||||
// Note that we have a lot more checks here as we want to make sure to avoid copies
|
||||
if (!isinstance<array>(src)) {
|
||||
return false;
|
||||
}
|
||||
auto arr = reinterpret_borrow<array>(src);
|
||||
if ((arr.flags() & compute_array_flag_from_tensor<Type>()) == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!arr.dtype().is(dtype::of<typename Type::Scalar>())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (arr.ndim() != Type::NumIndices) {
|
||||
return false;
|
||||
}
|
||||
|
||||
constexpr bool is_aligned = (Options & Eigen::Aligned) != 0;
|
||||
|
||||
if (is_aligned && !is_tensor_aligned(arr.data())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto shape = get_shape_for_array<typename Type::Index, Type::NumIndices>(arr);
|
||||
|
||||
if (!Helper::is_correct_shape(shape)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (needs_writeable && !arr.writeable()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto result = get_array_data_for_type<typename get_storage_pointer_type<MapType>::SPT,
|
||||
needs_writeable>(arr);
|
||||
|
||||
value.reset(new MapType(std::move(result), std::move(shape)));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static handle cast(MapType &&src, return_value_policy policy, handle parent) {
|
||||
return cast_impl(&src, policy, parent);
|
||||
}
|
||||
|
||||
static handle cast(const MapType &&src, return_value_policy policy, handle parent) {
|
||||
return cast_impl(&src, policy, parent);
|
||||
}
|
||||
|
||||
static handle cast(MapType &src, return_value_policy policy, handle parent) {
|
||||
if (policy == return_value_policy::automatic
|
||||
|| policy == return_value_policy::automatic_reference) {
|
||||
policy = return_value_policy::copy;
|
||||
}
|
||||
return cast_impl(&src, policy, parent);
|
||||
}
|
||||
|
||||
static handle cast(const MapType &src, return_value_policy policy, handle parent) {
|
||||
if (policy == return_value_policy::automatic
|
||||
|| policy == return_value_policy::automatic_reference) {
|
||||
policy = return_value_policy::copy;
|
||||
}
|
||||
return cast(&src, policy, parent);
|
||||
}
|
||||
|
||||
static handle cast(MapType *src, return_value_policy policy, handle parent) {
|
||||
if (policy == return_value_policy::automatic) {
|
||||
policy = return_value_policy::take_ownership;
|
||||
} else if (policy == return_value_policy::automatic_reference) {
|
||||
policy = return_value_policy::reference;
|
||||
}
|
||||
return cast_impl(src, policy, parent);
|
||||
}
|
||||
|
||||
static handle cast(const MapType *src, return_value_policy policy, handle parent) {
|
||||
if (policy == return_value_policy::automatic) {
|
||||
policy = return_value_policy::take_ownership;
|
||||
} else if (policy == return_value_policy::automatic_reference) {
|
||||
policy = return_value_policy::reference;
|
||||
}
|
||||
return cast_impl(src, policy, parent);
|
||||
}
|
||||
|
||||
template <typename C>
|
||||
static handle cast_impl(C *src, return_value_policy policy, handle parent) {
|
||||
object parent_object;
|
||||
constexpr bool writeable = !std::is_const<C>::value;
|
||||
switch (policy) {
|
||||
case return_value_policy::reference:
|
||||
parent_object = none();
|
||||
break;
|
||||
|
||||
case return_value_policy::reference_internal:
|
||||
// Default should do the right thing
|
||||
if (!parent) {
|
||||
pybind11_fail("Cannot use reference internal when there is no parent");
|
||||
}
|
||||
parent_object = reinterpret_borrow<object>(parent);
|
||||
break;
|
||||
|
||||
default:
|
||||
// move, take_ownership don't make any sense for a ref/map:
|
||||
pybind11_fail("Invalid return_value_policy for Eigen Map type, must be either "
|
||||
"reference or reference_internal");
|
||||
}
|
||||
|
||||
auto result = array_t<typename Type::Scalar, compute_array_flag_from_tensor<Type>()>(
|
||||
convert_dsizes_to_vector(Helper::get_shape(*src)),
|
||||
src->data(),
|
||||
std::move(parent_object));
|
||||
|
||||
if (!writeable) {
|
||||
array_proxy(result.ptr())->flags &= ~detail::npy_api::NPY_ARRAY_WRITEABLE_;
|
||||
}
|
||||
|
||||
return result.release();
|
||||
}
|
||||
|
||||
#if EIGEN_VERSION_AT_LEAST(3, 4, 0)
|
||||
|
||||
static constexpr bool needs_writeable = !std::is_const<typename std::remove_pointer<
|
||||
typename get_storage_pointer_type<MapType>::SPT>::type>::value;
|
||||
#else
|
||||
// Handle Eigen bug
|
||||
static constexpr bool needs_writeable = !std::is_const<Type>::value;
|
||||
#endif
|
||||
|
||||
protected:
|
||||
// TODO: Move to std::optional once std::optional has more support
|
||||
std::unique_ptr<MapType> value;
|
||||
|
||||
public:
|
||||
// return_descr forces the use of NDArray instead of ArrayLike since refs can only reference
|
||||
// arrays
|
||||
static constexpr auto name
|
||||
= return_descr(get_tensor_descriptor<Type, true, needs_writeable>::value);
|
||||
explicit operator MapType *() { return value.get(); }
|
||||
explicit operator MapType &() { return *value; }
|
||||
explicit operator MapType &&() && { return std::move(*value); }
|
||||
|
||||
template <typename T_>
|
||||
using cast_op_type = ::pybind11::detail::movable_cast_op_type<T_>;
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
320
deps_src/pybind11/include/pybind11/embed.h
Normal file
320
deps_src/pybind11/include/pybind11/embed.h
Normal file
@@ -0,0 +1,320 @@
|
||||
/*
|
||||
pybind11/embed.h: Support for embedding the interpreter
|
||||
|
||||
Copyright (c) 2017 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pybind11.h"
|
||||
#include "eval.h"
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#if defined(PYPY_VERSION)
|
||||
# error Embedding the interpreter is not supported with PyPy
|
||||
#endif
|
||||
|
||||
#define PYBIND11_EMBEDDED_MODULE_IMPL(name) \
|
||||
extern "C" PyObject *pybind11_init_impl_##name(); \
|
||||
extern "C" PyObject *pybind11_init_impl_##name() { return pybind11_init_wrapper_##name(); }
|
||||
|
||||
/** \rst
|
||||
Add a new module to the table of builtins for the interpreter. Must be
|
||||
defined in global scope. The first macro parameter is the name of the
|
||||
module (without quotes). The second parameter is the variable which will
|
||||
be used as the interface to add functions and classes to the module.
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
PYBIND11_EMBEDDED_MODULE(example, m) {
|
||||
// ... initialize functions and classes here
|
||||
m.def("foo", []() {
|
||||
return "Hello, World!";
|
||||
});
|
||||
}
|
||||
|
||||
The third and subsequent macro arguments are optional, and can be used to
|
||||
mark the module as supporting various Python features.
|
||||
|
||||
- ``mod_gil_not_used()``
|
||||
- ``multiple_interpreters::per_interpreter_gil()``
|
||||
- ``multiple_interpreters::shared_gil()``
|
||||
- ``multiple_interpreters::not_supported()``
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
PYBIND11_EMBEDDED_MODULE(example, m, py::mod_gil_not_used()) {
|
||||
m.def("foo", []() {
|
||||
return "Hello, Free-threaded World!";
|
||||
});
|
||||
}
|
||||
|
||||
\endrst */
|
||||
PYBIND11_WARNING_PUSH
|
||||
PYBIND11_WARNING_DISABLE_CLANG("-Wgnu-zero-variadic-macro-arguments")
|
||||
#define PYBIND11_EMBEDDED_MODULE(name, variable, ...) \
|
||||
PYBIND11_MODULE_PYINIT(name, {}, ##__VA_ARGS__) \
|
||||
::pybind11::detail::embedded_module PYBIND11_CONCAT(pybind11_module_, name)( \
|
||||
PYBIND11_TOSTRING(name), PYBIND11_CONCAT(PyInit_, name)); \
|
||||
PYBIND11_MODULE_EXEC(name, variable)
|
||||
PYBIND11_WARNING_POP
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
/// Python 2.7/3.x compatible version of `PyImport_AppendInittab` and error checks.
|
||||
struct embedded_module {
|
||||
using init_t = PyObject *(*) ();
|
||||
embedded_module(const char *name, init_t init) {
|
||||
if (Py_IsInitialized() != 0) {
|
||||
pybind11_fail("Can't add new modules after the interpreter has been initialized");
|
||||
}
|
||||
|
||||
auto result = PyImport_AppendInittab(name, init);
|
||||
if (result == -1) {
|
||||
pybind11_fail("Insufficient memory to add a new module");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
struct wide_char_arg_deleter {
|
||||
void operator()(wchar_t *ptr) const {
|
||||
// API docs: https://docs.python.org/3/c-api/sys.html#c.Py_DecodeLocale
|
||||
PyMem_RawFree(ptr);
|
||||
}
|
||||
};
|
||||
|
||||
inline wchar_t *widen_chars(const char *safe_arg) {
|
||||
wchar_t *widened_arg = Py_DecodeLocale(safe_arg, nullptr);
|
||||
return widened_arg;
|
||||
}
|
||||
|
||||
inline void precheck_interpreter() {
|
||||
if (Py_IsInitialized() != 0) {
|
||||
pybind11_fail("The interpreter is already running");
|
||||
}
|
||||
}
|
||||
|
||||
#if !defined(PYBIND11_PYCONFIG_SUPPORT_PY_VERSION_HEX)
|
||||
# define PYBIND11_PYCONFIG_SUPPORT_PY_VERSION_HEX (0x03080000)
|
||||
#endif
|
||||
|
||||
#if PY_VERSION_HEX < PYBIND11_PYCONFIG_SUPPORT_PY_VERSION_HEX
|
||||
inline void initialize_interpreter_pre_pyconfig(bool init_signal_handlers,
|
||||
int argc,
|
||||
const char *const *argv,
|
||||
bool add_program_dir_to_path) {
|
||||
detail::precheck_interpreter();
|
||||
Py_InitializeEx(init_signal_handlers ? 1 : 0);
|
||||
|
||||
auto argv_size = static_cast<size_t>(argc);
|
||||
// SetArgv* on python 3 takes wchar_t, so we have to convert.
|
||||
std::unique_ptr<wchar_t *[]> widened_argv(new wchar_t *[argv_size]);
|
||||
std::vector<std::unique_ptr<wchar_t[], detail::wide_char_arg_deleter>> widened_argv_entries;
|
||||
widened_argv_entries.reserve(argv_size);
|
||||
for (size_t ii = 0; ii < argv_size; ++ii) {
|
||||
widened_argv_entries.emplace_back(detail::widen_chars(argv[ii]));
|
||||
if (!widened_argv_entries.back()) {
|
||||
// A null here indicates a character-encoding failure or the python
|
||||
// interpreter out of memory. Give up.
|
||||
return;
|
||||
}
|
||||
widened_argv[ii] = widened_argv_entries.back().get();
|
||||
}
|
||||
|
||||
auto *pysys_argv = widened_argv.get();
|
||||
|
||||
PySys_SetArgvEx(argc, pysys_argv, static_cast<int>(add_program_dir_to_path));
|
||||
}
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
#if PY_VERSION_HEX >= PYBIND11_PYCONFIG_SUPPORT_PY_VERSION_HEX
|
||||
inline void initialize_interpreter(PyConfig *config,
|
||||
int argc = 0,
|
||||
const char *const *argv = nullptr,
|
||||
bool add_program_dir_to_path = true) {
|
||||
detail::precheck_interpreter();
|
||||
PyStatus status = PyConfig_SetBytesArgv(config, argc, const_cast<char *const *>(argv));
|
||||
if (PyStatus_Exception(status) != 0) {
|
||||
// A failure here indicates a character-encoding failure or the python
|
||||
// interpreter out of memory. Give up.
|
||||
PyConfig_Clear(config);
|
||||
throw std::runtime_error(PyStatus_IsError(status) != 0 ? status.err_msg
|
||||
: "Failed to prepare CPython");
|
||||
}
|
||||
status = Py_InitializeFromConfig(config);
|
||||
if (PyStatus_Exception(status) != 0) {
|
||||
PyConfig_Clear(config);
|
||||
throw std::runtime_error(PyStatus_IsError(status) != 0 ? status.err_msg
|
||||
: "Failed to init CPython");
|
||||
}
|
||||
if (add_program_dir_to_path) {
|
||||
PyRun_SimpleString("import sys, os.path; "
|
||||
"sys.path.insert(0, "
|
||||
"os.path.abspath(os.path.dirname(sys.argv[0])) "
|
||||
"if sys.argv and os.path.exists(sys.argv[0]) else '')");
|
||||
}
|
||||
PyConfig_Clear(config);
|
||||
}
|
||||
#endif
|
||||
|
||||
/** \rst
|
||||
Initialize the Python interpreter. No other pybind11 or CPython API functions can be
|
||||
called before this is done; with the exception of `PYBIND11_EMBEDDED_MODULE`. The
|
||||
optional `init_signal_handlers` parameter can be used to skip the registration of
|
||||
signal handlers (see the `Python documentation`_ for details). Calling this function
|
||||
again after the interpreter has already been initialized is a fatal error.
|
||||
|
||||
If initializing the Python interpreter fails, then the program is terminated. (This
|
||||
is controlled by the CPython runtime and is an exception to pybind11's normal behavior
|
||||
of throwing exceptions on errors.)
|
||||
|
||||
The remaining optional parameters, `argc`, `argv`, and `add_program_dir_to_path` are
|
||||
used to populate ``sys.argv`` and ``sys.path``.
|
||||
See the |PySys_SetArgvEx documentation|_ for details.
|
||||
|
||||
.. _Python documentation: https://docs.python.org/3/c-api/init.html#c.Py_InitializeEx
|
||||
.. |PySys_SetArgvEx documentation| replace:: ``PySys_SetArgvEx`` documentation
|
||||
.. _PySys_SetArgvEx documentation: https://docs.python.org/3/c-api/init.html#c.PySys_SetArgvEx
|
||||
\endrst */
|
||||
inline void initialize_interpreter(bool init_signal_handlers = true,
|
||||
int argc = 0,
|
||||
const char *const *argv = nullptr,
|
||||
bool add_program_dir_to_path = true) {
|
||||
#if PY_VERSION_HEX < PYBIND11_PYCONFIG_SUPPORT_PY_VERSION_HEX
|
||||
detail::initialize_interpreter_pre_pyconfig(
|
||||
init_signal_handlers, argc, argv, add_program_dir_to_path);
|
||||
#else
|
||||
PyConfig config;
|
||||
PyConfig_InitPythonConfig(&config);
|
||||
// See PR #4473 for background
|
||||
config.parse_argv = 0;
|
||||
|
||||
config.install_signal_handlers = init_signal_handlers ? 1 : 0;
|
||||
initialize_interpreter(&config, argc, argv, add_program_dir_to_path);
|
||||
#endif
|
||||
|
||||
// There is exactly one interpreter alive currently.
|
||||
detail::get_num_interpreters_seen() = 1;
|
||||
}
|
||||
|
||||
/** \rst
|
||||
Shut down the Python interpreter. No pybind11 or CPython API functions can be called
|
||||
after this. In addition, pybind11 objects must not outlive the interpreter:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
{ // BAD
|
||||
py::initialize_interpreter();
|
||||
auto hello = py::str("Hello, World!");
|
||||
py::finalize_interpreter();
|
||||
} // <-- BOOM, hello's destructor is called after interpreter shutdown
|
||||
|
||||
{ // GOOD
|
||||
py::initialize_interpreter();
|
||||
{ // scoped
|
||||
auto hello = py::str("Hello, World!");
|
||||
} // <-- OK, hello is cleaned up properly
|
||||
py::finalize_interpreter();
|
||||
}
|
||||
|
||||
{ // BETTER
|
||||
py::scoped_interpreter guard{};
|
||||
auto hello = py::str("Hello, World!");
|
||||
}
|
||||
|
||||
.. warning::
|
||||
|
||||
The interpreter can be restarted by calling `initialize_interpreter` again.
|
||||
Modules created using pybind11 can be safely re-initialized. However, Python
|
||||
itself cannot completely unload binary extension modules and there are several
|
||||
caveats with regard to interpreter restarting. All the details can be found
|
||||
in the CPython documentation. In short, not all interpreter memory may be
|
||||
freed, either due to reference cycles or user-created global data.
|
||||
|
||||
\endrst */
|
||||
inline void finalize_interpreter() {
|
||||
// get rid of any thread-local interpreter cache that currently exists
|
||||
if (detail::get_num_interpreters_seen() > 1) {
|
||||
detail::get_internals_pp_manager().unref();
|
||||
detail::get_local_internals_pp_manager().unref();
|
||||
|
||||
// We know there can be no other interpreter alive now, so we can lower the count
|
||||
detail::get_num_interpreters_seen() = 1;
|
||||
}
|
||||
|
||||
// Re-fetch the internals pointer-to-pointer (but not the internals itself, which might not
|
||||
// exist). It's possible for the internals to be created during Py_Finalize() (e.g. if a
|
||||
// py::capsule calls `get_internals()` during destruction), so we get the pointer-pointer here
|
||||
// and check it after Py_Finalize().
|
||||
detail::get_internals_pp_manager().get_pp();
|
||||
detail::get_local_internals_pp_manager().get_pp();
|
||||
|
||||
Py_Finalize();
|
||||
|
||||
detail::get_internals_pp_manager().destroy();
|
||||
|
||||
// Local internals contains data managed by the current interpreter, so we must clear them to
|
||||
// avoid undefined behaviors when initializing another interpreter
|
||||
detail::get_local_internals_pp_manager().destroy();
|
||||
|
||||
// We know there is no interpreter alive now, so we can reset the count
|
||||
detail::get_num_interpreters_seen() = 0;
|
||||
}
|
||||
|
||||
/** \rst
|
||||
Scope guard version of `initialize_interpreter` and `finalize_interpreter`.
|
||||
This a move-only guard and only a single instance can exist.
|
||||
|
||||
See `initialize_interpreter` for a discussion of its constructor arguments.
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
#include <pybind11/embed.h>
|
||||
|
||||
int main() {
|
||||
py::scoped_interpreter guard{};
|
||||
py::print(Hello, World!);
|
||||
} // <-- interpreter shutdown
|
||||
\endrst */
|
||||
class scoped_interpreter {
|
||||
public:
|
||||
explicit scoped_interpreter(bool init_signal_handlers = true,
|
||||
int argc = 0,
|
||||
const char *const *argv = nullptr,
|
||||
bool add_program_dir_to_path = true) {
|
||||
initialize_interpreter(init_signal_handlers, argc, argv, add_program_dir_to_path);
|
||||
}
|
||||
|
||||
#if PY_VERSION_HEX >= PYBIND11_PYCONFIG_SUPPORT_PY_VERSION_HEX
|
||||
explicit scoped_interpreter(PyConfig *config,
|
||||
int argc = 0,
|
||||
const char *const *argv = nullptr,
|
||||
bool add_program_dir_to_path = true) {
|
||||
initialize_interpreter(config, argc, argv, add_program_dir_to_path);
|
||||
}
|
||||
#endif
|
||||
|
||||
scoped_interpreter(const scoped_interpreter &) = delete;
|
||||
scoped_interpreter(scoped_interpreter &&other) noexcept { other.is_valid = false; }
|
||||
scoped_interpreter &operator=(const scoped_interpreter &) = delete;
|
||||
scoped_interpreter &operator=(scoped_interpreter &&) = delete;
|
||||
|
||||
~scoped_interpreter() {
|
||||
if (is_valid) {
|
||||
finalize_interpreter();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool is_valid = true;
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
161
deps_src/pybind11/include/pybind11/eval.h
Normal file
161
deps_src/pybind11/include/pybind11/eval.h
Normal file
@@ -0,0 +1,161 @@
|
||||
/*
|
||||
pybind11/eval.h: Support for evaluating Python expressions and statements
|
||||
from strings and files
|
||||
|
||||
Copyright (c) 2016 Klemens Morgenstern <klemens.morgenstern@ed-chemnitz.de> and
|
||||
Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pybind11.h"
|
||||
|
||||
#include <utility>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
inline void ensure_builtins_in_globals(object &global) {
|
||||
#if defined(PYPY_VERSION)
|
||||
// Running exec and eval adds `builtins` module under `__builtins__` key to
|
||||
// globals if not yet present. Python 3.8 made PyRun_String behave
|
||||
// similarly. Let's also do that for older versions, for consistency. This
|
||||
// was missing from PyPy3.8 7.3.7.
|
||||
if (!global.contains("__builtins__"))
|
||||
global["__builtins__"] = module_::import(PYBIND11_BUILTINS_MODULE);
|
||||
#else
|
||||
(void) global;
|
||||
#endif
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
enum eval_mode {
|
||||
/// Evaluate a string containing an isolated expression
|
||||
eval_expr,
|
||||
|
||||
/// Evaluate a string containing a single statement. Returns \c none
|
||||
eval_single_statement,
|
||||
|
||||
/// Evaluate a string containing a sequence of statement. Returns \c none
|
||||
eval_statements
|
||||
};
|
||||
|
||||
template <eval_mode mode = eval_expr>
|
||||
object eval(const str &expr, object global = globals(), object local = object()) {
|
||||
if (!local) {
|
||||
local = global;
|
||||
}
|
||||
|
||||
detail::ensure_builtins_in_globals(global);
|
||||
|
||||
/* PyRun_String does not accept a PyObject / encoding specifier,
|
||||
this seems to be the only alternative */
|
||||
std::string buffer = "# -*- coding: utf-8 -*-\n" + (std::string) expr;
|
||||
|
||||
int start = 0;
|
||||
switch (mode) {
|
||||
case eval_expr:
|
||||
start = Py_eval_input;
|
||||
break;
|
||||
case eval_single_statement:
|
||||
start = Py_single_input;
|
||||
break;
|
||||
case eval_statements:
|
||||
start = Py_file_input;
|
||||
break;
|
||||
default:
|
||||
pybind11_fail("invalid evaluation mode");
|
||||
}
|
||||
|
||||
PyObject *result = PyRun_String(buffer.c_str(), start, global.ptr(), local.ptr());
|
||||
if (!result) {
|
||||
throw error_already_set();
|
||||
}
|
||||
return reinterpret_steal<object>(result);
|
||||
}
|
||||
|
||||
template <eval_mode mode = eval_expr, size_t N>
|
||||
object eval(const char (&s)[N], object global = globals(), object local = object()) {
|
||||
/* Support raw string literals by removing common leading whitespace */
|
||||
auto expr = (s[0] == '\n') ? str(module_::import("textwrap").attr("dedent")(s)) : str(s);
|
||||
return eval<mode>(expr, std::move(global), std::move(local));
|
||||
}
|
||||
|
||||
inline void exec(const str &expr, object global = globals(), object local = object()) {
|
||||
eval<eval_statements>(expr, std::move(global), std::move(local));
|
||||
}
|
||||
|
||||
template <size_t N>
|
||||
void exec(const char (&s)[N], object global = globals(), object local = object()) {
|
||||
eval<eval_statements>(s, std::move(global), std::move(local));
|
||||
}
|
||||
|
||||
#if defined(PYPY_VERSION) || defined(GRAALVM_PYTHON)
|
||||
template <eval_mode mode = eval_statements>
|
||||
object eval_file(str, object, object) {
|
||||
pybind11_fail("eval_file not supported in this interpreter. Use eval");
|
||||
}
|
||||
template <eval_mode mode = eval_statements>
|
||||
object eval_file(str, object) {
|
||||
pybind11_fail("eval_file not supported in this interpreter. Use eval");
|
||||
}
|
||||
template <eval_mode mode = eval_statements>
|
||||
object eval_file(str) {
|
||||
pybind11_fail("eval_file not supported in this interpreter. Use eval");
|
||||
}
|
||||
#else
|
||||
template <eval_mode mode = eval_statements>
|
||||
object eval_file(str fname, object global = globals(), object local = object()) {
|
||||
if (!local) {
|
||||
local = global;
|
||||
}
|
||||
|
||||
detail::ensure_builtins_in_globals(global);
|
||||
|
||||
int start = 0;
|
||||
switch (mode) {
|
||||
case eval_expr:
|
||||
start = Py_eval_input;
|
||||
break;
|
||||
case eval_single_statement:
|
||||
start = Py_single_input;
|
||||
break;
|
||||
case eval_statements:
|
||||
start = Py_file_input;
|
||||
break;
|
||||
default:
|
||||
pybind11_fail("invalid evaluation mode");
|
||||
}
|
||||
|
||||
int closeFile = 1;
|
||||
std::string fname_str = (std::string) fname;
|
||||
FILE *f =
|
||||
# if PY_VERSION_HEX >= 0x030E0000
|
||||
Py_fopen(fname.ptr(), "r");
|
||||
# else
|
||||
_Py_fopen_obj(fname.ptr(), "r");
|
||||
# endif
|
||||
if (!f) {
|
||||
PyErr_Clear();
|
||||
pybind11_fail("File \"" + fname_str + "\" could not be opened!");
|
||||
}
|
||||
|
||||
if (!global.contains("__file__")) {
|
||||
global["__file__"] = std::move(fname);
|
||||
}
|
||||
|
||||
PyObject *result
|
||||
= PyRun_FileEx(f, fname_str.c_str(), start, global.ptr(), local.ptr(), closeFile);
|
||||
|
||||
if (!result) {
|
||||
throw error_already_set();
|
||||
}
|
||||
return reinterpret_steal<object>(result);
|
||||
}
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
147
deps_src/pybind11/include/pybind11/functional.h
Normal file
147
deps_src/pybind11/include/pybind11/functional.h
Normal file
@@ -0,0 +1,147 @@
|
||||
/*
|
||||
pybind11/functional.h: std::function<> support
|
||||
|
||||
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pybind11.h"
|
||||
|
||||
#include <functional>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
PYBIND11_NAMESPACE_BEGIN(type_caster_std_function_specializations)
|
||||
|
||||
// ensure GIL is held during functor destruction
|
||||
struct func_handle {
|
||||
function f;
|
||||
#if !(defined(_MSC_VER) && _MSC_VER == 1916 && defined(PYBIND11_CPP17))
|
||||
// This triggers a syntax error under very special conditions (very weird indeed).
|
||||
explicit
|
||||
#endif
|
||||
func_handle(function &&f_) noexcept
|
||||
: f(std::move(f_)) {
|
||||
}
|
||||
func_handle(const func_handle &f_) { operator=(f_); }
|
||||
func_handle &operator=(const func_handle &f_) {
|
||||
gil_scoped_acquire acq;
|
||||
f = f_.f;
|
||||
return *this;
|
||||
}
|
||||
~func_handle() {
|
||||
gil_scoped_acquire acq;
|
||||
function kill_f(std::move(f));
|
||||
}
|
||||
};
|
||||
|
||||
// to emulate 'move initialization capture' in C++11
|
||||
struct func_wrapper_base {
|
||||
func_handle hfunc;
|
||||
explicit func_wrapper_base(func_handle &&hf) noexcept : hfunc(hf) {}
|
||||
};
|
||||
|
||||
template <typename Return, typename... Args>
|
||||
struct func_wrapper : func_wrapper_base {
|
||||
using func_wrapper_base::func_wrapper_base;
|
||||
Return operator()(Args... args) const { // NOLINT(performance-unnecessary-value-param)
|
||||
gil_scoped_acquire acq;
|
||||
// casts the returned object as a rvalue to the return type
|
||||
return hfunc.f(std::forward<Args>(args)...).template cast<Return>();
|
||||
}
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(type_caster_std_function_specializations)
|
||||
|
||||
template <typename Return, typename... Args>
|
||||
struct type_caster<std::function<Return(Args...)>> {
|
||||
using type = std::function<Return(Args...)>;
|
||||
using retval_type = conditional_t<std::is_same<Return, void>::value, void_type, Return>;
|
||||
using function_type = Return (*)(Args...);
|
||||
|
||||
public:
|
||||
bool load(handle src, bool convert) {
|
||||
if (src.is_none()) {
|
||||
// Defer accepting None to other overloads (if we aren't in convert mode):
|
||||
if (!convert) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!isinstance<function>(src)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto func = reinterpret_borrow<function>(src);
|
||||
|
||||
/*
|
||||
When passing a C++ function as an argument to another C++
|
||||
function via Python, every function call would normally involve
|
||||
a full C++ -> Python -> C++ roundtrip, which can be prohibitive.
|
||||
Here, we try to at least detect the case where the function is
|
||||
stateless (i.e. function pointer or lambda function without
|
||||
captured variables), in which case the roundtrip can be avoided.
|
||||
*/
|
||||
if (auto cfunc = func.cpp_function()) {
|
||||
auto *cfunc_self = PyCFunction_GET_SELF(cfunc.ptr());
|
||||
if (cfunc_self == nullptr) {
|
||||
PyErr_Clear();
|
||||
} else {
|
||||
function_record *rec = function_record_ptr_from_PyObject(cfunc_self);
|
||||
while (rec != nullptr) {
|
||||
if (rec->is_stateless
|
||||
&& same_type(typeid(function_type),
|
||||
*reinterpret_cast<const std::type_info *>(rec->data[1]))) {
|
||||
struct capture {
|
||||
function_type f;
|
||||
|
||||
static capture *from_data(void **data) {
|
||||
return PYBIND11_STD_LAUNDER(reinterpret_cast<capture *>(data));
|
||||
}
|
||||
};
|
||||
PYBIND11_ENSURE_PRECONDITION_FOR_FUNCTIONAL_H_PERFORMANCE_OPTIMIZATIONS(
|
||||
std::is_standard_layout<capture>::value);
|
||||
value = capture::from_data(rec->data)->f;
|
||||
return true;
|
||||
}
|
||||
rec = rec->next;
|
||||
}
|
||||
}
|
||||
// PYPY segfaults here when passing builtin function like sum.
|
||||
// Raising an fail exception here works to prevent the segfault, but only on gcc.
|
||||
// See PR #1413 for full details
|
||||
}
|
||||
|
||||
value = type_caster_std_function_specializations::func_wrapper<Return, Args...>(
|
||||
type_caster_std_function_specializations::func_handle(std::move(func)));
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename Func>
|
||||
static handle cast(Func &&f_, return_value_policy policy, handle /* parent */) {
|
||||
if (!f_) {
|
||||
return none().release();
|
||||
}
|
||||
|
||||
auto result = f_.template target<function_type>();
|
||||
if (result) {
|
||||
return cpp_function(*result, policy).release();
|
||||
}
|
||||
return cpp_function(std::forward<Func>(f_), policy).release();
|
||||
}
|
||||
|
||||
PYBIND11_TYPE_CASTER(
|
||||
type,
|
||||
const_name("collections.abc.Callable[[")
|
||||
+ ::pybind11::detail::concat(::pybind11::detail::arg_descr(make_caster<Args>::name)...)
|
||||
+ const_name("], ") + ::pybind11::detail::return_descr(make_caster<retval_type>::name)
|
||||
+ const_name("]"));
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
199
deps_src/pybind11/include/pybind11/gil.h
Normal file
199
deps_src/pybind11/include/pybind11/gil.h
Normal file
@@ -0,0 +1,199 @@
|
||||
/*
|
||||
pybind11/gil.h: RAII helpers for managing the GIL
|
||||
|
||||
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if defined(PYBIND11_SIMPLE_GIL_MANAGEMENT)
|
||||
|
||||
# include "detail/common.h"
|
||||
# include "gil_simple.h"
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
using gil_scoped_acquire = gil_scoped_acquire_simple;
|
||||
using gil_scoped_release = gil_scoped_release_simple;
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
|
||||
#else
|
||||
|
||||
# include "detail/common.h"
|
||||
# include "detail/internals.h"
|
||||
|
||||
# include <cassert>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
PYBIND11_WARNING_PUSH
|
||||
PYBIND11_WARNING_DISABLE_GCC("-Wredundant-decls")
|
||||
|
||||
// forward declarations
|
||||
PyThreadState *get_thread_state_unchecked();
|
||||
|
||||
PYBIND11_WARNING_POP
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
/* The functions below essentially reproduce the PyGILState_* API using a RAII
|
||||
* pattern, but there are a few important differences:
|
||||
*
|
||||
* 1. When acquiring the GIL from an non-main thread during the finalization
|
||||
* phase, the GILState API blindly terminates the calling thread, which
|
||||
* is often not what is wanted. This API does not do this.
|
||||
*
|
||||
* 2. The gil_scoped_release function can optionally cut the relationship
|
||||
* of a PyThreadState and its associated thread, which allows moving it to
|
||||
* another thread (this is a fairly rare/advanced use case).
|
||||
*
|
||||
* 3. The reference count of an acquired thread state can be controlled. This
|
||||
* can be handy to prevent cases where callbacks issued from an external
|
||||
* thread would otherwise constantly construct and destroy thread state data
|
||||
* structures.
|
||||
*
|
||||
* See the Python bindings of NanoGUI (http://github.com/wjakob/nanogui) for an
|
||||
* example which uses features 2 and 3 to migrate the Python thread of
|
||||
* execution to another thread (to run the event loop on the original thread,
|
||||
* in this case).
|
||||
*/
|
||||
|
||||
class gil_scoped_acquire {
|
||||
public:
|
||||
PYBIND11_NOINLINE gil_scoped_acquire() {
|
||||
auto &internals = detail::get_internals();
|
||||
tstate = internals.tstate.get();
|
||||
|
||||
if (!tstate) {
|
||||
/* Check if the GIL was acquired using the PyGILState_* API instead (e.g. if
|
||||
calling from a Python thread). Since we use a different key, this ensures
|
||||
we don't create a new thread state and deadlock in PyEval_AcquireThread
|
||||
below. Note we don't save this state with internals.tstate, since we don't
|
||||
create it we would fail to clear it (its reference count should be > 0). */
|
||||
tstate = PyGILState_GetThisThreadState();
|
||||
}
|
||||
|
||||
if (!tstate) {
|
||||
tstate = PyThreadState_New(internals.istate);
|
||||
# if defined(PYBIND11_DETAILED_ERROR_MESSAGES)
|
||||
if (!tstate) {
|
||||
pybind11_fail("scoped_acquire: could not create thread state!");
|
||||
}
|
||||
# endif
|
||||
tstate->gilstate_counter = 0;
|
||||
internals.tstate = tstate;
|
||||
} else {
|
||||
release = detail::get_thread_state_unchecked() != tstate;
|
||||
}
|
||||
|
||||
if (release) {
|
||||
PyEval_AcquireThread(tstate);
|
||||
}
|
||||
|
||||
inc_ref();
|
||||
}
|
||||
|
||||
gil_scoped_acquire(const gil_scoped_acquire &) = delete;
|
||||
gil_scoped_acquire &operator=(const gil_scoped_acquire &) = delete;
|
||||
|
||||
void inc_ref() { ++tstate->gilstate_counter; }
|
||||
|
||||
PYBIND11_NOINLINE void dec_ref() {
|
||||
--tstate->gilstate_counter;
|
||||
# if defined(PYBIND11_DETAILED_ERROR_MESSAGES)
|
||||
if (detail::get_thread_state_unchecked() != tstate) {
|
||||
pybind11_fail("scoped_acquire::dec_ref(): thread state must be current!");
|
||||
}
|
||||
if (tstate->gilstate_counter < 0) {
|
||||
pybind11_fail("scoped_acquire::dec_ref(): reference count underflow!");
|
||||
}
|
||||
# endif
|
||||
if (tstate->gilstate_counter == 0) {
|
||||
# if defined(PYBIND11_DETAILED_ERROR_MESSAGES)
|
||||
if (!release) {
|
||||
pybind11_fail("scoped_acquire::dec_ref(): internal error!");
|
||||
}
|
||||
# endif
|
||||
PyThreadState_Clear(tstate);
|
||||
if (active) {
|
||||
PyThreadState_DeleteCurrent();
|
||||
}
|
||||
detail::get_internals().tstate.reset();
|
||||
release = false;
|
||||
}
|
||||
}
|
||||
|
||||
/// This method will disable the PyThreadState_DeleteCurrent call and the
|
||||
/// GIL won't be released. This method should be used if the interpreter
|
||||
/// could be shutting down when this is called, as thread deletion is not
|
||||
/// allowed during shutdown. Check _Py_IsFinalizing() on Python 3.7+, and
|
||||
/// protect subsequent code.
|
||||
PYBIND11_NOINLINE void disarm() { active = false; }
|
||||
|
||||
PYBIND11_NOINLINE ~gil_scoped_acquire() {
|
||||
dec_ref();
|
||||
if (release) {
|
||||
PyEval_SaveThread();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
PyThreadState *tstate = nullptr;
|
||||
bool release = true;
|
||||
bool active = true;
|
||||
};
|
||||
|
||||
class gil_scoped_release {
|
||||
public:
|
||||
// PRECONDITION: The GIL must be held when this constructor is called.
|
||||
explicit gil_scoped_release(bool disassoc = false) : disassoc(disassoc) {
|
||||
assert(PyGILState_Check());
|
||||
// `get_internals()` must be called here unconditionally in order to initialize
|
||||
// `internals.tstate` for subsequent `gil_scoped_acquire` calls. Otherwise, an
|
||||
// initialization race could occur as multiple threads try `gil_scoped_acquire`.
|
||||
auto &internals = detail::get_internals();
|
||||
// NOLINTNEXTLINE(cppcoreguidelines-prefer-member-initializer)
|
||||
tstate = PyEval_SaveThread();
|
||||
if (disassoc) {
|
||||
internals.tstate.reset();
|
||||
}
|
||||
}
|
||||
|
||||
gil_scoped_release(const gil_scoped_release &) = delete;
|
||||
gil_scoped_release &operator=(const gil_scoped_release &) = delete;
|
||||
|
||||
/// This method will disable the PyThreadState_DeleteCurrent call and the
|
||||
/// GIL won't be acquired. This method should be used if the interpreter
|
||||
/// could be shutting down when this is called, as thread deletion is not
|
||||
/// allowed during shutdown. Check _Py_IsFinalizing() on Python 3.7+, and
|
||||
/// protect subsequent code.
|
||||
PYBIND11_NOINLINE void disarm() { active = false; }
|
||||
|
||||
~gil_scoped_release() {
|
||||
if (!tstate) {
|
||||
return;
|
||||
}
|
||||
// `PyEval_RestoreThread()` should not be called if runtime is finalizing
|
||||
if (active) {
|
||||
PyEval_RestoreThread(tstate);
|
||||
}
|
||||
if (disassoc) {
|
||||
detail::get_internals().tstate = tstate;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
PyThreadState *tstate;
|
||||
bool disassoc;
|
||||
bool active = true;
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
|
||||
#endif // !PYBIND11_SIMPLE_GIL_MANAGEMENT
|
||||
102
deps_src/pybind11/include/pybind11/gil_safe_call_once.h
Normal file
102
deps_src/pybind11/include/pybind11/gil_safe_call_once.h
Normal file
@@ -0,0 +1,102 @@
|
||||
// Copyright (c) 2023 The pybind Community.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "detail/common.h"
|
||||
#include "gil.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <mutex>
|
||||
|
||||
#ifdef Py_GIL_DISABLED
|
||||
# include <atomic>
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
// Use the `gil_safe_call_once_and_store` class below instead of the naive
|
||||
//
|
||||
// static auto imported_obj = py::module_::import("module_name"); // BAD, DO NOT USE!
|
||||
//
|
||||
// which has two serious issues:
|
||||
//
|
||||
// 1. Py_DECREF() calls potentially after the Python interpreter was finalized already, and
|
||||
// 2. deadlocks in multi-threaded processes (because of missing lock ordering).
|
||||
//
|
||||
// The following alternative avoids both problems:
|
||||
//
|
||||
// PYBIND11_CONSTINIT static py::gil_safe_call_once_and_store<py::object> storage;
|
||||
// auto &imported_obj = storage // Do NOT make this `static`!
|
||||
// .call_once_and_store_result([]() {
|
||||
// return py::module_::import("module_name");
|
||||
// })
|
||||
// .get_stored();
|
||||
//
|
||||
// The parameter of `call_once_and_store_result()` must be callable. It can make
|
||||
// CPython API calls, and in particular, it can temporarily release the GIL.
|
||||
//
|
||||
// `T` can be any C++ type, it does not have to involve CPython API types.
|
||||
//
|
||||
// The behavior with regard to signals, e.g. `SIGINT` (`KeyboardInterrupt`),
|
||||
// is not ideal. If the main thread is the one to actually run the `Callable`,
|
||||
// then a `KeyboardInterrupt` will interrupt it if it is running normal Python
|
||||
// code. The situation is different if a non-main thread runs the
|
||||
// `Callable`, and then the main thread starts waiting for it to complete:
|
||||
// a `KeyboardInterrupt` will not interrupt the non-main thread, but it will
|
||||
// get processed only when it is the main thread's turn again and it is running
|
||||
// normal Python code. However, this will be unnoticeable for quick call-once
|
||||
// functions, which is usually the case.
|
||||
//
|
||||
// For in-depth background, see docs/advanced/deadlock.md
|
||||
template <typename T>
|
||||
class gil_safe_call_once_and_store {
|
||||
public:
|
||||
// PRECONDITION: The GIL must be held when `call_once_and_store_result()` is called.
|
||||
template <typename Callable>
|
||||
gil_safe_call_once_and_store &call_once_and_store_result(Callable &&fn) {
|
||||
if (!is_initialized_) { // This read is guarded by the GIL.
|
||||
// Multiple threads may enter here, because the GIL is released in the next line and
|
||||
// CPython API calls in the `fn()` call below may release and reacquire the GIL.
|
||||
gil_scoped_release gil_rel; // Needed to establish lock ordering.
|
||||
std::call_once(once_flag_, [&] {
|
||||
// Only one thread will ever enter here.
|
||||
gil_scoped_acquire gil_acq;
|
||||
::new (storage_) T(fn()); // fn may release, but will reacquire, the GIL.
|
||||
is_initialized_ = true; // This write is guarded by the GIL.
|
||||
});
|
||||
// All threads will observe `is_initialized_` as true here.
|
||||
}
|
||||
// Intentionally not returning `T &` to ensure the calling code is self-documenting.
|
||||
return *this;
|
||||
}
|
||||
|
||||
// This must only be called after `call_once_and_store_result()` was called.
|
||||
T &get_stored() {
|
||||
assert(is_initialized_);
|
||||
PYBIND11_WARNING_PUSH
|
||||
#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ < 5
|
||||
// Needed for gcc 4.8.5
|
||||
PYBIND11_WARNING_DISABLE_GCC("-Wstrict-aliasing")
|
||||
#endif
|
||||
return *reinterpret_cast<T *>(storage_);
|
||||
PYBIND11_WARNING_POP
|
||||
}
|
||||
|
||||
constexpr gil_safe_call_once_and_store() = default;
|
||||
PYBIND11_DTOR_CONSTEXPR ~gil_safe_call_once_and_store() = default;
|
||||
|
||||
private:
|
||||
alignas(T) char storage_[sizeof(T)] = {};
|
||||
std::once_flag once_flag_ = {};
|
||||
#ifdef Py_GIL_DISABLED
|
||||
std::atomic_bool
|
||||
#else
|
||||
bool
|
||||
#endif
|
||||
is_initialized_{false};
|
||||
// The `is_initialized_`-`storage_` pair is very similar to `std::optional`,
|
||||
// but the latter does not have the triviality properties of former,
|
||||
// therefore `std::optional` is not a viable alternative here.
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
37
deps_src/pybind11/include/pybind11/gil_simple.h
Normal file
37
deps_src/pybind11/include/pybind11/gil_simple.h
Normal file
@@ -0,0 +1,37 @@
|
||||
// Copyright (c) 2016-2025 The Pybind Development Team.
|
||||
// All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "detail/common.h"
|
||||
|
||||
#include <cassert>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
class gil_scoped_acquire_simple {
|
||||
PyGILState_STATE state;
|
||||
|
||||
public:
|
||||
gil_scoped_acquire_simple() : state{PyGILState_Ensure()} {}
|
||||
gil_scoped_acquire_simple(const gil_scoped_acquire_simple &) = delete;
|
||||
gil_scoped_acquire_simple &operator=(const gil_scoped_acquire_simple &) = delete;
|
||||
~gil_scoped_acquire_simple() { PyGILState_Release(state); }
|
||||
};
|
||||
|
||||
class gil_scoped_release_simple {
|
||||
PyThreadState *state;
|
||||
|
||||
public:
|
||||
// PRECONDITION: The GIL must be held when this constructor is called.
|
||||
gil_scoped_release_simple() {
|
||||
assert(PyGILState_Check());
|
||||
state = PyEval_SaveThread();
|
||||
}
|
||||
gil_scoped_release_simple(const gil_scoped_release_simple &) = delete;
|
||||
gil_scoped_release_simple &operator=(const gil_scoped_release_simple &) = delete;
|
||||
~gil_scoped_release_simple() { PyEval_RestoreThread(state); }
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
265
deps_src/pybind11/include/pybind11/iostream.h
Normal file
265
deps_src/pybind11/include/pybind11/iostream.h
Normal file
@@ -0,0 +1,265 @@
|
||||
/*
|
||||
pybind11/iostream.h -- Tools to assist with redirecting cout and cerr to Python
|
||||
|
||||
Copyright (c) 2017 Henry F. Schreiner
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
WARNING: The implementation in this file is NOT thread safe. Multiple
|
||||
threads writing to a redirected ostream concurrently cause data races
|
||||
and potentially buffer overflows. Therefore it is currently a requirement
|
||||
that all (possibly) concurrent redirected ostream writes are protected by
|
||||
a mutex.
|
||||
#HelpAppreciated: Work on iostream.h thread safety.
|
||||
For more background see the discussions under
|
||||
https://github.com/pybind/pybind11/pull/2982 and
|
||||
https://github.com/pybind/pybind11/pull/2995.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pybind11.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <iterator>
|
||||
#include <memory>
|
||||
#include <ostream>
|
||||
#include <streambuf>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
// Buffer that writes to Python instead of C++
|
||||
class pythonbuf : public std::streambuf {
|
||||
private:
|
||||
using traits_type = std::streambuf::traits_type;
|
||||
|
||||
const size_t buf_size;
|
||||
std::unique_ptr<char[]> d_buffer;
|
||||
object pywrite;
|
||||
object pyflush;
|
||||
|
||||
int overflow(int c) override {
|
||||
if (!traits_type::eq_int_type(c, traits_type::eof())) {
|
||||
*pptr() = traits_type::to_char_type(c);
|
||||
pbump(1);
|
||||
}
|
||||
return sync() == 0 ? traits_type::not_eof(c) : traits_type::eof();
|
||||
}
|
||||
|
||||
// Computes how many bytes at the end of the buffer are part of an
|
||||
// incomplete sequence of UTF-8 bytes.
|
||||
// Precondition: pbase() < pptr()
|
||||
size_t utf8_remainder() const {
|
||||
const auto rbase = std::reverse_iterator<char *>(pbase());
|
||||
const auto rpptr = std::reverse_iterator<char *>(pptr());
|
||||
auto is_ascii = [](char c) { return (static_cast<unsigned char>(c) & 0x80) == 0x00; };
|
||||
auto is_leading = [](char c) { return (static_cast<unsigned char>(c) & 0xC0) == 0xC0; };
|
||||
auto is_leading_2b = [](char c) { return static_cast<unsigned char>(c) <= 0xDF; };
|
||||
auto is_leading_3b = [](char c) { return static_cast<unsigned char>(c) <= 0xEF; };
|
||||
// If the last character is ASCII, there are no incomplete code points
|
||||
if (is_ascii(*rpptr)) {
|
||||
return 0;
|
||||
}
|
||||
// Otherwise, work back from the end of the buffer and find the first
|
||||
// UTF-8 leading byte
|
||||
const auto rpend = rbase - rpptr >= 3 ? rpptr + 3 : rbase;
|
||||
const auto leading = std::find_if(rpptr, rpend, is_leading);
|
||||
if (leading == rbase) {
|
||||
return 0;
|
||||
}
|
||||
const auto dist = static_cast<size_t>(leading - rpptr);
|
||||
size_t remainder = 0;
|
||||
|
||||
if (dist == 0) {
|
||||
remainder = 1; // 1-byte code point is impossible
|
||||
} else if (dist == 1) {
|
||||
remainder = is_leading_2b(*leading) ? 0 : dist + 1;
|
||||
} else if (dist == 2) {
|
||||
remainder = is_leading_3b(*leading) ? 0 : dist + 1;
|
||||
}
|
||||
// else if (dist >= 3), at least 4 bytes before encountering an UTF-8
|
||||
// leading byte, either no remainder or invalid UTF-8.
|
||||
// Invalid UTF-8 will cause an exception later when converting
|
||||
// to a Python string, so that's not handled here.
|
||||
return remainder;
|
||||
}
|
||||
|
||||
// This function must be non-virtual to be called in a destructor.
|
||||
int _sync() {
|
||||
if (pbase() != pptr()) { // If buffer is not empty
|
||||
gil_scoped_acquire tmp;
|
||||
// This subtraction cannot be negative, so dropping the sign.
|
||||
auto size = static_cast<size_t>(pptr() - pbase());
|
||||
size_t remainder = utf8_remainder();
|
||||
|
||||
if (size > remainder) {
|
||||
str line(pbase(), size - remainder);
|
||||
pywrite(std::move(line));
|
||||
pyflush();
|
||||
}
|
||||
|
||||
// Copy the remainder at the end of the buffer to the beginning:
|
||||
if (remainder > 0) {
|
||||
std::memmove(pbase(), pptr() - remainder, remainder);
|
||||
}
|
||||
setp(pbase(), epptr());
|
||||
pbump(static_cast<int>(remainder));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sync() override { return _sync(); }
|
||||
|
||||
public:
|
||||
explicit pythonbuf(const object &pyostream, size_t buffer_size = 1024)
|
||||
: buf_size(buffer_size), d_buffer(new char[buf_size]), pywrite(pyostream.attr("write")),
|
||||
pyflush(pyostream.attr("flush")) {
|
||||
setp(d_buffer.get(), d_buffer.get() + buf_size - 1);
|
||||
}
|
||||
|
||||
pythonbuf(pythonbuf &&) = default;
|
||||
|
||||
/// Sync before destroy
|
||||
~pythonbuf() override { _sync(); }
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
/** \rst
|
||||
This a move-only guard that redirects output.
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
#include <pybind11/iostream.h>
|
||||
|
||||
...
|
||||
|
||||
{
|
||||
py::scoped_ostream_redirect output;
|
||||
std::cout << "Hello, World!"; // Python stdout
|
||||
} // <-- return std::cout to normal
|
||||
|
||||
You can explicitly pass the c++ stream and the python object,
|
||||
for example to guard stderr instead.
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
{
|
||||
py::scoped_ostream_redirect output{
|
||||
std::cerr, py::module::import("sys").attr("stderr")};
|
||||
std::cout << "Hello, World!";
|
||||
}
|
||||
\endrst */
|
||||
class scoped_ostream_redirect {
|
||||
protected:
|
||||
std::streambuf *old;
|
||||
std::ostream &costream;
|
||||
detail::pythonbuf buffer;
|
||||
|
||||
public:
|
||||
explicit scoped_ostream_redirect(std::ostream &costream = std::cout,
|
||||
const object &pyostream
|
||||
= module_::import("sys").attr("stdout"))
|
||||
: costream(costream), buffer(pyostream) {
|
||||
old = costream.rdbuf(&buffer);
|
||||
}
|
||||
|
||||
~scoped_ostream_redirect() { costream.rdbuf(old); }
|
||||
|
||||
scoped_ostream_redirect(const scoped_ostream_redirect &) = delete;
|
||||
scoped_ostream_redirect(scoped_ostream_redirect &&other) = default;
|
||||
scoped_ostream_redirect &operator=(const scoped_ostream_redirect &) = delete;
|
||||
scoped_ostream_redirect &operator=(scoped_ostream_redirect &&) = delete;
|
||||
};
|
||||
|
||||
/** \rst
|
||||
Like `scoped_ostream_redirect`, but redirects cerr by default. This class
|
||||
is provided primary to make ``py::call_guard`` easier to make.
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
m.def("noisy_func", &noisy_func,
|
||||
py::call_guard<scoped_ostream_redirect,
|
||||
scoped_estream_redirect>());
|
||||
|
||||
\endrst */
|
||||
class scoped_estream_redirect : public scoped_ostream_redirect {
|
||||
public:
|
||||
explicit scoped_estream_redirect(std::ostream &costream = std::cerr,
|
||||
const object &pyostream
|
||||
= module_::import("sys").attr("stderr"))
|
||||
: scoped_ostream_redirect(costream, pyostream) {}
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
// Class to redirect output as a context manager. C++ backend.
|
||||
class OstreamRedirect {
|
||||
bool do_stdout_;
|
||||
bool do_stderr_;
|
||||
std::unique_ptr<scoped_ostream_redirect> redirect_stdout;
|
||||
std::unique_ptr<scoped_estream_redirect> redirect_stderr;
|
||||
|
||||
public:
|
||||
explicit OstreamRedirect(bool do_stdout = true, bool do_stderr = true)
|
||||
: do_stdout_(do_stdout), do_stderr_(do_stderr) {}
|
||||
|
||||
void enter() {
|
||||
if (do_stdout_) {
|
||||
redirect_stdout.reset(new scoped_ostream_redirect());
|
||||
}
|
||||
if (do_stderr_) {
|
||||
redirect_stderr.reset(new scoped_estream_redirect());
|
||||
}
|
||||
}
|
||||
|
||||
void exit() {
|
||||
redirect_stdout.reset();
|
||||
redirect_stderr.reset();
|
||||
}
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
/** \rst
|
||||
This is a helper function to add a C++ redirect context manager to Python
|
||||
instead of using a C++ guard. To use it, add the following to your binding code:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
#include <pybind11/iostream.h>
|
||||
|
||||
...
|
||||
|
||||
py::add_ostream_redirect(m, "ostream_redirect");
|
||||
|
||||
You now have a Python context manager that redirects your output:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
with m.ostream_redirect():
|
||||
m.print_to_cout_function()
|
||||
|
||||
This manager can optionally be told which streams to operate on:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
with m.ostream_redirect(stdout=true, stderr=true):
|
||||
m.noisy_function_with_error_printing()
|
||||
|
||||
\endrst */
|
||||
inline class_<detail::OstreamRedirect>
|
||||
add_ostream_redirect(module_ m, const std::string &name = "ostream_redirect") {
|
||||
return class_<detail::OstreamRedirect>(std::move(m), name.c_str(), module_local())
|
||||
.def(init<bool, bool>(), arg("stdout") = true, arg("stderr") = true)
|
||||
.def("__enter__", &detail::OstreamRedirect::enter)
|
||||
.def("__exit__", [](detail::OstreamRedirect &self_, const args &) { self_.exit(); });
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
67
deps_src/pybind11/include/pybind11/native_enum.h
Normal file
67
deps_src/pybind11/include/pybind11/native_enum.h
Normal file
@@ -0,0 +1,67 @@
|
||||
// Copyright (c) 2022-2025 The pybind Community.
|
||||
// All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "detail/common.h"
|
||||
#include "detail/native_enum_data.h"
|
||||
#include "detail/type_caster_base.h"
|
||||
#include "cast.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <limits>
|
||||
#include <type_traits>
|
||||
#include <typeindex>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
/// Conversions between Python's native (stdlib) enum types and C++ enums.
|
||||
template <typename EnumType>
|
||||
class native_enum : public detail::native_enum_data {
|
||||
public:
|
||||
using Underlying = typename std::underlying_type<EnumType>::type;
|
||||
|
||||
native_enum(const object &parent_scope,
|
||||
const char *name,
|
||||
const char *native_type_name,
|
||||
const char *class_doc = "")
|
||||
: detail::native_enum_data(
|
||||
parent_scope, name, native_type_name, class_doc, std::type_index(typeid(EnumType))) {
|
||||
if (detail::get_local_type_info(typeid(EnumType)) != nullptr
|
||||
|| detail::get_global_type_info(typeid(EnumType)) != nullptr) {
|
||||
pybind11_fail(
|
||||
"pybind11::native_enum<...>(\"" + enum_name_encoded
|
||||
+ "\") is already registered as a `pybind11::enum_` or `pybind11::class_`!");
|
||||
}
|
||||
if (detail::global_internals_native_enum_type_map_contains(enum_type_index)) {
|
||||
pybind11_fail("pybind11::native_enum<...>(\"" + enum_name_encoded
|
||||
+ "\") is already registered!");
|
||||
}
|
||||
arm_finalize_check();
|
||||
}
|
||||
|
||||
/// Export enumeration entries into the parent scope
|
||||
native_enum &export_values() {
|
||||
assert(!export_values_flag); // Catch redundant calls.
|
||||
export_values_flag = true;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Add an enumeration entry
|
||||
native_enum &value(char const *name, EnumType value, const char *doc = nullptr) {
|
||||
// Disarm for the case that the native_enum_data dtor runs during exception unwinding.
|
||||
disarm_finalize_check("value after finalize");
|
||||
members.append(make_tuple(name, static_cast<Underlying>(value)));
|
||||
if (doc) {
|
||||
member_docs.append(make_tuple(name, doc));
|
||||
}
|
||||
arm_finalize_check(); // There was no exception.
|
||||
return *this;
|
||||
}
|
||||
|
||||
native_enum(const native_enum &) = delete;
|
||||
native_enum &operator=(const native_enum &) = delete;
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
2312
deps_src/pybind11/include/pybind11/numpy.h
Normal file
2312
deps_src/pybind11/include/pybind11/numpy.h
Normal file
File diff suppressed because it is too large
Load Diff
202
deps_src/pybind11/include/pybind11/operators.h
Normal file
202
deps_src/pybind11/include/pybind11/operators.h
Normal file
@@ -0,0 +1,202 @@
|
||||
/*
|
||||
pybind11/operator.h: Metatemplates for operator overloading
|
||||
|
||||
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pybind11.h"
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
/// Enumeration with all supported operator types
|
||||
enum op_id : int {
|
||||
op_add,
|
||||
op_sub,
|
||||
op_mul,
|
||||
op_div,
|
||||
op_mod,
|
||||
op_divmod,
|
||||
op_pow,
|
||||
op_lshift,
|
||||
op_rshift,
|
||||
op_and,
|
||||
op_xor,
|
||||
op_or,
|
||||
op_neg,
|
||||
op_pos,
|
||||
op_abs,
|
||||
op_invert,
|
||||
op_int,
|
||||
op_long,
|
||||
op_float,
|
||||
op_str,
|
||||
op_cmp,
|
||||
op_gt,
|
||||
op_ge,
|
||||
op_lt,
|
||||
op_le,
|
||||
op_eq,
|
||||
op_ne,
|
||||
op_iadd,
|
||||
op_isub,
|
||||
op_imul,
|
||||
op_idiv,
|
||||
op_imod,
|
||||
op_ilshift,
|
||||
op_irshift,
|
||||
op_iand,
|
||||
op_ixor,
|
||||
op_ior,
|
||||
op_complex,
|
||||
op_bool,
|
||||
op_nonzero,
|
||||
op_repr,
|
||||
op_truediv,
|
||||
op_itruediv,
|
||||
op_hash
|
||||
};
|
||||
|
||||
enum op_type : int {
|
||||
op_l, /* base type on left */
|
||||
op_r, /* base type on right */
|
||||
op_u /* unary operator */
|
||||
};
|
||||
|
||||
struct self_t {};
|
||||
static const self_t self = self_t();
|
||||
|
||||
/// Type for an unused type slot
|
||||
struct undefined_t {};
|
||||
|
||||
/// Don't warn about an unused variable
|
||||
inline self_t __self() { return self; }
|
||||
|
||||
/// base template of operator implementations
|
||||
template <op_id, op_type, typename B, typename L, typename R>
|
||||
struct op_impl {};
|
||||
|
||||
/// Operator implementation generator
|
||||
template <op_id id, op_type ot, typename L, typename R>
|
||||
struct op_ {
|
||||
static constexpr bool op_enable_if_hook = true;
|
||||
template <typename Class, typename... Extra>
|
||||
void execute(Class &cl, const Extra &...extra) const {
|
||||
using Base = typename Class::type;
|
||||
using L_type = conditional_t<std::is_same<L, self_t>::value, Base, L>;
|
||||
using R_type = conditional_t<std::is_same<R, self_t>::value, Base, R>;
|
||||
using op = op_impl<id, ot, Base, L_type, R_type>;
|
||||
cl.def(op::name(), &op::execute, is_operator(), extra...);
|
||||
}
|
||||
template <typename Class, typename... Extra>
|
||||
void execute_cast(Class &cl, const Extra &...extra) const {
|
||||
using Base = typename Class::type;
|
||||
using L_type = conditional_t<std::is_same<L, self_t>::value, Base, L>;
|
||||
using R_type = conditional_t<std::is_same<R, self_t>::value, Base, R>;
|
||||
using op = op_impl<id, ot, Base, L_type, R_type>;
|
||||
cl.def(op::name(), &op::execute_cast, is_operator(), extra...);
|
||||
}
|
||||
};
|
||||
|
||||
#define PYBIND11_BINARY_OPERATOR(id, rid, op, expr) \
|
||||
template <typename B, typename L, typename R> \
|
||||
struct op_impl<op_##id, op_l, B, L, R> { \
|
||||
static char const *name() { return "__" #id "__"; } \
|
||||
static auto execute(const L &l, const R &r) -> decltype(expr) { return (expr); } \
|
||||
static B execute_cast(const L &l, const R &r) { return B(expr); } \
|
||||
}; \
|
||||
template <typename B, typename L, typename R> \
|
||||
struct op_impl<op_##id, op_r, B, L, R> { \
|
||||
static char const *name() { return "__" #rid "__"; } \
|
||||
static auto execute(const R &r, const L &l) -> decltype(expr) { return (expr); } \
|
||||
static B execute_cast(const R &r, const L &l) { return B(expr); } \
|
||||
}; \
|
||||
inline op_<op_##id, op_l, self_t, self_t> op(const self_t &, const self_t &) { \
|
||||
return op_<op_##id, op_l, self_t, self_t>(); \
|
||||
} \
|
||||
template <typename T> \
|
||||
op_<op_##id, op_l, self_t, T> op(const self_t &, const T &) { \
|
||||
return op_<op_##id, op_l, self_t, T>(); \
|
||||
} \
|
||||
template <typename T> \
|
||||
op_<op_##id, op_r, T, self_t> op(const T &, const self_t &) { \
|
||||
return op_<op_##id, op_r, T, self_t>(); \
|
||||
}
|
||||
|
||||
#define PYBIND11_INPLACE_OPERATOR(id, op, expr) \
|
||||
template <typename B, typename L, typename R> \
|
||||
struct op_impl<op_##id, op_l, B, L, R> { \
|
||||
static char const *name() { return "__" #id "__"; } \
|
||||
static auto execute(L &l, const R &r) -> decltype(expr) { return expr; } \
|
||||
static B execute_cast(L &l, const R &r) { return B(expr); } \
|
||||
}; \
|
||||
template <typename T> \
|
||||
op_<op_##id, op_l, self_t, T> op(const self_t &, const T &) { \
|
||||
return op_<op_##id, op_l, self_t, T>(); \
|
||||
}
|
||||
|
||||
#define PYBIND11_UNARY_OPERATOR(id, op, expr) \
|
||||
template <typename B, typename L> \
|
||||
struct op_impl<op_##id, op_u, B, L, undefined_t> { \
|
||||
static char const *name() { return "__" #id "__"; } \
|
||||
static auto execute(const L &l) -> decltype(expr) { return expr; } \
|
||||
static B execute_cast(const L &l) { return B(expr); } \
|
||||
}; \
|
||||
inline op_<op_##id, op_u, self_t, undefined_t> op(const self_t &) { \
|
||||
return op_<op_##id, op_u, self_t, undefined_t>(); \
|
||||
}
|
||||
|
||||
PYBIND11_BINARY_OPERATOR(sub, rsub, operator-, l - r)
|
||||
PYBIND11_BINARY_OPERATOR(add, radd, operator+, l + r)
|
||||
PYBIND11_BINARY_OPERATOR(mul, rmul, operator*, l *r)
|
||||
PYBIND11_BINARY_OPERATOR(truediv, rtruediv, operator/, l / r)
|
||||
PYBIND11_BINARY_OPERATOR(mod, rmod, operator%, l % r)
|
||||
PYBIND11_BINARY_OPERATOR(lshift, rlshift, operator<<, l << r)
|
||||
PYBIND11_BINARY_OPERATOR(rshift, rrshift, operator>>, l >> r)
|
||||
PYBIND11_BINARY_OPERATOR(and, rand, operator&, l &r)
|
||||
PYBIND11_BINARY_OPERATOR(xor, rxor, operator^, l ^ r)
|
||||
PYBIND11_BINARY_OPERATOR(eq, eq, operator==, l == r)
|
||||
PYBIND11_BINARY_OPERATOR(ne, ne, operator!=, l != r)
|
||||
PYBIND11_BINARY_OPERATOR(or, ror, operator|, l | r)
|
||||
PYBIND11_BINARY_OPERATOR(gt, lt, operator>, l > r)
|
||||
PYBIND11_BINARY_OPERATOR(ge, le, operator>=, l >= r)
|
||||
PYBIND11_BINARY_OPERATOR(lt, gt, operator<, l < r)
|
||||
PYBIND11_BINARY_OPERATOR(le, ge, operator<=, l <= r)
|
||||
// PYBIND11_BINARY_OPERATOR(pow, rpow, pow, std::pow(l, r))
|
||||
PYBIND11_INPLACE_OPERATOR(iadd, operator+=, l += r)
|
||||
PYBIND11_INPLACE_OPERATOR(isub, operator-=, l -= r)
|
||||
PYBIND11_INPLACE_OPERATOR(imul, operator*=, l *= r)
|
||||
PYBIND11_INPLACE_OPERATOR(itruediv, operator/=, l /= r)
|
||||
PYBIND11_INPLACE_OPERATOR(imod, operator%=, l %= r)
|
||||
PYBIND11_INPLACE_OPERATOR(ilshift, operator<<=, l <<= r)
|
||||
PYBIND11_INPLACE_OPERATOR(irshift, operator>>=, l >>= r)
|
||||
PYBIND11_INPLACE_OPERATOR(iand, operator&=, l &= r)
|
||||
PYBIND11_INPLACE_OPERATOR(ixor, operator^=, l ^= r)
|
||||
PYBIND11_INPLACE_OPERATOR(ior, operator|=, l |= r)
|
||||
PYBIND11_UNARY_OPERATOR(neg, operator-, -l)
|
||||
PYBIND11_UNARY_OPERATOR(pos, operator+, +l)
|
||||
// WARNING: This usage of `abs` should only be done for existing STL overloads.
|
||||
// Adding overloads directly in to the `std::` namespace is advised against:
|
||||
// https://en.cppreference.com/w/cpp/language/extending_std
|
||||
PYBIND11_UNARY_OPERATOR(abs, abs, std::abs(l))
|
||||
PYBIND11_UNARY_OPERATOR(hash, hash, std::hash<L>()(l))
|
||||
PYBIND11_UNARY_OPERATOR(invert, operator~, (~l))
|
||||
PYBIND11_UNARY_OPERATOR(bool, operator!, !!l)
|
||||
PYBIND11_UNARY_OPERATOR(int, int_, (int) l)
|
||||
PYBIND11_UNARY_OPERATOR(float, float_, (double) l)
|
||||
|
||||
#undef PYBIND11_BINARY_OPERATOR
|
||||
#undef PYBIND11_INPLACE_OPERATOR
|
||||
#undef PYBIND11_UNARY_OPERATOR
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
using detail::self;
|
||||
// Add named operators so that they are accessible via `py::`.
|
||||
using detail::hash;
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
92
deps_src/pybind11/include/pybind11/options.h
Normal file
92
deps_src/pybind11/include/pybind11/options.h
Normal file
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
pybind11/options.h: global settings that are configurable at runtime.
|
||||
|
||||
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "detail/common.h"
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
class options {
|
||||
public:
|
||||
// Default RAII constructor, which leaves settings as they currently are.
|
||||
options() : previous_state(global_state()) {}
|
||||
|
||||
// Class is non-copyable.
|
||||
options(const options &) = delete;
|
||||
options &operator=(const options &) = delete;
|
||||
|
||||
// Destructor, which restores settings that were in effect before.
|
||||
~options() { global_state() = previous_state; }
|
||||
|
||||
// Setter methods (affect the global state):
|
||||
|
||||
options &disable_user_defined_docstrings() & {
|
||||
global_state().show_user_defined_docstrings = false;
|
||||
return *this;
|
||||
}
|
||||
|
||||
options &enable_user_defined_docstrings() & {
|
||||
global_state().show_user_defined_docstrings = true;
|
||||
return *this;
|
||||
}
|
||||
|
||||
options &disable_function_signatures() & {
|
||||
global_state().show_function_signatures = false;
|
||||
return *this;
|
||||
}
|
||||
|
||||
options &enable_function_signatures() & {
|
||||
global_state().show_function_signatures = true;
|
||||
return *this;
|
||||
}
|
||||
|
||||
options &disable_enum_members_docstring() & {
|
||||
global_state().show_enum_members_docstring = false;
|
||||
return *this;
|
||||
}
|
||||
|
||||
options &enable_enum_members_docstring() & {
|
||||
global_state().show_enum_members_docstring = true;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Getter methods (return the global state):
|
||||
|
||||
static bool show_user_defined_docstrings() {
|
||||
return global_state().show_user_defined_docstrings;
|
||||
}
|
||||
|
||||
static bool show_function_signatures() { return global_state().show_function_signatures; }
|
||||
|
||||
static bool show_enum_members_docstring() {
|
||||
return global_state().show_enum_members_docstring;
|
||||
}
|
||||
|
||||
// This type is not meant to be allocated on the heap.
|
||||
void *operator new(size_t) = delete;
|
||||
|
||||
private:
|
||||
struct state {
|
||||
bool show_user_defined_docstrings = true; //< Include user-supplied texts in docstrings.
|
||||
bool show_function_signatures = true; //< Include auto-generated function signatures
|
||||
// in docstrings.
|
||||
bool show_enum_members_docstring = true; //< Include auto-generated member list in enum
|
||||
// docstrings.
|
||||
};
|
||||
|
||||
static state &global_state() {
|
||||
static state instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
state previous_state;
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
3645
deps_src/pybind11/include/pybind11/pybind11.h
Normal file
3645
deps_src/pybind11/include/pybind11/pybind11.h
Normal file
File diff suppressed because it is too large
Load Diff
2680
deps_src/pybind11/include/pybind11/pytypes.h
Normal file
2680
deps_src/pybind11/include/pybind11/pytypes.h
Normal file
File diff suppressed because it is too large
Load Diff
666
deps_src/pybind11/include/pybind11/stl.h
Normal file
666
deps_src/pybind11/include/pybind11/stl.h
Normal file
@@ -0,0 +1,666 @@
|
||||
/*
|
||||
pybind11/stl.h: Transparent conversion for STL data types
|
||||
|
||||
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pybind11.h"
|
||||
#include "detail/common.h"
|
||||
#include "detail/descr.h"
|
||||
#include "detail/type_caster_base.h"
|
||||
|
||||
#include <deque>
|
||||
#include <initializer_list>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <ostream>
|
||||
#include <set>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
#include <valarray>
|
||||
|
||||
// See `detail/common.h` for implementation of these guards.
|
||||
#if defined(PYBIND11_HAS_OPTIONAL)
|
||||
# include <optional>
|
||||
#elif defined(PYBIND11_HAS_EXP_OPTIONAL)
|
||||
# include <experimental/optional>
|
||||
#endif
|
||||
|
||||
#if defined(PYBIND11_HAS_VARIANT)
|
||||
# include <variant>
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
//
|
||||
// Begin: Equivalent of
|
||||
// https://github.com/google/clif/blob/ae4eee1de07cdf115c0c9bf9fec9ff28efce6f6c/clif/python/runtime.cc#L388-L438
|
||||
/*
|
||||
The three `object_is_convertible_to_*()` functions below are
|
||||
the result of converging the behaviors of pybind11 and PyCLIF
|
||||
(http://github.com/google/clif).
|
||||
|
||||
Originally PyCLIF was extremely far on the permissive side of the spectrum,
|
||||
while pybind11 was very far on the strict side. Originally PyCLIF accepted any
|
||||
Python iterable as input for a C++ `vector`/`set`/`map` argument, as long as
|
||||
the elements were convertible. The obvious (in hindsight) problem was that
|
||||
any empty Python iterable could be passed to any of these C++ types, e.g. `{}`
|
||||
was accepted for C++ `vector`/`set` arguments, or `[]` for C++ `map` arguments.
|
||||
|
||||
The functions below strike a practical permissive-vs-strict compromise,
|
||||
informed by tens of thousands of use cases in the wild. A main objective is
|
||||
to prevent accidents and improve readability:
|
||||
|
||||
- Python literals must match the C++ types.
|
||||
|
||||
- For C++ `set`: The potentially reducing conversion from a Python sequence
|
||||
(e.g. Python `list` or `tuple`) to a C++ `set` must be explicit, by going
|
||||
through a Python `set`.
|
||||
|
||||
- However, a Python `set` can still be passed to a C++ `vector`. The rationale
|
||||
is that this conversion is not reducing. Implicit conversions of this kind
|
||||
are also fairly commonly used, therefore enforcing explicit conversions
|
||||
would have an unfavorable cost : benefit ratio; more sloppily speaking,
|
||||
such an enforcement would be more annoying than helpful.
|
||||
|
||||
Additional checks have been added to allow types derived from `collections.abc.Set` and
|
||||
`collections.abc.Mapping` (`collections.abc.Sequence` is already allowed by `PySequence_Check`).
|
||||
*/
|
||||
|
||||
inline bool object_is_instance_with_one_of_tp_names(PyObject *obj,
|
||||
std::initializer_list<const char *> tp_names) {
|
||||
if (PyType_Check(obj)) {
|
||||
return false;
|
||||
}
|
||||
const char *obj_tp_name = Py_TYPE(obj)->tp_name;
|
||||
for (const auto *tp_name : tp_names) {
|
||||
if (std::strcmp(obj_tp_name, tp_name) == 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool object_is_convertible_to_std_vector(const handle &src) {
|
||||
// Allow sequence-like objects, but not (byte-)string-like objects.
|
||||
if (PySequence_Check(src.ptr()) != 0) {
|
||||
return !PyUnicode_Check(src.ptr()) && !PyBytes_Check(src.ptr());
|
||||
}
|
||||
// Allow generators, set/frozenset and several common iterable types.
|
||||
return (PyGen_Check(src.ptr()) != 0) || (PyAnySet_Check(src.ptr()) != 0)
|
||||
|| object_is_instance_with_one_of_tp_names(
|
||||
src.ptr(), {"dict_keys", "dict_values", "dict_items", "map", "zip"});
|
||||
}
|
||||
|
||||
inline bool object_is_convertible_to_std_set(const handle &src, bool convert) {
|
||||
// Allow set/frozenset and dict keys.
|
||||
// In convert mode: also allow types derived from collections.abc.Set.
|
||||
return ((PyAnySet_Check(src.ptr()) != 0)
|
||||
|| object_is_instance_with_one_of_tp_names(src.ptr(), {"dict_keys"}))
|
||||
|| (convert && isinstance(src, module_::import("collections.abc").attr("Set")));
|
||||
}
|
||||
|
||||
inline bool object_is_convertible_to_std_map(const handle &src, bool convert) {
|
||||
// Allow dict.
|
||||
if (PyDict_Check(src.ptr())) {
|
||||
return true;
|
||||
}
|
||||
// Allow types conforming to Mapping Protocol.
|
||||
// According to https://docs.python.org/3/c-api/mapping.html, `PyMappingCheck()` checks for
|
||||
// `__getitem__()` without checking the type of keys. In order to restrict the allowed types
|
||||
// closer to actual Mapping-like types, we also check for the `items()` method.
|
||||
if (PyMapping_Check(src.ptr()) != 0) {
|
||||
PyObject *items = PyObject_GetAttrString(src.ptr(), "items");
|
||||
if (items != nullptr) {
|
||||
bool is_convertible = (PyCallable_Check(items) != 0);
|
||||
Py_DECREF(items);
|
||||
if (is_convertible) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
PyErr_Clear();
|
||||
}
|
||||
}
|
||||
// In convert mode: Allow types derived from collections.abc.Mapping
|
||||
return convert && isinstance(src, module_::import("collections.abc").attr("Mapping"));
|
||||
}
|
||||
|
||||
//
|
||||
// End: Equivalent of clif/python/runtime.cc
|
||||
//
|
||||
|
||||
/// Extracts an const lvalue reference or rvalue reference for U based on the type of T (e.g. for
|
||||
/// forwarding a container element). Typically used indirect via forwarded_type(), below.
|
||||
template <typename T, typename U>
|
||||
using forwarded_type = conditional_t<std::is_lvalue_reference<T>::value,
|
||||
remove_reference_t<U> &,
|
||||
remove_reference_t<U> &&>;
|
||||
|
||||
/// Forwards a value U as rvalue or lvalue according to whether T is rvalue or lvalue; typically
|
||||
/// used for forwarding a container's elements.
|
||||
template <typename T, typename U>
|
||||
constexpr forwarded_type<T, U> forward_like(U &&u) {
|
||||
return std::forward<detail::forwarded_type<T, U>>(std::forward<U>(u));
|
||||
}
|
||||
|
||||
// Checks if a container has a STL style reserve method.
|
||||
// This will only return true for a `reserve()` with a `void` return.
|
||||
template <typename C>
|
||||
using has_reserve_method = std::is_same<decltype(std::declval<C>().reserve(0)), void>;
|
||||
|
||||
template <typename Type, typename Key>
|
||||
struct set_caster {
|
||||
using type = Type;
|
||||
using key_conv = make_caster<Key>;
|
||||
|
||||
private:
|
||||
template <typename T = Type, enable_if_t<has_reserve_method<T>::value, int> = 0>
|
||||
void reserve_maybe(const anyset &s, Type *) {
|
||||
value.reserve(s.size());
|
||||
}
|
||||
void reserve_maybe(const anyset &, void *) {}
|
||||
|
||||
bool convert_iterable(const iterable &itbl, bool convert) {
|
||||
for (const auto &it : itbl) {
|
||||
key_conv conv;
|
||||
if (!conv.load(it, convert)) {
|
||||
return false;
|
||||
}
|
||||
value.insert(cast_op<Key &&>(std::move(conv)));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool convert_anyset(const anyset &s, bool convert) {
|
||||
value.clear();
|
||||
reserve_maybe(s, &value);
|
||||
return convert_iterable(s, convert);
|
||||
}
|
||||
|
||||
public:
|
||||
bool load(handle src, bool convert) {
|
||||
if (!object_is_convertible_to_std_set(src, convert)) {
|
||||
return false;
|
||||
}
|
||||
if (isinstance<anyset>(src)) {
|
||||
value.clear();
|
||||
return convert_anyset(reinterpret_borrow<anyset>(src), convert);
|
||||
}
|
||||
if (!convert) {
|
||||
return false;
|
||||
}
|
||||
assert(isinstance<iterable>(src));
|
||||
value.clear();
|
||||
return convert_iterable(reinterpret_borrow<iterable>(src), convert);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static handle cast(T &&src, return_value_policy policy, handle parent) {
|
||||
if (!std::is_lvalue_reference<T>::value) {
|
||||
policy = return_value_policy_override<Key>::policy(policy);
|
||||
}
|
||||
pybind11::set s;
|
||||
for (auto &&value : src) {
|
||||
auto value_ = reinterpret_steal<object>(
|
||||
key_conv::cast(detail::forward_like<T>(value), policy, parent));
|
||||
if (!value_ || !s.add(std::move(value_))) {
|
||||
return handle();
|
||||
}
|
||||
}
|
||||
return s.release();
|
||||
}
|
||||
|
||||
PYBIND11_TYPE_CASTER(type,
|
||||
io_name("collections.abc.Set", "set") + const_name("[") + key_conv::name
|
||||
+ const_name("]"));
|
||||
};
|
||||
|
||||
template <typename Type, typename Key, typename Value>
|
||||
struct map_caster {
|
||||
using key_conv = make_caster<Key>;
|
||||
using value_conv = make_caster<Value>;
|
||||
|
||||
private:
|
||||
template <typename T = Type, enable_if_t<has_reserve_method<T>::value, int> = 0>
|
||||
void reserve_maybe(const dict &d, Type *) {
|
||||
value.reserve(d.size());
|
||||
}
|
||||
void reserve_maybe(const dict &, void *) {}
|
||||
|
||||
bool convert_elements(const dict &d, bool convert) {
|
||||
value.clear();
|
||||
reserve_maybe(d, &value);
|
||||
for (const auto &it : d) {
|
||||
key_conv kconv;
|
||||
value_conv vconv;
|
||||
if (!kconv.load(it.first.ptr(), convert) || !vconv.load(it.second.ptr(), convert)) {
|
||||
return false;
|
||||
}
|
||||
value.emplace(cast_op<Key &&>(std::move(kconv)), cast_op<Value &&>(std::move(vconv)));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public:
|
||||
bool load(handle src, bool convert) {
|
||||
if (!object_is_convertible_to_std_map(src, convert)) {
|
||||
return false;
|
||||
}
|
||||
if (isinstance<dict>(src)) {
|
||||
return convert_elements(reinterpret_borrow<dict>(src), convert);
|
||||
}
|
||||
if (!convert) {
|
||||
return false;
|
||||
}
|
||||
auto items = reinterpret_steal<object>(PyMapping_Items(src.ptr()));
|
||||
if (!items) {
|
||||
throw error_already_set();
|
||||
}
|
||||
assert(isinstance<iterable>(items));
|
||||
return convert_elements(dict(reinterpret_borrow<iterable>(items)), convert);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static handle cast(T &&src, return_value_policy policy, handle parent) {
|
||||
dict d;
|
||||
return_value_policy policy_key = policy;
|
||||
return_value_policy policy_value = policy;
|
||||
if (!std::is_lvalue_reference<T>::value) {
|
||||
policy_key = return_value_policy_override<Key>::policy(policy_key);
|
||||
policy_value = return_value_policy_override<Value>::policy(policy_value);
|
||||
}
|
||||
for (auto &&kv : src) {
|
||||
auto key = reinterpret_steal<object>(
|
||||
key_conv::cast(detail::forward_like<T>(kv.first), policy_key, parent));
|
||||
auto value = reinterpret_steal<object>(
|
||||
value_conv::cast(detail::forward_like<T>(kv.second), policy_value, parent));
|
||||
if (!key || !value) {
|
||||
return handle();
|
||||
}
|
||||
d[std::move(key)] = std::move(value);
|
||||
}
|
||||
return d.release();
|
||||
}
|
||||
|
||||
PYBIND11_TYPE_CASTER(Type,
|
||||
io_name("collections.abc.Mapping", "dict") + const_name("[")
|
||||
+ key_conv::name + const_name(", ") + value_conv::name
|
||||
+ const_name("]"));
|
||||
};
|
||||
|
||||
template <typename Type, typename Value>
|
||||
struct list_caster {
|
||||
using value_conv = make_caster<Value>;
|
||||
|
||||
bool load(handle src, bool convert) {
|
||||
if (!object_is_convertible_to_std_vector(src)) {
|
||||
return false;
|
||||
}
|
||||
if (isinstance<sequence>(src)) {
|
||||
return convert_elements(src, convert);
|
||||
}
|
||||
if (!convert) {
|
||||
return false;
|
||||
}
|
||||
// Designed to be behavior-equivalent to passing tuple(src) from Python:
|
||||
// The conversion to a tuple will first exhaust the generator object, to ensure that
|
||||
// the generator is not left in an unpredictable (to the caller) partially-consumed
|
||||
// state.
|
||||
assert(isinstance<iterable>(src));
|
||||
return convert_elements(tuple(reinterpret_borrow<iterable>(src)), convert);
|
||||
}
|
||||
|
||||
private:
|
||||
template <typename T = Type, enable_if_t<has_reserve_method<T>::value, int> = 0>
|
||||
void reserve_maybe(const sequence &s, Type *) {
|
||||
value.reserve(s.size());
|
||||
}
|
||||
void reserve_maybe(const sequence &, void *) {}
|
||||
|
||||
bool convert_elements(handle seq, bool convert) {
|
||||
auto s = reinterpret_borrow<sequence>(seq);
|
||||
value.clear();
|
||||
reserve_maybe(s, &value);
|
||||
for (const auto &it : seq) {
|
||||
value_conv conv;
|
||||
if (!conv.load(it, convert)) {
|
||||
return false;
|
||||
}
|
||||
value.push_back(cast_op<Value &&>(std::move(conv)));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public:
|
||||
template <typename T>
|
||||
static handle cast(T &&src, return_value_policy policy, handle parent) {
|
||||
if (!std::is_lvalue_reference<T>::value) {
|
||||
policy = return_value_policy_override<Value>::policy(policy);
|
||||
}
|
||||
list l(src.size());
|
||||
ssize_t index = 0;
|
||||
for (auto &&value : src) {
|
||||
auto value_ = reinterpret_steal<object>(
|
||||
value_conv::cast(detail::forward_like<T>(value), policy, parent));
|
||||
if (!value_) {
|
||||
return handle();
|
||||
}
|
||||
PyList_SET_ITEM(l.ptr(), index++, value_.release().ptr()); // steals a reference
|
||||
}
|
||||
return l.release();
|
||||
}
|
||||
|
||||
PYBIND11_TYPE_CASTER(Type,
|
||||
io_name("collections.abc.Sequence", "list") + const_name("[")
|
||||
+ value_conv::name + const_name("]"));
|
||||
};
|
||||
|
||||
template <typename Type, typename Alloc>
|
||||
struct type_caster<std::vector<Type, Alloc>> : list_caster<std::vector<Type, Alloc>, Type> {};
|
||||
|
||||
template <typename Type, typename Alloc>
|
||||
struct type_caster<std::deque<Type, Alloc>> : list_caster<std::deque<Type, Alloc>, Type> {};
|
||||
|
||||
template <typename Type, typename Alloc>
|
||||
struct type_caster<std::list<Type, Alloc>> : list_caster<std::list<Type, Alloc>, Type> {};
|
||||
|
||||
template <typename ArrayType, typename V, size_t... I>
|
||||
ArrayType vector_to_array_impl(V &&v, index_sequence<I...>) {
|
||||
return {{std::move(v[I])...}};
|
||||
}
|
||||
|
||||
// Based on https://en.cppreference.com/w/cpp/container/array/to_array
|
||||
template <typename ArrayType, size_t N, typename V>
|
||||
ArrayType vector_to_array(V &&v) {
|
||||
return vector_to_array_impl<ArrayType, V>(std::forward<V>(v), make_index_sequence<N>{});
|
||||
}
|
||||
|
||||
template <typename ArrayType, typename Value, bool Resizable, size_t Size = 0>
|
||||
struct array_caster {
|
||||
using value_conv = make_caster<Value>;
|
||||
|
||||
private:
|
||||
std::unique_ptr<ArrayType> value;
|
||||
|
||||
template <bool R = Resizable, enable_if_t<R, int> = 0>
|
||||
bool convert_elements(handle seq, bool convert) {
|
||||
auto l = reinterpret_borrow<sequence>(seq);
|
||||
value.reset(new ArrayType{});
|
||||
// Using `resize` to preserve the behavior exactly as it was before PR #5305
|
||||
// For the `resize` to work, `Value` must be default constructible.
|
||||
// For `std::valarray`, this is a requirement:
|
||||
// https://en.cppreference.com/w/cpp/named_req/NumericType
|
||||
value->resize(l.size());
|
||||
size_t ctr = 0;
|
||||
for (const auto &it : l) {
|
||||
value_conv conv;
|
||||
if (!conv.load(it, convert)) {
|
||||
return false;
|
||||
}
|
||||
(*value)[ctr++] = cast_op<Value &&>(std::move(conv));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
template <bool R = Resizable, enable_if_t<!R, int> = 0>
|
||||
bool convert_elements(handle seq, bool convert) {
|
||||
auto l = reinterpret_borrow<sequence>(seq);
|
||||
if (l.size() != Size) {
|
||||
return false;
|
||||
}
|
||||
// The `temp` storage is needed to support `Value` types that are not
|
||||
// default-constructible.
|
||||
// Deliberate choice: no template specializations, for simplicity, and
|
||||
// because the compile time overhead for the specializations is deemed
|
||||
// more significant than the runtime overhead for the `temp` storage.
|
||||
std::vector<Value> temp;
|
||||
temp.reserve(l.size());
|
||||
for (auto it : l) {
|
||||
value_conv conv;
|
||||
if (!conv.load(it, convert)) {
|
||||
return false;
|
||||
}
|
||||
temp.emplace_back(cast_op<Value &&>(std::move(conv)));
|
||||
}
|
||||
value.reset(new ArrayType(vector_to_array<ArrayType, Size>(std::move(temp))));
|
||||
return true;
|
||||
}
|
||||
|
||||
public:
|
||||
bool load(handle src, bool convert) {
|
||||
if (!object_is_convertible_to_std_vector(src)) {
|
||||
return false;
|
||||
}
|
||||
if (isinstance<sequence>(src)) {
|
||||
return convert_elements(src, convert);
|
||||
}
|
||||
if (!convert) {
|
||||
return false;
|
||||
}
|
||||
// Designed to be behavior-equivalent to passing tuple(src) from Python:
|
||||
// The conversion to a tuple will first exhaust the generator object, to ensure that
|
||||
// the generator is not left in an unpredictable (to the caller) partially-consumed
|
||||
// state.
|
||||
assert(isinstance<iterable>(src));
|
||||
return convert_elements(tuple(reinterpret_borrow<iterable>(src)), convert);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static handle cast(T &&src, return_value_policy policy, handle parent) {
|
||||
list l(src.size());
|
||||
ssize_t index = 0;
|
||||
for (auto &&value : src) {
|
||||
auto value_ = reinterpret_steal<object>(
|
||||
value_conv::cast(detail::forward_like<T>(value), policy, parent));
|
||||
if (!value_) {
|
||||
return handle();
|
||||
}
|
||||
PyList_SET_ITEM(l.ptr(), index++, value_.release().ptr()); // steals a reference
|
||||
}
|
||||
return l.release();
|
||||
}
|
||||
|
||||
// Code copied from PYBIND11_TYPE_CASTER macro.
|
||||
// Intentionally preserving the behavior exactly as it was before PR #5305
|
||||
template <typename T_, enable_if_t<std::is_same<ArrayType, remove_cv_t<T_>>::value, int> = 0>
|
||||
static handle cast(T_ *src, return_value_policy policy, handle parent) {
|
||||
if (!src) {
|
||||
return none().release();
|
||||
}
|
||||
if (policy == return_value_policy::take_ownership) {
|
||||
auto h = cast(std::move(*src), policy, parent);
|
||||
delete src; // WARNING: Assumes `src` was allocated with `new`.
|
||||
return h;
|
||||
}
|
||||
return cast(*src, policy, parent);
|
||||
}
|
||||
|
||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
||||
operator ArrayType *() { return &(*value); }
|
||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
||||
operator ArrayType &() { return *value; }
|
||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
||||
operator ArrayType &&() && { return std::move(*value); }
|
||||
|
||||
template <typename T_>
|
||||
using cast_op_type = movable_cast_op_type<T_>;
|
||||
|
||||
static constexpr auto name
|
||||
= const_name<Resizable>(const_name(""), const_name("typing.Annotated["))
|
||||
+ io_name("collections.abc.Sequence", "list") + const_name("[") + value_conv::name
|
||||
+ const_name("]")
|
||||
+ const_name<Resizable>(const_name(""),
|
||||
const_name(", \"FixedSize(") + const_name<Size>()
|
||||
+ const_name(")\"]"));
|
||||
};
|
||||
|
||||
template <typename Type, size_t Size>
|
||||
struct type_caster<std::array<Type, Size>>
|
||||
: array_caster<std::array<Type, Size>, Type, false, Size> {};
|
||||
|
||||
template <typename Type>
|
||||
struct type_caster<std::valarray<Type>> : array_caster<std::valarray<Type>, Type, true> {};
|
||||
|
||||
template <typename Key, typename Compare, typename Alloc>
|
||||
struct type_caster<std::set<Key, Compare, Alloc>>
|
||||
: set_caster<std::set<Key, Compare, Alloc>, Key> {};
|
||||
|
||||
template <typename Key, typename Hash, typename Equal, typename Alloc>
|
||||
struct type_caster<std::unordered_set<Key, Hash, Equal, Alloc>>
|
||||
: set_caster<std::unordered_set<Key, Hash, Equal, Alloc>, Key> {};
|
||||
|
||||
template <typename Key, typename Value, typename Compare, typename Alloc>
|
||||
struct type_caster<std::map<Key, Value, Compare, Alloc>>
|
||||
: map_caster<std::map<Key, Value, Compare, Alloc>, Key, Value> {};
|
||||
|
||||
template <typename Key, typename Value, typename Hash, typename Equal, typename Alloc>
|
||||
struct type_caster<std::unordered_map<Key, Value, Hash, Equal, Alloc>>
|
||||
: map_caster<std::unordered_map<Key, Value, Hash, Equal, Alloc>, Key, Value> {};
|
||||
|
||||
// This type caster is intended to be used for std::optional and std::experimental::optional
|
||||
template <typename Type, typename Value = typename Type::value_type>
|
||||
struct optional_caster {
|
||||
using value_conv = make_caster<Value>;
|
||||
|
||||
template <typename T>
|
||||
static handle cast(T &&src, return_value_policy policy, handle parent) {
|
||||
if (!src) {
|
||||
return none().release();
|
||||
}
|
||||
if (!std::is_lvalue_reference<T>::value) {
|
||||
policy = return_value_policy_override<Value>::policy(policy);
|
||||
}
|
||||
// NOLINTNEXTLINE(bugprone-unchecked-optional-access)
|
||||
return value_conv::cast(*std::forward<T>(src), policy, parent);
|
||||
}
|
||||
|
||||
bool load(handle src, bool convert) {
|
||||
if (!src) {
|
||||
return false;
|
||||
}
|
||||
if (src.is_none()) {
|
||||
return true; // default-constructed value is already empty
|
||||
}
|
||||
value_conv inner_caster;
|
||||
if (!inner_caster.load(src, convert)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
value.emplace(cast_op<Value &&>(std::move(inner_caster)));
|
||||
return true;
|
||||
}
|
||||
|
||||
PYBIND11_TYPE_CASTER(Type, value_conv::name | make_caster<none>::name);
|
||||
};
|
||||
|
||||
#if defined(PYBIND11_HAS_OPTIONAL)
|
||||
template <typename T>
|
||||
struct type_caster<std::optional<T>> : public optional_caster<std::optional<T>> {};
|
||||
|
||||
template <>
|
||||
struct type_caster<std::nullopt_t> : public void_caster<std::nullopt_t> {};
|
||||
#endif
|
||||
|
||||
#if defined(PYBIND11_HAS_EXP_OPTIONAL)
|
||||
template <typename T>
|
||||
struct type_caster<std::experimental::optional<T>>
|
||||
: public optional_caster<std::experimental::optional<T>> {};
|
||||
|
||||
template <>
|
||||
struct type_caster<std::experimental::nullopt_t>
|
||||
: public void_caster<std::experimental::nullopt_t> {};
|
||||
#endif
|
||||
|
||||
/// Visit a variant and cast any found type to Python
|
||||
struct variant_caster_visitor {
|
||||
return_value_policy policy;
|
||||
handle parent;
|
||||
|
||||
using result_type = handle; // required by boost::variant in C++11
|
||||
|
||||
template <typename T>
|
||||
result_type operator()(T &&src) const {
|
||||
return make_caster<T>::cast(std::forward<T>(src), policy, parent);
|
||||
}
|
||||
};
|
||||
|
||||
/// Helper class which abstracts away variant's `visit` function. `std::variant` and similar
|
||||
/// `namespace::variant` types which provide a `namespace::visit()` function are handled here
|
||||
/// automatically using argument-dependent lookup. Users can provide specializations for other
|
||||
/// variant-like classes, e.g. `boost::variant` and `boost::apply_visitor`.
|
||||
template <template <typename...> class Variant>
|
||||
struct visit_helper {
|
||||
template <typename... Args>
|
||||
static auto call(Args &&...args) -> decltype(visit(std::forward<Args>(args)...)) {
|
||||
return visit(std::forward<Args>(args)...);
|
||||
}
|
||||
};
|
||||
|
||||
/// Generic variant caster
|
||||
template <typename Variant>
|
||||
struct variant_caster;
|
||||
|
||||
template <template <typename...> class V, typename... Ts>
|
||||
struct variant_caster<V<Ts...>> {
|
||||
static_assert(sizeof...(Ts) > 0, "Variant must consist of at least one alternative.");
|
||||
|
||||
template <typename U, typename... Us>
|
||||
bool load_alternative(handle src, bool convert, type_list<U, Us...>) {
|
||||
auto caster = make_caster<U>();
|
||||
if (caster.load(src, convert)) {
|
||||
value = cast_op<U>(std::move(caster));
|
||||
return true;
|
||||
}
|
||||
return load_alternative(src, convert, type_list<Us...>{});
|
||||
}
|
||||
|
||||
bool load_alternative(handle, bool, type_list<>) { return false; }
|
||||
|
||||
bool load(handle src, bool convert) {
|
||||
// Do a first pass without conversions to improve constructor resolution.
|
||||
// E.g. `py::int_(1).cast<variant<double, int>>()` needs to fill the `int`
|
||||
// slot of the variant. Without two-pass loading `double` would be filled
|
||||
// because it appears first and a conversion is possible.
|
||||
if (convert && load_alternative(src, false, type_list<Ts...>{})) {
|
||||
return true;
|
||||
}
|
||||
return load_alternative(src, convert, type_list<Ts...>{});
|
||||
}
|
||||
|
||||
template <typename Variant>
|
||||
static handle cast(Variant &&src, return_value_policy policy, handle parent) {
|
||||
return visit_helper<V>::call(variant_caster_visitor{policy, parent},
|
||||
std::forward<Variant>(src));
|
||||
}
|
||||
|
||||
using Type = V<Ts...>;
|
||||
PYBIND11_TYPE_CASTER(Type, ::pybind11::detail::union_concat(make_caster<Ts>::name...));
|
||||
};
|
||||
|
||||
#if defined(PYBIND11_HAS_VARIANT)
|
||||
template <typename... Ts>
|
||||
struct type_caster<std::variant<Ts...>> : variant_caster<std::variant<Ts...>> {};
|
||||
|
||||
template <>
|
||||
struct type_caster<std::monostate> : public void_caster<std::monostate> {};
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
inline std::ostream &operator<<(std::ostream &os, const handle &obj) {
|
||||
#ifdef PYBIND11_HAS_STRING_VIEW
|
||||
os << str(obj).cast<std::string_view>();
|
||||
#else
|
||||
os << (std::string) str(obj);
|
||||
#endif
|
||||
return os;
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
114
deps_src/pybind11/include/pybind11/stl/filesystem.h
Normal file
114
deps_src/pybind11/include/pybind11/stl/filesystem.h
Normal file
@@ -0,0 +1,114 @@
|
||||
// Copyright (c) 2021 The Pybind Development Team.
|
||||
// All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <pybind11/cast.h>
|
||||
#include <pybind11/detail/common.h>
|
||||
#include <pybind11/detail/descr.h>
|
||||
#include <pybind11/pybind11.h>
|
||||
#include <pybind11/pytypes.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
#if defined(PYBIND11_HAS_FILESYSTEM)
|
||||
# include <filesystem>
|
||||
#elif defined(PYBIND11_HAS_EXPERIMENTAL_FILESYSTEM)
|
||||
# include <experimental/filesystem>
|
||||
#else
|
||||
# error "Neither #include <filesystem> nor #include <experimental/filesystem is available."
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
#ifdef PYPY_VERSION
|
||||
# define PYBIND11_REINTERPRET_CAST_VOID_PTR_IF_NOT_PYPY(...) (__VA_ARGS__)
|
||||
#else
|
||||
# define PYBIND11_REINTERPRET_CAST_VOID_PTR_IF_NOT_PYPY(...) \
|
||||
(reinterpret_cast<void *>(__VA_ARGS__))
|
||||
#endif
|
||||
|
||||
#if defined(PYBIND11_HAS_FILESYSTEM) || defined(PYBIND11_HAS_EXPERIMENTAL_FILESYSTEM)
|
||||
template <typename T>
|
||||
struct path_caster {
|
||||
|
||||
private:
|
||||
static PyObject *unicode_from_fs_native(const std::string &w) {
|
||||
# if !defined(PYPY_VERSION)
|
||||
return PyUnicode_DecodeFSDefaultAndSize(w.c_str(), ssize_t(w.size()));
|
||||
# else
|
||||
// PyPy mistakenly declares the first parameter as non-const.
|
||||
return PyUnicode_DecodeFSDefaultAndSize(const_cast<char *>(w.c_str()), ssize_t(w.size()));
|
||||
# endif
|
||||
}
|
||||
|
||||
static PyObject *unicode_from_fs_native(const std::wstring &w) {
|
||||
return PyUnicode_FromWideChar(w.c_str(), ssize_t(w.size()));
|
||||
}
|
||||
|
||||
public:
|
||||
static handle cast(const T &path, return_value_policy, handle) {
|
||||
if (auto py_str = unicode_from_fs_native(path.native())) {
|
||||
return module_::import("pathlib")
|
||||
.attr("Path")(reinterpret_steal<object>(py_str))
|
||||
.release();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool load(handle handle, bool) {
|
||||
// PyUnicode_FSConverter and PyUnicode_FSDecoder normally take care of
|
||||
// calling PyOS_FSPath themselves, but that's broken on PyPy (PyPy
|
||||
// issue #3168) so we do it ourselves instead.
|
||||
PyObject *buf = PyOS_FSPath(handle.ptr());
|
||||
if (!buf) {
|
||||
PyErr_Clear();
|
||||
return false;
|
||||
}
|
||||
PyObject *native = nullptr;
|
||||
if constexpr (std::is_same_v<typename T::value_type, char>) {
|
||||
if (PyUnicode_FSConverter(buf, PYBIND11_REINTERPRET_CAST_VOID_PTR_IF_NOT_PYPY(&native))
|
||||
!= 0) {
|
||||
if (auto *c_str = PyBytes_AsString(native)) {
|
||||
// AsString returns a pointer to the internal buffer, which
|
||||
// must not be free'd.
|
||||
value = c_str;
|
||||
}
|
||||
}
|
||||
} else if constexpr (std::is_same_v<typename T::value_type, wchar_t>) {
|
||||
if (PyUnicode_FSDecoder(buf, PYBIND11_REINTERPRET_CAST_VOID_PTR_IF_NOT_PYPY(&native))
|
||||
!= 0) {
|
||||
if (auto *c_str = PyUnicode_AsWideCharString(native, nullptr)) {
|
||||
// AsWideCharString returns a new string that must be free'd.
|
||||
value = c_str; // Copies the string.
|
||||
PyMem_Free(c_str);
|
||||
}
|
||||
}
|
||||
}
|
||||
Py_XDECREF(native);
|
||||
Py_DECREF(buf);
|
||||
if (PyErr_Occurred()) {
|
||||
PyErr_Clear();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
PYBIND11_TYPE_CASTER(T, io_name("os.PathLike | str | bytes", "pathlib.Path"));
|
||||
};
|
||||
|
||||
#endif // PYBIND11_HAS_FILESYSTEM || defined(PYBIND11_HAS_EXPERIMENTAL_FILESYSTEM)
|
||||
|
||||
#if defined(PYBIND11_HAS_FILESYSTEM)
|
||||
template <>
|
||||
struct type_caster<std::filesystem::path> : public path_caster<std::filesystem::path> {};
|
||||
#elif defined(PYBIND11_HAS_EXPERIMENTAL_FILESYSTEM)
|
||||
template <>
|
||||
struct type_caster<std::experimental::filesystem::path>
|
||||
: public path_caster<std::experimental::filesystem::path> {};
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
858
deps_src/pybind11/include/pybind11/stl_bind.h
Normal file
858
deps_src/pybind11/include/pybind11/stl_bind.h
Normal file
@@ -0,0 +1,858 @@
|
||||
/*
|
||||
pybind11/std_bind.h: Binding generators for STL data types
|
||||
|
||||
Copyright (c) 2016 Sergey Lyskov and Wenzel Jakob
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "detail/common.h"
|
||||
#include "detail/type_caster_base.h"
|
||||
#include "cast.h"
|
||||
#include "operators.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <sstream>
|
||||
#include <type_traits>
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
/* SFINAE helper class used by 'is_comparable */
|
||||
template <typename T>
|
||||
struct container_traits {
|
||||
template <typename T2>
|
||||
static std::true_type
|
||||
test_comparable(decltype(std::declval<const T2 &>() == std::declval<const T2 &>()) *);
|
||||
template <typename T2>
|
||||
static std::false_type test_comparable(...);
|
||||
template <typename T2>
|
||||
static std::true_type test_value(typename T2::value_type *);
|
||||
template <typename T2>
|
||||
static std::false_type test_value(...);
|
||||
template <typename T2>
|
||||
static std::true_type test_pair(typename T2::first_type *, typename T2::second_type *);
|
||||
template <typename T2>
|
||||
static std::false_type test_pair(...);
|
||||
|
||||
static constexpr const bool is_comparable
|
||||
= std::is_same<std::true_type, decltype(test_comparable<T>(nullptr))>::value;
|
||||
static constexpr const bool is_pair
|
||||
= std::is_same<std::true_type, decltype(test_pair<T>(nullptr, nullptr))>::value;
|
||||
static constexpr const bool is_vector
|
||||
= std::is_same<std::true_type, decltype(test_value<T>(nullptr))>::value;
|
||||
static constexpr const bool is_element = !is_pair && !is_vector;
|
||||
};
|
||||
|
||||
/* Default: is_comparable -> std::false_type */
|
||||
template <typename T, typename SFINAE = void>
|
||||
struct is_comparable : std::false_type {};
|
||||
|
||||
/* For non-map data structures, check whether operator== can be instantiated */
|
||||
template <typename T>
|
||||
struct is_comparable<
|
||||
T,
|
||||
enable_if_t<container_traits<T>::is_element && container_traits<T>::is_comparable>>
|
||||
: std::true_type {};
|
||||
|
||||
/* For a vector/map data structure, recursively check the value type
|
||||
(which is std::pair for maps) */
|
||||
template <typename T>
|
||||
struct is_comparable<T, enable_if_t<container_traits<T>::is_vector>>
|
||||
: is_comparable<typename recursive_container_traits<T>::type_to_check_recursively> {};
|
||||
|
||||
template <>
|
||||
struct is_comparable<recursive_bottom> : std::true_type {};
|
||||
|
||||
/* For pairs, recursively check the two data types */
|
||||
template <typename T>
|
||||
struct is_comparable<T, enable_if_t<container_traits<T>::is_pair>> {
|
||||
static constexpr const bool value = is_comparable<typename T::first_type>::value
|
||||
&& is_comparable<typename T::second_type>::value;
|
||||
};
|
||||
|
||||
/* Fallback functions */
|
||||
template <typename, typename, typename... Args>
|
||||
void vector_if_copy_constructible(const Args &...) {}
|
||||
template <typename, typename, typename... Args>
|
||||
void vector_if_equal_operator(const Args &...) {}
|
||||
template <typename, typename, typename... Args>
|
||||
void vector_if_insertion_operator(const Args &...) {}
|
||||
template <typename, typename, typename... Args>
|
||||
void vector_modifiers(const Args &...) {}
|
||||
|
||||
template <typename Vector, typename Class_>
|
||||
void vector_if_copy_constructible(enable_if_t<is_copy_constructible<Vector>::value, Class_> &cl) {
|
||||
cl.def(init<const Vector &>(), "Copy constructor");
|
||||
}
|
||||
|
||||
template <typename Vector, typename Class_>
|
||||
void vector_if_equal_operator(enable_if_t<is_comparable<Vector>::value, Class_> &cl) {
|
||||
using T = typename Vector::value_type;
|
||||
|
||||
cl.def(self == self);
|
||||
cl.def(self != self);
|
||||
|
||||
cl.def(
|
||||
"count",
|
||||
[](const Vector &v, const T &x) { return std::count(v.begin(), v.end(), x); },
|
||||
arg("x"),
|
||||
"Return the number of times ``x`` appears in the list");
|
||||
|
||||
cl.def(
|
||||
"remove",
|
||||
[](Vector &v, const T &x) {
|
||||
auto p = std::find(v.begin(), v.end(), x);
|
||||
if (p != v.end()) {
|
||||
v.erase(p);
|
||||
} else {
|
||||
throw value_error();
|
||||
}
|
||||
},
|
||||
arg("x"),
|
||||
"Remove the first item from the list whose value is x. "
|
||||
"It is an error if there is no such item.");
|
||||
|
||||
cl.def(
|
||||
"__contains__",
|
||||
[](const Vector &v, const T &x) { return std::find(v.begin(), v.end(), x) != v.end(); },
|
||||
arg("x"),
|
||||
"Return true the container contains ``x``");
|
||||
}
|
||||
|
||||
// Vector modifiers -- requires a copyable vector_type:
|
||||
// (Technically, some of these (pop and __delitem__) don't actually require copyability, but it
|
||||
// seems silly to allow deletion but not insertion, so include them here too.)
|
||||
template <typename Vector, typename Class_>
|
||||
void vector_modifiers(
|
||||
enable_if_t<is_copy_constructible<typename Vector::value_type>::value, Class_> &cl) {
|
||||
using T = typename Vector::value_type;
|
||||
using SizeType = typename Vector::size_type;
|
||||
using DiffType = typename Vector::difference_type;
|
||||
|
||||
auto wrap_i = [](DiffType i, SizeType n) {
|
||||
if (i < 0) {
|
||||
i += n;
|
||||
}
|
||||
if (i < 0 || (SizeType) i >= n) {
|
||||
throw index_error();
|
||||
}
|
||||
return i;
|
||||
};
|
||||
|
||||
cl.def(
|
||||
"append",
|
||||
[](Vector &v, const T &value) { v.push_back(value); },
|
||||
arg("x"),
|
||||
"Add an item to the end of the list");
|
||||
|
||||
cl.def(init([](const iterable &it) {
|
||||
auto v = std::unique_ptr<Vector>(new Vector());
|
||||
v->reserve(len_hint(it));
|
||||
for (handle h : it) {
|
||||
v->push_back(h.cast<T>());
|
||||
}
|
||||
return v.release();
|
||||
}));
|
||||
|
||||
cl.def("clear", [](Vector &v) { v.clear(); }, "Clear the contents");
|
||||
|
||||
cl.def(
|
||||
"extend",
|
||||
[](Vector &v, const Vector &src) { v.insert(v.end(), src.begin(), src.end()); },
|
||||
arg("L"),
|
||||
"Extend the list by appending all the items in the given list");
|
||||
|
||||
cl.def(
|
||||
"extend",
|
||||
[](Vector &v, const iterable &it) {
|
||||
const size_t old_size = v.size();
|
||||
v.reserve(old_size + len_hint(it));
|
||||
try {
|
||||
for (handle h : it) {
|
||||
v.push_back(h.cast<T>());
|
||||
}
|
||||
} catch (const cast_error &) {
|
||||
v.erase(v.begin() + static_cast<typename Vector::difference_type>(old_size),
|
||||
v.end());
|
||||
try {
|
||||
v.shrink_to_fit();
|
||||
} catch (const std::exception &) { // NOLINT(bugprone-empty-catch)
|
||||
// Do nothing
|
||||
}
|
||||
throw;
|
||||
}
|
||||
},
|
||||
arg("L"),
|
||||
"Extend the list by appending all the items in the given list");
|
||||
|
||||
cl.def(
|
||||
"insert",
|
||||
[](Vector &v, DiffType i, const T &x) {
|
||||
// Can't use wrap_i; i == v.size() is OK
|
||||
if (i < 0) {
|
||||
i += v.size();
|
||||
}
|
||||
if (i < 0 || (SizeType) i > v.size()) {
|
||||
throw index_error();
|
||||
}
|
||||
v.insert(v.begin() + i, x);
|
||||
},
|
||||
arg("i"),
|
||||
arg("x"),
|
||||
"Insert an item at a given position.");
|
||||
|
||||
cl.def(
|
||||
"pop",
|
||||
[](Vector &v) {
|
||||
if (v.empty()) {
|
||||
throw index_error();
|
||||
}
|
||||
T t = std::move(v.back());
|
||||
v.pop_back();
|
||||
return t;
|
||||
},
|
||||
"Remove and return the last item");
|
||||
|
||||
cl.def(
|
||||
"pop",
|
||||
[wrap_i](Vector &v, DiffType i) {
|
||||
i = wrap_i(i, v.size());
|
||||
T t = std::move(v[(SizeType) i]);
|
||||
v.erase(std::next(v.begin(), i));
|
||||
return t;
|
||||
},
|
||||
arg("i"),
|
||||
"Remove and return the item at index ``i``");
|
||||
|
||||
cl.def("__setitem__", [wrap_i](Vector &v, DiffType i, const T &t) {
|
||||
i = wrap_i(i, v.size());
|
||||
v[(SizeType) i] = t;
|
||||
});
|
||||
|
||||
/// Slicing protocol
|
||||
cl.def(
|
||||
"__getitem__",
|
||||
[](const Vector &v, const slice &slice) -> Vector * {
|
||||
size_t start = 0, stop = 0, step = 0, slicelength = 0;
|
||||
|
||||
if (!slice.compute(v.size(), &start, &stop, &step, &slicelength)) {
|
||||
throw error_already_set();
|
||||
}
|
||||
|
||||
auto *seq = new Vector();
|
||||
seq->reserve((size_t) slicelength);
|
||||
|
||||
for (size_t i = 0; i < slicelength; ++i) {
|
||||
seq->push_back(v[start]);
|
||||
start += step;
|
||||
}
|
||||
return seq;
|
||||
},
|
||||
arg("s"),
|
||||
"Retrieve list elements using a slice object");
|
||||
|
||||
cl.def(
|
||||
"__setitem__",
|
||||
[](Vector &v, const slice &slice, const Vector &value) {
|
||||
size_t start = 0, stop = 0, step = 0, slicelength = 0;
|
||||
if (!slice.compute(v.size(), &start, &stop, &step, &slicelength)) {
|
||||
throw error_already_set();
|
||||
}
|
||||
|
||||
if (slicelength != value.size()) {
|
||||
throw std::runtime_error(
|
||||
"Left and right hand size of slice assignment have different sizes!");
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < slicelength; ++i) {
|
||||
v[start] = value[i];
|
||||
start += step;
|
||||
}
|
||||
},
|
||||
"Assign list elements using a slice object");
|
||||
|
||||
cl.def(
|
||||
"__delitem__",
|
||||
[wrap_i](Vector &v, DiffType i) {
|
||||
i = wrap_i(i, v.size());
|
||||
v.erase(v.begin() + i);
|
||||
},
|
||||
"Delete the list elements at index ``i``");
|
||||
|
||||
cl.def(
|
||||
"__delitem__",
|
||||
[](Vector &v, const slice &slice) {
|
||||
size_t start = 0, stop = 0, step = 0, slicelength = 0;
|
||||
|
||||
if (!slice.compute(v.size(), &start, &stop, &step, &slicelength)) {
|
||||
throw error_already_set();
|
||||
}
|
||||
|
||||
if (step == 1 && false) {
|
||||
v.erase(v.begin() + (DiffType) start, v.begin() + DiffType(start + slicelength));
|
||||
} else {
|
||||
for (size_t i = 0; i < slicelength; ++i) {
|
||||
v.erase(v.begin() + DiffType(start));
|
||||
start += step - 1;
|
||||
}
|
||||
}
|
||||
},
|
||||
"Delete list elements using a slice object");
|
||||
}
|
||||
|
||||
// If the type has an operator[] that doesn't return a reference (most notably std::vector<bool>),
|
||||
// we have to access by copying; otherwise we return by reference.
|
||||
template <typename Vector>
|
||||
using vector_needs_copy
|
||||
= negation<std::is_same<decltype(std::declval<Vector>()[typename Vector::size_type()]),
|
||||
typename Vector::value_type &>>;
|
||||
|
||||
// The usual case: access and iterate by reference
|
||||
template <typename Vector, typename Class_>
|
||||
void vector_accessor(enable_if_t<!vector_needs_copy<Vector>::value, Class_> &cl) {
|
||||
using T = typename Vector::value_type;
|
||||
using SizeType = typename Vector::size_type;
|
||||
using DiffType = typename Vector::difference_type;
|
||||
using ItType = typename Vector::iterator;
|
||||
|
||||
auto wrap_i = [](DiffType i, SizeType n) {
|
||||
if (i < 0) {
|
||||
i += n;
|
||||
}
|
||||
if (i < 0 || (SizeType) i >= n) {
|
||||
throw index_error();
|
||||
}
|
||||
return i;
|
||||
};
|
||||
|
||||
cl.def(
|
||||
"__getitem__",
|
||||
[wrap_i](Vector &v, DiffType i) -> T & {
|
||||
i = wrap_i(i, v.size());
|
||||
return v[(SizeType) i];
|
||||
},
|
||||
return_value_policy::reference_internal // ref + keepalive
|
||||
);
|
||||
|
||||
cl.def(
|
||||
"__iter__",
|
||||
[](Vector &v) {
|
||||
return make_iterator<return_value_policy::reference_internal, ItType, ItType, T &>(
|
||||
v.begin(), v.end());
|
||||
},
|
||||
keep_alive<0, 1>() /* Essential: keep list alive while iterator exists */
|
||||
);
|
||||
}
|
||||
|
||||
// The case for special objects, like std::vector<bool>, that have to be returned-by-copy:
|
||||
template <typename Vector, typename Class_>
|
||||
void vector_accessor(enable_if_t<vector_needs_copy<Vector>::value, Class_> &cl) {
|
||||
using T = typename Vector::value_type;
|
||||
using SizeType = typename Vector::size_type;
|
||||
using DiffType = typename Vector::difference_type;
|
||||
using ItType = typename Vector::iterator;
|
||||
cl.def("__getitem__", [](const Vector &v, DiffType i) -> T {
|
||||
if (i < 0) {
|
||||
i += v.size();
|
||||
if (i < 0) {
|
||||
throw index_error();
|
||||
}
|
||||
}
|
||||
auto i_st = static_cast<SizeType>(i);
|
||||
if (i_st >= v.size()) {
|
||||
throw index_error();
|
||||
}
|
||||
return v[i_st];
|
||||
});
|
||||
|
||||
cl.def(
|
||||
"__iter__",
|
||||
[](Vector &v) {
|
||||
return make_iterator<return_value_policy::copy, ItType, ItType, T>(v.begin(), v.end());
|
||||
},
|
||||
keep_alive<0, 1>() /* Essential: keep list alive while iterator exists */
|
||||
);
|
||||
}
|
||||
|
||||
template <typename Vector, typename Class_>
|
||||
auto vector_if_insertion_operator(Class_ &cl, std::string const &name)
|
||||
-> decltype(std::declval<std::ostream &>() << std::declval<typename Vector::value_type>(),
|
||||
void()) {
|
||||
using size_type = typename Vector::size_type;
|
||||
|
||||
cl.def(
|
||||
"__repr__",
|
||||
[name](Vector &v) {
|
||||
std::ostringstream s;
|
||||
s << name << '[';
|
||||
for (size_type i = 0; i < v.size(); ++i) {
|
||||
s << v[i];
|
||||
if (i != v.size() - 1) {
|
||||
s << ", ";
|
||||
}
|
||||
}
|
||||
s << ']';
|
||||
return s.str();
|
||||
},
|
||||
"Return the canonical string representation of this list.");
|
||||
}
|
||||
|
||||
// Provide the buffer interface for vectors if we have data() and we have a format for it
|
||||
// GCC seems to have "void std::vector<bool>::data()" - doing SFINAE on the existence of data()
|
||||
// is insufficient, we need to check it returns an appropriate pointer
|
||||
template <typename Vector, typename = void>
|
||||
struct vector_has_data_and_format : std::false_type {};
|
||||
template <typename Vector>
|
||||
struct vector_has_data_and_format<
|
||||
Vector,
|
||||
enable_if_t<std::is_same<decltype(format_descriptor<typename Vector::value_type>::format(),
|
||||
std::declval<Vector>().data()),
|
||||
typename Vector::value_type *>::value>> : std::true_type {};
|
||||
|
||||
// [workaround(intel)] Separate function required here
|
||||
// Workaround as the Intel compiler does not compile the enable_if_t part below
|
||||
// (tested with icc (ICC) 2021.1 Beta 20200827)
|
||||
template <typename... Args>
|
||||
constexpr bool args_any_are_buffer() {
|
||||
return detail::any_of<std::is_same<Args, buffer_protocol>...>::value;
|
||||
}
|
||||
|
||||
// [workaround(intel)] Separate function required here
|
||||
// [workaround(msvc)] Can't use constexpr bool in return type
|
||||
|
||||
// Add the buffer interface to a vector
|
||||
template <typename Vector, typename Class_, typename... Args>
|
||||
void vector_buffer_impl(Class_ &cl, std::true_type) {
|
||||
using T = typename Vector::value_type;
|
||||
|
||||
static_assert(vector_has_data_and_format<Vector>::value,
|
||||
"There is not an appropriate format descriptor for this vector");
|
||||
|
||||
// numpy.h declares this for arbitrary types, but it may raise an exception and crash hard
|
||||
// at runtime if PYBIND11_NUMPY_DTYPE hasn't been called, so check here
|
||||
format_descriptor<T>::format();
|
||||
|
||||
cl.def_buffer([](Vector &v) -> buffer_info {
|
||||
return buffer_info(v.data(),
|
||||
static_cast<ssize_t>(sizeof(T)),
|
||||
format_descriptor<T>::format(),
|
||||
1,
|
||||
{v.size()},
|
||||
{sizeof(T)});
|
||||
});
|
||||
|
||||
cl.def(init([](const buffer &buf) {
|
||||
auto info = buf.request();
|
||||
if (info.ndim != 1 || info.strides[0] % static_cast<ssize_t>(sizeof(T))) {
|
||||
throw type_error("Only valid 1D buffers can be copied to a vector");
|
||||
}
|
||||
if (!detail::compare_buffer_info<T>::compare(info)
|
||||
|| (ssize_t) sizeof(T) != info.itemsize) {
|
||||
throw type_error("Format mismatch (Python: " + info.format
|
||||
+ " C++: " + format_descriptor<T>::format() + ")");
|
||||
}
|
||||
|
||||
T *p = static_cast<T *>(info.ptr);
|
||||
ssize_t step = info.strides[0] / static_cast<ssize_t>(sizeof(T));
|
||||
T *end = p + info.shape[0] * step;
|
||||
if (step == 1) {
|
||||
return Vector(p, end);
|
||||
}
|
||||
Vector vec;
|
||||
vec.reserve((size_t) info.shape[0]);
|
||||
for (; p != end; p += step) {
|
||||
vec.push_back(*p);
|
||||
}
|
||||
return vec;
|
||||
}));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
template <typename Vector, typename Class_, typename... Args>
|
||||
void vector_buffer_impl(Class_ &, std::false_type) {}
|
||||
|
||||
template <typename Vector, typename Class_, typename... Args>
|
||||
void vector_buffer(Class_ &cl) {
|
||||
vector_buffer_impl<Vector, Class_, Args...>(
|
||||
cl, detail::any_of<std::is_same<Args, buffer_protocol>...>{});
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
//
|
||||
// std::vector
|
||||
//
|
||||
template <typename Vector, typename holder_type = default_holder_type<Vector>, typename... Args>
|
||||
class_<Vector, holder_type> bind_vector(handle scope, std::string const &name, Args &&...args) {
|
||||
using Class_ = class_<Vector, holder_type>;
|
||||
|
||||
// If the value_type is unregistered (e.g. a converting type) or is itself registered
|
||||
// module-local then make the vector binding module-local as well:
|
||||
using vtype = typename Vector::value_type;
|
||||
auto *vtype_info = detail::get_type_info(typeid(vtype));
|
||||
bool local = !vtype_info || vtype_info->module_local;
|
||||
|
||||
Class_ cl(scope, name.c_str(), pybind11::module_local(local), std::forward<Args>(args)...);
|
||||
|
||||
// Declare the buffer interface if a buffer_protocol() is passed in
|
||||
detail::vector_buffer<Vector, Class_, Args...>(cl);
|
||||
|
||||
cl.def(init<>());
|
||||
|
||||
// Register copy constructor (if possible)
|
||||
detail::vector_if_copy_constructible<Vector, Class_>(cl);
|
||||
|
||||
// Register comparison-related operators and functions (if possible)
|
||||
detail::vector_if_equal_operator<Vector, Class_>(cl);
|
||||
|
||||
// Register stream insertion operator (if possible)
|
||||
detail::vector_if_insertion_operator<Vector, Class_>(cl, name);
|
||||
|
||||
// Modifiers require copyable vector value type
|
||||
detail::vector_modifiers<Vector, Class_>(cl);
|
||||
|
||||
// Accessor and iterator; return by value if copyable, otherwise we return by ref + keep-alive
|
||||
detail::vector_accessor<Vector, Class_>(cl);
|
||||
|
||||
cl.def(
|
||||
"__bool__",
|
||||
[](const Vector &v) -> bool { return !v.empty(); },
|
||||
"Check whether the list is nonempty");
|
||||
|
||||
cl.def("__len__", [](const Vector &vec) { return vec.size(); });
|
||||
|
||||
#if 0
|
||||
// C++ style functions deprecated, leaving it here as an example
|
||||
cl.def(init<size_type>());
|
||||
|
||||
cl.def("resize",
|
||||
(void (Vector::*) (size_type count)) & Vector::resize,
|
||||
"changes the number of elements stored");
|
||||
|
||||
cl.def("erase",
|
||||
[](Vector &v, SizeType i) {
|
||||
if (i >= v.size())
|
||||
throw index_error();
|
||||
v.erase(v.begin() + i);
|
||||
}, "erases element at index ``i``");
|
||||
|
||||
cl.def("empty", &Vector::empty, "checks whether the container is empty");
|
||||
cl.def("size", &Vector::size, "returns the number of elements");
|
||||
cl.def("push_back", (void (Vector::*)(const T&)) &Vector::push_back, "adds an element to the end");
|
||||
cl.def("pop_back", &Vector::pop_back, "removes the last element");
|
||||
|
||||
cl.def("max_size", &Vector::max_size, "returns the maximum possible number of elements");
|
||||
cl.def("reserve", &Vector::reserve, "reserves storage");
|
||||
cl.def("capacity", &Vector::capacity, "returns the number of elements that can be held in currently allocated storage");
|
||||
cl.def("shrink_to_fit", &Vector::shrink_to_fit, "reduces memory usage by freeing unused memory");
|
||||
|
||||
cl.def("clear", &Vector::clear, "clears the contents");
|
||||
cl.def("swap", &Vector::swap, "swaps the contents");
|
||||
|
||||
cl.def("front", [](Vector &v) {
|
||||
if (v.size()) return v.front();
|
||||
else throw index_error();
|
||||
}, "access the first element");
|
||||
|
||||
cl.def("back", [](Vector &v) {
|
||||
if (v.size()) return v.back();
|
||||
else throw index_error();
|
||||
}, "access the last element ");
|
||||
|
||||
#endif
|
||||
|
||||
return cl;
|
||||
}
|
||||
|
||||
//
|
||||
// std::map, std::unordered_map
|
||||
//
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
/* Fallback functions */
|
||||
template <typename, typename, typename... Args>
|
||||
void map_if_insertion_operator(const Args &...) {}
|
||||
template <typename, typename, typename... Args>
|
||||
void map_assignment(const Args &...) {}
|
||||
|
||||
// Map assignment when copy-assignable: just copy the value
|
||||
template <typename Map, typename Class_>
|
||||
void map_assignment(
|
||||
enable_if_t<is_copy_assignable<typename Map::mapped_type>::value, Class_> &cl) {
|
||||
using KeyType = typename Map::key_type;
|
||||
using MappedType = typename Map::mapped_type;
|
||||
|
||||
cl.def("__setitem__", [](Map &m, const KeyType &k, const MappedType &v) {
|
||||
auto it = m.find(k);
|
||||
if (it != m.end()) {
|
||||
it->second = v;
|
||||
} else {
|
||||
m.emplace(k, v);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Not copy-assignable, but still copy-constructible: we can update the value by erasing and
|
||||
// reinserting
|
||||
template <typename Map, typename Class_>
|
||||
void map_assignment(enable_if_t<!is_copy_assignable<typename Map::mapped_type>::value
|
||||
&& is_copy_constructible<typename Map::mapped_type>::value,
|
||||
Class_> &cl) {
|
||||
using KeyType = typename Map::key_type;
|
||||
using MappedType = typename Map::mapped_type;
|
||||
|
||||
cl.def("__setitem__", [](Map &m, const KeyType &k, const MappedType &v) {
|
||||
// We can't use m[k] = v; because value type might not be default constructable
|
||||
auto r = m.emplace(k, v);
|
||||
if (!r.second) {
|
||||
// value type is not copy assignable so the only way to insert it is to erase it
|
||||
// first...
|
||||
m.erase(r.first);
|
||||
m.emplace(k, v);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
template <typename Map, typename Class_>
|
||||
auto map_if_insertion_operator(Class_ &cl, std::string const &name)
|
||||
-> decltype(std::declval<std::ostream &>() << std::declval<typename Map::key_type>()
|
||||
<< std::declval<typename Map::mapped_type>(),
|
||||
void()) {
|
||||
|
||||
cl.def(
|
||||
"__repr__",
|
||||
[name](Map &m) {
|
||||
std::ostringstream s;
|
||||
s << name << '{';
|
||||
bool f = false;
|
||||
for (auto const &kv : m) {
|
||||
if (f) {
|
||||
s << ", ";
|
||||
}
|
||||
s << kv.first << ": " << kv.second;
|
||||
f = true;
|
||||
}
|
||||
s << '}';
|
||||
return s.str();
|
||||
},
|
||||
"Return the canonical string representation of this map.");
|
||||
}
|
||||
|
||||
struct keys_view {
|
||||
virtual size_t len() = 0;
|
||||
virtual iterator iter() = 0;
|
||||
virtual bool contains(const handle &k) = 0;
|
||||
virtual ~keys_view() = default;
|
||||
};
|
||||
|
||||
struct values_view {
|
||||
virtual size_t len() = 0;
|
||||
virtual iterator iter() = 0;
|
||||
virtual ~values_view() = default;
|
||||
};
|
||||
|
||||
struct items_view {
|
||||
virtual size_t len() = 0;
|
||||
virtual iterator iter() = 0;
|
||||
virtual ~items_view() = default;
|
||||
};
|
||||
|
||||
template <typename Map>
|
||||
struct KeysViewImpl : public detail::keys_view {
|
||||
explicit KeysViewImpl(Map &map) : map(map) {}
|
||||
size_t len() override { return map.size(); }
|
||||
iterator iter() override { return make_key_iterator(map.begin(), map.end()); }
|
||||
bool contains(const handle &k) override {
|
||||
try {
|
||||
return map.find(k.template cast<typename Map::key_type>()) != map.end();
|
||||
} catch (const cast_error &) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Map ↦
|
||||
};
|
||||
|
||||
template <typename Map>
|
||||
struct ValuesViewImpl : public detail::values_view {
|
||||
explicit ValuesViewImpl(Map &map) : map(map) {}
|
||||
size_t len() override { return map.size(); }
|
||||
iterator iter() override { return make_value_iterator(map.begin(), map.end()); }
|
||||
Map ↦
|
||||
};
|
||||
|
||||
template <typename Map>
|
||||
struct ItemsViewImpl : public detail::items_view {
|
||||
explicit ItemsViewImpl(Map &map) : map(map) {}
|
||||
size_t len() override { return map.size(); }
|
||||
iterator iter() override { return make_iterator(map.begin(), map.end()); }
|
||||
Map ↦
|
||||
};
|
||||
|
||||
inline str format_message_key_error_key_object(handle py_key) {
|
||||
str message = "pybind11::bind_map key";
|
||||
if (!py_key) {
|
||||
return message;
|
||||
}
|
||||
try {
|
||||
message = str(py_key);
|
||||
} catch (const std::exception &) {
|
||||
try {
|
||||
message = repr(py_key);
|
||||
} catch (const std::exception &) {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
const ssize_t cut_length = 100;
|
||||
if (len(message) > 2 * cut_length + 3) {
|
||||
return str(message[slice(0, cut_length, 1)]) + str("✄✄✄")
|
||||
+ str(message[slice(-cut_length, static_cast<ssize_t>(len(message)), 1)]);
|
||||
}
|
||||
return message;
|
||||
}
|
||||
|
||||
template <typename KeyType>
|
||||
str format_message_key_error(const KeyType &key) {
|
||||
object py_key;
|
||||
try {
|
||||
py_key = cast(key);
|
||||
} catch (const std::exception &) {
|
||||
do { // Trick to avoid "empty catch" warning/error.
|
||||
} while (false);
|
||||
}
|
||||
return format_message_key_error_key_object(py_key);
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
template <typename Map, typename holder_type = default_holder_type<Map>, typename... Args>
|
||||
class_<Map, holder_type> bind_map(handle scope, const std::string &name, Args &&...args) {
|
||||
using KeyType = typename Map::key_type;
|
||||
using MappedType = typename Map::mapped_type;
|
||||
using KeysView = detail::keys_view;
|
||||
using ValuesView = detail::values_view;
|
||||
using ItemsView = detail::items_view;
|
||||
using Class_ = class_<Map, holder_type>;
|
||||
|
||||
// If either type is a non-module-local bound type then make the map binding non-local as well;
|
||||
// otherwise (e.g. both types are either module-local or converting) the map will be
|
||||
// module-local.
|
||||
auto *tinfo = detail::get_type_info(typeid(MappedType));
|
||||
bool local = !tinfo || tinfo->module_local;
|
||||
if (local) {
|
||||
tinfo = detail::get_type_info(typeid(KeyType));
|
||||
local = !tinfo || tinfo->module_local;
|
||||
}
|
||||
|
||||
Class_ cl(scope, name.c_str(), pybind11::module_local(local), std::forward<Args>(args)...);
|
||||
|
||||
// Wrap KeysView if it wasn't already wrapped
|
||||
if (!detail::get_type_info(typeid(KeysView))) {
|
||||
class_<KeysView> keys_view(scope, "KeysView", pybind11::module_local(local));
|
||||
keys_view.def("__len__", &KeysView::len);
|
||||
keys_view.def("__iter__",
|
||||
&KeysView::iter,
|
||||
keep_alive<0, 1>() /* Essential: keep view alive while iterator exists */
|
||||
);
|
||||
keys_view.def("__contains__", &KeysView::contains);
|
||||
}
|
||||
// Similarly for ValuesView:
|
||||
if (!detail::get_type_info(typeid(ValuesView))) {
|
||||
class_<ValuesView> values_view(scope, "ValuesView", pybind11::module_local(local));
|
||||
values_view.def("__len__", &ValuesView::len);
|
||||
values_view.def("__iter__",
|
||||
&ValuesView::iter,
|
||||
keep_alive<0, 1>() /* Essential: keep view alive while iterator exists */
|
||||
);
|
||||
}
|
||||
// Similarly for ItemsView:
|
||||
if (!detail::get_type_info(typeid(ItemsView))) {
|
||||
class_<ItemsView> items_view(scope, "ItemsView", pybind11::module_local(local));
|
||||
items_view.def("__len__", &ItemsView::len);
|
||||
items_view.def("__iter__",
|
||||
&ItemsView::iter,
|
||||
keep_alive<0, 1>() /* Essential: keep view alive while iterator exists */
|
||||
);
|
||||
}
|
||||
|
||||
cl.def(init<>());
|
||||
|
||||
// Register stream insertion operator (if possible)
|
||||
detail::map_if_insertion_operator<Map, Class_>(cl, name);
|
||||
|
||||
cl.def(
|
||||
"__bool__",
|
||||
[](const Map &m) -> bool { return !m.empty(); },
|
||||
"Check whether the map is nonempty");
|
||||
|
||||
cl.def(
|
||||
"__iter__",
|
||||
[](Map &m) { return make_key_iterator(m.begin(), m.end()); },
|
||||
keep_alive<0, 1>() /* Essential: keep map alive while iterator exists */
|
||||
);
|
||||
|
||||
cl.def(
|
||||
"keys",
|
||||
[](Map &m) { return std::unique_ptr<KeysView>(new detail::KeysViewImpl<Map>(m)); },
|
||||
keep_alive<0, 1>() /* Essential: keep map alive while view exists */
|
||||
);
|
||||
|
||||
cl.def(
|
||||
"values",
|
||||
[](Map &m) { return std::unique_ptr<ValuesView>(new detail::ValuesViewImpl<Map>(m)); },
|
||||
keep_alive<0, 1>() /* Essential: keep map alive while view exists */
|
||||
);
|
||||
|
||||
cl.def(
|
||||
"items",
|
||||
[](Map &m) { return std::unique_ptr<ItemsView>(new detail::ItemsViewImpl<Map>(m)); },
|
||||
keep_alive<0, 1>() /* Essential: keep map alive while view exists */
|
||||
);
|
||||
|
||||
cl.def(
|
||||
"__getitem__",
|
||||
[](Map &m, const KeyType &k) -> MappedType & {
|
||||
auto it = m.find(k);
|
||||
if (it == m.end()) {
|
||||
set_error(PyExc_KeyError, detail::format_message_key_error(k));
|
||||
throw error_already_set();
|
||||
}
|
||||
return it->second;
|
||||
},
|
||||
return_value_policy::reference_internal // ref + keepalive
|
||||
);
|
||||
|
||||
cl.def("__contains__", [](Map &m, const KeyType &k) -> bool {
|
||||
auto it = m.find(k);
|
||||
if (it == m.end()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
// Fallback for when the object is not of the key type
|
||||
cl.def("__contains__", [](Map &, const object &) -> bool { return false; });
|
||||
|
||||
// Assignment provided only if the type is copyable
|
||||
detail::map_assignment<Map, Class_>(cl);
|
||||
|
||||
cl.def("__delitem__", [](Map &m, const KeyType &k) {
|
||||
auto it = m.find(k);
|
||||
if (it == m.end()) {
|
||||
set_error(PyExc_KeyError, detail::format_message_key_error(k));
|
||||
throw error_already_set();
|
||||
}
|
||||
m.erase(it);
|
||||
});
|
||||
|
||||
// Always use a lambda in case of `using` declaration
|
||||
cl.def("__len__", [](const Map &m) { return m.size(); });
|
||||
|
||||
return cl;
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
299
deps_src/pybind11/include/pybind11/subinterpreter.h
Normal file
299
deps_src/pybind11/include/pybind11/subinterpreter.h
Normal file
@@ -0,0 +1,299 @@
|
||||
/*
|
||||
pybind11/subinterpreter.h: Support for creating and using subinterpreters
|
||||
|
||||
Copyright (c) 2025 The Pybind Development Team.
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "detail/common.h"
|
||||
#include "detail/internals.h"
|
||||
#include "gil.h"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
#ifndef PYBIND11_HAS_SUBINTERPRETER_SUPPORT
|
||||
# error "This platform does not support subinterpreters, do not include this file."
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
inline PyInterpreterState *get_interpreter_state_unchecked() {
|
||||
auto cur_tstate = get_thread_state_unchecked();
|
||||
if (cur_tstate)
|
||||
return cur_tstate->interp;
|
||||
else
|
||||
return nullptr;
|
||||
}
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
class subinterpreter;
|
||||
|
||||
/// Activate the subinterpreter and acquire its GIL, while also releasing any GIL and interpreter
|
||||
/// currently held. Upon exiting the scope, the previous subinterpreter (if any) and its
|
||||
/// associated GIL are restored to their state as they were before the scope was entered.
|
||||
class subinterpreter_scoped_activate {
|
||||
public:
|
||||
explicit subinterpreter_scoped_activate(subinterpreter const &si);
|
||||
~subinterpreter_scoped_activate();
|
||||
|
||||
subinterpreter_scoped_activate(subinterpreter_scoped_activate &&) = delete;
|
||||
subinterpreter_scoped_activate(subinterpreter_scoped_activate const &) = delete;
|
||||
subinterpreter_scoped_activate &operator=(subinterpreter_scoped_activate &) = delete;
|
||||
subinterpreter_scoped_activate &operator=(subinterpreter_scoped_activate const &) = delete;
|
||||
|
||||
private:
|
||||
PyThreadState *old_tstate_ = nullptr;
|
||||
PyThreadState *tstate_ = nullptr;
|
||||
PyGILState_STATE gil_state_;
|
||||
bool simple_gil_ = false;
|
||||
};
|
||||
|
||||
/// Holds a Python subinterpreter instance
|
||||
class subinterpreter {
|
||||
public:
|
||||
/// empty/unusable, but move-assignable. use create() to create a subinterpreter.
|
||||
subinterpreter() = default;
|
||||
|
||||
subinterpreter(subinterpreter const ©) = delete;
|
||||
subinterpreter &operator=(subinterpreter const ©) = delete;
|
||||
|
||||
subinterpreter(subinterpreter &&old) noexcept
|
||||
: istate_(old.istate_), creation_tstate_(old.creation_tstate_) {
|
||||
old.istate_ = nullptr;
|
||||
old.creation_tstate_ = nullptr;
|
||||
}
|
||||
|
||||
subinterpreter &operator=(subinterpreter &&old) noexcept {
|
||||
std::swap(old.istate_, istate_);
|
||||
std::swap(old.creation_tstate_, creation_tstate_);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Create a new subinterpreter with the specified configuration
|
||||
/// @note This function acquires (and then releases) the main interpreter GIL, but the main
|
||||
/// interpreter and its GIL are not required to be held prior to calling this function.
|
||||
static inline subinterpreter create(PyInterpreterConfig const &cfg) {
|
||||
|
||||
error_scope err_scope;
|
||||
subinterpreter result;
|
||||
{
|
||||
// we must hold the main GIL in order to create a subinterpreter
|
||||
subinterpreter_scoped_activate main_guard(main());
|
||||
|
||||
auto prev_tstate = PyThreadState_Get();
|
||||
|
||||
PyStatus status;
|
||||
|
||||
{
|
||||
/*
|
||||
Several internal CPython modules are lacking proper subinterpreter support in 3.12
|
||||
even though it is "stable" in that version. This most commonly seems to cause
|
||||
crashes when two interpreters concurrently initialize, which imports several things
|
||||
(like builtins, unicode, codecs).
|
||||
*/
|
||||
#if PY_VERSION_HEX < 0x030D0000 && defined(Py_MOD_PER_INTERPRETER_GIL_SUPPORTED)
|
||||
static std::mutex one_at_a_time;
|
||||
std::lock_guard<std::mutex> guard(one_at_a_time);
|
||||
#endif
|
||||
status = Py_NewInterpreterFromConfig(&result.creation_tstate_, &cfg);
|
||||
}
|
||||
|
||||
// this doesn't raise a normal Python exception, it provides an exit() status code.
|
||||
if (PyStatus_Exception(status)) {
|
||||
pybind11_fail("failed to create new sub-interpreter");
|
||||
}
|
||||
|
||||
// upon success, the new interpreter is activated in this thread
|
||||
result.istate_ = result.creation_tstate_->interp;
|
||||
detail::get_num_interpreters_seen() += 1; // there are now many interpreters
|
||||
detail::get_internals(); // initialize internals.tstate, amongst other things...
|
||||
|
||||
// In 3.13+ this state should be deleted right away, and the memory will be reused for
|
||||
// the next threadstate on this interpreter. However, on 3.12 we cannot do that, we
|
||||
// must keep it around (but not use it) ... see destructor.
|
||||
#if PY_VERSION_HEX >= 0x030D0000
|
||||
PyThreadState_Clear(result.creation_tstate_);
|
||||
PyThreadState_DeleteCurrent();
|
||||
#endif
|
||||
|
||||
// we have to switch back to main, and then the scopes will handle cleanup
|
||||
PyThreadState_Swap(prev_tstate);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// Calls create() with a default configuration of an isolated interpreter that disallows fork,
|
||||
/// exec, and Python threads.
|
||||
static inline subinterpreter create() {
|
||||
// same as the default config in the python docs
|
||||
PyInterpreterConfig cfg;
|
||||
std::memset(&cfg, 0, sizeof(cfg));
|
||||
cfg.allow_threads = 1;
|
||||
cfg.check_multi_interp_extensions = 1;
|
||||
cfg.gil = PyInterpreterConfig_OWN_GIL;
|
||||
return create(cfg);
|
||||
}
|
||||
|
||||
~subinterpreter() {
|
||||
if (!creation_tstate_) {
|
||||
// non-owning wrapper, do nothing.
|
||||
return;
|
||||
}
|
||||
|
||||
PyThreadState *destroy_tstate;
|
||||
PyThreadState *old_tstate;
|
||||
|
||||
// Python 3.12 requires us to keep the original PyThreadState alive until we are ready to
|
||||
// destroy the interpreter. We prefer to use that to destroy the interpreter.
|
||||
#if PY_VERSION_HEX < 0x030D0000
|
||||
// The tstate passed to Py_EndInterpreter MUST have been created on the current OS thread.
|
||||
bool same_thread = false;
|
||||
# ifdef PY_HAVE_THREAD_NATIVE_ID
|
||||
same_thread = PyThread_get_thread_native_id() == creation_tstate_->native_thread_id;
|
||||
# endif
|
||||
if (same_thread) {
|
||||
// OK it is safe to use the creation state here
|
||||
destroy_tstate = creation_tstate_;
|
||||
old_tstate = PyThreadState_Swap(destroy_tstate);
|
||||
} else {
|
||||
// We have to make a new tstate on this thread and use that.
|
||||
destroy_tstate = PyThreadState_New(istate_);
|
||||
old_tstate = PyThreadState_Swap(destroy_tstate);
|
||||
|
||||
// We can use the one we just created, so we must delete the creation state.
|
||||
PyThreadState_Clear(creation_tstate_);
|
||||
PyThreadState_Delete(creation_tstate_);
|
||||
}
|
||||
#else
|
||||
destroy_tstate = PyThreadState_New(istate_);
|
||||
old_tstate = PyThreadState_Swap(destroy_tstate);
|
||||
#endif
|
||||
|
||||
bool switch_back = old_tstate && old_tstate->interp != istate_;
|
||||
|
||||
// Internals always exists in the subinterpreter, this class enforces it when it creates
|
||||
// the subinterpreter. Even if it didn't, this only creates the pointer-to-pointer, not the
|
||||
// internals themselves.
|
||||
detail::get_internals_pp_manager().get_pp();
|
||||
detail::get_local_internals_pp_manager().get_pp();
|
||||
|
||||
// End it
|
||||
Py_EndInterpreter(destroy_tstate);
|
||||
|
||||
// It's possible for the internals to be created during endinterpreter (e.g. if a
|
||||
// py::capsule calls `get_internals()` during destruction), so we destroy afterward.
|
||||
detail::get_internals_pp_manager().destroy();
|
||||
detail::get_local_internals_pp_manager().destroy();
|
||||
|
||||
// switch back to the old tstate and old GIL (if there was one)
|
||||
if (switch_back)
|
||||
PyThreadState_Swap(old_tstate);
|
||||
}
|
||||
|
||||
/// Get a handle to the main interpreter that can be used with subinterpreter_scoped_activate
|
||||
/// Note that destructing the handle is a noop, the main interpreter can only be ended by
|
||||
/// py::finalize_interpreter()
|
||||
static subinterpreter main() {
|
||||
subinterpreter m;
|
||||
m.istate_ = PyInterpreterState_Main();
|
||||
m.disarm(); // make destruct a noop
|
||||
return m;
|
||||
}
|
||||
|
||||
/// Get a non-owning wrapper of the currently active interpreter (if any)
|
||||
static subinterpreter current() {
|
||||
subinterpreter c;
|
||||
c.istate_ = detail::get_interpreter_state_unchecked();
|
||||
c.disarm(); // make destruct a noop, we don't own this...
|
||||
return c;
|
||||
}
|
||||
|
||||
/// Get the numerical identifier for the sub-interpreter
|
||||
int64_t id() const {
|
||||
if (istate_ != nullptr)
|
||||
return PyInterpreterState_GetID(istate_);
|
||||
else
|
||||
return -1; // CPython uses one-up numbers from 0, so negative should be safe to return
|
||||
// here.
|
||||
}
|
||||
|
||||
/// Get the interpreter's state dict. This interpreter's GIL must be held before calling!
|
||||
dict state_dict() { return reinterpret_borrow<dict>(PyInterpreterState_GetDict(istate_)); }
|
||||
|
||||
/// abandon cleanup of this subinterpreter (leak it). this might be needed during
|
||||
/// finalization...
|
||||
void disarm() { creation_tstate_ = nullptr; }
|
||||
|
||||
/// An empty wrapper cannot be activated
|
||||
bool empty() const { return istate_ == nullptr; }
|
||||
|
||||
/// Is this wrapper non-empty
|
||||
explicit operator bool() const { return !empty(); }
|
||||
|
||||
private:
|
||||
friend class subinterpreter_scoped_activate;
|
||||
PyInterpreterState *istate_ = nullptr;
|
||||
PyThreadState *creation_tstate_ = nullptr;
|
||||
};
|
||||
|
||||
class scoped_subinterpreter {
|
||||
public:
|
||||
scoped_subinterpreter() : si_(subinterpreter::create()), scope_(si_) {}
|
||||
|
||||
explicit scoped_subinterpreter(PyInterpreterConfig const &cfg)
|
||||
: si_(subinterpreter::create(cfg)), scope_(si_) {}
|
||||
|
||||
private:
|
||||
subinterpreter si_;
|
||||
subinterpreter_scoped_activate scope_;
|
||||
};
|
||||
|
||||
inline subinterpreter_scoped_activate::subinterpreter_scoped_activate(subinterpreter const &si) {
|
||||
if (!si.istate_) {
|
||||
pybind11_fail("null subinterpreter");
|
||||
}
|
||||
|
||||
if (detail::get_interpreter_state_unchecked() == si.istate_) {
|
||||
// we are already on this interpreter, make sure we hold the GIL
|
||||
simple_gil_ = true;
|
||||
gil_state_ = PyGILState_Ensure();
|
||||
return;
|
||||
}
|
||||
|
||||
// we can't really interact with the interpreter at all until we switch to it
|
||||
// not even to, for example, look in its state dict or touch its internals
|
||||
tstate_ = PyThreadState_New(si.istate_);
|
||||
|
||||
// make the interpreter active and acquire the GIL
|
||||
old_tstate_ = PyThreadState_Swap(tstate_);
|
||||
|
||||
// save this in internals for scoped_gil calls
|
||||
detail::get_internals().tstate = tstate_;
|
||||
}
|
||||
|
||||
inline subinterpreter_scoped_activate::~subinterpreter_scoped_activate() {
|
||||
if (simple_gil_) {
|
||||
// We were on this interpreter already, so just make sure the GIL goes back as it was
|
||||
PyGILState_Release(gil_state_);
|
||||
} else {
|
||||
if (tstate_) {
|
||||
#if defined(PYBIND11_DETAILED_ERROR_MESSAGES)
|
||||
if (detail::get_thread_state_unchecked() != tstate_) {
|
||||
pybind11_fail("~subinterpreter_scoped_activate: thread state must be current!");
|
||||
}
|
||||
#endif
|
||||
detail::get_internals().tstate.reset();
|
||||
PyThreadState_Clear(tstate_);
|
||||
PyThreadState_DeleteCurrent();
|
||||
}
|
||||
|
||||
// Go back the previous interpreter (if any) and acquire THAT gil
|
||||
PyThreadState_Swap(old_tstate_);
|
||||
}
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
@@ -0,0 +1,65 @@
|
||||
// Copyright (c) 2021 The Pybind Development Team.
|
||||
// All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "detail/common.h"
|
||||
#include "detail/using_smart_holder.h"
|
||||
#include "detail/value_and_holder.h"
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
// PYBIND11:REMINDER: Needs refactoring of existing pybind11 code.
|
||||
inline bool deregister_instance(instance *self, void *valptr, const type_info *tinfo);
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
// The original core idea for this struct goes back to PyCLIF:
|
||||
// https://github.com/google/clif/blob/07f95d7e69dca2fcf7022978a55ef3acff506c19/clif/python/runtime.cc#L37
|
||||
// URL provided here mainly to give proper credit.
|
||||
struct trampoline_self_life_support {
|
||||
// NOTE: PYBIND11_INTERNALS_VERSION needs to be bumped if changes are made to this struct.
|
||||
detail::value_and_holder v_h;
|
||||
|
||||
trampoline_self_life_support() = default;
|
||||
|
||||
void activate_life_support(const detail::value_and_holder &v_h_) {
|
||||
Py_INCREF((PyObject *) v_h_.inst);
|
||||
v_h = v_h_;
|
||||
}
|
||||
|
||||
void deactivate_life_support() {
|
||||
Py_DECREF((PyObject *) v_h.inst);
|
||||
v_h = detail::value_and_holder();
|
||||
}
|
||||
|
||||
~trampoline_self_life_support() {
|
||||
if (v_h.inst != nullptr && v_h.vh != nullptr) {
|
||||
void *value_void_ptr = v_h.value_ptr();
|
||||
if (value_void_ptr != nullptr) {
|
||||
PyGILState_STATE threadstate = PyGILState_Ensure();
|
||||
v_h.value_ptr() = nullptr;
|
||||
v_h.holder<smart_holder>().release_disowned();
|
||||
detail::deregister_instance(v_h.inst, value_void_ptr, v_h.type);
|
||||
Py_DECREF((PyObject *) v_h.inst); // Must be after deregister.
|
||||
PyGILState_Release(threadstate);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// For the next two, the default implementations generate undefined behavior (ASAN failures
|
||||
// manually verified). The reason is that v_h needs to be kept default-initialized.
|
||||
trampoline_self_life_support(const trampoline_self_life_support &) {}
|
||||
trampoline_self_life_support(trampoline_self_life_support &&) noexcept {}
|
||||
|
||||
// These should never be needed (please provide test cases if you think they are).
|
||||
trampoline_self_life_support &operator=(const trampoline_self_life_support &) = delete;
|
||||
trampoline_self_life_support &operator=(trampoline_self_life_support &&) = delete;
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
using get_trampoline_self_life_support_fn = trampoline_self_life_support *(*) (void *);
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
@@ -0,0 +1,61 @@
|
||||
// Copyright (c) 2023 The pybind Community.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "detail/common.h"
|
||||
#include "detail/descr.h"
|
||||
#include "cast.h"
|
||||
#include "pytypes.h"
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
template <>
|
||||
class type_caster<PyObject> {
|
||||
public:
|
||||
static constexpr auto name = const_name("object"); // See discussion under PR #4601.
|
||||
|
||||
// This overload is purely to guard against accidents.
|
||||
template <typename T,
|
||||
detail::enable_if_t<!is_same_ignoring_cvref<T, PyObject *>::value, int> = 0>
|
||||
static handle cast(T &&, return_value_policy, handle /*parent*/) {
|
||||
static_assert(is_same_ignoring_cvref<T, PyObject *>::value,
|
||||
"Invalid C++ type T for to-Python conversion (type_caster<PyObject>).");
|
||||
return nullptr; // Unreachable.
|
||||
}
|
||||
|
||||
static handle cast(PyObject *src, return_value_policy policy, handle /*parent*/) {
|
||||
if (src == nullptr) {
|
||||
throw error_already_set();
|
||||
}
|
||||
if (PyErr_Occurred()) {
|
||||
raise_from(PyExc_SystemError, "src != nullptr but PyErr_Occurred()");
|
||||
throw error_already_set();
|
||||
}
|
||||
if (policy == return_value_policy::take_ownership) {
|
||||
return src;
|
||||
}
|
||||
if (policy == return_value_policy::reference
|
||||
|| policy == return_value_policy::automatic_reference) {
|
||||
return handle(src).inc_ref();
|
||||
}
|
||||
pybind11_fail("type_caster<PyObject>::cast(): unsupported return_value_policy: "
|
||||
+ std::to_string(static_cast<int>(policy)));
|
||||
}
|
||||
|
||||
bool load(handle src, bool) {
|
||||
value = reinterpret_borrow<object>(src);
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
using cast_op_type = PyObject *;
|
||||
|
||||
explicit operator PyObject *() { return value.ptr(); }
|
||||
|
||||
private:
|
||||
object value;
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
298
deps_src/pybind11/include/pybind11/typing.h
Normal file
298
deps_src/pybind11/include/pybind11/typing.h
Normal file
@@ -0,0 +1,298 @@
|
||||
/*
|
||||
pybind11/typing.h: Convenience wrapper classes for basic Python types
|
||||
with more explicit annotations.
|
||||
|
||||
Copyright (c) 2023 Dustin Spicuzza <dustin@virtualroadside.com>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "detail/common.h"
|
||||
#include "cast.h"
|
||||
#include "pytypes.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#if defined(__cpp_nontype_template_args) && __cpp_nontype_template_args >= 201911L
|
||||
# define PYBIND11_TYPING_H_HAS_STRING_LITERAL
|
||||
# include <numeric>
|
||||
# include <ranges>
|
||||
# include <string_view>
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
PYBIND11_NAMESPACE_BEGIN(typing)
|
||||
|
||||
/*
|
||||
The following types can be used to direct pybind11-generated docstrings
|
||||
to have have more explicit types (e.g., `list[str]` instead of `list`).
|
||||
Just use these in place of existing types.
|
||||
|
||||
There is no additional enforcement of types at runtime.
|
||||
*/
|
||||
|
||||
template <typename... Types>
|
||||
class Tuple : public tuple {
|
||||
using tuple::tuple;
|
||||
};
|
||||
|
||||
template <typename K, typename V>
|
||||
class Dict : public dict {
|
||||
using dict::dict;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class List : public list {
|
||||
using list::list;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class Set : public set {
|
||||
using set::set;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class Iterable : public iterable {
|
||||
using iterable::iterable;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class Iterator : public iterator {
|
||||
using iterator::iterator;
|
||||
};
|
||||
|
||||
template <typename Signature>
|
||||
class Callable;
|
||||
|
||||
template <typename Return, typename... Args>
|
||||
class Callable<Return(Args...)> : public function {
|
||||
using function::function;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class Type : public type {
|
||||
using type::type;
|
||||
};
|
||||
|
||||
template <typename... Types>
|
||||
class Union : public object {
|
||||
PYBIND11_OBJECT_DEFAULT(Union, object, PyObject_Type)
|
||||
using object::object;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class Optional : public object {
|
||||
PYBIND11_OBJECT_DEFAULT(Optional, object, PyObject_Type)
|
||||
using object::object;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class Final : public object {
|
||||
PYBIND11_OBJECT_DEFAULT(Final, object, PyObject_Type)
|
||||
using object::object;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class ClassVar : public object {
|
||||
PYBIND11_OBJECT_DEFAULT(ClassVar, object, PyObject_Type)
|
||||
using object::object;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class TypeGuard : public bool_ {
|
||||
using bool_::bool_;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class TypeIs : public bool_ {
|
||||
using bool_::bool_;
|
||||
};
|
||||
|
||||
class NoReturn : public none {
|
||||
using none::none;
|
||||
};
|
||||
|
||||
class Never : public none {
|
||||
using none::none;
|
||||
};
|
||||
|
||||
#if defined(PYBIND11_TYPING_H_HAS_STRING_LITERAL)
|
||||
template <size_t N>
|
||||
struct StringLiteral {
|
||||
constexpr StringLiteral(const char (&str)[N]) { std::copy_n(str, N, name); }
|
||||
char name[N];
|
||||
};
|
||||
|
||||
template <StringLiteral... StrLits>
|
||||
class Literal : public object {
|
||||
PYBIND11_OBJECT_DEFAULT(Literal, object, PyObject_Type)
|
||||
};
|
||||
|
||||
// Example syntax for creating a TypeVar.
|
||||
// typedef typing::TypeVar<"T"> TypeVarT;
|
||||
template <StringLiteral>
|
||||
class TypeVar : public object {
|
||||
PYBIND11_OBJECT_DEFAULT(TypeVar, object, PyObject_Type)
|
||||
using object::object;
|
||||
};
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_END(typing)
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
template <typename... Types>
|
||||
struct handle_type_name<typing::Tuple<Types...>> {
|
||||
static constexpr auto name = const_name("tuple[")
|
||||
+ ::pybind11::detail::concat(make_caster<Types>::name...)
|
||||
+ const_name("]");
|
||||
};
|
||||
|
||||
template <>
|
||||
struct handle_type_name<typing::Tuple<>> {
|
||||
// PEP 484 specifies this syntax for an empty tuple
|
||||
static constexpr auto name = const_name("tuple[()]");
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct handle_type_name<typing::Tuple<T, ellipsis>> {
|
||||
// PEP 484 specifies this syntax for a variable-length tuple
|
||||
static constexpr auto name
|
||||
= const_name("tuple[") + make_caster<T>::name + const_name(", ...]");
|
||||
};
|
||||
|
||||
template <typename K, typename V>
|
||||
struct handle_type_name<typing::Dict<K, V>> {
|
||||
static constexpr auto name = const_name("dict[") + make_caster<K>::name + const_name(", ")
|
||||
+ make_caster<V>::name + const_name("]");
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct handle_type_name<typing::List<T>> {
|
||||
static constexpr auto name = const_name("list[") + make_caster<T>::name + const_name("]");
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct handle_type_name<typing::Set<T>> {
|
||||
static constexpr auto name = const_name("set[") + make_caster<T>::name + const_name("]");
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct handle_type_name<typing::Iterable<T>> {
|
||||
static constexpr auto name
|
||||
= const_name("collections.abc.Iterable[") + make_caster<T>::name + const_name("]");
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct handle_type_name<typing::Iterator<T>> {
|
||||
static constexpr auto name
|
||||
= const_name("collections.abc.Iterator[") + make_caster<T>::name + const_name("]");
|
||||
};
|
||||
|
||||
template <typename Return, typename... Args>
|
||||
struct handle_type_name<typing::Callable<Return(Args...)>> {
|
||||
using retval_type = conditional_t<std::is_same<Return, void>::value, void_type, Return>;
|
||||
static constexpr auto name
|
||||
= const_name("collections.abc.Callable[[")
|
||||
+ ::pybind11::detail::concat(::pybind11::detail::arg_descr(make_caster<Args>::name)...)
|
||||
+ const_name("], ") + ::pybind11::detail::return_descr(make_caster<retval_type>::name)
|
||||
+ const_name("]");
|
||||
};
|
||||
|
||||
template <typename Return>
|
||||
struct handle_type_name<typing::Callable<Return(ellipsis)>> {
|
||||
// PEP 484 specifies this syntax for defining only return types of callables
|
||||
using retval_type = conditional_t<std::is_same<Return, void>::value, void_type, Return>;
|
||||
static constexpr auto name = const_name("collections.abc.Callable[..., ")
|
||||
+ ::pybind11::detail::return_descr(make_caster<retval_type>::name)
|
||||
+ const_name("]");
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct handle_type_name<typing::Type<T>> {
|
||||
static constexpr auto name = const_name("type[") + make_caster<T>::name + const_name("]");
|
||||
};
|
||||
|
||||
template <typename... Types>
|
||||
struct handle_type_name<typing::Union<Types...>> {
|
||||
static constexpr auto name = ::pybind11::detail::union_concat(make_caster<Types>::name...);
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct handle_type_name<typing::Optional<T>> {
|
||||
static constexpr auto name = make_caster<T>::name | make_caster<none>::name;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct handle_type_name<typing::Final<T>> {
|
||||
static constexpr auto name = const_name("typing.Final[")
|
||||
+ ::pybind11::detail::return_descr(make_caster<T>::name)
|
||||
+ const_name("]");
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct handle_type_name<typing::ClassVar<T>> {
|
||||
static constexpr auto name
|
||||
= const_name("typing.ClassVar[") + make_caster<T>::name + const_name("]");
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct handle_type_name<typing::TypeGuard<T>> {
|
||||
static constexpr auto name = const_name(PYBIND11_TYPE_GUARD_TYPE_HINT) + const_name("[")
|
||||
+ make_caster<T>::name + const_name("]");
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct handle_type_name<typing::TypeIs<T>> {
|
||||
static constexpr auto name = const_name(PYBIND11_TYPE_IS_TYPE_HINT) + const_name("[")
|
||||
+ make_caster<T>::name + const_name("]");
|
||||
};
|
||||
|
||||
template <>
|
||||
struct handle_type_name<typing::NoReturn> {
|
||||
static constexpr auto name = const_name("typing.NoReturn");
|
||||
};
|
||||
|
||||
template <>
|
||||
struct handle_type_name<typing::Never> {
|
||||
static constexpr auto name = const_name(PYBIND11_NEVER_TYPE_HINT);
|
||||
};
|
||||
|
||||
#if defined(PYBIND11_TYPING_H_HAS_STRING_LITERAL)
|
||||
template <typing::StringLiteral StrLit>
|
||||
consteval auto sanitize_string_literal() {
|
||||
constexpr std::string_view v(StrLit.name);
|
||||
constexpr std::string_view special_chars("!@%{}-");
|
||||
constexpr auto num_special_chars = std::accumulate(
|
||||
special_chars.begin(), special_chars.end(), (size_t) 0, [&v](auto acc, const char &c) {
|
||||
return std::move(acc) + std::ranges::count(v, c);
|
||||
});
|
||||
char result[v.size() + num_special_chars + 1];
|
||||
size_t i = 0;
|
||||
for (auto c : StrLit.name) {
|
||||
if (special_chars.find(c) != std::string_view::npos) {
|
||||
result[i++] = '!';
|
||||
}
|
||||
result[i++] = c;
|
||||
}
|
||||
return typing::StringLiteral(result);
|
||||
}
|
||||
|
||||
template <typing::StringLiteral... Literals>
|
||||
struct handle_type_name<typing::Literal<Literals...>> {
|
||||
static constexpr auto name
|
||||
= const_name("typing.Literal[")
|
||||
+ pybind11::detail::concat(const_name(sanitize_string_literal<Literals>().name)...)
|
||||
+ const_name("]");
|
||||
};
|
||||
template <typing::StringLiteral StrLit>
|
||||
struct handle_type_name<typing::TypeVar<StrLit>> {
|
||||
static constexpr auto name = const_name(sanitize_string_literal<StrLit>().name);
|
||||
};
|
||||
#endif
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
75
deps_src/pybind11/include/pybind11/warnings.h
Normal file
75
deps_src/pybind11/include/pybind11/warnings.h
Normal file
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
pybind11/warnings.h: Python warnings wrappers.
|
||||
|
||||
Copyright (c) 2024 Jan Iwaszkiewicz <jiwaszkiewicz6@gmail.com>
|
||||
|
||||
All rights reserved. Use of this source code is governed by a
|
||||
BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pybind11.h"
|
||||
#include "detail/common.h"
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
|
||||
inline bool PyWarning_Check(PyObject *obj) {
|
||||
int result = PyObject_IsSubclass(obj, PyExc_Warning);
|
||||
if (result == 1) {
|
||||
return true;
|
||||
}
|
||||
if (result == -1) {
|
||||
raise_from(PyExc_SystemError,
|
||||
"pybind11::detail::PyWarning_Check(): PyObject_IsSubclass() call failed.");
|
||||
throw error_already_set();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(detail)
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(warnings)
|
||||
|
||||
inline object
|
||||
new_warning_type(handle scope, const char *name, handle base = PyExc_RuntimeWarning) {
|
||||
if (!detail::PyWarning_Check(base.ptr())) {
|
||||
pybind11_fail("pybind11::warnings::new_warning_type(): cannot create custom warning, base "
|
||||
"must be a subclass of "
|
||||
"PyExc_Warning!");
|
||||
}
|
||||
if (hasattr(scope, name)) {
|
||||
pybind11_fail("pybind11::warnings::new_warning_type(): an attribute with name \""
|
||||
+ std::string(name) + "\" exists already.");
|
||||
}
|
||||
std::string full_name = scope.attr("__name__").cast<std::string>() + std::string(".") + name;
|
||||
handle h(PyErr_NewException(full_name.c_str(), base.ptr(), nullptr));
|
||||
if (!h) {
|
||||
raise_from(PyExc_SystemError,
|
||||
"pybind11::warnings::new_warning_type(): PyErr_NewException() call failed.");
|
||||
throw error_already_set();
|
||||
}
|
||||
auto obj = reinterpret_steal<object>(h);
|
||||
scope.attr(name) = obj;
|
||||
return obj;
|
||||
}
|
||||
|
||||
// Similar to Python `warnings.warn()`
|
||||
inline void
|
||||
warn(const char *message, handle category = PyExc_RuntimeWarning, int stack_level = 2) {
|
||||
if (!detail::PyWarning_Check(category.ptr())) {
|
||||
pybind11_fail(
|
||||
"pybind11::warnings::warn(): cannot raise warning, category must be a subclass of "
|
||||
"PyExc_Warning!");
|
||||
}
|
||||
|
||||
if (PyErr_WarnEx(category.ptr(), message, stack_level) == -1) {
|
||||
throw error_already_set();
|
||||
}
|
||||
}
|
||||
|
||||
PYBIND11_NAMESPACE_END(warnings)
|
||||
|
||||
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -3915,6 +3915,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr ""
|
||||
|
||||
#, possible-c-format, possible-boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
"It has been reset to 0.2"
|
||||
@@ -7514,6 +7518,45 @@ msgstr ""
|
||||
msgid "Choose Download Directory"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, possible-c-format, possible-boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate"
|
||||
msgstr ""
|
||||
|
||||
@@ -7568,12 +7611,6 @@ msgstr ""
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr ""
|
||||
|
||||
@@ -7604,6 +7641,12 @@ msgstr ""
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr ""
|
||||
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr ""
|
||||
|
||||
@@ -7622,10 +7665,16 @@ msgstr ""
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr ""
|
||||
|
||||
msgid "Auto backup"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgid "bits"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Preset"
|
||||
@@ -7658,6 +7707,12 @@ msgstr ""
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Features"
|
||||
msgstr ""
|
||||
|
||||
@@ -7670,18 +7725,6 @@ msgstr ""
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
msgid "bits"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr ""
|
||||
|
||||
@@ -7906,18 +7949,6 @@ msgstr ""
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr ""
|
||||
|
||||
@@ -7930,6 +7961,15 @@ msgstr ""
|
||||
msgid "Color only"
|
||||
msgstr ""
|
||||
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -7942,30 +7982,6 @@ msgstr ""
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, possible-c-format, possible-boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr ""
|
||||
|
||||
@@ -8008,7 +8024,16 @@ msgstr ""
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8016,12 +8041,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr ""
|
||||
|
||||
@@ -8048,24 +8067,6 @@ msgstr ""
|
||||
msgid "trace"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Debug"
|
||||
msgstr ""
|
||||
|
||||
@@ -8081,24 +8082,6 @@ msgstr ""
|
||||
msgid "Preferences sync"
|
||||
msgstr ""
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr ""
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr ""
|
||||
|
||||
@@ -8784,6 +8767,12 @@ msgstr ""
|
||||
msgid "Search in preset"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr ""
|
||||
|
||||
@@ -9050,6 +9039,18 @@ msgstr ""
|
||||
msgid "Print chamber temperature"
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr ""
|
||||
|
||||
@@ -9359,11 +9360,21 @@ msgid "Don't warn again for this preset"
|
||||
msgstr ""
|
||||
|
||||
#, possible-c-format, possible-boost-format
|
||||
msgid "Left: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, possible-c-format, possible-boost-format
|
||||
msgid "Right: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, possible-c-format, possible-boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
@@ -9381,7 +9392,7 @@ msgstr ""
|
||||
msgid "Transfer or discard changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr ""
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9492,6 +9503,12 @@ msgstr ""
|
||||
msgid "Capabilities"
|
||||
msgstr ""
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr ""
|
||||
|
||||
@@ -11441,6 +11458,23 @@ msgstr ""
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr ""
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr ""
|
||||
|
||||
@@ -11618,12 +11652,26 @@ msgstr ""
|
||||
msgid "Octagram Spiral"
|
||||
msgstr ""
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr ""
|
||||
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr ""
|
||||
|
||||
@@ -11877,18 +11925,6 @@ msgstr ""
|
||||
msgid "Auto For Match"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr ""
|
||||
|
||||
@@ -12213,6 +12249,7 @@ msgstr ""
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -12279,85 +12316,13 @@ msgstr ""
|
||||
msgid "Gyroid"
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr ""
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr ""
|
||||
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
@@ -12369,14 +12334,6 @@ msgstr ""
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr ""
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr ""
|
||||
|
||||
@@ -12464,6 +12421,17 @@ msgstr ""
|
||||
msgid "layer"
|
||||
msgstr ""
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr ""
|
||||
|
||||
@@ -12940,6 +12908,69 @@ msgstr ""
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr ""
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -13741,6 +13772,18 @@ msgstr ""
|
||||
msgid "Bowden"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr ""
|
||||
|
||||
@@ -14135,6 +14178,9 @@ msgstr ""
|
||||
msgid "Slicing Mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr ""
|
||||
|
||||
@@ -14468,9 +14514,6 @@ msgid ""
|
||||
"This option relies on the firmware supporting the M191 and M141 commands either via macros or natively and is usually used when an active chamber heater is installed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -14479,6 +14522,17 @@ msgid ""
|
||||
"If enabled, this parameter also sets a G-code variable named chamber_temperature, which can be used to pass the desired chamber temperature to your print start macro, or a heat soak macro like this: PRINT_START (other variables) CHAMBER_TEMP=[chamber_temperature]. This may be useful if your printer does not support M141/M191 commands, or if you desire to handle heat soaking in the print start macro if no active chamber heater is installed."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr ""
|
||||
|
||||
@@ -14518,20 +14572,6 @@ msgstr ""
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr ""
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr ""
|
||||
|
||||
@@ -16971,6 +17011,132 @@ msgstr ""
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, possible-c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -17053,6 +17219,19 @@ msgstr ""
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, possible-c-format, possible-boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: 2025-03-15 10:55+0100\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
@@ -1726,7 +1726,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "Des de la versió 2.4.0, OrcaSlicer sincronitza els perfils d'usuari a través d'Orca Cloud en lloc de Bambu Cloud.\n\nPer migrar els teus perfils existents, inicia la sessió a Orca Cloud i es transferiran automàticament. Per obtenir més informació sobre com OrcaSlicer emmagatzema i sincronitza els teus perfils, o per migrar els teus perfils manualment, consulta la nostra wiki.\n\nSi no feies servir Bambu Cloud per sincronitzar perfils, aquest canvi no t'afecta i pots ignorar aquest missatge amb tranquil·litat."
|
||||
msgstr ""
|
||||
"Des de la versió 2.4.0, OrcaSlicer sincronitza els perfils d'usuari a través d'Orca Cloud en lloc de Bambu Cloud.\n"
|
||||
"\n"
|
||||
"Per migrar els teus perfils existents, inicia la sessió a Orca Cloud i es transferiran automàticament. Per obtenir més informació sobre com OrcaSlicer emmagatzema i sincronitza els teus perfils, o per migrar els teus perfils manualment, consulta la nostra wiki.\n"
|
||||
"\n"
|
||||
"Si no feies servir Bambu Cloud per sincronitzar perfils, aquest canvi no t'afecta i pots ignorar aquest missatge amb tranquil·litat."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4106,6 +4111,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "La temperatura actual de la cambra és superior a la temperatura segura del material, pot provocar un estovament i obstrucció del material. La temperatura màxima segura per al material és %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7894,6 +7903,50 @@ msgstr "Trieu la carpeta per als elements descarregats"
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "Triar el Directori de Descàrrega"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Última)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Connector de xarxa canviat correctament."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Èxit"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "No s'ha pogut carregar el connector de xarxa. Reinicieu l'aplicació."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Heu seleccionat la versió %s del connector de xarxa.\n"
|
||||
"\n"
|
||||
"Voleu descarregar i instal·lar aquesta versió ara?\n"
|
||||
"\n"
|
||||
"Nota: pot ser necessari reiniciar l'aplicació després de la instal·lació."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Descarrega el connector de xarxa"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Recarrega el connector de xarxa sense reiniciar l'aplicació"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Connector de xarxa recarregat correctament."
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Recarrega"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "No s'ha pogut recarregar el connector de xarxa. Reinicieu l'aplicació."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "La recàrrega ha fallat"
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "Associar"
|
||||
|
||||
@@ -7949,12 +8002,6 @@ msgstr "Mostrar pantalla de presentació"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Mostra la pantalla de presentació durant l'inici."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr ""
|
||||
|
||||
@@ -7985,6 +8032,13 @@ msgstr "Carregar comportament"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "S'ha de carregar la configuració de la impressora/filament/procés en obrir un .3mf?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Còpia de seguretat automàtica"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Feu còpies de seguretat del vostre projecte periòdicament per restaurar en cas de fallida ocasional."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "Nombre màxim de fitxers recents"
|
||||
|
||||
@@ -8003,12 +8057,20 @@ msgstr "Mostra opcions en importar fitxers STEP"
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "Si s'activa, apareixerà un diàleg de configuració de paràmetres durant la importació de fitxers STEP."
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Còpia de seguretat automàtica"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Nivell de qualitat per a l'exportació Draco"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Feu còpies de seguretat del vostre projecte periòdicament per restaurar en cas de fallida ocasional."
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Controla la profunditat de bits de quantització utilitzada en comprimir la malla a format Draco.\n"
|
||||
"0 = compressió sense pèrdua (la geometria es preserva a plena precisió). Els valors amb pèrdua vàlids van de 8 a 30.\n"
|
||||
"Valors més baixos produeixen fitxers més petits però perden més detall geomètric; valors més alts preserven més detall a costa de fitxers més grans."
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Perfil"
|
||||
@@ -8040,6 +8102,12 @@ msgstr ""
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr "Optimitza l'alçada màxima de l'àrea de filaments segons el nombre de filaments triat."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Features"
|
||||
msgstr "Funcionalitats"
|
||||
|
||||
@@ -8052,21 +8120,6 @@ msgstr "Amb aquesta opció habilitada, podeu enviar una tasca a diversos disposi
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "Finestra emergent per seleccionar el mode d'agrupació de filaments"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Nivell de qualitat per a l'exportació Draco"
|
||||
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Controla la profunditat de bits de quantització utilitzada en comprimir la malla a format Draco.\n"
|
||||
"0 = compressió sense pèrdua (la geometria es preserva a plena precisió). Els valors amb pèrdua vàlids van de 8 a 30.\n"
|
||||
"Valors més baixos produeixen fitxers més petits però perden més detall geomètric; valors més alts preserven més detall a costa de fitxers més grans."
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "Comportament"
|
||||
|
||||
@@ -8294,19 +8347,6 @@ msgstr "Comprovar només si hi ha actualitzacions estables"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Sincronització automàtica dels perfils de l'usuari ( Impressora/Filament/Processament )"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Actualitzar els perfils de fàbrica automàticament."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Utilitza fitxer xifrat per a l'emmagatzematge de tokens"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Emmagatzema els tokens d'autenticació en un fitxer xifrat en lloc del clauer del sistema. (Requereix reinici)"
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr "Opcions de sincronització de filament"
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr "Mode de sincronització de filament"
|
||||
|
||||
@@ -8319,6 +8359,16 @@ msgstr "Filament i color"
|
||||
msgid "Color only"
|
||||
msgstr "Només color"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Actualitzar els perfils de fàbrica automàticament."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Utilitza fitxer xifrat per a l'emmagatzematge de tokens"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Emmagatzema els tokens d'autenticació en un fitxer xifrat en lloc del clauer del sistema. (Requereix reinici)"
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8331,35 +8381,6 @@ msgstr "Versió del connector de xarxa"
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr "Seleccioneu la versió del connector de xarxa a utilitzar"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Última)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Connector de xarxa canviat correctament."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Èxit"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "No s'ha pogut carregar el connector de xarxa. Reinicieu l'aplicació."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Heu seleccionat la versió %s del connector de xarxa.\n"
|
||||
"\n"
|
||||
"Voleu descarregar i instal·lar aquesta versió ara?\n"
|
||||
"\n"
|
||||
"Nota: pot ser necessari reiniciar l'aplicació després de la instal·lació."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Descarrega el connector de xarxa"
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Associar fitxers a OrcaSlicer"
|
||||
|
||||
@@ -8408,7 +8429,16 @@ msgstr "Desenvolupador"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "Omet la comprovació de la llista negra AMS"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8416,12 +8446,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "Permet emmagatzematge anormal"
|
||||
|
||||
@@ -8450,24 +8474,6 @@ msgstr "depurar"
|
||||
msgid "trace"
|
||||
msgstr "traça"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr "Connector de xarxa"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Recarrega"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Recarrega el connector de xarxa sense reiniciar l'aplicació"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Connector de xarxa recarregat correctament."
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "No s'ha pogut recarregar el connector de xarxa. Reinicieu l'aplicació."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "La recàrrega ha fallat"
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "Depuració"
|
||||
|
||||
@@ -8483,25 +8489,6 @@ msgstr "Sincronització de perfil"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Sincronització de preferències"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Veure la configuració del control"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "Rotar la vista"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "Vista Panoràmica"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "Vista amb Zoom"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Altre"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "La roda del ratolí s'inverteix quan es fa zoom"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "Habilitar SSL ( MQTT )"
|
||||
|
||||
@@ -9210,6 +9197,12 @@ msgstr "Suprimeix aquest perfil"
|
||||
msgid "Search in preset"
|
||||
msgstr "Cercar al perfil"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Feu clic per restablir tots els paràmetres a l'última configuració desada."
|
||||
|
||||
@@ -9503,6 +9496,18 @@ msgstr "Relació de Flux i Avanç de Pressió Lineal( Pressure advance )"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "Temperatura de la cambra d'impressió"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Temperatura de la cambra"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Temperatura d'impressió"
|
||||
|
||||
@@ -9825,12 +9830,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "Esquerra: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "Dreta: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "Feu clic per esborrar el valor actual i agafar el valor global."
|
||||
@@ -9850,7 +9865,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "Transferir o descartar canvis"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "Valor antic"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9972,6 +9987,12 @@ msgstr "Nombre d'extrusors"
|
||||
msgid "Capabilities"
|
||||
msgstr "Capacitats"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Mostra tots els perfils ( inclosos els incompatibles )"
|
||||
|
||||
@@ -12096,6 +12117,23 @@ msgstr "Impressió normal"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "L'acceleració predeterminada tant de la impressió normal com dels viatges excepte a la capa inicial"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Acceleració en desplaçaments"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s o %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Acceleració de ponts. Si el valor s'expressa en percentatge ( per exemple, 50% ), es calcularà a partir de l'acceleració del perímetre exterior."
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Perfil de filament predeterminat"
|
||||
|
||||
@@ -12308,6 +12346,12 @@ msgstr "Acords d'Arquimedes"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "Octograma en Espiral"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Densitat de la superfície superior"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Densitat de la capa de superfície superior. Un valor del 100% crea una capa superior completament sòlida i llisa. Reduir aquest valor resulta en una superfície superior texturada, segons el patró de superfície superior triat. Un valor del 0% resultarà en la creació de només les parets a la capa superior. Destinat a fins estètics o funcionals, no per solucionar problemes com la sobreextrusió."
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Patró de superfície inferior"
|
||||
|
||||
@@ -12315,6 +12359,16 @@ msgstr "Patró de superfície inferior"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "Patró de línia del farciment de la superfície inferior, no del farciment de pont"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Densitat de la superfície inferior"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Densitat de la capa de superfície inferior. Destinat a fins estètics o funcionals, no per solucionar problemes com la sobreextrusió.\n"
|
||||
"AVÍS: reduir aquest valor pot afectar negativament l'adhesió al llit."
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "Patró de farciment sòlid intern"
|
||||
|
||||
@@ -12615,18 +12669,6 @@ msgstr "Automàtic per a purga"
|
||||
msgid "Auto For Match"
|
||||
msgstr "Automàtic per a coincidència"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "Temperatura de purga"
|
||||
|
||||
@@ -12969,6 +13011,7 @@ msgstr "Ús de múltiples línies per al patró de farciment, si el patró de fa
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -13036,79 +13079,6 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr "Giroide"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Angle de gelosia 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "L'angle del primer conjunt d'elements de gelosia 2D en la direcció Z. El zero és vertical."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Angle de gelosia 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "L'angle del segon conjunt d'elements de gelosia 2D en la direcció Z. El zero és vertical."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Angle de voladís del farciment"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "L'angle de les línies inclinades del farciment. 60° resultarà en un rusc pur."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Longitud d'ancoratge de farciment poc dens"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Connectar una línia de farciment a un perímetre intern amb un segment curt d'un perímetre addicional. Si s'expressa en percentatge ( per exemple: 15% ) es calcula sobre l'amplada d'extrusió de farciment. Orca Slicer intenta connectar dues línies de farciment properes a un segment perimetral curt. Si no es troba aquest segment perimetral més curt que infill_anchor_max, la línia de farciment es connecta a un segment perimetral a un sol costat i la longitud del segment perimetral pres es limita a aquest paràmetre, però no més de anchor_length_max.\n"
|
||||
"Establiu aquest paràmetre a zero per desactivar els perímetres d'ancoratge connectats a una sola línia de farciment."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 ( sense ancoratges oberts )"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 ( il·limitat )"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Màxima longitud de l'ancoratge de farciment"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Connectar una línia de farciment a un perímetre intern amb un segment curt d'un perímetre addicional. Si s'expressa en percentatge ( per exemple: 15% ) es calcula sobre l'amplada d'extrusió de farciment. Orca Slicer intenta connectar dues línies de farciment properes a un segment perimetral curt. Si no es troba aquest segment perimetral més curt que aquest paràmetre, la línia de farciment es connecta a un segment perimetral a un sol costat i la longitud del segment perimetral pres es limita a infill_anchor, però no més llarga que aquest paràmetre.\n"
|
||||
"Si s'estableix a 0, s'utilitzarà l'algorisme antic per a la connexió de farciment, hauria de crear el mateix resultat que amb 1000 i 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 ( Connexió simple )"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Acceleració en perímetres interiors"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Acceleració en desplaçaments"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "Acceleració del farciment superficial superior. L'ús d'un valor inferior pot millorar la qualitat de la superfície superior"
|
||||
@@ -13117,11 +13087,8 @@ msgstr "Acceleració del farciment superficial superior. L'ús d'un valor inferi
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Acceleració del perímetre exterior. L'ús d'un valor inferior pot millorar la qualitat"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Acceleració de ponts. Si el valor s'expressa en percentatge ( per exemple, 50% ), es calcularà a partir de l'acceleració del perímetre exterior."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s o %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Acceleració en perímetres interiors"
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Acceleració del farciment poc dens. Si el valor s'expressa en percentatge ( per exemple, 100% ), es calcularà a partir de l'acceleració predeterminada."
|
||||
@@ -13133,14 +13100,6 @@ msgstr "Acceleració del farciment sòlid intern. Si el valor s'expressa en perc
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "Acceleració de la capa inicial. L'ús d'un valor inferior pot millorar l'adherència de la placa d'impressió"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "Habilita accel_to_decel"
|
||||
|
||||
@@ -13235,6 +13194,17 @@ msgstr "La velocitat del ventilador augmentarà linealment de zero a la capa \"c
|
||||
msgid "layer"
|
||||
msgstr "capa"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "Velocitat del ventilador a la interfície de suport"
|
||||
|
||||
@@ -13755,6 +13725,73 @@ msgstr "Àrea d'exclusió de sondeig d'acumulació"
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "Àrea d'exclusió de sondeig d'acumulació."
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Angle de gelosia 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "L'angle del primer conjunt d'elements de gelosia 2D en la direcció Z. El zero és vertical."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Angle de gelosia 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "L'angle del segon conjunt d'elements de gelosia 2D en la direcció Z. El zero és vertical."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Angle de voladís del farciment"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "L'angle de les línies inclinades del farciment. 60° resultarà en un rusc pur."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Longitud d'ancoratge de farciment poc dens"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Connectar una línia de farciment a un perímetre intern amb un segment curt d'un perímetre addicional. Si s'expressa en percentatge ( per exemple: 15% ) es calcula sobre l'amplada d'extrusió de farciment. Orca Slicer intenta connectar dues línies de farciment properes a un segment perimetral curt. Si no es troba aquest segment perimetral més curt que infill_anchor_max, la línia de farciment es connecta a un segment perimetral a un sol costat i la longitud del segment perimetral pres es limita a aquest paràmetre, però no més de anchor_length_max.\n"
|
||||
"Establiu aquest paràmetre a zero per desactivar els perímetres d'ancoratge connectats a una sola línia de farciment."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 ( sense ancoratges oberts )"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 ( il·limitat )"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Màxima longitud de l'ancoratge de farciment"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Connectar una línia de farciment a un perímetre intern amb un segment curt d'un perímetre addicional. Si s'expressa en percentatge ( per exemple: 15% ) es calcula sobre l'amplada d'extrusió de farciment. Orca Slicer intenta connectar dues línies de farciment properes a un segment perimetral curt. Si no es troba aquest segment perimetral més curt que aquest paràmetre, la línia de farciment es connecta a un segment perimetral a un sol costat i la longitud del segment perimetral pres es limita a infill_anchor, però no més llarga que aquest paràmetre.\n"
|
||||
"Si s'estableix a 0, s'utilitzarà l'algorisme antic per a la connexió de farciment, hauria de crear el mateix resultat que amb 1000 i 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 ( Connexió simple )"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14623,6 +14660,18 @@ msgstr "Direct Drive"
|
||||
msgid "Bowden"
|
||||
msgstr "Bowden"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Longitud addicional en reiniciar"
|
||||
|
||||
@@ -15044,6 +15093,9 @@ msgstr "Les esquerdes de menys de dues vegades el radi de tancament de buits s'o
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Mode de laminat"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Altre"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "Utilitzeu \"Parell-imparell\" per als models d'avió 3DLabPrint. Utilitzeu \"Tancar forats\" per tancar tots els forats del model."
|
||||
|
||||
@@ -15409,9 +15461,6 @@ msgstr ""
|
||||
"\n"
|
||||
"Aquesta opció es basa en el microprogramari que admet les ordres M191 i M141, ja sigui mitjançant macros o de manera nativa i s'utilitza normalment quan s'instal·la un escalfador de cambra actiu."
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Temperatura de la cambra"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15425,6 +15474,17 @@ msgstr ""
|
||||
"\n"
|
||||
"Si està activat, aquest paràmetre també estableix una variable de codi g anomenada chamber_temperature, que es pot utilitzar per passar la temperatura de la cambra desitjada a la macro d'inici d'impressió, o una macro de remull tèrmic com aquesta: PRINT_START (altres variables) CHAMBER_TEMP=[chamber_temperature]. Això pot ser útil si la vostra impressora no admet les ordres M141/M191, o si voleu gestionar el remull de calor a la macro d'inici d'impressió si no hi ha instal·lat un escalfador de cambra actiu."
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "Temperatura del broquet per les capes després de l'inicial"
|
||||
@@ -15470,22 +15530,6 @@ msgstr "Gruix mínim de la carcassa superior"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "El nombre de capes sòlides superiors augmenta quan es tallen si el gruix calculat per les capes de closca superior és més prim que aquest valor. Això pot evitar tenir una closca massa fina quan l'alçada de la capa és petita. 0 significa que aquesta configuració està desactivada i que el gruix de la carcassa superior està absolutament determinat per les capes de la carcassa superior"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Densitat de la superfície superior"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Densitat de la capa de superfície superior. Un valor del 100% crea una capa superior completament sòlida i llisa. Reduir aquest valor resulta en una superfície superior texturada, segons el patró de superfície superior triat. Un valor del 0% resultarà en la creació de només les parets a la capa superior. Destinat a fins estètics o funcionals, no per solucionar problemes com la sobreextrusió."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Densitat de la superfície inferior"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Densitat de la capa de superfície inferior. Destinat a fins estètics o funcionals, no per solucionar problemes com la sobreextrusió.\n"
|
||||
"AVÍS: reduir aquest valor pot afectar negativament l'adhesió al llit."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Velocitat de desplaçament més ràpida i sense extrusió"
|
||||
@@ -18130,6 +18174,132 @@ msgstr "Iniciar Sessió/Provar"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "No s'ha pogut connectar a les impressores connectades mitjançant l'amfitrió( host ) d'impressió especificat."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -18212,6 +18382,19 @@ msgstr "La connexió amb MKS funciona correctament."
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "No s'ha pogut connectar amb MKS"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "La connexió amb OctoPrint funciona correctament."
|
||||
|
||||
@@ -19368,6 +19551,36 @@ msgstr ""
|
||||
"Evitar la deformació( warping )\n"
|
||||
"Sabíeu que quan imprimiu materials propensos a deformar-se, com ara l'ABS, augmentar adequadament la temperatura del llit pot reduir la probabilitat de deformació?"
|
||||
|
||||
#~ msgid "Filament Sync Options"
|
||||
#~ msgstr "Opcions de sincronització de filament"
|
||||
|
||||
#~ msgid "Network plug-in"
|
||||
#~ msgstr "Connector de xarxa"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Veure la configuració del control"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "Rotar la vista"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "Vista Panoràmica"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "Vista amb Zoom"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "La roda del ratolí s'inverteix quan es fa zoom"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "Esquerra: %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "Dreta: %s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "Habilita el plugin de xarxa"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: Jakub Hencl\n"
|
||||
"Language-Team: \n"
|
||||
@@ -1719,7 +1719,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "Od verze 2.4.0 OrcaSlicer synchronizuje uživatelské profily prostřednictvím Orca Cloud namísto Bambu Cloud.\n\nChcete-li migrovat své stávající profily, přihlaste se k Orca Cloud a budou automaticky přeneseny. Další informace o tom, jak OrcaSlicer ukládá a synchronizuje vaše profily, nebo o ruční migraci vašich předvoleb najdete na naší wiki.\n\nPokud jste k synchronizaci profilů nepoužívali Bambu Cloud, tato změna se vás netýká a můžete tuto zprávu klidně ignorovat."
|
||||
msgstr ""
|
||||
"Od verze 2.4.0 OrcaSlicer synchronizuje uživatelské profily prostřednictvím Orca Cloud namísto Bambu Cloud.\n"
|
||||
"\n"
|
||||
"Chcete-li migrovat své stávající profily, přihlaste se k Orca Cloud a budou automaticky přeneseny. Další informace o tom, jak OrcaSlicer ukládá a synchronizuje vaše profily, nebo o ruční migraci vašich předvoleb najdete na naší wiki.\n"
|
||||
"\n"
|
||||
"Pokud jste k synchronizaci profilů nepoužívali Bambu Cloud, tato změna se vás netýká a můžete tuto zprávu klidně ignorovat."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4104,6 +4109,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "Aktuální teplota komory je vyšší než bezpečná teplota materiálu, což může vést ke změkčení materiálu a ucpání. Maximální bezpečná teplota pro materiál je %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7891,6 +7900,50 @@ msgstr "Vyberte složku pro stažené položky"
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "Vyberte adresář pro stažení"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Nejnovější)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Síťový plugin byl úspěšně přepnut."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Úspěch"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "Nepodařilo se načíst síťový plugin. Restartujte prosím aplikaci."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Vybrali jste verzi síťového pluginu %s.\n"
|
||||
"\n"
|
||||
"Chcete tuto verzi nyní stáhnout a nainstalovat?\n"
|
||||
"\n"
|
||||
"Poznámka: Po instalaci může být nutné restartovat aplikaci."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Stáhnout síťový plugin"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Znovu načíst síťový plugin bez restartu aplikace"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Síťový plugin byl úspěšně znovu načten."
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Znovu načíst"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Nepodařilo se znovu načíst síťový plugin. Restartujte prosím aplikaci."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Znovunačtení selhalo"
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "Přiřadit"
|
||||
|
||||
@@ -7946,12 +7999,6 @@ msgstr "Zobrazit úvodní obrazovku"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Zobrazit úvodní obrazovku při spuštění."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "Zobrazit upozornění na sdílené profily"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "Při změně vybrané tiskárny zobrazit upozornění s odkazem na sdílené profily."
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr "Používat tlačítka okna na levé straně"
|
||||
|
||||
@@ -7982,6 +8029,13 @@ msgstr "Chování při načítání"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "Mají se při otevření souboru 3MF načíst nastavení tiskárny/filamentu/procesu?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Automatické zálohování"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Pravidelně zálohujte svůj projekt pro možnost obnovení po případném pádu."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "Maximální počet nedávných souborů"
|
||||
|
||||
@@ -8000,12 +8054,20 @@ msgstr "Zobrazit možnosti při importu souboru STEP"
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "Pokud je povoleno, během importu souboru STEP se zobrazí dialog nastavení parametrů."
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Automatické zálohování"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Úroveň kvality pro export Draco"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Pravidelně zálohujte svůj projekt pro možnost obnovení po případném pádu."
|
||||
msgid "bits"
|
||||
msgstr "bitů"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Určuje bitovou hloubku kvantizace použitou při kompresi mesh do formátu Draco.\n"
|
||||
"0 = bezztrátová komprese (geometrie je zachována v plné přesnosti). Platné ztrátové hodnoty jsou v rozsahu 8 až 30.\n"
|
||||
"Nižší hodnoty vytvářejí menší soubory, ale ztrácí více geometrických detailů; vyšší hodnoty zachovávají více detailů za cenu větších souborů."
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Předvolba"
|
||||
@@ -8037,6 +8099,12 @@ msgstr "filamenty"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr "Optimalizuje maximální výšku oblasti filamentů podle zvoleného počtu filamentů."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "Zobrazit upozornění na sdílené profily"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "Při změně vybrané tiskárny zobrazit upozornění s odkazem na sdílené profily."
|
||||
|
||||
msgid "Features"
|
||||
msgstr "Funkce"
|
||||
|
||||
@@ -8049,21 +8117,6 @@ msgstr "Pokud je tato volba povolena, můžete odeslat úlohu na více zařízen
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "Zobrazit dialog pro výběr režimu seskupení filamentů"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Úroveň kvality pro export Draco"
|
||||
|
||||
msgid "bits"
|
||||
msgstr "bitů"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Určuje bitovou hloubku kvantizace použitou při kompresi mesh do formátu Draco.\n"
|
||||
"0 = bezztrátová komprese (geometrie je zachována v plné přesnosti). Platné ztrátové hodnoty jsou v rozsahu 8 až 30.\n"
|
||||
"Nižší hodnoty vytvářejí menší soubory, ale ztrácí více geometrických detailů; vyšší hodnoty zachovávají více detailů za cenu větších souborů."
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "Chování"
|
||||
|
||||
@@ -8291,19 +8344,6 @@ msgstr "Kontrolovat pouze stabilní aktualizace"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Automatická synchronizace uživatelských předvoleb (tiskárna/filament/proces)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Automaticky aktualizovat vestavěné předvolby."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Použít šifrovaný soubor pro ukládání tokenů"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Ukládat autentizační tokeny do šifrovaného souboru místo systémového úložiště klíčů. (Vyžaduje restart)"
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr "Možnosti synchronizace filamentů"
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr "Režim synchronizace filamentů"
|
||||
|
||||
@@ -8316,6 +8356,16 @@ msgstr "Filament a barva"
|
||||
msgid "Color only"
|
||||
msgstr "Pouze barva"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Automaticky aktualizovat vestavěné předvolby."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Použít šifrovaný soubor pro ukládání tokenů"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Ukládat autentizační tokeny do šifrovaného souboru místo systémového úložiště klíčů. (Vyžaduje restart)"
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8328,35 +8378,6 @@ msgstr "Verze síťového pluginu"
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr "Vyberte verzi síťového pluginu"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Nejnovější)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Síťový plugin byl úspěšně přepnut."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Úspěch"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "Nepodařilo se načíst síťový plugin. Restartujte prosím aplikaci."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Vybrali jste verzi síťového pluginu %s.\n"
|
||||
"\n"
|
||||
"Chcete tuto verzi nyní stáhnout a nainstalovat?\n"
|
||||
"\n"
|
||||
"Poznámka: Po instalaci může být nutné restartovat aplikaci."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Stáhnout síťový plugin"
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Přiřadit soubory k OrcaSliceru"
|
||||
|
||||
@@ -8402,7 +8423,16 @@ msgstr "Vývojář"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "Přeskočit kontrolu blacklistu AMS"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8410,12 +8440,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "Povolit neobvyklé úložiště"
|
||||
|
||||
@@ -8444,24 +8468,6 @@ msgstr "ladění"
|
||||
msgid "trace"
|
||||
msgstr "trasování"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr "Síťový plugin"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Znovu načíst"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Znovu načíst síťový plugin bez restartu aplikace"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Síťový plugin byl úspěšně znovu načten."
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Nepodařilo se znovu načíst síťový plugin. Restartujte prosím aplikaci."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Znovunačtení selhalo"
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "Ladění"
|
||||
|
||||
@@ -8477,25 +8483,6 @@ msgstr "Synchronizace předvoleb"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Synchronizace předvoleb"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Zobrazit nastavení ovládání"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "Otočit pohled"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "Posouvat pohled"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "Přiblížení zobrazení"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Ostatní"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "Kolečko myši se při přiblížení otáčí opačně"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "Povolit SSL (MQTT)"
|
||||
|
||||
@@ -9202,6 +9189,12 @@ msgstr "Smazat tuto předvolbu"
|
||||
msgid "Search in preset"
|
||||
msgstr "Hledat v předvolbě"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Kliknutím obnovíte všechna nastavení na poslední uloženou předvolbu."
|
||||
|
||||
@@ -9497,6 +9490,18 @@ msgstr "Poměr průtoku a Pressure Advance"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "Teplota tiskové komory"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Teplota komory"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Teplota tisku"
|
||||
|
||||
@@ -9831,12 +9836,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr "Pro tuto předvolbu již nezobrazovat upozornění"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "Vlevo: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "Vpravo: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "Klikněte pro obnovení aktuální hodnoty a navázání na globální hodnotu."
|
||||
@@ -9855,9 +9870,8 @@ msgstr "Neuložené změny"
|
||||
msgid "Transfer or discard changes"
|
||||
msgstr "Přenést nebo zahodit změny"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgstr "Původní hodnota"
|
||||
msgid "Old Value"
|
||||
msgstr ""
|
||||
|
||||
msgid "New Value"
|
||||
msgstr "Nová hodnota"
|
||||
@@ -9978,6 +9992,12 @@ msgstr "Počet extrudérů"
|
||||
msgid "Capabilities"
|
||||
msgstr "Možnosti"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Zobrazit všechny předvolby (včetně nekompatibilních)"
|
||||
|
||||
@@ -12105,6 +12125,25 @@ msgstr "Normální tisk"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "Výchozí zrychlení pro běžný tisk i přesuny, kromě první vrstvy."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Akcelerace pohybů přesunu."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "Přejezdy první vrstvy"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"Zrychlení přejezdů první vrstvy.\n"
|
||||
"Procentuální hodnota je vztažena k hodnotě Zrychlení přejezdů."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² nebo %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Zrychlení mostů Pokud je hodnota vyjádřena v procentech (např. 50 %), bude vypočtena na základě akcelerace vnější stěny."
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Výchozí profil filamentu"
|
||||
|
||||
@@ -12311,6 +12350,12 @@ msgstr "Archimédovy akordy"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "Oktagramová spirála"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Hustota horního povrchu"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Hustota horní povrchové vrstvy. Hodnota 100 % vytvoří zcela plnou, hladkou horní vrstvu. Snížením této hodnoty vznikne texturovaný horní povrch podle zvoleného vzoru horního povrchu. Hodnota 0 % znamená, že na horní vrstvě budou vytvořeny pouze stěny. Určeno pro estetické nebo funkční účely, nikoli k řešení problémů jako je nadměrná extruze."
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Vzor spodního povrchu"
|
||||
|
||||
@@ -12318,6 +12363,16 @@ msgstr "Vzor spodního povrchu"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "Vzor čáry pro výplň spodního povrchu, ne pro mostovou výplň."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Hustota spodního povrchu"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Hustota spodní povrchové vrstvy. Určeno pro estetické nebo funkční účely, nikoli k řešení problémů, jako je přeextruze.\n"
|
||||
"VAROVÁNÍ: Snížení této hodnoty může negativně ovlivnit přilnavost k podložce."
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "Vzor vnitřní plné výplně"
|
||||
|
||||
@@ -12620,18 +12675,6 @@ msgstr "Automaticky pro čištění"
|
||||
msgid "Auto For Match"
|
||||
msgstr "Automaticky pro přiřazení"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "Teplota čištění"
|
||||
|
||||
@@ -12974,6 +13017,7 @@ msgstr "Použití více řádků pro vzor výplně, pokud to daný vzor podporuj
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -13041,79 +13085,6 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Úhel boční mřížky 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Úhel první sady bočních mřížkových prvků ve směru Z. Nula je svisle."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Úhel boční mřížky 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Úhel druhé sady bočních mřížkových prvků ve směru Z. Nula je svisle."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Úhel převisu výplně"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "Úhel šikmých čar výplně. 60° vytvoří čistý šestiúhelníkový vzor."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Délka kotvy řídké výplně"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Připojit výplňovou čáru k vnitřnímu obvodu krátkým segmentem dalšího obvodu. Pokud je zadáno v procentech (například: 15 %), počítá se z šířky extruze výplně. Orca Slicer se pokouší propojit dvě blízké výplňové čáry krátkým segmentem obvodu. Pokud není nalezen žádný segment obvodu kratší než infill_anchor_max, výplňová čára se připojí pouze k jednomu segmentu obvodu a délka vybraného segmentu je omezena tímto parametrem, ale ne delší než anchor_length_max.\n"
|
||||
"Nastavte tuto hodnotu na nulu pro zakázání kotvení obvodů připojených k jedné výplňové čáře."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (žádné otevřené kotvy)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (neomezeno)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Maximální délka kotvy výplně"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Připojit výplňovou čáru k vnitřnímu obvodu krátkým segmentem dalšího obvodu. Pokud je zadáno v procentech (například: 15 %), počítá se z šířky extruze výplně. Orca Slicer se pokouší propojit dvě blízké výplňové čáry krátkým segmentem obvodu. Pokud není nalezen žádný segment obvodu kratší než tento parametr, výplňová čára se spojí s obvodem pouze z jedné strany a délka vybraného segmentu obvodu je omezena hodnotou infill_anchor, ale není delší než tento parametr.\n"
|
||||
"Pokud je nastaveno na 0, použije se starý algoritmus připojení výplně, což by mělo vytvořit stejný výsledek jako s 1000 & 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (Jednoduché připojení)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Akcelerace vnitřních stěn."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Akcelerace pohybů přesunu."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "Akcelerace výplně horní plochy. Použití nižší hodnoty může zlepšit kvalitu horní plochy."
|
||||
@@ -13122,11 +13093,8 @@ msgstr "Akcelerace výplně horní plochy. Použití nižší hodnoty může zle
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Akcelerace vnější stěny. Použití nižší hodnoty může zlepšit kvalitu."
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Zrychlení mostů Pokud je hodnota vyjádřena v procentech (např. 50 %), bude vypočtena na základě akcelerace vnější stěny."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² nebo %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Akcelerace vnitřních stěn."
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Akcelerace řídké výplně. Pokud je hodnota vyjádřena v procentech (např. 100 %), bude vypočtena na základě výchozí akcelerace."
|
||||
@@ -13138,16 +13106,6 @@ msgstr "Akcelerace vnitřní plné výplně. Pokud je hodnota vyjádřena v proc
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "Akcelerace první vrstvy. Použití nižší hodnoty může zlepšit přilnavost k podložce."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "Přejezdy první vrstvy"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"Zrychlení přejezdů první vrstvy.\n"
|
||||
"Procentuální hodnota je vztažena k hodnotě Zrychlení přejezdů."
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "Povolit accel_to_decel"
|
||||
|
||||
@@ -13244,6 +13202,17 @@ msgstr "Rychlost ventilátoru bude lineárně zvyšována od nuly na vrstvě \"z
|
||||
msgid "layer"
|
||||
msgstr "vrstva"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "Rychlost ventilátoru rozhraní podpory"
|
||||
|
||||
@@ -13780,6 +13749,73 @@ msgstr "Oblast vyloučení sondování při shlukování"
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "Oblast vyloučení sondování při shlukování."
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Úhel boční mřížky 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Úhel první sady bočních mřížkových prvků ve směru Z. Nula je svisle."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Úhel boční mřížky 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Úhel druhé sady bočních mřížkových prvků ve směru Z. Nula je svisle."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Úhel převisu výplně"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "Úhel šikmých čar výplně. 60° vytvoří čistý šestiúhelníkový vzor."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Délka kotvy řídké výplně"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Připojit výplňovou čáru k vnitřnímu obvodu krátkým segmentem dalšího obvodu. Pokud je zadáno v procentech (například: 15 %), počítá se z šířky extruze výplně. Orca Slicer se pokouší propojit dvě blízké výplňové čáry krátkým segmentem obvodu. Pokud není nalezen žádný segment obvodu kratší než infill_anchor_max, výplňová čára se připojí pouze k jednomu segmentu obvodu a délka vybraného segmentu je omezena tímto parametrem, ale ne delší než anchor_length_max.\n"
|
||||
"Nastavte tuto hodnotu na nulu pro zakázání kotvení obvodů připojených k jedné výplňové čáře."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (žádné otevřené kotvy)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (neomezeno)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Maximální délka kotvy výplně"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Připojit výplňovou čáru k vnitřnímu obvodu krátkým segmentem dalšího obvodu. Pokud je zadáno v procentech (například: 15 %), počítá se z šířky extruze výplně. Orca Slicer se pokouší propojit dvě blízké výplňové čáry krátkým segmentem obvodu. Pokud není nalezen žádný segment obvodu kratší než tento parametr, výplňová čára se spojí s obvodem pouze z jedné strany a délka vybraného segmentu obvodu je omezena hodnotou infill_anchor, ale není delší než tento parametr.\n"
|
||||
"Pokud je nastaveno na 0, použije se starý algoritmus připojení výplně, což by mělo vytvořit stejný výsledek jako s 1000 & 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (Jednoduché připojení)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14671,6 +14707,18 @@ msgstr "Direct Drive"
|
||||
msgid "Bowden"
|
||||
msgstr "Bowden"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Dodatečná délka při restartu"
|
||||
|
||||
@@ -15094,6 +15142,9 @@ msgstr "Trhliny menší než 2x poloměr uzavření mezery jsou při řezání t
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Režim slicingu"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Ostatní"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "Použijte \"Sudý-lichý\" pro modely letadel 3DLabPrint. Použijte \"Zavřít díry\" pro uzavření všech otvorů v modelu."
|
||||
|
||||
@@ -15453,9 +15504,6 @@ msgstr ""
|
||||
"\n"
|
||||
"Tato volba spoléhá na firmware, který podporuje příkazy M191 a M141 nativně nebo přes makra, a je obvykle využívána při instalaci aktivního topení komory."
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Teplota komory"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15469,6 +15517,17 @@ msgstr ""
|
||||
"\n"
|
||||
"Pokud je povoleno, tento parametr rovněž nastaví G-code proměnnou s názvem chamber_temperature, kterou lze použít k předání požadované teploty komory do makra spuštění tisku, nebo do makra pro tepelnou stabilizaci, například takto: PRINT_START (další proměnné) CHAMBER_TEMP=[chamber_temperature]. To může být užitečné, pokud vaše tiskárna nepodporuje příkazy M141/M191, nebo pokud chcete provádět tepelnou stabilizaci v makru spuštění tisku, pokud není instalováno aktivní topení komory."
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "Teplota trysky pro vrstvy po úvodní vrstvě."
|
||||
@@ -15513,22 +15572,6 @@ msgstr "Tloušťka horního pláště"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "Počet horních pevných vrstev bude při slicování zvýšen, pokud tloušťka vypočtená podle horních vrstev bude menší než tato hodnota. Tím lze předejít příliš tenké skořepině při malé výšce vrstvy. 0 znamená, že je nastavení vypnuté a tloušťka horní skořepiny je určena pouze počtem horních vrstev."
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Hustota horního povrchu"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Hustota horní povrchové vrstvy. Hodnota 100 % vytvoří zcela plnou, hladkou horní vrstvu. Snížením této hodnoty vznikne texturovaný horní povrch podle zvoleného vzoru horního povrchu. Hodnota 0 % znamená, že na horní vrstvě budou vytvořeny pouze stěny. Určeno pro estetické nebo funkční účely, nikoli k řešení problémů jako je nadměrná extruze."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Hustota spodního povrchu"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Hustota spodní povrchové vrstvy. Určeno pro estetické nebo funkční účely, nikoli k řešení problémů, jako je přeextruze.\n"
|
||||
"VAROVÁNÍ: Snížení této hodnoty může negativně ovlivnit přilnavost k podložce."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Rychlost přejezdu bez extruze."
|
||||
@@ -18166,6 +18209,132 @@ msgstr "Přihlášení/Test"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "Připojení k tiskárnám připojeným přes hostitele tisku se nezdařilo."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -18248,6 +18417,19 @@ msgstr "Připojení k MKS funguje správně."
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "Nepodařilo se připojit k MKS"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "Připojení k OctoPrint funguje správně."
|
||||
|
||||
@@ -19403,6 +19585,40 @@ msgstr ""
|
||||
"Zamezte kroucení\n"
|
||||
"Víte, že při tisku materiálů náchylných ke kroucení, jako je ABS, může vhodné zvýšení teploty vyhřívané desky snížit pravděpodobnost kroucení?"
|
||||
|
||||
#~ msgid "Filament Sync Options"
|
||||
#~ msgstr "Možnosti synchronizace filamentů"
|
||||
|
||||
#~ msgid "Network plug-in"
|
||||
#~ msgstr "Síťový plugin"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Zobrazit nastavení ovládání"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "Otočit pohled"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "Posouvat pohled"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "Přiblížení zobrazení"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "Kolečko myši se při přiblížení otáčí opačně"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "Vlevo: %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "Vpravo: %s"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Old value"
|
||||
#~ msgstr "Původní hodnota"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "Povolit síťový plugin"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: Heiko Liebscher <hliebschergmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
@@ -1722,10 +1722,15 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "Seit Version 2.4.0 synchronisiert OrcaSlicer Benutzerprofile über Orca Cloud anstelle der Bambu Cloud.\n\nUm Ihre vorhandenen Profile zu migrieren, melden Sie sich bei Orca Cloud an, dann werden sie automatisch übertragen. Weitere Informationen darüber, wie OrcaSlicer Ihre Profile speichert und synchronisiert, oder wie Sie Ihre Profile manuell migrieren, finden Sie in unserem Wiki.\n\nWenn Sie die Bambu Cloud nicht zum Synchronisieren von Profilen verwendet haben, betrifft Sie diese Änderung nicht und Sie können diese Meldung ignorieren."
|
||||
msgstr ""
|
||||
"Seit Version 2.4.0 synchronisiert OrcaSlicer Benutzerprofile über Orca Cloud anstelle der Bambu Cloud.\n"
|
||||
"\n"
|
||||
"Um Ihre vorhandenen Profile zu migrieren, melden Sie sich bei Orca Cloud an, dann werden sie automatisch übertragen. Weitere Informationen darüber, wie OrcaSlicer Ihre Profile speichert und synchronisiert, oder wie Sie Ihre Profile manuell migrieren, finden Sie in unserem Wiki.\n"
|
||||
"\n"
|
||||
"Wenn Sie die Bambu Cloud nicht zum Synchronisieren von Profilen verwendet haben, betrifft Sie diese Änderung nicht und Sie können diese Meldung ignorieren."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
msgstr "Änderung der Profilsynchronisierung"
|
||||
|
||||
msgid "Learn more"
|
||||
msgstr "Mehr erfahren"
|
||||
@@ -4115,6 +4120,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "Die aktuelle Kammer-Temperatur ist höher als die sichere Temperatur des Materials, dies kann zu Materialerweichung und Verstopfung führen. Die maximale sichere Temperatur für das Material beträgt %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -5237,10 +5246,10 @@ msgid "Stats"
|
||||
msgstr "Statistiken"
|
||||
|
||||
msgid "Slice"
|
||||
msgstr "Slice"
|
||||
msgstr "Slicen"
|
||||
|
||||
msgid "Review"
|
||||
msgstr ""
|
||||
msgstr "Überprüfen"
|
||||
|
||||
msgid "Assembly Return"
|
||||
msgstr "Zurücksetzen der Montage"
|
||||
@@ -7906,6 +7915,50 @@ msgstr "Wählen Sie den Ordner für heruntergeladene Elemente"
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "Wählen Sie das Download-Verzeichnis"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Neueste)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Netzwerk-Plugin erfolgreich gewechselt."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Erfolgreich"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Sie haben die Netzwerk-Plugin-Version %s ausgewählt.\n"
|
||||
"\n"
|
||||
"Möchten Sie diese Version jetzt herunterladen und installieren?\n"
|
||||
"\n"
|
||||
"Hinweis: Die Anwendung muss möglicherweise nach der Installation neu gestartet werden."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Netzwerk-Plugin herunterladen"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Das Netzwerk-Plugin neu laden, ohne die Anwendung neu zu starten"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Netzwerk-Plugin erfolgreich neu geladen."
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Neu laden"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Netzwerk-Plugin konnte nicht neu geladen werden. Bitte starten Sie die Anwendung neu."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Neuladen fehlgeschlagen"
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "Zuordnen"
|
||||
|
||||
@@ -7961,12 +8014,6 @@ msgstr "Splash-Screen anzeigen"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Zeige den Splash-Screen beim Start."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "Benachrichtigung für geteilte Profile anzeigen"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "Zeigen Sie eine Benachrichtigung mit einem Link zum Durchsuchen von geteilten Profilen an, wenn der ausgewählte Drucker geändert wird."
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr "Windows Taste auf der linken Seite verwenden"
|
||||
|
||||
@@ -7997,6 +8044,13 @@ msgstr "Ladeverhalten"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "sollen Drucker/Filament/Prozess Einstellungen geladen werden beim Öffnen einer .3mf?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Automatische Datensicherung"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Erstellen Sie regelmäßig Sicherungskopien Ihres Projekts,um es im Falle eines Absturzes wiederherstellen zu können."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "Maximum zuletzt verwendeter Dateien"
|
||||
|
||||
@@ -8015,12 +8069,20 @@ msgstr "Optionen beim Importieren von STEP-Dateien anzeigen"
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "Wenn aktiviert, wird während des Imports von STEP-Dateien ein Dialogfeld "
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Automatische Datensicherung"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Qualitätsstufe für den Draco-Export"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Erstellen Sie regelmäßig Sicherungskopien Ihres Projekts,um es im Falle eines Absturzes wiederherstellen zu können."
|
||||
msgid "bits"
|
||||
msgstr "Bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Kontrolliert die Quantisierungs-Bittiefe, die bei der Komprimierung des Netzes in das Draco-Format verwendet wird.\n"
|
||||
"0 = verlustfreie Kompression (Geometrie wird mit voller Präzision beibehalten). Gültige verlustbehaftete Werte liegen zwischen 8 und 30.\n"
|
||||
"Niedrigere Werte erzeugen kleinere Dateien, verlieren jedoch mehr geometrische Details; höhere Werte bewahren mehr Details auf Kosten größerer Dateien."
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Profil"
|
||||
@@ -8052,6 +8114,12 @@ msgstr "Filamente"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr "Optimiert die maximale Höhe des Filamentbereichs anhand der gewählten Filamentanzahl."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "Benachrichtigung für geteilte Profile anzeigen"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "Zeigen Sie eine Benachrichtigung mit einem Link zum Durchsuchen von geteilten Profilen an, wenn der ausgewählte Drucker geändert wird."
|
||||
|
||||
msgid "Features"
|
||||
msgstr "Funktionen"
|
||||
|
||||
@@ -8064,21 +8132,6 @@ msgstr "Wenn diese Option aktiviert ist, können Sie eine Aufgabe gleichzeitig a
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "Popup zum Auswählen des Filament-Gruppierungsmodus"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Qualitätsstufe für den Draco-Export"
|
||||
|
||||
msgid "bits"
|
||||
msgstr "Bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Kontrolliert die Quantisierungs-Bittiefe, die bei der Komprimierung des Netzes in das Draco-Format verwendet wird.\n"
|
||||
"0 = verlustfreie Kompression (Geometrie wird mit voller Präzision beibehalten). Gültige verlustbehaftete Werte liegen zwischen 8 und 30.\n"
|
||||
"Niedrigere Werte erzeugen kleinere Dateien, verlieren jedoch mehr geometrische Details; höhere Werte bewahren mehr Details auf Kosten größerer Dateien."
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "Verhalten"
|
||||
|
||||
@@ -8323,19 +8376,6 @@ msgstr "Nur nach stabilen Updates suchen"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Benutzerprofile automatisch synchronisieren (Drucker/Filament/Prozess)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Aktualisiere integrierte Profile automatisch."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Verschlüsselte Datei für die Token-Speicherung verwenden"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Speichern Sie Authentifizierungstoken in einer verschlüsselten Datei anstelle des System-Schlüsselbunds. (Erfordert Neustart)"
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr "Filament-Synchronisierungsoptionen"
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr "Filament-Synchronisierungsmodus"
|
||||
|
||||
@@ -8348,6 +8388,16 @@ msgstr "Filament und Farbe"
|
||||
msgid "Color only"
|
||||
msgstr "Nur Farbe"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Aktualisiere integrierte Profile automatisch."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Verschlüsselte Datei für die Token-Speicherung verwenden"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Speichern Sie Authentifizierungstoken in einer verschlüsselten Datei anstelle des System-Schlüsselbunds. (Erfordert Neustart)"
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr "Bambu Netzwerk-Plugin"
|
||||
|
||||
@@ -8360,35 +8410,6 @@ msgstr "Netzwerk-Plugin-Version"
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr "Wählen Sie die zu verwendende Version des Netzwerk-Plugins aus"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Neueste)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Netzwerk-Plugin erfolgreich gewechselt."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Erfolgreich"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Sie haben die Netzwerk-Plugin-Version %s ausgewählt.\n"
|
||||
"\n"
|
||||
"Möchten Sie diese Version jetzt herunterladen und installieren?\n"
|
||||
"\n"
|
||||
"Hinweis: Die Anwendung muss möglicherweise nach der Installation neu gestartet werden."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Netzwerk-Plugin herunterladen"
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Dateien mit OrcaSlicer verknüpfen"
|
||||
|
||||
@@ -8437,8 +8458,17 @@ msgstr "Entwickler"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "Überspringen der AMS Blacklist-Prüfung"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgstr "(Experimentell) Behalte bemalte Funktionen nach Mesh-Änderung bei"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr "Nicht unterstützte Profile anzeigen"
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr "Zeigt inkompatible/nicht unterstützte Profile in den Dropdown-Listen für Drucker und Filament an. Diese Profile können nicht ausgewählt werden."
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Attempt to keep painted features (color/seam/support/fuzzy etc.) after changing the object mesh (such as cut/reload from disk/simplify/fix etc.)\n"
|
||||
@@ -8447,12 +8477,6 @@ msgstr ""
|
||||
"Versuchen Sie, bemalte Funktionen (Farbe/Naht/Stütze/unscharf usw.) nach Änderung des Objekt-Meshs (z. B. schneiden/neu laden von der Festplatte/vereinfachen/reparieren usw.) beizubehalten\n"
|
||||
"Sehr experimentell! Langsam und kann Artefakte erzeugen."
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr "Nicht unterstützte Profile anzeigen"
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr "Zeigt inkompatible/nicht unterstützte Profile in den Dropdown-Listen für Drucker und Filament an. Diese Profile können nicht ausgewählt werden."
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "Fehlerhaften Speicher zulassen"
|
||||
|
||||
@@ -8481,24 +8505,6 @@ msgstr "Fehlersuche"
|
||||
msgid "trace"
|
||||
msgstr "Spurensuche"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr "Netzwerk-Plugin"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Neu laden"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Das Netzwerk-Plugin neu laden, ohne die Anwendung neu zu starten"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Netzwerk-Plugin erfolgreich neu geladen."
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Netzwerk-Plugin konnte nicht neu geladen werden. Bitte starten Sie die Anwendung neu."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Neuladen fehlgeschlagen"
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "Fehlersuche"
|
||||
|
||||
@@ -8514,25 +8520,6 @@ msgstr "Profil Synchronisation"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Synchronisierung der Einstellungen"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Ansicht-Steuerungseinstellungen"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "Drehen der Ansicht"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "Pan-Ansicht"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "Ansicht zoomen"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Sonstiges"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "Scrollrichtung beim Zoomen umkehren"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "SSL aktivieren (MQTT)"
|
||||
|
||||
@@ -9238,6 +9225,12 @@ msgstr "Dieses Profil löschen"
|
||||
msgid "Search in preset"
|
||||
msgstr "In Profilen suchen"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Klicken Sie hier, um alle Einstellungen auf die zuletzt gespeicherten Parameter zurückzusetzen."
|
||||
|
||||
@@ -9528,6 +9521,18 @@ msgstr "Flussverhältnis und Pressure Advance"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "Druckkammertemperatur"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Druckraum Temperatur"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Drucktemperatur"
|
||||
|
||||
@@ -9863,12 +9868,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr "Nicht erneut für dieses Profil warnen"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "Links: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "Rechts: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "Klicken Sie hier, um den aktuellen Wert zurückzusetzen und ihn dem globalen Wert zuzuordnen."
|
||||
@@ -9888,7 +9903,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "Änderungen verwerfen oder beibehalten"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "Alter Wert"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -10013,6 +10028,12 @@ msgstr "Anzahl der Extruder"
|
||||
msgid "Capabilities"
|
||||
msgstr "Fähigkeiten"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Alle Profile anzeigen (auch inkompatible)"
|
||||
|
||||
@@ -11254,7 +11275,7 @@ msgid "The precise wall option will be ignored for outer-inner or inner-outer-in
|
||||
msgstr "Die Option für präzise Wände wird für Außen-Innen- oder Innen-Außen-Innen-Wand-Sequenzen ignoriert."
|
||||
|
||||
msgid "The Adaptive Pressure Advance model for one or more extruders may contain invalid values."
|
||||
msgstr ""
|
||||
msgstr "Das Adaptive Pressure Advance-Modell für einen oder mehrere Extruder kann ungültige Werte enthalten."
|
||||
|
||||
msgid "Filament shrinkage will not be used because filament shrinkage for the used filaments does not match."
|
||||
msgstr "Filament-Schrumpfung wird nicht verwendet, da sich die Filament-Schrumpfung für die verwendeten Filamente signifikant unterscheidet."
|
||||
@@ -11267,6 +11288,9 @@ msgid ""
|
||||
"\n"
|
||||
"Move the objects farther apart, reduce brim/skirt size, switch Skirt type to Combined, or switch Print sequence to By layer."
|
||||
msgstr ""
|
||||
"Schürzen für einzelne Objekte passen nicht zwischen die Objekte in der Druckreihenfolge 'Nach Objekt'.\n"
|
||||
"\n"
|
||||
"Bewegen Sie die Objekte weiter auseinander, verringern Sie die Größe von Rand/Schürze, wechseln Sie den Schürzentyp zu 'Kombiniert' oder wechseln Sie die Druckreihenfolge zu 'Nach Schicht'."
|
||||
|
||||
msgid "Exporting G-code"
|
||||
msgstr "Exportiere G-Code"
|
||||
@@ -12209,6 +12233,25 @@ msgstr "Normales Drucken"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "Die Standardbeschleunigung für den normalen Druck und den Eilgang nach der ersten Schicht."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Beschleunigung Bewegung"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "Bewegung der ersten Schicht"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"Bewegungsbeschleunigung der ersten Schicht.\n"
|
||||
"Der Prozentwert bezieht sich auf die Bewegungsbeschleunigung."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² o. %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Beschleunigung der Brücken. Wenn der Wert als Prozentwert angegeben wird (z.B. 50%), wird er auf der Grundlage der Beschleunigung der Außenwand berechnet."
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Standard-Filamentprofil"
|
||||
|
||||
@@ -12421,6 +12464,12 @@ msgstr "Archimedische Akkorde"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "Oktagramm Spirale"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Dichte der oberen Oberfläche"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Dichte der oberen Oberflächenschicht. Ein Wert von 100 % erzeugt eine vollständig massive, glatte obere Schicht. Eine Reduzierung dieses Wertes führt zu einer strukturierten oberen Oberfläche, abhängig vom gewählten Oberflächenmuster. Ein Wert von 0 % führt dazu, dass nur die Wände der oberen Schicht erstellt werden. Diese Einstellung dient ästhetischen oder funktionalen Zwecken und nicht zur Behebung von Problemen wie Überextrusion."
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Muster der unteren Fläche"
|
||||
|
||||
@@ -12428,6 +12477,16 @@ msgstr "Muster der unteren Fläche"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "Linienmuster der Bodenfüllung. Brückenfüllung nicht eingeschlossen"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Dichte der unteren Oberfläche"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Dichte der unteren Oberflächenschicht. Diese Einstellung dient ästhetischen oder funktionalen Zwecken und nicht zur Behebung von Problemen wie Überextrusion.\n"
|
||||
"ACHTUNG: Eine Verringerung dieses Wertes kann die Haftung am Druckbett negativ beeinflussen."
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "Muster für das interne feste Füllmuster"
|
||||
|
||||
@@ -12732,18 +12791,6 @@ msgstr "Automatisch für Spülen"
|
||||
msgid "Auto For Match"
|
||||
msgstr "Automatisch für Übereinstimmung"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "Dynamische Filamentzuordnung aktivieren"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "Dynamische Filamentzuordnung während des Drucks aktivieren."
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "Hat Filamentwechsler"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "Der Drucker verfügt über eine Filamentwechsler-Hardware (z. B. AMS)."
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "Spültemperatur"
|
||||
|
||||
@@ -13087,7 +13134,7 @@ msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr "Z-Buckling-Bias-Optimierung (experimentell)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#, fuzzy
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr "Strafft die Gyroid-Welle entlang der Z-Achse (vertikal) bei geringer Fülldichte, um die effektive vertikale Säulenlänge zu verkürzen und die Z-Achsen-Kompressions-Knickfestigkeit zu verbessern. Der Filamentverbrauch bleibt erhalten. Keine Auswirkung bei ~30% einfacher Fülldichte und darüber. Gilt nur, wenn das einfache Füllmuster auf Gyroid eingestellt ist."
|
||||
|
||||
@@ -13155,77 +13202,6 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr "Gyroid"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Gitterwinkel 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Der Winkel des ersten Satzes von 2D-Gitterelementen in der Z-Richtung. Null ist vertikal."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Gitterwinkel 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Der Winkel des zweiten Satzes von 2D-Gitterelementen in der Z-Richtung. Null ist vertikal."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Überhangwinkel der Füllung"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "Der Winkel der schrägen Linien der Füllung. 60° führt zu einer reinen Wabenstruktur."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr "Überhangwinkel der Blitzfüllung"
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr "Maximaler Überhangwinkel für die Ausbreitung der Blitzfüllungsunterstützung."
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr "Beschneidungswinkel"
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
"Steuert, wie aggressiv kurze oder nicht unterstützte Blitzäste beschnitten werden.\n"
|
||||
"Dieser Winkel wird intern in eine pro-Schicht-Distanz umgewandelt."
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr "Begradigungswinkel"
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr "Maximaler Begradigungswinkel zur Vereinfachung von Blitzästen."
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Länge des Infill-Ankers"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr "Verbindet eine Infill-Linie mit einem kurzen Segment eines zusätzlichen Perimeters mit einem internen Perimeter. Wenn sie als Prozentsatz ausgedrückt wird (Beispiel: 15%), wird sie über die Breite der Infill-Extrusion berechnet. OrcaSlicer versucht, zwei nahe beieinander liegende Infill-Linien mit einem kurzen Perimetersegment zu verbinden. Wenn kein solches Perimetersegment gefunden wird, das kürzer als infill_anchor_max ist, wird die Infill-Linie nur an einer Seite mit einem Perimetersegment verbunden und die Länge des genommenen Perimetersegments ist auf diesen Parameter begrenzt, aber nicht länger als anchor_length_max. Setzen Sie diesen Parameter auf Null, um die Verankerung von Perimetern zu deaktivieren, die mit einer einzelnen Infill-Linie verbunden sind."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (keine offenen Anker)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (unbegrenzt)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Maximale Länge des Infill-Ankers"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr "Verbindet eine Infill-Linie mit einem kurzen Segment eines zusätzlichen Perimeters mit einem internen Perimeter. Wenn sie als Prozentsatz ausgedrückt wird (Beispiel: 15%), wird sie über die Breite der Infill-Extrusion berechnet. OrcaSlicer versucht, zwei nahe beieinander liegende Infill-Linien mit einem kurzen Perimetersegment zu verbinden. Wenn kein solches Perimetersegment gefunden wird, das kürzer als dieser Parameter ist, wird die Infill-Linie nur an einer Seite mit einem Perimetersegment verbunden und die Länge des genommenen Perimetersegments wird auf infill_anchor begrenzt, aber nicht länger als dieser Parameter. Setzen Sie diesen Parameter auf Null, um die Verankerung zu deaktivieren."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (Einfache Verbindung)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Beschleunigung Innenwände"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Beschleunigung Bewegung"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "Dies ist die Beschleunigung der Füllung von der obersten Schicht. Die Verwendung eines niedrigeren Werts kann die Qualität der Oberfläche verbessern."
|
||||
@@ -13234,11 +13210,8 @@ msgstr "Dies ist die Beschleunigung der Füllung von der obersten Schicht. Die V
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Beschleunigung der Außenwand: Die Verwendung eines niedrigeren Wertes kann die Qualität verbessern."
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Beschleunigung der Brücken. Wenn der Wert als Prozentwert angegeben wird (z.B. 50%), wird er auf der Grundlage der Beschleunigung der Außenwand berechnet."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² o. %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Beschleunigung Innenwände"
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Beschleunigung der spärlichen Innenfüllung. Wenn der Wert als Prozentwert angegeben wird (z.B. 100%), wird er auf der Grundlage der Standardbeschleunigung berechnet."
|
||||
@@ -13250,16 +13223,6 @@ msgstr "Beschleunigung des internen massiven Innenfülls. Wenn der Wert als Proz
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "Beschleunigung der ersten Schicht. Die Verwendung eines niedrigeren Wertes kann die Druckbetthaftung verbessern"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "Bewegung der ersten Schicht"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"Bewegungsbeschleunigung der ersten Schicht.\n"
|
||||
"Der Prozentwert bezieht sich auf die Bewegungsbeschleunigung."
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "Beschleunigung zu Verzögerung einschalten"
|
||||
|
||||
@@ -13356,6 +13319,17 @@ msgstr "Die Lüftergeschwindigkeit wird linear von Null bei der Schicht\"close_f
|
||||
msgid "layer"
|
||||
msgstr "Schicht"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "Stützstruktur-Schnittstelle"
|
||||
|
||||
@@ -13889,6 +13863,71 @@ msgstr "Klumpen-Ausschlussbereich abtasten"
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "Klumpen-Ausschlussbereich abtasten."
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Gitterwinkel 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Der Winkel des ersten Satzes von 2D-Gitterelementen in der Z-Richtung. Null ist vertikal."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Gitterwinkel 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Der Winkel des zweiten Satzes von 2D-Gitterelementen in der Z-Richtung. Null ist vertikal."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Überhangwinkel der Füllung"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "Der Winkel der schrägen Linien der Füllung. 60° führt zu einer reinen Wabenstruktur."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr "Überhangwinkel der Blitzfüllung"
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr "Maximaler Überhangwinkel für die Ausbreitung der Blitzfüllungsunterstützung."
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr "Beschneidungswinkel"
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
"Steuert, wie aggressiv kurze oder nicht unterstützte Blitzäste beschnitten werden.\n"
|
||||
"Dieser Winkel wird intern in eine pro-Schicht-Distanz umgewandelt."
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr "Begradigungswinkel"
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr "Maximaler Begradigungswinkel zur Vereinfachung von Blitzästen."
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Länge des Infill-Ankers"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr "Verbindet eine Infill-Linie mit einem kurzen Segment eines zusätzlichen Perimeters mit einem internen Perimeter. Wenn sie als Prozentsatz ausgedrückt wird (Beispiel: 15%), wird sie über die Breite der Infill-Extrusion berechnet. OrcaSlicer versucht, zwei nahe beieinander liegende Infill-Linien mit einem kurzen Perimetersegment zu verbinden. Wenn kein solches Perimetersegment gefunden wird, das kürzer als infill_anchor_max ist, wird die Infill-Linie nur an einer Seite mit einem Perimetersegment verbunden und die Länge des genommenen Perimetersegments ist auf diesen Parameter begrenzt, aber nicht länger als anchor_length_max. Setzen Sie diesen Parameter auf Null, um die Verankerung von Perimetern zu deaktivieren, die mit einer einzelnen Infill-Linie verbunden sind."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (keine offenen Anker)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (unbegrenzt)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Maximale Länge des Infill-Ankers"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr "Verbindet eine Infill-Linie mit einem kurzen Segment eines zusätzlichen Perimeters mit einem internen Perimeter. Wenn sie als Prozentsatz ausgedrückt wird (Beispiel: 15%), wird sie über die Breite der Infill-Extrusion berechnet. OrcaSlicer versucht, zwei nahe beieinander liegende Infill-Linien mit einem kurzen Perimetersegment zu verbinden. Wenn kein solches Perimetersegment gefunden wird, das kürzer als dieser Parameter ist, wird die Infill-Linie nur an einer Seite mit einem Perimetersegment verbunden und die Länge des genommenen Perimetersegments wird auf infill_anchor begrenzt, aber nicht länger als dieser Parameter. Setzen Sie diesen Parameter auf Null, um die Verankerung zu deaktivieren."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (Einfache Verbindung)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14785,6 +14824,18 @@ msgstr "Direktantrieb"
|
||||
msgid "Bowden"
|
||||
msgstr "Bowden"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "Dynamische Filamentzuordnung aktivieren"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "Dynamische Filamentzuordnung während des Drucks aktivieren."
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "Hat Filamentwechsler"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "Der Drucker verfügt über eine Filamentwechsler-Hardware (z. B. AMS)."
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Zusätzliche Länge beim Neustart"
|
||||
|
||||
@@ -15220,6 +15271,9 @@ msgstr "Risse, die kleiner als das 2-fache des Lückenschlussradius sind, werden
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Slicing-Modus"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Sonstiges"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "Verwenden Sie \"Gerade-ungerade\" für 3DLabPrint-Flugzeugmodelle. Verwenden Sie \"Löcher schließen\", um alle Löcher im Modell zu schließen."
|
||||
|
||||
@@ -15586,9 +15640,6 @@ msgstr ""
|
||||
"\n"
|
||||
"Diese Option basiert auf der Firmware, die die M191- und M141-Befehle entweder über Makros oder nativ unterstützt und wird normalerweise verwendet, wenn ein aktiver Druckraumheizer installiert ist."
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Druckraum Temperatur"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15602,6 +15653,17 @@ msgstr ""
|
||||
"\n"
|
||||
"Wenn diese Option aktiviert ist, wird auch eine G-Code-Variable namens chamber_temperature gesetzt, die verwendet werden kann, um die gewünschte Druckraumtemperatur an Ihr Druckstart-Makro oder ein Wärmespeicher-Makro weiterzugeben, wie z.B. PRINT_START (andere Variablen) CHAMBER_TEMP=[chamber_temperature]. Dies kann nützlich sein, wenn Ihr Drucker die Befehle M141/M191 nicht unterstützt oder wenn Sie das Wärmespeichern im Druckstart-Makro behandeln möchten, wenn kein aktiver Druckraumheizer installiert ist."
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "Düsentemperatur nach der ersten Schicht"
|
||||
@@ -15647,22 +15709,6 @@ msgstr "Dicke der oberen Schale"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "Die Anzahl der oberen festen Schichten wird beim Slicen erhöht, wenn die obere Schalenstärke dünner als dieser Wert ist. Dies kann verhindern, dass die Schale zu dünn wird, wenn eine geringe Schichthöhe verwendet wird. 0 bedeutet, dass diese Einstellung deaktiviert ist und die Dicke der oberen Schale absolut durch die oberen Schalenschichten bestimmt wird."
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Dichte der oberen Oberfläche"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Dichte der oberen Oberflächenschicht. Ein Wert von 100 % erzeugt eine vollständig massive, glatte obere Schicht. Eine Reduzierung dieses Wertes führt zu einer strukturierten oberen Oberfläche, abhängig vom gewählten Oberflächenmuster. Ein Wert von 0 % führt dazu, dass nur die Wände der oberen Schicht erstellt werden. Diese Einstellung dient ästhetischen oder funktionalen Zwecken und nicht zur Behebung von Problemen wie Überextrusion."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Dichte der unteren Oberfläche"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Dichte der unteren Oberflächenschicht. Diese Einstellung dient ästhetischen oder funktionalen Zwecken und nicht zur Behebung von Problemen wie Überextrusion.\n"
|
||||
"ACHTUNG: Eine Verringerung dieses Wertes kann die Haftung am Druckbett negativ beeinflussen."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Eilgeschwindigkeit, wenn nicht extrudiert wird."
|
||||
@@ -18309,6 +18355,132 @@ msgstr "Anmelden/Testen"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "Die Verbindung zu den über den Druck-Host verbundenen Druckern ist fehlgeschlagen."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr "3DPrinterOS Cloud-Upload-Optionen"
|
||||
|
||||
@@ -18391,6 +18563,19 @@ msgstr "Verbindung zu MKS funktioniert korrekt."
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "Konnte keine Verbindung zu MKS herstellen"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "Verbindung zu OctoPrint funktioniert korrekt."
|
||||
|
||||
@@ -19551,6 +19736,39 @@ msgstr ""
|
||||
"Verwerfungen vermeiden\n"
|
||||
"Wussten Sie, dass beim Drucken von Materialien, die zu Verwerfungen neigen, wie z.B. ABS, durch eine entsprechende Erhöhung der Heizbetttemperatur die Wahrscheinlichkeit von Verwerfungen verringert werden kann?"
|
||||
|
||||
#~ msgid "Filament Sync Options"
|
||||
#~ msgstr "Filament-Synchronisierungsoptionen"
|
||||
|
||||
#~ msgid "(Experimental) Keep painted feature after mesh change"
|
||||
#~ msgstr "(Experimentell) Behalte bemalte Funktionen nach Mesh-Änderung bei"
|
||||
|
||||
#~ msgid "Network plug-in"
|
||||
#~ msgstr "Netzwerk-Plugin"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Ansicht-Steuerungseinstellungen"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "Drehen der Ansicht"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "Pan-Ansicht"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "Ansicht zoomen"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "Scrollrichtung beim Zoomen umkehren"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "Links: %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "Rechts: %s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "Netzwerk-Plugin aktivieren"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: 2026-06-17 15:44-0300\n"
|
||||
"Last-Translator: Alexandre Folle de Menezes\n"
|
||||
"Language-Team: \n"
|
||||
@@ -3911,6 +3911,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
"It has been reset to 0.2"
|
||||
@@ -7510,6 +7514,45 @@ msgstr ""
|
||||
msgid "Choose Download Directory"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate"
|
||||
msgstr ""
|
||||
|
||||
@@ -7564,12 +7607,6 @@ msgstr ""
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr ""
|
||||
|
||||
@@ -7600,6 +7637,12 @@ msgstr ""
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr ""
|
||||
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr ""
|
||||
|
||||
@@ -7618,10 +7661,16 @@ msgstr ""
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr ""
|
||||
|
||||
msgid "Auto backup"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgid "bits"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Preset"
|
||||
@@ -7654,6 +7703,12 @@ msgstr ""
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Features"
|
||||
msgstr ""
|
||||
|
||||
@@ -7666,18 +7721,6 @@ msgstr ""
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
msgid "bits"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr ""
|
||||
|
||||
@@ -7902,18 +7945,6 @@ msgstr ""
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr ""
|
||||
|
||||
@@ -7926,6 +7957,15 @@ msgstr ""
|
||||
msgid "Color only"
|
||||
msgstr ""
|
||||
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -7938,30 +7978,6 @@ msgstr ""
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr ""
|
||||
|
||||
@@ -8004,7 +8020,16 @@ msgstr ""
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8012,12 +8037,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr ""
|
||||
|
||||
@@ -8044,24 +8063,6 @@ msgstr ""
|
||||
msgid "trace"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Debug"
|
||||
msgstr ""
|
||||
|
||||
@@ -8077,24 +8078,6 @@ msgstr ""
|
||||
msgid "Preferences sync"
|
||||
msgstr ""
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr ""
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr ""
|
||||
|
||||
@@ -8780,6 +8763,12 @@ msgstr ""
|
||||
msgid "Search in preset"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr ""
|
||||
|
||||
@@ -9046,6 +9035,18 @@ msgstr ""
|
||||
msgid "Print chamber temperature"
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr ""
|
||||
|
||||
@@ -9355,11 +9356,21 @@ msgid "Don't warn again for this preset"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
@@ -9377,7 +9388,7 @@ msgstr ""
|
||||
msgid "Transfer or discard changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr ""
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9488,6 +9499,12 @@ msgstr ""
|
||||
msgid "Capabilities"
|
||||
msgstr ""
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr ""
|
||||
|
||||
@@ -11437,6 +11454,23 @@ msgstr ""
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr ""
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr ""
|
||||
|
||||
@@ -11614,12 +11648,26 @@ msgstr ""
|
||||
msgid "Octagram Spiral"
|
||||
msgstr ""
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr ""
|
||||
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr ""
|
||||
|
||||
@@ -11873,18 +11921,6 @@ msgstr ""
|
||||
msgid "Auto For Match"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr ""
|
||||
|
||||
@@ -12209,6 +12245,7 @@ msgstr ""
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -12275,85 +12312,13 @@ msgstr ""
|
||||
msgid "Gyroid"
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr ""
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr ""
|
||||
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
@@ -12365,14 +12330,6 @@ msgstr ""
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr ""
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr ""
|
||||
|
||||
@@ -12460,6 +12417,17 @@ msgstr ""
|
||||
msgid "layer"
|
||||
msgstr ""
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr ""
|
||||
|
||||
@@ -12936,6 +12904,69 @@ msgstr ""
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr ""
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -13737,6 +13768,18 @@ msgstr ""
|
||||
msgid "Bowden"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr ""
|
||||
|
||||
@@ -14131,6 +14174,9 @@ msgstr ""
|
||||
msgid "Slicing Mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr ""
|
||||
|
||||
@@ -14464,9 +14510,6 @@ msgid ""
|
||||
"This option relies on the firmware supporting the M191 and M141 commands either via macros or natively and is usually used when an active chamber heater is installed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -14475,6 +14518,17 @@ msgid ""
|
||||
"If enabled, this parameter also sets a G-code variable named chamber_temperature, which can be used to pass the desired chamber temperature to your print start macro, or a heat soak macro like this: PRINT_START (other variables) CHAMBER_TEMP=[chamber_temperature]. This may be useful if your printer does not support M141/M191 commands, or if you desire to handle heat soaking in the print start macro if no active chamber heater is installed."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr ""
|
||||
|
||||
@@ -14514,20 +14568,6 @@ msgstr ""
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr ""
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr ""
|
||||
|
||||
@@ -16967,6 +17007,132 @@ msgstr ""
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -17049,6 +17215,19 @@ msgstr ""
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Guislain Cyril, Thomas Lété\n"
|
||||
@@ -1701,13 +1701,18 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "Depuis la version 2.4.0, OrcaSlicer synchronise les profils utilisateur via Orca Cloud au lieu de Bambu Cloud.\n\nPour migrer vos profils existants, connectez-vous à Orca Cloud et ils seront transférés automatiquement. Pour en savoir plus sur la façon dont OrcaSlicer stocke et synchronise vos profils, ou pour migrer vos préréglages manuellement, consultez notre wiki.\n\nSi vous n'utilisiez pas Bambu Cloud pour synchroniser vos profils, ce changement ne vous concerne pas et vous pouvez ignorer ce message."
|
||||
msgstr ""
|
||||
"Depuis la version 2.4.0, OrcaSlicer synchronise les profils utilisateur via Orca Cloud au lieu de Bambu Cloud.\n"
|
||||
"\n"
|
||||
"Pour migrer vos profils existants, connectez-vous à Orca Cloud et ils seront transférés automatiquement. Pour en savoir plus sur la façon dont OrcaSlicer stocke et synchronise vos profils, ou pour migrer vos préréglages manuellement, consultez notre wiki.\n"
|
||||
"\n"
|
||||
"Si vous n'utilisiez pas Bambu Cloud pour synchroniser vos profils, ce changement ne vous concerne pas et vous pouvez ignorer ce message."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
msgstr "Modification de la synchronisation des profils"
|
||||
|
||||
msgid "Learn more"
|
||||
msgstr ""
|
||||
msgstr "En savoir plus"
|
||||
|
||||
msgid "Reloading network plug-in..."
|
||||
msgstr "Rechargement du plug-in réseau…"
|
||||
@@ -1743,6 +1748,9 @@ msgid ""
|
||||
"Some features, including the setup wizard, may appear blank until it is installed.\n"
|
||||
"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer."
|
||||
msgstr ""
|
||||
"Le runtime Microsoft WebView2 n’a pas pu être installé.\n"
|
||||
"Certaines fonctionnalités, dont l’assistant de configuration, peuvent apparaître vides tant qu’il n’est pas installé.\n"
|
||||
"Veuillez l’installer manuellement depuis https://developer.microsoft.com/microsoft-edge/webview2/ et redémarrer Orca Slicer."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Resources path does not exist or is not a directory: %s"
|
||||
@@ -3993,7 +4001,7 @@ msgid "The recommended nozzle temperature for this filament type is [%d, %d] deg
|
||||
msgstr "La température de buse recommandée pour ce type de filament est de [%d, %d] degrés Celsius."
|
||||
|
||||
msgid "Adaptive Pressure Advance model validation failed:\n"
|
||||
msgstr ""
|
||||
msgstr "Échec de la validation du modèle d’avance de pression adaptative :\n"
|
||||
|
||||
msgid ""
|
||||
"Too small max volumetric speed.\n"
|
||||
@@ -4006,6 +4014,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "La température actuelle du caisson est supérieure à la température de sécurité du matériau, ce qui peut entraîner un ramollissement et un bouchage du filament. La température de sécurité maximale pour le matériau est %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr "La température minimale du caisson (%d℃) est supérieure à la température cible du caisson (%d℃). La valeur minimale est le seuil à partir duquel l’impression démarre tandis que le caisson continue de chauffer vers la cible ; elle ne doit donc pas la dépasser. Elle sera limitée à la cible."
|
||||
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
"It has been reset to 0.2"
|
||||
@@ -5113,7 +5125,7 @@ msgid "Slice"
|
||||
msgstr "Découper"
|
||||
|
||||
msgid "Review"
|
||||
msgstr ""
|
||||
msgstr "Examiner"
|
||||
|
||||
msgid "Assembly Return"
|
||||
msgstr "Retour d'assemblage"
|
||||
@@ -7718,6 +7730,50 @@ msgstr "Choisir le dossier pour les éléments téléchargés"
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "Choisissez le répertoire de téléchargement"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Dernière)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Plug-in réseau changé avec succès."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Succès"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "Échec du chargement du plug-in réseau. Veuillez redémarrer l'application."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Vous avez sélectionné la version %s du plug-in réseau.\n"
|
||||
"\n"
|
||||
"Souhaitez-vous télécharger et installer cette version maintenant ?\n"
|
||||
"\n"
|
||||
"Note : L'application devra peut-être redémarrer après l'installation."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Télécharger le plug-in réseau"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Recharger le plug-in réseau sans redémarrer l'application"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Plug-in réseau rechargé avec succès."
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Recharger"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Échec du rechargement du plug-in réseau. Veuillez redémarrer l'application."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Échec du rechargement"
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "Associer"
|
||||
|
||||
@@ -7772,12 +7828,6 @@ msgstr "Afficher l'écran de démarrage"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Afficher l’écran de démarrage au démarrage."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "Afficher la notification de profils partagés"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "Afficher une notification avec un lien pour parcourir les profils partagés lorsque l’imprimante sélectionnée change."
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr "Placer les boutons de fenêtre à gauche"
|
||||
|
||||
@@ -7808,6 +7858,12 @@ msgstr "Comportement du chargement"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "Les paramètres d'imprimante/filament/processus doivent-ils être chargés à l'ouverture d'un fichier 3MF ?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Sauvegarde automatique"
|
||||
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Sauvegardez votre projet périodiquement pour faciliter la restauration après un plantage occasionnel."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "Nombre maximum de fichiers récents"
|
||||
|
||||
@@ -7826,11 +7882,20 @@ msgstr "Afficher les options lors de l'importation d'un fichier STEP"
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "Si activé, une boîte de dialogue de paramètres apparaîtra lors de l'importation d'un fichier STEP."
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Sauvegarde automatique"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Niveau de qualité pour l'exportation Draco"
|
||||
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Sauvegardez votre projet périodiquement pour faciliter la restauration après un plantage occasionnel."
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Contrôle la profondeur de bits de quantification utilisée lors de la compression du maillage au format Draco.\n"
|
||||
"0 = compression sans perte (la géométrie est préservée en pleine précision). Les valeurs avec perte valides vont de 8 à 30.\n"
|
||||
"Des valeurs plus basses produisent des fichiers plus petits mais perdent plus de détails géométriques ; des valeurs plus élevées préservent plus de détails au prix de fichiers plus volumineux."
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Préréglage"
|
||||
@@ -7862,6 +7927,12 @@ msgstr "filaments"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr "Optimise la hauteur maximale de la zone de filaments selon le nombre de filaments choisi."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "Afficher la notification de profils partagés"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "Afficher une notification avec un lien pour parcourir les profils partagés lorsque l’imprimante sélectionnée change."
|
||||
|
||||
msgid "Features"
|
||||
msgstr "Fonctionnalités"
|
||||
|
||||
@@ -7874,21 +7945,6 @@ msgstr "Si cette option est activée, vous pouvez envoyer une tâche à plusieur
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "Fenêtre contextuelle pour sélectionner le mode de regroupement des filaments"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Niveau de qualité pour l'exportation Draco"
|
||||
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Contrôle la profondeur de bits de quantification utilisée lors de la compression du maillage au format Draco.\n"
|
||||
"0 = compression sans perte (la géométrie est préservée en pleine précision). Les valeurs avec perte valides vont de 8 à 30.\n"
|
||||
"Des valeurs plus basses produisent des fichiers plus petits mais perdent plus de détails géométriques ; des valeurs plus élevées préservent plus de détails au prix de fichiers plus volumineux."
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "Comportement"
|
||||
|
||||
@@ -8133,18 +8189,6 @@ msgstr "Vérifier les mises à jour stables uniquement"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Synchronisation automatique des pré-réglages utilisateur (Imprimante/Filament/Traitement)"
|
||||
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Mettre à jour automatiquement les préréglages intégrés."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Utiliser un fichier chiffré pour le stockage des jetons"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Stocker les jetons d'authentification dans un fichier chiffré au lieu du trousseau système. (Nécessite un redémarrage)"
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr "Options de synchronisation des filaments"
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr "Mode de synchronisation des filaments"
|
||||
|
||||
@@ -8157,6 +8201,15 @@ msgstr "Filament et couleur"
|
||||
msgid "Color only"
|
||||
msgstr "Couleur uniquement"
|
||||
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Mettre à jour automatiquement les préréglages intégrés."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Utiliser un fichier chiffré pour le stockage des jetons"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Stocker les jetons d'authentification dans un fichier chiffré au lieu du trousseau système. (Nécessite un redémarrage)"
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr "Plug-in réseau Bambu"
|
||||
|
||||
@@ -8169,35 +8222,6 @@ msgstr "Version du plug-in réseau"
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr "Sélectionner la version du plug-in réseau à utiliser"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Dernière)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Plug-in réseau changé avec succès."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Succès"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "Échec du chargement du plug-in réseau. Veuillez redémarrer l'application."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Vous avez sélectionné la version %s du plug-in réseau.\n"
|
||||
"\n"
|
||||
"Souhaitez-vous télécharger et installer cette version maintenant ?\n"
|
||||
"\n"
|
||||
"Note : L'application devra peut-être redémarrer après l'installation."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Télécharger le plug-in réseau"
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Associer des fichiers à Orca Slicer"
|
||||
|
||||
@@ -8240,8 +8264,17 @@ msgstr "Développeur"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "Ignorer la vérification de la liste noire AMS"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgstr "(Expérimental) Conserver les éléments peints après une modification du maillage"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr "Afficher les préréglages non pris en charge"
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr "Affiche les préréglages incompatibles ou non pris en charge dans les listes déroulantes d’imprimantes et de filaments. Ces préréglages ne peuvent pas être sélectionnés."
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr "Fonctionnalités expérimentales"
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr "Conserver les zones peintes après modification du maillage"
|
||||
|
||||
msgid ""
|
||||
"Attempt to keep painted features (color/seam/support/fuzzy etc.) after changing the object mesh (such as cut/reload from disk/simplify/fix etc.)\n"
|
||||
@@ -8250,12 +8283,6 @@ msgstr ""
|
||||
"Tente de conserver les éléments peints (couleur/couture/support/surface irrégulière, etc.) après une modification du maillage de l’objet (découpe/rechargement depuis le disque/simplification/réparation, etc.)\n"
|
||||
"Hautement expérimental ! Lent et susceptible de créer des artefacts."
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr "Afficher les préréglages non pris en charge"
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr "Affiche les préréglages incompatibles ou non pris en charge dans les listes déroulantes d’imprimantes et de filaments. Ces préréglages ne peuvent pas être sélectionnés."
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "Autoriser le stockage anormal"
|
||||
|
||||
@@ -8284,24 +8311,6 @@ msgstr "débogage"
|
||||
msgid "trace"
|
||||
msgstr "trace"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr "Plug-in réseau"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Recharger"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Recharger le plug-in réseau sans redémarrer l'application"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Plug-in réseau rechargé avec succès."
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Échec du rechargement du plug-in réseau. Veuillez redémarrer l'application."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Échec du rechargement"
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "Débogage"
|
||||
|
||||
@@ -8317,24 +8326,6 @@ msgstr "Synchronisation préréglée"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Synchronisation des préférences"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Afficher les paramètres de contrôle"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "Rotation de la vue"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "Déplacement de la vue"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "Zoom de la vue"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Autre"
|
||||
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "La molette de la souris s'inverse lors du zoom"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "Activer SSL (MQTT)"
|
||||
|
||||
@@ -9028,6 +9019,12 @@ msgstr "Supprimer ce préréglage"
|
||||
msgid "Search in preset"
|
||||
msgstr "Rechercher dans le préréglage"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr "La synchronisation entre des entraînements d’extrudeur ou des types de volume de buse différents n’est pas prise en charge."
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr "Synchroniser la modification des paramètres avec les paramètres correspondants d’un autre extrudeur."
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Cliquez pour rétablir tous les paramètres au dernier préréglage enregistré."
|
||||
|
||||
@@ -9314,6 +9311,18 @@ msgstr "Rapport de débit et avance de pression"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "Température du caisson d’impression"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Température du caisson"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr "Température cible du caisson, et température minimale du caisson à partir de laquelle l’impression doit démarrer"
|
||||
|
||||
msgid "Target"
|
||||
msgstr "Cible"
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr "Minimale"
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Température d'impression"
|
||||
|
||||
@@ -9641,12 +9650,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr "Ne plus avertir pour ce préréglage"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "Gauche : %s"
|
||||
msgid "%s: %s"
|
||||
msgstr "%s : %s"
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr "Aucune modification à copier."
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr "Copier les paramètres"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "Droite : %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr "Modifier les paramètres de %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr "Voulez-vous modifier les paramètres suivants de %s pour correspondre à ceux de %s ?"
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "Cliquez pour réinitialiser la valeur actuelle et l'attacher à la valeur globale."
|
||||
@@ -9663,7 +9682,7 @@ msgstr "Modifications non enregistrées"
|
||||
msgid "Transfer or discard changes"
|
||||
msgstr "Ignorer ou conserver les modifications"
|
||||
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "Ancienne valeur"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9795,6 +9814,12 @@ msgstr "Nombre d'extrudeurs"
|
||||
msgid "Capabilities"
|
||||
msgstr "Fonctionnalités"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr "Gauche : "
|
||||
|
||||
msgid "Right: "
|
||||
msgstr "Droite : "
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Afficher tous les préréglages (y compris incompatibles)"
|
||||
|
||||
@@ -11003,7 +11028,7 @@ msgid "The precise wall option will be ignored for outer-inner or inner-outer-in
|
||||
msgstr "L'option de paroi précise sera ignorée pour les séquences de parois extérieure-intérieure ou intérieure-extérieure-intérieure."
|
||||
|
||||
msgid "The Adaptive Pressure Advance model for one or more extruders may contain invalid values."
|
||||
msgstr ""
|
||||
msgstr "Le modèle d’avance de pression adaptative d’un ou plusieurs extrudeurs peut contenir des valeurs non valides."
|
||||
|
||||
msgid "Filament shrinkage will not be used because filament shrinkage for the used filaments does not match."
|
||||
msgstr "Le rétrécissement du filament ne sera pas utilisé car le rétrécissement des filaments utilisés ne correspond pas."
|
||||
@@ -11016,6 +11041,9 @@ msgid ""
|
||||
"\n"
|
||||
"Move the objects farther apart, reduce brim/skirt size, switch Skirt type to Combined, or switch Print sequence to By layer."
|
||||
msgstr ""
|
||||
"Les jupes par objet ne peuvent pas tenir entre les objets dans la séquence d’impression Par objet.\n"
|
||||
"\n"
|
||||
"Éloignez les objets, réduisez la taille de la bordure/jupe, passez le type de jupe à Combiné, ou passez la séquence d’impression à Par couche."
|
||||
|
||||
msgid "Exporting G-code"
|
||||
msgstr "Exportation du G-code"
|
||||
@@ -11929,6 +11957,25 @@ msgstr "Impression normale"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "L'accélération par défaut de l'impression normale et du déplacement à l'exception de la couche initiale"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Accélération des déplacements"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "Déplacement de la première couche"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"Accélération de déplacement de la première couche.\n"
|
||||
"La valeur en pourcentage est relative à l’accélération de déplacement."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² ou %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Accélération des ponts. Si la valeur est exprimée en pourcentage (par exemple 50%), elle sera calculée en fonction de l’accélération de la paroi extérieure."
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Profil de filament par défaut"
|
||||
|
||||
@@ -12136,12 +12183,28 @@ msgstr "Spirale d'Archimède"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "Spirale Octagramme"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Densité de la surface supérieure"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Densité de la couche de surface supérieure. Une valeur de 100 % crée une couche supérieure entièrement solide et lisse. Réduire cette valeur donne une surface supérieure texturée, selon le motif de surface supérieure choisi. Une valeur de 0 % ne créera que les parois sur la couche supérieure. Destiné à des fins esthétiques ou fonctionnelles, pas pour corriger des problèmes comme la surextrusion."
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Motif de surface inférieure"
|
||||
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "Motif de ligne du remplissage de la surface inférieure, pas du remplissage du pont"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Densité de la surface inférieure"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Densité de la couche de surface inférieure. Destiné à des fins esthétiques ou fonctionnelles, pas pour corriger des problèmes comme la surextrusion.\n"
|
||||
"ATTENTION : Réduire cette valeur peut affecter négativement l'adhérence au plateau."
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "Motif de remplissage plein interne"
|
||||
|
||||
@@ -12439,18 +12502,6 @@ msgstr "Auto pour la purge"
|
||||
msgid "Auto For Match"
|
||||
msgstr "Auto pour la correspondance"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "Activer le mappage dynamique des filaments"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "Activer le mappage dynamique des filaments pendant l’impression."
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "Dispose d’un commutateur de filament"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "L’imprimante dispose d’un matériel de commutation de filament (par exemple un AMS)."
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "Température de purge"
|
||||
|
||||
@@ -12788,7 +12839,7 @@ msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr "Optimisation du biais de flambage en Z (expérimental)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#, fuzzy
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr "Resserre l’onde gyroïde le long de l’axe Z (vertical) à faible densité de remplissage afin de raccourcir la longueur effective des colonnes verticales et d’améliorer la résistance au flambage en compression selon l’axe Z. La consommation de filament est préservée. Aucun effet à partir d’environ 30 % de densité de remplissage. S’applique uniquement lorsque le motif de remplissage est réglé sur Gyroïde."
|
||||
|
||||
@@ -12855,92 +12906,14 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr "Gyroïde"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Angle de treillis 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Angle du premier ensemble d’éléments de treillis 2D dans la direction Z. Zéro correspond à la verticale."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Angle de treillis 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Angle de la deuxième série d’éléments de treillis 2D dans la direction Z. Zéro correspond à la verticale."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Angle de surplomb du remplissage"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "L'angle des lignes inclinées du remplissage. 60° donnera un nid d'abeille pur."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr "Angle de surplomb Lightning"
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr "Angle de surplomb maximal pour la propagation du support du remplissage Lightning."
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr "Angle d’élagage"
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
"Contrôle l’agressivité de l’élagage des branches Lightning courtes ou non soutenues.\n"
|
||||
"Cet angle est converti en interne en une distance par couche."
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr "Angle de redressement"
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr "Angle de redressement maximal utilisé pour simplifier les branches Lightning."
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Longueur de l’ancrage de remplissage interne"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Connecter une ligne de remplissage à un périmètre interne avec un court segment de périmètre supplémentaire. S’il est exprimé en pourcentage (exemple : 15%), il est calculé sur la largeur de l’extrusion de remplissage. Si aucun segment de périmètre plus court que infill_anchor_max n’est trouvé, la ligne de remplissage est connectée à un segment de périmètre d’un seul côté et la longueur du segment de périmètre pris est limitée à ce paramètre, mais pas plus long que anchor_length_max.\n"
|
||||
"Une valeur à 0 désactive les périmètres d’ancrage connectés à une seule ligne de remplissage."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (aucune ancre ouverte)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (illimité)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Longueur maximale de l’ancrage de remplissage"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Connecter une ligne de remplissage à un périmètre interne avec un court segment de périmètre supplémentaire. S’il est exprimé en pourcentage (exemple : 15 %), il est calculé sur la largeur de l’extrusion de remplissage. Orca Slicer essaie de connecter deux lignes de remplissage proches à un court segment de périmètre. Si aucun segment de périmètre plus court que ce paramètre n’est trouvé, la ligne de remplissage est connectée à un segment de périmètre sur un seul côté et la longueur du segment de périmètre pris est limitée à infill_anchor, mais pas plus longue que ce paramètre.\n"
|
||||
"S’il est défini sur 0, l’ancien algorithme de connexion de remplissage sera utilisé, il devrait créer le même résultat qu’avec 1000 et 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (connexions simples)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Accélération des parois intérieures"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Accélération des déplacements"
|
||||
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "Il s'agit de l'accélération de la surface supérieure du remplissage. Utiliser une valeur plus petite pourrait améliorer la qualité de la surface supérieure"
|
||||
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Accélération de la paroi extérieur : l'utilisation d'une valeur inférieure peut améliorer la qualité"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Accélération des ponts. Si la valeur est exprimée en pourcentage (par exemple 50%), elle sera calculée en fonction de l’accélération de la paroi extérieure."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² ou %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Accélération des parois intérieures"
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Accélération du remplissage interne. Si la valeur est exprimée en pourcentage (par exemple 100%), elle sera calculée en fonction de l’accélération par défaut."
|
||||
@@ -12951,16 +12924,6 @@ msgstr "Accélération du remplissage interne. Si la valeur est exprimée en pou
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "Accélération de la couche initiale. L'utilisation d'une valeur plus basse peut améliorer l'adhérence sur le plateau"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "Déplacement de la première couche"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"Accélération de déplacement de la première couche.\n"
|
||||
"La valeur en pourcentage est relative à l’accélération de déplacement."
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "Activer l’accélération à la décélération"
|
||||
|
||||
@@ -13050,6 +13013,17 @@ msgstr "La vitesse du ventilateur augmentera de manière linéaire à partir de
|
||||
msgid "layer"
|
||||
msgstr "couche"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr "Vitesse du ventilateur de la première couche"
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr "Définit une vitesse de ventilateur exacte pour la première couche, remplaçant tous les autres réglages de refroidissement. Utile pour protéger les pièces de tête d’impression imprimées en 3D (par exemple les conduits ABS/ASA de type Voron) d’un plateau chaud. Un léger flux d’air refroidit les conduits, sans recourir au refroidissement complet qui, dans certaines conditions, peut nuire à l’adhérence de la première couche.\nÀ partir de la deuxième couche, le refroidissement normal reprend.\nSi « Ventilateur à pleine vitesse à la couche » est également défini, le ventilateur monte progressivement de cette valeur sur la première couche jusqu’à votre cible à la couche choisie.\nDisponible uniquement lorsque « Pas de refroidissement pour » est à 0.\nRéglez sur -1 pour le désactiver."
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "Vitesse du ventilateur"
|
||||
|
||||
@@ -13581,6 +13555,75 @@ msgstr "Zone d'exclusion de sondage de l'agglomération"
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "Zone d'exclusion de sondage de l'agglomération."
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Angle de treillis 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Angle du premier ensemble d’éléments de treillis 2D dans la direction Z. Zéro correspond à la verticale."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Angle de treillis 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Angle de la deuxième série d’éléments de treillis 2D dans la direction Z. Zéro correspond à la verticale."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Angle de surplomb du remplissage"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "L'angle des lignes inclinées du remplissage. 60° donnera un nid d'abeille pur."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr "Angle de surplomb Lightning"
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr "Angle de surplomb maximal pour la propagation du support du remplissage Lightning."
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr "Angle d’élagage"
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
"Contrôle l’agressivité de l’élagage des branches Lightning courtes ou non soutenues.\n"
|
||||
"Cet angle est converti en interne en une distance par couche."
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr "Angle de redressement"
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr "Angle de redressement maximal utilisé pour simplifier les branches Lightning."
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Longueur de l’ancrage de remplissage interne"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Connecter une ligne de remplissage à un périmètre interne avec un court segment de périmètre supplémentaire. S’il est exprimé en pourcentage (exemple : 15%), il est calculé sur la largeur de l’extrusion de remplissage. Si aucun segment de périmètre plus court que infill_anchor_max n’est trouvé, la ligne de remplissage est connectée à un segment de périmètre d’un seul côté et la longueur du segment de périmètre pris est limitée à ce paramètre, mais pas plus long que anchor_length_max.\n"
|
||||
"Une valeur à 0 désactive les périmètres d’ancrage connectés à une seule ligne de remplissage."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (aucune ancre ouverte)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (illimité)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Longueur maximale de l’ancrage de remplissage"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Connecter une ligne de remplissage à un périmètre interne avec un court segment de périmètre supplémentaire. S’il est exprimé en pourcentage (exemple : 15 %), il est calculé sur la largeur de l’extrusion de remplissage. Orca Slicer essaie de connecter deux lignes de remplissage proches à un court segment de périmètre. Si aucun segment de périmètre plus court que ce paramètre n’est trouvé, la ligne de remplissage est connectée à un segment de périmètre sur un seul côté et la longueur du segment de périmètre pris est limitée à infill_anchor, mais pas plus longue que ce paramètre.\n"
|
||||
"S’il est défini sur 0, l’ancien algorithme de connexion de remplissage sera utilisé, il devrait créer le même résultat qu’avec 1000 et 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (connexions simples)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14445,6 +14488,18 @@ msgstr "Entraînement direct"
|
||||
msgid "Bowden"
|
||||
msgstr "Bowden"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "Activer le mappage dynamique des filaments"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "Activer le mappage dynamique des filaments pendant l’impression."
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "Dispose d’un commutateur de filament"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "L’imprimante dispose d’un matériel de commutation de filament (par exemple un AMS)."
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Longueur supplémentaire"
|
||||
|
||||
@@ -14862,6 +14917,9 @@ msgstr "Les fissures plus petites que 2x le rayon de fermeture de l’espace son
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Mode de découpe"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Autre"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "Utilisez « Pair-impair » pour les modèles d'avion 3DLabPrint. Utilisez « Fermer les trous » pour fermer tous les trous du modèle."
|
||||
|
||||
@@ -15214,9 +15272,6 @@ msgstr ""
|
||||
"\n"
|
||||
"Cette option repose sur la prise en charge des commandes M191 et M141 par le micrologiciel, via des macros ou nativement, et est généralement utilisée lorsqu’un chauffage de caisson actif est installé."
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Température du caisson"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15230,6 +15285,22 @@ msgstr ""
|
||||
"\n"
|
||||
"S’il est activé, ce paramètre définit également une variable gcode nommée chamber_temperature, qui peut être utilisée pour transmettre la température de caisson souhaitée à votre macro de démarrage de l’impression, ou à une macro de trempe thermique comme celle-ci : PRINT_START (autres variables) CHAMBER_TEMP=[chamber_temperature]. Cela peut être utile si votre imprimante ne prend pas en charge les commandes M141/M191, ou si vous souhaitez gérer le préchauffage dans la macro de démarrage de l’impression si aucun chauffage de caisson actif n’est installé."
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
"Il s’agit de la température du caisson à laquelle l’impression doit démarrer, tandis que le caisson continue de chauffer vers la température « Cible » du caisson. Par exemple, réglez la Cible sur 60 et la Minimale sur 50 pour commencer à imprimer dès que le caisson atteint 50 °C, sans attendre les 60 °C complets.\n"
|
||||
"\n"
|
||||
"Elle définit une variable G-code nommée chamber_minimal_temperature, qui peut être transmise à votre macro de démarrage d’impression ou à une macro de préchauffage, comme ceci : PRINT_START (autres variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Contrairement à la température « Cible » du caisson, cette option n’émet aucune commande M141/M191 ; elle expose seulement la valeur à votre G-code personnalisé. Elle ne doit pas dépasser la température « Cible » du caisson."
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr "Température minimale du caisson"
|
||||
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "Température de la buse pour les couches après la première"
|
||||
|
||||
@@ -15269,22 +15340,6 @@ msgstr "Épaisseur de la coque supérieure"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "Le nombre de couches solides supérieures est augmenté lors du découpage si l'épaisseur calculée par les couches de coque supérieures est inférieure à cette valeur. Cela peut éviter d'avoir une coque trop fine lorsque la hauteur de couche est faible. 0 signifie que ce paramètre est désactivé et que l'épaisseur de la coque supérieure est simplement déterminée par le nombre de couches de coque supérieures."
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Densité de la surface supérieure"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Densité de la couche de surface supérieure. Une valeur de 100 % crée une couche supérieure entièrement solide et lisse. Réduire cette valeur donne une surface supérieure texturée, selon le motif de surface supérieure choisi. Une valeur de 0 % ne créera que les parois sur la couche supérieure. Destiné à des fins esthétiques ou fonctionnelles, pas pour corriger des problèmes comme la surextrusion."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Densité de la surface inférieure"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Densité de la couche de surface inférieure. Destiné à des fins esthétiques ou fonctionnelles, pas pour corriger des problèmes comme la surextrusion.\n"
|
||||
"ATTENTION : Réduire cette valeur peut affecter négativement l'adhérence au plateau."
|
||||
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Vitesse de déplacement plus rapide et sans extrusion"
|
||||
|
||||
@@ -17878,6 +17933,132 @@ msgstr "Connexion/Test"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "La connexion aux imprimantes connectées via l’hôte d’impression a échoué."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr "Détecter une imprimante Creality série K"
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr "Cliquez sur Scan pour rechercher des imprimantes série K sur votre réseau."
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr "Utiliser la sélection"
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr "Recherche d’imprimantes série K sur le réseau local… cela prend quelques secondes."
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr "Aucune imprimante série K trouvée. Assurez-vous que l’imprimante est sur le même réseau et qu’elle n’est pas bloquée par l’isolation des clients Wi-Fi, puis cliquez à nouveau sur Scan."
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr "%zu imprimante(s) Creality trouvée(s). Sélectionnez-en une et cliquez sur Utiliser la sélection."
|
||||
|
||||
msgid "Active"
|
||||
msgstr "Actif"
|
||||
|
||||
msgid "Printers"
|
||||
msgstr "Imprimantes"
|
||||
|
||||
msgid "Processes"
|
||||
msgstr "Traitements"
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr "Afficher/Masquer les informations système"
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr "Copier les informations système dans le presse-papiers"
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr "Nous avons besoin d’informations pour diagnostiquer l’origine du problème. Consultez la page wiki pour un guide détaillé."
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr "Le bouton Compresser rassemble le fichier de projet et les journaux de la session actuelle dans un fichier ZIP."
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr "Tout exemple visuel supplémentaire, comme des images ou des enregistrements d’écran, peut être utile pour signaler le problème."
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr "Signaler un problème"
|
||||
|
||||
msgid "Pack"
|
||||
msgstr "Compresser"
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr "Nettoie et reconstruit le cache des profils système au prochain démarrage"
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr "Nettoyer le cache des profils système"
|
||||
|
||||
msgid "Clean"
|
||||
msgstr "Nettoyer"
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr "Aperçu des profils chargés"
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr "Cette section affiche les informations des profils chargés"
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr "Exporte un aperçu détaillé des profils chargés au format JSON"
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr "Dossier des configurations"
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr "Ouvre le dossier des configurations"
|
||||
|
||||
msgid "Log level"
|
||||
msgstr "Niveau de journalisation"
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr "Journaux stockés"
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr "Compresse tous les journaux stockés dans un fichier ZIP."
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr "Profils"
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr "Sélectionnez Non pour fermer la fenêtre et revoir le projet"
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr "Aucun fichier de projet dans la session actuelle. Seuls les journaux seront inclus dans le paquet"
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr "Sélectionnez Non pour fermer la fenêtre et revoir le projet."
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr "Veuillez vous assurer qu’aucune instance d’OrcaSlicer n’est en cours d’exécution"
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr "Le dossier système ne peut pas être supprimé car certains fichiers sont utilisés par une autre application. Veuillez fermer toute application utilisant ces fichiers et réessayer."
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr "Échec de la suppression du dossier système…"
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr "Impossible de déterminer le chemin de l’exécutable."
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr "Échec du lancement d’une nouvelle instance."
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr "journal(aux)"
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr "Choisissez où enregistrer le fichier JSON exporté"
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr "Échec de l’exportation\nVeuillez vérifier les autorisations d’écriture ou si le fichier est utilisé par une autre application"
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr "Choisissez où enregistrer le fichier ZIP exporté"
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr "Le fichier existe déjà. L’écraser ?"
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr "Options de téléversement vers 3DPrinterOS Cloud"
|
||||
|
||||
@@ -17960,6 +18141,19 @@ msgstr "La connexion à MKS fonctionne correctement."
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "Impossible de se connecter à MKS"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr "La connexion à Moonraker fonctionne correctement."
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr "Impossible de se connecter à Moonraker"
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr "L’hôte a répondu mais ne semble pas être Moonraker (result.klippy_state manquant)."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr "Impossible d’analyser la réponse du serveur Moonraker : %s"
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "La connexion à OctoPrint fonctionne correctement."
|
||||
|
||||
@@ -19110,6 +19304,38 @@ msgstr ""
|
||||
"Éviter la déformation\n"
|
||||
"Saviez-vous que lors de l’impression de matériaux susceptibles de se déformer, tels que l’ABS, une augmentation appropriée de la température du plateau chauffant peut réduire la probabilité de déformation?"
|
||||
|
||||
#~ msgid "Filament Sync Options"
|
||||
#~ msgstr "Options de synchronisation des filaments"
|
||||
|
||||
#~ msgid "(Experimental) Keep painted feature after mesh change"
|
||||
#~ msgstr "(Expérimental) Conserver les éléments peints après une modification du maillage"
|
||||
|
||||
#~ msgid "Network plug-in"
|
||||
#~ msgstr "Plug-in réseau"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Afficher les paramètres de contrôle"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "Rotation de la vue"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "Déplacement de la vue"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "Zoom de la vue"
|
||||
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "La molette de la souris s'inverse lors du zoom"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "Gauche : %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "Droite : %s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "Activer le plug-in réseau"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"Language: hu\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1714,7 +1714,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "A 2.4.0-s verziótól kezdve az OrcaSlicer a felhasználói profilokat a Bambu Cloud helyett az Orca Cloudon keresztül szinkronizálja.\n\nMeglévő profiljai átviteléhez jelentkezzen be az Orca Cloudba, és azok automatikusan átkerülnek. Ha többet szeretne megtudni arról, hogyan tárolja és szinkronizálja az OrcaSlicer a profiljait, vagy ha kézzel szeretné átvinni a beállításait, tekintse meg a wikinket.\n\nHa nem használta a Bambu Cloudot a profilok szinkronizálásához, ez a változás nem érinti Önt, és nyugodtan figyelmen kívül hagyhatja ezt az üzenetet."
|
||||
msgstr ""
|
||||
"A 2.4.0-s verziótól kezdve az OrcaSlicer a felhasználói profilokat a Bambu Cloud helyett az Orca Cloudon keresztül szinkronizálja.\n"
|
||||
"\n"
|
||||
"Meglévő profiljai átviteléhez jelentkezzen be az Orca Cloudba, és azok automatikusan átkerülnek. Ha többet szeretne megtudni arról, hogyan tárolja és szinkronizálja az OrcaSlicer a profiljait, vagy ha kézzel szeretné átvinni a beállításait, tekintse meg a wikinket.\n"
|
||||
"\n"
|
||||
"Ha nem használta a Bambu Cloudot a profilok szinkronizálásához, ez a változás nem érinti Önt, és nyugodtan figyelmen kívül hagyhatja ezt az üzenetet."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4098,6 +4103,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "A kamra aktuális hőmérséklete magasabb az anyag biztonságos hőmérsékleténél, ez az anyag meglágyulásához és eltömődéshez vezethet. Az anyag maximális biztonságos hőmérséklete: %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7877,6 +7886,50 @@ msgstr "Mappa kiválasztása a letöltött elemekhez"
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "Válassz letöltési mappát"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Legfrissebb)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "A hálózati bővítmény sikeresen átváltva."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Sikeres"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "A hálózati bővítmény betöltése sikertelen. Indítsd újra az alkalmazást."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"A(z) %s hálózati bővítmény verziót választottad.\n"
|
||||
"\n"
|
||||
"Szeretnéd most letölteni és telepíteni ezt a verziót?\n"
|
||||
"\n"
|
||||
"Megjegyzés: telepítés után szükséges lehet az alkalmazás újraindítása."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Hálózati bővítmény letöltése"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Hálózati bővítmény újratöltése az alkalmazás újraindítása nélkül"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "A hálózati bővítmény újratöltése sikerült."
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Újratöltés"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "A hálózati bővítmény újratöltése nem sikerült. Kérlek, indítsd újra az alkalmazást."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Sikertelen újratöltés"
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "Társítás"
|
||||
|
||||
@@ -7932,12 +7985,6 @@ msgstr "Splash screen meglenítése"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Indításkor nyitókép megjelenítése."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "Megosztott profilok értesítésének megjelenítése"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "Értesítés megjelenítése hivatkozással a megosztott profilok böngészéséhez, ha a kiválasztott nyomtató megváltozik."
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr "Használd a bal oldalon lévő ablakgombokat"
|
||||
|
||||
@@ -7968,6 +8015,13 @@ msgstr "Betöltési viselkedés"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "Betöltődjenek-e a nyomtató/filament/folyamat beállítások 3MF fájl megnyitásakor?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Automatikus biztonsági mentés"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "A projekt időszakos mentése az esetleges összeomlás utáni helyreállításhoz."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "Legutóbbi fájlok maximális száma"
|
||||
|
||||
@@ -7986,12 +8040,20 @@ msgstr "Beállítások megjelenítése STEP fájl importálásakor"
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "Ha engedélyezve van, STEP fájl importálásakor paraméterbeállítási párbeszédablak jelenik meg."
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Automatikus biztonsági mentés"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Minőségi szint Draco exporthoz"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "A projekt időszakos mentése az esetleges összeomlás utáni helyreállításhoz."
|
||||
msgid "bits"
|
||||
msgstr "bit"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"A Draco formátumú hálótömörítéskor használt kvantálási bitmélységet szabályozza.\n"
|
||||
"0 = veszteségmentes tömörítés (a geometria teljes pontossággal megmarad). Az érvényes veszteséges értékek 8 és 30 között vannak.\n"
|
||||
"Az alacsonyabb értékek kisebb fájlokat eredményeznek, de több geometriai részlet vész el; a magasabb értékek több részletet őriznek meg nagyobb fájlméret árán."
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Beállítás"
|
||||
@@ -8023,6 +8085,12 @@ msgstr "filamentek"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr "A filamentterület maximális magasságát optimalizálja a kiválasztott filamentek száma alapján."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "Megosztott profilok értesítésének megjelenítése"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "Értesítés megjelenítése hivatkozással a megosztott profilok böngészéséhez, ha a kiválasztott nyomtató megváltozik."
|
||||
|
||||
msgid "Features"
|
||||
msgstr "Funkciók"
|
||||
|
||||
@@ -8035,21 +8103,6 @@ msgstr "Ezzel az opcióval egyszerre több eszközre küldhetsz feladatot és t
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "Felugró ablak a filamentcsoportosítási mód kiválasztásához"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Minőségi szint Draco exporthoz"
|
||||
|
||||
msgid "bits"
|
||||
msgstr "bit"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"A Draco formátumú hálótömörítéskor használt kvantálási bitmélységet szabályozza.\n"
|
||||
"0 = veszteségmentes tömörítés (a geometria teljes pontossággal megmarad). Az érvényes veszteséges értékek 8 és 30 között vannak.\n"
|
||||
"Az alacsonyabb értékek kisebb fájlokat eredményeznek, de több geometriai részlet vész el; a magasabb értékek több részletet őriznek meg nagyobb fájlméret árán."
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "Viselkedés"
|
||||
|
||||
@@ -8289,19 +8342,6 @@ msgstr "Csak stabil frissítések keresése"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Felhasználói beállítások automatikus szinkronizálása (Nyomtató/Filament/Folyamat)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Beépített beállítások automatikus frissítése."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Titkosított fájl használata token tároláshoz"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Hitelesítési tokenek tárolása titkosított fájlban a rendszerkulcstartó helyett. (Újraindítást igényel)"
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr "Filament szinkronizálási opciók"
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr "Filament szinkronizálási mód"
|
||||
|
||||
@@ -8314,6 +8354,16 @@ msgstr "Filament és szín"
|
||||
msgid "Color only"
|
||||
msgstr "Csak szín"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Beépített beállítások automatikus frissítése."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Titkosított fájl használata token tároláshoz"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Hitelesítési tokenek tárolása titkosított fájlban a rendszerkulcstartó helyett. (Újraindítást igényel)"
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8326,35 +8376,6 @@ msgstr "Hálózati bővítmény verzió"
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr "A használandó hálózati bővítmény verzió kiválasztása"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Legfrissebb)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "A hálózati bővítmény sikeresen átváltva."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Sikeres"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "A hálózati bővítmény betöltése sikertelen. Indítsd újra az alkalmazást."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"A(z) %s hálózati bővítmény verziót választottad.\n"
|
||||
"\n"
|
||||
"Szeretnéd most letölteni és telepíteni ezt a verziót?\n"
|
||||
"\n"
|
||||
"Megjegyzés: telepítés után szükséges lehet az alkalmazás újraindítása."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Hálózati bővítmény letöltése"
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Fájlok társítása a OrcaSlicerhoz"
|
||||
|
||||
@@ -8403,8 +8424,17 @@ msgstr "Fejlesztő"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "AMS tiltólista ellenőrzés kihagyása"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgstr "(Kísérleti) A festett jellemző megtartása hálócsere után"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Attempt to keep painted features (color/seam/support/fuzzy etc.) after changing the object mesh (such as cut/reload from disk/simplify/fix etc.)\n"
|
||||
@@ -8413,12 +8443,6 @@ msgstr ""
|
||||
"Megpróbálja tartani a festett jellemzőket (szín/varrat/támasz/fuzzy stb.) az objektumháló megváltoztatása után (például kivágás/újratöltés lemezről/egyszerűsítés/javítás stb.)\n"
|
||||
"Kísérletei szint! Lassú és hibákat hozhat létre."
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "Rendellenes tároló engedélyezése"
|
||||
|
||||
@@ -8447,24 +8471,6 @@ msgstr ""
|
||||
msgid "trace"
|
||||
msgstr "követés"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr "Hálózati bővítmény"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Újratöltés"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Hálózati bővítmény újratöltése az alkalmazás újraindítása nélkül"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "A hálózati bővítmény újratöltése sikerült."
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "A hálózati bővítmény újratöltése nem sikerült. Kérlek, indítsd újra az alkalmazást."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Sikertelen újratöltés"
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "Hibakeresés"
|
||||
|
||||
@@ -8480,25 +8486,6 @@ msgstr "Beállítások szinkronizálása"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Beállítások szinkronizálása"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Vezérlési beállítások megtekintése"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "Nézet elforgatása"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "Pásztázó nézet"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "Nagyítás nézet"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Egyéb"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "Görgetési irány megfordítása nagyítás közben"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "SSL engedélyezése (MQTT)"
|
||||
|
||||
@@ -9206,6 +9193,12 @@ msgstr "Ezen beállítás törlése"
|
||||
msgid "Search in preset"
|
||||
msgstr "Keresés a beállításokban"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Kattints az összes beállítás utolsó mentett változatának visszaállításához."
|
||||
|
||||
@@ -9496,6 +9489,18 @@ msgstr "Anyagáramlási arány és nyomáskiegyenlítés"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "Nyomtatókamra hőmérséklete"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Kamra hőmérséklete"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Nyomtatási hőmérséklet"
|
||||
|
||||
@@ -9828,12 +9833,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr "Ne legyen több figyelmeztetés ennél az előbeállításnál"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "Bal: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "Jobb: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "Kattints ide az érték visszaállításához és a globális érték használatához."
|
||||
@@ -9853,7 +9868,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "Változások elvetése vagy megtartása"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "Régi érték"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9986,6 +10001,12 @@ msgstr "Extruderek száma"
|
||||
msgid "Capabilities"
|
||||
msgstr "Képességek"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Minden beállítás megjelenítése (beleértve az inkompatibiliseket is)"
|
||||
|
||||
@@ -12121,6 +12142,25 @@ msgstr "Normál nyomtatás"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "Ez az alapértelmezett gyorsulás mind a normál nyomtatáshoz, mind az első réteg utáni mozgáshoz."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Az utazó mozgások gyorsulása."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "Első réteg mozgás"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"Az első réteg mozgási gyorsulása.\n"
|
||||
"A százalékos érték az mozgási gyorsuláshoz van viszonyítva."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² vagy %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "A hidak gyorsulása. Ha az érték százalékban van megadva (pl. 50%), a külső fal gyorsulása alapján lesz kiszámítva."
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Alapértelmezett filament profil"
|
||||
|
||||
@@ -12327,6 +12367,12 @@ msgstr "Archimédeszi vonalak"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "Nyolcágú spirál"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Felső felületi sűrűség"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "A felső felületi réteg sűrűsége. A 100%-os érték teljesen tömör, sima felső réteget hoz létre. Ennek az értéknek a csökkentése a kiválasztott felső felületi mintázatnak megfelelően texturált felső felületet eredményez. A 0%-os érték azt eredményezi, hogy a felső rétegen csak a falak jönnek létre. Esztétikai vagy funkcionális célokra szolgál, nem pedig olyan problémák javítására, mint a túlextrudálás."
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Alsó felület mintázata"
|
||||
|
||||
@@ -12334,6 +12380,16 @@ msgstr "Alsó felület mintázata"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "Ez az alsó felület kitöltésének mintája, kivéve az áthidalásokat."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Alsó felületi sűrűség"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Az alsó felületi réteg sűrűsége. Esztétikai vagy funkcionális célokra szolgál, nem pedig olyan problémák javítására, mint a túlextrudálás.\n"
|
||||
"FIGYELMEZTETÉS: Ennek az értéknek a csökkentése kedvezőtlenül befolyásolhatja a tárgyasztalhoz való tapadást."
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "Belső tömör kitöltés mintája"
|
||||
|
||||
@@ -12636,18 +12692,6 @@ msgstr "Automatikus öblítéshez"
|
||||
msgid "Auto For Match"
|
||||
msgstr "Automatikus egyeztetéshez"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "Filament dinamikus leképezés engedélyezése"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "Dinamikus filament-leképezés engedélyezése nyomtatás közben."
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "Filament-váltóval rendelkezik"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "A nyomtató rendelkezik filament-váltó hardverrel (pl. AMS)."
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "Öblítési hőmérséklet"
|
||||
|
||||
@@ -12991,7 +13035,7 @@ msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr "Z-kihajlási torzítás optimalizálása (kísérleti)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#, fuzzy
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr "Alacsony feltöltési sűrűség mellett megfeszíti a gyroid hullámot a Z (függőleges) tengely mentén, hogy lerövidítse a tényleges függőleges oszlophosszt és javítsa a Z-tengely összenyomódási kihajlási ellenállását. A filamenthasználat megmarad. Nincs hatása ~30%-os és afeletti ritka kitöltési sűrűségnél. Csak akkor érvényes, ha a Ritka kitöltési minta Gyroid-ra van állítva."
|
||||
|
||||
@@ -13059,79 +13103,6 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Oldalsó rács 1. szöge"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Az oldalsó rács elemeinek első készletének szöge Z irányban. A nulla függőlegeset jelent."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Oldalsó rács 2. szöge"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Az oldalsó rács elemeinek második készletének szöge Z irányban. A nulla függőlegeset jelent."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Kitöltés túlnyúlási szöge"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "A kitöltés ferde vonalainak szöge. A 60° tiszta méhsejtmintát eredményez."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Ritka kitöltés horgonyhossza"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"A kitöltési vonalat egy további rövid kerületszakasszal kapcsolja a belső kerülethez. Ha százalékban van megadva (például: 15%), a kitöltési extrudálási szélesség alapján lesz kiszámítva. Az Orca Slicer megpróbál két közeli kitöltési vonalat egy rövid kerületszakaszhoz kapcsolni. Ha nem talál az infill_anchor_max értéknél rövidebb ilyen kerületszakaszt, akkor a kitöltési vonal csak az egyik oldalon kapcsolódik egy kerületszakaszhoz, és az igénybe vett kerületszakasz hossza erre a paraméterre lesz korlátozva, de nem lehet hosszabb, mint az anchor_length_max.\n"
|
||||
"Állítsd ezt a paramétert 0-ra az egyetlen kitöltési vonalhoz kapcsolódó horgonyzó kerületek kikapcsolásához."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (nincs nyitott horgony)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (korlátlan)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "A kitöltőhorgony maximális hossza"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Egy kitöltési vonalat egy további rövid kerületszakasszal kapcsol a belső kerülethez. Ha százalékban van megadva (például 15%), akkor a kitöltés extrudálási szélessége alapján kerül kiszámításra. Az Orca Slicer megpróbál két közeli kitöltési vonalat egy rövid kerületszakaszhoz kapcsolni. Ha nem talál ennél a paraméternél rövidebb ilyen kerületszakaszt, akkor a kitöltési vonal csak az egyik oldalon kapcsolódik egy kerületszakaszhoz, és a felhasznált kerületszakasz hossza az infill_anchor értékre lesz korlátozva, de ennél a paraméternél nem lehet hosszabb.\n"
|
||||
"Ha 0-ra állítod, a régi kitöltéskapcsolási algoritmus lesz használva, amely ugyanazt az eredményt adja, mint az 1000 és 0 értékek kombinációja."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (egyszerű kapcsolás)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "A belső falak gyorsulása."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Az utazó mozgások gyorsulása."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "A felső felületi kitöltés gyorsulása. Alacsonyabb érték használata javíthatja a felső felület minőségét"
|
||||
@@ -13140,11 +13111,8 @@ msgstr "A felső felületi kitöltés gyorsulása. Alacsonyabb érték használa
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Gyorsulás a külső falnál: alacsonyabb érték használata javíthatja a minőséget."
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "A hidak gyorsulása. Ha az érték százalékban van megadva (pl. 50%), a külső fal gyorsulása alapján lesz kiszámítva."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² vagy %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "A belső falak gyorsulása."
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Gyorsulás a ritkás kitöltéseknél. Ha az érték százalékban van megadva (pl. 100%), akkor az alapértelmezett gyorsulás alapján kerül kiszámításra."
|
||||
@@ -13156,16 +13124,6 @@ msgstr "A belső tömör kitöltés gyorsulása. Ha az érték százalékban van
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "A kezdőréteg gyorsulása. Alacsonyabb érték használata javíthatja a tárgyasztalhoz való tapadást"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "Első réteg mozgás"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"Az első réteg mozgási gyorsulása.\n"
|
||||
"A százalékos érték az mozgási gyorsuláshoz van viszonyítva."
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "accel_to_decel engedélyezése"
|
||||
|
||||
@@ -13262,6 +13220,17 @@ msgstr "A ventilátor fordulatszáma lineárisan nő nulláról a \"close_fan_th
|
||||
msgid "layer"
|
||||
msgstr "réteg"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "Támasz érintkező felület ventilátorsebessége"
|
||||
|
||||
@@ -13801,6 +13770,73 @@ msgstr "Csomósodás kizárási területének szondázása"
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "Csomósodás kizárási területének szondázása."
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Oldalsó rács 1. szöge"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Az oldalsó rács elemeinek első készletének szöge Z irányban. A nulla függőlegeset jelent."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Oldalsó rács 2. szöge"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Az oldalsó rács elemeinek második készletének szöge Z irányban. A nulla függőlegeset jelent."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Kitöltés túlnyúlási szöge"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "A kitöltés ferde vonalainak szöge. A 60° tiszta méhsejtmintát eredményez."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Ritka kitöltés horgonyhossza"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"A kitöltési vonalat egy további rövid kerületszakasszal kapcsolja a belső kerülethez. Ha százalékban van megadva (például: 15%), a kitöltési extrudálási szélesség alapján lesz kiszámítva. Az Orca Slicer megpróbál két közeli kitöltési vonalat egy rövid kerületszakaszhoz kapcsolni. Ha nem talál az infill_anchor_max értéknél rövidebb ilyen kerületszakaszt, akkor a kitöltési vonal csak az egyik oldalon kapcsolódik egy kerületszakaszhoz, és az igénybe vett kerületszakasz hossza erre a paraméterre lesz korlátozva, de nem lehet hosszabb, mint az anchor_length_max.\n"
|
||||
"Állítsd ezt a paramétert 0-ra az egyetlen kitöltési vonalhoz kapcsolódó horgonyzó kerületek kikapcsolásához."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (nincs nyitott horgony)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (korlátlan)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "A kitöltőhorgony maximális hossza"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Egy kitöltési vonalat egy további rövid kerületszakasszal kapcsol a belső kerülethez. Ha százalékban van megadva (például 15%), akkor a kitöltés extrudálási szélessége alapján kerül kiszámításra. Az Orca Slicer megpróbál két közeli kitöltési vonalat egy rövid kerületszakaszhoz kapcsolni. Ha nem talál ennél a paraméternél rövidebb ilyen kerületszakaszt, akkor a kitöltési vonal csak az egyik oldalon kapcsolódik egy kerületszakaszhoz, és a felhasznált kerületszakasz hossza az infill_anchor értékre lesz korlátozva, de ennél a paraméternél nem lehet hosszabb.\n"
|
||||
"Ha 0-ra állítod, a régi kitöltéskapcsolási algoritmus lesz használva, amely ugyanazt az eredményt adja, mint az 1000 és 0 értékek kombinációja."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (egyszerű kapcsolás)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14696,6 +14732,18 @@ msgstr "Direct Drive"
|
||||
msgid "Bowden"
|
||||
msgstr "Bowden"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "Filament dinamikus leképezés engedélyezése"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "Dinamikus filament-leképezés engedélyezése nyomtatás közben."
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "Filament-váltóval rendelkezik"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "A nyomtató rendelkezik filament-váltó hardverrel (pl. AMS)."
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Extra hossz újraindításkor"
|
||||
|
||||
@@ -15123,6 +15171,9 @@ msgstr "A háromszögháló szeletelés során a szeletelési hézag lezárási
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Szeletelési mód"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Egyéb"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "Használd a \"Páros-páratlan\" opciót a 3DLabPrint repülőgépmodellekhez. Használd a \"Hézagok lezárása\" lehetőséget a modell összes házagának lezárásához."
|
||||
|
||||
@@ -15489,9 +15540,6 @@ msgstr ""
|
||||
"\n"
|
||||
"Ez az opció feltételezi, hogy a firmware makrókon keresztül vagy natívan támogatja az M191 és M141 parancsokat, és általában akkor használják, ha létezik aktív kamrafűtő."
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Kamra hőmérséklete"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15505,6 +15553,17 @@ msgstr ""
|
||||
"\n"
|
||||
"Bekapcsolva ez a paraméter egy chamber_temperature nevű G-code változót is beállít, amely felhasználható a kívánt kamrahőmérséklet átadására a nyomtatásindító makrónak, vagy egy ilyen hőkiegyenlítő makrónak: PRINT_START (egyéb változók) CHAMBER_TEMP=[chamber_temperature]. Ez akkor lehet hasznos, ha a nyomtatód nem támogatja az M141/M191 parancsokat, vagy ha az aktív kamrafűtés hiányában a hőkiegyenlítést a nyomtatásindító makróban szeretnéd kezelni."
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "Fúvóka hőmérséklete az első réteg után"
|
||||
@@ -15550,22 +15609,6 @@ msgstr "Felső héj vastagság"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "A felső szilárd rétegek száma szeleteléskor megnő, ha a felső héjrétegekből számított vastagság kisebb ennél az értéknél. Ezzel elkerülhető, hogy túl vékony legyen a héj kis rétegmagasságnál. A 0 azt jelenti, hogy ez a beállítás ki van kapcsolva, és a felső héj vastagságát egyszerűen a felső héjrétegek száma határozza meg."
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Felső felületi sűrűség"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "A felső felületi réteg sűrűsége. A 100%-os érték teljesen tömör, sima felső réteget hoz létre. Ennek az értéknek a csökkentése a kiválasztott felső felületi mintázatnak megfelelően texturált felső felületet eredményez. A 0%-os érték azt eredményezi, hogy a felső rétegen csak a falak jönnek létre. Esztétikai vagy funkcionális célokra szolgál, nem pedig olyan problémák javítására, mint a túlextrudálás."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Alsó felületi sűrűség"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Az alsó felületi réteg sűrűsége. Esztétikai vagy funkcionális célokra szolgál, nem pedig olyan problémák javítására, mint a túlextrudálás.\n"
|
||||
"FIGYELMEZTETÉS: Ennek az értéknek a csökkentése kedvezőtlenül befolyásolhatja a tárgyasztalhoz való tapadást."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Mozgási sebesség, amikor nem történik extrudálás"
|
||||
@@ -18194,6 +18237,132 @@ msgstr "Bejelentkezés/Teszt"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "A nyomtatóállomáson keresztül csatlakoztatott nyomtatókhoz való csatlakozás sikertelen."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -18276,6 +18445,19 @@ msgstr "Az MKS kapcsolata megfelelően működik."
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "Nem sikerült csatlakozni az MKS-hez"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "Az OctoPrint kapcsolata megfelelően működik."
|
||||
|
||||
@@ -19434,6 +19616,39 @@ msgstr ""
|
||||
"Kunkorodás elkerülése\n"
|
||||
"Tudtad, hogy a kunkorodásra hajlamos anyagok (például ABS) nyomtatásakor a tárgyasztal hőmérsékletének növelése csökkentheti a kunkorodás valószínűségét?"
|
||||
|
||||
#~ msgid "Filament Sync Options"
|
||||
#~ msgstr "Filament szinkronizálási opciók"
|
||||
|
||||
#~ msgid "(Experimental) Keep painted feature after mesh change"
|
||||
#~ msgstr "(Kísérleti) A festett jellemző megtartása hálócsere után"
|
||||
|
||||
#~ msgid "Network plug-in"
|
||||
#~ msgstr "Hálózati bővítmény"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Vezérlési beállítások megtekintése"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "Nézet elforgatása"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "Pásztázó nézet"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "Nagyítás nézet"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "Görgetési irány megfordítása nagyítás közben"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "Bal: %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "Jobb: %s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "Hálózati bővítmény engedélyezése"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
@@ -1717,7 +1717,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "Dalla versione 2.4.0, OrcaSlicer sincronizza i profili utente tramite Orca Cloud anziché Bambu Cloud.\n\nPer migrare i tuoi profili esistenti, accedi a Orca Cloud e verranno trasferiti automaticamente. Per saperne di più su come OrcaSlicer memorizza e sincronizza i tuoi profili, o per migrare i tuoi profili manualmente, consulta la nostra wiki.\n\nSe non utilizzavi Bambu Cloud per sincronizzare i profili, questa modifica non ti riguarda e puoi ignorare questo messaggio."
|
||||
msgstr ""
|
||||
"Dalla versione 2.4.0, OrcaSlicer sincronizza i profili utente tramite Orca Cloud anziché Bambu Cloud.\n"
|
||||
"\n"
|
||||
"Per migrare i tuoi profili esistenti, accedi a Orca Cloud e verranno trasferiti automaticamente. Per saperne di più su come OrcaSlicer memorizza e sincronizza i tuoi profili, o per migrare i tuoi profili manualmente, consulta la nostra wiki.\n"
|
||||
"\n"
|
||||
"Se non utilizzavi Bambu Cloud per sincronizzare i profili, questa modifica non ti riguarda e puoi ignorare questo messaggio."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4099,6 +4104,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "L'attuale temperatura della camera è superiore alla temperatura di sicurezza del materiale. Potrebbe causare l'ammorbidimento e l'intasamento del materiale. La temperatura massima di sicurezza per il materiale è %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7884,6 +7893,50 @@ msgstr "Scegli la cartella per gli elementi scaricati"
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "Scegliere la directory di download"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Ultima)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Modulo di rete cambiato con successo."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Successo"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "Impossibile caricare il modulo di rete. Riavviare l'applicazione."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Hai selezionato la versione %s del modulo di rete.\n"
|
||||
"\n"
|
||||
"Vuoi scaricare e installare questa versione ora?\n"
|
||||
"\n"
|
||||
"Nota: potrebbe essere necessario riavviare l'applicazione dopo l'installazione."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Scarica modulo di rete"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Ricarica il modulo di rete senza riavviare l'applicazione"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Modulo di rete ricaricato con successo."
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Ricarica"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Impossibile ricaricare il modulo di rete. Riavviare l'applicazione."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Ricaricamento fallito"
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "Associa"
|
||||
|
||||
@@ -7939,12 +7992,6 @@ msgstr "Mostra schermata iniziale"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Mostra la schermata iniziale durante l'avvio."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "Mostra notifica profili condivisi"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "Quando si cambia la stampante selezionata, viene visualizzata una notifica con un collegamento per esplorare i profili condivisi."
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr "Utilizza i pulsanti della finestra sul lato sinistro"
|
||||
|
||||
@@ -7975,6 +8022,13 @@ msgstr "Comportamento di caricamento"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "Quando si apre un file 3MF, è necessario caricare le impostazioni della stampante/filamento/processo?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Backup automatico"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Esegui periodicamente una copia di sicurezza del tuo progetto per facilitarne il ripristino dopo un arresto anomalo."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "Numero massimo file recenti"
|
||||
|
||||
@@ -7993,12 +8047,20 @@ msgstr "Mostra opzioni durante l'importazione di file STEP"
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "Se abilitato, una finestra di dialogo per le impostazioni dei parametri apparirà durante l'importazione di file STEP."
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Backup automatico"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Livello di qualità per l'esportazione Draco"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Esegui periodicamente una copia di sicurezza del tuo progetto per facilitarne il ripristino dopo un arresto anomalo."
|
||||
msgid "bits"
|
||||
msgstr "bit"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Controlla la profondità di bit della quantizzazione utilizzata durante la compressione della mesh in formato Draco.\n"
|
||||
"0 = compressione senza perdita (la geometria viene preservata a piena precisione). I valori con perdita validi vanno da 8 a 30.\n"
|
||||
"Valori più bassi producono file più piccoli ma perdono più dettagli geometrici; valori più alti preservano più dettagli a costo di file più grandi."
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Profilo"
|
||||
@@ -8030,6 +8092,12 @@ msgstr "filamenti"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr "Ottimizza l'altezza massima dell'area filamenti in base al numero di filamenti selezionato."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "Mostra notifica profili condivisi"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "Quando si cambia la stampante selezionata, viene visualizzata una notifica con un collegamento per esplorare i profili condivisi."
|
||||
|
||||
msgid "Features"
|
||||
msgstr "Funzionalità"
|
||||
|
||||
@@ -8042,21 +8110,6 @@ msgstr "Abilitando questa opzione, puoi inviare un'attività a più dispositivi
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "Popup per selezionare la modalità di raggruppamento filamenti"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Livello di qualità per l'esportazione Draco"
|
||||
|
||||
msgid "bits"
|
||||
msgstr "bit"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Controlla la profondità di bit della quantizzazione utilizzata durante la compressione della mesh in formato Draco.\n"
|
||||
"0 = compressione senza perdita (la geometria viene preservata a piena precisione). I valori con perdita validi vanno da 8 a 30.\n"
|
||||
"Valori più bassi producono file più piccoli ma perdono più dettagli geometrici; valori più alti preservano più dettagli a costo di file più grandi."
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "Comportamento"
|
||||
|
||||
@@ -8284,19 +8337,6 @@ msgstr "Verifica solo la disponibilità di aggiornamenti stabili"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Sincronizzazione automatica profili utente (stampante/filamento/processo)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Aggiorna automaticamente i profili."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Usa file crittografato per l'archiviazione dei token"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Archivia i token di autenticazione in un file crittografato invece del portachiavi di sistema. (Richiede riavvio)"
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr "Opzioni sincronizzazione filamento"
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr "Modalità sincronizzazione filamento"
|
||||
|
||||
@@ -8309,6 +8349,16 @@ msgstr "Filamento e colore"
|
||||
msgid "Color only"
|
||||
msgstr "Solo colore"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Aggiorna automaticamente i profili."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Usa file crittografato per l'archiviazione dei token"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Archivia i token di autenticazione in un file crittografato invece del portachiavi di sistema. (Richiede riavvio)"
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8321,35 +8371,6 @@ msgstr "Versione modulo di rete"
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr "Seleziona la versione del modulo di rete da utilizzare"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Ultima)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Modulo di rete cambiato con successo."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Successo"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "Impossibile caricare il modulo di rete. Riavviare l'applicazione."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Hai selezionato la versione %s del modulo di rete.\n"
|
||||
"\n"
|
||||
"Vuoi scaricare e installare questa versione ora?\n"
|
||||
"\n"
|
||||
"Nota: potrebbe essere necessario riavviare l'applicazione dopo l'installazione."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Scarica modulo di rete"
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Associa i file ad OrcaSlicer"
|
||||
|
||||
@@ -8395,7 +8416,16 @@ msgstr "Sviluppatore"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "Salta il controllo della lista nera dell'AMS"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8403,12 +8433,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "Consenti memoria anomala"
|
||||
|
||||
@@ -8437,24 +8461,6 @@ msgstr ""
|
||||
msgid "trace"
|
||||
msgstr "traccia"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr "Modulo di rete"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Ricarica"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Ricarica il modulo di rete senza riavviare l'applicazione"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Modulo di rete ricaricato con successo."
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Impossibile ricaricare il modulo di rete. Riavviare l'applicazione."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Ricaricamento fallito"
|
||||
|
||||
msgid "Debug"
|
||||
msgstr ""
|
||||
|
||||
@@ -8470,25 +8476,6 @@ msgstr "Sincronizzazione profili"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Sincronizzazione preferenze"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Visualizza impostazioni di controllo"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "Ruota vista"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "Vista panoramica"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "Ingrandimento vista"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Altro"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "Lo zoom tramitie rotellina del mouse è invertito"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "Abilita SSL (MQTT)"
|
||||
|
||||
@@ -9197,6 +9184,12 @@ msgstr "Elimina questo profilo"
|
||||
msgid "Search in preset"
|
||||
msgstr "Cerca nel profilo"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Clicca per ripristinare tutte le impostazioni dell'ultimo profilo salvato."
|
||||
|
||||
@@ -9489,6 +9482,18 @@ msgstr "Flusso di stampa e Anticipo di pressione"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "Temperatura della camera di stampa"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Temperatura della camera"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Temperatura stampa"
|
||||
|
||||
@@ -9821,12 +9826,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr "Non inviare più avvisi per questo profilo"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "Sinistra: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "Destra: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "Fai clic per ripristinare il valore corrente e associarlo al valore globale."
|
||||
@@ -9846,7 +9861,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "Scarta o mantieni le modifiche"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "Valore precedente"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9968,6 +9983,12 @@ msgstr "Numero di estrusori"
|
||||
msgid "Capabilities"
|
||||
msgstr "Caratteristiche"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Mostra tutti i profili (compresi quelli non compatibili)"
|
||||
|
||||
@@ -12103,6 +12124,25 @@ msgstr "Stampa normale"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "Accelerazione predefinita sia per la stampa normale che per gli spostamenti, eccetto lo strato iniziale."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Accelerazione per gli spostamenti."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "Spostamento primo strato"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"Accelerazione dello spostamento nel primo strato.\n"
|
||||
"Il valore percentuale è relativo all'accelerazione dello spostamento."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s o %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Accelerazione dei ponti. Se il valore è espresso in percentuale (ad esempio 50%), verrà calcolato in base all'accelerazione della parete esterna."
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Profilo filamento predefinito"
|
||||
|
||||
@@ -12310,6 +12350,12 @@ msgstr "Corde di Archimede"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "Spirale a ottogramma"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Densità superficie superiore"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Densità dello strato superficiale superiore. Un valore del 100% crea uno strato superiore completamente solido e liscio. La riduzione di questo valore produce una superficie superiore texturizzata, secondo il pattern di superficie superiore scelto. Un valore dello 0% risulterà nella creazione delle sole pareti sullo strato superiore. Destinato a scopi estetici o funzionali, non per risolvere problemi come la sovraestrusione."
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Motivo superficie inferiore"
|
||||
|
||||
@@ -12317,6 +12363,16 @@ msgstr "Motivo superficie inferiore"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "Motivo per il riempimento della superficie inferiore, escluso il riempimento dei ponti."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Densità superficie inferiore"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Densità dello strato superficiale inferiore. Destinato a scopi estetici o funzionali, non per risolvere problemi come la sovraestrusione.\n"
|
||||
"ATTENZIONE: la riduzione di questo valore potrebbe influire negativamente sull'adesione al piatto."
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "Motivo riempimento solido interno"
|
||||
|
||||
@@ -12619,18 +12675,6 @@ msgstr "Automatico per spurgo"
|
||||
msgid "Auto For Match"
|
||||
msgstr "Automatico per abbinamento"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "Temperatura di spurgo"
|
||||
|
||||
@@ -12973,6 +13017,7 @@ msgstr "Utilizzo di linee multiple per il pattern di riempimento, se supportato
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -13040,79 +13085,6 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr "Giroide"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Angolo reticolo 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "L'angolo della prima serie di elementi reticolari 2D nell'asse Z. Zero è verticale."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Angolo reticolo 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "L'angolo della seconda serie di elementi reticolari 2D nell'asse Z. Zero è verticale."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Angolo di sbalzo del riempimento"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "L'angolo delle linee inclinate del riempimento. 60° produrrà un nido d'ape puro."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Lunghezza ancoraggio riempimento sparso"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Collega una linea di riempimento ad una parete interna con un breve segmento di perimetro aggiuntivo. Se espresso in percentuale (esempio: 15%) viene calcolato sulla larghezza di estrusione del riempimento. OrcaSlicer tenta di collegare due linee di riempimento vicine ad un breve segmento di perimetro. Se non viene trovato alcun segmento di perimetro più corto di infill_anchor_max, la linea di riempimento viene collegata a un segmento di perimetro su un solo lato e la lunghezza del segmento è limitata da questo parametro, ma non superiore a anchor_length_max.\n"
|
||||
"Impostare questo parametro su zero per disabilitare i perimetri di ancoraggio collegati a una singola linea di riempimento."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (senza ancoraggi aperti)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (senza limiti)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Lunghezza massima dell'ancoraggio del riempimento"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Collega una linea di riempimento ad una parete interna con un breve segmento di un perimetro aggiuntivo. Se espresso in percentuale (esempio: 15%) viene calcolato sulla larghezza di estrusione del riempimento. OrcaSlicer tenta di collegare due linee di riempimento vicine a un breve segmento di perimetro. Se non viene trovato alcun segmento di perimetro più corto di questo parametro, la linea di riempimento viene collegata a un segmento di perimetro su un solo lato e la lunghezza del segmento è limitata da infill_anchor, ma non superiore a questo parametro.\n"
|
||||
"Se impostato a 0, verrà utilizzato il vecchio algoritmo per la connessione del riempimento, che dovrebbe creare lo stesso risultato di 1000 e 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (Connessione semplice)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Accelerazione delle pareti interne."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Accelerazione per gli spostamenti."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "Accelerazione del riempimento della superficie superiore. L'utilizzo di un valore inferiore può migliorare la qualità della superficie superiore."
|
||||
@@ -13121,11 +13093,8 @@ msgstr "Accelerazione del riempimento della superficie superiore. L'utilizzo di
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Accelerazione della parete esterna: l'utilizzo di un valore inferiore può migliorare la qualità."
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Accelerazione dei ponti. Se il valore è espresso in percentuale (ad esempio 50%), verrà calcolato in base all'accelerazione della parete esterna."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s o %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Accelerazione delle pareti interne."
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Accelerazione del riempimento sparso. Se il valore è espresso in percentuale (ad esempio 100%), verrà calcolato in base all'accelerazione predefinita."
|
||||
@@ -13137,16 +13106,6 @@ msgstr "Accelerazione del riempimento solido interno. Se il valore è espresso i
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "Accelerazione di stampa per il primo strato. Utilizzando un valore inferiore, è possibile migliorare l'adesione sul piano di stampa."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "Spostamento primo strato"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"Accelerazione dello spostamento nel primo strato.\n"
|
||||
"Il valore percentuale è relativo all'accelerazione dello spostamento."
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "Abilita accel_to_decel"
|
||||
|
||||
@@ -13243,6 +13202,17 @@ msgstr "La velocità della ventola aumenterà in modo lineare da zero nello stra
|
||||
msgid "layer"
|
||||
msgstr "strato"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "Velocità ventola interfaccia di supporto"
|
||||
|
||||
@@ -13779,6 +13749,73 @@ msgstr "Area di esclusione sondaggio ammassi"
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "Area di esclusione sondaggio ammassi."
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Angolo reticolo 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "L'angolo della prima serie di elementi reticolari 2D nell'asse Z. Zero è verticale."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Angolo reticolo 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "L'angolo della seconda serie di elementi reticolari 2D nell'asse Z. Zero è verticale."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Angolo di sbalzo del riempimento"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "L'angolo delle linee inclinate del riempimento. 60° produrrà un nido d'ape puro."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Lunghezza ancoraggio riempimento sparso"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Collega una linea di riempimento ad una parete interna con un breve segmento di perimetro aggiuntivo. Se espresso in percentuale (esempio: 15%) viene calcolato sulla larghezza di estrusione del riempimento. OrcaSlicer tenta di collegare due linee di riempimento vicine ad un breve segmento di perimetro. Se non viene trovato alcun segmento di perimetro più corto di infill_anchor_max, la linea di riempimento viene collegata a un segmento di perimetro su un solo lato e la lunghezza del segmento è limitata da questo parametro, ma non superiore a anchor_length_max.\n"
|
||||
"Impostare questo parametro su zero per disabilitare i perimetri di ancoraggio collegati a una singola linea di riempimento."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (senza ancoraggi aperti)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (senza limiti)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Lunghezza massima dell'ancoraggio del riempimento"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Collega una linea di riempimento ad una parete interna con un breve segmento di un perimetro aggiuntivo. Se espresso in percentuale (esempio: 15%) viene calcolato sulla larghezza di estrusione del riempimento. OrcaSlicer tenta di collegare due linee di riempimento vicine a un breve segmento di perimetro. Se non viene trovato alcun segmento di perimetro più corto di questo parametro, la linea di riempimento viene collegata a un segmento di perimetro su un solo lato e la lunghezza del segmento è limitata da infill_anchor, ma non superiore a questo parametro.\n"
|
||||
"Se impostato a 0, verrà utilizzato il vecchio algoritmo per la connessione del riempimento, che dovrebbe creare lo stesso risultato di 1000 e 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (Connessione semplice)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14669,6 +14706,18 @@ msgstr "Direct Drive"
|
||||
msgid "Bowden"
|
||||
msgstr "Bowden"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Lunghezza aggiuntiva in ripresa"
|
||||
|
||||
@@ -15092,6 +15141,9 @@ msgstr "Le fessure più piccole di 2 volte il raggio di chiusura degli spazi vuo
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Modalità elaborazione"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Altro"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "Usa \"Pari-dispari\" per modelli di aeroplano 3DLabPrint. Utilizza \"Chiudi fori\" per chiudere tutti i fori del modello."
|
||||
|
||||
@@ -15457,9 +15509,6 @@ msgstr ""
|
||||
"\n"
|
||||
"Questa opzione richiede che il firmware supporti i comandi M191 e M141 tramite macro o in modo nativo, e viene solitamente utilizzata quando non è presente un sistema di riscaldamento della camera."
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Temperatura della camera"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15473,6 +15522,17 @@ msgstr ""
|
||||
"\n"
|
||||
"Se abilitato, questo parametro imposta anche una variabile G-code denominata chamber_temperature, che può essere utilizzata per passare la temperatura desiderata della camera nella macro di inizio stampa o in una macro di preriscaldamento in questo modo: PRINT_START (altre variabili) CHAMBER_TEMP=[chamber_temperature]. Questo può essere utile se la stampante non supporta i comandi M141/M191 o, se non è presente un sistema di riscaldamento della camera, si desidera gestire il preriscaldamento nella macro di inizio stampa."
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "Temperatura dell'ugello per gli strati successivi a quello iniziale."
|
||||
@@ -15517,22 +15577,6 @@ msgstr "Spessore guscio superiore"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "Il numero di strati solidi superiori viene aumentato durante l'elaborazione se lo spessore calcolato dagli strati del guscio superiore è più sottile di questo valore. In questo modo si evita di avere un guscio troppo sottile quando l'altezza degli strati è piccola. Il valore 0 indica che questa impostazione è disattivata e che lo spessore del guscio superiore è determinato in modo assoluto dagli strati del guscio superiore."
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Densità superficie superiore"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Densità dello strato superficiale superiore. Un valore del 100% crea uno strato superiore completamente solido e liscio. La riduzione di questo valore produce una superficie superiore texturizzata, secondo il pattern di superficie superiore scelto. Un valore dello 0% risulterà nella creazione delle sole pareti sullo strato superiore. Destinato a scopi estetici o funzionali, non per risolvere problemi come la sovraestrusione."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Densità superficie inferiore"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Densità dello strato superficiale inferiore. Destinato a scopi estetici o funzionali, non per risolvere problemi come la sovraestrusione.\n"
|
||||
"ATTENZIONE: la riduzione di questo valore potrebbe influire negativamente sull'adesione al piatto."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Indica la velocità di spostamento più rapida e senza estrusione."
|
||||
@@ -18175,6 +18219,132 @@ msgstr "Accesso/Test"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "Connessione alle stampanti collegate tramite l'host di stampa non riuscita."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -18257,6 +18427,19 @@ msgstr "La connessione a MKS funziona correttamente."
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "Impossibile connettersi a MKS"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "La connessione con OctoPrint funziona correttamente."
|
||||
|
||||
@@ -19413,6 +19596,36 @@ msgstr ""
|
||||
"Evita le deformazioni\n"
|
||||
"Sapevi che quando si stampano materiali soggetti a deformazioni come l'ABS, aumentare in modo appropriato la temperatura del piano riscaldato può ridurre la probabilità di deformazione?"
|
||||
|
||||
#~ msgid "Filament Sync Options"
|
||||
#~ msgstr "Opzioni sincronizzazione filamento"
|
||||
|
||||
#~ msgid "Network plug-in"
|
||||
#~ msgstr "Modulo di rete"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Visualizza impostazioni di controllo"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "Ruota vista"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "Vista panoramica"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "Ingrandimento vista"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "Lo zoom tramitie rotellina del mouse è invertito"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "Sinistra: %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "Destra: %s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "Abilita modulo di rete"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
@@ -1715,7 +1715,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "バージョン 2.4.0 以降、OrcaSlicer はユーザープロファイルを Bambu Cloud ではなく Orca Cloud を通じて同期します。\n\n既存のプロファイルを移行するには、Orca Cloud にログインしてください。自動的に転送されます。OrcaSlicer がプロファイルを保存・同期する仕組みの詳細や、プリセットを手動で移行する方法については、Wiki をご覧ください。\n\nプロファイルの同期に Bambu Cloud を使用していなかった場合、この変更の影響はありません。このメッセージは無視して問題ありません。"
|
||||
msgstr ""
|
||||
"バージョン 2.4.0 以降、OrcaSlicer はユーザープロファイルを Bambu Cloud ではなく Orca Cloud を通じて同期します。\n"
|
||||
"\n"
|
||||
"既存のプロファイルを移行するには、Orca Cloud にログインしてください。自動的に転送されます。OrcaSlicer がプロファイルを保存・同期する仕組みの詳細や、プリセットを手動で移行する方法については、Wiki をご覧ください。\n"
|
||||
"\n"
|
||||
"プロファイルの同期に Bambu Cloud を使用していなかった場合、この変更の影響はありません。このメッセージは無視して問題ありません。"
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4079,6 +4084,10 @@ msgstr "値が小さすぎます、0.5に戻します"
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "現在のチャンバー温度が材料の安全温度を超えています。材料の軟化や詰まりの原因になる可能性があります。材料の最大安全温度は%dです"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7842,6 +7851,50 @@ msgstr "ダウンロードアイテムのフォルダを選択"
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "ダウンロードフォルドを選択"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(最新)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "ネットワークプラグインの切り替えに成功しました。"
|
||||
|
||||
msgid "Success"
|
||||
msgstr "成功"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "ネットワークプラグインの読み込みに失敗しました。アプリケーションを再起動してください。"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"ネットワークプラグインバージョン%sを選択しました。\n"
|
||||
"\n"
|
||||
"このバージョンをダウンロードしてインストールしますか?\n"
|
||||
"\n"
|
||||
"注意: インストール後にアプリケーションの再起動が必要な場合があります。"
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "ネットワークプラグインをダウンロード"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "アプリケーションを再起動せずにネットワークプラグインを再読み込みします"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "ネットワークプラグインの再読み込みに成功しました。"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "再読み込み"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "ネットワークプラグインの再読み込みに失敗しました。アプリケーションを再起動してください。"
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "再読み込み失敗"
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "関連付け"
|
||||
|
||||
@@ -7897,12 +7950,6 @@ msgstr "スプラッシュ画面を表示する"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "起動時にスプラッシュスクリーンを表示します。"
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr ""
|
||||
|
||||
@@ -7933,6 +7980,13 @@ msgstr "ロード動作"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "3MFファイルを開く時にプリンター/フィラメント/プロセス設定をロードしますか?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "自動バックアップ"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "定期的にプロジェクトをバックアップして、クラッシュからの復元に備えます。"
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "最大最近のファイル数"
|
||||
|
||||
@@ -7951,12 +8005,20 @@ msgstr "STEPファイルインポート時にオプションを表示"
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "有効にすると、STEPファイルインポート時にパラメータ設定ダイアログが表示されます。"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "自動バックアップ"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Dracoエクスポートの品質レベル"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "定期的にプロジェクトをバックアップして、クラッシュからの復元に備えます。"
|
||||
msgid "bits"
|
||||
msgstr "ビット"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"メッシュをDraco形式に圧縮する際の量子化ビット深度を制御します。\n"
|
||||
"0 = 可逆圧縮(ジオメトリは完全な精度で保持されます)。有効な非可逆値の範囲は8〜30です。\n"
|
||||
"低い値はファイルサイズが小さくなりますがジオメトリの詳細が失われます。高い値はファイルサイズが大きくなりますがより多くの詳細が保持されます。"
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "プリセット"
|
||||
@@ -7988,6 +8050,12 @@ msgstr "フィラメント"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr "選択したフィラメント数に応じてフィラメントエリアの最大高さを最適化します。"
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Features"
|
||||
msgstr "機能"
|
||||
|
||||
@@ -8000,21 +8068,6 @@ msgstr "このオプションを有効にすると、複数のデバイスに同
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "フィラメントグルーピングモード選択のポップアップ"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Dracoエクスポートの品質レベル"
|
||||
|
||||
msgid "bits"
|
||||
msgstr "ビット"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"メッシュをDraco形式に圧縮する際の量子化ビット深度を制御します。\n"
|
||||
"0 = 可逆圧縮(ジオメトリは完全な精度で保持されます)。有効な非可逆値の範囲は8〜30です。\n"
|
||||
"低い値はファイルサイズが小さくなりますがジオメトリの詳細が失われます。高い値はファイルサイズが大きくなりますがより多くの詳細が保持されます。"
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "動作"
|
||||
|
||||
@@ -8242,19 +8295,6 @@ msgstr "安定版アップデートのみ確認"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "ユーザープリセットの自動同期 (プリンター/フィラメント/プロセス)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "組み込みプリセットを自動更新します。"
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "トークン保存に暗号化ファイルを使用"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "認証トークンをシステムキーチェーンの代わりに暗号化ファイルに保存します。(再起動が必要)"
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr "フィラメント同期オプション"
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr "フィラメント同期モード"
|
||||
|
||||
@@ -8267,6 +8307,16 @@ msgstr "フィラメントと色"
|
||||
msgid "Color only"
|
||||
msgstr "色のみ"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "組み込みプリセットを自動更新します。"
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "トークン保存に暗号化ファイルを使用"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "認証トークンをシステムキーチェーンの代わりに暗号化ファイルに保存します。(再起動が必要)"
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8279,35 +8329,6 @@ msgstr "ネットワークプラグインのバージョン"
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr "使用するネットワークプラグインのバージョンを選択"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(最新)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "ネットワークプラグインの切り替えに成功しました。"
|
||||
|
||||
msgid "Success"
|
||||
msgstr "成功"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "ネットワークプラグインの読み込みに失敗しました。アプリケーションを再起動してください。"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"ネットワークプラグインバージョン%sを選択しました。\n"
|
||||
"\n"
|
||||
"このバージョンをダウンロードしてインストールしますか?\n"
|
||||
"\n"
|
||||
"注意: インストール後にアプリケーションの再起動が必要な場合があります。"
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "ネットワークプラグインをダウンロード"
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "ファイルをOrca Slicerに関連付ける"
|
||||
|
||||
@@ -8356,7 +8377,16 @@ msgstr "開発者"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "AMSブラックリストチェックをスキップ"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8364,12 +8394,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "異常なストレージを許可"
|
||||
|
||||
@@ -8398,24 +8422,6 @@ msgstr "デバッグ"
|
||||
msgid "trace"
|
||||
msgstr "トレース"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr "ネットワークプラグイン"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "再読み込み"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "アプリケーションを再起動せずにネットワークプラグインを再読み込みします"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "ネットワークプラグインの再読み込みに成功しました。"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "ネットワークプラグインの再読み込みに失敗しました。アプリケーションを再起動してください。"
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "再読み込み失敗"
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "デバッグ"
|
||||
|
||||
@@ -8431,25 +8437,6 @@ msgstr "プリセット同期"
|
||||
msgid "Preferences sync"
|
||||
msgstr "設定を同期"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "表示設定"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "回転"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "移動"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "ズーム"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "その他"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "ズーム中にスクロール方向を反転させる"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "SSL(MQTT)を有効にする"
|
||||
|
||||
@@ -9158,6 +9145,12 @@ msgstr "このプリセットを削除"
|
||||
msgid "Search in preset"
|
||||
msgstr "検索"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "全ての変更をリセットします"
|
||||
|
||||
@@ -9443,6 +9436,18 @@ msgstr "フロー率と圧力アドバンス"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "印刷チャンバー温度"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "庫内温度"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "造形温度"
|
||||
|
||||
@@ -9760,12 +9765,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "左: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "右: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "現在値をデフォルト値に戻します"
|
||||
@@ -9785,7 +9800,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "変更を破棄または保持"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "古い値"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9901,6 +9916,12 @@ msgstr "エクストルーダー数"
|
||||
msgid "Capabilities"
|
||||
msgstr "能力"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "全てのプリセットを表示"
|
||||
|
||||
@@ -11935,6 +11956,23 @@ msgstr "通常造形"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "造形と移動時のデフォルト加速度です。"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr ""
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² 或は %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "デフォルト フィラメント プロファイル"
|
||||
|
||||
@@ -12117,6 +12155,12 @@ msgstr "アルキメデス螺旋"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "オクタグラムスパイラル"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "上面密度"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "底面パターン"
|
||||
|
||||
@@ -12124,6 +12168,14 @@ msgstr "底面パターン"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "底面のインフィル パターンです、ブリッジインフィルが含まれていません。"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "底面密度"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "内部ソリッドインフィルパターン"
|
||||
|
||||
@@ -12390,18 +12442,6 @@ msgstr "フラッシュ用自動"
|
||||
msgid "Auto For Match"
|
||||
msgstr "マッチ用自動"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "フラッシュ温度"
|
||||
|
||||
@@ -12735,6 +12775,7 @@ msgstr "充填パターンが対応している場合は、複数のラインを
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -12802,75 +12843,6 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr "ジャイロイド"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "インフィルオーバーハング角度"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0(開いているアンカーなし)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (無制限)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "最長インフィルアンカー"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "トップ面のインフィル加速度です。遅くすると表面の仕上がりが向上させることができます"
|
||||
@@ -12879,12 +12851,9 @@ msgstr "トップ面のインフィル加速度です。遅くすると表面の
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "外壁の加速度:低い値では品質を向上させることができます。"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² 或は %"
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "スパースインフィルの加速度です。値がパーセンテージ(例:100%)で指定された場合、デフォルトの加速度を基に計算されます。"
|
||||
|
||||
@@ -12895,14 +12864,6 @@ msgstr ""
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "1層目の造形加速度です。遅くするとプレートとの接着を向上させることができます"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "加減速制御を有効にする"
|
||||
|
||||
@@ -12997,6 +12958,17 @@ msgstr ""
|
||||
msgid "layer"
|
||||
msgstr ""
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr ""
|
||||
|
||||
@@ -13481,6 +13453,69 @@ msgstr "クランピングのプロービング除外エリア"
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "クランピングのプロービング除外エリア。"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "インフィルオーバーハング角度"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0(開いているアンカーなし)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (無制限)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "最長インフィルアンカー"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14316,6 +14351,18 @@ msgstr "ダイレクトドライブ"
|
||||
msgid "Bowden"
|
||||
msgstr "ボーデン"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "再開時の追加長さ"
|
||||
|
||||
@@ -14721,6 +14768,9 @@ msgstr ""
|
||||
msgid "Slicing Mode"
|
||||
msgstr "スライシングモード"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "その他"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr ""
|
||||
|
||||
@@ -15073,9 +15123,6 @@ msgid ""
|
||||
"This option relies on the firmware supporting the M191 and M141 commands either via macros or natively and is usually used when an active chamber heater is installed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "庫内温度"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15084,6 +15131,17 @@ msgid ""
|
||||
"If enabled, this parameter also sets a G-code variable named chamber_temperature, which can be used to pass the desired chamber temperature to your print start macro, or a heat soak macro like this: PRINT_START (other variables) CHAMBER_TEMP=[chamber_temperature]. This may be useful if your printer does not support M141/M191 commands, or if you desire to handle heat soaking in the print start macro if no active chamber heater is installed."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "1層目後のノズル温度"
|
||||
@@ -15129,20 +15187,6 @@ msgstr "トップ面厚さ"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "トップ面の厚さです、トップ面層数で決まった厚みがこの値より小さい場合、層数を増やします。この値が0にする場合、この設定が無効となり、設定した層数で造形します。"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "上面密度"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "底面密度"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "移動完了時の速度です。"
|
||||
@@ -17663,6 +17707,132 @@ msgstr "ログイン/テスト"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "印刷ホスト経由のプリンターへの接続に失敗しました。"
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -17745,6 +17915,19 @@ msgstr "MKSへの接続は正常に動作しています。"
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "MKSに接続できませんでした"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "OctoPrintへの接続は正常に動作しています。"
|
||||
|
||||
@@ -18878,6 +19061,36 @@ msgstr ""
|
||||
"反りを避ける\n"
|
||||
"ABSのような反りやすい素材を印刷する場合、ヒートベッドの温度を適切に上げることで、反りが発生する確率を下げることができることをご存知ですか?"
|
||||
|
||||
#~ msgid "Filament Sync Options"
|
||||
#~ msgstr "フィラメント同期オプション"
|
||||
|
||||
#~ msgid "Network plug-in"
|
||||
#~ msgstr "ネットワークプラグイン"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "表示設定"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "回転"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "移動"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "ズーム"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "ズーム中にスクロール方向を反転させる"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "左: %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "右: %s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "ネットワークプラグインを有効にする"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: 2025-06-02 17:12+0900\n"
|
||||
"Last-Translator: crwusiz <crwusiz@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
@@ -1721,7 +1721,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "버전 2.4.0부터 OrcaSlicer는 사용자 프로파일을 Bambu Cloud 대신 Orca Cloud를 통해 동기화합니다.\n\n기존 프로파일을 이전하려면 Orca Cloud에 로그인하세요. 자동으로 전송됩니다. OrcaSlicer가 프로파일을 저장하고 동기화하는 방식에 대해 자세히 알아보거나 사전 설정을 수동으로 이전하려면 위키를 참조하세요.\n\n프로파일 동기화에 Bambu Cloud를 사용하지 않았다면 이 변경 사항은 영향을 주지 않으므로 이 메시지를 무시해도 됩니다."
|
||||
msgstr ""
|
||||
"버전 2.4.0부터 OrcaSlicer는 사용자 프로파일을 Bambu Cloud 대신 Orca Cloud를 통해 동기화합니다.\n"
|
||||
"\n"
|
||||
"기존 프로파일을 이전하려면 Orca Cloud에 로그인하세요. 자동으로 전송됩니다. OrcaSlicer가 프로파일을 저장하고 동기화하는 방식에 대해 자세히 알아보거나 사전 설정을 수동으로 이전하려면 위키를 참조하세요.\n"
|
||||
"\n"
|
||||
"프로파일 동기화에 Bambu Cloud를 사용하지 않았다면 이 변경 사항은 영향을 주지 않으므로 이 메시지를 무시해도 됩니다."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4096,6 +4101,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "현재 챔버 온도가 재료의 안전 온도보다 높으므로 재료가 부드러워지고 막힐 수 있습니다. 재료의 최대 안전 온도는 %d입니다"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7874,6 +7883,45 @@ msgstr ""
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "다운로드 폴더 선택"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "링크"
|
||||
|
||||
@@ -7929,12 +7977,6 @@ msgstr "시작 화면 표시"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "시작 화면을 표시합니다."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr ""
|
||||
|
||||
@@ -7965,6 +8007,13 @@ msgstr "행동 로드"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr ".3mf를 열 때 프린터/필라멘트/프로세스 설정이 로드되어야 합니까?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "자동 백업"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "간헐적인 충돌로부터 복원하기 위해 주기적으로 프로젝트를 백업하세요."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr ""
|
||||
|
||||
@@ -7983,12 +8032,17 @@ msgstr ""
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr ""
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "자동 백업"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "간헐적인 충돌로부터 복원하기 위해 주기적으로 프로젝트를 백업하세요."
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "사전 설정"
|
||||
@@ -8020,6 +8074,12 @@ msgstr ""
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Features"
|
||||
msgstr ""
|
||||
|
||||
@@ -8032,18 +8092,6 @@ msgstr "활성화하면 여러 장치에 동시에 작업을 보내고 여러
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "필라멘트 그룹화 모드를 선택하기 위한 팝업"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr ""
|
||||
|
||||
@@ -8271,19 +8319,6 @@ msgstr "안정적인 업데이트만 확인"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "사용자 사전 설정 자동 동기화(프린터/필라멘트/프로세스)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "기본 제공 사전 설정을 자동으로 업데이트합니다."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr ""
|
||||
|
||||
@@ -8296,6 +8331,16 @@ msgstr ""
|
||||
msgid "Color only"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "기본 제공 사전 설정을 자동으로 업데이트합니다."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8308,30 +8353,6 @@ msgstr ""
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "파일을 OrcaSlicer에 연결"
|
||||
|
||||
@@ -8380,7 +8401,16 @@ msgstr ""
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "AMS 블랙리스트 확인 건너뛰기"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8388,12 +8418,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr ""
|
||||
|
||||
@@ -8420,24 +8444,6 @@ msgstr "디버그"
|
||||
msgid "trace"
|
||||
msgstr "추적"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Debug"
|
||||
msgstr ""
|
||||
|
||||
@@ -8453,25 +8459,6 @@ msgstr "사전 설정 동기화"
|
||||
msgid "Preferences sync"
|
||||
msgstr "기본 설정 동기화"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "시점 컨트롤 설정"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "시점 회전"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "시점 이동"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "시점 확대/축소"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "기타"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "확대/축소 시 마우스 휠이 반전됩니다"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "SSL(MQTT) 활성화"
|
||||
|
||||
@@ -9182,6 +9169,12 @@ msgstr "이 사전 설정 삭제"
|
||||
msgid "Search in preset"
|
||||
msgstr "사전 설정에서 찾기"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "모든 설정을 마지막으로 저장한 사전 설정으로 되돌립니다."
|
||||
|
||||
@@ -9467,6 +9460,18 @@ msgstr "압출량 비율 및 PA"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "출력 챔버 온도"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "챔버 온도"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "출력 온도"
|
||||
|
||||
@@ -9787,12 +9792,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "왼쪽: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "오른쪽: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "현재 값을 재설정하고 전역 값에 연결하려면 클릭합니다."
|
||||
@@ -9812,7 +9827,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "변경 사항 폐기 또는 유지"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "이전 값"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9934,6 +9949,12 @@ msgstr "익스트루더 수"
|
||||
msgid "Capabilities"
|
||||
msgstr "성능"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "모든 사전 설정 표시(호환되지 않는 설정 포함)"
|
||||
|
||||
@@ -12028,6 +12049,23 @@ msgstr "일반 출력"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "초기 레이어를 제외한 모든 일반 출력 및 이동의 기본 가속"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "이동 가속도"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² 또는 %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "브릿지의 가속도. 값을 백분율 (ex. 50%)로 표시하면 외벽 가속도 기준으로 계산됩니다."
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "기본 필라멘트 사전설정"
|
||||
|
||||
@@ -12240,6 +12278,12 @@ msgstr "아르키메데스 코드"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "팔각 나선형"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "상단 표면 밀도"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "하단 표면 패턴"
|
||||
|
||||
@@ -12247,6 +12291,14 @@ msgstr "하단 표면 패턴"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "브릿지 채우기가 아닌 바닥면 채우기의 선 패턴"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "하단 표면 밀도"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "꽉찬 내부 채우기 패턴"
|
||||
|
||||
@@ -12543,18 +12595,6 @@ msgstr "자동 플러시"
|
||||
msgid "Auto For Match"
|
||||
msgstr "자동 경기"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "플러시 온도"
|
||||
|
||||
@@ -12892,6 +12932,7 @@ msgstr "채우기 패턴에서 지원되는 경우 채우기 패턴에 여러
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -12959,80 +13000,6 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr "자이로이드"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "격자 각도 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Z 방향의 첫 번째 2D 격자 요소 집합의 각도입니다. 0은 수직입니다."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "격자 각도 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Z 방향에서 두 번째 2D 격자 요소 세트의 각도입니다. 0은 수직입니다."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "드문 채우기 고정점 길이"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"사용하여 채우기 선을 내부 둘레에 연결합니다. 백분율(예: 15%)로 표시되는 경우 채우기 돌출 너비에 대해 계산됩니다. Orca Slicer은 두 개의 가까운 채우기 선을 짧은 주변 세그먼트에 연결하려고 합니다. 내부 채우기 고정점 (infill_anchor_max) 최대 길이보다 짧은 경계 세그먼트가 발견되지 않으면 \n"
|
||||
"채우기 선은 한쪽에서 경계 세그먼트에 연결되고 취해진 경계 세그먼트의 길이는 이 매개변수로 제한되지만 최대 고정점 길이(anchor_length_max) 보다 길지 않습니다.\n"
|
||||
"단일 채우기 선에 연결된 고정 둘레를 비활성화하려면 이 매개변수를 0으로 설정합니다."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (개방형 고정점 없음)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (무제한)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "채우기 고정점 최대 길이"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"추가 둘레의 짧은 세그먼트를 사용하여 채우기 선을 내부 둘레에 연결합니다. 백분율(예: 15%)로 표시되는 경우 채우기 돌출 너비에 대해 계산됩니다. Orca Slicer은 두 개의 가까운 채우기 선을 짧은 주변 세그먼트에 연결하려고 합니다. 이 매개변수보다 짧은 주변 세그먼트가 발견되지 않으면 채우기 선은 한쪽 측면의 주변 세그먼트에 연결되고 사용된 주변 세그먼트의 길이는 앵커 채우기(infill_anchor)로 제한되지만 이 매개변수보다 길지 않습니다.\n"
|
||||
"0으로 설정하면 채우기 연결에 대한 이전 알고리즘이 사용되며 1000 & 0과 동일한 결과를 생성해야 합니다."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (단순 연결)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "내벽의 가속도"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "이동 가속도"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "상단 표면 가속도. 낮은 값을 사용하면 상단 표면 품질이 향상될 수 있습니다"
|
||||
@@ -13041,11 +13008,8 @@ msgstr "상단 표면 가속도. 낮은 값을 사용하면 상단 표면 품질
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "외벽의 가속도. 낮은 값을 사용하면 품질이 향상 될 수 있습니다"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "브릿지의 가속도. 값을 백분율 (ex. 50%)로 표시하면 외벽 가속도 기준으로 계산됩니다."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² 또는 %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "내벽의 가속도"
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "드문 채우기 가속도. 값이 백분율 (예. 100%)로 표시되면 기본 가속도를 기준으로 계산됩니다."
|
||||
@@ -13057,14 +13021,6 @@ msgstr "꽉찬 내부 채우기 가속도. 값이 백분율 (예. 100%)로 표
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "초기 레이어 가속도. 낮은 값을 사용하면 빌드 플레이트 안착률을 높일 수 있습니다"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "가속/감속 활성화"
|
||||
|
||||
@@ -13159,6 +13115,17 @@ msgstr "팬 속도는 \"close_fan_the_first_x_layers\" 의 0에서 \"full_fan_sp
|
||||
msgid "layer"
|
||||
msgstr "레이어"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "서포트 접점 팬 속도"
|
||||
|
||||
@@ -13673,6 +13640,74 @@ msgstr "뭉침 영역 프로빙 제외"
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "뭉침 감지 제외 영역."
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "격자 각도 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Z 방향의 첫 번째 2D 격자 요소 집합의 각도입니다. 0은 수직입니다."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "격자 각도 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Z 방향에서 두 번째 2D 격자 요소 세트의 각도입니다. 0은 수직입니다."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "드문 채우기 고정점 길이"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"사용하여 채우기 선을 내부 둘레에 연결합니다. 백분율(예: 15%)로 표시되는 경우 채우기 돌출 너비에 대해 계산됩니다. Orca Slicer은 두 개의 가까운 채우기 선을 짧은 주변 세그먼트에 연결하려고 합니다. 내부 채우기 고정점 (infill_anchor_max) 최대 길이보다 짧은 경계 세그먼트가 발견되지 않으면 \n"
|
||||
"채우기 선은 한쪽에서 경계 세그먼트에 연결되고 취해진 경계 세그먼트의 길이는 이 매개변수로 제한되지만 최대 고정점 길이(anchor_length_max) 보다 길지 않습니다.\n"
|
||||
"단일 채우기 선에 연결된 고정 둘레를 비활성화하려면 이 매개변수를 0으로 설정합니다."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (개방형 고정점 없음)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (무제한)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "채우기 고정점 최대 길이"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"추가 둘레의 짧은 세그먼트를 사용하여 채우기 선을 내부 둘레에 연결합니다. 백분율(예: 15%)로 표시되는 경우 채우기 돌출 너비에 대해 계산됩니다. Orca Slicer은 두 개의 가까운 채우기 선을 짧은 주변 세그먼트에 연결하려고 합니다. 이 매개변수보다 짧은 주변 세그먼트가 발견되지 않으면 채우기 선은 한쪽 측면의 주변 세그먼트에 연결되고 사용된 주변 세그먼트의 길이는 앵커 채우기(infill_anchor)로 제한되지만 이 매개변수보다 길지 않습니다.\n"
|
||||
"0으로 설정하면 채우기 연결에 대한 이전 알고리즘이 사용되며 1000 & 0과 동일한 결과를 생성해야 합니다."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (단순 연결)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14537,6 +14572,18 @@ msgstr "직접 드라이브"
|
||||
msgid "Bowden"
|
||||
msgstr "보우덴"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "재 시작 시 추가 길이"
|
||||
|
||||
@@ -14962,6 +15009,9 @@ msgstr "간격 폐쇄 반경의 2배보다 작은 균열은 삼각형 메시 슬
|
||||
msgid "Slicing Mode"
|
||||
msgstr "슬라이싱 모드"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "기타"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "3DLabPrint 비행기 모델에는 \"짝수-홀수\"를 사용하세요. \"구멍 닫기\"를 사용하여 모델의 모든 구멍을 닫습니다."
|
||||
|
||||
@@ -15320,9 +15370,6 @@ msgstr ""
|
||||
"\n"
|
||||
"이 옵션은 매크로를 통해 또는 기본적으로 M191 및 M141 명령을 지원하는 펌웨어에 의존하며 일반적으로 활성 챔버 히터가 설치된 경우 사용됩니다."
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "챔버 온도"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15336,6 +15383,17 @@ msgstr ""
|
||||
"\n"
|
||||
"활성화된 경우 이 매개변수는 원하는 챔버 온도를 출력 시작 매크로 또는 PRINT_START(기타 변수) CHAMBER_TEMP=[chamber_temp]와 같은 열 흡수 매크로에 전달하는 데 사용할 수 있는 Chamber_temp라는 Gcode 변수도 설정합니다. 이는 프린터가 M141/M191 명령을 지원하지 않거나 활성 챔버 히터가 설치되지 않은 경우 출력 시작 매크로에서 열 흡수를 처리하려는 경우 유용할 수 있습니다."
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "초기 레이어 이후의 노즐 온도"
|
||||
@@ -15381,20 +15439,6 @@ msgstr "상단 쉘 두께"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "상단 쉘 레이어로 계산된 두께가 이 값보다 얇은 경우 슬라이싱할 때 상단 꽉찬 레이어의 수가 증가합니다. 이렇게 하면 레이어 높이가 작을 때 쉘이 너무 얇아지는 것을 방지할 수 있습니다. 0은 이 설정이 비활성화되고 상단 쉘의 두께가 절대적으로 상단 쉘 레이어에 의해 결정됨을 의미합니다"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "상단 표면 밀도"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "하단 표면 밀도"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "압출이 없을 때의 이동 속도"
|
||||
@@ -18011,6 +18055,132 @@ msgstr "로그인/테스트"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "출력 호스트를 통해 연결된 프린터에 연결하지 못했습니다."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -18093,6 +18263,19 @@ msgstr "MKS에 대한 연결이 올바르게 작동합니다."
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "MKS에 연결할 수 없습니다"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "OctoPrint에 대한 연결이 올바르게 작동합니다."
|
||||
|
||||
@@ -19249,6 +19432,30 @@ msgstr ""
|
||||
"뒤틀림 방지\n"
|
||||
"ABS와 같이 뒤틀림이 발생하기 쉬운 소재를 출력할 때, 히트베드 온도를 적절하게 높이면 뒤틀림 가능성을 줄일 수 있다는 사실을 알고 계셨나요?"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "시점 컨트롤 설정"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "시점 회전"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "시점 이동"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "시점 확대/축소"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "확대/축소 시 마우스 휠이 반전됩니다"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "왼쪽: %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "오른쪽: %s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "네트워크 플러그인 사용"
|
||||
|
||||
|
||||
@@ -227,11 +227,14 @@ src/slic3r/GUI/CreatePresetsDialog.cpp
|
||||
src/slic3r/GUI/DailyTips.cpp
|
||||
src/slic3r/Utils/CalibUtils.cpp
|
||||
src/slic3r/GUI/PhysicalPrinterDialog.cpp
|
||||
src/slic3r/GUI/CrealityDiscoveryDialog.cpp
|
||||
src/slic3r/GUI/TroubleshootDialog.cpp
|
||||
src/slic3r/Utils/3DPrinterOS.cpp
|
||||
src/slic3r/Utils/AstroBox.cpp
|
||||
src/slic3r/Utils/Duet.cpp
|
||||
src/slic3r/Utils/FlashAir.cpp
|
||||
src/slic3r/Utils/MKS.cpp
|
||||
src/slic3r/Utils/Moonraker.cpp
|
||||
src/slic3r/Utils/OctoPrint.cpp
|
||||
src/slic3r/Utils/Repetier.cpp
|
||||
src/slic3r/Utils/ProfileDescription.hpp
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
@@ -1702,7 +1702,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "Sinds versie 2.4.0 synchroniseert OrcaSlicer gebruikersprofielen via Orca Cloud in plaats van Bambu Cloud.\n\nOm je bestaande profielen te migreren, log je in bij Orca Cloud en worden ze automatisch overgezet. Raadpleeg onze wiki voor meer informatie over hoe OrcaSlicer je profielen opslaat en synchroniseert, of om je voorinstellingen handmatig te migreren.\n\nAls je Bambu Cloud niet gebruikte om profielen te synchroniseren, heeft deze wijziging geen invloed op jou en kun je dit bericht veilig negeren."
|
||||
msgstr ""
|
||||
"Sinds versie 2.4.0 synchroniseert OrcaSlicer gebruikersprofielen via Orca Cloud in plaats van Bambu Cloud.\n"
|
||||
"\n"
|
||||
"Om je bestaande profielen te migreren, log je in bij Orca Cloud en worden ze automatisch overgezet. Raadpleeg onze wiki voor meer informatie over hoe OrcaSlicer je profielen opslaat en synchroniseert, of om je voorinstellingen handmatig te migreren.\n"
|
||||
"\n"
|
||||
"Als je Bambu Cloud niet gebruikte om profielen te synchroniseren, heeft deze wijziging geen invloed op jou en kun je dit bericht veilig negeren."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4053,6 +4058,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "De huidige kamertemperatuur is hoger dan de veilige temperatuur van het materiaal; dit kan leiden tot verzachting van het materiaal en verstoppingen van het mondstuk. De maximale veilige temperatuur voor het materiaal is %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7791,6 +7800,45 @@ msgstr ""
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "Kies Downloadmap"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Gelukt"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Herladen"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "Associeer"
|
||||
|
||||
@@ -7846,12 +7894,6 @@ msgstr "Toon startscherm"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Toon het opstartscherm tijdens het opstarten."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr ""
|
||||
|
||||
@@ -7882,6 +7924,13 @@ msgstr ""
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Automatisch een back-up maken"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Maak regelmatig een back-up van uw project, zodat u het kunt herstellen na een incidentele crash."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr ""
|
||||
|
||||
@@ -7900,12 +7949,17 @@ msgstr ""
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr ""
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Automatisch een back-up maken"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Maak regelmatig een back-up van uw project, zodat u het kunt herstellen na een incidentele crash."
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Voorinstelling"
|
||||
@@ -7937,6 +7991,12 @@ msgstr ""
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Features"
|
||||
msgstr "Functies"
|
||||
|
||||
@@ -7949,18 +8009,6 @@ msgstr ""
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "Gedrag"
|
||||
|
||||
@@ -8188,19 +8236,6 @@ msgstr "Alleen op stabiele updates controleren"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Gebruikersvoorinstellingen automatisch synchroniseren (printer/filament/proces)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Ingebouwde voorinstellingen automatisch bijwerken."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr ""
|
||||
|
||||
@@ -8213,6 +8248,16 @@ msgstr ""
|
||||
msgid "Color only"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Ingebouwde voorinstellingen automatisch bijwerken."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8225,30 +8270,6 @@ msgstr ""
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Gelukt"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Koppel bestanden aan OrcaSlicer"
|
||||
|
||||
@@ -8297,7 +8318,16 @@ msgstr "Ontwikkelaar"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "AMS-zwartelijstcontrole overslaan"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8305,12 +8335,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr ""
|
||||
|
||||
@@ -8337,24 +8361,6 @@ msgstr ""
|
||||
msgid "trace"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Herladen"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "Foutopsporing"
|
||||
|
||||
@@ -8370,25 +8376,6 @@ msgstr "Voorinstellingen synchronizeren"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Synchroniseer voorkeuren"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Besturing instellingen weergeven"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr ""
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Anders"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "Omgekeerde scrollrichting tijdens het zoomen"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr ""
|
||||
|
||||
@@ -9090,6 +9077,12 @@ msgstr "Verwijder deze voorinstelling"
|
||||
msgid "Search in preset"
|
||||
msgstr "Zoeken in voorinstelling"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Klik om alle instellingen terug te zetten naar de laatst opgeslagen voorinstelling."
|
||||
|
||||
@@ -9375,6 +9368,18 @@ msgstr ""
|
||||
msgid "Print chamber temperature"
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Kamertemperatuur"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Print temperatuur"
|
||||
|
||||
@@ -9697,12 +9702,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "Links: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "Rechts: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "Klik om de huidige waarde terug te zetten en de globale waarde toe te passen."
|
||||
@@ -9722,7 +9737,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "Verwerp of bewaar aanpassingen"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "Oude waarde"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9838,6 +9853,12 @@ msgstr "Aantal extruders"
|
||||
msgid "Capabilities"
|
||||
msgstr "Mogelijkheden"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Toon alle presets (inclusief incompatibele)"
|
||||
|
||||
@@ -11867,6 +11888,23 @@ msgstr "Normaal printen"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "Dit is de standaard versnelling voor zowel normaal printen en verplaatsen behalve voor de eerste laag"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr ""
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² of %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Standaard filament profiel"
|
||||
|
||||
@@ -12049,6 +12087,12 @@ msgstr ""
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "Octagram Spiraal"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Bodem oppvlakte patroon"
|
||||
|
||||
@@ -12056,6 +12100,14 @@ msgstr "Bodem oppvlakte patroon"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "Dit is het lijnenpatroon van de vulling (infill) van het bodemoppervlak, maar niet van de vulling van de brug."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "Intern massief invulpatroon"
|
||||
|
||||
@@ -12316,18 +12368,6 @@ msgstr ""
|
||||
msgid "Auto For Match"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr ""
|
||||
|
||||
@@ -12660,6 +12700,7 @@ msgstr ""
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -12727,75 +12768,6 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr "Gyroide"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr ""
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Maximale lengte van de vullingsbevestiging"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "Versnelling van de topoppervlakte-invulling. Gebruik van een lagere waarde kan de kwaliteit van de bovenlaag verbeteren."
|
||||
@@ -12804,12 +12776,9 @@ msgstr "Versnelling van de topoppervlakte-invulling. Gebruik van een lagere waar
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Versnelling van de buitenwand: een lagere waarde kan de kwaliteit verbeteren."
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² of %"
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Versnelling van de schaarse invulling. Als de waarde wordt uitgedrukt als een percentage (bijvoorbeeld 100%), wordt deze berekend op basis van de standaardversnelling."
|
||||
|
||||
@@ -12820,14 +12789,6 @@ msgstr ""
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "Dit is de afdrukversnelling voor de eerste laag. Een beperkte versnelling kan de hechting van de bouwplaat verbeteren."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "Accel_to_decel inschakelen"
|
||||
|
||||
@@ -12922,6 +12883,17 @@ msgstr ""
|
||||
msgid "layer"
|
||||
msgstr "laag"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr ""
|
||||
|
||||
@@ -13406,6 +13378,69 @@ msgstr ""
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr ""
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Maximale lengte van de vullingsbevestiging"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14241,6 +14276,18 @@ msgstr "Direct Drive"
|
||||
msgid "Bowden"
|
||||
msgstr "Bowden"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Extra lengte bij herstart"
|
||||
|
||||
@@ -14647,6 +14694,9 @@ msgstr "Scheuren kleiner dan 2x de sluitradius van de spleet worden opgevuld tij
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Slicing-modus"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Anders"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "Gebruik „Even-Oneven” voor 3DLabPrint-vliegtuigmodellen. Gebruik „Gaten sluiten” om alle gaten in het model te sluiten."
|
||||
|
||||
@@ -15000,9 +15050,6 @@ msgid ""
|
||||
"This option relies on the firmware supporting the M191 and M141 commands either via macros or natively and is usually used when an active chamber heater is installed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Kamertemperatuur"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15011,6 +15058,17 @@ msgid ""
|
||||
"If enabled, this parameter also sets a G-code variable named chamber_temperature, which can be used to pass the desired chamber temperature to your print start macro, or a heat soak macro like this: PRINT_START (other variables) CHAMBER_TEMP=[chamber_temperature]. This may be useful if your printer does not support M141/M191 commands, or if you desire to handle heat soaking in the print start macro if no active chamber heater is installed."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "Mondstuk temperatuur voor de lagen na de eerste laag"
|
||||
@@ -15056,20 +15114,6 @@ msgstr "Dikte bovenkant"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "Het aantal bovenste solide lagen wordt verhoogd tijdens het slicen als de totale dikte van de bovenste lagen lager is dan deze waarde. Dit zorgt ervoor dat de schaal niet te dun is bij een lage laaghoogte. 0 betekend dat deze instelling niet actief is en dat de dikte van de bovenkant bepaald wordt door het aantal bodem lagen."
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Dit is de snelheid waarmee verplaatsingen zullen worden gedaan."
|
||||
@@ -17595,6 +17639,132 @@ msgstr "Inloggen/Test"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "Verbinding met printers aangesloten via de printhost mislukt."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -17677,6 +17847,19 @@ msgstr ""
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "Kan geen verbinding maken met MKS"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr ""
|
||||
|
||||
@@ -18833,6 +19016,21 @@ msgstr ""
|
||||
"Kromtrekken voorkomen\n"
|
||||
"Wist je dat bij het printen van materialen die gevoelig zijn voor kromtrekken, zoals ABS, een juiste verhoging van de temperatuur van het warmtebed de kans op kromtrekken kan verkleinen?"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Besturing instellingen weergeven"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "Omgekeerde scrollrichting tijdens het zoomen"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "Links: %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "Rechts: %s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "Netwerkplug-in inschakelen"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OrcaSlicer 2.3.0-rc\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: Krzysztof Morga <<tlumaczeniebs@gmail.com>>\n"
|
||||
"Language-Team: \n"
|
||||
@@ -1722,7 +1722,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "Od wersji 2.4.0 OrcaSlicer synchronizuje profile użytkownika za pośrednictwem Orca Cloud zamiast Bambu Cloud.\n\nAby przenieść istniejące profile, zaloguj się do Orca Cloud, a zostaną one przeniesione automatycznie. Aby dowiedzieć się więcej o tym, jak OrcaSlicer przechowuje i synchronizuje Twoje profile, lub aby ręcznie przenieść swoje profile, zajrzyj do naszej wiki.\n\nJeśli nie korzystano z Bambu Cloud do synchronizacji profili, ta zmiana Cię nie dotyczy i możesz zignorować tę wiadomość."
|
||||
msgstr ""
|
||||
"Od wersji 2.4.0 OrcaSlicer synchronizuje profile użytkownika za pośrednictwem Orca Cloud zamiast Bambu Cloud.\n"
|
||||
"\n"
|
||||
"Aby przenieść istniejące profile, zaloguj się do Orca Cloud, a zostaną one przeniesione automatycznie. Aby dowiedzieć się więcej o tym, jak OrcaSlicer przechowuje i synchronizuje Twoje profile, lub aby ręcznie przenieść swoje profile, zajrzyj do naszej wiki.\n"
|
||||
"\n"
|
||||
"Jeśli nie korzystano z Bambu Cloud do synchronizacji profili, ta zmiana Cię nie dotyczy i możesz zignorować tę wiadomość."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4101,6 +4106,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "Obecna temperatura komory jest wyższa niż bezpieczna temperatura dla filamentu, co może prowadzić do jego mięknięcia i zatykania. Maksymalna bezpieczna temperatura dla tego filamentu wynosi %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7884,6 +7893,45 @@ msgstr ""
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "Wybierz katalog pobierania"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "Powiązanie"
|
||||
|
||||
@@ -7939,12 +7987,6 @@ msgstr "Wyświetlanie ekranu powitalnego"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Wyświetla ekran powitalny podczas uruchamiania."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr ""
|
||||
|
||||
@@ -7975,6 +8017,13 @@ msgstr "Zachowanie przy wczytywaniu"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "Określa czy ustawienia drukarki/filamentu/procesu mają być wczytywane podczas otwierania pliku .3mf"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Automatyczne tworzenie kopii zapasowej"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Wykonuje okresowe kopie zapasowe projektu w celu przywracania po sporadycznych awariach."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr ""
|
||||
|
||||
@@ -7993,12 +8042,17 @@ msgstr ""
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr ""
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Automatyczne tworzenie kopii zapasowej"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Wykonuje okresowe kopie zapasowe projektu w celu przywracania po sporadycznych awariach."
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Profil"
|
||||
@@ -8030,6 +8084,12 @@ msgstr "filamenty"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Features"
|
||||
msgstr ""
|
||||
|
||||
@@ -8042,18 +8102,6 @@ msgstr "Umożliwia wysyłanie zadania do wielu urządzeń jednocześnie i zarzą
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "Okno dialogowe do wyboru trybu grupowania filamentów"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr ""
|
||||
|
||||
@@ -8281,19 +8329,6 @@ msgstr "Sprawdzanie aktualizacji do stabilnych wersji"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Automatyczne synchronizowanie profili użytkownika (drukarka/filament/proces)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Automatyczne uaktualnianie wbudowanych profili"
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr ""
|
||||
|
||||
@@ -8306,6 +8341,16 @@ msgstr ""
|
||||
msgid "Color only"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Automatyczne uaktualnianie wbudowanych profili"
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8318,30 +8363,6 @@ msgstr ""
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Skojarzenia plików z OrcaSlicer"
|
||||
|
||||
@@ -8387,7 +8408,16 @@ msgstr ""
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "Pomijanie sprawdzania czarnej listy AMS"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8395,12 +8425,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr ""
|
||||
|
||||
@@ -8427,24 +8451,6 @@ msgstr "debugowanie"
|
||||
msgid "trace"
|
||||
msgstr "śledzenie"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "Debugowanie"
|
||||
|
||||
@@ -8460,25 +8466,6 @@ msgstr "Synchronizacja profili"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Synchronizacja preferencji"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Ustawienia kontrolowania widoku"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "Obróć widok"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "Przesuń widok"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "Przybliż widok"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Inne"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "Kierunek obracania koła myszy odwraca się podczas powiększania"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "Włącz SSL(MQTT)"
|
||||
|
||||
@@ -9189,6 +9176,12 @@ msgstr "Usuń ten profil"
|
||||
msgid "Search in preset"
|
||||
msgstr "Szukaj w profilu"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Proszę kliknąć, aby przywrócić wszystkie ustawienia do ostatnio zapisanego profilu."
|
||||
|
||||
@@ -9480,6 +9473,18 @@ msgstr "Współczynnik przepływu i Wzrost ciśnienia (PA)"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "Temperatura komory druku"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Temperatura komory"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Temperatura druku"
|
||||
|
||||
@@ -9804,12 +9809,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "Lewy: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "Prawy: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "Kliknij, aby przywrócić bieżącą wartość do wartości globalnej."
|
||||
@@ -9829,7 +9844,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "Przenieść lub odrzucić zmiany"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "Stara wartość"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9951,6 +9966,12 @@ msgstr ""
|
||||
msgid "Capabilities"
|
||||
msgstr "Możliwości"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Pokaż wszystkie profile (łącznie z niekompatybilnymi)"
|
||||
|
||||
@@ -12045,6 +12066,23 @@ msgstr "Normalne drukowanie"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "Domyślne przyspieszenie zarówno normalnego druku, jak i przemieszczenia, z wyjątkiem pierwszej warstwy"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Przyspieszenie ruchów podróżnych"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² lub %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Przyspieszenie na mostkach. Jeśli wartość jest wyrażona w procentach (np. 50%), będzie obliczana na podstawie przyspieszenia zewnętrznej ściany."
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Domyślny profil filamentu"
|
||||
|
||||
@@ -12259,6 +12297,12 @@ msgstr "Struny Archimedesa"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "Spirala oktagramu"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Gęstość górnej powierzchni"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Wzór dolnej powierzchni"
|
||||
|
||||
@@ -12266,6 +12310,14 @@ msgstr "Wzór dolnej powierzchni"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "Wzór linii wypełnienia dolnej powierzchni, nie dotyczy wypełnienia mostu"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Gęstość dolnej powierzchni"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "Wzór wewnętrznego pełnego wypełnienia"
|
||||
|
||||
@@ -12558,18 +12610,6 @@ msgstr "Automatyczne płukanie"
|
||||
msgid "Auto For Match"
|
||||
msgstr "Automatyczne dopasowanie"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "Temperatura spłukiwania"
|
||||
|
||||
@@ -12907,6 +12947,7 @@ msgstr "Wypełnienie przy użyciu wielu linii, jeśli jest to obsługiwane przez
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -12974,79 +13015,6 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr "Gyroidalny"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Kąt siatki 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Kąt nachylenia pierwszej linii dla wzorca wypełnienia „siatka 2D” względem osi Z. Zero oznacza pionową."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Kąt siatki 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Kąt nachylenia drugiej linii dla wzorca wypełnienia \"2D siatka\" względem osi Z."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Długość kotwiczenia wypełnienia"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Połączenie wypełnienia z wewnętrznym obrysem poprzez dodawanie krótkich segmentów obrysu. Gdy wartość jest podana w procentach (przykład: 15%), zostanie ona obliczona na podstawie szerokości ścieżki wypełnienia. Slicer stara się łączyć dwie sąsiednie linie wypełnienia za pomocą krótkiego segmentu obrysu. W sytuacji, gdy nie znajdzie segmentu krótszego niż określony parametr, linia wypełnienia zostanie połączona z segmentem obrysu tylko z jednej strony. Długość tego segmentu zostanie ograniczona do wartości określonej w parametrze infill_anchor, ale nie przekroczy tej wartości.\n"
|
||||
"Aby wyłączyć funkcję kotwiczenia, należy ustawić wartość na zero. Ustaw zero, aby wyłączyć kotwiczenie obrysów do pojedynczej linii wypełnienia."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (brak otwartych kotwic)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (nieograniczone)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Maksymalna długość kotwiczenia wypełnienia"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Łączenie wypełnienia z wewnętrznym obrysem przez dodanie krótkiego segmentu obrysu. Jeśli wyrażone w procentach (np. 15%), zostanie obliczone z szerokości ścieżki wypełnienia. Orca Slicer spróbuje połączyć dwie najbliższe linie wypełnienia krótkim segmentem obrysu. Jeśli nie zostanie znaleziony segment krótszy, niż ten parametr, linia wypełnienia zostanie dołączona do segmentu obrysu tylko z jednej strony, a długość segmentu będzie ograniczona do wartości parametru infill_anchor, ale nie dłuższa niż ten parametr.\n"
|
||||
"Jeśli ustawione na 0, zostanie użyty stary algorytm łączenia wypełnienia, powinien dać ten sam wynik co przy ustawieniu 1000 & 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (bez przymocowania)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Przyspieszenie na wewnętrznych ścianach"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Przyspieszenie ruchów podróżnych"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "Przyspieszenie dla wypełnienia górnej powierzchni. Użycie niższej wartości może poprawić jakość górnej powierzchni"
|
||||
@@ -13055,11 +13023,8 @@ msgstr "Przyspieszenie dla wypełnienia górnej powierzchni. Użycie niższej wa
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Przyspieszenie na zewnętrznej ścianie. Użycie niższej wartości może poprawić jakość"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Przyspieszenie na mostkach. Jeśli wartość jest wyrażona w procentach (np. 50%), będzie obliczana na podstawie przyspieszenia zewnętrznej ściany."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² lub %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Przyspieszenie na wewnętrznych ścianach"
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Przyspieszenie na rzadkim wypełnieniu. Jeśli wartość jest wyrażona w procentach (np. 100%), będzie obliczana na podstawie domyślnego przyspieszenia."
|
||||
@@ -13071,14 +13036,6 @@ msgstr "Przyspieszenie wewnętrznego, pełnego wypełnienia. Jeśli wartość je
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "Przyspieszenie dla pierwszej warstwy. Użycie niższej wartości może poprawić przyczepność do stołu"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "Włącz accel_to_decel"
|
||||
|
||||
@@ -13173,6 +13130,17 @@ msgstr "Prędkość wentylatora będzie stopniowo zwiększana liniowo od zera na
|
||||
msgid "layer"
|
||||
msgstr "warstwa"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "Prędkość wentylatora dla warstwy łączącej podpory"
|
||||
|
||||
@@ -13685,6 +13653,73 @@ msgstr "Obszar wykluczony z sondowania pod kątem zalepienia dyszy"
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "Obszar wykluczony z sondowania pod kątem zalepienia dyszy."
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Kąt siatki 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Kąt nachylenia pierwszej linii dla wzorca wypełnienia „siatka 2D” względem osi Z. Zero oznacza pionową."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Kąt siatki 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Kąt nachylenia drugiej linii dla wzorca wypełnienia \"2D siatka\" względem osi Z."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Długość kotwiczenia wypełnienia"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Połączenie wypełnienia z wewnętrznym obrysem poprzez dodawanie krótkich segmentów obrysu. Gdy wartość jest podana w procentach (przykład: 15%), zostanie ona obliczona na podstawie szerokości ścieżki wypełnienia. Slicer stara się łączyć dwie sąsiednie linie wypełnienia za pomocą krótkiego segmentu obrysu. W sytuacji, gdy nie znajdzie segmentu krótszego niż określony parametr, linia wypełnienia zostanie połączona z segmentem obrysu tylko z jednej strony. Długość tego segmentu zostanie ograniczona do wartości określonej w parametrze infill_anchor, ale nie przekroczy tej wartości.\n"
|
||||
"Aby wyłączyć funkcję kotwiczenia, należy ustawić wartość na zero. Ustaw zero, aby wyłączyć kotwiczenie obrysów do pojedynczej linii wypełnienia."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (brak otwartych kotwic)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (nieograniczone)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Maksymalna długość kotwiczenia wypełnienia"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Łączenie wypełnienia z wewnętrznym obrysem przez dodanie krótkiego segmentu obrysu. Jeśli wyrażone w procentach (np. 15%), zostanie obliczone z szerokości ścieżki wypełnienia. Orca Slicer spróbuje połączyć dwie najbliższe linie wypełnienia krótkim segmentem obrysu. Jeśli nie zostanie znaleziony segment krótszy, niż ten parametr, linia wypełnienia zostanie dołączona do segmentu obrysu tylko z jednej strony, a długość segmentu będzie ograniczona do wartości parametru infill_anchor, ale nie dłuższa niż ten parametr.\n"
|
||||
"Jeśli ustawione na 0, zostanie użyty stary algorytm łączenia wypełnienia, powinien dać ten sam wynik co przy ustawieniu 1000 & 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (bez przymocowania)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14555,6 +14590,18 @@ msgstr "Napęd bezpośredni"
|
||||
msgid "Bowden"
|
||||
msgstr "Bowden"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Dodatkowa ilość dla powrotu"
|
||||
|
||||
@@ -14980,6 +15027,9 @@ msgstr "Szpary mniejsze niż dwukrotność wartości parametru „promień zamyk
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Tryb cięcia"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Inne"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "Użyj „Parzysto-nieparzysty” dla modeli samolotów 3DLabPrint. Użyj „Zamknij otwory” do zamknięcia wszystkich otworów w modelu."
|
||||
|
||||
@@ -15337,9 +15387,6 @@ msgstr ""
|
||||
"\n"
|
||||
"Ta opcja opiera się na poleceniach M191 i M141 wspieranych przez oprogramowanie układowe, czy to za pomocą makr, czy natywnie i jest używana, gdy zainstalowany jest aktywna podgrzewacz."
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Temperatura komory"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15353,6 +15400,17 @@ msgstr ""
|
||||
"\n"
|
||||
"Jeśli włączona, ten parametr ustawia także zmienną gcode o nazwie chamber_temperature, która może być użyta do przekazania żądanej temperatury komory do makra rozpoczynającego drukowanie, lub makra utrzymywania ciepła, na przykład: PRINT_START (inne zmienne) CHAMBER_TEMP=[chamber_temperature]. Może to być przydatne, jeśli twoja drukarka nie obsługuje poleceń M141/M191 lub jeśli chcesz zarządzać utrzymywaniem ciepła w makrze rozpoczynającym drukowanie, jeśli nie jest zainstalowany aktywna podgrzewacz komory."
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "Temperatura dyszy dla warstw po początkowej"
|
||||
@@ -15398,20 +15456,6 @@ msgstr "Grubość górnej powłoki"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "Liczba górnych zwartych warstw jest zwiększana podczas cięcia, jeśli grubość obliczona przez górną warstwe powłoki jest cieńsza niż ta wartość. Można w ten sposób uniknąć zbyt cienkiej powłoki, gdy wysokość warstwy jest mała. 0 oznacza, że to ustawienie jest wyłączone, a grubość górnej powłoki jest absolutnie określona przez górne warstwy powłoki"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Gęstość górnej powierzchni"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Gęstość dolnej powierzchni"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Prędkość przemieszczania, która jest szybsza i bez ekstruzji"
|
||||
@@ -18022,6 +18066,132 @@ msgstr "Logowanie/test"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "Połączenie z drukarkami podłączonymi przez hosta drukowania nie powiodło się."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -18104,6 +18274,19 @@ msgstr "Połączenie z MKS działa poprawnie."
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "Nie udało się połączyć z MKS"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "Połączenie z OctoPrint działa poprawnie."
|
||||
|
||||
@@ -19263,6 +19446,30 @@ msgstr ""
|
||||
"Unikaj odkształceń\n"
|
||||
"Czy wiesz, że podczas drukowania filamentami podatnymi na odkształcenia, takimi jak ABS, odpowiednie zwiększenie temperatury podgrzewanej płyty może zmniejszyć prawdopodobieństwo odkształceń?"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Ustawienia kontrolowania widoku"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "Obróć widok"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "Przesuń widok"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "Przybliż widok"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "Kierunek obracania koła myszy odwraca się podczas powiększania"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "Lewy: %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "Prawy: %s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "Włączenie wtyczki sieciowej"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: 2026-06-19 20:49-0300\n"
|
||||
"Last-Translator: Alexandre Folle de Menezes\n"
|
||||
"Language-Team: Portuguese, Brazilian\n"
|
||||
@@ -1701,7 +1701,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "Desde a versão 2.4.0, o OrcaSlicer sincroniza os perfis de usuário através do Orca Cloud em vez do Bambu Cloud.\n\nPara migrar seus perfis existentes, faça login no Orca Cloud e eles serão transferidos automaticamente. Para saber mais sobre como o OrcaSlicer armazena e sincroniza seus perfis, ou para migrar suas predefinições manualmente, consulte nossa wiki.\n\nSe você não usava o Bambu Cloud para sincronizar perfis, esta mudança não afeta você e você pode ignorar esta mensagem com segurança."
|
||||
msgstr ""
|
||||
"Desde a versão 2.4.0, o OrcaSlicer sincroniza os perfis de usuário através do Orca Cloud em vez do Bambu Cloud.\n"
|
||||
"\n"
|
||||
"Para migrar seus perfis existentes, faça login no Orca Cloud e eles serão transferidos automaticamente. Para saber mais sobre como o OrcaSlicer armazena e sincroniza seus perfis, ou para migrar suas predefinições manualmente, consulte nossa wiki.\n"
|
||||
"\n"
|
||||
"Se você não usava o Bambu Cloud para sincronizar perfis, esta mudança não afeta você e você pode ignorar esta mensagem com segurança."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4030,6 +4035,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "A temperatura da câmara atual está mais alta do que a temperatura segura do material, pode resultar em amolecimento e entupimento do material. A temperatura máxima segura para o material é %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
"It has been reset to 0.2"
|
||||
@@ -7804,6 +7813,50 @@ msgstr "Escolha a pasta para itens baixados"
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "Escolha o Diretório de Download"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Mais recente)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Plug-in de rede alterado com sucesso."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Sucesso"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "Falha ao carregar o plug-in de rede. Reinicie o aplicativo."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Você selecionou a versão %s do plug-in de rede.\n"
|
||||
"\n"
|
||||
"Deseja baixar e instalar esta versão agora?\n"
|
||||
"\n"
|
||||
"Observação: o aplicativo pode precisar ser reiniciado após a instalação."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Baixar Plug-in de Rede"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Recarregar o plug-in de rede sem reiniciar a aplicação"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Plug-in de rede recarregado com sucesso."
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Recarregar"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Falha ao recarregar plug-in de rede. Por favor, reinicie a aplicação."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Falha ao Recarregar"
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "Associar"
|
||||
|
||||
@@ -7859,12 +7912,6 @@ msgstr "Mostrar tela de abertura"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Mostrar a tela de abertura durante a inicialização."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "Mostrar notificação de perfis compartilhados"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "Mostrar uma notificação com um link para navegar pelos perfis compartilhados quando a impressora selecionada for alterada."
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr "Usar os botões de janela no lado esquerdo"
|
||||
|
||||
@@ -7895,6 +7942,13 @@ msgstr "Comportamento de carregamento"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "As configurações de impressora/filamento/processo devem ser carregadas ao abrir um arquivo 3MF?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Backup automático"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Faça backup do seu projeto periodicamente para restaurar de falhas ocasionais."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "Máximo de arquivos recentes"
|
||||
|
||||
@@ -7913,12 +7967,20 @@ msgstr "Mostrar opções ao importar arquivo STEP"
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "Se ativo, uma caixa de diálogo de configurações de parâmetros será exibida durante a importação do arquivo STEP."
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Backup automático"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Nível de qualidade para exportação Draco"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Faça backup do seu projeto periodicamente para restaurar de falhas ocasionais."
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Controla a profundidade de bits de quantização usada ao comprimir a malha para o formato Draco.\n"
|
||||
"0 = compressão sem perdas (a geometria é preservada com precisão total). Os valores válidos para compressão com perdas variam de 8 a 30.\n"
|
||||
"Valores mais baixos produzem arquivos menores, mas perdem mais detalhes geométricos; valores mais altos preservam mais detalhes, ao custo de arquivos maiores."
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Predefinição"
|
||||
@@ -7950,6 +8012,12 @@ msgstr "filamentos"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr "Otimiza a altura máxima da area de filamentos para a contagem de filamentos escolhidos."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "Mostrar notificação de perfis compartilhados"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "Mostrar uma notificação com um link para navegar pelos perfis compartilhados quando a impressora selecionada for alterada."
|
||||
|
||||
msgid "Features"
|
||||
msgstr "Recursos"
|
||||
|
||||
@@ -7962,21 +8030,6 @@ msgstr "Com esta opção habilitada, você pode enviar uma tarefa para vários d
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "Abrir seleção do modo de agrupamento de filamento"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Nível de qualidade para exportação Draco"
|
||||
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Controla a profundidade de bits de quantização usada ao comprimir a malha para o formato Draco.\n"
|
||||
"0 = compressão sem perdas (a geometria é preservada com precisão total). Os valores válidos para compressão com perdas variam de 8 a 30.\n"
|
||||
"Valores mais baixos produzem arquivos menores, mas perdem mais detalhes geométricos; valores mais altos preservam mais detalhes, ao custo de arquivos maiores."
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "Comportamento"
|
||||
|
||||
@@ -8218,19 +8271,6 @@ msgstr "Verificar apenas atualizações estáveis"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Sincronização automática de predefinições do usuário (Impressora/Filamento/Processo)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Atualizar automaticamente Predefinições integradas."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Usar um arquivo criptografado para armazenar os tokens"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Armazene os tokens de autenticação em um arquivo criptografado em vez do chaveiro do sistema. (Requer reinicialização)"
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr "Opções de Sincronização de Filamento"
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr "Modo de sincronização de filamento"
|
||||
|
||||
@@ -8243,6 +8283,16 @@ msgstr "Filamento e Cor"
|
||||
msgid "Color only"
|
||||
msgstr "Apenas Cor"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Atualizar automaticamente Predefinições integradas."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Usar um arquivo criptografado para armazenar os tokens"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Armazene os tokens de autenticação em um arquivo criptografado em vez do chaveiro do sistema. (Requer reinicialização)"
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8255,35 +8305,6 @@ msgstr "Versão do plug-in de rede"
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr "Selecione a versão do plug-in de rede a ser usado"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(Mais recente)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Plug-in de rede alterado com sucesso."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Sucesso"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "Falha ao carregar o plug-in de rede. Reinicie o aplicativo."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Você selecionou a versão %s do plug-in de rede.\n"
|
||||
"\n"
|
||||
"Deseja baixar e instalar esta versão agora?\n"
|
||||
"\n"
|
||||
"Observação: o aplicativo pode precisar ser reiniciado após a instalação."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Baixar Plug-in de Rede"
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Associar arquivos ao OrcaSlicer"
|
||||
|
||||
@@ -8329,7 +8350,16 @@ msgstr "Desenvolvedor"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "Pular verificação de lista negra AMS"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8337,12 +8367,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "Permitir Armazenamento Anormal"
|
||||
|
||||
@@ -8371,24 +8395,6 @@ msgstr "depurar"
|
||||
msgid "trace"
|
||||
msgstr "traço"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr "Plug-in de rede"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Recarregar"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Recarregar o plug-in de rede sem reiniciar a aplicação"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Plug-in de rede recarregado com sucesso."
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Falha ao recarregar plug-in de rede. Por favor, reinicie a aplicação."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Falha ao Recarregar"
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "Depuração"
|
||||
|
||||
@@ -8404,25 +8410,6 @@ msgstr "Sincronização de predefinição"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Sincronização de preferências"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Configurações de controle de vista"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "Rotacionar vista"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "Mover vista"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "Aproximar vista"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Outro"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "O botão de roda do mouse inverte ao fazer zoom"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "Ativar SSL(MQTT)"
|
||||
|
||||
@@ -9130,6 +9117,12 @@ msgstr "Excluir esta predefinição"
|
||||
msgid "Search in preset"
|
||||
msgstr "Pesquisar nas predefinições"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Clique para redefinir todas as configurações para a última predefinição salva."
|
||||
|
||||
@@ -9421,6 +9414,18 @@ msgstr "Taxa de fluxo e Avanço de Pressão"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "Temperatura da câmara de impressão"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Temperatura da câmara"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Temperatura de impressão"
|
||||
|
||||
@@ -9750,12 +9755,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr "Não avisar novamente para essa predifinição"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "Esquerda: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "Direita: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "Clique para redefinir o valor atual e anexá-lo ao valor global."
|
||||
@@ -9772,7 +9787,7 @@ msgstr "alterações não salvas"
|
||||
msgid "Transfer or discard changes"
|
||||
msgstr "Transferir ou descartar alterações"
|
||||
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "Valor antigo"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9904,6 +9919,12 @@ msgstr "Número de extrusoras"
|
||||
msgid "Capabilities"
|
||||
msgstr "Capacidades"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Mostrar todas as predefinições (incluindo as incompatíveis)"
|
||||
|
||||
@@ -12024,6 +12045,25 @@ msgstr "Impressão normal"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "A aceleração padrão tanto para a impressão normal quanto para o movimento, exceto na primeira camada."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Aceleração dos movimentos de deslocamento."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "Deslocamento para primeira camada"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"Aceleração de deslocamento para a primeira camada.\n"
|
||||
"O valor percentual é relativo à Aceleração de Deslocamento."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² ou %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Aceleração das pontes. Se o valor for expresso como uma porcentagem (por exemplo, 50%), será calculado com base na aceleração da parede externa."
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Perfil de filamento padrão"
|
||||
|
||||
@@ -12230,6 +12270,12 @@ msgstr "Cordas Arquimedeanas"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "Espiral de Octagrama"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Densidade da superfície superior"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Densidade da camada superior. Um valor de 100% cria uma camada superior totalmente sólida e lisa. Reduzir esse valor resulta em uma superfície superior texturizada, de acordo com o padrão de superfície superior escolhido. Um valor de 0% resultará na criação apenas das paredes da camada superior. Destinado a fins estéticos ou funcionais, não para corrigir problemas como extrusão excessiva."
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Padrão de superfície inferior"
|
||||
|
||||
@@ -12237,6 +12283,16 @@ msgstr "Padrão de superfície inferior"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "Padrão de linha do preenchimento da superfície inferior, não do preenchimento da ponte."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Densidade da superfície inferior"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Densidade da camada inferior. Destina-se a fins estéticos ou funcionais, não para corrigir problemas como extrusão excessiva.\n"
|
||||
"AVISO: Reduzir este valor pode afetar negativamente a aderência à mesa."
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "Padrão de preenchimento sólido interno"
|
||||
|
||||
@@ -12539,18 +12595,6 @@ msgstr "Automático para purga"
|
||||
msgid "Auto For Match"
|
||||
msgstr "Automático para correspondência"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "Habilitar mapa dinâmico de filamento"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "Habilitar mapeamento dinâmico de filamentos durante a impressão."
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "Tem trocador de filamentos"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "A impressora tem um sistema de troca de filamentos (Ex.: AMS)."
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "Temperatura de purga"
|
||||
|
||||
@@ -12892,6 +12936,7 @@ msgstr "Usar múltiplas linhas para o padrão de preenchimento, se suportado pel
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -12959,79 +13004,6 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr "Giroide"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Ângulo 1 de treliça lateral"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "O ângulo do primeiro conjunto de elementos de treliça lateral na direção Z. Zero é vertical."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Ângulo 2 de treliça lateral"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "O ângulo do segundo conjunto de elementos de treliça lateral na direção Z. Zero é vertical."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Ângulo de saliência do preenchimento"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "O ângulo das linhas de preenchimento. 60° resultará em um favo de mel puro."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Comprimento da âncora de preenchimento esparso"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Conecte uma linha de preenchimento a um perímetro interno com um segmento curto de um perímetro adicional. Se expresso como porcentagem (exemplo: 15%), é calculado sobre a largura de extrusão do preenchimento. O OrcaSlicer tenta conectar duas linhas de preenchimento próximas a um segmento curto de perímetro. Se nenhum segmento de perímetro mais curto que infill_anchor_max for encontrado, a linha de preenchimento é conectada a um segmento de perímetro em apenas um lado e o comprimento do segmento de perímetro tomado é limitado a este parâmetro, mas não mais do que anchor_length_max.\n"
|
||||
"Defina este parâmetro como zero para desabilitar os perímetros de ancoragem conectados a uma única linha de preenchimento."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (sem ancoras abertas)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (ilimitado)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Comprimento máximo da âncora de preenchimento"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Conecte uma linha de preenchimento a um perímetro interno com um segmento curto de um perímetro adicional. Se expresso como porcentagem (exemplo: 15%), é calculado sobre a largura de extrusão do preenchimento. O OrcaSlicer tenta conectar duas linhas de preenchimento próximas a um segmento curto de perímetro. Se nenhum segmento de perímetro mais curto que este parâmetro for encontrado, a linha de preenchimento é conectada a um segmento de perímetro em apenas um lado e o comprimento do segmento de perímetro tomado é limitado a infill_anchor, mas não mais do que este parâmetro.\n"
|
||||
"Se definido como 0, o antigo algoritmo de conexão de preenchimento será usado, ele deve criar o mesmo resultado que com 1000 e 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (Conexão simples)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Aceleração das paredes internas."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Aceleração dos movimentos de deslocamento."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "Aceleração do preenchimento da superfície superior. Usar um valor menor pode melhorar a qualidade da superfície superior."
|
||||
@@ -13040,11 +13012,8 @@ msgstr "Aceleração do preenchimento da superfície superior. Usar um valor men
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Aceleração da parede externa. Usar um valor menor pode melhorar a qualidade."
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Aceleração das pontes. Se o valor for expresso como uma porcentagem (por exemplo, 50%), será calculado com base na aceleração da parede externa."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² ou %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Aceleração das paredes internas."
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Aceleração do preenchimento esparso. Se o valor for expresso como uma porcentagem (por exemplo, 100%), será calculado com base na aceleração padrão."
|
||||
@@ -13056,16 +13025,6 @@ msgstr "Aceleração do preenchimento sólido interno. Se o valor for expresso c
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "Aceleração da primeira camada. Usar um valor menor pode melhorar a adesão à placa de impressão."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "Deslocamento para primeira camada"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"Aceleração de deslocamento para a primeira camada.\n"
|
||||
"O valor percentual é relativo à Aceleração de Deslocamento."
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "Habilitar accel_to_decel"
|
||||
|
||||
@@ -13159,6 +13118,17 @@ msgstr "A velocidade do ventilador aumentará linearmente de zero na camada \"cl
|
||||
msgid "layer"
|
||||
msgstr "camada"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "Velocidade do ventilador para interface de suporte"
|
||||
|
||||
@@ -13698,6 +13668,73 @@ msgstr "Sondagem exclui área de aglomeração"
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "Sondagem exclui área de aglomeração."
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Ângulo 1 de treliça lateral"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "O ângulo do primeiro conjunto de elementos de treliça lateral na direção Z. Zero é vertical."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Ângulo 2 de treliça lateral"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "O ângulo do segundo conjunto de elementos de treliça lateral na direção Z. Zero é vertical."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Ângulo de saliência do preenchimento"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "O ângulo das linhas de preenchimento. 60° resultará em um favo de mel puro."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Comprimento da âncora de preenchimento esparso"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Conecte uma linha de preenchimento a um perímetro interno com um segmento curto de um perímetro adicional. Se expresso como porcentagem (exemplo: 15%), é calculado sobre a largura de extrusão do preenchimento. O OrcaSlicer tenta conectar duas linhas de preenchimento próximas a um segmento curto de perímetro. Se nenhum segmento de perímetro mais curto que infill_anchor_max for encontrado, a linha de preenchimento é conectada a um segmento de perímetro em apenas um lado e o comprimento do segmento de perímetro tomado é limitado a este parâmetro, mas não mais do que anchor_length_max.\n"
|
||||
"Defina este parâmetro como zero para desabilitar os perímetros de ancoragem conectados a uma única linha de preenchimento."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (sem ancoras abertas)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (ilimitado)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Comprimento máximo da âncora de preenchimento"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Conecte uma linha de preenchimento a um perímetro interno com um segmento curto de um perímetro adicional. Se expresso como porcentagem (exemplo: 15%), é calculado sobre a largura de extrusão do preenchimento. O OrcaSlicer tenta conectar duas linhas de preenchimento próximas a um segmento curto de perímetro. Se nenhum segmento de perímetro mais curto que este parâmetro for encontrado, a linha de preenchimento é conectada a um segmento de perímetro em apenas um lado e o comprimento do segmento de perímetro tomado é limitado a infill_anchor, mas não mais do que este parâmetro.\n"
|
||||
"Se definido como 0, o antigo algoritmo de conexão de preenchimento será usado, ele deve criar o mesmo resultado que com 1000 e 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (Conexão simples)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14595,6 +14632,18 @@ msgstr "Acionamento Direto"
|
||||
msgid "Bowden"
|
||||
msgstr "Tubo"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "Habilitar mapa dinâmico de filamento"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "Habilitar mapeamento dinâmico de filamentos durante a impressão."
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "Tem trocador de filamentos"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "A impressora tem um sistema de troca de filamentos (Ex.: AMS)."
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Comprimento extra na retração"
|
||||
|
||||
@@ -15024,6 +15073,9 @@ msgstr "Frestas menores que 2x o vão de fatiamento serão preenchidas durante o
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Modo de Fatiamento"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Outro"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "Use \"Par-impar\" para modelos de avião 3DLabPrint. Use \"Fechar buracos\" para fechar todos os buracos no modelo."
|
||||
|
||||
@@ -15390,9 +15442,6 @@ msgstr ""
|
||||
"\n"
|
||||
"Esta opção depende do firmware que suporta os comandos M191 e M141 por meio de macros ou nativamente e geralmente é usada quando um aquecedor de câmara ativo está instalado."
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Temperatura da câmara"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15406,6 +15455,17 @@ msgstr ""
|
||||
"\n"
|
||||
"Se habilitado, este parâmetro também define uma variável G-code chamada chamber_temperature, que pode ser usada para passar a temperatura desejada da câmara para sua macro de início de impressão ou uma macro de absorção de calor como esta: PRINT_START (outras variáveis) CHAMBER_TEMP=[chamber_temperature]. Isso pode ser útil se sua impressora não suportar comandos M141/M191 ou se você desejar lidar com a absorção de calor na macro de início de impressão se nenhum aquecedor de câmara ativo estiver instalado."
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "Temperatura do bico depois da primeira camada"
|
||||
|
||||
@@ -15448,22 +15508,6 @@ msgstr "Espessura da casca do topo"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "O número de camadas sólidas superiores é aumentado ao fatiar se a espessura calculada pelas camadas da casca do topo for menor do que este valor. Isso pode evitar que a casca seja muito fina quando a altura da camada é pequena. 0 significa que esta configuração está desativada e a espessura da casca do topo é determinada exclusivamente pelas camadas da casca do topo."
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Densidade da superfície superior"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Densidade da camada superior. Um valor de 100% cria uma camada superior totalmente sólida e lisa. Reduzir esse valor resulta em uma superfície superior texturizada, de acordo com o padrão de superfície superior escolhido. Um valor de 0% resultará na criação apenas das paredes da camada superior. Destinado a fins estéticos ou funcionais, não para corrigir problemas como extrusão excessiva."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Densidade da superfície inferior"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Densidade da camada inferior. Destina-se a fins estéticos ou funcionais, não para corrigir problemas como extrusão excessiva.\n"
|
||||
"AVISO: Reduzir este valor pode afetar negativamente a aderência à mesa."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Velocidade de deslocamento mais rápida e sem extrusão."
|
||||
@@ -18103,6 +18147,132 @@ msgstr "Login/Teste"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "A conexão às impressoras conectadas através do host de impressão falhou."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -18185,6 +18355,19 @@ msgstr "A conexão com o MKS funciona corretamente."
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "Não foi possível conectar ao MKS"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "A conexão com o OctoPrint funciona corretamente."
|
||||
|
||||
@@ -19332,6 +19515,36 @@ msgstr ""
|
||||
"Evitar empenamento\n"
|
||||
"Você sabia que ao imprimir materiais propensos ao empenamento como ABS, aumentar adequadamente a temperatura da mesa aquecida pode reduzir a probabilidade de empenamento?"
|
||||
|
||||
#~ msgid "Filament Sync Options"
|
||||
#~ msgstr "Opções de Sincronização de Filamento"
|
||||
|
||||
#~ msgid "Network plug-in"
|
||||
#~ msgstr "Plug-in de rede"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Configurações de controle de vista"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "Rotacionar vista"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "Mover vista"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "Aproximar vista"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "O botão de roda do mouse inverte ao fazer zoom"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "Esquerda: %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "Direita: %s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "Ativar plug-in de rede"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OrcaSlicer V2.5.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: 2026-02-25 13:38+0300\n"
|
||||
"Last-Translator: Felix14_v2\n"
|
||||
"Language-Team: Felix14_v2 (ДС/ТГ: @felix14_v2, почта: aleks111001@list.ru), Andylg <andylg@yandex.ru>\n"
|
||||
@@ -1753,7 +1753,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "Начиная с версии 2.4.0, OrcaSlicer синхронизирует пользовательские профили через Orca Cloud вместо Bambu Cloud.\n\nЧтобы перенести существующие профили, войдите в Orca Cloud, и они будут перенесены автоматически. Чтобы узнать больше о том, как OrcaSlicer хранит и синхронизирует ваши профили, или перенести профили вручную, посетите нашу вики.\n\nЕсли вы не использовали Bambu Cloud для синхронизации профилей, это изменение вас не затрагивает, и вы можете спокойно проигнорировать это сообщение."
|
||||
msgstr ""
|
||||
"Начиная с версии 2.4.0, OrcaSlicer синхронизирует пользовательские профили через Orca Cloud вместо Bambu Cloud.\n"
|
||||
"\n"
|
||||
"Чтобы перенести существующие профили, войдите в Orca Cloud, и они будут перенесены автоматически. Чтобы узнать больше о том, как OrcaSlicer хранит и синхронизирует ваши профили, или перенести профили вручную, посетите нашу вики.\n"
|
||||
"\n"
|
||||
"Если вы не использовали Bambu Cloud для синхронизации профилей, это изменение вас не затрагивает, и вы можете спокойно проигнорировать это сообщение."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4100,6 +4105,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "Текущая температура внутри термокамеры превышает безопасную температуру для этого материала, что может привести к размягчению материала или засорению экструдера. Безопасная температура текущего материала составляет %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
"It has been reset to 0.2"
|
||||
@@ -5356,22 +5365,34 @@ msgstr "%d"
|
||||
# Подставляется номер материала (по порядку), предыдущая
|
||||
#, c-format, boost-format
|
||||
msgid "Filament %s is placed in the %s, but the generated G-code path exceeds the printable range of the %s."
|
||||
msgstr "Материал %s назначен на %s экструдер, но итоговый G-код выходит за его предел высоты печати.\n\n%s экструдер:"
|
||||
msgstr ""
|
||||
"Материал %s назначен на %s экструдер, но итоговый G-код выходит за его предел высоты печати.\n"
|
||||
"\n"
|
||||
"%s экструдер:"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Filaments %s are placed in the %s, but the generated G-code path exceeds the printable range of the %s."
|
||||
msgstr "Материалы %s назначены на %s экструдер, но итоговый G-код выходит за его предел высоты печати.\n\n%s экструдер:"
|
||||
msgstr ""
|
||||
"Материалы %s назначены на %s экструдер, но итоговый G-код выходит за его предел высоты печати.\n"
|
||||
"\n"
|
||||
"%s экструдер:"
|
||||
|
||||
# Возможно, какая-то специфичная проверка для тулченджеров, на профиле H2D при
|
||||
# превышении высоты через подъём при откате оно не выводится. Последнее
|
||||
# предложение – костыль для обхода кривизны системы локализации.
|
||||
#, c-format, boost-format
|
||||
msgid "Filament %s is placed in the %s, but the generated G-code path exceeds the printable height of the %s."
|
||||
msgstr "Материал %s назначен на %s экструдер, но итоговый G-код выходит за его предел высоты печати.\n\n%s экструдер:"
|
||||
msgstr ""
|
||||
"Материал %s назначен на %s экструдер, но итоговый G-код выходит за его предел высоты печати.\n"
|
||||
"\n"
|
||||
"%s экструдер:"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Filaments %s are placed in the %s, but the generated G-code path exceeds the printable height of the %s."
|
||||
msgstr "Материалы %s назначены на %s экструдер, но итоговый G-код выходит за его предел высоты печати.\n\n%s экструдер:"
|
||||
msgstr ""
|
||||
"Материалы %s назначены на %s экструдер, но итоговый G-код выходит за его предел высоты печати.\n"
|
||||
"\n"
|
||||
"%s экструдер:"
|
||||
|
||||
msgid "Open wiki for more information."
|
||||
msgstr "Подробнее на Вики."
|
||||
@@ -7944,6 +7965,48 @@ msgstr "Укажите расположение загружаемых файл
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "Выбор папки загрузки"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(новейшая)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Сетевой плагин успешно переключён."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Успех"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "Для загрузки сетевого плагина требуется перезапуск приложения."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Выбрана следующая версия плагина: %s.\n"
|
||||
"\n"
|
||||
"Загрузить и установить её? Возможно, потребуется перезагрузка приложения."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Загрузить сетевой плагин"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Перезагрузить плагин без перезапуска приложения."
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Плагин успешно перезагружен."
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Перезагрузить"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Не удалось перезагрузить сетевой плагин. Требуется перезапуск приложения."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Перезапуск не удался"
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "Ассоциация"
|
||||
|
||||
@@ -7998,12 +8061,6 @@ msgstr "Показывать заставку при запуске"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Показывать окно приветствия при запуске программы."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr ""
|
||||
|
||||
@@ -8034,6 +8091,12 @@ msgstr "При загрузке файла 3MF открывать ..."
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "Следует ли при открытии 3MF проекта загружать настройки принтера, печати и материала?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Сохранение резервной копии"
|
||||
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Периодическое создание резервной копии проекта для восстановления в случае непредвиденного сбоя программы."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "Ограничение последних файлов"
|
||||
|
||||
@@ -8054,11 +8117,20 @@ msgstr "Показывать настройки импорта STEP"
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "Если включено, во время импорта STEP файла появится диалоговое окно настроек параметров импорта."
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Сохранение резервной копии"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Качество при экспорте в DRC"
|
||||
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Периодическое создание резервной копии проекта для восстановления в случае непредвиденного сбоя программы."
|
||||
msgid "bits"
|
||||
msgstr "бит"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Настройка глубины квантования при сжатии полигональной сетки в формат Draco.\n"
|
||||
"Чем меньше глубина, тем ниже качество и размер файла. Допустимый диапазон – от 8 до 30.\n"
|
||||
"0 – сжатие без потерь (представление с максимальной точностью)."
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Профиль"
|
||||
@@ -8090,6 +8162,12 @@ msgstr "материалов"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr "Ограничить высоту секции с материалами проекта. При превышении лимита будет отображаться полоса прокрутки."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Features"
|
||||
msgstr "Возможности"
|
||||
|
||||
@@ -8103,21 +8181,6 @@ msgstr "Если включено, вы сможете управлять нес
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "Всплывающее окно для выбора режима группировки филаментов"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Качество при экспорте в DRC"
|
||||
|
||||
msgid "bits"
|
||||
msgstr "бит"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Настройка глубины квантования при сжатии полигональной сетки в формат Draco.\n"
|
||||
"Чем меньше глубина, тем ниже качество и размер файла. Допустимый диапазон – от 8 до 30.\n"
|
||||
"0 – сжатие без потерь (представление с максимальной точностью)."
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "Автоматизация"
|
||||
|
||||
@@ -8352,18 +8415,6 @@ msgstr "Уведомлять только о стабильных версиях
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Синхронизация пользовательских профилей (принтера/материала/настроек)"
|
||||
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Автоматически обновлять системные профили"
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Хранить токены в зашифрованном файле"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Сохранять токены аутентификации в зашифрованном файле вместо использования системной связки ключей (требуется перезапуск)."
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr "Настройки синхронизации"
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr "Режим синхронизации"
|
||||
|
||||
@@ -8376,6 +8427,15 @@ msgstr "Цвет и материал"
|
||||
msgid "Color only"
|
||||
msgstr "Цвет"
|
||||
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Автоматически обновлять системные профили"
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Хранить токены в зашифрованном файле"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Сохранять токены аутентификации в зашифрованном файле вместо использования системной связки ключей (требуется перезапуск)."
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8388,33 +8448,6 @@ msgstr "Версия сетевого плагина"
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr "Выберите версию сетевого плагина для загрузки"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(новейшая)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Сетевой плагин успешно переключён."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Успех"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "Для загрузки сетевого плагина требуется перезапуск приложения."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Выбрана следующая версия плагина: %s.\n"
|
||||
"\n"
|
||||
"Загрузить и установить её? Возможно, потребуется перезагрузка приложения."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Загрузить сетевой плагин"
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Открытие файлов по умолчанию"
|
||||
|
||||
@@ -8457,7 +8490,16 @@ msgstr "Разработка"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "Пропуск проверки материалов в AMS из файла чёрного списка"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8465,12 +8507,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "Игнорировать неисправность хранилища"
|
||||
|
||||
@@ -8499,24 +8535,6 @@ msgstr "отладка"
|
||||
msgid "trace"
|
||||
msgstr "трассировка"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr "Сетевой плагин"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Перезагрузить"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Перезагрузить плагин без перезапуска приложения."
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Плагин успешно перезагружен."
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Не удалось перезагрузить сетевой плагин. Требуется перезапуск приложения."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Перезапуск не удался"
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "Отладка"
|
||||
|
||||
@@ -8532,24 +8550,6 @@ msgstr "Синхронизация профилей"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Синхронизация настроек"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Просмотр настроек управления"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "Вращение камеры"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "Перемещение камеры"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "Масштабирование вида"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Прочее"
|
||||
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "Инвертировать масштабирование с помощью колеса мыши"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "Включить SSL(MQTT)"
|
||||
|
||||
@@ -9257,6 +9257,12 @@ msgstr "Удалить этот профиль"
|
||||
msgid "Search in preset"
|
||||
msgstr "Поиск в профиле"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Сбросить все изменения"
|
||||
|
||||
@@ -9557,6 +9563,18 @@ msgstr "Поток и коррекция давления (PA)"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "Температура в термокамере при печати"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Температура термокамеры"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Температура печати"
|
||||
|
||||
@@ -9903,12 +9921,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "Левый: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "Правый: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "Сбросить значение до сохранённого"
|
||||
@@ -9925,7 +9953,7 @@ msgstr "несохранённые изменения"
|
||||
msgid "Transfer or discard changes"
|
||||
msgstr "Выбор действия при изменённых параметрах профиля"
|
||||
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "Старое значение"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -10046,6 +10074,12 @@ msgstr "Количество экструдеров"
|
||||
msgid "Capabilities"
|
||||
msgstr "Характеристики принтера"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Показать все профили (включая несовместимые)"
|
||||
|
||||
@@ -12151,6 +12185,23 @@ msgstr "По умолчанию"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "Ускорение по умолчанию для обычной печати и перемещений (кроме первого слоя)."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Ускорение холостого перемещения."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "мм/с² или %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Ускорение на мостах. Можно указать процент от ускорения внешних периметров."
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Профиль материала по умолчанию"
|
||||
|
||||
@@ -12378,6 +12429,14 @@ msgstr "Спираль Архимеда"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "Спиральная октаграмма"
|
||||
|
||||
# ??? Плотность верхней оболочки
|
||||
msgid "Top surface density"
|
||||
msgstr "Плотность верхней поверхности"
|
||||
|
||||
# ??? Плотность верхней поверхности. При 100% создаётся сплошной верхний слой.
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Плотность верхней поверхности. Если установить 100%, поверхность будет сплошной и гладкой. Уменьшение этого параметра создаст текстурированную поверхность в соответствии с выбранным шаблоном заполнения верхней поверхности. При значении 0% останутся только стенки верхнего слоя. Эта функция предназначена для улучшения внешнего вида или функциональности объекта, но не для решения проблем, таких как чрезмерная экструзия."
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Шаблон заполнения нижней поверхности"
|
||||
|
||||
@@ -12399,6 +12458,16 @@ msgstr ""
|
||||
" не создаёт горизонтального шва.\n"
|
||||
"🞄 Спиральная октаграмма: декоративный шаблон."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Плотность нижней поверхности"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Плотность нижней поверхности. Эта функция предназначена для улучшения внешнего вида или функциональности объекта, а не для решения проблем, таких как чрезмерная экструзия.\n"
|
||||
"Внимание: уменьшение этого значения может негативно повлиять на адгезию к печатной платформе."
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "Шаблон сплошного заполнения"
|
||||
|
||||
@@ -12737,18 +12806,6 @@ msgstr "Авто для промывки"
|
||||
msgid "Auto For Match"
|
||||
msgstr "Авто для сопоставления"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "Температура прочистки"
|
||||
|
||||
@@ -13100,6 +13157,7 @@ msgstr ""
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -13209,91 +13267,14 @@ msgstr "ТПМП Фишера-Коха S"
|
||||
msgid "Gyroid"
|
||||
msgstr "Гироид"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Наклон боковой сетки 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Угол наклона первой линии для шаблона заполнения «Боковая решётка» относительно вертикальной оси Z (0 - вертикально)."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Наклон боковой сетки 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Угол наклона второй линии для шаблона заполнения «Боковая решётка» относительно вертикальной оси Z (0 - вертикально)."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Угол нависания заполнения"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "Угол нависания линий заполнения. При 60° получаются правильные соты."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Длина привязок шаблона заполнения"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Максимальная длина одиночных привязок. Можно указать процент от ширины линии заполнения. 0 – отключить привязки.\n"
|
||||
"\n"
|
||||
"Внимание: фактическая длина может быть ограничена пределом стыковки линий.\n"
|
||||
"\n"
|
||||
"Примечание: привязка – продолжение линии заполнения, которое печатается вдоль внутреннего периметра для улучшения сцепления с ним."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (без привязок)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (не ограничено)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Предел стыковки линий шаблона"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr "Максимальная длина стыковки отдельных линий шаблона заполнения в одну непрерывную. Можно указать процент от ширины линии заполнения. 0 – отключить стыковку."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (без стыковки)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Ускорение на внутренних периметрах."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Ускорение холостого перемещения."
|
||||
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "Ускорение на верхней поверхности. Использование меньшего значения может улучшить качество верхней поверхности."
|
||||
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Ускорение на внешнем периметре. Использование меньшего значения может улучшить качество."
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Ускорение на мостах. Можно указать процент от ускорения внешних периметров."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "мм/с² или %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Ускорение на внутренних периметрах."
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Ускорение на разреженном заполнении. Можно указать процент от ускорения по умолчанию."
|
||||
@@ -13304,14 +13285,6 @@ msgstr "Ускорение на сплошном заполнении. Можн
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "Ускорение на первом слое. Использование меньшего значения может улучшить адгезию к столу."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "Заменять \"max_accel_to_decel\""
|
||||
|
||||
@@ -13408,6 +13381,17 @@ msgstr ""
|
||||
msgid "layer"
|
||||
msgstr "слой"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "Обдув связующего слоя"
|
||||
|
||||
@@ -13966,6 +13950,74 @@ msgstr "Исключаемая область зондирования комк
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "Исключаемая область зондирования комкования."
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Наклон боковой сетки 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Угол наклона первой линии для шаблона заполнения «Боковая решётка» относительно вертикальной оси Z (0 - вертикально)."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Наклон боковой сетки 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Угол наклона второй линии для шаблона заполнения «Боковая решётка» относительно вертикальной оси Z (0 - вертикально)."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Угол нависания заполнения"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "Угол нависания линий заполнения. При 60° получаются правильные соты."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Длина привязок шаблона заполнения"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Максимальная длина одиночных привязок. Можно указать процент от ширины линии заполнения. 0 – отключить привязки.\n"
|
||||
"\n"
|
||||
"Внимание: фактическая длина может быть ограничена пределом стыковки линий.\n"
|
||||
"\n"
|
||||
"Примечание: привязка – продолжение линии заполнения, которое печатается вдоль внутреннего периметра для улучшения сцепления с ним."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (без привязок)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (не ограничено)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Предел стыковки линий шаблона"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr "Максимальная длина стыковки отдельных линий шаблона заполнения в одну непрерывную. Можно указать процент от ширины линии заполнения. 0 – отключить стыковку."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (без стыковки)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14724,7 +14776,10 @@ msgstr "Параметр устанавливает высоту подложк
|
||||
|
||||
# Расширение контекста от Andy. Хотя тут мы имеем дело с очередной логической ошибкой в исходнике: разрешение повышает нагрузку при увеличении, а здесь увеличение значения, наоборот, ведёт к её уменьшению вместе со снижением качества. То есть, это именно "допуск", "Допустимое отклонение", "Gcode tolerance". Не уверен, стоит ли ломать то, что работает – народ уже давно запомнил эту настройку именно как "разрешение". Хороший компромисс – оставить название, но убрать путающее "разрешение" из описания. + перефразировал и изменил порядок изложения информации, чтобы обеспечить линейные логические связи.
|
||||
msgid "The G-code path is generated after simplifying the contour of models to avoid too many points and G-code lines. Smaller values mean higher resolution and more time required to slice."
|
||||
msgstr "Максимальное отклонение планируемой траектории движения экструдера от среза модели. Повышение отклонения снижает время нарезки и нагрузку на электронику принтера, а понижение – позволяет устранить артефакты упрощения геометрии модели.\n\nВнимание: для нарезки и визуализации G-кода с очень низким отклонением требуется большой объём оперативной памяти, а высокая плотность команд может привести к перегрузке электроники принтера."
|
||||
msgstr ""
|
||||
"Максимальное отклонение планируемой траектории движения экструдера от среза модели. Повышение отклонения снижает время нарезки и нагрузку на электронику принтера, а понижение – позволяет устранить артефакты упрощения геометрии модели.\n"
|
||||
"\n"
|
||||
"Внимание: для нарезки и визуализации G-кода с очень низким отклонением требуется большой объём оперативной памяти, а высокая плотность команд может привести к перегрузке электроники принтера."
|
||||
|
||||
msgid "Travel distance threshold"
|
||||
msgstr "Порог перемещения"
|
||||
@@ -14866,6 +14921,18 @@ msgstr "Прямой (Direct)"
|
||||
msgid "Bowden"
|
||||
msgstr "Внешний (Bowden)"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Доп. подача после отката"
|
||||
|
||||
@@ -15142,7 +15209,10 @@ msgstr "Тип юбки"
|
||||
|
||||
# Про расширенное описание см. в комментарии к перевод подсказки настройки "Skirt minimum extrusion length"
|
||||
msgid "Combined - single skirt for all objects, Per object - individual object skirt."
|
||||
msgstr "Выбор типа печатаемой юбки – одна общая для всех моделей или отдельные юбки для каждой модели.\n\nВнимание: при создании индивидуальных юбок проверка пересечения не совершается, из-за чего при близком расположении моделей они могут накладываться друг на друга. В таких случаях рекомендуется понизить количество контуров."
|
||||
msgstr ""
|
||||
"Выбор типа печатаемой юбки – одна общая для всех моделей или отдельные юбки для каждой модели.\n"
|
||||
"\n"
|
||||
"Внимание: при создании индивидуальных юбок проверка пересечения не совершается, из-за чего при близком расположении моделей они могут накладываться друг на друга. В таких случаях рекомендуется понизить количество контуров."
|
||||
|
||||
# Отдельный (антоним к "совместный")
|
||||
msgid "Per object"
|
||||
@@ -15171,7 +15241,9 @@ msgid ""
|
||||
"Using a non-zero value is useful if the printer is set up to print without a prime line.\n"
|
||||
"Final number of loops is not taking into account while arranging or validating objects distance. Increase loop number in such case."
|
||||
msgstr ""
|
||||
"Минимальная длина прутка для прочистки на юбке (в миллиметрах). Позволяет автоматически расчитывать количество контуров юбки для её использования в качестве альтернативы линии прочистки.\n\n0 – отключить автоматический расчёт."
|
||||
"Минимальная длина прутка для прочистки на юбке (в миллиметрах). Позволяет автоматически расчитывать количество контуров юбки для её использования в качестве альтернативы линии прочистки.\n"
|
||||
"\n"
|
||||
"0 – отключить автоматический расчёт."
|
||||
|
||||
msgid "The printing speed in exported G-code will be slowed down when the estimated layer time is shorter than this value in order to get better cooling for these layers."
|
||||
msgstr "Скорость печати в экспортированном G-коде будет замедлена, если расчётное время печати слоя меньше заданного здесь значения, для обеспечения лучшего охлаждения этих слоёв."
|
||||
@@ -15344,6 +15416,9 @@ msgstr "Часто в импортируемых в программу моде
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Режим нарезки"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Прочее"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr ""
|
||||
"Режим нарезки «Чётный-нечётный» применяется для моделей с намеренно нарушенной целостностью. Например, для моделей самолётов с ресурса 3DLabPrint.\n"
|
||||
@@ -15747,9 +15822,6 @@ msgstr ""
|
||||
"\n"
|
||||
"Эта опция зависит от поддержки прошивкой команд M191 и M141, либо через макросы, либо нативно, и обычно используется, когда имеется активный нагреватель камеры."
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Температура термокамеры"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15765,6 +15837,17 @@ msgstr ""
|
||||
"PRINT_START <...> CHAMBER_TEMP=[chamber_temperature].\n"
|
||||
"Это особенно полезно, если принтер не поддерживает команды M141/M191, или если управление температурой термокамеры реализовано через макросы (например, при отсутствии активного нагревателя камеры)."
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "Температура при печати последующих слоёв."
|
||||
|
||||
@@ -15807,24 +15890,6 @@ msgstr "Толщина оболочки сверху"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "Минимальная толщина оболочки сверху в мм. Если толщина оболочки, рассчитанная по количеству сплошных слоёв сверху, меньше этого значения, количество сплошных слоёв сверху будет автоматически увеличено при нарезке, для удовлетворения минимальной толщины оболочки. Это позволяет избежать слишком тонкой оболочки при небольшой высоте слоя. 0 означает, что этот параметр отключён, а толщина оболочки сверху задаётся количеством сплошных слоёв сверху."
|
||||
|
||||
# ??? Плотность верхней оболочки
|
||||
msgid "Top surface density"
|
||||
msgstr "Плотность верхней поверхности"
|
||||
|
||||
# ??? Плотность верхней поверхности. При 100% создаётся сплошной верхний слой.
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Плотность верхней поверхности. Если установить 100%, поверхность будет сплошной и гладкой. Уменьшение этого параметра создаст текстурированную поверхность в соответствии с выбранным шаблоном заполнения верхней поверхности. При значении 0% останутся только стенки верхнего слоя. Эта функция предназначена для улучшения внешнего вида или функциональности объекта, но не для решения проблем, таких как чрезмерная экструзия."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Плотность нижней поверхности"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Плотность нижней поверхности. Эта функция предназначена для улучшения внешнего вида или функциональности объекта, а не для решения проблем, таких как чрезмерная экструзия.\n"
|
||||
"Внимание: уменьшение этого значения может негативно повлиять на адгезию к печатной платформе."
|
||||
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Ограничение скорости холостых перемещений печатающей головы."
|
||||
|
||||
@@ -16013,7 +16078,10 @@ msgid "Infill gap."
|
||||
msgstr "Управление отступом между линиями сброса материала."
|
||||
|
||||
msgid "Purging after filament change will be done inside objects' infills. This may lower the amount of waste and decrease the print time. If the walls are printed with transparent filament, the mixed color infill will be visible. It will not take effect unless the prime tower is enabled."
|
||||
msgstr "Прочистка сопла после смены материала будет производиться в заполнение модели. Это снижает количество отходов и сокращает время печати. Требуется включить черновую башню.\n\nПримечание: не рекомендуется при печати стенок прозрачным материалом."
|
||||
msgstr ""
|
||||
"Прочистка сопла после смены материала будет производиться в заполнение модели. Это снижает количество отходов и сокращает время печати. Требуется включить черновую башню.\n"
|
||||
"\n"
|
||||
"Примечание: не рекомендуется при печати стенок прозрачным материалом."
|
||||
|
||||
msgid "Purging after filament change will be done inside objects' support. This may lower the amount of waste and decrease the print time. It will not take effect unless a prime tower is enabled."
|
||||
msgstr "Прочистка сопла после смены материала будет производиться в поддержку модели. Это снижает количество отходов и сокращает время печати. Требуется включить черновую башню."
|
||||
@@ -18546,6 +18614,132 @@ msgstr "Вход/Тест"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "Не удалось подключиться к принтерам, подключенным через хост печати."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -18628,6 +18822,19 @@ msgstr "Подключение к MKS успешно установлено."
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "Не удалось подключиться к MKS"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "Подключение к OctoPrint успешно установлено."
|
||||
|
||||
@@ -19795,6 +20002,35 @@ msgstr ""
|
||||
"Предотвращение коробления материала\n"
|
||||
"Знаете ли вы, что при печати материалами, склонными к короблению, таких как ABS, повышение температуры подогреваемого стола может снизить эту вероятность?"
|
||||
|
||||
#~ msgid "Filament Sync Options"
|
||||
#~ msgstr "Настройки синхронизации"
|
||||
|
||||
#~ msgid "Network plug-in"
|
||||
#~ msgstr "Сетевой плагин"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Просмотр настроек управления"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "Вращение камеры"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "Перемещение камеры"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "Масштабирование вида"
|
||||
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "Инвертировать масштабирование с помощью колеса мыши"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "Левый: %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "Правый: %s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "Включить сетевой плагин"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"Language: sv\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1693,7 +1693,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "Från och med version 2.4.0 synkroniserar OrcaSlicer användarprofiler via Orca Cloud i stället för Bambu Cloud.\n\nLogga in på Orca Cloud för att migrera dina befintliga profiler, så överförs de automatiskt. Läs mer om hur OrcaSlicer lagrar och synkroniserar dina profiler, eller om hur du migrerar dina förinställningar manuellt, i vår wiki.\n\nOm du inte använde Bambu Cloud för att synkronisera profiler påverkar den här ändringen dig inte och du kan ignorera det här meddelandet."
|
||||
msgstr ""
|
||||
"Från och med version 2.4.0 synkroniserar OrcaSlicer användarprofiler via Orca Cloud i stället för Bambu Cloud.\n"
|
||||
"\n"
|
||||
"Logga in på Orca Cloud för att migrera dina befintliga profiler, så överförs de automatiskt. Läs mer om hur OrcaSlicer lagrar och synkroniserar dina profiler, eller om hur du migrerar dina förinställningar manuellt, i vår wiki.\n"
|
||||
"\n"
|
||||
"Om du inte använde Bambu Cloud för att synkronisera profiler påverkar den här ändringen dig inte och du kan ignorera det här meddelandet."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4043,6 +4048,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "Current chamber temperature is higher than the material's safe temperature, this may result in material softening and clogging. The maximum safe temperature for the material is %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7780,6 +7789,45 @@ msgstr ""
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "Välj Nedladdnings Register"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Lyckades"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Ladda om"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate"
|
||||
msgstr ""
|
||||
|
||||
@@ -7835,12 +7883,6 @@ msgstr "Visa välkomstskärm"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Visa välkomstskärmen under uppstart."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr ""
|
||||
|
||||
@@ -7871,6 +7913,13 @@ msgstr ""
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Auto säkerhetskopiera"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Säkerhetskopiera ditt projekt med jämna mellanrum för att underlätta återställning efter en tillfällig krasch."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr ""
|
||||
|
||||
@@ -7889,12 +7938,17 @@ msgstr ""
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr ""
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Auto säkerhetskopiera"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Säkerhetskopiera ditt projekt med jämna mellanrum för att underlätta återställning efter en tillfällig krasch."
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Förinställd"
|
||||
@@ -7926,6 +7980,12 @@ msgstr ""
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Features"
|
||||
msgstr "Funktioner"
|
||||
|
||||
@@ -7938,18 +7998,6 @@ msgstr ""
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr ""
|
||||
|
||||
@@ -8174,19 +8222,6 @@ msgstr ""
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Automatisk synkronisering av användarens förinställningar (skrivare/filament/process)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Uppdatera inbyggda förinställningar automatiskt."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr ""
|
||||
|
||||
@@ -8199,6 +8234,16 @@ msgstr ""
|
||||
msgid "Color only"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Uppdatera inbyggda förinställningar automatiskt."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8211,30 +8256,6 @@ msgstr ""
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Lyckades"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Associerade filer till Orca Slicer"
|
||||
|
||||
@@ -8281,7 +8302,16 @@ msgstr "Utvecklare"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "Hoppa över kontrollen av AMS svarta lista"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8289,12 +8319,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr ""
|
||||
|
||||
@@ -8321,24 +8345,6 @@ msgstr "felsök"
|
||||
msgid "trace"
|
||||
msgstr "spåra"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Ladda om"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "Felsökning"
|
||||
|
||||
@@ -8354,25 +8360,6 @@ msgstr "Förinställd synkronisering"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Synkronisera inställningar"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Kontroll inställningar"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "Rotera vy"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "Panoreringsvy"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "Zoomvy"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Andra"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "Reversera mushjulet för att zooma"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "Aktivera SSL(MQTT)"
|
||||
|
||||
@@ -9073,6 +9060,12 @@ msgstr "Radera denna förinställning"
|
||||
msgid "Search in preset"
|
||||
msgstr "Sök i inställning"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Klicka för att återställa alla inställningar till den senast sparade förinställningen."
|
||||
|
||||
@@ -9357,6 +9350,18 @@ msgstr ""
|
||||
msgid "Print chamber temperature"
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Kammarens temperatur"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Utskrifts temperatur"
|
||||
|
||||
@@ -9676,11 +9681,21 @@ msgid "Don't warn again for this preset"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
@@ -9701,7 +9716,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "Överge eller Behåll ändringar"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "Gammalt värde"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9817,6 +9832,12 @@ msgstr "Antal extruders"
|
||||
msgid "Capabilities"
|
||||
msgstr "Förmågor"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Visa alla inställningar (inklusive inkompatibla)"
|
||||
|
||||
@@ -11841,6 +11862,23 @@ msgstr "Normal utskrift"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "Standard acceleration för både normal utskrift och förflyttning förrutom första lager"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr ""
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² eller %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Standard filament profil"
|
||||
|
||||
@@ -12023,6 +12061,12 @@ msgstr ""
|
||||
msgid "Octagram Spiral"
|
||||
msgstr ""
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Botten ytans mönster"
|
||||
|
||||
@@ -12030,6 +12074,14 @@ msgstr "Botten ytans mönster"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "Botten ytans ifyllnads linjemönster, inte bridge/brygg ifyllnad"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "Invändigt mönster för fyllning av solida ytor"
|
||||
|
||||
@@ -12290,18 +12342,6 @@ msgstr ""
|
||||
msgid "Auto For Match"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr ""
|
||||
|
||||
@@ -12633,6 +12673,7 @@ msgstr ""
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -12700,75 +12741,6 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (inga öppna ankare)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (obegränsat)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr ""
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "Acceleration av fyllning av toppytan. Att använda ett lägre värde kan förbättra ytkvaliteten"
|
||||
@@ -12777,12 +12749,9 @@ msgstr "Acceleration av fyllning av toppytan. Att använda ett lägre värde kan
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Acceleration av yttervägg: ett lägre värde kan förbättra kvaliteten."
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² eller %"
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Acceleration av gles utfyllnad. Om värdet uttrycks som en procentsats (t.ex. 100%) kommer det att beräknas baserat på standard accelerationen."
|
||||
|
||||
@@ -12793,14 +12762,6 @@ msgstr ""
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "Utskrifts acceleration för första lager. Ett lägre värde kan förbättra objektets fäste på byggplattan"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "Aktivera accel_to_decel"
|
||||
|
||||
@@ -12895,6 +12856,17 @@ msgstr ""
|
||||
msgid "layer"
|
||||
msgstr ""
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr ""
|
||||
|
||||
@@ -13379,6 +13351,69 @@ msgstr ""
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr ""
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (inga öppna ankare)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (obegränsat)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14214,6 +14249,18 @@ msgstr "Direct Drive"
|
||||
msgid "Bowden"
|
||||
msgstr "Bowden"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Extra längd vid omstart"
|
||||
|
||||
@@ -14620,6 +14667,9 @@ msgstr "Sprickor mindre än 2 x gap stängningsradie fylls under triangeln mesh
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Berednings läge"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Andra"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "Använd ”Jämn-Udda” för 3DLabPrint flygplans modeller. Använd ”Stäng hål” för att stänga alla hål i modellen."
|
||||
|
||||
@@ -14971,9 +15021,6 @@ msgid ""
|
||||
"This option relies on the firmware supporting the M191 and M141 commands either via macros or natively and is usually used when an active chamber heater is installed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Kammarens temperatur"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -14982,6 +15029,17 @@ msgid ""
|
||||
"If enabled, this parameter also sets a G-code variable named chamber_temperature, which can be used to pass the desired chamber temperature to your print start macro, or a heat soak macro like this: PRINT_START (other variables) CHAMBER_TEMP=[chamber_temperature]. This may be useful if your printer does not support M141/M191 commands, or if you desire to handle heat soaking in the print start macro if no active chamber heater is installed."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "Nozzel temperatur efter första lager"
|
||||
@@ -15027,20 +15085,6 @@ msgstr "Övre skalets tjocklek"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "Antal solida övre lager ökas när tjockleken kalkyleras och övre skalet är tunnare än detta värde. Detta kan undvika att ha för tunt skal när lagerhöjden är liten. 0 betyder att den här inställningen är inaktiverad och tjockleken på det övre skalet bestäms av de övre skal lagerna"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Förflyttnings hastighet"
|
||||
@@ -17562,6 +17606,132 @@ msgstr ""
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "Anslutningen till printrar som är anslutna via printer värden misslyckades."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -17644,6 +17814,19 @@ msgstr ""
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "Kunde inte ansluta till MKS"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr ""
|
||||
|
||||
@@ -18773,6 +18956,22 @@ msgstr ""
|
||||
"Undvik vridning\n"
|
||||
"Visste du att när du skriver ut material som är benägna att vrida, såsom ABS, kan en lämplig ökning av värmebäddens temperatur minska sannolikheten för vridning?"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Kontroll inställningar"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "Rotera vy"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "Panoreringsvy"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "Zoomvy"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "Reversera mushjulet för att zooma"
|
||||
|
||||
#~ msgid "Perform"
|
||||
#~ msgstr "Utför"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: 2026-06-19 13:40+0700\n"
|
||||
"Last-Translator: Icezaza\n"
|
||||
"Language-Team: Thai\n"
|
||||
@@ -1699,7 +1699,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "ตั้งแต่เวอร์ชัน 2.4.0 เป็นต้นไป OrcaSlicer จะซิงค์โปรไฟล์ผู้ใช้ผ่าน Orca Cloud แทน Bambu Cloud\n\nหากต้องการย้ายโปรไฟล์ที่มีอยู่ของคุณ ให้เข้าสู่ระบบ Orca Cloud แล้วระบบจะถ่ายโอนให้โดยอัตโนมัติ หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับวิธีที่ OrcaSlicer จัดเก็บและซิงค์โปรไฟล์ของคุณ หรือต้องการย้ายพรีเซ็ตด้วยตนเอง โปรดดูที่วิกิของเรา\n\nหากคุณไม่ได้ใช้ Bambu Cloud ในการซิงค์โปรไฟล์ การเปลี่ยนแปลงนี้จะไม่ส่งผลต่อคุณ และคุณสามารถเพิกเฉยต่อข้อความนี้ได้"
|
||||
msgstr ""
|
||||
"ตั้งแต่เวอร์ชัน 2.4.0 เป็นต้นไป OrcaSlicer จะซิงค์โปรไฟล์ผู้ใช้ผ่าน Orca Cloud แทน Bambu Cloud\n"
|
||||
"\n"
|
||||
"หากต้องการย้ายโปรไฟล์ที่มีอยู่ของคุณ ให้เข้าสู่ระบบ Orca Cloud แล้วระบบจะถ่ายโอนให้โดยอัตโนมัติ หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับวิธีที่ OrcaSlicer จัดเก็บและซิงค์โปรไฟล์ของคุณ หรือต้องการย้ายพรีเซ็ตด้วยตนเอง โปรดดูที่วิกิของเรา\n"
|
||||
"\n"
|
||||
"หากคุณไม่ได้ใช้ Bambu Cloud ในการซิงค์โปรไฟล์ การเปลี่ยนแปลงนี้จะไม่ส่งผลต่อคุณ และคุณสามารถเพิกเฉยต่อข้อความนี้ได้"
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -3999,6 +4004,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "อุณหภูมิห้องพิมพ์ปัจจุบันสูงกว่าอุณหภูมิปลอดภัยของวัสดุ ซึ่งอาจทำให้วัสดุนิ่มและหัวฉีดอุดตัน อุณหภูมิปลอดภัยสูงสุดของวัสดุนี้คือ %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
"It has been reset to 0.2"
|
||||
@@ -7702,6 +7711,50 @@ msgstr "เลือกโฟลเดอร์สำหรับรายกา
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "เลือกดาวน์โหลดไดเรกทอรี"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(ล่าสุด)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "สลับปลั๊กอินเครือข่ายสำเร็จแล้ว"
|
||||
|
||||
msgid "Success"
|
||||
msgstr "สำเร็จ"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "โหลดปลั๊กอินเครือข่ายไม่สำเร็จ กรุณารีสตาร์ทแอปพลิเคชัน"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"คุณได้เลือกปลั๊กอินเครือข่ายเวอร์ชัน %s\n"
|
||||
"\n"
|
||||
"คุณต้องการดาวน์โหลดและติดตั้งเวอร์ชันนี้ทันทีหรือไม่\n"
|
||||
"\n"
|
||||
"หมายเหตุ: แอปพลิเคชันอาจต้องรีสตาร์ทหลังการติดตั้ง"
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "ดาวน์โหลดปลั๊กอินเครือข่าย"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "โหลดปลั๊กอินเครือข่ายซ้ำโดยไม่ต้องรีสตาร์ทแอปพลิเคชัน"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "โหลดปลั๊กอินเครือข่ายซ้ำสำเร็จแล้ว"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "โหลดใหม่"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "โหลดปลั๊กอินเครือข่ายซ้ำไม่สำเร็จ กรุณารีสตาร์ทแอปพลิเคชัน"
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "โหลดใหม่ล้มเหลว"
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "เชื่อมโยง"
|
||||
|
||||
@@ -7756,12 +7809,6 @@ msgstr "แสดงหน้าจอเริ่มต้น"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "แสดงหน้าจอเริ่มต้นระหว่างการเริ่มต้น"
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "แสดงการแจ้งเตือนโปรไฟล์ที่แชร์"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "แสดงการแจ้งเตือนพร้อมลิงก์เพื่อเรียกดูโปรไฟล์ที่แชร์เมื่อเครื่องพิมพ์ที่เลือกมีการเปลี่ยนแปลง"
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr "ใช้ปุ่มหน้าต่างทางด้านซ้าย"
|
||||
|
||||
@@ -7792,6 +7839,12 @@ msgstr "พฤติกรรมการโหลด"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "ควรโหลดการตั้งค่าเครื่องพิมพ์/เส้นพลาสติก/กระบวนการเมื่อเปิดไฟล์ 3MF หรือไม่"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "การสำรองข้อมูลอัตโนมัติ"
|
||||
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "สำรองข้อมูลโปรเจ็กต์ของคุณเป็นระยะเพื่อกู้คืนจากข้อขัดข้องเป็นครั้งคราว"
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "ไฟล์ล่าสุดสูงสุด"
|
||||
|
||||
@@ -7810,11 +7863,20 @@ msgstr "แสดงตัวเลือกเมื่อนำเข้าไ
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "หากเปิดใช้งาน กล่องโต้ตอบการตั้งค่าพารามิเตอร์จะปรากฏขึ้นระหว่างการนำเข้าไฟล์ STEP"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "การสำรองข้อมูลอัตโนมัติ"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "ระดับคุณภาพสำหรับการส่งออกของ Draco"
|
||||
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "สำรองข้อมูลโปรเจ็กต์ของคุณเป็นระยะเพื่อกู้คืนจากข้อขัดข้องเป็นครั้งคราว"
|
||||
msgid "bits"
|
||||
msgstr "บิต"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"ควบคุมความลึกบิตเชิงปริมาณที่ใช้ในการบีบอัด mesh เป็นรูปแบบ Draco\n"
|
||||
"0 = การบีบอัดแบบไม่สูญเสีย (รูปทรงเรขาคณิตจะถูกรักษาไว้อย่างแม่นยำเต็มที่) ค่าการสูญเสียที่ถูกต้องมีตั้งแต่ 8 ถึง 30\n"
|
||||
"ค่าที่ต่ำกว่าจะทำให้ไฟล์มีขนาดเล็กลง แต่สูญเสียรายละเอียดทางเรขาคณิตมากขึ้น ค่าที่สูงกว่าจะรักษารายละเอียดได้มากขึ้นโดยที่ไฟล์มีขนาดใหญ่กว่า"
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "พรีเซ็ต"
|
||||
@@ -7846,6 +7908,12 @@ msgstr "เส้นพลาสติก"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr "ปรับความสูงสูงสุดของพื้นที่เส้นพลาสติกให้เหมาะสมตามจำนวนเส้นพลาสติกที่เลือก"
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "แสดงการแจ้งเตือนโปรไฟล์ที่แชร์"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "แสดงการแจ้งเตือนพร้อมลิงก์เพื่อเรียกดูโปรไฟล์ที่แชร์เมื่อเครื่องพิมพ์ที่เลือกมีการเปลี่ยนแปลง"
|
||||
|
||||
msgid "Features"
|
||||
msgstr "คุณสมบัติ"
|
||||
|
||||
@@ -7858,21 +7926,6 @@ msgstr "เมื่อเปิดใช้งานตัวเลือกน
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "ปรากฏขึ้นเพื่อเลือกโหมดการจัดกลุ่มเส้นพลาสติก"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "ระดับคุณภาพสำหรับการส่งออกของ Draco"
|
||||
|
||||
msgid "bits"
|
||||
msgstr "บิต"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"ควบคุมความลึกบิตเชิงปริมาณที่ใช้ในการบีบอัด mesh เป็นรูปแบบ Draco\n"
|
||||
"0 = การบีบอัดแบบไม่สูญเสีย (รูปทรงเรขาคณิตจะถูกรักษาไว้อย่างแม่นยำเต็มที่) ค่าการสูญเสียที่ถูกต้องมีตั้งแต่ 8 ถึง 30\n"
|
||||
"ค่าที่ต่ำกว่าจะทำให้ไฟล์มีขนาดเล็กลง แต่สูญเสียรายละเอียดทางเรขาคณิตมากขึ้น ค่าที่สูงกว่าจะรักษารายละเอียดได้มากขึ้นโดยที่ไฟล์มีขนาดใหญ่กว่า"
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "พฤติกรรม"
|
||||
|
||||
@@ -8117,18 +8170,6 @@ msgstr "ตรวจสอบการอัปเดตที่เสถีย
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "การตั้งค่าล่วงหน้าของผู้ใช้ซิงค์อัตโนมัติ (เครื่องพิมพ์/เส้นพลาสติก/กระบวนการ)"
|
||||
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "อัปเดตค่าที่ตั้งล่วงหน้าในตัวโดยอัตโนมัติ"
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "ใช้ไฟล์ที่เข้ารหัสสำหรับการจัดเก็บโทเค็น"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "จัดเก็บโทเค็นการรับรองความถูกต้องในไฟล์ที่เข้ารหัสแทนพวงกุญแจระบบ (ต้องรีสตาร์ท)"
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr "ตัวเลือกการซิงค์ฟิลาเมนต์"
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr "โหมดการซิงค์ฟิลาเมนต์"
|
||||
|
||||
@@ -8141,6 +8182,15 @@ msgstr "เส้นพลาสติกและสี"
|
||||
msgid "Color only"
|
||||
msgstr "สีเท่านั้น"
|
||||
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "อัปเดตค่าที่ตั้งล่วงหน้าในตัวโดยอัตโนมัติ"
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "ใช้ไฟล์ที่เข้ารหัสสำหรับการจัดเก็บโทเค็น"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "จัดเก็บโทเค็นการรับรองความถูกต้องในไฟล์ที่เข้ารหัสแทนพวงกุญแจระบบ (ต้องรีสตาร์ท)"
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr "ปลั๊กอินเครือข่าย Bambu"
|
||||
|
||||
@@ -8153,35 +8203,6 @@ msgstr "เวอร์ชันปลั๊กอินเครือข่า
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr "เลือกเวอร์ชันปลั๊กอินเครือข่ายที่จะใช้"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(ล่าสุด)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "สลับปลั๊กอินเครือข่ายสำเร็จแล้ว"
|
||||
|
||||
msgid "Success"
|
||||
msgstr "สำเร็จ"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "โหลดปลั๊กอินเครือข่ายไม่สำเร็จ กรุณารีสตาร์ทแอปพลิเคชัน"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"คุณได้เลือกปลั๊กอินเครือข่ายเวอร์ชัน %s\n"
|
||||
"\n"
|
||||
"คุณต้องการดาวน์โหลดและติดตั้งเวอร์ชันนี้ทันทีหรือไม่\n"
|
||||
"\n"
|
||||
"หมายเหตุ: แอปพลิเคชันอาจต้องรีสตาร์ทหลังการติดตั้ง"
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "ดาวน์โหลดปลั๊กอินเครือข่าย"
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "เชื่อมโยงไฟล์กับ OrcaSlicer"
|
||||
|
||||
@@ -8224,8 +8245,17 @@ msgstr "นักพัฒนา"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "ข้ามการตรวจสอบบัญชีดำของ AMS"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgstr "(ทดลอง) เก็บคุณสมบัติการทาสีไว้หลังจากเปลี่ยนตาข่าย"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr "แสดงค่าที่ตั้งไว้ล่วงหน้าที่ไม่รองรับ"
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr "แสดงค่าที่ตั้งไว้ล่วงหน้าที่ไม่เข้ากันหรือไม่รองรับในรายการเลือกเครื่องพิมพ์และเส้นพลาสติก ไม่สามารถเลือกค่าที่ตั้งไว้ล่วงหน้าเหล่านี้ได้"
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Attempt to keep painted features (color/seam/support/fuzzy etc.) after changing the object mesh (such as cut/reload from disk/simplify/fix etc.)\n"
|
||||
@@ -8234,12 +8264,6 @@ msgstr ""
|
||||
"พยายามคงคุณสมบัติการทาสีไว้ (สี/รอยตะเข็บ/ส่วนรองรับ/คลุมเครือ ฯลฯ) หลังจากเปลี่ยนตาข่ายวัตถุ (เช่น ตัด/โหลดซ้ำจากดิสก์/ลดความซับซ้อน/แก้ไข ฯลฯ)\n"
|
||||
"น่าทดลองมาก! ช้าและอาจสร้างสิ่งประดิษฐ์"
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr "แสดงค่าที่ตั้งไว้ล่วงหน้าที่ไม่รองรับ"
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr "แสดงค่าที่ตั้งไว้ล่วงหน้าที่ไม่เข้ากันหรือไม่รองรับในรายการเลือกเครื่องพิมพ์และเส้นพลาสติก ไม่สามารถเลือกค่าที่ตั้งไว้ล่วงหน้าเหล่านี้ได้"
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "อนุญาตให้จัดเก็บผิดปกติ"
|
||||
|
||||
@@ -8268,24 +8292,6 @@ msgstr "แก้ปัญหา"
|
||||
msgid "trace"
|
||||
msgstr "ติดตาม"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr "ปลั๊กอินเครือข่าย"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "โหลดใหม่"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "โหลดปลั๊กอินเครือข่ายซ้ำโดยไม่ต้องรีสตาร์ทแอปพลิเคชัน"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "โหลดปลั๊กอินเครือข่ายซ้ำสำเร็จแล้ว"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "โหลดปลั๊กอินเครือข่ายซ้ำไม่สำเร็จ กรุณารีสตาร์ทแอปพลิเคชัน"
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "โหลดใหม่ล้มเหลว"
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "ดีบัก"
|
||||
|
||||
@@ -8301,24 +8307,6 @@ msgstr "การซิงค์ที่ตั้งไว้ล่วงหน
|
||||
msgid "Preferences sync"
|
||||
msgstr "ซิงค์การตั้งค่า"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "ดูการตั้งค่าการควบคุม"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "หมุนมุมมอง"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "แพนวิว"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "ซูมดู"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "อื่นๆ"
|
||||
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "ล้อเมาส์จะกลับด้านเมื่อซูม"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "เปิดใช้งาน SSL(MQTT)"
|
||||
|
||||
@@ -9012,6 +9000,12 @@ msgstr "ลบค่าที่ตั้งล่วงหน้านี้"
|
||||
msgid "Search in preset"
|
||||
msgstr "ค้นหาในที่ตั้งไว้ล่วงหน้า"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "คลิกเพื่อรีเซ็ตการตั้งค่าทั้งหมดเป็นค่าที่ตั้งไว้ล่วงหน้าที่บันทึกไว้ล่าสุด"
|
||||
|
||||
@@ -9295,6 +9289,18 @@ msgstr "อัตราการไหลและแรงดันล่วง
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "อุณหภูมิห้องพิมพ์"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "อุณหภูมิห้องพิมพ์"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "อุณหภูมิพิมพ์"
|
||||
|
||||
@@ -9619,12 +9625,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr "ไม่ต้องเตือนอีกสำหรับค่าที่กำหนดล่วงหน้านี้"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "ซ้าย: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "ขวา: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "คลิกเพื่อรีเซ็ตค่าปัจจุบันและแนบไปกับค่าส่วนกลาง"
|
||||
@@ -9641,7 +9657,7 @@ msgstr "การเปลี่ยนแปลงที่ไม่ได้บ
|
||||
msgid "Transfer or discard changes"
|
||||
msgstr "โอนหรือละทิ้งการเปลี่ยนแปลง"
|
||||
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "ค่าเก่า"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9773,6 +9789,12 @@ msgstr "จำนวนชุดดันเส้น"
|
||||
msgid "Capabilities"
|
||||
msgstr "ความสามารถ"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "แสดงค่าที่ตั้งล่วงหน้าทั้งหมด (รวมทั้งเข้ากันไม่ได้)"
|
||||
|
||||
@@ -11905,6 +11927,25 @@ msgstr "การพิมพ์ปกติ"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "การเร่งความเร็วเริ่มต้นของทั้งการพิมพ์และการเคลื่อนที่ตามปกติ ยกเว้นเลเยอร์เริ่มต้น"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "การเร่งความเร็วของการเดินทาง"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "การเดินทางชั้นแรก"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"ความเร่งการเคลื่อนที่ของชั้นแรก\n"
|
||||
"ค่าเปอร์เซ็นต์สัมพันธ์กับการเร่งความเร็วในการเดินทาง"
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "มม./วินาที² หรือ %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "การเร่งความเร็วของสะพาน หากค่าแสดงเป็นเปอร์เซ็นต์ (เช่น 50%) ค่าดังกล่าวจะคำนวณตามความเร่งของผนังด้านนอก"
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "โปรไฟล์เส้นพลาสติกเริ่มต้น"
|
||||
|
||||
@@ -12112,12 +12153,28 @@ msgstr "คอร์ดอาร์คิมีดีน"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "เกลียวแปดเหลี่ยม"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "ความหนาแน่นผิวด้านบน"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "ความหนาแน่นของชั้นผิวด้านบน ค่า 100% จะสร้างชั้นบนสุดที่เรียบและแข็งเต็มที่ การลดค่านี้ส่งผลให้พื้นผิวด้านบนมีพื้นผิวตามรูปแบบพื้นผิวด้านบนที่เลือก ค่า 0% จะส่งผลให้มีการสร้างเฉพาะผนังชั้นบนสุดเท่านั้น มีวัตถุประสงค์เพื่อความสวยงามหรือการใช้งาน ไม่ใช่เพื่อแก้ไขปัญหา เช่น การอัดขึ้นรูปมากเกินไป"
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "รูปแบบผิวด้านล่าง"
|
||||
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "รูปแบบเส้นของไส้ในพื้นผิวด้านล่าง ไม่ใช่ไส้ในแบบบริดจ์"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "ความหนาแน่นผิวด้านล่าง"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"ความหนาแน่นของชั้นผิวด้านล่าง มีวัตถุประสงค์เพื่อความสวยงามหรือการใช้งาน ไม่ใช่เพื่อแก้ไขปัญหา เช่น การอัดขึ้นรูปมากเกินไป\n"
|
||||
"คำเตือน: การลดค่านี้อาจส่งผลเสียต่อการยึดเกาะของฐานพิมพ์"
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "รูปแบบไส้ในของแข็งภายใน"
|
||||
|
||||
@@ -12414,18 +12471,6 @@ msgstr "อัตโนมัติสำหรับไล่เส้น"
|
||||
msgid "Auto For Match"
|
||||
msgstr "อัตโนมัติสำหรับการแข่งขัน"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "เปิดใช้งานแผนที่ไดนามิกของเส้นพลาสติก"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "เปิดใช้งานการแมปเส้นพลาสติกแบบไดนามิกระหว่างการพิมพ์"
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "มีตัวสลับเส้นพลาสติก"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "เครื่องพิมพ์มีฮาร์ดแวร์ตัวสลับเส้นพลาสติก (เช่น AMS)"
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "อุณหภูมิไล่เส้น"
|
||||
|
||||
@@ -12762,7 +12807,7 @@ msgstr "การใช้หลายบรรทัดสำหรับรู
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr "การปรับชดเชยการโก่งตัวตามแกน Z ให้เหมาะสม (ทดลอง)"
|
||||
|
||||
#, fuzzy
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr "ปรับคลื่นไจรอยด์ให้ถี่ขึ้นตามแกน Z (แนวตั้ง) เมื่อความหนาแน่นไส้ในต่ำ เพื่อลดความยาวช่วงเสาแนวตั้งที่มีผลจริง และเพิ่มความต้านทานการโก่งตัวจากแรงอัดตามแกน Z โดยยังใช้เส้นพลาสติกเท่าเดิม ไม่มีผลเมื่อความหนาแน่นไส้ในแบบโปร่งประมาณ ~30% ขึ้นไป ใช้เฉพาะเมื่อรูปแบบไส้ในแบบโปร่งตั้งเป็นไจรอยด์เท่านั้น"
|
||||
|
||||
@@ -12829,92 +12874,14 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr "ไจรอยด์"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "มุมขัดแตะด้านข้าง 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "มุมขององค์ประกอบขัดแตะด้านข้างชุดแรกในทิศทาง Z ศูนย์คือแนวตั้ง"
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "มุมขัดแตะด้านข้าง 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "มุมขององค์ประกอบขัดแตะด้านข้างชุดที่สองในทิศทาง Z ศูนย์คือแนวตั้ง"
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "ไส้ในมุมยื่น"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "มุมของเส้นมุมที่ไส้ในเข้าไป 60° ก็จะได้รังผึ้งที่บริสุทธิ์"
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr "มุมส่วนยื่น Lightning"
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr "มุมส่วนยื่นสูงสุดสำหรับการแพร่กระจายส่วนรองรับไส้ใน Lightning"
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr "มุมตัดแต่ง"
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
"กำหนดระดับการตัดกิ่ง Lightning ที่สั้นหรือไม่มีส่วนรองรับออก\n"
|
||||
"มุมนี้จะถูกแปลงภายในเป็นระยะทางต่อชั้น"
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr "มุมจัดให้ตรง"
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr "มุมจัดให้ตรงสูงสุดที่ใช้ลดความซับซ้อนของกิ่ง Lightning"
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "ความยาวสมอ ไส้ใน เบาบาง"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"เชื่อมต่อเส้นไส้ในเข้ากับเส้นรอบวงภายในด้วยส่วนสั้นของเส้นรอบวงเพิ่มเติม หากระบุเป็นเปอร์เซ็นต์ (ตัวอย่าง: 15%) ระบบจะคำนวณจากความกว้างการอัดรีดของไส้ใน Orca Slicer จะพยายามเชื่อมต่อเส้นไส้ในสองเส้นที่อยู่ใกล้กันเข้ากับส่วนเส้นรอบวงสั้น ๆ หากไม่พบส่วนเส้นรอบวงที่สั้นกว่า infill_anchor_max เส้นไส้ในจะถูกเชื่อมต่อกับส่วนเส้นรอบวงเพียงด้านเดียว และความยาวของส่วนเส้นรอบวงที่ใช้จะถูกจำกัดด้วยพารามิเตอร์นี้ แต่ต้องไม่เกิน anchor_length_max\n"
|
||||
"ตั้งค่าพารามิเตอร์นี้เป็นศูนย์เพื่อปิดใช้งานเส้นรอบวงยึดที่เชื่อมต่อกับเส้นไส้ในเพียงเส้นเดียว"
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (ไม่มีพุกเปิด)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1,000 (ไม่จำกัด)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "ความยาวสูงสุดของพุก ไส้ใน"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"เชื่อมต่อเส้นไส้ในเข้ากับเส้นรอบวงภายในด้วยส่วนสั้นของเส้นรอบวงเพิ่มเติม หากระบุเป็นเปอร์เซ็นต์ (ตัวอย่าง: 15%) ระบบจะคำนวณจากความกว้างการอัดรีดของไส้ใน Orca Slicer จะพยายามเชื่อมต่อเส้นไส้ในสองเส้นที่อยู่ใกล้กันเข้ากับส่วนเส้นรอบวงสั้น ๆ หากไม่พบส่วนเส้นรอบวงที่สั้นกว่าพารามิเตอร์นี้ เส้นไส้ในจะถูกเชื่อมต่อกับส่วนเส้นรอบวงเพียงด้านเดียว และความยาวของส่วนเส้นรอบวงที่ใช้จะถูกจำกัดไว้ที่ infill_anchor แต่ต้องไม่ยาวเกินพารามิเตอร์นี้\n"
|
||||
"หากตั้งค่าเป็น 0 จะใช้อัลกอริทึมเดิมสำหรับการเชื่อมต่อไส้ใน ซึ่งควรให้ผลลัพธ์เดียวกับ 1000 & 0"
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (เชื่อมต่อแบบง่าย)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "การเร่งความเร็วของผนังด้านใน"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "การเร่งความเร็วของการเดินทาง"
|
||||
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "ความเร่งของไส้ในพื้นผิวด้านบน การใช้ค่าที่ต่ำกว่าอาจปรับปรุงคุณภาพพื้นผิวด้านบนได้"
|
||||
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "ความเร่งของผนังด้านนอก การใช้ค่าที่ต่ำกว่าสามารถปรับปรุงคุณภาพได้"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "การเร่งความเร็วของสะพาน หากค่าแสดงเป็นเปอร์เซ็นต์ (เช่น 50%) ค่าดังกล่าวจะคำนวณตามความเร่งของผนังด้านนอก"
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "มม./วินาที² หรือ %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "การเร่งความเร็วของผนังด้านใน"
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "ความเร่งของไส้ในแบบโปร่ง หากค่าแสดงเป็นเปอร์เซ็นต์ (เช่น 100%) ค่านั้นจะถูกคำนวณตามความเร่งเริ่มต้น"
|
||||
@@ -12925,16 +12892,6 @@ msgstr "ความเร่งของไส้ในของแข็งภ
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "ความเร่งของชั้นแรก การใช้ค่าที่ต่ำกว่าสามารถปรับปรุงการยึดเกาะของเพลตได้"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "การเดินทางชั้นแรก"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"ความเร่งการเคลื่อนที่ของชั้นแรก\n"
|
||||
"ค่าเปอร์เซ็นต์สัมพันธ์กับการเร่งความเร็วในการเดินทาง"
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "เปิดใช้งาน accel_to_decel"
|
||||
|
||||
@@ -13024,6 +12981,17 @@ msgstr "ความเร็วพัดลมจะเพิ่มขึ้น
|
||||
msgid "layer"
|
||||
msgstr "ชั้น"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "ความเร็วพัดลมผิวสัมผัสส่วนรองรับ"
|
||||
|
||||
@@ -13555,6 +13523,75 @@ msgstr "การตรวจวัดไม่รวมพื้นที่จ
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "การตรวจวัดไม่รวมพื้นที่จับตัวเป็นก้อน"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "มุมขัดแตะด้านข้าง 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "มุมขององค์ประกอบขัดแตะด้านข้างชุดแรกในทิศทาง Z ศูนย์คือแนวตั้ง"
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "มุมขัดแตะด้านข้าง 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "มุมขององค์ประกอบขัดแตะด้านข้างชุดที่สองในทิศทาง Z ศูนย์คือแนวตั้ง"
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "ไส้ในมุมยื่น"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "มุมของเส้นมุมที่ไส้ในเข้าไป 60° ก็จะได้รังผึ้งที่บริสุทธิ์"
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr "มุมส่วนยื่น Lightning"
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr "มุมส่วนยื่นสูงสุดสำหรับการแพร่กระจายส่วนรองรับไส้ใน Lightning"
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr "มุมตัดแต่ง"
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
"กำหนดระดับการตัดกิ่ง Lightning ที่สั้นหรือไม่มีส่วนรองรับออก\n"
|
||||
"มุมนี้จะถูกแปลงภายในเป็นระยะทางต่อชั้น"
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr "มุมจัดให้ตรง"
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr "มุมจัดให้ตรงสูงสุดที่ใช้ลดความซับซ้อนของกิ่ง Lightning"
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "ความยาวสมอ ไส้ใน เบาบาง"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"เชื่อมต่อเส้นไส้ในเข้ากับเส้นรอบวงภายในด้วยส่วนสั้นของเส้นรอบวงเพิ่มเติม หากระบุเป็นเปอร์เซ็นต์ (ตัวอย่าง: 15%) ระบบจะคำนวณจากความกว้างการอัดรีดของไส้ใน Orca Slicer จะพยายามเชื่อมต่อเส้นไส้ในสองเส้นที่อยู่ใกล้กันเข้ากับส่วนเส้นรอบวงสั้น ๆ หากไม่พบส่วนเส้นรอบวงที่สั้นกว่า infill_anchor_max เส้นไส้ในจะถูกเชื่อมต่อกับส่วนเส้นรอบวงเพียงด้านเดียว และความยาวของส่วนเส้นรอบวงที่ใช้จะถูกจำกัดด้วยพารามิเตอร์นี้ แต่ต้องไม่เกิน anchor_length_max\n"
|
||||
"ตั้งค่าพารามิเตอร์นี้เป็นศูนย์เพื่อปิดใช้งานเส้นรอบวงยึดที่เชื่อมต่อกับเส้นไส้ในเพียงเส้นเดียว"
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (ไม่มีพุกเปิด)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1,000 (ไม่จำกัด)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "ความยาวสูงสุดของพุก ไส้ใน"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"เชื่อมต่อเส้นไส้ในเข้ากับเส้นรอบวงภายในด้วยส่วนสั้นของเส้นรอบวงเพิ่มเติม หากระบุเป็นเปอร์เซ็นต์ (ตัวอย่าง: 15%) ระบบจะคำนวณจากความกว้างการอัดรีดของไส้ใน Orca Slicer จะพยายามเชื่อมต่อเส้นไส้ในสองเส้นที่อยู่ใกล้กันเข้ากับส่วนเส้นรอบวงสั้น ๆ หากไม่พบส่วนเส้นรอบวงที่สั้นกว่าพารามิเตอร์นี้ เส้นไส้ในจะถูกเชื่อมต่อกับส่วนเส้นรอบวงเพียงด้านเดียว และความยาวของส่วนเส้นรอบวงที่ใช้จะถูกจำกัดไว้ที่ infill_anchor แต่ต้องไม่ยาวเกินพารามิเตอร์นี้\n"
|
||||
"หากตั้งค่าเป็น 0 จะใช้อัลกอริทึมเดิมสำหรับการเชื่อมต่อไส้ใน ซึ่งควรให้ผลลัพธ์เดียวกับ 1000 & 0"
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (เชื่อมต่อแบบง่าย)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14419,6 +14456,18 @@ msgstr "ขับตรง"
|
||||
msgid "Bowden"
|
||||
msgstr "โบว์เดน"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "เปิดใช้งานแผนที่ไดนามิกของเส้นพลาสติก"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "เปิดใช้งานการแมปเส้นพลาสติกแบบไดนามิกระหว่างการพิมพ์"
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "มีตัวสลับเส้นพลาสติก"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "เครื่องพิมพ์มีฮาร์ดแวร์ตัวสลับเส้นพลาสติก (เช่น AMS)"
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "ความยาวพิเศษเมื่อรีสตาร์ท"
|
||||
|
||||
@@ -14836,6 +14885,9 @@ msgstr "รอยแตกร้าวที่มีขนาดเล็กก
|
||||
msgid "Slicing Mode"
|
||||
msgstr "โหมดการแบ่งส่วน"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "อื่นๆ"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "ใช้ \"เลขคู่\" สำหรับโมเดลเครื่องบิน 3DLabPrint ใช้ \"ปิดรู\" เพื่อปิดรูทั้งหมดในโมเดล"
|
||||
|
||||
@@ -15184,9 +15236,6 @@ msgstr ""
|
||||
"\n"
|
||||
"ตัวเลือกนี้ขึ้นอยู่กับเฟิร์มแวร์ที่รองรับคำสั่ง M191 และ M141 ไม่ว่าจะผ่านทางมาโครหรือแบบเนทิฟ และโดยปกติจะใช้เมื่อมีการติดตั้งเครื่องทำความร้อนในห้องแบบแอคทีฟ"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "อุณหภูมิห้องพิมพ์"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15200,6 +15249,17 @@ msgstr ""
|
||||
"\n"
|
||||
"หากเปิดใช้งาน พารามิเตอร์นี้จะตั้งค่าตัวแปร G-code ชื่อ Chamber_temperature ซึ่งสามารถใช้เพื่อส่งอุณหภูมิห้องเพาะเลี้ยงที่ต้องการไปยังมาโครเริ่มการพิมพ์ของคุณ หรือมาโครความร้อนแช่เช่นนี้: PRINT_START (ตัวแปรอื่นๆ) CHAMBER_TEMP=[chamber_temperature] วิธีนี้อาจเป็นประโยชน์หากเครื่องพิมพ์ของคุณไม่รองรับคำสั่ง M141/M191 หรือหากคุณต้องการจัดการกับความร้อนที่แช่อยู่ในมาโครเริ่มการพิมพ์ หากไม่มีการติดตั้งเครื่องทำความร้อนในห้องที่ใช้งานอยู่"
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "อุณหภูมิหัวฉีดสำหรับชั้นหลังจากอันแรก"
|
||||
|
||||
@@ -15239,22 +15299,6 @@ msgstr "ความหนาผนังด้านบน"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "จำนวนชั้นทึบด้านบนจะเพิ่มขึ้นเมื่อสไลซ์หากความหนาที่คำนวณโดยชั้นเปลือกด้านบนบางกว่าค่านี้ วิธีนี้สามารถหลีกเลี่ยงไม่ให้เปลือกบางเกินไปเมื่อชั้นมีความสูงน้อย 0 หมายความว่าการตั้งค่านี้ถูกปิดใช้งาน และความหนาของเปลือกด้านบนถูกกำหนดโดยชั้นเปลือกด้านบนอย่างแน่นอน"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "ความหนาแน่นผิวด้านบน"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "ความหนาแน่นของชั้นผิวด้านบน ค่า 100% จะสร้างชั้นบนสุดที่เรียบและแข็งเต็มที่ การลดค่านี้ส่งผลให้พื้นผิวด้านบนมีพื้นผิวตามรูปแบบพื้นผิวด้านบนที่เลือก ค่า 0% จะส่งผลให้มีการสร้างเฉพาะผนังชั้นบนสุดเท่านั้น มีวัตถุประสงค์เพื่อความสวยงามหรือการใช้งาน ไม่ใช่เพื่อแก้ไขปัญหา เช่น การอัดขึ้นรูปมากเกินไป"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "ความหนาแน่นผิวด้านล่าง"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"ความหนาแน่นของชั้นผิวด้านล่าง มีวัตถุประสงค์เพื่อความสวยงามหรือการใช้งาน ไม่ใช่เพื่อแก้ไขปัญหา เช่น การอัดขึ้นรูปมากเกินไป\n"
|
||||
"คำเตือน: การลดค่านี้อาจส่งผลเสียต่อการยึดเกาะของฐานพิมพ์"
|
||||
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "ความเร็วที่ใช้ในการเคลื่อนที่แบบไม่อัดเส้น"
|
||||
|
||||
@@ -17844,6 +17888,132 @@ msgstr "เข้าสู่ระบบ/ทดสอบ"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "การเชื่อมต่อกับเครื่องพิมพ์ที่เชื่อมต่อผ่านโฮสต์การพิมพ์ล้มเหลว"
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr "ตัวเลือกอัปโหลดคลาวด์ 3DPrinterOS"
|
||||
|
||||
@@ -17926,6 +18096,19 @@ msgstr "การเชื่อมต่อกับ MKS ทำงานอย
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "ไม่สามารถเชื่อมต่อกับ MKS"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "การเชื่อมต่อกับ OctoPrint ทำงานอย่างถูกต้อง"
|
||||
|
||||
@@ -19076,6 +19259,38 @@ msgstr ""
|
||||
"หลีกเลี่ยงการบิดเบี้ยว\n"
|
||||
"คุณรู้หรือไม่ว่าเมื่อพิมพ์วัสดุที่มีแนวโน้มที่จะเกิดการบิดเบี้ยว เช่น ABS การเพิ่มอุณหภูมิฐานพิมพ์อย่างเหมาะสมสามารถลดความน่าจะเป็นของการบิดเบี้ยวได้"
|
||||
|
||||
#~ msgid "Filament Sync Options"
|
||||
#~ msgstr "ตัวเลือกการซิงค์ฟิลาเมนต์"
|
||||
|
||||
#~ msgid "(Experimental) Keep painted feature after mesh change"
|
||||
#~ msgstr "(ทดลอง) เก็บคุณสมบัติการทาสีไว้หลังจากเปลี่ยนตาข่าย"
|
||||
|
||||
#~ msgid "Network plug-in"
|
||||
#~ msgstr "ปลั๊กอินเครือข่าย"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "ดูการตั้งค่าการควบคุม"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "หมุนมุมมอง"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "แพนวิว"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "ซูมดู"
|
||||
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "ล้อเมาส์จะกลับด้านเมื่อซูม"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "ซ้าย: %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "ขวา: %s"
|
||||
|
||||
#~ msgid "This is the height of the first layer. Making the first layer height thicker can improve build plate adhesion."
|
||||
#~ msgstr "ความสูงของชั้นแรก การทำให้ชั้นแรกหนาขึ้นสามารถปรับปรุงการยึดเกาะของแผ่นรองพื้นได้"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: 2026-04-08 23:59+0300\n"
|
||||
"Last-Translator: GlauTech\n"
|
||||
"Language-Team: \n"
|
||||
@@ -1718,7 +1718,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "OrcaSlicer, 2.4.0 sürümünden itibaren kullanıcı profillerini Bambu Cloud yerine Orca Cloud üzerinden senkronize eder.\n\nMevcut profillerinizi taşımak için Orca Cloud'da oturum açın; profilleriniz otomatik olarak aktarılacaktır. OrcaSlicer'ın profillerinizi nasıl depolayıp senkronize ettiği hakkında daha fazla bilgi edinmek veya ön ayarlarınızı elle taşımak için wiki'mize göz atın.\n\nProfilleri senkronize etmek için Bambu Cloud kullanmadıysanız bu değişiklik sizi etkilemez ve bu mesajı güvenle yoksayabilirsiniz."
|
||||
msgstr ""
|
||||
"OrcaSlicer, 2.4.0 sürümünden itibaren kullanıcı profillerini Bambu Cloud yerine Orca Cloud üzerinden senkronize eder.\n"
|
||||
"\n"
|
||||
"Mevcut profillerinizi taşımak için Orca Cloud'da oturum açın; profilleriniz otomatik olarak aktarılacaktır. OrcaSlicer'ın profillerinizi nasıl depolayıp senkronize ettiği hakkında daha fazla bilgi edinmek veya ön ayarlarınızı elle taşımak için wiki'mize göz atın.\n"
|
||||
"\n"
|
||||
"Profilleri senkronize etmek için Bambu Cloud kullanmadıysanız bu değişiklik sizi etkilemez ve bu mesajı güvenle yoksayabilirsiniz."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4099,6 +4104,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "Mevcut hazne sıcaklığı malzemenin güvenli sıcaklığından yüksektir, malzemenin yumuşamasına ve tıkanmasına neden olabilir Malzeme için maksimum güvenli sıcaklık %d'dir"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7877,6 +7886,50 @@ msgstr "İndirilen öğeler için klasör seçin"
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "İndirme Dizini seçin"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(En sonuncu)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Ağ eklentisi başarıyla değiştirildi."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Başarı"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "Ağ eklentisi yüklenemedi. Lütfen uygulamayı yeniden başlatın."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Ağ eklentisi %s sürümünü seçtiniz.\n"
|
||||
"\n"
|
||||
"Bu sürümü şimdi indirip yüklemek ister misiniz?\n"
|
||||
"\n"
|
||||
"Not: Uygulamanın kurulumdan sonra yeniden başlatılması gerekebilir."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Ağ Eklentisini İndirin"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Uygulamayı yeniden başlatmadan ağ eklentisini yeniden yükleyin"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Ağ eklentisi başarıyla yeniden yüklendi."
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Yeniden yükle"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Ağ eklentisi yeniden yüklenemedi. Lütfen uygulamayı yeniden başlatın."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Yeniden Yükleme Başarısız"
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "Ortak"
|
||||
|
||||
@@ -7932,12 +7985,6 @@ msgstr "Açılış ekranını göster"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Açılış sırasında açılış ekranını göster."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr ""
|
||||
|
||||
@@ -7968,6 +8015,13 @@ msgstr "Yükleme davranışı"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "Bir .3mf açılırken yazıcı/filament/işlem ayarları yüklenmeli mi?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Otomatik yedekleme"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Ara sıra meydana gelen çökmelerden sonra geri yüklemek için projenizi düzenli aralıklarla yedekleyin."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "Son kullanılan dosyaların maksimum sayısı"
|
||||
|
||||
@@ -7986,12 +8040,20 @@ msgstr "STEP dosyasını içe aktarırken seçenekleri göster"
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "Etkinleştirilirse, STEP dosyası içe aktarılırken bir parametre ayarları iletişim kutusu görüntülenir."
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Otomatik yedekleme"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Draco dışa aktarımı için kalite düzeyi"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Ara sıra meydana gelen çökmelerden sonra geri yüklemek için projenizi düzenli aralıklarla yedekleyin."
|
||||
msgid "bits"
|
||||
msgstr "bitler"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Mesh Draco formatına sıkıştırılırken kullanılan niceleme bit derinliğini kontrol eder.\n"
|
||||
"0 = kayıpsız sıkıştırma (geometri tam hassasiyetle korunur). Geçerli kayıplı değerler 8 ile 30 arasında değişir.\n"
|
||||
"Daha düşük değerler daha küçük dosyalar oluşturur ancak daha fazla geometrik ayrıntıyı kaybeder; daha yüksek değerler, daha büyük dosyalar pahasına daha fazla ayrıntıyı korur."
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Ön ayar"
|
||||
@@ -8023,6 +8085,12 @@ msgstr "filamentler"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr "Seçilen filaman sayısına göre filaman alanı maksimum yüksekliğini optimize eder."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Features"
|
||||
msgstr "Özellikler"
|
||||
|
||||
@@ -8035,21 +8103,6 @@ msgstr "Bu seçenek etkinleştirildiğinde, aynı anda birden fazla cihaza bir g
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "Filament gruplama modunu seçmek için açılır pencere"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Draco dışa aktarımı için kalite düzeyi"
|
||||
|
||||
msgid "bits"
|
||||
msgstr "bitler"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"Mesh Draco formatına sıkıştırılırken kullanılan niceleme bit derinliğini kontrol eder.\n"
|
||||
"0 = kayıpsız sıkıştırma (geometri tam hassasiyetle korunur). Geçerli kayıplı değerler 8 ile 30 arasında değişir.\n"
|
||||
"Daha düşük değerler daha küçük dosyalar oluşturur ancak daha fazla geometrik ayrıntıyı kaybeder; daha yüksek değerler, daha büyük dosyalar pahasına daha fazla ayrıntıyı korur."
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "Davranış"
|
||||
|
||||
@@ -8277,19 +8330,6 @@ msgstr "Yalnızca kararlı güncellemeleri kontrol edin"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Kullanıcı ön ayarları otomatik senkronizasyon (Yazıcı/Filament/İşlem)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Yerleşik Ön Ayarları otomatik olarak güncelleyin."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Belirteç depolaması için şifrelenmiş dosyayı kullan"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Kimlik doğrulama belirteçlerini sistem anahtarlığı yerine şifrelenmiş bir dosyada saklayın. (Yeniden başlatma gerektirir)"
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr "Filament Senkronizasyon Seçenekleri"
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr "Filament senkronizasyon modu"
|
||||
|
||||
@@ -8302,6 +8342,16 @@ msgstr "Filament ve Renk"
|
||||
msgid "Color only"
|
||||
msgstr "Yalnızca renk"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Yerleşik Ön Ayarları otomatik olarak güncelleyin."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "Belirteç depolaması için şifrelenmiş dosyayı kullan"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "Kimlik doğrulama belirteçlerini sistem anahtarlığı yerine şifrelenmiş bir dosyada saklayın. (Yeniden başlatma gerektirir)"
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8314,35 +8364,6 @@ msgstr "Ağ eklentisi sürümü"
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr "Kullanılacak ağ eklentisi sürümünü seçin"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(En sonuncu)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "Ağ eklentisi başarıyla değiştirildi."
|
||||
|
||||
msgid "Success"
|
||||
msgstr "Başarı"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "Ağ eklentisi yüklenemedi. Lütfen uygulamayı yeniden başlatın."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"Ağ eklentisi %s sürümünü seçtiniz.\n"
|
||||
"\n"
|
||||
"Bu sürümü şimdi indirip yüklemek ister misiniz?\n"
|
||||
"\n"
|
||||
"Not: Uygulamanın kurulumdan sonra yeniden başlatılması gerekebilir."
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "Ağ Eklentisini İndirin"
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Dosyaları OrcaSlicer ile ilişkilendirin"
|
||||
|
||||
@@ -8388,7 +8409,16 @@ msgstr "Geliştirici"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "AMS kara liste kontrolünü atla"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8396,12 +8426,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "Anormal Depolamaya İzin Ver"
|
||||
|
||||
@@ -8430,24 +8454,6 @@ msgstr "hata ayıklama"
|
||||
msgid "trace"
|
||||
msgstr "iz"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr "Ağ eklentisi"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "Yeniden yükle"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "Uygulamayı yeniden başlatmadan ağ eklentisini yeniden yükleyin"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "Ağ eklentisi başarıyla yeniden yüklendi."
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "Ağ eklentisi yeniden yüklenemedi. Lütfen uygulamayı yeniden başlatın."
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "Yeniden Yükleme Başarısız"
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "Hata ayıklama"
|
||||
|
||||
@@ -8463,25 +8469,6 @@ msgstr "Ön ayar senkronizasyonu"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Tercihler senkronizasyonu"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Kontrol ayarlarını görüntüle"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "Görüntüyü döndür"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "Pan Görünümü"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "Zoom Görünümü"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Diğer"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "Yakınlaştırma sırasında fare tekerleği ters dönüyor"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "SSL'yi etkinleştir(MQTT)"
|
||||
|
||||
@@ -9190,6 +9177,12 @@ msgstr "Bu ön ayarı sil"
|
||||
msgid "Search in preset"
|
||||
msgstr "Ön ayarda ara"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Tüm ayarları en son kaydedilen ön ayara sıfırlamak için tıklayın."
|
||||
|
||||
@@ -9482,6 +9475,18 @@ msgstr "Akış Oranı Ve Basınç İlerlemesi"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "Baskı Odası Sıcaklığı"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Bölme sıcaklığı"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Yazdırma Sıcaklığı"
|
||||
|
||||
@@ -9804,12 +9809,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "Sol: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "Sağ: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "Geçerli değeri sıfırlamak ve genel değere eklemek için tıklayın."
|
||||
@@ -9829,7 +9844,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "Değişiklikleri Çıkart veya Sakla"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "Eski Değer"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9951,6 +9966,12 @@ msgstr "Ekstruder sayısı"
|
||||
msgid "Capabilities"
|
||||
msgstr "Yetenekler"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Tüm ön ayarları göster (uyumsuz olanlar dahil)"
|
||||
|
||||
@@ -12075,6 +12096,23 @@ msgstr "Normal baskı"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "İlk katman dışında hem normal yazdırmanın hem de ilerlemenin varsayılan ivmesi."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Seyahat hareketlerinin hızlandırılması."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² veya %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Köprülerin hızlandırılması. Değer yüzde olarak ifade edilirse (örn. %50), dış duvar ivmesine göre hesaplanacaktır."
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Varsayılan filament profili"
|
||||
|
||||
@@ -12281,6 +12319,12 @@ msgstr "Arşimet akorları"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "Sekizgen spiral"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Üst yüzey yoğunluğu"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Üst yüzey katmanının yoğunluğu. %100 değeri, tamamen sağlam ve pürüzsüz bir üst katman oluşturur. Bu değerin düşürülmesi, seçilen üst yüzey desenine göre dokulu bir üst yüzey elde edilmesini sağlar. %0 değeri ise yalnızca üst katmandaki duvarların oluşturulmasını sağlar. Estetik veya işlevsel amaçlar için tasarlanmıştır, aşırı ekstrüzyon gibi sorunları gidermek için değildir."
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Alt yüzey deseni"
|
||||
|
||||
@@ -12288,6 +12332,16 @@ msgstr "Alt yüzey deseni"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "Köprü dolgusu değil, alt yüzey dolgusunun çizgi deseni."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Alt yüzey yoğunluğu"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Alt yüzey katmanının yoğunluğu. Estetik veya işlevsel amaçlar için tasarlanmıştır, aşırı ekstrüzyon gibi sorunları gidermek için değildir.\n"
|
||||
"UYARI: Bu değerin düşürülmesi, yatak yapışmasını olumsuz etkileyebilir."
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "İç katı dolgu deseni"
|
||||
|
||||
@@ -12585,18 +12639,6 @@ msgstr "Yıkama İçin Otomatik"
|
||||
msgid "Auto For Match"
|
||||
msgstr "Otomatik Maç İçin"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "Yıkama sıcaklığı"
|
||||
|
||||
@@ -12939,6 +12981,7 @@ msgstr "Dolgu deseni tarafından destekleniyorsa, dolgu deseni için birden fazl
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -13006,79 +13049,6 @@ msgstr "Tpms-fk"
|
||||
msgid "Gyroid"
|
||||
msgstr "Jiroid"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Kafes açısı 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "İlk 2 boyutlu kafes elemanları grubunun Z yönündeki açısı. Sıfır dikeydir."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Kafes açısı 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "İkinci 2 boyutlu kafes elemanları grubunun Z yönündeki açısı. Sıfır dikeydir."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Dolgu çıkıntı açısı"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "Dolgu açılı çizgilerinin açısı 60° ise saf petek görünümü elde edilir."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Dolgu uzunluğu"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Bir dolgu hattını, ek bir çevrenin kısa bir bölümü ile bir iç çevreye bağlayın. Yüzde olarak ifade edilirse (örnek: %15) dolgu ekstrüzyon genişliği üzerinden hesaplanır. Orca Slicer iki yakın dolgu hattını kısa bir çevre segmentine bağlamaya çalışıyor. infill_anchor_max'tan daha kısa böyle bir çevre segmenti bulunamazsa, dolgu hattı yalnızca bir taraftaki bir çevre segmentine bağlanır ve alınan çevre segmentinin uzunluğu bu parametreyle sınırlıdır, ancak çapa_uzunluk_max'tan uzun olamaz.\n"
|
||||
"Tek bir dolgu hattına bağlı sabitleme çevrelerini devre dışı bırakmak için bu parametreyi sıfıra ayarlayın."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (açık bağlantı yok)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (sınırsız)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Dolgu maksimum uzunluk"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Bir dolgu hattını, ek bir çevrenin kısa bir bölümü ile bir iç çevreye bağlayın. Yüzde olarak ifade edilirse (örnek: %15) dolgu ekstrüzyon genişliği üzerinden hesaplanır. Orca Slicer iki yakın dolgu hattını kısa bir çevre segmentine bağlamaya çalışıyor. Bu parametreden daha kısa bir çevre segmenti bulunamazsa, dolgu hattı sadece bir kenardaki bir çevre segmentine bağlanır ve alınan çevre segmentinin uzunluğu infill_anchor ile sınırlıdır ancak bu parametreden daha uzun olamaz.\n"
|
||||
"0'a ayarlanırsa dolgu bağlantısı için eski algoritma kullanılacaktır; 1000 ve 0 ile aynı sonucu oluşturmalıdır."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (Basit bağlantı)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "İç duvarların hızlandırılması."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Seyahat hareketlerinin hızlandırılması."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "Üst yüzey dolgusunun hızlandırılması. Daha düşük bir değerin kullanılması üst yüzey kalitesini iyileştirebilir."
|
||||
@@ -13087,11 +13057,8 @@ msgstr "Üst yüzey dolgusunun hızlandırılması. Daha düşük bir değerin k
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Dış duvarın hızlanması. Daha düşük bir değer kullanmak kaliteyi artırabilir."
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Köprülerin hızlandırılması. Değer yüzde olarak ifade edilirse (örn. %50), dış duvar ivmesine göre hesaplanacaktır."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² veya %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "İç duvarların hızlandırılması."
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Seyrek dolgunun hızlandırılması. Değer yüzde olarak ifade edilirse (örn. %100), varsayılan ivmeye göre hesaplanacaktır."
|
||||
@@ -13103,14 +13070,6 @@ msgstr "İç katı dolgunun hızlandırılması. Değer yüzde olarak ifade edil
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "Başlangıç katmanının hızlandırılması. Daha düşük bir değerin kullanılması baskı plakası yapışkanlığını iyileştirebilir."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "Accel_to_decel'i etkinleştir"
|
||||
|
||||
@@ -13205,6 +13164,17 @@ msgstr "Fan hızı, \"close_fan_the_first_x_layers\" katmanında sıfırdan \"fu
|
||||
msgid "layer"
|
||||
msgstr "katman"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "Destekler için fan hızı"
|
||||
|
||||
@@ -13726,6 +13696,73 @@ msgstr "Sondalama topaklanma alanını hariç tutar"
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "Sondalama, topaklanma alanını hariç tutar."
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Kafes açısı 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "İlk 2 boyutlu kafes elemanları grubunun Z yönündeki açısı. Sıfır dikeydir."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Kafes açısı 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "İkinci 2 boyutlu kafes elemanları grubunun Z yönündeki açısı. Sıfır dikeydir."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Dolgu çıkıntı açısı"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "Dolgu açılı çizgilerinin açısı 60° ise saf petek görünümü elde edilir."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Dolgu uzunluğu"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Bir dolgu hattını, ek bir çevrenin kısa bir bölümü ile bir iç çevreye bağlayın. Yüzde olarak ifade edilirse (örnek: %15) dolgu ekstrüzyon genişliği üzerinden hesaplanır. Orca Slicer iki yakın dolgu hattını kısa bir çevre segmentine bağlamaya çalışıyor. infill_anchor_max'tan daha kısa böyle bir çevre segmenti bulunamazsa, dolgu hattı yalnızca bir taraftaki bir çevre segmentine bağlanır ve alınan çevre segmentinin uzunluğu bu parametreyle sınırlıdır, ancak çapa_uzunluk_max'tan uzun olamaz.\n"
|
||||
"Tek bir dolgu hattına bağlı sabitleme çevrelerini devre dışı bırakmak için bu parametreyi sıfıra ayarlayın."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (açık bağlantı yok)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (sınırsız)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Dolgu maksimum uzunluk"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Bir dolgu hattını, ek bir çevrenin kısa bir bölümü ile bir iç çevreye bağlayın. Yüzde olarak ifade edilirse (örnek: %15) dolgu ekstrüzyon genişliği üzerinden hesaplanır. Orca Slicer iki yakın dolgu hattını kısa bir çevre segmentine bağlamaya çalışıyor. Bu parametreden daha kısa bir çevre segmenti bulunamazsa, dolgu hattı sadece bir kenardaki bir çevre segmentine bağlanır ve alınan çevre segmentinin uzunluğu infill_anchor ile sınırlıdır ancak bu parametreden daha uzun olamaz.\n"
|
||||
"0'a ayarlanırsa dolgu bağlantısı için eski algoritma kullanılacaktır; 1000 ve 0 ile aynı sonucu oluşturmalıdır."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (Basit bağlantı)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14591,6 +14628,18 @@ msgstr "Doğrudan Tahrik"
|
||||
msgid "Bowden"
|
||||
msgstr "Bowden"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Yeniden başlatma sırasında ekstra uzunluk"
|
||||
|
||||
@@ -15014,6 +15063,9 @@ msgstr "Üçgen mesh dilimleme sırasında 2x boşluk kapatma yarıçapından k
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Dilimleme modu"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Diğer"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "3DLabPrint uçak modelleri için \"Çift-tek\" seçeneğini kullanın. Modeldeki tüm delikleri kapatmak için \"Delikleri kapat\"ı kullanın."
|
||||
|
||||
@@ -15379,9 +15431,6 @@ msgstr ""
|
||||
"\n"
|
||||
"Bu seçenek, M191 ve M141 komutlarını makrolar aracılığıyla veya yerel olarak destekleyen bellenime dayanır ve genellikle aktif bir oda ısıtıcısı kurulduğunda kullanılır."
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Bölme sıcaklığı"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15395,6 +15444,17 @@ msgstr ""
|
||||
"\n"
|
||||
"Etkinleştirilirse, bu parametre aynı zamanda istenen oda sıcaklığını yazdırma başlatma makronuza veya şuna benzer bir ısı emme makrosuna iletmek için kullanılabilecek Chamber_temperature adlı bir gcode değişkenini de ayarlar: PRINT_START (diğer değişkenler) CHAMBER_TEMP=[chamber_temperature]. Yazıcınız M141/M191 komutlarını desteklemiyorsa veya aktif oda ısıtıcısı takılı değilse yazdırma başlatma makrosunda ısı bekletme işlemini gerçekleştirmek istiyorsanız bu yararlı olabilir."
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "İlk katmandan sonraki katmanlar için nozul sıcaklığı."
|
||||
@@ -15439,22 +15499,6 @@ msgstr "Üst katman kalınlığı"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "Üst kabuk katmanları tarafından hesaplanan kalınlık bu değerden daha ince ise dilimleme sırasında üst katı katmanların sayısı artırılır. Bu, katman yüksekliği küçük olduğunda kabuğun çok ince olmasını önleyebilir. 0, bu ayarın devre dışı olduğu ve üst kabuğun kalınlığının kesinlikle üst kabuk katmanları tarafından belirlendiği anlamına gelir."
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Üst yüzey yoğunluğu"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Üst yüzey katmanının yoğunluğu. %100 değeri, tamamen sağlam ve pürüzsüz bir üst katman oluşturur. Bu değerin düşürülmesi, seçilen üst yüzey desenine göre dokulu bir üst yüzey elde edilmesini sağlar. %0 değeri ise yalnızca üst katmandaki duvarların oluşturulmasını sağlar. Estetik veya işlevsel amaçlar için tasarlanmıştır, aşırı ekstrüzyon gibi sorunları gidermek için değildir."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Alt yüzey yoğunluğu"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Alt yüzey katmanının yoğunluğu. Estetik veya işlevsel amaçlar için tasarlanmıştır, aşırı ekstrüzyon gibi sorunları gidermek için değildir.\n"
|
||||
"UYARI: Bu değerin düşürülmesi, yatak yapışmasını olumsuz etkileyebilir."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Daha hızlı ve ekstrüzyonsuz seyahat hızı."
|
||||
@@ -18093,6 +18137,132 @@ msgstr "Giriş/Test"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "Yazdırma ana bilgisayarı aracılığıyla bağlanan yazıcılara bağlantı başarısız oldu."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -18175,6 +18345,19 @@ msgstr "MKS'ye bağlantı düzgün çalışıyor."
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "MKS'ye bağlanılamadı"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "OctoPrint'e bağlantı düzgün çalışıyor."
|
||||
|
||||
@@ -19331,6 +19514,36 @@ msgstr ""
|
||||
"Eğilmeyi önleyin\n"
|
||||
"ABS gibi bükülmeye yatkın malzemelere baskı yaparken, ısıtma yatağı sıcaklığının uygun şekilde arttırılmasının bükülme olasılığını azaltabileceğini biliyor muydunuz?"
|
||||
|
||||
#~ msgid "Filament Sync Options"
|
||||
#~ msgstr "Filament Senkronizasyon Seçenekleri"
|
||||
|
||||
#~ msgid "Network plug-in"
|
||||
#~ msgstr "Ağ eklentisi"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Kontrol ayarlarını görüntüle"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "Görüntüyü döndür"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "Pan Görünümü"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "Zoom Görünümü"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "Yakınlaştırma sırasında fare tekerleği ters dönüyor"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "Sol: %s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "Sağ: %s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "Ağ eklentisini etkinleştir"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: orcaslicerua\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: 2025-03-07 09:30+0200\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Ukrainian\n"
|
||||
@@ -1727,7 +1727,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "Починаючи з версії 2.4.0, OrcaSlicer синхронізує профілі користувача через Orca Cloud замість Bambu Cloud.\n\nЩоб перенести наявні профілі, увійдіть до Orca Cloud, і вони будуть перенесені автоматично. Щоб дізнатися більше про те, як OrcaSlicer зберігає та синхронізує ваші профілі, або щоб перенести свої шаблони вручну, перегляньте нашу вікі.\n\nЯкщо ви не використовували Bambu Cloud для синхронізації профілів, ця зміна вас не стосується, і ви можете сміливо проігнорувати це повідомлення."
|
||||
msgstr ""
|
||||
"Починаючи з версії 2.4.0, OrcaSlicer синхронізує профілі користувача через Orca Cloud замість Bambu Cloud.\n"
|
||||
"\n"
|
||||
"Щоб перенести наявні профілі, увійдіть до Orca Cloud, і вони будуть перенесені автоматично. Щоб дізнатися більше про те, як OrcaSlicer зберігає та синхронізує ваші профілі, або щоб перенести свої шаблони вручну, перегляньте нашу вікі.\n"
|
||||
"\n"
|
||||
"Якщо ви не використовували Bambu Cloud для синхронізації профілів, ця зміна вас не стосується, і ви можете сміливо проігнорувати це повідомлення."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4107,6 +4112,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "Поточна температура камери вища, ніж безпечна температура матеріалу, це може призвести до розм’якшення матеріалу та його забивання. Максимально безпечна температура для цього матеріалу становить %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7896,6 +7905,45 @@ msgstr ""
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "Виберіть каталог завантаження"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "Ассоціювати"
|
||||
|
||||
@@ -7951,12 +7999,6 @@ msgstr "Показувати заставку"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Показувати заставку під час запуску."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr ""
|
||||
|
||||
@@ -7987,6 +8029,13 @@ msgstr "Поведінка завантаження"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "Чи повинні бути завантажені налаштування принтера/філаменту/процесу при відкритті файлу .3mf?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Автобекап"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Періодично робіть резервну копію вашого проекту для відновлення після випадкового збою."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr ""
|
||||
|
||||
@@ -8005,12 +8054,17 @@ msgstr ""
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr ""
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "Автобекап"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Періодично робіть резервну копію вашого проекту для відновлення після випадкового збою."
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Шаблон"
|
||||
@@ -8042,6 +8096,12 @@ msgstr "філаменти"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Features"
|
||||
msgstr ""
|
||||
|
||||
@@ -8054,18 +8114,6 @@ msgstr "З цією опцією ввімкненою, ви можете від
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr ""
|
||||
|
||||
@@ -8293,19 +8341,6 @@ msgstr "Перевіряти лише стабільні оновлення"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Автоматична синхронізація користувацьких профілів (принтер/філамент/процес)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Оновлюйте вбудовані пресети автоматично."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr ""
|
||||
|
||||
@@ -8318,6 +8353,16 @@ msgstr ""
|
||||
msgid "Color only"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Оновлюйте вбудовані пресети автоматично."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8330,30 +8375,6 @@ msgstr ""
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Асоціювати файли з OrcaSlicer"
|
||||
|
||||
@@ -8402,7 +8423,16 @@ msgstr ""
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "Пропустити перевірку чорного списку AMS"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8410,12 +8440,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr ""
|
||||
|
||||
@@ -8442,24 +8466,6 @@ msgstr "налагодження"
|
||||
msgid "trace"
|
||||
msgstr "слід"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Debug"
|
||||
msgstr ""
|
||||
|
||||
@@ -8475,25 +8481,6 @@ msgstr "Синхронізація профілів"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Синхронізація налаштувань"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Перегляд параметрів керування"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "Повернути вигляд"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "Панорамний вигляд"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "Перегляд масштабу"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Інший"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "Колісок миші реверсує при масштабуванні"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "Увімкнути SSL (MQTT)"
|
||||
|
||||
@@ -9196,6 +9183,12 @@ msgstr "Видалити цей профіль"
|
||||
msgid "Search in preset"
|
||||
msgstr "Пошук у профілі"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Натисніть, щоб скинути всі налаштування до останньої збереженої попередньої установки."
|
||||
|
||||
@@ -9488,6 +9481,18 @@ msgstr "Коефіцієнт потоку та Випередження тиск
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "Температура в камері друку"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Температура в камері"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Температура друку"
|
||||
|
||||
@@ -9818,11 +9823,21 @@ msgid "Don't warn again for this preset"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
@@ -9843,7 +9858,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "Відкинути або зберегти зміни"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "Старе значення"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9965,6 +9980,12 @@ msgstr ""
|
||||
msgid "Capabilities"
|
||||
msgstr "Можливості"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Показувати всі профілі (включаючи несумісні)"
|
||||
|
||||
@@ -12058,6 +12079,23 @@ msgstr "Звичайний друк"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "Прискорення за умовчанням як для звичайного друку, так і для переміщення за виключенням першого шару"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Прискорення холостого руху"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "мм/с² або %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Прискорення мостів. Якщо значення виражено у відсотках (наприклад, 50%), воно розраховано з урахуванням прискорення зовнішнього периметра."
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Профіль стандартного філаменту"
|
||||
|
||||
@@ -12266,6 +12304,12 @@ msgstr "Хорди Архімеда"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "Спіральна октограма"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Шаблон нижньої поверхні"
|
||||
|
||||
@@ -12273,6 +12317,14 @@ msgstr "Шаблон нижньої поверхні"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "Шаблон ліній заповнення нижньої поверхні, крім заповнення мостів"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "Шаблон внутрішнього суцільного заповнення"
|
||||
|
||||
@@ -12574,18 +12626,6 @@ msgstr ""
|
||||
msgid "Auto For Match"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr ""
|
||||
|
||||
@@ -12923,6 +12963,7 @@ msgstr ""
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -12990,79 +13031,6 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr "Гіроїд"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Кут решітки 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Кут першого набору 2D-решіткових елементів у напрямку Z. Нуль означає вертикальне розташування."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Кут решітки 1"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Кут другого набору 2D-решіткових елементів у напрямку Z. Нуль означає вертикальне розташування."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Довжина прив’язки часткового заповнення"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"З'єднайте лінію заповнення з внутрішнім периметром із коротким сегментомдодаткового периметра. Якщо воно виражено у відсотках (наприклад, 15%), воно розраховується за шириною екструзії заповнення. Orca Slicer намагається з'єднати Дві близькі лінії заповнення з коротким сегментом периметра. Якщо такий сегмент периметра коротше infill_anchor_max не знайдено, лінія заповнення з'єднується з сегментом периметра лише з одного боку, і довжина взятого сегменту периметра обмежена цим параметром, але не більше anchor_length_max.\n"
|
||||
"Встановіть цей параметр рівним нулю, щоб вимкнути периметри прив'язки.пов'язані з однією лінією заповнення."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (немає відкритих прив'язок)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (необмежено)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Максимальна довжина прив’язки заповнення"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"З'єднайте лінію заповнення з внутрішнім периметром із коротким сегментомдодаткового периметра. Якщо воно виражено у відсотках (наприклад, 15%), воно розраховується за шириною екструзії заповнення. Orca Slicer намагається з'єднати Дві близькі лінії заповнення з коротким сегментом периметра. Якщо такий сегмент периметра коротший за цей параметр не знайдено, лінія заповнення з'єднується з сегментом периметра лише з одного боку, і довжина взятого сегмент периметра обмежений infill_anchor, але не довшим за цей параметр.\n"
|
||||
"Якщо встановлено значення 0, буде використано старий алгоритм для Підключення заповнення, він повинен створити той же результат, що і для 1000 & 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (просте підключення)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Прискорення внутрішніх периметрів"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Прискорення холостого руху"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "Прискорення заповнення верхньої поверхні. Використання меншого значенняможе покращити якість верхньої поверхні"
|
||||
@@ -13071,11 +13039,8 @@ msgstr "Прискорення заповнення верхньої повер
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Прискорення зовнішнього периметра. Використання меншого значення може поліпшити якість"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Прискорення мостів. Якщо значення виражено у відсотках (наприклад, 50%), воно розраховано з урахуванням прискорення зовнішнього периметра."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "мм/с² або %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Прискорення внутрішніх периметрів"
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Прискорення заповнення. Якщо значення виражено у відсотках (наприклад, 100%), воно буде розраховане на основі прискорення за умовчанням."
|
||||
@@ -13087,14 +13052,6 @@ msgstr "Прискорення заповнення внутрішнього т
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "Прискорення першого шару. Використання меншого значення може покращити прилипання до робочої пластини"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "Увімкнути прискорення до уповільнення"
|
||||
|
||||
@@ -13189,6 +13146,17 @@ msgstr "Швидкість вентилятора лінійно збільшу
|
||||
msgid "layer"
|
||||
msgstr "шар"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "Швидкість вентилятора під час друку підтримки"
|
||||
|
||||
@@ -13701,6 +13669,73 @@ msgstr ""
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Кут решітки 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Кут першого набору 2D-решіткових елементів у напрямку Z. Нуль означає вертикальне розташування."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Кут решітки 1"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Кут другого набору 2D-решіткових елементів у напрямку Z. Нуль означає вертикальне розташування."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Довжина прив’язки часткового заповнення"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"З'єднайте лінію заповнення з внутрішнім периметром із коротким сегментомдодаткового периметра. Якщо воно виражено у відсотках (наприклад, 15%), воно розраховується за шириною екструзії заповнення. Orca Slicer намагається з'єднати Дві близькі лінії заповнення з коротким сегментом периметра. Якщо такий сегмент периметра коротше infill_anchor_max не знайдено, лінія заповнення з'єднується з сегментом периметра лише з одного боку, і довжина взятого сегменту периметра обмежена цим параметром, але не більше anchor_length_max.\n"
|
||||
"Встановіть цей параметр рівним нулю, щоб вимкнути периметри прив'язки.пов'язані з однією лінією заповнення."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (немає відкритих прив'язок)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (необмежено)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Максимальна довжина прив’язки заповнення"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"З'єднайте лінію заповнення з внутрішнім периметром із коротким сегментомдодаткового периметра. Якщо воно виражено у відсотках (наприклад, 15%), воно розраховується за шириною екструзії заповнення. Orca Slicer намагається з'єднати Дві близькі лінії заповнення з коротким сегментом периметра. Якщо такий сегмент периметра коротший за цей параметр не знайдено, лінія заповнення з'єднується з сегментом периметра лише з одного боку, і довжина взятого сегмент периметра обмежений infill_anchor, але не довшим за цей параметр.\n"
|
||||
"Якщо встановлено значення 0, буде використано старий алгоритм для Підключення заповнення, він повинен створити той же результат, що і для 1000 & 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (просте підключення)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14570,6 +14605,18 @@ msgstr "Direct Drive"
|
||||
msgid "Bowden"
|
||||
msgstr "Боуден"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Додаткова довжина під час перезавантаження"
|
||||
|
||||
@@ -14997,6 +15044,9 @@ msgstr "Під час розрізання тріщини на трикутну
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Режим нарізки"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Інший"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "Використовуйте «парний-непарний» для моделей літаків 3DLabPrint. Використовуйте «Закрити отвори», щоб закрити всі отвори в моделі."
|
||||
|
||||
@@ -15355,9 +15405,6 @@ msgstr ""
|
||||
"\n"
|
||||
"Цей параметр залежить від підтримки команд M191 і M141 у мікропрограмі, як через макроси, так і нативно, і зазвичай використовується при встановленому активному нагрівачі камери."
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Температура в камері"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15373,6 +15420,17 @@ msgstr ""
|
||||
"PRINT_START (інші змінні) CHAMBER_TEMP=[chamber_temperature].\n"
|
||||
"Це може бути корисним, якщо ваш принтер не підтримує команди M141/M191 або якщо ви хочете керувати прогрівом камери у макросі запуску друку за відсутності активного нагрівача камери."
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "Температура сопла для шарів після першого"
|
||||
@@ -15418,20 +15476,6 @@ msgstr "Товщина верхньої оболонки"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "Кількість верхніх суцільних шарів збільшується при розрізанні, якщо товщина, обчислена шарами верхньої оболонки, тонша за це значення. Це дозволяє уникнути занадто тонкої оболонки при невеликій висоті шару. 0 означає, що це налаштування вимкнено і товщина верхньої оболонки повністюобмежена верхніми шарами оболонки"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Швидкість переміщення, яка є швидше і без екструзії"
|
||||
@@ -18037,6 +18081,132 @@ msgstr "Вхід/Тест"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "Не вдалося підключитися до принтерів, підключених через вузол друку."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -18119,6 +18289,19 @@ msgstr "З’єднання з MKS працює коректно."
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "Не вдалося підключитися до MKS"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "Підключення до OctoPrint працює правильно."
|
||||
|
||||
@@ -19275,6 +19458,22 @@ msgstr ""
|
||||
"Уникнення деформації\n"
|
||||
"Чи знаєте ви, що при друку матеріалами, схильними до деформації, такими як ABS, відповідне підвищення температури гарячого ліжка може зменшити ймовірність деформації?"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Перегляд параметрів керування"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "Повернути вигляд"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "Панорамний вигляд"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "Перегляд масштабу"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "Колісок миші реверсує при масштабуванні"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "Увімкнути мережевий плагін"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: 2025-10-02 17:43+0700\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: hainguyen.ts13@gmail.com\n"
|
||||
@@ -1718,7 +1718,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "Kể từ phiên bản 2.4.0, OrcaSlicer đồng bộ hồ sơ người dùng thông qua Orca Cloud thay vì Bambu Cloud.\n\nĐể di chuyển các hồ sơ hiện có của bạn, hãy đăng nhập vào Orca Cloud và chúng sẽ được chuyển tự động. Để tìm hiểu thêm về cách OrcaSlicer lưu trữ và đồng bộ hồ sơ của bạn, hoặc để di chuyển các cài đặt sẵn theo cách thủ công, hãy xem wiki của chúng tôi.\n\nNếu bạn không sử dụng Bambu Cloud để đồng bộ hồ sơ, thay đổi này không ảnh hưởng đến bạn và bạn có thể bỏ qua thông báo này."
|
||||
msgstr ""
|
||||
"Kể từ phiên bản 2.4.0, OrcaSlicer đồng bộ hồ sơ người dùng thông qua Orca Cloud thay vì Bambu Cloud.\n"
|
||||
"\n"
|
||||
"Để di chuyển các hồ sơ hiện có của bạn, hãy đăng nhập vào Orca Cloud và chúng sẽ được chuyển tự động. Để tìm hiểu thêm về cách OrcaSlicer lưu trữ và đồng bộ hồ sơ của bạn, hoặc để di chuyển các cài đặt sẵn theo cách thủ công, hãy xem wiki của chúng tôi.\n"
|
||||
"\n"
|
||||
"Nếu bạn không sử dụng Bambu Cloud để đồng bộ hồ sơ, thay đổi này không ảnh hưởng đến bạn và bạn có thể bỏ qua thông báo này."
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr ""
|
||||
@@ -4072,6 +4077,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "Nhiệt độ buồng hiện tại cao hơn nhiệt độ an toàn của vật liệu, điều này có thể dẫn đến vật liệu mềm và tắc nghẽn. Nhiệt độ an toàn tối đa cho vật liệu là %d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7835,6 +7844,45 @@ msgstr ""
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "Chọn thư mục tải xuống"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "Liên kết"
|
||||
|
||||
@@ -7889,12 +7937,6 @@ msgstr "Hiển thị màn hình khởi động"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "Hiển thị màn hình khởi động trong khi khởi động."
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr ""
|
||||
|
||||
@@ -7925,6 +7967,13 @@ msgstr ""
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "Có nên tải cài đặt máy in/filament/quy trình khi mở file 3MF?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Sao lưu dự án của bạn định kỳ để khôi phục từ sự cố thỉnh thoảng."
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "Số file gần đây tối đa"
|
||||
|
||||
@@ -7943,12 +7992,17 @@ msgstr ""
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "Nếu được bật, hộp thoại cài đặt tham số sẽ xuất hiện trong quá trình nhập file STEP."
|
||||
|
||||
msgid "Auto backup"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "Sao lưu dự án của bạn định kỳ để khôi phục từ sự cố thỉnh thoảng."
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "Cài đặt sẵn"
|
||||
@@ -7980,6 +8034,12 @@ msgstr ""
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Features"
|
||||
msgstr ""
|
||||
|
||||
@@ -7992,18 +8052,6 @@ msgstr "Với tùy chọn này được bật, bạn có thể gửi tác vụ
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr ""
|
||||
|
||||
msgid "bits"
|
||||
msgstr "bits"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr ""
|
||||
|
||||
@@ -8231,19 +8279,6 @@ msgstr "Chỉ kiểm tra cập nhật ổn định"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "Tự động đồng bộ preset người dùng (Máy in/Filament/Quy trình)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Cập nhật preset tích hợp tự động."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr ""
|
||||
|
||||
@@ -8256,6 +8291,16 @@ msgstr "Sợi và Màu sắc"
|
||||
msgid "Color only"
|
||||
msgstr "Chỉ màu"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "Cập nhật preset tích hợp tự động."
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -8268,30 +8313,6 @@ msgstr ""
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Liên kết file với OrcaSlicer"
|
||||
|
||||
@@ -8337,7 +8358,16 @@ msgstr ""
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "Bỏ qua kiểm tra danh sách đen AMS"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -8345,12 +8375,6 @@ msgid ""
|
||||
"Highly experimental! Slow and may create artifact."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr ""
|
||||
|
||||
@@ -8377,24 +8401,6 @@ msgstr "gỡ lỗi"
|
||||
msgid "trace"
|
||||
msgstr "theo dõi"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Debug"
|
||||
msgstr ""
|
||||
|
||||
@@ -8410,25 +8416,6 @@ msgstr "Đồng bộ preset"
|
||||
msgid "Preferences sync"
|
||||
msgstr "Đồng bộ tùy chọn"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "Cài đặt điều khiển chế độ xem"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "Xoay chế độ xem"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "Kéo chế độ xem"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "Thu phóng chế độ xem"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Khác"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "Con lăn chuột đảo ngược khi thu phóng"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "Bật SSL(MQTT)"
|
||||
|
||||
@@ -9131,6 +9118,12 @@ msgstr "Xóa preset này"
|
||||
msgid "Search in preset"
|
||||
msgstr "Tìm kiếm trong preset"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "Nhấp để đặt lại tất cả cài đặt về preset đã lưu cuối cùng."
|
||||
|
||||
@@ -9415,6 +9408,18 @@ msgstr "Tỷ lệ lưu lượng và áp suất nâng cao"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "Nhiệt độ buồng in"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Nhiệt độ buồng"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "Nhiệt độ in"
|
||||
|
||||
@@ -9735,11 +9740,21 @@ msgid "Don't warn again for this preset"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
@@ -9760,7 +9775,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "Chuyển hoặc loại bỏ thay đổi"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "Giá trị cũ"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9882,6 +9897,12 @@ msgstr "Số lượng đầu đùn"
|
||||
msgid "Capabilities"
|
||||
msgstr "Khả năng"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "Hiển thị tất cả preset (bao gồm cả không tương thích)"
|
||||
|
||||
@@ -11971,6 +11992,23 @@ msgstr "In bình thường"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "Gia tốc mặc định của cả in bình thường và di chuyển ngoại trừ lớp đầu tiên."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Gia tốc của di chuyển."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² hoặc %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Gia tốc của cầu. Nếu giá trị được biểu thị dưới dạng phần trăm (ví dụ 50%), nó sẽ được tính dựa trên gia tốc thành ngoài."
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "Hồ sơ filament mặc định"
|
||||
|
||||
@@ -12177,6 +12215,12 @@ msgstr "Dây cung Archimedes"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "Xoắn ốc bát giác"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Mật độ bề mặt trên"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Mật độ lớp bề mặt trên. Giá trị 100% tạo ra lớp trên hoàn toàn đặc, mịn . Giảm giá trị này dẫn đến bề mặt trên có kết cấu, theo mẫu bề mặt trên được chọn. Giá trị 0% sẽ dẫn đến chỉ thành trên lớp trên được tạo. Dành cho mục đích thẩm mỹ hoặc chức năng , không phải để sửa các vấn đề như đùn dư."
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "Mẫu bề mặt dưới"
|
||||
|
||||
@@ -12184,6 +12228,16 @@ msgstr "Mẫu bề mặt dưới"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "Mẫu đường của infill bề mặt dưới, không phải infill cầu."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Mật độ bề mặt dưới"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Mật độ lớp bề mặt dưới. Dành cho mục đích thẩm mỹ hoặc chức năng , không phải để sửa các vấn đề như đùn dư.\n"
|
||||
"CẢNH BÁO: Giảm giá trị này có thể ảnh hưởng tiêu cực đến độ bám dính bàn in."
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "Mẫu infill đặc bên trong"
|
||||
|
||||
@@ -12482,18 +12536,6 @@ msgstr ""
|
||||
msgid "Auto For Match"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr ""
|
||||
|
||||
@@ -12833,6 +12875,7 @@ msgstr "Sử dụng nhiều đường cho mẫu infill, nếu được hỗ tr
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr ""
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr ""
|
||||
|
||||
@@ -12900,79 +12943,6 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Góc lattice bên 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Góc của bộ phần tử lattice bên đầu tiên theo hướng Z. Không là dọc."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Góc lattice bên 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Góc của bộ phần tử lattice bên thứ hai theo hướng Z. Không là dọc."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Góc nhô infill"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "Góc của các đường infill góc. 60° sẽ tạo ra tổ ong thuần túy."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Độ dài neo infill thưa"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Kết nối đường infill với chu vi bên trong bằng một đoạn ngắn của chu vi bổ sung. Nếu được biểu thị dưới dạng phần trăm (ví dụ: 15%) nó được tính trên độ rộng đùn infill. Orca Slicer cố gắng kết nối hai đường infill gần với một đoạn chu vi ngắn. Nếu không tìm thấy đoạn chu vi ngắn hơn infill_anchor_max, đường infill được kết nối với đoạn chu vi chỉ ở một phía và độ dài của đoạn chu vi được lấy bị giới hạn ở tham số này, nhưng không dài hơn anchor_length_max.\n"
|
||||
"Đặt tham số này thành không để tắt neo chu vi được kết nối với một đường infill đơn."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (không có neo mở)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (không giới hạn)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Độ dài tối đa của neo infill"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Kết nối đường infill với chu vi bên trong bằng một đoạn ngắn của chu vi bổ sung. Nếu được biểu thị dưới dạng phần trăm (ví dụ: 15%) nó được tính trên độ rộng đùn infill. Orca Slicer cố gắng kết nối hai đường infill gần với một đoạn chu vi ngắn. Nếu không tìm thấy đoạn chu vi ngắn hơn tham số này, đường infill được kết nối với đoạn chu vi chỉ ở một phía và độ dài của đoạn chu vi được lấy bị giới hạn ở infill_anchor, nhưng không dài hơn tham số này.\n"
|
||||
"Nếu đặt thành 0, thuật toán cũ cho kết nối infill sẽ được sử dụng, nó nên tạo ra kết quả giống như với 1000 & 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (Kết nối đơn giản)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Gia tốc của thành trong."
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "Gia tốc của di chuyển."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "Gia tốc của infill bề mặt trên. Sử dụng giá trị thấp hơn có thể cải thiện chất lượng bề mặt trên."
|
||||
@@ -12981,11 +12951,8 @@ msgstr "Gia tốc của infill bề mặt trên. Sử dụng giá trị thấp h
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "Gia tốc của thành ngoài. Sử dụng giá trị thấp hơn có thể cải thiện chất lượng."
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "Gia tốc của cầu. Nếu giá trị được biểu thị dưới dạng phần trăm (ví dụ 50%), nó sẽ được tính dựa trên gia tốc thành ngoài."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² hoặc %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "Gia tốc của thành trong."
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "Gia tốc của infill thưa. Nếu giá trị được biểu thị dưới dạng phần trăm (ví dụ 100%), nó sẽ được tính dựa trên gia tốc mặc định."
|
||||
@@ -12997,14 +12964,6 @@ msgstr "Gia tốc của infill đặc bên trong. Nếu giá trị được bi
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "Gia tốc của lớp đầu tiên. Sử dụng giá trị thấp hơn có thể cải thiện độ bám dính bàn in."
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "Bật accel_to_decel"
|
||||
|
||||
@@ -13099,6 +13058,17 @@ msgstr "Tốc độ quạt sẽ được tăng tuyến tính từ không tại l
|
||||
msgid "layer"
|
||||
msgstr "lớp"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "Tốc độ quạt giao diện support"
|
||||
|
||||
@@ -13618,6 +13588,73 @@ msgstr ""
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr ""
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "Góc lattice bên 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Góc của bộ phần tử lattice bên đầu tiên theo hướng Z. Không là dọc."
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "Góc lattice bên 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Góc của bộ phần tử lattice bên thứ hai theo hướng Z. Không là dọc."
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "Góc nhô infill"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "Góc của các đường infill góc. 60° sẽ tạo ra tổ ong thuần túy."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Độ dài neo infill thưa"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"Kết nối đường infill với chu vi bên trong bằng một đoạn ngắn của chu vi bổ sung. Nếu được biểu thị dưới dạng phần trăm (ví dụ: 15%) nó được tính trên độ rộng đùn infill. Orca Slicer cố gắng kết nối hai đường infill gần với một đoạn chu vi ngắn. Nếu không tìm thấy đoạn chu vi ngắn hơn infill_anchor_max, đường infill được kết nối với đoạn chu vi chỉ ở một phía và độ dài của đoạn chu vi được lấy bị giới hạn ở tham số này, nhưng không dài hơn anchor_length_max.\n"
|
||||
"Đặt tham số này thành không để tắt neo chu vi được kết nối với một đường infill đơn."
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (không có neo mở)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000 (không giới hạn)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "Độ dài tối đa của neo infill"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr ""
|
||||
"Kết nối đường infill với chu vi bên trong bằng một đoạn ngắn của chu vi bổ sung. Nếu được biểu thị dưới dạng phần trăm (ví dụ: 15%) nó được tính trên độ rộng đùn infill. Orca Slicer cố gắng kết nối hai đường infill gần với một đoạn chu vi ngắn. Nếu không tìm thấy đoạn chu vi ngắn hơn tham số này, đường infill được kết nối với đoạn chu vi chỉ ở một phía và độ dài của đoạn chu vi được lấy bị giới hạn ở infill_anchor, nhưng không dài hơn tham số này.\n"
|
||||
"Nếu đặt thành 0, thuật toán cũ cho kết nối infill sẽ được sử dụng, nó nên tạo ra kết quả giống như với 1000 & 0."
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0 (Kết nối đơn giản)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14483,6 +14520,18 @@ msgstr "Direct Drive"
|
||||
msgid "Bowden"
|
||||
msgstr "Bowden"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr ""
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "Độ dài bổ sung khi khởi động lại"
|
||||
|
||||
@@ -14906,6 +14955,9 @@ msgstr "Vết nứt nhỏ hơn 2x bán kính đóng khe được lấp trong sli
|
||||
msgid "Slicing Mode"
|
||||
msgstr "Chế độ slice"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "Khác"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "Sử dụng \"Chẵn-lẻ\" cho model máy bay 3DLabPrint. Sử dụng \"Đóng lỗ\" để đóng tất cả các lỗ trong model."
|
||||
|
||||
@@ -15266,9 +15318,6 @@ msgstr ""
|
||||
"\n"
|
||||
"Tùy chọn này dựa vào firmware hỗ trợ lệnh M191 và M141 thông qua macro hoặc gốc và thường được sử dụng khi bộ sưởi buồng hoạt động được cài đặt."
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Nhiệt độ buồng"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15282,6 +15331,17 @@ msgstr ""
|
||||
"\n"
|
||||
"Nếu được bật, tham số này cũng đặt biến G-code có tên chamber_temperature, có thể được sử dụng để truyền nhiệt độ buồng mong muốn cho macro bắt đầu in của bạn, hoặc macro ngâm nhiệt như thế này: PRINT_START (các biến khác) CHAMBER_TEMP=[chamber_temperature]. Điều này có thể hữu ích nếu máy in của bạn không hỗ trợ lệnh M141/M191, hoặc nếu bạn muốn xử lý ngâm nhiệt trong macro bắt đầu in nếu không có bộ sưởi buồng hoạt động được cài đặt."
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "Nhiệt độ đầu phun cho các lớp sau lớp đầu tiên."
|
||||
@@ -15327,22 +15387,6 @@ msgstr "Độ dày vỏ trên"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "Số lượng lớp đặc trên được tăng lên khi slice nếu độ dày được tính bởi lớp vỏ trên mỏng hơn giá trị này. Điều này có thể tránh vỏ quá mỏng khi chiều cao lớp nhỏ. 0 có nghĩa là cài đặt này bị tắt và độ dày vỏ trên được xác định tuyệt đối bởi lớp vỏ trên."
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "Mật độ bề mặt trên"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "Mật độ lớp bề mặt trên. Giá trị 100% tạo ra lớp trên hoàn toàn đặc, mịn . Giảm giá trị này dẫn đến bề mặt trên có kết cấu, theo mẫu bề mặt trên được chọn. Giá trị 0% sẽ dẫn đến chỉ thành trên lớp trên được tạo. Dành cho mục đích thẩm mỹ hoặc chức năng , không phải để sửa các vấn đề như đùn dư."
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "Mật độ bề mặt dưới"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"Mật độ lớp bề mặt dưới. Dành cho mục đích thẩm mỹ hoặc chức năng , không phải để sửa các vấn đề như đùn dư.\n"
|
||||
"CẢNH BÁO: Giảm giá trị này có thể ảnh hưởng tiêu cực đến độ bám dính bàn in."
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "Tốc độ di chuyển nhanh hơn và không có đùn."
|
||||
@@ -17958,6 +18002,132 @@ msgstr "Đăng nhập/Kiểm tra"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "Kết nối với máy in được kết nối qua máy chủ in thất bại."
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr ""
|
||||
|
||||
@@ -18040,6 +18210,19 @@ msgstr "Kết nối với MKS hoạt động chính xác."
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "Không thể kết nối với MKS"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "Kết nối với OctoPrint hoạt động chính xác."
|
||||
|
||||
@@ -19196,6 +19379,22 @@ msgstr ""
|
||||
"Tránh cong vênh\n"
|
||||
"Bạn có biết rằng khi in vật liệu dễ cong vênh như ABS, tăng nhiệt độ bàn nóng một cách thích hợp có thể giảm xác suất cong vênh không?"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "Cài đặt điều khiển chế độ xem"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "Xoay chế độ xem"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "Kéo chế độ xem"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "Thu phóng chế độ xem"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "Con lăn chuột đảo ngược khi thu phóng"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "Bật plugin mạng"
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Slic3rPE\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: 2026-06-11 12:37-0300\n"
|
||||
"Last-Translator: Handle <mail@bysb.net>\n"
|
||||
"Language-Team: \n"
|
||||
@@ -1716,7 +1716,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "自 2.4.0 版本起,OrcaSlicer 通过 Orca Cloud(而非 Bambu Cloud)同步用户配置文件。\n\n要迁移您现有的配置文件,请登录 Orca Cloud,配置文件将被自动转移。若要进一步了解 OrcaSlicer 如何存储和同步您的配置文件,或手动迁移您的预设,请查看我们的 Wiki。\n\n如果您此前未使用 Bambu Cloud 同步配置文件,则此变更不会影响您,您可以放心忽略此消息。"
|
||||
msgstr ""
|
||||
"自 2.4.0 版本起,OrcaSlicer 通过 Orca Cloud(而非 Bambu Cloud)同步用户配置文件。\n"
|
||||
"\n"
|
||||
"要迁移您现有的配置文件,请登录 Orca Cloud,配置文件将被自动转移。若要进一步了解 OrcaSlicer 如何存储和同步您的配置文件,或手动迁移您的预设,请查看我们的 Wiki。\n"
|
||||
"\n"
|
||||
"如果您此前未使用 Bambu Cloud 同步配置文件,则此变更不会影响您,您可以放心忽略此消息。"
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr "配置文件同步方式变更"
|
||||
@@ -1757,7 +1762,10 @@ msgid ""
|
||||
"The Microsoft WebView2 Runtime could not be installed.\n"
|
||||
"Some features, including the setup wizard, may appear blank until it is installed.\n"
|
||||
"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer."
|
||||
msgstr "无法安装 Microsoft WebView2 运行库。\n在安装之前,包括设置向导在内的部分功能可能显示为空白。\n请从 https://developer.microsoft.com/microsoft-edge/webview2/ 手动安装,然后重启 Orca Slicer。"
|
||||
msgstr ""
|
||||
"无法安装 Microsoft WebView2 运行库。\n"
|
||||
"在安装之前,包括设置向导在内的部分功能可能显示为空白。\n"
|
||||
"请从 https://developer.microsoft.com/microsoft-edge/webview2/ 手动安装,然后重启 Orca Slicer。"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Resources path does not exist or is not a directory: %s"
|
||||
@@ -4095,6 +4103,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "当前腔体温度高于材料的安全温度,这可能导致材料软化和堵塞。该材料的最高安全温度为 %d。"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7854,6 +7866,45 @@ msgstr "选择下载项目的文件夹"
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "选择下载文件夹"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(最新的)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "网络插件切换成功。"
|
||||
|
||||
msgid "Success"
|
||||
msgstr "成功"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "无法加载网络插件。请重新启动应用程序。"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr "您已选择网络插件版本 %s。 您想立即下载并安装此版本吗? 注意:安装后应用程序可能需要重新启动。"
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "下载网络插件"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "重新加载网络插件而不重新启动应用程序"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "网络插件已成功重新加载。"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "重新加载"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "无法重新加载网络插件。请重新启动应用程序。"
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "重新加载失败"
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "相关的"
|
||||
|
||||
@@ -7909,12 +7960,6 @@ msgstr "显示启动画面"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "在启动时显示启动画面。"
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "显示共享配置文件通知"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "当所选打印机更改时,显示带有浏览共享配置文件链接的通知。"
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr "将窗口按钮置于左侧"
|
||||
|
||||
@@ -7945,6 +7990,13 @@ msgstr "加载 交互项"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "printter/filament/process 设置项文件能否以 .3mf后缀方式打开"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "自动备份"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "定期备份你的项目,以便从偶尔的崩溃中恢复过来。"
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "最大最近使用文件数"
|
||||
|
||||
@@ -7963,12 +8015,20 @@ msgstr "显示STEP网格参数设置对话框"
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "如果启用,在导入STEP文件时将出现参数设置对话框"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "自动备份"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Draco 导出的模型质量"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "定期备份你的项目,以便从偶尔的崩溃中恢复过来。"
|
||||
msgid "bits"
|
||||
msgstr "位"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"控制将网格压缩为 Draco 格式时使用的量化位深度。\n"
|
||||
"0 = 无损压缩(以全精度保留几何形状)。有效有损值范围为 8 到 30。\n"
|
||||
"较低的值会生成较小的文件,但会丢失更多的几何细节;较高的值可保留更多细节,但代价是文件较大。"
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "预设"
|
||||
@@ -8000,6 +8060,12 @@ msgstr "耗材丝"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr "根据选定的耗材丝数量优化耗材区域最大高度"
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "显示共享配置文件通知"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "当所选打印机更改时,显示带有浏览共享配置文件链接的通知。"
|
||||
|
||||
msgid "Features"
|
||||
msgstr "特性"
|
||||
|
||||
@@ -8012,21 +8078,6 @@ msgstr "启用此选项后,您可以同时向多个设备发送任务并管理
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "弹出选择耗材丝分组模式"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Draco 导出的模型质量"
|
||||
|
||||
msgid "bits"
|
||||
msgstr "位"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"控制将网格压缩为 Draco 格式时使用的量化位深度。\n"
|
||||
"0 = 无损压缩(以全精度保留几何形状)。有效有损值范围为 8 到 30。\n"
|
||||
"较低的值会生成较小的文件,但会丢失更多的几何细节;较高的值可保留更多细节,但代价是文件较大。"
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "行为"
|
||||
|
||||
@@ -8163,7 +8214,10 @@ msgid ""
|
||||
"Applies smooth normals to the realistic view.\n"
|
||||
"\n"
|
||||
"Requires manual scene reload to take effect (right-click on 3D view → \"Reload All\")."
|
||||
msgstr "在写实渲染中应用平滑法线。\n\n需要手动重新加载场景才能生效(在 3D 视图中右键单击 →“重新加载全部”)。"
|
||||
msgstr ""
|
||||
"在写实渲染中应用平滑法线。\n"
|
||||
"\n"
|
||||
"需要手动重新加载场景才能生效(在 3D 视图中右键单击 →“重新加载全部”)。"
|
||||
|
||||
msgid "Anti-aliasing"
|
||||
msgstr "抗锯齿"
|
||||
@@ -8268,19 +8322,6 @@ msgstr "仅检测正式版的更新"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "同步用户预设(打印机/耗材丝/工艺)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "自动更新系统预设"
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "使用加密文件进行令牌存储"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "将身份验证令牌存储在加密文件中,而不是系统钥匙串中。 (需要重启)"
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr "耗材丝同步选项"
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr "耗材丝同步模式"
|
||||
|
||||
@@ -8293,6 +8334,16 @@ msgstr "耗材丝及颜色"
|
||||
msgid "Color only"
|
||||
msgstr "仅颜色"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "自动更新系统预设"
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "使用加密文件进行令牌存储"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "将身份验证令牌存储在加密文件中,而不是系统钥匙串中。 (需要重启)"
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr "Bambu网络插件"
|
||||
|
||||
@@ -8305,30 +8356,6 @@ msgstr "网络插件版本"
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr "选择要使用的网络插件版本"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(最新的)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "网络插件切换成功。"
|
||||
|
||||
msgid "Success"
|
||||
msgstr "成功"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "无法加载网络插件。请重新启动应用程序。"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr "您已选择网络插件版本 %s。 您想立即下载并安装此版本吗? 注意:安装后应用程序可能需要重新启动。"
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "下载网络插件"
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "逆戟鲸切片器文件关联"
|
||||
|
||||
@@ -8374,8 +8401,17 @@ msgstr "开发者"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "跳过AMS黑名单检查"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgstr "(实验性) 在网格更改后保留绘制的特征"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr "显示不受支持的预设"
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr "在打印机和耗材下拉列表中显示不兼容/不受支持的预设。这些预设无法被选择。"
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Attempt to keep painted features (color/seam/support/fuzzy etc.) after changing the object mesh (such as cut/reload from disk/simplify/fix etc.)\n"
|
||||
@@ -8384,12 +8420,6 @@ msgstr ""
|
||||
"在更改对象网格(如切割/从磁盘重新加载/简化/修复等)后,尝试保留绘制的特征(颜色/接缝/支撑/绒毛等)。\n"
|
||||
"高度实验性!速度较慢且可能产生瑕疵。"
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr "显示不受支持的预设"
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr "在打印机和耗材下拉列表中显示不兼容/不受支持的预设。这些预设无法被选择。"
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "允许异常存储"
|
||||
|
||||
@@ -8418,24 +8448,6 @@ msgstr "调试"
|
||||
msgid "trace"
|
||||
msgstr "跟踪"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr "网络插件"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "重新加载"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "重新加载网络插件而不重新启动应用程序"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "网络插件已成功重新加载。"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "无法重新加载网络插件。请重新启动应用程序。"
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "重新加载失败"
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "调试"
|
||||
|
||||
@@ -8451,25 +8463,6 @@ msgstr "配置同步"
|
||||
msgid "Preferences sync"
|
||||
msgstr "首选项同步"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "视图控制设置"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "旋转视角"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "移动视角"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "缩放视角"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "其他"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "缩放时鼠标滚轮反转"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "启用SSL(MQTT)"
|
||||
|
||||
@@ -9176,6 +9169,12 @@ msgstr "删除此预设"
|
||||
msgid "Search in preset"
|
||||
msgstr "在预设中搜索"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "点击以将所有设置还原到最后一次保存的版本。"
|
||||
|
||||
@@ -9467,6 +9466,18 @@ msgstr "流量和压力提前"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "打印仓温度"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "机箱温度"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "打印温度"
|
||||
|
||||
@@ -9800,12 +9811,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr "不再为此预设警告"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "左:%s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "右:%s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "点击该图标,恢复到全局的配置数值,并与全局配置同步变化。"
|
||||
@@ -9825,7 +9846,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "放弃或保留更改"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "旧值"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -9958,6 +9979,12 @@ msgstr "挤出机数量"
|
||||
msgid "Capabilities"
|
||||
msgstr "能力"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "显示所有预设(包括不兼容的)"
|
||||
|
||||
@@ -11212,7 +11239,10 @@ msgid ""
|
||||
"Per-object skirts cannot fit between the objects in By object print sequence.\n"
|
||||
"\n"
|
||||
"Move the objects farther apart, reduce brim/skirt size, switch Skirt type to Combined, or switch Print sequence to By layer."
|
||||
msgstr "在“逐件”打印顺序下,物体之间无法容纳逐物体裙边。\n\n请增大物体之间的距离、减小 brim/裙边尺寸、将裙边类型切换为“组合”,或将打印顺序切换为“逐层”。"
|
||||
msgstr ""
|
||||
"在“逐件”打印顺序下,物体之间无法容纳逐物体裙边。\n"
|
||||
"\n"
|
||||
"请增大物体之间的距离、减小 brim/裙边尺寸、将裙边类型切换为“组合”,或将打印顺序切换为“逐层”。"
|
||||
|
||||
msgid "Exporting G-code"
|
||||
msgstr "正在导出G-code"
|
||||
@@ -12122,6 +12152,25 @@ msgstr "普通打印"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "除首层之外的默认的打印和空驶的加速度"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "空驶加速度"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "首层空驶"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"首层的空驶加速度。\n"
|
||||
"百分比值相对于空驶加速度。"
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² 或 %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "桥接加速度。如果该值以百分比(例如50%)表示,则将根据外墙加速度进行计算。"
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "默认耗材配置"
|
||||
|
||||
@@ -12334,6 +12383,15 @@ msgstr "阿基米德和弦"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "八角螺旋"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "顶面密度"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
"顶层表面的密度。\n"
|
||||
"100% 的值会创建一个完全实心、平滑的顶面。降低此值会根据所选的顶面图案生成有纹理的顶面。0% 的值将只生成顶层的墙。\n"
|
||||
"此选项仅为美观或功能性目的,而不是为了解决过量挤出等问题。"
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "底面图案"
|
||||
|
||||
@@ -12341,6 +12399,17 @@ msgstr "底面图案"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "除了桥接外的底面填充的走线图案"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "底面密度"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"底层表面的密度\n"
|
||||
"此功能是为了美观或功能性目的,而是为了解决过量挤出等问题。\n"
|
||||
"警告:降低此值会对热床粘接力产生负面影响。"
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "内部实心填充图案"
|
||||
|
||||
@@ -12552,7 +12621,9 @@ msgstr "为悬垂启用自适应压力提前(试验)"
|
||||
msgid ""
|
||||
"Enable adaptive PA for overhangs as well as when flow changes within the same feature. This is an experimental option, as if the PA profile is not set accurately, it will cause uniformity issues on the external surfaces before and after overhangs.\n"
|
||||
"Not compatible with Prusa printers as they pause to process PA changes, which causes delays and defects."
|
||||
msgstr "针对悬垂以及同一特征内的流量变化启用自适应 PA。这是一个实验性选项,因为如果未准确设置 PA 配置文件,将导致悬垂前后外表面出现均匀性问题。\n与 Prusa 打印机不兼容,因为它们会暂停以处理 PA 变化,从而导致延迟和瑕疵。"
|
||||
msgstr ""
|
||||
"针对悬垂以及同一特征内的流量变化启用自适应 PA。这是一个实验性选项,因为如果未准确设置 PA 配置文件,将导致悬垂前后外表面出现均匀性问题。\n"
|
||||
"与 Prusa 打印机不兼容,因为它们会暂停以处理 PA 变化,从而导致延迟和瑕疵。"
|
||||
|
||||
msgid "Pressure advance for bridges"
|
||||
msgstr "为搭桥启用压力提前"
|
||||
@@ -12632,18 +12703,6 @@ msgstr "自动冲洗"
|
||||
msgid "Auto For Match"
|
||||
msgstr "自动匹配"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "启用耗材动态映射"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "在打印期间启用动态耗材映射。"
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "具有耗材切换器"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "打印机具有耗材切换器硬件(例如 AMS)。"
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "冲洗温度"
|
||||
|
||||
@@ -13001,6 +13060,7 @@ msgstr "如果填充图案支持,使用多线进行填充。"
|
||||
msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr "Z 轴屈曲偏置优化(实验性)"
|
||||
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr "在低填充密度下沿 Z(垂直)轴收紧螺旋(Gyroid)波形,以缩短有效的垂直柱长,提升 Z 轴抗压屈曲能力。耗材用量保持不变。在约 30% 及以上的稀疏填充密度下无效果。仅当稀疏填充图案设置为 Gyroid 时适用。"
|
||||
|
||||
@@ -13068,77 +13128,6 @@ msgstr "TPMS-FK结构"
|
||||
msgid "Gyroid"
|
||||
msgstr "螺旋体"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "侧向晶格角度1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "第一组二维晶格单元在Z方向的角度。零表示垂直。"
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "侧向晶格角度2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "第二组二维晶格单元在Z方向的角度。零表示垂直。"
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "填充悬垂角度"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "填充倾斜线的角度。60°将产生纯蜂窝结构。"
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr "闪电悬垂角度"
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr "闪电填充支撑扩展的最大悬垂角度。"
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr "修剪角度"
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
"控制对短的或无支撑的闪电分支进行修剪的力度。\n"
|
||||
"此角度在内部会被转换为每层的距离。"
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr "拉直角度"
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr "用于简化闪电分支的最大拉直角度。"
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "稀疏填充锚线长度"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr "用附加周长的一小段将填充线连接到内部周长。如果以百分比(例如:15%)表示,则计算填充拉伸宽度。OrcaSlicer 试图将两条紧密的填充线连接到一个短的周长段。如果找不到短于“填充”和“锚点”最大值的周长线段,则填充线仅在一侧连接到周长线段,并且所取周长线段的长度仅限于此参数,但不超过“锚点长度”最大值。将此参数设置为零,以禁用连接到单个填充线的锚点周长。"
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (无锚线)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000(无限制)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "填充锚线的最大长度"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr "用附加周长的一小段将填充线连接到内部周长。如果以百分比(例如:15%)表示,则计算填充拉伸宽度。OrcaSlicer 试图将两条紧密的填充线连接到一个短的周长段。如果找不到比此参数短的周长线段,则填充线仅在一侧连接到周长线段,并且所采用的周长线段的长度仅限于 infl_anchor,但不超过此参数。将此参数设置为零以禁用锚点。"
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0(简单连接)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "内圈墙加速度,使用较低值可以改善质量。"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "空驶加速度"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "顶面填充的加速度。使用较低值可能会改善顶面质量"
|
||||
@@ -13147,11 +13136,8 @@ msgstr "顶面填充的加速度。使用较低值可能会改善顶面质量"
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "外墙加速度。使用较小的值可以提高质量。"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "桥接加速度。如果该值以百分比(例如50%)表示,则将根据外墙加速度进行计算。"
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² 或 %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "内圈墙加速度,使用较低值可以改善质量。"
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "稀疏填充的加速度。如果该值表示为百分比(例如100%),则将根据默认加速度进行计算。"
|
||||
@@ -13163,16 +13149,6 @@ msgstr "内部实心填充的加速度。如果该值以百分比表示(例如
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "首层加速度。使用较低值可以改善和打印板的粘接。"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "首层空驶"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"首层的空驶加速度。\n"
|
||||
"百分比值相对于空驶加速度。"
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "启用制动速度"
|
||||
|
||||
@@ -13275,6 +13251,17 @@ msgstr ""
|
||||
msgid "layer"
|
||||
msgstr "层"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "支撐接触面风扇"
|
||||
|
||||
@@ -13810,6 +13797,71 @@ msgstr "结块检测排除区域"
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "结块检测排除区域"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "侧向晶格角度1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "第一组二维晶格单元在Z方向的角度。零表示垂直。"
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "侧向晶格角度2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "第二组二维晶格单元在Z方向的角度。零表示垂直。"
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "填充悬垂角度"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "填充倾斜线的角度。60°将产生纯蜂窝结构。"
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr "闪电悬垂角度"
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr "闪电填充支撑扩展的最大悬垂角度。"
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr "修剪角度"
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
"控制对短的或无支撑的闪电分支进行修剪的力度。\n"
|
||||
"此角度在内部会被转换为每层的距离。"
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr "拉直角度"
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr "用于简化闪电分支的最大拉直角度。"
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "稀疏填充锚线长度"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr "用附加周长的一小段将填充线连接到内部周长。如果以百分比(例如:15%)表示,则计算填充拉伸宽度。OrcaSlicer 试图将两条紧密的填充线连接到一个短的周长段。如果找不到短于“填充”和“锚点”最大值的周长线段,则填充线仅在一侧连接到周长线段,并且所取周长线段的长度仅限于此参数,但不超过“锚点长度”最大值。将此参数设置为零,以禁用连接到单个填充线的锚点周长。"
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0 (无锚线)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000(无限制)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "填充锚线的最大长度"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr "用附加周长的一小段将填充线连接到内部周长。如果以百分比(例如:15%)表示,则计算填充拉伸宽度。OrcaSlicer 试图将两条紧密的填充线连接到一个短的周长段。如果找不到比此参数短的周长线段,则填充线仅在一侧连接到周长线段,并且所采用的周长线段的长度仅限于 infl_anchor,但不超过此参数。将此参数设置为零以禁用锚点。"
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0(简单连接)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14701,6 +14753,18 @@ msgstr "直驱(近程)"
|
||||
msgid "Bowden"
|
||||
msgstr "远程挤出机"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "启用耗材动态映射"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "在打印期间启用动态耗材映射。"
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "具有耗材切换器"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "打印机具有耗材切换器硬件(例如 AMS)。"
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "额外回填长度"
|
||||
|
||||
@@ -15132,6 +15196,9 @@ msgstr "在三角形网格切片过程中,小于2倍间隙闭合半径的裂
|
||||
msgid "Slicing Mode"
|
||||
msgstr "切片模式"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "其他"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "对3DLabPrint的飞机模型使用 \"奇偶\"。使用 \"闭孔 \"来关闭模型上的所有孔。"
|
||||
|
||||
@@ -15499,9 +15566,6 @@ msgid ""
|
||||
"This option relies on the firmware supporting the M191 and M141 commands either via macros or natively and is usually used when an active chamber heater is installed."
|
||||
msgstr "启用此选项可实现自动室温度控制。该选项激活在“machine_start_gcode”之前发出 M191 命令 它设置腔室温度并等待达到该温度。此外,它还会在打印结束时发出 M141 命令以关闭腔室加热器(如果有)。 此选项依赖于通过宏或本机支持 M191 和 M141 命令的固件,通常在安装主动室加热器时使用。"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "机箱温度"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15510,6 +15574,17 @@ msgid ""
|
||||
"If enabled, this parameter also sets a G-code variable named chamber_temperature, which can be used to pass the desired chamber temperature to your print start macro, or a heat soak macro like this: PRINT_START (other variables) CHAMBER_TEMP=[chamber_temperature]. This may be useful if your printer does not support M141/M191 commands, or if you desire to handle heat soaking in the print start macro if no active chamber heater is installed."
|
||||
msgstr "对于 ABS、ASA、PC 和 PA 等高温材料,较高的腔室温度有助于抑制或减少翘曲,并有可能提高层间粘合强度。但同时,较高的腔室温度会降低 ABS 和 ASA 的空气过滤效率。 对于 PLA、PETG、TPU、PVA 等低温材料,应禁用此选项(设置为 0),因为腔室温度应较低,以避免热断时材料软化导致挤出机堵塞。 如果启用,此参数还会设置一个名为 chamber_temple 的 G-code 变量,该变量可用于将所需的腔室温度传递给打印启动宏,或热浸宏,如下所示:PRINT_START(其他变量)CHAMBER_TEMP=[chamber_Temperature]。如果您的打印机不支持 M141/M191 命令,或者如果您希望在未安装活动室加热器的情况下在打印启动宏中处理热浸,则这可能很有用。"
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "除首层外的其它层的喷嘴温度"
|
||||
@@ -15554,26 +15629,6 @@ msgstr "顶部壳体厚度"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "如果由顶部壳体层数算出的厚度小于这个数值,那么切片时将自动增加顶部壳体层数。这能够避免当层高很小时,顶部壳体过薄。0 表示关闭这个设置,同时顶部壳体的厚度完全由顶部壳体层数决定"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "顶面密度"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr ""
|
||||
"顶层表面的密度。\n"
|
||||
"100% 的值会创建一个完全实心、平滑的顶面。降低此值会根据所选的顶面图案生成有纹理的顶面。0% 的值将只生成顶层的墙。\n"
|
||||
"此选项仅为美观或功能性目的,而不是为了解决过量挤出等问题。"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "底面密度"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"底层表面的密度\n"
|
||||
"此功能是为了美观或功能性目的,而是为了解决过量挤出等问题。\n"
|
||||
"警告:降低此值会对热床粘接力产生负面影响。"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "空驶的速度。空驶是无挤出量的快速移动。"
|
||||
@@ -18214,6 +18269,132 @@ msgstr "登录/测试"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "无法通过打印机主机连接到打印机。"
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr "3DPrinterOS 云上传选项"
|
||||
|
||||
@@ -18296,6 +18477,19 @@ msgstr "与 MKS 的连接正常。"
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "无法连接到 MKS。"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "成功连接到 OctoPrint。"
|
||||
|
||||
@@ -19454,6 +19648,39 @@ msgstr ""
|
||||
"避免翘曲\n"
|
||||
"您知道吗?打印ABS这类易翘曲材料时,适当提高热床温度可以降低翘曲的概率。"
|
||||
|
||||
#~ msgid "Filament Sync Options"
|
||||
#~ msgstr "耗材丝同步选项"
|
||||
|
||||
#~ msgid "(Experimental) Keep painted feature after mesh change"
|
||||
#~ msgstr "(实验性) 在网格更改后保留绘制的特征"
|
||||
|
||||
#~ msgid "Network plug-in"
|
||||
#~ msgstr "网络插件"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "视图控制设置"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "旋转视角"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "移动视角"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "缩放视角"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "缩放时鼠标滚轮反转"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "左:%s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "右:%s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "启用网络插件"
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-26 10:26+0800\n"
|
||||
"POT-Creation-Date: 2026-07-03 14:43+0200\n"
|
||||
"PO-Revision-Date: 2025-11-28 13:48-0600\n"
|
||||
"Last-Translator: tntchn <15895303+tntchn@users.noreply.github.com>\n"
|
||||
"Language-Team: \n"
|
||||
@@ -1718,7 +1718,12 @@ msgid ""
|
||||
"To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. To learn more about how OrcaSlicer stores and syncs your profiles, or to migrate your presets manually, check out our wiki.\n"
|
||||
"\n"
|
||||
"If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."
|
||||
msgstr "自 2.4.0 版本起,OrcaSlicer 透過 Orca Cloud(而非 Bambu Cloud)同步使用者設定檔。\n\n若要移轉您現有的設定檔,請登入 Orca Cloud,設定檔將會自動轉移。若要進一步了解 OrcaSlicer 如何儲存與同步您的設定檔,或手動移轉您的預設,請參閱我們的 wiki。\n\n若您先前並未使用 Bambu Cloud 同步設定檔,則此變更不會影響您,您可以放心忽略此訊息。"
|
||||
msgstr ""
|
||||
"自 2.4.0 版本起,OrcaSlicer 透過 Orca Cloud(而非 Bambu Cloud)同步使用者設定檔。\n"
|
||||
"\n"
|
||||
"若要移轉您現有的設定檔,請登入 Orca Cloud,設定檔將會自動轉移。若要進一步了解 OrcaSlicer 如何儲存與同步您的設定檔,或手動移轉您的預設,請參閱我們的 wiki。\n"
|
||||
"\n"
|
||||
"若您先前並未使用 Bambu Cloud 同步設定檔,則此變更不會影響您,您可以放心忽略此訊息。"
|
||||
|
||||
msgid "Profile syncing change"
|
||||
msgstr "設定檔同步方式變更"
|
||||
@@ -1757,7 +1762,10 @@ msgid ""
|
||||
"The Microsoft WebView2 Runtime could not be installed.\n"
|
||||
"Some features, including the setup wizard, may appear blank until it is installed.\n"
|
||||
"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer."
|
||||
msgstr "無法安裝 Microsoft WebView2 Runtime。\n在安裝完成前,包括設定精靈在內的部分功能可能顯示為空白。\n請從 https://developer.microsoft.com/microsoft-edge/webview2/ 手動安裝,然後重新啟動 Orca Slicer。"
|
||||
msgstr ""
|
||||
"無法安裝 Microsoft WebView2 Runtime。\n"
|
||||
"在安裝完成前,包括設定精靈在內的部分功能可能顯示為空白。\n"
|
||||
"請從 https://developer.microsoft.com/microsoft-edge/webview2/ 手動安裝,然後重新啟動 Orca Slicer。"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Resources path does not exist or is not a directory: %s"
|
||||
@@ -4114,6 +4122,10 @@ msgstr ""
|
||||
msgid "Current chamber temperature is higher than the material's safe temperature; this may result in material softening and nozzle clogs. The maximum safe temperature for the material is %d"
|
||||
msgstr "目前列印設備內部溫度高於線材的安全溫度,可能會導致線材軟化和堵塞。線材的最高安全溫度為:%d"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid ""
|
||||
"Layer height too small\n"
|
||||
@@ -7911,6 +7923,50 @@ msgstr "選擇下載項目的目標資料夾"
|
||||
msgid "Choose Download Directory"
|
||||
msgstr "選擇下載資料夾"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(最新版)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "網路外掛程式切換成功。"
|
||||
|
||||
msgid "Success"
|
||||
msgstr "成功"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "無法載入網路外掛程式。請重新啟動應用程式。"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"您已選擇網路外掛程式版本 %s。\n"
|
||||
"\n"
|
||||
"您想立即下載並安裝此版本嗎?\n"
|
||||
"\n"
|
||||
"注意:安裝後應用程式可能需要重新啟動。"
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "下載網路外掛程式"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "重新載入網路外掛程式而無需重新啟動應用程式"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "網路外掛程式重新載入成功。"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "重新載入"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "無法重新載入網路外掛程式。請重新啟動應用程式。"
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "重新載入失敗"
|
||||
|
||||
msgid "Associate"
|
||||
msgstr "關聯"
|
||||
|
||||
@@ -7966,12 +8022,6 @@ msgstr "顯示啟動動畫"
|
||||
msgid "Show the splash screen during startup."
|
||||
msgstr "啟動時顯示啟動動畫。"
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "顯示共用設定檔通知"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "變更所選列印設備時,顯示一則含有瀏覽共享設定檔連結的通知。"
|
||||
|
||||
msgid "Use window buttons on left side"
|
||||
msgstr "將視窗按鈕置於左側"
|
||||
|
||||
@@ -8002,6 +8052,13 @@ msgstr "載入方式"
|
||||
msgid "Should printer/filament/process settings be loaded when opening a 3MF file?"
|
||||
msgstr "開啟 .3mf 檔案時,是否需要載入列印設備、線材和參數設定?"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "自動備份"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "定期備份專案,以便從未預期的錯誤中恢復。"
|
||||
|
||||
msgid "Maximum recent files"
|
||||
msgstr "最近開啟的檔案上限"
|
||||
|
||||
@@ -8020,12 +8077,20 @@ msgstr "顯示 STEP 網格參數設定視窗。"
|
||||
msgid "If enabled, a parameter settings dialog will appear during STEP file import."
|
||||
msgstr "啟用後,匯入 STEP 檔案時會顯示參數設定視窗。"
|
||||
|
||||
msgid "Auto backup"
|
||||
msgstr "自動備份"
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Draco 匯出品質等級"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Backup your project periodically to help with restoring from an occasional crash."
|
||||
msgstr "定期備份專案,以便從未預期的錯誤中恢復。"
|
||||
msgid "bits"
|
||||
msgstr "位元"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"控制將網格壓縮為 Draco 格式時使用的量化位元深度。\n"
|
||||
"0 = 無損壓縮(幾何資料以完整精度保留)。有效的有損值範圍為 8 至 30。\n"
|
||||
"較低的值會產生較小的檔案但損失更多幾何細節;較高的值會保留更多細節但檔案較大。"
|
||||
|
||||
msgid "Preset"
|
||||
msgstr "預設"
|
||||
@@ -8057,6 +8122,12 @@ msgstr "線材"
|
||||
msgid "Optimizes filament area maximum height by chosen filament count."
|
||||
msgstr "根據選擇的線材數量優化線材區域最大高度"
|
||||
|
||||
msgid "Show shared profiles notification"
|
||||
msgstr "顯示共用設定檔通知"
|
||||
|
||||
msgid "Show a notification with a link to browse shared profiles when the selected printer is changed."
|
||||
msgstr "變更所選列印設備時,顯示一則含有瀏覽共享設定檔連結的通知。"
|
||||
|
||||
msgid "Features"
|
||||
msgstr "功能"
|
||||
|
||||
@@ -8069,21 +8140,6 @@ msgstr "啟用時可以同時傳送到並管理多個機臺。"
|
||||
msgid "Pop up to select filament grouping mode"
|
||||
msgstr "彈出視窗選擇線材分組模式"
|
||||
|
||||
msgid "Quality level for Draco export"
|
||||
msgstr "Draco 匯出品質等級"
|
||||
|
||||
msgid "bits"
|
||||
msgstr "位元"
|
||||
|
||||
msgid ""
|
||||
"Controls the quantization bit depth used when compressing the mesh to Draco format.\n"
|
||||
"0 = lossless compression (geometry is preserved at full precision). Valid lossy values range from 8 to 30.\n"
|
||||
"Lower values produce smaller files but lose more geometric detail; higher values preserve more detail at the cost of larger files."
|
||||
msgstr ""
|
||||
"控制將網格壓縮為 Draco 格式時使用的量化位元深度。\n"
|
||||
"0 = 無損壓縮(幾何資料以完整精度保留)。有效的有損值範圍為 8 至 30。\n"
|
||||
"較低的值會產生較小的檔案但損失更多幾何細節;較高的值會保留更多細節但檔案較大。"
|
||||
|
||||
msgid "Behaviour"
|
||||
msgstr "行為"
|
||||
|
||||
@@ -8220,7 +8276,10 @@ msgid ""
|
||||
"Applies smooth normals to the realistic view.\n"
|
||||
"\n"
|
||||
"Requires manual scene reload to take effect (right-click on 3D view → \"Reload All\")."
|
||||
msgstr "將平滑法線套用至擬真檢視。\n\n需要手動重新載入場景才能生效(在 3D 檢視中按一下滑鼠右鍵 →「重新載入所有物件」)。"
|
||||
msgstr ""
|
||||
"將平滑法線套用至擬真檢視。\n"
|
||||
"\n"
|
||||
"需要手動重新載入場景才能生效(在 3D 檢視中按一下滑鼠右鍵 →「重新載入所有物件」)。"
|
||||
|
||||
msgid "Anti-aliasing"
|
||||
msgstr "抗鋸齒"
|
||||
@@ -8325,19 +8384,6 @@ msgstr "僅檢查穩定版更新"
|
||||
msgid "Auto sync user presets (Printer/Filament/Process)"
|
||||
msgstr "自動同步使用者預設(列印設備/線材/列印品質參數)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "自動更新系統預設。"
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "使用加密檔案儲存權杖"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "將身份驗證權杖儲存在加密檔案中,而不是系統鑰匙圈。(需要重啟)"
|
||||
|
||||
msgid "Filament Sync Options"
|
||||
msgstr "線材同步選項"
|
||||
|
||||
msgid "Filament sync mode"
|
||||
msgstr "線材同步模式"
|
||||
|
||||
@@ -8350,6 +8396,16 @@ msgstr "線材與顏色"
|
||||
msgid "Color only"
|
||||
msgstr "僅顏色"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Update built-in presets automatically."
|
||||
msgstr "自動更新系統預設。"
|
||||
|
||||
msgid "Use encrypted file for token storage"
|
||||
msgstr "使用加密檔案儲存權杖"
|
||||
|
||||
msgid "Store authentication tokens in an encrypted file instead of the system keychain. (Requires restart)"
|
||||
msgstr "將身份驗證權杖儲存在加密檔案中,而不是系統鑰匙圈。(需要重啟)"
|
||||
|
||||
msgid "Bambu network plug-in"
|
||||
msgstr "Bambu 網路外掛程式"
|
||||
|
||||
@@ -8362,35 +8418,6 @@ msgstr "網路外掛程式版本"
|
||||
msgid "Select the network plug-in version to use"
|
||||
msgstr "選擇要使用的網路外掛程式版本"
|
||||
|
||||
msgid "(Latest)"
|
||||
msgstr "(最新版)"
|
||||
|
||||
msgid "Network plug-in switched successfully."
|
||||
msgstr "網路外掛程式切換成功。"
|
||||
|
||||
msgid "Success"
|
||||
msgstr "成功"
|
||||
|
||||
msgid "Failed to load network plug-in. Please restart the application."
|
||||
msgstr "無法載入網路外掛程式。請重新啟動應用程式。"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"You've selected network plug-in version %s.\n"
|
||||
"\n"
|
||||
"Would you like to download and install this version now?\n"
|
||||
"\n"
|
||||
"Note: The application may need to restart after installation."
|
||||
msgstr ""
|
||||
"您已選擇網路外掛程式版本 %s。\n"
|
||||
"\n"
|
||||
"您想立即下載並安裝此版本嗎?\n"
|
||||
"\n"
|
||||
"注意:安裝後應用程式可能需要重新啟動。"
|
||||
|
||||
msgid "Download Network Plug-in"
|
||||
msgstr "下載網路外掛程式"
|
||||
|
||||
msgid "Associate files to OrcaSlicer"
|
||||
msgstr "Orca Slicer 檔案關聯"
|
||||
|
||||
@@ -8436,8 +8463,17 @@ msgstr "開發者"
|
||||
msgid "Skip AMS blacklist check"
|
||||
msgstr "跳過 AMS 黑名單檢查"
|
||||
|
||||
msgid "(Experimental) Keep painted feature after mesh change"
|
||||
msgstr "(實驗性)在網格變更後保留繪製的特徵"
|
||||
msgid "Show unsupported presets"
|
||||
msgstr "顯示不支援的預設"
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr "在列印設備和線材下拉選單中顯示不相容/不支援的預設。這些預設無法選取。"
|
||||
|
||||
msgid "Experimental Features"
|
||||
msgstr ""
|
||||
|
||||
msgid "Keep painted feature after mesh change"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Attempt to keep painted features (color/seam/support/fuzzy etc.) after changing the object mesh (such as cut/reload from disk/simplify/fix etc.)\n"
|
||||
@@ -8446,12 +8482,6 @@ msgstr ""
|
||||
"嘗試在變更物件網格(例如切割/從磁碟重新載入/簡化/修復等)後,保留已繪製的特徵(顏色/Z 縫/支撐/絨毛等)。\n"
|
||||
"高度實驗性!速度緩慢且可能產生瑕疵。"
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr "顯示不支援的預設"
|
||||
|
||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||
msgstr "在列印設備和線材下拉選單中顯示不相容/不支援的預設。這些預設無法選取。"
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "允許異常儲存空間"
|
||||
|
||||
@@ -8480,24 +8510,6 @@ msgstr "除錯"
|
||||
msgid "trace"
|
||||
msgstr "跟蹤"
|
||||
|
||||
msgid "Network plug-in"
|
||||
msgstr "網路外掛程式"
|
||||
|
||||
msgid "Reload"
|
||||
msgstr "重新載入"
|
||||
|
||||
msgid "Reload the network plug-in without restarting the application"
|
||||
msgstr "重新載入網路外掛程式而無需重新啟動應用程式"
|
||||
|
||||
msgid "Network plug-in reloaded successfully."
|
||||
msgstr "網路外掛程式重新載入成功。"
|
||||
|
||||
msgid "Failed to reload network plug-in. Please restart the application."
|
||||
msgstr "無法重新載入網路外掛程式。請重新啟動應用程式。"
|
||||
|
||||
msgid "Reload Failed"
|
||||
msgstr "重新載入失敗"
|
||||
|
||||
msgid "Debug"
|
||||
msgstr "除錯"
|
||||
|
||||
@@ -8513,25 +8525,6 @@ msgstr "預設檔同步"
|
||||
msgid "Preferences sync"
|
||||
msgstr "偏好設定同步"
|
||||
|
||||
msgid "View control settings"
|
||||
msgstr "視角控制設定"
|
||||
|
||||
msgid "Rotate view"
|
||||
msgstr "旋轉視角"
|
||||
|
||||
msgid "Pan view"
|
||||
msgstr "移動視角"
|
||||
|
||||
msgid "Zoom view"
|
||||
msgstr "縮放視角"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "其他"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Reverse scroll direction while zooming"
|
||||
msgstr "縮放時滑鼠滾輪反轉"
|
||||
|
||||
msgid "Enable SSL(MQTT)"
|
||||
msgstr "啟用SSL(MQTT)"
|
||||
|
||||
@@ -9240,6 +9233,12 @@ msgstr "刪除此預設"
|
||||
msgid "Search in preset"
|
||||
msgstr "在預設中搜尋"
|
||||
|
||||
msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset all settings to the last saved preset."
|
||||
msgstr "點擊以將所有設定還原到最後一次儲存的版本。"
|
||||
|
||||
@@ -9529,6 +9528,18 @@ msgstr "流量比與壓力補償"
|
||||
msgid "Print chamber temperature"
|
||||
msgstr "列印設備內部溫度"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "列印設備內部溫度"
|
||||
|
||||
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
|
||||
msgstr ""
|
||||
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
msgid "Minimal"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print temperature"
|
||||
msgstr "列印溫度"
|
||||
|
||||
@@ -9862,12 +9873,22 @@ msgid "Don't warn again for this preset"
|
||||
msgstr "不再為此預設顯示警告"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Left: %s"
|
||||
msgstr "左:%s"
|
||||
msgid "%s: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "No modifications need to be copied."
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy paramters"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Right: %s"
|
||||
msgstr "右:%s"
|
||||
msgid "Modify paramters of %s"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Do you want to modify the following parameters of the %s to that of the %s?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click to reset current value and attach to the global value."
|
||||
msgstr "點擊該圖示,恢復到全域的設定數值,並與全域設定同步變化。"
|
||||
@@ -9887,7 +9908,7 @@ msgid "Transfer or discard changes"
|
||||
msgstr "放棄或保留更改"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Old value"
|
||||
msgid "Old Value"
|
||||
msgstr "舊值"
|
||||
|
||||
msgid "New Value"
|
||||
@@ -10020,6 +10041,12 @@ msgstr "擠出機數量"
|
||||
msgid "Capabilities"
|
||||
msgstr "能力"
|
||||
|
||||
msgid "Left: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Right: "
|
||||
msgstr ""
|
||||
|
||||
msgid "Show all presets (including incompatible)"
|
||||
msgstr "顯示所有預設(包括不相容的)"
|
||||
|
||||
@@ -11273,7 +11300,10 @@ msgid ""
|
||||
"Per-object skirts cannot fit between the objects in By object print sequence.\n"
|
||||
"\n"
|
||||
"Move the objects farther apart, reduce brim/skirt size, switch Skirt type to Combined, or switch Print sequence to By layer."
|
||||
msgstr "在「逐件」列印順序下,物件之間無法容納各別物件的 Skirt。\n\n請加大物件之間的距離、縮小 Brim/Skirt 尺寸、將 Skirt 類型切換為「合併」,或將列印順序切換為「逐層」。"
|
||||
msgstr ""
|
||||
"在「逐件」列印順序下,物件之間無法容納各別物件的 Skirt。\n"
|
||||
"\n"
|
||||
"請加大物件之間的距離、縮小 Brim/Skirt 尺寸、將 Skirt 類型切換為「合併」,或將列印順序切換為「逐層」。"
|
||||
|
||||
msgid "Exporting G-code"
|
||||
msgstr "正在匯出 G-code"
|
||||
@@ -12192,6 +12222,25 @@ msgstr "普通列印"
|
||||
msgid "This is the default acceleration for both normal printing and travel after the first layer."
|
||||
msgstr "除首層之外的預設的列印和空駛的加速度"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "空駛加速度"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "首層空駛"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"首層的空駛加速度。\n"
|
||||
"百分比數值是相對於空駛加速度。"
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² 或 %"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "橋接加速度。 如果該值以百分比表示(例如 50%),則將根據外牆加速度進行計算。"
|
||||
|
||||
msgid "Default filament profile"
|
||||
msgstr "預設線材設定檔"
|
||||
|
||||
@@ -12404,6 +12453,12 @@ msgstr "阿基米德和弦"
|
||||
msgid "Octagram Spiral"
|
||||
msgstr "八角螺旋"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "頂面密度"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "頂面層的密度。100% 將建立完全實心且平滑的頂層。降低此數值會根據所選的頂面圖案產生紋理表面。0% 則只會建立頂層的牆體。此功能旨在實現美觀或功能需求,而非修正過擠等問題"
|
||||
|
||||
msgid "Bottom surface pattern"
|
||||
msgstr "底面圖案"
|
||||
|
||||
@@ -12411,6 +12466,16 @@ msgstr "底面圖案"
|
||||
msgid "This is the line pattern of bottom surface infill, not including bridge infill."
|
||||
msgstr "除了橋接外的底面填充的走線圖案"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "底面密度"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"底面層的密度。此功能旨在實現美觀或功能需求,而非修正過擠等問題。\n"
|
||||
"警告:降低此數值可能會對熱床附著力產生負面影響"
|
||||
|
||||
msgid "Internal solid infill pattern"
|
||||
msgstr "內部實心填充圖案"
|
||||
|
||||
@@ -12624,7 +12689,9 @@ msgstr "啟用懸挑自適應壓力補償 (beta)"
|
||||
msgid ""
|
||||
"Enable adaptive PA for overhangs as well as when flow changes within the same feature. This is an experimental option, as if the PA profile is not set accurately, it will cause uniformity issues on the external surfaces before and after overhangs.\n"
|
||||
"Not compatible with Prusa printers as they pause to process PA changes, which causes delays and defects."
|
||||
msgstr "針對懸空以及同一特徵內的流量變化啟用自適應壓力補償 (PA)。這是一個實驗性選項,因為若 PA 設定檔設定不準確,將會導致懸空前後的外表面出現均勻性問題。\n與 Prusa 印表機不相容,因為它們會暫停以處理 PA 變更,進而導致延遲與瑕疵。"
|
||||
msgstr ""
|
||||
"針對懸空以及同一特徵內的流量變化啟用自適應壓力補償 (PA)。這是一個實驗性選項,因為若 PA 設定檔設定不準確,將會導致懸空前後的外表面出現均勻性問題。\n"
|
||||
"與 Prusa 印表機不相容,因為它們會暫停以處理 PA 變更,進而導致延遲與瑕疵。"
|
||||
|
||||
msgid "Pressure advance for bridges"
|
||||
msgstr "橋接的壓力補償"
|
||||
@@ -12704,18 +12771,6 @@ msgstr "自動清理"
|
||||
msgid "Auto For Match"
|
||||
msgstr "自動匹配"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "啟用線材動態映射"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "在列印期間啟用動態線材映射。"
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "具有線材切換器"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "列印設備具有線材切換硬體(例如 AMS)。"
|
||||
|
||||
msgid "Flush temperature"
|
||||
msgstr "清理溫度"
|
||||
|
||||
@@ -13060,7 +13115,7 @@ msgid "Z-buckling bias optimization (experimental)"
|
||||
msgstr "Z 軸挫曲偏置最佳化(實驗性)"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#, fuzzy
|
||||
#, no-c-format, no-boost-format
|
||||
msgid "Tightens the gyroid wave along the Z (vertical) axis at low infill density to shorten the effective vertical column length and improve Z-axis compression buckling resistance. Filament use is preserved. No effect at ~30% sparse infill density and above. Only applies when Sparse infill pattern is set to Gyroid."
|
||||
msgstr "在低填充密度時,沿 Z(垂直)軸收緊螺旋體波形,以縮短有效垂直柱長度並提升 Z 軸抗壓挫曲能力。線材用量維持不變。在約 30% 稀疏填充密度及以上時無效果。僅在稀疏填充圖案設為螺旋體時適用。"
|
||||
|
||||
@@ -13128,79 +13183,6 @@ msgstr "TPMS-FK結構"
|
||||
msgid "Gyroid"
|
||||
msgstr "螺旋體"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "網格結構角度 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Z 軸方向第一組 2D 網格結構的角度,0° 表示垂直方向。"
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "網格結構角度 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Z 軸方向第二組 2D 網格結構的角度,0° 表示垂直方向。"
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "填充懸空角度"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "填充傾斜線的角度。60° 將產生純蜂窩結構。"
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr "閃電懸空角度"
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr "閃電填充支撐傳播的最大懸空角度。"
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr "修剪角度"
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
"控制短的或無支撐的閃電分支被修剪的積極程度。\n"
|
||||
"此角度會在內部轉換為每層的距離。"
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr "矯直角度"
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr "用於簡化閃電分支的最大拉直角度。"
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "稀疏填充錨線長度"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"將填充線透過一小段額外的牆與內牆連接。如果以百分比形式設定(如 15%),此數值是基於填充擠出寬度進行計算。Orca Slicer 會嘗試將兩條靠近的填充線連接到一段較短的牆。如果沒有找到比 infill_anchor_max 更短的牆,則填充線會只連接到一側的牆,且該段的長度受此參數限制,但不會超過 anchor_length_max。 \n"
|
||||
"將此參數設為 0 可停用單條填充線與牆的錨接功能。"
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0(無錨線)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000(無限制)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "填充錨線的最大長度"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr "將填充線透過一小段額外的牆與內牆連接。如果以百分比形式設定(如 15%),此數值是基於填充擠出寬度進行計算。Orca Slicer 會嘗試將兩條靠近的填充線連接到一段較短的牆。如果沒有找到短於此參數的牆,則填充線會只連接到單側牆,且該牆的長度受 infill_anchor 限制,但不會超過此參數的設定值。若此參數設定為 0,將啟用舊版填充連接算法,並產生與設置為 1000 和 0 相同的結果。"
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0(簡單連接)"
|
||||
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "內牆加速度,使用較低值可以改善列印品質"
|
||||
|
||||
msgid "Acceleration of travel moves."
|
||||
msgstr "空駛加速度"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||
msgstr "頂面填充的加速度。使用較低值可能會改善頂面列印品質"
|
||||
@@ -13209,11 +13191,8 @@ msgstr "頂面填充的加速度。使用較低值可能會改善頂面列印品
|
||||
msgid "Acceleration of outer wall: using a lower value can improve quality."
|
||||
msgstr "外牆加速度。使用較小的值可以提高列印品質"
|
||||
|
||||
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr "橋接加速度。 如果該值以百分比表示(例如 50%),則將根據外牆加速度進行計算。"
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² 或 %"
|
||||
msgid "Acceleration of inner walls."
|
||||
msgstr "內牆加速度,使用較低值可以改善列印品質"
|
||||
|
||||
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr "稀疏填充的加速度。如果該值表示為百分比(例如 100%),則將根據預設加速度進行計算。"
|
||||
@@ -13225,16 +13204,6 @@ msgstr "內部實心填充加速度。 如果該值以百分比表示(例如 1
|
||||
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
|
||||
msgstr "首層加速度。使用較低值可以改善和列印板的黏附"
|
||||
|
||||
msgid "First layer travel"
|
||||
msgstr "首層空駛"
|
||||
|
||||
msgid ""
|
||||
"Travel acceleration of first layer.\n"
|
||||
"The percentage value is relative to Travel Acceleration."
|
||||
msgstr ""
|
||||
"首層的空駛加速度。\n"
|
||||
"百分比數值是相對於空駛加速度。"
|
||||
|
||||
msgid "Enable accel_to_decel"
|
||||
msgstr "啟用煞車速度"
|
||||
|
||||
@@ -13331,6 +13300,17 @@ msgstr "風扇速度會從第「close_fan_the_first_x_layers」層開始,從
|
||||
msgid "layer"
|
||||
msgstr "層"
|
||||
|
||||
msgid "First layer fan speed"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\n"
|
||||
"From the second layer onwards, normal cooling resumes.\n"
|
||||
"If \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\n"
|
||||
"Only available when \"No cooling for the first\" is 0.\n"
|
||||
"Set to -1 to disable it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Support interface fan speed"
|
||||
msgstr "支撐界面風扇速度"
|
||||
|
||||
@@ -13868,6 +13848,73 @@ msgstr "結塊檢測排除區域"
|
||||
msgid "Probing exclude area of clumping."
|
||||
msgstr "結塊檢測排除區域"
|
||||
|
||||
msgid "Lateral lattice angle 1"
|
||||
msgstr "網格結構角度 1"
|
||||
|
||||
msgid "The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Z 軸方向第一組 2D 網格結構的角度,0° 表示垂直方向。"
|
||||
|
||||
msgid "Lateral lattice angle 2"
|
||||
msgstr "網格結構角度 2"
|
||||
|
||||
msgid "The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical."
|
||||
msgstr "Z 軸方向第二組 2D 網格結構的角度,0° 表示垂直方向。"
|
||||
|
||||
msgid "Infill overhang angle"
|
||||
msgstr "填充懸空角度"
|
||||
|
||||
msgid "The angle of the infill angled lines. 60° will result in a pure honeycomb."
|
||||
msgstr "填充傾斜線的角度。60° 將產生純蜂窩結構。"
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr "閃電懸空角度"
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr "閃電填充支撐傳播的最大懸空角度。"
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr "修剪角度"
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
"控制短的或無支撐的閃電分支被修剪的積極程度。\n"
|
||||
"此角度會在內部轉換為每層的距離。"
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr "矯直角度"
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr "用於簡化閃電分支的最大拉直角度。"
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "稀疏填充錨線長度"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
|
||||
"Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
|
||||
msgstr ""
|
||||
"將填充線透過一小段額外的牆與內牆連接。如果以百分比形式設定(如 15%),此數值是基於填充擠出寬度進行計算。Orca Slicer 會嘗試將兩條靠近的填充線連接到一段較短的牆。如果沒有找到比 infill_anchor_max 更短的牆,則填充線會只連接到一側的牆,且該段的長度受此參數限制,但不會超過 anchor_length_max。 \n"
|
||||
"將此參數設為 0 可停用單條填充線與牆的錨接功能。"
|
||||
|
||||
msgid "0 (no open anchors)"
|
||||
msgstr "0(無錨線)"
|
||||
|
||||
msgid "1000 (unlimited)"
|
||||
msgstr "1000(無限制)"
|
||||
|
||||
msgid "Maximum length of the infill anchor"
|
||||
msgstr "填充錨線的最大長度"
|
||||
|
||||
msgid ""
|
||||
"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
|
||||
"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0."
|
||||
msgstr "將填充線透過一小段額外的牆與內牆連接。如果以百分比形式設定(如 15%),此數值是基於填充擠出寬度進行計算。Orca Slicer 會嘗試將兩條靠近的填充線連接到一段較短的牆。如果沒有找到短於此參數的牆,則填充線會只連接到單側牆,且該牆的長度受 infill_anchor 限制,但不會超過此參數的設定值。若此參數設定為 0,將啟用舊版填充連接算法,並產生與設置為 1000 和 0 相同的結果。"
|
||||
|
||||
msgid "0 (Simple connect)"
|
||||
msgstr "0(簡單連接)"
|
||||
|
||||
msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
@@ -14767,6 +14814,18 @@ msgstr "直驅(近程)"
|
||||
msgid "Bowden"
|
||||
msgstr "遠程擠出機"
|
||||
|
||||
msgid "Enable filament dynamic map"
|
||||
msgstr "啟用線材動態映射"
|
||||
|
||||
msgid "Enable dynamic filament mapping during print."
|
||||
msgstr "在列印期間啟用動態線材映射。"
|
||||
|
||||
msgid "Has filament switcher"
|
||||
msgstr "具有線材切換器"
|
||||
|
||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
||||
msgstr "列印設備具有線材切換硬體(例如 AMS)。"
|
||||
|
||||
msgid "Extra length on restart"
|
||||
msgstr "額外回填長度"
|
||||
|
||||
@@ -15187,6 +15246,9 @@ msgstr "在三角網格切片過程中,寬度小於 2 倍間隙閉合半徑的
|
||||
msgid "Slicing Mode"
|
||||
msgstr "切片模式"
|
||||
|
||||
msgid "Other"
|
||||
msgstr "其他"
|
||||
|
||||
msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."
|
||||
msgstr "針對 3DLabPrint 飛機模型,請選擇『奇偶』模式。若需閉合模型中的所有孔洞,請啟用『閉合孔洞』選項。"
|
||||
|
||||
@@ -15552,9 +15614,6 @@ msgid ""
|
||||
"This option relies on the firmware supporting the M191 and M141 commands either via macros or natively and is usually used when an active chamber heater is installed."
|
||||
msgstr "啟用此選項後,將自動控制機箱溫度。此功能會在執行『machine_start_gcode』之前發送 M191 指令,用於設定機箱溫度並等待達到設定值。此外,在列印結束時會傳送 M141 指令以關閉機箱加熱器(若設備有加熱器)。此功能需要韌體原生支援或通過宏指令支援 M191 和 M141 指令,通常用於配備主動機箱加熱器的列印設備。"
|
||||
|
||||
msgid "Chamber temperature"
|
||||
msgstr "列印設備內部溫度"
|
||||
|
||||
msgid ""
|
||||
"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n"
|
||||
"\n"
|
||||
@@ -15563,6 +15622,17 @@ msgid ""
|
||||
"If enabled, this parameter also sets a G-code variable named chamber_temperature, which can be used to pass the desired chamber temperature to your print start macro, or a heat soak macro like this: PRINT_START (other variables) CHAMBER_TEMP=[chamber_temperature]. This may be useful if your printer does not support M141/M191 commands, or if you desire to handle heat soaking in the print start macro if no active chamber heater is installed."
|
||||
msgstr "對於 ABS、ASA、PC 和 PA 等高溫材料,較高的機箱溫度能有效抑制或減少翹曲,並可能提升層間結合強度。然而,較高的機箱溫度也會降低 ABS 和 ASA 的空氣過濾效率。對於 PLA、PETG、TPU、PVA 和其他低溫材料,建議將此選項停用(設為 0),因機箱溫度應保持較低,以避免因材料在熱端軟化而導致擠出機堵塞。啟用此選項後,會設置一個名為 chamber_temperature 的 G-code 變數,可用於將所需的機箱溫度傳遞給列印開始宏,或像以下的熱浸泡宏(預熱):PRINT_START (其他變數) CHAMBER_TEMP=[chamber_temperature]。這對於不支援 M141/M191 指令的列印設備,或者希望在列印開始宏中處理熱浸泡(預熱)但未安裝主動機箱加熱器的情況下非常實用。"
|
||||
|
||||
msgid ""
|
||||
"This is the chamber temperature at which printing should start, while the chamber continues heating toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n"
|
||||
"\n"
|
||||
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n"
|
||||
"\n"
|
||||
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes the value to your custom G-code. It should not exceed the \"Target\" chamber temperature."
|
||||
msgstr ""
|
||||
|
||||
msgid "Chamber minimal temperature"
|
||||
msgstr ""
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "Nozzle temperature after the first layer"
|
||||
msgstr "除首層外的其它層的噴嘴溫度"
|
||||
@@ -15607,22 +15677,6 @@ msgstr "頂部外殼厚度"
|
||||
msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers."
|
||||
msgstr "當切片時,如果通過頂部殼層計算的厚度小於設定值,將自動增加頂部實心層的數量,以避免層高較小時頂部殼層過薄。若設為 0,則停用此功能,頂部殼層厚度完全由設定的頂部殼層數決定"
|
||||
|
||||
msgid "Top surface density"
|
||||
msgstr "頂面密度"
|
||||
|
||||
msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion."
|
||||
msgstr "頂面層的密度。100% 將建立完全實心且平滑的頂層。降低此數值會根據所選的頂面圖案產生紋理表面。0% 則只會建立頂層的牆體。此功能旨在實現美觀或功能需求,而非修正過擠等問題"
|
||||
|
||||
msgid "Bottom surface density"
|
||||
msgstr "底面密度"
|
||||
|
||||
msgid ""
|
||||
"Density of the bottom surface layer. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
|
||||
"WARNING: Lowering this value may negatively affect bed adhesion."
|
||||
msgstr ""
|
||||
"底面層的密度。此功能旨在實現美觀或功能需求,而非修正過擠等問題。\n"
|
||||
"警告:降低此數值可能會對熱床附著力產生負面影響"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
msgid "This is the speed at which traveling is done."
|
||||
msgstr "空駛的速度。空駛是無擠出量的快速移動"
|
||||
@@ -18263,6 +18317,132 @@ msgstr "登入/測試"
|
||||
msgid "Connection to printers connected via the print host failed."
|
||||
msgstr "經由列印主機連接的列印設備連接失敗。"
|
||||
|
||||
msgid "Detect Creality K-series printer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Click Scan to look for K-series printers on your network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use Selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scanning the LAN for K-series printers... this takes a few seconds."
|
||||
msgstr ""
|
||||
|
||||
msgid "No K-series printers found. Make sure the printer is on the same network and not blocked by Wi-Fi client isolation, then click Scan again."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid "Found %zu Creality printer(s). Select one and click Use Selected."
|
||||
msgstr ""
|
||||
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Processes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show/Hide system information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy system information to clipboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||
msgstr ""
|
||||
|
||||
msgid "Report issue"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cleans and rebuilds system profiles cache on next launch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean system profiles cache"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clean"
|
||||
msgstr ""
|
||||
|
||||
msgid "Loaded profiles overview"
|
||||
msgstr ""
|
||||
|
||||
msgid "This section shows information for loaded profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports detailed overview of loaded profiles in json format"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Opens configurations folder"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stored logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Packs all stored logs onto a zip file."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project"
|
||||
msgstr ""
|
||||
|
||||
msgid "No project file on current session. Only logs will be included to package"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select NO to close dialog and review project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please make sure any instances of OrcaSlicer are not running"
|
||||
msgstr ""
|
||||
|
||||
msgid "System folder cannot be deleted because some files are in use by another application. Please close any applications using these files and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to delete system folder..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to determine executable path."
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to launch a new instance."
|
||||
msgstr ""
|
||||
|
||||
msgid "log(s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Export failed\n"
|
||||
"Please check write permissions or file in use by another application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose where to save the exported ZIP file"
|
||||
msgstr ""
|
||||
|
||||
msgid "File already exists. Overwrite?"
|
||||
msgstr ""
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr "3DPrinterOS 雲端上傳選項"
|
||||
|
||||
@@ -18345,6 +18525,19 @@ msgstr "成功連接到 MKS。"
|
||||
msgid "Could not connect to MKS"
|
||||
msgstr "無法連接到 MKS"
|
||||
|
||||
msgid "Connection to Moonraker is working correctly."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Moonraker"
|
||||
msgstr ""
|
||||
|
||||
msgid "The host responded but it doesn't look like Moonraker (missing result.klippy_state)."
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Could not parse Moonraker server response: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connection to OctoPrint is working correctly."
|
||||
msgstr "與 OctoPrint 的連接工作正常。"
|
||||
|
||||
@@ -19526,6 +19719,39 @@ msgstr ""
|
||||
"您知道嗎?當列印容易翹曲的材料(如 ABS)時,適當提高熱床溫度\n"
|
||||
"可以降低翹曲的機率。"
|
||||
|
||||
#~ msgid "Filament Sync Options"
|
||||
#~ msgstr "線材同步選項"
|
||||
|
||||
#~ msgid "(Experimental) Keep painted feature after mesh change"
|
||||
#~ msgstr "(實驗性)在網格變更後保留繪製的特徵"
|
||||
|
||||
#~ msgid "Network plug-in"
|
||||
#~ msgstr "網路外掛程式"
|
||||
|
||||
#~ msgid "View control settings"
|
||||
#~ msgstr "視角控制設定"
|
||||
|
||||
#~ msgid "Rotate view"
|
||||
#~ msgstr "旋轉視角"
|
||||
|
||||
#~ msgid "Pan view"
|
||||
#~ msgstr "移動視角"
|
||||
|
||||
#~ msgid "Zoom view"
|
||||
#~ msgstr "縮放視角"
|
||||
|
||||
# TODO: Review, changed by lang refactor. PR 14254
|
||||
#~ msgid "Reverse scroll direction while zooming"
|
||||
#~ msgstr "縮放時滑鼠滾輪反轉"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Left: %s"
|
||||
#~ msgstr "左:%s"
|
||||
|
||||
#, c-format, boost-format
|
||||
#~ msgid "Right: %s"
|
||||
#~ msgstr "右:%s"
|
||||
|
||||
#~ msgid "Enable network plug-in"
|
||||
#~ msgstr "啟用網路外掛程式"
|
||||
|
||||
|
||||
3
resources/images/extruder_sync.svg
Normal file
3
resources/images/extruder_sync.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.2992 1.42627C10.7774 1.42627 8.73315 3.47056 8.73315 5.99231C8.73315 8.51406 10.7774 10.5583 13.2992 10.5583C13.3609 10.5583 13.4223 10.5571 13.4834 10.5547C15.9197 10.4581 17.8652 8.45238 17.8652 5.99231C17.8652 3.47056 15.8209 1.42627 13.2992 1.42627ZM15.6185 11.0536C17.5346 10.1741 18.8652 8.23861 18.8652 5.99231C18.8652 2.91827 16.3732 0.42627 13.2992 0.42627C11.5793 0.42627 10.0417 1.2063 9.02067 2.43188H2.31853C1.93193 2.43188 1.61853 2.74528 1.61853 3.13188V12.4712C1.61853 12.6313 1.6723 12.7789 1.76278 12.8968C1.76671 13.0046 1.79621 13.1144 1.85576 13.2185L3.48408 16.0649C3.60875 16.2829 3.8406 16.4173 4.09168 16.4173H6.75859L7.97903 19.1586C8.22556 19.7123 9.01148 19.7123 9.25801 19.1586L10.4784 16.4173H13.1454C13.3965 16.4173 13.6283 16.2829 13.753 16.0649L15.3813 13.2185C15.4409 13.1144 15.4704 13.0046 15.4743 12.8968C15.5648 12.7789 15.6185 12.6313 15.6185 12.4712V11.0536ZM13.4429 11.5565C13.8469 11.5463 14.2403 11.493 14.6185 11.4011V12.1709H2.61853V3.43188H8.35573C7.95792 4.19837 7.73315 5.06909 7.73315 5.99231C7.73315 9.06635 10.2252 11.5583 13.2992 11.5583C13.3472 11.5583 13.3951 11.5577 13.4429 11.5565ZM2.98076 13.1712H14.2563L12.9714 15.4173H9.85194L9.84578 15.4173H7.39126L7.3851 15.4173H4.26569L2.98076 13.1712ZM9.38381 16.4173L8.61852 18.1363L7.85322 16.4173H9.38381ZM12.2021 3.36422C12.3973 3.55948 12.3973 3.87606 12.2021 4.07133L11.743 4.53041H16.0625C16.3386 4.53041 16.5625 4.75426 16.5625 5.03041C16.5625 5.30655 16.3386 5.53041 16.0625 5.53041H10.7773C10.2428 5.53041 9.97507 4.88412 10.353 4.50614L11.495 3.36422C11.6902 3.16896 12.0068 3.16896 12.2021 3.36422ZM14.3963 7.91305C14.2011 8.10831 14.2011 8.42489 14.3963 8.62015C14.5916 8.81542 14.9082 8.81542 15.1034 8.62015L16.2453 7.47823C16.6233 7.10026 16.3556 6.45397 15.8211 6.45397L10.5359 6.45397C10.2597 6.45397 10.0359 6.67783 10.0359 6.95397C10.0359 7.23011 10.2597 7.45397 10.5359 7.45397L14.8554 7.45397L14.3963 7.91305Z" fill="#262E30"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
8
resources/images/param_add.svg
Normal file
8
resources/images/param_add.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<svg width="25" height="25" xmlns="http://www.w3.org/2000/svg" fill="none">
|
||||
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path id="svg_1" stroke-linecap="round" stroke-width="2" stroke="#262E30" d="m1,12.5l23,0"/>
|
||||
<path id="svg_2" stroke-linecap="round" stroke-width="2" stroke="#262E30" d="m12.5,24l0,-23"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 312 B |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Afinia",
|
||||
"version": "02.04.00.00",
|
||||
"version": "02.04.00.01",
|
||||
"force_update": "0",
|
||||
"description": "Afinia configurations",
|
||||
"machine_model_list": [
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user