Compare commits
321 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ee6b85605a | |||
| 045cfed6a7 | |||
| 5f60d78658 | |||
| 646eb97eaf | |||
| 2cf8df2ef6 | |||
| 0096e694dd | |||
| c29bd18190 | |||
| 8e9e270027 | |||
| 1b927421f6 | |||
| 8d22b3a41a | |||
| edcf02c0d4 | |||
| b85d5a665c | |||
| a232df7751 | |||
| 4757c3cee6 | |||
| 736f334301 | |||
| e721004f62 | |||
| 88d87729d4 | |||
| c7597ea66f | |||
| f3389c3af7 | |||
| a0a52f6657 | |||
| cc9787f80e | |||
| 8e80d98610 | |||
| f8a8114843 | |||
| 98bfe1af9c | |||
| ffbf9836cc | |||
| 806adb6c46 | |||
| 250ed2f266 | |||
| 56f07a5598 | |||
| dfdad35d08 | |||
| 1cef0d83df | |||
| a99c57ffc7 | |||
| cdffdcbbef | |||
| 4f05716f69 | |||
| f0567d6a48 | |||
| 6e9ffe83d2 | |||
| 2647ec51fc | |||
| 23587433e2 | |||
| 0414de7b98 | |||
| 295bd0e165 | |||
| 0b34d3590d | |||
| aedbf0b1d4 | |||
| a13e0e0ceb | |||
| 6f05c19c42 | |||
| db0c25522e | |||
| e6c999bbcd | |||
| 180a725c0e | |||
| 4ba6a9744b | |||
| ae998906ff | |||
| 634f0a2308 | |||
| 306b78ce16 | |||
| 678da425da | |||
| fc499441e2 | |||
| 1cf5f83924 | |||
| 6a465abee9 | |||
| 89a3e89d62 | |||
| 58c0fc396f | |||
| 0952686c1b | |||
| 64b506dccf | |||
| 61195235d8 | |||
| 6241decaf9 | |||
| 3288adf3dd | |||
| 5b53a1354a | |||
| 579dddaea0 | |||
| 9052b69e81 | |||
| 2c5d875ab7 | |||
| 04efc68578 | |||
| 0e137b947f | |||
| 97a24941d2 | |||
| c2a19bf375 | |||
| e40d7aaee7 | |||
| 2b18b68307 | |||
| b9ae8814d4 | |||
| f3a4c62240 | |||
| dbf38d84ef | |||
| f913a2a459 | |||
| f504c82216 | |||
| df18823d0a | |||
| 0396b2d00a | |||
| b1c132bc9a | |||
| 71b3a70254 | |||
| bcdecd19f4 | |||
| 3b3f860adc | |||
| f0d5666a74 | |||
| f1c2f67d63 | |||
| 32900556e0 | |||
| bf14bf3678 | |||
| f0a5fc5016 | |||
| ad1652683b | |||
| 0d778e074b | |||
| 0b2d51d301 | |||
| bf7979d4a7 | |||
| 5439bfc0b5 | |||
| c2ea096abb | |||
| 085853315d | |||
| 332f96c26a | |||
| 56e752c182 | |||
| 014ccf5ff4 | |||
| ab309f2219 | |||
| 6c9afc6f7e | |||
| aff8106205 | |||
| 8ced905843 | |||
| 21340ba019 | |||
| 8b25fa0ae4 | |||
| c0b0369aa2 | |||
| 44a9f9ee42 | |||
| f331a0740b | |||
| 12636b67be | |||
| 9f5ac92faa | |||
| 6e39efd4ac | |||
| 3c40edd12a | |||
| 81b620d7aa | |||
| 9af2ae9a0f | |||
| 1754318df7 | |||
| f273195144 | |||
| 247a77e1b1 | |||
| ce4212a33a | |||
| 522bd95254 | |||
| b0b1e6832e | |||
| 3cb9aa07b5 | |||
| 60f6836ab7 | |||
| 43f0438fbb | |||
| ded10b52da | |||
| 4bc5bdc791 | |||
| 1baaebd3ef | |||
| 97e467f2d1 | |||
| 665ff84495 | |||
| 07b3b92703 | |||
| ddf56e1246 | |||
| 0ddbe87935 | |||
| 19dc8b6881 | |||
| 3e2e229dd1 | |||
| c8d9a4bfdd | |||
| 6c764dce06 | |||
| 655e771455 | |||
| 15f74b7981 | |||
| 9b607f6f1f | |||
| ab67126eec | |||
| 3b8cbc4e22 | |||
| f59f6698f1 | |||
| bd1525dcfb | |||
| 1e5eb1e3b8 | |||
| a1483d63c1 | |||
| 491687d4c1 | |||
| 66bd64cc5e | |||
| f9146cdd58 | |||
| 23e7ac767e | |||
| 3ac7a196c9 | |||
| 202e713cf1 | |||
| 63923da2ca | |||
| 7e22aed739 | |||
| 966b10e731 | |||
| 99eda4cd1b | |||
| 47292bb2bd | |||
| 37dc878f31 | |||
| 7da02460d8 | |||
| f73f4da665 | |||
| ef5985f841 | |||
| 71bb4f7c98 | |||
| 92af4a21c8 | |||
| 5d6c5bab39 | |||
| 8251be9c06 | |||
| 3d744cc8a2 | |||
| 1447bc772a | |||
| 7b24a1dc1e | |||
| d95f40ac88 | |||
| 82ac9a6b03 | |||
| 6ab46b6488 | |||
| 991082fbaf | |||
| 4d338ba2eb | |||
| 94b399e98f | |||
| 5aa41703f7 | |||
| d9aa73b597 | |||
| 6e4e94a8a8 | |||
| ae2a5b2c0d | |||
| 81cbcef31c | |||
| e3d9090e6c | |||
| b8e93270b4 | |||
| ef628d1c86 | |||
| d93b1cb282 | |||
| a66a517c40 | |||
| f3ee34d372 | |||
| c94d1e9894 | |||
| 46a2d6b53c | |||
| c9935007e8 | |||
| 7b9d37c787 | |||
| aa1fe28ddf | |||
| 8f1b456275 | |||
| 8a6a064d37 | |||
| f35f3197c3 | |||
| 78499f44af | |||
| 5b5201f1a6 | |||
| f28ff15ffb | |||
| 4f8bbec9fb | |||
| 77ebf1326c | |||
| fdc95337cf | |||
| 0e053e5e61 | |||
| 6bbb4276c0 | |||
| 6d641c87c4 | |||
| 553f5fb9b8 | |||
| 88dd699715 | |||
| c092e0551b | |||
| c320dc421c | |||
| 0f489a5777 | |||
| 3df709be63 | |||
| 875ac2ce49 | |||
| 698275874f | |||
| 0d4470cd8c | |||
| 5dfc3481c1 | |||
| b596bfc730 | |||
| d11d268597 | |||
| 4b0ba62c69 | |||
| 313d2bdb41 | |||
| 079f6e61e6 | |||
| 4a781b8cd8 | |||
| 5b0eb08473 | |||
| 3e62553d9c | |||
| 87206f20c8 | |||
| 5a24d4095a | |||
| d4fb5538e6 | |||
| f6393ef211 | |||
| 355b486595 | |||
| 2356a63aea | |||
| 57c0121cb3 | |||
| 9b97e06f71 | |||
| 9c5a636987 | |||
| 18b00a4192 | |||
| 988caa83fc | |||
| 18dc05c83d | |||
| 5cf18ba8c3 | |||
| 9454afe13a | |||
| 70d39bb4f3 | |||
| a4fd998539 | |||
| 1c673e38c7 | |||
| b43712cdb0 | |||
| 184d4720be | |||
| f08623be3c | |||
| 31218b1451 | |||
| cb34eef6aa | |||
| b9e9521128 | |||
| e59a2bcf80 | |||
| 6fcdca1bb7 | |||
| a985b8ee17 | |||
| c857f2fe70 | |||
| 9416e975e0 | |||
| 5f11d92458 | |||
| 97550dc37e | |||
| 4456e0470a | |||
| 561336aab6 | |||
| 82b38f5bae | |||
| 43a22bed46 | |||
| cd12d9d8e7 | |||
| 15e3245180 | |||
| 730dc5f6c3 | |||
| 3cdc68aaf1 | |||
| e3c08471b6 | |||
| a7048f41ab | |||
| 1c0001af8e | |||
| 8b1ee94296 | |||
| 791abbd9b1 | |||
| 6255a10e80 | |||
| d05a114241 | |||
| 6ebfe91661 | |||
| d0b357d532 | |||
| cc047a29c1 | |||
| 32c8b23199 | |||
| 21366ec47e | |||
| 699d730151 | |||
| a4274f9b59 | |||
| d6d6c7d9ee | |||
| 5bd85dded6 | |||
| e5ef3bad02 | |||
| 4aa2d6248e | |||
| bd4a234461 | |||
| 162b3cd4ed | |||
| 420dff36c8 | |||
| 3cdfec798f | |||
| c32f6b60eb | |||
| 5fe8d5a757 | |||
| 4e78acc7a2 | |||
| 4cd90e6806 | |||
| 8a888ff0f3 | |||
| 5530c3c68e | |||
| 35601da3f0 | |||
| 1d566398d8 | |||
| 3e01081ff9 | |||
| 420785b514 | |||
| dcae86e456 | |||
| 443e5cd59d | |||
| b4799575fd | |||
| 5a0abb8710 | |||
| cb05e1e0f7 | |||
| 6fdd58dec6 | |||
| 5b0a86a5b2 | |||
| 28e26209f3 | |||
| 986de7ec9a | |||
| 7c7c0a57bd | |||
| 54b07d3e0b | |||
| 7dc341ae55 | |||
| 5e0e168ae9 | |||
| be8bd43a18 | |||
| 884c47496b | |||
| b2d727f4b2 | |||
| 4f5ed7bfa6 | |||
| f03d0a20bd | |||
| c6c91e6f43 | |||
| 2f56d77e90 | |||
| 68b53a4c77 | |||
| 2235389344 | |||
| 9509348320 | |||
| fd8ddc23b7 | |||
| 07d692ee0d | |||
| 00f9243c0d | |||
| 1e1be6934f | |||
| 6a183cce02 | |||
| dd6a91533d | |||
| 93d0298d25 | |||
| cf86f18c11 | |||
| 63f053e4fe | |||
| 81039a0e10 | |||
| 375dc01602 | |||
| fe3f913d76 |
@@ -15,7 +15,9 @@
|
||||
# nightly. The reference tests and the doc tests run in the merge queue, on main and nightly, not
|
||||
# on pull requests (the fast lane, in Select checks); a break there is fixed forward on main. The
|
||||
# Windows jobs (D3D12 shaders and app startup) run nightly, and in the merge queue only for a group
|
||||
# that changes what they exercise. Only main saves the build caches; pull requests restore them.
|
||||
# that changes what they exercise. The wasm compile check runs in the merge queue for a group that
|
||||
# touches the crates below the apps, the web app or the manifests. Dependency advisories run nightly
|
||||
# and on any pull request or merge group that changes Cargo.lock or a Cargo.toml. Only main saves the build caches; pull requests restore them.
|
||||
# sccache is on a Blacksmith sticky disk that only main commits.
|
||||
# A push to main runs only the repository checks when a passing merge-queue run tested that very
|
||||
# commit, or when nothing a build reads changed since the last push to main whose run passed.
|
||||
@@ -78,8 +80,13 @@ env:
|
||||
|
||||
jobs:
|
||||
dependency-advisories:
|
||||
# Nightly and by hand: advisories, bans and sources for everything. A pull request or merge
|
||||
# group that changes Cargo.lock or a Cargo.toml (Select checks' `deps`) checks the advisories
|
||||
# only, so a dependency with a known vulnerability is caught before it lands, not the next
|
||||
# morning; other pull requests skip it. `ci` requires it whenever `deps` is true.
|
||||
name: Dependency advisories
|
||||
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
||||
needs: changes
|
||||
if: ${{ !cancelled() && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || needs.changes.outputs.deps == 'true') }}
|
||||
runs-on: blacksmith-4vcpu-ubuntu-2404
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
@@ -88,7 +95,12 @@ jobs:
|
||||
- name: Install advisory scanner
|
||||
run: cargo install cargo-deny --version 0.20.2 --locked
|
||||
- name: Check locked dependencies
|
||||
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
||||
run: cargo deny --locked check --warn unmaintained advisories bans sources
|
||||
# deny.toml denies unmaintained crates; like the nightly, they are reported, not fatal.
|
||||
- name: Check advisories for the changed dependencies
|
||||
if: github.event_name != 'schedule' && github.event_name != 'workflow_dispatch'
|
||||
run: cargo deny --locked check --warn unmaintained advisories
|
||||
|
||||
changes:
|
||||
name: Select checks
|
||||
@@ -115,6 +127,10 @@ jobs:
|
||||
packages: ${{ steps.paths.outputs.packages }}
|
||||
oracle: ${{ steps.paths.outputs.oracle }}
|
||||
doctests: ${{ steps.paths.outputs.doctests }}
|
||||
# Cargo.lock or a Cargo.toml changed (pull requests and merge groups): Dependency advisories.
|
||||
deps: ${{ steps.paths.outputs.deps }}
|
||||
# A merge group reaches the wasm build: Compile WebAssembly.
|
||||
wasm: ${{ steps.paths.outputs.wasm }}
|
||||
# The passing run a merge of main carries forward (its URL), when this push is only that.
|
||||
carried: ${{ steps.paths.outputs.carried }}
|
||||
steps:
|
||||
@@ -143,6 +159,8 @@ jobs:
|
||||
goldens=false
|
||||
windows=false
|
||||
gpu_paths=false
|
||||
deps=false
|
||||
wasm=false
|
||||
full=true
|
||||
packages=
|
||||
# Whether the NUL-separated paths in $1 reach any code: scripts/ci/affected.py selects
|
||||
@@ -183,6 +201,21 @@ jobs:
|
||||
esac
|
||||
done < "$1"
|
||||
}
|
||||
# Whether the NUL-separated paths in $1 change the dependencies (Cargo.lock or any
|
||||
# Cargo.toml: deps), and whether they reach what `cargo xtask wasm` compiles (wasm): the
|
||||
# crates below the apps, the web app, the vendored crates, the manifests and lockfile, the
|
||||
# toolchain and cargo config, and this workflow. #8227 put a native-only call in
|
||||
# crates/ui-egui and the merge queue passed it, because nothing built for wasm there.
|
||||
deps_wasm_paths() {
|
||||
while IFS= read -r -d '' path; do
|
||||
case "$path" in
|
||||
Cargo.lock|Cargo.toml|*/Cargo.toml) deps=true ;;
|
||||
esac
|
||||
case "$path" in
|
||||
crates/*|apps/solidcraft-web/*|vendor/*|Cargo.lock|Cargo.toml|rust-toolchain*|.cargo/*|.github/workflows/ci.yml) wasm=true ;;
|
||||
esac
|
||||
done < "$1"
|
||||
}
|
||||
# Opt-in for a big render change: a pull request labelled render-tests, or a merge group
|
||||
# holding one (its pull requests are the (#N) of its squash commits), runs them whatever
|
||||
# the paths say.
|
||||
@@ -228,14 +261,17 @@ jobs:
|
||||
if git diff --no-renames --name-only -z "$GROUP_BASE_SHA...$GROUP_HEAD_SHA" > "$RUNNER_TEMP/ci-paths"; then
|
||||
windows_paths "$RUNNER_TEMP/ci-paths" "$GROUP_BASE_SHA...$GROUP_HEAD_SHA"
|
||||
gpu_paths "$RUNNER_TEMP/ci-paths"
|
||||
deps_wasm_paths "$RUNNER_TEMP/ci-paths"
|
||||
if [ "$gpu_paths" = false ] && group_has_render_label "$GROUP_BASE_SHA..$GROUP_HEAD_SHA"; then
|
||||
gpu_paths=true
|
||||
fi
|
||||
else
|
||||
windows=true
|
||||
gpu_paths=true
|
||||
deps=true
|
||||
wasm=true
|
||||
fi
|
||||
echo "windows=$windows gpu_paths=$gpu_paths for $GROUP_BASE_SHA...$GROUP_HEAD_SHA"
|
||||
echo "windows=$windows gpu_paths=$gpu_paths deps=$deps wasm=$wasm for $GROUP_BASE_SHA...$GROUP_HEAD_SHA"
|
||||
elif [ "$EVENT_NAME" != pull_request ]; then
|
||||
# The nightly run and Run workflow: everything, Windows included.
|
||||
native=true
|
||||
@@ -256,6 +292,10 @@ jobs:
|
||||
done < "$RUNNER_TEMP/ci-paths"
|
||||
# Computed as for a merge group, then turned off below (the fast lane).
|
||||
windows_paths "$RUNNER_TEMP/ci-paths" "$BASE_SHA...$HEAD_SHA"
|
||||
# The advisories run on the pull request itself (it builds nothing of ours: about two minutes, most of it installing cargo-deny);
|
||||
# the wasm compile waits for the merge queue.
|
||||
deps_wasm_paths "$RUNNER_TEMP/ci-paths"
|
||||
wasm=false
|
||||
# Pull requests build and test the touched packages and their dependents; nothing
|
||||
# selected means no code changed.
|
||||
select_packages "$RUNNER_TEMP/ci-paths"
|
||||
@@ -327,6 +367,8 @@ jobs:
|
||||
echo "windows=$windows"
|
||||
echo "oracle=$oracle"
|
||||
echo "doctests=$doctests"
|
||||
echo "deps=$deps"
|
||||
echo "wasm=$wasm"
|
||||
echo "carried=$carried"
|
||||
echo "full=$full"
|
||||
echo "quick=$quick"
|
||||
@@ -946,7 +988,7 @@ jobs:
|
||||
# commit's real run instead: the merge queue reads `ci` from the newest run of a commit, so a
|
||||
# run without a passing `ci` would block a pull request that passed (#1850, #3182, #3252).
|
||||
name: ci
|
||||
needs: [changes, checks, quick-compile, clippy, build-tests, tests, gpu-path-tests, doc-tests, oracle, windows-fxc, windows-startup]
|
||||
needs: [changes, checks, quick-compile, clippy, build-tests, tests, gpu-path-tests, doc-tests, oracle, windows-fxc, windows-startup, dependency-advisories, wasm]
|
||||
if: always() && (github.event_name != 'pull_request' || !github.event.pull_request.draft)
|
||||
runs-on: blacksmith-2vcpu-ubuntu-2404
|
||||
permissions:
|
||||
@@ -1000,6 +1042,10 @@ jobs:
|
||||
ORACLE: ${{ needs.oracle.result }}
|
||||
WINDOWS_FXC: ${{ needs.windows-fxc.result }}
|
||||
WINDOWS_STARTUP: ${{ needs.windows-startup.result }}
|
||||
DEPS_RUN: ${{ needs.changes.outputs.deps }}
|
||||
ADVISORIES: ${{ needs.dependency-advisories.result }}
|
||||
WASM_RUN: ${{ needs.changes.outputs.wasm }}
|
||||
WASM: ${{ needs.wasm.result }}
|
||||
run: |
|
||||
test "$CHANGES" = success
|
||||
test "$CHECKS" = success
|
||||
@@ -1029,6 +1075,14 @@ jobs:
|
||||
test "$WINDOWS_FXC" = success
|
||||
test "$WINDOWS_STARTUP" = success
|
||||
fi
|
||||
# Cargo.lock or a Cargo.toml changed on a pull request or in a merge group.
|
||||
if [ "$DEPS_RUN" = true ]; then
|
||||
test "$ADVISORIES" = success
|
||||
fi
|
||||
# A merge group that reaches the wasm build.
|
||||
if [ "$WASM_RUN" = true ]; then
|
||||
test "$WASM" = success
|
||||
fi
|
||||
- name: Note a carried result
|
||||
if: needs.changes.outputs.carried != ''
|
||||
env:
|
||||
@@ -1036,9 +1090,13 @@ jobs:
|
||||
run: |
|
||||
echo "This push only merges main into a change that already passed; the heavy checks were not repeated. Passing run: $CARRIED" >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
# Every crate below the apps and the web app must build for the browser (`cargo xtask wasm`, a
|
||||
# cargo check, no tests). In the merge queue for a group that reaches the wasm build (Select
|
||||
# checks' `wasm`), where `ci` requires it; by hand with cross_compile.
|
||||
wasm:
|
||||
name: Compile WebAssembly (manual)
|
||||
if: github.event_name == 'workflow_dispatch' && inputs.cross_compile
|
||||
name: Compile WebAssembly
|
||||
needs: changes
|
||||
if: ${{ !cancelled() && ((github.event_name == 'workflow_dispatch' && inputs.cross_compile) || needs.changes.outputs.wasm == 'true') }}
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
@@ -1099,3 +1157,49 @@ jobs:
|
||||
. "$HOME/.cargo/env"
|
||||
export CRAFT_FONTS_DIR="$PWD/craft-fonts"
|
||||
cargo check --all-targets --locked --target riscv64gc-unknown-linux-gnu
|
||||
|
||||
# Nobody watches the nightly run, and it failed every day from 2026-10-16 to 2026-10-28 before
|
||||
# anyone noticed. When a nightly fails, open one issue, "Nightly CI is failing" (label `ci`), or
|
||||
# comment on it if it is already open; when a nightly passes, close it. A nightly that neither
|
||||
# failed nor fully passed (cancelled) leaves the issue as it is. The only job that may write issues.
|
||||
nightly-alert:
|
||||
name: Nightly alert
|
||||
needs: [dependency-advisories, changes, checks, ci, build-tests, action-matrix, action-matrix-determinism, property-tests]
|
||||
if: always() && github.event_name == 'schedule'
|
||||
runs-on: blacksmith-2vcpu-ubuntu-2404
|
||||
timeout-minutes: 5
|
||||
permissions:
|
||||
issues: write
|
||||
steps:
|
||||
- name: Open, update or close the nightly issue
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
GH_REPO: ${{ github.repository }}
|
||||
RESULTS: ${{ toJSON(needs) }}
|
||||
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
SHA: ${{ github.sha }}
|
||||
run: |
|
||||
title="Nightly CI is failing"
|
||||
failed=$(jq -r 'to_entries[] | select(.value.result == "failure") | .key' <<<"$RESULTS")
|
||||
unfinished=$(jq -r 'to_entries[] | select(.value.result != "success" and .value.result != "failure") | "\(.key) (\(.value.result))"' <<<"$RESULTS")
|
||||
issue=$(gh issue list --state open --label ci --limit 100 --json number,title \
|
||||
--jq "[.[] | select(.title == \"$title\")] | first | .number // empty")
|
||||
if [ -n "$failed" ]; then
|
||||
body="The nightly run on ${SHA:0:9} failed: $RUN_URL
|
||||
|
||||
Failed jobs: $(paste -sd , - <<<"$failed" | sed 's/,/, /g')."
|
||||
if [ -n "$issue" ]; then
|
||||
gh issue comment "$issue" --body "$body"
|
||||
else
|
||||
gh issue create --title "$title" --label ci --body "$body
|
||||
|
||||
This issue is opened and updated by the nightly run (the nightly-alert job in .github/workflows/ci.yml) and closed by the first nightly that passes."
|
||||
fi
|
||||
elif [ -z "$unfinished" ]; then
|
||||
if [ -n "$issue" ]; then
|
||||
gh issue close "$issue" --comment "The nightly run on ${SHA:0:9} passed: $RUN_URL"
|
||||
fi
|
||||
echo "The nightly passed."
|
||||
else
|
||||
echo "Nothing failed, but not every job finished: $unfinished. The issue is left as it is."
|
||||
fi
|
||||
|
||||
@@ -52,6 +52,7 @@ jobs:
|
||||
# effort: a fork PR just doesn't get the `changes-default` label from here.
|
||||
label:
|
||||
name: Label changes-default
|
||||
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 5
|
||||
continue-on-error: true
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
# (see the windows job). Nothing else is signed yet.
|
||||
#
|
||||
# Linux x86_64, aarch64 AppImage (+ .zsync), .deb, .rpm, .flatpak, .snap, .tar.gz packaging/linux
|
||||
# Arch Linux x86_64, aarch64 .pkg.tar.zst, repackaged from the .tar.gz the arch job
|
||||
# FreeBSD x86_64 .tar.gz (built in a FreeBSD VM) packaging/freebsd
|
||||
# macOS universal .dmg, and the CLI as a .zip (both archs built in parallel) packaging/macos
|
||||
# Windows x64, x86, arm64 .msi and a portable .zip; x64 also the plain .exe packaging/windows
|
||||
@@ -206,6 +207,45 @@ jobs:
|
||||
path: dist/release/*.flatpak
|
||||
if-no-files-found: error
|
||||
|
||||
arch:
|
||||
name: Arch Linux ${{ matrix.arch }}
|
||||
needs: [version, linux]
|
||||
if: needs.version.outputs.build == 'true'
|
||||
# makepkg only repackages the tarball's prebuilt binaries, so both architectures build here.
|
||||
runs-on: ubuntu-24.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
arch: [x86_64, aarch64]
|
||||
env:
|
||||
VERSION: ${{ needs.version.outputs.version }}
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
||||
with:
|
||||
name: release-linux-${{ matrix.arch }}
|
||||
path: dist/linux
|
||||
# The Craft apps' shared Arch packaging (storytold/craft-common-actions, MIT OR Apache-2.0):
|
||||
# makepkg in an archlinux:base-devel container. The package is named after the tarball's
|
||||
# .desktop file (io.tangencylabs.solidcraft) and written as
|
||||
# dist/release/solidcraft-<version>-linux-<arch>.pkg.tar.zst.
|
||||
- uses: storytold/craft-common-actions/actions/arch-package@fa5ef18780cf5e7d5d3b8de068de56cffc83cac5 # main
|
||||
with:
|
||||
tarball: dist/linux/solidcraft-${{ env.VERSION }}-linux-${{ matrix.arch }}.tar.gz
|
||||
arch: ${{ matrix.arch }}
|
||||
- name: Check the package
|
||||
env:
|
||||
PKG: dist/release/solidcraft-${{ env.VERSION }}-linux-${{ matrix.arch }}.pkg.tar.zst
|
||||
run: |
|
||||
tar --zstd -tf "$PKG" | grep -E '^usr/bin/solidcraft$|^usr/bin/solidcraft-cli$|^usr/share/applications/io\.tangencylabs\.solidcraft\.desktop$'
|
||||
tar --zstd -xOf "$PKG" .PKGINFO | grep -E '^(pkgname|pkgver|arch) = '
|
||||
tar --zstd -xOf "$PKG" .PKGINFO | grep -qx 'pkgname = io.tangencylabs.solidcraft'
|
||||
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
||||
with:
|
||||
name: release-arch-${{ matrix.arch }}
|
||||
path: dist/release/*.pkg.tar.zst
|
||||
if-no-files-found: error
|
||||
|
||||
|
||||
|
||||
snap:
|
||||
@@ -571,7 +611,7 @@ jobs:
|
||||
|
||||
release:
|
||||
name: GitHub Release or dry-run artifacts
|
||||
needs: [version, linux, flatpak, snap, freebsd, macos, windows, web]
|
||||
needs: [version, linux, flatpak, arch, snap, freebsd, macos, windows, web]
|
||||
if: needs.version.outputs.build == 'true'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
@@ -597,7 +637,7 @@ jobs:
|
||||
shopt -s nullglob
|
||||
for f in "solidcraft-$VERSION-"*; do
|
||||
case "$f" in
|
||||
*.msi | *-portable.zip | *.dmg | *.AppImage | *.deb | *.rpm | *.flatpak | *.snap)
|
||||
*.msi | *-portable.zip | *.dmg | *.AppImage | *.deb | *.rpm | *.flatpak | *.snap | *.pkg.tar.zst)
|
||||
cp -- "$f" "solidcraft-${f#"solidcraft-$VERSION-"}" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
@@ -84,6 +84,8 @@ Editable drawing code, native projects and shipped exports are collected under `
|
||||
| docs/book/src/generated/tool-preview.png | SolidCraft contributors | rendered by `cargo xtask book` (`solidcraft-cli snapshot docs/book/scripts/tool-preview.json`; gitignored) | MIT OR Apache-2.0 |
|
||||
| assets/fonts/liberation-sans/LiberationSans-Regular.ttf | Red Hat, Inc. (Liberation Fonts 2.x; digitized data Google) | https://github.com/liberationfonts (Debian fonts-liberation), unmodified; licence text in assets/fonts/liberation-sans/OFL.txt; used for sketch Text outlines | SIL OFL 1.1 |
|
||||
| assets/fonts/biz-udp-gothic/BIZUDPGothic-Regular.ttf | The BIZ UDGothic Project Authors | https://github.com/googlefonts/morisawa-biz-ud-gothic (Google Fonts), unmodified; licence text in assets/fonts/biz-udp-gothic/OFL.txt; used for web UI Japanese font | SIL OFL 1.1 |
|
||||
| assets/fonts/craft-ui-sc/CraftUI-SC.otf | Adobe / Google Inc. (Noto Sans SC); SolidCraft subset | https://github.com/notofonts/noto-cjk Sans/SubsetOTF/SC Regular, glyph-subset for assets/locales/zh.json and renamed Craft UI SC (OFL reserved-name); licence text in assets/fonts/craft-ui-sc/OFL.txt; web UI Simplified Chinese | SIL OFL 1.1 |
|
||||
| assets/fonts/craft-ui-tc/CraftUI-TC.otf | Adobe / Google Inc. (Noto Sans TC); SolidCraft subset | https://github.com/notofonts/noto-cjk Sans/SubsetOTF/TC Regular, glyph-subset for assets/locales/zh-TW.json and renamed Craft UI TC (OFL reserved-name); licence text in assets/fonts/craft-ui-tc/OFL.txt; web UI Traditional Chinese | SIL OFL 1.1 |
|
||||
| tests/step-conformance/cone_point.step | step-conformance contributors | generated from formulas by https://github.com/dan335/step-conformance (corpus/generated, 96f30bb); import regression fixture | CC0-1.0 |
|
||||
| tests/step-conformance/cone_point_vertex.step | step-conformance contributors | generated from formulas by https://github.com/dan335/step-conformance (corpus/generated, 96f30bb); import regression fixture | CC0-1.0 |
|
||||
| tests/step-conformance/cylinder.step | step-conformance contributors | generated from formulas by https://github.com/dan335/step-conformance (corpus/generated, 96f30bb); import regression fixture | CC0-1.0 |
|
||||
@@ -125,6 +127,8 @@ Editable drawing code, native projects and shipped exports are collected under `
|
||||
| assets/appearances/library.rs | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 |
|
||||
| assets/appearances/opaque_finishes.rs | SolidCraft contributors | original illustrative opaque finish values; no external dataset, textures or measured engineering data | MIT OR Apache-2.0 |
|
||||
| assets/fonts/biz-udp-gothic/OFL.txt | The BIZ UDGothic Project Authors | Unmodified accompanying font licence | SIL OFL 1.1 |
|
||||
| assets/fonts/craft-ui-sc/OFL.txt | Adobe / Google Inc. (Noto CJK); SolidCraft header | Accompanying OFL for CraftUI-SC.otf | SIL OFL 1.1 |
|
||||
| assets/fonts/craft-ui-tc/OFL.txt | Adobe / Google Inc. (Noto CJK); SolidCraft header | Accompanying OFL for CraftUI-TC.otf | SIL OFL 1.1 |
|
||||
| assets/fonts/ibm-plex-mono/OFL.txt | IBM Corp. | Unmodified accompanying font licence | SIL OFL 1.1 |
|
||||
| assets/fonts/ibm-plex-sans/OFL.txt | IBM Corp. | Unmodified accompanying font licence | SIL OFL 1.1 |
|
||||
| assets/fonts/liberation-sans/OFL.txt | Red Hat, Inc.; Liberation Fonts contributors | Unmodified accompanying font licence | SIL OFL 1.1 |
|
||||
@@ -609,6 +613,27 @@ Original SolidCraft drawings, Open for owner review; no runtime assignments.
|
||||
| assets/icons/ui/design/svg/model/timeline_stop.svg | SolidCraft contributors | Original history playback icon; canonical grey_cube base and original action cue | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/status_pin.svg | SolidCraft contributors | Original analytic pin icon for persistent viewport results | MIT OR Apache-2.0 |
|
||||
| assets/locales/pending/render-wear.json | SolidCraft contributors | Original UI labels and translations | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/equation_curve.svg | SolidCraft contributors | two-tone modelling icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
|
||||
| assets/locales/pending/sketch-recent-snap.json | SolidCraft contributors | Original preference messages for the recent centre and midpoint snap | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/construction_line.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/construction_line_horizontal.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/construction_line_vertical.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/construction_line_angle.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/construction_line_parallel.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/construction_line_perpendicular.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/construction_line_tangent_external.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/construction_line_tangent_at.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/construction_line_tangent_two.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/construction_line_bisector.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| docs/book/src/generated/equation-circle.png | SolidCraft contributors | rendered by `cargo xtask book` (`solidcraft-cli snapshot docs/book/scripts/equation-circle.json`; gitignored) | MIT OR Apache-2.0 |
|
||||
| docs/book/src/generated/equation-flower.png | SolidCraft contributors | rendered by `cargo xtask book` (`solidcraft-cli snapshot docs/book/scripts/equation-flower.json`; gitignored) | MIT OR Apache-2.0 |
|
||||
| docs/book/src/generated/equation-involute.png | SolidCraft contributors | rendered by `cargo xtask book` (`solidcraft-cli snapshot docs/book/scripts/equation-involute.json`; gitignored) | MIT OR Apache-2.0 |
|
||||
| docs/book/src/generated/equation-line.png | SolidCraft contributors | rendered by `cargo xtask book` (`solidcraft-cli snapshot docs/book/scripts/equation-line.json`; gitignored) | MIT OR Apache-2.0 |
|
||||
| docs/book/src/generated/equation-parabola.png | SolidCraft contributors | rendered by `cargo xtask book` (`solidcraft-cli snapshot docs/book/scripts/equation-parabola.json`; gitignored) | MIT OR Apache-2.0 |
|
||||
| docs/book/src/generated/equation-spiral.png | SolidCraft contributors | rendered by `cargo xtask book` (`solidcraft-cli snapshot docs/book/scripts/equation-spiral.json`; gitignored) | MIT OR Apache-2.0 |
|
||||
| docs/book/src/generated/equation-wave.png | SolidCraft contributors | rendered by `cargo xtask book` (`solidcraft-cli snapshot docs/book/scripts/equation-wave.json`; gitignored) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/print_face.svg | SolidCraft contributors | two-tone modelling icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
|
||||
| assets/locales/fi.json | SolidCraft contributors | Original Finnish translation of SolidCraft's English catalog, AI-assisted (Claude Code) clean-room from the English and not yet reviewed line by line by a native speaker; no commercial CAD text used | MIT OR Apache-2.0 |
|
||||
|
||||
## Code adapted from sibling projects
|
||||
|
||||
@@ -668,6 +693,7 @@ copied into SolidCraft.
|
||||
|
||||
| Directory | Source | Licence | Changes |
|
||||
|---|---|---|---|
|
||||
| vendor/accesskit_macos | accesskit_macos 0.26.3, https://github.com/AccessKit/accesskit (The AccessKit contributors) | MIT OR Apache-2.0 | the subclassing adapter and its tests from 0.27.2: dropping the adapter keeps AppKit's key-value observers (vendor/README.md) |
|
||||
| vendor/truck-meshalgo | truck-meshalgo 0.4.0, https://github.com/ricosjp/truck (RICOS Co. Ltd.) | Apache-2.0 | meshing: bounded parameter searches, collapsed-boundary projection, subdivision and provisional fixed-grid previews (vendor/README.md) |
|
||||
| vendor/truck-stepio | truck-stepio 0.3.0, https://github.com/ricosjp/truck (RICOS Co. Ltd.) | Apache-2.0 | STEP writer: intersection-curve surfaces written at unique ids (vendor/README.md) |
|
||||
| vendor/truck-shapeops | truck-shapeops 0.4.0, https://github.com/ricosjp/truck (RICOS Co. Ltd.) | Apache-2.0 | robust meshing and nearest-parameter fallback in booleans; degenerate intersection-curve rejection; face and edge history of booleans; trace macro; corner choice at vertices several intersection curves end on; reuse of an operand's meshes (vendor/README.md) |
|
||||
|
||||
@@ -117,7 +117,8 @@ The [architecture page](docs/architecture.md) has the layer table. The short ver
|
||||
not.) Permissive
|
||||
dependencies are fine. Note which one you're adding and why in the PR. THIRD-PARTY-LICENSES.txt
|
||||
lists it once the change lands: the Generated files workflow rewrites it on `main`.
|
||||
Nightly/manual CI also scans advisories, bans and sources with cargo-deny; see
|
||||
Nightly/manual CI also scans advisories, bans and sources with cargo-deny, and a PR that
|
||||
changes Cargo.lock or a Cargo.toml checks the advisories; see
|
||||
[the local command and coverage limits](docs/book/src/dev/testing.md#dependency-advisories).
|
||||
3. **Every asset is original or openly licensed and has a row in
|
||||
[ATTRIBUTION.md](ATTRIBUTION.md).** Icons are drawn in code (`crates/ui-egui/src/icons.rs`).
|
||||
|
||||
@@ -60,8 +60,6 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "accesskit_macos"
|
||||
version = "0.26.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ce02dc63b43f0c9296af9ac946312a2dc8814427d7a64d2d600971dac55b6076"
|
||||
dependencies = [
|
||||
"accesskit",
|
||||
"accesskit_consumer 0.38.0",
|
||||
@@ -4210,7 +4208,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"block2 0.6.2",
|
||||
"eframe",
|
||||
@@ -4242,15 +4240,16 @@ dependencies = [
|
||||
"windows-sys 0.61.2",
|
||||
"winit",
|
||||
"x11rb",
|
||||
"zbus 5.19.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-3dx-client"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-cli"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"image",
|
||||
"log",
|
||||
@@ -4262,7 +4261,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-derive"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -4271,7 +4270,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-doc"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"log",
|
||||
"serde",
|
||||
@@ -4288,7 +4287,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-engine"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"image",
|
||||
"log",
|
||||
@@ -4309,7 +4308,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-geom"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
@@ -4318,7 +4317,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-gpu"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"image",
|
||||
"log",
|
||||
@@ -4338,7 +4337,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-io"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"cadmpeg-core",
|
||||
"cadmpeg-ir",
|
||||
@@ -4362,7 +4361,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-kernel"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"log",
|
||||
"proptest",
|
||||
@@ -4382,7 +4381,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-mcp"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"serde_json",
|
||||
"solidcraft-engine",
|
||||
@@ -4391,7 +4390,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-render"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"image",
|
||||
"moxcms",
|
||||
@@ -4405,7 +4404,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-sketch"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"harfrust",
|
||||
"serde",
|
||||
@@ -4418,14 +4417,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-space-mouse"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-ui-egui"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"arboard",
|
||||
"egui",
|
||||
@@ -4455,7 +4454,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-web"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"eframe",
|
||||
"egui",
|
||||
@@ -5998,7 +5997,7 @@ checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7"
|
||||
|
||||
[[package]]
|
||||
name = "xtask"
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"serde",
|
||||
|
||||
@@ -5,7 +5,7 @@ members = ["crates/*", "apps/*", "xtask"]
|
||||
exclude = ["vendor"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.26.1"
|
||||
version = "0.28.0"
|
||||
edition = "2024"
|
||||
license = "MIT OR Apache-2.0"
|
||||
rust-version = "1.95"
|
||||
@@ -165,6 +165,9 @@ egui-wgpu = { path = "vendor/egui-wgpu" }
|
||||
# winit 0.30 never binds and eframe 0.36 still requires winit 0.30.
|
||||
winit = { path = "vendor/winit" }
|
||||
|
||||
# macOS: dropping the accessibility adapter leaves AppKit's key-value observers intact (#7535).
|
||||
accesskit_macos = { path = "vendor/accesskit_macos" }
|
||||
|
||||
# Mutation testing (cargo-mutants, docs/mutation-testing.md): the ci profile with incremental
|
||||
# builds, since every mutant rebuilds the crates above the one it changes.
|
||||
[profile.mutants]
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://trendshift.io/repositories/296178?utm_source=trendshift-badge&utm_medium=badge&utm_campaign=badge-trendshift-296178" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/trendshift/repositories/296178/daily" alt="tangency-labs%2Fsolidcraft | Trendshift" width="250" height="55"/></a>
|
||||
<a href="https://trendshift.io/repositories/296178?utm_source=trendshift-badge&utm_medium=badge&utm_campaign=badge-trendshift-296178" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/trendshift/repositories/296178/daily?language=Rust" alt="tangency-labs%2Fsolidcraft | Trendshift (Rust)" width="250" height="55"/></a>
|
||||
<a href="https://trendshift.io/repositories/296178?utm_source=trendshift-badge&utm_medium=badge&utm_campaign=badge-trendshift-296178" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/trendshift/repositories/296178/daily" alt="tangency-labs%2Fsolidcraft | Trendshift" width="250" height="55"/></a>
|
||||
<a href="https://trendshift.io/repositories/296178?utm_source=trendshift-badge&utm_medium=badge&utm_campaign=badge-trendshift-296178" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/trendshift/repositories/296178/daily?language=Rust" alt="tangency-labs%2Fsolidcraft | Trendshift (Rust)" width="250" height="55"/></a>
|
||||
</p>
|
||||
|
||||

|
||||
@@ -98,7 +98,7 @@ More commands, the Windows cross-build and the browser build are in [docs/buildi
|
||||
runs its own design session, or with `--connect` it drives the running app so you can watch.
|
||||
Claude Code: `claude mcp add solidcraft -- solidcraft-cli mcp`. If a terminal doesn't find
|
||||
`solidcraft-cli` (older Windows installers don't put it on `PATH`), give its full path (by default
|
||||
`"C:\Program Files\SolidCraft\solidcraft-cli.exe"`). Tools, access rules and an example session:
|
||||
`"C:\\Program Files\\SolidCraft\\solidcraft-cli.exe"`). Tools, access rules and an example session:
|
||||
[docs/mcp.md](docs/mcp.md).
|
||||
|
||||
## Scripts
|
||||
@@ -150,3 +150,4 @@ Tinkercad are trademarks of their respective owners, named only to describe comp
|
||||
[linux-appimage]: https://github.com/tangency-labs/solidcraft/releases/latest/download/solidcraft-linux-x86_64.AppImage
|
||||
[snap-store]: https://snapcraft.io/solidcraft
|
||||
[web-app]: https://solidcraft.io/app
|
||||
|
||||
|
||||
@@ -16799,6 +16799,14 @@ Bundled fonts (SIL Open Font License, Version 1.1)
|
||||
Copyright 2022 The BIZ UDGothic Project Authors (https://github.com/googlefonts/morisawa-biz-ud-mincho)
|
||||
Source: https://github.com/googlefonts/morisawa-biz-ud-gothic
|
||||
|
||||
- CraftUI-SC.otf (assets/fonts/craft-ui-sc/CraftUI-SC.otf)
|
||||
Copyright 2014-2021 Adobe / Google Inc. (Noto Sans SC subset for SolidCraft web zh)
|
||||
Source: https://github.com/notofonts/noto-cjk (Sans SubsetOTF/SC)
|
||||
|
||||
- CraftUI-TC.otf (assets/fonts/craft-ui-tc/CraftUI-TC.otf)
|
||||
Copyright 2014-2021 Adobe / Google Inc. (Noto Sans TC subset for SolidCraft web zh-TW)
|
||||
Source: https://github.com/notofonts/noto-cjk (Sans SubsetOTF/TC)
|
||||
|
||||
- IBMPlexSans-Variable.ttf (assets/fonts/ibm-plex-sans/IBMPlexSans-Variable.ttf)
|
||||
Copyright 2017 IBM Corp. with Reserved Font Name "Plex"
|
||||
Source: https://github.com/IBM/plex
|
||||
|
||||
@@ -66,7 +66,7 @@ fn run() -> Result<(), String> {
|
||||
let mut session = Session::default();
|
||||
eprintln!("Generating original CAD scene from {recipe_path}");
|
||||
let generation_start = Instant::now();
|
||||
let (commands, command_timings) = session.run_script_timed(&recipe, false).map_err(|e| e.to_string())?;
|
||||
let (commands, command_timings) = session.run_script_timed(&recipe, false, &mut |_, _| {}).map_err(|e| e.to_string())?;
|
||||
let generation_seconds = generation_start.elapsed().as_secs_f64();
|
||||
let design_path = output.with_extension(solidcraft_engine::io::DESIGN_EXT);
|
||||
session.execute("file.save_as", &json!({"path":design_path})).map_err(|e| e.to_string())?;
|
||||
@@ -87,7 +87,7 @@ fn run() -> Result<(), String> {
|
||||
let gpu_host_start = Instant::now();
|
||||
let policy = solidcraft_gpu::select::Policy::from_env().map_err(|e| e.to_string())?;
|
||||
let (adapter, report) =
|
||||
solidcraft_gpu::select::pick_vulkan(policy, |_| true).ok_or("no Vulkan adapter satisfies the requested GPU policy")?;
|
||||
solidcraft_gpu::select::pick_path(policy, |_| true).ok_or("no Vulkan or Metal adapter satisfies the requested GPU policy")?;
|
||||
session.register_render_job_host(solidcraft_gpu::path::host_on_adapter(&adapter).map_err(|e| e.to_string())?).map_err(|e| e.to_string())?;
|
||||
(Some(report), Some(gpu_host_start.elapsed().as_secs_f64()))
|
||||
} else {
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
//!
|
||||
//! ```text
|
||||
//! solidcraft-cli run <script.json|design.sc|part.step|mesh.3mf> [--in design|part.step|mesh.3mf] [--out FILE]... [--save FILE] [--quiet] [--results] [--timings] [--profile] [--json-out FILE] [--allow-errors]
|
||||
//! [--param-check off|warn|strict]
|
||||
//! solidcraft-cli eval <script.json|design.sc|part.step> [--in design.sc|part.step] [--json-out FILE] (alias: inspect) measurements as JSON
|
||||
//! solidcraft-cli script <design.sc> [--out script.json] the design's history as a command script
|
||||
//! solidcraft-cli bench-open <design.sc | part.step> [--parse-only] [--save OUT.sc] [--display LEVEL [--edit NAME EXPR]] [--ops script.json] loading timings as JSON lines
|
||||
@@ -57,7 +58,7 @@ struct Command {
|
||||
}
|
||||
|
||||
/// `run`'s lines in the usage.
|
||||
const USAGE_RUN: &str = " solidcraft-cli run <script.json|design.sc|part.step> [--in design.sc|part.step] [--out FILE]... [--save FILE] [--quiet] [--results] [--timings] [--profile] [--json-out FILE] [--allow-errors]\n solidcraft-cli run --in <design.sc|part.step> [--out FILE]...\n (a timeline feature that fails fails the run and nothing is written; --allow-errors writes anyway)\n (--timings prints {timings: [{index, command, ms}], total_ms} for a script, with --results its results too;\n --profile adds each command's profile: {boolean_ms, tessellate_ms, other_ms}, the kernel's share)\n";
|
||||
const USAGE_RUN: &str = " solidcraft-cli run <script.json|design.sc|part.step> [--in design.sc|part.step] [--out FILE]... [--save FILE] [--quiet] [--results] [--timings] [--profile] [--json-out FILE] [--allow-errors]\n [--param-check off|warn|strict]\n solidcraft-cli run --in <design.sc|part.step> [--out FILE]...\n (a timeline feature that fails fails the run and nothing is written; --allow-errors writes anyway)\n (--param-check checks each step against its command's contract: warn reports on stderr, strict stops the run)\n (--timings prints {timings: [{index, command, ms}], total_ms} for a script, with --results its results too;\n --profile adds each command's profile: {boolean_ms, tessellate_ms, other_ms}, the kernel's share)\n";
|
||||
/// `eval`'s lines in the usage.
|
||||
const USAGE_EVAL: &str = " solidcraft-cli eval <script.json|design.sc|part.step> [--in design.sc|part.step] [--json-out FILE] (alias: inspect)\n solidcraft-cli eval --in <script.json|design.sc|part.step> [--json-out FILE]\n (with both inputs, runs the positional script on --in before measuring; does not automatically save the modified design)\n (--json-out FILE writes the JSON that run (with --results, else the measurement) and eval print to FILE instead of stdout,\n as plain UTF-8: a shell's > can re-encode it, e.g. Windows PowerShell adds a byte-order mark)\n";
|
||||
/// `script`'s lines in the usage.
|
||||
@@ -299,18 +300,36 @@ fn load_checked(path: &str, check: solidcraft_engine::schema::ParamCheck) -> Res
|
||||
s.execute("doc.open", &json!({"path": path})).map_err(|e| e.to_string())?;
|
||||
} else {
|
||||
let script = if v.get("features").is_some() && v.get("commands").is_none() { recipe::to_script(&v)? } else { v };
|
||||
// Warn level: each step's `param_warnings` as it completes, even when a later step fails
|
||||
// (stderr, so stdout stays the caller's).
|
||||
let mut warn = |step: usize, r: &Value| {
|
||||
for w in r.get("param_warnings").and_then(Value::as_array).into_iter().flatten() {
|
||||
eprintln!("{path}: step {}: {}", step + 1, w.as_str().unwrap_or_default());
|
||||
}
|
||||
};
|
||||
s.run_script_each(&script, &mut warn).map_err(|e| e.to_string())?;
|
||||
run_script_warning(&mut s, path, &script)?;
|
||||
}
|
||||
Ok(s)
|
||||
}
|
||||
|
||||
/// Run `script`, read from `path`, on `s`. At the warn level each step's `param_warnings` go to
|
||||
/// stderr as the step completes, even when a later step fails (stdout stays the caller's).
|
||||
fn run_script_warning(s: &mut Session, path: &str, script: &Value) -> Result<Vec<Value>, String> {
|
||||
s.run_script_each(script, &mut |step, r| print_param_warnings(path, step, r)).map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
/// Step `step`'s `param_warnings` on stderr, one per line, named after the script at `path`.
|
||||
fn print_param_warnings(path: &str, step: usize, r: &Value) {
|
||||
for w in r.get("param_warnings").and_then(Value::as_array).into_iter().flatten() {
|
||||
eprintln!("{path}: step {}: {}", step + 1, w.as_str().unwrap_or_default());
|
||||
}
|
||||
}
|
||||
|
||||
/// `--param-check off|warn|strict`: how calls that break a command's parameter contract are
|
||||
/// treated (docs/mcp.md); off when the option isn't given.
|
||||
fn parse_param_check(cmd: &str, args: &[String]) -> Result<solidcraft_engine::schema::ParamCheck, String> {
|
||||
match flag(args, "--param-check") {
|
||||
None if args.iter().any(|a| a == "--param-check") => Err(format!("{cmd}: --param-check wants off, warn or strict")),
|
||||
None => Ok(solidcraft_engine::schema::ParamCheck::Off),
|
||||
Some(v) => {
|
||||
solidcraft_engine::schema::ParamCheck::parse(v).ok_or_else(|| format!("{cmd}: --param-check wants off, warn or strict, not `{v}`"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn flag<'a>(args: &'a [String], name: &str) -> Option<&'a str> {
|
||||
args.iter().position(|a| a == name).and_then(|i| args.get(i + 1)).map(String::as_str)
|
||||
}
|
||||
@@ -367,7 +386,15 @@ fn print_json(v: &Value, file: Option<&str>) -> Result<(), String> {
|
||||
fn cmd_run(args: &[String]) -> Result<(), String> {
|
||||
install_renderer();
|
||||
let json_out = json_out(args)?;
|
||||
known_args("run", args, &["--in", "--out", "--save", "--json-out"], &["--quiet", "--results", "--timings", "--profile", "--allow-errors"], true)?;
|
||||
// Before the option check, so a bare `--param-check` gets the words `mcp` uses.
|
||||
let check = parse_param_check("run", args)?;
|
||||
known_args(
|
||||
"run",
|
||||
args,
|
||||
&["--in", "--out", "--save", "--json-out", "--param-check"],
|
||||
&["--quiet", "--results", "--timings", "--profile", "--allow-errors"],
|
||||
true,
|
||||
)?;
|
||||
let base = flag(args, "--in");
|
||||
let path = positional(args);
|
||||
if path.is_none() && base.is_none() {
|
||||
@@ -380,23 +407,25 @@ fn cmd_run(args: &[String]) -> Result<(), String> {
|
||||
let (mut s, results) = if want_results || timings {
|
||||
// Collect every command's result or time (scripts only), then process requested files too.
|
||||
let mut s = match base {
|
||||
Some(b) => load(b)?,
|
||||
Some(b) => load_checked(b, check)?,
|
||||
None => Session::default(),
|
||||
};
|
||||
s.param_check = check;
|
||||
let needs = if want_results { "--results needs a script" } else { "--timings needs a script" };
|
||||
let v = read_json(path.ok_or(needs)?)?;
|
||||
let script = path.ok_or(needs)?;
|
||||
let v = read_json(script)?;
|
||||
let out = if timings {
|
||||
let (r, mut t) = s.run_script_timed(&v, profile).map_err(|e| e.to_string())?;
|
||||
let (r, mut t) = s.run_script_timed(&v, profile, &mut |step, r| print_param_warnings(script, step, r)).map_err(|e| e.to_string())?;
|
||||
if want_results && let Some(o) = t.as_object_mut() {
|
||||
o.insert("results".into(), Value::Array(r));
|
||||
}
|
||||
t
|
||||
} else {
|
||||
Value::Array(s.run_script(&v).map_err(|e| e.to_string())?)
|
||||
Value::Array(run_script_warning(&mut s, script, &v)?)
|
||||
};
|
||||
(s, Some(out))
|
||||
} else {
|
||||
(open(base, path)?, None)
|
||||
(open(base, path, check)?, None)
|
||||
};
|
||||
// A feature that fails leaves the bodies as they were before it (a parameter change can
|
||||
// break a feature without failing the command that made it): writing them would hand out
|
||||
@@ -421,16 +450,16 @@ fn cmd_run(args: &[String]) -> Result<(), String> {
|
||||
}
|
||||
|
||||
/// The session `run`, `eval` and `snapshot` start from: `--in` (a design or STEP file) with the
|
||||
/// positional script run on top of it, or either one alone.
|
||||
fn open(base: Option<&str>, path: Option<&String>) -> Result<Session, String> {
|
||||
/// positional script run on top of it, or either one alone, with scripts run at `check`.
|
||||
fn open(base: Option<&str>, path: Option<&String>, check: solidcraft_engine::schema::ParamCheck) -> Result<Session, String> {
|
||||
match (base, path) {
|
||||
(Some(b), Some(p)) => {
|
||||
let mut s = load(b)?;
|
||||
s.run_script(&read_json(p)?).map_err(|e| e.to_string())?;
|
||||
let mut s = load_checked(b, check)?;
|
||||
run_script_warning(&mut s, p, &read_json(p)?)?;
|
||||
Ok(s)
|
||||
}
|
||||
(Some(b), None) => load(b),
|
||||
(None, Some(p)) => load(p),
|
||||
(Some(b), None) => load_checked(b, check),
|
||||
(None, Some(p)) => load_checked(p, check),
|
||||
(None, None) => Err(usage()),
|
||||
}
|
||||
}
|
||||
@@ -473,7 +502,7 @@ fn timeline_ok(s: &Session) -> Result<(), String> {
|
||||
fn cmd_eval(args: &[String]) -> Result<(), String> {
|
||||
let json_out = json_out(args)?;
|
||||
known_args("eval", args, &["--in", "--json-out"], &[], true)?;
|
||||
let mut s = open(flag(args, "--in"), positional(args))?;
|
||||
let mut s = open(flag(args, "--in"), positional(args), solidcraft_engine::schema::ParamCheck::Off)?;
|
||||
let m = s.execute("inspect.measure", &json!({})).map_err(|e| e.to_string())?;
|
||||
let d = s.execute("document.inspect", &json!({})).map_err(|e| e.to_string())?;
|
||||
let out = json!({
|
||||
@@ -567,7 +596,7 @@ fn cmd_snapshot(args: &[String]) -> Result<(), String> {
|
||||
Some(x) => x.parse().ok().filter(|n| (16..=8192).contains(n)).ok_or_else(|| format!("{name} must be 16 to 8192 pixels, not `{x}`")),
|
||||
};
|
||||
let (w, h) = (size("--width", 1280)?, size("--height", 800)?);
|
||||
let mut s = open(flag(args, "--in"), positional(args))?;
|
||||
let mut s = open(flag(args, "--in"), positional(args), solidcraft_engine::schema::ParamCheck::Off)?;
|
||||
// How the bodies are drawn and where the model is cut, through the commands the app's
|
||||
// Appearance dialog and Section Analysis run (`preview`).
|
||||
preview::apply(&mut s, &flags(args, "--body"), &flags(args, "--tool"), flag(args, "--section"))?;
|
||||
@@ -691,17 +720,8 @@ fn cmd_mcp(args: &[String]) -> Result<(), String> {
|
||||
eprintln!("solidcraft mcp: the design's folder is left out because {why}; add it with --allow-path if you mean it");
|
||||
}
|
||||
}
|
||||
// How a headless session treats calls that break a command's parameter contract (docs/mcp.md).
|
||||
let param_check = match flag(args, "--param-check") {
|
||||
None if args.iter().any(|a| a == "--param-check") => return Err("mcp: --param-check wants off, warn or strict".into()),
|
||||
None => solidcraft_engine::schema::ParamCheck::Off,
|
||||
Some(v) => {
|
||||
solidcraft_engine::schema::ParamCheck::parse(v).ok_or_else(|| format!("mcp: --param-check wants off, warn or strict, not `{v}`"))?
|
||||
}
|
||||
};
|
||||
if param_check != solidcraft_engine::schema::ParamCheck::Off && flag(args, "--connect").is_some() {
|
||||
eprintln!("solidcraft mcp: --param-check applies to headless sessions; calls to the app are not checked yet");
|
||||
}
|
||||
// How calls that break a command's parameter contract are treated, headless or bridged.
|
||||
let param_check = parse_param_check("mcp", args)?;
|
||||
let backend: Box<dyn solidcraft_mcp::Backend> = match (flag(args, "--connect"), flag(args, "--in")) {
|
||||
(Some(_), Some(_)) => return Err("mcp: use either --connect or --in, not both".into()),
|
||||
(Some(addr), None) => {
|
||||
@@ -709,7 +729,7 @@ fn cmd_mcp(args: &[String]) -> Result<(), String> {
|
||||
return Err(format!("mcp: --connect wants HOST:PORT, such as 127.0.0.1:7878, not `{addr}`"));
|
||||
};
|
||||
// Serve without the app too: the tools connect once it runs, and say it isn't until then.
|
||||
let mut remote = solidcraft_mcp::Remote::new(addr, flag(args, "--token"));
|
||||
let mut remote = solidcraft_mcp::Remote::new(addr, flag(args, "--token")).with_param_check(param_check);
|
||||
if let Err(e) = remote.try_connect() {
|
||||
eprintln!(
|
||||
"solidcraft mcp: no SolidCraft app at {addr} yet ({e}); start it with `solidcraft --control {port}` \
|
||||
@@ -729,7 +749,8 @@ fn cmd_mcp(args: &[String]) -> Result<(), String> {
|
||||
let auto = !args.iter().any(|a| a == "--headless");
|
||||
if auto && let Some(port) = discover_app() {
|
||||
eprintln!("solidcraft mcp: bridged to the running app at 127.0.0.1:{port} (--headless starts a session of its own)");
|
||||
return serve_mcp(Box::new(solidcraft_mcp::Remote::new(&format!("127.0.0.1:{port}"), flag(args, "--token"))), scope);
|
||||
let remote = solidcraft_mcp::Remote::new(&format!("127.0.0.1:{port}"), flag(args, "--token")).with_param_check(param_check);
|
||||
return serve_mcp(Box::new(remote), scope);
|
||||
}
|
||||
let mut headless = solidcraft_mcp::Headless::default();
|
||||
headless.session.param_check = param_check;
|
||||
|
||||
@@ -288,3 +288,47 @@ fn undoing_an_edit_after_opening_reuses_the_saved_results() {
|
||||
let _ = std::fs::remove_file(&path);
|
||||
let _ = std::fs::remove_file(format!("{}.bak", path.display()));
|
||||
}
|
||||
|
||||
/// A design saved before body names were pinned (#6403) pins them as it opens, as its first
|
||||
/// command would, and opening it is no change. That command pinned them as part of itself, so
|
||||
/// undoing it went back to the unpinned design, which no evaluated result matched: the first
|
||||
/// undo after opening from the command line evaluated every feature again (82-93 s in a
|
||||
/// 5,484-feature design); `doc.open` pinned them after opening, which marked the design changed.
|
||||
#[test]
|
||||
fn a_design_saved_before_names_were_pinned_opens_pinned_and_unchanged() {
|
||||
let plate = solidcraft_engine::sample::samples().into_iter().find(|s| s.name == "Sample Plate").unwrap();
|
||||
let mut built = Session::default();
|
||||
for c in (plate.script)()["commands"].as_array().unwrap() {
|
||||
built.execute(c["command"].as_str().unwrap(), &c["params"]).unwrap();
|
||||
}
|
||||
let mut doc = built.design().into_owned();
|
||||
for f in &mut doc.features {
|
||||
f.body_names.clear();
|
||||
}
|
||||
doc.reserved_body_names.clear();
|
||||
let unpinned = Session::new(doc);
|
||||
let design = unpinned.design();
|
||||
let saved = unpinned.model.saved(&design).unwrap();
|
||||
let bytes = solidcraft_engine::io::write_design_container_with_cache(&design, solidcraft_engine::io::DesignCompression::Fast, None, Some(&saved))
|
||||
.unwrap();
|
||||
let path = temp("unpinned");
|
||||
std::fs::write(&path, &bytes).unwrap();
|
||||
let file = path.to_string_lossy().to_string();
|
||||
// As the command line opens a design (`load`), and as the app does (`doc.open`).
|
||||
let (doc, saved) = solidcraft_engine::io::read_design_file(&file, None::<fn(solidcraft_engine::io::DesignPreview)>).unwrap();
|
||||
for (how, mut s) in [("opened_at", Session::opened_at(doc, saved.as_ref(), Some(&file))), ("doc.open", open(&path))] {
|
||||
assert_eq!(s.model.last_recomputed, 0, "{how}: taken from the file");
|
||||
assert!(s.doc.features.iter().any(|f| !f.body_names.is_empty()), "{how}: the names are pinned");
|
||||
assert!(!s.is_dirty(), "{how}: opening is no change");
|
||||
let read: Vec<Arc<ModelState>> = s.model.results.iter().map(|r| r.state.clone()).collect();
|
||||
s.execute("solid.box", &json!({"length": 3, "width": 3, "height": 3, "operation": "new"})).unwrap();
|
||||
// As in a large design, whose evaluation cache keeps only a few results: undo finds the
|
||||
// results in the model itself or evaluates them again.
|
||||
*s.model.cache.lock().unwrap() = Default::default();
|
||||
s.execute("edit.undo", &json!({})).unwrap();
|
||||
assert_eq!(s.model.last_recomputed, 0, "{how}: the first undo evaluates nothing");
|
||||
assert!(s.model.results.iter().zip(&read).all(|(r, st)| Arc::ptr_eq(&r.state, st)), "{how}: the states read from the file");
|
||||
assert!(!s.is_dirty(), "{how}: undone to the design as opened");
|
||||
}
|
||||
let _ = std::fs::remove_file(&path);
|
||||
}
|
||||
|
||||
@@ -496,6 +496,78 @@ fn timings_and_profile_report_each_command() {
|
||||
assert!(String::from_utf8_lossy(&output.stderr).contains("--timings needs a script"));
|
||||
}
|
||||
|
||||
/// #6921: `--param-check` checks a script's steps against their contracts on every path `run`
|
||||
/// takes (a script alone, on an `--in` design or script, with `--results`, `--timings` or
|
||||
/// `--profile`), and a warning reaches stderr even when a later step fails.
|
||||
#[test]
|
||||
fn param_check_reaches_every_script_run_takes() {
|
||||
let dir = Scratch::new();
|
||||
let typo = dir.0.join("typo.json");
|
||||
let step = json!({"command": "solid.box", "params": {"length": 2, "width": 3, "height": 4, "operaton": "new"}});
|
||||
std::fs::write(&typo, json!({"commands": [step.clone()]}).to_string()).unwrap();
|
||||
let base = dir.0.join("base.solidcraft");
|
||||
json_output(cli().arg("run").arg(dir.script()).arg("--save").arg(&base).output().unwrap());
|
||||
let saved = dir.0.join("saved.solidcraft");
|
||||
let start = dir.script();
|
||||
let (typo, base, saved_arg, start) = (typo.to_str().unwrap(), base.to_str().unwrap(), saved.to_str().unwrap(), start.to_str().unwrap());
|
||||
let paths = [&[][..], &["--in", base], &["--in", start], &["--results"], &["--timings"], &["--timings", "--profile"]];
|
||||
let run = |level: Option<&str>, extra: &[&str]| {
|
||||
std::fs::remove_file(&saved).ok();
|
||||
let check = level.map(|l| ["--param-check", l]).into_iter().flatten();
|
||||
cli().args(["run", typo, "--save", saved_arg]).args(check).args(extra).output().unwrap()
|
||||
};
|
||||
|
||||
// Off, the default: the step runs as it always has, without a word.
|
||||
let off = run(None, &[]);
|
||||
assert!(off.status.success() && !String::from_utf8_lossy(&off.stderr).contains("operaton"), "{off:?}");
|
||||
assert_eq!(body_count(&saved), 1);
|
||||
|
||||
// Warn: each path runs the step, saves, and reports it on stderr; `--results` keeps it too.
|
||||
for extra in paths {
|
||||
let output = run(Some("warn"), extra);
|
||||
let stderr = String::from_utf8_lossy(&output.stderr);
|
||||
assert!(output.status.success(), "{extra:?}: {stderr}");
|
||||
assert!(stderr.contains("step 1: unknown key `operaton`; did you mean `operation`?"), "{extra:?}: {stderr}");
|
||||
assert!(saved.exists(), "{extra:?}");
|
||||
if extra == ["--results"] {
|
||||
let results: Value = serde_json::from_slice(&output.stdout).unwrap();
|
||||
assert!(results[0]["param_warnings"][0].as_str().is_some_and(|w| w.contains("operaton")), "{results}");
|
||||
}
|
||||
}
|
||||
|
||||
// Strict: on each path the run stops at the step, and nothing is written.
|
||||
for extra in paths {
|
||||
let output = run(Some("strict"), extra);
|
||||
let stderr = String::from_utf8_lossy(&output.stderr);
|
||||
assert_eq!(output.status.code(), Some(1), "{extra:?}: {stderr}");
|
||||
assert!(stderr.contains("unknown key `operaton`"), "{extra:?}: {stderr}");
|
||||
assert!(!saved.exists(), "{extra:?}");
|
||||
}
|
||||
|
||||
// Warn, with a later step that fails: the run fails, and the first step's warning is still
|
||||
// reported, timed or not.
|
||||
let failing = dir.0.join("failing.json");
|
||||
let fail = json!({"command": "solid.extrude", "params": {"sketch": "Nope"}});
|
||||
std::fs::write(&failing, json!({"commands": [step, fail]}).to_string()).unwrap();
|
||||
for extra in [&[][..], &["--timings"]] {
|
||||
let output = cli().arg("run").arg(&failing).args(["--param-check", "warn"]).args(extra).output().unwrap();
|
||||
let stderr = String::from_utf8_lossy(&output.stderr);
|
||||
assert_eq!(output.status.code(), Some(1), "{extra:?}: {stderr}");
|
||||
assert!(stderr.contains("step 1: unknown key `operaton`") && stderr.contains("no sketch `Nope`"), "{extra:?}: {stderr}");
|
||||
}
|
||||
|
||||
// A level it doesn't know and a missing value fail.
|
||||
for (bad, says) in [
|
||||
(&["--param-check", "loud"][..], "--param-check wants off, warn or strict, not `loud`"),
|
||||
(&["--param-check"], "run: --param-check wants off, warn or strict"),
|
||||
] {
|
||||
let output = cli().args(["run", typo]).args(bad).output().unwrap();
|
||||
let stderr = String::from_utf8_lossy(&output.stderr);
|
||||
assert_eq!(output.status.code(), Some(1), "{bad:?}: {stderr}");
|
||||
assert!(stderr.contains(says), "{bad:?}: {stderr}");
|
||||
}
|
||||
}
|
||||
|
||||
fn render_setup_script(dir: &Scratch, job: Value) -> PathBuf {
|
||||
let path = dir.0.join("render.json");
|
||||
std::fs::write(
|
||||
|
||||
@@ -34,7 +34,7 @@ serde_json = { workspace = true }
|
||||
web-sys = { version = "0.3", features = [
|
||||
"Window", "Document", "Element", "HtmlElement", "HtmlCanvasElement", "Location", "Navigator", "StorageManager",
|
||||
"FileSystemHandle", "FileSystemDirectoryHandle", "FileSystemFileHandle", "FileSystemGetFileOptions", "FileSystemWritableFileStream",
|
||||
"WritableStream", "File", "FileList", "Blob", "BlobPropertyBag", "Url", "HtmlAnchorElement", "HtmlInputElement", "Storage",
|
||||
"WritableStream", "File", "FileList", "Blob", "BlobPropertyBag", "Url", "HtmlAnchorElement", "HtmlInputElement", "Storage", "StorageEvent",
|
||||
"IdbFactory", "IdbDatabase", "IdbObjectStore", "IdbOpenDbRequest", "IdbRequest", "IdbTransaction", "IdbTransactionMode",
|
||||
"Headers", "ReadableStream", "ReadableStreamDefaultReader",
|
||||
"BeforeUnloadEvent", "Event", "EventTarget", "KeyboardEvent", "Response", "FormData", "RequestInit", "MediaQueryList", "Gamepad", "Performance",
|
||||
|
||||
@@ -22,6 +22,10 @@
|
||||
<link data-trunk rel="rust" data-bin="solidcraft-web" data-wasm-opt="z" data-weak-refs />
|
||||
<link data-trunk rel="copy-file" href="../../assets/fonts/biz-udp-gothic/BIZUDPGothic-Regular.ttf" data-target-path="fonts" />
|
||||
<link data-trunk rel="copy-file" href="../../assets/fonts/biz-udp-gothic/OFL.txt" data-target-path="fonts" />
|
||||
<link data-trunk rel="copy-file" href="../../assets/fonts/craft-ui-sc/CraftUI-SC.otf" data-target-path="fonts" />
|
||||
<link data-trunk rel="copy-file" href="../../assets/fonts/craft-ui-sc/OFL.txt" data-target-path="fonts/craft-ui-sc" />
|
||||
<link data-trunk rel="copy-file" href="../../assets/fonts/craft-ui-tc/CraftUI-TC.otf" data-target-path="fonts" />
|
||||
<link data-trunk rel="copy-file" href="../../assets/fonts/craft-ui-tc/OFL.txt" data-target-path="fonts/craft-ui-tc" />
|
||||
<link data-trunk rel="css" href="../../assets/styles/web/loading.css" />
|
||||
<link data-trunk rel="copy-file" href="../../assets/styles/web/loading-logo.svg" />
|
||||
<!-- Installable as an app (manifest.webmanifest); the icons are the Linux exports of the app mark. -->
|
||||
|
||||
@@ -119,6 +119,43 @@ fn closes_design(key: &str, command: bool, shift: bool, alt: bool, design_shown:
|
||||
design_shown && command && !shift && !alt && key.eq_ignore_ascii_case("w")
|
||||
}
|
||||
|
||||
/// The settings a tab last wrote to the browser's storage, or loaded from another tab (#8644).
|
||||
/// Every open tab of the app shares that storage, and eframe saves each tab's whole copy every
|
||||
/// 30 s and when the page loses focus, so a tab still holding old settings put them back over a
|
||||
/// change made in another. A change is now written in the frame it is made, and the other tabs
|
||||
/// load it ([`settings_written`]).
|
||||
#[cfg(any(target_arch = "wasm32", test))]
|
||||
#[derive(Default, Debug)]
|
||||
struct PrefsWriter {
|
||||
written: Option<String>,
|
||||
}
|
||||
|
||||
#[cfg(any(target_arch = "wasm32", test))]
|
||||
impl PrefsWriter {
|
||||
/// `prefs` if they are not the settings written or loaded last (they count as written from
|
||||
/// now on).
|
||||
fn take(&mut self, prefs: String) -> Option<String> {
|
||||
if self.written.as_deref() == Some(prefs.as_str()) {
|
||||
return None;
|
||||
}
|
||||
self.written = Some(prefs.clone());
|
||||
Some(prefs)
|
||||
}
|
||||
|
||||
/// The settings the tab holds after loading another tab's: the tab doesn't write them back.
|
||||
fn loaded(&mut self, prefs: String) {
|
||||
self.written = Some(prefs);
|
||||
}
|
||||
}
|
||||
|
||||
/// The settings another tab wrote, from a `storage` event (the browser sends one to every other
|
||||
/// tab of the page when one tab writes). Other keys, and settings taken away (clearing the site's
|
||||
/// data), leave this tab's settings as they are.
|
||||
#[cfg(any(target_arch = "wasm32", test))]
|
||||
fn settings_written(key: Option<&str>, value: Option<String>) -> Option<String> {
|
||||
value.filter(|_| key == Some(solidcraft_ui_egui::prefs::STORAGE_KEY))
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
mod web {
|
||||
use std::rc::Rc;
|
||||
@@ -217,9 +254,29 @@ mod web {
|
||||
on_key.forget();
|
||||
}
|
||||
|
||||
const JAPANESE_FONT_PATH: &str = "./fonts/BIZUDPGothic-Regular.ttf";
|
||||
/// Settings another tab wrote, waiting for this tab's next frame (#8644).
|
||||
type PrefsInbox = Rc<std::cell::Cell<Option<String>>>;
|
||||
|
||||
type FontLoadResult = Rc<std::cell::RefCell<Option<Result<Vec<u8>, String>>>>;
|
||||
/// Settings another tab of the app writes go to `inbox`, and this tab draws a frame, which
|
||||
/// loads them.
|
||||
fn hear_settings_from_other_tabs(window: &web_sys::Window, ctx: &egui::Context, inbox: PrefsInbox) {
|
||||
let ctx = ctx.clone();
|
||||
let on_storage = wasm_bindgen::closure::Closure::<dyn FnMut(web_sys::StorageEvent)>::new(move |e: web_sys::StorageEvent| {
|
||||
if let Some(prefs) = crate::settings_written(e.key().as_deref(), e.new_value()) {
|
||||
inbox.set(Some(prefs));
|
||||
ctx.request_repaint();
|
||||
}
|
||||
});
|
||||
let _ = window.add_event_listener_with_callback("storage", on_storage.as_ref().unchecked_ref());
|
||||
// The listener lives as long as the page.
|
||||
on_storage.forget();
|
||||
}
|
||||
|
||||
const JAPANESE_FONT_PATH: &str = "./fonts/BIZUDPGothic-Regular.ttf";
|
||||
const CHINESE_SC_FONT_PATH: &str = "./fonts/CraftUI-SC.otf";
|
||||
const CHINESE_TC_FONT_PATH: &str = "./fonts/CraftUI-TC.otf";
|
||||
|
||||
type FontLoadResult = Rc<std::cell::RefCell<Option<Result<(String, Vec<u8>), String>>>>;
|
||||
|
||||
struct Shell {
|
||||
app: SolveApp,
|
||||
@@ -237,18 +294,63 @@ mod web {
|
||||
rename_focus: bool,
|
||||
/// The start page's recent designs were filled from the stored ones.
|
||||
recents_synced: bool,
|
||||
/// On-demand CJK font: fetched only when a CJK language is selected.
|
||||
/// On-demand script fonts: fetched only when a CJK language is selected.
|
||||
font: solidcraft_ui_egui::fonts::CjkFontLoader,
|
||||
font_result: FontLoadResult,
|
||||
/// The fetched CJK font's bytes: kept so a language change can re-order the fallbacks.
|
||||
/// The fetched Japanese font's bytes: kept so a language change can re-order the fallbacks.
|
||||
cjk_bytes: Option<Vec<u8>>,
|
||||
/// The fetched Chinese font's bytes (Simplified or Traditional for this session).
|
||||
chinese_bytes: Option<Vec<u8>>,
|
||||
/// Which Chinese face `chinese_bytes` is: `"zh"` or `"zh-TW"`.
|
||||
chinese_kind: Option<&'static str>,
|
||||
/// Kind requested by the in-flight fetch (`"ja"`, `"zh"`, or `"zh-TW"`).
|
||||
font_fetch_kind: Option<&'static str>,
|
||||
/// The language the fonts were last set up for (a CJK UI leads with the CJK face).
|
||||
font_language: String,
|
||||
space_mouse: SpaceMouse,
|
||||
wheel_gestures: solidcraft_ui_egui::WebWheelGestures,
|
||||
/// The settings this tab wrote or loaded last, and those another tab wrote since (#8644).
|
||||
prefs_writer: crate::PrefsWriter,
|
||||
other_tab_prefs: PrefsInbox,
|
||||
}
|
||||
|
||||
impl Shell {
|
||||
/// The settings as they are kept between visits: with the user's own language, not a
|
||||
/// session-only English fallback.
|
||||
fn persisted_prefs(&mut self) -> String {
|
||||
let saved = self.font.persisted_language(&self.app.preferences.language).to_owned();
|
||||
let live = std::mem::replace(&mut self.app.preferences.language, saved);
|
||||
let prefs = self.app.prefs();
|
||||
self.app.preferences.language = live;
|
||||
prefs
|
||||
}
|
||||
|
||||
/// A settings change goes to the browser's storage in the frame it is made, and from
|
||||
/// there to the other open tabs (#8644). Input is what changes settings, so a frame
|
||||
/// without any is skipped; eframe's own save still catches anything else.
|
||||
fn store_prefs(&mut self, ctx: &egui::Context) {
|
||||
if !self.launch.persists() || ctx.input(|i| i.events.is_empty()) {
|
||||
return;
|
||||
}
|
||||
let prefs = self.persisted_prefs();
|
||||
let Some(prefs) = self.prefs_writer.take(prefs) else { return };
|
||||
let stored =
|
||||
web_sys::window().and_then(|w| w.local_storage().ok().flatten()).map(|s| s.set_item(solidcraft_ui_egui::prefs::STORAGE_KEY, &prefs));
|
||||
if !matches!(stored, Some(Ok(()))) {
|
||||
log::warn!("settings: the browser's storage did not take them; they are saved again later");
|
||||
self.prefs_writer = crate::PrefsWriter::default();
|
||||
}
|
||||
}
|
||||
|
||||
/// Settings another tab wrote replace this tab's, so this tab's own saves keep them
|
||||
/// instead of putting its older copy back (#8644).
|
||||
fn load_other_tabs_prefs(&mut self) {
|
||||
let Some(prefs) = self.other_tab_prefs.take() else { return };
|
||||
self.app.load_prefs(&prefs);
|
||||
let held = self.persisted_prefs();
|
||||
self.prefs_writer.loaded(held);
|
||||
}
|
||||
|
||||
/// Files from the computer, writes to store, messages and the autosave.
|
||||
fn files_tick(&mut self, ctx: &egui::Context) {
|
||||
if !self.launch.persists() {
|
||||
@@ -580,32 +682,60 @@ mod web {
|
||||
files::autosave(&self.files, None);
|
||||
}
|
||||
|
||||
/// Fetch and install the CJK font when a CJK language is selected. If that fails, this
|
||||
/// Whether the shell already has the on-demand face the live language needs.
|
||||
fn script_font_ready(&self) -> bool {
|
||||
match solidcraft_ui_egui::fonts::web_script_font_kind(&self.app.preferences.language) {
|
||||
Some("zh") => self.chinese_bytes.is_some() && self.chinese_kind == Some("zh"),
|
||||
Some("zh-TW") => self.chinese_bytes.is_some() && self.chinese_kind == Some("zh-TW"),
|
||||
Some("ja") => self.cjk_bytes.is_some(),
|
||||
_ => true,
|
||||
}
|
||||
}
|
||||
|
||||
/// Fetch and install a script font when a CJK language is selected. If that fails, this
|
||||
/// session falls back to English (no tofu); the saved language preference is kept.
|
||||
fn tick_font(&mut self, ctx: &egui::Context) {
|
||||
let done = self.font_result.borrow_mut().take();
|
||||
if let Some(res) = done {
|
||||
let kind = self.font_fetch_kind.take();
|
||||
let installed = match res {
|
||||
Ok(bytes) => {
|
||||
self.cjk_bytes = Some(bytes);
|
||||
Ok((path, bytes)) => {
|
||||
match kind {
|
||||
Some("zh") => {
|
||||
self.chinese_bytes = Some(bytes);
|
||||
self.chinese_kind = Some("zh");
|
||||
}
|
||||
Some("zh-TW") => {
|
||||
self.chinese_bytes = Some(bytes);
|
||||
self.chinese_kind = Some("zh-TW");
|
||||
}
|
||||
_ => {
|
||||
self.cjk_bytes = Some(bytes);
|
||||
}
|
||||
}
|
||||
log::info!("loaded web script font from {path}");
|
||||
true
|
||||
}
|
||||
Err(err) => {
|
||||
log::warn!("failed to fetch CJK font from {JAPANESE_FONT_PATH}: {err}");
|
||||
let path = match kind {
|
||||
Some("zh") => CHINESE_SC_FONT_PATH,
|
||||
Some("zh-TW") => CHINESE_TC_FONT_PATH,
|
||||
_ => JAPANESE_FONT_PATH,
|
||||
};
|
||||
log::warn!("failed to fetch script font from {path}: {err}");
|
||||
false
|
||||
}
|
||||
};
|
||||
if installed {
|
||||
log::info!("loaded web CJK font from {JAPANESE_FONT_PATH}");
|
||||
} else if solidcraft_ui_egui::fonts::needs_cjk_font(&self.app.preferences.language) {
|
||||
log::warn!("CJK font unavailable; showing English for this session");
|
||||
if !installed && solidcraft_ui_egui::fonts::needs_cjk_font(&self.app.preferences.language) {
|
||||
log::warn!("script font unavailable; showing English for this session");
|
||||
}
|
||||
self.font.finished(installed, &mut self.app.preferences.language);
|
||||
self.apply_fonts(ctx);
|
||||
ctx.request_repaint();
|
||||
}
|
||||
if self.font.tick(&mut self.app.preferences.language) {
|
||||
self.fetch_font(ctx);
|
||||
let ready = self.script_font_ready();
|
||||
if self.font.tick(&mut self.app.preferences.language, ready) {
|
||||
self.fetch_font(ctx, solidcraft_ui_egui::fonts::web_script_font_kind(&self.app.preferences.language).unwrap_or("ja"));
|
||||
}
|
||||
// The CJK face leads only a CJK UI: its Cyrillic glyphs are full-width, so switching
|
||||
// to Ukrainian (or English) must put the Latin face back in front.
|
||||
@@ -614,31 +744,42 @@ mod web {
|
||||
}
|
||||
}
|
||||
|
||||
/// Set up the UI fonts for the live language, keeping the fetched CJK font as a fallback
|
||||
/// (it leads only for a CJK UI, see [`solidcraft_ui_egui::fonts::install_cjk_font_for`]).
|
||||
/// Set up the UI fonts for the live language, keeping fetched script fonts as fallbacks
|
||||
/// (Chinese leads a Chinese UI; see [`solidcraft_ui_egui::fonts::install_web_script_fonts`]).
|
||||
fn apply_fonts(&mut self, ctx: &egui::Context) {
|
||||
match self.cjk_bytes.clone() {
|
||||
Some(bytes) => {
|
||||
solidcraft_ui_egui::fonts::install_cjk_font_for(ctx, bytes, &self.app.preferences.language);
|
||||
}
|
||||
None => solidcraft_ui_egui::fonts::setup_fonts(ctx),
|
||||
if self.cjk_bytes.is_none() && self.chinese_bytes.is_none() {
|
||||
solidcraft_ui_egui::fonts::setup_fonts(ctx);
|
||||
} else {
|
||||
solidcraft_ui_egui::fonts::install_web_script_fonts(
|
||||
ctx,
|
||||
self.cjk_bytes.clone(),
|
||||
self.chinese_bytes.clone(),
|
||||
&self.app.preferences.language,
|
||||
);
|
||||
}
|
||||
self.font_language.clone_from(&self.app.preferences.language);
|
||||
}
|
||||
|
||||
/// CJK text on screen with no CJK font yet (an English UI showing a Japanese name):
|
||||
/// fetch the font, so the text does not stay tofu (#720).
|
||||
/// CJK text on screen with no Japanese font yet (an English UI showing a Japanese name):
|
||||
/// fetch the Japanese font, so the text does not stay tofu (#720).
|
||||
fn watch_text_for_font(&mut self, ctx: &egui::Context) {
|
||||
if self.font.watching_text() && solidcraft_ui_egui::fonts::painted_cjk(ctx) && self.font.text_needs_font() {
|
||||
self.fetch_font(ctx);
|
||||
self.fetch_font(ctx, "ja");
|
||||
}
|
||||
}
|
||||
|
||||
fn fetch_font(&self, ctx: &egui::Context) {
|
||||
fn fetch_font(&mut self, ctx: &egui::Context, kind: &'static str) {
|
||||
let path = match kind {
|
||||
"zh" => CHINESE_SC_FONT_PATH,
|
||||
"zh-TW" => CHINESE_TC_FONT_PATH,
|
||||
_ => JAPANESE_FONT_PATH,
|
||||
};
|
||||
self.font_fetch_kind = Some(kind);
|
||||
let slot = self.font_result.clone();
|
||||
let ctx = ctx.clone();
|
||||
let path = path.to_owned();
|
||||
wasm_bindgen_futures::spawn_local(async move {
|
||||
let res = fetch_font_bytes(JAPANESE_FONT_PATH).await;
|
||||
let res = fetch_font_bytes(&path).await.map(|bytes| (path, bytes));
|
||||
*slot.borrow_mut() = Some(res);
|
||||
ctx.request_repaint();
|
||||
});
|
||||
@@ -647,6 +788,8 @@ mod web {
|
||||
|
||||
impl eframe::App for Shell {
|
||||
fn logic(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
|
||||
// First: a language another tab chose fetches its font this frame.
|
||||
self.load_other_tabs_prefs();
|
||||
self.tick_font(ctx);
|
||||
self.app.logic(ctx);
|
||||
self.api.poll();
|
||||
@@ -689,6 +832,7 @@ mod web {
|
||||
self.recovery_prompt(&ctx);
|
||||
}
|
||||
self.watch_text_for_font(&ctx);
|
||||
self.store_prefs(&ctx);
|
||||
}
|
||||
fn persist_egui_memory(&self) -> bool {
|
||||
self.launch.persists()
|
||||
@@ -697,11 +841,8 @@ mod web {
|
||||
if !self.launch.persists() {
|
||||
return;
|
||||
}
|
||||
// Persist the user's own language, not a session-only English fallback.
|
||||
let saved = self.font.persisted_language(&self.app.preferences.language).to_owned();
|
||||
let live = std::mem::replace(&mut self.app.preferences.language, saved);
|
||||
storage.set_string(solidcraft_ui_egui::prefs::STORAGE_KEY, self.app.prefs());
|
||||
self.app.preferences.language = live;
|
||||
let prefs = self.persisted_prefs();
|
||||
storage.set_string(solidcraft_ui_egui::prefs::STORAGE_KEY, prefs);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -822,6 +963,12 @@ mod web {
|
||||
let (sender, receiver) = std::sync::mpsc::channel();
|
||||
let mut app = SolveApp::new(Session::default(), services).with_control(receiver);
|
||||
app.embedded = launch.embed;
|
||||
// Listening before reading: settings another tab writes from now on are
|
||||
// newer than those read here.
|
||||
let other_tab_prefs = PrefsInbox::default();
|
||||
if launch.persists() {
|
||||
hear_settings_from_other_tabs(&window, &cc.egui_ctx, other_tab_prefs.clone());
|
||||
}
|
||||
if launch.persists() && let Some(p) = cc.storage.and_then(|s| solidcraft_ui_egui::prefs::stored(|k| s.get_string(k))) {
|
||||
app.load_prefs(&p);
|
||||
}
|
||||
@@ -862,9 +1009,14 @@ mod web {
|
||||
font: Default::default(),
|
||||
font_result: Rc::new(std::cell::RefCell::new(None)),
|
||||
cjk_bytes: None,
|
||||
chinese_bytes: None,
|
||||
chinese_kind: None,
|
||||
font_fetch_kind: None,
|
||||
font_language,
|
||||
space_mouse: SpaceMouse::default(),
|
||||
wheel_gestures: solidcraft_ui_egui::WebWheelGestures::default(),
|
||||
prefs_writer: crate::PrefsWriter::default(),
|
||||
other_tab_prefs,
|
||||
}))
|
||||
}),
|
||||
)
|
||||
@@ -1001,4 +1153,28 @@ mod tests {
|
||||
assert!(!closes_design("w", false, false, false, true));
|
||||
assert!(!closes_design("s", true, false, false, true));
|
||||
}
|
||||
|
||||
/// A tab writes its settings when they change, and not again while they stay the same; the
|
||||
/// settings it loaded from another tab aren't written back (#8644).
|
||||
#[test]
|
||||
fn changed_settings_are_written_once_and_loaded_ones_not_at_all() {
|
||||
let mut writer = PrefsWriter::default();
|
||||
assert_eq!(writer.take(r#"{"a":1}"#.into()).as_deref(), Some(r#"{"a":1}"#), "the first settings are written");
|
||||
assert_eq!(writer.take(r#"{"a":1}"#.into()), None, "the same settings are not written again");
|
||||
assert_eq!(writer.take(r#"{"a":2}"#.into()).as_deref(), Some(r#"{"a":2}"#), "a change is written at once");
|
||||
writer.loaded(r#"{"a":3}"#.into());
|
||||
assert_eq!(writer.take(r#"{"a":3}"#.into()), None, "settings from another tab are not written back");
|
||||
assert_eq!(writer.take(r#"{"a":4}"#.into()).as_deref(), Some(r#"{"a":4}"#), "this tab's next change is written");
|
||||
}
|
||||
|
||||
/// Only the settings another tab wrote are loaded: not other keys, and not settings taken
|
||||
/// away by clearing the site's data (#8644).
|
||||
#[test]
|
||||
fn only_settings_another_tab_wrote_are_loaded() {
|
||||
let key = solidcraft_ui_egui::prefs::STORAGE_KEY;
|
||||
assert_eq!(settings_written(Some(key), Some("{}".into())).as_deref(), Some("{}"));
|
||||
assert_eq!(settings_written(Some("solidcraft.webgl"), Some("1".into())), None);
|
||||
assert_eq!(settings_written(Some(key), None), None, "removed settings leave this tab's");
|
||||
assert_eq!(settings_written(None, None), None, "clearing all storage leaves this tab's settings");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,5 +104,10 @@ winit = { version = "0.30", default-features = false, features = ["x11"] }
|
||||
raw-window-handle = "0.6"
|
||||
x11rb = { version = "0.13", default-features = false }
|
||||
|
||||
[target.'cfg(target_os = "linux")'.dependencies]
|
||||
# The desktop's dark or light preference through the XDG Desktop Portal (src/desktop_theme.rs,
|
||||
# #7944); already in the tree through eframe's accessibility support (accesskit_unix).
|
||||
zbus = { version = "5", default-features = false, features = ["async-io", "blocking-api"] }
|
||||
|
||||
[build-dependencies]
|
||||
embed-resource = "3.0.11"
|
||||
|
||||
@@ -24,9 +24,9 @@ const MAX_BAD_LINES: usize = 8;
|
||||
const EVENT_GAP: Duration = Duration::from_millis(100);
|
||||
|
||||
static OPEN: AtomicUsize = AtomicUsize::new(0);
|
||||
/// The token files this launch wrote (its control port, the agent chat's endpoint), removed
|
||||
/// when the app ends.
|
||||
static TOKEN_FILES: std::sync::Mutex<Vec<std::path::PathBuf>> = std::sync::Mutex::new(Vec::new());
|
||||
/// The token files this launch wrote (its control port, the agent chat's endpoint) and the
|
||||
/// token in each, removed when the app ends unless another launch has written the file since.
|
||||
static TOKEN_FILES: std::sync::Mutex<Vec<(std::path::PathBuf, String)>> = std::sync::Mutex::new(Vec::new());
|
||||
|
||||
/// A new random token: 32 bytes from the operating system, as hex.
|
||||
fn new_token() -> Option<String> {
|
||||
@@ -35,20 +35,21 @@ fn new_token() -> Option<String> {
|
||||
Some(bytes.iter().map(|b| format!("{b:02x}")).collect())
|
||||
}
|
||||
|
||||
/// Remove this launch's token file (at exit).
|
||||
/// Remove this launch's token files and discovery file (at exit), leaving any that another
|
||||
/// launch has written since (#8794).
|
||||
pub fn remove_token_file() {
|
||||
if let Ok(files) = TOKEN_FILES.lock() {
|
||||
for p in files.iter() {
|
||||
control_auth::remove_token_file(p);
|
||||
for (path, token) in files.iter() {
|
||||
control_auth::remove_token_file(path, token);
|
||||
}
|
||||
}
|
||||
if let Some(port) = APP_PORT.lock().ok().and_then(|p| *p) {
|
||||
control_auth::remove_current_port(port);
|
||||
if let Some((port, token)) = APP_PORT.lock().ok().and_then(|p| p.clone()) {
|
||||
control_auth::remove_current_port(port, &token);
|
||||
}
|
||||
}
|
||||
|
||||
/// The port the app's own channel listens on, for removing the discovery file at exit.
|
||||
static APP_PORT: std::sync::Mutex<Option<u16>> = std::sync::Mutex::new(None);
|
||||
/// The port the app's own channel listens on and its token, for removing the discovery file at exit.
|
||||
static APP_PORT: std::sync::Mutex<Option<(u16, String)>> = std::sync::Mutex::new(None);
|
||||
|
||||
pub fn start(listen_on: control_auth::Listen, ctx: egui::Context) -> Receiver<ControlRequest> {
|
||||
let (tx, rx) = channel::<ControlRequest>();
|
||||
@@ -61,7 +62,7 @@ pub fn start(listen_on: control_auth::Listen, ctx: egui::Context) -> Receiver<Co
|
||||
};
|
||||
match listener {
|
||||
Ok(l) => {
|
||||
if let Some(port) = listen_on_listener(l, token, tx, ctx, false) {
|
||||
if let Some(port) = listen_on_listener(l, token.clone(), tx, ctx, false) {
|
||||
if matches!(listen_on, control_auth::Listen::Default) {
|
||||
eprintln!("solidcraft: control channel on the default port 127.0.0.1:{port} (Preferences > Assistant turns it off)");
|
||||
}
|
||||
@@ -69,7 +70,7 @@ pub fn start(listen_on: control_auth::Listen, ctx: egui::Context) -> Receiver<Co
|
||||
match control_auth::write_current_port(port) {
|
||||
Ok(_) => {
|
||||
if let Ok(mut p) = APP_PORT.lock() {
|
||||
*p = Some(port);
|
||||
*p = Some((port, token));
|
||||
}
|
||||
}
|
||||
Err(e) => eprintln!("solidcraft: could not write the control discovery file ({e})"),
|
||||
@@ -112,7 +113,7 @@ fn listen_on_listener(listener: TcpListener, token: String, tx: Sender<ControlRe
|
||||
Ok(()) => {
|
||||
eprintln!("solidcraft: control server listening on 127.0.0.1:{port} (token in {})", path.display());
|
||||
if let Ok(mut files) = TOKEN_FILES.lock() {
|
||||
files.push(path);
|
||||
files.push((path, token.clone()));
|
||||
}
|
||||
}
|
||||
Err(e) => eprintln!(
|
||||
@@ -412,11 +413,37 @@ impl Lines {
|
||||
}
|
||||
}
|
||||
|
||||
/// A subscribed connection's seat on the watch: it leaves exactly once, whichever thread sees
|
||||
/// the connection's end first — the connection's own thread at the end of the stream, or the
|
||||
/// events thread at the first write a closed client refuses. The seat used to wait for the
|
||||
/// events thread alone, and that thread only leaves its wait when the design moves, so the
|
||||
/// count could outlive the connection by a second or more (#8315).
|
||||
struct Seat(Mutex<Option<Subscriber>>);
|
||||
|
||||
impl Seat {
|
||||
fn new(counted: Subscriber) -> Self {
|
||||
Seat(Mutex::new(Some(counted)))
|
||||
}
|
||||
|
||||
/// Leave the watch now: the seat goes once, whoever gets here first.
|
||||
fn release(&self) {
|
||||
let counted = self.0.lock().unwrap_or_else(PoisonError::into_inner).take();
|
||||
drop(counted);
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for Seat {
|
||||
fn drop(&mut self) {
|
||||
self.release();
|
||||
}
|
||||
}
|
||||
|
||||
/// A connection's `control.subscribe` (#6985): its `design.changed` lines, sent from a thread of
|
||||
/// their own until the connection ends.
|
||||
struct Subscription {
|
||||
lines: Arc<Lines>,
|
||||
stop: Arc<AtomicBool>,
|
||||
seat: Arc<Seat>,
|
||||
}
|
||||
|
||||
impl Subscription {
|
||||
@@ -432,15 +459,17 @@ impl Subscription {
|
||||
) -> Option<(Self, std::io::Result<()>)> {
|
||||
let lines = Arc::new(Lines { socket: out.try_clone().ok()?, turn: Mutex::new(()) });
|
||||
let stop = Arc::new(AtomicBool::new(false));
|
||||
let seat = Arc::new(Seat::new(counted));
|
||||
let first = lines.turn.lock().unwrap_or_else(PoisonError::into_inner);
|
||||
let (l, s) = (lines.clone(), stop.clone());
|
||||
let (l, s, watch_seat) = (lines.clone(), stop.clone(), Arc::clone(&seat));
|
||||
// The connection's seat on the watch rides the events thread: it leaves when the thread
|
||||
// does, so the next failed write to a closed client retires it even while the connection's
|
||||
// own thread is slow to see the end of the stream (#7226).
|
||||
std::thread::Builder::new().stack_size(64 * 1024).spawn(move || send_events(design, &l, &s, seen, counted)).ok()?;
|
||||
// own thread is slow to see the end of the stream (#7226). The connection's own thread
|
||||
// leaves it too, so a closed connection stops counting at once (#8315).
|
||||
std::thread::Builder::new().stack_size(64 * 1024).spawn(move || send_events(design, &l, &s, seen, watch_seat)).ok()?;
|
||||
let sent = send(&mut &lines.socket, reply);
|
||||
drop(first);
|
||||
Some((Subscription { lines, stop }, sent))
|
||||
Some((Subscription { lines, stop, seat }, sent))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -453,6 +482,9 @@ fn design_of(reply: &Value) -> Option<(String, u64)> {
|
||||
impl Drop for Subscription {
|
||||
fn drop(&mut self) {
|
||||
self.stop.store(true, Ordering::Relaxed);
|
||||
// The seat on the watch goes now: the connection is over, and nothing counts it any more
|
||||
// (#8315).
|
||||
self.seat.release();
|
||||
// The socket closes now, not when the thread next looks; a line blocked on a client that
|
||||
// stopped reading ends too.
|
||||
let _ = self.lines.socket.shutdown(std::net::Shutdown::Both);
|
||||
@@ -460,10 +492,10 @@ impl Drop for Subscription {
|
||||
}
|
||||
|
||||
/// The `design.changed` lines of a subscribed connection, each time the design differs from the
|
||||
/// last one it was told of (`seen`), until `stop`. Owns the connection's seat on the watch
|
||||
/// (`counted`), so the seat leaves exactly when this thread does: on `stop`, or on the first
|
||||
/// write a closed client refuses (#7226).
|
||||
fn send_events(design: &DesignWatch, lines: &Lines, stop: &AtomicBool, mut seen: (String, u64), _counted: Subscriber) {
|
||||
/// last one it was told of (`seen`), until `stop`. Holds the connection's seat on the watch
|
||||
/// (`seat`), which it leaves when the thread ends: on `stop`, or on the first write a closed
|
||||
/// client refuses (#7226).
|
||||
fn send_events(design: &DesignWatch, lines: &Lines, stop: &AtomicBool, mut seen: (String, u64), seat: Arc<Seat>) {
|
||||
while !stop.load(Ordering::Relaxed) {
|
||||
let Some(now) = design.wait(&seen, stop, Duration::from_secs(1)).filter(|now| *now != seen) else { continue };
|
||||
if lines.send(&json!({"event": "design.changed", "params": {"document_id": now.0, "revision": now.1}})).is_err() {
|
||||
@@ -472,6 +504,17 @@ fn send_events(design: &DesignWatch, lines: &Lines, stop: &AtomicBool, mut seen:
|
||||
seen = now;
|
||||
std::thread::sleep(EVENT_GAP);
|
||||
}
|
||||
// The client is gone: it is not counted on the watch any more, whatever the connection's own
|
||||
// thread still has to notice (#8315).
|
||||
seat.release();
|
||||
}
|
||||
|
||||
/// What this app's control channel does beyond the methods every version has, for a client to
|
||||
/// find out before it relies on it (an older app answers `control.capabilities` with "unknown
|
||||
/// method"). `param_check`: the levels `engine.execute`, `engine.batch` and `engine.script` take
|
||||
/// as a request's own parameter check (#9184).
|
||||
fn capabilities() -> Value {
|
||||
json!({"param_check": solidcraft_engine::schema::ParamCheck::ALL.map(|l| l.name())})
|
||||
}
|
||||
|
||||
/// Write `reply` on the connection: through its subscription once it has one.
|
||||
@@ -534,15 +577,20 @@ fn serve_with(
|
||||
let id = msg.get("id").cloned().unwrap_or(Value::Null);
|
||||
let method = msg.get("method").and_then(Value::as_str).unwrap_or("").to_string();
|
||||
let params = msg.get("params").cloned().unwrap_or(json!({}));
|
||||
// A request that timed out may have finished since (#1618). `control.running` only
|
||||
// looks, so it leaves that reply where it is.
|
||||
let late = pending.as_ref().filter(|_| method != "control.running").and_then(|p| match p.reply.try_recv() {
|
||||
// A request that timed out may have finished since (#1618). `control.running` and
|
||||
// `control.capabilities` only look, so they leave that reply where it is.
|
||||
let late = pending.as_ref().filter(|_| !matches!(method.as_str(), "control.running" | "control.capabilities")).and_then(|p| match p
|
||||
.reply
|
||||
.try_recv()
|
||||
{
|
||||
Ok(reply) => Some(reply),
|
||||
Err(TryRecvError::Disconnected) => Some(json!({"ok": false, "error": "the app ended the request without a reply"})),
|
||||
Err(TryRecvError::Empty) => None,
|
||||
});
|
||||
let mut r = if method == "control.running" {
|
||||
json!({"ok": true, "result": running.result(connection)})
|
||||
} else if method == "control.capabilities" {
|
||||
json!({"ok": true, "result": capabilities()})
|
||||
} else if method == "control.pending" {
|
||||
match (pending.take(), late) {
|
||||
(None, _) => json!({"ok": true, "result": {"pending": null}}),
|
||||
@@ -749,6 +797,9 @@ mod tests {
|
||||
let mut watcher = open();
|
||||
let (r, rows) = running(&mut watcher, &|_| true);
|
||||
assert!(r["ok"] == true && rows.is_empty(), "idle: {r}");
|
||||
// What the app's control channel does beyond the methods every version has (#9184).
|
||||
let r = watcher(json!({"id": 0, "method": "control.capabilities", "token": token}));
|
||||
assert_eq!((&r["ok"], &r["result"]["param_check"]), (&json!(true), &json!(["off", "warn", "strict"])), "{r}");
|
||||
|
||||
let mut export = open();
|
||||
let path = "/private/part.step";
|
||||
@@ -780,6 +831,9 @@ mod tests {
|
||||
let own: Vec<&Value> = r["result"]["running"].as_array().unwrap().iter().filter(|row| row["self"] == true).collect();
|
||||
assert_eq!(own.len(), 1, "{r}");
|
||||
assert_eq!(own[0]["command"], "file.export", "{r}");
|
||||
// So may it ask what the app can do: answered at once, not refused as busy.
|
||||
let r = export(json!({"id": 8, "method": "control.capabilities"}));
|
||||
assert_eq!(r["result"]["param_check"], json!(["off", "warn", "strict"]), "{r}");
|
||||
|
||||
gate_tx.send(()).unwrap();
|
||||
assert_eq!(queued.join().unwrap()["result"], "engine.batch");
|
||||
@@ -885,6 +939,58 @@ mod tests {
|
||||
assert!(!WATCH.subscribed());
|
||||
}
|
||||
|
||||
/// #8315: a closed connection leaves the watch at once. The seat of a subscribed connection
|
||||
/// goes when the connection's own thread sees the end of the stream, not only when the
|
||||
/// events thread notices: that thread waits for the design to move, so a connection that
|
||||
/// closed while the design stood still kept the watch counting it for a second or more.
|
||||
#[test]
|
||||
fn a_closed_connection_leaves_the_watch_at_once() {
|
||||
static RUNNING: Running = Running::new();
|
||||
static WATCH: DesignWatch = DesignWatch::new();
|
||||
let token = "0123456789abcdef0123456789abcdef";
|
||||
let listener = TcpListener::bind("127.0.0.1:0").unwrap();
|
||||
let addr = listener.local_addr().unwrap();
|
||||
let (tx, rx) = channel::<ControlRequest>();
|
||||
// The window names the design once and then leaves it alone: nothing moves it, so the
|
||||
// events thread has nothing to write and only the end of the connection can retire it.
|
||||
std::thread::spawn(move || {
|
||||
for req in rx {
|
||||
if req.method == "control.subscribe" {
|
||||
WATCH.publish("d-1", 3);
|
||||
let _ = req.reply.send(json!({"ok": true, "result": {"document_id": "d-1", "revision": 3}}));
|
||||
} else {
|
||||
let _ = req.reply.send(json!({"ok": true, "result": req.method}));
|
||||
}
|
||||
}
|
||||
});
|
||||
std::thread::spawn(move || {
|
||||
for stream in listener.incoming().flatten() {
|
||||
let tx = tx.clone();
|
||||
std::thread::spawn(move || serve_with(stream, token, tx, egui::Context::default(), false, WAITS, &RUNNING, &WATCH));
|
||||
}
|
||||
});
|
||||
let s = TcpStream::connect(addr).unwrap();
|
||||
s.set_read_timeout(Some(Duration::from_secs(10))).unwrap();
|
||||
let mut out = s.try_clone().unwrap();
|
||||
let mut lines = BufReader::new(s);
|
||||
writeln!(out, "{}", json!({"id": 1, "method": "control.subscribe", "token": token})).unwrap();
|
||||
let mut l = String::new();
|
||||
lines.read_line(&mut l).unwrap();
|
||||
let reply: Value = serde_json::from_str(&l).unwrap();
|
||||
assert!(reply["ok"] == true, "{reply}");
|
||||
assert!(WATCH.subscribed(), "the connection is subscribed");
|
||||
// Let the events thread settle into its wait: the design stands still, so it has nothing
|
||||
// to write, and only the end of the connection can retire it.
|
||||
std::thread::sleep(Duration::from_millis(200));
|
||||
// The client goes away without asking anything else.
|
||||
drop((out, lines));
|
||||
let deadline = Instant::now() + Duration::from_millis(400);
|
||||
while WATCH.subscribed() && Instant::now() < deadline {
|
||||
std::thread::sleep(Duration::from_millis(10));
|
||||
}
|
||||
assert!(!WATCH.subscribed(), "a closed connection is not counted on the watch");
|
||||
}
|
||||
|
||||
/// A timed-out request that only reads is not said to "still apply", nor is one that only
|
||||
/// writes a file (an export, #1989); a change is, by name.
|
||||
#[test]
|
||||
|
||||
@@ -0,0 +1,195 @@
|
||||
//! Linux: the desktop's dark or light preference, for Theme: System (#7944).
|
||||
//!
|
||||
//! The window toolkit does not pass it on everywhere: on GNOME (Wayland, or X11 through XWayland)
|
||||
//! the window never learns it, nor when it changes, so the app kept its colours. This reads the
|
||||
//! freedesktop setting through the XDG Desktop Portal's Settings interface on the session bus
|
||||
//! (`org.freedesktop.appearance color-scheme`, then GNOME's `color-scheme` and `gtk-theme`), the
|
||||
//! same setting other applications follow, and inside a Flatpak too. It runs on a thread of its
|
||||
//! own: the first reading, then the portal's `SettingChanged` signal; where the signal can't be
|
||||
//! had, a reading every few seconds. Without a portal it asks `gsettings` instead, on the same
|
||||
//! thread. The window reads the last answer with an atomic load
|
||||
//! (`solidcraft_ui_egui::Services::desktop_dark`), and the decision from the raw values is
|
||||
//! `solidcraft_ui_egui::prefs::desktop_prefers_dark`.
|
||||
|
||||
use std::io::Read;
|
||||
use std::sync::Arc;
|
||||
use std::sync::atomic::{AtomicU8, Ordering};
|
||||
use std::time::Duration;
|
||||
|
||||
use zbus::zvariant::{OwnedValue, Value};
|
||||
|
||||
const UNKNOWN: u8 = 0;
|
||||
const DARK: u8 = 1;
|
||||
const LIGHT: u8 = 2;
|
||||
|
||||
/// How often to read again where the portal's change signal is not available.
|
||||
const POLL: Duration = Duration::from_secs(5);
|
||||
/// How long one `gsettings` reading may take before it is given up.
|
||||
const GSETTINGS_TIMEOUT: Duration = Duration::from_secs(2);
|
||||
|
||||
const PORTAL: &str = "org.freedesktop.portal.Desktop";
|
||||
const PORTAL_PATH: &str = "/org/freedesktop/portal/desktop";
|
||||
const SETTINGS: &str = "org.freedesktop.portal.Settings";
|
||||
const APPEARANCE: &str = "org.freedesktop.appearance";
|
||||
const GNOME: &str = "org.gnome.desktop.interface";
|
||||
|
||||
/// Start following the desktop's preference; the closure answers the latest reading (`None`
|
||||
/// until there is one, or when the desktop says nothing).
|
||||
pub fn start(ctx: &egui::Context) -> Box<dyn Fn() -> Option<bool>> {
|
||||
let state = Arc::new(AtomicU8::new(UNKNOWN));
|
||||
let (thread_state, ctx) = (state.clone(), ctx.clone());
|
||||
if let Err(e) = std::thread::Builder::new().name("desktop-theme".into()).spawn(move || follow(&thread_state, &ctx)) {
|
||||
log::warn!("desktop theme: no thread to follow it: {e}");
|
||||
}
|
||||
Box::new(move || match state.load(Ordering::Relaxed) {
|
||||
DARK => Some(true),
|
||||
LIGHT => Some(false),
|
||||
_ => None,
|
||||
})
|
||||
}
|
||||
|
||||
/// Keep `state` on the desktop's preference, asking for a frame whenever it changes.
|
||||
fn follow(state: &AtomicU8, ctx: &egui::Context) {
|
||||
let publish = |dark: Option<bool>| {
|
||||
let code = match dark {
|
||||
Some(true) => DARK,
|
||||
Some(false) => LIGHT,
|
||||
None => UNKNOWN,
|
||||
};
|
||||
if state.swap(code, Ordering::Relaxed) != code {
|
||||
ctx.request_repaint();
|
||||
}
|
||||
};
|
||||
let portal = match portal() {
|
||||
Ok(p) => Some(p),
|
||||
Err(e) => {
|
||||
log::info!("desktop theme: no settings portal ({e}); asking gsettings");
|
||||
None
|
||||
}
|
||||
};
|
||||
// The portal first; gsettings where there is none or it says nothing (its backend missing).
|
||||
let read = |portal: Option<&zbus::blocking::Proxy<'static>>| portal.and_then(read_portal).or_else(read_gsettings);
|
||||
let from_portal = portal.as_ref().and_then(read_portal);
|
||||
let first = from_portal.or_else(read_gsettings);
|
||||
publish(first);
|
||||
// Wait for the portal's signal only when the portal answers: else the reading is gsettings',
|
||||
// which only a new reading notices.
|
||||
if let Some(p) = portal.as_ref().filter(|_| from_portal.is_some()) {
|
||||
match p.receive_signal("SettingChanged") {
|
||||
Ok(changes) => {
|
||||
for message in changes {
|
||||
if relevant(&message) {
|
||||
publish(read(Some(p)));
|
||||
}
|
||||
}
|
||||
log::info!("desktop theme: the portal's change signal ended; reading every few seconds");
|
||||
}
|
||||
Err(e) => log::info!("desktop theme: no change signal ({e}); reading every few seconds"),
|
||||
}
|
||||
} else if portal.is_none() && first.is_none() && !gsettings_available() {
|
||||
// Neither the portal nor gsettings: nothing to follow; the window toolkit's theme stays.
|
||||
return;
|
||||
}
|
||||
loop {
|
||||
std::thread::sleep(POLL);
|
||||
publish(read(portal.as_ref()));
|
||||
}
|
||||
}
|
||||
|
||||
/// The portal's Settings interface on the session bus.
|
||||
fn portal() -> zbus::Result<zbus::blocking::Proxy<'static>> {
|
||||
let connection = zbus::blocking::Connection::session()?;
|
||||
zbus::blocking::Proxy::new(&connection, PORTAL, PORTAL_PATH, SETTINGS)
|
||||
}
|
||||
|
||||
/// One reading through the portal.
|
||||
fn read_portal(portal: &zbus::blocking::Proxy<'static>) -> Option<bool> {
|
||||
let appearance = read_setting(portal, APPEARANCE, "color-scheme").and_then(|v| as_u32(&v));
|
||||
// The GNOME settings only matter when the freedesktop one has no preference.
|
||||
if matches!(appearance, Some(1 | 2)) {
|
||||
return solidcraft_ui_egui::prefs::desktop_prefers_dark(appearance, None, None);
|
||||
}
|
||||
let gnome = read_setting(portal, GNOME, "color-scheme").and_then(|v| as_string(&v));
|
||||
let gtk_theme = read_setting(portal, GNOME, "gtk-theme").and_then(|v| as_string(&v));
|
||||
solidcraft_ui_egui::prefs::desktop_prefers_dark(appearance, gnome.as_deref(), gtk_theme.as_deref())
|
||||
}
|
||||
|
||||
/// A setting through `ReadOne` (portal version 2), else the older `Read`.
|
||||
fn read_setting(portal: &zbus::blocking::Proxy<'static>, namespace: &str, key: &str) -> Option<OwnedValue> {
|
||||
let one: zbus::Result<OwnedValue> = portal.call("ReadOne", &(namespace, key));
|
||||
one.or_else(|_| -> zbus::Result<OwnedValue> { portal.call("Read", &(namespace, key)) }).ok()
|
||||
}
|
||||
|
||||
/// Whether a `SettingChanged` signal is about a setting the preference is read from.
|
||||
fn relevant(message: &zbus::Message) -> bool {
|
||||
let body = message.body();
|
||||
let Ok((namespace, key, _)) = body.deserialize::<(String, String, OwnedValue)>() else { return false };
|
||||
matches!((namespace.as_str(), key.as_str()), (APPEARANCE, "color-scheme") | (GNOME, "color-scheme" | "gtk-theme"))
|
||||
}
|
||||
|
||||
/// The value inside the variants `Read` wraps it in (a portal answers one or two deep).
|
||||
fn unwrap_variants<'v, 'a>(value: &'v Value<'a>) -> &'v Value<'a> {
|
||||
let mut value = value;
|
||||
for _ in 0..4 {
|
||||
match value {
|
||||
Value::Value(inner) => value = &**inner,
|
||||
_ => break,
|
||||
}
|
||||
}
|
||||
value
|
||||
}
|
||||
|
||||
fn as_u32(value: &Value<'_>) -> Option<u32> {
|
||||
match unwrap_variants(value) {
|
||||
Value::U32(n) => Some(*n),
|
||||
Value::I32(n) => u32::try_from(*n).ok(),
|
||||
Value::U8(n) => Some(u32::from(*n)),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn as_string(value: &Value<'_>) -> Option<String> {
|
||||
match unwrap_variants(value) {
|
||||
Value::Str(s) => Some(s.as_str().to_string()),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Without a portal: GNOME's settings through `gsettings` (`None` when it is not there).
|
||||
fn read_gsettings() -> Option<bool> {
|
||||
let gnome = gsettings("color-scheme");
|
||||
let gtk_theme = gsettings("gtk-theme");
|
||||
solidcraft_ui_egui::prefs::desktop_prefers_dark(None, gnome.as_deref(), gtk_theme.as_deref())
|
||||
}
|
||||
|
||||
fn gsettings_available() -> bool {
|
||||
gsettings("gtk-theme").is_some()
|
||||
}
|
||||
|
||||
/// `gsettings get org.gnome.desktop.interface <key>`, its quoted answer, or `None` when the
|
||||
/// program is missing, fails or does not answer in time.
|
||||
fn gsettings(key: &str) -> Option<String> {
|
||||
let mut child = std::process::Command::new("gsettings")
|
||||
.args(["get", GNOME, key])
|
||||
.stdin(std::process::Stdio::null())
|
||||
.stdout(std::process::Stdio::piped())
|
||||
.stderr(std::process::Stdio::null())
|
||||
.spawn()
|
||||
.ok()?;
|
||||
let started = std::time::Instant::now();
|
||||
loop {
|
||||
match child.try_wait() {
|
||||
Ok(Some(status)) if status.success() => break,
|
||||
Ok(None) if started.elapsed() < GSETTINGS_TIMEOUT => std::thread::sleep(Duration::from_millis(20)),
|
||||
_ => {
|
||||
let _ = child.kill();
|
||||
let _ = child.wait();
|
||||
return None;
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut out = String::new();
|
||||
child.stdout.take()?.take(4096).read_to_string(&mut out).ok()?;
|
||||
let value = out.trim().trim_matches('\'').to_string();
|
||||
(!value.is_empty()).then_some(value)
|
||||
}
|
||||
@@ -5,12 +5,25 @@
|
||||
//! for recovery as a forced quit does, and starts again ([`restart`]), and the new start says what
|
||||
//! happened ([`note`]). A device lost again soon after such a restart starts the next one on the
|
||||
//! software renderer, which doesn't depend on the graphics driver.
|
||||
//!
|
||||
//! The old process ends without tearing down its GPU objects ([`end`]): on a lost NVIDIA device
|
||||
//! destroying the window's swap chain busy-waits in the driver and never returns (#9044).
|
||||
|
||||
use crate::startup;
|
||||
|
||||
/// Set on the start after a lost device: when the device was lost (seconds since 1970).
|
||||
pub const LOST_ENV: &str = "SOLIDCRAFT_DEVICE_LOST";
|
||||
|
||||
/// Set on the start after a lost device: why it was lost, as wgpu said it. The old process's
|
||||
/// session journal, which recorded it, is gone by then.
|
||||
pub const REASON_ENV: &str = "SOLIDCRAFT_DEVICE_LOST_REASON";
|
||||
|
||||
/// The longest reason passed on ([`REASON_ENV`]) and shown, in characters.
|
||||
const REASON_CHARS: usize = 300;
|
||||
|
||||
/// How long the process may take to end ([`end`]) before it is aborted.
|
||||
const END_GRACE: std::time::Duration = std::time::Duration::from_secs(3);
|
||||
|
||||
/// A loss this recent (seconds) counts for the start after it: its note, and a second loss
|
||||
/// within it starts on the software renderer. Inherited by later starts, an older stamp is
|
||||
/// ignored.
|
||||
@@ -32,27 +45,54 @@ pub fn restart_on_software(after_recent_loss: bool, cpu_renderer: bool) -> bool
|
||||
after_recent_loss || cpu_renderer
|
||||
}
|
||||
|
||||
/// `reason` on one line, at most [`REASON_CHARS`] long; None when there is nothing to say.
|
||||
pub fn reason(reason: Option<&str>) -> Option<String> {
|
||||
let line = reason?.split_whitespace().collect::<Vec<_>>().join(" ");
|
||||
(!line.is_empty()).then(|| line.chars().take(REASON_CHARS).collect())
|
||||
}
|
||||
|
||||
/// What the start after a lost device tells the user, `software` when it runs on the software
|
||||
/// renderer.
|
||||
pub fn note(software: bool) -> String {
|
||||
/// renderer, with what the driver reported ([`REASON_ENV`]).
|
||||
pub fn note(software: bool, reason: Option<&str>) -> String {
|
||||
let mut note = String::from(
|
||||
"The graphics device was reset (the graphics driver stopped responding), so SolidCraft closed and started again. Unsaved changes were kept for recovery.",
|
||||
);
|
||||
if software {
|
||||
note.push_str(" This start uses software rendering, which doesn't depend on the graphics driver.");
|
||||
}
|
||||
if let Some(reason) = self::reason(reason) {
|
||||
note.push_str(&format!(" The graphics driver reported: {reason}"));
|
||||
}
|
||||
note
|
||||
}
|
||||
|
||||
/// Start SolidCraft again with the same arguments, the loss stamped at `lost_at`, on the software
|
||||
/// renderer when `software`.
|
||||
pub fn restart(software: bool, lost_at: u64) {
|
||||
let Ok(exe) = std::env::current_exe() else { return };
|
||||
/// The command that starts `exe` again with `args`, the loss stamped at `lost_at` and its
|
||||
/// `reason`, on the software renderer when `software`.
|
||||
fn command(
|
||||
exe: std::path::PathBuf,
|
||||
args: impl IntoIterator<Item = std::ffi::OsString>,
|
||||
software: bool,
|
||||
lost_at: u64,
|
||||
reason: &str,
|
||||
) -> std::process::Command {
|
||||
let mut command = std::process::Command::new(exe);
|
||||
command.args(std::env::args_os().skip(1)).env(LOST_ENV, lost_at.to_string());
|
||||
command.args(args).env(LOST_ENV, lost_at.to_string());
|
||||
match self::reason(Some(reason)) {
|
||||
Some(reason) => command.env(REASON_ENV, reason),
|
||||
// Not one inherited from an earlier loss.
|
||||
None => command.env_remove(REASON_ENV),
|
||||
};
|
||||
if software {
|
||||
command.env(startup::RENDERER_ENV, "cpu");
|
||||
}
|
||||
command
|
||||
}
|
||||
|
||||
/// Start SolidCraft again with the same arguments, the loss stamped at `lost_at` and its `reason`,
|
||||
/// on the software renderer when `software`.
|
||||
pub fn restart(software: bool, lost_at: u64, reason: &str) {
|
||||
let Ok(exe) = std::env::current_exe() else { return };
|
||||
let mut command = command(exe, std::env::args_os().skip(1), software, lost_at, reason);
|
||||
#[cfg(windows)]
|
||||
{
|
||||
use std::os::windows::process::CommandExt;
|
||||
@@ -64,6 +104,23 @@ pub fn restart(software: bool, lost_at: u64) {
|
||||
}
|
||||
}
|
||||
|
||||
/// End the process now, without tearing down what is left on the lost device: the window's swap
|
||||
/// chain, the viewport's buffers and pipelines. On NVIDIA's Vulkan driver destroying the swap
|
||||
/// chain of a lost device busy-waits forever, which left the old window frozen at 100% of a core
|
||||
/// beside the new one (#9044). Should the exit itself get stuck in a library's exit handler, the
|
||||
/// process is aborted after [`END_GRACE`].
|
||||
pub fn end() -> ! {
|
||||
let watchdog = std::thread::Builder::new().name("solidcraft-exit".into()).spawn(|| {
|
||||
std::thread::sleep(END_GRACE);
|
||||
eprintln!("SolidCraft graphics: still closing after the device was lost; aborting");
|
||||
std::process::abort();
|
||||
});
|
||||
if let Err(e) = watchdog {
|
||||
log::warn!("graphics: no exit watchdog: {e}");
|
||||
}
|
||||
std::process::exit(0)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
/// Only a recent, well-formed stamp counts: a later start that inherited it says nothing.
|
||||
@@ -84,8 +141,34 @@ mod tests {
|
||||
assert!(!super::restart_on_software(false, false));
|
||||
assert!(super::restart_on_software(true, false));
|
||||
assert!(super::restart_on_software(false, true));
|
||||
assert!(super::note(true).contains("software rendering"));
|
||||
assert!(!super::note(false).contains("software rendering"));
|
||||
assert!(super::note(false).contains("kept for recovery"));
|
||||
assert!(super::note(true, None).contains("software rendering"));
|
||||
assert!(!super::note(false, None).contains("software rendering"));
|
||||
assert!(super::note(false, None).contains("kept for recovery"));
|
||||
}
|
||||
|
||||
/// The start after a loss is told why (#9044): the old process's journal held the reason, and
|
||||
/// it is deleted as that process closes.
|
||||
#[test]
|
||||
fn the_next_start_is_told_why_the_device_was_lost() {
|
||||
let exe = std::path::PathBuf::from("solidcraft");
|
||||
let args = ["--control".into(), "7979".into()];
|
||||
let command = super::command(exe.clone(), args, true, 1_000, "Lost: Device lost\n (vkQueueSubmit)");
|
||||
let env = |command: &std::process::Command, name: &str| {
|
||||
command.get_envs().find(|(k, _)| *k == name).map(|(_, v)| v.map(|v| v.to_string_lossy().into_owned()))
|
||||
};
|
||||
assert_eq!(env(&command, super::LOST_ENV), Some(Some("1000".into())));
|
||||
assert_eq!(env(&command, super::REASON_ENV), Some(Some("Lost: Device lost (vkQueueSubmit)".into())), "on one line");
|
||||
assert_eq!(env(&command, crate::startup::RENDERER_ENV), Some(Some("cpu".into())));
|
||||
assert_eq!(command.get_args().collect::<Vec<_>>(), ["--control", "7979"]);
|
||||
// No reason: none inherited from an earlier loss either.
|
||||
let command = super::command(exe, Vec::new(), false, 1_000, " ");
|
||||
assert_eq!(env(&command, super::REASON_ENV), Some(None));
|
||||
assert_eq!(env(&command, crate::startup::RENDERER_ENV), None);
|
||||
|
||||
let note = super::note(false, Some("Lost: Device lost"));
|
||||
assert!(note.ends_with("The graphics driver reported: Lost: Device lost"), "{note}");
|
||||
assert!(!super::note(false, Some(" \n ")).contains("reported"));
|
||||
let long = "x".repeat(1_000);
|
||||
assert_eq!(super::reason(Some(&long)).map(|r| r.chars().count()), Some(300));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
mod app_icon;
|
||||
mod come_forward;
|
||||
mod control_server;
|
||||
#[cfg(target_os = "linux")]
|
||||
mod desktop_theme;
|
||||
mod device_lost;
|
||||
#[cfg(target_os = "windows")]
|
||||
mod native_crash;
|
||||
@@ -202,13 +204,29 @@ impl eframe::App for App {
|
||||
}
|
||||
solidcraft_ui_egui::recovery_ui::close(&mut self.solve);
|
||||
solidcraft_ui_egui::open_elsewhere::close(&mut self.solve);
|
||||
// Before a restart below starts the next instance, which would otherwise get nothing from
|
||||
// the 3D mouse driver (`solidcraft_3dx_client::stop`).
|
||||
// Before a restart (`Drop for App`) starts the next instance, which would otherwise get
|
||||
// nothing from the 3D mouse driver (`solidcraft_3dx_client::stop`).
|
||||
#[cfg(target_os = "macos")]
|
||||
solidcraft_3dx_client::stop();
|
||||
solidcraft_engine::crash::end_session();
|
||||
if let Some(lost_at) = self.gpu.as_ref().and_then(|g| g.lost_at) {
|
||||
device_lost::restart(self.gpu.as_ref().is_some_and(|g| g.restart_on_software), lost_at);
|
||||
// The next start (after a lost device, or into an update) begins once the app is dropped
|
||||
// (`Drop for App`), when the settings are on disk.
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for App {
|
||||
/// eframe drops its settings storage first, which waits for `app.ron` to be written, then the
|
||||
/// app, then the window and its GPU surface. So the next start begins here: started from
|
||||
/// `on_exit`, it read `app.ron` while the old process was still writing it, found it
|
||||
/// unreadable and moved it aside, resetting every setting (#9044).
|
||||
fn drop(&mut self) {
|
||||
if let Some(gpu) = &self.gpu
|
||||
&& let Some(lost_at) = gpu.lost_at
|
||||
{
|
||||
device_lost::restart(gpu.restart_on_software, lost_at, &gpu.reason);
|
||||
// The window's GPU surface is still to be dropped, and on a lost device that may
|
||||
// never return (#9044).
|
||||
device_lost::end();
|
||||
}
|
||||
// An update asked to restart into the new version or to run its installer.
|
||||
if let Some((program, args)) = solidcraft_ui_egui::update::take_launch(&mut self.solve) {
|
||||
@@ -236,6 +254,8 @@ struct LostWatch {
|
||||
restart_on_software: bool,
|
||||
/// When the loss was seen: the app is closing to start again.
|
||||
lost_at: Option<u64>,
|
||||
/// Why, as wgpu said it: passed to the next start ([`device_lost::REASON_ENV`]).
|
||||
reason: String,
|
||||
}
|
||||
|
||||
impl App {
|
||||
@@ -249,6 +269,7 @@ impl App {
|
||||
eprintln!("SolidCraft graphics: the device was lost ({reason}); starting again");
|
||||
solidcraft_engine::crash::phase(&format!("graphics device lost: {reason}"));
|
||||
gpu.lost_at = Some(device_lost::now_secs());
|
||||
gpu.reason = reason;
|
||||
self.solve.quit_requested = true;
|
||||
}
|
||||
}
|
||||
@@ -422,6 +443,12 @@ fn services(cc: &eframe::CreationContext<'_>, folder: &DialogFolder) -> Services
|
||||
graphics_adapters: Vec::new(),
|
||||
graphics_path: graphics_path().map(|p| p.to_string_lossy().to_string()),
|
||||
window_system: window_system_now(),
|
||||
// Linux: the desktop's dark or light setting, which the window is not told on every
|
||||
// desktop (#7944). Windows and macOS: the window's own theme.
|
||||
#[cfg(target_os = "linux")]
|
||||
desktop_dark: Some(desktop_theme::start(&cc.egui_ctx)),
|
||||
#[cfg(not(target_os = "linux"))]
|
||||
desktop_dark: None,
|
||||
http_get: Some(std::sync::Arc::new(http_get)),
|
||||
http_download: Some(std::sync::Arc::new(http_download)),
|
||||
// Already an installed app: only the browser build offers to install.
|
||||
@@ -750,6 +777,16 @@ fn main() -> eframe::Result {
|
||||
#[cfg(target_os = "macos")]
|
||||
objc2_foundation::NSProcessInfo::processInfo().setProcessName(objc2_foundation::ns_string!("SolidCraft"));
|
||||
mark("main");
|
||||
// On OCLP-patched Macs, wgpu picks a Metal Shading Language standard that the system's
|
||||
// compiler refuses (`invalid value 'metal3.2'`), because the patched OS reports a newer
|
||||
// macOS version than the GPU's Metal compiler supports. Re-launching with
|
||||
// SYSTEM_VERSION_COMPAT=1 makes the OS report the real (older) version so wgpu selects
|
||||
// a standard the compiler accepts. The variable must be set before the process starts, so
|
||||
// we detect OCLP here and re-exec immediately, before any macOS framework call (#3080, #4605).
|
||||
#[cfg(target_os = "macos")]
|
||||
if let Err(e) = startup::relaunch_with_version_compat() {
|
||||
log::warn!("startup: OCLP check failed (continuing normally): {e}");
|
||||
}
|
||||
// Validate before legacy adoption, crash markers or any user preference read.
|
||||
let settings = settings_dir().map_err(|error| eframe::Error::AppCreation(error.into()))?;
|
||||
if std::env::var_os("SOLIDCRAFT_SETTINGS_DIR").is_none() {
|
||||
@@ -821,7 +858,11 @@ fn main() -> eframe::Result {
|
||||
// The launch before this one closed because its graphics device was lost (`App::watch_device`).
|
||||
let after_loss = device_lost::recent(std::env::var(device_lost::LOST_ENV).ok().as_deref(), device_lost::now_secs());
|
||||
if after_loss {
|
||||
notes.push(device_lost::note(cpu_renderer));
|
||||
let reason = std::env::var(device_lost::REASON_ENV).ok();
|
||||
if let Some(reason) = device_lost::reason(reason.as_deref()) {
|
||||
log::warn!("graphics: the last launch lost its device ({reason})");
|
||||
}
|
||||
notes.push(device_lost::note(cpu_renderer, reason.as_deref()));
|
||||
}
|
||||
if safe_mode {
|
||||
notes.push("Safe mode: default settings (yours are kept for the next normal start), no recovery offer, software rendering.".into());
|
||||
@@ -961,6 +1002,7 @@ fn main() -> eframe::Result {
|
||||
lost: rs.device_lost.clone(),
|
||||
restart_on_software: device_lost::restart_on_software(after_loss, cpu_renderer),
|
||||
lost_at: None,
|
||||
reason: String::new(),
|
||||
});
|
||||
if !safe_mode {
|
||||
app.preferences.graphics_adapter =
|
||||
@@ -1016,6 +1058,10 @@ fn main() -> eframe::Result {
|
||||
app.session.doc_mut().name = "Sample Plate".into();
|
||||
app.session.mark_saved();
|
||||
app.session.undo.clear();
|
||||
// Built straight into the session, so nothing asked for a fit: frame it at the
|
||||
// home view as any opened design is (#9195). The fit waits for the first layout.
|
||||
app.cam.set_view(solidcraft_engine::render::StandardView::Iso);
|
||||
app.fit_view();
|
||||
}
|
||||
// Lock files next to open designs: a design open on another computer says so (#5467),
|
||||
// the files given at launch included.
|
||||
@@ -1099,12 +1145,13 @@ fn main() -> eframe::Result {
|
||||
}
|
||||
|
||||
/// egui-wgpu is about to start a step of getting the graphics device and the window's surface up:
|
||||
/// the crash journal keeps it, and the adapter once it is picked.
|
||||
/// the crash journal keeps it until the app runs (a window opened later goes through the same
|
||||
/// steps), and the adapter once it is picked.
|
||||
fn startup_step(step: &'static str, detail: &str) {
|
||||
if step == eframe::egui_wgpu::STEP_ADAPTER_CHOSEN {
|
||||
solidcraft_engine::crash::set_environment(&format!("Renderer: {detail}"));
|
||||
}
|
||||
solidcraft_engine::crash::phase(step);
|
||||
solidcraft_engine::crash::startup_step(step);
|
||||
}
|
||||
|
||||
/// The renderer settings: with `cpu`, the software adapter (WARP, lavapipe, llvmpipe). The
|
||||
|
||||
@@ -101,6 +101,7 @@ impl NativeMenu {
|
||||
])?;
|
||||
for (action, label) in [
|
||||
("docs", "Documentation"),
|
||||
("updates", app.tr("update.check_for_updates")),
|
||||
("shortcuts", "Keyboard Shortcuts"),
|
||||
("messages", "Messages\u{2026}"),
|
||||
("report", "Report an Issue\u{2026}"),
|
||||
|
||||
@@ -292,6 +292,71 @@ pub fn window_instance_flags(flags: eframe::wgpu::InstanceFlags, intel_mac: bool
|
||||
if intel_mac && env.map(str::trim).is_none_or(str::is_empty) { flags - eframe::wgpu::InstanceFlags::VALIDATION_INDIRECT_CALL } else { flags }
|
||||
}
|
||||
|
||||
/// The environment variable that makes the macOS compatibility shim report an older OS
|
||||
/// version to wgpu's Metal backend. On OCLP-patched machines the Metal compiler accepts
|
||||
/// only up to the MSL standard of the original GPU, not the one the patched OS reports,
|
||||
/// so wgpu picks a standard that the compiler refuses (`invalid value 'metal3.2'`).
|
||||
/// Setting this variable before the process starts causes the OS to report the older
|
||||
/// version and wgpu selects a supported MSL standard (#3080, #4605).
|
||||
#[cfg(target_os = "macos")]
|
||||
pub const SYSTEM_VERSION_COMPAT_ENV: &str = "SYSTEM_VERSION_COMPAT";
|
||||
|
||||
/// The NVRAM variable that OpenCore Legacy Patcher writes on every OCLP-booted system.
|
||||
/// Its presence is the primary signal that `SYSTEM_VERSION_COMPAT=1` is needed.
|
||||
#[cfg(target_os = "macos")]
|
||||
pub const OCLP_NVRAM_KEY: &str = "4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:OCLP-Version";
|
||||
|
||||
/// `true` if the OCLP NVRAM key is present on this system.
|
||||
///
|
||||
/// Runs `nvram <key>` and treats exit 0 as present. Any error (missing binary,
|
||||
/// permission denied, key absent) returns `false` — this is a best-effort probe.
|
||||
#[cfg(target_os = "macos")]
|
||||
pub fn oclp_nvram_present() -> bool {
|
||||
std::process::Command::new("nvram").arg(OCLP_NVRAM_KEY).output().map(|o| o.status.success()).unwrap_or(false)
|
||||
}
|
||||
|
||||
/// Whether to re-launch with `SYSTEM_VERSION_COMPAT=1`: it is not set yet and OCLP shows through
|
||||
/// the NVRAM key. The probe runs only when it is needed, so a re-launched process (variable
|
||||
/// set) never starts `nvram`.
|
||||
#[cfg(target_os = "macos")]
|
||||
fn compat_wanted(compat_set: bool, nvram: impl FnOnce() -> bool) -> bool {
|
||||
!compat_set && nvram()
|
||||
}
|
||||
|
||||
/// If this process is running under OCLP and `SYSTEM_VERSION_COMPAT` has not been set,
|
||||
/// re-launch the current binary with `SYSTEM_VERSION_COMPAT=1` added to the environment,
|
||||
/// then exit with the child's status code.
|
||||
///
|
||||
/// `SYSTEM_VERSION_COMPAT=1` must be present **before** the process starts: setting it
|
||||
/// with `std::env::set_var` inside `main` is too late because the macOS frameworks have
|
||||
/// already queried the OS version by then. Re-launching is the only safe approach that
|
||||
/// works without `unsafe` (a true `execve` replacement would require it).
|
||||
///
|
||||
/// Returns `Ok(false)` immediately when:
|
||||
/// - `SYSTEM_VERSION_COMPAT` is already set (re-launched process, no loop), or
|
||||
/// - the OCLP NVRAM key is absent.
|
||||
///
|
||||
/// Returns `Err` only when `std::env::current_exe()` fails or the child process cannot
|
||||
/// be spawned; the caller should log the error and continue normally.
|
||||
///
|
||||
/// Never returns `Ok(true)`: a successful re-launch exits the current process.
|
||||
#[cfg(target_os = "macos")]
|
||||
pub fn relaunch_with_version_compat() -> Result<bool, String> {
|
||||
// A set variable means this is the re-launched process: no loop.
|
||||
if !compat_wanted(std::env::var_os(SYSTEM_VERSION_COMPAT_ENV).is_some(), oclp_nvram_present) {
|
||||
return Ok(false);
|
||||
}
|
||||
log::info!("startup: OCLP detected; re-launching with {}=1", SYSTEM_VERSION_COMPAT_ENV);
|
||||
eprintln!("SolidCraft: OCLP detected; re-launching with {}=1", SYSTEM_VERSION_COMPAT_ENV);
|
||||
let exe = std::env::current_exe().map_err(|e| format!("could not find own executable: {e}"))?;
|
||||
let status = std::process::Command::new(&exe)
|
||||
.args(std::env::args_os().skip(1))
|
||||
.env(SYSTEM_VERSION_COMPAT_ENV, "1")
|
||||
.status()
|
||||
.map_err(|e| format!("could not re-launch with {}: {e}", SYSTEM_VERSION_COMPAT_ENV))?;
|
||||
std::process::exit(status.code().unwrap_or(1));
|
||||
}
|
||||
|
||||
/// Windows with OpenGL: the window keeps the system title bar (#2063). The window without OS
|
||||
/// decorations keeps its caption style while having no frame, and some OpenGL drivers (older
|
||||
/// Intel HD/UHD) then show the picture a caption's height lower than the window, so it no longer
|
||||
@@ -414,6 +479,27 @@ mod tests {
|
||||
assert_eq!(window_instance_flags(on, false, None), on);
|
||||
}
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
#[test]
|
||||
fn oclp_relaunch_needs_the_signal_and_no_compat_variable() {
|
||||
use super::compat_wanted;
|
||||
let probed = std::cell::Cell::new(false);
|
||||
let probe = |found: bool| {
|
||||
let probed = &probed;
|
||||
move || {
|
||||
probed.set(true);
|
||||
found
|
||||
}
|
||||
};
|
||||
// The re-launched process has the variable: no probe, no second re-launch.
|
||||
assert!(!compat_wanted(true, probe(true)));
|
||||
assert!(!probed.get());
|
||||
// The OCLP NVRAM key is the signal.
|
||||
assert!(compat_wanted(false, probe(true)));
|
||||
// No signal: an ordinary Mac starts as it is.
|
||||
assert!(!compat_wanted(false, probe(false)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn switches_read_from_the_environment() {
|
||||
assert!(env_on(Some("1")) && env_on(Some("yes")) && !env_on(Some("0")) && !env_on(Some(" ")) && !env_on(None) && !env_on(Some("false")));
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'.
|
||||
Copyright 2014-2021 Google Inc. with Reserved Font Name 'Noto'.
|
||||
Subset for SolidCraft web UI (glyphs used by the zh locale); renamed Craft UI SC (no Reserved Font Name).
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License,
|
||||
Version 1.1.
|
||||
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font
|
||||
creation efforts of academic and linguistic communities, and to
|
||||
provide a free and open framework in which fonts may be shared and
|
||||
improved in partnership with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply to
|
||||
any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software
|
||||
components as distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to,
|
||||
deleting, or substituting -- in part or in whole -- any of the
|
||||
components of the Original Version, by changing formats or by porting
|
||||
the Font Software to a new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed,
|
||||
modify, redistribute, and sell modified and unmodified copies of the
|
||||
Font Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components, in
|
||||
Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the
|
||||
corresponding Copyright Holder. This restriction only applies to the
|
||||
primary font name as presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created using
|
||||
the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
@@ -0,0 +1,96 @@
|
||||
Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'.
|
||||
Copyright 2014-2021 Google Inc. with Reserved Font Name 'Noto'.
|
||||
Subset for SolidCraft web UI (glyphs used by the zh-TW locale); renamed Craft UI TC (no Reserved Font Name).
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License,
|
||||
Version 1.1.
|
||||
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font
|
||||
creation efforts of academic and linguistic communities, and to
|
||||
provide a free and open framework in which fonts may be shared and
|
||||
improved in partnership with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply to
|
||||
any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software
|
||||
components as distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to,
|
||||
deleting, or substituting -- in part or in whole -- any of the
|
||||
components of the Original Version, by changing formats or by porting
|
||||
the Font Software to a new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed,
|
||||
modify, redistribute, and sell modified and unmodified copies of the
|
||||
Font Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components, in
|
||||
Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the
|
||||
corresponding Copyright Holder. This restriction only applies to the
|
||||
primary font name as presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created using
|
||||
the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
@@ -188,7 +188,7 @@ surface = [
|
||||
sketch = [
|
||||
"arc3", "arc_center", "arc_slot", "arc_slot_center", "arc_tangent",
|
||||
"blend", "circle", "circle2", "circle3", "circle_tt",
|
||||
"circle_ttt", "conic", "constrainer", "dimension", "ellipse",
|
||||
"circle_ttt", "conic", "constrainer", "dimension", "ellipse", "equation_curve",
|
||||
"extend", "finish", "fit_section", "include",
|
||||
"intersect", "intersection_curve", "iso_curve", "line", "line_mid",
|
||||
"offset", "offset_two_sides", "offset_symmetric", "point", "polygon", "polygon_circumscribed", "polygon_edge",
|
||||
@@ -204,7 +204,10 @@ constraint = [
|
||||
"c_polygon", "c_smooth", "c_symmetry", "c_tangent",
|
||||
]
|
||||
construction = [
|
||||
"centerline", "construction", "infinite",
|
||||
"centerline", "construction", "construction_line", "construction_line_angle",
|
||||
"construction_line_bisector", "construction_line_horizontal", "construction_line_parallel",
|
||||
"construction_line_perpendicular", "construction_line_tangent_at", "construction_line_tangent_external",
|
||||
"construction_line_tangent_two", "construction_line_vertical", "infinite",
|
||||
]
|
||||
mesh = [
|
||||
"mesh_body",
|
||||
|
||||
@@ -70,6 +70,16 @@ configuration_table false
|
||||
conic false
|
||||
constrainer false
|
||||
construction false
|
||||
construction_line false
|
||||
construction_line_angle false
|
||||
construction_line_bisector false
|
||||
construction_line_horizontal false
|
||||
construction_line_parallel false
|
||||
construction_line_perpendicular false
|
||||
construction_line_tangent_at false
|
||||
construction_line_tangent_external false
|
||||
construction_line_tangent_two false
|
||||
construction_line_vertical false
|
||||
contact_all false
|
||||
contact_new false
|
||||
contact_off false
|
||||
@@ -95,6 +105,7 @@ edit false
|
||||
ellipse false
|
||||
emboss false
|
||||
environment_map false
|
||||
equation_curve false
|
||||
error false
|
||||
explode false
|
||||
export false
|
||||
@@ -190,6 +201,7 @@ polygon false
|
||||
polygon_circumscribed false
|
||||
polygon_edge false
|
||||
presspull false
|
||||
print_face false
|
||||
project false
|
||||
project_surface false
|
||||
rack_pinion false
|
||||
@@ -224,6 +236,7 @@ settings_monitor false
|
||||
settings_mouse false
|
||||
settings_palette false
|
||||
settings_plug false
|
||||
sheet false
|
||||
sheet_rules false
|
||||
shell false
|
||||
shield false
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Construction line through two points</title>
|
||||
<path d="M8 52L56 12" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round" stroke-dasharray="10 5"/>
|
||||
<circle cx="20" cy="42" r="5.8" fill="#ffffff"/>
|
||||
<circle cx="20" cy="42" r="3.4" fill="#236ead"/>
|
||||
<circle cx="44" cy="22" r="5.8" fill="#ffffff"/>
|
||||
<circle cx="44" cy="22" r="3.4" fill="#236ead"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 472 B |
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Construction line at an angle</title>
|
||||
<path d="M10.26 48.66L58.26 48.66" fill="none" stroke="#6f879c" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M28.65 33.23A24 24 0 0 1 34.26 48.66" fill="none" stroke="#6f879c" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M10.26 48.66L54.26 11.66" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<circle cx="10.26" cy="48.66" r="5.8" fill="#ffffff"/>
|
||||
<circle cx="10.26" cy="48.66" r="3.4" fill="#236ead"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 646 B |
@@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Angle bisector</title>
|
||||
<path d="M13.92 12.18L9.92 52.17L54.92 44.17" fill="none" stroke="#6f879c" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M12.11 30.29A22 22 0 0 1 31.58 48.33" fill="none" stroke="#6f879c" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M9.92 52.17L47.3 11.83" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 526 B |
@@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Horizontal construction line</title>
|
||||
<path d="M8 32L56 32" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round" stroke-dasharray="10 5"/>
|
||||
<circle cx="32" cy="32" r="5.8" fill="#ffffff"/>
|
||||
<circle cx="32" cy="32" r="3.4" fill="#236ead"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 362 B |
@@ -0,0 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Parallel construction line</title>
|
||||
<path d="M9 37L41 9" fill="none" stroke="#6f879c" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M23 55L55 27" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round" stroke-dasharray="10 5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 380 B |
@@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Perpendicular construction line</title>
|
||||
<path d="M8 44L56 44" fill="none" stroke="#6f879c" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M32 8L32 56" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M32 34L42 34L42 44" fill="none" stroke="#6f879c" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 490 B |
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Tangent at a curve point</title>
|
||||
<circle cx="32" cy="34.26" r="17" fill="none" stroke="#6f879c" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M8 17.26L56 17.26" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<circle cx="32" cy="17.26" r="5.8" fill="#ffffff"/>
|
||||
<circle cx="32" cy="17.26" r="3.4" fill="#236ead"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 480 B |
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Tangent through an external point</title>
|
||||
<circle cx="21.74" cy="38.77" r="14" fill="none" stroke="#6f879c" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M53.6 8.23L28.55 55.9" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<circle cx="51.74" cy="11.77" r="5.8" fill="#ffffff"/>
|
||||
<circle cx="51.74" cy="11.77" r="3.4" fill="#236ead"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 502 B |
@@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Common tangent to two curves</title>
|
||||
<circle cx="20" cy="33.59" r="12" fill="none" stroke="#6f879c" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<circle cx="46" cy="33.59" r="8" fill="none" stroke="#6f879c" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M6 19.27L58 27.36" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 509 B |
@@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Vertical construction line</title>
|
||||
<path d="M32 8L32 56" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round" stroke-dasharray="10 5"/>
|
||||
<circle cx="32" cy="32" r="5.8" fill="#ffffff"/>
|
||||
<circle cx="32" cy="32" r="3.4" fill="#236ead"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 360 B |
@@ -0,0 +1,9 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Equation curve</title>
|
||||
<path d="M12 8L12 56M6 32L58 32" fill="none" stroke="#6f879c" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M12 32C15.42 24.83 18.72 18 22.5 18C26.28 18 29.58 24.83 33 32C36.42 39.17 39.72 46 43.5 46C47.28 46 50.58 39.17 54 32" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<circle cx="12" cy="32" r="5.8" fill="#ffffff"/>
|
||||
<circle cx="12" cy="32" r="3.4" fill="#236ead"/>
|
||||
<circle cx="54" cy="32" r="5.8" fill="#ffffff"/>
|
||||
<circle cx="54" cy="32" r="3.4" fill="#236ead"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 666 B |
@@ -0,0 +1,19 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Print Face</title>
|
||||
<path d="M9.72 26.17L4.5 20.95L4.5 40.85L9.72 46.07Z" fill="#b8c3cf"/>
|
||||
<path d="M9.72 26.17L4.5 20.95L4.5 40.85L9.72 46.07Z" fill="none" stroke="#34465b" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M18.77 23.15L9.72 26.17L9.72 46.07L18.77 43.05Z" fill="#328bd3"/>
|
||||
<path d="M18.77 23.15L9.72 26.17L9.72 46.07L18.77 43.05Z" fill="none" stroke="#34465b" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M13.55 17.93L18.77 23.15L9.72 26.17L4.5 20.95Z" fill="#e2e8ef"/>
|
||||
<path d="M13.55 17.93L18.77 23.15L9.72 26.17L4.5 20.95Z" fill="none" stroke="#34465b" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M50.45 37.54L38.27 25.35L38.27 33.88L50.45 46.07Z" fill="#b8c3cf"/>
|
||||
<path d="M50.45 37.54L38.27 25.35L38.27 33.88L50.45 46.07Z" fill="none" stroke="#34465b" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M59.5 34.53L50.45 37.54L50.45 46.07L59.5 43.05Z" fill="#8e9faf"/>
|
||||
<path d="M59.5 34.53L50.45 37.54L50.45 46.07L59.5 43.05Z" fill="none" stroke="#34465b" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M47.31 22.34L59.5 34.53L50.45 37.54L38.27 25.35Z" fill="#e2e8ef"/>
|
||||
<path d="M47.31 22.34L59.5 34.53L50.45 37.54L38.27 25.35Z" fill="none" stroke="#34465b" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M50.45 46.07L38.27 33.88" fill="none" stroke="#236ead" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M59.5 43.05L50.45 46.07" fill="none" stroke="#236ead" stroke-width="2.55" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M24.17 34.2L28.31 34.2" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M35.31 34.2L27.31 38.7L27.31 29.7Z" fill="#236ead"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
@@ -60,6 +60,7 @@
|
||||
"BLEND SURFACE": "سطح مزج",
|
||||
"BOUNDARY SURFACE": "سطح حدودي",
|
||||
"BROWSER": "المستعرض",
|
||||
"Back to the original order": "العودة إلى الترتيب الأصلي",
|
||||
"Ball": "كروي",
|
||||
"Bar": "قضيب",
|
||||
"Base Center": "مركز القاعدة",
|
||||
@@ -206,6 +207,7 @@
|
||||
"Edges": "الحواف",
|
||||
"Edit": "تعديل",
|
||||
"Edit Profile Sketch": "تعديل رسم المقطع",
|
||||
"Edit shortcuts": "تعديل الاختصارات",
|
||||
"Enable rule": "تفعيل القاعدة",
|
||||
"Enabled": "مفعّل",
|
||||
"End Radius": "نصف القطر النهائي",
|
||||
@@ -468,6 +470,7 @@
|
||||
"Radius": "نصف القطر",
|
||||
"Radius Fit": "ملاءمة نصف القطر",
|
||||
"Ratio": "النسبة",
|
||||
"Read-only list: shortcuts can't be changed here.": "قائمة للقراءة فقط: لا يمكن تغيير الاختصارات هنا.",
|
||||
"Reattach selected face": "إعادة ربط الوجه المحدد",
|
||||
"Recover": "استعادة",
|
||||
"Recover unsaved design?": "استعادة التصميم غير المحفوظ؟",
|
||||
@@ -593,6 +596,8 @@
|
||||
"Snap to face and edge centres": "الالتقاط إلى مراكز الأوجه والحواف",
|
||||
"SolidCraft cannot submit reports directly. Submit on GitHub; no token is needed in the app.": "لا يستطيع SolidCraft إرسال التقارير مباشرةً. أرسلها على GitHub؛ لا حاجة إلى رمز وصول في التطبيق.",
|
||||
"SolidCraft closed before these designs were saved. Their last autosave can be opened.": "أُغلق SolidCraft قبل حفظ هذه التصاميم. يمكن فتح آخر حفظ تلقائي لها.",
|
||||
"Sort A to Z": "فرز تصاعدي",
|
||||
"Sort Z to A": "فرز تنازلي",
|
||||
"Spacing 2 must be a non-zero number": "يجب أن يكون التباعد 2 عددًا غير صفري",
|
||||
"Spacing must be a non-zero number": "يجب أن يكون التباعد عددًا غير صفري",
|
||||
"Specialise": "تخصيص",
|
||||
@@ -652,6 +657,7 @@
|
||||
"Third point": "النقطة الثالثة",
|
||||
"This child is shared. Deleting it removes it from every copy of its parent.": "هذا العنصر الفرعي مشترك. حذفه يزيله من كل نسخة من العنصر الأب.",
|
||||
"This child is shared. Position changes apply to every copy of its parent.": "هذا العنصر الفرعي مشترك. تغييرات الموضع تنطبق على كل نسخة من العنصر الأب.",
|
||||
"This component is inside a subassembly placed more than once: aligning it moves it in every placement.": "هذا المكوّن داخل تجميع فرعي موضوع أكثر من مرة: محاذاته تحرّكه في كل موضع.",
|
||||
"This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "لا يمكن لهذا الوجه توفير ارتباط دائم. اختر وجهًا آخر أو استخدم مستوى ثابتًا صراحةً.",
|
||||
"This image is not attached to GitHub yet. Copy or save it, then attach it on GitHub.": "هذه الصورة غير مرفقة في GitHub بعد. انسخها أو احفظها، ثم أرفقها في GitHub.",
|
||||
"Thread depth": "عمق السن اللولبي",
|
||||
@@ -729,7 +735,7 @@
|
||||
"a picked edge is gone": "الحافة المحددة لم تعد موجودة",
|
||||
"a picked edge's body is gone": "جسم الحافة المحددة لم يعد موجودًا",
|
||||
"add a key for a joint first": "أضف أولًا مفتاحًا لمفصل",
|
||||
"ai.connected_toast": "أصبح SolidCraft متاحًا في {clients}. أعد تشغيلها لاستخدامه (الإعدادات > المساعد).",
|
||||
"ai.connected_toast": "أصبح SolidCraft متاحًا في {clients}. أعد تشغيلها لاستخدامه (التفضيلات > المساعد).",
|
||||
"ai.prefs.allow_control": "السماح لوكلاء الذكاء الاصطناعي بالاتصال (قناة التحكم / MCP)",
|
||||
"ai.prefs.allow_control_note": "يفتح قناة تحكم على هذا الحاسوب فقط (127.0.0.1، المنفذ 27878 أو أول منفذ متاح بعده). على البرنامج الذي يتصل أن يقدّم أيضًا رمزًا سريًا لا يقرؤه إلا حساب المستخدم الخاص بك، ويُنشأ من جديد عند كل تشغيل. يُطبّق في المرة القادمة التي يبدأ فيها SolidCraft. عند الإيقاف: لا شيء يستمع ما لم تشغّل SolidCraft مع --control.",
|
||||
"ai.prefs.availability": "عناصر تحكم المساعد",
|
||||
@@ -772,6 +778,8 @@
|
||||
"at the face": "عند الوجه",
|
||||
"bom.group_children": "الأجزاء الفرعية في صف الجزء الأصلي",
|
||||
"browser.body_name": "جسم {number}",
|
||||
"browser.calibrate_click_a": "انقر على الصورة لتحديد النقطة A، أو اكتب إحداثياتها.",
|
||||
"browser.calibrate_click_b": "انقر على الصورة لتحديد النقطة B، أو اكتب إحداثياتها.",
|
||||
"browser.calibrate_title": "معايرة: {name}",
|
||||
"browser.capture_many": "تم تحريك {count} مكوّنات دون تثبيت مواضعها.",
|
||||
"browser.capture_note": "التثبيت يحتفظ بالموضع الجديد، والإرجاع يعيده كما كان.",
|
||||
@@ -814,6 +822,7 @@
|
||||
"cmd.appearance_pick_up": "التقاط المظهر",
|
||||
"cmd.appearance_replace": "استبدال المظهر",
|
||||
"cmd.assembly_bom": "قائمة المواد",
|
||||
"cmd.body.print_face": "وجه الطباعة",
|
||||
"cmd.body_rename": "إعادة تسمية الجسم",
|
||||
"cmd.browser_collapse_all": "طي الكل",
|
||||
"cmd.browser_expand_all": "توسيع الكل",
|
||||
@@ -821,6 +830,7 @@
|
||||
"cmd.browser_move": "نقل عناصر المستعرض",
|
||||
"cmd.browser_order": "ترتيب عناصر المستعرض",
|
||||
"cmd.browser_rename_group": "إعادة تسمية المجموعة",
|
||||
"cmd.browser_reparent": "نقل إلى مكوّن",
|
||||
"cmd.browser_ungroup": "فك التجميع",
|
||||
"cmd.browser_visibility": "إظهار/إخفاء",
|
||||
"cmd.canvas_calibrate": "معايرة اللوحة",
|
||||
@@ -847,7 +857,9 @@
|
||||
"cmd.component_metadata": "خصائص القطعة",
|
||||
"cmd.component_metadata_set": "تغيير خصائص القطعة",
|
||||
"cmd.component_move_bodies": "نقل الأجسام إلى مكوّن",
|
||||
"cmd.component_move_features": "نقل الميزات إلى مكوّن",
|
||||
"cmd.component_move_sketches": "نقل الرسومات إلى مكوّن",
|
||||
"cmd.component_paste_from_design": "لصق من تصميم آخر",
|
||||
"cmd.component_paste_new": "لصق كجديد",
|
||||
"cmd.component_properties": "الخصائص الفيزيائية للمكوّن",
|
||||
"cmd.component_relink": "إعادة ربط المصدر",
|
||||
@@ -984,6 +996,7 @@
|
||||
"cmd.motion_trace": "أثر الحركة",
|
||||
"cmd.motion_trace_edit": "تحرير أثر الحركة",
|
||||
"cmd.motion_trace_keep": "الإبقاء على أثر الحركة",
|
||||
"cmd.occurrence_align": "محاذاة النسخة",
|
||||
"cmd.occurrence_copy": "لصق (نسخة مرتبطة)",
|
||||
"cmd.occurrence_drag": "سحب النسخة",
|
||||
"cmd.occurrence_ground": "تثبيت بالأرض",
|
||||
@@ -1074,6 +1087,13 @@
|
||||
"cmd.render_start": "تصيير صورة",
|
||||
"cmd.render_status": "تقدّم التصيير",
|
||||
"cmd.select_clear": "مسح التحديد",
|
||||
"cmd.settings_profile_apply": "تطبيق ملف تعريف الإعدادات",
|
||||
"cmd.settings_profile_delete": "حذف ملف تعريف الإعدادات",
|
||||
"cmd.settings_profile_export": "تصدير ملف تعريف الإعدادات",
|
||||
"cmd.settings_profile_import": "استيراد ملف تعريف الإعدادات",
|
||||
"cmd.settings_profile_list": "ملفات تعريف الإعدادات",
|
||||
"cmd.settings_profile_rename": "إعادة تسمية ملف تعريف الإعدادات",
|
||||
"cmd.settings_profile_save": "حفظ ملف تعريف الإعدادات",
|
||||
"cmd.sheet_convert": "تحويل إلى صفائح معدنية",
|
||||
"cmd.sheet_export_bend_table": "تصدير جدول الثني",
|
||||
"cmd.sheet_export_dxf": "تصدير النمط المسطح بصيغة DXF",
|
||||
@@ -1087,6 +1107,16 @@
|
||||
"cmd.sheet_refold": "إعادة الطي",
|
||||
"cmd.sheet_rules": "قائمة قواعد الصفائح المعدنية",
|
||||
"cmd.sheet_unfold": "فرد",
|
||||
"cmd.sketch.construction_line": "خط إنشائي",
|
||||
"cmd.sketch.construction_line.angle": "خط إنشائي بزاوية",
|
||||
"cmd.sketch.construction_line.bisector": "منصف الزاوية",
|
||||
"cmd.sketch.construction_line.horizontal": "خط إنشائي أفقي",
|
||||
"cmd.sketch.construction_line.parallel": "خط إنشائي موازٍ",
|
||||
"cmd.sketch.construction_line.perpendicular": "خط إنشائي عمودي",
|
||||
"cmd.sketch.construction_line.tangent_at": "مماس عند نقطة على المنحنى",
|
||||
"cmd.sketch.construction_line.tangent_external": "مماس يمر بنقطة خارجية",
|
||||
"cmd.sketch.construction_line.tangent_two": "مماس مشترك",
|
||||
"cmd.sketch.construction_line.vertical": "خط إنشائي رأسي",
|
||||
"cmd.sketch_arc3d": "قوس ثلاثي الأبعاد",
|
||||
"cmd.sketch_arc_center_point": "قوس بنقطة مركز",
|
||||
"cmd.sketch_arc_tangent": "قوس مماسي",
|
||||
@@ -1119,6 +1149,8 @@
|
||||
"cmd.sketch_drawing_bounds": "حجم الرسمة",
|
||||
"cmd.sketch_edit": "تعديل الرسم",
|
||||
"cmd.sketch_edit_text": "تعديل النص",
|
||||
"cmd.sketch_equation_curve": "منحنى معادلة",
|
||||
"cmd.sketch_equation_curve_edit": "تحرير منحنى المعادلة",
|
||||
"cmd.sketch_export_dxf": "حفظ بصيغة DXF",
|
||||
"cmd.sketch_finish_auto_constrain": "إنهاء مع التقييد التلقائي",
|
||||
"cmd.sketch_fit_curves_to_section": "ملاءمة منحنيات لمقطع الشبكة",
|
||||
@@ -1215,6 +1247,7 @@
|
||||
"cmd.view.render_browser": "متصفح التصيير",
|
||||
"cmd.view.render_dock": "نقل لوحة التصيير",
|
||||
"cmd.view.render_focus": "عرض تركيز التصيير",
|
||||
"cmd.view.status_items": "عناصر حالة منطقة العرض",
|
||||
"cmd.view_ambient_occlusion": "الإظلال المحيطي",
|
||||
"cmd.view_angle_readout": "زوايا العرض",
|
||||
"cmd.view_apply": "استعادة عرض مسمّى",
|
||||
@@ -1369,8 +1402,21 @@
|
||||
"help.material.assign": "يحدد المادة التي صُنعت منها الأجسام المحددة، مثل الفولاذ أو الألومنيوم أو ABS. استخدمه لتطابق الكتلة والوزن القطعة الحقيقية.",
|
||||
"help.mit": "رخصة MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.occurrence.move": "يحرّك جزءًا في التجميع فقط ضمن درجات الحرية التي تسمح بها مفاصله. حدد وجهًا للجزء، ثم اسحب سهمًا أو قوسًا متاحًا.",
|
||||
"help.parameters.change": "يفتح جدول القيم المسماة والتعبيرات التي تتحكم في أبعاد التصميم. استخدمه لتغيير مقاس في مكان واحد فتتبعه كل الميزات التي تستخدمه.",
|
||||
"help.pointcloud.insert": "أدرج مسحًا بصيغة PLY أو XYZ أو PTS كسحابة نقاط بجانب النموذج. استخدمه كمرجع عند النمذجة انطلاقًا من بيانات القياس.",
|
||||
"help.sketch.construction_line": "أنشئ خطًا إنشائيًا لا نهائيًا يمر بنقطتين. استخدمه لتخطيط الرسم دون تقسيم مقاطعه.",
|
||||
"help.sketch.construction_line.angle": "أنشئ خطًا إنشائيًا لا نهائيًا بزاوية من محور X للرسم. اختر النقطة ثم اكتب الزاوية، أو اختر اتجاهه.",
|
||||
"help.sketch.construction_line.bisector": "اختر خطين مستقيمين متقاطعين في الرسم، ثم اختر أحد منصفي الزاوية. يتبع الناتج الخطين اللذين أُنشئ منهما.",
|
||||
"help.sketch.construction_line.horizontal": "أنشئ خطًا إنشائيًا أفقيًا لا نهائيًا يمر بنقطة. يحافظ القيد الأفقي على الاتجاه بعد التعديلات.",
|
||||
"help.sketch.construction_line.parallel": "اختر خطًا مستقيمًا في الرسم ثم ضع خطًا إنشائيًا لا نهائيًا موازيًا له. انقر بزر الفأرة الأيمن لتغيير المرجع.",
|
||||
"help.sketch.construction_line.perpendicular": "اختر خطًا مستقيمًا في الرسم ثم ضع خطًا إنشائيًا لا نهائيًا عموديًا عليه. انقر بزر الفأرة الأيمن لتغيير المرجع.",
|
||||
"help.sketch.construction_line.tangent_at": "أنشئ مماسًا عند نقطة على دائرة أو قوس دائري، أو عند نهاية منحنى شريحي مفتوح أو قطع مخروطي مفتوح. اختر المنحنى ثم نقطة التماس.",
|
||||
"help.sketch.construction_line.tangent_external": "اختر دائرة أو قوسًا دائريًا، ثم نقطة خارجية وحل المماس. تعرض المعاينة نقاط التماس الواقعة على القوس المرسوم فقط.",
|
||||
"help.sketch.construction_line.tangent_two": "اختر دائرتين أو قوسين دائريين ثم اختر مماسًا مشتركًا من المعاينة. يجب أن تقع نقطتا التماس على المنحنيين المرسومين.",
|
||||
"help.sketch.construction_line.vertical": "أنشئ خطًا إنشائيًا رأسيًا لا نهائيًا يمر بنقطة. يحافظ القيد الرأسي على الاتجاه بعد التعديلات.",
|
||||
"help.sketch.equation_curve": "يرسم منحنى من صيغ على مدى: x(t) و y(t)، أو y = f(x). يمكن أن تستخدم الصيغ المعلمات فيتبعها المنحنى: استخدمه لموجة جيبية أو لولب أو منحنى انفلات لسن ترس.",
|
||||
"help.sketch.inspect": "يفتح تقريرًا عن الرسم المفتوح: عدد درجات الحرية المتبقية وهل هو مقيد بالكامل. استخدمه لمعرفة ما لا يزال يتحرك قبل إنهاء الرسم.",
|
||||
"help.solid.align": "يحرّك الأجسام المحددة بحيث تلتقي نقطة أو وجه أو مستوى منها بنقطة أو وجه أو مستوى في مكان آخر. استخدمه لوضع قطعة ملاصقة لأخرى دون قياس المسافة.",
|
||||
"help.solid.chamfer": "يقطع الحواف المحددة بشطفة مستوية بالمسافة التي تحددها. استخدمه لكسر الحواف الحادة أو لتسهيل إدخال مسمار أو برغي.",
|
||||
"help.solid.combine": "يضم الأجسام، أو يقتطعها من جسم هدف، أو يُبقي الحجم المشترك بينها فقط، ويمكنه الاحتفاظ بأجسام الأداة. استخدمه لدمج القطع، أو لقطع شكل بشكل آخر، أو لمعرفة موضع تداخل جسمين.",
|
||||
@@ -1464,7 +1510,7 @@
|
||||
"home.recovery_hint": "أُغلق SolidCraft قبل حفظ هذه التصاميم.",
|
||||
"home.report_issue": "الإبلاغ عن مشكلة",
|
||||
"home.samples": "أمثلة",
|
||||
"home.settings": "الإعدادات",
|
||||
"home.settings": "التفضيلات",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "اختصارات لوحة المفاتيح",
|
||||
"home.start_hint": "أنشئ تصميمًا، أو افتح ملفًا حديثًا، أو استكشف مثالًا.",
|
||||
@@ -1499,6 +1545,21 @@
|
||||
"joint.one_component": "هذه القطع أجسام لمكوّن واحد: {bodies}. المفصل يحرّك مكوّنًا مقابل آخر، لذا تحتاج كل قطعة إلى مكوّن خاص بها.",
|
||||
"joint.rigid_group_one_component": "هذه الأجسام وعددها {count} كلها في مكوّن واحد (أو في التصميم نفسه): استخدم {command} أولًا.",
|
||||
"joint.rigid_group_select_components": "اختر مكوّنين أو أكثر.",
|
||||
"joint_move.blocked_hint": "تحقق من نوع المفصل (مثل المفصل الثابت)، وتثبيت الجزء، وحدود المفصل، والقيم التي تتحكم بها المعلمات.",
|
||||
"joint_move.blocked_title": "لا يمكن تحريك هذا الجزء",
|
||||
"joint_move.coarse": "خطوة الدوران قرب المحور (°)",
|
||||
"joint_move.distance": "المسافة من نقطة البداية",
|
||||
"joint_move.done": "تم",
|
||||
"joint_move.fine": "خطوة الدوران بعيدًا عن المحور (°)",
|
||||
"joint_move.fixed": "لا يملك هذا الجزء محور مفصل قابلًا للحركة.",
|
||||
"joint_move.help": "تحريك — اسحب سهمًا أو قوسًا. يلغى السحب الحالي بمفتاح Esc.",
|
||||
"joint_move.legacy_hint": "أوقف هذا الخيار لاستخدام لوحة التحريك السابقة.",
|
||||
"joint_move.precision": "اسحب خارج الدليل المتقطع لضبط الدوران بدقة.",
|
||||
"joint_move.rotation": "الدوران من نقطة البداية",
|
||||
"joint_move.select": "اختر وجهًا أو جزءًا واحدًا من التجميع، ثم اختر تحريك.",
|
||||
"joint_move.settings": "تحريك التجميع",
|
||||
"joint_move.step": "الخطوة",
|
||||
"joint_move.use_handles": "استخدام مقابض حركة المفاصل لتحريك التجميع",
|
||||
"keymap.command_id": "معرّف الأمر",
|
||||
"keymap.empty": "لا توجد أوامر مطابقة",
|
||||
"keymap.use_anyway": "استخدام {key} هنا على أي حال",
|
||||
@@ -1558,6 +1619,10 @@
|
||||
"material.selection.mixed": "مواد مختلفة",
|
||||
"measure.at": "عند",
|
||||
"measure.item": "العنصر {number}",
|
||||
"measure.quick_copied": "تم نسخ القياس",
|
||||
"measure.quick_copy": "انقر لنسخ القياس",
|
||||
"measure.quick_edges": "{count} حواف",
|
||||
"measure.quick_faces": "{count} أوجه",
|
||||
"messages.ago_h": "قبل {n} ساعة",
|
||||
"messages.ago_min": "قبل {n} دقيقة",
|
||||
"messages.ago_s": "قبل {n} ث",
|
||||
@@ -1593,6 +1658,8 @@
|
||||
"nav.maya.help": "Alt مع السحب بالزر الأيسر يدوّر العرض، وAlt مع الأوسط يُزيحه، وAlt مع الأيمن يكبّره؛ والسحب بالزر الأوسط يُزيح أيضًا",
|
||||
"nav.openscad.help": "السحب بالزر الأيسر على مساحة فارغة يدوّر العرض، وShift مع السحب بالأيسر يحدد بمربع، وسحب هندسة الرسم يعدّلها؛ والسحب بالأيمن أو الأوسط يُزيح، وShift مع السحب بالأيمن أو الأوسط يكبّر",
|
||||
"nav.perspective.sketch": "تحرير الرسم يستخدم العرض المتعامد. أنهِ الرسم للتبديل إلى المنظور.",
|
||||
"nav.right_drag_orbits.help": "عند الإيقاف: لا يحرّك السحب بالزر الأيمن الكاميرا، ويفتح الزر الأيمن قائمة السياق فقط. اختيار تعيين أزرار الفأرة SolidWorks يوقفه.",
|
||||
"nav.right_drag_orbits.label": "السحب بالزر الأيمن يدوّر العرض",
|
||||
"nav.solidworks.help": "السحب بالزر الأوسط يدوّر العرض، وCtrl مع الأوسط يُزيحه، وShift مع الأوسط يكبّره، والسحب بالأيمن يدوّره",
|
||||
"nav.tinkercad.help": "السحب بالزر الأيمن يدوّر العرض، والسحب بالأوسط أو Shift مع الأيمن يُزيحه",
|
||||
"nav.touchpad.help": "اضغط Shift مع تحريك المؤشر للإزاحة؛ واضغط Alt/Option مع تحريكه للتدوير. لا حاجة لأي زر فأرة. التمرير العمودي يكبّر ويصغّر.",
|
||||
@@ -1614,12 +1681,15 @@
|
||||
"navbar.custom.customise": "تخصيص شريط التنقل…",
|
||||
"navbar.custom.design": "التصميم",
|
||||
"navbar.custom.duplicate": "هذه الخانة موجودة بالفعل على الشريط.",
|
||||
"navbar.custom.edge": "الموضع",
|
||||
"navbar.custom.edge_bottom": "أسفل",
|
||||
"navbar.custom.edge_top": "أعلى",
|
||||
"navbar.custom.fade": "تلاشٍ",
|
||||
"navbar.custom.full": "أزل خانة لإضافة أخرى.",
|
||||
"navbar.custom.hidden_design": "مخفي في التصميم",
|
||||
"navbar.custom.hidden_render": "مخفي في التصيير",
|
||||
"navbar.custom.hide": "إخفاء شريط التنقل",
|
||||
"navbar.custom.hide_idle": "إخفاء حتى التمرير",
|
||||
"navbar.custom.hide_idle": "إخفاء حتى يمر المؤشر فوقه",
|
||||
"navbar.custom.icon_only": "الأيقونة فقط",
|
||||
"navbar.custom.icon_value": "الأيقونة والقيمة",
|
||||
"navbar.custom.icons": "الأيقونات",
|
||||
@@ -1705,6 +1775,11 @@
|
||||
"not a move": "ليس تحريكًا",
|
||||
"not a number": "ليس عددًا",
|
||||
"open a sketch first": "افتح رسمًا أولًا",
|
||||
"parameters.apply_live": "طبّق كل تغيير عند مغادرة حقله",
|
||||
"parameters.apply_live_tip": "عند الإيقاف: تنتظر التغييرات حتى «تطبيق» أو «موافق»، ثم يُعاد بناء التصميم مرة واحدة لها جميعًا. «إلغاء» أو Escape يتجاهلها.",
|
||||
"parameters.held": "{count} تغييرات بانتظار «تطبيق»",
|
||||
"parameters.held_hint": "عدّل التعابير والوحدات. تنتظر التغييرات «تطبيق» أو «موافق».",
|
||||
"parameters.held_one": "تغيير واحد بانتظار «تطبيق»",
|
||||
"parts.automatic_name": "تلقائي",
|
||||
"parts.dimension.across_flats": "مقاس المفتاح",
|
||||
"parts.dimension.bore": "قطر الثقب",
|
||||
@@ -1720,12 +1795,15 @@
|
||||
"parts.dimension.thickness": "السماكة",
|
||||
"parts.dimension.width": "العرض",
|
||||
"parts.family.bearing": "محمل كريات أخدودي عميق (الغلاف)",
|
||||
"parts.family.button_head_cap_screw": "برغي برأس زرّي بتجويف سداسي",
|
||||
"parts.family.dowel_pin": "مسمار توجيه أسطواني",
|
||||
"parts.family.hex_bolt": "برغي سداسي الرأس",
|
||||
"parts.family.hex_nut": "صامولة سداسية",
|
||||
"parts.family.set_screw": "برغي تثبيت بتجويف سداسي، طرف مسطح",
|
||||
"parts.family.socket_head_cap_screw": "برغي برأس أسطواني بتجويف سداسي",
|
||||
"parts.family.washer": "حلقة مسطحة",
|
||||
"parts.holes": "الثقوب (اختياري)",
|
||||
"parts.placement_hint": "اختر ثقبًا أو أكثر لتثبيت قطعة في كل منها، أو اضغط موافق لوضعها عند نقطة الأصل",
|
||||
"pattern.alignment_2": "المحاذاة 2",
|
||||
"pattern.alignment_hint": "العدد يشمل الأصل. «توسيط» يوازن النسخ؛ و«قلب» يختار الجانب الإضافي عندما يكون العدد زوجيًا.",
|
||||
"pattern.direction_1": "الاتجاه 1",
|
||||
@@ -1778,6 +1856,11 @@
|
||||
"prefs.bottom_centre": "أسفل الوسط",
|
||||
"prefs.bottom_right": "أسفل اليمين",
|
||||
"prefs.browser": "المستعرض",
|
||||
"prefs.browser_eye_left": "أيقونة الإظهار بجانب سهم الطي",
|
||||
"prefs.browser_eye_left_note": "تعرض صفوف المستعرض أيقونة الإظهار بجانب سهم الطي كما كانت من قبل، بدلاً من عمود في الطرف الأيمن للصفوف.",
|
||||
"prefs.browser_reveal_on_hover": "إظهار عند مرور المؤشر",
|
||||
"prefs.browser_show_note": "«ظاهر» يُبقي المستعرض على الشاشة. «إظهار عند مرور المؤشر» يُخفيه حتى يمر المؤشر فوق مكانه أو فوق الشريط الرفيع عند حافته اليسرى، ويبقى مفتوحًا ما دام المؤشر داخله أو كانت قائمة منه مفتوحة.",
|
||||
"prefs.browser_shown": "ظاهر",
|
||||
"prefs.built_in": "مدمج",
|
||||
"prefs.button_left": "سحب بالزر الأيسر",
|
||||
"prefs.button_middle": "سحب بالزر الأوسط",
|
||||
@@ -1825,6 +1908,8 @@
|
||||
"prefs.graphics_card_restart": "يُطبَّق بعد إعادة تشغيل SolidCraft. يتجاوز WGPU_ADAPTER_NAME هذا الاختيار.",
|
||||
"prefs.graphics_note": "وازن بين السرعة والنعومة. كل خيار يعرض أثره على عيّنة.",
|
||||
"prefs.graphics_presets_note": "الإعدادات المسبقة تضبط الخيارات أدناه معًا.",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out": "إخفاء رموز القيود عند التصغير",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out_note": "تختفي رموز القيود عندما تُصغَّر المسودة بما يكفي حتى لا تزحم العرض. معطّل: تبقى بحجم شاشة ثابت عند أي تكبير.",
|
||||
"prefs.history": "السجل",
|
||||
"prefs.history_origin_bodies": "إظهار الأصل والأجسام في الأعلى",
|
||||
"prefs.history_origin_bodies_note": "يبدأ السجل على اليسار أو تحت المستعرض بمجلد الأجسام للمكوّن النشط وبالأصل، مع أيقونات الإظهار والقوائم كما في المستعرض. لا يتغير السجل في الأسفل.",
|
||||
@@ -1848,6 +1933,8 @@
|
||||
"prefs.layout_note": "المضغوط يثبّت اللوحات على حواف النافذة. شفافية المستعرض متاحة في الوضع العائم. غيّر جهة المساعد من صفحة المساعد.",
|
||||
"prefs.left": "يسار",
|
||||
"prefs.left_click": "نقر أيسر",
|
||||
"prefs.line_drag_draws_one": "الضغط والسحب يرسم خطًا واحدًا",
|
||||
"prefs.line_drag_draws_one_note": "في أداة الخط، الضغط ثم السحب ثم الإفلات يرسم خطًا واحدًا من نقطة الضغط إلى نقطة الإفلات وينتهي هناك. لا تزال النقرات ترسم سلسلة. عند الإيقاف: يضع السحب نقطة حيث يُفلت، كما تفعل النقرة.",
|
||||
"prefs.linked_designs": "التصاميم المرتبطة",
|
||||
"prefs.live_input": "الإدخال المباشر",
|
||||
"prefs.live_preview": "المعاينة المباشرة",
|
||||
@@ -1861,6 +1948,9 @@
|
||||
"prefs.max_file_size_step": "ملفات STEP والاستيراد",
|
||||
"prefs.max_file_size_web": "يفتح تطبيق الويب ملفات STEP والاستيراد حتى 512 MB والتصاميم حتى 256 MB؛ لا يتسع تبويب المتصفح لملفات أكبر. يمكن رفع هذه الحدود في تطبيق سطح المكتب.",
|
||||
"prefs.megabytes": "MB",
|
||||
"prefs.menu_grid": "أيقونات كبيرة",
|
||||
"prefs.menu_list": "قائمة",
|
||||
"prefs.menus": "القوائم",
|
||||
"prefs.minutes": "دقائق",
|
||||
"prefs.minutes_suffix": " دقيقة",
|
||||
"prefs.mouse": "الفأرة ولوحة اللمس",
|
||||
@@ -1880,14 +1970,44 @@
|
||||
"prefs.origin_plane_names": "أسماء مستويات الأصل",
|
||||
"prefs.origin_plane_names_note": "الأسماء المعروضة في المستعرض والحوارات والقوائم. {top} هو XY و{front} هو XZ و{right} هو YZ، والمحور Z للأعلى. تحتفظ الأوامر والسكربتات والتصاميم المحفوظة بـ XY وXZ وYZ.",
|
||||
"prefs.overall_speed": "السرعة العامة",
|
||||
"prefs.parameter_list_rows": "صفوف قائمة المعاملات",
|
||||
"prefs.parameter_list_rows_tip": "يعرض السهم لأسفل في حقل قيمة فارغ المعاملات، المفضلة أولًا، حتى هذا العدد. العدد الأقل يبقي القائمة خفيفة في التصميم الكبير.",
|
||||
"prefs.persistent_ribbon_pressed": "تمييز أوامر الشريط النشطة",
|
||||
"prefs.persistent_ribbon_pressed_help": "تمييز أوامر الشريط أثناء تفعيل تأثيراتها. أوقف هذا الخيار للاحتفاظ بالمظهر المحايد السابق ومساعدة الأوامر.",
|
||||
"prefs.perspective_fov": "مجال الرؤية",
|
||||
"prefs.placement": "الموضع",
|
||||
"prefs.prefer_free_sketch_points": "تفضيل نقاط الرسم القابلة للتحريك عند تداخل النقاط",
|
||||
"prefs.preview_choices": "معاينة اختياراتك",
|
||||
"prefs.print_face_highlight": "إبراز وجه الطباعة",
|
||||
"prefs.print_face_highlight_tip": "مدى قوة تلوين وجه الطباعة للجسم وتحديده في العرض. 0 % لا يُظهر أي إبراز.",
|
||||
"prefs.profile_active": "ملف التعريف النشط",
|
||||
"prefs.profile_applied": "تم تطبيق ملف التعريف.",
|
||||
"prefs.profile_changed": "تغيّرت الإعدادات منذ حفظ ملف التعريف. «حفظ» يحفظها فيه.",
|
||||
"prefs.profile_deleted": "تم حذف ملف التعريف.",
|
||||
"prefs.profile_export": "تصدير…",
|
||||
"prefs.profile_exported": "تم تصدير ملف التعريف.",
|
||||
"prefs.profile_imported": "تم استيراد ملف التعريف. اختره في «ملف التعريف النشط» للتبديل إليه.",
|
||||
"prefs.profile_name_hint": "اسم ملف التعريف، مثل: حاسوب محمول",
|
||||
"prefs.profile_rename": "إعادة تسمية",
|
||||
"prefs.profile_renamed": "تمت إعادة تسمية ملف التعريف.",
|
||||
"prefs.profile_save": "حفظ",
|
||||
"prefs.profile_saved": "تم حفظ الإعدادات الحالية في ملف التعريف.",
|
||||
"prefs.profile_skipped": "تم تطبيق ملف التعريف؛ احتفظ {n} من الإعدادات بقيمها الحالية (راجع السجل).",
|
||||
"prefs.profiles": "ملفات تعريف الإعدادات",
|
||||
"prefs.profiles_note": "الاختصارات وشريط الأدوات والتنقل والقائمة الدائرية وإعدادات الواجهة، محفوظة معًا تحت اسم واحد وتُبدَّل دفعة واحدة.",
|
||||
"prefs.project_options_dialog": "مربع حوار خيارات الإسقاط",
|
||||
"prefs.project_options_dialog_note": "تشغيل: اختر الهندسة أو الأجسام ورابط الإسقاط قبل الإسقاط. إيقاف: الإبقاء على سير العمل السابق بالاختيار المباشر.",
|
||||
"prefs.quality_default": "افتراضي",
|
||||
"prefs.quality_fastest": "الأسرع",
|
||||
"prefs.quality_slowest": "الأبطأ",
|
||||
"prefs.quality_smoother": "أنعم",
|
||||
"prefs.quick_measure": "قياس سريع في زاوية العرض",
|
||||
"prefs.quick_measure_note": "مقاس العناصر المحددة في الزاوية اليمنى السفلية من العرض: طول الحافة (أو Ø وR للحافة الدائرية)، ومساحة الوجه، وموضع النقطة، والمسافة والزاوية بين عنصرين، ومجموع عدة حواف أو أوجه. النقر ينسخه.",
|
||||
"prefs.render_previous_geometry_budget": "استخدام ميزانية الهندسة السابقة لمعاينة التصيير",
|
||||
"prefs.render_previous_geometry_budget_help": "استعادة حد الهندسة الثابت السابق (512 ميبيبايت على سطح المكتب 64 بت، و128 ميبيبايت على المنصات الأخرى) بدلًا من الميزانية المعتمدة على الجهاز.",
|
||||
"prefs.reports_saved": "{n} محفوظة",
|
||||
"prefs.ribbon_reveal": "إظهار مكان نتائج البحث في الشريط",
|
||||
"prefs.ribbon_reveal_note": "عند تمرير المؤشر فوق نتيجة في «البحث في الأوامر» يظهر مكان الأمر في الشريط: تبويبه أو زره أو صفه في القائمة المنسدلة للوحة. ويومض هناك الأمر الذي بدأ من البحث، ويُعلِّم الأمر الجاري من قائمة منسدلة لوحتَه.",
|
||||
"prefs.right_click": "نقر أيمن",
|
||||
"prefs.saving": "الحفظ التلقائي والاستعادة",
|
||||
"prefs.scale_note": "أو Ctrl + / Ctrl − في النافذة. الأزرار 28 px عند 100%.",
|
||||
@@ -1896,18 +2016,29 @@
|
||||
"prefs.search_empty": "لا توجد إعدادات مطابقة",
|
||||
"prefs.select": "تحديد",
|
||||
"prefs.select_one_item": "تحديد عنصر واحد",
|
||||
"prefs.select_other_hidden": "تحديد العناصر الهندسية المخفية باستخدام «تحديد عنصر آخر»",
|
||||
"prefs.select_other_hidden_help": "عند التفعيل: تضمين الأجسام والمخططات المخفية والحواف المحجوبة قرب المؤشر. عند التعطيل: استخدام القائمة الأصلية للعناصر الهندسية المرئية أسفل المؤشر.",
|
||||
"prefs.selecting": "التحديد",
|
||||
"prefs.shift": "Shift",
|
||||
"prefs.shift_add_ctrl_toggle": "Shift يضيف فقط، وCtrl / Cmd يبدّل",
|
||||
"prefs.shift_add_note": "عند التشغيل: Shift يضيف، وCtrl / Cmd يبدّل. عند الإيقاف (الافتراضي): كلاهما يبدّل.",
|
||||
"prefs.shortcuts": "الاختصارات",
|
||||
"prefs.single_surface_analysis": "استخدام تحليل سطح واحد",
|
||||
"prefs.single_surface_analysis_help": "عند إيقاف هذا الخيار، يمكن إبقاء تظليل السطح وتحليل الاستمرارية مفعّلين معًا. عند تشغيله، يبقى آخر تحليل تم بدؤه أو تغييره فقط.",
|
||||
"prefs.sketch_align_points": "المحاذاة مع نقاط الرسم الأخرى أثناء الرسم",
|
||||
"prefs.sketch_align_points_note": "أثناء الرسم، تتحاذى النقطة أفقيًا مع نقطة رسم وعموديًا مع نقطة أخرى في الوقت نفسه، مع خط إرشادي منقط، وتحتفظ النقرة بالمحاذاتين. عند الإيقاف: مع النقطة السابقة فقط، محور واحد في كل مرة.",
|
||||
"prefs.sketch_conflict_colour": "الهندسة المتعارضة بلون التعارض",
|
||||
"prefs.sketch_conflict_colour_note": "عندما تتعارض قيود الرسم، تُرسم المنحنيات والنقاط التي يمسكها قيد فاشل بلون التعارض أيضًا، لا رمزه أو بُعده فقط. عند الإيقاف: تحتفظ بألوانها المعتادة.",
|
||||
"prefs.sketch_construction_lines": "أدوات الخطوط الإنشائية الموسعة",
|
||||
"prefs.sketch_exit_view": "عند انتهاء الرسم",
|
||||
"prefs.sketch_exit_view.keep": "إبقاء العرض الحالي",
|
||||
"prefs.sketch_exit_view.previous": "العودة إلى العرض السابق",
|
||||
"prefs.sketch_exit_view.unless_rotated": "العودة ما لم يُدوَّر العرض",
|
||||
"prefs.sketch_exit_view_note": "أين ينتقل العرض بعد إنهاء الرسم أو الإلغاء أو الضغط على Esc مرتين.",
|
||||
"prefs.sketch_open_look_at": "توجيه العرض نحو الرسم عند فتحه",
|
||||
"prefs.sketch_open_look_at_note": "عند الإيقاف: إنشاء الرسم أو تحريره يُبقي العرض كما هو. يوجّه «النظر إلى» العرض نحو الرسم عند الحاجة.",
|
||||
"prefs.sketch_recent_snap": "الالتقاط التلقائي إلى المراكز ونقاط المنتصف الأخيرة",
|
||||
"prefs.sketch_recent_snap_note": "أثناء الرسم، يلتقط المؤشر الموضع الذي يتقاطع فيه دليلا آخر مركزي دائرتين أو نقطتي منتصف حافتين مستقيمتين. عند الإيقاف: تبقى تلك الأدلة للعرض فقط ولا يتحرك المؤشر.",
|
||||
"prefs.sketch_selection": "الرسم والتحديد",
|
||||
"prefs.sketch_selection_heading": "الرسم والتحديد",
|
||||
"prefs.sketch_selection_note": "كيف تلتقط الرسومات وكيف تحدد النقرات.",
|
||||
@@ -1952,23 +2083,47 @@
|
||||
"prefs.toast_place": "الإشعارات",
|
||||
"prefs.toggle_item": "إضافة العنصر، أو إزالته مرة أخرى",
|
||||
"prefs.toolbar": "شريط الأدوات",
|
||||
"prefs.toolbar_tabs": "علامات تبويب شريط الأدوات",
|
||||
"prefs.top": "أعلى",
|
||||
"prefs.trackpad_zoom_modifier": "التكبير بالتمرير بإصبعين أثناء الضغط على",
|
||||
"prefs.trackpad_zoom_modifier.alt": "⌥ / Alt",
|
||||
"prefs.trackpad_zoom_modifier.cmd": "⌘",
|
||||
"prefs.trackpad_zoom_modifier.ctrl": "Ctrl",
|
||||
"prefs.trackpad_zoom_modifier.help": "اضغط مع الاستمرار على هذا المفتاح وحده للتكبير عند المؤشر بالتمرير العمودي. عند الإيقاف يبقى سلوك التمرير كما هو.",
|
||||
"prefs.trackpad_zoom_modifier.off": "إيقاف",
|
||||
"prefs.translucent": "شفاف",
|
||||
"prefs.under_browser": "تحت المستعرض",
|
||||
"prefs.under_cursor": "تحت المؤشر",
|
||||
"prefs.units_precision": "الوحدات والدقة",
|
||||
"prefs.updates": "التحديثات",
|
||||
"prefs.value_boxes_in_view": "إظهار القيم بجانب مقابضها في العرض",
|
||||
"prefs.value_boxes_in_view_tip": "قيمة الأمر (المسافة، نصف القطر…) في مربع بجانب مقبضه، فوق النموذج. عند الإيقاف: تكتبها في نافذة الأمر، التي تتلقى لوحة المفاتيح بعد التحديد، ولا شيء يغطي النموذج.",
|
||||
"prefs.view": "سلوك العرض",
|
||||
"prefs.view_confirm_corner": "موافق وإلغاء في زاوية العرض",
|
||||
"prefs.view_confirm_corner_note": "أثناء فتح مربع حوار أو رسم، تؤدي علامة الصح وعلامة الإكس أعلى يمين العرض ما يؤديه زرّا موافق وإلغاء في مربع الحوار، أو تنهي الرسم وتلغيه. وينتقل متصفح العرض إلى أسفلهما.",
|
||||
"prefs.viewport": "منطقة العرض",
|
||||
"prefs.viewport_analysis_status": "إظهار حالة التحليل في منفذ العرض",
|
||||
"prefs.viewport_analysis_status_help": "عرض التحليلات النشطة أعلى منفذ العرض وفتح مفتاح كل تحليل من عنصره. ينهي Esc أحدث تحليل. أوقف الخيار لاستعادة المفاتيح في الزاوية وسلوك Esc السابق.",
|
||||
"prefs.viewport_background": "الخلفية",
|
||||
"prefs.viewport_background_colour": "لون",
|
||||
"prefs.viewport_background_theme": "تدرج السمة",
|
||||
"prefs.viewport_section_status": "إظهار حالة المقطع في منفذ العرض",
|
||||
"prefs.viewport_section_status_help": "عرض إعداد المقطع في منفذ العرض. يُوقف Escape وزر الشريط النشط المقطع. عطّل الخيار للاحتفاظ بأدوات المقطع السابقة.",
|
||||
"prefs.viewport_status_summary": "تلخيص عناصر حالة منفذ العرض",
|
||||
"prefs.viewport_status_summary_help": "اجمع ثلاثة عناصر أو أكثر لحالة منفذ العرض في شارة ملخّصة واحدة. عطّل الخيار لإبقاء كل عنصر في الصف الكامل.",
|
||||
"prefs.wheel": "العجلة",
|
||||
"prefs.wheel_trackpad": "العجلة ولوحة اللمس",
|
||||
"prefs.workspace": "مساحة العمل",
|
||||
"prefs.zoom_stop_at_model": "إيقاف التكبير عند النموذج",
|
||||
"prefs.zoom_stop_at_model_tip": "تُكبّر الفأرة ثلاثية الأبعاد وتطبيق الجهاز نحو السطح في منتصف العرض، ويثبّت التكبير بالسحب نقطة بدء السحب. عند الإيقاف يمكن للتكبير المرور عبر النموذج. تستخدم العجلة وإيماءة القرص إعداد التكبير نحو المؤشر بشكل مستقل",
|
||||
"prefs.zoom_toward_cursor": "التكبير نحو المؤشر",
|
||||
"properties.title": "الخصائص: {name}",
|
||||
"recovery.days_ago": "قبل {count} يوم",
|
||||
"recovery.detail": "{file} · {features} ميزة · حُفظ تلقائيًا {when}",
|
||||
"recovery.discard_all": "تجاهل الكل",
|
||||
"recovery.discard_all_detail": "لا يمكن التراجع عن هذا الإجراء.",
|
||||
"recovery.discard_all_title": "تجاهل {count} من عمليات الحفظ التلقائي؟",
|
||||
"recovery.discard_all_title_one": "تجاهل حفظ تلقائي واحد؟",
|
||||
"recovery.hours_ago": "قبل {count} ساعة",
|
||||
"recovery.just_now": "الآن",
|
||||
"recovery.min_ago": "قبل {count} دقيقة",
|
||||
@@ -2662,7 +2817,7 @@
|
||||
"render.light_intensity": "الشدة",
|
||||
"render.light_missing": "هذا الضوء لم يعد موجودًا. اختر ضوءًا في المتصفح.",
|
||||
"render.light_place_highlight": "وضع بالتمييز",
|
||||
"render.light_place_pending": "الوضع بالتمييز يتطلب اختيار الأضواء في منفذ العرض وهو غير مدعوم بعد.",
|
||||
"render.light_place_pending": "الوضع بالتمييز يتطلب اختيار الأضواء في منطقة العرض وهو غير مدعوم بعد.",
|
||||
"render.light_position": "الموضع",
|
||||
"render.light_preview_help": "العرض الحي بلا ظلال؛ الأضواء المساحية تستخدم تقريب عينة المركز. التصيير يستخدم نموذج الضوء الكامل.",
|
||||
"render.light_product_centre": "مركز المنتج",
|
||||
@@ -2834,7 +2989,9 @@
|
||||
"render.output_ready": "جاهز للتصيير",
|
||||
"render.output_run_check": "تشغيل الفحص",
|
||||
"render.output_size_limit": "{method}: حتى {dimension} بكسل لكل ضلع و{pixels} بكسل. أكبر حجم مناسب: {width} × {height}.",
|
||||
"render.output_size_method_profile": "لتصيير {width} × {height}، اختر {method} مع ملف موارد CPU «{profile}»، أو حجمًا أصغر.",
|
||||
"render.output_size_ok": "الحجم مناسب · {width} × {height} بكسل",
|
||||
"render.output_size_profile": "لتصيير {width} × {height}، اختر ملف موارد CPU «{profile}»، أو حجمًا أصغر.",
|
||||
"render.output_swap_orientation": "تبديل العرض والارتفاع",
|
||||
"render.output_tools_inspector": "عدّل الحجم والصيغة في مفتش المخرجات.",
|
||||
"render.output_view_image": "عرض الصورة",
|
||||
@@ -3047,6 +3204,7 @@
|
||||
"render.size_custom": "مخصص…",
|
||||
"render.size_full_hd": "Full HD",
|
||||
"render.size_hd": "HD",
|
||||
"render.size_needs_profile": "{size} · يتطلب «{profile}»",
|
||||
"render.size_presets": "إعدادات الحجم المسبقة",
|
||||
"render.size_presets_pending": "تصل مع محرر المخرجات",
|
||||
"render.size_preview": "معاينة",
|
||||
@@ -3296,6 +3454,7 @@
|
||||
"select an axis": "حدد محورًا",
|
||||
"select an axis, a straight or circular edge, or a cylinder, cone or torus face first": "حدد أولًا محورًا أو حافة مستقيمة أو دائرية أو وجه أسطوانة أو مخروط أو طارة",
|
||||
"select bodies first": "حدد الأجسام أولًا",
|
||||
"select components first": "حدد المكوّنات أولًا",
|
||||
"select corner points, or the two lines of one corner": "حدد نقاط الزوايا، أو الخطين اللذين يكوّنان زاوية واحدة",
|
||||
"select one corner point, or the two lines of one corner": "حدد نقطة زاوية واحدة، أو الخطين اللذين يكوّنان زاوية واحدة",
|
||||
"select sheet edges first": "حدد حواف الصفيحة أولًا",
|
||||
@@ -3314,6 +3473,7 @@
|
||||
"settings.double_click_components": "انقر نقرًا مزدوجًا على مكوّن لتنشيطه، أو لتحرير مكوّن مرتبط في مكانه",
|
||||
"settings.frame_rate_details_note": "يضيف رسمًا لأزمنة الإطارات الأخيرة مع المثلثات المرسومة فوقه، ومدرّجًا تكراريًا لأزمنة الإطارات، وما رسمته وحدة GPU. انقر معدل الإطارات في العرض لإظهارها أو إخفائها.",
|
||||
"settings.frame_rate_note": "يعرض الإطارات في الثانية في الزاوية اليمنى السفلية من العرض. أثناء تفعيله يُعاد رسم العرض باستمرار.",
|
||||
"settings.insert_lists_open_designs": "يعرض إدراج تصميم أولًا التصاميم المفتوحة في علامات التبويب الأخرى",
|
||||
"settings.measure_axis_distances": "إظهار المسافات على X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "إظهار مركّبات الأبعاد على محاور العالم بجانب المسافة الكلية أثناء فتح أداة القياس.",
|
||||
"settings.msaa_applies_on_restart": "يُطبّق تنعيم الحواف في المرة القادمة التي يبدأ فيها SolidCraft",
|
||||
@@ -3332,12 +3492,34 @@
|
||||
"sheet.flange_type_contour": "محيط",
|
||||
"sheet.flange_type_edge": "حافة",
|
||||
"sheet.no_body": "لا يوجد جسم صفائح معدنية: ابدأ واحدًا من حافة مثنية > أساسية، أو حوّل لوحًا إلى صفائح معدنية بأمر تحويل إلى صفائح معدنية (اختر وجهه المسطح الكبير)",
|
||||
"sheet.personal_rules.confirm_delete": "تأكيد الحذف",
|
||||
"sheet.personal_rules.delete": "حذف",
|
||||
"sheet.personal_rules.delete_prompt": "هل تحذف هذه القاعدة الشخصية؟ القواعد الموجودة في التصاميم لا تتغير.",
|
||||
"sheet.personal_rules.full": "المكتبة الشخصية فيها 64 قاعدة بالفعل.",
|
||||
"sheet.personal_rules.invalid_name": "أدخل اسمًا قصيرًا بلا فواصل أسطر ولا محارف تحكم.",
|
||||
"sheet.personal_rules.invalid_values": "أكمل قيم القاعدة: يجب أن تُحسب كل قيمة في هذا التصميم، بسماكة موجبة ومعامل K من 0 إلى 1.",
|
||||
"sheet.personal_rules.missing": "القاعدة الشخصية المحددة لم تعد متاحة.",
|
||||
"sheet.personal_rules.name": "اسم القاعدة",
|
||||
"sheet.personal_rules.name_exists": "توجد قاعدة شخصية بهذا الاسم. استخدم اسمًا آخر.",
|
||||
"sheet.personal_rules.name_hint": "اسم فريد",
|
||||
"sheet.personal_rules.overwrite": "حفظ التغييرات في القاعدة الشخصية المحددة",
|
||||
"sheet.personal_rules.rename": "إعادة تسمية",
|
||||
"sheet.personal_rules.rule": "القاعدة الشخصية",
|
||||
"sheet.personal_rules.save": "حفظ كجديدة",
|
||||
"sheet.personal_rules.scope": "محفوظة في ملفك الشخصي لكل التصاميم.",
|
||||
"sheet.personal_rules.select": "اختر قاعدة",
|
||||
"sheet.personal_rules.title": "القواعد الشخصية",
|
||||
"sheet.personal_rules.unsupported": "تحتوي هذه القاعدة على قيم لا يستطيع هذا الإصدار استخدامها.",
|
||||
"shortcut.json_error": "يجب أن تكون المعاملات بصيغة JSON: {error}",
|
||||
"shortcut.no_command": "لا يوجد أمر `{id}`، ويجب أن يكون النص قبل JSON معرّف أمر",
|
||||
"shortcut.pin": "تثبيت في أعلى مربع S",
|
||||
"shortcut.unpin": "إلغاء التثبيت",
|
||||
"sketch is missing": "الرسم مفقود",
|
||||
"sketch.degrees_of_freedom": "{count} درجات حرية",
|
||||
"sketch.dimension_added_driven": "الرسم يحدد هذا البُعد بالفعل، لذا أُضيف بُعدًا مُشتقًا (مرجعيًا)",
|
||||
"sketch.dimension_applied": "تم تطبيق البُعد",
|
||||
"sketch.dimension_applied_defined": "تم تطبيق البُعد؛ تم تعريف المعامل `{name}`",
|
||||
"sketch.dimension_applied_renamed": "تم تطبيق البُعد؛ أصبح اسم المعامل `{name}`",
|
||||
"sketch.dof_left": "تبقّت {count} درجات حرية",
|
||||
"sketch.dof_left_one": "تبقّت {count} درجة حرية",
|
||||
"sketch.draw_curves": "الرسم كـ {linetype}",
|
||||
@@ -3364,6 +3546,7 @@
|
||||
"sketch_text.align_right": "يمين",
|
||||
"sketch_text.bold": "غامق",
|
||||
"sketch_text.builtin_font": "{family} (مدمج)",
|
||||
"sketch_text.formula": "ابدأ بـ = لتكوين النص من المعاملات: ='W' + number(Width)",
|
||||
"sketch_text.italic": "مائل",
|
||||
"sketch_text.loading_fonts": "جارٍ البحث عن الخطوط المثبتة…",
|
||||
"sketch_text.on_path": "النص يتبع مساره: المنحنى يحدد موضعه",
|
||||
@@ -3372,6 +3555,8 @@
|
||||
"sketch_text.use_font_file": "استخدام ملف الخط {path}",
|
||||
"solid": "مصمت",
|
||||
"status.editing": "تحرير {name}",
|
||||
"status.navigation": "تعيين أزرار الفأرة: {mapping}",
|
||||
"status.navigation_tip": "كيف تحرّك الفأرة العرض. انقر لاختيار تعيين آخر",
|
||||
"status.under_constrained": "قيود ناقصة ({count} درجات حرية)",
|
||||
"status.under_constrained_one": "قيود ناقصة ({count} درجة حرية)",
|
||||
"status.units_tip": "وحدات التصميم. انقر لتغييرها",
|
||||
@@ -3405,8 +3590,10 @@
|
||||
"timeline.delete_folders_tip": "الإبقاء على ميزاتها ومجلداتها الفرعية في السجل",
|
||||
"timeline.delete_folders_with_features_tip": "حذف المجلدات مع كل الميزات التي فيها والمجلدات المتداخلة فيها",
|
||||
"timeline.delete_many": "حذف {count} ميزات محددة",
|
||||
"timeline.edited_rolled_back": "تم تغيير {name}، لكنه يقع بعد مؤشر السجل ولذلك لا يُبنى: انقل المؤشر إلى ما بعده لرؤية النتيجة",
|
||||
"timeline.feature_error": "خطأ: {message}",
|
||||
"timeline.feature_hint": "انقر نقرًا مزدوجًا للتحرير · اسحب لإعادة الترتيب · انقر بالزر الأيمن للمزيد",
|
||||
"timeline.feature_rolled_back": "تم التراجع: بعد مؤشر السجل، لذلك لا يُبنى",
|
||||
"timeline.feature_warning": "تحذير: {message}",
|
||||
"timeline.group": "مجلد ميزات جديد",
|
||||
"timeline.move_many": "نقل عناصر الخط الزمني",
|
||||
@@ -3488,6 +3675,10 @@
|
||||
"ui.3d_mouse_offer": "معايرة الفأرة ثلاثية الأبعاد تصلح المحاور المتبادلة أو المعكوسة وتضبط سرعتها وإحساسها.",
|
||||
"ui.3d_mouse_offer_never": "عدم الإظهار مرة أخرى",
|
||||
"ui.3d_mouse_offer_swap": "التبديل إلى Hidraw",
|
||||
"ui.3d_mouse_orbit": "تدوير العرض",
|
||||
"ui.3d_mouse_orbit_classic": "كلاسيكي",
|
||||
"ui.3d_mouse_orbit_tip": "متتبَّع: تُدير الفأرة ثلاثية الأبعاد العرض حول جزء النموذج الموجود في منتصف العرض عند بدء الدوران، وتُعلّمه بكرة باهتة. كلاسيكي: حول مركز العرض",
|
||||
"ui.3d_mouse_orbit_traced": "متتبَّع",
|
||||
"ui.3d_mouse_reading": "القراءة",
|
||||
"ui.3d_mouse_reset_axes": "إعادة تعيين المحاور",
|
||||
"ui.3d_mouse_reset_view": "إعادة تعيين العرض",
|
||||
@@ -3496,6 +3687,8 @@
|
||||
"ui.3d_mouse_section": "الفأرة ثلاثية الأبعاد",
|
||||
"ui.3d_mouse_show_in_view": "إظهار الفأرة ثلاثية الأبعاد في العرض ثلاثي الأبعاد",
|
||||
"ui.3d_mouse_show_in_view_tip": "صورة للفأرة ثلاثية الأبعاد في الزاوية السفلية اليسرى، تتحرك كلما حرّكتها.",
|
||||
"ui.3d_mouse_sketch_orbit": "تدوير الرسومات بالفأرة ثلاثية الأبعاد",
|
||||
"ui.3d_mouse_sketch_orbit_tip": "تدير الفأرة ثلاثية الأبعاد العرض أيضًا أثناء فتح رسم ورؤيته من الأمام مباشرة، كما تفعل الفأرة. عند الإيقاف: تُزيح الرسم وتكبّره فقط حتى تُميل العرض.",
|
||||
"ui.3d_mouse_skip": "جهازي لا يستطيع ذلك",
|
||||
"ui.3d_mouse_skip_tip": "يتخطى هذه الحركة في الاتجاهين، وتستبعدها المعايرة.",
|
||||
"ui.3d_mouse_speed": "سرعة الفأرة ثلاثية الأبعاد",
|
||||
@@ -3524,6 +3717,8 @@
|
||||
"ui.3d_mouse_step_twist_counterclockwise": "لُفّ الغطاء عكس عقارب الساعة، وأمسكه، ثم اتركه.",
|
||||
"ui.3d_mouse_switch_cap": "المعايرة كجهاز العودة إلى المركز",
|
||||
"ui.3d_mouse_switch_trackball": "المعايرة ككرة تتبّع",
|
||||
"ui.3d_mouse_use_direct": "المشغل المباشر",
|
||||
"ui.3d_mouse_use_direct_tip": "قراءة الفأرة ثلاثية الأبعاد مباشرة (hidraw) بدلًا من المرور عبر spacenavd.",
|
||||
"ui.3d_mouse_view_axis": "محور العرض",
|
||||
"ui.3d_mouse_view_off": "متوقف",
|
||||
"ui.3d_mouse_view_off_tip": "ملف تعريف مشغّل الفأرة ثلاثية الأبعاد يوقف هذا المحور، فلا تحرك حركتُه العرض. اختيار حركة محور آخر هنا يبادل بينهما، فتتوقف تلك الحركة عن تحريك العرض.",
|
||||
@@ -3657,6 +3852,8 @@
|
||||
"ui.agent_chat_remove": "إزالة من قائمة الانتظار",
|
||||
"ui.agent_chat_remove_file": "إزالته من هذه الرسالة",
|
||||
"ui.agent_chat_remove_imported": "إزالته من هذه الرسالة؛ تبقى القطعة في التصميم (التراجع يزيلها)",
|
||||
"ui.agent_chat_reply_cut_off": "بلغ الرد حد طوله قبل أن يكتمل، لذا قد يكون ناقصًا. اطلب من الوكيل أن يتابع، أو أن يجيب بإيجاز أكبر.",
|
||||
"ui.agent_chat_reply_declined": "رفض النموذج الإجابة عن هذه الرسالة.",
|
||||
"ui.agent_chat_retry": "إعادة المحاولة",
|
||||
"ui.agent_chat_right": "يمين",
|
||||
"ui.agent_chat_save": "حفظ",
|
||||
@@ -3840,6 +4037,7 @@
|
||||
"ui.circle": "دائرة",
|
||||
"ui.circular_pattern": "نمط دائري",
|
||||
"ui.clear": "مسح",
|
||||
"ui.clear_print_face": "مسح وجه الطباعة",
|
||||
"ui.clear_recent": "مسح الأخيرة",
|
||||
"ui.clear_the_selection": "مسح التحديد",
|
||||
"ui.click_selects_whole_bodies": "النقر يحدد الأجسام كاملة",
|
||||
@@ -3874,6 +4072,15 @@
|
||||
"ui.constant": "ثابت",
|
||||
"ui.constraints_conflict": "تعارض في القيود",
|
||||
"ui.construction": "مساعد",
|
||||
"ui.construction.angle_hint": "خط إنشائي: انقر نقطة ثم أدخل زاوية أو اختر اتجاهًا",
|
||||
"ui.construction.bisector_hint": "منصف زاوية: اختر خطين مستقيمين متقاطعين ثم الحل المطلوب",
|
||||
"ui.construction.common_hint": "مماس مشترك: اختر دائرتين/قوسين ثم الحل المطلوب",
|
||||
"ui.construction.contact_hint": "مماس: اختر دائرة/قوسًا أو منحنى شريحيًا/قطعًا مخروطيًا مفتوحًا ثم نقطة التماس (للمنحنيات الحرة: النهايات فقط)",
|
||||
"ui.construction.external_hint": "مماس: اختر دائرة أو قوسًا ثم نقطة خارجية ثم الحل المطلوب",
|
||||
"ui.construction.free_hint": "خط إنشائي: انقر نقطتين؛ انقر بزر الفأرة الأيمن للبدء من جديد",
|
||||
"ui.construction.point_hint": "خط إنشائي: انقر نقطة المرور",
|
||||
"ui.construction.reference_hint": "خط إنشائي: اختر خطًا مستقيمًا ثم نقطة؛ انقر بزر الفأرة الأيمن لتغيير المرجع",
|
||||
"ui.construction.ribbon_label": "خطوط مساعدة",
|
||||
"ui.context_menu": "القائمة السياقية",
|
||||
"ui.continuity_g0": "G0 تجعّد",
|
||||
"ui.continuity_g1": "G1 مماس",
|
||||
@@ -3965,6 +4172,14 @@
|
||||
"ui.end_scale": "مقياس النهاية",
|
||||
"ui.entities": "العناصر",
|
||||
"ui.equal": "متساوٍ",
|
||||
"ui.equation_end": "النهاية",
|
||||
"ui.equation_explicit": "صريح",
|
||||
"ui.equation_form": "الشكل",
|
||||
"ui.equation_note": "المتغير رقم بلا وحدة: تأخذه sin(t) بالراديان. والنتيجة التي بلا وحدة تكون بوحدة التصميم.",
|
||||
"ui.equation_parametric": "بارامتري",
|
||||
"ui.equation_x_of_t": "x(t)",
|
||||
"ui.equation_y_of_t": "y(t)",
|
||||
"ui.equation_y_of_x": "y(x)",
|
||||
"ui.equivalent_radius": "نصف القطر المكافئ",
|
||||
"ui.expand": "توسيع",
|
||||
"ui.exportDxf": "تصدير DXF…",
|
||||
@@ -4030,6 +4245,7 @@
|
||||
"ui.heading_design": "التصميم",
|
||||
"ui.heading_draft": "ميل السحب",
|
||||
"ui.heading_edit": "تعديل",
|
||||
"ui.heading_equation_curve": "منحنى معادلة",
|
||||
"ui.heading_extrude": "بثق",
|
||||
"ui.heading_fillet": "تقويس",
|
||||
"ui.heading_finish_editing": "إنهاء التحرير",
|
||||
@@ -4121,6 +4337,10 @@
|
||||
"ui.import_ellipsis": "استيراد…",
|
||||
"ui.infinite": "لا نهائي",
|
||||
"ui.insert": "إدراج",
|
||||
"ui.insert_design.browse": "استعراض…",
|
||||
"ui.insert_design.open_designs": "التصاميم المفتوحة",
|
||||
"ui.insert_design.saved_file": "في {name} تغييرات غير محفوظة، لذا أُدرج ملفه المحفوظ. احفظه، ثم استخدم تحديث الروابط لإدخال التغييرات.",
|
||||
"ui.insert_design.unsaved": "تغييرات غير محفوظة",
|
||||
"ui.inspect": "فحص",
|
||||
"ui.intersect": "تقاطع",
|
||||
"ui.isolate": "عزل",
|
||||
@@ -4220,6 +4440,7 @@
|
||||
"ui.pan_zoom_orbit": "إزاحة، تكبير، تدوير",
|
||||
"ui.parallel": "متوازي",
|
||||
"ui.parameters": "المعاملات",
|
||||
"ui.part_size_needs_a_part": "حدد قطعة قياسية مُدرجة (برغي أو صامولة أو حلقة مسطحة أو مسمار) لتغيير مقاسها. لتكبير جسم أو تصغيره، استخدم «تحجيم».",
|
||||
"ui.part_size_shared": "يعيد بناء القطعة مستبدلًا أي ميزات مضافة. تتحدث كل نسخ هذا المكوّن.",
|
||||
"ui.paste": "لصق",
|
||||
"ui.path": "المسار",
|
||||
@@ -4249,12 +4470,17 @@
|
||||
"ui.plugins_skipped": "تعذّرت قراءة {count} مجلد(ات).",
|
||||
"ui.plugins_version": "{version}",
|
||||
"ui.point": "نقطة",
|
||||
"ui.point_cloud_add_filter": "إضافة مرشح…",
|
||||
"ui.point_cloud_auto_range": "نطاق تلقائي",
|
||||
"ui.point_cloud_color_by": "التلوين حسب",
|
||||
"ui.point_cloud_file_colors": "ألوان الملف",
|
||||
"ui.point_cloud_filter_by": "التصفية حسب",
|
||||
"ui.point_cloud_height_high": "أعلى ارتفاع",
|
||||
"ui.point_cloud_height_low": "أدنى ارتفاع",
|
||||
"ui.point_cloud_legend_filter": "تُعرض وتُخفى في وسيلة الإيضاح أعلاه",
|
||||
"ui.point_cloud_no_file_colors": "لا يحتوي الملف على ألوان",
|
||||
"ui.point_cloud_pause": "إيقاف مؤقت",
|
||||
"ui.point_cloud_play": "تشغيل",
|
||||
"ui.point_cloud_single_color": "لون واحد",
|
||||
"ui.point_cloud_size": "حجم النقطة",
|
||||
"ui.point_cloud_units": "وحدات الملف",
|
||||
@@ -4263,12 +4489,29 @@
|
||||
"ui.polygon": "مضلع",
|
||||
"ui.preferences": "التفضيلات",
|
||||
"ui.press_a_key": "اضغط مفتاحًا…",
|
||||
"ui.print_face_cleared": "{body}: تم مسح وجه الطباعة",
|
||||
"ui.print_face_input": "وجه الطباعة",
|
||||
"ui.print_face_one_body": "يُختار وجه الطباعة لجسم واحد: أرسل ذلك الجسم وحده لتغييره",
|
||||
"ui.print_face_pick": "اختر وجهًا مستويًا واحدًا لجسم صلب لجعله وجه الطباعة",
|
||||
"ui.print_face_set": "{body}: تم تعيين وجه الطباعة؛ الإرسال إلى برنامج التقطيع يضع الجسم عليه",
|
||||
"ui.profile": "المقطع",
|
||||
"ui.profile_plane": "مستوى المقطع",
|
||||
"ui.profiles": "المقاطع",
|
||||
"ui.project": "إسقاط",
|
||||
"ui.project_face_edges_sketch": "إسقاط حواف الوجه في رسومات جديدة",
|
||||
"ui.properties": "الخصائص",
|
||||
"ui.properties.copy_matrix": "نسخ المصفوفة",
|
||||
"ui.properties.first_moments": "العزوم الأولى",
|
||||
"ui.properties.inertia": "عزم القصور الذاتي",
|
||||
"ui.properties.inertia_note": "حول مركز الكتلة، بمحاور العالم (g·{unit}²)",
|
||||
"ui.properties.inertia_unavailable": "غير متاح: شبكة أحد الأجسام غير مغلقة.",
|
||||
"ui.properties.inertia_x": "Ixx, Ixy, Ixz",
|
||||
"ui.properties.inertia_y": "Iyx, Iyy, Iyz",
|
||||
"ui.properties.inertia_z": "Izx, Izy, Izz",
|
||||
"ui.properties.measuring": "جارٍ القياس…",
|
||||
"ui.properties.measuring_failed": "توقف القياس قبل أن يكتمل.",
|
||||
"ui.properties.principal_axis": "المحور الرئيسي {number}",
|
||||
"ui.properties.principal_moments": "العزوم الرئيسية",
|
||||
"ui.pull_direction": "اتجاه السحب",
|
||||
"ui.quality": "الجودة",
|
||||
"ui.quantity": "الكمية",
|
||||
@@ -4314,6 +4557,7 @@
|
||||
"ui.revolve": "دوران",
|
||||
"ui.ribbon_exit": "خروج",
|
||||
"ui.ribbon_labels": "إظهار النص تحت أيقونات الشريط",
|
||||
"ui.ribbon_menus_skip_pinned": "استبعاد الأوامر المثبتة من القوائم المنسدلة",
|
||||
"ui.ribbon_pin_footer": "الأوامر المثبتة تظهر في الشريط. مرّر المؤشر على صف لتثبيته أو إلغاء تثبيته.",
|
||||
"ui.ribbon_workspace": "مساحة العمل",
|
||||
"ui.right": "يمين",
|
||||
@@ -4331,6 +4575,8 @@
|
||||
"ui.select": "تحديد",
|
||||
"ui.selectOther": "تحديد آخر…",
|
||||
"ui.selectTangentChain": "تحديد سلسلة مماسية",
|
||||
"ui.select_all": "تحديد الكل",
|
||||
"ui.select_components_by_face": "تحديد المكوّنات (تحديد وجه يحدّد المكوّن الذي ينتمي إليه)",
|
||||
"ui.selection": "التحديد",
|
||||
"ui.selection_modifiers": "مُعدِّلات التحديد",
|
||||
"ui.selection_shift_add_only": "Shift مع النقر يضيف دون إزالة",
|
||||
@@ -4367,7 +4613,16 @@
|
||||
"ui.sketch": "رسم",
|
||||
"ui.sketch_dimension": "بُعد الرسم",
|
||||
"ui.sketch_grid": "شبكة الرسم",
|
||||
"ui.sketch_intersect_geometry": "الهندسة",
|
||||
"ui.sketch_intersect_projection_link": "رابط الإسقاط",
|
||||
"ui.sketch_intersect_selection_filter": "مرشح التحديد",
|
||||
"ui.sketch_modifiers": "مُعدِّلات الرسم",
|
||||
"ui.sketch_project_geometry": "الهندسة",
|
||||
"ui.sketch_report.all_constrained": "كل شيء مقيد بالكامل.",
|
||||
"ui.sketch_report.dof": "درجات الحرية",
|
||||
"ui.sketch_report.loose": "غير مقيد بالكامل",
|
||||
"ui.sketch_report.status": "الحالة",
|
||||
"ui.sketch_report.title": "تقرير الرسم",
|
||||
"ui.sketch_scale": "تحجيم الرسم",
|
||||
"ui.sketches": "الرسومات",
|
||||
"ui.slice": "تقطيع",
|
||||
@@ -4414,6 +4669,11 @@
|
||||
"ui.symmetric": "متماثل",
|
||||
"ui.symmetry": "التماثل",
|
||||
"ui.system": "النظام",
|
||||
"ui.tab_assemble": "التجميع",
|
||||
"ui.tab_manage": "إدارة",
|
||||
"ui.tab_sheet_metal": "الصفائح المعدنية",
|
||||
"ui.tab_view": "العرض",
|
||||
"ui.tab_weldments": "اللحامات",
|
||||
"ui.tangent": "مماس",
|
||||
"ui.taper_angle": "زاوية الاستدقاق",
|
||||
"ui.tapped": "ملولب",
|
||||
@@ -4429,6 +4689,7 @@
|
||||
"ui.tip_angle": "زاوية الرأس",
|
||||
"ui.to_object": "إلى كائن",
|
||||
"ui.tool_direction": "اتجاه الأداة",
|
||||
"ui.toolbar_tabs_hidden": "جميع علامات تبويب شريط الأدوات مخفية. انقر على + أو انقر هنا بزر الفأرة الأيمن لإظهار إحداها.",
|
||||
"ui.top": "أعلى",
|
||||
"ui.top_diameter": "القطر العلوي",
|
||||
"ui.top_radius": "نصف القطر العلوي",
|
||||
@@ -4466,15 +4727,25 @@
|
||||
"ui.view_centre": "مركز العرض",
|
||||
"ui.viewport_status_clear": "إيقاف {name}",
|
||||
"ui.viewport_status_clear_hint": "إيقاف {name} · Esc",
|
||||
"ui.viewport_status_edges": "{count} حواف",
|
||||
"ui.viewport_status_from": "من {direction}",
|
||||
"ui.viewport_status_key": "إظهار مفتاح الألوان لـ {name}",
|
||||
"ui.viewport_status_minimum_radius": "أقل نصف قطر",
|
||||
"ui.viewport_status_pairs": "{count} أزواج",
|
||||
"ui.viewport_status_section_hatch": "{setting} · تهشير",
|
||||
"ui.viewport_status_section_plane": "المستوى الحالي",
|
||||
"ui.viewport_status_section_tilted": "مائل · {offset}",
|
||||
"ui.viewport_status_stripes": "{count} شريطًا",
|
||||
"ui.viewport_status_summary_clear": "إيقاف كل شيء",
|
||||
"ui.viewport_status_summary_heading": "في هذا العرض",
|
||||
"ui.viewport_status_summary_label": "{name} و{count} عناصر أخرى",
|
||||
"ui.viewport_status_summary_more": "+{count}",
|
||||
"ui.viewport_theme_follow": "اتباع السمة",
|
||||
"ui.visual_shaded_hidden_edges": "مظلل مع الحواف المخفية",
|
||||
"ui.visual_shaded_with_edges": "مظلل مع الحواف",
|
||||
"ui.visual_style": "نمط العرض",
|
||||
"ui.visual_wireframe": "إطار سلكي",
|
||||
"ui.wheel_zoom_speed": "سرعة التكبير بعجلة الفأرة",
|
||||
"ui.width": "العرض",
|
||||
"ui.window_system": "نظام النوافذ",
|
||||
"ui.window_system_auto": "تلقائي",
|
||||
@@ -4505,7 +4776,9 @@
|
||||
"update.button": "تحديث",
|
||||
"update.button_version": "التحديث إلى {version}",
|
||||
"update.check_automatically": "التحقق من التحديثات تلقائيًا",
|
||||
"update.check_for_updates": "التحقق من وجود تحديثات",
|
||||
"update.check_now": "تحقق الآن",
|
||||
"update.check_unavailable": "التحقق من التحديثات غير متاح لهذا التثبيت.",
|
||||
"update.checking": "جارٍ التحقق…",
|
||||
"update.copy": "نسخ",
|
||||
"update.dmg_opened": "صورة القرص مفتوحة وموثّقة: اسحب SolidCraft إلى مجلد التطبيقات مستبدلًا النسخة القديمة، ثم أعد تشغيل SolidCraft.",
|
||||
@@ -4528,6 +4801,9 @@
|
||||
"update.prefs_managed": "هذا هو SolidCraft {version}، ويديره {manager}. يسأل الفحص GitHub عن أحدث إصدار ولا يرسل شيئًا آخر؛ حدّث SolidCraft من داخل {manager}.",
|
||||
"update.prefs_note": "هذا SolidCraft {version} ({kind}). التحقق يسأل GitHub عن أحدث إصدار ولا يرسل أي شيء آخر.",
|
||||
"update.prefs_web": "أعد تحميل الصفحة للحصول على أحدث إصدار من تطبيق الويب. إذا لم تتوفر الشبكة أو لم يكتمل تنزيل التحديث في الوقت المناسب، يُفتح الإصدار المحفوظ بدلًا منه؛ ويستمر التنزيل الجاري حتى إعادة التحميل التالية.",
|
||||
"update.refresh_checking": "جارٍ البحث عن أحدث إصدار…",
|
||||
"update.refresh_fallback": "تعذّر البحث عن إصدار أحدث؛ سيتم التحديث إلى {version} الذي عُثر عليه سابقًا.",
|
||||
"update.refresh_selected": "جارٍ التحديث إلى {version}.",
|
||||
"update.release_page": "فتح صفحة الإصدار",
|
||||
"update.restart": "إعادة التشغيل الآن",
|
||||
"update.restart_later": "لاحقًا",
|
||||
|
||||
@@ -206,6 +206,7 @@
|
||||
"Edges": "Ivice",
|
||||
"Edit": "Uredi",
|
||||
"Edit Profile Sketch": "Uredi skicu profila",
|
||||
"Edit shortcuts": "Uredi prečice",
|
||||
"Enable rule": "Omogući pravilo",
|
||||
"Enabled": "Omogućeno",
|
||||
"End Radius": "Krajnji poluprečnik",
|
||||
@@ -468,6 +469,7 @@
|
||||
"Radius": "Poluprečnik",
|
||||
"Radius Fit": "Uklapanje poluprečnika",
|
||||
"Ratio": "Omjer",
|
||||
"Read-only list: shortcuts can't be changed here.": "Popis samo za čitanje: prečice se ovdje ne mogu mijenjati.",
|
||||
"Reattach selected face": "Ponovo pričvrsti izabrano lice",
|
||||
"Recover": "Oporavi",
|
||||
"Recover unsaved design?": "Oporaviti nesačuvani dizajn?",
|
||||
@@ -652,6 +654,7 @@
|
||||
"Third point": "Treća tačka",
|
||||
"This child is shared. Deleting it removes it from every copy of its parent.": "Ovaj podređeni element je dijeljen. Brisanjem se uklanja iz svake kopije njegovog roditelja.",
|
||||
"This child is shared. Position changes apply to every copy of its parent.": "Ovaj podređeni element je dijeljen. Promjene položaja primjenjuju se na svaku kopiju njegovog roditelja.",
|
||||
"This component is inside a subassembly placed more than once: aligning it moves it in every placement.": "Ova komponenta je unutar podsklopa koji je postavljen više puta: njeno poravnavanje pomjera je u svakom postavljanju.",
|
||||
"This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "Ovo lice ne može dati trajno pričvršćenje. Izaberite drugo lice ili izričito koristite fiksnu ravan.",
|
||||
"This image is not attached to GitHub yet. Copy or save it, then attach it on GitHub.": "Ova slika još nije priložena na GitHubu. Kopirajte je ili sačuvajte, a zatim je priložite na GitHubu.",
|
||||
"Thread depth": "Dubina navoja",
|
||||
@@ -772,6 +775,8 @@
|
||||
"at the face": "na licu",
|
||||
"bom.group_children": "Poddijelovi u redu svog dijela",
|
||||
"browser.body_name": "Tijelo{number}",
|
||||
"browser.calibrate_click_a": "Kliknite sliku da zadate tačku A ili upišite njene koordinate.",
|
||||
"browser.calibrate_click_b": "Kliknite sliku da zadate tačku B ili upišite njene koordinate.",
|
||||
"browser.calibrate_title": "Kalibriši: {name}",
|
||||
"browser.capture_many": "Pomjerene komponente bez zabilježenog položaja: {count}.",
|
||||
"browser.capture_note": "Zabilježi zadržava novi položaj; Vrati ga vraća nazad.",
|
||||
@@ -793,6 +798,11 @@
|
||||
"cam.roller": "Valjak",
|
||||
"cam.roller_pick": "Valjak (neobavezno)",
|
||||
"cam.tip_pick": "Vrh (neobavezno)",
|
||||
"camera.shot_pitch": "Nagib",
|
||||
"camera.shot_roll": "Valjanje",
|
||||
"camera.shot_yaw": "Skretanje",
|
||||
"canvas.decal_place_hint": "Kliknite lice da postavite naljepnicu",
|
||||
"canvas.place_hint": "Kliknite ravan ili lice da postavite platno",
|
||||
"choose a profile": "izaberite profil",
|
||||
"choose the cam's and the follower's joints": "izaberite spojeve brijega i pratioca",
|
||||
"choose the joints to couple": "izaberite spojeve koje treba spregnuti",
|
||||
@@ -800,12 +810,16 @@
|
||||
"click sketch curves": "kliknite na krive skice",
|
||||
"cmd.appearance_assign": "Izgled",
|
||||
"cmd.appearance_chain": "Lanac izgleda",
|
||||
"cmd.appearance_copy": "Kopiraj izgled",
|
||||
"cmd.appearance_favorite": "Omiljeni izgled",
|
||||
"cmd.appearance_library": "Biblioteka izgleda",
|
||||
"cmd.appearance_list": "Popis izgleda",
|
||||
"cmd.appearance_paint": "Oboji izgledom",
|
||||
"cmd.appearance_paste": "Zalijepi izgled",
|
||||
"cmd.appearance_pick_up": "Preuzmi izgled",
|
||||
"cmd.appearance_replace": "Zamijeni izgled",
|
||||
"cmd.assembly_bom": "Sastavnica",
|
||||
"cmd.body.print_face": "Površina za štampu",
|
||||
"cmd.body_rename": "Preimenuj tijelo",
|
||||
"cmd.browser_collapse_all": "Skupi sve",
|
||||
"cmd.browser_expand_all": "Proširi sve",
|
||||
@@ -813,6 +827,7 @@
|
||||
"cmd.browser_move": "Premjesti stavke stabla modela",
|
||||
"cmd.browser_order": "Poredaj stavke stabla modela",
|
||||
"cmd.browser_rename_group": "Preimenuj grupu",
|
||||
"cmd.browser_reparent": "Premjesti u komponentu",
|
||||
"cmd.browser_ungroup": "Razgrupiši",
|
||||
"cmd.browser_visibility": "Prikaži/sakrij",
|
||||
"cmd.canvas_calibrate": "Kalibriši platno",
|
||||
@@ -839,7 +854,9 @@
|
||||
"cmd.component_metadata": "Svojstva dijela",
|
||||
"cmd.component_metadata_set": "Promijeni svojstva dijela",
|
||||
"cmd.component_move_bodies": "Premjesti tijela u komponentu",
|
||||
"cmd.component_move_features": "Premjesti operacije u komponentu",
|
||||
"cmd.component_move_sketches": "Premjesti skice u komponentu",
|
||||
"cmd.component_paste_from_design": "Zalijepi iz drugog dizajna",
|
||||
"cmd.component_paste_new": "Zalijepi kao novo",
|
||||
"cmd.component_properties": "Fizička svojstva komponente",
|
||||
"cmd.component_relink": "Ponovo poveži izvor",
|
||||
@@ -976,6 +993,7 @@
|
||||
"cmd.motion_trace": "Trag kretanja",
|
||||
"cmd.motion_trace_edit": "Uredi trag kretanja",
|
||||
"cmd.motion_trace_keep": "Zadrži trag kretanja",
|
||||
"cmd.occurrence_align": "Poravnaj primjerak",
|
||||
"cmd.occurrence_copy": "Zalijepi (primjerak)",
|
||||
"cmd.occurrence_drag": "Povuci primjerak",
|
||||
"cmd.occurrence_ground": "Učvrsti",
|
||||
@@ -1033,11 +1051,17 @@
|
||||
"cmd.render_library_surface_unbind": "Ukloni vezu površine",
|
||||
"cmd.render_library_targets": "Pronađi ciljeve biblioteke renderovanja",
|
||||
"cmd.render_lights_add": "Dodaj svjetlo",
|
||||
"cmd.render_lights_duplicate": "Dupliciraj svjetlo renderovanja",
|
||||
"cmd.render_lights_list": "Popis svjetala renderovanja",
|
||||
"cmd.render_lights_mute": "Isključi svjetlo",
|
||||
"cmd.render_lights_remove": "Ukloni svjetlo renderovanja",
|
||||
"cmd.render_lights_set": "Postavi svjetlo renderovanja",
|
||||
"cmd.render_lights_solo": "Samo ovo svjetlo",
|
||||
"cmd.render_optics_bind": "Sačuvaj optičku vezu",
|
||||
"cmd.render_optics_unbind": "Ukloni optičku vezu",
|
||||
"cmd.render_output_size": "Postavi veličinu izlaza renderovanja",
|
||||
"cmd.render_preflight": "Provjeri zahtjev za renderovanje",
|
||||
"cmd.render_preflight_copy": "Kopiraj izvještaj provjere renderovanja",
|
||||
"cmd.render_preset_apply": "Primijeni izvorni studio",
|
||||
"cmd.render_preset_resolve": "Pregledaj izvorni studio",
|
||||
"cmd.render_quality_prepare": "Pregledaj fiksni budžet uzorkovanja",
|
||||
@@ -1060,6 +1084,13 @@
|
||||
"cmd.render_start": "Renderuj sliku",
|
||||
"cmd.render_status": "Napredak renderovanja",
|
||||
"cmd.select_clear": "Poništi izbor",
|
||||
"cmd.settings_profile_apply": "Primijeni profil postavki",
|
||||
"cmd.settings_profile_delete": "Izbriši profil postavki",
|
||||
"cmd.settings_profile_export": "Izvezi profil postavki",
|
||||
"cmd.settings_profile_import": "Uvezi profil postavki",
|
||||
"cmd.settings_profile_list": "Profili postavki",
|
||||
"cmd.settings_profile_rename": "Preimenuj profil postavki",
|
||||
"cmd.settings_profile_save": "Sačuvaj profil postavki",
|
||||
"cmd.sheet_convert": "Pretvori u lim",
|
||||
"cmd.sheet_export_bend_table": "Izvezi tabelu savijanja",
|
||||
"cmd.sheet_export_dxf": "Izvezi razvijeni oblik kao DXF",
|
||||
@@ -1073,6 +1104,16 @@
|
||||
"cmd.sheet_refold": "Ponovo presavij",
|
||||
"cmd.sheet_rules": "Popis pravila za lim",
|
||||
"cmd.sheet_unfold": "Razvij",
|
||||
"cmd.sketch.construction_line": "Pomoćna prava",
|
||||
"cmd.sketch.construction_line.angle": "Pomoćna prava pod uglom",
|
||||
"cmd.sketch.construction_line.bisector": "Simetrala ugla",
|
||||
"cmd.sketch.construction_line.horizontal": "Horizontalna pomoćna prava",
|
||||
"cmd.sketch.construction_line.parallel": "Paralelna pomoćna prava",
|
||||
"cmd.sketch.construction_line.perpendicular": "Okomita pomoćna prava",
|
||||
"cmd.sketch.construction_line.tangent_at": "Tangenta u tački krive",
|
||||
"cmd.sketch.construction_line.tangent_external": "Tangenta kroz vanjsku tačku",
|
||||
"cmd.sketch.construction_line.tangent_two": "Zajednička tangenta",
|
||||
"cmd.sketch.construction_line.vertical": "Vertikalna pomoćna prava",
|
||||
"cmd.sketch_arc3d": "3D luk",
|
||||
"cmd.sketch_arc_center_point": "Luk iz centra",
|
||||
"cmd.sketch_arc_tangent": "Tangentni luk",
|
||||
@@ -1105,6 +1146,8 @@
|
||||
"cmd.sketch_drawing_bounds": "Veličina crteža",
|
||||
"cmd.sketch_edit": "Uredi skicu",
|
||||
"cmd.sketch_edit_text": "Uredi tekst",
|
||||
"cmd.sketch_equation_curve": "Kriva iz jednačine",
|
||||
"cmd.sketch_equation_curve_edit": "Uredi krivu iz jednačine",
|
||||
"cmd.sketch_export_dxf": "Sačuvaj kao DXF",
|
||||
"cmd.sketch_finish_auto_constrain": "Završi s automatskim ograničenjima",
|
||||
"cmd.sketch_fit_curves_to_section": "Uklopi krive u presjek mreže",
|
||||
@@ -1201,6 +1244,7 @@
|
||||
"cmd.view.render_browser": "Stablo renderovanja",
|
||||
"cmd.view.render_dock": "Premjesti panel renderovanja",
|
||||
"cmd.view.render_focus": "Prikaz fokusa renderovanja",
|
||||
"cmd.view.status_items": "Stavke statusa prozora prikaza",
|
||||
"cmd.view_ambient_occlusion": "Ambijentalna okluzija",
|
||||
"cmd.view_angle_readout": "Uglovi prikaza",
|
||||
"cmd.view_apply": "Vrati imenovani prikaz",
|
||||
@@ -1222,6 +1266,7 @@
|
||||
"cmd.view_normal_to": "Okomito na izbor",
|
||||
"cmd.view_previous_tab": "Prethodna kartica",
|
||||
"cmd.view_rename": "Preimenuj imenovani prikaz",
|
||||
"cmd.view_render_frame": "Pomoćne linije kadra renderovanja",
|
||||
"cmd.view_right": "Pogled zdesna",
|
||||
"cmd.view_save": "Novi imenovani prikaz",
|
||||
"cmd.view_shots_strip": "Traka kadrova",
|
||||
@@ -1232,10 +1277,14 @@
|
||||
"color.copy": "Kliknite da kopirate vrijednosti boje",
|
||||
"color.edit": "Kliknite da uredite boju",
|
||||
"color.gamma": "Prikaz vrijednosti boje u gama prostoru 0-255",
|
||||
"color.hex": "Hex",
|
||||
"color.hex_help": "Unesite #rrggbb ili #rrggbbaa; šest cifara zadržava neprozirnost",
|
||||
"color.hex_hint": "#rrggbb",
|
||||
"color.hue": "Nijansa",
|
||||
"color.linear": "Prikaz vrijednosti boje u linearnom prostoru 0-1",
|
||||
"color.saturation_value": "Zasićenost i vrijednost",
|
||||
"color.selected": "Izabrana boja",
|
||||
"config.column_filter_empty": "Nema odgovarajućih kolona",
|
||||
"contact.components_count": "Komponente: {count}",
|
||||
"contact.enabled_label": "omogućeno",
|
||||
"coupling.gear_1": "Zupčanik 1",
|
||||
@@ -1350,8 +1399,20 @@
|
||||
"help.material.assign": "Određuje od čega su izabrana tijela napravljena, npr. čelik, aluminij ili ABS. Koristite ga da masa i težina odgovaraju stvarnom dijelu.",
|
||||
"help.mit": "MIT licenca",
|
||||
"help.notice": "NOTICE",
|
||||
"help.occurrence.move": "Pomjera dio sklopa samo duž stepeni slobode koje dozvoljavaju njegovi spojevi. Izaberite lice dijela, a zatim prevucite dostupnu strelicu ili luk.",
|
||||
"help.parameters.change": "Otvara tabelu imenovanih vrijednosti i izraza koji upravljaju kotama dizajna. Koristite je da promijenite mjeru na jednom mjestu, a sve operacije koje je koriste je slijede.",
|
||||
"help.pointcloud.insert": "Umetnite PLY, XYZ ili PTS skeniranje kao oblak tačaka uz model. Koristite ga kao referencu pri izradi modela iz izmjerenih podataka.",
|
||||
"help.sketch.construction_line": "Napravite beskonačnu pomoćnu pravu kroz dvije tačke. Koristite je da rasporedite skicu bez razdvajanja profila.",
|
||||
"help.sketch.construction_line.angle": "Napravite beskonačnu pomoćnu pravu pod uglom od ose X skice. Izaberite tačku i upišite ugao ili izaberite smjer.",
|
||||
"help.sketch.construction_line.bisector": "Izaberite dvije prave linije skice koje se sijeku, pa jednu od dvije simetrale ugla. Rezultat prati izvorne linije.",
|
||||
"help.sketch.construction_line.horizontal": "Napravite beskonačnu horizontalnu pomoćnu pravu kroz tačku. Njeno ograničenje horizontalnosti ostaje na snazi pri kasnijim izmjenama.",
|
||||
"help.sketch.construction_line.parallel": "Izaberite pravu liniju skice, pa postavite paralelnu beskonačnu pomoćnu pravu. Desnim klikom izaberite drugu referencu.",
|
||||
"help.sketch.construction_line.perpendicular": "Izaberite pravu liniju skice, pa postavite okomitu beskonačnu pomoćnu pravu. Desnim klikom izaberite drugu referencu.",
|
||||
"help.sketch.construction_line.tangent_at": "Napravite tangentu u tački na krugu ili kružnom luku, ili u krajnjoj tački otvorenog splajna ili konike. Izaberite krivu, pa tačku dodira.",
|
||||
"help.sketch.construction_line.tangent_external": "Izaberite krug ili kružni luk, pa vanjsku tačku i rješenje tangente. Pregledi prikazuju samo dodirne tačke na nacrtanom luku.",
|
||||
"help.sketch.construction_line.tangent_two": "Izaberite dva kruga ili kružna luka, pa u pregledu izaberite zajedničku tangentu. Dodirne tačke moraju ležati na nacrtanim krivama.",
|
||||
"help.sketch.construction_line.vertical": "Napravite beskonačnu vertikalnu pomoćnu pravu kroz tačku. Njeno ograničenje vertikalnosti ostaje na snazi pri kasnijim izmjenama.",
|
||||
"help.sketch.equation_curve": "Crta krivu iz formula: x(t) i y(t) ili y = f(x), u zadanom rasponu. Formule mogu koristiti parametre i kriva ih prati: koristite je za sinusoidu, spiralu ili evolventu zupca zupčanika.",
|
||||
"help.solid.align": "Pomjera izabrana tijela tako da se tačka, lice ili ravan na njima poklopi s tačkom, licem ili ravni negdje drugdje. Koristite ga da postavite dio uz drugi bez mjerenja odmaka.",
|
||||
"help.solid.chamfer": "Odsijeca izabrane ivice ravnim skošenjem zadate udaljenosti. Koristite ga da ublažite oštre ivice ili olakšate uvođenje zatika ili vijka.",
|
||||
"help.solid.combine": "Spaja tijela, oduzima ih od ciljnog tijela ili zadržava samo zajedničku zapreminu, a može zadržati i alatna tijela. Koristite ga da spojite dijelove, da jednim oblikom odsiječete drugi ili da pronađete gdje se dva tijela preklapaju.",
|
||||
@@ -1480,6 +1541,21 @@
|
||||
"joint.one_component": "Ovi dijelovi su tijela jedne komponente: {bodies}. Spoj pomjera jednu komponentu u odnosu na drugu, pa svaki dio treba svoju komponentu.",
|
||||
"joint.rigid_group_one_component": "Sva tijela ({count}) su u jednoj komponenti (ili u samom dizajnu): prvo koristite {command}.",
|
||||
"joint.rigid_group_select_components": "Izaberite dvije ili više komponenti.",
|
||||
"joint_move.blocked_hint": "Provjerite vrstu spoja (npr. Kruti), učvršćenje, granice spoja i vrijednosti koje pokreću parametri.",
|
||||
"joint_move.blocked_title": "Ovaj dio se ne može pomjeriti",
|
||||
"joint_move.coarse": "Korak rotacije blizu ose (°)",
|
||||
"joint_move.distance": "Udaljenost od početka",
|
||||
"joint_move.done": "Gotovo",
|
||||
"joint_move.fine": "Korak rotacije dalje od ose (°)",
|
||||
"joint_move.fixed": "Ovaj dio nema pomičnu osu spoja.",
|
||||
"joint_move.help": "Pomjeri — prevucite strelicu ili prsten. Esc otkazuje trenutno povlačenje.",
|
||||
"joint_move.legacy_hint": "Isključite da biste koristili prethodni panel Pomjeri.",
|
||||
"joint_move.precision": "Povucite izvan isprekidane vodilje za finu rotaciju.",
|
||||
"joint_move.rotation": "Rotacija od početka",
|
||||
"joint_move.select": "Izaberite lice ili jedan dio sklopa, a zatim izaberite Pomjeri.",
|
||||
"joint_move.settings": "Pomjeranje u sklopu",
|
||||
"joint_move.step": "Korak",
|
||||
"joint_move.use_handles": "Koristi ručice kretanja spojeva za Pomjeri u sklopu",
|
||||
"keymap.command_id": "ID komande",
|
||||
"keymap.empty": "Nema odgovarajućih komandi",
|
||||
"keymap.use_anyway": "Ipak koristi {key} ovdje",
|
||||
@@ -1574,6 +1650,8 @@
|
||||
"nav.maya.help": "Alt+lijevo povlačenje orbitira, Alt+srednje pomjera, Alt+desno zumira; srednje povlačenje također pomjera",
|
||||
"nav.openscad.help": "Povlačenje lijevim dugmetom po praznom prostoru orbitira, Shift+povlačenje lijevim bira okvirom, povlačenje geometrije skice je uređuje; povlačenje desnim ili srednjim dugmetom pomjera, Shift+desno ili Shift+srednje zumira",
|
||||
"nav.perspective.sketch": "Uređivanje skice koristi ortografski prikaz. Završite skicu da prebacite na perspektivu.",
|
||||
"nav.right_drag_orbits.help": "Isključeno: povlačenje desnim dugmetom ne dira kameru, a desno dugme samo otvara kontekstni meni. Izbor mapiranja miša SolidWorks to isključuje.",
|
||||
"nav.right_drag_orbits.label": "Povlačenje desnim dugmetom orbitira",
|
||||
"nav.solidworks.help": "Povlačenje srednjim dugmetom orbitira, Ctrl+srednje pomjera, Shift+srednje zumira, povlačenje desnim orbitira",
|
||||
"nav.tinkercad.help": "Povlačenje desnim dugmetom orbitira, povlačenje srednjim ili Shift+desnim pomjera",
|
||||
"nav.touchpad.help": "Držite Shift i pomjerajte pokazivač za pomjeranje prikaza; držite Alt/Option i pomjerajte ga za orbitiranje. Dugme miša nije potrebno. Vertikalno skrolovanje zumira.",
|
||||
@@ -1595,6 +1673,9 @@
|
||||
"navbar.custom.customise": "Prilagodi navigacijsku traku…",
|
||||
"navbar.custom.design": "Dizajn",
|
||||
"navbar.custom.duplicate": "Ovo mjesto je već na traci.",
|
||||
"navbar.custom.edge": "Rub",
|
||||
"navbar.custom.edge_bottom": "Dolje",
|
||||
"navbar.custom.edge_top": "Gore",
|
||||
"navbar.custom.fade": "Izblijedi",
|
||||
"navbar.custom.full": "Uklonite jedno mjesto da biste dodali drugo.",
|
||||
"navbar.custom.hidden_design": "Skriveno u Dizajnu",
|
||||
@@ -1701,6 +1782,7 @@
|
||||
"parts.dimension.thickness": "Debljina",
|
||||
"parts.dimension.width": "Širina",
|
||||
"parts.family.bearing": "Kuglični ležaj s dubokim žlijebom (omotač)",
|
||||
"parts.family.button_head_cap_screw": "Vijak s poluokruglom glavom i imbusom",
|
||||
"parts.family.dowel_pin": "Cilindrični zatik",
|
||||
"parts.family.hex_bolt": "Vijak sa šestougaonom glavom",
|
||||
"parts.family.hex_nut": "Šestougaona matica",
|
||||
@@ -1759,6 +1841,11 @@
|
||||
"prefs.bottom_centre": "Dolje u sredini",
|
||||
"prefs.bottom_right": "Dolje desno",
|
||||
"prefs.browser": "Stablo modela",
|
||||
"prefs.browser_eye_left": "Oko pored strelice za skupljanje",
|
||||
"prefs.browser_eye_left_note": "Redovi stabla modela prikazuju oko za prikazivanje/skrivanje pored strelice za skupljanje, kao ranije, umjesto u koloni na desnom kraju redova.",
|
||||
"prefs.browser_reveal_on_hover": "Prikaži pri prelasku mišem",
|
||||
"prefs.browser_show_note": "Prikazano drži stablo modela na ekranu. Prikaži pri prelasku mišem drži ga skrivenim dok pokazivač ne pređe preko njegovog mjesta ili tankog jezička na njegovom lijevom rubu, a ostaje otvoreno dok je pokazivač u njemu ili dok je otvoren neki meni iz njega.",
|
||||
"prefs.browser_shown": "Prikazano",
|
||||
"prefs.built_in": "Ugrađeno",
|
||||
"prefs.button_left": "Povlačenje lijevim dugmetom",
|
||||
"prefs.button_middle": "Povlačenje srednjim dugmetom",
|
||||
@@ -1806,6 +1893,8 @@
|
||||
"prefs.graphics_card_restart": "Stupa na snagu nakon ponovnog pokretanja SolidCrafta. WGPU_ADAPTER_NAME ima prednost nad ovim izborom.",
|
||||
"prefs.graphics_note": "Žrtvujte brzinu za glatkoću. Svaki izbor pokazuje svoj učinak na primjeru.",
|
||||
"prefs.graphics_presets_note": "Unaprijed postavljene vrijednosti podešavaju sve izbore ispod odjednom.",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out": "Sakrij simbole ograničenja kada je prikaz umanjen",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out_note": "Simboli ograničenja nestaju iz prikaza kada je skica toliko umanjena da bi je zatrpali. Isključeno: ostaju fiksne veličine na ekranu pri svakom zumiranju.",
|
||||
"prefs.history": "Vremenska traka",
|
||||
"prefs.history_origin_bodies": "Prikaži ishodište i tijela na vrhu",
|
||||
"prefs.history_origin_bodies_note": "Vremenska traka lijevo ili ispod stabla modela počinje folderom Tijela aktivne komponente i Ishodištem, s njihovim okom i menijima kao u stablu modela. Vremenska traka na dnu ostaje nepromijenjena.",
|
||||
@@ -1829,6 +1918,8 @@
|
||||
"prefs.layout_note": "Kompaktno pričvršćuje panele uz ivice prozora. Prozirnost stabla modela dostupna je u opciji Plutajuće. Stranu Asistenta promijenite na stranici Asistent.",
|
||||
"prefs.left": "Lijevo",
|
||||
"prefs.left_click": "Lijevi klik",
|
||||
"prefs.line_drag_draws_one": "Pritisak i povlačenje crta jednu liniju",
|
||||
"prefs.line_drag_draws_one_note": "U alatu Linija pritisak, povlačenje i puštanje crta jednu liniju od mjesta pritiska do mjesta puštanja i tu se završava. Klikovi i dalje crtaju lanac. Isključeno: povlačenje postavlja tačku tamo gdje se pusti, kao i klik.",
|
||||
"prefs.linked_designs": "Povezani dizajni",
|
||||
"prefs.live_input": "Ulaz uživo",
|
||||
"prefs.live_preview": "Pregled uživo",
|
||||
@@ -1842,6 +1933,9 @@
|
||||
"prefs.max_file_size_step": "STEP i uvezene datoteke",
|
||||
"prefs.max_file_size_web": "Web aplikacija otvara STEP i uvezene datoteke do 512 MB i dizajne do 256 MB: kartica preglednika ne može držati veće datoteke. Desktop aplikacija može povećati ove granice.",
|
||||
"prefs.megabytes": "MB",
|
||||
"prefs.menu_grid": "Velike ikone",
|
||||
"prefs.menu_list": "Popis",
|
||||
"prefs.menus": "Meniji",
|
||||
"prefs.minutes": "minuta",
|
||||
"prefs.minutes_suffix": " min",
|
||||
"prefs.mouse": "Miš i trackpad",
|
||||
@@ -1861,14 +1955,40 @@
|
||||
"prefs.origin_plane_names": "Nazivi ravni ishodišta",
|
||||
"prefs.origin_plane_names_note": "Nazivi prikazani u stablu modela, dijalozima i listama. {top} je XY, {front} je XZ, a {right} je YZ, sa Z prema gore. Komande, skripte i sačuvani dizajni zadržavaju XY, XZ i YZ.",
|
||||
"prefs.overall_speed": "Ukupna brzina",
|
||||
"prefs.persistent_ribbon_pressed": "Istakni aktivne komande na traci",
|
||||
"prefs.persistent_ribbon_pressed_help": "Ističe komande na traci dok su njihovi efekti uključeni. Isključite da biste zadržali prethodni neutralni izgled i pomoć za komande.",
|
||||
"prefs.perspective_fov": "Vidno polje",
|
||||
"prefs.placement": "Postavljanje",
|
||||
"prefs.prefer_free_sketch_points": "Daj prednost pokretnim tačkama skice kada se tačke preklapaju",
|
||||
"prefs.preview_choices": "Pregled vaših izbora",
|
||||
"prefs.print_face_highlight": "Isticanje površine za štampu",
|
||||
"prefs.print_face_highlight_tip": "Koliko se jako površina za štampu tijela boji i obrubljuje u prikazu. 0 % ne prikazuje isticanje.",
|
||||
"prefs.profile_active": "Aktivni profil",
|
||||
"prefs.profile_applied": "Profil je primijenjen.",
|
||||
"prefs.profile_changed": "Postavke su promijenjene otkako je profil sačuvan. Sačuvaj ih upisuje u profil.",
|
||||
"prefs.profile_deleted": "Profil je izbrisan.",
|
||||
"prefs.profile_export": "Izvezi…",
|
||||
"prefs.profile_exported": "Profil je izvezen.",
|
||||
"prefs.profile_imported": "Profil je uvezen. Izaberite ga pod Aktivni profil da se prebacite na njega.",
|
||||
"prefs.profile_name_hint": "Naziv profila, npr. Laptop",
|
||||
"prefs.profile_rename": "Preimenuj",
|
||||
"prefs.profile_renamed": "Profil je preimenovan.",
|
||||
"prefs.profile_save": "Sačuvaj",
|
||||
"prefs.profile_saved": "Trenutne postavke su sačuvane u profil.",
|
||||
"prefs.profile_skipped": "Profil je primijenjen; postavke koje su zadržale trenutnu vrijednost: {n} (pogledajte zapisnik).",
|
||||
"prefs.profiles": "Profili postavki",
|
||||
"prefs.profiles_note": "Prečice, traka s alatima, navigacija, radijalni meni i postavke interfejsa čuvaju se zajedno pod jednim nazivom i mijenjaju odjednom.",
|
||||
"prefs.project_options_dialog": "Dijalog opcija za projektovanje",
|
||||
"prefs.project_options_dialog_note": "Uključeno: prije projektovanja izaberite Geometrija ili Tijela i Veza projekcije. Isključeno: zadržava se prethodni tok rada s direktnim izborom.",
|
||||
"prefs.quality_default": "podrazumijevano",
|
||||
"prefs.quality_fastest": "najbrže",
|
||||
"prefs.quality_slowest": "najsporije",
|
||||
"prefs.quality_smoother": "glađe",
|
||||
"prefs.render_previous_geometry_budget": "Koristi prethodni budžet geometrije za pregled renderovanja",
|
||||
"prefs.render_previous_geometry_budget_help": "Vraća prethodno fiksno ograničenje geometrije (512 MiB na 64-bitnim desktop računarima, 128 MiB drugdje) umjesto budžeta prema uređaju.",
|
||||
"prefs.reports_saved": "Sačuvano: {n}",
|
||||
"prefs.ribbon_reveal": "Prikaži rezultate pretrage na traci",
|
||||
"prefs.ribbon_reveal_note": "Zadržavanje pokazivača iznad rezultata u Pretraži komande pokazuje gdje se komanda nalazi na traci: njenu karticu, njeno dugme ili njen red u padajućem meniju panela. Komanda pokrenuta iz pretrage tamo trepće, a pokrenuta komanda iz padajućeg menija označava svoj panel.",
|
||||
"prefs.right_click": "Desni klik",
|
||||
"prefs.saving": "Automatsko čuvanje i oporavak",
|
||||
"prefs.scale_note": "Također Ctrl + / Ctrl − u prozoru. Dugmad su 28 px pri 100%.",
|
||||
@@ -1877,18 +1997,29 @@
|
||||
"prefs.search_empty": "Nema odgovarajućih postavki",
|
||||
"prefs.select": "Izbor",
|
||||
"prefs.select_one_item": "Izaberi jednu stavku",
|
||||
"prefs.select_other_hidden": "Izaberi skrivenu geometriju pomoću Izaberi drugo",
|
||||
"prefs.select_other_hidden_help": "Uključeno: obuhvata skrivena tijela, skice i zaklonjene ivice u blizini pokazivača. Isključeno: koristi se izvorni popis vidljive geometrije ispod pokazivača.",
|
||||
"prefs.selecting": "Biranje",
|
||||
"prefs.shift": "Shift",
|
||||
"prefs.shift_add_ctrl_toggle": "Shift samo dodaje; Ctrl / Cmd uključuje i isključuje",
|
||||
"prefs.shift_add_note": "Uključeno: Shift dodaje, Ctrl / Cmd uključuje i isključuje. Isključeno (podrazumijevano): oba uključuju i isključuju.",
|
||||
"prefs.shortcuts": "Prečice",
|
||||
"prefs.single_surface_analysis": "Koristi samo jednu analizu površi",
|
||||
"prefs.single_surface_analysis_help": "Kada je isključeno, sjenčenje površi i Kontinuitet mogu ostati uključeni zajedno. Uključivanje zadržava posljednju pokrenutu ili promijenjenu analizu.",
|
||||
"prefs.sketch_align_points": "Poravnaj s drugim tačkama skice tokom crtanja",
|
||||
"prefs.sketch_align_points_note": "Tokom crtanja tačka se istovremeno poravnava vodoravno s jednom tačkom skice i okomito s drugom, uz tačkastu pomoćnu liniju, a klik zadržava oba poravnanja. Isključeno: samo s prethodnom tačkom, po jedna osa.",
|
||||
"prefs.sketch_conflict_colour": "Geometrija u sukobu u boji sukoba",
|
||||
"prefs.sketch_conflict_colour_note": "Dok su ograničenja skice u sukobu, krive i tačke koje drži ograničenje koje ne uspijeva crtaju se također u boji sukoba, ne samo njegov simbol ili kota. Isključeno: zadržavaju uobičajene boje.",
|
||||
"prefs.sketch_construction_lines": "Prošireni alati za pomoćne prave",
|
||||
"prefs.sketch_exit_view": "Kada se skica završi",
|
||||
"prefs.sketch_exit_view.keep": "Zadrži trenutni prikaz",
|
||||
"prefs.sketch_exit_view.previous": "Vrati se na prethodni prikaz",
|
||||
"prefs.sketch_exit_view.unless_rotated": "Vrati se osim ako je rotirano",
|
||||
"prefs.sketch_exit_view_note": "Kuda prikaz ide nakon Završi skicu, Otkaži ili dvostrukog Esc.",
|
||||
"prefs.sketch_open_look_at": "Okreni kameru prema skici kad se otvori",
|
||||
"prefs.sketch_open_look_at_note": "Isključeno: kad napravite ili uredite skicu, prikaz ostaje onakav kakav jest. Pogledaj okreće prikaz prema skici kad to želite.",
|
||||
"prefs.sketch_recent_snap": "Automatski privlači na nedavne centre i središnje tačke",
|
||||
"prefs.sketch_recent_snap_note": "Tokom crtanja pokazivač se privlači tamo gdje se sijeku pomoćne linije dvaju posljednjih centara krugova ili središnjih tačaka pravih ivica. Isključeno: te pomoćne linije služe samo za prikaz i pokazivač se ne pomjera.",
|
||||
"prefs.sketch_selection": "Skica i izbor",
|
||||
"prefs.sketch_selection_heading": "Skica i izbor",
|
||||
"prefs.sketch_selection_note": "Kako se skice privlače i kako klikovi biraju.",
|
||||
@@ -1933,7 +2064,14 @@
|
||||
"prefs.toast_place": "Obavještenja",
|
||||
"prefs.toggle_item": "Dodaj stavku ili je ponovo ukloni",
|
||||
"prefs.toolbar": "Traka s alatima",
|
||||
"prefs.toolbar_tabs": "Kartice trake s alatima",
|
||||
"prefs.top": "Gore",
|
||||
"prefs.trackpad_zoom_modifier": "Zumiranje skrolovanjem s dva prsta uz držanje tipke",
|
||||
"prefs.trackpad_zoom_modifier.alt": "⌥ / Alt",
|
||||
"prefs.trackpad_zoom_modifier.cmd": "⌘",
|
||||
"prefs.trackpad_zoom_modifier.ctrl": "Ctrl",
|
||||
"prefs.trackpad_zoom_modifier.help": "Držite samo ovu tipku da zumirate prema pokazivaču vertikalnim skrolovanjem. Isključeno zadržava postojeće ponašanje skrolovanja.",
|
||||
"prefs.trackpad_zoom_modifier.off": "Isključeno",
|
||||
"prefs.translucent": "Prozirno",
|
||||
"prefs.under_browser": "Ispod stabla modela",
|
||||
"prefs.under_cursor": "Ispod pokazivača",
|
||||
@@ -1943,13 +2081,24 @@
|
||||
"prefs.view_confirm_corner": "U redu i Otkaži u uglu prikaza",
|
||||
"prefs.view_confirm_corner_note": "Dok je otvoren dijalog ili skica, kvačica i krstić gore desno u prikazu rade isto što i dugmad U redu i Otkaži u dijalogu, odnosno završavaju i otkazuju skicu. Navigator prikaza pomjera se ispod njih.",
|
||||
"prefs.viewport": "Prozor prikaza",
|
||||
"prefs.viewport_analysis_status": "Prikaži status analize u prozoru prikaza",
|
||||
"prefs.viewport_analysis_status_help": "Prikazuje aktivne analize iznad prozora prikaza, otvara njihove legende iz svake stavke, a tipka Esc isključuje najnoviju analizu. Isključite da biste vratili legende u uglovima i prethodno ponašanje tipke Esc.",
|
||||
"prefs.viewport_background": "Pozadina",
|
||||
"prefs.viewport_background_colour": "Boja",
|
||||
"prefs.viewport_background_theme": "Gradijent teme",
|
||||
"prefs.wheel": "Točkić",
|
||||
"prefs.wheel_trackpad": "Točkić i trackpad",
|
||||
"prefs.workspace": "Radni prostor",
|
||||
"prefs.zoom_stop_at_model": "Zaustavi zumiranje na modelu",
|
||||
"prefs.zoom_stop_at_model_tip": "3D miš i aplikacija uređaja zumiraju prema površini u sredini prikaza; zumiranje povlačenjem drži tačku na kojoj je povlačenje počelo. Isključeno: zumiranje može proći kroz model. Točkić i štipanje zasebno koriste Zumiranje prema pokazivaču",
|
||||
"prefs.zoom_toward_cursor": "Zumiranje prema pokazivaču",
|
||||
"properties.title": "Svojstva: {name}",
|
||||
"recovery.days_ago": "prije {count} dana",
|
||||
"recovery.detail": "{file} · operacija: {features} · automatski sačuvano {when}",
|
||||
"recovery.discard_all": "Odbaci sve",
|
||||
"recovery.discard_all_detail": "Ovo se ne može poništiti.",
|
||||
"recovery.discard_all_title": "Odbaciti automatska čuvanja ({count})?",
|
||||
"recovery.discard_all_title_one": "Odbaciti 1 automatsko čuvanje?",
|
||||
"recovery.hours_ago": "prije {count} h",
|
||||
"recovery.just_now": "upravo sada",
|
||||
"recovery.min_ago": "prije {count} min",
|
||||
@@ -2034,6 +2183,7 @@
|
||||
"render.appearance_editor.weight": "Težina",
|
||||
"render.appearance_physics_separate": "Vizuelni izgled ne dodjeljuje gustinu, toplotne podatke niti druga inženjerska svojstva.",
|
||||
"render.appearances": "Izgledi",
|
||||
"render.assign_help": "Kliknite za primjenu na izbor; prevucite za pregled i ispustite ili kliknite kada ništa nije izabrano da bojite.",
|
||||
"render.availability_native": "Izvorni sastav; pregledajte prije primjene",
|
||||
"render.availability_projection": "Podržana projekcija; pogledajte opseg i izostavke",
|
||||
"render.availability_reference": "Referentni podaci; nije automatska dodjela",
|
||||
@@ -2072,6 +2222,7 @@
|
||||
"render.bloom_threshold": "Prag linearnih svijetlih dijelova",
|
||||
"render.browse_capabilities": "Pregledaj kompletan katalog mogućnosti",
|
||||
"render.browse_environments": "Pregledaj izvorna HDR okruženja",
|
||||
"render.browse_looks": "Pregledaj…",
|
||||
"render.browse_native_scenes": "Pregledaj izvorne studije",
|
||||
"render.browse_physical": "Pregledaj fizičke reference",
|
||||
"render.browse_quality": "Pregledaj specifikacije kvaliteta",
|
||||
@@ -2095,6 +2246,82 @@
|
||||
"render.check_opaque": "Prozirnost: samo neprozirne površi; alfa pozadine je podržana.",
|
||||
"render.check_sorted_alpha": "Prozirnost: aproksimacija sortirane alfe.",
|
||||
"render.check_transmission": "Prozirnost: fizička transmisija.",
|
||||
"render.children.absolute_floor": "Apsolutni donji prag",
|
||||
"render.children.adaptive": "Adaptivno",
|
||||
"render.children.add_look_reason": "Dodajte izgled da biste uredili njegovo uključivanje i jačinu.",
|
||||
"render.children.all_shots": "Svi kadrovi",
|
||||
"render.children.bloom": "Sjaj",
|
||||
"render.children.check": "Provjera",
|
||||
"render.children.check_now": "Provjeri sada",
|
||||
"render.children.chromatic": "Hromatski pomak",
|
||||
"render.children.compact": "Kompaktno",
|
||||
"render.children.contrast": "Kontrast",
|
||||
"render.children.copy_image": "Kopiraj",
|
||||
"render.children.copy_job": "Kopiraj JSON posla",
|
||||
"render.children.copy_request": "Kopiraj JSON zahtjeva",
|
||||
"render.children.coverage_error": "Greška pokrivenosti",
|
||||
"render.children.cpu": "CPU praćenje zraka",
|
||||
"render.children.denoise": "Smanji šum na završenoj slici",
|
||||
"render.children.depth": "Dubina putanje",
|
||||
"render.children.distortion": "Izobličenje",
|
||||
"render.children.edge_samples": "Uzorci ivica",
|
||||
"render.children.effects_banner": "Ovi efekti zahtijevaju GPU praćenje putanja. Otvaranje ovoga nikad ne mijenja metodu.",
|
||||
"render.children.enable_adaptive": "Omogućite nezavisne probne uzorke da biste uredili adaptivna ograničenja.",
|
||||
"render.children.enable_bloom": "Omogućite sjaj da biste uredili njegovu jačinu, prag i poluprečnik.",
|
||||
"render.children.finishing": "Završna obrada",
|
||||
"render.children.flare": "Odsjaj",
|
||||
"render.children.fresnel": "Fresnelovi slojevi",
|
||||
"render.children.ghosts": "Duhovi prstenova",
|
||||
"render.children.glass": "Transport kroz staklo",
|
||||
"render.children.go_to": "Idi na {editor}",
|
||||
"render.children.grain": "Zrno",
|
||||
"render.children.halo": "Oreol",
|
||||
"render.children.hdr": "HDR",
|
||||
"render.children.keep_master": "Zadrži sirovi linearni master",
|
||||
"render.children.last_result": "Posljednje: {number} · {width} × {height} · {phase}",
|
||||
"render.children.lens_effects": "Efekti objektiva",
|
||||
"render.children.look_summary": "{tone} · izgledi: {count}",
|
||||
"render.children.looks": "Kreativni izgledi",
|
||||
"render.children.memory": "Memorija",
|
||||
"render.children.method": "Metoda",
|
||||
"render.children.minimum": "Minimum",
|
||||
"render.children.needs_cpu": "Potrebno je CPU praćenje zraka. Otvaranje ovoga nikad ne mijenja metodu.",
|
||||
"render.children.nested": "Potvrđeni ugniježđeni dielektrici",
|
||||
"render.children.not_checked": "Nije provjereno",
|
||||
"render.children.path": "Praćenje putanja",
|
||||
"render.children.pilots": "Probni uzorci",
|
||||
"render.children.preview": "Podaci pregleda",
|
||||
"render.children.progressive_reason": "Izaberite Progresivno da biste uredili broj uzoraka i sjeme.",
|
||||
"render.children.radius": "Poluprečnik",
|
||||
"render.children.reflect_depth": "Dubina refleksije",
|
||||
"render.children.reflect_samples": "Uzorci refleksije",
|
||||
"render.children.regrade": "Ponovna gradacija",
|
||||
"render.children.relative_error": "Relativna greška",
|
||||
"render.children.render": "Renderovanje",
|
||||
"render.children.render_shot": "Renderuj kadar",
|
||||
"render.children.renderer": "Renderer",
|
||||
"render.children.renderers": "Rendereri",
|
||||
"render.children.request": "Ovaj zahtjev",
|
||||
"render.children.reset_finishing": "Resetuj završnu obradu",
|
||||
"render.children.review_quality": "Pregledaj specifikaciju kvaliteta…",
|
||||
"render.children.rgb_gain": "RGB pojačanje",
|
||||
"render.children.samples": "Uzorci",
|
||||
"render.children.sampling": "Uzorkovanje",
|
||||
"render.children.saturation": "Zasićenost",
|
||||
"render.children.scene_summary": "Tijela: {bodies} · trouglovi: {triangles}",
|
||||
"render.children.seed": "Sjeme",
|
||||
"render.children.sharpening": "Izoštravanje",
|
||||
"render.children.single_image": "Jedna slika",
|
||||
"render.children.soft_focus": "Meki fokus",
|
||||
"render.children.streak": "Pruga",
|
||||
"render.children.strength": "Jačina",
|
||||
"render.children.studio": "Studio",
|
||||
"render.children.threshold": "Prag",
|
||||
"render.children.tone": "Ton",
|
||||
"render.children.under_hood": "Ispod haube",
|
||||
"render.children.vignette": "Vinjeta",
|
||||
"render.children.workstation": "Radna stanica",
|
||||
"render.choose_look": "Prvo izaberite izgled u Izgledima",
|
||||
"render.chromatic_offset": "Hromatski pomak ivica",
|
||||
"render.clear_stage": "Ukloni sačuvanu scenu",
|
||||
"render.copy_request": "Kopiraj JSON",
|
||||
@@ -2346,8 +2573,33 @@
|
||||
"render.flare_strength": "Jačina odsjaja svijetlih dijelova",
|
||||
"render.flare_threshold": "Linearni prag odsjaja scene",
|
||||
"render.fold_browser": "Skupi stablo modela",
|
||||
"render.frame_aspect": "Omjer",
|
||||
"render.frame_centre_mark": "Oznaka centra",
|
||||
"render.frame_copy_limit": "Nema slobodnog naziva za duplikat kadra",
|
||||
"render.frame_copy_name": "{name} kopija {number}",
|
||||
"render.frame_custom": "Prilagođeno",
|
||||
"render.frame_distance_unit": " × veličina",
|
||||
"render.frame_duplicate": "Dupliciraj",
|
||||
"render.frame_exposure": "Ekspozicija",
|
||||
"render.frame_fov": "Vidno polje",
|
||||
"render.frame_guides": "Pomoćne linije",
|
||||
"render.frame_invalid_aspect": "Neispravan predložak omjera",
|
||||
"render.frame_lens": "FOV {fov}° · ≈ {mm} mm",
|
||||
"render.frame_name": "Naziv",
|
||||
"render.frame_output_size": "Veličina izlaza",
|
||||
"render.frame_photo": "3:2 · Fotografija",
|
||||
"render.frame_portrait": "4:5 · Portret",
|
||||
"render.frame_presets": "Predlošci kadra",
|
||||
"render.frame_presets_pending": "Stiže s uređivačem kadrova",
|
||||
"render.frame_projection": "Projekcija",
|
||||
"render.frame_render_shot": "Renderuj ovaj kadar",
|
||||
"render.frame_rule_thirds": "Pravilo trećina",
|
||||
"render.frame_safe_area": "Sigurna zona",
|
||||
"render.frame_shot_title": "Kadar · {name}",
|
||||
"render.frame_square": "1:1 · Kvadrat",
|
||||
"render.frame_tall": "9:16 · Vertikalno",
|
||||
"render.frame_thirds": "Trećine",
|
||||
"render.frame_wide": "16:9 · Široki ekran",
|
||||
"render.gpu_depth": "Maksimalna dubina putanje",
|
||||
"render.gpu_options_help": "Uzorci, dubina, sjeme i ekspozicija čuvaju se s ovom postavkom. Čuva se samo aktivna metoda slike.",
|
||||
"render.gpu_path_failed": "GPU praćenje putanja nije dostupno",
|
||||
@@ -2375,6 +2627,7 @@
|
||||
"render.heading_results": "REZULTATI",
|
||||
"render.heading_shots": "KADROVI",
|
||||
"render.hide_shots_label": "Sakrij traku kadrova",
|
||||
"render.hover_look": "{object} · {look} · kliknite za izbor",
|
||||
"render.image_advanced": "Napredne GPU kontrole",
|
||||
"render.image_cancelled": "Renderovanje je otkazano",
|
||||
"render.image_cancelling": "Otkazivanje",
|
||||
@@ -2521,17 +2774,95 @@
|
||||
"render.library_uniform_ack": "Koristi jednoličnu aproksimaciju bez prostornih ili naprednih efekata",
|
||||
"render.library_usable": "Izvršne projekcije",
|
||||
"render.library_users": "Korisnici",
|
||||
"render.light_aim": "Usmjeri na",
|
||||
"render.light_anchor_pending": "Promjena koordinatnog sistema svjetla još nije podržana.",
|
||||
"render.light_azimuth": "Azimut",
|
||||
"render.light_backend_limit": "Izaberite CPU praćenje zraka ili izričit GPU studio da biste uređivali svjetla. Svjetla starog GPU studija ostaju samo za čitanje.",
|
||||
"render.light_behaviour": "PONAŠANJE",
|
||||
"render.light_default_fill": "Popunjavajuće",
|
||||
"render.light_default_key": "Glavno",
|
||||
"render.light_default_number": "Svjetlo {number}",
|
||||
"render.light_default_rim": "Rubno",
|
||||
"render.light_delete": "Izbriši",
|
||||
"render.light_distance": "Udaljenost",
|
||||
"render.light_duplicate": "Dupliciraj",
|
||||
"render.light_elevation": "Elevacija",
|
||||
"render.light_gpu_punctual": "Tačkasta svjetla i reflektori dostupni su uz CPU praćenje zraka.",
|
||||
"render.light_hard_shadow": "Ovo svjetlo ima oštre sjene; mekoća emitera nije dostupna.",
|
||||
"render.light_intensity": "Intenzitet",
|
||||
"render.light_missing": "Ovo svjetlo više ne postoji. Izaberite svjetlo u stablu modela.",
|
||||
"render.light_place_highlight": "Postavi prema odsjaju",
|
||||
"render.light_place_pending": "Postavljanje prema odsjaju zahtijeva izbor svjetla u prozoru prikaza i još nije podržano.",
|
||||
"render.light_position": "POLOŽAJ",
|
||||
"render.light_preview_help": "Prikaz uživo je bez sjena; površinska svjetla koriste aproksimaciju uzorkom iz centra. Renderovanje koristi potpuni model svjetla.",
|
||||
"render.light_product_centre": "Centar proizvoda",
|
||||
"render.light_size": "Veličina",
|
||||
"render.light_softness": "Mekoća",
|
||||
"render.light_temperature": "Temperatura boje",
|
||||
"render.light_temperature_help": "Približna nijansa crnog tijela; čuva se kao linearni RGB.",
|
||||
"render.light_type": "Vrsta",
|
||||
"render.light_type_area": "Površinsko",
|
||||
"render.light_type_point": "Tačkasto",
|
||||
"render.light_type_spot": "Reflektor",
|
||||
"render.light_type_sun": "Sunce",
|
||||
"render.light_view_only": "Samo ovo svjetlo i isključivanje svjetla utiču na ovaj prikaz i njegova renderovanja; nikad se ne čuvaju u dizajnu.",
|
||||
"render.light_world_origin": "Ishodište svijeta",
|
||||
"render.lighting_aim_point": "Tačka usmjeravanja",
|
||||
"render.lighting_apply": "Primijeni postavku",
|
||||
"render.lighting_area_samples": "Uzorci površinskog svjetla",
|
||||
"render.lighting_budget": "Budžet",
|
||||
"render.lighting_budget_help": "Brojevi su samo za čitanje. Dodajte, duplicirajte ili izbrišite svjetla da ih promijenite; metoda određuje ograničenja.",
|
||||
"render.lighting_colour": "Boja",
|
||||
"render.lighting_consent": "Zamijeni usmjerena svjetla ovom postavkom",
|
||||
"render.lighting_custom": "Prilagođena svjetla",
|
||||
"render.lighting_custom_help": "Izbor opcije Prilagođeno pretvara postavku u svjetla koja se mogu uređivati, svako u svom redu u stablu.",
|
||||
"render.lighting_direction": "Smjer X Y Z",
|
||||
"render.lighting_direction_help": "Ili upišite smjer prema svjetlu (X Y Z).",
|
||||
"render.lighting_distance_unit": " × veličina",
|
||||
"render.lighting_edge_u": "Vektor stranice U",
|
||||
"render.lighting_edge_v": "Vektor stranice V",
|
||||
"render.lighting_falloff": "Slabljenje",
|
||||
"render.lighting_falloff_help": "Intenzitet se navodi na referentnoj udaljenosti.",
|
||||
"render.lighting_height": "Visina V",
|
||||
"render.lighting_minimum": "Minimum",
|
||||
"render.lighting_mute": "Isključi ovo svjetlo",
|
||||
"render.lighting_point": "Tačka",
|
||||
"render.lighting_preset": "Postavka studija",
|
||||
"render.lighting_preset_cpu": "Usmjerene postavke studija zahtijevaju CPU praćenje zraka. GPU osvjetljenje koristi izričita sunčeva i površinska svjetla.",
|
||||
"render.lighting_preset_row": "Postavka",
|
||||
"render.lighting_radiance": "Radijansa",
|
||||
"render.lighting_reference": "Referenca",
|
||||
"render.lighting_review_help": "Zamjenjuje popis usmjerenih svjetala. Zadržava tačkasta i površinska svjetla, okruženje, sjene, kameru i sve ostale postavke kadra.",
|
||||
"render.lighting_review_title": "Pregledaj postavku osvjetljenja",
|
||||
"render.lighting_samples_cpu": "Uzorci površinskog svjetla primjenjuju se na CPU praćenje zraka.",
|
||||
"render.lighting_samples_need_area": "Dodajte CPU površinsko svjetlo da biste postavili uzorke površinskog svjetla.",
|
||||
"render.lighting_samples_reason": "Uzorci površinskog svjetla moraju biti 1, 4, 16 ili 64.",
|
||||
"render.lighting_shadow_cpu": "Prekidač sjena zahtijeva CPU praćenje zraka. GPU praćenje putanja uvijek baca sjene.",
|
||||
"render.lighting_shadows": "Baci sjene",
|
||||
"render.lighting_shadows_section": "Sjene i uzorkovanje",
|
||||
"render.lighting_shape": "Oblik",
|
||||
"render.lighting_solo": "Samo ovo svjetlo",
|
||||
"render.lighting_source": "Izvor",
|
||||
"render.lighting_source_section": "Izvor svjetla",
|
||||
"render.lighting_spot_preserved": "Ovo tačkasto svjetlo zadržava sačuvani konus reflektora dok mu se ne promijeni vrsta.",
|
||||
"render.lighting_sun_distance": "Smjer sunca ne zavisi od udaljenosti i tačke usmjeravanja.",
|
||||
"render.lighting_unsupported": "nepodržano",
|
||||
"render.lighting_used": "{used} od {limit}",
|
||||
"render.lighting_width": "Širina U",
|
||||
"render.lighting_world_position": "Svjetski X Y Z",
|
||||
"render.lights_fixed_to": "Svjetla vezana za",
|
||||
"render.linear_help": "Zadržava 32-bitni float RGBA master prije uklanjanja šuma, ekspozicije, mapiranja tonova, filtera i pozadine. Linearni sRGB/D65; pomnožen pokrivenošću. Dodatna memorija se izričito odobrava. Bez kompresije i dodatnih prolaza.",
|
||||
"render.linear_retain": "Zadrži sirovi linearni EXR",
|
||||
"render.linear_unavailable": "Izabrani završeni kadar nema zadržani EXR. Omogućite zadržavanje prije renderovanja; stariji PNG ne može vratiti sirovu radijansu.",
|
||||
"render.look_add": "Dodaj izgled boje",
|
||||
"render.look_applied": "Primijenjeno: {name}",
|
||||
"render.look_bleach": "Po uzoru na bleach bypass",
|
||||
"render.look_cool": "Hladno",
|
||||
"render.look_cyanotype": "Po uzoru na cijanotipiju",
|
||||
"render.look_faded": "Izblijedjeli otisak",
|
||||
"render.look_material": "Materijal",
|
||||
"render.look_mono": "Jednobojno",
|
||||
"render.look_pasted": "Izgled je zalijepljen",
|
||||
"render.look_sepia": "Sepija",
|
||||
"render.look_strength": "Jačina izgleda",
|
||||
"render.look_teal_orange": "Tirkizno / narandžasto",
|
||||
@@ -2607,9 +2938,11 @@
|
||||
"render.output_advanced": "Napredno",
|
||||
"render.output_backend_ready": "Spremno",
|
||||
"render.output_check": "Provjeri",
|
||||
"render.output_check_failed": "Provjera · greška",
|
||||
"render.output_check_help": "Pokrenite provjeru da pregledate ovaj zahtjev bez pokretanja renderovanja.",
|
||||
"render.output_check_summary": "Provjera · Napomene: {count}",
|
||||
"render.output_copy": "Kopiraj",
|
||||
"render.output_copy_report": "Kopiraj izvještaj",
|
||||
"render.output_destination": "Odredište",
|
||||
"render.output_destination_help": "Odredišnu datoteku birate pri izvozu završene slike.",
|
||||
"render.output_dimensions": "Veličina",
|
||||
@@ -2619,6 +2952,7 @@
|
||||
"render.output_fit": "Uklopi",
|
||||
"render.output_format": "Format",
|
||||
"render.output_format_status": "PNG je tačna završena slika za prikaz. Neobavezni GPU EXR zadržava sirovu linearnu radijansu scene u formatu FLOAT32 prije filtera prikaza. Izvoz nikad ne zamjenjuje keš pregleda ni drugi posao.",
|
||||
"render.output_grading": "Gradacija",
|
||||
"render.output_image": "Slika",
|
||||
"render.output_largest": "Najviše {width} × {height}",
|
||||
"render.output_lock_ratio": "Zaključaj omjer stranica",
|
||||
@@ -2628,6 +2962,8 @@
|
||||
"render.output_quality_waiting": "čeka se specifikacija kvaliteta",
|
||||
"render.output_ratio_refused": "Povezana dimenzija premašuje ograničenje veličine ove metode. Prethodna veličina se zadržava; otključajte omjer ili izaberite manju vrijednost.",
|
||||
"render.output_ready": "Spremno za renderovanje",
|
||||
"render.output_run_check": "Pokreni provjeru",
|
||||
"render.output_size_limit": "{method}: do {dimension} px po strani i {pixels} piksela. Najveća veličina koja staje: {width} × {height}.",
|
||||
"render.output_size_ok": "Veličina u redu · {width} × {height} px",
|
||||
"render.output_swap_orientation": "Zamijeni širinu i visinu",
|
||||
"render.output_tools_inspector": "Veličinu i format uredite u inspektoru Izlaz.",
|
||||
@@ -2644,6 +2980,7 @@
|
||||
"render.page_output": "Izlaz",
|
||||
"render.page_scene": "Scena",
|
||||
"render.paint_label": "Oboji",
|
||||
"render.painting_with": "Bojenje izgledom: {name}",
|
||||
"render.passive_stage": "Podloga i pasivna scena",
|
||||
"render.passive_stage_help": "Konačni pasivni paneli pripadaju samo renderovanim slikama. Ne dodaju CAD tijela ni masu. Postavljanje je fiksno nakon primjene; presijecanje granica proizvoda se odbija. CPU ne daje difuzno odbijeno osvjetljenje.",
|
||||
"render.perspective": "Perspektivna kamera",
|
||||
@@ -2665,6 +3002,7 @@
|
||||
"render.pick_help": "Izaberite Tijelo, Lice ili Komponenta. Kliknite prazan prostor da očistite izbor; Shift ili Ctrl dodaje ili uključuje/isključuje. Isticanja se pojavljuju samo u živom prikazu proizvoda.",
|
||||
"render.pick_label": "Izaberi",
|
||||
"render.pick_up_label": "Preuzmi",
|
||||
"render.pick_up_prompt": "Kliknite objekt da preuzmete njegov izgled",
|
||||
"render.pick_waiting": "Izbor proizvoda još nije podržan.",
|
||||
"render.post_contrast": "Kontrast",
|
||||
"render.post_gain_b": "Pojačanje plave",
|
||||
@@ -2704,13 +3042,17 @@
|
||||
"render.radial_distortion": "Radijalno izobličenje",
|
||||
"render.radial_fit": "Uklopi proizvod",
|
||||
"render.radial_save": "Sačuvaj kadar",
|
||||
"render.recent_looks": "Nedavni izgledi",
|
||||
"render.regrade_action": "Ponovna gradacija sirovog mastera (bez uklanjanja šuma)",
|
||||
"render.regrade_help": "Pravi zaseban PNG iz izabranog završenog sirovog mastera, koristeći ove kontrole prikaza. Ne prati zrake, ne mijenja zabilježenu veličinu, kameru ni svjetla i ne prepisuje EXR. Uklanjanje šuma se ne primjenjuje ponovo: sirovi masteri ne čuvaju njegove vodilje. Izvedena slika se i dalje može izvesti istim kontrolama posla.",
|
||||
"render.regrade_label": "Ponovna gradacija",
|
||||
"render.reload_settings": "Ponovo učitaj sačuvane postavke",
|
||||
"render.remove_override": "Ukloni nadjačavanje",
|
||||
"render.replace_all": "Zamijeni sve",
|
||||
"render.replace_ground": "Potvrdi zamjenu postojeće scene",
|
||||
"render.replace_label": "Zamijeni",
|
||||
"render.replace_saved_surface": "Zamijeni postojeću sačuvanu vezu za ovaj cilj",
|
||||
"render.replace_with": "Zamijeni sa",
|
||||
"render.restore_camera": "Vrati sačuvanu kameru",
|
||||
"render.result_actual": "100%",
|
||||
"render.result_actual_help": "Jedan piksel slike po pikselu ekrana.",
|
||||
@@ -2762,14 +3104,28 @@
|
||||
"render.saved_surface_remove": "Ukloni sačuvanu vezu",
|
||||
"render.saved_surfaces": "Sačuvane veze površina",
|
||||
"render.saved_surfaces_help": "Fiksirane ugrađene mape prate izabrani primjerak u lokalnim milimetrima. Zamijenjen ili nedostajući cilj je greška, nikad automatska ponovna dodjela.",
|
||||
"render.scene_all_shots": "Svi kadrovi ({count})",
|
||||
"render.scene_apply": "Primijeni pregledani studio",
|
||||
"render.scene_batch_reason": "Za Svi kadrovi potreban je red čekanja za renderovanje sačuvanih kadrova, koji još nije dostupan.",
|
||||
"render.scene_check_now": "Provjeri sada",
|
||||
"render.scene_check_passed": "Provjera uspješna · napomene: {notes}",
|
||||
"render.scene_check_stale": "Provjera je zastarjela · provjerite ponovo",
|
||||
"render.scene_check_unchecked": "Još nije provjereno · 0 napomena",
|
||||
"render.scene_consent": "Potvrdi zamjenu osvjetljenja, okruženja, ekspozicije i scene",
|
||||
"render.scene_light_summary": "{environment} · svjetla: {lights}",
|
||||
"render.scene_look_summary": "Izgledi: {looks} · nadjačavanja: {overrides}",
|
||||
"render.scene_open_check": "Otvori provjeru",
|
||||
"render.scene_preserved_fields": "Kamera, uzorkovanje, dimenzije, optičke veze, CAD geometrija i inženjerski materijali se čuvaju.",
|
||||
"render.scene_preserves_design": "Sastavite osvjetljenje i pasivnu scenu za vidljivi predmet. Geometrija, inženjerski materijali i kamera ostaju odvojeni.",
|
||||
"render.scene_ready": "Spremno za renderovanje",
|
||||
"render.scene_reminder": "Scena čuva dizajn. Geometrija, inženjerska svojstva i CAD nikad se ne mijenjaju iz Renderovanja.",
|
||||
"render.scene_reminders": "Podsjetnici",
|
||||
"render.scene_renderer_ready": "{renderer}: spremno",
|
||||
"render.scene_replaces": "Zamjenjuje",
|
||||
"render.scene_review": "Razriješi i pregledaj",
|
||||
"render.scene_review_help": "Pregledajte kompletnu izvornu kompoziciju prije primjene. Nevezane napredne SCENE specifikacije se ne zamjenjuju.",
|
||||
"render.scene_scope_details": "Opseg kompozicije",
|
||||
"render.scene_stages": "Faze",
|
||||
"render.search_appearances": "Pretraži {count} izgleda",
|
||||
"render.setup_legacy_environment": "Ova starija postavka koristi naslijeđenu rotaciju ili intenzitet okruženja. Te vrijednosti se zadržavaju; izričito ih pretvorite prije čuvanja punog posla slike.",
|
||||
"render.setup_name": "Naziv postavke",
|
||||
@@ -2782,7 +3138,22 @@
|
||||
"render.shell_tab_camera": "KAMERA RENDERA",
|
||||
"render.shell_tab_lighting": "OSVJETLJENJE",
|
||||
"render.shell_tab_scene": "SCENA RENDERA",
|
||||
"render.shot_aperture": "Otvor blende",
|
||||
"render.shot_distance": "Udaljenost",
|
||||
"render.shot_dof": "Dubinska oštrina",
|
||||
"render.shot_duplicate": "Dupliciraj sačuvani kadar",
|
||||
"render.shot_edit_output": "Uredi u Izlazu",
|
||||
"render.shot_exposure_reason": "Ekspozicija zahtijeva CPU praćenje zraka ili GPU praćenje putanja.",
|
||||
"render.shot_exposure_section": "Ekspozicija",
|
||||
"render.shot_focus_distance": "Udaljenost fokusa",
|
||||
"render.shot_fov_reason": "Vidno polje zahtijeva perspektivnu projekciju.",
|
||||
"render.shot_frame_subject": "Uokviri predmet",
|
||||
"render.shot_invalid_camera": "Vrijednosti kamere moraju biti konačne i unutar raspona.",
|
||||
"render.shot_lens": "Objektiv",
|
||||
"render.shot_lens_enable_reason": "Omogućite dubinsku oštrinu da biste uredili otvor blende i udaljenost fokusa.",
|
||||
"render.shot_lens_gpu_reason": "Dubinska oštrina zahtijeva GPU praćenje putanja.",
|
||||
"render.shot_lens_perspective_reason": "Dubinska oštrina zahtijeva perspektivnu projekciju.",
|
||||
"render.shot_look_selection": "Usmjeri na izbor",
|
||||
"render.shot_manager": "Sačuvani kadrovi",
|
||||
"render.shot_new_name": "Naziv novog kadra",
|
||||
"render.shot_remove": "Ukloni sačuvani kadar",
|
||||
@@ -2790,6 +3161,9 @@
|
||||
"render.shot_remove_title": "Ukloniti sačuvani kadar?",
|
||||
"render.shot_rename": "Preimenuj sačuvani kadar",
|
||||
"render.shot_saved_only": "Prvo sačuvajte trenutni nacrt. Dupliciranje i preimenovanje čuvaju tačne sačuvane opcije i reference na resurse.",
|
||||
"render.shot_selection_reason": "Izaberite tijelo ili lice prema kojem treba usmjeriti kameru.",
|
||||
"render.shot_size": "Veličina",
|
||||
"render.shot_target": "Cilj",
|
||||
"render.shots_camera_changed": "Kamera je promijenjena od čuvanja ovog kadra",
|
||||
"render.shots_name_help": "Unesite jedinstven naziv za trenutni kadar.",
|
||||
"render.shots_no_result": "Još nema renderovanja",
|
||||
@@ -3052,6 +3426,7 @@
|
||||
"select an axis": "izaberite osu",
|
||||
"select an axis, a straight or circular edge, or a cylinder, cone or torus face first": "prvo izaberite osu, pravu ili kružnu ivicu, ili lice cilindra, konusa ili torusa",
|
||||
"select bodies first": "prvo izaberite tijela",
|
||||
"select components first": "prvo izaberite komponente",
|
||||
"select corner points, or the two lines of one corner": "izaberite tačke uglova ili dvije linije jednog ugla",
|
||||
"select one corner point, or the two lines of one corner": "izaberite jednu tačku ugla ili dvije linije jednog ugla",
|
||||
"select sheet edges first": "prvo izaberite ivice lima",
|
||||
@@ -3070,6 +3445,7 @@
|
||||
"settings.double_click_components": "Dvaput kliknite komponentu da je aktivirate ili da uredite povezanu komponentu na mjestu",
|
||||
"settings.frame_rate_details_note": "Dodaje graf vremena posljednjih kadrova s brojem iscrtanih trouglova, histogram vremena kadrova i šta je GPU nacrtao. Kliknite broj kadrova u sekundi u prikazu da ih prikažete ili sakrijete.",
|
||||
"settings.frame_rate_note": "Prikazuje broj kadrova u sekundi u donjem desnom uglu prikaza.",
|
||||
"settings.insert_lists_open_designs": "Umetni dizajn prvo navodi dizajne otvorene na drugim karticama",
|
||||
"settings.measure_axis_distances": "Prikaži udaljenosti X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Prikazuj komponente udaljenosti po svjetskim osama uz ukupnu udaljenost dok je Mjerenje otvoreno.",
|
||||
"settings.msaa_applies_on_restart": "Uglađivanje ivica primjenjuje se pri sljedećem pokretanju SolidCrafta",
|
||||
@@ -3094,6 +3470,10 @@
|
||||
"shortcut.unpin": "Otkači",
|
||||
"sketch is missing": "skica nedostaje",
|
||||
"sketch.degrees_of_freedom": "Stepeni slobode: {count}",
|
||||
"sketch.dimension_added_driven": "Skica već određuje tu kotu, pa je dodana kao zavisna (referentna) kota",
|
||||
"sketch.dimension_applied": "Kota je primijenjena",
|
||||
"sketch.dimension_applied_defined": "Kota je primijenjena; parametar `{name}` je definisan",
|
||||
"sketch.dimension_applied_renamed": "Kota je primijenjena; parametar je nazvan `{name}`",
|
||||
"sketch.dof_left": "Preostali stepeni slobode: {count}",
|
||||
"sketch.dof_left_one": "Preostali stepeni slobode: {count}",
|
||||
"sketch.draw_curves": "Crtaj kao {linetype}",
|
||||
@@ -3128,6 +3508,8 @@
|
||||
"sketch_text.use_font_file": "Koristi datoteku fonta {path}",
|
||||
"solid": "puno",
|
||||
"status.editing": "Uređivanje: {name}",
|
||||
"status.navigation": "Mapiranje miša: {mapping}",
|
||||
"status.navigation_tip": "Kako miš pomjera prikaz. Kliknite da izaberete drugo mapiranje",
|
||||
"status.under_constrained": "Nedovoljno ograničeno (stepeni slobode: {count})",
|
||||
"status.under_constrained_one": "Nedovoljno ograničeno ({count} stepen slobode)",
|
||||
"status.units_tip": "Jedinice dizajna. Kliknite da ih promijenite",
|
||||
@@ -3161,8 +3543,10 @@
|
||||
"timeline.delete_folders_tip": "Zadrži njihove operacije i ugniježđene foldere u vremenskoj traci",
|
||||
"timeline.delete_folders_with_features_tip": "Izbriši foldere sa svim operacijama u njima i njihove ugniježđene foldere",
|
||||
"timeline.delete_many": "Izbriši izabrane operacije: {count}",
|
||||
"timeline.edited_rolled_back": "Operacija {name} je promijenjena, ali je iza oznake vraćanja, pa se ne gradi: pomjerite oznaku iza nje da vidite rezultat",
|
||||
"timeline.feature_error": "Greška: {message}",
|
||||
"timeline.feature_hint": "Dvaput kliknite za uređivanje · povucite za promjenu redoslijeda · desni klik za više",
|
||||
"timeline.feature_rolled_back": "Vraćeno: iza oznake vraćanja, pa se ne gradi",
|
||||
"timeline.feature_warning": "Upozorenje: {message}",
|
||||
"timeline.group": "Novi folder operacija",
|
||||
"timeline.move_many": "Premjesti stavke vremenske trake",
|
||||
@@ -3244,6 +3628,10 @@
|
||||
"ui.3d_mouse_offer": "Kalibracija 3D miša ispravlja zamijenjene ili obrnute ose i podešava njegovu brzinu i osjećaj.",
|
||||
"ui.3d_mouse_offer_never": "Ne prikazuj više",
|
||||
"ui.3d_mouse_offer_swap": "Prebaci na Hidraw (direktni drajver)",
|
||||
"ui.3d_mouse_orbit": "Orbitiranje",
|
||||
"ui.3d_mouse_orbit_classic": "Klasično",
|
||||
"ui.3d_mouse_orbit_tip": "Prema modelu: 3D miš okreće prikaz oko dijela modela koji je u sredini prikaza kada okretanje počne, označenog blijedom kuglom. Klasično: oko centra prikaza",
|
||||
"ui.3d_mouse_orbit_traced": "Prema modelu",
|
||||
"ui.3d_mouse_reading": "Očitanje",
|
||||
"ui.3d_mouse_reset_axes": "Resetuj dodjelu osa",
|
||||
"ui.3d_mouse_reset_view": "Resetuj prikaz",
|
||||
@@ -3280,6 +3668,8 @@
|
||||
"ui.3d_mouse_step_twist_counterclockwise": "Zakrenite kapicu suprotno od kazaljke na satu, držite je, a zatim pustite.",
|
||||
"ui.3d_mouse_switch_cap": "Kalibriši kao Povratak u centar",
|
||||
"ui.3d_mouse_switch_trackball": "Kalibriši kao trackball",
|
||||
"ui.3d_mouse_use_direct": "Koristi direktni drajver",
|
||||
"ui.3d_mouse_use_direct_tip": "Čitaj 3D miš direktno (hidraw) umjesto preko spacenavd.",
|
||||
"ui.3d_mouse_view_axis": "Osa prikaza",
|
||||
"ui.3d_mouse_view_off": "Isključeno",
|
||||
"ui.3d_mouse_view_off_tip": "Profil drajvera 3D miša isključuje ovu osu, pa njeno kretanje ne pomjera prikaz. Izbor kretanja druge ose ovdje ih zamjenjuje, a to kretanje prestaje pomjerati prikaz.",
|
||||
@@ -3596,6 +3986,7 @@
|
||||
"ui.circle": "Krug",
|
||||
"ui.circular_pattern": "Kružni niz",
|
||||
"ui.clear": "Očisti",
|
||||
"ui.clear_print_face": "Ukloni površinu za štampu",
|
||||
"ui.clear_recent": "Očisti nedavno",
|
||||
"ui.clear_the_selection": "Poništi izbor",
|
||||
"ui.click_selects_whole_bodies": "Klik bira cijela tijela",
|
||||
@@ -3630,6 +4021,15 @@
|
||||
"ui.constant": "Konstantno",
|
||||
"ui.constraints_conflict": "Ograničenja su u sukobu",
|
||||
"ui.construction": "Pomoćna",
|
||||
"ui.construction.angle_hint": "Pomoćna prava: kliknite tačku, pa upišite ugao ili izaberite smjer",
|
||||
"ui.construction.bisector_hint": "Simetrala: izaberite dvije prave linije koje se sijeku, pa željeno rješenje",
|
||||
"ui.construction.common_hint": "Zajednička tangenta: izaberite dva kruga ili luka, pa željeno rješenje",
|
||||
"ui.construction.contact_hint": "Tangenta: izaberite krug/luk ili otvoreni splajn/koniku, pa tačku dodira (krive slobodnog oblika: krajnje tačke)",
|
||||
"ui.construction.external_hint": "Tangenta: izaberite krug ili luk, vanjsku tačku, pa željeno rješenje",
|
||||
"ui.construction.free_hint": "Pomoćna prava: kliknite dvije tačke; desnim klikom počnite ispočetka",
|
||||
"ui.construction.point_hint": "Pomoćna prava: kliknite tačku kroz koju prolazi",
|
||||
"ui.construction.reference_hint": "Pomoćna prava: izaberite pravu liniju, pa tačku; desnim klikom promijenite referencu",
|
||||
"ui.construction.ribbon_label": "Pomoćne",
|
||||
"ui.context_menu": "Kontekstni meni",
|
||||
"ui.continuity_g0": "G0 pregib",
|
||||
"ui.continuity_g1": "G1 tangentno",
|
||||
@@ -3670,6 +4070,7 @@
|
||||
"ui.design_properties.part_number": "Broj dijela",
|
||||
"ui.design_properties.project": "Projekat",
|
||||
"ui.design_properties.revision": "Revizija",
|
||||
"ui.design_saved": "Sačuvano: {path}",
|
||||
"ui.diameter": "Prečnik",
|
||||
"ui.dimension": "Kota",
|
||||
"ui.direct_interaction": "Direktna interakcija",
|
||||
@@ -3720,6 +4121,14 @@
|
||||
"ui.end_scale": "Krajnje skaliranje",
|
||||
"ui.entities": "Elementi",
|
||||
"ui.equal": "Jednakost",
|
||||
"ui.equation_end": "Kraj",
|
||||
"ui.equation_explicit": "Eksplicitno",
|
||||
"ui.equation_form": "Oblik",
|
||||
"ui.equation_note": "Varijabla je običan broj: sin(t) je uzima u radijanima. Rezultat bez jedinice je u jedinici dizajna.",
|
||||
"ui.equation_parametric": "Parametarski",
|
||||
"ui.equation_x_of_t": "x(t)",
|
||||
"ui.equation_y_of_t": "y(t)",
|
||||
"ui.equation_y_of_x": "y(x)",
|
||||
"ui.equivalent_radius": "Ekvivalentni poluprečnik",
|
||||
"ui.expand": "Proširi",
|
||||
"ui.exportDxf": "Izvezi DXF…",
|
||||
@@ -3785,6 +4194,7 @@
|
||||
"ui.heading_design": "DIZAJN",
|
||||
"ui.heading_draft": "NAGIB",
|
||||
"ui.heading_edit": "UREDI",
|
||||
"ui.heading_equation_curve": "KRIVA IZ JEDNAČINE",
|
||||
"ui.heading_extrude": "EKSTRUDIRAJ",
|
||||
"ui.heading_fillet": "ZAOBLJENJE",
|
||||
"ui.heading_finish_editing": "ZAVRŠI UREĐIVANJE",
|
||||
@@ -3876,6 +4286,10 @@
|
||||
"ui.import_ellipsis": "Uvezi…",
|
||||
"ui.infinite": "Beskonačno",
|
||||
"ui.insert": "Umetni",
|
||||
"ui.insert_design.browse": "Pregledaj…",
|
||||
"ui.insert_design.open_designs": "Otvoreni dizajni",
|
||||
"ui.insert_design.saved_file": "{name} ima nesačuvane promjene, pa je umetnuta njegova sačuvana datoteka. Sačuvajte ga, a zatim pokrenite Ažuriraj veze da unesete promjene.",
|
||||
"ui.insert_design.unsaved": "Nesačuvane promjene",
|
||||
"ui.inspect": "Pregledaj",
|
||||
"ui.intersect": "Presjek",
|
||||
"ui.isolate": "Izoluj",
|
||||
@@ -3975,6 +4389,7 @@
|
||||
"ui.pan_zoom_orbit": "Pomjeranje, zumiranje, orbitiranje",
|
||||
"ui.parallel": "Paralelnost",
|
||||
"ui.parameters": "Parametri",
|
||||
"ui.part_size_needs_a_part": "Odaberite umetnuti standardni dio (vijak, maticu, podlošku ili zatik) da biste mu promijenili veličinu. Da tijelo povećate ili smanjite, koristite Skaliraj.",
|
||||
"ui.part_size_shared": "Ponovo gradi dio, zamjenjujući sve dodane operacije. Svi primjerci ove komponente se ažuriraju.",
|
||||
"ui.paste": "Zalijepi",
|
||||
"ui.path": "Putanja",
|
||||
@@ -4018,12 +4433,29 @@
|
||||
"ui.polygon": "Poligon",
|
||||
"ui.preferences": "Postavke",
|
||||
"ui.press_a_key": "pritisnite tipku…",
|
||||
"ui.print_face_cleared": "{body}: površina za štampu uklonjena",
|
||||
"ui.print_face_input": "Površina za štampu",
|
||||
"ui.print_face_one_body": "Površina za štampu pripada jednom tijelu: pošaljite to tijelo samo da biste je promijenili",
|
||||
"ui.print_face_pick": "Odaberite ravnu površinu punog tijela da postane površina za štampu",
|
||||
"ui.print_face_set": "{body}: površina za štampu postavljena; Pošalji u slajser polaže tijelo na nju",
|
||||
"ui.profile": "Profil",
|
||||
"ui.profile_plane": "Ravan profila",
|
||||
"ui.profiles": "Profili",
|
||||
"ui.project": "Projektuj",
|
||||
"ui.project_face_edges_sketch": "Projektuj ivice lica u nove skice",
|
||||
"ui.properties": "Svojstva",
|
||||
"ui.properties.copy_matrix": "Kopiraj matricu",
|
||||
"ui.properties.first_moments": "Statički momenti",
|
||||
"ui.properties.inertia": "Moment inercije",
|
||||
"ui.properties.inertia_note": "Oko centra mase, u svjetskim osama (g·{unit}²)",
|
||||
"ui.properties.inertia_unavailable": "Nije dostupno: mreža jednog tijela nije zatvorena.",
|
||||
"ui.properties.inertia_x": "Ixx, Ixy, Ixz",
|
||||
"ui.properties.inertia_y": "Iyx, Iyy, Iyz",
|
||||
"ui.properties.inertia_z": "Izx, Izy, Izz",
|
||||
"ui.properties.measuring": "Mjerenje…",
|
||||
"ui.properties.measuring_failed": "Mjerenje je zaustavljeno prije završetka.",
|
||||
"ui.properties.principal_axis": "Glavna osa {number}",
|
||||
"ui.properties.principal_moments": "Glavni momenti",
|
||||
"ui.pull_direction": "Smjer vađenja iz kalupa",
|
||||
"ui.quality": "Kvalitet",
|
||||
"ui.quantity": "Broj",
|
||||
@@ -4069,6 +4501,7 @@
|
||||
"ui.revolve": "Rotiraj",
|
||||
"ui.ribbon_exit": "Izađi",
|
||||
"ui.ribbon_labels": "Prikaži tekst ispod ikona na traci",
|
||||
"ui.ribbon_menus_skip_pinned": "Izostavi prikačene komande iz padajućih menija",
|
||||
"ui.ribbon_pin_footer": "Prikačene komande prikazuju se na traci. Zadržite pokazivač iznad reda da ga prikačite ili otkačite.",
|
||||
"ui.ribbon_workspace": "Radni prostor",
|
||||
"ui.right": "Desno",
|
||||
@@ -4086,6 +4519,7 @@
|
||||
"ui.select": "Izaberi",
|
||||
"ui.selectOther": "Izaberi drugo…",
|
||||
"ui.selectTangentChain": "Izaberi tangentni lanac",
|
||||
"ui.select_all": "Izaberi sve",
|
||||
"ui.selection": "Izbor",
|
||||
"ui.selection_modifiers": "Modifikatori izbora",
|
||||
"ui.selection_shift_add_only": "Shift+klik dodaje bez uklanjanja",
|
||||
@@ -4122,7 +4556,11 @@
|
||||
"ui.sketch": "Skica",
|
||||
"ui.sketch_dimension": "Kota skice",
|
||||
"ui.sketch_grid": "Mreža skice",
|
||||
"ui.sketch_intersect_geometry": "Geometrija",
|
||||
"ui.sketch_intersect_projection_link": "Veza projekcije",
|
||||
"ui.sketch_intersect_selection_filter": "Filter izbora",
|
||||
"ui.sketch_modifiers": "Modifikatori skice",
|
||||
"ui.sketch_project_geometry": "Geometrija",
|
||||
"ui.sketch_scale": "Skaliranje skice",
|
||||
"ui.sketches": "Skice",
|
||||
"ui.slice": "Presijeci",
|
||||
@@ -4169,6 +4607,11 @@
|
||||
"ui.symmetric": "Simetrično",
|
||||
"ui.symmetry": "Simetrija",
|
||||
"ui.system": "Sistem",
|
||||
"ui.tab_assemble": "Sklopi",
|
||||
"ui.tab_manage": "Upravljanje",
|
||||
"ui.tab_sheet_metal": "Lim",
|
||||
"ui.tab_view": "Prikaz",
|
||||
"ui.tab_weldments": "Zavarene konstrukcije",
|
||||
"ui.tangent": "Tangentno",
|
||||
"ui.taper_angle": "Ugao suženja",
|
||||
"ui.tapped": "S navojem",
|
||||
@@ -4184,6 +4627,7 @@
|
||||
"ui.tip_angle": "Ugao vrha",
|
||||
"ui.to_object": "Do objekta",
|
||||
"ui.tool_direction": "Smjer alata",
|
||||
"ui.toolbar_tabs_hidden": "Sve kartice trake s alatima su skrivene. Kliknite + ili kliknite desnim dugmetom ovdje da prikažete jednu.",
|
||||
"ui.top": "Odozgo",
|
||||
"ui.top_diameter": "Gornji prečnik",
|
||||
"ui.top_radius": "Gornji poluprečnik",
|
||||
@@ -4221,6 +4665,8 @@
|
||||
"ui.view_centre": "Centar prikaza",
|
||||
"ui.viewport_status_clear": "Isključi: {name}",
|
||||
"ui.viewport_status_clear_hint": "Isključi: {name} · Esc",
|
||||
"ui.viewport_status_edges": "Ivice: {count}",
|
||||
"ui.viewport_status_from": "iz smjera {direction}",
|
||||
"ui.viewport_status_key": "Prikaži legendu: {name}",
|
||||
"ui.viewport_status_minimum_radius": "Minimalni poluprečnik",
|
||||
"ui.viewport_status_pairs": "Parovi: {count}",
|
||||
@@ -4230,6 +4676,7 @@
|
||||
"ui.visual_shaded_with_edges": "Osjenčeno s ivicama",
|
||||
"ui.visual_style": "Vizuelni stil",
|
||||
"ui.visual_wireframe": "Žičani model",
|
||||
"ui.wheel_zoom_speed": "Brzina zumiranja točkićem miša",
|
||||
"ui.width": "Širina",
|
||||
"ui.window_system": "Sistem prozora",
|
||||
"ui.window_system_auto": "Automatski",
|
||||
@@ -4260,7 +4707,9 @@
|
||||
"update.button": "Ažuriraj",
|
||||
"update.button_version": "Ažuriraj na {version}",
|
||||
"update.check_automatically": "Automatski provjeravaj ažuriranja",
|
||||
"update.check_for_updates": "Provjeri ažuriranja",
|
||||
"update.check_now": "Provjeri sada",
|
||||
"update.check_unavailable": "Provjera ažuriranja nije dostupna za ovu instalaciju.",
|
||||
"update.checking": "Provjera…",
|
||||
"update.copy": "Kopiraj",
|
||||
"update.dmg_opened": "Slika diska je otvorena i provjerena: prevucite SolidCraft u Applications, zamijenite staru kopiju, a zatim ponovo pokrenite SolidCraft.",
|
||||
@@ -4283,6 +4732,9 @@
|
||||
"update.prefs_managed": "Ovo je SolidCraft {version}, kojim upravlja {manager}. Provjera pita GitHub za najnovije izdanje i ne šalje ništa drugo; ažurirajte SolidCraft u {manager}.",
|
||||
"update.prefs_note": "Ovo je SolidCraft {version} ({kind}). Provjera pita GitHub za najnovije izdanje i ne šalje ništa drugo.",
|
||||
"update.prefs_web": "Ponovo učitajte stranicu da dobijete najnoviju web aplikaciju. Ako mreža nije dostupna ili se ažuriranje ne može preuzeti na vrijeme, otvara se sačuvana verzija; preuzimanje u toku nastavlja se za sljedeće ponovno učitavanje.",
|
||||
"update.refresh_checking": "Provjera najnovijeg izdanja…",
|
||||
"update.refresh_fallback": "Provjera novijeg izdanja nije uspjela; ažurira se na verziju {version}, pronađenu ranije.",
|
||||
"update.refresh_selected": "Ažuriranje na {version}.",
|
||||
"update.release_page": "Otvori stranicu izdanja",
|
||||
"update.restart": "Ponovo pokreni sada",
|
||||
"update.restart_later": "Kasnije",
|
||||
|
||||
@@ -1,22 +1,42 @@
|
||||
{
|
||||
"A Single hole snaps to the middle of its face and to the centres of its round edges": "A Single hole snaps to the middle of its face and to the centres of its round edges",
|
||||
"Base Center": "Base Centre",
|
||||
"Center X": "Centre X",
|
||||
"Center Y": "Centre Y",
|
||||
"Center of mass": "Centre of mass",
|
||||
"Centre to centre": "Centre to centre",
|
||||
"Circle center": "Circle centre",
|
||||
"Colour": "Colour",
|
||||
"Copy all licences": "Copy all licences",
|
||||
"Customize Toolbar": "Customise Toolbar",
|
||||
"Customize…": "Customise…",
|
||||
"Face center": "Face centre",
|
||||
"Favorites": "Favourites",
|
||||
"Favourite": "Favourite",
|
||||
"Mass Center": "Mass Centre",
|
||||
"Modeled": "Modelled",
|
||||
"Select the centre the pattern turns around first": "Select the centre the pattern turns around first",
|
||||
"Snap to face and edge centres": "Snap to face and edge centres",
|
||||
"Specialise": "Specialise",
|
||||
"cmd.appearance_favorite": "Favourite Look",
|
||||
"cmd.component_cycle_color": "Cycle Component Colour",
|
||||
"cmd.construct_point_center": "Point At Centre Of Circle/Sphere/Torus",
|
||||
"cmd.inspect_center_of_mass": "Centre of Mass",
|
||||
"cmd.inspect_colored_components": "Enable Component Colours",
|
||||
"cmd.inspect_colored_components_disable": "Disable Component Colours",
|
||||
"cmd.parameters_favorite": "Favourite Parameter",
|
||||
"cmd.render_aging_describe": "Layered Surface Aging",
|
||||
"cmd.render_effects_describe": "Lens and Creative Effects",
|
||||
"cmd.sketch.construction_line": "Construction Line",
|
||||
"cmd.sketch.construction_line.angle": "Construction Line at Angle",
|
||||
"cmd.sketch.construction_line.bisector": "Angle Bisector",
|
||||
"cmd.sketch.construction_line.horizontal": "Horizontal Construction Line",
|
||||
"cmd.sketch.construction_line.parallel": "Parallel Construction Line",
|
||||
"cmd.sketch.construction_line.perpendicular": "Perpendicular Construction Line",
|
||||
"cmd.sketch.construction_line.tangent_at": "Tangent at Curve Point",
|
||||
"cmd.sketch.construction_line.tangent_external": "Tangent through External Point",
|
||||
"cmd.sketch.construction_line.tangent_two": "Common Tangent",
|
||||
"cmd.sketch.construction_line.vertical": "Vertical Construction Line",
|
||||
"cmd.sketch_arc_center_point": "Centre Point Arc",
|
||||
"cmd.sketch_circle_center": "Centre Diameter Circle",
|
||||
"cmd.sketch_rectangle_center": "Centre Rectangle",
|
||||
@@ -28,7 +48,26 @@
|
||||
"color.gamma": "Showing colour values in 0-255 gamma space",
|
||||
"color.linear": "Showing colour values in 0-1 linear space",
|
||||
"color.selected": "Selected colour",
|
||||
"dxf.cancelled": "DXF export cancelled",
|
||||
"dxf.cancelling": "Cancelling DXF export",
|
||||
"help.apache": "Apache licence 2.0",
|
||||
"help.appearance.assign": "Gives the selected bodies, faces or components a colour or a material look, without changing their weight. Use it to tell parts apart or to preview a finish.",
|
||||
"help.face.delete": "Removes the selected faces and lets the neighbouring faces close the gap, or leaves the gap open as a surface. Use it to take off a rounded edge, a hole or a boss that is in the way.",
|
||||
"help.font_details": "The interface uses egui's built-in fonts (Ubuntu Light and Hack, under the Ubuntu Font Licence and the MIT/Bitstream Vera licence; Noto Emoji and the emoji icon font, under the OFL and MIT). Sketch text uses Liberation Sans (SIL OFL 1.1). The Crafting Apps' optional font pack, craft-fonts (BIZ UDPGothic, Shippori Mincho, BIZ UDMincho, Noto Sans CJK SC, Noto Sans Arabic; SIL OFL 1.1), is not bundled in SolidCraft builds.",
|
||||
"help.licences": "Licences",
|
||||
"help.material.assign": "Sets what the selected bodies are made of, such as steel, aluminium or ABS. Use it so that the mass and weight match the real part.",
|
||||
"help.mit": "MIT licence",
|
||||
"help.solid.draft": "Tilts the selected faces by the angle you set, measured from a neutral plane. Use it on moulded or cast parts so that they slide out of the mould.",
|
||||
"help.solid.revolve": "Spins a sketch profile around an axis to make a round solid. Use it for shafts, knobs, bowls and any part that is round about a centre line.",
|
||||
"help.solid.split_body": "Cuts a body into separate bodies with a plane, the face of another body or a sketch line. Use it to make parts that are printed, machined or coloured on their own.",
|
||||
"help.solid.split_face": "Divides the selected faces along a plane, the face of another body or sketch curves, without cutting the body. Use it to give part of a face its own draft, colour or offset.",
|
||||
"help.third_party": "Third-party licences",
|
||||
"home.new_mm_hint": "Millimetres · opens in Design",
|
||||
"navbar.custom.customise": "Customise navigation bar…",
|
||||
"navbar.custom.position_centre": "Centre",
|
||||
"navbar.description.separator": "A thin line that groups neighbouring slots.",
|
||||
"pattern.alignment_hint": "Counts include the original. Centre balances copies; Flip chooses the extra side for even totals.",
|
||||
"prefs.bottom_centre": "Bottom centre",
|
||||
"prefs.logo_theme": "Theme's colours",
|
||||
"prefs.max_file_size": "Largest file to open",
|
||||
"prefs.max_file_size_design": "Design files",
|
||||
@@ -39,6 +78,9 @@
|
||||
"prefs.megabytes": "MB",
|
||||
"prefs.sketch_conflict_colour": "Conflicting geometry in the conflict colour",
|
||||
"prefs.sketch_conflict_colour_note": "While a sketch's constraints conflict, the curves and points a failing constraint holds are drawn in the conflict colour too, not only its glyph or dimension. Off: they keep their usual colours.",
|
||||
"prefs.sketch_construction_lines": "Extended construction line tools",
|
||||
"prefs.sketch_recent_snap": "Auto snap to recent centres and midpoints",
|
||||
"prefs.sketch_recent_snap_note": "While drawing, snap the cursor where the guides of the two most recent circle centres or straight-edge midpoints cross. Off: those guides stay visual and the cursor does not move.",
|
||||
"prefs.sketch_state_icons": "Sketch icons in the colour of their state",
|
||||
"prefs.sketch_state_icons_note": "In History and the browser, a sketch's icon takes the colour of its state (under constrained, fully constrained or conflicting) and its tooltip names the state. Off: every sketch has the same icon.",
|
||||
"prefs.sketch_tracking_guides": "Centre and midpoint alignment guides",
|
||||
@@ -50,7 +92,9 @@
|
||||
"prefs.theme_follow_note": "Reloaded whenever another tool rewrites it. Choosing a theme stops following it.",
|
||||
"prefs.theme_follow_off": "Off",
|
||||
"prefs.theme_follow_stop": "Stop following",
|
||||
"prefs.trackpad_zoom_modifier.help": "Hold only this key to zoom at the pointer with vertical scroll. Off keeps the existing scroll behaviour.",
|
||||
"prefs.view": "View behaviour",
|
||||
"prefs.viewport_background_colour": "Colour",
|
||||
"render.aging_add": "Add aging layer",
|
||||
"render.aging_airborne": "Airborne dust / participating medium",
|
||||
"render.aging_airborne_help": "Airborne dust is a separate finite homogeneous scattering volume. It changes transport and raw EXR, not the surface-aging stack. Existing volume/glass/denoising restrictions remain explicit; no atmosphere is added automatically.",
|
||||
@@ -78,6 +122,7 @@
|
||||
"render.aging_target_help": "A named target must still match its captured index and name. Global masks are world-anchored; they do not follow moving parts. This is neither cavity detection nor true edge wear. Filter the list to reach additional bodies.",
|
||||
"render.aging_target_search": "Filter body names",
|
||||
"render.aging_upward": "Upward-facing deposition",
|
||||
"render.appearance_editor.base_colour": "Base colour",
|
||||
"render.backdrop_first": "Start / centre colour",
|
||||
"render.backdrop_second": "End / edge colour",
|
||||
"render.backdrop_x": "Centre X",
|
||||
@@ -94,21 +139,31 @@
|
||||
"render.base_color": "Base colour · sRGB",
|
||||
"render.bloom_help": "Creative output-only glow from positive linear highlights, spread with three normalised box passes. Radius is in output pixels. Added in linear display light before sRGB; not a lens, volumetric effect or convergence improvement. The raw EXR is unchanged.",
|
||||
"render.chromatic_offset": "Chromatic edge offset",
|
||||
"render.cpu_area_editor_help": "Full side vectors in millimeters; U cross V points towards the emitting side. This differs from GPU half-edge vectors.",
|
||||
"render.cpu_light_help": "Up to eight directional lights. An empty custom list turns them off; selecting a preset restores its lights. Colours are linear RGB and intensity is relative, not watts.",
|
||||
"render.cpu_linear_color": "Linear colour (R, G, B)",
|
||||
"render.effects_gpu_only": "These effects require GPU path tracing. Changing the page never switches the renderer automatically.",
|
||||
"render.effects_help": "Combine ordered colour looks and image-space lens effects. Rendering and raw-master regrading use the same saved settings. Raw EXR stays unchanged. These are original artistic controls, not calibrated lens or branded-film emulations.",
|
||||
"render.effects_reset_lens": "Reset lens effects",
|
||||
"render.effects_seed": "Pattern seed",
|
||||
"render.env_colour": "Colour",
|
||||
"render.environment.radial_only": "Centre and radius apply to Radial mode.",
|
||||
"render.error_finish_gesture": "finish the modelling gesture before previewing",
|
||||
"render.error_finish_operation": "finish the current modelling operation before entering Render",
|
||||
"render.film_grain": "Photographic grain",
|
||||
"render.flare_ghosts": "Ghost rings per source",
|
||||
"render.flare_halo": "Flare halo",
|
||||
"render.flare_streak": "Anamorphic-style streak",
|
||||
"render.flare_strength": "Highlight flare strength",
|
||||
"render.flare_threshold": "Scene-linear flare threshold",
|
||||
"render.frame_centre_mark": "Centre mark",
|
||||
"render.hdr_primaries_declared": "The source declares its colour primaries.",
|
||||
"render.hdr_primaries_srgb": "Colour primaries: sRGB/D65",
|
||||
"render.hdr_primaries_undeclared": "The source does not declare primaries; review the renderer colour requirements.",
|
||||
"render.image_cancelled": "Render cancelled",
|
||||
"render.image_cancelling": "Cancelling",
|
||||
"render.image_scene_stale": "Finish the modelling gesture or refresh the scene before checking or starting an image.",
|
||||
"render.inspector_colour": "Colour",
|
||||
"render.layer_down": "Move down",
|
||||
"render.layer_enabled": "Layer enabled",
|
||||
"render.layer_remove": "Remove layer",
|
||||
@@ -123,6 +178,11 @@
|
||||
"render.library_rig_help": "Fit once at an explicit centre and physical extent. Complete rigs include passive cards; calibration blockers still refuse. Conservative emitter/card clearance is checked before saving.",
|
||||
"render.library_source_preview_help": "Authored base-colour source map. This is not a rendered or measured material preview.",
|
||||
"render.library_unfavorite": "Remove favourite",
|
||||
"render.light_behaviour": "BEHAVIOUR",
|
||||
"render.light_preview_help": "Live view is unshadowed; Area lights use a centre-sample approximation. Render uses the complete light model.",
|
||||
"render.light_product_centre": "Product centre",
|
||||
"render.light_temperature": "Colour temperature",
|
||||
"render.lighting_colour": "Colour",
|
||||
"render.look_add": "Add colour look",
|
||||
"render.look_bleach": "Bleach-bypass-inspired",
|
||||
"render.look_cool": "Cool",
|
||||
@@ -146,29 +206,45 @@
|
||||
"render.radial_distortion": "Radial distortion",
|
||||
"render.ribbon_aging": "Aging",
|
||||
"render.ribbon_effects": "Effects",
|
||||
"render.ribbon_studios_help": "Browse implemented studio compositions and review their replacements before applying. Concept-only scenes remain labelled.",
|
||||
"render.sharpening": "Detail sharpening",
|
||||
"render.soft_focus": "Soft focus",
|
||||
"render.stage_panels.centre": "Centre",
|
||||
"render.stage_panels.source_note": "Authored base-colour source map. Not a measured material.",
|
||||
"render.studio_area_help": "Up to four one-sided rectangles. Orthogonal half-edges U and V define size; U × V faces the lit side. Coordinates are world-space millimetres.",
|
||||
"render.studio_center": "Centre X, Y, Z (mm)",
|
||||
"render.studio_hdr_help": "Radiance .hdr, 2:1 panorama, up to 2048 × 1024. EXR is unavailable. The colour assumption applies only when primaries are unspecified.",
|
||||
"sketch_text.align_center": "Centre",
|
||||
"ui.3d_mouse_kind_cap": "Return to Centre",
|
||||
"ui.3d_mouse_looks_like_cap": "The reading stays put while you hold it, the way a Return to Centre device does.",
|
||||
"ui.3d_mouse_orbit_tip": "Traced: the 3D mouse turns the view around the part of the model in the middle of the view when the turn begins, marked by a faint ball. Classic: around the view's centre",
|
||||
"ui.3d_mouse_step_pull": "Pull the cap towards you, hold it, then let go.",
|
||||
"ui.3d_mouse_switch_cap": "Calibrate as Return to Centre",
|
||||
"ui.agent_chat_minimize": "Minimise to a strip",
|
||||
"ui.ai_mode_edits_note": "Modelling commands run without asking; saving, opening, exporting and other file or destructive actions still ask.",
|
||||
"ui.center": "Centre",
|
||||
"ui.center_arc_follows_cursor": "Centre point arc follows the cursor's direction",
|
||||
"ui.center_arc_follows_cursor_tip": "A centre point arc runs clockwise or counter-clockwise the way the cursor goes round its centre. Off: always counter-clockwise from the start.",
|
||||
"ui.centerline": "Centreline",
|
||||
"ui.colour_vision": "Colour vision",
|
||||
"ui.colour_vision_note": "Changes the colours that carry a meaning: sketch states, axes, bends, analyses and icons. If you use Windows colour filters, keep this Off.",
|
||||
"ui.colour_vision_off_tip": "The theme's own colours",
|
||||
"ui.construction.ribbon_label": "X-Lines",
|
||||
"ui.customizeToolbar": "Customise Toolbar…",
|
||||
"ui.default_modelling_orientation": "Default modelling orientation",
|
||||
"ui.design_properties.license": "Licence",
|
||||
"ui.design_properties.organization": "Organisation",
|
||||
"ui.export_keymap_tip": "Keys, S box favourites and the toolbar, as a file",
|
||||
"ui.layout_compact": "Compact",
|
||||
"ui.layout_floating": "Floating",
|
||||
"ui.material_review.claims": "Sources and licences are unverified claims. Missing values remain unknown.",
|
||||
"ui.point_cloud_color_by": "Colour By",
|
||||
"ui.point_cloud_file_colors": "File Colours",
|
||||
"ui.point_cloud_no_file_colors": "The file has no colours",
|
||||
"ui.point_cloud_single_color": "Single Colour",
|
||||
"ui.properties.inertia_note": "About the centre of mass, in world axes (g·{unit}²)",
|
||||
"ui.ribbon_labels": "Show text under ribbon icons",
|
||||
"ui.view_centre": "View centre",
|
||||
"ui.workspace_layout": "Workspace layout",
|
||||
"ui.zoom_to_cursor_tip": "The wheel zooms towards the point under the cursor (off: towards the view's centre)",
|
||||
"update.prefs_flatpak": "Flatpak updates this copy ({version}): run {command} or use your software centre. SolidCraft doesn't check."
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
"BLEND SURFACE": "משטח מעבר",
|
||||
"BOUNDARY SURFACE": "משטח גבול",
|
||||
"BROWSER": "עץ התכן",
|
||||
"Back to the original order": "חזרה לסדר המקורי",
|
||||
"Ball": "כדורי",
|
||||
"Bar": "מוט",
|
||||
"Base Center": "מרכז הבסיס",
|
||||
@@ -206,6 +207,7 @@
|
||||
"Edges": "מקצועות",
|
||||
"Edit": "עריכה",
|
||||
"Edit Profile Sketch": "עריכת סקיצת הפרופיל",
|
||||
"Edit shortcuts": "עריכת קיצורי דרך",
|
||||
"Enable rule": "הפעלת הכלל",
|
||||
"Enabled": "מופעל",
|
||||
"End Radius": "רדיוס סיום",
|
||||
@@ -468,6 +470,7 @@
|
||||
"Radius": "רדיוס",
|
||||
"Radius Fit": "התאמת רדיוס",
|
||||
"Ratio": "יחס",
|
||||
"Read-only list: shortcuts can't be changed here.": "רשימה לקריאה בלבד: לא ניתן לשנות כאן קיצורי דרך.",
|
||||
"Reattach selected face": "הצמדה מחדש לפאה שנבחרה",
|
||||
"Recover": "שחזור",
|
||||
"Recover unsaved design?": "לשחזר תכן שלא נשמר?",
|
||||
@@ -593,6 +596,8 @@
|
||||
"Snap to face and edge centres": "הצמדה למרכזי פאות ומקצועות",
|
||||
"SolidCraft cannot submit reports directly. Submit on GitHub; no token is needed in the app.": "אין אפשרות לשלוח דיווחים ישירות מתוך SolidCraft. יש לשלוח אותם ב-GitHub; אין צורך באסימון גישה באפליקציה.",
|
||||
"SolidCraft closed before these designs were saved. Their last autosave can be opened.": "SolidCraft נסגרה לפני שתכנים אלה נשמרו. אפשר לפתוח את השמירה האוטומטית האחרונה שלהם.",
|
||||
"Sort A to Z": "מיון בסדר עולה",
|
||||
"Sort Z to A": "מיון בסדר יורד",
|
||||
"Spacing 2 must be a non-zero number": "מרווח 2 חייב להיות מספר שונה מאפס",
|
||||
"Spacing must be a non-zero number": "המרווח חייב להיות מספר שונה מאפס",
|
||||
"Specialise": "התמחות",
|
||||
@@ -652,6 +657,7 @@
|
||||
"Third point": "נקודה שלישית",
|
||||
"This child is shared. Deleting it removes it from every copy of its parent.": "צאצא זה משותף. מחיקתו מסירה אותו מכל עותק של רכיב האב.",
|
||||
"This child is shared. Position changes apply to every copy of its parent.": "צאצא זה משותף. שינויי מיקום חלים על כל עותק של רכיב האב.",
|
||||
"This component is inside a subassembly placed more than once: aligning it moves it in every placement.": "רכיב זה נמצא בתוך תת-הרכבה שהוצבה יותר מפעם אחת: יישורו יזיז אותו בכל הצבה.",
|
||||
"This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "פאה זו אינה מאפשרת הצמדה יציבה. יש לבחור פאה אחרת או להשתמש במפורש במישור קבוע.",
|
||||
"This image is not attached to GitHub yet. Copy or save it, then attach it on GitHub.": "התמונה עדיין לא צורפה ב־GitHub. יש להעתיק או לשמור אותה, ואז לצרף אותה ב־GitHub.",
|
||||
"Thread depth": "עומק הברגה",
|
||||
@@ -772,6 +778,8 @@
|
||||
"at the face": "על הפאה",
|
||||
"bom.group_children": "תת-חלקים בשורת החלק שלהם",
|
||||
"browser.body_name": "גוף{number}",
|
||||
"browser.calibrate_click_a": "לחצו על התמונה כדי לבחור את נקודה A, או הקלידו את הקואורדינטות שלה.",
|
||||
"browser.calibrate_click_b": "לחצו על התמונה כדי לבחור את נקודה B, או הקלידו את הקואורדינטות שלה.",
|
||||
"browser.calibrate_title": "כיול: {name}",
|
||||
"browser.capture_many": "{count} רכיבים הוזזו, אך המיקומים שלהם לא נלכדו.",
|
||||
"browser.capture_note": "לכידה שומרת את המיקום החדש; החזרה מחזירה את המיקום הקודם.",
|
||||
@@ -814,6 +822,7 @@
|
||||
"cmd.appearance_pick_up": "בחירת מראה",
|
||||
"cmd.appearance_replace": "החלפת מראה",
|
||||
"cmd.assembly_bom": "רשימת חלקים",
|
||||
"cmd.body.print_face": "פאת הדפסה",
|
||||
"cmd.body_rename": "שינוי שם גוף",
|
||||
"cmd.browser_collapse_all": "כיווץ הכול",
|
||||
"cmd.browser_expand_all": "הרחבת הכול",
|
||||
@@ -821,6 +830,7 @@
|
||||
"cmd.browser_move": "הזזת פריטים בעץ",
|
||||
"cmd.browser_order": "סידור פריטים בעץ",
|
||||
"cmd.browser_rename_group": "שינוי שם קבוצה",
|
||||
"cmd.browser_reparent": "העברה לרכיב",
|
||||
"cmd.browser_ungroup": "פירוק קבוצה",
|
||||
"cmd.browser_visibility": "הצגה/הסתרה",
|
||||
"cmd.canvas_calibrate": "כיול קנבס",
|
||||
@@ -847,7 +857,9 @@
|
||||
"cmd.component_metadata": "מאפייני חלק",
|
||||
"cmd.component_metadata_set": "שינוי מאפייני חלק",
|
||||
"cmd.component_move_bodies": "העברת גופים לרכיב",
|
||||
"cmd.component_move_features": "העברת פיצ'רים לרכיב",
|
||||
"cmd.component_move_sketches": "העברת סקיצות לרכיב",
|
||||
"cmd.component_paste_from_design": "הדבק מעיצוב אחר",
|
||||
"cmd.component_paste_new": "הדבקה כחדש",
|
||||
"cmd.component_properties": "תכונות פיזיקליות של רכיב",
|
||||
"cmd.component_relink": "קישור מחדש למקור",
|
||||
@@ -984,6 +996,7 @@
|
||||
"cmd.motion_trace": "עקבת תנועה",
|
||||
"cmd.motion_trace_edit": "עריכת עקבת תנועה",
|
||||
"cmd.motion_trace_keep": "שמירת עקבת תנועה",
|
||||
"cmd.occurrence_align": "יישור מופע",
|
||||
"cmd.occurrence_copy": "הדבקה (מופע)",
|
||||
"cmd.occurrence_drag": "גרירת מופע",
|
||||
"cmd.occurrence_ground": "עיגון",
|
||||
@@ -1074,6 +1087,13 @@
|
||||
"cmd.render_start": "יצירת תמונת הדמיה",
|
||||
"cmd.render_status": "התקדמות ההדמיה",
|
||||
"cmd.select_clear": "ניקוי הבחירה",
|
||||
"cmd.settings_profile_apply": "החלת פרופיל הגדרות",
|
||||
"cmd.settings_profile_delete": "מחיקת פרופיל הגדרות",
|
||||
"cmd.settings_profile_export": "ייצוא פרופיל הגדרות",
|
||||
"cmd.settings_profile_import": "ייבוא פרופיל הגדרות",
|
||||
"cmd.settings_profile_list": "פרופילי הגדרות",
|
||||
"cmd.settings_profile_rename": "שינוי שם פרופיל הגדרות",
|
||||
"cmd.settings_profile_save": "שמירת פרופיל הגדרות",
|
||||
"cmd.sheet_convert": "המרה לפח",
|
||||
"cmd.sheet_export_bend_table": "ייצוא טבלת כיפופים",
|
||||
"cmd.sheet_export_dxf": "ייצוא פריסה כ־DXF",
|
||||
@@ -1087,6 +1107,16 @@
|
||||
"cmd.sheet_refold": "קיפול מחדש",
|
||||
"cmd.sheet_rules": "רשימת כללי פח",
|
||||
"cmd.sheet_unfold": "פתיחת קיפול",
|
||||
"cmd.sketch.construction_line": "ישר עזר",
|
||||
"cmd.sketch.construction_line.angle": "ישר עזר בזווית",
|
||||
"cmd.sketch.construction_line.bisector": "חוצה זווית",
|
||||
"cmd.sketch.construction_line.horizontal": "ישר עזר אופקי",
|
||||
"cmd.sketch.construction_line.parallel": "ישר עזר מקביל",
|
||||
"cmd.sketch.construction_line.perpendicular": "ישר עזר ניצב",
|
||||
"cmd.sketch.construction_line.tangent_at": "משיק בנקודה על העקומה",
|
||||
"cmd.sketch.construction_line.tangent_external": "משיק דרך נקודה חיצונית",
|
||||
"cmd.sketch.construction_line.tangent_two": "משיק משותף",
|
||||
"cmd.sketch.construction_line.vertical": "ישר עזר אנכי",
|
||||
"cmd.sketch_arc3d": "קשת תלת־ממדית",
|
||||
"cmd.sketch_arc_center_point": "קשת מרכז ונקודה",
|
||||
"cmd.sketch_arc_tangent": "קשת משיקה",
|
||||
@@ -1119,6 +1149,8 @@
|
||||
"cmd.sketch_drawing_bounds": "גודל הציור",
|
||||
"cmd.sketch_edit": "עריכת סקיצה",
|
||||
"cmd.sketch_edit_text": "עריכת טקסט",
|
||||
"cmd.sketch_equation_curve": "עקומת משוואה",
|
||||
"cmd.sketch_equation_curve_edit": "עריכת עקומת משוואה",
|
||||
"cmd.sketch_export_dxf": "שמירה כ־DXF",
|
||||
"cmd.sketch_finish_auto_constrain": "סיום עם אילוץ אוטומטי",
|
||||
"cmd.sketch_fit_curves_to_section": "התאמת עקומות לחתך רשת משולשים",
|
||||
@@ -1215,6 +1247,7 @@
|
||||
"cmd.view.render_browser": "דפדפן רינדור",
|
||||
"cmd.view.render_dock": "הזז את עגינת הרינדור",
|
||||
"cmd.view.render_focus": "תצוגת מיקוד רינדור",
|
||||
"cmd.view.status_items": "פריטי מצב תצוגה",
|
||||
"cmd.view_ambient_occlusion": "הצללה סביבתית",
|
||||
"cmd.view_angle_readout": "זוויות תצוגה",
|
||||
"cmd.view_apply": "שחזור תצוגה שמורה",
|
||||
@@ -1369,8 +1402,21 @@
|
||||
"help.material.assign": "קביעת החומר שממנו עשויים הגופים שנבחרו, למשל פלדה, אלומיניום או ABS. כך המסה והמשקל תואמים את החלק האמיתי.",
|
||||
"help.mit": "רישיון MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.occurrence.move": "מזיז חלק בהרכבה רק בכיוונים שהמפרקים שלו מאפשרים. בחרו פאה של החלק, ואז גררו חץ או קשת זמינים.",
|
||||
"help.parameters.change": "פתיחת הטבלה של ערכים בעלי שם וביטויים שקובעים את מידות התכנון. כך משנים מידה במקום אחד וכל הפיצ'רים שמשתמשים בה מתעדכנים.",
|
||||
"help.pointcloud.insert": "הוספת סריקה בפורמט PLY, XYZ או PTS כענן נקודות לצד המודל. משמש כעזר למידול על סמך נתוני מדידה.",
|
||||
"help.sketch.construction_line": "יצירת ישר עזר אינסופי דרך שתי נקודות, לתכנון הסקיצה בלי לפצל את הפרופילים.",
|
||||
"help.sketch.construction_line.angle": "יצירת ישר עזר אינסופי בזווית מציר X של הסקיצה. יש לבחור נקודה ולהקליד זווית או לבחור כיוון.",
|
||||
"help.sketch.construction_line.bisector": "יש לבחור שני ישרים נחתכים בסקיצה ואז אחד משני חוצי הזווית. התוצאה עוקבת אחר עריכת ישרי המקור.",
|
||||
"help.sketch.construction_line.horizontal": "יצירת ישר עזר אופקי אינסופי דרך נקודה. האילוץ האופקי נשמר בעריכות מאוחרות יותר.",
|
||||
"help.sketch.construction_line.parallel": "יש לבחור ישר בסקיצה ואז למקם ישר עזר אינסופי מקביל. לחיצה ימנית מאפשרת לבחור ייחוס אחר.",
|
||||
"help.sketch.construction_line.perpendicular": "יש לבחור ישר בסקיצה ואז למקם ישר עזר אינסופי ניצב. לחיצה ימנית מאפשרת לבחור ייחוס אחר.",
|
||||
"help.sketch.construction_line.tangent_at": "יצירת משיק בנקודה על מעגל או קשת מעגלית, או בנקודת קצה של ספליין פתוח או חתך חרוט פתוח. יש לבחור את העקומה ואז את נקודת ההשקה.",
|
||||
"help.sketch.construction_line.tangent_external": "יש לבחור מעגל או קשת מעגלית, נקודה חיצונית ואז פתרון למשיק. התצוגה המקדימה מציגה רק נקודות השקה על הקשת המצוירת.",
|
||||
"help.sketch.construction_line.tangent_two": "יש לבחור שני מעגלים או קשתות מעגליות ואז משיק משותף בתצוגה המקדימה. נקודות ההשקה חייבות להיות על העקומות המצוירות.",
|
||||
"help.sketch.construction_line.vertical": "יצירת ישר עזר אנכי אינסופי דרך נקודה. האילוץ האנכי נשמר בעריכות מאוחרות יותר.",
|
||||
"help.sketch.equation_curve": "משרטט עקומה מנוסחאות על פני טווח: x(t) ו־y(t), או y = f(x). הנוסחאות יכולות להשתמש בפרמטרים והעקומה עוקבת אחריהם: לגל סינוס, לספירלה או לאבולבנטה של שן גלגל שיניים.",
|
||||
"help.sketch.inspect": "פותח דוח על הסקיצה הפתוחה: כמה דרגות חופש נותרו והאם היא מאולצת במלואה. השתמשו בו כדי לגלות מה עדיין זז לפני שמסיימים את הסקיצה.",
|
||||
"help.solid.align": "הזזת הגופים שנבחרו כך שנקודה, פאה או מישור שלהם יפגשו נקודה, פאה או מישור במקום אחר. מתאים להצמדת חלק לחלק אחר בלי למדוד את המרחק.",
|
||||
"help.solid.chamfer": "חיתוך המקצועות שנבחרו בשיפוע ישר במרחק שנקבע. כך שוברים מקצועות חדים או מקלים על הכנסה של פין או בורג.",
|
||||
"help.solid.combine": "איחוד גופים, חיסורם מגוף יעד או השארת הנפח המשותף להם בלבד, עם אפשרות לשמור את גופי הכלי. מתאים למיזוג חלקים, לחיתוך צורה אחת בעזרת אחרת או למציאת החפיפה בין שני גופים.",
|
||||
@@ -1499,6 +1545,21 @@
|
||||
"joint.one_component": "חלקים אלה הם גופים של רכיב אחד: {bodies}. מפרק מזיז רכיב אחד ביחס לרכיב אחר, ולכן כל חלק צריך רכיב משלו.",
|
||||
"joint.rigid_group_one_component": "כל {count} הגופים האלה נמצאים ברכיב אחד (או בתכן עצמו): יש להשתמש קודם ב־{command}.",
|
||||
"joint.rigid_group_select_components": "יש לבחור שני רכיבים או יותר.",
|
||||
"joint_move.blocked_hint": "בדקו את סוג המפרק (למשל מפרק קשיח), את קיבוע החלק, את מגבלות המפרק ואת הערכים הנשלטים על ידי פרמטרים.",
|
||||
"joint_move.blocked_title": "אי אפשר להזיז את החלק הזה",
|
||||
"joint_move.coarse": "צעד סיבוב קרוב לציר (°)",
|
||||
"joint_move.distance": "מרחק מנקודת ההתחלה",
|
||||
"joint_move.done": "סיום",
|
||||
"joint_move.fine": "צעד סיבוב רחוק מהציר (°)",
|
||||
"joint_move.fixed": "לחלק הזה אין ציר מפרק שניתן להזיז.",
|
||||
"joint_move.help": "הזזה — גררו חץ או קשת. Esc מבטל את הגרירה הנוכחית.",
|
||||
"joint_move.legacy_hint": "כבו כדי להשתמש בחלונית ההזזה הקודמת.",
|
||||
"joint_move.precision": "משכו אל מחוץ למנחה המקווקו כדי לכוון את הסיבוב בעדינות.",
|
||||
"joint_move.rotation": "סיבוב מנקודת ההתחלה",
|
||||
"joint_move.select": "בחרו פאה או חלק אחד בהרכבה, ואז בחרו הזזה.",
|
||||
"joint_move.settings": "הזזה בהרכבה",
|
||||
"joint_move.step": "צעד",
|
||||
"joint_move.use_handles": "שימוש בידיות תנועת מפרקים להזזה בהרכבה",
|
||||
"keymap.command_id": "מזהה פקודה",
|
||||
"keymap.empty": "אין פקודות תואמות",
|
||||
"keymap.use_anyway": "שימוש ב־{key} כאן בכל זאת",
|
||||
@@ -1558,6 +1619,10 @@
|
||||
"material.selection.mixed": "חומרים שונים",
|
||||
"measure.at": "מיקום",
|
||||
"measure.item": "פריט {number}",
|
||||
"measure.quick_copied": "המדידה הועתקה",
|
||||
"measure.quick_copy": "לחיצה מעתיקה את המדידה",
|
||||
"measure.quick_edges": "{count} מקצועות",
|
||||
"measure.quick_faces": "{count} פאות",
|
||||
"messages.ago_h": "לפני {n} שע'",
|
||||
"messages.ago_min": "לפני {n} דק'",
|
||||
"messages.ago_s": "לפני {n} שנ'",
|
||||
@@ -1593,6 +1658,8 @@
|
||||
"nav.maya.help": "Alt וגרירה שמאלית מסובבים, Alt וגרירה אמצעית מזיזים, Alt וגרירה ימנית מבצעים זום; גם גרירה אמצעית מזיזה",
|
||||
"nav.openscad.help": "גרירה שמאלית על שטח ריק מסובבת, Shift וגרירה שמאלית בוחרים במלבן, גרירת גאומטריית סקיצה עורכת אותה; גרירה ימנית או אמצעית מזיזה, Shift וגרירה ימנית או אמצעית מבצעים זום",
|
||||
"nav.perspective.sketch": "עריכת סקיצה משתמשת בתצוגה אורתוגרפית. יש לסיים את הסקיצה כדי לעבור לפרספקטיבה.",
|
||||
"nav.right_drag_orbits.help": "כבוי: גרירה בכפתור הימני לא מזיזה את המצלמה, והכפתור הימני רק פותח את תפריט ההקשר. בחירת מיפוי העכבר SolidWorks מכבה זאת.",
|
||||
"nav.right_drag_orbits.label": "גרירה ימנית מסובבת",
|
||||
"nav.solidworks.help": "גרירה אמצעית מסובבת, Ctrl וגרירה אמצעית מזיזים, Shift וגרירה אמצעית מבצעים זום, גרירה ימנית מסובבת",
|
||||
"nav.tinkercad.help": "גרירה ימנית מסובבת, גרירה אמצעית או Shift וגרירה ימנית מזיזים",
|
||||
"nav.touchpad.help": "להזזת התצוגה יש להחזיק Shift ולהזיז את הסמן; לסיבוב יש להחזיק Alt/Option ולהזיז אותו. אין צורך בלחצן עכבר. גלילה אנכית מבצעת זום.",
|
||||
@@ -1614,6 +1681,9 @@
|
||||
"navbar.custom.customise": "התאמת סרגל הניווט…",
|
||||
"navbar.custom.design": "תכן",
|
||||
"navbar.custom.duplicate": "המשבצת הזו כבר בסרגל.",
|
||||
"navbar.custom.edge": "קצה",
|
||||
"navbar.custom.edge_bottom": "למטה",
|
||||
"navbar.custom.edge_top": "למעלה",
|
||||
"navbar.custom.fade": "דהייה",
|
||||
"navbar.custom.full": "הסירו משבצת כדי להוסיף אחרת.",
|
||||
"navbar.custom.hidden_design": "מוסתר בתכן",
|
||||
@@ -1705,6 +1775,11 @@
|
||||
"not a move": "זו אינה הזזה",
|
||||
"not a number": "לא מספר",
|
||||
"open a sketch first": "יש לפתוח סקיצה תחילה",
|
||||
"parameters.apply_live": "להחיל כל שינוי ביציאה מהשדה שלו",
|
||||
"parameters.apply_live_tip": "כבוי: השינויים ממתינים עד ל„החל” או „אישור”, ואז התכן נבנה מחדש פעם אחת עבור כולם. „ביטול” או Escape משליכים אותם.",
|
||||
"parameters.held": "{count} שינויים ממתינים ל„החל”",
|
||||
"parameters.held_hint": "עריכת ביטויים ויחידות. השינויים ממתינים ל„החל” או ל„אישור”.",
|
||||
"parameters.held_one": "שינוי אחד ממתין ל„החל”",
|
||||
"parts.automatic_name": "אוטומטי",
|
||||
"parts.dimension.across_flats": "מידת מפתח",
|
||||
"parts.dimension.bore": "קוטר קדח",
|
||||
@@ -1720,12 +1795,15 @@
|
||||
"parts.dimension.thickness": "עובי",
|
||||
"parts.dimension.width": "רוחב",
|
||||
"parts.family.bearing": "מסב כדורי חריץ עמוק (מעטפת)",
|
||||
"parts.family.button_head_cap_screw": "בורג ראש כפתור עם שקע משושה",
|
||||
"parts.family.dowel_pin": "פין גלילי",
|
||||
"parts.family.hex_bolt": "בורג ראש משושה",
|
||||
"parts.family.hex_nut": "אום משושה",
|
||||
"parts.family.set_screw": "בורג אלן ללא ראש, קצה שטוח",
|
||||
"parts.family.socket_head_cap_screw": "בורג ראש גלילי עם משושה פנימי",
|
||||
"parts.family.washer": "דסקית שטוחה",
|
||||
"parts.holes": "חורים (אופציונלי)",
|
||||
"parts.placement_hint": "בחרו חור אחד או יותר כדי להושיב חלק בכל אחד, או לחצו אישור כדי למקם אותו בראשית",
|
||||
"pattern.alignment_2": "יישור 2",
|
||||
"pattern.alignment_hint": "הספירה כוללת את המקור. מרכוז מאזן את העותקים; היפוך בוחר את הצד שמקבל את העותק הנוסף כשהסך זוגי.",
|
||||
"pattern.direction_1": "כיוון 1",
|
||||
@@ -1778,6 +1856,11 @@
|
||||
"prefs.bottom_centre": "למטה במרכז",
|
||||
"prefs.bottom_right": "למטה מימין",
|
||||
"prefs.browser": "עץ התכן",
|
||||
"prefs.browser_eye_left": "סמל העין ליד חץ הקיפול",
|
||||
"prefs.browser_eye_left_note": "שורות עץ התכן מציגות את סמל העין ליד חץ הקיפול, כמו קודם, במקום בעמודה בקצה הימני של השורות.",
|
||||
"prefs.browser_reveal_on_hover": "הצגה בריחוף",
|
||||
"prefs.browser_show_note": "״מוצג״ משאיר את הדפדפן על המסך. ״הצגה בריחוף״ מסתיר אותו עד שהמצביע מגיע למקומו או ללשונית הדקה בקצהו השמאלי, והוא נשאר פתוח כל עוד המצביע בתוכו או שתפריט ממנו פתוח.",
|
||||
"prefs.browser_shown": "מוצג",
|
||||
"prefs.built_in": "מובנה",
|
||||
"prefs.button_left": "גרירה שמאלית",
|
||||
"prefs.button_middle": "גרירה אמצעית",
|
||||
@@ -1825,6 +1908,8 @@
|
||||
"prefs.graphics_card_restart": "ייכנס לתוקף אחרי הפעלה מחדש של SolidCraft. WGPU_ADAPTER_NAME גובר על בחירה זו.",
|
||||
"prefs.graphics_note": "איזון בין מהירות לחלקות. כל בחירה מציגה את השפעתה על דוגמה.",
|
||||
"prefs.graphics_presets_note": "הגדרות קבועות מראש קובעות יחד את הבחירות שלמטה.",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out": "הסתרת סמלי אילוצים בהקטנה",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out_note": "סמלי האילוצים נעלמים כשהשרטוט מוקטן מספיק כדי שלא יעמיסו על התצוגה. כבוי: הם נשארים בגודל מסך קבוע בכל זום.",
|
||||
"prefs.history": "ציר הזמן",
|
||||
"prefs.history_origin_bodies": "הצגת הראשית והגופים למעלה",
|
||||
"prefs.history_origin_bodies_note": "ההיסטוריה משמאל או מתחת לדפדפן מתחילה בתיקיית הגופים של הרכיב הפעיל ובראשית, עם סמלי העין והתפריטים כמו בדפדפן. ההיסטוריה למטה לא משתנה.",
|
||||
@@ -1848,6 +1933,8 @@
|
||||
"prefs.layout_note": "הפריסה הדחוסה מצמידה חלוניות לשולי החלון. שקיפות עץ התכן זמינה בפריסה הצפה. את צד העוזר אפשר לשנות בעמוד העוזר.",
|
||||
"prefs.left": "שמאל",
|
||||
"prefs.left_click": "לחיצה שמאלית",
|
||||
"prefs.line_drag_draws_one": "לחיצה וגרירה משרטטות קו אחד",
|
||||
"prefs.line_drag_draws_one_note": "בכלי הקו, לחיצה, גרירה ושחרור משרטטים קו אחד מנקודת הלחיצה עד נקודת השחרור, והוא מסתיים שם. לחיצות עדיין משרטטות שרשרת. כבוי: גרירה מציבה נקודה היכן שמשחררים, כמו לחיצה.",
|
||||
"prefs.linked_designs": "תכנים מקושרים",
|
||||
"prefs.live_input": "קלט חי",
|
||||
"prefs.live_preview": "תצוגה מקדימה חיה",
|
||||
@@ -1861,6 +1948,9 @@
|
||||
"prefs.max_file_size_step": "קובצי STEP וייבוא",
|
||||
"prefs.max_file_size_web": "יישום הדפדפן פותח קובצי STEP וייבוא עד 512 MB וקובצי תכן עד 256 MB: לשונית דפדפן אינה יכולה להכיל קבצים גדולים יותר. ביישום למחשב ניתן להעלות מגבלות אלה.",
|
||||
"prefs.megabytes": "MB",
|
||||
"prefs.menu_grid": "סמלים גדולים",
|
||||
"prefs.menu_list": "רשימה",
|
||||
"prefs.menus": "תפריטים",
|
||||
"prefs.minutes": "דקות",
|
||||
"prefs.minutes_suffix": " דק'",
|
||||
"prefs.mouse": "עכבר ומשטח מגע",
|
||||
@@ -1880,14 +1970,44 @@
|
||||
"prefs.origin_plane_names": "שמות מישורי הראשית",
|
||||
"prefs.origin_plane_names_note": "השמות המוצגים בדפדפן, בתיבות הדו־שיח וברשימות. {top} הוא XY, {front} הוא XZ ו־{right} הוא YZ, כש־Z למעלה. פקודות, סקריפטים ותכנונים שמורים שומרים על XY, XZ ו־YZ.",
|
||||
"prefs.overall_speed": "מהירות כללית",
|
||||
"prefs.parameter_list_rows": "שורות ברשימת הפרמטרים",
|
||||
"prefs.parameter_list_rows_tip": "חץ למטה בשדה ערך ריק מציג את הפרמטרים, המועדפים תחילה, עד מספר זה. מספר קטן יותר שומר על רשימה קלה בתכנון גדול.",
|
||||
"prefs.persistent_ribbon_pressed": "הדגשת פקודות פעילות ברצועת הכלים",
|
||||
"prefs.persistent_ribbon_pressed_help": "הדגשת פקודות ברצועת הכלים כל עוד ההשפעות שלהן פעילות. כבו אפשרות זו כדי לשמור על המראה הניטרלי הקודם ועל עזרת הפקודות.",
|
||||
"prefs.perspective_fov": "שדה ראייה",
|
||||
"prefs.placement": "מיקום",
|
||||
"prefs.prefer_free_sketch_points": "העדפת נקודות סקיצה ניתנות להזזה כשנקודות חופפות",
|
||||
"prefs.preview_choices": "תצוגה מקדימה של הבחירות שלך",
|
||||
"prefs.print_face_highlight": "הדגשת פאת ההדפסה",
|
||||
"prefs.print_face_highlight_tip": "עד כמה חזק צובעים ומקיפים את פאת ההדפסה של גוף בתצוגה. 0 % אינו מציג הדגשה.",
|
||||
"prefs.profile_active": "פרופיל פעיל",
|
||||
"prefs.profile_applied": "הפרופיל הוחל.",
|
||||
"prefs.profile_changed": "ההגדרות השתנו מאז שהפרופיל נשמר. „שמירה“ מכניסה אותן לפרופיל.",
|
||||
"prefs.profile_deleted": "הפרופיל נמחק.",
|
||||
"prefs.profile_export": "ייצוא…",
|
||||
"prefs.profile_exported": "הפרופיל יוצא.",
|
||||
"prefs.profile_imported": "הפרופיל יובא. בחרו בו תחת „פרופיל פעיל“ כדי לעבור אליו.",
|
||||
"prefs.profile_name_hint": "שם הפרופיל, למשל מחשב נייד",
|
||||
"prefs.profile_rename": "שינוי שם",
|
||||
"prefs.profile_renamed": "שם הפרופיל שונה.",
|
||||
"prefs.profile_save": "שמירה",
|
||||
"prefs.profile_saved": "ההגדרות הנוכחיות נשמרו בפרופיל.",
|
||||
"prefs.profile_skipped": "הפרופיל הוחל; {n} הגדרות שמרו על ערכן הנוכחי (ראו ביומן).",
|
||||
"prefs.profiles": "פרופילי הגדרות",
|
||||
"prefs.profiles_note": "קיצורי מקלדת, סרגל הכלים, ניווט, התפריט המעגלי והגדרות הממשק, נשמרים יחד תחת שם אחד ומוחלפים בבת אחת.",
|
||||
"prefs.project_options_dialog": "תיבת האפשרויות של Project",
|
||||
"prefs.project_options_dialog_note": "פעיל: לבחור גאומטריה או גופים וקישור הטלה לפני ההטלה. כבוי: להשאיר את זרימת העבודה הקודמת של בחירה ישירה.",
|
||||
"prefs.quality_default": "ברירת מחדל",
|
||||
"prefs.quality_fastest": "המהיר ביותר",
|
||||
"prefs.quality_slowest": "האיטי ביותר",
|
||||
"prefs.quality_smoother": "חלק יותר",
|
||||
"prefs.quick_measure": "מדידה מהירה בפינת התצוגה",
|
||||
"prefs.quick_measure_note": "מציג את מידות הבחירה בפינה הימנית התחתונה של התצוגה, מעל ההיסטוריה: אורך מקצוע (או Ø ו-R למקצוע עגול), שטח פאה, מיקום נקודה, המרחק והזווית בין שני פריטים, והסכום של כמה מקצועות או פאות. לחיצה מעתיקה אותו.",
|
||||
"prefs.render_previous_geometry_budget": "שימוש בתקציב הגאומטריה הקודם לתצוגה מקדימה של רינדור",
|
||||
"prefs.render_previous_geometry_budget_help": "שחזור מגבלת הגאומטריה הקבועה הקודמת (512 MiB במחשב שולחני של 64 סיביות, 128 MiB בפלטפורמות אחרות) במקום התקציב המבוסס על ההתקן.",
|
||||
"prefs.reports_saved": "{n} שמורים",
|
||||
"prefs.ribbon_reveal": "הצגת תוצאות חיפוש בסרט",
|
||||
"prefs.ribbon_reveal_note": "מעבר עם הסמן מעל תוצאה בחיפוש פקודות מראה היכן הפקודה נמצאת בסרט: הלשונית, הכפתור או השורה שלה בתפריט הנפתח של לוח. פקודה שהופעלה מהחיפוש מהבהבת שם, ופקודה פעילה מתפריט נפתח מסמנת את הלוח שלה.",
|
||||
"prefs.right_click": "לחיצה ימנית",
|
||||
"prefs.saving": "שמירה אוטומטית ושחזור",
|
||||
"prefs.scale_note": "גם Ctrl + / Ctrl − בחלון. הכפתורים בגודל 28 px ב־100%.",
|
||||
@@ -1896,18 +2016,29 @@
|
||||
"prefs.search_empty": "אין הגדרות תואמות",
|
||||
"prefs.select": "בחירה",
|
||||
"prefs.select_one_item": "בחירת פריט אחד",
|
||||
"prefs.select_other_hidden": "בחירת גאומטריה מוסתרת באמצעות בחירה אחרת",
|
||||
"prefs.select_other_hidden_help": "מופעל: כולל גופים, סקיצות וקצוות מוסתרים בקרבת הסמן. כבוי: שימוש ברשימה המקורית של גאומטריה גלויה מתחת לסמן.",
|
||||
"prefs.selecting": "בחירה",
|
||||
"prefs.shift": "Shift",
|
||||
"prefs.shift_add_ctrl_toggle": "Shift מוסיף בלבד; Ctrl / Cmd מחליף מצב",
|
||||
"prefs.shift_add_note": "כשפועל: Shift מוסיף, Ctrl / Cmd מחליף מצב. כשכבוי (ברירת מחדל): שניהם מחליפים מצב.",
|
||||
"prefs.shortcuts": "קיצורים",
|
||||
"prefs.single_surface_analysis": "שימוש בניתוח משטח יחיד",
|
||||
"prefs.single_surface_analysis_help": "כשהאפשרות כבויה, הצללת המשטח וניתוח הרציפות יכולים להישאר פעילים יחד. הפעלתה משאירה רק את הניתוח האחרון שהופעל או שונה.",
|
||||
"prefs.sketch_align_points": "יישור לנקודות סקיצה אחרות בזמן השרטוט",
|
||||
"prefs.sketch_align_points_note": "בזמן השרטוט, נקודה מתיישרת אופקית עם נקודת סקיצה אחת ואנכית עם אחרת בו-זמנית, עם קו עזר מנוקד, והלחיצה שומרת את שני היישורים. כבוי: רק עם הנקודה הקודמת, ציר אחד בכל פעם.",
|
||||
"prefs.sketch_conflict_colour": "גאומטריה סותרת בצבע הסתירה",
|
||||
"prefs.sketch_conflict_colour_note": "כשאילוצי סקיצה סותרים, העקומות והנקודות שאילוץ כושל מחזיק מצוירות גם הן בצבע הסתירה, לא רק הסמל או המידה שלו. כבוי: הן שומרות על צבעיהן הרגילים.",
|
||||
"prefs.sketch_construction_lines": "כלי ישרי עזר מורחבים",
|
||||
"prefs.sketch_exit_view": "בסיום סקיצה",
|
||||
"prefs.sketch_exit_view.keep": "שמירה על התצוגה הנוכחית",
|
||||
"prefs.sketch_exit_view.previous": "חזרה לתצוגה הקודמת",
|
||||
"prefs.sketch_exit_view.unless_rotated": "חזרה אלא אם התצוגה סובבה",
|
||||
"prefs.sketch_exit_view_note": "לאן התצוגה עוברת אחרי סיום סקיצה, ביטול או Esc כפול.",
|
||||
"prefs.sketch_open_look_at": "הפניית התצוגה אל הסקיצה בפתיחתה",
|
||||
"prefs.sketch_open_look_at_note": "כבוי: יצירה או עריכה של סקיצה משאירות את התצוגה כפי שהיא. «מבט אל» מפנה את התצוגה אל הסקיצה כשרוצים.",
|
||||
"prefs.sketch_recent_snap": "הצמדה אוטומטית למרכזים ולנקודות אמצע אחרונים",
|
||||
"prefs.sketch_recent_snap_note": "בזמן שרטוט, הסמן נצמד למקום שבו נחתכים קווי העזר של שני מרכזי המעגלים או נקודות האמצע של קצוות ישרים האחרונים. כבוי: קווי העזר נשארים לתצוגה בלבד והסמן אינו זז.",
|
||||
"prefs.sketch_selection": "סקיצה ובחירה",
|
||||
"prefs.sketch_selection_heading": "סקיצה ובחירה",
|
||||
"prefs.sketch_selection_note": "איך סקיצות נצמדות ואיך לחיצות בוחרות.",
|
||||
@@ -1952,23 +2083,47 @@
|
||||
"prefs.toast_place": "הודעות",
|
||||
"prefs.toggle_item": "הוספת הפריט, או הוצאתו שוב",
|
||||
"prefs.toolbar": "סרגל כלים",
|
||||
"prefs.toolbar_tabs": "לשוניות סרגל הכלים",
|
||||
"prefs.top": "למעלה",
|
||||
"prefs.trackpad_zoom_modifier": "שינוי תקריב בגלילה בשתי אצבעות בזמן החזקת",
|
||||
"prefs.trackpad_zoom_modifier.alt": "⌥ / Alt",
|
||||
"prefs.trackpad_zoom_modifier.cmd": "⌘",
|
||||
"prefs.trackpad_zoom_modifier.ctrl": "Ctrl",
|
||||
"prefs.trackpad_zoom_modifier.help": "יש להחזיק רק מקש זה כדי לשנות תקריב ליד המצביע בגלילה אנכית. כיבוי שומר על התנהגות הגלילה הקיימת.",
|
||||
"prefs.trackpad_zoom_modifier.off": "כבוי",
|
||||
"prefs.translucent": "שקוף למחצה",
|
||||
"prefs.under_browser": "מתחת לעץ התכן",
|
||||
"prefs.under_cursor": "מתחת לסמן",
|
||||
"prefs.units_precision": "יחידות ודיוק",
|
||||
"prefs.updates": "עדכונים",
|
||||
"prefs.value_boxes_in_view": "הצגת ערכים ליד הידיות שלהם בתצוגה",
|
||||
"prefs.value_boxes_in_view_tip": "ערך הפקודה (מרחק, רדיוס…) בתיבה ליד הידית שלו, מעל המודל. כבוי: מקלידים אותו בחלון הפקודה, שמקבל את המקלדת אחרי בחירה, ושום דבר לא מסתיר את המודל.",
|
||||
"prefs.view": "התנהגות המבט",
|
||||
"prefs.view_confirm_corner": "אישור וביטול בפינת התצוגה",
|
||||
"prefs.view_confirm_corner_note": "כשתיבת דו־שיח או סקיצה פתוחות, סימן וי וסימן איקס בפינה הימנית העליונה של התצוגה עושים את מה שעושים אישור וביטול של תיבת הדו־שיח, או מסיימים ומבטלים את הסקיצה. ניווט התצוגה זז אל מתחתיהם.",
|
||||
"prefs.viewport": "אזור התצוגה",
|
||||
"prefs.viewport_analysis_status": "הצגת מצב ניתוח בחלון התצוגה",
|
||||
"prefs.viewport_analysis_status_help": "הצגת ניתוחים פעילים מעל חלון התצוגה ופתיחת המקרא מכל פריט. Esc מכבה את הניתוח האחרון. כיבוי האפשרות משחזר את המקרא בפינה ואת פעולת Esc הקודמת.",
|
||||
"prefs.viewport_background": "רקע",
|
||||
"prefs.viewport_background_colour": "צבע",
|
||||
"prefs.viewport_background_theme": "מעבר הצבעים של ערכת הנושא",
|
||||
"prefs.viewport_section_status": "הצגת מצב חתך בחלון התצוגה",
|
||||
"prefs.viewport_section_status_help": "הצגת הגדרת החתך בחלון התצוגה. Escape ולחצן הסרט הפעיל מכבים את החתך. כיבוי האפשרות שומר על בקרי החתך הקודמים.",
|
||||
"prefs.viewport_status_summary": "סיכום פריטי מצב בחלון התצוגה",
|
||||
"prefs.viewport_status_summary_help": "קיבוץ שלושה פריטי מצב או יותר לתג סיכום אחד. כיבוי האפשרות משאיר כל פריט בשורה המלאה.",
|
||||
"prefs.wheel": "גלגלת",
|
||||
"prefs.wheel_trackpad": "גלגלת ומשטח מגע",
|
||||
"prefs.workspace": "סביבת עבודה",
|
||||
"prefs.zoom_stop_at_model": "עצירת הזום במודל",
|
||||
"prefs.zoom_stop_at_model_tip": "העכבר התלת־ממדי ויישום ההתקן מקרבים את המבט אל המשטח שבמרכז התצוגה; זום בגרירה שומר על נקודת תחילת הגרירה. כשהאפשרות כבויה, אפשר לעבור דרך המודל. הגלגלת ומחוות הצביטה משתמשות בנפרד בהגדרת הזום אל הסמן",
|
||||
"prefs.zoom_toward_cursor": "זום, לכיוון הסמן",
|
||||
"properties.title": "מאפיינים: {name}",
|
||||
"recovery.days_ago": "לפני {count} ימים",
|
||||
"recovery.detail": "{file} · {features} פיצ'רים · נשמר אוטומטית {when}",
|
||||
"recovery.discard_all": "השלכת הכול",
|
||||
"recovery.discard_all_detail": "לא ניתן לבטל פעולה זו.",
|
||||
"recovery.discard_all_title": "להשליך {count} שמירות אוטומטיות?",
|
||||
"recovery.discard_all_title_one": "להשליך שמירה אוטומטית אחת?",
|
||||
"recovery.hours_ago": "לפני {count} שע'",
|
||||
"recovery.just_now": "זה עתה",
|
||||
"recovery.min_ago": "לפני {count} דק'",
|
||||
@@ -2834,7 +2989,9 @@
|
||||
"render.output_ready": "מוכן לרינדור",
|
||||
"render.output_run_check": "הפעל בדיקה",
|
||||
"render.output_size_limit": "{method}: עד {dimension} פיקסלים לצלע ו-{pixels} פיקסלים. הגודל הגדול ביותר שמתאים: {width} × {height}.",
|
||||
"render.output_size_method_profile": "כדי לרנדר {width} × {height}, יש לבחור ב-{method} עם פרופיל משאבי CPU {profile} או בגודל קטן יותר.",
|
||||
"render.output_size_ok": "הגודל תקין · {width} × {height} פיקסלים",
|
||||
"render.output_size_profile": "כדי לרנדר {width} × {height}, יש לבחור בפרופיל משאבי CPU {profile} או בגודל קטן יותר.",
|
||||
"render.output_swap_orientation": "החלפת רוחב וגובה",
|
||||
"render.output_tools_inspector": "ערוך גודל ופורמט במפקח הפלט.",
|
||||
"render.output_view_image": "הצג תמונה",
|
||||
@@ -3047,6 +3204,7 @@
|
||||
"render.size_custom": "מותאם…",
|
||||
"render.size_full_hd": "Full HD",
|
||||
"render.size_hd": "HD",
|
||||
"render.size_needs_profile": "{size} · נדרש {profile}",
|
||||
"render.size_presets": "הגדרות גודל מוכנות",
|
||||
"render.size_presets_pending": "יגיע עם עורך הפלט",
|
||||
"render.size_preview": "תצוגה מקדימה",
|
||||
@@ -3296,6 +3454,7 @@
|
||||
"select an axis": "יש לבחור ציר",
|
||||
"select an axis, a straight or circular edge, or a cylinder, cone or torus face first": "יש לבחור תחילה ציר, מקצוע ישר או מעגלי, או פאה של גליל, חרוט או טורוס",
|
||||
"select bodies first": "יש לבחור גופים תחילה",
|
||||
"select components first": "יש לבחור רכיבים תחילה",
|
||||
"select corner points, or the two lines of one corner": "יש לבחור נקודות פינה, או את שני הקווים של פינה אחת",
|
||||
"select one corner point, or the two lines of one corner": "יש לבחור נקודת פינה אחת, או את שני הקווים של פינה אחת",
|
||||
"select sheet edges first": "יש לבחור תחילה מקצועות של הפח",
|
||||
@@ -3314,6 +3473,7 @@
|
||||
"settings.double_click_components": "לחיצה כפולה על רכיב מפעילה אותו, או עורכת רכיב מקושר במקומו",
|
||||
"settings.frame_rate_details_note": "מוסיף גרף של זמני התמונות האחרונות עם המשולשים שצוירו מעליו, היסטוגרמה של זמני התמונות ואת מה שה־GPU צייר. לחיצה על קצב התמונות בתצוגה מציגה או מסתירה אותם.",
|
||||
"settings.frame_rate_note": "הצגת מספר הפריימים לשנייה בפינה הימנית התחתונה של התצוגה. כל עוד האפשרות פעילה, התצוגה מצוירת מחדש ברציפות.",
|
||||
"settings.insert_lists_open_designs": "הוספת תכן מציגה קודם את התכנים הפתוחים בלשוניות אחרות",
|
||||
"settings.measure_axis_distances": "הצגת מרחקי X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "הצגת המרחקים לאורך צירי העולם לצד המרחק הכולל כשכלי המדידה פתוח.",
|
||||
"settings.msaa_applies_on_restart": "החלקת הקצוות תחול בהפעלה הבאה של SolidCraft",
|
||||
@@ -3332,12 +3492,34 @@
|
||||
"sheet.flange_type_contour": "מתאר",
|
||||
"sheet.flange_type_edge": "מקצוע",
|
||||
"sheet.no_body": "אין גוף פח: יש להתחיל אחד עם אוגן > בסיס, או להמיר לוח לפח עם המרה לפח (יש לבחור את הפאה השטוחה הגדולה שלו)",
|
||||
"sheet.personal_rules.confirm_delete": "אישור מחיקה",
|
||||
"sheet.personal_rules.delete": "מחיקה",
|
||||
"sheet.personal_rules.delete_prompt": "למחוק את הכלל האישי הזה? כללים שכבר נמצאים בתכנים לא ישתנו.",
|
||||
"sheet.personal_rules.full": "הספרייה האישית כבר מכילה 64 כללים.",
|
||||
"sheet.personal_rules.invalid_name": "יש להזין שם קצר ללא מעברי שורה או תווי בקרה.",
|
||||
"sheet.personal_rules.invalid_values": "יש להשלים את ערכי הכלל: כל ערך צריך להיות ניתן לחישוב בתכן זה, עם עובי חיובי ומקדם K בין 0 ל־1.",
|
||||
"sheet.personal_rules.missing": "הכלל האישי שנבחר כבר אינו זמין.",
|
||||
"sheet.personal_rules.name": "שם הכלל",
|
||||
"sheet.personal_rules.name_exists": "כבר קיים כלל אישי בשם הזה. יש להשתמש בשם אחר.",
|
||||
"sheet.personal_rules.name_hint": "שם ייחודי",
|
||||
"sheet.personal_rules.overwrite": "שמירת השינויים בכלל האישי שנבחר",
|
||||
"sheet.personal_rules.rename": "שינוי שם",
|
||||
"sheet.personal_rules.rule": "כלל אישי",
|
||||
"sheet.personal_rules.save": "שמירה כחדש",
|
||||
"sheet.personal_rules.scope": "נשמרים בפרופיל שלך לכל התכנים.",
|
||||
"sheet.personal_rules.select": "בחירת כלל",
|
||||
"sheet.personal_rules.title": "כללים אישיים",
|
||||
"sheet.personal_rules.unsupported": "לכלל הזה יש ערכים שהגרסה הזו אינה יכולה להשתמש בהם.",
|
||||
"shortcut.json_error": "הפרמטרים חייבים להיות JSON: {error}",
|
||||
"shortcut.no_command": "אין פקודה `{id}`; הטקסט שלפני ה־JSON חייב להיות מזהה פקודה",
|
||||
"shortcut.pin": "הצמדה לראש תיבת S",
|
||||
"shortcut.unpin": "ביטול הצמדה",
|
||||
"sketch is missing": "הסקיצה חסרה",
|
||||
"sketch.degrees_of_freedom": "{count} דרגות חופש",
|
||||
"sketch.dimension_added_driven": "הסקיצה כבר קובעת את המידה הזו, ולכן היא נוספה כמידה מונעת (מידת ייחוס)",
|
||||
"sketch.dimension_applied": "המידה הוחלה",
|
||||
"sketch.dimension_applied_defined": "המידה הוחלה; הפרמטר `{name}` הוגדר",
|
||||
"sketch.dimension_applied_renamed": "המידה הוחלה; שם הפרמטר הוא כעת `{name}`",
|
||||
"sketch.dof_left": "נותרו {count} דרגות חופש",
|
||||
"sketch.dof_left_one": "נותרה {count} דרגת חופש",
|
||||
"sketch.draw_curves": "שרטוט כ־{linetype}",
|
||||
@@ -3364,6 +3546,7 @@
|
||||
"sketch_text.align_right": "ימין",
|
||||
"sketch_text.bold": "מודגש",
|
||||
"sketch_text.builtin_font": "{family} (מובנה)",
|
||||
"sketch_text.formula": "התחילו ב־= כדי לבנות את הטקסט מפרמטרים: ='W' + number(Width)",
|
||||
"sketch_text.italic": "נטוי",
|
||||
"sketch_text.loading_fonts": "מחפש גופנים מותקנים…",
|
||||
"sketch_text.on_path": "הטקסט עוקב אחר המסלול שלו: העקומה קובעת את מיקומו",
|
||||
@@ -3372,6 +3555,8 @@
|
||||
"sketch_text.use_font_file": "שימוש בקובץ הגופן {path}",
|
||||
"solid": "מוצק",
|
||||
"status.editing": "עריכת {name}",
|
||||
"status.navigation": "מיפוי העכבר: {mapping}",
|
||||
"status.navigation_tip": "איך העכבר מזיז את התצוגה. לחצו כדי לבחור מיפוי אחר",
|
||||
"status.under_constrained": "אילוצים חסרים ({count} דרגות חופש)",
|
||||
"status.under_constrained_one": "אילוצים חסרים (דרגת חופש {count})",
|
||||
"status.units_tip": "יחידות התכנון. לחצו כדי לשנות אותן",
|
||||
@@ -3405,8 +3590,10 @@
|
||||
"timeline.delete_folders_tip": "שמירת הפיצ'רים והתיקיות המקוננות שלהן בציר הזמן",
|
||||
"timeline.delete_folders_with_features_tip": "מחיקת התיקיות עם כל הפיצ'רים שבהן והתיקיות המקוננות בהן",
|
||||
"timeline.delete_many": "מחיקת {count} הפיצ'רים שנבחרו",
|
||||
"timeline.edited_rolled_back": "{name} שונה, אך הוא אחרי סמן ההיסטוריה ולכן לא נבנה: הזיזו את הסמן אל מעבר אליו כדי לראות את התוצאה",
|
||||
"timeline.feature_error": "שגיאה: {message}",
|
||||
"timeline.feature_hint": "לחיצה כפולה לעריכה · גרירה לשינוי הסדר · לחיצה ימנית לעוד",
|
||||
"timeline.feature_rolled_back": "בוטל: אחרי סמן ההיסטוריה, ולכן לא נבנה",
|
||||
"timeline.feature_warning": "אזהרה: {message}",
|
||||
"timeline.group": "תיקיית פיצ'רים חדשה",
|
||||
"timeline.move_many": "הזזת פריטים בציר הזמן",
|
||||
@@ -3488,6 +3675,10 @@
|
||||
"ui.3d_mouse_offer": "כיול העכבר התלת־ממדי מתקן צירים מוחלפים או הפוכים וקובע את המהירות והתחושה שלו.",
|
||||
"ui.3d_mouse_offer_never": "לא להציג שוב",
|
||||
"ui.3d_mouse_offer_swap": "מעבר ל־Hidraw (מנהל ישיר)",
|
||||
"ui.3d_mouse_orbit": "סיבוב",
|
||||
"ui.3d_mouse_orbit_classic": "קלאסי",
|
||||
"ui.3d_mouse_orbit_tip": "במעקב: העכבר התלת־ממדי מסובב את המבט סביב החלק של המודל שבמרכז המבט כשהסיבוב מתחיל, ומסמן אותו בכדור חיוור. קלאסי: סביב מרכז המבט",
|
||||
"ui.3d_mouse_orbit_traced": "במעקב",
|
||||
"ui.3d_mouse_reading": "קריאה",
|
||||
"ui.3d_mouse_reset_axes": "איפוס הקצאת הצירים",
|
||||
"ui.3d_mouse_reset_view": "איפוס המבט",
|
||||
@@ -3496,6 +3687,8 @@
|
||||
"ui.3d_mouse_section": "עכבר תלת־ממדי",
|
||||
"ui.3d_mouse_show_in_view": "הצגת העכבר התלת־ממדי בתצוגה התלת־ממדית",
|
||||
"ui.3d_mouse_show_in_view_tip": "תמונה של העכבר התלת־ממדי בפינה השמאלית התחתונה, שזזה כשמזיזים אותו.",
|
||||
"ui.3d_mouse_sketch_orbit": "סיבוב סקיצות בעכבר התלת־ממדי",
|
||||
"ui.3d_mouse_sketch_orbit_tip": "העכבר התלת־ממדי מסובב את התצוגה גם כשסקיצה פתוחה ונראית חזיתית, כמו שהעכבר יכול. כבוי: הוא מזיז ומגדיל את הסקיצה עד שתטה את התצוגה.",
|
||||
"ui.3d_mouse_skip": "ההתקן שלי לא יכול לעשות את זה",
|
||||
"ui.3d_mouse_skip_tip": "מדלג על התנועה הזאת בשני הכיוונים, והכיול משמיט אותה.",
|
||||
"ui.3d_mouse_speed": "מהירות עכבר תלת־ממדי",
|
||||
@@ -3524,6 +3717,8 @@
|
||||
"ui.3d_mouse_step_twist_counterclockwise": "יש לסובב את הכיפה נגד כיוון השעון, להחזיק ואז לשחרר.",
|
||||
"ui.3d_mouse_switch_cap": "כיול כהתקן חזרה למרכז",
|
||||
"ui.3d_mouse_switch_trackball": "כיול ככדור עקיבה",
|
||||
"ui.3d_mouse_use_direct": "שימוש במנהל ישיר",
|
||||
"ui.3d_mouse_use_direct_tip": "קריאת העכבר התלת־ממדי ישירות (hidraw) במקום דרך spacenavd.",
|
||||
"ui.3d_mouse_view_axis": "ציר מבט",
|
||||
"ui.3d_mouse_view_off": "כבוי",
|
||||
"ui.3d_mouse_view_off_tip": "הפרופיל של מנהל ההתקן לעכבר התלת־ממדי מכבה את הציר הזה, ולכן התנועה שלו לא מזיזה את המבט. בחירה כאן בתנועה של ציר אחר מחליפה בין השניים, והתנועה ההיא מפסיקה להזיז את המבט.",
|
||||
@@ -3657,6 +3852,8 @@
|
||||
"ui.agent_chat_remove": "הסרה מהתור",
|
||||
"ui.agent_chat_remove_file": "הסרה מההודעה הזו",
|
||||
"ui.agent_chat_remove_imported": "הסרה מההודעה הזו; החלק נשאר בתכן (ביטול מסיר אותו)",
|
||||
"ui.agent_chat_reply_cut_off": "התשובה הגיעה למגבלת האורך שלה לפני שהסתיימה, ולכן ייתכן שהיא חלקית. יש לבקש מהסוכן להמשיך, או לענות בקצרה יותר.",
|
||||
"ui.agent_chat_reply_declined": "המודל סירב לענות על ההודעה הזו.",
|
||||
"ui.agent_chat_retry": "ניסיון חוזר",
|
||||
"ui.agent_chat_right": "ימין",
|
||||
"ui.agent_chat_save": "שמירה",
|
||||
@@ -3840,6 +4037,7 @@
|
||||
"ui.circle": "מעגל",
|
||||
"ui.circular_pattern": "מערך מעגלי",
|
||||
"ui.clear": "ניקוי",
|
||||
"ui.clear_print_face": "נקה פאת הדפסה",
|
||||
"ui.clear_recent": "ניקוי האחרונים",
|
||||
"ui.clear_the_selection": "ניקוי הבחירה",
|
||||
"ui.click_selects_whole_bodies": "לחיצה בוחרת גופים שלמים",
|
||||
@@ -3874,6 +4072,15 @@
|
||||
"ui.constant": "קבוע",
|
||||
"ui.constraints_conflict": "התנגשות בין אילוצים",
|
||||
"ui.construction": "עזר",
|
||||
"ui.construction.angle_hint": "ישר עזר: בחירת נקודה ואז הקלדת זווית או בחירת כיוון",
|
||||
"ui.construction.bisector_hint": "חוצה זווית: בחירת שני ישרים נחתכים ואז הפתרון הרצוי",
|
||||
"ui.construction.common_hint": "משיק משותף: בחירת שני מעגלים/קשתות ואז הפתרון הרצוי",
|
||||
"ui.construction.contact_hint": "משיק: בחירת מעגל/קשת או ספליין/חתך חרוט פתוח ואז נקודת השקה (לעקומות חופשיות: קצוות בלבד)",
|
||||
"ui.construction.external_hint": "משיק: בחירת מעגל או קשת, נקודה חיצונית ואז הפתרון הרצוי",
|
||||
"ui.construction.free_hint": "ישר עזר: לחיצה על שתי נקודות; לחיצה ימנית להתחלה מחדש",
|
||||
"ui.construction.point_hint": "ישר עזר: לחיצה על נקודת המעבר",
|
||||
"ui.construction.reference_hint": "ישר עזר: בחירת ישר ואז נקודה; לחיצה ימנית להחלפת הייחוס",
|
||||
"ui.construction.ribbon_label": "קווי עזר",
|
||||
"ui.context_menu": "תפריט הקשר",
|
||||
"ui.continuity_g0": "G0 שבר",
|
||||
"ui.continuity_g1": "G1 משיק",
|
||||
@@ -3965,6 +4172,14 @@
|
||||
"ui.end_scale": "קנה מידה בסיום",
|
||||
"ui.entities": "ישויות",
|
||||
"ui.equal": "שווה",
|
||||
"ui.equation_end": "סוף",
|
||||
"ui.equation_explicit": "מפורשת",
|
||||
"ui.equation_form": "צורה",
|
||||
"ui.equation_note": "המשתנה הוא מספר ללא יחידה: sin(t) מקבלת אותו ברדיאנים. תוצאה ללא יחידה היא ביחידה של התכנון.",
|
||||
"ui.equation_parametric": "פרמטרית",
|
||||
"ui.equation_x_of_t": "x(t)",
|
||||
"ui.equation_y_of_t": "y(t)",
|
||||
"ui.equation_y_of_x": "y(x)",
|
||||
"ui.equivalent_radius": "רדיוס שקול",
|
||||
"ui.expand": "הרחבה",
|
||||
"ui.exportDxf": "ייצוא DXF…",
|
||||
@@ -4030,6 +4245,7 @@
|
||||
"ui.heading_design": "תכן",
|
||||
"ui.heading_draft": "שיפוע יציקה",
|
||||
"ui.heading_edit": "עריכה",
|
||||
"ui.heading_equation_curve": "עקומת משוואה",
|
||||
"ui.heading_extrude": "שליפה",
|
||||
"ui.heading_fillet": "עיגול פינה",
|
||||
"ui.heading_finish_editing": "סיום עריכה",
|
||||
@@ -4121,6 +4337,10 @@
|
||||
"ui.import_ellipsis": "ייבוא…",
|
||||
"ui.infinite": "אינסופי",
|
||||
"ui.insert": "הוספה",
|
||||
"ui.insert_design.browse": "עיון…",
|
||||
"ui.insert_design.open_designs": "תכנים פתוחים",
|
||||
"ui.insert_design.saved_file": "ב-{name} יש שינויים שלא נשמרו, ולכן נוסף הקובץ השמור שלו. שמרו אותו ואז בחרו עדכון קישורים כדי להכניס את השינויים.",
|
||||
"ui.insert_design.unsaved": "שינויים שלא נשמרו",
|
||||
"ui.inspect": "בדיקה",
|
||||
"ui.intersect": "חיתוך משותף",
|
||||
"ui.isolate": "בידוד",
|
||||
@@ -4220,6 +4440,7 @@
|
||||
"ui.pan_zoom_orbit": "הזזה, זום, סיבוב מבט",
|
||||
"ui.parallel": "מקביל",
|
||||
"ui.parameters": "פרמטרים",
|
||||
"ui.part_size_needs_a_part": "בחרו חלק סטנדרטי שהוכנס (בורג, אום, דסקית או פין) כדי לשנות את גודלו. כדי להגדיל או להקטין גוף, השתמשו בשינוי קנה מידה.",
|
||||
"ui.part_size_shared": "בונה מחדש את החלק ומחליף פיצ'רים שנוספו. כל המופעים של רכיב זה מתעדכנים.",
|
||||
"ui.paste": "הדבקה",
|
||||
"ui.path": "מסלול",
|
||||
@@ -4249,12 +4470,17 @@
|
||||
"ui.plugins_skipped": "לא ניתן היה לקרוא {count} תיקיות.",
|
||||
"ui.plugins_version": "{version}",
|
||||
"ui.point": "נקודה",
|
||||
"ui.point_cloud_add_filter": "הוספת מסנן…",
|
||||
"ui.point_cloud_auto_range": "טווח אוטומטי",
|
||||
"ui.point_cloud_color_by": "צביעה לפי",
|
||||
"ui.point_cloud_file_colors": "צבעי הקובץ",
|
||||
"ui.point_cloud_filter_by": "סינון לפי",
|
||||
"ui.point_cloud_height_high": "הגובה המרבי",
|
||||
"ui.point_cloud_height_low": "הגובה המזערי",
|
||||
"ui.point_cloud_legend_filter": "מוצגים ומוסתרים במקרא שלמעלה",
|
||||
"ui.point_cloud_no_file_colors": "אין בקובץ צבעים",
|
||||
"ui.point_cloud_pause": "השהיה",
|
||||
"ui.point_cloud_play": "הפעלה",
|
||||
"ui.point_cloud_single_color": "צבע אחיד",
|
||||
"ui.point_cloud_size": "גודל נקודה",
|
||||
"ui.point_cloud_units": "יחידות הקובץ",
|
||||
@@ -4263,12 +4489,29 @@
|
||||
"ui.polygon": "מצולע",
|
||||
"ui.preferences": "העדפות",
|
||||
"ui.press_a_key": "יש ללחוץ על מקש…",
|
||||
"ui.print_face_cleared": "{body}: פאת ההדפסה נוקתה",
|
||||
"ui.print_face_input": "פאת הדפסה",
|
||||
"ui.print_face_one_body": "פאת הדפסה נבחרת לגוף אחד: שלח את הגוף הזה לבדו כדי לשנות אותה",
|
||||
"ui.print_face_pick": "בחר פאה שטוחה אחת של גוף מוצק כדי להפוך אותה לפאת ההדפסה",
|
||||
"ui.print_face_set": "{body}: פאת ההדפסה הוגדרה; שליחה לסלייסר מניחה את הגוף עליה",
|
||||
"ui.profile": "פרופיל",
|
||||
"ui.profile_plane": "מישור הפרופיל",
|
||||
"ui.profiles": "פרופילים",
|
||||
"ui.project": "הטלה",
|
||||
"ui.project_face_edges_sketch": "הטלת מקצועות הפאה לסקיצות חדשות",
|
||||
"ui.properties": "מאפיינים",
|
||||
"ui.properties.copy_matrix": "העתקת המטריצה",
|
||||
"ui.properties.first_moments": "מומנטים ראשונים",
|
||||
"ui.properties.inertia": "מומנט התמד",
|
||||
"ui.properties.inertia_note": "סביב מרכז מסה, בצירי העולם (g·{unit}²)",
|
||||
"ui.properties.inertia_unavailable": "לא זמין: הרשת של אחד הגופים אינה סגורה.",
|
||||
"ui.properties.inertia_x": "Ixx, Ixy, Ixz",
|
||||
"ui.properties.inertia_y": "Iyx, Iyy, Iyz",
|
||||
"ui.properties.inertia_z": "Izx, Izy, Izz",
|
||||
"ui.properties.measuring": "מודד…",
|
||||
"ui.properties.measuring_failed": "המדידה נעצרה לפני שהסתיימה.",
|
||||
"ui.properties.principal_axis": "ציר ראשי {number}",
|
||||
"ui.properties.principal_moments": "מומנטים ראשיים",
|
||||
"ui.pull_direction": "כיוון משיכה",
|
||||
"ui.quality": "איכות",
|
||||
"ui.quantity": "כמות",
|
||||
@@ -4314,6 +4557,7 @@
|
||||
"ui.revolve": "סיבוב",
|
||||
"ui.ribbon_exit": "יציאה",
|
||||
"ui.ribbon_labels": "הצגת טקסט מתחת לסמלי רצועת הכלים",
|
||||
"ui.ribbon_menus_skip_pinned": "השמטת פקודות מוצמדות מהתפריטים הנפתחים",
|
||||
"ui.ribbon_pin_footer": "פקודות מוצמדות מוצגות ברצועת הכלים. יש לרחף מעל שורה כדי להצמיד אותה או לבטל את הצמדתה.",
|
||||
"ui.ribbon_workspace": "סביבת עבודה",
|
||||
"ui.right": "ימין",
|
||||
@@ -4331,6 +4575,8 @@
|
||||
"ui.select": "בחירה",
|
||||
"ui.selectOther": "בחירת אחר…",
|
||||
"ui.selectTangentChain": "בחירת שרשרת משיקה",
|
||||
"ui.select_all": "בחירת הכול",
|
||||
"ui.select_components_by_face": "בחירת רכיבים (בחירת פאה בוחרת את הרכיב שלה)",
|
||||
"ui.selection": "בחירה",
|
||||
"ui.selection_modifiers": "מקשי שינוי לבחירה",
|
||||
"ui.selection_shift_add_only": "Shift+לחיצה מוסיף בלי להסיר",
|
||||
@@ -4367,7 +4613,16 @@
|
||||
"ui.sketch": "סקיצה",
|
||||
"ui.sketch_dimension": "מידת סקיצה",
|
||||
"ui.sketch_grid": "רשת הסקיצה",
|
||||
"ui.sketch_intersect_geometry": "גאומטריה",
|
||||
"ui.sketch_intersect_projection_link": "קישור הטלה",
|
||||
"ui.sketch_intersect_selection_filter": "מסנן בחירה",
|
||||
"ui.sketch_modifiers": "מקשי שינוי בסקיצה",
|
||||
"ui.sketch_project_geometry": "גאומטריה",
|
||||
"ui.sketch_report.all_constrained": "הכול מאולץ במלואו.",
|
||||
"ui.sketch_report.dof": "דרגות חופש",
|
||||
"ui.sketch_report.loose": "לא מאולץ במלואו",
|
||||
"ui.sketch_report.status": "מצב",
|
||||
"ui.sketch_report.title": "דוח סקיצה",
|
||||
"ui.sketch_scale": "קנה מידה של סקיצה",
|
||||
"ui.sketches": "סקיצות",
|
||||
"ui.slice": "חתך",
|
||||
@@ -4414,6 +4669,11 @@
|
||||
"ui.symmetric": "סימטרי",
|
||||
"ui.symmetry": "סימטריה",
|
||||
"ui.system": "מערכת",
|
||||
"ui.tab_assemble": "הרכבה",
|
||||
"ui.tab_manage": "ניהול",
|
||||
"ui.tab_sheet_metal": "פח",
|
||||
"ui.tab_view": "תצוגה",
|
||||
"ui.tab_weldments": "ריתוכים",
|
||||
"ui.tangent": "משיק",
|
||||
"ui.taper_angle": "זווית שיפוע",
|
||||
"ui.tapped": "מוברג",
|
||||
@@ -4429,6 +4689,7 @@
|
||||
"ui.tip_angle": "זווית חוד",
|
||||
"ui.to_object": "עד אובייקט",
|
||||
"ui.tool_direction": "כיוון הכלי",
|
||||
"ui.toolbar_tabs_hidden": "כל לשוניות סרגל הכלים מוסתרות. לחצו על + או לחצו כאן לחיצה ימנית כדי להציג לשונית.",
|
||||
"ui.top": "עליון",
|
||||
"ui.top_diameter": "קוטר עליון",
|
||||
"ui.top_radius": "רדיוס עליון",
|
||||
@@ -4466,15 +4727,25 @@
|
||||
"ui.view_centre": "מרכז המבט",
|
||||
"ui.viewport_status_clear": "כיבוי {name}",
|
||||
"ui.viewport_status_clear_hint": "כיבוי {name} · Esc",
|
||||
"ui.viewport_status_edges": "{count} קצוות",
|
||||
"ui.viewport_status_from": "מכיוון {direction}",
|
||||
"ui.viewport_status_key": "הצגת מקרא עבור {name}",
|
||||
"ui.viewport_status_minimum_radius": "רדיוס מינימלי",
|
||||
"ui.viewport_status_pairs": "{count} זוגות",
|
||||
"ui.viewport_status_section_hatch": "{setting} · קווקוו",
|
||||
"ui.viewport_status_section_plane": "המישור הנוכחי",
|
||||
"ui.viewport_status_section_tilted": "נטוי · {offset}",
|
||||
"ui.viewport_status_stripes": "{count} פסים",
|
||||
"ui.viewport_status_summary_clear": "כיבוי הכול",
|
||||
"ui.viewport_status_summary_heading": "בתצוגה זו",
|
||||
"ui.viewport_status_summary_label": "{name} ועוד {count} פריטים",
|
||||
"ui.viewport_status_summary_more": "+{count}",
|
||||
"ui.viewport_theme_follow": "לפי ערכת הנושא",
|
||||
"ui.visual_shaded_hidden_edges": "מוצלל עם מקצועות נסתרים",
|
||||
"ui.visual_shaded_with_edges": "מוצלל עם מקצועות",
|
||||
"ui.visual_style": "סגנון תצוגה",
|
||||
"ui.visual_wireframe": "מסגרת תיל",
|
||||
"ui.wheel_zoom_speed": "מהירות זום בגלגלת העכבר",
|
||||
"ui.width": "רוחב",
|
||||
"ui.window_system": "מערכת חלונות",
|
||||
"ui.window_system_auto": "אוטומטי",
|
||||
@@ -4505,7 +4776,9 @@
|
||||
"update.button": "עדכון",
|
||||
"update.button_version": "עדכון ל־{version}",
|
||||
"update.check_automatically": "בדיקת עדכונים אוטומטית",
|
||||
"update.check_for_updates": "בדיקת עדכונים",
|
||||
"update.check_now": "בדיקה עכשיו",
|
||||
"update.check_unavailable": "בדיקת עדכונים אינה זמינה עבור התקנה זו.",
|
||||
"update.checking": "בבדיקה…",
|
||||
"update.copy": "העתקה",
|
||||
"update.dmg_opened": "תמונת הדיסק פתוחה ואומתה: יש לגרור את SolidCraft לתיקיית היישומים במקום העותק הישן, ואז להפעיל מחדש את SolidCraft.",
|
||||
@@ -4528,6 +4801,9 @@
|
||||
"update.prefs_managed": "זהו SolidCraft {version}, בניהול {manager}. הבדיקה שואלת את GitHub מהי הגרסה האחרונה ולא שולחת דבר נוסף; עדכנו את SolidCraft ב-{manager}.",
|
||||
"update.prefs_note": "זהו SolidCraft {version} ({kind}). הבדיקה שואלת את GitHub מהי הגרסה האחרונה ואינה שולחת שום דבר אחר.",
|
||||
"update.prefs_web": "יש לטעון מחדש את הדף כדי לקבל את גרסת אפליקציית הרשת העדכנית. אם אין רשת או שהעדכון לא מסיים לרדת בזמן, תיפתח במקומה הגרסה השמורה; הורדה שבתהליך ממשיכה לטעינה הבאה.",
|
||||
"update.refresh_checking": "בודק אם יש גרסה חדשה יותר…",
|
||||
"update.refresh_fallback": "לא ניתן היה לבדוק אם יש גרסה חדשה יותר; מעדכן לגרסה {version} שנמצאה קודם.",
|
||||
"update.refresh_selected": "מעדכן לגרסה {version}.",
|
||||
"update.release_page": "פתיחת דף הגרסה",
|
||||
"update.restart": "הפעלה מחדש עכשיו",
|
||||
"update.restart_later": "מאוחר יותר",
|
||||
|
||||
@@ -206,6 +206,7 @@
|
||||
"Edges": "Bridovi",
|
||||
"Edit": "Uredi",
|
||||
"Edit Profile Sketch": "Uredi skicu profila",
|
||||
"Edit shortcuts": "Uredi prečace",
|
||||
"Enable rule": "Omogući pravilo",
|
||||
"Enabled": "Omogućeno",
|
||||
"End Radius": "Krajnji polumjer",
|
||||
@@ -468,6 +469,7 @@
|
||||
"Radius": "Polumjer",
|
||||
"Radius Fit": "Uklapanje polumjera",
|
||||
"Ratio": "Omjer",
|
||||
"Read-only list: shortcuts can't be changed here.": "Popis samo za čitanje: prečaci se ovdje ne mogu mijenjati.",
|
||||
"Reattach selected face": "Ponovno pričvrsti odabrano lice",
|
||||
"Recover": "Oporavi",
|
||||
"Recover unsaved design?": "Oporaviti nespremljeni dizajn?",
|
||||
@@ -652,6 +654,7 @@
|
||||
"Third point": "Treća točka",
|
||||
"This child is shared. Deleting it removes it from every copy of its parent.": "Ovaj podređeni element je dijeljen. Brisanjem se uklanja iz svake kopije njegova roditelja.",
|
||||
"This child is shared. Position changes apply to every copy of its parent.": "Ovaj podređeni element je dijeljen. Promjene položaja primjenjuju se na svaku kopiju njegova roditelja.",
|
||||
"This component is inside a subassembly placed more than once: aligning it moves it in every placement.": "Ova se komponenta nalazi unutar podsklopa postavljenog više puta: njezino poravnavanje pomiče je u svakom postavljanju.",
|
||||
"This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "Ovo lice ne može dati trajno pričvršćenje. Odaberite drugo lice ili izričito upotrijebite fiksnu ravninu.",
|
||||
"This image is not attached to GitHub yet. Copy or save it, then attach it on GitHub.": "Ova slika još nije priložena na GitHubu. Kopirajte je ili spremite, a zatim je priložite na GitHubu.",
|
||||
"Thread depth": "Dubina navoja",
|
||||
@@ -772,6 +775,8 @@
|
||||
"at the face": "na licu",
|
||||
"bom.group_children": "Podređeni dijelovi u retku svojeg dijela",
|
||||
"browser.body_name": "Tijelo{number}",
|
||||
"browser.calibrate_click_a": "Kliknite sliku kako biste zadali točku A ili upišite njezine koordinate.",
|
||||
"browser.calibrate_click_b": "Kliknite sliku kako biste zadali točku B ili upišite njezine koordinate.",
|
||||
"browser.calibrate_title": "Kalibriraj: {name}",
|
||||
"browser.capture_many": "Pomaknute komponente bez zabilježenog položaja: {count}.",
|
||||
"browser.capture_note": "Zabilježi zadržava novi položaj; Vrati ga vraća nazad.",
|
||||
@@ -793,6 +798,11 @@
|
||||
"cam.roller": "Valjak",
|
||||
"cam.roller_pick": "Valjak (neobavezno)",
|
||||
"cam.tip_pick": "Vrh (neobavezno)",
|
||||
"camera.shot_pitch": "Nagib",
|
||||
"camera.shot_roll": "Valjanje",
|
||||
"camera.shot_yaw": "Skretanje",
|
||||
"canvas.decal_place_hint": "Kliknite lice kako biste postavili naljepnicu",
|
||||
"canvas.place_hint": "Kliknite ravninu ili lice kako biste postavili platno",
|
||||
"choose a profile": "odaberite profil",
|
||||
"choose the cam's and the follower's joints": "odaberite spojeve brijega i sljedbenika",
|
||||
"choose the joints to couple": "odaberite spojeve koje treba povezati",
|
||||
@@ -800,12 +810,16 @@
|
||||
"click sketch curves": "kliknite krivulje skice",
|
||||
"cmd.appearance_assign": "Izgled",
|
||||
"cmd.appearance_chain": "Lanac izgleda",
|
||||
"cmd.appearance_copy": "Kopiraj izgled",
|
||||
"cmd.appearance_favorite": "Omiljeni izgled",
|
||||
"cmd.appearance_library": "Biblioteka izgleda",
|
||||
"cmd.appearance_list": "Popis izgleda",
|
||||
"cmd.appearance_paint": "Oboji izgledom",
|
||||
"cmd.appearance_paste": "Zalijepi izgled",
|
||||
"cmd.appearance_pick_up": "Preuzmi izgled",
|
||||
"cmd.appearance_replace": "Zamijeni izgled",
|
||||
"cmd.assembly_bom": "Sastavnica",
|
||||
"cmd.body.print_face": "Ploha ispisa",
|
||||
"cmd.body_rename": "Preimenuj tijelo",
|
||||
"cmd.browser_collapse_all": "Sažmi sve",
|
||||
"cmd.browser_expand_all": "Proširi sve",
|
||||
@@ -813,6 +827,7 @@
|
||||
"cmd.browser_move": "Premjesti stavke stabla modela",
|
||||
"cmd.browser_order": "Poredaj stavke stabla modela",
|
||||
"cmd.browser_rename_group": "Preimenuj grupu",
|
||||
"cmd.browser_reparent": "Premjesti u komponentu",
|
||||
"cmd.browser_ungroup": "Razgrupiraj",
|
||||
"cmd.browser_visibility": "Prikaži/sakrij",
|
||||
"cmd.canvas_calibrate": "Kalibriraj platno",
|
||||
@@ -839,7 +854,9 @@
|
||||
"cmd.component_metadata": "Svojstva dijela",
|
||||
"cmd.component_metadata_set": "Promijeni svojstva dijela",
|
||||
"cmd.component_move_bodies": "Premjesti tijela u komponentu",
|
||||
"cmd.component_move_features": "Premjesti značajke u komponentu",
|
||||
"cmd.component_move_sketches": "Premjesti skice u komponentu",
|
||||
"cmd.component_paste_from_design": "Zalijepi iz drugog dizajna",
|
||||
"cmd.component_paste_new": "Zalijepi kao novo",
|
||||
"cmd.component_properties": "Fizička svojstva komponente",
|
||||
"cmd.component_relink": "Ponovno poveži izvor",
|
||||
@@ -976,6 +993,7 @@
|
||||
"cmd.motion_trace": "Trag kretanja",
|
||||
"cmd.motion_trace_edit": "Uredi trag kretanja",
|
||||
"cmd.motion_trace_keep": "Zadrži trag kretanja",
|
||||
"cmd.occurrence_align": "Poravnaj primjerak",
|
||||
"cmd.occurrence_copy": "Zalijepi (primjerak)",
|
||||
"cmd.occurrence_drag": "Povuci primjerak",
|
||||
"cmd.occurrence_ground": "Učvrsti",
|
||||
@@ -1033,11 +1051,17 @@
|
||||
"cmd.render_library_surface_unbind": "Ukloni vezu površine",
|
||||
"cmd.render_library_targets": "Pronađi ciljeve biblioteke renderiranja",
|
||||
"cmd.render_lights_add": "Dodaj svjetlo",
|
||||
"cmd.render_lights_duplicate": "Dupliciraj svjetlo renderiranja",
|
||||
"cmd.render_lights_list": "Popis svjetala renderiranja",
|
||||
"cmd.render_lights_mute": "Isključi svjetlo",
|
||||
"cmd.render_lights_remove": "Ukloni svjetlo renderiranja",
|
||||
"cmd.render_lights_set": "Postavi svjetlo renderiranja",
|
||||
"cmd.render_lights_solo": "Samo ovo svjetlo",
|
||||
"cmd.render_optics_bind": "Spremi optičku vezu",
|
||||
"cmd.render_optics_unbind": "Ukloni optičku vezu",
|
||||
"cmd.render_output_size": "Postavi veličinu izlaza renderiranja",
|
||||
"cmd.render_preflight": "Provjeri zahtjev za renderiranje",
|
||||
"cmd.render_preflight_copy": "Kopiraj izvješće provjere renderiranja",
|
||||
"cmd.render_preset_apply": "Primijeni izvorni studio",
|
||||
"cmd.render_preset_resolve": "Pregledaj izvorni studio",
|
||||
"cmd.render_quality_prepare": "Pregledaj fiksni proračun uzorkovanja",
|
||||
@@ -1060,6 +1084,13 @@
|
||||
"cmd.render_start": "Renderiraj sliku",
|
||||
"cmd.render_status": "Napredak renderiranja",
|
||||
"cmd.select_clear": "Poništi odabir",
|
||||
"cmd.settings_profile_apply": "Primijeni profil postavki",
|
||||
"cmd.settings_profile_delete": "Izbriši profil postavki",
|
||||
"cmd.settings_profile_export": "Izvezi profil postavki",
|
||||
"cmd.settings_profile_import": "Uvezi profil postavki",
|
||||
"cmd.settings_profile_list": "Profili postavki",
|
||||
"cmd.settings_profile_rename": "Preimenuj profil postavki",
|
||||
"cmd.settings_profile_save": "Spremi profil postavki",
|
||||
"cmd.sheet_convert": "Pretvori u lim",
|
||||
"cmd.sheet_export_bend_table": "Izvezi tablicu savijanja",
|
||||
"cmd.sheet_export_dxf": "Izvezi razvijeni oblik kao DXF",
|
||||
@@ -1073,6 +1104,16 @@
|
||||
"cmd.sheet_refold": "Ponovno presavij",
|
||||
"cmd.sheet_rules": "Popis pravila za lim",
|
||||
"cmd.sheet_unfold": "Razvij",
|
||||
"cmd.sketch.construction_line": "Pomoćni pravac",
|
||||
"cmd.sketch.construction_line.angle": "Pomoćni pravac pod kutom",
|
||||
"cmd.sketch.construction_line.bisector": "Simetrala kuta",
|
||||
"cmd.sketch.construction_line.horizontal": "Vodoravni pomoćni pravac",
|
||||
"cmd.sketch.construction_line.parallel": "Paralelni pomoćni pravac",
|
||||
"cmd.sketch.construction_line.perpendicular": "Pomoćni pravac okomit na pravac",
|
||||
"cmd.sketch.construction_line.tangent_at": "Tangenta u točki krivulje",
|
||||
"cmd.sketch.construction_line.tangent_external": "Tangenta kroz vanjsku točku",
|
||||
"cmd.sketch.construction_line.tangent_two": "Zajednička tangenta",
|
||||
"cmd.sketch.construction_line.vertical": "Okomiti pomoćni pravac",
|
||||
"cmd.sketch_arc3d": "3D luk",
|
||||
"cmd.sketch_arc_center_point": "Luk iz središta",
|
||||
"cmd.sketch_arc_tangent": "Tangentni luk",
|
||||
@@ -1105,6 +1146,8 @@
|
||||
"cmd.sketch_drawing_bounds": "Veličina crteža",
|
||||
"cmd.sketch_edit": "Uredi skicu",
|
||||
"cmd.sketch_edit_text": "Uredi tekst",
|
||||
"cmd.sketch_equation_curve": "Krivulja iz jednadžbe",
|
||||
"cmd.sketch_equation_curve_edit": "Uredi krivulju iz jednadžbe",
|
||||
"cmd.sketch_export_dxf": "Spremi kao DXF",
|
||||
"cmd.sketch_finish_auto_constrain": "Završi s automatskim ograničenjima",
|
||||
"cmd.sketch_fit_curves_to_section": "Uklopi krivulje u presjek mreže",
|
||||
@@ -1201,6 +1244,7 @@
|
||||
"cmd.view.render_browser": "Stablo renderiranja",
|
||||
"cmd.view.render_dock": "Premjesti panel renderiranja",
|
||||
"cmd.view.render_focus": "Fokusni prikaz renderiranja",
|
||||
"cmd.view.status_items": "Statusne stavke prozora prikaza",
|
||||
"cmd.view_ambient_occlusion": "Ambijentalna okluzija",
|
||||
"cmd.view_angle_readout": "Kutovi prikaza",
|
||||
"cmd.view_apply": "Vrati imenovani prikaz",
|
||||
@@ -1222,6 +1266,7 @@
|
||||
"cmd.view_normal_to": "Okomito na odabir",
|
||||
"cmd.view_previous_tab": "Prethodna kartica",
|
||||
"cmd.view_rename": "Preimenuj imenovani prikaz",
|
||||
"cmd.view_render_frame": "Vodilice kadra renderiranja",
|
||||
"cmd.view_right": "Pogled zdesna",
|
||||
"cmd.view_save": "Novi imenovani prikaz",
|
||||
"cmd.view_shots_strip": "Traka kadrova",
|
||||
@@ -1232,10 +1277,14 @@
|
||||
"color.copy": "Kliknite za kopiranje vrijednosti boje",
|
||||
"color.edit": "Kliknite za uređivanje boje",
|
||||
"color.gamma": "Prikaz vrijednosti boje u gama prostoru 0-255",
|
||||
"color.hex": "Hex",
|
||||
"color.hex_help": "Unesite #rrggbb ili #rrggbbaa; šest znamenki zadržava neprozirnost",
|
||||
"color.hex_hint": "#rrggbb",
|
||||
"color.hue": "Nijansa",
|
||||
"color.linear": "Prikaz vrijednosti boje u linearnom prostoru 0-1",
|
||||
"color.saturation_value": "Zasićenost i vrijednost",
|
||||
"color.selected": "Odabrana boja",
|
||||
"config.column_filter_empty": "Nema odgovarajućih stupaca",
|
||||
"contact.components_count": "Komponente: {count}",
|
||||
"contact.enabled_label": "omogućeno",
|
||||
"coupling.gear_1": "Zupčanik 1",
|
||||
@@ -1350,8 +1399,20 @@
|
||||
"help.material.assign": "Određuje od čega su odabrana tijela izrađena, npr. čelik, aluminij ili ABS. Upotrijebite ga kako bi masa i težina odgovarale stvarnom dijelu.",
|
||||
"help.mit": "MIT licenca",
|
||||
"help.notice": "NOTICE",
|
||||
"help.occurrence.move": "Pomiče dio sklopa samo u stupnjevima slobode koje dopuštaju njegovi spojevi. Odaberite lice dijela, a zatim povucite dostupnu strelicu ili luk.",
|
||||
"help.parameters.change": "Otvara tablicu imenovanih vrijednosti i izraza koji upravljaju kotama dizajna. Upotrijebite je kako biste promijenili mjeru na jednom mjestu, a sve značajke koje je koriste je slijede.",
|
||||
"help.pointcloud.insert": "Umetnite PLY, XYZ ili PTS skeniranje kao oblak točaka uz model. Koristite ga kao referencu pri izradi modela iz izmjerenih podataka.",
|
||||
"help.sketch.construction_line": "Izradite beskonačni pomoćni pravac kroz dvije točke. Upotrijebite ga kako biste rasporedili skicu bez razdvajanja profila.",
|
||||
"help.sketch.construction_line.angle": "Izradite beskonačni pomoćni pravac pod kutom od osi X skice. Odaberite točku i upišite kut ili odaberite smjer.",
|
||||
"help.sketch.construction_line.bisector": "Odaberite dvije ravne linije skice koje se sijeku, pa jednu od dviju simetrala kuta. Rezultat prati izvorne linije.",
|
||||
"help.sketch.construction_line.horizontal": "Izradite beskonačni vodoravni pomoćni pravac kroz točku. Njegovo ograničenje vodoravnosti ostaje na snazi pri kasnijim promjenama.",
|
||||
"help.sketch.construction_line.parallel": "Odaberite ravnu liniju skice, pa postavite paralelni beskonačni pomoćni pravac. Desnim klikom odaberite drugu referencu.",
|
||||
"help.sketch.construction_line.perpendicular": "Odaberite ravnu liniju skice, pa postavite beskonačni pomoćni pravac okomit na nju. Desnim klikom odaberite drugu referencu.",
|
||||
"help.sketch.construction_line.tangent_at": "Izradite tangentu u točki na kružnici ili kružnom luku, ili u krajnjoj točki otvorenog splinea ili konike. Odaberite krivulju, pa točku dodira.",
|
||||
"help.sketch.construction_line.tangent_external": "Odaberite kružnicu ili kružni luk, pa vanjsku točku i rješenje tangente. Pregledi prikazuju samo dodirne točke na nacrtanom luku.",
|
||||
"help.sketch.construction_line.tangent_two": "Odaberite dvije kružnice ili kružna luka, pa u pregledu odaberite zajedničku tangentu. Dodirne točke moraju ležati na nacrtanim krivuljama.",
|
||||
"help.sketch.construction_line.vertical": "Izradite beskonačni okomiti pomoćni pravac kroz točku. Njegovo ograničenje okomitosti ostaje na snazi pri kasnijim promjenama.",
|
||||
"help.sketch.equation_curve": "Crta krivulju prema formulama: x(t) i y(t) ili y = f(x), u zadanom rasponu. Formule mogu koristiti parametre i krivulja ih prati: upotrijebite je za sinusoidu, spiralu ili evolventu zuba zupčanika.",
|
||||
"help.solid.align": "Pomiče odabrana tijela tako da se točka, lice ili ravnina na njima poklopi s točkom, licem ili ravninom negdje drugdje. Upotrijebite ga kako biste postavili dio uz drugi bez mjerenja odmaka.",
|
||||
"help.solid.chamfer": "Odsijeca odabrane bridove ravnim skošenjem zadane udaljenosti. Koristite ga kako biste ublažili oštre bridove ili olakšali uvođenje zatika ili vijka.",
|
||||
"help.solid.combine": "Spaja tijela, oduzima ih od ciljnog tijela ili zadržava samo zajednički volumen, a može zadržati i alatna tijela. Koristite ga kako biste spojili dijelove, jednim oblikom odrezali drugi ili pronašli gdje se dva tijela preklapaju.",
|
||||
@@ -1480,6 +1541,21 @@
|
||||
"joint.one_component": "Ovi dijelovi su tijela jedne komponente: {bodies}. Spoj pomiče jednu komponentu u odnosu na drugu, pa svaki dio treba vlastitu komponentu.",
|
||||
"joint.rigid_group_one_component": "Sva tijela ({count}) nalaze se u jednoj komponenti (ili u samom dizajnu): najprije upotrijebite {command}.",
|
||||
"joint.rigid_group_select_components": "Odaberite dvije ili više komponenti.",
|
||||
"joint_move.blocked_hint": "Provjerite vrstu spoja (npr. Kruti), učvršćenje, granice spoja i vrijednosti kojima upravljaju parametri.",
|
||||
"joint_move.blocked_title": "Ovaj dio nije moguće pomaknuti",
|
||||
"joint_move.coarse": "Korak rotacije blizu osi (°)",
|
||||
"joint_move.distance": "Udaljenost od početka",
|
||||
"joint_move.done": "Gotovo",
|
||||
"joint_move.fine": "Korak rotacije daleko od osi (°)",
|
||||
"joint_move.fixed": "Ovaj dio nema pomičnu os spoja.",
|
||||
"joint_move.help": "Pomakni — povucite strelicu ili prsten. Esc poništava trenutno povlačenje.",
|
||||
"joint_move.legacy_hint": "Isključite kako biste koristili prethodni panel Pomakni.",
|
||||
"joint_move.precision": "Povucite izvan isprekidane vodilice za finu rotaciju.",
|
||||
"joint_move.rotation": "Rotacija od početka",
|
||||
"joint_move.select": "Odaberite lice ili jedan dio sklopa, a zatim odaberite Pomakni.",
|
||||
"joint_move.settings": "Pomicanje u sklopu",
|
||||
"joint_move.step": "Korak",
|
||||
"joint_move.use_handles": "Koristi ručice kretanja spojeva za Pomakni u sklopu",
|
||||
"keymap.command_id": "ID naredbe",
|
||||
"keymap.empty": "Nema odgovarajućih naredbi",
|
||||
"keymap.use_anyway": "Ipak upotrijebi {key} ovdje",
|
||||
@@ -1574,6 +1650,8 @@
|
||||
"nav.maya.help": "Alt+povlačenje lijevom tipkom orbitira, Alt+srednja tipka pomiče, Alt+desna tipka zumira; povlačenje srednjom tipkom također pomiče",
|
||||
"nav.openscad.help": "Povlačenje lijevom tipkom po praznom prostoru orbitira, Shift+povlačenje lijevom odabire okvirom, povlačenje geometrije skice uređuje je; povlačenje desnom ili srednjom tipkom pomiče, Shift+desna ili Shift+srednja zumira",
|
||||
"nav.perspective.sketch": "Uređivanje skice koristi ortografski prikaz. Završite skicu kako biste prešli na perspektivu.",
|
||||
"nav.right_drag_orbits.help": "Isključeno: povlačenje desnom tipkom ne dira kameru, a desna tipka samo otvara kontekstni izbornik. Odabir mapiranja miša SolidWorks isključuje ovu opciju.",
|
||||
"nav.right_drag_orbits.label": "Povlačenje desnom tipkom orbitira",
|
||||
"nav.solidworks.help": "Povlačenje srednjom tipkom orbitira, Ctrl+srednja pomiče, Shift+srednja zumira, povlačenje desnom orbitira",
|
||||
"nav.tinkercad.help": "Povlačenje desnom tipkom orbitira, povlačenje srednjom ili Shift+desnom pomiče",
|
||||
"nav.touchpad.help": "Držite Shift i pomičite pokazivač za pomicanje prikaza; držite Alt/Option i pomičite ga za orbitiranje. Tipka miša nije potrebna. Okomito pomicanje zumira.",
|
||||
@@ -1595,6 +1673,9 @@
|
||||
"navbar.custom.customise": "Prilagodi navigacijsku traku…",
|
||||
"navbar.custom.design": "Dizajn",
|
||||
"navbar.custom.duplicate": "Ovo mjesto je već na traci.",
|
||||
"navbar.custom.edge": "Rub",
|
||||
"navbar.custom.edge_bottom": "Dolje",
|
||||
"navbar.custom.edge_top": "Gore",
|
||||
"navbar.custom.fade": "Izblijedi",
|
||||
"navbar.custom.full": "Uklonite jedno mjesto kako biste dodali drugo.",
|
||||
"navbar.custom.hidden_design": "Skriveno u Dizajnu",
|
||||
@@ -1701,6 +1782,7 @@
|
||||
"parts.dimension.thickness": "Debljina",
|
||||
"parts.dimension.width": "Širina",
|
||||
"parts.family.bearing": "Kuglični ležaj s dubokim utorom (ovojni oblik)",
|
||||
"parts.family.button_head_cap_screw": "Vijak s poluokruglom glavom i unutarnjim šesterokutom",
|
||||
"parts.family.dowel_pin": "Cilindrični zatik",
|
||||
"parts.family.hex_bolt": "Vijak sa šesterokutnom glavom",
|
||||
"parts.family.hex_nut": "Šesterokutna matica",
|
||||
@@ -1759,6 +1841,11 @@
|
||||
"prefs.bottom_centre": "Dolje u sredini",
|
||||
"prefs.bottom_right": "Dolje desno",
|
||||
"prefs.browser": "Stablo modela",
|
||||
"prefs.browser_eye_left": "Oko pored strelice za sažimanje",
|
||||
"prefs.browser_eye_left_note": "Redci stabla modela prikazuju oko za prikazivanje/skrivanje pored strelice za sažimanje, kao prije, umjesto u stupcu na desnom kraju redaka.",
|
||||
"prefs.browser_reveal_on_hover": "Prikaži pri prelasku mišem",
|
||||
"prefs.browser_show_note": "Prikazano drži stablo modela na zaslonu. Prikaži pri prelasku mišem skriva ga dok pokazivač ne dođe na njegovo mjesto ili na tanku karticu uz njegov lijevi rub, a ostaje otvoreno dok je pokazivač unutar njega ili dok je otvoren izbornik iz njega.",
|
||||
"prefs.browser_shown": "Prikazano",
|
||||
"prefs.built_in": "Ugrađeno",
|
||||
"prefs.button_left": "Povlačenje lijevom tipkom",
|
||||
"prefs.button_middle": "Povlačenje srednjom tipkom",
|
||||
@@ -1806,6 +1893,8 @@
|
||||
"prefs.graphics_card_restart": "Stupa na snagu nakon ponovnog pokretanja SolidCrafta. WGPU_ADAPTER_NAME ima prednost nad ovim odabirom.",
|
||||
"prefs.graphics_note": "Žrtvujte brzinu za glatkoću. Svaki odabir pokazuje svoj učinak na primjeru.",
|
||||
"prefs.graphics_presets_note": "Unaprijed zadane vrijednosti postavljaju sve odabire ispod odjednom.",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out": "Sakrij simbole ograničenja kada je prikaz umanjen",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out_note": "Simboli ograničenja nestaju iz prikaza kada je skica toliko umanjena da bi je zatrpali. Isključeno: ostaju fiksne veličine na zaslonu pri svakom zumiranju.",
|
||||
"prefs.history": "Vremenska traka",
|
||||
"prefs.history_origin_bodies": "Prikaži ishodište i tijela na vrhu",
|
||||
"prefs.history_origin_bodies_note": "Vremenska traka lijevo ili ispod stabla modela počinje mapom Tijela aktivne komponente i Ishodištem, s njihovim okom i izbornicima kao u stablu modela. Vremenska traka na dnu ostaje nepromijenjena.",
|
||||
@@ -1829,6 +1918,8 @@
|
||||
"prefs.layout_note": "Kompaktno pričvršćuje panele uz rubove prozora. Prozirnost stabla modela dostupna je u opciji Plutajuće. Stranu Asistenta promijenite na stranici Asistent.",
|
||||
"prefs.left": "Lijevo",
|
||||
"prefs.left_click": "Lijevi klik",
|
||||
"prefs.line_drag_draws_one": "Pritisak i povlačenje crta jednu liniju",
|
||||
"prefs.line_drag_draws_one_note": "U alatu Linija pritisak, povlačenje i otpuštanje crta jednu liniju od mjesta pritiska do mjesta otpuštanja i ondje završava. Klikovi i dalje crtaju lanac. Isključeno: povlačenje postavlja točku ondje gdje se otpusti, kao i klik.",
|
||||
"prefs.linked_designs": "Povezani dizajni",
|
||||
"prefs.live_input": "Ulaz uživo",
|
||||
"prefs.live_preview": "Pregled uživo",
|
||||
@@ -1842,6 +1933,9 @@
|
||||
"prefs.max_file_size_step": "STEP i uvezene datoteke",
|
||||
"prefs.max_file_size_web": "Web aplikacija otvara STEP i uvezene datoteke do 512 MB te dizajne do 256 MB: kartica preglednika ne može primiti veće datoteke. Desktop aplikacija može podići ove granice.",
|
||||
"prefs.megabytes": "MB",
|
||||
"prefs.menu_grid": "Velike ikone",
|
||||
"prefs.menu_list": "Popis",
|
||||
"prefs.menus": "Izbornici",
|
||||
"prefs.minutes": "minuta",
|
||||
"prefs.minutes_suffix": " min",
|
||||
"prefs.mouse": "Miš i dodirna pločica",
|
||||
@@ -1861,14 +1955,40 @@
|
||||
"prefs.origin_plane_names": "Nazivi ravnina ishodišta",
|
||||
"prefs.origin_plane_names_note": "Nazivi prikazani u stablu modela, dijalozima i popisima. {top} je XY, {front} je XZ, a {right} je YZ, sa Z prema gore. Naredbe, skripte i spremljeni dizajni zadržavaju XY, XZ i YZ.",
|
||||
"prefs.overall_speed": "Ukupna brzina",
|
||||
"prefs.persistent_ribbon_pressed": "Istakni aktivne naredbe na vrpci",
|
||||
"prefs.persistent_ribbon_pressed_help": "Ističe naredbe na vrpci dok su njihovi efekti uključeni. Isključite kako biste zadržali prethodni neutralni izgled i pomoć za naredbe.",
|
||||
"prefs.perspective_fov": "Vidno polje",
|
||||
"prefs.placement": "Postavljanje",
|
||||
"prefs.prefer_free_sketch_points": "Daj prednost pomičnim točkama skice kad se točke preklapaju",
|
||||
"prefs.preview_choices": "Pregled vaših odabira",
|
||||
"prefs.print_face_highlight": "Isticanje plohe ispisa",
|
||||
"prefs.print_face_highlight_tip": "Koliko se jako ploha ispisa tijela boji i obrubljuje u prikazu. 0 % ne prikazuje isticanje.",
|
||||
"prefs.profile_active": "Aktivni profil",
|
||||
"prefs.profile_applied": "Profil je primijenjen.",
|
||||
"prefs.profile_changed": "Postavke su se promijenile otkako je profil spremljen. Spremi ih zadržava u njemu.",
|
||||
"prefs.profile_deleted": "Profil je izbrisan.",
|
||||
"prefs.profile_export": "Izvezi…",
|
||||
"prefs.profile_exported": "Profil je izvezen.",
|
||||
"prefs.profile_imported": "Profil je uvezen. Odaberite ga pod Aktivni profil kako biste se prebacili na njega.",
|
||||
"prefs.profile_name_hint": "Naziv profila, npr. Prijenosnik",
|
||||
"prefs.profile_rename": "Preimenuj",
|
||||
"prefs.profile_renamed": "Profil je preimenovan.",
|
||||
"prefs.profile_save": "Spremi",
|
||||
"prefs.profile_saved": "Trenutne postavke spremljene su u profil.",
|
||||
"prefs.profile_skipped": "Profil je primijenjen; postavke koje su zadržale trenutnu vrijednost: {n} (pogledajte zapisnik).",
|
||||
"prefs.profiles": "Profili postavki",
|
||||
"prefs.profiles_note": "Prečaci, alatna traka, navigacija, radijalni izbornik i postavke sučelja, spremljeni zajedno pod jednim nazivom i mijenjani odjednom.",
|
||||
"prefs.project_options_dialog": "Dijalog opcija projiciranja",
|
||||
"prefs.project_options_dialog_note": "Uključeno: prije projiciranja odaberite Geometrija ili Tijela i Veza projekcije. Isključeno: zadržava se prethodni način rada s izravnim odabirom.",
|
||||
"prefs.quality_default": "zadano",
|
||||
"prefs.quality_fastest": "najbrže",
|
||||
"prefs.quality_slowest": "najsporije",
|
||||
"prefs.quality_smoother": "glađe",
|
||||
"prefs.render_previous_geometry_budget": "Koristi prethodni proračun geometrije za pregled renderiranja",
|
||||
"prefs.render_previous_geometry_budget_help": "Vrati prethodnu fiksnu granicu geometrije (512 MiB na 64-bitnom desktopu, 128 MiB drugdje) umjesto proračuna prema uređaju.",
|
||||
"prefs.reports_saved": "Spremljeno: {n}",
|
||||
"prefs.ribbon_reveal": "Prikaži rezultate pretraživanja na vrpci",
|
||||
"prefs.ribbon_reveal_note": "Zadržavanje pokazivača iznad rezultata u Pretraži naredbe pokazuje gdje se naredba nalazi na vrpci: njezinu karticu, gumb ili redak u padajućem izborniku panela. Naredba pokrenuta iz pretraživanja ondje zatreperi, a pokrenuta naredba iz padajućeg izbornika označava svoj panel.",
|
||||
"prefs.right_click": "Desni klik",
|
||||
"prefs.saving": "Automatsko spremanje i oporavak",
|
||||
"prefs.scale_note": "Također Ctrl + / Ctrl − u prozoru. Gumbi su 28 px pri 100 %.",
|
||||
@@ -1877,18 +1997,29 @@
|
||||
"prefs.search_empty": "Nema odgovarajućih postavki",
|
||||
"prefs.select": "Odabir",
|
||||
"prefs.select_one_item": "Odaberi jednu stavku",
|
||||
"prefs.select_other_hidden": "Odaberi skrivenu geometriju pomoću Odaberi drugo",
|
||||
"prefs.select_other_hidden_help": "Uključeno: obuhvaća skrivena tijela, skice i zaklonjene bridove u blizini pokazivača. Isključeno: koristi se izvorni popis vidljive geometrije ispod pokazivača.",
|
||||
"prefs.selecting": "Odabiranje",
|
||||
"prefs.shift": "Shift",
|
||||
"prefs.shift_add_ctrl_toggle": "Shift samo dodaje; Ctrl / Cmd uključuje i isključuje",
|
||||
"prefs.shift_add_note": "Uključeno: Shift dodaje, Ctrl / Cmd uključuje i isključuje. Isključeno (zadano): oba uključuju i isključuju.",
|
||||
"prefs.shortcuts": "Prečaci",
|
||||
"prefs.single_surface_analysis": "Koristi samo jednu analizu ploha",
|
||||
"prefs.single_surface_analysis_help": "Kad je isključeno, sjenčanje ploha i Kontinuitet mogu ostati uključeni zajedno. Kad je uključeno, zadržava se posljednja pokrenuta ili promijenjena analiza.",
|
||||
"prefs.sketch_align_points": "Poravnaj s drugim točkama skice tijekom crtanja",
|
||||
"prefs.sketch_align_points_note": "Tijekom crtanja točka se istodobno poravnava vodoravno s jednom točkom skice i okomito s drugom, uz točkastu vodilicu, a klik zadržava oba poravnanja. Isključeno: samo s prethodnom točkom, po jedna os.",
|
||||
"prefs.sketch_conflict_colour": "Geometrija u sukobu u boji sukoba",
|
||||
"prefs.sketch_conflict_colour_note": "Dok su ograničenja skice u sukobu, krivulje i točke koje drži neuspjelo ograničenje crtaju se i u boji sukoba, a ne samo njegov simbol ili kota. Isključeno: zadržavaju uobičajene boje.",
|
||||
"prefs.sketch_construction_lines": "Prošireni alati za pomoćne pravce",
|
||||
"prefs.sketch_exit_view": "Kad se skica završi",
|
||||
"prefs.sketch_exit_view.keep": "Zadrži trenutni prikaz",
|
||||
"prefs.sketch_exit_view.previous": "Vrati se na prethodni prikaz",
|
||||
"prefs.sketch_exit_view.unless_rotated": "Vrati se osim ako je rotirano",
|
||||
"prefs.sketch_exit_view_note": "Kamo prikaz ide nakon Završi skicu, Odustani ili dvostrukog Esc.",
|
||||
"prefs.sketch_open_look_at": "Okreni kameru prema skici pri otvaranju",
|
||||
"prefs.sketch_open_look_at_note": "Isključeno: kad izradite ili uredite skicu, prikaz ostaje onakav kakav jest. Pogledaj okreće prikaz prema skici kad to želite.",
|
||||
"prefs.sketch_recent_snap": "Automatski privlači na nedavna središta i središnje točke",
|
||||
"prefs.sketch_recent_snap_note": "Tijekom crtanja pokazivač se privlači ondje gdje se sijeku vodilice dvaju posljednjih središta kružnica ili središnjih točaka ravnih bridova. Isključeno: te vodilice služe samo za prikaz i pokazivač se ne pomiče.",
|
||||
"prefs.sketch_selection": "Skica i odabir",
|
||||
"prefs.sketch_selection_heading": "Skica i odabir",
|
||||
"prefs.sketch_selection_note": "Kako se skice privlače i kako klikovi odabiru.",
|
||||
@@ -1933,7 +2064,14 @@
|
||||
"prefs.toast_place": "Obavijesti",
|
||||
"prefs.toggle_item": "Dodaj stavku ili je ponovno ukloni",
|
||||
"prefs.toolbar": "Alatna traka",
|
||||
"prefs.toolbar_tabs": "Kartice alatne trake",
|
||||
"prefs.top": "Gore",
|
||||
"prefs.trackpad_zoom_modifier": "Zumiranje pomicanjem s dva prsta uz držanje tipke",
|
||||
"prefs.trackpad_zoom_modifier.alt": "⌥ / Alt",
|
||||
"prefs.trackpad_zoom_modifier.cmd": "⌘",
|
||||
"prefs.trackpad_zoom_modifier.ctrl": "Ctrl",
|
||||
"prefs.trackpad_zoom_modifier.help": "Držite samo ovu tipku kako biste okomitim pomicanjem zumirali prema pokazivaču. Isključeno zadržava postojeće ponašanje pomicanja.",
|
||||
"prefs.trackpad_zoom_modifier.off": "Isključeno",
|
||||
"prefs.translucent": "Prozirno",
|
||||
"prefs.under_browser": "Ispod stabla modela",
|
||||
"prefs.under_cursor": "Ispod pokazivača",
|
||||
@@ -1943,13 +2081,24 @@
|
||||
"prefs.view_confirm_corner": "U redu i Odustani u kutu prikaza",
|
||||
"prefs.view_confirm_corner_note": "Dok je otvoren dijalog ili skica, kvačica i križić gore desno u prikazu rade isto što i gumbi U redu i Odustani u dijalogu, odnosno završavaju i poništavaju skicu. Navigator prikaza pomiče se ispod njih.",
|
||||
"prefs.viewport": "Prozor prikaza",
|
||||
"prefs.viewport_analysis_status": "Prikaži status analize u prozoru prikaza",
|
||||
"prefs.viewport_analysis_status_help": "Prikazuje aktivne analize iznad prozora prikaza, otvara njihove legende iz svake stavke, a tipka Esc isključuje najnoviju analizu. Isključite kako biste vratili legende u kutovima i prethodno ponašanje tipke Esc.",
|
||||
"prefs.viewport_background": "Pozadina",
|
||||
"prefs.viewport_background_colour": "Boja",
|
||||
"prefs.viewport_background_theme": "Gradijent teme",
|
||||
"prefs.wheel": "Kotačić",
|
||||
"prefs.wheel_trackpad": "Kotačić i dodirna pločica",
|
||||
"prefs.workspace": "Radni prostor",
|
||||
"prefs.zoom_stop_at_model": "Zaustavi zumiranje na modelu",
|
||||
"prefs.zoom_stop_at_model_tip": "3D miš i aplikacija uređaja zumiraju prema površini u sredini prikaza; zumiranje povlačenjem zadržava točku na kojoj je povlačenje počelo. Isključeno: zumiranje može proći kroz model. Kotačić i štipanje zasebno koriste Zumiranje prema pokazivaču",
|
||||
"prefs.zoom_toward_cursor": "Zumiranje prema pokazivaču",
|
||||
"properties.title": "Svojstva: {name}",
|
||||
"recovery.days_ago": "prije {count} dana",
|
||||
"recovery.detail": "{file} · značajki: {features} · automatski spremljeno {when}",
|
||||
"recovery.discard_all": "Odbaci sve",
|
||||
"recovery.discard_all_detail": "Ovo se ne može poništiti.",
|
||||
"recovery.discard_all_title": "Odbaciti automatska spremanja ({count})?",
|
||||
"recovery.discard_all_title_one": "Odbaciti 1 automatsko spremanje?",
|
||||
"recovery.hours_ago": "prije {count} h",
|
||||
"recovery.just_now": "upravo",
|
||||
"recovery.min_ago": "prije {count} min",
|
||||
@@ -2034,6 +2183,7 @@
|
||||
"render.appearance_editor.weight": "Težina",
|
||||
"render.appearance_physics_separate": "Vizualni izgled ne dodjeljuje gustoću, toplinske podatke niti druga inženjerska svojstva.",
|
||||
"render.appearances": "Izgledi",
|
||||
"render.assign_help": "Kliknite za primjenu na odabir; povucite za pregled i ispustite ili, kad ništa nije odabrano, kliknite za bojenje.",
|
||||
"render.availability_native": "Izvorni sastav; pregledajte prije primjene",
|
||||
"render.availability_projection": "Podržana projekcija; pogledajte opseg i izostavke",
|
||||
"render.availability_reference": "Referentni podaci; nije automatska dodjela",
|
||||
@@ -2072,6 +2222,7 @@
|
||||
"render.bloom_threshold": "Prag linearnih svijetlih dijelova",
|
||||
"render.browse_capabilities": "Pregledaj potpuni katalog mogućnosti",
|
||||
"render.browse_environments": "Pregledaj izvorna HDR okruženja",
|
||||
"render.browse_looks": "Pregledaj…",
|
||||
"render.browse_native_scenes": "Pregledaj izvorne studije",
|
||||
"render.browse_physical": "Pregledaj fizičke reference",
|
||||
"render.browse_quality": "Pregledaj specifikacije kvalitete",
|
||||
@@ -2095,6 +2246,82 @@
|
||||
"render.check_opaque": "Prozirnost: samo neprozirne površine; alfa pozadine je podržana.",
|
||||
"render.check_sorted_alpha": "Prozirnost: sortirana aproksimacija alfe.",
|
||||
"render.check_transmission": "Prozirnost: fizičko propuštanje svjetlosti.",
|
||||
"render.children.absolute_floor": "Apsolutni donji prag",
|
||||
"render.children.adaptive": "Prilagodljivo",
|
||||
"render.children.add_look_reason": "Dodajte izgled kako biste uredili njegovo uključeno stanje i jačinu.",
|
||||
"render.children.all_shots": "Svi kadrovi",
|
||||
"render.children.bloom": "Sjaj",
|
||||
"render.children.check": "Provjera",
|
||||
"render.children.check_now": "Provjeri sada",
|
||||
"render.children.chromatic": "Kromatski pomak",
|
||||
"render.children.compact": "Kompaktno",
|
||||
"render.children.contrast": "Kontrast",
|
||||
"render.children.copy_image": "Kopiraj",
|
||||
"render.children.copy_job": "Kopiraj JSON posla",
|
||||
"render.children.copy_request": "Kopiraj JSON zahtjeva",
|
||||
"render.children.coverage_error": "Pogreška pokrivenosti",
|
||||
"render.children.cpu": "CPU praćenje zraka",
|
||||
"render.children.denoise": "Smanji šum na dovršenoj slici",
|
||||
"render.children.depth": "Dubina putanje",
|
||||
"render.children.distortion": "Izobličenje",
|
||||
"render.children.edge_samples": "Uzorci rubova",
|
||||
"render.children.effects_banner": "Ovi efekti zahtijevaju GPU praćenje putanja. Otvaranje ovoga nikad ne mijenja metodu.",
|
||||
"render.children.enable_adaptive": "Omogućite neovisne probne uzorke kako biste uredili prilagodljiva ograničenja.",
|
||||
"render.children.enable_bloom": "Omogućite sjaj kako biste uredili njegovu jačinu, prag i polumjer.",
|
||||
"render.children.finishing": "Završna obrada",
|
||||
"render.children.flare": "Odsjaj",
|
||||
"render.children.fresnel": "Fresnelovi slojevi",
|
||||
"render.children.ghosts": "Duhovi prstenova",
|
||||
"render.children.glass": "Prijenos kroz staklo",
|
||||
"render.children.go_to": "Idi na {editor}",
|
||||
"render.children.grain": "Zrno",
|
||||
"render.children.halo": "Oreol",
|
||||
"render.children.hdr": "HDR",
|
||||
"render.children.keep_master": "Zadrži sirovi linearni master",
|
||||
"render.children.last_result": "Posljednje: {number} · {width} × {height} · {phase}",
|
||||
"render.children.lens_effects": "Efekti objektiva",
|
||||
"render.children.look_summary": "{tone} · izgledi: {count}",
|
||||
"render.children.looks": "Kreativni izgledi",
|
||||
"render.children.memory": "Memorija",
|
||||
"render.children.method": "Metoda",
|
||||
"render.children.minimum": "Minimum",
|
||||
"render.children.needs_cpu": "Zahtijeva CPU praćenje zraka. Otvaranje ovoga nikad ne mijenja metodu.",
|
||||
"render.children.nested": "Potvrđeni ugniježđeni dielektrici",
|
||||
"render.children.not_checked": "Nije provjereno",
|
||||
"render.children.path": "Praćenje putanja",
|
||||
"render.children.pilots": "Probni uzorci",
|
||||
"render.children.preview": "Podaci pregleda",
|
||||
"render.children.progressive_reason": "Odaberite CPU progresivno kako biste uredili broj uzoraka i sjeme.",
|
||||
"render.children.radius": "Polumjer",
|
||||
"render.children.reflect_depth": "Dubina refleksije",
|
||||
"render.children.reflect_samples": "Uzorci refleksije",
|
||||
"render.children.regrade": "Ponovna gradacija",
|
||||
"render.children.relative_error": "Relativna pogreška",
|
||||
"render.children.render": "Renderiranje",
|
||||
"render.children.render_shot": "Renderiraj kadar",
|
||||
"render.children.renderer": "Iscrtavač",
|
||||
"render.children.renderers": "Iscrtavači",
|
||||
"render.children.request": "Ovaj zahtjev",
|
||||
"render.children.reset_finishing": "Vrati zadanu završnu obradu",
|
||||
"render.children.review_quality": "Pregledaj specifikaciju kvalitete…",
|
||||
"render.children.rgb_gain": "RGB pojačanje",
|
||||
"render.children.samples": "Uzorci",
|
||||
"render.children.sampling": "Uzorkovanje",
|
||||
"render.children.saturation": "Zasićenost",
|
||||
"render.children.scene_summary": "Tijela: {bodies} · trokuti: {triangles}",
|
||||
"render.children.seed": "Sjeme",
|
||||
"render.children.sharpening": "Izoštravanje",
|
||||
"render.children.single_image": "Jedna slika",
|
||||
"render.children.soft_focus": "Meki fokus",
|
||||
"render.children.streak": "Pruga",
|
||||
"render.children.strength": "Jačina",
|
||||
"render.children.studio": "Studio",
|
||||
"render.children.threshold": "Prag",
|
||||
"render.children.tone": "Ton",
|
||||
"render.children.under_hood": "Ispod haube",
|
||||
"render.children.vignette": "Vinjeta",
|
||||
"render.children.workstation": "Radna stanica",
|
||||
"render.choose_look": "Najprije odaberite izgled u Izgledima",
|
||||
"render.chromatic_offset": "Kromatski pomak rubova",
|
||||
"render.clear_stage": "Ukloni spremljenu scenu",
|
||||
"render.copy_request": "Kopiraj JSON",
|
||||
@@ -2346,8 +2573,33 @@
|
||||
"render.flare_strength": "Jačina odsjaja svijetlih dijelova",
|
||||
"render.flare_threshold": "Linearni prag odsjaja scene",
|
||||
"render.fold_browser": "Sažmi stablo modela",
|
||||
"render.frame_aspect": "Omjer",
|
||||
"render.frame_centre_mark": "Oznaka središta",
|
||||
"render.frame_copy_limit": "Nema dostupnog naziva za duplikat kadra",
|
||||
"render.frame_copy_name": "{name} kopija {number}",
|
||||
"render.frame_custom": "Prilagođeno",
|
||||
"render.frame_distance_unit": " × veličina",
|
||||
"render.frame_duplicate": "Dupliciraj",
|
||||
"render.frame_exposure": "Ekspozicija",
|
||||
"render.frame_fov": "Vidno polje",
|
||||
"render.frame_guides": "Vodilice",
|
||||
"render.frame_invalid_aspect": "Neispravan unaprijed zadani omjer",
|
||||
"render.frame_lens": "Vidno polje {fov}° · ≈ {mm} mm",
|
||||
"render.frame_name": "Naziv",
|
||||
"render.frame_output_size": "Veličina izlaza",
|
||||
"render.frame_photo": "3:2 · Fotografija",
|
||||
"render.frame_portrait": "4:5 · Portret",
|
||||
"render.frame_presets": "Unaprijed zadani kadrovi",
|
||||
"render.frame_presets_pending": "Stiže s uređivačem kadrova",
|
||||
"render.frame_projection": "Projekcija",
|
||||
"render.frame_render_shot": "Renderiraj ovaj kadar",
|
||||
"render.frame_rule_thirds": "Pravilo trećina",
|
||||
"render.frame_safe_area": "Sigurno područje",
|
||||
"render.frame_shot_title": "Kadar · {name}",
|
||||
"render.frame_square": "1:1 · Kvadrat",
|
||||
"render.frame_tall": "9:16 · Okomito",
|
||||
"render.frame_thirds": "Trećine",
|
||||
"render.frame_wide": "16:9 · Široki zaslon",
|
||||
"render.gpu_depth": "Maksimalna dubina putanje",
|
||||
"render.gpu_options_help": "Uzorci, dubina, sjeme i ekspozicija spremaju se s ovom postavkom. Sprema se samo aktivna metoda slike.",
|
||||
"render.gpu_path_failed": "GPU praćenje putanja nije dostupno",
|
||||
@@ -2375,6 +2627,7 @@
|
||||
"render.heading_results": "REZULTATI",
|
||||
"render.heading_shots": "KADROVI",
|
||||
"render.hide_shots_label": "Sakrij traku kadrova",
|
||||
"render.hover_look": "{object} · {look} · kliknite za odabir",
|
||||
"render.image_advanced": "Napredne GPU kontrole",
|
||||
"render.image_cancelled": "Renderiranje je prekinuto",
|
||||
"render.image_cancelling": "Prekidanje",
|
||||
@@ -2521,17 +2774,95 @@
|
||||
"render.library_uniform_ack": "Upotrijebi jednoličnu aproksimaciju bez prostornih ili naprednih efekata",
|
||||
"render.library_usable": "Izvršne projekcije",
|
||||
"render.library_users": "Korisnici",
|
||||
"render.light_aim": "Usmjeri prema",
|
||||
"render.light_anchor_pending": "Promjena koordinatnog sustava svjetla još nije podržana.",
|
||||
"render.light_azimuth": "Azimut",
|
||||
"render.light_backend_limit": "Odaberite CPU praćenje zraka ili izričiti GPU studio kako biste uređivali svjetla. Svjetla starog GPU studija ostaju samo za čitanje.",
|
||||
"render.light_behaviour": "PONAŠANJE",
|
||||
"render.light_default_fill": "Popunjavajuće",
|
||||
"render.light_default_key": "Glavno",
|
||||
"render.light_default_number": "Svjetlo {number}",
|
||||
"render.light_default_rim": "Rubno",
|
||||
"render.light_delete": "Izbriši",
|
||||
"render.light_distance": "Udaljenost",
|
||||
"render.light_duplicate": "Dupliciraj",
|
||||
"render.light_elevation": "Elevacija",
|
||||
"render.light_gpu_punctual": "Točkasta svjetla i reflektori dostupni su uz CPU praćenje zraka.",
|
||||
"render.light_hard_shadow": "Ovo svjetlo ima oštre sjene; mekoća emitera nije dostupna.",
|
||||
"render.light_intensity": "Intenzitet",
|
||||
"render.light_missing": "Ovo svjetlo više ne postoji. Odaberite svjetlo u stablu modela.",
|
||||
"render.light_place_highlight": "Postavi prema odsjaju",
|
||||
"render.light_place_pending": "Postavljanje prema odsjaju zahtijeva odabir svjetla u prozoru prikaza i još nije podržano.",
|
||||
"render.light_position": "POLOŽAJ",
|
||||
"render.light_preview_help": "Prikaz uživo je bez sjena; površinska svjetla koriste aproksimaciju s uzorkom u središtu. Renderiranje koristi potpuni model svjetla.",
|
||||
"render.light_product_centre": "Središte proizvoda",
|
||||
"render.light_size": "Veličina",
|
||||
"render.light_softness": "Mekoća",
|
||||
"render.light_temperature": "Temperatura boje",
|
||||
"render.light_temperature_help": "Približna nijansa crnog tijela; sprema se kao linearni RGB.",
|
||||
"render.light_type": "Vrsta",
|
||||
"render.light_type_area": "Površinsko",
|
||||
"render.light_type_point": "Točkasto",
|
||||
"render.light_type_spot": "Reflektor",
|
||||
"render.light_type_sun": "Sunce",
|
||||
"render.light_view_only": "Samo ovo svjetlo i isključivanje svjetla utječu na ovaj prikaz i njegova renderiranja; nikad se ne spremaju u dizajn.",
|
||||
"render.light_world_origin": "Ishodište svijeta",
|
||||
"render.lighting_aim_point": "Točka usmjeravanja",
|
||||
"render.lighting_apply": "Primijeni postavku",
|
||||
"render.lighting_area_samples": "Uzorci površinskog svjetla",
|
||||
"render.lighting_budget": "Proračun",
|
||||
"render.lighting_budget_help": "Brojevi su samo za čitanje. Dodajte, duplicirajte ili izbrišite svjetla kako biste ih promijenili; metoda određuje ograničenja.",
|
||||
"render.lighting_colour": "Boja",
|
||||
"render.lighting_consent": "Zamijeni usmjerena svjetla ovom postavkom",
|
||||
"render.lighting_custom": "Prilagođena svjetla",
|
||||
"render.lighting_custom_help": "Odabirom opcije Prilagođeno postavka se pretvara u svjetla koja se mogu uređivati, svako u svom retku u stablu.",
|
||||
"render.lighting_direction": "Smjer X Y Z",
|
||||
"render.lighting_direction_help": "Ili upišite smjer prema svjetlu (X Y Z).",
|
||||
"render.lighting_distance_unit": " × veličina",
|
||||
"render.lighting_edge_u": "Vektor stranice U",
|
||||
"render.lighting_edge_v": "Vektor stranice V",
|
||||
"render.lighting_falloff": "Slabljenje",
|
||||
"render.lighting_falloff_help": "Intenzitet je naveden za referentnu udaljenost.",
|
||||
"render.lighting_height": "Visina V",
|
||||
"render.lighting_minimum": "Minimum",
|
||||
"render.lighting_mute": "Isključi ovo svjetlo",
|
||||
"render.lighting_point": "Točka",
|
||||
"render.lighting_preset": "Postavka studija",
|
||||
"render.lighting_preset_cpu": "Usmjerene postavke studija zahtijevaju CPU praćenje zraka. GPU osvjetljenje koristi izričita svjetla vrste Sunce i Površinsko.",
|
||||
"render.lighting_preset_row": "Postavka",
|
||||
"render.lighting_radiance": "Radijancija",
|
||||
"render.lighting_reference": "Referenca",
|
||||
"render.lighting_review_help": "Zamjenjuje popis usmjerenih svjetala. Zadržava točkasta i površinska svjetla, okruženje, sjene, kameru i sve ostale postavke kadra.",
|
||||
"render.lighting_review_title": "Pregledaj postavku osvjetljenja",
|
||||
"render.lighting_samples_cpu": "Uzorci površinskog svjetla primjenjuju se na CPU praćenje zraka.",
|
||||
"render.lighting_samples_need_area": "Dodajte CPU površinsko svjetlo kako biste postavili uzorke površinskog svjetla.",
|
||||
"render.lighting_samples_reason": "Uzorci površinskog svjetla moraju biti 1, 4, 16 ili 64.",
|
||||
"render.lighting_shadow_cpu": "Prekidač sjena zahtijeva CPU praćenje zraka. GPU praćenje putanja uvijek baca sjene.",
|
||||
"render.lighting_shadows": "Baci sjene",
|
||||
"render.lighting_shadows_section": "Sjene i uzorkovanje",
|
||||
"render.lighting_shape": "Oblik",
|
||||
"render.lighting_solo": "Samo ovo svjetlo",
|
||||
"render.lighting_source": "Izvor",
|
||||
"render.lighting_source_section": "Izvor svjetla",
|
||||
"render.lighting_spot_preserved": "Ovo točkasto svjetlo zadržava spremljeni stožac reflektora dok mu se ne promijeni vrsta.",
|
||||
"render.lighting_sun_distance": "Smjer sunca ne ovisi o udaljenosti i točki usmjeravanja.",
|
||||
"render.lighting_unsupported": "nepodržano",
|
||||
"render.lighting_used": "{used} od {limit}",
|
||||
"render.lighting_width": "Širina U",
|
||||
"render.lighting_world_position": "Svjetski X Y Z",
|
||||
"render.lights_fixed_to": "Svjetla vezana za",
|
||||
"render.linear_help": "Zadržava 32-bitni float RGBA master prije uklanjanja šuma, ekspozicije, mapiranja tonova, filtara i pozadine. Linearni sRGB/D65; pomnožen pokrivenošću. Dodatna memorija izričito se odobrava. Bez sažimanja i dodatnih prolaza.",
|
||||
"render.linear_retain": "Zadrži sirovi linearni EXR",
|
||||
"render.linear_unavailable": "Odabrani dovršeni kadar nema zadržani EXR. Omogućite zadržavanje prije renderiranja; stariji PNG ne može vratiti sirovu radijanciju.",
|
||||
"render.look_add": "Dodaj izgled boje",
|
||||
"render.look_applied": "Primijenjeno: {name}",
|
||||
"render.look_bleach": "Po uzoru na bleach bypass",
|
||||
"render.look_cool": "Hladno",
|
||||
"render.look_cyanotype": "Po uzoru na cijanotipiju",
|
||||
"render.look_faded": "Izblijedjeli otisak",
|
||||
"render.look_material": "Materijal",
|
||||
"render.look_mono": "Jednobojno",
|
||||
"render.look_pasted": "Izgled je zalijepljen",
|
||||
"render.look_sepia": "Sepija",
|
||||
"render.look_strength": "Jačina izgleda",
|
||||
"render.look_teal_orange": "Tirkizno / narančasto",
|
||||
@@ -2607,9 +2938,11 @@
|
||||
"render.output_advanced": "Napredno",
|
||||
"render.output_backend_ready": "Spremno",
|
||||
"render.output_check": "Provjeri",
|
||||
"render.output_check_failed": "Provjera · pogreška",
|
||||
"render.output_check_help": "Pokrenite Provjeri da pregledate ovaj zahtjev bez pokretanja renderiranja.",
|
||||
"render.output_check_summary": "Provjera · Napomene: {count}",
|
||||
"render.output_copy": "Kopiraj",
|
||||
"render.output_copy_report": "Kopiraj izvješće",
|
||||
"render.output_destination": "Odredište",
|
||||
"render.output_destination_help": "Odaberite odredišnu datoteku pri izvozu dovršene slike.",
|
||||
"render.output_dimensions": "Veličina",
|
||||
@@ -2619,6 +2952,7 @@
|
||||
"render.output_fit": "Uklopi",
|
||||
"render.output_format": "Format",
|
||||
"render.output_format_status": "PNG je točna dovršena slika za prikaz. Neobavezni GPU EXR zadržava sirovu linearnu radijanciju scene u formatu FLOAT32 prije filtara prikaza. Izvoz nikad ne zamjenjuje predmemoriju pregleda ni drugi posao.",
|
||||
"render.output_grading": "Gradacija",
|
||||
"render.output_image": "Slika",
|
||||
"render.output_largest": "najviše {width} × {height}",
|
||||
"render.output_lock_ratio": "Zaključaj omjer stranica",
|
||||
@@ -2628,6 +2962,8 @@
|
||||
"render.output_quality_waiting": "čeka definiciju kvalitete",
|
||||
"render.output_ratio_refused": "Povezana dimenzija premašuje ograničenje veličine ove metode. Prethodna veličina zadržava se; otključajte omjer ili odaberite manju vrijednost.",
|
||||
"render.output_ready": "Spremno za renderiranje",
|
||||
"render.output_run_check": "Pokreni provjeru",
|
||||
"render.output_size_limit": "{method}: do {dimension} px po strani i {pixels} piksela. Najveća veličina koja stane: {width} × {height}.",
|
||||
"render.output_size_ok": "Veličina u redu · {width} × {height} px",
|
||||
"render.output_swap_orientation": "Zamijeni širinu i visinu",
|
||||
"render.output_tools_inspector": "Veličinu i format uredite u inspektoru Izlaz.",
|
||||
@@ -2644,6 +2980,7 @@
|
||||
"render.page_output": "Izlaz",
|
||||
"render.page_scene": "Scena",
|
||||
"render.paint_label": "Oboji",
|
||||
"render.painting_with": "Bojenje izgledom: {name}",
|
||||
"render.passive_stage": "Podloga i pasivna scena",
|
||||
"render.passive_stage_help": "Konačni pasivni paneli pripadaju samo renderiranim slikama. Ne dodaju CAD tijela ni masu. Postavljanje je fiksno nakon primjene; presijecanje granica proizvoda odbija se. CPU ne daje difuzno odbijeno osvjetljenje.",
|
||||
"render.perspective": "Perspektivna kamera",
|
||||
@@ -2665,6 +3002,7 @@
|
||||
"render.pick_help": "Odaberite Tijelo, Lice ili Komponenta. Kliknite prazan prostor kako biste očistili odabir; Shift ili Ctrl dodaje ili uključuje/isključuje. Isticanja se pojavljuju samo u živom prikazu proizvoda.",
|
||||
"render.pick_label": "Odaberi",
|
||||
"render.pick_up_label": "Preuzmi",
|
||||
"render.pick_up_prompt": "Kliknite objekt kako biste preuzeli njegov izgled",
|
||||
"render.pick_waiting": "Odabir proizvoda još nije podržan.",
|
||||
"render.post_contrast": "Kontrast",
|
||||
"render.post_gain_b": "Pojačanje plave",
|
||||
@@ -2704,13 +3042,17 @@
|
||||
"render.radial_distortion": "Radijalno izobličenje",
|
||||
"render.radial_fit": "Uklopi proizvod",
|
||||
"render.radial_save": "Spremi kadar",
|
||||
"render.recent_looks": "Nedavni izgledi",
|
||||
"render.regrade_action": "Ponovna gradacija sirovog mastera (bez uklanjanja šuma)",
|
||||
"render.regrade_help": "Izrađuje zaseban PNG iz odabranog dovršenog sirovog mastera, koristeći ove kontrole prikaza. Ne prati zrake, ne mijenja zabilježenu veličinu, kameru ni svjetla i ne prebrisuje EXR. Uklanjanje šuma ne primjenjuje se ponovno: sirovi masteri ne čuvaju njegove vodilje. Izvedena slika i dalje se može izvesti istim kontrolama posla.",
|
||||
"render.regrade_label": "Ponovna gradacija",
|
||||
"render.reload_settings": "Ponovno učitaj spremljene postavke",
|
||||
"render.remove_override": "Ukloni nadjačavanje",
|
||||
"render.replace_all": "Zamijeni sve",
|
||||
"render.replace_ground": "Potvrdi zamjenu postojeće scene",
|
||||
"render.replace_label": "Zamijeni",
|
||||
"render.replace_saved_surface": "Zamijeni postojeću spremljenu vezu za ovaj cilj",
|
||||
"render.replace_with": "Zamijeni s",
|
||||
"render.restore_camera": "Vrati spremljenu kameru",
|
||||
"render.result_actual": "100%",
|
||||
"render.result_actual_help": "Jedan piksel slike po pikselu zaslona.",
|
||||
@@ -2762,14 +3104,28 @@
|
||||
"render.saved_surface_remove": "Ukloni spremljenu vezu",
|
||||
"render.saved_surfaces": "Spremljene veze površina",
|
||||
"render.saved_surfaces_help": "Fiksirane ugrađene mape prate odabrani primjerak u lokalnim milimetrima. Zamijenjen ili nedostajući cilj pogreška je, nikad automatska ponovna dodjela.",
|
||||
"render.scene_all_shots": "Svi kadrovi ({count})",
|
||||
"render.scene_apply": "Primijeni pregledani studio",
|
||||
"render.scene_batch_reason": "Opcija Svi kadrovi zahtijeva red čekanja za renderiranje spremljenih kadrova, koji još nije dostupan.",
|
||||
"render.scene_check_now": "Provjeri sada",
|
||||
"render.scene_check_passed": "Provjera uspješna · napomene: {notes}",
|
||||
"render.scene_check_stale": "Provjera je zastarjela · provjerite ponovno",
|
||||
"render.scene_check_unchecked": "Još nije provjereno · 0 napomena",
|
||||
"render.scene_consent": "Potvrdi zamjenu osvjetljenja, okruženja, ekspozicije i scene",
|
||||
"render.scene_light_summary": "{environment} · svjetla: {lights}",
|
||||
"render.scene_look_summary": "Izgledi: {looks} · nadjačavanja: {overrides}",
|
||||
"render.scene_open_check": "Otvori provjeru",
|
||||
"render.scene_preserved_fields": "Kamera, uzorkovanje, dimenzije, optičke veze, CAD geometrija i inženjerski materijali čuvaju se.",
|
||||
"render.scene_preserves_design": "Sastavite osvjetljenje i pasivnu scenu za vidljivi predmet. Geometrija, inženjerski materijali i kamera ostaju odvojeni.",
|
||||
"render.scene_ready": "Spremno za renderiranje",
|
||||
"render.scene_reminder": "Scena čuva dizajn. Geometrija, inženjerska svojstva i CAD nikad se ne mijenjaju iz Renderiranja.",
|
||||
"render.scene_reminders": "Podsjetnici",
|
||||
"render.scene_renderer_ready": "{renderer}: spremno",
|
||||
"render.scene_replaces": "Zamjenjuje",
|
||||
"render.scene_review": "Razriješi i pregledaj",
|
||||
"render.scene_review_help": "Pregledajte potpunu izvornu kompoziciju prije primjene. Nevezane napredne SCENE specifikacije ne zamjenjuju se.",
|
||||
"render.scene_scope_details": "Opseg kompozicije",
|
||||
"render.scene_stages": "Faze",
|
||||
"render.search_appearances": "Pretraži izglede ({count})",
|
||||
"render.setup_legacy_environment": "Ova starija postavka koristi naslijeđenu rotaciju ili intenzitet okruženja. Te vrijednosti zadržavaju se; izričito ih pretvorite prije spremanja punog posla slike.",
|
||||
"render.setup_name": "Naziv postavke",
|
||||
@@ -2782,7 +3138,22 @@
|
||||
"render.shell_tab_camera": "KAMERA RENDERA",
|
||||
"render.shell_tab_lighting": "OSVJETLJENJE",
|
||||
"render.shell_tab_scene": "SCENA RENDERA",
|
||||
"render.shot_aperture": "Otvor blende",
|
||||
"render.shot_distance": "Udaljenost",
|
||||
"render.shot_dof": "Dubinska oštrina",
|
||||
"render.shot_duplicate": "Dupliciraj spremljeni kadar",
|
||||
"render.shot_edit_output": "Uredi u Izlazu",
|
||||
"render.shot_exposure_reason": "Ekspozicija zahtijeva CPU praćenje zraka ili GPU praćenje putanja.",
|
||||
"render.shot_exposure_section": "Ekspozicija",
|
||||
"render.shot_focus_distance": "Udaljenost fokusa",
|
||||
"render.shot_fov_reason": "Vidno polje zahtijeva perspektivnu projekciju.",
|
||||
"render.shot_frame_subject": "Uokviri predmet",
|
||||
"render.shot_invalid_camera": "Vrijednosti kamere moraju biti konačne i unutar raspona.",
|
||||
"render.shot_lens": "Objektiv",
|
||||
"render.shot_lens_enable_reason": "Omogućite dubinsku oštrinu kako biste uredili otvor blende i udaljenost fokusa.",
|
||||
"render.shot_lens_gpu_reason": "Dubinska oštrina zahtijeva GPU praćenje putanja.",
|
||||
"render.shot_lens_perspective_reason": "Dubinska oštrina zahtijeva perspektivnu projekciju.",
|
||||
"render.shot_look_selection": "Pogledaj odabir",
|
||||
"render.shot_manager": "Spremljeni kadrovi",
|
||||
"render.shot_new_name": "Naziv novog kadra",
|
||||
"render.shot_remove": "Ukloni spremljeni kadar",
|
||||
@@ -2790,6 +3161,9 @@
|
||||
"render.shot_remove_title": "Ukloniti spremljeni kadar?",
|
||||
"render.shot_rename": "Preimenuj spremljeni kadar",
|
||||
"render.shot_saved_only": "Najprije spremite trenutni nacrt. Dupliciranje i preimenovanje čuvaju točne spremljene opcije i reference na resurse.",
|
||||
"render.shot_selection_reason": "Odaberite tijelo ili lice prema kojem se usmjerava.",
|
||||
"render.shot_size": "Veličina",
|
||||
"render.shot_target": "Cilj",
|
||||
"render.shots_camera_changed": "Kamera je promijenjena otkako je ovaj kadar spremljen",
|
||||
"render.shots_name_help": "Upišite jedinstven naziv trenutnog kadra.",
|
||||
"render.shots_no_result": "Još nema renderiranja",
|
||||
@@ -3052,6 +3426,7 @@
|
||||
"select an axis": "odaberite os",
|
||||
"select an axis, a straight or circular edge, or a cylinder, cone or torus face first": "prvo odaberite os, ravan ili kružni brid ili lice valjka, stošca ili torusa",
|
||||
"select bodies first": "prvo odaberite tijela",
|
||||
"select components first": "najprije odaberite komponente",
|
||||
"select corner points, or the two lines of one corner": "odaberite točke kutova ili dvije linije jednog kuta",
|
||||
"select one corner point, or the two lines of one corner": "odaberite jednu točku kuta ili dvije linije jednog kuta",
|
||||
"select sheet edges first": "prvo odaberite bridove lima",
|
||||
@@ -3070,6 +3445,7 @@
|
||||
"settings.double_click_components": "Dvaput kliknite komponentu kako biste je aktivirali ili uredili povezanu komponentu na mjestu",
|
||||
"settings.frame_rate_details_note": "Dodaje graf vremena posljednjih okvira s brojem iscrtanih trokuta, histogram vremena okvira i što je GPU iscrtao. Kliknite broj okvira u sekundi u prikazu kako biste ih prikazali ili sakrili.",
|
||||
"settings.frame_rate_note": "Prikazuje broj okvira u sekundi u donjem desnom kutu prikaza.",
|
||||
"settings.insert_lists_open_designs": "Umetni dizajn najprije navodi dizajne otvorene u drugim karticama",
|
||||
"settings.measure_axis_distances": "Prikaži udaljenosti X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Prikazuj komponente udaljenosti po svjetskim osima uz ukupnu udaljenost dok je Mjerenje otvoreno.",
|
||||
"settings.msaa_applies_on_restart": "Zaglađivanje rubova primjenjuje se pri sljedećem pokretanju SolidCrafta",
|
||||
@@ -3094,6 +3470,10 @@
|
||||
"shortcut.unpin": "Otkvači",
|
||||
"sketch is missing": "skica nedostaje",
|
||||
"sketch.degrees_of_freedom": "Stupnjevi slobode: {count}",
|
||||
"sketch.dimension_added_driven": "Skica već određuje tu kotu, pa je dodana kao referentna kota",
|
||||
"sketch.dimension_applied": "Kota je primijenjena",
|
||||
"sketch.dimension_applied_defined": "Kota je primijenjena; definiran je parametar `{name}`",
|
||||
"sketch.dimension_applied_renamed": "Kota je primijenjena; parametar je nazvan `{name}`",
|
||||
"sketch.dof_left": "Preostali stupnjevi slobode: {count}",
|
||||
"sketch.dof_left_one": "Preostali stupnjevi slobode: {count}",
|
||||
"sketch.draw_curves": "Crtaj kao {linetype}",
|
||||
@@ -3128,6 +3508,8 @@
|
||||
"sketch_text.use_font_file": "Upotrijebi datoteku fonta {path}",
|
||||
"solid": "puno",
|
||||
"status.editing": "Uređivanje: {name}",
|
||||
"status.navigation": "Mapiranje miša: {mapping}",
|
||||
"status.navigation_tip": "Kako miš pomiče prikaz. Kliknite za odabir drugog mapiranja",
|
||||
"status.under_constrained": "Nedovoljno ograničeno (stupnjevi slobode: {count})",
|
||||
"status.under_constrained_one": "Nedovoljno ograničeno (stupanj slobode: {count})",
|
||||
"status.units_tip": "Jedinice dizajna. Kliknite za promjenu",
|
||||
@@ -3161,8 +3543,10 @@
|
||||
"timeline.delete_folders_tip": "Zadrži njihove značajke i ugniježđene mape u vremenskoj traci",
|
||||
"timeline.delete_folders_with_features_tip": "Izbriši mape sa svim značajkama u njima i njihove ugniježđene mape",
|
||||
"timeline.delete_many": "Izbriši odabrane značajke: {count}",
|
||||
"timeline.edited_rolled_back": "Značajka {name} je promijenjena, ali je nakon oznake vraćanja pa se ne gradi: pomaknite oznaku iza nje kako biste vidjeli rezultat",
|
||||
"timeline.feature_error": "Pogreška: {message}",
|
||||
"timeline.feature_hint": "Dvaput kliknite za uređivanje · povucite za promjenu redoslijeda · desni klik za više",
|
||||
"timeline.feature_rolled_back": "Vraćeno: nalazi se nakon oznake vraćanja, pa se ne gradi",
|
||||
"timeline.feature_warning": "Upozorenje: {message}",
|
||||
"timeline.group": "Nova mapa značajki",
|
||||
"timeline.move_many": "Premjesti stavke vremenske trake",
|
||||
@@ -3244,6 +3628,10 @@
|
||||
"ui.3d_mouse_offer": "Kalibracija 3D miša ispravlja zamijenjene ili obrnute osi i postavlja njegovu brzinu i osjećaj.",
|
||||
"ui.3d_mouse_offer_never": "Ne prikazuj više",
|
||||
"ui.3d_mouse_offer_swap": "Prebaci na Hidraw (izravno)",
|
||||
"ui.3d_mouse_orbit": "Orbitiranje",
|
||||
"ui.3d_mouse_orbit_classic": "Klasično",
|
||||
"ui.3d_mouse_orbit_tip": "Praćeno: 3D miš okreće prikaz oko dijela modela koji je u sredini prikaza kad okretanje počne, označenog blijedom kuglom. Klasično: oko središta prikaza",
|
||||
"ui.3d_mouse_orbit_traced": "Praćeno",
|
||||
"ui.3d_mouse_reading": "Očitanje",
|
||||
"ui.3d_mouse_reset_axes": "Vrati zadanu dodjelu osi",
|
||||
"ui.3d_mouse_reset_view": "Vrati prikaz",
|
||||
@@ -3280,6 +3668,8 @@
|
||||
"ui.3d_mouse_step_twist_counterclockwise": "Zakrenite kapicu suprotno od kazaljke na satu, držite je, a zatim pustite.",
|
||||
"ui.3d_mouse_switch_cap": "Kalibriraj kao Povratak u središte",
|
||||
"ui.3d_mouse_switch_trackball": "Kalibriraj kao kuglični miš",
|
||||
"ui.3d_mouse_use_direct": "Koristi izravni upravljački program",
|
||||
"ui.3d_mouse_use_direct_tip": "Čitaj 3D miš izravno (hidraw) umjesto preko spacenavd.",
|
||||
"ui.3d_mouse_view_axis": "Os prikaza",
|
||||
"ui.3d_mouse_view_off": "Isključeno",
|
||||
"ui.3d_mouse_view_off_tip": "Profil upravljačkog programa 3D miša isključuje ovu os, pa njezino kretanje ne pomiče prikaz. Odabir kretanja druge osi ovdje ih zamjenjuje, a to kretanje prestaje pomicati prikaz.",
|
||||
@@ -3596,6 +3986,7 @@
|
||||
"ui.circle": "Kružnica",
|
||||
"ui.circular_pattern": "Kružni niz",
|
||||
"ui.clear": "Očisti",
|
||||
"ui.clear_print_face": "Ukloni plohu ispisa",
|
||||
"ui.clear_recent": "Očisti nedavno",
|
||||
"ui.clear_the_selection": "Poništi odabir",
|
||||
"ui.click_selects_whole_bodies": "Klik odabire cijela tijela",
|
||||
@@ -3630,6 +4021,15 @@
|
||||
"ui.constant": "Konstantno",
|
||||
"ui.constraints_conflict": "Ograničenja su u sukobu",
|
||||
"ui.construction": "Pomoćna",
|
||||
"ui.construction.angle_hint": "Pomoćni pravac: kliknite točku, pa upišite kut ili odaberite smjer",
|
||||
"ui.construction.bisector_hint": "Simetrala: odaberite dvije ravne linije koje se sijeku, pa željeno rješenje",
|
||||
"ui.construction.common_hint": "Zajednička tangenta: odaberite dvije kružnice ili dva luka, pa željeno rješenje",
|
||||
"ui.construction.contact_hint": "Tangenta: odaberite kružnicu/luk ili otvoreni spline/koniku, pa točku dodira (krivulje slobodnog oblika: krajnje točke)",
|
||||
"ui.construction.external_hint": "Tangenta: odaberite kružnicu ili luk, vanjsku točku, pa željeno rješenje",
|
||||
"ui.construction.free_hint": "Pomoćni pravac: kliknite dvije točke; desnim klikom počnite ispočetka",
|
||||
"ui.construction.point_hint": "Pomoćni pravac: kliknite točku kroz koju prolazi",
|
||||
"ui.construction.reference_hint": "Pomoćni pravac: odaberite ravnu liniju, pa točku; desnim klikom promijenite referencu",
|
||||
"ui.construction.ribbon_label": "Pomoćne",
|
||||
"ui.context_menu": "Kontekstni izbornik",
|
||||
"ui.continuity_g0": "G0 pregib",
|
||||
"ui.continuity_g1": "G1 tangentno",
|
||||
@@ -3670,6 +4070,7 @@
|
||||
"ui.design_properties.part_number": "Broj dijela",
|
||||
"ui.design_properties.project": "Projekt",
|
||||
"ui.design_properties.revision": "Revizija",
|
||||
"ui.design_saved": "Spremljeno: {path}",
|
||||
"ui.diameter": "Promjer",
|
||||
"ui.dimension": "Kota",
|
||||
"ui.direct_interaction": "Izravna interakcija",
|
||||
@@ -3720,6 +4121,14 @@
|
||||
"ui.end_scale": "Krajnje skaliranje",
|
||||
"ui.entities": "Elementi",
|
||||
"ui.equal": "Jednakost",
|
||||
"ui.equation_end": "Kraj",
|
||||
"ui.equation_explicit": "Eksplicitni",
|
||||
"ui.equation_form": "Oblik",
|
||||
"ui.equation_note": "Varijabla je običan broj: sin(t) je uzima u radijanima. Rezultat bez jedinice izražen je u jedinici dizajna.",
|
||||
"ui.equation_parametric": "Parametarski",
|
||||
"ui.equation_x_of_t": "x(t)",
|
||||
"ui.equation_y_of_t": "y(t)",
|
||||
"ui.equation_y_of_x": "y(x)",
|
||||
"ui.equivalent_radius": "Ekvivalentni polumjer",
|
||||
"ui.expand": "Proširi",
|
||||
"ui.exportDxf": "Izvezi DXF…",
|
||||
@@ -3785,6 +4194,7 @@
|
||||
"ui.heading_design": "DIZAJN",
|
||||
"ui.heading_draft": "NAGIB",
|
||||
"ui.heading_edit": "UREDI",
|
||||
"ui.heading_equation_curve": "KRIVULJA IZ JEDNADŽBE",
|
||||
"ui.heading_extrude": "EKSTRUDIRAJ",
|
||||
"ui.heading_fillet": "ZAOBLJENJE",
|
||||
"ui.heading_finish_editing": "ZAVRŠI UREĐIVANJE",
|
||||
@@ -3876,6 +4286,10 @@
|
||||
"ui.import_ellipsis": "Uvezi…",
|
||||
"ui.infinite": "Beskonačno",
|
||||
"ui.insert": "Umetni",
|
||||
"ui.insert_design.browse": "Pregledaj…",
|
||||
"ui.insert_design.open_designs": "Otvoreni dizajni",
|
||||
"ui.insert_design.saved_file": "{name} ima nespremljene promjene, pa je umetnuta njegova spremljena datoteka. Spremite ga, a zatim pokrenite Ažuriraj veze kako biste unijeli promjene.",
|
||||
"ui.insert_design.unsaved": "Nespremljene promjene",
|
||||
"ui.inspect": "Pregledaj",
|
||||
"ui.intersect": "Presjek",
|
||||
"ui.isolate": "Izoliraj",
|
||||
@@ -3975,6 +4389,7 @@
|
||||
"ui.pan_zoom_orbit": "Pomicanje, zumiranje, orbitiranje",
|
||||
"ui.parallel": "Paralelnost",
|
||||
"ui.parameters": "Parametri",
|
||||
"ui.part_size_needs_a_part": "Odaberite umetnuti standardni dio (vijak, maticu, podlošku ili zatik) da biste mu promijenili veličinu. Da tijelo povećate ili smanjite, koristite Skaliraj.",
|
||||
"ui.part_size_shared": "Ponovno gradi dio, zamjenjujući sve dodane značajke. Svi primjerci ove komponente ažuriraju se.",
|
||||
"ui.paste": "Zalijepi",
|
||||
"ui.path": "Putanja",
|
||||
@@ -4018,12 +4433,29 @@
|
||||
"ui.polygon": "Mnogokut",
|
||||
"ui.preferences": "Postavke",
|
||||
"ui.press_a_key": "pritisnite tipku…",
|
||||
"ui.print_face_cleared": "{body}: ploha ispisa uklonjena",
|
||||
"ui.print_face_input": "Ploha ispisa",
|
||||
"ui.print_face_one_body": "Ploha ispisa pripada jednom tijelu: pošaljite to tijelo samo da biste je promijenili",
|
||||
"ui.print_face_pick": "Odaberite ravnu plohu punog tijela da postane ploha ispisa",
|
||||
"ui.print_face_set": "{body}: ploha ispisa postavljena; Pošalji u slicer polaže tijelo na nju",
|
||||
"ui.profile": "Profil",
|
||||
"ui.profile_plane": "Ravnina profila",
|
||||
"ui.profiles": "Profili",
|
||||
"ui.project": "Projiciraj",
|
||||
"ui.project_face_edges_sketch": "Projiciraj bridove lica u nove skice",
|
||||
"ui.properties": "Svojstva",
|
||||
"ui.properties.copy_matrix": "Kopiraj matricu",
|
||||
"ui.properties.first_moments": "Statički momenti",
|
||||
"ui.properties.inertia": "Moment tromosti",
|
||||
"ui.properties.inertia_note": "Oko središta mase, u svjetskim osima (g·{unit}²)",
|
||||
"ui.properties.inertia_unavailable": "Nije dostupno: mreža tijela nije zatvorena.",
|
||||
"ui.properties.inertia_x": "Ixx, Ixy, Ixz",
|
||||
"ui.properties.inertia_y": "Iyx, Iyy, Iyz",
|
||||
"ui.properties.inertia_z": "Izx, Izy, Izz",
|
||||
"ui.properties.measuring": "Mjerenje…",
|
||||
"ui.properties.measuring_failed": "Mjerenje je zaustavljeno prije završetka.",
|
||||
"ui.properties.principal_axis": "Glavna os {number}",
|
||||
"ui.properties.principal_moments": "Glavni momenti tromosti",
|
||||
"ui.pull_direction": "Smjer vađenja iz kalupa",
|
||||
"ui.quality": "Kvaliteta",
|
||||
"ui.quantity": "Broj",
|
||||
@@ -4069,6 +4501,7 @@
|
||||
"ui.revolve": "Rotiraj",
|
||||
"ui.ribbon_exit": "Izlaz",
|
||||
"ui.ribbon_labels": "Prikaži tekst ispod ikona na traci",
|
||||
"ui.ribbon_menus_skip_pinned": "Izostavi prikvačene naredbe iz padajućih izbornika",
|
||||
"ui.ribbon_pin_footer": "Prikvačene naredbe prikazuju se na traci. Zadržite pokazivač iznad retka kako biste ga prikvačili ili otkvačili.",
|
||||
"ui.ribbon_workspace": "Radni prostor",
|
||||
"ui.right": "Desno",
|
||||
@@ -4086,6 +4519,7 @@
|
||||
"ui.select": "Odaberi",
|
||||
"ui.selectOther": "Odaberi drugo…",
|
||||
"ui.selectTangentChain": "Odaberi tangentni lanac",
|
||||
"ui.select_all": "Odaberi sve",
|
||||
"ui.selection": "Odabir",
|
||||
"ui.selection_modifiers": "Modifikatori odabira",
|
||||
"ui.selection_shift_add_only": "Shift+klik dodaje bez uklanjanja",
|
||||
@@ -4122,7 +4556,11 @@
|
||||
"ui.sketch": "Skica",
|
||||
"ui.sketch_dimension": "Kota skice",
|
||||
"ui.sketch_grid": "Mreža skice",
|
||||
"ui.sketch_intersect_geometry": "Geometrija",
|
||||
"ui.sketch_intersect_projection_link": "Veza projekcije",
|
||||
"ui.sketch_intersect_selection_filter": "Filtar odabira",
|
||||
"ui.sketch_modifiers": "Modifikatori skice",
|
||||
"ui.sketch_project_geometry": "Geometrija",
|
||||
"ui.sketch_scale": "Skaliranje skice",
|
||||
"ui.sketches": "Skice",
|
||||
"ui.slice": "Presijeci",
|
||||
@@ -4169,6 +4607,11 @@
|
||||
"ui.symmetric": "Simetrično",
|
||||
"ui.symmetry": "Simetrija",
|
||||
"ui.system": "Sustav",
|
||||
"ui.tab_assemble": "Sklopi",
|
||||
"ui.tab_manage": "Upravljanje",
|
||||
"ui.tab_sheet_metal": "Lim",
|
||||
"ui.tab_view": "Prikaz",
|
||||
"ui.tab_weldments": "Zavarene konstrukcije",
|
||||
"ui.tangent": "Tangentno",
|
||||
"ui.taper_angle": "Kut suženja",
|
||||
"ui.tapped": "S navojem",
|
||||
@@ -4184,6 +4627,7 @@
|
||||
"ui.tip_angle": "Kut vrha",
|
||||
"ui.to_object": "Do objekta",
|
||||
"ui.tool_direction": "Smjer alata",
|
||||
"ui.toolbar_tabs_hidden": "Sve kartice alatne trake su skrivene. Kliknite + ili ovdje desnom tipkom kako biste prikazali jednu.",
|
||||
"ui.top": "Odozgo",
|
||||
"ui.top_diameter": "Gornji promjer",
|
||||
"ui.top_radius": "Gornji polumjer",
|
||||
@@ -4221,6 +4665,8 @@
|
||||
"ui.view_centre": "Središte prikaza",
|
||||
"ui.viewport_status_clear": "Isključi {name}",
|
||||
"ui.viewport_status_clear_hint": "Isključi {name} · Esc",
|
||||
"ui.viewport_status_edges": "Bridovi: {count}",
|
||||
"ui.viewport_status_from": "iz smjera {direction}",
|
||||
"ui.viewport_status_key": "Prikaži legendu za {name}",
|
||||
"ui.viewport_status_minimum_radius": "Minimalni polumjer",
|
||||
"ui.viewport_status_pairs": "Parovi: {count}",
|
||||
@@ -4230,6 +4676,7 @@
|
||||
"ui.visual_shaded_with_edges": "Osjenčano s bridovima",
|
||||
"ui.visual_style": "Vizualni stil",
|
||||
"ui.visual_wireframe": "Žičani model",
|
||||
"ui.wheel_zoom_speed": "Brzina zumiranja kotačićem miša",
|
||||
"ui.width": "Širina",
|
||||
"ui.window_system": "Sustav prozora",
|
||||
"ui.window_system_auto": "Automatski",
|
||||
@@ -4260,7 +4707,9 @@
|
||||
"update.button": "Ažuriraj",
|
||||
"update.button_version": "Ažuriraj na {version}",
|
||||
"update.check_automatically": "Automatski provjeravaj ažuriranja",
|
||||
"update.check_for_updates": "Provjeri ažuriranja",
|
||||
"update.check_now": "Provjeri sada",
|
||||
"update.check_unavailable": "Provjera ažuriranja nije dostupna za ovu instalaciju.",
|
||||
"update.checking": "Provjera…",
|
||||
"update.copy": "Kopiraj",
|
||||
"update.dmg_opened": "Slika diska je otvorena i provjerena: povucite SolidCraft u Programe, zamijenite staru kopiju, a zatim ponovno pokrenite SolidCraft.",
|
||||
@@ -4283,6 +4732,9 @@
|
||||
"update.prefs_managed": "Ovo je SolidCraft {version}, kojim upravlja {manager}. Provjera pita GitHub za najnovije izdanje i ne šalje ništa drugo; ažurirajte SolidCraft u {manager}.",
|
||||
"update.prefs_note": "Ovo je SolidCraft {version} ({kind}). Provjera pita GitHub za najnovije izdanje i ne šalje ništa drugo.",
|
||||
"update.prefs_web": "Ponovno učitajte stranicu kako biste dobili najnoviju web aplikaciju. Ako mreža nije dostupna ili se ažuriranje ne može preuzeti na vrijeme, otvara se spremljena verzija; preuzimanje u tijeku nastavlja se za sljedeće ponovno učitavanje.",
|
||||
"update.refresh_checking": "Provjera najnovijeg izdanja…",
|
||||
"update.refresh_fallback": "Nije moguće provjeriti postoji li novije izdanje; ažurira se na {version}, pronađeno ranije.",
|
||||
"update.refresh_selected": "Ažuriranje na {version}.",
|
||||
"update.release_page": "Otvori stranicu izdanja",
|
||||
"update.restart": "Ponovno pokreni sada",
|
||||
"update.restart_later": "Kasnije",
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
"BLEND SURFACE": "ブレンドサーフェス",
|
||||
"BOUNDARY SURFACE": "境界サーフェス",
|
||||
"BROWSER": "ブラウザ",
|
||||
"Back to the original order": "元の順序に戻す",
|
||||
"Ball": "ボール",
|
||||
"Bar": "平鋼",
|
||||
"Base Center": "底面の中心",
|
||||
@@ -206,6 +207,7 @@
|
||||
"Edges": "エッジ",
|
||||
"Edit": "編集",
|
||||
"Edit Profile Sketch": "プロファイルスケッチを編集",
|
||||
"Edit shortcuts": "ショートカットを編集",
|
||||
"Enable rule": "ルールを有効化",
|
||||
"Enabled": "有効",
|
||||
"End Radius": "終了半径",
|
||||
@@ -468,6 +470,7 @@
|
||||
"Radius": "半径",
|
||||
"Radius Fit": "半径フィット",
|
||||
"Ratio": "比率",
|
||||
"Read-only list: shortcuts can't be changed here.": "読み取り専用の一覧です。ここではショートカットを変更できません。",
|
||||
"Reattach selected face": "選択した面を再アタッチ",
|
||||
"Recover": "復元",
|
||||
"Recover unsaved design?": "未保存のデザインを復元しますか?",
|
||||
@@ -593,6 +596,8 @@
|
||||
"Snap to face and edge centres": "面とエッジの中心にスナップ",
|
||||
"SolidCraft cannot submit reports directly. Submit on GitHub; no token is needed in the app.": "SolidCraftからレポートを直接送信することはできません。GitHubで送信してください。アプリにトークンは必要ありません。",
|
||||
"SolidCraft closed before these designs were saved. Their last autosave can be opened.": "これらのデザインが保存される前にSolidCraftが終了しました。最後の自動保存ファイルを開くことができます。",
|
||||
"Sort A to Z": "昇順で並べ替え",
|
||||
"Sort Z to A": "降順で並べ替え",
|
||||
"Spacing 2 must be a non-zero number": "間隔 2は0以外の数値にしてください",
|
||||
"Spacing must be a non-zero number": "間隔は0以外の数値にしてください",
|
||||
"Specialise": "特殊操作",
|
||||
@@ -652,6 +657,7 @@
|
||||
"Third point": "3点目",
|
||||
"This child is shared. Deleting it removes it from every copy of its parent.": "この子要素は共有されています。削除すると親のすべてのコピーから削除されます。",
|
||||
"This child is shared. Position changes apply to every copy of its parent.": "この子要素は共有されています。位置の変更は親のすべてのコピーに適用されます。",
|
||||
"This component is inside a subassembly placed more than once: aligning it moves it in every placement.": "このコンポーネントは複数配置されたサブアセンブリ内にあります。整列すると、すべての配置で移動します。",
|
||||
"This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "この面は安定したアタッチメントを提供できません。別の面を選択するか、固定平面を明示的に使用してください。",
|
||||
"This image is not attached to GitHub yet. Copy or save it, then attach it on GitHub.": "この画像はまだGitHubに添付されていません。コピーまたは保存し、GitHubで添付してください。",
|
||||
"Thread depth": "ねじ深さ",
|
||||
@@ -772,6 +778,8 @@
|
||||
"at the face": "面の位置",
|
||||
"bom.group_children": "サブパーツを親パーツの行に含める",
|
||||
"browser.body_name": "ボディ{number}",
|
||||
"browser.calibrate_click_a": "画像をクリックして点Aを指定するか、座標を入力してください。",
|
||||
"browser.calibrate_click_b": "画像をクリックして点Bを指定するか、座標を入力してください。",
|
||||
"browser.calibrate_title": "尺度を設定: {name}",
|
||||
"browser.capture_many": "{count}個のコンポーネントが移動されましたが、位置がキャプチャされていません。",
|
||||
"browser.capture_note": "「位置をキャプチャ」で新しい位置を保持し、「位置を元に戻す」で以前の位置に戻します。",
|
||||
@@ -814,6 +822,7 @@
|
||||
"cmd.appearance_pick_up": "外観を取得",
|
||||
"cmd.appearance_replace": "外観を置換",
|
||||
"cmd.assembly_bom": "部品表",
|
||||
"cmd.body.print_face": "造形面",
|
||||
"cmd.body_rename": "ボディの名前を変更",
|
||||
"cmd.browser_collapse_all": "すべて折りたたむ",
|
||||
"cmd.browser_expand_all": "すべて展開",
|
||||
@@ -821,6 +830,7 @@
|
||||
"cmd.browser_move": "ブラウザ項目を移動",
|
||||
"cmd.browser_order": "ブラウザ項目の並び順を変更",
|
||||
"cmd.browser_rename_group": "グループの名前を変更",
|
||||
"cmd.browser_reparent": "コンポーネントへ移動",
|
||||
"cmd.browser_ungroup": "グループ解除",
|
||||
"cmd.browser_visibility": "表示/非表示",
|
||||
"cmd.canvas_calibrate": "キャンバスの尺度を設定",
|
||||
@@ -847,7 +857,9 @@
|
||||
"cmd.component_metadata": "部品プロパティ",
|
||||
"cmd.component_metadata_set": "部品プロパティを変更",
|
||||
"cmd.component_move_bodies": "ボディをコンポーネントに移動",
|
||||
"cmd.component_move_features": "フィーチャーをコンポーネントに移動",
|
||||
"cmd.component_move_sketches": "スケッチをコンポーネントに移動",
|
||||
"cmd.component_paste_from_design": "別のデザインから貼り付け",
|
||||
"cmd.component_paste_new": "新規として貼り付け",
|
||||
"cmd.component_properties": "コンポーネントの物理的プロパティ",
|
||||
"cmd.component_relink": "参照元を再リンク",
|
||||
@@ -984,6 +996,7 @@
|
||||
"cmd.motion_trace": "モーション トレース",
|
||||
"cmd.motion_trace_edit": "モーション トレースを編集",
|
||||
"cmd.motion_trace_keep": "モーション トレースを保持",
|
||||
"cmd.occurrence_align": "オカレンスを整列",
|
||||
"cmd.occurrence_copy": "貼り付け(インスタンス)",
|
||||
"cmd.occurrence_drag": "オカレンスをドラッグ",
|
||||
"cmd.occurrence_ground": "空間固定",
|
||||
@@ -1074,6 +1087,13 @@
|
||||
"cmd.render_start": "画像をレンダリング",
|
||||
"cmd.render_status": "レンダリングの進行状況",
|
||||
"cmd.select_clear": "選択をクリア",
|
||||
"cmd.settings_profile_apply": "設定プロファイルを適用",
|
||||
"cmd.settings_profile_delete": "設定プロファイルを削除",
|
||||
"cmd.settings_profile_export": "設定プロファイルをエクスポート",
|
||||
"cmd.settings_profile_import": "設定プロファイルをインポート",
|
||||
"cmd.settings_profile_list": "設定プロファイル",
|
||||
"cmd.settings_profile_rename": "設定プロファイルの名前を変更",
|
||||
"cmd.settings_profile_save": "設定プロファイルを保存",
|
||||
"cmd.sheet_convert": "板金に変換",
|
||||
"cmd.sheet_export_bend_table": "曲げテーブルをエクスポート",
|
||||
"cmd.sheet_export_dxf": "展開図を DXF としてエクスポート",
|
||||
@@ -1087,6 +1107,16 @@
|
||||
"cmd.sheet_refold": "折り戻し",
|
||||
"cmd.sheet_rules": "板金ルールを一覧表示",
|
||||
"cmd.sheet_unfold": "展開",
|
||||
"cmd.sketch.construction_line": "補助直線",
|
||||
"cmd.sketch.construction_line.angle": "角度指定の補助直線",
|
||||
"cmd.sketch.construction_line.bisector": "角の二等分線",
|
||||
"cmd.sketch.construction_line.horizontal": "水平補助直線",
|
||||
"cmd.sketch.construction_line.parallel": "平行補助直線",
|
||||
"cmd.sketch.construction_line.perpendicular": "直交補助直線",
|
||||
"cmd.sketch.construction_line.tangent_at": "曲線上の点での接線",
|
||||
"cmd.sketch.construction_line.tangent_external": "外部点を通る接線",
|
||||
"cmd.sketch.construction_line.tangent_two": "共通接線",
|
||||
"cmd.sketch.construction_line.vertical": "垂直補助直線",
|
||||
"cmd.sketch_arc3d": "3D 円弧",
|
||||
"cmd.sketch_arc_center_point": "中心点円弧",
|
||||
"cmd.sketch_arc_tangent": "正接円弧",
|
||||
@@ -1119,6 +1149,8 @@
|
||||
"cmd.sketch_drawing_bounds": "図面のサイズ",
|
||||
"cmd.sketch_edit": "スケッチを編集",
|
||||
"cmd.sketch_edit_text": "テキストを編集",
|
||||
"cmd.sketch_equation_curve": "方程式曲線",
|
||||
"cmd.sketch_equation_curve_edit": "方程式曲線を編集",
|
||||
"cmd.sketch_export_dxf": "DXF として保存",
|
||||
"cmd.sketch_finish_auto_constrain": "自動拘束で終了",
|
||||
"cmd.sketch_fit_curves_to_section": "メッシュ断面に曲線をフィット",
|
||||
@@ -1215,6 +1247,7 @@
|
||||
"cmd.view.render_browser": "Renderブラウザー",
|
||||
"cmd.view.render_dock": "レンダードックを移動",
|
||||
"cmd.view.render_focus": "Renderフォーカス表示",
|
||||
"cmd.view.status_items": "ビューポートの状態項目",
|
||||
"cmd.view_ambient_occlusion": "アンビエントオクルージョン",
|
||||
"cmd.view_angle_readout": "ビュー角度",
|
||||
"cmd.view_apply": "名前付きビューを復元",
|
||||
@@ -1369,8 +1402,21 @@
|
||||
"help.material.assign": "選択した立体の材料を、鋼、アルミニウム、ABS などに設定します。質量と重さを実際の部品に合わせるときに使います。",
|
||||
"help.mit": "MITライセンス",
|
||||
"help.notice": "NOTICE",
|
||||
"help.occurrence.move": "アセンブリ部品をジョイントが許す自由度だけで動かします。部品の面を選択してから、操作可能な矢印または円弧をドラッグしてください。",
|
||||
"help.parameters.change": "デザインの寸法を決める名前付きの値と式の表を開きます。1か所で寸法を変え、それを使うすべてのフィーチャに反映させるときに使います。",
|
||||
"help.pointcloud.insert": "PLY・XYZ・PTS形式のスキャンを点群としてモデルと一緒に挿入します。計測データを参考にモデリングするときに使います。",
|
||||
"help.sketch.construction_line": "2点を通る無限の補助直線を作成します。スケッチの輪郭を分割せずに作図できます。",
|
||||
"help.sketch.construction_line.angle": "スケッチのX軸に対して角度を指定し、無限の補助直線を作成します。点を選び、角度を入力するか方向を選びます。",
|
||||
"help.sketch.construction_line.bisector": "交差する2本のスケッチ直線を選び、2つの角の二等分線から選びます。結果は元の直線の編集に追従します。",
|
||||
"help.sketch.construction_line.horizontal": "指定点を通る無限の水平補助直線を作成します。後で編集しても水平拘束が維持されます。",
|
||||
"help.sketch.construction_line.parallel": "スケッチの直線を選び、平行な無限の補助直線を配置します。右クリックで参照を選び直します。",
|
||||
"help.sketch.construction_line.perpendicular": "スケッチの直線を選び、直交する無限の補助直線を配置します。右クリックで参照を選び直します。",
|
||||
"help.sketch.construction_line.tangent_at": "円や円弧上の点、または開いたスプラインや円錐曲線の端点に接線を作成します。曲線を選び、接点を選びます。",
|
||||
"help.sketch.construction_line.tangent_external": "円または円弧、外部点、接線の解を順に選びます。プレビューには描かれた円弧上の接点のみが表示されます。",
|
||||
"help.sketch.construction_line.tangent_two": "2つの円または円弧を選び、プレビューから共通接線を選びます。接点は描かれた曲線上にある必要があります。",
|
||||
"help.sketch.construction_line.vertical": "指定点を通る無限の垂直補助直線を作成します。後で編集しても垂直拘束が維持されます。",
|
||||
"help.sketch.equation_curve": "x(t) と y(t)、または y = f(x) の式から、範囲を指定して曲線を描きます。式にはパラメーターを使え、曲線はその変更に追従します。正弦波、らせん、歯車のインボリュートなどに使います。",
|
||||
"help.sketch.inspect": "開いているスケッチのレポートを開きます。残りの自由度と、完全に拘束されているかどうかを表示します。スケッチを終える前に、まだ動く部分を確認するときに使います。",
|
||||
"help.solid.align": "選択した立体を動かし、その点、面、平面を別の場所の点、面、平面に合わせます。距離を測らずに部品を別の部品に当てて配置するときに使います。",
|
||||
"help.solid.chamfer": "選択した辺を、指定した距離で平らに斜めに削ります。鋭い角を落とすときや、ピンやねじを入れやすくするときに使います。",
|
||||
"help.solid.combine": "複数の立体を結合したり、対象の立体から切り取ったり、共通する体積だけを残したりでき、工具の立体を残すこともできます。部品の結合、ある形での切り抜き、2つの立体が重なる範囲の確認に使います。",
|
||||
@@ -1499,6 +1545,21 @@
|
||||
"joint.one_component": "これらの部品は 1 つのコンポーネントのボディです: {bodies}。ジョイントはコンポーネント同士を動かすため、部品ごとに専用のコンポーネントが必要です。",
|
||||
"joint.rigid_group_one_component": "これらの {count} 個のボディは、すべて 1 つのコンポーネント内(またはデザイン自体)にあります。先に「{command}」を使用してください。",
|
||||
"joint.rigid_group_select_components": "2 つ以上のコンポーネントを選択してください。",
|
||||
"joint_move.blocked_hint": "Rigid合致、部品の固定状態、ジョイントの制限値、パラメーターでの拘束を確認してください。",
|
||||
"joint_move.blocked_title": "この部品は移動できません",
|
||||
"joint_move.coarse": "軸に近い位置の回転刻み(°)",
|
||||
"joint_move.distance": "開始位置からの移動距離",
|
||||
"joint_move.done": "完了",
|
||||
"joint_move.fine": "軸から遠い位置の回転刻み(°)",
|
||||
"joint_move.fixed": "この部品には操作できるジョイントの自由度がありません。",
|
||||
"joint_move.help": "移動 — 矢印または円弧をドラッグ。Escでドラッグを取消。",
|
||||
"joint_move.legacy_hint": "オフにすると従来の移動パネルを使います。",
|
||||
"joint_move.precision": "破線ガイドの外側へ引くと回転を微調整できます。",
|
||||
"joint_move.rotation": "開始位置からの回転角",
|
||||
"joint_move.select": "面またはアセンブリ部品を1つ選択してから移動を実行してください。",
|
||||
"joint_move.settings": "アセンブリの移動",
|
||||
"joint_move.step": "刻み",
|
||||
"joint_move.use_handles": "アセンブリの移動にジョイントの操作ハンドルを使う",
|
||||
"keymap.command_id": "コマンドID",
|
||||
"keymap.empty": "一致するコマンドはありません",
|
||||
"keymap.use_anyway": "ここでは{key}をそのまま使用",
|
||||
@@ -1558,6 +1619,10 @@
|
||||
"material.selection.mixed": "異なる材料",
|
||||
"measure.at": "位置",
|
||||
"measure.item": "項目 {number}",
|
||||
"measure.quick_copied": "測定値をコピーしました",
|
||||
"measure.quick_copy": "クリックで測定値をコピー",
|
||||
"measure.quick_edges": "エッジ {count} 本",
|
||||
"measure.quick_faces": "面 {count} 個",
|
||||
"messages.ago_h": "{n} 時間前",
|
||||
"messages.ago_min": "{n} 分前",
|
||||
"messages.ago_s": "{n} 秒前",
|
||||
@@ -1593,6 +1658,8 @@
|
||||
"nav.maya.help": "Alt+左ドラッグで回転、Alt+中ドラッグでパン、Alt+右ドラッグでズーム。中ドラッグでもパン。",
|
||||
"nav.openscad.help": "空きスペースで左ドラッグすると回転、Shift+左ドラッグで矩形選択、スケッチ ジオメトリはドラッグで編集。右または中ドラッグでパン、Shift+右または Shift+中ドラッグでズーム。",
|
||||
"nav.perspective.sketch": "スケッチ編集中は平行投影で表示されます。透視投影に切り替えるにはスケッチを終了してください。",
|
||||
"nav.right_drag_orbits.help": "オフ:右ドラッグではカメラは動かず、右ボタンはコンテキストメニューを開くだけです。マウス割り当てで SolidWorks を選ぶとオフになります。",
|
||||
"nav.right_drag_orbits.label": "右ドラッグで回転",
|
||||
"nav.solidworks.help": "中ドラッグで回転、Ctrl+中ドラッグでパン、Shift+中ドラッグでズーム、右ドラッグで回転。",
|
||||
"nav.tinkercad.help": "右ドラッグで回転、中ドラッグまたは Shift+右ドラッグでパン。",
|
||||
"nav.touchpad.help": "Shift を押しながらポインターを動かすとパン、Alt/Option を押しながら動かすと回転します。マウスボタンは不要です。縦スクロールでズームします。",
|
||||
@@ -1614,6 +1681,9 @@
|
||||
"navbar.custom.customise": "ナビゲーションバーをカスタマイズ…",
|
||||
"navbar.custom.design": "デザイン",
|
||||
"navbar.custom.duplicate": "このスロットは既にバーにあります。",
|
||||
"navbar.custom.edge": "端",
|
||||
"navbar.custom.edge_bottom": "下",
|
||||
"navbar.custom.edge_top": "上",
|
||||
"navbar.custom.fade": "薄く表示",
|
||||
"navbar.custom.full": "別のスロットを追加するには、スロットを削除してください。",
|
||||
"navbar.custom.hidden_design": "デザインでは非表示",
|
||||
@@ -1705,6 +1775,11 @@
|
||||
"not a move": "移動ではありません",
|
||||
"not a number": "数値ではありません",
|
||||
"open a sketch first": "先にスケッチを開いてください",
|
||||
"parameters.apply_live": "フィールドを離れるたびに変更を適用",
|
||||
"parameters.apply_live_tip": "オフ: 変更は「適用」または「OK」まで保留され、その後すべてをまとめて一度だけ再構築します。「キャンセル」または Esc で破棄します。",
|
||||
"parameters.held": "{count} 件の変更が適用待ちです",
|
||||
"parameters.held_hint": "式と単位を編集してください。変更は「適用」または「OK」まで保留されます。",
|
||||
"parameters.held_one": "1 件の変更が適用待ちです",
|
||||
"parts.automatic_name": "自動",
|
||||
"parts.dimension.across_flats": "二面幅",
|
||||
"parts.dimension.bore": "内径",
|
||||
@@ -1720,12 +1795,15 @@
|
||||
"parts.dimension.thickness": "厚さ",
|
||||
"parts.dimension.width": "幅",
|
||||
"parts.family.bearing": "深溝玉軸受(外形)",
|
||||
"parts.family.button_head_cap_screw": "ボタンヘッド六角穴付きボルト",
|
||||
"parts.family.dowel_pin": "平行ピン",
|
||||
"parts.family.hex_bolt": "六角ボルト",
|
||||
"parts.family.hex_nut": "六角ナット",
|
||||
"parts.family.set_screw": "六角穴付き止めねじ 平先",
|
||||
"parts.family.socket_head_cap_screw": "六角穴付きボルト",
|
||||
"parts.family.washer": "平座金",
|
||||
"parts.holes": "穴 (省略可)",
|
||||
"parts.placement_hint": "1 つ以上の穴を選ぶとそれぞれに部品を取り付けます。選ばずに OK を押すと原点に配置します",
|
||||
"pattern.alignment_2": "配置 2",
|
||||
"pattern.alignment_hint": "個数には元の図形が含まれます。中央配置ではコピーを両側に配置し、反転で偶数個の場合に多く配置する側を切り替えます。",
|
||||
"pattern.direction_1": "方向 1",
|
||||
@@ -1778,6 +1856,11 @@
|
||||
"prefs.bottom_centre": "下中央",
|
||||
"prefs.bottom_right": "右下",
|
||||
"prefs.browser": "ブラウザー",
|
||||
"prefs.browser_eye_left": "表示切り替えを折りたたみ矢印の隣に表示",
|
||||
"prefs.browser_eye_left_note": "ブラウザーの各行の表示切り替えを、行の右端の列ではなく、以前のように折りたたみ矢印の隣に表示します。",
|
||||
"prefs.browser_reveal_on_hover": "ホバーで表示",
|
||||
"prefs.browser_show_note": "「表示」はブラウザーを常に画面に表示します。「ホバーで表示」はポインターがその位置か左端の細いタブに来るまで隠し、ポインターが中にある間やそのメニューが開いている間は表示したままにします。",
|
||||
"prefs.browser_shown": "表示",
|
||||
"prefs.built_in": "組み込み",
|
||||
"prefs.button_left": "左ドラッグ",
|
||||
"prefs.button_middle": "中央ドラッグ",
|
||||
@@ -1825,6 +1908,8 @@
|
||||
"prefs.graphics_card_restart": "SolidCraft の再起動後に有効になります。WGPU_ADAPTER_NAME がこの選択より優先されます。",
|
||||
"prefs.graphics_note": "速度と滑らかさのバランスを調整します。各選択肢の効果をサンプルで確認できます。",
|
||||
"prefs.graphics_presets_note": "プリセットは以下の設定をまとめて変更します。",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out": "ズームアウト時に拘束グリフを隠す",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out_note": "スケッチを十分にズームアウトすると、拘束グリフは表示されず画面を散らかしません。オフ: ズームに関係なく固定の画面サイズのままです。",
|
||||
"prefs.history": "履歴",
|
||||
"prefs.history_origin_bodies": "原点とボディを先頭に表示",
|
||||
"prefs.history_origin_bodies_note": "左側またはブラウザー下の履歴の先頭に、アクティブなコンポーネントのボディフォルダーと原点を、ブラウザーと同じ表示切り替えとメニュー付きで表示します。下部の履歴は変わりません。",
|
||||
@@ -1848,6 +1933,8 @@
|
||||
"prefs.layout_note": "コンパクトではパネルをウィンドウの端に固定します。ブラウザーの半透明表示はフローティングで使用できます。アシスタントの配置はアシスタントページで変更します。",
|
||||
"prefs.left": "左",
|
||||
"prefs.left_click": "左クリック",
|
||||
"prefs.line_drag_draws_one": "押してドラッグすると線を 1 本描く",
|
||||
"prefs.line_drag_draws_one_note": "線ツールで押してドラッグし、離すと、押した位置から離した位置まで線を 1 本描いてそこで終わります。クリックでは従来どおり連続した線を描きます。オフ: ドラッグはクリックと同じく、離した位置に点を置きます。",
|
||||
"prefs.linked_designs": "リンクされたデザイン",
|
||||
"prefs.live_input": "現在の入力",
|
||||
"prefs.live_preview": "ライブプレビュー",
|
||||
@@ -1861,6 +1948,9 @@
|
||||
"prefs.max_file_size_step": "STEP・インポートファイル",
|
||||
"prefs.max_file_size_web": "ウェブ版で開けるのは STEP・インポートファイルが 512 MB、デザインが 256 MB までです。ブラウザーのタブはそれ以上のファイルを保持できません。デスクトップ版では上限を上げられます。",
|
||||
"prefs.megabytes": "MB",
|
||||
"prefs.menu_grid": "大きなアイコン",
|
||||
"prefs.menu_list": "リスト",
|
||||
"prefs.menus": "メニュー",
|
||||
"prefs.minutes": "分",
|
||||
"prefs.minutes_suffix": " min",
|
||||
"prefs.mouse": "マウスとトラックパッド",
|
||||
@@ -1880,14 +1970,44 @@
|
||||
"prefs.origin_plane_names": "原点平面の名前",
|
||||
"prefs.origin_plane_names_note": "ブラウザー、ダイアログ、一覧に表示される名前です。{top} は XY、{front} は XZ、{right} は YZ です (Z が上)。コマンド、スクリプト、保存されたデザインでは XY、XZ、YZ のままです。",
|
||||
"prefs.overall_speed": "全体の速度",
|
||||
"prefs.parameter_list_rows": "パラメーター一覧の行数",
|
||||
"prefs.parameter_list_rows_tip": "空の値フィールドで下矢印を押すと、お気に入りを先頭にパラメーターをこの数まで一覧表示します。少なくすると大きな設計でも一覧が軽くなります。",
|
||||
"prefs.persistent_ribbon_pressed": "有効なリボンコマンドを強調表示",
|
||||
"prefs.persistent_ribbon_pressed_help": "効果が有効な間、リボンのコマンドを強調表示します。無効にすると、従来の中立的な表示とコマンドのヘルプを保持します。",
|
||||
"prefs.perspective_fov": "画角",
|
||||
"prefs.placement": "配置",
|
||||
"prefs.prefer_free_sketch_points": "スケッチ点が重なったときは移動可能な点を優先する",
|
||||
"prefs.preview_choices": "選択した設定のプレビュー",
|
||||
"prefs.print_face_highlight": "造形面の強調",
|
||||
"prefs.print_face_highlight_tip": "ビューでボディの造形面を色付けし輪郭を描く強さ。0 % で強調しません。",
|
||||
"prefs.profile_active": "使用中のプロファイル",
|
||||
"prefs.profile_applied": "プロファイルを適用しました。",
|
||||
"prefs.profile_changed": "プロファイルの保存後に設定が変更されています。「保存」でプロファイルに反映されます。",
|
||||
"prefs.profile_deleted": "プロファイルを削除しました。",
|
||||
"prefs.profile_export": "エクスポート…",
|
||||
"prefs.profile_exported": "プロファイルをエクスポートしました。",
|
||||
"prefs.profile_imported": "プロファイルをインポートしました。切り替えるには「使用中のプロファイル」で選択してください。",
|
||||
"prefs.profile_name_hint": "プロファイル名(例: ノートPC)",
|
||||
"prefs.profile_rename": "名前を変更",
|
||||
"prefs.profile_renamed": "プロファイルの名前を変更しました。",
|
||||
"prefs.profile_save": "保存",
|
||||
"prefs.profile_saved": "現在の設定をプロファイルに保存しました。",
|
||||
"prefs.profile_skipped": "プロファイルを適用しました。{n} 件の設定は現在の値のままです(ログを参照)。",
|
||||
"prefs.profiles": "設定プロファイル",
|
||||
"prefs.profiles_note": "ショートカット、ツールバー、ナビゲーション、ラジアルメニュー、インターフェース設定を名前を付けてまとめて保存し、一度に切り替えます。",
|
||||
"prefs.project_options_dialog": "Projectのオプションダイアログ",
|
||||
"prefs.project_options_dialog_note": "オン: 投影前に「ジオメトリ」または「ボディ」と「投影リンク」を選択します。オフ: 従来の直接選択方式を使用します。",
|
||||
"prefs.quality_default": "既定",
|
||||
"prefs.quality_fastest": "最速",
|
||||
"prefs.quality_slowest": "最も低速",
|
||||
"prefs.quality_smoother": "より滑らか",
|
||||
"prefs.quick_measure": "ビューの隅にクイック測定",
|
||||
"prefs.quick_measure_note": "選択したものの寸法をビューの右下、履歴の上に表示します: エッジの長さ(円形のものは Ø と R)、面の面積、点の位置、2 つの項目の距離と角度、複数のエッジや面の合計。クリックでコピーします。",
|
||||
"prefs.render_previous_geometry_budget": "レンダープレビューで以前のジオメトリ予算を使用",
|
||||
"prefs.render_previous_geometry_budget_help": "デバイスに基づく予算の代わりに、以前の固定ジオメトリ上限(64ビットデスクトップでは512 MiB、その他では128 MiB)に戻します。",
|
||||
"prefs.reports_saved": "{n} 件保存済み",
|
||||
"prefs.ribbon_reveal": "検索結果をリボンに表示",
|
||||
"prefs.ribbon_reveal_note": "コマンド検索で結果にポインターを合わせると、そのコマンドがリボンのどこにあるか(タブ、ボタン、またはパネルのドロップダウン内の行)を表示します。検索から開始したコマンドはそこで点滅し、ドロップダウンから実行中のコマンドはそのパネルに印が付きます。",
|
||||
"prefs.right_click": "右クリック",
|
||||
"prefs.saving": "自動保存と復元",
|
||||
"prefs.scale_note": "ウィンドウ内では Ctrl + / Ctrl − でも変更できます。100% のボタンは 28 px です。",
|
||||
@@ -1896,18 +2016,29 @@
|
||||
"prefs.search_empty": "一致する設定がありません",
|
||||
"prefs.select": "選択",
|
||||
"prefs.select_one_item": "項目を 1 つ選択",
|
||||
"prefs.select_other_hidden": "「他を選択」で非表示のジオメトリを選択",
|
||||
"prefs.select_other_hidden_help": "オン: ポインター付近の非表示のボディやスケッチ、遮られたエッジを含めます。オフ: ポインター直下の表示中のジオメトリだけを元のリストに表示します。",
|
||||
"prefs.selecting": "選択",
|
||||
"prefs.shift": "Shift",
|
||||
"prefs.shift_add_ctrl_toggle": "Shift は追加のみ、Ctrl / Cmd は選択を切り替え",
|
||||
"prefs.shift_add_note": "オン:Shift は追加、Ctrl / Cmd は選択を切り替えます。オフ(既定):どちらも選択を切り替えます。",
|
||||
"prefs.shortcuts": "ショートカット",
|
||||
"prefs.single_surface_analysis": "サーフェス解析を1つだけ使用",
|
||||
"prefs.single_surface_analysis_help": "オフの場合、サーフェスのシェーディングと連続性解析を同時に有効にできます。オンにすると、最後に開始または変更した解析が残ります。",
|
||||
"prefs.sketch_align_points": "描画中にほかのスケッチ点に揃える",
|
||||
"prefs.sketch_align_points_note": "描画中、点が一つのスケッチ点と水平に、別の点と垂直に同時に揃い、点線のガイドが表示されます。クリックすると両方の整列が保持されます。オフ: 直前の点にのみ、一度に一方向だけ揃えます。",
|
||||
"prefs.sketch_conflict_colour": "競合するジオメトリを競合色で表示",
|
||||
"prefs.sketch_conflict_colour_note": "スケッチの拘束が競合している間、満たされない拘束のグリフや寸法だけでなく、その拘束が保持する曲線と点も競合色で描画します。オフ: 通常の色のままです。",
|
||||
"prefs.sketch_construction_lines": "拡張補助直線ツール",
|
||||
"prefs.sketch_exit_view": "スケッチ終了時のビュー",
|
||||
"prefs.sketch_exit_view.keep": "現在のビューを維持",
|
||||
"prefs.sketch_exit_view.previous": "前のビューに戻る",
|
||||
"prefs.sketch_exit_view.unless_rotated": "回転していなければ戻る",
|
||||
"prefs.sketch_exit_view_note": "「スケッチを終了」、キャンセル、Esc の 2 回押しの後にビューが移る先です。",
|
||||
"prefs.sketch_open_look_at": "スケッチを開いたときに正対させる",
|
||||
"prefs.sketch_open_look_at_note": "オフ: スケッチの作成や編集でビューを動かしません。必要なときは「正面視」でスケッチに正対します。",
|
||||
"prefs.sketch_recent_snap": "最近使った中心と中点へ自動スナップ",
|
||||
"prefs.sketch_recent_snap_note": "作図中、直前の2つの円の中心または直線辺の中点のガイドが交わる位置にカーソルをスナップします。オフ: ガイドは表示のみで、カーソルは移動しません。",
|
||||
"prefs.sketch_selection": "スケッチと選択",
|
||||
"prefs.sketch_selection_heading": "スケッチと選択",
|
||||
"prefs.sketch_selection_note": "スケッチのスナップとクリックによる選択。",
|
||||
@@ -1952,23 +2083,47 @@
|
||||
"prefs.toast_place": "通知",
|
||||
"prefs.toggle_item": "項目を追加、または選択から外す",
|
||||
"prefs.toolbar": "ツールバー",
|
||||
"prefs.toolbar_tabs": "ツールバーのタブ",
|
||||
"prefs.top": "上",
|
||||
"prefs.trackpad_zoom_modifier": "2本指スクロールでズームする修飾キー",
|
||||
"prefs.trackpad_zoom_modifier.alt": "⌥ / Alt",
|
||||
"prefs.trackpad_zoom_modifier.cmd": "⌘",
|
||||
"prefs.trackpad_zoom_modifier.ctrl": "Ctrl",
|
||||
"prefs.trackpad_zoom_modifier.help": "このキーだけを押しながら縦にスクロールすると、ポインター位置を基準にズームします。オフでは従来のスクロール動作を維持します。",
|
||||
"prefs.trackpad_zoom_modifier.off": "オフ",
|
||||
"prefs.translucent": "半透明",
|
||||
"prefs.under_browser": "ブラウザー下",
|
||||
"prefs.under_cursor": "カーソル下",
|
||||
"prefs.units_precision": "単位と精度",
|
||||
"prefs.updates": "更新",
|
||||
"prefs.value_boxes_in_view": "ビューでハンドルの横に値を表示",
|
||||
"prefs.value_boxes_in_view_tip": "コマンドの値(距離、半径など)をモデル上のハンドルの横のボックスに表示します。オフにすると、値はコマンドウィンドウに入力します。選択後はそのウィンドウにキーボード入力が入り、モデルを覆うものはありません。",
|
||||
"prefs.view": "ビューの動作",
|
||||
"prefs.view_confirm_corner": "ビューの隅に OK とキャンセル",
|
||||
"prefs.view_confirm_corner_note": "ダイアログまたはスケッチを開いている間、ビュー右上のチェックとバツが、ダイアログの OK とキャンセルと同じ操作を行うか、スケッチを終了またはキャンセルします。ビューナビゲーターはその下に移動します。",
|
||||
"prefs.viewport": "ビューポート",
|
||||
"prefs.viewport_analysis_status": "ビューポートの解析状態を表示",
|
||||
"prefs.viewport_analysis_status_help": "有効な解析をビューポートの上部に表示し、各項目から凡例を開きます。Esc で最新の解析を解除します。無効にすると隅の凡例と従来の Esc 動作に戻ります。",
|
||||
"prefs.viewport_background": "背景",
|
||||
"prefs.viewport_background_colour": "色",
|
||||
"prefs.viewport_background_theme": "テーマのグラデーション",
|
||||
"prefs.viewport_section_status": "ビューポートの断面状態を表示",
|
||||
"prefs.viewport_section_status_help": "ビューポートに断面設定を表示します。Escape または有効なリボンボタンで断面を解除します。無効にすると従来の断面操作を維持します。",
|
||||
"prefs.viewport_status_summary": "ビューポートの状態項目をまとめる",
|
||||
"prefs.viewport_status_summary_help": "3 個以上の状態項目を 1 つのサマリーバッジにまとめます。無効にすると、すべての項目を従来の行に表示します。",
|
||||
"prefs.wheel": "ホイール",
|
||||
"prefs.wheel_trackpad": "ホイールとトラックパッド",
|
||||
"prefs.workspace": "ワークスペース",
|
||||
"prefs.zoom_stop_at_model": "モデルでズームを止める",
|
||||
"prefs.zoom_stop_at_model_tip": "3Dマウスとデバイスアプリはビュー中央の表面に向かってズームします。ドラッグズームはドラッグ開始点を固定します。オフの場合はモデルを通り抜けられます。ホイールとピンチは別の「カーソルへズーム」設定を使います",
|
||||
"prefs.zoom_toward_cursor": "カーソルに向かってズーム",
|
||||
"properties.title": "プロパティ: {name}",
|
||||
"recovery.days_ago": "{count}日前",
|
||||
"recovery.detail": "{file} · {features}フィーチャー · 自動保存: {when}",
|
||||
"recovery.discard_all": "すべて破棄",
|
||||
"recovery.discard_all_detail": "この操作は元に戻せません。",
|
||||
"recovery.discard_all_title": "{count} 件の自動保存を破棄しますか?",
|
||||
"recovery.discard_all_title_one": "1 件の自動保存を破棄しますか?",
|
||||
"recovery.hours_ago": "{count}時間前",
|
||||
"recovery.just_now": "たった今",
|
||||
"recovery.min_ago": "{count}分前",
|
||||
@@ -2834,7 +2989,9 @@
|
||||
"render.output_ready": "レンダーの準備完了",
|
||||
"render.output_run_check": "チェックを実行",
|
||||
"render.output_size_limit": "{method}:各辺 {dimension} px、合計 {pixels} ピクセルまで。対応する最大サイズ:{width} × {height}。",
|
||||
"render.output_size_method_profile": "{width} × {height} をレンダリングするには、{method} と CPUリソースプロファイル「{profile}」を選ぶか、より小さいサイズを選んでください。",
|
||||
"render.output_size_ok": "サイズOK · {width} × {height} px",
|
||||
"render.output_size_profile": "{width} × {height} をレンダリングするには、CPUリソースプロファイル「{profile}」を選ぶか、より小さいサイズを選んでください。",
|
||||
"render.output_swap_orientation": "幅と高さを交換",
|
||||
"render.output_tools_inspector": "サイズと形式は出力インスペクターで編集してください。",
|
||||
"render.output_view_image": "画像を表示",
|
||||
@@ -3047,6 +3204,7 @@
|
||||
"render.size_custom": "カスタム…",
|
||||
"render.size_full_hd": "フルHD",
|
||||
"render.size_hd": "HD",
|
||||
"render.size_needs_profile": "{size}・「{profile}」が必要",
|
||||
"render.size_presets": "サイズプリセット",
|
||||
"render.size_presets_pending": "出力エディターとともに追加予定",
|
||||
"render.size_preview": "プレビュー",
|
||||
@@ -3296,6 +3454,7 @@
|
||||
"select an axis": "軸を選択してください",
|
||||
"select an axis, a straight or circular edge, or a cylinder, cone or torus face first": "軸、直線または円のエッジ、あるいは円柱・円錐・トーラスの面を先に選択してください",
|
||||
"select bodies first": "ボディを先に選択してください",
|
||||
"select components first": "コンポーネントを先に選択してください",
|
||||
"select corner points, or the two lines of one corner": "コーナーの点、または1つのコーナーの2本の線を選択してください",
|
||||
"select one corner point, or the two lines of one corner": "コーナーの点を1つ、または1つのコーナーの2本の線を選択してください",
|
||||
"select sheet edges first": "板金のエッジを先に選択してください",
|
||||
@@ -3314,6 +3473,7 @@
|
||||
"settings.double_click_components": "コンポーネントをダブルクリックしてアクティブにする、またはリンクされたものをその場で編集する",
|
||||
"settings.frame_rate_details_note": "直近のフレーム時間のグラフ(描画した三角形数を重ねて表示)、フレーム時間のヒストグラム、GPU が描画した内容を追加します。ビューのフレームレートをクリックすると表示/非表示を切り替えます。",
|
||||
"settings.frame_rate_note": "ビューの右下に 1 秒あたりのフレーム数を表示します。",
|
||||
"settings.insert_lists_open_designs": "デザインを挿入で、ほかのタブで開いているデザインを先に表示する",
|
||||
"settings.measure_axis_distances": "計測のX・Y・Z距離を表示",
|
||||
"settings.measure_axis_distances_help": "計測ダイアログを開いている間、2点間距離に加えてワールドX・Y・Z軸方向の寸法線と距離を表示します。",
|
||||
"settings.msaa_applies_on_restart": "アンチエイリアスは次回 SolidCraft を起動したときに適用されます",
|
||||
@@ -3332,12 +3492,34 @@
|
||||
"sheet.flange_type_contour": "輪郭",
|
||||
"sheet.flange_type_edge": "エッジ",
|
||||
"sheet.no_body": "板金ボディがありません。フランジ > Base で作成するか、板金に変換でプレートを板金に変換してください(広い平面を選択)。",
|
||||
"sheet.personal_rules.confirm_delete": "削除を確認",
|
||||
"sheet.personal_rules.delete": "削除",
|
||||
"sheet.personal_rules.delete_prompt": "この個人用ルールを削除しますか?デザインに既にあるルールは変更されません。",
|
||||
"sheet.personal_rules.full": "個人用ライブラリには既に64個のルールがあります。",
|
||||
"sheet.personal_rules.invalid_name": "改行や制御文字を含まない短い名前を入力してください。",
|
||||
"sheet.personal_rules.invalid_values": "ルールの値をすべて入力してください。各値はこのデザインで計算でき、板厚は正の値、K係数は0〜1である必要があります。",
|
||||
"sheet.personal_rules.missing": "選択した個人用ルールは利用できなくなりました。",
|
||||
"sheet.personal_rules.name": "ルール名",
|
||||
"sheet.personal_rules.name_exists": "同じ名前の個人用ルールが既にあります。別の名前を指定してください。",
|
||||
"sheet.personal_rules.name_hint": "一意の名前",
|
||||
"sheet.personal_rules.overwrite": "選択した個人用ルールの変更を保存",
|
||||
"sheet.personal_rules.rename": "名前を変更",
|
||||
"sheet.personal_rules.rule": "個人用ルール",
|
||||
"sheet.personal_rules.save": "新規保存",
|
||||
"sheet.personal_rules.scope": "すべてのデザインで使えるようにプロファイルに保存します。",
|
||||
"sheet.personal_rules.select": "ルールを選択",
|
||||
"sheet.personal_rules.title": "個人用ルール",
|
||||
"sheet.personal_rules.unsupported": "このルールには、このバージョンで使用できない値が含まれています。",
|
||||
"shortcut.json_error": "パラメータはJSON形式で指定してください: {error}",
|
||||
"shortcut.no_command": "コマンド`{id}`がありません。JSONの前のテキストはコマンドIDである必要があります",
|
||||
"shortcut.pin": "Sボックスの先頭にピン留め",
|
||||
"shortcut.unpin": "ピン留めを解除",
|
||||
"sketch is missing": "スケッチが見つかりません",
|
||||
"sketch.degrees_of_freedom": "自由度 {count}",
|
||||
"sketch.dimension_added_driven": "スケッチがすでにその寸法を決めているため、従動寸法(参照寸法)として追加しました",
|
||||
"sketch.dimension_applied": "寸法を適用しました",
|
||||
"sketch.dimension_applied_defined": "寸法を適用しました。パラメータ `{name}` を定義しました",
|
||||
"sketch.dimension_applied_renamed": "寸法を適用しました。パラメータ名を `{name}` にしました",
|
||||
"sketch.dof_left": "残り自由度 {count}",
|
||||
"sketch.dof_left_one": "残り自由度 {count}",
|
||||
"sketch.draw_curves": "{linetype}として描く",
|
||||
@@ -3364,6 +3546,7 @@
|
||||
"sketch_text.align_right": "右",
|
||||
"sketch_text.bold": "太字",
|
||||
"sketch_text.builtin_font": "{family}(内蔵)",
|
||||
"sketch_text.formula": "= で始めるとパラメーターから文字列を組み立てられます: ='W' + number(Width)",
|
||||
"sketch_text.italic": "斜体",
|
||||
"sketch_text.loading_fonts": "インストール済みフォントを検索中…",
|
||||
"sketch_text.on_path": "文字はパスに沿います: 位置は曲線で決まります",
|
||||
@@ -3372,6 +3555,8 @@
|
||||
"sketch_text.use_font_file": "フォント ファイル {path} を使用",
|
||||
"solid": "中実",
|
||||
"status.editing": "編集中: {name}",
|
||||
"status.navigation": "マウスの割り当て: {mapping}",
|
||||
"status.navigation_tip": "マウスでビューを動かす方法。クリックして別の割り当てを選択",
|
||||
"status.under_constrained": "拘束不足(自由度 {count})",
|
||||
"status.under_constrained_one": "拘束不足(自由度 {count})",
|
||||
"status.units_tip": "デザインの単位。クリックして変更",
|
||||
@@ -3405,8 +3590,10 @@
|
||||
"timeline.delete_folders_tip": "フィーチャーと入れ子のフォルダーを履歴に残します",
|
||||
"timeline.delete_folders_with_features_tip": "フォルダーを、中のすべてのフィーチャーと入れ子のフォルダーごと削除します",
|
||||
"timeline.delete_many": "選択した {count} 個のフィーチャーを削除",
|
||||
"timeline.edited_rolled_back": "{name} を変更しましたが、履歴マーカーより後ろにあるため構築されません。結果を見るにはマーカーをその先へ移動してください",
|
||||
"timeline.feature_error": "エラー: {message}",
|
||||
"timeline.feature_hint": "ダブルクリックで編集 · ドラッグで並べ替え · 右クリックでその他の操作",
|
||||
"timeline.feature_rolled_back": "ロールバック中: 履歴マーカーより後ろのため構築されません",
|
||||
"timeline.feature_warning": "警告: {message}",
|
||||
"timeline.group": "フィーチャーフォルダを新規作成",
|
||||
"timeline.move_many": "タイムライン項目を移動",
|
||||
@@ -3488,6 +3675,10 @@
|
||||
"ui.3d_mouse_offer": "3Dマウスをキャリブレーションすると、入れ替わった軸や反転した軸が直り、速度と操作感も整います。",
|
||||
"ui.3d_mouse_offer_never": "今後表示しない",
|
||||
"ui.3d_mouse_offer_swap": "Hidraw(直接ドライバー)に切り替える",
|
||||
"ui.3d_mouse_orbit": "回転",
|
||||
"ui.3d_mouse_orbit_classic": "クラシック",
|
||||
"ui.3d_mouse_orbit_tip": "トレース:3Dマウスで回転を始めたときにビューの中央にあるモデルの部分を中心にビューを回転し、その点を淡い球で示します。クラシック:ビューの中心を基準に回転します。",
|
||||
"ui.3d_mouse_orbit_traced": "トレース",
|
||||
"ui.3d_mouse_reading": "読み取り値",
|
||||
"ui.3d_mouse_reset_axes": "軸の割り当てをリセット",
|
||||
"ui.3d_mouse_reset_view": "表示をリセット",
|
||||
@@ -3496,6 +3687,8 @@
|
||||
"ui.3d_mouse_section": "3Dマウス",
|
||||
"ui.3d_mouse_show_in_view": "3Dビューに3Dマウスを表示",
|
||||
"ui.3d_mouse_show_in_view_tip": "左下に3Dマウスの絵を表示し、操作に合わせて動かします。",
|
||||
"ui.3d_mouse_sketch_orbit": "3D マウスでスケッチを回転",
|
||||
"ui.3d_mouse_sketch_orbit_tip": "スケッチを開いて正面から見ているときも、マウスと同じように 3D マウスでビューを回転します。オフ: ビューを傾けるまで、スケッチのパンとズームのみ行います。",
|
||||
"ui.3d_mouse_skip": "このデバイスではできません",
|
||||
"ui.3d_mouse_skip_tip": "この動きを両方向とも飛ばし、キャリブレーションから外します。",
|
||||
"ui.3d_mouse_speed": "3D マウス速度",
|
||||
@@ -3524,6 +3717,8 @@
|
||||
"ui.3d_mouse_step_twist_counterclockwise": "キャップを反時計回りにひねって保持し、離してください。",
|
||||
"ui.3d_mouse_switch_cap": "センターに戻るタイプとしてキャリブレーション",
|
||||
"ui.3d_mouse_switch_trackball": "トラックボールとしてキャリブレーション",
|
||||
"ui.3d_mouse_use_direct": "直接ドライバーを使用",
|
||||
"ui.3d_mouse_use_direct_tip": "spacenavd を経由せず、3Dマウスを直接 (hidraw) 読み取ります。",
|
||||
"ui.3d_mouse_view_axis": "ビューの軸",
|
||||
"ui.3d_mouse_view_off": "オフ",
|
||||
"ui.3d_mouse_view_off_tip": "3D マウスのドライバーのプロファイルがこの軸をオフにしているため、この軸の動きではビューは動きません。ここで他の軸の動きを選ぶと 2 つが入れ替わり、その動きではビューが動かなくなります。",
|
||||
@@ -3657,6 +3852,8 @@
|
||||
"ui.agent_chat_remove": "待機から削除",
|
||||
"ui.agent_chat_remove_file": "このメッセージから外す",
|
||||
"ui.agent_chat_remove_imported": "このメッセージから外します。パーツはデザインに残ります (元に戻すで削除できます)",
|
||||
"ui.agent_chat_reply_cut_off": "応答が終わる前に長さの上限に達したため、不完全な可能性があります。続けるか、もっと短く答えるようエージェントに頼んでください。",
|
||||
"ui.agent_chat_reply_declined": "モデルはこのメッセージへの回答を断りました。",
|
||||
"ui.agent_chat_retry": "再試行",
|
||||
"ui.agent_chat_right": "右",
|
||||
"ui.agent_chat_save": "保存",
|
||||
@@ -3840,6 +4037,7 @@
|
||||
"ui.circle": "円",
|
||||
"ui.circular_pattern": "円形パターン",
|
||||
"ui.clear": "クリア",
|
||||
"ui.clear_print_face": "造形面を解除",
|
||||
"ui.clear_recent": "最近使った項目をクリア",
|
||||
"ui.clear_the_selection": "選択をクリア",
|
||||
"ui.click_selects_whole_bodies": "クリックでボディ全体を選択",
|
||||
@@ -3874,6 +4072,15 @@
|
||||
"ui.constant": "一定",
|
||||
"ui.constraints_conflict": "拘束が競合しています",
|
||||
"ui.construction": "コンストラクション",
|
||||
"ui.construction.angle_hint": "補助直線: 点をクリックし、角度を入力するか方向を選択",
|
||||
"ui.construction.bisector_hint": "二等分線: 交差する2直線を選び、必要な解を選択",
|
||||
"ui.construction.common_hint": "共通接線: 2つの円/円弧を選び、必要な解を選択",
|
||||
"ui.construction.contact_hint": "接線: 円/円弧または開いたスプライン/円錐曲線を選び、接点を選択 (自由曲線は端点のみ)",
|
||||
"ui.construction.external_hint": "接線: 円または円弧、外部点、必要な解の順に選択",
|
||||
"ui.construction.free_hint": "補助直線: 2点をクリック。右クリックで最初から",
|
||||
"ui.construction.point_hint": "補助直線: 通過点をクリック",
|
||||
"ui.construction.reference_hint": "補助直線: 直線、点の順に選択。右クリックで参照を変更",
|
||||
"ui.construction.ribbon_label": "補助線",
|
||||
"ui.context_menu": "コンテキスト メニュー",
|
||||
"ui.continuity_g0": "G0 折れ",
|
||||
"ui.continuity_g1": "G1 接線",
|
||||
@@ -3965,6 +4172,14 @@
|
||||
"ui.end_scale": "終端スケール",
|
||||
"ui.entities": "エンティティ",
|
||||
"ui.equal": "等しい",
|
||||
"ui.equation_end": "終了",
|
||||
"ui.equation_explicit": "陽関数",
|
||||
"ui.equation_form": "形式",
|
||||
"ui.equation_note": "変数は単位のない数値です。sin(t) はラジアンとして扱います。単位のない結果はデザインの単位になります。",
|
||||
"ui.equation_parametric": "パラメトリック",
|
||||
"ui.equation_x_of_t": "x(t)",
|
||||
"ui.equation_y_of_t": "y(t)",
|
||||
"ui.equation_y_of_x": "y(x)",
|
||||
"ui.equivalent_radius": "等価半径",
|
||||
"ui.expand": "展開",
|
||||
"ui.exportDxf": "DXF をエクスポート…",
|
||||
@@ -4030,6 +4245,7 @@
|
||||
"ui.heading_design": "デザイン",
|
||||
"ui.heading_draft": "勾配",
|
||||
"ui.heading_edit": "編集",
|
||||
"ui.heading_equation_curve": "方程式曲線",
|
||||
"ui.heading_extrude": "押し出し",
|
||||
"ui.heading_fillet": "フィレット",
|
||||
"ui.heading_finish_editing": "編集を終了",
|
||||
@@ -4121,6 +4337,10 @@
|
||||
"ui.import_ellipsis": "インポート…",
|
||||
"ui.infinite": "無限",
|
||||
"ui.insert": "挿入",
|
||||
"ui.insert_design.browse": "参照…",
|
||||
"ui.insert_design.open_designs": "開いているデザイン",
|
||||
"ui.insert_design.saved_file": "{name} に保存されていない変更があるため、保存済みのファイルを挿入しました。保存してから、リンクを更新で変更を取り込んでください。",
|
||||
"ui.insert_design.unsaved": "未保存の変更",
|
||||
"ui.inspect": "検査",
|
||||
"ui.intersect": "交差",
|
||||
"ui.isolate": "分離表示",
|
||||
@@ -4220,6 +4440,7 @@
|
||||
"ui.pan_zoom_orbit": "パン、ズーム、オービット",
|
||||
"ui.parallel": "平行",
|
||||
"ui.parameters": "パラメータ",
|
||||
"ui.part_size_needs_a_part": "サイズを変更する挿入済みの標準パーツ(ねじ、ナット、座金、ピン)を選択してください。ボディを拡大・縮小するには尺度を使います。",
|
||||
"ui.part_size_shared": "パーツを再構築し、追加したフィーチャを置き換えます。このコンポーネントのすべての配置が更新されます。",
|
||||
"ui.paste": "貼り付け",
|
||||
"ui.path": "パス",
|
||||
@@ -4249,12 +4470,17 @@
|
||||
"ui.plugins_skipped": "{count} 個のフォルダを読めませんでした。",
|
||||
"ui.plugins_version": "{version}",
|
||||
"ui.point": "点",
|
||||
"ui.point_cloud_add_filter": "フィルターを追加…",
|
||||
"ui.point_cloud_auto_range": "範囲を自動設定",
|
||||
"ui.point_cloud_color_by": "色の付け方",
|
||||
"ui.point_cloud_file_colors": "ファイルの色",
|
||||
"ui.point_cloud_filter_by": "フィルター",
|
||||
"ui.point_cloud_height_high": "最高の高さ",
|
||||
"ui.point_cloud_height_low": "最低の高さ",
|
||||
"ui.point_cloud_legend_filter": "上の凡例で表示・非表示を切り替え",
|
||||
"ui.point_cloud_no_file_colors": "ファイルに色情報がありません",
|
||||
"ui.point_cloud_pause": "一時停止",
|
||||
"ui.point_cloud_play": "再生",
|
||||
"ui.point_cloud_single_color": "単色",
|
||||
"ui.point_cloud_size": "点のサイズ",
|
||||
"ui.point_cloud_units": "ファイルの単位",
|
||||
@@ -4263,12 +4489,29 @@
|
||||
"ui.polygon": "ポリゴン",
|
||||
"ui.preferences": "環境設定",
|
||||
"ui.press_a_key": "キーを押してください…",
|
||||
"ui.print_face_cleared": "{body}: 造形面を解除しました",
|
||||
"ui.print_face_input": "造形面",
|
||||
"ui.print_face_one_body": "造形面はボディごとに選びます。変更するにはそのボディだけを送信してください",
|
||||
"ui.print_face_pick": "ソリッドボディの平面を1つ選択すると造形面になります",
|
||||
"ui.print_face_set": "{body}: 造形面を設定しました。スライサーへ送るとこの面を下にして置きます",
|
||||
"ui.profile": "プロファイル",
|
||||
"ui.profile_plane": "プロファイル平面",
|
||||
"ui.profiles": "プロファイル",
|
||||
"ui.project": "投影",
|
||||
"ui.project_face_edges_sketch": "新規スケッチに面のエッジを自動投影",
|
||||
"ui.properties": "プロパティ",
|
||||
"ui.properties.copy_matrix": "行列をコピー",
|
||||
"ui.properties.first_moments": "一次モーメント",
|
||||
"ui.properties.inertia": "慣性モーメント",
|
||||
"ui.properties.inertia_note": "重心まわり、ワールド軸 (g·{unit}²)",
|
||||
"ui.properties.inertia_unavailable": "利用できません: ボディのメッシュが閉じていません。",
|
||||
"ui.properties.inertia_x": "Ixx, Ixy, Ixz",
|
||||
"ui.properties.inertia_y": "Iyx, Iyy, Iyz",
|
||||
"ui.properties.inertia_z": "Izx, Izy, Izz",
|
||||
"ui.properties.measuring": "測定中…",
|
||||
"ui.properties.measuring_failed": "測定が完了する前に停止しました。",
|
||||
"ui.properties.principal_axis": "主軸 {number}",
|
||||
"ui.properties.principal_moments": "主慣性モーメント",
|
||||
"ui.pull_direction": "抜き方向",
|
||||
"ui.quality": "品質",
|
||||
"ui.quantity": "数量",
|
||||
@@ -4314,6 +4557,7 @@
|
||||
"ui.revolve": "回転",
|
||||
"ui.ribbon_exit": "終了",
|
||||
"ui.ribbon_labels": "リボンのアイコンの下にテキストを表示",
|
||||
"ui.ribbon_menus_skip_pinned": "ピン留めしたコマンドをドロップダウンメニューに表示しない",
|
||||
"ui.ribbon_pin_footer": "ピン留めしたコマンドはリボンに表示されます。行にポインターを合わせて、ピン留めや解除ができます。",
|
||||
"ui.ribbon_workspace": "ワークスペース",
|
||||
"ui.right": "右側面",
|
||||
@@ -4331,6 +4575,8 @@
|
||||
"ui.select": "選択",
|
||||
"ui.selectOther": "その他を選択…",
|
||||
"ui.selectTangentChain": "接線チェーンを選択",
|
||||
"ui.select_all": "すべて選択",
|
||||
"ui.select_components_by_face": "コンポーネントを選択(面をクリックするとそのコンポーネントが選択されます)",
|
||||
"ui.selection": "選択",
|
||||
"ui.selection_modifiers": "選択修飾キー",
|
||||
"ui.selection_shift_add_only": "Shift+クリックで追加のみ(解除なし)",
|
||||
@@ -4367,7 +4613,16 @@
|
||||
"ui.sketch": "スケッチ",
|
||||
"ui.sketch_dimension": "スケッチ寸法",
|
||||
"ui.sketch_grid": "スケッチ グリッド",
|
||||
"ui.sketch_intersect_geometry": "ジオメトリ",
|
||||
"ui.sketch_intersect_projection_link": "投影リンク",
|
||||
"ui.sketch_intersect_selection_filter": "選択フィルター",
|
||||
"ui.sketch_modifiers": "スケッチ修飾キー",
|
||||
"ui.sketch_project_geometry": "ジオメトリ",
|
||||
"ui.sketch_report.all_constrained": "すべて完全に拘束されています。",
|
||||
"ui.sketch_report.dof": "自由度",
|
||||
"ui.sketch_report.loose": "完全には拘束されていません",
|
||||
"ui.sketch_report.status": "状態",
|
||||
"ui.sketch_report.title": "スケッチ レポート",
|
||||
"ui.sketch_scale": "スケッチ尺度",
|
||||
"ui.sketches": "スケッチ",
|
||||
"ui.slice": "スライス",
|
||||
@@ -4414,6 +4669,11 @@
|
||||
"ui.symmetric": "対称",
|
||||
"ui.symmetry": "対称",
|
||||
"ui.system": "システム",
|
||||
"ui.tab_assemble": "アセンブリ",
|
||||
"ui.tab_manage": "管理",
|
||||
"ui.tab_sheet_metal": "板金",
|
||||
"ui.tab_view": "表示",
|
||||
"ui.tab_weldments": "溶接構造",
|
||||
"ui.tangent": "正接",
|
||||
"ui.taper_angle": "テーパ角度",
|
||||
"ui.tapped": "ねじ穴",
|
||||
@@ -4429,6 +4689,7 @@
|
||||
"ui.tip_angle": "先端角度",
|
||||
"ui.to_object": "オブジェクトまで",
|
||||
"ui.tool_direction": "工具方向",
|
||||
"ui.toolbar_tabs_hidden": "ツールバーのタブはすべて非表示です。+ をクリックするか、ここを右クリックして表示します。",
|
||||
"ui.top": "上面",
|
||||
"ui.top_diameter": "上面の直径",
|
||||
"ui.top_radius": "上面の半径",
|
||||
@@ -4466,15 +4727,25 @@
|
||||
"ui.view_centre": "ビュー中心",
|
||||
"ui.viewport_status_clear": "{name}をオフにする",
|
||||
"ui.viewport_status_clear_hint": "{name}をオフにする · Esc",
|
||||
"ui.viewport_status_edges": "{count} エッジ",
|
||||
"ui.viewport_status_from": "方向 {direction}",
|
||||
"ui.viewport_status_key": "{name}の凡例を表示",
|
||||
"ui.viewport_status_minimum_radius": "最小半径",
|
||||
"ui.viewport_status_pairs": "{count} 組",
|
||||
"ui.viewport_status_section_hatch": "{setting} · ハッチング",
|
||||
"ui.viewport_status_section_plane": "現在の平面",
|
||||
"ui.viewport_status_section_tilted": "傾斜 · {offset}",
|
||||
"ui.viewport_status_stripes": "縞 {count} 本",
|
||||
"ui.viewport_status_summary_clear": "すべて解除",
|
||||
"ui.viewport_status_summary_heading": "このビュー内",
|
||||
"ui.viewport_status_summary_label": "{name} と他 {count} 項目",
|
||||
"ui.viewport_status_summary_more": "+{count}",
|
||||
"ui.viewport_theme_follow": "テーマに従う",
|
||||
"ui.visual_shaded_hidden_edges": "隠線付きシェーディング",
|
||||
"ui.visual_shaded_with_edges": "エッジ付きシェーディング",
|
||||
"ui.visual_style": "表示スタイル",
|
||||
"ui.visual_wireframe": "ワイヤーフレーム",
|
||||
"ui.wheel_zoom_speed": "マウスホイールのズーム速度",
|
||||
"ui.width": "幅",
|
||||
"ui.window_system": "ウィンドウシステム",
|
||||
"ui.window_system_auto": "自動",
|
||||
@@ -4505,7 +4776,9 @@
|
||||
"update.button": "アップデート",
|
||||
"update.button_version": "{version} にアップデート",
|
||||
"update.check_automatically": "アップデートを自動的に確認",
|
||||
"update.check_for_updates": "アップデートを確認",
|
||||
"update.check_now": "今すぐ確認",
|
||||
"update.check_unavailable": "このインストールではアップデートを確認できません。",
|
||||
"update.checking": "確認中…",
|
||||
"update.copy": "コピー",
|
||||
"update.dmg_opened": "ディスクイメージを検証して開きました: SolidCraft をアプリケーションフォルダにドラッグして古いものを置き換え、SolidCraft を再起動してください。",
|
||||
@@ -4528,6 +4801,9 @@
|
||||
"update.prefs_managed": "これは {manager} が管理している SolidCraft {version} です。確認では GitHub に最新リリースを問い合わせるだけで、ほかには何も送信しません。SolidCraft は {manager} で更新してください。",
|
||||
"update.prefs_note": "これは SolidCraft {version} ({kind}) です。確認では GitHub に最新リリースを問い合わせるだけで、ほかには何も送信しません。",
|
||||
"update.prefs_web": "ページを再読み込みすると、最新のウェブアプリを取得します。ネットワークが利用できない場合や、更新のダウンロードが時間内に完了しない場合は、保存済みのバージョンを開きます。進行中のダウンロードは次回の再読み込みに向けて続行されます。",
|
||||
"update.refresh_checking": "最新のリリースを確認中…",
|
||||
"update.refresh_fallback": "新しいリリースを確認できませんでした。以前見つかった {version} に更新します。",
|
||||
"update.refresh_selected": "{version} に更新中。",
|
||||
"update.release_page": "リリースページを開く",
|
||||
"update.restart": "今すぐ再起動",
|
||||
"update.restart_later": "後で",
|
||||
|
||||
@@ -711,11 +711,13 @@
|
||||
"cmd.appearance_pick_up": "모양 가져오기",
|
||||
"cmd.appearance_replace": "모양 바꾸기",
|
||||
"cmd.assembly_bom": "자재 명세서",
|
||||
"cmd.body.print_face": "출력 바닥면",
|
||||
"cmd.body_rename": "바디 이름 변경",
|
||||
"cmd.browser_group": "새 그룹",
|
||||
"cmd.browser_move": "브라우저 항목 이동",
|
||||
"cmd.browser_order": "브라우저 항목 정렬",
|
||||
"cmd.browser_rename_group": "그룹 이름 변경",
|
||||
"cmd.browser_reparent": "구성 요소로 이동",
|
||||
"cmd.browser_ungroup": "그룹 해제",
|
||||
"cmd.browser_visibility": "표시/숨기기",
|
||||
"cmd.canvas_calibrate": "캔버스 보정",
|
||||
@@ -738,6 +740,7 @@
|
||||
"cmd.component_metadata": "부품 속성",
|
||||
"cmd.component_metadata_set": "부품 속성 변경",
|
||||
"cmd.component_move_bodies": "바디를 구성 요소로 이동",
|
||||
"cmd.component_move_features": "특성을 구성 요소로 이동",
|
||||
"cmd.component_move_sketches": "스케치를 구성 요소로 이동",
|
||||
"cmd.component_paste_new": "새로 붙여넣기",
|
||||
"cmd.component_properties": "구성 요소 물리 속성",
|
||||
@@ -956,6 +959,16 @@
|
||||
"cmd.sheet_refold": "다시 접기",
|
||||
"cmd.sheet_rules": "판금 규칙 목록",
|
||||
"cmd.sheet_unfold": "펼치기",
|
||||
"cmd.sketch.construction_line": "보조 직선",
|
||||
"cmd.sketch.construction_line.angle": "각도 지정 보조 직선",
|
||||
"cmd.sketch.construction_line.bisector": "각의 이등분선",
|
||||
"cmd.sketch.construction_line.horizontal": "수평 보조 직선",
|
||||
"cmd.sketch.construction_line.parallel": "평행 보조 직선",
|
||||
"cmd.sketch.construction_line.perpendicular": "직교 보조 직선",
|
||||
"cmd.sketch.construction_line.tangent_at": "곡선 위 점에서의 접선",
|
||||
"cmd.sketch.construction_line.tangent_external": "외부 점을 지나는 접선",
|
||||
"cmd.sketch.construction_line.tangent_two": "공통 접선",
|
||||
"cmd.sketch.construction_line.vertical": "수직 보조 직선",
|
||||
"cmd.sketch_arc_center_point": "중심점 호",
|
||||
"cmd.sketch_arc_tangent": "접선 호",
|
||||
"cmd.sketch_arc_three_point": "3점 호",
|
||||
@@ -985,6 +998,8 @@
|
||||
"cmd.sketch_draw_dimensioned": "치수가 있는 스케치 개체 그리기",
|
||||
"cmd.sketch_edit": "스케치 편집",
|
||||
"cmd.sketch_edit_text": "텍스트 편집",
|
||||
"cmd.sketch_equation_curve": "방정식 곡선",
|
||||
"cmd.sketch_equation_curve_edit": "방정식 곡선 편집",
|
||||
"cmd.sketch_export_dxf": "DXF로 저장",
|
||||
"cmd.sketch_finish_auto_constrain": "자동 구속으로 완료",
|
||||
"cmd.sketch_fit_curves_to_section": "메시 단면에 곡선 맞추기",
|
||||
@@ -1079,6 +1094,7 @@
|
||||
"cmd.view.render_browser": "렌더 브라우저",
|
||||
"cmd.view.render_dock": "렌더 도크 이동",
|
||||
"cmd.view.render_focus": "렌더 집중 보기",
|
||||
"cmd.view.status_items": "뷰포트 상태 항목",
|
||||
"cmd.view_ambient_occlusion": "앰비언트 오클루전",
|
||||
"cmd.view_angle_readout": "뷰 각도",
|
||||
"cmd.view_apply": "이름 있는 보기 복원",
|
||||
@@ -1194,6 +1210,17 @@
|
||||
"help.mit": "MIT 라이선스",
|
||||
"help.notice": "NOTICE",
|
||||
"help.pointcloud.insert": "PLY, XYZ 또는 PTS 스캔을 모델 옆에 포인트 클라우드로 삽입합니다. 측정 데이터를 참고하여 모델링할 때 사용합니다.",
|
||||
"help.sketch.construction_line": "두 점을 지나는 무한 보조 직선을 만듭니다. 스케치 프로파일을 나누지 않고 작도할 수 있습니다.",
|
||||
"help.sketch.construction_line.angle": "스케치 X축을 기준으로 지정한 각도의 무한 보조 직선을 만듭니다. 점을 선택한 뒤 각도를 입력하거나 방향을 선택합니다.",
|
||||
"help.sketch.construction_line.bisector": "교차하는 두 스케치 직선을 선택한 뒤 두 각의 이등분선 중 하나를 선택합니다. 결과는 원본 직선의 편집을 따릅니다.",
|
||||
"help.sketch.construction_line.horizontal": "한 점을 지나는 무한 수평 보조 직선을 만듭니다. 나중에 편집해도 수평 구속이 유지됩니다.",
|
||||
"help.sketch.construction_line.parallel": "스케치 직선을 선택한 뒤 평행한 무한 보조 직선을 배치합니다. 다른 참조를 선택하려면 마우스 오른쪽 버튼을 클릭합니다.",
|
||||
"help.sketch.construction_line.perpendicular": "스케치 직선을 선택한 뒤 직교하는 무한 보조 직선을 배치합니다. 다른 참조를 선택하려면 마우스 오른쪽 버튼을 클릭합니다.",
|
||||
"help.sketch.construction_line.tangent_at": "원이나 원호 위의 점, 또는 열린 스플라인이나 원뿔 곡선의 끝점에 접선을 만듭니다. 곡선을 선택한 뒤 접점을 선택합니다.",
|
||||
"help.sketch.construction_line.tangent_external": "원 또는 원호, 외부 점, 접선 해를 차례로 선택합니다. 미리보기에는 그려진 원호 위의 접점만 표시됩니다.",
|
||||
"help.sketch.construction_line.tangent_two": "두 원 또는 원호를 선택한 뒤 미리보기에서 공통 접선을 선택합니다. 접점은 그려진 곡선 위에 있어야 합니다.",
|
||||
"help.sketch.construction_line.vertical": "한 점을 지나는 무한 수직 보조 직선을 만듭니다. 나중에 편집해도 수직 구속이 유지됩니다.",
|
||||
"help.sketch.equation_curve": "범위에 걸쳐 수식으로 곡선을 그립니다: x(t)와 y(t), 또는 y = f(x). 수식에 매개변수를 쓸 수 있으며 곡선이 그 값을 따라갑니다. 사인파, 나선, 기어 이의 인벌류트에 사용합니다.",
|
||||
"help.solid.chamfer": "선택한 모서리를 지정한 거리만큼 평평하게 깎습니다. 날카로운 모서리를 다듬거나 핀 또는 나사가 쉽게 들어가도록 할 때 사용합니다.",
|
||||
"help.solid.extrude": "스케치 프로파일을 지정한 거리만큼 3D로 밀어내 재료를 더하거나 제거합니다. 평면 윤곽을 블록, 보스 또는 포켓으로 만들 때 사용합니다.",
|
||||
"help.solid.fillet": "선택한 모서리를 지정한 반지름의 매끄러운 원호로 둥글게 만듭니다. 강도, 편의성 또는 외관을 위해 날카로운 모서리를 부드럽게 할 때 사용합니다.",
|
||||
@@ -1330,6 +1357,8 @@
|
||||
"nav.maya.help": "Alt+왼쪽 드래그는 회전, Alt+가운데 드래그는 이동, Alt+오른쪽 드래그는 확대/축소입니다. 가운데 드래그로도 이동합니다",
|
||||
"nav.openscad.help": "빈 공간에서 왼쪽 드래그는 회전, Shift+왼쪽 드래그는 상자 선택, 스케치 형상 드래그는 편집입니다. 오른쪽 또는 가운데 드래그는 이동, Shift+오른쪽 또는 Shift+가운데 드래그는 확대/축소입니다",
|
||||
"nav.perspective.sketch": "스케치 편집 중에는 직교 뷰를 사용합니다. 원근 뷰를 전환하려면 스케치를 마치세요.",
|
||||
"nav.right_drag_orbits.help": "끄면 오른쪽 드래그는 카메라에 영향을 주지 않고 오른쪽 버튼은 컨텍스트 메뉴만 엽니다. SolidWorks 마우스 매핑을 선택하면 꺼집니다.",
|
||||
"nav.right_drag_orbits.label": "오른쪽 드래그로 회전",
|
||||
"nav.solidworks.help": "가운데 드래그는 회전, Ctrl+가운데 드래그는 이동, Shift+가운데 드래그는 확대/축소, 오른쪽 드래그는 회전입니다",
|
||||
"nav.tinkercad.help": "오른쪽 드래그는 회전, 가운데 또는 Shift+오른쪽 드래그는 이동입니다",
|
||||
"nav.touchpad.help": "Shift를 누른 채 포인터를 움직이면 화면이 이동하고, Alt/Option을 누른 채 움직이면 회전합니다. 마우스 버튼은 필요 없습니다. 세로 스크롤로 확대/축소합니다.",
|
||||
@@ -1497,6 +1526,8 @@
|
||||
"prefs.bottom_centre": "하단 가운데",
|
||||
"prefs.bottom_right": "오른쪽 아래",
|
||||
"prefs.browser": "브라우저",
|
||||
"prefs.browser_eye_left": "표시 아이콘을 접기 화살표 옆에 표시",
|
||||
"prefs.browser_eye_left_note": "브라우저 행의 표시 아이콘을 행 오른쪽 끝의 열이 아니라 이전처럼 접기 화살표 옆에 표시합니다.",
|
||||
"prefs.built_in": "기본 제공",
|
||||
"prefs.button_left": "왼쪽 드래그",
|
||||
"prefs.button_middle": "가운데 드래그",
|
||||
@@ -1540,6 +1571,8 @@
|
||||
"prefs.graphics": "그래픽",
|
||||
"prefs.graphics_note": "속도와 부드러움 중에서 선택합니다. 각 선택의 효과가 샘플에 표시됩니다.",
|
||||
"prefs.graphics_presets_note": "프리셋은 아래의 선택 항목을 한 번에 설정합니다.",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out": "축소 시 구속 조건 기호 숨기기",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out_note": "스케치를 충분히 축소하면 구속 조건 기호가 가려지지 않도록 숨깁니다. 끄기: 확대/축소와 관계없이 고정된 화면 크기를 유지합니다.",
|
||||
"prefs.history": "이력",
|
||||
"prefs.history_origin_bodies": "원점과 바디를 맨 위에 표시",
|
||||
"prefs.history_origin_bodies_note": "왼쪽 또는 브라우저 아래의 히스토리가 활성 구성 요소의 바디 폴더와 원점으로 시작하며, 브라우저처럼 표시 아이콘과 메뉴가 있습니다. 아래쪽 히스토리는 바뀌지 않습니다.",
|
||||
@@ -1558,6 +1591,8 @@
|
||||
"prefs.layout_note": "컴팩트는 패널을 창 가장자리에 고정합니다. 브라우저 반투명은 플로팅에서 사용할 수 있습니다. 어시스턴트 위치는 어시스턴트 페이지에서 바꿀 수 있습니다.",
|
||||
"prefs.left": "왼쪽",
|
||||
"prefs.left_click": "왼쪽 클릭",
|
||||
"prefs.line_drag_draws_one": "누른 채 드래그하면 선 하나 그리기",
|
||||
"prefs.line_drag_draws_one_note": "선 도구에서 누르고 드래그한 뒤 놓으면 누른 곳에서 놓은 곳까지 선 하나를 그리고 거기서 끝납니다. 클릭하면 이전처럼 이어지는 선을 그립니다. 끄면: 드래그는 클릭처럼 놓은 곳에 점을 둡니다.",
|
||||
"prefs.live_input": "실시간 입력",
|
||||
"prefs.live_preview": "실시간 미리보기",
|
||||
"prefs.max_file_size": "열 수 있는 최대 파일 크기",
|
||||
@@ -1582,7 +1617,14 @@
|
||||
"prefs.origin_plane_names": "원점 평면 이름",
|
||||
"prefs.origin_plane_names_note": "브라우저, 대화 상자, 목록에 표시되는 이름입니다. {top}은 XY, {front}는 XZ, {right}는 YZ이며 Z가 위쪽입니다. 명령, 스크립트, 저장된 디자인은 XY, XZ, YZ를 유지합니다.",
|
||||
"prefs.overall_speed": "전체 속도",
|
||||
"prefs.persistent_ribbon_pressed": "활성 리본 명령 강조 표시",
|
||||
"prefs.persistent_ribbon_pressed_help": "효과가 켜져 있는 동안 리본 명령을 강조 표시합니다. 끄면 이전의 중립적인 모양과 명령 도움말을 유지합니다.",
|
||||
"prefs.perspective_fov": "시야각",
|
||||
"prefs.preview_choices": "선택 항목 미리보기",
|
||||
"prefs.print_face_highlight": "출력 바닥면 강조",
|
||||
"prefs.print_face_highlight_tip": "뷰에서 바디의 출력 바닥면을 색칠하고 윤곽을 그리는 강도입니다. 0 %이면 강조하지 않습니다.",
|
||||
"prefs.project_options_dialog": "Project 옵션 대화상자",
|
||||
"prefs.project_options_dialog_note": "켜기: 투영 전에 지오메트리 또는 바디와 투영 링크를 선택합니다. 끄기: 기존 직접 선택 작업 흐름을 유지합니다.",
|
||||
"prefs.quality_default": "기본값",
|
||||
"prefs.quality_fastest": "가장 빠름",
|
||||
"prefs.quality_slowest": "가장 느림",
|
||||
@@ -1596,13 +1638,24 @@
|
||||
"prefs.search_empty": "일치하는 설정이 없습니다",
|
||||
"prefs.select": "선택",
|
||||
"prefs.select_one_item": "항목 하나 선택",
|
||||
"prefs.select_other_hidden": "다른 항목 선택으로 숨겨진 형상 선택",
|
||||
"prefs.select_other_hidden_help": "켜짐: 포인터 근처의 숨겨진 바디, 스케치 및 가려진 모서리를 포함합니다. 꺼짐: 포인터 바로 아래에 보이는 형상만 포함하는 기존 목록을 사용합니다.",
|
||||
"prefs.selecting": "선택",
|
||||
"prefs.shift": "Shift",
|
||||
"prefs.shift_add_ctrl_toggle": "Shift는 추가만, Ctrl / Cmd는 토글",
|
||||
"prefs.shift_add_note": "켬: Shift는 추가, Ctrl / Cmd는 토글. 끔(기본값): 둘 다 토글.",
|
||||
"prefs.shortcuts": "단축키",
|
||||
"prefs.single_surface_analysis": "표면 분석 하나만 사용",
|
||||
"prefs.single_surface_analysis_help": "끄면 표면 음영 분석과 연속성 분석을 함께 유지할 수 있습니다. 켜면 마지막으로 시작하거나 변경한 분석만 유지됩니다.",
|
||||
"prefs.sketch_align_points": "그리는 동안 다른 스케치 점에 맞추기",
|
||||
"prefs.sketch_align_points_note": "그리는 동안 점이 한 스케치 점과 수평으로, 다른 점과 수직으로 동시에 맞춰지고 점선 안내선이 표시됩니다. 클릭하면 두 정렬이 모두 유지됩니다. 끄기: 이전 점에만, 한 번에 한 축씩 맞춥니다.",
|
||||
"prefs.sketch_conflict_colour": "충돌하는 기하를 충돌 색상으로 표시",
|
||||
"prefs.sketch_conflict_colour_note": "스케치의 구속 조건이 충돌하는 동안 실패한 구속 조건의 글리프나 치수뿐 아니라 그 구속 조건이 잡고 있는 곡선과 점도 충돌 색상으로 그립니다. 끄기: 평소 색상을 유지합니다.",
|
||||
"prefs.sketch_construction_lines": "확장 보조 직선 도구",
|
||||
"prefs.sketch_open_look_at": "스케치를 열 때 정면으로 돌리기",
|
||||
"prefs.sketch_open_look_at_note": "끄기: 스케치를 만들거나 편집해도 뷰가 그대로입니다. 필요할 때 '바라보기'로 스케치를 정면으로 봅니다.",
|
||||
"prefs.sketch_recent_snap": "최근 중심과 중점에 자동 스냅",
|
||||
"prefs.sketch_recent_snap_note": "그리는 동안 최근에 사용한 두 원의 중심 또는 직선 모서리 중점의 안내선이 만나는 위치로 커서를 스냅합니다. 끄기: 안내선은 보기만 하고 커서는 움직이지 않습니다.",
|
||||
"prefs.sketch_selection": "스케치 및 선택",
|
||||
"prefs.sketch_selection_heading": "스케치 및 선택",
|
||||
"prefs.sketch_selection_note": "스케치가 스냅되는 방식과 클릭으로 선택하는 방식입니다.",
|
||||
@@ -1638,23 +1691,44 @@
|
||||
"prefs.toast_place": "알림",
|
||||
"prefs.toggle_item": "항목을 추가하거나 다시 제거",
|
||||
"prefs.toolbar": "도구 모음",
|
||||
"prefs.toolbar_tabs": "도구 모음 탭",
|
||||
"prefs.top": "위쪽",
|
||||
"prefs.trackpad_zoom_modifier": "다음 키를 누른 채 두 손가락으로 스크롤하여 확대/축소",
|
||||
"prefs.trackpad_zoom_modifier.alt": "⌥ / Alt",
|
||||
"prefs.trackpad_zoom_modifier.cmd": "⌘",
|
||||
"prefs.trackpad_zoom_modifier.ctrl": "Ctrl",
|
||||
"prefs.trackpad_zoom_modifier.help": "이 키만 누른 채 세로로 스크롤하면 포인터 위치를 기준으로 확대/축소합니다. 끄면 기존 스크롤 동작을 유지합니다.",
|
||||
"prefs.trackpad_zoom_modifier.off": "끄기",
|
||||
"prefs.translucent": "반투명",
|
||||
"prefs.under_browser": "브라우저 아래",
|
||||
"prefs.under_cursor": "커서 아래",
|
||||
"prefs.units_precision": "단위 및 정밀도",
|
||||
"prefs.updates": "업데이트",
|
||||
"prefs.value_boxes_in_view": "뷰에서 핸들 옆에 값 표시",
|
||||
"prefs.value_boxes_in_view_tip": "명령의 값(거리, 반경 등)을 모델 위 핸들 옆 상자에 표시합니다. 끄면 값은 명령 창에 입력하며, 선택 후 키보드 입력이 그 창으로 가고 모델을 가리는 것이 없습니다.",
|
||||
"prefs.view": "뷰 동작",
|
||||
"prefs.view_confirm_corner": "뷰 모서리에 확인 및 취소",
|
||||
"prefs.view_confirm_corner_note": "대화 상자나 스케치가 열려 있는 동안 뷰 오른쪽 위의 체크와 X 표시가 대화 상자의 확인과 취소와 같은 동작을 하거나 스케치를 마치고 취소합니다. 뷰 탐색기는 그 아래로 내려갑니다.",
|
||||
"prefs.viewport": "뷰포트",
|
||||
"prefs.viewport_analysis_status": "뷰포트 해석 상태 표시",
|
||||
"prefs.viewport_analysis_status_help": "활성 해석을 뷰포트 위에 표시하고 각 항목에서 범례를 엽니다. Esc로 최신 해석을 끕니다. 끄면 모서리 범례와 이전 Esc 동작으로 돌아갑니다.",
|
||||
"prefs.viewport_section_status": "뷰포트 단면 상태 표시",
|
||||
"prefs.viewport_section_status_help": "뷰포트에 단면 설정을 표시합니다. Escape 키와 활성 리본 버튼으로 단면을 끕니다. 비활성화하면 이전 단면 조작을 유지합니다.",
|
||||
"prefs.viewport_status_summary": "뷰포트 상태 항목 요약",
|
||||
"prefs.viewport_status_summary_help": "상태 항목이 3개 이상이면 하나의 요약 배지로 표시합니다. 비활성화하면 모든 항목을 기존 행에 표시합니다.",
|
||||
"prefs.wheel": "휠",
|
||||
"prefs.wheel_trackpad": "휠 및 트랙패드",
|
||||
"prefs.workspace": "작업 공간",
|
||||
"prefs.zoom_stop_at_model": "모델에서 확대/축소 멈추기",
|
||||
"prefs.zoom_stop_at_model_tip": "3D 마우스와 장치 앱은 뷰 중앙의 표면을 향해 확대/축소하고, 드래그 확대/축소는 드래그 시작점을 고정합니다. 끄면 모델을 통과할 수 있습니다. 휠과 핀치는 별도의 커서로 확대/축소 설정을 사용합니다",
|
||||
"prefs.zoom_toward_cursor": "확대/축소, 커서 방향으로",
|
||||
"properties.title": "속성: {name}",
|
||||
"recovery.days_ago": "{count}일 전",
|
||||
"recovery.detail": "{file} · 피처 {features}개 · {when} 자동 저장",
|
||||
"recovery.discard_all": "모두 버리기",
|
||||
"recovery.discard_all_detail": "이 작업은 되돌릴 수 없습니다.",
|
||||
"recovery.discard_all_title": "자동 저장 {count}개를 버리시겠습니까?",
|
||||
"recovery.discard_all_title_one": "자동 저장 1개를 버리시겠습니까?",
|
||||
"recovery.hours_ago": "{count}시간 전",
|
||||
"recovery.just_now": "방금",
|
||||
"recovery.min_ago": "{count}분 전",
|
||||
@@ -2206,7 +2280,9 @@
|
||||
"render.output_ready": "렌더링 준비 완료",
|
||||
"render.output_run_check": "검사 실행",
|
||||
"render.output_size_limit": "{method}: 한 변 최대 {dimension} px, 총 {pixels} 픽셀. 가능한 최대 크기: {width} × {height}.",
|
||||
"render.output_size_method_profile": "{width} × {height}을(를) 렌더링하려면 {method}와(과) {profile} CPU 리소스 프로필을 선택하거나 더 작은 크기를 선택하세요.",
|
||||
"render.output_size_ok": "크기 정상 · {width} × {height} px",
|
||||
"render.output_size_profile": "{width} × {height}을(를) 렌더링하려면 {profile} CPU 리소스 프로필이나 더 작은 크기를 선택하세요.",
|
||||
"render.output_tools_inspector": "출력 검사기에서 크기와 형식을 편집하세요.",
|
||||
"render.output_view_image": "이미지 보기",
|
||||
"render.paint_label": "칠하기",
|
||||
@@ -2338,6 +2414,7 @@
|
||||
"render.size_custom": "사용자 지정…",
|
||||
"render.size_full_hd": "풀 HD",
|
||||
"render.size_hd": "HD",
|
||||
"render.size_needs_profile": "{size} · {profile} 필요",
|
||||
"render.size_presets": "크기 프리셋",
|
||||
"render.size_presets_pending": "출력 편집기와 함께 제공 예정",
|
||||
"render.size_preview": "미리보기",
|
||||
@@ -2545,6 +2622,7 @@
|
||||
"settings.display_quality_note": "세밀할수록 곡면과 모서리가 더 매끄럽게 표시되지만 메시 생성 시간이 늘어납니다. 뷰포트만 바뀌며 설계나 내보내기는 바뀌지 않습니다.",
|
||||
"settings.double_click_components": "구성 요소를 두 번 클릭하여 활성화하거나 연결된 구성 요소를 제자리에서 편집",
|
||||
"settings.frame_rate_note": "뷰의 오른쪽 아래에 초당 프레임 수를 표시합니다.",
|
||||
"settings.insert_lists_open_designs": "설계 삽입에서 다른 탭에 열린 설계를 먼저 표시",
|
||||
"settings.measure_axis_distances": "X/Y/Z 거리 표시",
|
||||
"settings.measure_axis_distances_help": "측정 대화상자가 열려 있는 동안 전체 거리와 함께 월드 축 방향 치수와 거리를 표시합니다.",
|
||||
"settings.msaa_applies_on_restart": "안티앨리어싱은 다음에 SolidCraft를 시작할 때 적용됩니다",
|
||||
@@ -2558,12 +2636,34 @@
|
||||
"sheet.flange_type_base": "베이스",
|
||||
"sheet.flange_type_contour": "윤곽",
|
||||
"sheet.flange_type_edge": "모서리",
|
||||
"sheet.personal_rules.confirm_delete": "삭제 확인",
|
||||
"sheet.personal_rules.delete": "삭제",
|
||||
"sheet.personal_rules.delete_prompt": "이 개인 규칙을 삭제할까요? 설계에 이미 있는 규칙은 바뀌지 않습니다.",
|
||||
"sheet.personal_rules.full": "개인 라이브러리에 이미 규칙이 64개 있습니다.",
|
||||
"sheet.personal_rules.invalid_name": "줄 바꿈이나 제어 문자가 없는 짧은 이름을 입력하세요.",
|
||||
"sheet.personal_rules.invalid_values": "규칙 값을 모두 입력하세요. 각 값은 이 설계에서 계산할 수 있어야 하며, 두께는 양수, K 계수는 0에서 1 사이여야 합니다.",
|
||||
"sheet.personal_rules.missing": "선택한 개인 규칙을 더 이상 사용할 수 없습니다.",
|
||||
"sheet.personal_rules.name": "규칙 이름",
|
||||
"sheet.personal_rules.name_exists": "같은 이름의 개인 규칙이 이미 있습니다. 다른 이름을 사용하세요.",
|
||||
"sheet.personal_rules.name_hint": "고유한 이름",
|
||||
"sheet.personal_rules.overwrite": "선택한 개인 규칙에 변경 사항 저장",
|
||||
"sheet.personal_rules.rename": "이름 바꾸기",
|
||||
"sheet.personal_rules.rule": "개인 규칙",
|
||||
"sheet.personal_rules.save": "새로 저장",
|
||||
"sheet.personal_rules.scope": "모든 설계에서 쓸 수 있도록 프로필에 저장됩니다.",
|
||||
"sheet.personal_rules.select": "규칙 선택",
|
||||
"sheet.personal_rules.title": "개인 규칙",
|
||||
"sheet.personal_rules.unsupported": "이 규칙에는 이 버전에서 사용할 수 없는 값이 있습니다.",
|
||||
"shortcut.json_error": "매개변수는 JSON 형식이어야 합니다: {error}",
|
||||
"shortcut.no_command": "`{id}` 명령이 없습니다. JSON 앞의 텍스트는 명령 ID여야 합니다",
|
||||
"shortcut.pin": "S 상자 맨 위에 고정",
|
||||
"shortcut.unpin": "고정 해제",
|
||||
"sketch is missing": "스케치가 없습니다",
|
||||
"sketch.degrees_of_freedom": "자유도 {count}개",
|
||||
"sketch.dimension_added_driven": "스케치가 이미 이 치수를 결정하므로 종속(참조) 치수로 추가했습니다",
|
||||
"sketch.dimension_applied": "치수를 적용했습니다",
|
||||
"sketch.dimension_applied_defined": "치수를 적용했습니다. 매개변수 `{name}`을(를) 정의했습니다",
|
||||
"sketch.dimension_applied_renamed": "치수를 적용했습니다. 매개변수 이름을 `{name}`(으)로 지정했습니다",
|
||||
"sketch.dof_left": "남은 자유도 {count}개",
|
||||
"sketch.dof_left_one": "남은 자유도 {count}개",
|
||||
"sketch.draw_curves": "{linetype}(으)로 그리기",
|
||||
@@ -2698,6 +2798,10 @@
|
||||
"ui.3d_mouse_offer": "3D 마우스를 보정하면 바뀌거나 반전된 축이 바로잡히고 속도와 조작감이 맞춰집니다.",
|
||||
"ui.3d_mouse_offer_never": "다시 표시하지 않음",
|
||||
"ui.3d_mouse_offer_swap": "Hidraw(직접 드라이버)로 전환",
|
||||
"ui.3d_mouse_orbit": "궤도 회전",
|
||||
"ui.3d_mouse_orbit_classic": "클래식",
|
||||
"ui.3d_mouse_orbit_tip": "추적: 회전을 시작할 때 뷰 가운데에 있는 모델 부분을 중심으로 3D 마우스가 뷰를 회전하며, 그 점을 희미한 구로 표시합니다. 클래식: 뷰의 중심을 기준으로",
|
||||
"ui.3d_mouse_orbit_traced": "추적",
|
||||
"ui.3d_mouse_reading": "읽은 값",
|
||||
"ui.3d_mouse_reset_axes": "축 지정 초기화",
|
||||
"ui.3d_mouse_reset_view": "뷰 초기화",
|
||||
@@ -2734,6 +2838,8 @@
|
||||
"ui.3d_mouse_step_twist_counterclockwise": "캡을 시계 반대 방향으로 돌려 유지한 다음 놓으세요.",
|
||||
"ui.3d_mouse_switch_cap": "중앙 복귀형으로 보정",
|
||||
"ui.3d_mouse_switch_trackball": "트랙볼로 보정",
|
||||
"ui.3d_mouse_use_direct": "직접 드라이버 사용",
|
||||
"ui.3d_mouse_use_direct_tip": "spacenavd를 거치지 않고 3D 마우스를 직접(hidraw) 읽습니다.",
|
||||
"ui.3d_mouse_view_axis": "뷰 축",
|
||||
"ui.3d_mouse_view_off": "끔",
|
||||
"ui.3d_mouse_view_off_tip": "3D 마우스 드라이버 프로필이 이 축을 끄므로, 이 축의 동작으로는 뷰가 움직이지 않습니다. 여기서 다른 축의 동작을 고르면 둘이 바뀌고, 그 동작은 더 이상 뷰를 움직이지 않습니다.",
|
||||
@@ -2849,6 +2955,8 @@
|
||||
"ui.agent_chat_remove": "대기열에서 제거",
|
||||
"ui.agent_chat_remove_file": "이 메시지에서 빼기",
|
||||
"ui.agent_chat_remove_imported": "이 메시지에서 빼기. 부품은 디자인에 남습니다 (실행 취소하면 제거됨)",
|
||||
"ui.agent_chat_reply_cut_off": "응답이 끝나기 전에 길이 한도에 도달해 불완전할 수 있습니다. 에이전트에게 계속하거나 더 짧게 답하라고 요청하세요.",
|
||||
"ui.agent_chat_reply_declined": "모델이 이 메시지에 대한 답변을 거절했습니다.",
|
||||
"ui.agent_chat_right": "오른쪽",
|
||||
"ui.agent_chat_save": "저장",
|
||||
"ui.agent_chat_send": "보내기",
|
||||
@@ -2997,6 +3105,7 @@
|
||||
"ui.circle": "원",
|
||||
"ui.circular_pattern": "원형 패턴",
|
||||
"ui.clear": "지우기",
|
||||
"ui.clear_print_face": "출력 바닥면 해제",
|
||||
"ui.clear_recent": "최근 항목 지우기",
|
||||
"ui.clear_the_selection": "선택 해제",
|
||||
"ui.click_selects_whole_bodies": "클릭하면 바디 전체 선택",
|
||||
@@ -3031,6 +3140,15 @@
|
||||
"ui.constant": "상수",
|
||||
"ui.constraints_conflict": "구속 조건 충돌",
|
||||
"ui.construction": "구성선",
|
||||
"ui.construction.angle_hint": "보조 직선: 점 클릭 후 각도 입력 또는 방향 선택",
|
||||
"ui.construction.bisector_hint": "이등분선: 교차하는 두 직선 선택 후 원하는 해 선택",
|
||||
"ui.construction.common_hint": "공통 접선: 두 원/원호 선택 후 원하는 해 선택",
|
||||
"ui.construction.contact_hint": "접선: 원/원호 또는 열린 스플라인/원뿔 곡선 선택 후 접점 선택 (자유 곡선은 끝점만)",
|
||||
"ui.construction.external_hint": "접선: 원 또는 원호, 외부 점, 원하는 해를 차례로 선택",
|
||||
"ui.construction.free_hint": "보조 직선: 두 점 클릭; 마우스 오른쪽 버튼으로 다시 시작",
|
||||
"ui.construction.point_hint": "보조 직선: 통과할 점 클릭",
|
||||
"ui.construction.reference_hint": "보조 직선: 직선 선택 후 점 선택; 마우스 오른쪽 버튼으로 참조 변경",
|
||||
"ui.construction.ribbon_label": "보조선",
|
||||
"ui.context_menu": "컨텍스트 메뉴",
|
||||
"ui.continuity_g0": "G0 꺾임",
|
||||
"ui.continuity_g1": "G1 접선",
|
||||
@@ -3119,6 +3237,14 @@
|
||||
"ui.end_scale": "끝 배율",
|
||||
"ui.entities": "요소",
|
||||
"ui.equal": "동일",
|
||||
"ui.equation_end": "끝",
|
||||
"ui.equation_explicit": "명시적",
|
||||
"ui.equation_form": "형식",
|
||||
"ui.equation_note": "변수는 단위가 없는 수입니다. sin(t)는 라디안으로 읽습니다. 단위가 없는 결과는 디자인 단위입니다.",
|
||||
"ui.equation_parametric": "매개변수식",
|
||||
"ui.equation_x_of_t": "x(t)",
|
||||
"ui.equation_y_of_t": "y(t)",
|
||||
"ui.equation_y_of_x": "y(x)",
|
||||
"ui.equivalent_radius": "등가 반지름",
|
||||
"ui.expand": "펼치기",
|
||||
"ui.exportDxf": "DXF 내보내기…",
|
||||
@@ -3177,6 +3303,7 @@
|
||||
"ui.heading_design": "디자인",
|
||||
"ui.heading_draft": "구배",
|
||||
"ui.heading_edit": "편집",
|
||||
"ui.heading_equation_curve": "방정식 곡선",
|
||||
"ui.heading_extrude": "돌출",
|
||||
"ui.heading_fillet": "필렛",
|
||||
"ui.heading_finish_editing": "편집 완료",
|
||||
@@ -3264,6 +3391,10 @@
|
||||
"ui.import_ellipsis": "가져오기…",
|
||||
"ui.infinite": "무한",
|
||||
"ui.insert": "삽입",
|
||||
"ui.insert_design.browse": "찾아보기…",
|
||||
"ui.insert_design.open_designs": "열린 설계",
|
||||
"ui.insert_design.saved_file": "{name}에 저장되지 않은 변경 사항이 있어 저장된 파일을 삽입했습니다. 저장한 다음 링크 업데이트로 변경 사항을 가져오세요.",
|
||||
"ui.insert_design.unsaved": "저장되지 않은 변경 사항",
|
||||
"ui.inspect": "검사",
|
||||
"ui.intersect": "교차",
|
||||
"ui.isolate": "분리 표시",
|
||||
@@ -3354,6 +3485,7 @@
|
||||
"ui.pan_zoom_orbit": "이동, 확대/축소, 궤도 회전",
|
||||
"ui.parallel": "평행",
|
||||
"ui.parameters": "매개변수",
|
||||
"ui.part_size_needs_a_part": "크기를 바꿀 삽입된 표준 부품(나사, 너트, 와셔 또는 핀)을 선택하십시오. 바디를 키우거나 줄이려면 축척을 사용하십시오.",
|
||||
"ui.part_size_shared": "부품을 다시 빌드하며 추가된 피처는 모두 대체됩니다. 이 구성요소의 모든 인스턴스가 업데이트됩니다.",
|
||||
"ui.paste": "붙여넣기",
|
||||
"ui.path": "경로",
|
||||
@@ -3388,12 +3520,29 @@
|
||||
"ui.polygon": "다각형",
|
||||
"ui.preferences": "환경 설정",
|
||||
"ui.press_a_key": "키를 누르세요…",
|
||||
"ui.print_face_cleared": "{body}: 출력 바닥면을 해제했습니다",
|
||||
"ui.print_face_input": "출력 바닥면",
|
||||
"ui.print_face_one_body": "출력 바닥면은 바디마다 하나입니다. 변경하려면 그 바디만 보내십시오",
|
||||
"ui.print_face_pick": "솔리드 바디의 평면 하나를 선택하면 출력 바닥면이 됩니다",
|
||||
"ui.print_face_set": "{body}: 출력 바닥면을 설정했습니다. 슬라이서로 보내면 이 면이 아래로 놓입니다",
|
||||
"ui.profile": "프로파일",
|
||||
"ui.profile_plane": "프로파일 평면",
|
||||
"ui.profiles": "프로파일",
|
||||
"ui.project": "투영",
|
||||
"ui.project_face_edges_sketch": "면 모서리를 새 스케치로 투영",
|
||||
"ui.properties": "속성",
|
||||
"ui.properties.copy_matrix": "행렬 복사",
|
||||
"ui.properties.first_moments": "1차 모멘트",
|
||||
"ui.properties.inertia": "관성 모멘트",
|
||||
"ui.properties.inertia_note": "질량 중심 기준, 월드 축 (g·{unit}²)",
|
||||
"ui.properties.inertia_unavailable": "사용할 수 없음: 바디의 메시가 닫혀 있지 않습니다.",
|
||||
"ui.properties.inertia_x": "Ixx, Ixy, Ixz",
|
||||
"ui.properties.inertia_y": "Iyx, Iyy, Iyz",
|
||||
"ui.properties.inertia_z": "Izx, Izy, Izz",
|
||||
"ui.properties.measuring": "측정 중…",
|
||||
"ui.properties.measuring_failed": "측정이 끝나기 전에 중단되었습니다.",
|
||||
"ui.properties.principal_axis": "주축 {number}",
|
||||
"ui.properties.principal_moments": "주관성 모멘트",
|
||||
"ui.pull_direction": "빼기 방향",
|
||||
"ui.quality": "품질",
|
||||
"ui.quantity": "수량",
|
||||
@@ -3451,6 +3600,8 @@
|
||||
"ui.select": "선택",
|
||||
"ui.selectOther": "기타 선택…",
|
||||
"ui.selectTangentChain": "접선 체인 선택",
|
||||
"ui.select_all": "모두 선택",
|
||||
"ui.select_components_by_face": "구성요소 선택(면을 클릭하면 해당 구성요소 선택)",
|
||||
"ui.selection": "선택",
|
||||
"ui.selection_modifiers": "선택 보조 키",
|
||||
"ui.selection_shift_add_only": "Shift+클릭은 추가만 함",
|
||||
@@ -3483,7 +3634,11 @@
|
||||
"ui.sketch": "스케치",
|
||||
"ui.sketch_dimension": "스케치 치수",
|
||||
"ui.sketch_grid": "스케치 격자",
|
||||
"ui.sketch_intersect_geometry": "형상",
|
||||
"ui.sketch_intersect_projection_link": "투영 링크",
|
||||
"ui.sketch_intersect_selection_filter": "선택 필터",
|
||||
"ui.sketch_modifiers": "스케치 보조 키",
|
||||
"ui.sketch_project_geometry": "형상",
|
||||
"ui.sketch_scale": "스케치 축척",
|
||||
"ui.sketches": "스케치",
|
||||
"ui.slice": "슬라이스",
|
||||
@@ -3519,6 +3674,11 @@
|
||||
"ui.symmetric": "대칭",
|
||||
"ui.symmetry": "대칭",
|
||||
"ui.system": "시스템",
|
||||
"ui.tab_assemble": "조립",
|
||||
"ui.tab_manage": "관리",
|
||||
"ui.tab_sheet_metal": "판금",
|
||||
"ui.tab_view": "보기",
|
||||
"ui.tab_weldments": "용접 구조물",
|
||||
"ui.tangent": "접선",
|
||||
"ui.taper_angle": "테이퍼 각도",
|
||||
"ui.tapped": "탭",
|
||||
@@ -3534,6 +3694,7 @@
|
||||
"ui.tip_angle": "선단 각도",
|
||||
"ui.to_object": "객체까지",
|
||||
"ui.tool_direction": "공구 방향",
|
||||
"ui.toolbar_tabs_hidden": "모든 도구 모음 탭이 숨겨져 있습니다. +를 클릭하거나 여기를 마우스 오른쪽 버튼으로 클릭하여 표시하세요.",
|
||||
"ui.top": "상면",
|
||||
"ui.top_diameter": "윗면 지름",
|
||||
"ui.top_radius": "윗면 반지름",
|
||||
@@ -3569,10 +3730,19 @@
|
||||
"ui.view_centre": "뷰 중심",
|
||||
"ui.viewport_status_clear": "{name} 끄기",
|
||||
"ui.viewport_status_clear_hint": "{name} 끄기 · Esc",
|
||||
"ui.viewport_status_edges": "모서리 {count}개",
|
||||
"ui.viewport_status_from": "{direction} 방향에서",
|
||||
"ui.viewport_status_key": "{name} 범례 표시",
|
||||
"ui.viewport_status_minimum_radius": "최소 반지름",
|
||||
"ui.viewport_status_pairs": "{count}쌍",
|
||||
"ui.viewport_status_section_hatch": "{setting} · 해칭",
|
||||
"ui.viewport_status_section_plane": "현재 평면",
|
||||
"ui.viewport_status_section_tilted": "기울어짐 · {offset}",
|
||||
"ui.viewport_status_stripes": "줄무늬 {count}개",
|
||||
"ui.viewport_status_summary_clear": "모두 끄기",
|
||||
"ui.viewport_status_summary_heading": "이 뷰에서",
|
||||
"ui.viewport_status_summary_label": "{name} 외 {count}개 항목",
|
||||
"ui.viewport_status_summary_more": "+{count}",
|
||||
"ui.viewport_theme_follow": "테마 따르기",
|
||||
"ui.visual_shaded_hidden_edges": "음영 처리 및 숨겨진 모서리",
|
||||
"ui.visual_shaded_with_edges": "음영 처리 및 모서리",
|
||||
@@ -3604,7 +3774,9 @@
|
||||
"update.button": "업데이트",
|
||||
"update.button_version": "{version}(으)로 업데이트",
|
||||
"update.check_automatically": "업데이트 자동 확인",
|
||||
"update.check_for_updates": "업데이트 확인",
|
||||
"update.check_now": "지금 확인",
|
||||
"update.check_unavailable": "이 설치에서는 업데이트를 확인할 수 없습니다.",
|
||||
"update.checking": "확인 중…",
|
||||
"update.copy": "복사",
|
||||
"update.dmg_opened": "디스크 이미지를 확인하고 열었습니다: SolidCraft를 응용 프로그램 폴더로 끌어 기존 버전을 바꾼 뒤 SolidCraft를 다시 시작하세요.",
|
||||
@@ -3625,6 +3797,9 @@
|
||||
"update.prefs_label": "업데이트",
|
||||
"update.prefs_note": "SolidCraft {version} ({kind})입니다. 확인 시 GitHub에 최신 릴리스만 요청하며 다른 정보는 보내지 않습니다.",
|
||||
"update.prefs_web": "페이지를 새로고침하면 최신 웹 앱을 가져옵니다. 네트워크를 사용할 수 없거나 업데이트 다운로드가 제한 시간 안에 완료되지 않으면 저장된 버전이 열립니다. 진행 중인 다운로드는 다음 새로고침을 위해 계속됩니다.",
|
||||
"update.refresh_checking": "최신 릴리스 확인 중…",
|
||||
"update.refresh_fallback": "새 릴리스를 확인하지 못했습니다. 이전에 찾은 {version}(으)로 업데이트합니다.",
|
||||
"update.refresh_selected": "{version}(으)로 업데이트 중.",
|
||||
"update.release_page": "릴리스 페이지 열기",
|
||||
"update.restart": "지금 다시 시작",
|
||||
"update.restart_later": "나중에",
|
||||
|
||||
@@ -606,6 +606,7 @@
|
||||
"cmd.appearance_library": "Biblioteca de aparências",
|
||||
"cmd.appearance_list": "Listar aparências",
|
||||
"cmd.assembly_bom": "Lista de materiais",
|
||||
"cmd.body.print_face": "Face de impressão",
|
||||
"cmd.body_rename": "Renomear corpo",
|
||||
"cmd.browser_group": "Novo grupo",
|
||||
"cmd.browser_move": "Mover itens do navegador",
|
||||
@@ -815,6 +816,16 @@
|
||||
"cmd.sheet_refold": "Redobrar",
|
||||
"cmd.sheet_rules": "Listar regras de chapa metálica",
|
||||
"cmd.sheet_unfold": "Desdobrar",
|
||||
"cmd.sketch.construction_line": "Reta de construção",
|
||||
"cmd.sketch.construction_line.angle": "Reta de construção em ângulo",
|
||||
"cmd.sketch.construction_line.bisector": "Bissetriz",
|
||||
"cmd.sketch.construction_line.horizontal": "Reta de construção horizontal",
|
||||
"cmd.sketch.construction_line.parallel": "Reta de construção paralela",
|
||||
"cmd.sketch.construction_line.perpendicular": "Reta de construção perpendicular",
|
||||
"cmd.sketch.construction_line.tangent_at": "Tangente em um ponto da curva",
|
||||
"cmd.sketch.construction_line.tangent_external": "Tangente por um ponto externo",
|
||||
"cmd.sketch.construction_line.tangent_two": "Tangente comum",
|
||||
"cmd.sketch.construction_line.vertical": "Reta de construção vertical",
|
||||
"cmd.sketch_arc_center_point": "Arco por ponto central",
|
||||
"cmd.sketch_arc_tangent": "Arco tangente",
|
||||
"cmd.sketch_arc_three_point": "Arco por 3 pontos",
|
||||
@@ -1282,6 +1293,8 @@
|
||||
"prefs.orientation": "Orientação",
|
||||
"prefs.overall_speed": "Velocidade geral",
|
||||
"prefs.preview_choices": "Prévia das suas escolhas",
|
||||
"prefs.print_face_highlight": "Destaque da face de impressão",
|
||||
"prefs.print_face_highlight_tip": "Intensidade da cor e do contorno da face de impressão de um corpo na vista. 0 % não mostra destaque.",
|
||||
"prefs.quality_default": "padrão",
|
||||
"prefs.quality_fastest": "mais rápido",
|
||||
"prefs.quality_slowest": "mais lento",
|
||||
@@ -1561,6 +1574,8 @@
|
||||
"ui.3d_mouse_step_twist_counterclockwise": "Gire a tampa no sentido anti-horário, segure e solte.",
|
||||
"ui.3d_mouse_switch_cap": "Calibrar como retorno ao centro",
|
||||
"ui.3d_mouse_switch_trackball": "Calibrar como trackball",
|
||||
"ui.3d_mouse_use_direct": "Usar driver direto",
|
||||
"ui.3d_mouse_use_direct_tip": "Ler o mouse 3D diretamente (hidraw) em vez de pelo spacenavd.",
|
||||
"ui.3d_mouse_view_axis": "Eixo da vista",
|
||||
"ui.3d_mouse_view_off": "Desligado",
|
||||
"ui.3d_mouse_view_off_tip": "O perfil do driver do mouse 3D desliga este eixo, então o movimento dele não move a vista. Escolher aqui o movimento de outro eixo troca os dois, e esse movimento deixa de mover a vista.",
|
||||
@@ -1830,6 +1845,7 @@
|
||||
"ui.circle": "Círculo",
|
||||
"ui.circular_pattern": "Padrão circular",
|
||||
"ui.clear": "Limpar",
|
||||
"ui.clear_print_face": "Limpar face de impressão",
|
||||
"ui.clear_recent": "Limpar recentes",
|
||||
"ui.clear_the_selection": "Limpar a seleção",
|
||||
"ui.click_selects_whole_bodies": "O clique seleciona corpos inteiros",
|
||||
@@ -1864,6 +1880,7 @@
|
||||
"ui.constant": "Constante",
|
||||
"ui.constraints_conflict": "Restrições em conflito",
|
||||
"ui.construction": "Construção",
|
||||
"ui.construction.ribbon_label": "Linhas aux.",
|
||||
"ui.context_menu": "Menu de contexto",
|
||||
"ui.continuity_g0": "G0 vinco",
|
||||
"ui.continuity_g1": "G1 tangente",
|
||||
@@ -2161,6 +2178,7 @@
|
||||
"ui.pan_zoom_orbit": "Deslocar, zoom, orbitar",
|
||||
"ui.parallel": "Paralelo",
|
||||
"ui.parameters": "Parâmetros",
|
||||
"ui.part_size_needs_a_part": "Selecione uma peça padrão inserida (um parafuso, uma porca, uma arruela ou um pino) para alterar o tamanho. Para aumentar ou diminuir um corpo, use Escala.",
|
||||
"ui.part_size_shared": "Reconstrói a peça, substituindo quaisquer recursos adicionados. Todas as ocorrências deste componente são atualizadas.",
|
||||
"ui.paste": "Colar",
|
||||
"ui.path": "Caminho",
|
||||
@@ -2186,6 +2204,11 @@
|
||||
"ui.polygon": "Polígono",
|
||||
"ui.preferences": "Preferências",
|
||||
"ui.press_a_key": "pressione uma tecla…",
|
||||
"ui.print_face_cleared": "{body}: face de impressão removida",
|
||||
"ui.print_face_input": "Face de impressão",
|
||||
"ui.print_face_one_body": "Uma face de impressão pertence a um único corpo: envie esse corpo sozinho para alterá-la",
|
||||
"ui.print_face_pick": "Selecione uma face plana de um corpo sólido para torná-la a face de impressão",
|
||||
"ui.print_face_set": "{body}: face de impressão definida; Enviar ao fatiador apoia o corpo sobre ela",
|
||||
"ui.profile": "Perfil",
|
||||
"ui.profile_plane": "Plano do perfil",
|
||||
"ui.profiles": "Perfis",
|
||||
@@ -2243,6 +2266,7 @@
|
||||
"ui.select": "Selecionar",
|
||||
"ui.selectOther": "Selecionar outro…",
|
||||
"ui.selectTangentChain": "Selecionar cadeia tangente",
|
||||
"ui.select_all": "Selecionar tudo",
|
||||
"ui.selection": "Seleção",
|
||||
"ui.selection_modifiers": "Modificadores de seleção",
|
||||
"ui.selection_shift_add_only": "Shift+clique adiciona sem remover",
|
||||
@@ -2304,6 +2328,10 @@
|
||||
"ui.symmetric": "Simétrico",
|
||||
"ui.symmetry": "Simetria",
|
||||
"ui.system": "Sistema",
|
||||
"ui.tab_assemble": "Montar",
|
||||
"ui.tab_manage": "Gerenciar",
|
||||
"ui.tab_sheet_metal": "Chapa Metálica",
|
||||
"ui.tab_view": "Vista",
|
||||
"ui.tangent": "Tangente",
|
||||
"ui.taper_angle": "Ângulo de inclinação",
|
||||
"ui.tapped": "Roscado",
|
||||
@@ -2371,7 +2399,9 @@
|
||||
"update.button": "Atualizar",
|
||||
"update.button_version": "Atualizar para {version}",
|
||||
"update.check_automatically": "Verificar atualizações automaticamente",
|
||||
"update.check_for_updates": "Verificar atualizações",
|
||||
"update.check_now": "Verificar agora",
|
||||
"update.check_unavailable": "A verificação de atualizações não está disponível para esta instalação.",
|
||||
"update.checking": "Verificando…",
|
||||
"update.copy": "Copiar",
|
||||
"update.dmg_opened": "A imagem de disco está aberta e verificada: arraste o SolidCraft para Aplicativos, substituindo a cópia antiga, e reinicie o SolidCraft.",
|
||||
|
||||
@@ -206,6 +206,7 @@
|
||||
"Edges": "Ивице",
|
||||
"Edit": "Измени",
|
||||
"Edit Profile Sketch": "Измени скицу профила",
|
||||
"Edit shortcuts": "Измени пречице",
|
||||
"Enable rule": "Омогући правило",
|
||||
"Enabled": "Омогућено",
|
||||
"End Radius": "Крајњи полупречник",
|
||||
@@ -468,6 +469,7 @@
|
||||
"Radius": "Полупречник",
|
||||
"Radius Fit": "Уклапање полупречника",
|
||||
"Ratio": "Однос",
|
||||
"Read-only list: shortcuts can't be changed here.": "Списак само за читање: пречице се овде не могу мењати.",
|
||||
"Reattach selected face": "Поново причврсти изабрано лице",
|
||||
"Recover": "Опорави",
|
||||
"Recover unsaved design?": "Опоравити несачувани дизајн?",
|
||||
@@ -652,6 +654,7 @@
|
||||
"Third point": "Трећа тачка",
|
||||
"This child is shared. Deleting it removes it from every copy of its parent.": "Овај подређени елемент је дељен. Брисањем се уклања из сваке копије његовог родитеља.",
|
||||
"This child is shared. Position changes apply to every copy of its parent.": "Овај подређени елемент је дељен. Промене положаја примењују се на сваку копију његовог родитеља.",
|
||||
"This component is inside a subassembly placed more than once: aligning it moves it in every placement.": "Ова компонента је унутар подсклопа који је постављен више пута: њено поравнање је помера у сваком постављању.",
|
||||
"This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "Ово лице не може дати трајно причвршћење. Изаберите друго лице или изричито користите фиксну раван.",
|
||||
"This image is not attached to GitHub yet. Copy or save it, then attach it on GitHub.": "Ова слика још није приложена на GitHub-у. Копирајте је или сачувајте, а затим је приложите на GitHub-у.",
|
||||
"Thread depth": "Дубина навоја",
|
||||
@@ -772,6 +775,8 @@
|
||||
"at the face": "на лицу",
|
||||
"bom.group_children": "Подделови у реду свог дела",
|
||||
"browser.body_name": "Тело{number}",
|
||||
"browser.calibrate_click_a": "Кликните слику да зададете тачку A или упишите њене координате.",
|
||||
"browser.calibrate_click_b": "Кликните слику да зададете тачку B или упишите њене координате.",
|
||||
"browser.calibrate_title": "Калибриши: {name}",
|
||||
"browser.capture_many": "Померене компоненте без забележеног положаја: {count}.",
|
||||
"browser.capture_note": "Забележи задржава нови положај; Врати га враћа назад.",
|
||||
@@ -793,6 +798,11 @@
|
||||
"cam.roller": "Ваљак",
|
||||
"cam.roller_pick": "Ваљак (необавезно)",
|
||||
"cam.tip_pick": "Врх (необавезно)",
|
||||
"camera.shot_pitch": "Нагиб",
|
||||
"camera.shot_roll": "Ваљање",
|
||||
"camera.shot_yaw": "Скретање",
|
||||
"canvas.decal_place_hint": "Кликните лице да поставите налепницу",
|
||||
"canvas.place_hint": "Кликните раван или лице да поставите платно",
|
||||
"choose a profile": "изаберите профил",
|
||||
"choose the cam's and the follower's joints": "изаберите спојеве брега и пратиоца",
|
||||
"choose the joints to couple": "изаберите спојеве за спрезање",
|
||||
@@ -800,12 +810,16 @@
|
||||
"click sketch curves": "кликните на криве скице",
|
||||
"cmd.appearance_assign": "Изглед",
|
||||
"cmd.appearance_chain": "Ланац изгледа",
|
||||
"cmd.appearance_copy": "Копирај изглед",
|
||||
"cmd.appearance_favorite": "Омиљени изглед",
|
||||
"cmd.appearance_library": "Библиотека изгледа",
|
||||
"cmd.appearance_list": "Списак изгледа",
|
||||
"cmd.appearance_paint": "Обоји изгледом",
|
||||
"cmd.appearance_paste": "Налепи изглед",
|
||||
"cmd.appearance_pick_up": "Преузми изглед",
|
||||
"cmd.appearance_replace": "Замени изглед",
|
||||
"cmd.assembly_bom": "Саставница",
|
||||
"cmd.body.print_face": "Површина за штампу",
|
||||
"cmd.body_rename": "Преименуј тело",
|
||||
"cmd.browser_collapse_all": "Скупи све",
|
||||
"cmd.browser_expand_all": "Прошири све",
|
||||
@@ -813,6 +827,7 @@
|
||||
"cmd.browser_move": "Премести ставке стабла модела",
|
||||
"cmd.browser_order": "Поређај ставке стабла модела",
|
||||
"cmd.browser_rename_group": "Преименуј групу",
|
||||
"cmd.browser_reparent": "Премести у компоненту",
|
||||
"cmd.browser_ungroup": "Разгрупиши",
|
||||
"cmd.browser_visibility": "Прикажи/сакриј",
|
||||
"cmd.canvas_calibrate": "Калибриши платно",
|
||||
@@ -839,7 +854,9 @@
|
||||
"cmd.component_metadata": "Својства дела",
|
||||
"cmd.component_metadata_set": "Промени својства дела",
|
||||
"cmd.component_move_bodies": "Премести тела у компоненту",
|
||||
"cmd.component_move_features": "Премести операције у компоненту",
|
||||
"cmd.component_move_sketches": "Премести скице у компоненту",
|
||||
"cmd.component_paste_from_design": "Налепи из другог дизајна",
|
||||
"cmd.component_paste_new": "Налепи као ново",
|
||||
"cmd.component_properties": "Физичка својства компоненте",
|
||||
"cmd.component_relink": "Поново повежи извор",
|
||||
@@ -976,6 +993,7 @@
|
||||
"cmd.motion_trace": "Траг кретања",
|
||||
"cmd.motion_trace_edit": "Измени траг кретања",
|
||||
"cmd.motion_trace_keep": "Задржи траг кретања",
|
||||
"cmd.occurrence_align": "Поравнај примерак",
|
||||
"cmd.occurrence_copy": "Налепи (примерак)",
|
||||
"cmd.occurrence_drag": "Превуци примерак",
|
||||
"cmd.occurrence_ground": "Учврсти",
|
||||
@@ -1033,11 +1051,17 @@
|
||||
"cmd.render_library_surface_unbind": "Уклони везу површине",
|
||||
"cmd.render_library_targets": "Пронађи циљеве библиотеке рендеровања",
|
||||
"cmd.render_lights_add": "Додај светло",
|
||||
"cmd.render_lights_duplicate": "Дуплицирај светло рендеровања",
|
||||
"cmd.render_lights_list": "Списак светала рендеровања",
|
||||
"cmd.render_lights_mute": "Искључи светло",
|
||||
"cmd.render_lights_remove": "Уклони светло рендеровања",
|
||||
"cmd.render_lights_set": "Подеси светло рендеровања",
|
||||
"cmd.render_lights_solo": "Само ово светло",
|
||||
"cmd.render_optics_bind": "Сачувај оптичку везу",
|
||||
"cmd.render_optics_unbind": "Уклони оптичку везу",
|
||||
"cmd.render_output_size": "Подеси величину излаза рендеровања",
|
||||
"cmd.render_preflight": "Провери захтев за рендеровање",
|
||||
"cmd.render_preflight_copy": "Копирај извештај провере рендеровања",
|
||||
"cmd.render_preset_apply": "Примени изворни студио",
|
||||
"cmd.render_preset_resolve": "Прегледај изворни студио",
|
||||
"cmd.render_quality_prepare": "Прегледај фиксни буџет узорковања",
|
||||
@@ -1060,6 +1084,13 @@
|
||||
"cmd.render_start": "Рендеруј слику",
|
||||
"cmd.render_status": "Напредак рендеровања",
|
||||
"cmd.select_clear": "Поништи избор",
|
||||
"cmd.settings_profile_apply": "Примени профил подешавања",
|
||||
"cmd.settings_profile_delete": "Избриши профил подешавања",
|
||||
"cmd.settings_profile_export": "Извези профил подешавања",
|
||||
"cmd.settings_profile_import": "Увези профил подешавања",
|
||||
"cmd.settings_profile_list": "Профили подешавања",
|
||||
"cmd.settings_profile_rename": "Преименуј профил подешавања",
|
||||
"cmd.settings_profile_save": "Сачувај профил подешавања",
|
||||
"cmd.sheet_convert": "Претвори у лим",
|
||||
"cmd.sheet_export_bend_table": "Извези табелу савијања",
|
||||
"cmd.sheet_export_dxf": "Извези развијени облик као DXF",
|
||||
@@ -1073,6 +1104,16 @@
|
||||
"cmd.sheet_refold": "Поново пресавиј",
|
||||
"cmd.sheet_rules": "Списак правила за лим",
|
||||
"cmd.sheet_unfold": "Развиј",
|
||||
"cmd.sketch.construction_line": "Помоћна права",
|
||||
"cmd.sketch.construction_line.angle": "Помоћна права под углом",
|
||||
"cmd.sketch.construction_line.bisector": "Симетрала угла",
|
||||
"cmd.sketch.construction_line.horizontal": "Хоризонтална помоћна права",
|
||||
"cmd.sketch.construction_line.parallel": "Паралелна помоћна права",
|
||||
"cmd.sketch.construction_line.perpendicular": "Нормална помоћна права",
|
||||
"cmd.sketch.construction_line.tangent_at": "Тангента у тачки криве",
|
||||
"cmd.sketch.construction_line.tangent_external": "Тангента кроз спољашњу тачку",
|
||||
"cmd.sketch.construction_line.tangent_two": "Заједничка тангента",
|
||||
"cmd.sketch.construction_line.vertical": "Вертикална помоћна права",
|
||||
"cmd.sketch_arc3d": "3D лук",
|
||||
"cmd.sketch_arc_center_point": "Лук из центра",
|
||||
"cmd.sketch_arc_tangent": "Тангентни лук",
|
||||
@@ -1105,6 +1146,8 @@
|
||||
"cmd.sketch_drawing_bounds": "Величина цртежа",
|
||||
"cmd.sketch_edit": "Измени скицу",
|
||||
"cmd.sketch_edit_text": "Измени текст",
|
||||
"cmd.sketch_equation_curve": "Крива по једначини",
|
||||
"cmd.sketch_equation_curve_edit": "Измени криву по једначини",
|
||||
"cmd.sketch_export_dxf": "Сачувај као DXF",
|
||||
"cmd.sketch_finish_auto_constrain": "Заврши са аутоматским ограничењима",
|
||||
"cmd.sketch_fit_curves_to_section": "Уклопи криве у пресек мреже",
|
||||
@@ -1201,6 +1244,7 @@
|
||||
"cmd.view.render_browser": "Стабло рендеровања",
|
||||
"cmd.view.render_dock": "Премести панел рендеровања",
|
||||
"cmd.view.render_focus": "Фокусни приказ рендеровања",
|
||||
"cmd.view.status_items": "Ставке статуса у прозору приказа",
|
||||
"cmd.view_ambient_occlusion": "Амбијентална оклузија",
|
||||
"cmd.view_angle_readout": "Углови приказа",
|
||||
"cmd.view_apply": "Врати именовани приказ",
|
||||
@@ -1222,6 +1266,7 @@
|
||||
"cmd.view_normal_to": "Нормално на избор",
|
||||
"cmd.view_previous_tab": "Претходна картица",
|
||||
"cmd.view_rename": "Преименуј именовани приказ",
|
||||
"cmd.view_render_frame": "Водичи кадра рендеровања",
|
||||
"cmd.view_right": "Поглед здесна",
|
||||
"cmd.view_save": "Нови именовани приказ",
|
||||
"cmd.view_shots_strip": "Трака кадрова",
|
||||
@@ -1232,10 +1277,14 @@
|
||||
"color.copy": "Кликните да копирате вредности боје",
|
||||
"color.edit": "Кликните да измените боју",
|
||||
"color.gamma": "Приказ вредности боје у гама простору 0-255",
|
||||
"color.hex": "Hex",
|
||||
"color.hex_help": "Унесите #rrggbb или #rrggbbaa; шест цифара чува непрозирност",
|
||||
"color.hex_hint": "#rrggbb",
|
||||
"color.hue": "Нијанса",
|
||||
"color.linear": "Приказ вредности боје у линеарном простору 0-1",
|
||||
"color.saturation_value": "Засићеност и вредност",
|
||||
"color.selected": "Изабрана боја",
|
||||
"config.column_filter_empty": "Нема одговарајућих колона",
|
||||
"contact.components_count": "Компоненте: {count}",
|
||||
"contact.enabled_label": "омогућено",
|
||||
"coupling.gear_1": "Зупчаник 1",
|
||||
@@ -1350,8 +1399,20 @@
|
||||
"help.material.assign": "Одређује од чега су изабрана тела направљена, нпр. челик, алуминијум или ABS. Користите га да маса и тежина одговарају стварном делу.",
|
||||
"help.mit": "MIT лиценца",
|
||||
"help.notice": "NOTICE",
|
||||
"help.occurrence.move": "Помера део склопа само дуж слобода које дозвољавају његови спојеви. Изаберите лице дела, а затим превуците доступну стрелицу или лук.",
|
||||
"help.parameters.change": "Отвара табелу именованих вредности и израза који управљају котама дизајна. Користите је да промените меру на једном месту, а све операције које је користе је прате.",
|
||||
"help.pointcloud.insert": "Уметните PLY, XYZ или PTS скенирање као облак тачака поред модела. Користите га као референцу при изради модела на основу измерених података.",
|
||||
"help.sketch.construction_line": "Направите бесконачну помоћну праву кроз две тачке. Користите је да распоредите скицу без раздвајања профила.",
|
||||
"help.sketch.construction_line.angle": "Направите бесконачну помоћну праву под углом од осе X скице. Изаберите тачку и упишите угао или изаберите смер.",
|
||||
"help.sketch.construction_line.bisector": "Изаберите две праве линије скице које се секу, па једну од две симетрале угла. Резултат прати изворне линије.",
|
||||
"help.sketch.construction_line.horizontal": "Направите бесконачну хоризонталну помоћну праву кроз тачку. Њено ограничење хоризонталности остаје на снази при каснијим изменама.",
|
||||
"help.sketch.construction_line.parallel": "Изаберите праву линију скице, па поставите паралелну бесконачну помоћну праву. Десним кликом изаберите другу референцу.",
|
||||
"help.sketch.construction_line.perpendicular": "Изаберите праву линију скице, па поставите нормалну бесконачну помоћну праву. Десним кликом изаберите другу референцу.",
|
||||
"help.sketch.construction_line.tangent_at": "Направите тангенту у тачки на кругу или кружном луку, или у крајњој тачки отвореног сплајна или конике. Изаберите криву, па тачку додира.",
|
||||
"help.sketch.construction_line.tangent_external": "Изаберите круг или кружни лук, па спољашњу тачку и решење тангенте. Прегледи приказују само тачке додира на нацртаном луку.",
|
||||
"help.sketch.construction_line.tangent_two": "Изаберите два круга или кружна лука, па у прегледу изаберите заједничку тангенту. Тачке додира морају лежати на нацртаним кривама.",
|
||||
"help.sketch.construction_line.vertical": "Направите бесконачну вертикалну помоћну праву кроз тачку. Њено ограничење вертикалности остаје на снази при каснијим изменама.",
|
||||
"help.sketch.equation_curve": "Црта криву из формула: x(t) и y(t), или y = f(x), у задатом опсегу. Формуле могу да користе параметре и крива их прати: користите је за синусоиду, спиралу или евольвенту зупца зупчаника.",
|
||||
"help.solid.align": "Помера изабрана тела тако да се тачка, лице или раван на њима поклопи са тачком, лицем или равни негде другде. Користите га да поставите део уз други без мерења одмака.",
|
||||
"help.solid.chamfer": "Одсеца изабране ивице равним скошењем задатог растојања. Користите га да ублажите оштре ивице или олакшате увођење чивије или завртња.",
|
||||
"help.solid.combine": "Спаја тела, одузима их од циљног тела или задржава само заједничку запремину, а може да задржи и алатна тела. Користите га да спојите делове, да једним обликом одсечете други или да пронађете где се два тела преклапају.",
|
||||
@@ -1480,6 +1541,21 @@
|
||||
"joint.one_component": "Ови делови су тела једне компоненте: {bodies}. Спој помера једну компоненту у односу на другу, па сваки део треба своју компоненту.",
|
||||
"joint.rigid_group_one_component": "Сва тела ({count}) су у једној компоненти (или у самом дизајну): прво користите {command}.",
|
||||
"joint.rigid_group_select_components": "Изаберите две или више компоненти.",
|
||||
"joint_move.blocked_hint": "Проверите врсту споја (на пример Круто), учвршћивање, границе споја и вредности које покрећу параметри.",
|
||||
"joint_move.blocked_title": "Овај део се не може померити",
|
||||
"joint_move.coarse": "Корак ротације близу осе (°)",
|
||||
"joint_move.distance": "Растојање од почетка",
|
||||
"joint_move.done": "Готово",
|
||||
"joint_move.fine": "Корак ротације далеко од осе (°)",
|
||||
"joint_move.fixed": "Овај део нема покретну осу споја.",
|
||||
"joint_move.help": "Помери — превуците стрелицу или прстен. Esc отказује тренутно превлачење.",
|
||||
"joint_move.legacy_hint": "Искључите да бисте користили претходни панел Помери.",
|
||||
"joint_move.precision": "Повуците изван испрекиданог водича за фину ротацију.",
|
||||
"joint_move.rotation": "Ротација од почетка",
|
||||
"joint_move.select": "Изаберите лице или један део склопа, а затим изаберите Помери.",
|
||||
"joint_move.settings": "Померање у склопу",
|
||||
"joint_move.step": "Корак",
|
||||
"joint_move.use_handles": "Користи ручице кретања спојева за померање у склопу",
|
||||
"keymap.command_id": "ID команде",
|
||||
"keymap.empty": "Нема одговарајућих команди",
|
||||
"keymap.use_anyway": "Ипак користи {key} овде",
|
||||
@@ -1574,6 +1650,8 @@
|
||||
"nav.maya.help": "Alt+превлачење левим орбитира, Alt+средњи помера, Alt+десни зумира; превлачење средњим такође помера",
|
||||
"nav.openscad.help": "Превлачење левим дугметом по празном простору орбитира, Shift+превлачење левим бира оквиром, превлачење геометрије скице је мења; превлачење десним или средњим дугметом помера, Shift+десно или Shift+средње зумира",
|
||||
"nav.perspective.sketch": "Измена скице користи ортографски приказ. Завршите скицу да пребаците на перспективу.",
|
||||
"nav.right_drag_orbits.help": "Искључено: превлачење десним дугметом не дира камеру, а десно дугме само отвара контекстни мени. Избор SolidWorks мапирања миша га искључује.",
|
||||
"nav.right_drag_orbits.label": "Превлачење десним дугметом орбитира",
|
||||
"nav.solidworks.help": "Превлачење средњим дугметом орбитира, Ctrl+средње помера, Shift+средње зумира, превлачење десним орбитира",
|
||||
"nav.tinkercad.help": "Превлачење десним дугметом орбитира, превлачење средњим или Shift+десним помера",
|
||||
"nav.touchpad.help": "Држите Shift и померајте показивач за померање приказа; држите Alt/Option и померајте га за орбитирање. Дугме миша није потребно. Вертикално скроловање зумира.",
|
||||
@@ -1595,6 +1673,9 @@
|
||||
"navbar.custom.customise": "Прилагоди навигациону траку…",
|
||||
"navbar.custom.design": "Дизајн",
|
||||
"navbar.custom.duplicate": "Ово место је већ на траци.",
|
||||
"navbar.custom.edge": "Ивица",
|
||||
"navbar.custom.edge_bottom": "Доле",
|
||||
"navbar.custom.edge_top": "Горе",
|
||||
"navbar.custom.fade": "Избледи",
|
||||
"navbar.custom.full": "Уклоните једно место да бисте додали друго.",
|
||||
"navbar.custom.hidden_design": "Скривено у Дизајну",
|
||||
@@ -1701,6 +1782,7 @@
|
||||
"parts.dimension.thickness": "Дебљина",
|
||||
"parts.dimension.width": "Ширина",
|
||||
"parts.family.bearing": "Куглични лежај са дубоким жлебом (габарит)",
|
||||
"parts.family.button_head_cap_screw": "Завртањ са полуоблом главом и унутрашњим шестоугаоником",
|
||||
"parts.family.dowel_pin": "Паралелни клин (колчић)",
|
||||
"parts.family.hex_bolt": "Завртањ са шестоугаоном главом",
|
||||
"parts.family.hex_nut": "Шестоугаона навртка",
|
||||
@@ -1759,6 +1841,11 @@
|
||||
"prefs.bottom_centre": "Доле у средини",
|
||||
"prefs.bottom_right": "Доле десно",
|
||||
"prefs.browser": "Стабло модела",
|
||||
"prefs.browser_eye_left": "Око поред стрелице за скупљање",
|
||||
"prefs.browser_eye_left_note": "Редови стабла модела приказују око за приказивање/скривање поред стрелице за скупљање, као раније, уместо у колони на десном крају редова.",
|
||||
"prefs.browser_reveal_on_hover": "Прикажи при преласку мишем",
|
||||
"prefs.browser_show_note": "Приказано држи стабло модела на екрану. Прикажи при преласку мишем га скрива док показивач не дође на његово место или на танак језичак на његовој левој ивици, а остаје отворено док је показивач у њему или док је отворен мени из њега.",
|
||||
"prefs.browser_shown": "Приказано",
|
||||
"prefs.built_in": "Уграђено",
|
||||
"prefs.button_left": "Превлачење левим дугметом",
|
||||
"prefs.button_middle": "Превлачење средњим дугметом",
|
||||
@@ -1806,6 +1893,8 @@
|
||||
"prefs.graphics_card_restart": "Ступа на снагу након поновног покретања SolidCraft-а. WGPU_ADAPTER_NAME има предност над овим избором.",
|
||||
"prefs.graphics_note": "Жртвујте брзину за глаткоћу. Сваки избор показује свој учинак на примеру.",
|
||||
"prefs.graphics_presets_note": "Унапред подешене вредности подешавају све изборе испод одједном.",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out": "Сакриј симболе ограничења када је приказ умањен",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out_note": "Симболи ограничења нестају из приказа када је скица толико умањена да би је затрпали. Искључено: остају фиксне величине на екрану при сваком зумирању.",
|
||||
"prefs.history": "Временска трака",
|
||||
"prefs.history_origin_bodies": "Прикажи исходиште и тела на врху",
|
||||
"prefs.history_origin_bodies_note": "Временска трака лево или испод стабла модела почиње фасциклом Тела активне компоненте и Исходиштем, са њиховим оком и менијима као у стаблу модела. Временска трака на дну остаје непромењена.",
|
||||
@@ -1829,6 +1918,8 @@
|
||||
"prefs.layout_note": "Компактно причвршћује панеле уз ивице прозора. Провидност стабла модела доступна је у опцији Плутајуће. Страну Асистента промените на страници Асистент.",
|
||||
"prefs.left": "Лево",
|
||||
"prefs.left_click": "Леви клик",
|
||||
"prefs.line_drag_draws_one": "Притисак и превлачење цртају једну линију",
|
||||
"prefs.line_drag_draws_one_note": "У алату Линија, притисак, превлачење и пуштање цртају једну линију од места притиска до места пуштања и ту се завршава. Кликови и даље цртају ланац. Искључено: превлачење поставља тачку где се пусти, као и клик.",
|
||||
"prefs.linked_designs": "Повезани дизајни",
|
||||
"prefs.live_input": "Улаз уживо",
|
||||
"prefs.live_preview": "Преглед уживо",
|
||||
@@ -1842,6 +1933,9 @@
|
||||
"prefs.max_file_size_step": "STEP и датотеке за увоз",
|
||||
"prefs.max_file_size_web": "Веб апликација отвара STEP и датотеке за увоз до 512 MB и дизајне до 256 MB: картица прегледача не може да садржи веће датотеке. Десктоп апликација може да повећа ова ограничења.",
|
||||
"prefs.megabytes": "MB",
|
||||
"prefs.menu_grid": "Велике иконе",
|
||||
"prefs.menu_list": "Списак",
|
||||
"prefs.menus": "Менији",
|
||||
"prefs.minutes": "минута",
|
||||
"prefs.minutes_suffix": " min",
|
||||
"prefs.mouse": "Миш и додирна табла",
|
||||
@@ -1861,14 +1955,40 @@
|
||||
"prefs.origin_plane_names": "Називи равни исходишта",
|
||||
"prefs.origin_plane_names_note": "Називи приказани у стаблу модела, дијалозима и листама. {top} је XY, {front} је XZ, а {right} је YZ, са Z нагоре. Команде, скрипте и сачувани дизајни задржавају XY, XZ и YZ.",
|
||||
"prefs.overall_speed": "Укупна брзина",
|
||||
"prefs.persistent_ribbon_pressed": "Истакни активне команде на траци",
|
||||
"prefs.persistent_ribbon_pressed_help": "Истиче команде на траци док су њихови ефекти укључени. Искључите да бисте задржали претходни неутрални изглед и помоћ за команде.",
|
||||
"prefs.perspective_fov": "Видно поље",
|
||||
"prefs.placement": "Постављање",
|
||||
"prefs.prefer_free_sketch_points": "Дај предност покретним тачкама скице када се тачке преклапају",
|
||||
"prefs.preview_choices": "Преглед ваших избора",
|
||||
"prefs.print_face_highlight": "Истицање површине за штампу",
|
||||
"prefs.print_face_highlight_tip": "Колико се јако површина за штампу тела боји и обрубљује у приказу. 0 % не приказује истицање.",
|
||||
"prefs.profile_active": "Активни профил",
|
||||
"prefs.profile_applied": "Профил је примењен.",
|
||||
"prefs.profile_changed": "Подешавања су промењена откако је профил сачуван. Притисните Сачувај да их задржите у њему.",
|
||||
"prefs.profile_deleted": "Профил је избрисан.",
|
||||
"prefs.profile_export": "Извези…",
|
||||
"prefs.profile_exported": "Профил је извезен.",
|
||||
"prefs.profile_imported": "Профил је увезен. Изаберите га под Активни профил да бисте прешли на њега.",
|
||||
"prefs.profile_name_hint": "Назив профила, нпр. Лаптоп",
|
||||
"prefs.profile_rename": "Преименуј",
|
||||
"prefs.profile_renamed": "Профил је преименован.",
|
||||
"prefs.profile_save": "Сачувај",
|
||||
"prefs.profile_saved": "Тренутна подешавања су сачувана у профил.",
|
||||
"prefs.profile_skipped": "Профил је примењен; подешавања која су задржала тренутну вредност: {n} (погледајте дневник).",
|
||||
"prefs.profiles": "Профили подешавања",
|
||||
"prefs.profiles_note": "Пречице, трака са алатима, навигација, радијални мени и подешавања интерфејса, чувани заједно под једним називом и мењани одједном.",
|
||||
"prefs.project_options_dialog": "Дијалог опција за Пројектуј",
|
||||
"prefs.project_options_dialog_note": "Укључено: пре пројектовања изаберите Геометрија или Тела и Веза пројекције. Искључено: задржава се претходни начин рада са директним избором.",
|
||||
"prefs.quality_default": "подразумевано",
|
||||
"prefs.quality_fastest": "најбрже",
|
||||
"prefs.quality_slowest": "најспорије",
|
||||
"prefs.quality_smoother": "глађе",
|
||||
"prefs.render_previous_geometry_budget": "Користи претходни буџет геометрије за преглед у Рендеровању",
|
||||
"prefs.render_previous_geometry_budget_help": "Враћа претходно фиксно ограничење геометрије (512 MiB на 64-битним десктоп рачунарима, 128 MiB другде) уместо буџета према уређају.",
|
||||
"prefs.reports_saved": "Сачувано: {n}",
|
||||
"prefs.ribbon_reveal": "Прикажи резултате претраге на траци",
|
||||
"prefs.ribbon_reveal_note": "Задржавање показивача изнад резултата у Претражи команде показује где се команда налази на траци: њену картицу, њено дугме или њен ред у падајућем менију панела. Команда покренута из претраге тамо трепери, а покренута команда из падајућег менија означава свој панел.",
|
||||
"prefs.right_click": "Десни клик",
|
||||
"prefs.saving": "Аутоматско чување и опоравак",
|
||||
"prefs.scale_note": "Такође Ctrl + / Ctrl − у прозору. Дугмад су 28 px при 100%.",
|
||||
@@ -1877,18 +1997,29 @@
|
||||
"prefs.search_empty": "Нема одговарајућих подешавања",
|
||||
"prefs.select": "Избор",
|
||||
"prefs.select_one_item": "Изабери једну ставку",
|
||||
"prefs.select_other_hidden": "Изабери скривену геометрију помоћу Изабери друго",
|
||||
"prefs.select_other_hidden_help": "Укључено: обухвата скривена тела, скице и заклоњене ивице у близини показивача. Искључено: користи се изворни списак видљиве геометрије испод показивача.",
|
||||
"prefs.selecting": "Бирање",
|
||||
"prefs.shift": "Shift",
|
||||
"prefs.shift_add_ctrl_toggle": "Shift само додаје; Ctrl / Cmd укључује и искључује",
|
||||
"prefs.shift_add_note": "Укључено: Shift додаје, Ctrl / Cmd укључује и искључује. Искључено (подразумевано): оба укључују и искључују.",
|
||||
"prefs.shortcuts": "Пречице",
|
||||
"prefs.single_surface_analysis": "Користи само једну анализу површи",
|
||||
"prefs.single_surface_analysis_help": "Када је искључено, сенчење површи и Континуитет могу остати укључени заједно. Када је укључено, остаје последња покренута или промењена анализа.",
|
||||
"prefs.sketch_align_points": "Поравнај са другим тачкама скице током цртања",
|
||||
"prefs.sketch_align_points_note": "Током цртања тачка се истовремено поравнава хоризонтално са једном тачком скице и вертикално са другом, уз тачкасти водич, а клик задржава оба поравнања. Искључено: само са претходном тачком, по једна оса.",
|
||||
"prefs.sketch_conflict_colour": "Геометрија у сукобу у боји сукоба",
|
||||
"prefs.sketch_conflict_colour_note": "Док су ограничења скице у сукобу, криве и тачке које држи ограничење које не успева исцртавају се такође у боји сукоба, а не само његов симбол или кота. Искључено: задржавају уобичајене боје.",
|
||||
"prefs.sketch_construction_lines": "Проширени алати за помоћне праве",
|
||||
"prefs.sketch_exit_view": "Када се скица заврши",
|
||||
"prefs.sketch_exit_view.keep": "Задржи тренутни приказ",
|
||||
"prefs.sketch_exit_view.previous": "Врати се на претходни приказ",
|
||||
"prefs.sketch_exit_view.unless_rotated": "Врати се осим ако је ротирано",
|
||||
"prefs.sketch_exit_view_note": "Куда приказ иде након Заврши скицу, Откажи или двоструког Esc.",
|
||||
"prefs.sketch_open_look_at": "Окрени камеру према скици када се отвори",
|
||||
"prefs.sketch_open_look_at_note": "Искључено: када направите или измените скицу, приказ остаје онакав какав јесте. Погледај окреће приказ према скици када то желите.",
|
||||
"prefs.sketch_recent_snap": "Аутоматски привлачи на недавне центре и средишње тачке",
|
||||
"prefs.sketch_recent_snap_note": "Током цртања показивач се привлачи тамо где се секу водичи двају последњих центара кругова или средишњих тачака правих ивица. Искључено: ти водичи служе само за приказ и показивач се не помера.",
|
||||
"prefs.sketch_selection": "Скица и избор",
|
||||
"prefs.sketch_selection_heading": "Скица и избор",
|
||||
"prefs.sketch_selection_note": "Како се скице привлаче и како кликови бирају.",
|
||||
@@ -1933,7 +2064,14 @@
|
||||
"prefs.toast_place": "Обавештења",
|
||||
"prefs.toggle_item": "Додај ставку или је поново уклони",
|
||||
"prefs.toolbar": "Трака са алатима",
|
||||
"prefs.toolbar_tabs": "Картице траке са алатима",
|
||||
"prefs.top": "Горе",
|
||||
"prefs.trackpad_zoom_modifier": "Зумирај скроловањем са два прста док држите",
|
||||
"prefs.trackpad_zoom_modifier.alt": "⌥ / Alt",
|
||||
"prefs.trackpad_zoom_modifier.cmd": "⌘",
|
||||
"prefs.trackpad_zoom_modifier.ctrl": "Ctrl",
|
||||
"prefs.trackpad_zoom_modifier.help": "Држите само овај тастер да зумирате према показивачу вертикалним скроловањем. Искључено задржава постојеће понашање скроловања.",
|
||||
"prefs.trackpad_zoom_modifier.off": "Искључено",
|
||||
"prefs.translucent": "Провидно",
|
||||
"prefs.under_browser": "Испод стабла модела",
|
||||
"prefs.under_cursor": "Испод показивача",
|
||||
@@ -1943,13 +2081,24 @@
|
||||
"prefs.view_confirm_corner": "У реду и Откажи у углу приказа",
|
||||
"prefs.view_confirm_corner_note": "Док је отворен дијалог или скица, квачица и крстић горе десно у приказу раде исто што и дугмад У реду и Откажи у дијалогу, односно завршавају и отказују скицу. Навигатор приказа помера се испод њих.",
|
||||
"prefs.viewport": "Прозор приказа",
|
||||
"prefs.viewport_analysis_status": "Прикажи статус анализе у прозору приказа",
|
||||
"prefs.viewport_analysis_status_help": "Приказује активне анализе изнад прозора приказа, отвара њихове легенде из сваке ставке, а тастер Esc искључује најновију анализу. Искључите да бисте вратили легенде у угловима и претходно понашање тастера Esc.",
|
||||
"prefs.viewport_background": "Позадина",
|
||||
"prefs.viewport_background_colour": "Боја",
|
||||
"prefs.viewport_background_theme": "Градијент теме",
|
||||
"prefs.wheel": "Точкић",
|
||||
"prefs.wheel_trackpad": "Точкић и додирна табла",
|
||||
"prefs.workspace": "Радни простор",
|
||||
"prefs.zoom_stop_at_model": "Заустави зумирање на моделу",
|
||||
"prefs.zoom_stop_at_model_tip": "3D миш и апликација уређаја зумирају према површини у средини приказа; зумирање превлачењем држи тачку где је превлачење почело. Искључено: зумирање може да прође кроз модел. Точкић и штипање засебно користе Зумирање према показивачу",
|
||||
"prefs.zoom_toward_cursor": "Зумирање према показивачу",
|
||||
"properties.title": "Својства: {name}",
|
||||
"recovery.days_ago": "пре {count} дана",
|
||||
"recovery.detail": "{file} · операција: {features} · аутоматски сачувано {when}",
|
||||
"recovery.discard_all": "Одбаци све",
|
||||
"recovery.discard_all_detail": "Ово се не може поништити.",
|
||||
"recovery.discard_all_title": "Одбацити аутоматска чувања ({count})?",
|
||||
"recovery.discard_all_title_one": "Одбацити 1 аутоматско чување?",
|
||||
"recovery.hours_ago": "пре {count} h",
|
||||
"recovery.just_now": "управо сада",
|
||||
"recovery.min_ago": "пре {count} min",
|
||||
@@ -2034,6 +2183,7 @@
|
||||
"render.appearance_editor.weight": "Тежина",
|
||||
"render.appearance_physics_separate": "Визуелни изглед не додељује густину, топлотне податке нити друга инжењерска својства.",
|
||||
"render.appearances": "Изгледи",
|
||||
"render.assign_help": "Кликните да примените на избор; превуците за преглед и пустите, или кликните без избора да бојите.",
|
||||
"render.availability_native": "Изворни састав; прегледајте пре примене",
|
||||
"render.availability_projection": "Подржана пројекција; погледајте опсег и изоставке",
|
||||
"render.availability_reference": "Референтни подаци; није аутоматска додела",
|
||||
@@ -2072,6 +2222,7 @@
|
||||
"render.bloom_threshold": "Праг линеарних светлих делова",
|
||||
"render.browse_capabilities": "Прегледај комплетан каталог могућности",
|
||||
"render.browse_environments": "Прегледај изворна HDR окружења",
|
||||
"render.browse_looks": "Прегледај…",
|
||||
"render.browse_native_scenes": "Прегледај изворне студије",
|
||||
"render.browse_physical": "Прегледај физичке референце",
|
||||
"render.browse_quality": "Прегледај спецификације квалитета",
|
||||
@@ -2095,6 +2246,82 @@
|
||||
"render.check_opaque": "Провидност: само непрозирне површине; алфа позадине је подржана.",
|
||||
"render.check_sorted_alpha": "Провидност: апроксимација сортираном алфом.",
|
||||
"render.check_transmission": "Провидност: физичко пропуштање.",
|
||||
"render.children.absolute_floor": "Апсолутни доњи праг",
|
||||
"render.children.adaptive": "Адаптивно",
|
||||
"render.children.add_look_reason": "Додајте изглед да бисте мењали да ли је омогућен и његову јачину.",
|
||||
"render.children.all_shots": "Сви кадрови",
|
||||
"render.children.bloom": "Сјај",
|
||||
"render.children.check": "Провера",
|
||||
"render.children.check_now": "Провери сада",
|
||||
"render.children.chromatic": "Хроматски помак",
|
||||
"render.children.compact": "Компактно",
|
||||
"render.children.contrast": "Контраст",
|
||||
"render.children.copy_image": "Копирај",
|
||||
"render.children.copy_job": "Копирај JSON посла",
|
||||
"render.children.copy_request": "Копирај JSON захтева",
|
||||
"render.children.coverage_error": "Грешка покривености",
|
||||
"render.children.cpu": "CPU праћење зрака",
|
||||
"render.children.denoise": "Смањи шум на завршеној слици",
|
||||
"render.children.depth": "Дубина путање",
|
||||
"render.children.distortion": "Изобличење",
|
||||
"render.children.edge_samples": "Узорци ивица",
|
||||
"render.children.effects_banner": "Ови ефекти захтевају GPU праћење путања. Отварање овога никад не мења методу.",
|
||||
"render.children.enable_adaptive": "Омогућите независне пробне узорке да бисте мењали адаптивне границе.",
|
||||
"render.children.enable_bloom": "Омогућите сјај да бисте мењали његову јачину, праг и полупречник.",
|
||||
"render.children.finishing": "Завршна обрада",
|
||||
"render.children.flare": "Одсјај",
|
||||
"render.children.fresnel": "Fresnel-ови слојеви",
|
||||
"render.children.ghosts": "Духови прстенова",
|
||||
"render.children.glass": "Пренос кроз стакло",
|
||||
"render.children.go_to": "Иди на {editor}",
|
||||
"render.children.grain": "Зрно",
|
||||
"render.children.halo": "Ореол",
|
||||
"render.children.hdr": "HDR",
|
||||
"render.children.keep_master": "Задржи сирови линеарни мастер",
|
||||
"render.children.last_result": "Последњи: {number} · {width} × {height} · {phase}",
|
||||
"render.children.lens_effects": "Ефекти објектива",
|
||||
"render.children.look_summary": "{tone} · изгледи: {count}",
|
||||
"render.children.looks": "Креативни изгледи",
|
||||
"render.children.memory": "Меморија",
|
||||
"render.children.method": "Метода",
|
||||
"render.children.minimum": "Минимум",
|
||||
"render.children.needs_cpu": "Потребно је CPU праћење зрака. Отварање овога никад не мења методу.",
|
||||
"render.children.nested": "Потврђени угнежђени диелектрици",
|
||||
"render.children.not_checked": "Није проверено",
|
||||
"render.children.path": "Праћење путања",
|
||||
"render.children.pilots": "Пробни узорци",
|
||||
"render.children.preview": "Подаци прегледа",
|
||||
"render.children.progressive_reason": "Изаберите Прогресивно да бисте мењали број узорака и семе.",
|
||||
"render.children.radius": "Полупречник",
|
||||
"render.children.reflect_depth": "Дубина рефлексије",
|
||||
"render.children.reflect_samples": "Узорци рефлексије",
|
||||
"render.children.regrade": "Поновна градација",
|
||||
"render.children.relative_error": "Релативна грешка",
|
||||
"render.children.render": "Рендеровање",
|
||||
"render.children.render_shot": "Рендеруј кадар",
|
||||
"render.children.renderer": "Рендерер",
|
||||
"render.children.renderers": "Рендерери",
|
||||
"render.children.request": "Овај захтев",
|
||||
"render.children.reset_finishing": "Ресетуј завршну обраду",
|
||||
"render.children.review_quality": "Прегледај спецификацију квалитета…",
|
||||
"render.children.rgb_gain": "RGB појачање",
|
||||
"render.children.samples": "Узорци",
|
||||
"render.children.sampling": "Узорковање",
|
||||
"render.children.saturation": "Засићеност",
|
||||
"render.children.scene_summary": "тела: {bodies} · троуглови: {triangles}",
|
||||
"render.children.seed": "Семе",
|
||||
"render.children.sharpening": "Изоштравање",
|
||||
"render.children.single_image": "Једна слика",
|
||||
"render.children.soft_focus": "Меки фокус",
|
||||
"render.children.streak": "Пруга",
|
||||
"render.children.strength": "Јачина",
|
||||
"render.children.studio": "Студио",
|
||||
"render.children.threshold": "Праг",
|
||||
"render.children.tone": "Тон",
|
||||
"render.children.under_hood": "Испод хаубе",
|
||||
"render.children.vignette": "Вињета",
|
||||
"render.children.workstation": "Радна станица",
|
||||
"render.choose_look": "Прво изаберите изглед у Изгледима",
|
||||
"render.chromatic_offset": "Хроматски помак ивица",
|
||||
"render.clear_stage": "Уклони сачувану сцену",
|
||||
"render.copy_request": "Копирај JSON",
|
||||
@@ -2346,8 +2573,33 @@
|
||||
"render.flare_strength": "Јачина одсјаја светлих делова",
|
||||
"render.flare_threshold": "Линеарни праг одсјаја сцене",
|
||||
"render.fold_browser": "Скупи стабло модела",
|
||||
"render.frame_aspect": "Однос страница",
|
||||
"render.frame_centre_mark": "Ознака центра",
|
||||
"render.frame_copy_limit": "Нема слободног назива за дупликат кадра",
|
||||
"render.frame_copy_name": "{name} копија {number}",
|
||||
"render.frame_custom": "Прилагођено",
|
||||
"render.frame_distance_unit": " × величина",
|
||||
"render.frame_duplicate": "Дуплицирај",
|
||||
"render.frame_exposure": "Експозиција",
|
||||
"render.frame_fov": "Видно поље",
|
||||
"render.frame_guides": "Водичи",
|
||||
"render.frame_invalid_aspect": "Неисправан унапред подешен однос страница",
|
||||
"render.frame_lens": "FOV {fov}° · ≈ {mm} mm",
|
||||
"render.frame_name": "Назив",
|
||||
"render.frame_output_size": "Величина излаза",
|
||||
"render.frame_photo": "3:2 · Фотографија",
|
||||
"render.frame_portrait": "4:5 · Портрет",
|
||||
"render.frame_presets": "Унапред подешени кадрови",
|
||||
"render.frame_presets_pending": "Стиже са уређивачем кадрова",
|
||||
"render.frame_projection": "Пројекција",
|
||||
"render.frame_render_shot": "Рендеруј овај кадар",
|
||||
"render.frame_rule_thirds": "Правило трећина",
|
||||
"render.frame_safe_area": "Безбедна зона",
|
||||
"render.frame_shot_title": "Кадар · {name}",
|
||||
"render.frame_square": "1:1 · Квадрат",
|
||||
"render.frame_tall": "9:16 · Усправно",
|
||||
"render.frame_thirds": "Трећине",
|
||||
"render.frame_wide": "16:9 · Широки екран",
|
||||
"render.gpu_depth": "Максимална дубина путање",
|
||||
"render.gpu_options_help": "Узорци, дубина, семе и експозиција чувају се са овим подешавањем. Чува се само активна метода слике.",
|
||||
"render.gpu_path_failed": "GPU праћење путања није доступно",
|
||||
@@ -2375,6 +2627,7 @@
|
||||
"render.heading_results": "РЕЗУЛТАТИ",
|
||||
"render.heading_shots": "КАДРОВИ",
|
||||
"render.hide_shots_label": "Сакриј траку кадрова",
|
||||
"render.hover_look": "{object} · {look} · кликните за избор",
|
||||
"render.image_advanced": "Напредне GPU контроле",
|
||||
"render.image_cancelled": "Рендеровање је отказано",
|
||||
"render.image_cancelling": "Отказивање",
|
||||
@@ -2521,17 +2774,95 @@
|
||||
"render.library_uniform_ack": "Користи једноличну апроксимацију без просторних или напредних ефеката",
|
||||
"render.library_usable": "Извршне пројекције",
|
||||
"render.library_users": "Корисници",
|
||||
"render.light_aim": "Усмери ка",
|
||||
"render.light_anchor_pending": "Промена координатног система светла још није подржана.",
|
||||
"render.light_azimuth": "Азимут",
|
||||
"render.light_backend_limit": "Изаберите CPU праћење зрака или изричити GPU студио да бисте мењали светла. Светла старог GPU студија остају само за читање.",
|
||||
"render.light_behaviour": "ПОНАШАЊЕ",
|
||||
"render.light_default_fill": "Допунско",
|
||||
"render.light_default_key": "Главно",
|
||||
"render.light_default_number": "Светло {number}",
|
||||
"render.light_default_rim": "Рубно",
|
||||
"render.light_delete": "Избриши",
|
||||
"render.light_distance": "Растојање",
|
||||
"render.light_duplicate": "Дуплицирај",
|
||||
"render.light_elevation": "Елевација",
|
||||
"render.light_gpu_punctual": "Тачкаста светла и рефлектори доступни су уз CPU праћење зрака.",
|
||||
"render.light_hard_shadow": "Ово светло има оштре сенке; мекоћа емитера није доступна.",
|
||||
"render.light_intensity": "Интензитет",
|
||||
"render.light_missing": "Ово светло више не постоји. Изаберите светло у стаблу модела.",
|
||||
"render.light_place_highlight": "Постави према одсјају",
|
||||
"render.light_place_pending": "Постављање према одсјају захтева избор светла у прозору приказа и још није подржано.",
|
||||
"render.light_position": "ПОЛОЖАЈ",
|
||||
"render.light_preview_help": "Приказ уживо је без сенки; површинска светла користе апроксимацију узорком из центра. Рендеровање користи потпуни модел светла.",
|
||||
"render.light_product_centre": "Центар производа",
|
||||
"render.light_size": "Величина",
|
||||
"render.light_softness": "Мекоћа",
|
||||
"render.light_temperature": "Температура боје",
|
||||
"render.light_temperature_help": "Приближна нијанса црног тела; чува се као линеарни RGB.",
|
||||
"render.light_type": "Врста",
|
||||
"render.light_type_area": "Површинско",
|
||||
"render.light_type_point": "Тачкасто",
|
||||
"render.light_type_spot": "Рефлектор",
|
||||
"render.light_type_sun": "Сунце",
|
||||
"render.light_view_only": "Само једно светло и искључена светла утичу на овај приказ и његове рендере; никад се не чувају у дизајну.",
|
||||
"render.light_world_origin": "Исходиште света",
|
||||
"render.lighting_aim_point": "Тачка циљања",
|
||||
"render.lighting_apply": "Примени подешавање",
|
||||
"render.lighting_area_samples": "Узорци површинског светла",
|
||||
"render.lighting_budget": "Буџет",
|
||||
"render.lighting_budget_help": "Бројеви су само за читање. Додајте, дуплицирајте или избришите светла да бисте их променили; метода одређује ограничења.",
|
||||
"render.lighting_colour": "Боја",
|
||||
"render.lighting_consent": "Замени усмерена светла овим подешавањем",
|
||||
"render.lighting_custom": "Прилагођена светла",
|
||||
"render.lighting_custom_help": "Избор опције Прилагођено претвара подешавање у светла која се могу мењати, свако у свом реду у стаблу.",
|
||||
"render.lighting_direction": "Смер X Y Z",
|
||||
"render.lighting_direction_help": "Или упишите смер према светлу (X Y Z).",
|
||||
"render.lighting_distance_unit": " × величина",
|
||||
"render.lighting_edge_u": "Вектор странице U",
|
||||
"render.lighting_edge_v": "Вектор странице V",
|
||||
"render.lighting_falloff": "Слабљење",
|
||||
"render.lighting_falloff_help": "Интензитет је наведен на референтном растојању.",
|
||||
"render.lighting_height": "Висина V",
|
||||
"render.lighting_minimum": "Минимум",
|
||||
"render.lighting_mute": "Искључи ово светло",
|
||||
"render.lighting_point": "Тачка",
|
||||
"render.lighting_preset": "Подешавање студија",
|
||||
"render.lighting_preset_cpu": "Подешавања студија са усмереним светлима захтевају CPU праћење зрака. GPU осветљење користи изричита сунчева и површинска светла.",
|
||||
"render.lighting_preset_row": "Подешавање",
|
||||
"render.lighting_radiance": "Радијанса",
|
||||
"render.lighting_reference": "Референца",
|
||||
"render.lighting_review_help": "Замењује списак усмерених светала. Задржава тачкаста и површинска светла, окружење, сенке, камеру и сва остала подешавања кадра.",
|
||||
"render.lighting_review_title": "Прегледај подешавање осветљења",
|
||||
"render.lighting_samples_cpu": "Узорци површинског светла важе за CPU праћење зрака.",
|
||||
"render.lighting_samples_need_area": "Додајте CPU површинско светло да бисте подесили узорке површинског светла.",
|
||||
"render.lighting_samples_reason": "Узорци површинског светла морају бити 1, 4, 16 или 64.",
|
||||
"render.lighting_shadow_cpu": "Прекидач сенки захтева CPU праћење зрака. GPU праћење путања увек баца сенке.",
|
||||
"render.lighting_shadows": "Баци сенке",
|
||||
"render.lighting_shadows_section": "Сенке и узорковање",
|
||||
"render.lighting_shape": "Облик",
|
||||
"render.lighting_solo": "Само ово светло",
|
||||
"render.lighting_source": "Извор",
|
||||
"render.lighting_source_section": "Извор светла",
|
||||
"render.lighting_spot_preserved": "Ово тачкасто светло задржава сачувани конус рефлектора док му се не промени врста.",
|
||||
"render.lighting_sun_distance": "Смер сунца не зависи од растојања и тачке циљања.",
|
||||
"render.lighting_unsupported": "неподржано",
|
||||
"render.lighting_used": "{used} од {limit}",
|
||||
"render.lighting_width": "Ширина U",
|
||||
"render.lighting_world_position": "Светски X Y Z",
|
||||
"render.lights_fixed_to": "Светла везана за",
|
||||
"render.linear_help": "Задржава 32-битни флоат RGBA мастер пре уклањања шума, експозиције, мапирања тонова, филтера и позадине. Линеарни sRGB/D65; помножен покривеношћу. Додатна меморија се изричито одобрава. Без компресије и додатних пролаза.",
|
||||
"render.linear_retain": "Задржи сирови линеарни EXR",
|
||||
"render.linear_unavailable": "Изабрани завршени кадар нема задржани EXR. Омогућите задржавање пре рендеровања; старији PNG не може да врати сирову радијансу.",
|
||||
"render.look_add": "Додај изглед боје",
|
||||
"render.look_applied": "Примењено: {name}",
|
||||
"render.look_bleach": "По узору на bleach bypass",
|
||||
"render.look_cool": "Хладно",
|
||||
"render.look_cyanotype": "По узору на цијанотипију",
|
||||
"render.look_faded": "Избледели отисак",
|
||||
"render.look_material": "Материјал",
|
||||
"render.look_mono": "Једнобојно",
|
||||
"render.look_pasted": "Изглед је налепљен",
|
||||
"render.look_sepia": "Сепија",
|
||||
"render.look_strength": "Јачина изгледа",
|
||||
"render.look_teal_orange": "Тиркизно / наранџасто",
|
||||
@@ -2607,9 +2938,11 @@
|
||||
"render.output_advanced": "Напредно",
|
||||
"render.output_backend_ready": "Спремно",
|
||||
"render.output_check": "Провери",
|
||||
"render.output_check_failed": "Провера · грешка",
|
||||
"render.output_check_help": "Покрените проверу да бисте прегледали овај захтев без покретања рендеровања.",
|
||||
"render.output_check_summary": "Провера · Напомене: {count}",
|
||||
"render.output_copy": "Копирај",
|
||||
"render.output_copy_report": "Копирај извештај",
|
||||
"render.output_destination": "Одредиште",
|
||||
"render.output_destination_help": "Одредишну датотеку изаберите при извозу завршене слике.",
|
||||
"render.output_dimensions": "Величина",
|
||||
@@ -2619,6 +2952,7 @@
|
||||
"render.output_fit": "Уклопи",
|
||||
"render.output_format": "Формат",
|
||||
"render.output_format_status": "PNG је тачна завршена слика за приказ. Необавезни GPU EXR задржава сирову линеарну радијансу сцене у формату FLOAT32 пре филтера приказа. Извоз никад не замењује кеш прегледа ни други посао.",
|
||||
"render.output_grading": "Градација",
|
||||
"render.output_image": "Слика",
|
||||
"render.output_largest": "Највише {width} × {height}",
|
||||
"render.output_lock_ratio": "Закључај однос страница",
|
||||
@@ -2628,6 +2962,8 @@
|
||||
"render.output_quality_waiting": "чека се уговор о квалитету",
|
||||
"render.output_ratio_refused": "Повезана димензија премашује ограничење величине ове методе. Претходна величина се задржава; откључајте однос или изаберите мању вредност.",
|
||||
"render.output_ready": "Спремно за рендеровање",
|
||||
"render.output_run_check": "Покрени проверу",
|
||||
"render.output_size_limit": "{method}: до {dimension} px по страни и {pixels} пиксела. Највећа величина која стаје: {width} × {height}.",
|
||||
"render.output_size_ok": "Величина је у реду · {width} × {height} px",
|
||||
"render.output_swap_orientation": "Замени ширину и висину",
|
||||
"render.output_tools_inspector": "Величину и формат измените у инспектору Излаз.",
|
||||
@@ -2644,6 +2980,7 @@
|
||||
"render.page_output": "Излаз",
|
||||
"render.page_scene": "Сцена",
|
||||
"render.paint_label": "Обоји",
|
||||
"render.painting_with": "Бојење изгледом {name}",
|
||||
"render.passive_stage": "Подлога и пасивна сцена",
|
||||
"render.passive_stage_help": "Коначни пасивни панели припадају само рендерованим сликама. Не додају CAD тела ни масу. Постављање је фиксно након примене; пресецање граница производа се одбија. CPU не даје дифузно одбијено осветљење.",
|
||||
"render.perspective": "Перспективна камера",
|
||||
@@ -2665,6 +3002,7 @@
|
||||
"render.pick_help": "Изаберите Тело, Лице или Компонента. Кликните празан простор да очистите избор; Shift или Ctrl додаје или укључује/искључује. Истицања се појављују само у живом приказу производа.",
|
||||
"render.pick_label": "Изабери",
|
||||
"render.pick_up_label": "Преузми",
|
||||
"render.pick_up_prompt": "Кликните објекат да преузмете његов изглед",
|
||||
"render.pick_waiting": "Избор производа још није подржан.",
|
||||
"render.post_contrast": "Контраст",
|
||||
"render.post_gain_b": "Појачање плаве",
|
||||
@@ -2704,13 +3042,17 @@
|
||||
"render.radial_distortion": "Радијално изобличење",
|
||||
"render.radial_fit": "Уклопи производ",
|
||||
"render.radial_save": "Сачувај кадар",
|
||||
"render.recent_looks": "Недавни изгледи",
|
||||
"render.regrade_action": "Поновна градација сировог мастера (без уклањања шума)",
|
||||
"render.regrade_help": "Прави засебан PNG из изабраног завршеног сировог мастера, користећи ове контроле приказа. Не прати зраке, не мења забележену величину, камеру ни светла и не преписује EXR. Уклањање шума се не примењује поново: сирови мастери не чувају његове водиље. Изведена слика се и даље може извести истим контролама посла.",
|
||||
"render.regrade_label": "Поновна градација",
|
||||
"render.reload_settings": "Поново учитај сачувана подешавања",
|
||||
"render.remove_override": "Уклони надјачавање",
|
||||
"render.replace_all": "Замени све",
|
||||
"render.replace_ground": "Потврди замену постојеће сцене",
|
||||
"render.replace_label": "Замени",
|
||||
"render.replace_saved_surface": "Замени постојећу сачувану везу за овај циљ",
|
||||
"render.replace_with": "Замени са",
|
||||
"render.restore_camera": "Врати сачувану камеру",
|
||||
"render.result_actual": "100%",
|
||||
"render.result_actual_help": "Један пиксел слике по пикселу екрана.",
|
||||
@@ -2762,14 +3104,28 @@
|
||||
"render.saved_surface_remove": "Уклони сачувану везу",
|
||||
"render.saved_surfaces": "Сачуване везе површина",
|
||||
"render.saved_surfaces_help": "Фиксиране уграђене мапе прате изабрани примерак у локалним милиметрима. Замењен или недостајући циљ је грешка, никад аутоматска поновна додела.",
|
||||
"render.scene_all_shots": "Сви кадрови ({count})",
|
||||
"render.scene_apply": "Примени прегледани студио",
|
||||
"render.scene_batch_reason": "За Све кадрове потребан је ред чекања за рендеровање сачуваних кадрова, који још није доступан.",
|
||||
"render.scene_check_now": "Провери сада",
|
||||
"render.scene_check_passed": "Провера је прошла · напомене: {notes}",
|
||||
"render.scene_check_stale": "Провера је застарела · проверите поново",
|
||||
"render.scene_check_unchecked": "Још није проверено · напомене: 0",
|
||||
"render.scene_consent": "Потврди замену осветљења, окружења, експозиције и сцене",
|
||||
"render.scene_light_summary": "{environment} · светла: {lights}",
|
||||
"render.scene_look_summary": "изгледи: {looks} · надјачавања: {overrides}",
|
||||
"render.scene_open_check": "Отвори проверу",
|
||||
"render.scene_preserved_fields": "Камера, узорковање, димензије, оптичке везе, CAD геометрија и инжењерски материјали се чувају.",
|
||||
"render.scene_preserves_design": "Саставите осветљење и пасивну сцену за видљиви предмет. Геометрија, инжењерски материјали и камера остају одвојени.",
|
||||
"render.scene_ready": "Спремно за рендеровање",
|
||||
"render.scene_reminder": "Сцена чува дизајн. Геометрија, инжењерска својства и CAD никад се не мењају из Рендеровања.",
|
||||
"render.scene_reminders": "Подсетници",
|
||||
"render.scene_renderer_ready": "Спремно: {renderer}",
|
||||
"render.scene_replaces": "Замењује",
|
||||
"render.scene_review": "Разреши и прегледај",
|
||||
"render.scene_review_help": "Прегледајте комплетну изворну композицију пре примене. Невезане напредне SCENE спецификације се не замењују.",
|
||||
"render.scene_scope_details": "Опсег композиције",
|
||||
"render.scene_stages": "Фазе",
|
||||
"render.search_appearances": "Претражи {count} изгледа",
|
||||
"render.setup_legacy_environment": "Ово старије подешавање користи наслеђену ротацију или интензитет окружења. Те вредности се задржавају; изричито их претворите пре чувања пуног посла слике.",
|
||||
"render.setup_name": "Назив подешавања",
|
||||
@@ -2782,7 +3138,22 @@
|
||||
"render.shell_tab_camera": "КАМЕРА РЕНДЕРА",
|
||||
"render.shell_tab_lighting": "ОСВЕТЉЕЊЕ",
|
||||
"render.shell_tab_scene": "СЦЕНА РЕНДЕРА",
|
||||
"render.shot_aperture": "Отвор бленде",
|
||||
"render.shot_distance": "Растојање",
|
||||
"render.shot_dof": "Дубинска оштрина",
|
||||
"render.shot_duplicate": "Дуплицирај сачувани кадар",
|
||||
"render.shot_edit_output": "Измени у Излазу",
|
||||
"render.shot_exposure_reason": "Експозиција захтева CPU праћење зрака или GPU праћење путања.",
|
||||
"render.shot_exposure_section": "Експозиција",
|
||||
"render.shot_focus_distance": "Растојање фокуса",
|
||||
"render.shot_fov_reason": "Видно поље захтева перспективну пројекцију.",
|
||||
"render.shot_frame_subject": "Уоквири предмет",
|
||||
"render.shot_invalid_camera": "Вредности камере морају бити коначне и у дозвољеном опсегу.",
|
||||
"render.shot_lens": "Објектив",
|
||||
"render.shot_lens_enable_reason": "Омогућите дубинску оштрину да бисте мењали отвор бленде и растојање фокуса.",
|
||||
"render.shot_lens_gpu_reason": "Дубинска оштрина захтева GPU праћење путања.",
|
||||
"render.shot_lens_perspective_reason": "Дубинска оштрина захтева перспективну пројекцију.",
|
||||
"render.shot_look_selection": "Усмери на избор",
|
||||
"render.shot_manager": "Сачувани кадрови",
|
||||
"render.shot_new_name": "Назив новог кадра",
|
||||
"render.shot_remove": "Уклони сачувани кадар",
|
||||
@@ -2790,6 +3161,9 @@
|
||||
"render.shot_remove_title": "Уклонити сачувани кадар?",
|
||||
"render.shot_rename": "Преименуј сачувани кадар",
|
||||
"render.shot_saved_only": "Прво сачувајте тренутни нацрт. Дуплицирање и преименовање чувају тачне сачуване опције и референце на ресурсе.",
|
||||
"render.shot_selection_reason": "Изаберите тело или лице на које ћете усмерити камеру.",
|
||||
"render.shot_size": "Величина",
|
||||
"render.shot_target": "Циљ",
|
||||
"render.shots_camera_changed": "Камера је промењена откако је овај кадар сачуван",
|
||||
"render.shots_name_help": "Унесите јединствен назив за тренутни кадар.",
|
||||
"render.shots_no_result": "Још нема рендера",
|
||||
@@ -3052,6 +3426,7 @@
|
||||
"select an axis": "изаберите осу",
|
||||
"select an axis, a straight or circular edge, or a cylinder, cone or torus face first": "прво изаберите осу, праву или кружну ивицу, или лице цилиндра, конуса или торуса",
|
||||
"select bodies first": "прво изаберите тела",
|
||||
"select components first": "прво изаберите компоненте",
|
||||
"select corner points, or the two lines of one corner": "изаберите тачке углова или две линије једног угла",
|
||||
"select one corner point, or the two lines of one corner": "изаберите једну тачку угла или две линије једног угла",
|
||||
"select sheet edges first": "прво изаберите ивице лима",
|
||||
@@ -3070,6 +3445,7 @@
|
||||
"settings.double_click_components": "Двоструки клик на компоненту је активира, а повезану компоненту мења на месту",
|
||||
"settings.frame_rate_details_note": "Додаје график времена последњих кадрова са бројем исцртаних троуглова, хистограм времена кадрова и шта је GPU нацртао. Кликните број кадрова у секунди у приказу да их прикажете или сакријете.",
|
||||
"settings.frame_rate_note": "Приказује број кадрова у секунди у доњем десном углу приказа.",
|
||||
"settings.insert_lists_open_designs": "Уметни дизајн прво наводи дизајне отворене у другим картицама",
|
||||
"settings.measure_axis_distances": "Прикажи растојања X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Приказуј компоненте растојања по светским осама уз укупно растојање док је Мерење отворено.",
|
||||
"settings.msaa_applies_on_restart": "Углађивање ивица примењује се при следећем покретању SolidCraft-а",
|
||||
@@ -3094,6 +3470,10 @@
|
||||
"shortcut.unpin": "Откачи",
|
||||
"sketch is missing": "скица недостаје",
|
||||
"sketch.degrees_of_freedom": "Степени слободе: {count}",
|
||||
"sketch.dimension_added_driven": "Скица већ одређује ту коту, па је додата као изведена (референтна) кота",
|
||||
"sketch.dimension_applied": "Кота је примењена",
|
||||
"sketch.dimension_applied_defined": "Кота је примењена; параметар `{name}` је дефинисан",
|
||||
"sketch.dimension_applied_renamed": "Кота је примењена; параметар је назван `{name}`",
|
||||
"sketch.dof_left": "Преостали степени слободе: {count}",
|
||||
"sketch.dof_left_one": "Преостали степени слободе: {count}",
|
||||
"sketch.draw_curves": "Цртај као {linetype}",
|
||||
@@ -3128,6 +3508,8 @@
|
||||
"sketch_text.use_font_file": "Користи датотеку фонта {path}",
|
||||
"solid": "пуно",
|
||||
"status.editing": "Измена: {name}",
|
||||
"status.navigation": "Мапирање миша: {mapping}",
|
||||
"status.navigation_tip": "Како миш помера приказ. Кликните да изаберете друго мапирање",
|
||||
"status.under_constrained": "Недовољно ограничено (степени слободе: {count})",
|
||||
"status.under_constrained_one": "Недовољно ограничено ({count} степен слободе)",
|
||||
"status.units_tip": "Јединице дизајна. Кликните да их промените",
|
||||
@@ -3161,8 +3543,10 @@
|
||||
"timeline.delete_folders_tip": "Задржи њихове операције и угнежђене фасцикле у временској траци",
|
||||
"timeline.delete_folders_with_features_tip": "Избриши фасцикле са свим операцијама у њима и њихове угнежђене фасцикле",
|
||||
"timeline.delete_many": "Избриши изабране операције: {count}",
|
||||
"timeline.edited_rolled_back": "Операција {name} је промењена, али је после ознаке враћања, па није изграђена: померите ознаку иза ње да видите резултат",
|
||||
"timeline.feature_error": "Грешка: {message}",
|
||||
"timeline.feature_hint": "Двапут кликните за измену · превуците за промену редоследа · десни клик за више",
|
||||
"timeline.feature_rolled_back": "Враћено уназад: после ознаке враћања, па није изграђено",
|
||||
"timeline.feature_warning": "Упозорење: {message}",
|
||||
"timeline.group": "Нова фасцикла операција",
|
||||
"timeline.move_many": "Премести ставке временске траке",
|
||||
@@ -3244,6 +3628,10 @@
|
||||
"ui.3d_mouse_offer": "Калибрација 3D миша исправља замењене или обрнуте осе и подешава његову брзину и осећај.",
|
||||
"ui.3d_mouse_offer_never": "Не приказуј више",
|
||||
"ui.3d_mouse_offer_swap": "Пребаци на Hidraw (директни драјвер)",
|
||||
"ui.3d_mouse_orbit": "Орбитирање",
|
||||
"ui.3d_mouse_orbit_classic": "Класично",
|
||||
"ui.3d_mouse_orbit_tip": "Праћено: 3D миш окреће приказ око дела модела који је у средини приказа када окретање почне, означеног бледом куглом. Класично: око центра приказа",
|
||||
"ui.3d_mouse_orbit_traced": "Праћено",
|
||||
"ui.3d_mouse_reading": "Очитање",
|
||||
"ui.3d_mouse_reset_axes": "Ресетуј доделу оса",
|
||||
"ui.3d_mouse_reset_view": "Ресетуј приказ",
|
||||
@@ -3280,6 +3668,8 @@
|
||||
"ui.3d_mouse_step_twist_counterclockwise": "Закрените капицу супротно од казаљке на сату, држите је, а затим пустите.",
|
||||
"ui.3d_mouse_switch_cap": "Калибриши као Повратак у центар",
|
||||
"ui.3d_mouse_switch_trackball": "Калибриши као трекбол",
|
||||
"ui.3d_mouse_use_direct": "Користи директни драјвер",
|
||||
"ui.3d_mouse_use_direct_tip": "Читај 3D миш директно (hidraw) уместо преко spacenavd.",
|
||||
"ui.3d_mouse_view_axis": "Оса приказа",
|
||||
"ui.3d_mouse_view_off": "Искључено",
|
||||
"ui.3d_mouse_view_off_tip": "Профил драјвера 3D миша искључује ову осу, па њено кретање не помера приказ. Избор кретања друге осе овде их замењује, а то кретање престаје да помера приказ.",
|
||||
@@ -3596,6 +3986,7 @@
|
||||
"ui.circle": "Круг",
|
||||
"ui.circular_pattern": "Кружни низ",
|
||||
"ui.clear": "Очисти",
|
||||
"ui.clear_print_face": "Уклони површину за штампу",
|
||||
"ui.clear_recent": "Очисти недавно",
|
||||
"ui.clear_the_selection": "Поништи избор",
|
||||
"ui.click_selects_whole_bodies": "Клик бира цела тела",
|
||||
@@ -3630,6 +4021,15 @@
|
||||
"ui.constant": "Константно",
|
||||
"ui.constraints_conflict": "Ограничења су у сукобу",
|
||||
"ui.construction": "Помоћна",
|
||||
"ui.construction.angle_hint": "Помоћна права: кликните тачку, па упишите угао или изаберите смер",
|
||||
"ui.construction.bisector_hint": "Симетрала: изаберите две праве линије које се секу, па жељено решење",
|
||||
"ui.construction.common_hint": "Заједничка тангента: изаберите два круга или лука, па жељено решење",
|
||||
"ui.construction.contact_hint": "Тангента: изаберите круг/лук или отворени сплајн/конику, па тачку додира (криве слободног облика: крајње тачке)",
|
||||
"ui.construction.external_hint": "Тангента: изаберите круг или лук, спољашњу тачку, па жељено решење",
|
||||
"ui.construction.free_hint": "Помоћна права: кликните две тачке; десним кликом почните испочетка",
|
||||
"ui.construction.point_hint": "Помоћна права: кликните тачку кроз коју пролази",
|
||||
"ui.construction.reference_hint": "Помоћна права: изаберите праву линију, па тачку; десним кликом промените референцу",
|
||||
"ui.construction.ribbon_label": "Пом. праве",
|
||||
"ui.context_menu": "Контекстни мени",
|
||||
"ui.continuity_g0": "G0 прегиб",
|
||||
"ui.continuity_g1": "G1 тангентно",
|
||||
@@ -3670,6 +4070,7 @@
|
||||
"ui.design_properties.part_number": "Број дела",
|
||||
"ui.design_properties.project": "Пројекат",
|
||||
"ui.design_properties.revision": "Ревизија",
|
||||
"ui.design_saved": "Сачувано: {path}",
|
||||
"ui.diameter": "Пречник",
|
||||
"ui.dimension": "Кота",
|
||||
"ui.direct_interaction": "Директна интеракција",
|
||||
@@ -3720,6 +4121,14 @@
|
||||
"ui.end_scale": "Крајње скалирање",
|
||||
"ui.entities": "Елементи",
|
||||
"ui.equal": "Једнакост",
|
||||
"ui.equation_end": "Крај",
|
||||
"ui.equation_explicit": "Експлицитни",
|
||||
"ui.equation_form": "Облик",
|
||||
"ui.equation_note": "Променљива је обичан број: sin(t) је узима у радијанима. Резултат без јединице је у јединици дизајна.",
|
||||
"ui.equation_parametric": "Параметарски",
|
||||
"ui.equation_x_of_t": "x(t)",
|
||||
"ui.equation_y_of_t": "y(t)",
|
||||
"ui.equation_y_of_x": "y(x)",
|
||||
"ui.equivalent_radius": "Еквивалентни полупречник",
|
||||
"ui.expand": "Прошири",
|
||||
"ui.exportDxf": "Извези DXF…",
|
||||
@@ -3785,6 +4194,7 @@
|
||||
"ui.heading_design": "ДИЗАЈН",
|
||||
"ui.heading_draft": "НАГИБ",
|
||||
"ui.heading_edit": "ИЗМЕНИ",
|
||||
"ui.heading_equation_curve": "КРИВА ПО ЈЕДНАЧИНИ",
|
||||
"ui.heading_extrude": "ЕКСТРУДИРАЈ",
|
||||
"ui.heading_fillet": "ЗАОБЉЕЊЕ",
|
||||
"ui.heading_finish_editing": "ЗАВРШИ ИЗМЕНУ",
|
||||
@@ -3876,6 +4286,10 @@
|
||||
"ui.import_ellipsis": "Увези…",
|
||||
"ui.infinite": "Бесконачно",
|
||||
"ui.insert": "Уметни",
|
||||
"ui.insert_design.browse": "Прегледај…",
|
||||
"ui.insert_design.open_designs": "Отворени дизајни",
|
||||
"ui.insert_design.saved_file": "Дизајн {name} има несачуване промене, па је уметнута његова сачувана датотека. Сачувајте га, а затим покрените Ажурирај везе да бисте унели промене.",
|
||||
"ui.insert_design.unsaved": "Несачуване промене",
|
||||
"ui.inspect": "Прегледај",
|
||||
"ui.intersect": "Пресек",
|
||||
"ui.isolate": "Изолуј",
|
||||
@@ -3975,6 +4389,7 @@
|
||||
"ui.pan_zoom_orbit": "Померање, зумирање, орбитирање",
|
||||
"ui.parallel": "Паралелност",
|
||||
"ui.parameters": "Параметри",
|
||||
"ui.part_size_needs_a_part": "Изаберите уметнути стандардни део (завртањ, навртку, подлошку или чивију) да бисте му променили величину. Да тело повећате или смањите, користите Скалирај.",
|
||||
"ui.part_size_shared": "Поново гради део, замењујући све додате операције. Сви примерци ове компоненте се ажурирају.",
|
||||
"ui.paste": "Налепи",
|
||||
"ui.path": "Путања",
|
||||
@@ -4018,12 +4433,29 @@
|
||||
"ui.polygon": "Полигон",
|
||||
"ui.preferences": "Подешавања",
|
||||
"ui.press_a_key": "притисните тастер…",
|
||||
"ui.print_face_cleared": "{body}: површина за штампу уклоњена",
|
||||
"ui.print_face_input": "Површина за штампу",
|
||||
"ui.print_face_one_body": "Површина за штампу припада једном телу: пошаљите то тело само да бисте је променили",
|
||||
"ui.print_face_pick": "Изаберите равну површину пуног тела да постане површина за штампу",
|
||||
"ui.print_face_set": "{body}: површина за штампу постављена; Пошаљи у слајсер полаже тело на њу",
|
||||
"ui.profile": "Профил",
|
||||
"ui.profile_plane": "Раван профила",
|
||||
"ui.profiles": "Профили",
|
||||
"ui.project": "Пројектуј",
|
||||
"ui.project_face_edges_sketch": "Пројектуј ивице лица у нове скице",
|
||||
"ui.properties": "Својства",
|
||||
"ui.properties.copy_matrix": "Копирај матрицу",
|
||||
"ui.properties.first_moments": "Статички моменти",
|
||||
"ui.properties.inertia": "Момент инерције",
|
||||
"ui.properties.inertia_note": "У односу на центар масе, у светским осама (g·{unit}²)",
|
||||
"ui.properties.inertia_unavailable": "Није доступно: мрежа једног тела није затворена.",
|
||||
"ui.properties.inertia_x": "Ixx, Ixy, Ixz",
|
||||
"ui.properties.inertia_y": "Iyx, Iyy, Iyz",
|
||||
"ui.properties.inertia_z": "Izx, Izy, Izz",
|
||||
"ui.properties.measuring": "Мерење…",
|
||||
"ui.properties.measuring_failed": "Мерење је заустављено пре завршетка.",
|
||||
"ui.properties.principal_axis": "Главна оса {number}",
|
||||
"ui.properties.principal_moments": "Главни моменти",
|
||||
"ui.pull_direction": "Смер вађења из калупа",
|
||||
"ui.quality": "Квалитет",
|
||||
"ui.quantity": "Број",
|
||||
@@ -4069,6 +4501,7 @@
|
||||
"ui.revolve": "Ротирај",
|
||||
"ui.ribbon_exit": "Изађи",
|
||||
"ui.ribbon_labels": "Прикажи текст испод икона на траци",
|
||||
"ui.ribbon_menus_skip_pinned": "Изостави прикачене команде из падајућих менија",
|
||||
"ui.ribbon_pin_footer": "Прикачене команде приказују се на траци. Задржите показивач изнад реда да га прикачите или откачите.",
|
||||
"ui.ribbon_workspace": "Радни простор",
|
||||
"ui.right": "Десно",
|
||||
@@ -4086,6 +4519,7 @@
|
||||
"ui.select": "Изабери",
|
||||
"ui.selectOther": "Изабери друго…",
|
||||
"ui.selectTangentChain": "Изабери тангентни ланац",
|
||||
"ui.select_all": "Изабери све",
|
||||
"ui.selection": "Избор",
|
||||
"ui.selection_modifiers": "Модификатори избора",
|
||||
"ui.selection_shift_add_only": "Shift+клик додаје без уклањања",
|
||||
@@ -4122,7 +4556,11 @@
|
||||
"ui.sketch": "Скица",
|
||||
"ui.sketch_dimension": "Кота скице",
|
||||
"ui.sketch_grid": "Мрежа скице",
|
||||
"ui.sketch_intersect_geometry": "Геометрија",
|
||||
"ui.sketch_intersect_projection_link": "Веза пројекције",
|
||||
"ui.sketch_intersect_selection_filter": "Филтер избора",
|
||||
"ui.sketch_modifiers": "Модификатори скице",
|
||||
"ui.sketch_project_geometry": "Геометрија",
|
||||
"ui.sketch_scale": "Скалирање скице",
|
||||
"ui.sketches": "Скице",
|
||||
"ui.slice": "Пресеци",
|
||||
@@ -4169,6 +4607,11 @@
|
||||
"ui.symmetric": "Симетрично",
|
||||
"ui.symmetry": "Симетрија",
|
||||
"ui.system": "Систем",
|
||||
"ui.tab_assemble": "Склоп",
|
||||
"ui.tab_manage": "Управљање",
|
||||
"ui.tab_sheet_metal": "Лим",
|
||||
"ui.tab_view": "Приказ",
|
||||
"ui.tab_weldments": "Заварене конструкције",
|
||||
"ui.tangent": "Тангентно",
|
||||
"ui.taper_angle": "Угао сужења",
|
||||
"ui.tapped": "Са навојем",
|
||||
@@ -4184,6 +4627,7 @@
|
||||
"ui.tip_angle": "Угао врха",
|
||||
"ui.to_object": "До објекта",
|
||||
"ui.tool_direction": "Смер алата",
|
||||
"ui.toolbar_tabs_hidden": "Све картице траке са алатима су скривене. Кликните + или кликните десним дугметом овде да прикажете неку.",
|
||||
"ui.top": "Одозго",
|
||||
"ui.top_diameter": "Горњи пречник",
|
||||
"ui.top_radius": "Горњи полупречник",
|
||||
@@ -4221,6 +4665,8 @@
|
||||
"ui.view_centre": "Центар приказа",
|
||||
"ui.viewport_status_clear": "Искључи {name}",
|
||||
"ui.viewport_status_clear_hint": "Искључи {name} · Esc",
|
||||
"ui.viewport_status_edges": "Ивица: {count}",
|
||||
"ui.viewport_status_from": "из смера {direction}",
|
||||
"ui.viewport_status_key": "Прикажи легенду за {name}",
|
||||
"ui.viewport_status_minimum_radius": "Минимални полупречник",
|
||||
"ui.viewport_status_pairs": "Парова: {count}",
|
||||
@@ -4230,6 +4676,7 @@
|
||||
"ui.visual_shaded_with_edges": "Осенчено са ивицама",
|
||||
"ui.visual_style": "Визуелни стил",
|
||||
"ui.visual_wireframe": "Жичани модел",
|
||||
"ui.wheel_zoom_speed": "Брзина зумирања точкићем миша",
|
||||
"ui.width": "Ширина",
|
||||
"ui.window_system": "Систем прозора",
|
||||
"ui.window_system_auto": "Аутоматски",
|
||||
@@ -4260,7 +4707,9 @@
|
||||
"update.button": "Ажурирај",
|
||||
"update.button_version": "Ажурирај на {version}",
|
||||
"update.check_automatically": "Аутоматски проверавај ажурирања",
|
||||
"update.check_for_updates": "Провери ажурирања",
|
||||
"update.check_now": "Провери сада",
|
||||
"update.check_unavailable": "Провера ажурирања није доступна за ову инсталацију.",
|
||||
"update.checking": "Провера…",
|
||||
"update.copy": "Копирај",
|
||||
"update.dmg_opened": "Слика диска је отворена и проверена: превуците SolidCraft у Applications, замените стару копију, а затим поново покрените SolidCraft.",
|
||||
@@ -4283,6 +4732,9 @@
|
||||
"update.prefs_managed": "Ово је SolidCraft {version}, којим управља {manager}. Провера пита GitHub за најновије издање и не шаље ништа друго; ажурирајте SolidCraft у {manager}.",
|
||||
"update.prefs_note": "Ово је SolidCraft {version} ({kind}). Провера пита GitHub за најновије издање и не шаље ништа друго.",
|
||||
"update.prefs_web": "Поново учитајте страницу да добијете најновију веб апликацију. Ако мрежа није доступна или се ажурирање не може преузети на време, отвара се сачувана верзија; преузимање у току наставља се за следеће поновно учитавање.",
|
||||
"update.refresh_checking": "Провера најновијег издања…",
|
||||
"update.refresh_fallback": "Није било могуће проверити да ли постоји новије издање; ажурирање на верзију {version}, пронађену раније.",
|
||||
"update.refresh_selected": "Ажурирање на {version}.",
|
||||
"update.release_page": "Отвори страницу издања",
|
||||
"update.restart": "Поново покрени сада",
|
||||
"update.restart_later": "Касније",
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
"BLEND SURFACE": "MẶT NỐI MƯỢT",
|
||||
"BOUNDARY SURFACE": "BỀ MẶT BIÊN DẠNG",
|
||||
"BROWSER": "CÂY ĐỐI TƯỢNG",
|
||||
"Back to the original order": "Trở về thứ tự ban đầu",
|
||||
"Ball": "Cầu",
|
||||
"Bar": "Thép thanh",
|
||||
"Base Center": "Tâm đáy",
|
||||
@@ -206,6 +207,7 @@
|
||||
"Edges": "Các cạnh",
|
||||
"Edit": "Sửa",
|
||||
"Edit Profile Sketch": "Chỉnh sửa phác thảo biên dạng",
|
||||
"Edit shortcuts": "Sửa phím tắt",
|
||||
"Enable rule": "Bật quy tắc",
|
||||
"Enabled": "Đã kích hoạt",
|
||||
"End Radius": "Bán kính kết thúc",
|
||||
@@ -468,6 +470,7 @@
|
||||
"Radius": "Bán kính",
|
||||
"Radius Fit": "Bán kính vừa vặn",
|
||||
"Ratio": "Tỷ lệ",
|
||||
"Read-only list: shortcuts can't be changed here.": "Danh sách chỉ đọc: không thể thay đổi phím tắt ở đây.",
|
||||
"Reattach selected face": "Gắn lại bề mặt đã chọn",
|
||||
"Recover": "Khôi phục",
|
||||
"Recover unsaved design?": "Khôi phục thiết kế chưa lưu?",
|
||||
@@ -593,6 +596,8 @@
|
||||
"Snap to face and edge centres": "Bắt vào tâm mặt và tâm cạnh",
|
||||
"SolidCraft cannot submit reports directly. Submit on GitHub; no token is needed in the app.": "SolidCraft không thể gửi báo cáo trực tiếp. Hãy gửi trên GitHub; ứng dụng không cần mã truy cập.",
|
||||
"SolidCraft closed before these designs were saved. Their last autosave can be opened.": "SolidCraft đã đóng trước khi các thiết kế này được lưu. Bạn có thể mở bản tự động lưu gần nhất của chúng.",
|
||||
"Sort A to Z": "Sắp xếp từ A đến Z",
|
||||
"Sort Z to A": "Sắp xếp từ Z đến A",
|
||||
"Spacing 2 must be a non-zero number": "Khoảng cách 2 phải là một số khác 0",
|
||||
"Spacing must be a non-zero number": "Khoảng cách phải là một số khác 0",
|
||||
"Specialise": "Chuyên biệt hóa",
|
||||
@@ -652,6 +657,7 @@
|
||||
"Third point": "Điểm thứ ba",
|
||||
"This child is shared. Deleting it removes it from every copy of its parent.": "Đối tượng con này được dùng chung. Việc xóa nó sẽ xóa khỏi mọi bản sao của đối tượng cha.",
|
||||
"This child is shared. Position changes apply to every copy of its parent.": "Đối tượng con này được dùng chung. Thay đổi vị trí sẽ áp dụng cho mọi bản sao của đối tượng cha.",
|
||||
"This component is inside a subassembly placed more than once: aligning it moves it in every placement.": "Thành phần này nằm trong một cụm lắp phụ được đặt nhiều lần: căn chỉnh nó sẽ làm nó di chuyển ở mọi vị trí đặt.",
|
||||
"This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "Bề mặt này không thể tạo liên kết bền vững. Hãy chọn bề mặt khác hoặc sử dụng mặt phẳng cố định.",
|
||||
"This image is not attached to GitHub yet. Copy or save it, then attach it on GitHub.": "Ảnh này chưa được đính kèm vào GitHub. Vui lòng sao chép hoặc lưu ảnh, sau đó đính kèm lên GitHub.",
|
||||
"Thread depth": "Chiều sâu ren",
|
||||
@@ -772,6 +778,8 @@
|
||||
"at the face": "tại bề mặt",
|
||||
"bom.group_children": "Chi tiết con trong hàng của chi tiết cha",
|
||||
"browser.body_name": "Thân khối{number}",
|
||||
"browser.calibrate_click_a": "Nhấp vào ảnh để chọn điểm A, hoặc nhập tọa độ của điểm đó.",
|
||||
"browser.calibrate_click_b": "Nhấp vào ảnh để chọn điểm B, hoặc nhập tọa độ của điểm đó.",
|
||||
"browser.calibrate_title": "Hiệu chuẩn: {name}",
|
||||
"browser.capture_many": "{count} chi tiết đã được di chuyển nhưng vị trí chưa được ghi lại.",
|
||||
"browser.capture_note": "Ghi vị trí sẽ giữ vị trí mới; Hoàn nguyên sẽ đặt lại như cũ.",
|
||||
@@ -814,6 +822,7 @@
|
||||
"cmd.appearance_pick_up": "Lấy diện mạo",
|
||||
"cmd.appearance_replace": "Thay diện mạo",
|
||||
"cmd.assembly_bom": "Bảng kê vật tư (BOM)",
|
||||
"cmd.body.print_face": "Mặt in",
|
||||
"cmd.body_rename": "Đổi tên thân khối",
|
||||
"cmd.browser_collapse_all": "Thu gọn tất cả",
|
||||
"cmd.browser_expand_all": "Mở rộng tất cả",
|
||||
@@ -821,6 +830,7 @@
|
||||
"cmd.browser_move": "Di chuyển mục trong cây đối tượng",
|
||||
"cmd.browser_order": "Sắp xếp các mục trong cây đối tượng",
|
||||
"cmd.browser_rename_group": "Đổi tên nhóm",
|
||||
"cmd.browser_reparent": "Chuyển sang Cụm chi tiết",
|
||||
"cmd.browser_ungroup": "Hủy nhóm",
|
||||
"cmd.browser_visibility": "Hiển thị/Ẩn",
|
||||
"cmd.canvas_calibrate": "Hiệu chuẩn hình ảnh Canvas",
|
||||
@@ -847,7 +857,9 @@
|
||||
"cmd.component_metadata": "Thuộc tính chi tiết",
|
||||
"cmd.component_metadata_set": "Thay đổi thuộc tính chi tiết",
|
||||
"cmd.component_move_bodies": "Di chuyển các thân khối vào cụm chi tiết",
|
||||
"cmd.component_move_features": "Di chuyển các tính năng vào cụm chi tiết",
|
||||
"cmd.component_move_sketches": "Di chuyển các phác thảo vào cụm chi tiết",
|
||||
"cmd.component_paste_from_design": "Dán từ thiết kế khác",
|
||||
"cmd.component_paste_new": "Dán Tạo mới",
|
||||
"cmd.component_properties": "Thuộc tính cơ lý của cụm chi tiết",
|
||||
"cmd.component_relink": "Liên kết lại nguồn",
|
||||
@@ -984,6 +996,7 @@
|
||||
"cmd.motion_trace": "Quỹ đạo chuyển động",
|
||||
"cmd.motion_trace_edit": "Chỉnh sửa quỹ đạo chuyển động",
|
||||
"cmd.motion_trace_keep": "Giữ lại đường quỹ đạo chuyển động",
|
||||
"cmd.occurrence_align": "Căn chỉnh bản thể",
|
||||
"cmd.occurrence_copy": "Dán (Bản thể)",
|
||||
"cmd.occurrence_drag": "Kéo chi tiết xuất hiện",
|
||||
"cmd.occurrence_ground": "Cố định vị trí đối tượng",
|
||||
@@ -1074,6 +1087,13 @@
|
||||
"cmd.render_start": "Bắt đầu kết xuất hình ảnh",
|
||||
"cmd.render_status": "Tiến độ kết xuất hình ảnh",
|
||||
"cmd.select_clear": "Hủy chọn tất cả",
|
||||
"cmd.settings_profile_apply": "Áp dụng hồ sơ cài đặt",
|
||||
"cmd.settings_profile_delete": "Xóa hồ sơ cài đặt",
|
||||
"cmd.settings_profile_export": "Xuất hồ sơ cài đặt",
|
||||
"cmd.settings_profile_import": "Nhập hồ sơ cài đặt",
|
||||
"cmd.settings_profile_list": "Hồ sơ cài đặt",
|
||||
"cmd.settings_profile_rename": "Đổi tên hồ sơ cài đặt",
|
||||
"cmd.settings_profile_save": "Lưu hồ sơ cài đặt",
|
||||
"cmd.sheet_convert": "Chuyển thành kim loại tấm",
|
||||
"cmd.sheet_export_bend_table": "Xuất bảng thông số chấn uốn (Bend Table)",
|
||||
"cmd.sheet_export_dxf": "Xuất bản trải phẳng dạng DXF",
|
||||
@@ -1087,6 +1107,16 @@
|
||||
"cmd.sheet_refold": "Gập lại tấm kim loại",
|
||||
"cmd.sheet_rules": "Danh sách quy tắc kim loại tấm",
|
||||
"cmd.sheet_unfold": "Trải phẳng tạm thời",
|
||||
"cmd.sketch.construction_line": "Đường thẳng dựng hình",
|
||||
"cmd.sketch.construction_line.angle": "Đường dựng hình theo góc",
|
||||
"cmd.sketch.construction_line.bisector": "Đường phân giác",
|
||||
"cmd.sketch.construction_line.horizontal": "Đường dựng hình nằm ngang",
|
||||
"cmd.sketch.construction_line.parallel": "Đường dựng hình song song",
|
||||
"cmd.sketch.construction_line.perpendicular": "Đường dựng hình vuông góc",
|
||||
"cmd.sketch.construction_line.tangent_at": "Tiếp tuyến tại điểm trên đường cong",
|
||||
"cmd.sketch.construction_line.tangent_external": "Tiếp tuyến qua điểm ngoài",
|
||||
"cmd.sketch.construction_line.tangent_two": "Tiếp tuyến chung",
|
||||
"cmd.sketch.construction_line.vertical": "Đường dựng hình thẳng đứng",
|
||||
"cmd.sketch_arc3d": "Cung tròn 3D",
|
||||
"cmd.sketch_arc_center_point": "Cung tròn xác định bởi tâm và điểm",
|
||||
"cmd.sketch_arc_tangent": "Cung tròn tiếp tuyến",
|
||||
@@ -1119,6 +1149,8 @@
|
||||
"cmd.sketch_drawing_bounds": "Kích thước bản vẽ",
|
||||
"cmd.sketch_edit": "Chỉnh sửa phác thảo",
|
||||
"cmd.sketch_edit_text": "Chỉnh sửa văn bản",
|
||||
"cmd.sketch_equation_curve": "Đường cong phương trình",
|
||||
"cmd.sketch_equation_curve_edit": "Sửa đường cong phương trình",
|
||||
"cmd.sketch_export_dxf": "Lưu dưới dạng DXF",
|
||||
"cmd.sketch_finish_auto_constrain": "Hoàn tất với tự động ràng buộc",
|
||||
"cmd.sketch_fit_curves_to_section": "Khớp đường cong vào mặt cắt lưới",
|
||||
@@ -1215,6 +1247,7 @@
|
||||
"cmd.view.render_browser": "Trình duyệt kết xuất",
|
||||
"cmd.view.render_dock": "Di chuyển neo kết xuất",
|
||||
"cmd.view.render_focus": "Chế độ xem tập trung kết xuất",
|
||||
"cmd.view.status_items": "Các mục trạng thái khung nhìn",
|
||||
"cmd.view_ambient_occlusion": "Đổ bóng che khuất môi trường (AO)",
|
||||
"cmd.view_angle_readout": "Góc hướng nhìn",
|
||||
"cmd.view_apply": "Áp dụng góc nhìn đã lưu",
|
||||
@@ -1369,8 +1402,21 @@
|
||||
"help.material.assign": "Đặt vật liệu cho các khối đã chọn, chẳng hạn thép, nhôm hoặc ABS. Dùng để khối lượng và trọng lượng khớp với chi tiết thật.",
|
||||
"help.mit": "Giấy phép MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.occurrence.move": "Chỉ di chuyển chi tiết lắp ráp theo các bậc tự do mà khớp nối cho phép. Chọn một mặt của chi tiết, rồi kéo mũi tên hoặc cung tròn có thể sử dụng.",
|
||||
"help.parameters.change": "Mở bảng các giá trị có tên và biểu thức điều khiển kích thước của thiết kế. Dùng để sửa một kích thước ở một chỗ và mọi tính năng dùng nó sẽ cập nhật theo.",
|
||||
"help.pointcloud.insert": "Chèn bản quét PLY, XYZ hoặc PTS dưới dạng đám mây điểm bên cạnh mô hình. Dùng làm tham chiếu khi dựng mô hình từ dữ liệu đo.",
|
||||
"help.sketch.construction_line": "Tạo đường thẳng dựng hình vô hạn qua hai điểm để bố trí phác thảo mà không chia tách biên dạng.",
|
||||
"help.sketch.construction_line.angle": "Tạo đường dựng hình vô hạn theo góc so với trục X của phác thảo. Chọn điểm rồi nhập góc hoặc chọn hướng.",
|
||||
"help.sketch.construction_line.bisector": "Chọn hai đường thẳng giao nhau trong phác thảo rồi chọn một trong hai đường phân giác. Kết quả thay đổi theo các đường gốc.",
|
||||
"help.sketch.construction_line.horizontal": "Tạo đường dựng hình nằm ngang vô hạn qua một điểm. Ràng buộc ngang được giữ khi chỉnh sửa sau này.",
|
||||
"help.sketch.construction_line.parallel": "Chọn đường thẳng trong phác thảo rồi đặt đường dựng hình vô hạn song song. Nhấp chuột phải để đổi tham chiếu.",
|
||||
"help.sketch.construction_line.perpendicular": "Chọn đường thẳng trong phác thảo rồi đặt đường dựng hình vô hạn vuông góc. Nhấp chuột phải để đổi tham chiếu.",
|
||||
"help.sketch.construction_line.tangent_at": "Tạo tiếp tuyến tại một điểm trên đường tròn hoặc cung tròn, hoặc tại đầu mút của spline hay đường conic hở. Chọn đường cong rồi chọn tiếp điểm.",
|
||||
"help.sketch.construction_line.tangent_external": "Chọn đường tròn hoặc cung tròn, một điểm ngoài rồi chọn nghiệm tiếp tuyến. Bản xem trước chỉ hiển thị tiếp điểm trên cung đã vẽ.",
|
||||
"help.sketch.construction_line.tangent_two": "Chọn hai đường tròn hoặc cung tròn rồi chọn tiếp tuyến chung trong bản xem trước. Tiếp điểm phải nằm trên các đường cong đã vẽ.",
|
||||
"help.sketch.construction_line.vertical": "Tạo đường dựng hình thẳng đứng vô hạn qua một điểm. Ràng buộc đứng được giữ khi chỉnh sửa sau này.",
|
||||
"help.sketch.equation_curve": "Vẽ một đường cong từ công thức trên một khoảng: x(t) và y(t), hoặc y = f(x). Công thức có thể dùng tham số và đường cong thay đổi theo: dùng cho sóng sin, đường xoắn ốc hay đường thân khai của răng bánh răng.",
|
||||
"help.sketch.inspect": "Mở báo cáo về bản phác thảo đang mở: còn bao nhiêu bậc tự do và đã ràng buộc hoàn toàn chưa. Dùng nó để biết phần nào vẫn còn di chuyển được trước khi hoàn tất bản phác thảo.",
|
||||
"help.solid.align": "Di chuyển các khối đã chọn để một điểm, mặt hoặc mặt phẳng trên chúng gặp một điểm, mặt hoặc mặt phẳng ở nơi khác. Dùng để đặt chi tiết áp vào chi tiết khác mà không cần đo khoảng cách.",
|
||||
"help.solid.chamfer": "Vát các cạnh đã chọn theo khoảng cách bạn thiết lập. Dùng để triệt tiêu cạnh sắc hoặc giúp lắp chốt, bu lông dễ dàng hơn.",
|
||||
"help.solid.combine": "Hợp nhất các khối, cắt trừ khỏi khối đích, hoặc chỉ giữ lại phần thể tích giao nhau, đồng thời có thể giữ lại các khối công cụ. Dùng để gộp chi tiết, dùng hình này cắt hình kia hoặc tìm vị trí hai khối giao nhau.",
|
||||
@@ -1499,6 +1545,21 @@
|
||||
"joint.one_component": "Các chi tiết này thuộc cùng một cụm chi tiết: {bodies}. Khớp nối điều khiển một cụm chi tiết so với cụm chi tiết khác, vì vậy mỗi chi tiết cần một cụm chi tiết riêng.",
|
||||
"joint.rigid_group_one_component": "Tất cả {count} thân khối này đều nằm trong cùng một cụm chi tiết (hoặc trong chính thiết kế): hãy dùng lệnh {command} trước.",
|
||||
"joint.rigid_group_select_components": "Chọn từ hai cụm chi tiết trở lên.",
|
||||
"joint_move.blocked_hint": "Kiểm tra loại khớp nối (chẳng hạn khớp nối cố định), trạng thái cố định của chi tiết, giới hạn khớp nối và các giá trị do tham số điều khiển.",
|
||||
"joint_move.blocked_title": "Không thể di chuyển chi tiết này",
|
||||
"joint_move.coarse": "Bước xoay khi ở gần trục (°)",
|
||||
"joint_move.distance": "Quãng đường từ vị trí bắt đầu",
|
||||
"joint_move.done": "Xong",
|
||||
"joint_move.fine": "Bước xoay khi ở xa trục (°)",
|
||||
"joint_move.fixed": "Chi tiết này không có trục khớp nối nào có thể di chuyển.",
|
||||
"joint_move.help": "Di chuyển — kéo mũi tên hoặc cung tròn. Nhấn Esc để hủy thao tác kéo hiện tại.",
|
||||
"joint_move.legacy_hint": "Tắt để sử dụng bảng Di chuyển trước đây.",
|
||||
"joint_move.precision": "Kéo ra ngoài đường dẫn nét đứt để tinh chỉnh góc xoay.",
|
||||
"joint_move.rotation": "Góc xoay từ vị trí bắt đầu",
|
||||
"joint_move.select": "Chọn một mặt hoặc một chi tiết trong cụm lắp ráp, rồi chọn Di chuyển.",
|
||||
"joint_move.settings": "Di chuyển trong cụm lắp ráp",
|
||||
"joint_move.step": "Bước",
|
||||
"joint_move.use_handles": "Dùng tay nắm chuyển động khớp nối khi di chuyển trong cụm lắp ráp",
|
||||
"keymap.command_id": "Mã lệnh",
|
||||
"keymap.empty": "Không có lệnh phù hợp",
|
||||
"keymap.use_anyway": "Vẫn dùng {key} tại đây",
|
||||
@@ -1558,6 +1619,10 @@
|
||||
"material.selection.mixed": "Các vật liệu khác nhau",
|
||||
"measure.at": "Tại",
|
||||
"measure.item": "Mục {number}",
|
||||
"measure.quick_copied": "Đã sao chép số đo",
|
||||
"measure.quick_copy": "Nhấp để sao chép số đo",
|
||||
"measure.quick_edges": "{count} cạnh",
|
||||
"measure.quick_faces": "{count} mặt",
|
||||
"messages.ago_h": "{n} giờ trước",
|
||||
"messages.ago_min": "{n} phút trước",
|
||||
"messages.ago_s": "{n} giây trước",
|
||||
@@ -1593,6 +1658,8 @@
|
||||
"nav.maya.help": "Alt+kéo chuột trái để xoay, Alt+chuột giữa để trượt, Alt+chuột phải để thu phóng; kéo chuột giữa cũng trượt",
|
||||
"nav.openscad.help": "Kéo chuột trái trên vùng trống để xoay, Shift + chuột trái để quét chọn vùng, kéo hình học phác thảo để chỉnh sửa; kéo chuột phải hoặc chuột giữa để trượt, Shift + kéo chuột phải hoặc chuột giữa để thu phóng",
|
||||
"nav.perspective.sketch": "Chế độ chỉnh sửa phác thảo sử dụng góc nhìn trực giao. Hãy hoàn tất phác thảo để chuyển sang góc nhìn phối cảnh.",
|
||||
"nav.right_drag_orbits.help": "Tắt: kéo chuột phải không di chuyển camera, và nút phải chỉ mở menu ngữ cảnh. Chọn kiểu chuột SolidWorks sẽ tắt tùy chọn này.",
|
||||
"nav.right_drag_orbits.label": "Kéo chuột phải để xoay",
|
||||
"nav.solidworks.help": "Kéo chuột giữa để xoay, Ctrl + chuột giữa để trượt, Shift + chuột giữa để thu phóng, kéo chuột phải để xoay",
|
||||
"nav.tinkercad.help": "Kéo chuột phải để xoay, kéo chuột giữa hoặc Shift + kéo chuột phải để trượt",
|
||||
"nav.touchpad.help": "Giữ Shift và di chuyển con trỏ để dời góc nhìn; giữ Alt/Option và di chuyển để xoay quanh tâm. Không cần nhấn nút chuột. Cuộn dọc để thu phóng.",
|
||||
@@ -1614,6 +1681,9 @@
|
||||
"navbar.custom.customise": "Tùy chỉnh thanh điều hướng…",
|
||||
"navbar.custom.design": "Thiết kế",
|
||||
"navbar.custom.duplicate": "Ô này đã có trên thanh.",
|
||||
"navbar.custom.edge": "Cạnh",
|
||||
"navbar.custom.edge_bottom": "Dưới",
|
||||
"navbar.custom.edge_top": "Trên",
|
||||
"navbar.custom.fade": "Mờ dần",
|
||||
"navbar.custom.full": "Hãy xóa một ô để thêm ô khác.",
|
||||
"navbar.custom.hidden_design": "Ẩn trong Thiết kế",
|
||||
@@ -1705,6 +1775,11 @@
|
||||
"not a move": "không phải một phép di chuyển",
|
||||
"not a number": "không phải là số",
|
||||
"open a sketch first": "hãy mở một phác thảo trước",
|
||||
"parameters.apply_live": "Áp dụng mỗi thay đổi khi rời khỏi ô của nó",
|
||||
"parameters.apply_live_tip": "Tắt: các thay đổi chờ đến khi nhấn Áp dụng hoặc OK, rồi thiết kế được dựng lại một lần cho tất cả. Hủy hoặc Escape sẽ bỏ chúng.",
|
||||
"parameters.held": "{count} thay đổi đang chờ Áp dụng",
|
||||
"parameters.held_hint": "Sửa biểu thức và đơn vị. Thay đổi chờ đến khi nhấn Áp dụng hoặc OK.",
|
||||
"parameters.held_one": "1 thay đổi đang chờ Áp dụng",
|
||||
"parts.automatic_name": "tự động",
|
||||
"parts.dimension.across_flats": "Cỡ cờ lê",
|
||||
"parts.dimension.bore": "Đường kính lỗ",
|
||||
@@ -1720,12 +1795,15 @@
|
||||
"parts.dimension.thickness": "Độ dày",
|
||||
"parts.dimension.width": "Bề rộng",
|
||||
"parts.family.bearing": "Ổ bi cầu rãnh sâu (bao ngoài)",
|
||||
"parts.family.button_head_cap_screw": "Vít đầu tròn lục giác chìm",
|
||||
"parts.family.dowel_pin": "Chốt trụ",
|
||||
"parts.family.hex_bolt": "Bu lông đầu lục giác",
|
||||
"parts.family.hex_nut": "Đai ốc lục giác",
|
||||
"parts.family.set_screw": "Vít trí lục giác chìm, đầu bằng",
|
||||
"parts.family.socket_head_cap_screw": "Bu lông lục giác chìm đầu trụ",
|
||||
"parts.family.washer": "Vòng đệm phẳng",
|
||||
"parts.holes": "Lỗ (tùy chọn)",
|
||||
"parts.placement_hint": "chọn một hoặc nhiều lỗ để lắp một chi tiết vào mỗi lỗ, hoặc nhấn OK để đặt tại gốc tọa độ",
|
||||
"pattern.alignment_2": "Căn chỉnh 2",
|
||||
"pattern.alignment_hint": "Số lượng bao gồm cả bản gốc. Căn giữa sẽ cân bằng các bản sao; Đổi hướng sẽ chọn phía bổ sung cho tổng số chẵn.",
|
||||
"pattern.direction_1": "Hướng 1",
|
||||
@@ -1778,6 +1856,11 @@
|
||||
"prefs.bottom_centre": "Giữa phía dưới",
|
||||
"prefs.bottom_right": "Góc dưới bên phải",
|
||||
"prefs.browser": "Cây thư mục",
|
||||
"prefs.browser_eye_left": "Biểu tượng mắt cạnh mũi tên thu gọn",
|
||||
"prefs.browser_eye_left_note": "Các hàng trong cây thư mục hiển thị biểu tượng mắt bật/tắt cạnh mũi tên thu gọn như trước đây, thay vì trong một cột ở đầu bên phải của các hàng.",
|
||||
"prefs.browser_reveal_on_hover": "Hiện khi di chuột",
|
||||
"prefs.browser_show_note": "Hiển thị giữ trình duyệt trên màn hình. Hiện khi di chuột ẩn nó cho đến khi con trỏ đến vị trí của nó hoặc thẻ mảnh ở cạnh trái, và nó vẫn mở khi con trỏ ở bên trong hoặc một menu của nó đang mở.",
|
||||
"prefs.browser_shown": "Hiển thị",
|
||||
"prefs.built_in": "Mặc định tích hợp",
|
||||
"prefs.button_left": "Kéo chuột trái",
|
||||
"prefs.button_middle": "Kéo chuột giữa",
|
||||
@@ -1825,6 +1908,8 @@
|
||||
"prefs.graphics_card_restart": "Có hiệu lực sau khi khởi động lại SolidCraft. Biến môi trường WGPU_ADAPTER_NAME sẽ ghi đè lựa chọn này.",
|
||||
"prefs.graphics_note": "Cân đối giữa tốc độ và độ mượt mà. Mỗi tùy chọn đều hiển thị hiệu ứng trực quan trên mẫu thử.",
|
||||
"prefs.graphics_presets_note": "Các cấu hình định sẵn sẽ thiết lập đồng thời các tùy chọn bên dưới.",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out": "Ẩn biểu tượng ràng buộc khi thu nhỏ",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out_note": "Biểu tượng ràng buộc biến mất khi bản phác được thu nhỏ đủ xa để không làm rối khung nhìn. Tắt: chúng giữ kích thước màn hình cố định ở mọi mức thu phóng.",
|
||||
"prefs.history": "Lịch sử",
|
||||
"prefs.history_origin_bodies": "Hiển thị gốc tọa độ và thân khối ở trên cùng",
|
||||
"prefs.history_origin_bodies_note": "Cây Lịch sử ở bên trái hoặc dưới cây thư mục sẽ bắt đầu với thư mục Thân khối và Gốc tọa độ của cụm chi tiết đang kích hoạt, cùng biểu tượng mắt bật/tắt và trình đơn tương tự như trong cây thư mục. Dòng Lịch sử ở cạnh dưới không thay đổi.",
|
||||
@@ -1848,6 +1933,8 @@
|
||||
"prefs.layout_note": "Chế độ Gọn (Compact) gắn các bảng vào mép cửa sổ. Độ trong suốt của Cây thư mục chỉ khả dụng ở chế độ Nổi (Floating). Thay đổi vị trí của Trợ lý trong trang Trợ lý.",
|
||||
"prefs.left": "Bên trái",
|
||||
"prefs.left_click": "Nhấp chuột trái",
|
||||
"prefs.line_drag_draws_one": "Nhấn và kéo vẽ một đường",
|
||||
"prefs.line_drag_draws_one_note": "Trong công cụ Đường, nhấn, kéo rồi thả sẽ vẽ một đường từ điểm nhấn đến điểm thả, và kết thúc ở đó. Nhấp vẫn vẽ một chuỗi. Tắt: kéo đặt một điểm tại nơi thả, như một lần nhấp.",
|
||||
"prefs.linked_designs": "Thiết kế liên kết",
|
||||
"prefs.live_input": "Nhập liệu trực tiếp",
|
||||
"prefs.live_preview": "Xem trước trực tiếp",
|
||||
@@ -1861,6 +1948,9 @@
|
||||
"prefs.max_file_size_step": "Tệp STEP và tệp nhập",
|
||||
"prefs.max_file_size_web": "Ứng dụng web mở tệp STEP và tệp nhập tối đa 512 MB, thiết kế tối đa 256 MB: thẻ trình duyệt không chứa được tệp lớn hơn. Ứng dụng máy tính cho phép tăng các giới hạn này.",
|
||||
"prefs.megabytes": "MB",
|
||||
"prefs.menu_grid": "Biểu tượng lớn",
|
||||
"prefs.menu_list": "Danh sách",
|
||||
"prefs.menus": "Menu",
|
||||
"prefs.minutes": "phút",
|
||||
"prefs.minutes_suffix": " phút",
|
||||
"prefs.mouse": "Chuột và bàn di cảm ứng",
|
||||
@@ -1880,14 +1970,44 @@
|
||||
"prefs.origin_plane_names": "Tên các mặt phẳng gốc",
|
||||
"prefs.origin_plane_names_note": "Tên hiển thị trong trình duyệt, hộp thoại và danh sách. {top} là XY, {front} là XZ và {right} là YZ, với Z hướng lên. Lệnh, script và thiết kế đã lưu vẫn dùng XY, XZ và YZ.",
|
||||
"prefs.overall_speed": "Tốc độ tổng thể",
|
||||
"prefs.parameter_list_rows": "Số dòng danh sách tham số",
|
||||
"prefs.parameter_list_rows_tip": "Phím mũi tên xuống trong ô giá trị trống liệt kê các tham số, mục yêu thích trước, tối đa số này. Ít hơn giúp danh sách nhẹ trong thiết kế lớn.",
|
||||
"prefs.persistent_ribbon_pressed": "Tô sáng lệnh đang bật trên dải băng",
|
||||
"prefs.persistent_ribbon_pressed_help": "Tô sáng các lệnh trên dải băng khi hiệu ứng của chúng đang bật. Tắt tùy chọn này để giữ giao diện trung tính và trợ giúp lệnh như trước.",
|
||||
"prefs.perspective_fov": "Trường nhìn",
|
||||
"prefs.placement": "Vị trí đặt",
|
||||
"prefs.prefer_free_sketch_points": "Ưu tiên điểm phác thảo có thể di chuyển khi các điểm chồng lên nhau",
|
||||
"prefs.preview_choices": "Xem trước các lựa chọn của bạn",
|
||||
"prefs.print_face_highlight": "Tô sáng mặt in",
|
||||
"prefs.print_face_highlight_tip": "Mức tô màu và viền mặt in của thân trong khung nhìn. 0 % không tô sáng.",
|
||||
"prefs.profile_active": "Hồ sơ đang dùng",
|
||||
"prefs.profile_applied": "Đã áp dụng hồ sơ.",
|
||||
"prefs.profile_changed": "Cài đặt đã thay đổi kể từ khi lưu hồ sơ. “Lưu” sẽ ghi chúng vào hồ sơ.",
|
||||
"prefs.profile_deleted": "Đã xóa hồ sơ.",
|
||||
"prefs.profile_export": "Xuất tệp…",
|
||||
"prefs.profile_exported": "Đã xuất hồ sơ.",
|
||||
"prefs.profile_imported": "Đã nhập hồ sơ. Chọn hồ sơ trong “Hồ sơ đang dùng” để chuyển sang.",
|
||||
"prefs.profile_name_hint": "Tên hồ sơ, ví dụ Laptop",
|
||||
"prefs.profile_rename": "Đổi tên",
|
||||
"prefs.profile_renamed": "Đã đổi tên hồ sơ.",
|
||||
"prefs.profile_save": "Lưu",
|
||||
"prefs.profile_saved": "Đã lưu cài đặt hiện tại vào hồ sơ.",
|
||||
"prefs.profile_skipped": "Đã áp dụng hồ sơ; {n} cài đặt giữ nguyên giá trị hiện tại (xem nhật ký).",
|
||||
"prefs.profiles": "Hồ sơ cài đặt",
|
||||
"prefs.profiles_note": "Phím tắt, thanh công cụ, điều hướng, menu dạng vòng và cài đặt giao diện, được lưu cùng nhau dưới một tên và chuyển đổi cùng lúc.",
|
||||
"prefs.project_options_dialog": "Hộp thoại tùy chọn Project",
|
||||
"prefs.project_options_dialog_note": "Bật: chọn Hình học hoặc Thân và Liên kết chiếu trước khi chiếu. Tắt: giữ quy trình chọn trực tiếp trước đây.",
|
||||
"prefs.quality_default": "mặc định",
|
||||
"prefs.quality_fastest": "nhanh nhất",
|
||||
"prefs.quality_slowest": "chậm nhất (chất lượng cao nhất)",
|
||||
"prefs.quality_smoother": "mượt mà hơn",
|
||||
"prefs.quick_measure": "Đo nhanh ở góc khung nhìn",
|
||||
"prefs.quick_measure_note": "Hiển thị kích thước của đối tượng được chọn ở góc dưới bên phải khung nhìn, phía trên Lịch sử: chiều dài của cạnh (hoặc Ø và R với cạnh tròn), diện tích của mặt, vị trí của điểm, khoảng cách và góc giữa hai đối tượng, tổng của nhiều cạnh hoặc mặt. Nhấp để sao chép.",
|
||||
"prefs.render_previous_geometry_budget": "Dùng ngân sách hình học trước đây cho bản xem trước kết xuất",
|
||||
"prefs.render_previous_geometry_budget_help": "Khôi phục giới hạn hình học cố định trước đây (512 MiB trên máy tính 64 bit, 128 MiB trên các nền tảng khác) thay cho ngân sách dựa trên thiết bị.",
|
||||
"prefs.reports_saved": "Đã lưu {n}",
|
||||
"prefs.ribbon_reveal": "Hiện kết quả tìm kiếm trên ribbon",
|
||||
"prefs.ribbon_reveal_note": "Khi rê chuột lên một kết quả trong Tìm lệnh, ribbon cho biết lệnh nằm ở đâu: tab, nút hoặc dòng của nó trong menu thả xuống của một bảng. Lệnh bắt đầu từ tìm kiếm sẽ nhấp nháy ở đó, và lệnh đang chạy từ menu thả xuống sẽ đánh dấu bảng của nó.",
|
||||
"prefs.right_click": "Nhấp chuột phải",
|
||||
"prefs.saving": "Tự động lưu và khôi phục",
|
||||
"prefs.scale_note": "Cũng có thể dùng Ctrl + / Ctrl − trong cửa sổ. Các nút có kích thước 28 px ở mức 100%.",
|
||||
@@ -1896,18 +2016,29 @@
|
||||
"prefs.search_empty": "Không có cài đặt nào khớp",
|
||||
"prefs.select": "Chọn",
|
||||
"prefs.select_one_item": "Chọn một mục",
|
||||
"prefs.select_other_hidden": "Chọn hình học ẩn bằng Chọn đối tượng khác",
|
||||
"prefs.select_other_hidden_help": "Bật: bao gồm các khối, bản phác thảo ẩn và cạnh bị che gần con trỏ. Tắt: dùng danh sách ban đầu chỉ gồm hình học đang hiển thị ngay dưới con trỏ.",
|
||||
"prefs.selecting": "Đang chọn",
|
||||
"prefs.shift": "Shift",
|
||||
"prefs.shift_add_ctrl_toggle": "Shift chỉ thêm; Ctrl / Cmd đảo trạng thái chọn",
|
||||
"prefs.shift_add_note": "Bật: Shift để thêm vào vùng chọn, Ctrl / Cmd để đảo chọn. Tắt (mặc định): cả hai đều đảo trạng thái chọn.",
|
||||
"prefs.shortcuts": "Phím tắt",
|
||||
"prefs.single_surface_analysis": "Chỉ dùng một phân tích bề mặt",
|
||||
"prefs.single_surface_analysis_help": "Khi tắt, phân tích tô bóng bề mặt và phân tích tính liên tục có thể cùng hoạt động. Khi bật, chỉ giữ phân tích được bắt đầu hoặc thay đổi gần nhất.",
|
||||
"prefs.sketch_align_points": "Căn theo các điểm phác thảo khác khi vẽ",
|
||||
"prefs.sketch_align_points_note": "Khi vẽ, một điểm được căn ngang theo một điểm phác thảo và căn dọc theo điểm khác cùng lúc, kèm đường dẫn chấm; cú nhấp giữ cả hai ràng buộc căn. Tắt: chỉ căn theo điểm trước, mỗi lần một trục.",
|
||||
"prefs.sketch_conflict_colour": "Hình học xung đột theo màu xung đột",
|
||||
"prefs.sketch_conflict_colour_note": "Khi các ràng buộc của bản phác xung đột, các đường cong và điểm mà một ràng buộc lỗi giữ cũng được vẽ bằng màu xung đột, không chỉ ký hiệu hay kích thước của nó. Tắt: chúng giữ màu thường.",
|
||||
"prefs.sketch_construction_lines": "Công cụ đường dựng hình mở rộng",
|
||||
"prefs.sketch_exit_view": "Khi kết thúc phác thảo",
|
||||
"prefs.sketch_exit_view.keep": "Giữ góc nhìn hiện tại",
|
||||
"prefs.sketch_exit_view.previous": "Trở về góc nhìn trước đó",
|
||||
"prefs.sketch_exit_view.unless_rotated": "Trở về góc nhìn trước trừ khi đã xoay",
|
||||
"prefs.sketch_exit_view_note": "Góc nhìn sẽ chuyển đến đâu sau khi bấm Hoàn tất phác thảo, Hủy bỏ hoặc bấm phím Esc hai lần.",
|
||||
"prefs.sketch_open_look_at": "Xoay góc nhìn trực diện phác thảo khi mở",
|
||||
"prefs.sketch_open_look_at_note": "Tắt: tạo hoặc chỉnh sửa phác thảo sẽ giữ nguyên góc nhìn. Dùng Nhìn trực diện để nhìn thẳng vào phác thảo khi cần.",
|
||||
"prefs.sketch_recent_snap": "Tự động bắt điểm vào tâm và trung điểm gần đây",
|
||||
"prefs.sketch_recent_snap_note": "Khi vẽ, con trỏ được bắt vào nơi các đường dẫn của hai tâm đường tròn hoặc trung điểm cạnh thẳng gần nhất cắt nhau. Tắt: các đường dẫn chỉ để xem và con trỏ không di chuyển.",
|
||||
"prefs.sketch_selection": "Phác thảo & chọn đối tượng",
|
||||
"prefs.sketch_selection_heading": "Phác thảo và lựa chọn",
|
||||
"prefs.sketch_selection_note": "Cách phác thảo bắt dính và cách nhấp chuột chọn đối tượng.",
|
||||
@@ -1952,23 +2083,47 @@
|
||||
"prefs.toast_place": "Thông báo",
|
||||
"prefs.toggle_item": "Thêm mục, hoặc bỏ chọn lại",
|
||||
"prefs.toolbar": "Thanh công cụ",
|
||||
"prefs.toolbar_tabs": "Thẻ thanh công cụ",
|
||||
"prefs.top": "Trên cùng",
|
||||
"prefs.trackpad_zoom_modifier": "Thu phóng bằng cuộn hai ngón tay khi giữ",
|
||||
"prefs.trackpad_zoom_modifier.alt": "⌥ / Alt",
|
||||
"prefs.trackpad_zoom_modifier.cmd": "⌘",
|
||||
"prefs.trackpad_zoom_modifier.ctrl": "Ctrl",
|
||||
"prefs.trackpad_zoom_modifier.help": "Chỉ giữ phím này để thu phóng tại con trỏ bằng cuộn dọc. Tắt giữ nguyên hành vi cuộn hiện tại.",
|
||||
"prefs.trackpad_zoom_modifier.off": "Tắt",
|
||||
"prefs.translucent": "Bán trong suốt",
|
||||
"prefs.under_browser": "Dưới cây thư mục",
|
||||
"prefs.under_cursor": "Dưới con trỏ chuột",
|
||||
"prefs.units_precision": "Đơn vị và độ chính xác",
|
||||
"prefs.updates": "Cập nhật ứng dụng",
|
||||
"prefs.value_boxes_in_view": "Hiện giá trị cạnh tay nắm trong khung nhìn",
|
||||
"prefs.value_boxes_in_view_tip": "Giá trị của lệnh (Khoảng cách, Bán kính…) trong một ô cạnh tay nắm, phía trên mô hình. Tắt: bạn nhập giá trị trong cửa sổ lệnh, cửa sổ này nhận bàn phím sau khi chọn, và không có gì che mô hình.",
|
||||
"prefs.view": "Hành vi góc nhìn",
|
||||
"prefs.view_confirm_corner": "Nút Đồng ý và Hủy bỏ ở góc khung nhìn",
|
||||
"prefs.view_confirm_corner_note": "Khi hộp thoại hoặc môi trường phác thảo đang mở, dấu tích và dấu chéo ở góc trên bên phải khung nhìn có chức năng tương tự nút Đồng ý và Hủy bỏ của hộp thoại, hoặc để hoàn tất và hủy phác thảo. Khối điều hướng góc nhìn sẽ dời xuống bên dưới chúng.",
|
||||
"prefs.viewport": "Khung nhìn 3D",
|
||||
"prefs.viewport_analysis_status": "Hiện trạng thái phân tích trong khung nhìn",
|
||||
"prefs.viewport_analysis_status_help": "Hiện các phân tích đang bật phía trên khung nhìn và mở chú giải từ từng mục. Esc tắt phân tích mới nhất. Tắt tùy chọn để khôi phục chú giải ở góc và hành vi Esc trước đây.",
|
||||
"prefs.viewport_background": "Nền",
|
||||
"prefs.viewport_background_colour": "Màu",
|
||||
"prefs.viewport_background_theme": "Dải màu của chủ đề",
|
||||
"prefs.viewport_section_status": "Hiện trạng thái mặt cắt trong khung nhìn",
|
||||
"prefs.viewport_section_status_help": "Hiện thiết lập mặt cắt trong khung nhìn. Escape và nút dải công cụ đang bật sẽ tắt mặt cắt. Tắt tùy chọn để giữ cách điều khiển mặt cắt trước đây.",
|
||||
"prefs.viewport_status_summary": "Tóm tắt các mục trạng thái khung nhìn",
|
||||
"prefs.viewport_status_summary_help": "Gộp từ ba mục trạng thái khung nhìn trở lên thành một huy hiệu tóm tắt. Tắt để giữ mọi mục trong hàng đầy đủ.",
|
||||
"prefs.wheel": "Con lăn chuột",
|
||||
"prefs.wheel_trackpad": "Con lăn chuột và bàn di cảm ứng",
|
||||
"prefs.workspace": "Không gian làm việc",
|
||||
"prefs.zoom_stop_at_model": "Dừng thu phóng tại mô hình",
|
||||
"prefs.zoom_stop_at_model_tip": "Chuột 3D và ứng dụng thiết bị thu phóng về phía bề mặt ở giữa khung nhìn; thu phóng bằng cách kéo giữ nguyên điểm bắt đầu kéo. Khi tắt, có thể thu phóng xuyên qua mô hình. Con lăn và cử chỉ chụm dùng riêng tùy chọn Thu phóng về con trỏ",
|
||||
"prefs.zoom_toward_cursor": "Thu phóng về phía con trỏ chuột",
|
||||
"properties.title": "Thuộc tính: {name}",
|
||||
"recovery.days_ago": "{count} ngày trước",
|
||||
"recovery.detail": "{file} · {features} tính năng · tự động lưu {when}",
|
||||
"recovery.discard_all": "Hủy bỏ tất cả",
|
||||
"recovery.discard_all_detail": "Không thể hoàn tác thao tác này.",
|
||||
"recovery.discard_all_title": "Hủy bỏ {count} bản tự động lưu?",
|
||||
"recovery.discard_all_title_one": "Hủy bỏ 1 bản tự động lưu?",
|
||||
"recovery.hours_ago": "{count} giờ trước",
|
||||
"recovery.just_now": "vừa xong",
|
||||
"recovery.min_ago": "{count} phút trước",
|
||||
@@ -2834,7 +2989,9 @@
|
||||
"render.output_ready": "Sẵn sàng kết xuất",
|
||||
"render.output_run_check": "Chạy kiểm tra",
|
||||
"render.output_size_limit": "{method}: tối đa {dimension} px mỗi cạnh và {pixels} điểm ảnh. Kích thước lớn nhất vừa khít: {width} × {height}.",
|
||||
"render.output_size_method_profile": "Để kết xuất {width} × {height}, hãy chọn {method} với cấu hình tài nguyên CPU {profile} hoặc một kích thước nhỏ hơn.",
|
||||
"render.output_size_ok": "Kích thước ổn · {width} × {height} px",
|
||||
"render.output_size_profile": "Để kết xuất {width} × {height}, hãy chọn cấu hình tài nguyên CPU {profile} hoặc một kích thước nhỏ hơn.",
|
||||
"render.output_swap_orientation": "Hoán đổi chiều rộng và chiều cao",
|
||||
"render.output_tools_inspector": "Chỉnh kích thước và định dạng trong bảng thuộc tính Đầu ra.",
|
||||
"render.output_view_image": "Xem ảnh",
|
||||
@@ -3047,6 +3204,7 @@
|
||||
"render.size_custom": "Tùy chỉnh…",
|
||||
"render.size_full_hd": "Full HD",
|
||||
"render.size_hd": "HD",
|
||||
"render.size_needs_profile": "{size} · cần {profile}",
|
||||
"render.size_presets": "Cỡ đặt sẵn",
|
||||
"render.size_presets_pending": "Sẽ có cùng trình chỉnh Đầu ra",
|
||||
"render.size_preview": "Xem trước",
|
||||
@@ -3296,6 +3454,7 @@
|
||||
"select an axis": "chọn một trục",
|
||||
"select an axis, a straight or circular edge, or a cylinder, cone or torus face first": "hãy chọn một trục, một cạnh thẳng hoặc cạnh tròn, hoặc một mặt trụ, mặt nón hay mặt xuyến trước",
|
||||
"select bodies first": "hãy chọn các thân trước",
|
||||
"select components first": "hãy chọn các thành phần trước",
|
||||
"select corner points, or the two lines of one corner": "chọn các điểm góc, hoặc hai đường thẳng của một góc",
|
||||
"select one corner point, or the two lines of one corner": "chọn một điểm góc, hoặc hai đường thẳng của một góc",
|
||||
"select sheet edges first": "hãy chọn các cạnh của tấm trước",
|
||||
@@ -3314,6 +3473,7 @@
|
||||
"settings.double_click_components": "Nhấp đúp vào một thành phần để kích hoạt nó, hoặc chỉnh sửa tại chỗ một thành phần liên kết",
|
||||
"settings.frame_rate_details_note": "Bổ sung biểu đồ thời gian các khung hình gần nhất xếp chồng số tam giác đã vẽ, biểu đồ phân bố thời gian khung hình và nội dung GPU đã vẽ. Bấm vào tốc độ khung hình trên khung nhìn để ẩn/hiện.",
|
||||
"settings.frame_rate_note": "Hiển thị số khung hình trên giây (FPS) ở góc dưới bên phải khung nhìn.",
|
||||
"settings.insert_lists_open_designs": "Chèn thiết kế vào cụm liệt kê trước các thiết kế đang mở ở các thẻ khác",
|
||||
"settings.measure_axis_distances": "Hiển thị khoảng cách theo trục X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Hiển thị kích thước thành phần theo các trục tọa độ cùng với khoảng cách tổng thể khi mở công cụ Đo lường.",
|
||||
"settings.msaa_applies_on_restart": "Khử răng cưa sẽ áp dụng vào lần khởi động tiếp theo của SolidCraft",
|
||||
@@ -3332,12 +3492,34 @@
|
||||
"sheet.flange_type_contour": "Đường viền",
|
||||
"sheet.flange_type_edge": "Cạnh",
|
||||
"sheet.no_body": "chưa có khối tấm kim loại: hãy bắt đầu bằng Cánh gập > Cơ sở (Base), hoặc chuyển một tấm phẳng thành tấm kim loại bằng lệnh 'Chuyển thành tấm kim loại' (chọn mặt phẳng lớn của nó)",
|
||||
"sheet.personal_rules.confirm_delete": "Xác nhận xóa",
|
||||
"sheet.personal_rules.delete": "Xóa",
|
||||
"sheet.personal_rules.delete_prompt": "Xóa quy tắc cá nhân này? Các quy tắc đã có trong thiết kế sẽ không thay đổi.",
|
||||
"sheet.personal_rules.full": "Thư viện cá nhân đã chứa tối đa 64 quy tắc.",
|
||||
"sheet.personal_rules.invalid_name": "Nhập một tên ngắn gọn, không chứa ký tự xuống dòng hoặc ký tự điều khiển.",
|
||||
"sheet.personal_rules.invalid_values": "Hãy điền đủ các giá trị của quy tắc: mỗi giá trị phải tính được trong thiết kế này, với độ dày dương và hệ số K từ 0 đến 1.",
|
||||
"sheet.personal_rules.missing": "Quy tắc cá nhân đã chọn không còn khả dụng.",
|
||||
"sheet.personal_rules.name": "Tên quy tắc",
|
||||
"sheet.personal_rules.name_exists": "Quy tắc cá nhân với tên này đã tồn tại. Vui lòng sử dụng tên khác.",
|
||||
"sheet.personal_rules.name_hint": "Tên duy nhất",
|
||||
"sheet.personal_rules.overwrite": "Lưu các thay đổi vào quy tắc cá nhân đã chọn",
|
||||
"sheet.personal_rules.rename": "Đổi tên",
|
||||
"sheet.personal_rules.rule": "Quy tắc cá nhân",
|
||||
"sheet.personal_rules.save": "Lưu mới",
|
||||
"sheet.personal_rules.scope": "Được lưu trong hồ sơ cá nhân của bạn cho tất cả thiết kế.",
|
||||
"sheet.personal_rules.select": "Chọn một quy tắc",
|
||||
"sheet.personal_rules.title": "Quy tắc cá nhân",
|
||||
"sheet.personal_rules.unsupported": "Quy tắc này có các giá trị mà phiên bản hiện tại không thể sử dụng.",
|
||||
"shortcut.json_error": "tham số phải là JSON: {error}",
|
||||
"shortcut.no_command": "không có lệnh `{id}`; văn bản trước JSON phải là mã lệnh",
|
||||
"shortcut.pin": "Ghim lên đầu hộp S",
|
||||
"shortcut.unpin": "Bỏ ghim",
|
||||
"sketch is missing": "thiếu phác thảo",
|
||||
"sketch.degrees_of_freedom": "{count} bậc tự do",
|
||||
"sketch.dimension_added_driven": "Bản phác thảo đã xác định kích thước đó, nên nó được thêm vào dưới dạng kích thước tham chiếu",
|
||||
"sketch.dimension_applied": "Đã áp dụng kích thước",
|
||||
"sketch.dimension_applied_defined": "Đã áp dụng kích thước; đã định nghĩa tham số `{name}`",
|
||||
"sketch.dimension_applied_renamed": "Đã áp dụng kích thước; tham số được đặt tên là `{name}`",
|
||||
"sketch.dof_left": "Còn {count} bậc tự do",
|
||||
"sketch.dof_left_one": "Còn {count} bậc tự do",
|
||||
"sketch.draw_curves": "Vẽ dưới dạng {linetype}",
|
||||
@@ -3364,6 +3546,7 @@
|
||||
"sketch_text.align_right": "Phải",
|
||||
"sketch_text.bold": "In đậm",
|
||||
"sketch_text.builtin_font": "{family} (tích hợp sẵn)",
|
||||
"sketch_text.formula": "Bắt đầu bằng = để tạo chữ từ các tham số: ='W' + number(Width)",
|
||||
"sketch_text.italic": "In nghiêng",
|
||||
"sketch_text.loading_fonts": "Đang tìm kiếm các phông chữ đã cài đặt…",
|
||||
"sketch_text.on_path": "Văn bản đi theo đường dẫn: đường cong định vị văn bản",
|
||||
@@ -3372,6 +3555,8 @@
|
||||
"sketch_text.use_font_file": "Sử dụng tệp phông chữ {path}",
|
||||
"solid": "khối đặc",
|
||||
"status.editing": "Đang sửa {name}",
|
||||
"status.navigation": "Gán chức năng chuột: {mapping}",
|
||||
"status.navigation_tip": "Cách chuột di chuyển khung nhìn. Nhấp để chọn cách gán khác",
|
||||
"status.under_constrained": "Thiếu ràng buộc ({count} bậc tự do)",
|
||||
"status.under_constrained_one": "Thiếu ràng buộc ({count} bậc tự do)",
|
||||
"status.units_tip": "Đơn vị của thiết kế. Nhấp để đổi",
|
||||
@@ -3405,8 +3590,10 @@
|
||||
"timeline.delete_folders_tip": "Giữ lại các tính năng và thư mục lồng nhau trong lịch sử",
|
||||
"timeline.delete_folders_with_features_tip": "Xóa các thư mục cùng mọi tính năng trong đó và các thư mục lồng bên trong",
|
||||
"timeline.delete_many": "Xóa {count} tính năng đã chọn",
|
||||
"timeline.edited_rolled_back": "{name} đã thay đổi, nhưng nó nằm sau dấu mốc lịch sử nên chưa được dựng: kéo dấu mốc qua nó để xem kết quả",
|
||||
"timeline.feature_error": "Lỗi: {message}",
|
||||
"timeline.feature_hint": "Bấm đúp để sửa · kéo rê để đổi thứ tự · bấm chuột phải để xem thêm",
|
||||
"timeline.feature_rolled_back": "Đã lùi lại: nằm sau dấu mốc lịch sử nên chưa được dựng",
|
||||
"timeline.feature_warning": "Cảnh báo: {message}",
|
||||
"timeline.group": "Thư mục tính năng mới",
|
||||
"timeline.move_many": "Di chuyển các mục trong lịch sử thiết kế",
|
||||
@@ -3488,6 +3675,10 @@
|
||||
"ui.3d_mouse_offer": "Hiệu chuẩn chuột 3D sẽ sửa các trục bị hoán đổi hoặc đảo ngược và chỉnh tốc độ cũng như cảm giác.",
|
||||
"ui.3d_mouse_offer_never": "Không hiện lại",
|
||||
"ui.3d_mouse_offer_swap": "Chuyển sang Hidraw (điều khiển trực tiếp)",
|
||||
"ui.3d_mouse_orbit": "Quỹ đạo",
|
||||
"ui.3d_mouse_orbit_classic": "Cổ điển",
|
||||
"ui.3d_mouse_orbit_tip": "Theo dấu: chuột 3D xoay khung nhìn quanh phần mô hình ở giữa khung nhìn lúc bắt đầu xoay, được đánh dấu bằng một quả cầu mờ. Cổ điển: quanh tâm khung nhìn",
|
||||
"ui.3d_mouse_orbit_traced": "Theo dấu",
|
||||
"ui.3d_mouse_reading": "Giá trị đọc",
|
||||
"ui.3d_mouse_reset_axes": "Đặt lại phép gán trục",
|
||||
"ui.3d_mouse_reset_view": "Đặt lại khung nhìn",
|
||||
@@ -3496,6 +3687,8 @@
|
||||
"ui.3d_mouse_section": "Chuột 3D",
|
||||
"ui.3d_mouse_show_in_view": "Hiện chuột 3D trong khung nhìn 3D",
|
||||
"ui.3d_mouse_show_in_view_tip": "Hình chuột 3D của bạn ở góc dưới bên trái, chuyển động theo bạn.",
|
||||
"ui.3d_mouse_sketch_orbit": "Xoay bản phác thảo bằng chuột 3D",
|
||||
"ui.3d_mouse_sketch_orbit_tip": "Chuột 3D cũng xoay khung nhìn khi bản phác thảo đang mở và được nhìn thẳng, như chuột thường. Tắt: chỉ di chuyển và thu phóng bản phác thảo cho đến khi bạn nghiêng khung nhìn.",
|
||||
"ui.3d_mouse_skip": "Thiết bị của tôi không làm được điều này",
|
||||
"ui.3d_mouse_skip_tip": "Bỏ qua chuyển động này theo cả hai chiều; việc hiệu chuẩn sẽ không dùng nó.",
|
||||
"ui.3d_mouse_speed": "Tốc độ chuột 3D",
|
||||
@@ -3524,6 +3717,8 @@
|
||||
"ui.3d_mouse_step_twist_counterclockwise": "Xoay núm điều khiển ngược chiều kim đồng hồ, giữ nguyên, rồi thả ra.",
|
||||
"ui.3d_mouse_switch_cap": "Hiệu chuẩn theo kiểu trở về giữa",
|
||||
"ui.3d_mouse_switch_trackball": "Hiệu chuẩn như bi xoay",
|
||||
"ui.3d_mouse_use_direct": "Dùng trình điều khiển trực tiếp",
|
||||
"ui.3d_mouse_use_direct_tip": "Đọc chuột 3D trực tiếp (hidraw) thay vì qua spacenavd.",
|
||||
"ui.3d_mouse_view_axis": "Trục khung nhìn",
|
||||
"ui.3d_mouse_view_off": "Tắt",
|
||||
"ui.3d_mouse_view_off_tip": "Hồ sơ của trình điều khiển chuột 3D tắt trục này, nên chuyển động của nó không làm khung nhìn di chuyển. Chọn chuyển động của trục khác ở đây sẽ hoán đổi hai trục, và chuyển động đó không còn di chuyển khung nhìn.",
|
||||
@@ -3657,6 +3852,8 @@
|
||||
"ui.agent_chat_remove": "Xóa khỏi hàng đợi",
|
||||
"ui.agent_chat_remove_file": "Bỏ tệp này khỏi tin nhắn",
|
||||
"ui.agent_chat_remove_imported": "Gỡ khỏi tin nhắn này; chi tiết vẫn nằm trong thiết kế (sử dụng Hoàn tác để xóa)",
|
||||
"ui.agent_chat_reply_cut_off": "Câu trả lời đã chạm giới hạn độ dài trước khi xong nên có thể chưa đầy đủ. Hãy yêu cầu AI Agent tiếp tục, hoặc trả lời ngắn hơn.",
|
||||
"ui.agent_chat_reply_declined": "Mô hình đã từ chối trả lời tin nhắn này.",
|
||||
"ui.agent_chat_retry": "Thử lại",
|
||||
"ui.agent_chat_right": "Phải (Hình chiếu cạnh)",
|
||||
"ui.agent_chat_save": "Lưu",
|
||||
@@ -3840,6 +4037,7 @@
|
||||
"ui.circle": "Hình tròn",
|
||||
"ui.circular_pattern": "Mảng tròn quanh trục",
|
||||
"ui.clear": "Xóa",
|
||||
"ui.clear_print_face": "Xóa mặt in",
|
||||
"ui.clear_recent": "Xóa danh sách gần đây",
|
||||
"ui.clear_the_selection": "Hủy chọn",
|
||||
"ui.click_selects_whole_bodies": "Nhấp chuột chọn toàn bộ thân khối",
|
||||
@@ -3874,6 +4072,15 @@
|
||||
"ui.constant": "Hằng số",
|
||||
"ui.constraints_conflict": "Xung đột ràng buộc",
|
||||
"ui.construction": "Đường gióng dựng hình",
|
||||
"ui.construction.angle_hint": "Đường dựng hình: nhấp một điểm rồi nhập góc hoặc chọn hướng",
|
||||
"ui.construction.bisector_hint": "Phân giác: chọn hai đường thẳng giao nhau rồi chọn nghiệm mong muốn",
|
||||
"ui.construction.common_hint": "Tiếp tuyến chung: chọn hai đường tròn/cung rồi chọn nghiệm mong muốn",
|
||||
"ui.construction.contact_hint": "Tiếp tuyến: chọn đường tròn/cung hoặc spline/conic hở rồi chọn tiếp điểm (đường cong tự do: chỉ đầu mút)",
|
||||
"ui.construction.external_hint": "Tiếp tuyến: chọn đường tròn hoặc cung, điểm ngoài rồi chọn nghiệm mong muốn",
|
||||
"ui.construction.free_hint": "Đường dựng hình: nhấp hai điểm; nhấp chuột phải để bắt đầu lại",
|
||||
"ui.construction.point_hint": "Đường dựng hình: nhấp điểm đi qua",
|
||||
"ui.construction.reference_hint": "Đường dựng hình: chọn đường thẳng rồi chọn điểm; nhấp chuột phải để đổi tham chiếu",
|
||||
"ui.construction.ribbon_label": "Đường phụ",
|
||||
"ui.context_menu": "Menu ngữ cảnh",
|
||||
"ui.continuity_g0": "Nếp gập G0",
|
||||
"ui.continuity_g1": "G1 tiếp tuyến",
|
||||
@@ -3965,6 +4172,14 @@
|
||||
"ui.end_scale": "Tỷ lệ đầu cuối",
|
||||
"ui.entities": "Các thực thể",
|
||||
"ui.equal": "Bằng nhau",
|
||||
"ui.equation_end": "Kết thúc",
|
||||
"ui.equation_explicit": "Tường minh",
|
||||
"ui.equation_form": "Dạng",
|
||||
"ui.equation_note": "Biến là một số không có đơn vị: sin(t) hiểu nó theo radian. Kết quả không có đơn vị dùng đơn vị của thiết kế.",
|
||||
"ui.equation_parametric": "Tham số",
|
||||
"ui.equation_x_of_t": "x(t)",
|
||||
"ui.equation_y_of_t": "y(t)",
|
||||
"ui.equation_y_of_x": "y(x)",
|
||||
"ui.equivalent_radius": "Bán kính tương đương",
|
||||
"ui.expand": "Mở rộng",
|
||||
"ui.exportDxf": "Xuất tệp DXF…",
|
||||
@@ -4030,6 +4245,7 @@
|
||||
"ui.heading_design": "THIẾT KẾ",
|
||||
"ui.heading_draft": "ĐỘ DỐC THOÁT KHUÔN",
|
||||
"ui.heading_edit": "CHỈNH SỬA",
|
||||
"ui.heading_equation_curve": "ĐƯỜNG CONG PHƯƠNG TRÌNH",
|
||||
"ui.heading_extrude": "ĐÙN KHỐI",
|
||||
"ui.heading_fillet": "BO TRÒN",
|
||||
"ui.heading_finish_editing": "HOÀN TẤT CHỈNH SỬA",
|
||||
@@ -4121,6 +4337,10 @@
|
||||
"ui.import_ellipsis": "Nhập tệp…",
|
||||
"ui.infinite": "Vô hạn",
|
||||
"ui.insert": "Chèn",
|
||||
"ui.insert_design.browse": "Duyệt…",
|
||||
"ui.insert_design.open_designs": "Thiết kế đang mở",
|
||||
"ui.insert_design.saved_file": "{name} có thay đổi chưa lưu, nên tệp đã lưu của nó đã được chèn. Hãy lưu nó, rồi dùng Cập nhật liên kết để đưa các thay đổi vào.",
|
||||
"ui.insert_design.unsaved": "Thay đổi chưa lưu",
|
||||
"ui.inspect": "Kiểm tra",
|
||||
"ui.intersect": "Giao nhau",
|
||||
"ui.isolate": "Cô lập đối tượng",
|
||||
@@ -4220,6 +4440,7 @@
|
||||
"ui.pan_zoom_orbit": "Dời góc nhìn, thu phóng, xoay quanh tâm",
|
||||
"ui.parallel": "Song song",
|
||||
"ui.parameters": "Bảng tham số",
|
||||
"ui.part_size_needs_a_part": "Hãy chọn một chi tiết tiêu chuẩn đã chèn (vít, đai ốc, vòng đệm hoặc chốt) để đổi kích thước. Để phóng to hoặc thu nhỏ một thân khối, hãy dùng Thay đổi tỷ lệ.",
|
||||
"ui.part_size_shared": "Dựng lại chi tiết, thay thế mọi tính năng đã thêm. Tất cả các lần xuất hiện của chi tiết này đều được cập nhật.",
|
||||
"ui.paste": "Dán",
|
||||
"ui.path": "Đường dẫn",
|
||||
@@ -4249,12 +4470,17 @@
|
||||
"ui.plugins_skipped": "Không thể đọc {count} thư mục.",
|
||||
"ui.plugins_version": "{version}",
|
||||
"ui.point": "Điểm",
|
||||
"ui.point_cloud_add_filter": "Thêm bộ lọc…",
|
||||
"ui.point_cloud_auto_range": "Phạm vi tự động",
|
||||
"ui.point_cloud_color_by": "Tô màu theo",
|
||||
"ui.point_cloud_file_colors": "Màu trong tệp",
|
||||
"ui.point_cloud_filter_by": "Lọc theo",
|
||||
"ui.point_cloud_height_high": "Cao nhất",
|
||||
"ui.point_cloud_height_low": "Thấp nhất",
|
||||
"ui.point_cloud_legend_filter": "Hiện và ẩn trong chú giải ở trên",
|
||||
"ui.point_cloud_no_file_colors": "Tệp không có màu",
|
||||
"ui.point_cloud_pause": "Tạm dừng",
|
||||
"ui.point_cloud_play": "Phát",
|
||||
"ui.point_cloud_single_color": "Một màu",
|
||||
"ui.point_cloud_size": "Kích thước điểm",
|
||||
"ui.point_cloud_units": "Đơn vị của tệp",
|
||||
@@ -4263,12 +4489,29 @@
|
||||
"ui.polygon": "Đa giác",
|
||||
"ui.preferences": "Tùy chọn cài đặt",
|
||||
"ui.press_a_key": "nhấn một phím…",
|
||||
"ui.print_face_cleared": "{body}: đã xóa mặt in",
|
||||
"ui.print_face_input": "Mặt in",
|
||||
"ui.print_face_one_body": "Mặt in được chọn cho một thân: hãy gửi riêng thân đó để thay đổi",
|
||||
"ui.print_face_pick": "Chọn một mặt phẳng của thân đặc để đặt làm mặt in",
|
||||
"ui.print_face_set": "{body}: đã đặt mặt in; Gửi đến Slicer sẽ đặt thân lên mặt này",
|
||||
"ui.profile": "Biên dạng",
|
||||
"ui.profile_plane": "Mặt phẳng biên dạng",
|
||||
"ui.profiles": "Các biên dạng",
|
||||
"ui.project": "Chiếu hình học",
|
||||
"ui.project_face_edges_sketch": "Chiếu các cạnh bề mặt vào phác thảo mới",
|
||||
"ui.properties": "Thuộc tính cơ lý",
|
||||
"ui.properties.copy_matrix": "Sao chép ma trận",
|
||||
"ui.properties.first_moments": "Mômen bậc nhất",
|
||||
"ui.properties.inertia": "Mômen quán tính",
|
||||
"ui.properties.inertia_note": "Quanh trọng tâm, theo các trục thế giới (g·{unit}²)",
|
||||
"ui.properties.inertia_unavailable": "Không khả dụng: lưới của một thân khối không kín.",
|
||||
"ui.properties.inertia_x": "Ixx, Ixy, Ixz",
|
||||
"ui.properties.inertia_y": "Iyx, Iyy, Iyz",
|
||||
"ui.properties.inertia_z": "Izx, Izy, Izz",
|
||||
"ui.properties.measuring": "Đang đo…",
|
||||
"ui.properties.measuring_failed": "Phép đo đã dừng trước khi hoàn tất.",
|
||||
"ui.properties.principal_axis": "Trục chính {number}",
|
||||
"ui.properties.principal_moments": "Mômen quán tính chính",
|
||||
"ui.pull_direction": "Hướng kéo",
|
||||
"ui.quality": "Chất lượng",
|
||||
"ui.quantity": "Số lượng",
|
||||
@@ -4314,6 +4557,7 @@
|
||||
"ui.revolve": "Xoay tròn tạo khối",
|
||||
"ui.ribbon_exit": "Thoát",
|
||||
"ui.ribbon_labels": "Hiển thị văn bản bên dưới biểu tượng dải băng",
|
||||
"ui.ribbon_menus_skip_pinned": "Không lặp lại các lệnh đã ghim trong menu thả xuống",
|
||||
"ui.ribbon_pin_footer": "Các lệnh đã ghim hiển thị trên ruy-băng. Rê chuột lên một hàng để ghim hoặc bỏ ghim.",
|
||||
"ui.ribbon_workspace": "Không gian làm việc",
|
||||
"ui.right": "Phải (Hình chiếu cạnh)",
|
||||
@@ -4331,6 +4575,8 @@
|
||||
"ui.select": "Chọn",
|
||||
"ui.selectOther": "Chọn đối tượng khác…",
|
||||
"ui.selectTangentChain": "Chọn chuỗi tiếp tuyến",
|
||||
"ui.select_all": "Chọn tất cả",
|
||||
"ui.select_components_by_face": "Chọn thành phần (chọn một mặt sẽ chọn thành phần chứa mặt đó)",
|
||||
"ui.selection": "Vùng chọn",
|
||||
"ui.selection_modifiers": "Phím bổ trợ chọn",
|
||||
"ui.selection_shift_add_only": "Shift+nhấp chỉ thêm, không bỏ chọn",
|
||||
@@ -4367,7 +4613,16 @@
|
||||
"ui.sketch": "Phác thảo",
|
||||
"ui.sketch_dimension": "Phác thảo Kích thước",
|
||||
"ui.sketch_grid": "Lưới phác thảo",
|
||||
"ui.sketch_intersect_geometry": "Hình học",
|
||||
"ui.sketch_intersect_projection_link": "Liên kết chiếu",
|
||||
"ui.sketch_intersect_selection_filter": "Bộ lọc lựa chọn",
|
||||
"ui.sketch_modifiers": "Phím bổ trợ phác thảo",
|
||||
"ui.sketch_project_geometry": "Hình học",
|
||||
"ui.sketch_report.all_constrained": "Mọi thứ đã được ràng buộc hoàn toàn.",
|
||||
"ui.sketch_report.dof": "Bậc tự do",
|
||||
"ui.sketch_report.loose": "Chưa ràng buộc hoàn toàn",
|
||||
"ui.sketch_report.status": "Trạng thái",
|
||||
"ui.sketch_report.title": "Báo cáo phác thảo",
|
||||
"ui.sketch_scale": "Tỷ lệ phác thảo",
|
||||
"ui.sketches": "Các phác thảo",
|
||||
"ui.slice": "Cắt lát",
|
||||
@@ -4414,6 +4669,11 @@
|
||||
"ui.symmetric": "Đối xứng hai phía",
|
||||
"ui.symmetry": "Đối xứng",
|
||||
"ui.system": "Hệ thống",
|
||||
"ui.tab_assemble": "Lắp Ráp",
|
||||
"ui.tab_manage": "Quản Lý",
|
||||
"ui.tab_sheet_metal": "Kim Loại Tấm",
|
||||
"ui.tab_view": "Góc Nhìn",
|
||||
"ui.tab_weldments": "Kết Cấu Hàn",
|
||||
"ui.tangent": "Tiếp tuyến",
|
||||
"ui.taper_angle": "Góc côn (Taper)",
|
||||
"ui.tapped": "Ren ta-rô",
|
||||
@@ -4429,6 +4689,7 @@
|
||||
"ui.tip_angle": "Góc đỉnh mũi khoan",
|
||||
"ui.to_object": "Tới đối tượng",
|
||||
"ui.tool_direction": "Hướng công cụ",
|
||||
"ui.toolbar_tabs_hidden": "Tất cả các thẻ thanh công cụ đều bị ẩn. Nhấp vào + hoặc nhấp chuột phải tại đây để hiện một thẻ.",
|
||||
"ui.top": "Trên (Hình chiếu bằng)",
|
||||
"ui.top_diameter": "Đường kính đỉnh",
|
||||
"ui.top_radius": "Bán kính đỉnh",
|
||||
@@ -4466,15 +4727,25 @@
|
||||
"ui.view_centre": "Tâm góc nhìn",
|
||||
"ui.viewport_status_clear": "Tắt {name}",
|
||||
"ui.viewport_status_clear_hint": "Tắt {name} · Esc",
|
||||
"ui.viewport_status_edges": "{count} cạnh",
|
||||
"ui.viewport_status_from": "từ {direction}",
|
||||
"ui.viewport_status_key": "Hiển thị chú giải cho {name}",
|
||||
"ui.viewport_status_minimum_radius": "Bán kính nhỏ nhất",
|
||||
"ui.viewport_status_pairs": "{count} cặp",
|
||||
"ui.viewport_status_section_hatch": "{setting} · gạch mặt cắt",
|
||||
"ui.viewport_status_section_plane": "Mặt phẳng hiện tại",
|
||||
"ui.viewport_status_section_tilted": "nghiêng · {offset}",
|
||||
"ui.viewport_status_stripes": "{count} sọc",
|
||||
"ui.viewport_status_summary_clear": "Tắt tất cả",
|
||||
"ui.viewport_status_summary_heading": "Trong khung nhìn này",
|
||||
"ui.viewport_status_summary_label": "{name} và {count} mục khác",
|
||||
"ui.viewport_status_summary_more": "+{count}",
|
||||
"ui.viewport_theme_follow": "Theo chủ đề giao diện",
|
||||
"ui.visual_shaded_hidden_edges": "Tô bóng kèm nét khuất",
|
||||
"ui.visual_shaded_with_edges": "Tô bóng kèm hiển thị cạnh",
|
||||
"ui.visual_style": "Kiểu hiển thị trực quan",
|
||||
"ui.visual_wireframe": "Khung dây (Wireframe)",
|
||||
"ui.wheel_zoom_speed": "Tốc độ thu phóng bằng con lăn chuột",
|
||||
"ui.width": "Bề rộng",
|
||||
"ui.window_system": "Hệ thống cửa sổ",
|
||||
"ui.window_system_auto": "Tự động",
|
||||
@@ -4505,7 +4776,9 @@
|
||||
"update.button": "Cập nhật",
|
||||
"update.button_version": "Cập nhật lên {version}",
|
||||
"update.check_automatically": "Tự động kiểm tra bản cập nhật",
|
||||
"update.check_for_updates": "Kiểm tra bản cập nhật",
|
||||
"update.check_now": "Kiểm tra ngay",
|
||||
"update.check_unavailable": "Không thể kiểm tra bản cập nhật cho bản cài đặt này.",
|
||||
"update.checking": "Đang kiểm tra…",
|
||||
"update.copy": "Sao chép",
|
||||
"update.dmg_opened": "Ảnh đĩa đã mở và được xác thực: kéo SolidCraft vào thư mục Applications để thay thế bản cũ, sau đó khởi động lại SolidCraft.",
|
||||
@@ -4528,6 +4801,9 @@
|
||||
"update.prefs_managed": "Đây là SolidCraft {version}, do {manager} quản lý. Lần kiểm tra chỉ hỏi GitHub về bản phát hành mới nhất và không gửi gì khác; hãy cập nhật SolidCraft trong {manager}.",
|
||||
"update.prefs_note": "Đây là SolidCraft {version} ({kind}). Quá trình kiểm tra gửi yêu cầu đến GitHub để tìm bản mới nhất và không gửi thông tin nào khác.",
|
||||
"update.prefs_web": "Tải lại trang để nhận ứng dụng web mới nhất. Nếu mạng không khả dụng hoặc bản cập nhật không thể tải về kịp thời gian, phiên bản đã lưu sẽ mở thay thế; quá trình tải xuống đang diễn ra sẽ tiếp tục cho lần tải lại tiếp theo.",
|
||||
"update.refresh_checking": "Đang kiểm tra bản phát hành mới nhất…",
|
||||
"update.refresh_fallback": "Không thể kiểm tra bản phát hành mới hơn; đang cập nhật lên {version} đã tìm thấy trước đó.",
|
||||
"update.refresh_selected": "Đang cập nhật lên {version}.",
|
||||
"update.release_page": "Mở trang phát hành",
|
||||
"update.restart": "Khởi động lại ngay",
|
||||
"update.restart_later": "Để sau",
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
"BLEND SURFACE": "混合曲面",
|
||||
"BOUNDARY SURFACE": "边界曲面",
|
||||
"BROWSER": "浏览器",
|
||||
"Back to the original order": "恢复原始顺序",
|
||||
"Ball": "球",
|
||||
"Bar": "扁钢",
|
||||
"Base Center": "底面中心",
|
||||
@@ -206,6 +207,7 @@
|
||||
"Edges": "边",
|
||||
"Edit": "编辑",
|
||||
"Edit Profile Sketch": "编辑轮廓草图",
|
||||
"Edit shortcuts": "编辑快捷键",
|
||||
"Enable rule": "启用规则",
|
||||
"Enabled": "已启用",
|
||||
"End Radius": "结束半径",
|
||||
@@ -468,6 +470,7 @@
|
||||
"Radius": "半径",
|
||||
"Radius Fit": "半径拟合",
|
||||
"Ratio": "比率",
|
||||
"Read-only list: shortcuts can't be changed here.": "只读列表:此处无法更改快捷键。",
|
||||
"Reattach selected face": "重新附着所选面",
|
||||
"Recover": "恢复",
|
||||
"Recover unsaved design?": "恢复未保存的设计?",
|
||||
@@ -593,6 +596,8 @@
|
||||
"Snap to face and edge centres": "捕捉到面和边的中心",
|
||||
"SolidCraft cannot submit reports directly. Submit on GitHub; no token is needed in the app.": "SolidCraft 无法直接提交报告。请在 GitHub 上提交;应用中不需要令牌。",
|
||||
"SolidCraft closed before these designs were saved. Their last autosave can be opened.": "SolidCraft 在这些设计保存前已关闭。可以打开它们的上次自动保存。",
|
||||
"Sort A to Z": "升序排序",
|
||||
"Sort Z to A": "降序排序",
|
||||
"Spacing 2 must be a non-zero number": "间距 2 必须是非零数字",
|
||||
"Spacing must be a non-zero number": "间距必须是非零数字",
|
||||
"Specialise": "专用操作",
|
||||
@@ -652,6 +657,7 @@
|
||||
"Third point": "第三点",
|
||||
"This child is shared. Deleting it removes it from every copy of its parent.": "此子项是共享的。删除它会从其父项的每个副本中移除。",
|
||||
"This child is shared. Position changes apply to every copy of its parent.": "此子项是共享的。位置更改会应用到其父项的每个副本。",
|
||||
"This component is inside a subassembly placed more than once: aligning it moves it in every placement.": "此组件位于多次放置的子装配体中:对齐它会使其在每个放置位置中都移动。",
|
||||
"This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "此面无法提供持久附着。请选择其他面或显式使用固定平面。",
|
||||
"This image is not attached to GitHub yet. Copy or save it, then attach it on GitHub.": "此图片尚未附加到GitHub。请复制或保存图片,然后在GitHub中附加。",
|
||||
"Thread depth": "螺纹深度",
|
||||
@@ -772,6 +778,8 @@
|
||||
"at the face": "在面上",
|
||||
"bom.group_children": "子零件并入所属零件的行",
|
||||
"browser.body_name": "实体{number}",
|
||||
"browser.calibrate_click_a": "点击图像选取点 A,或输入其坐标。",
|
||||
"browser.calibrate_click_b": "点击图像选取点 B,或输入其坐标。",
|
||||
"browser.calibrate_title": "校准:{name}",
|
||||
"browser.capture_many": "{count} 个组件已移动,但尚未捕获其位置。",
|
||||
"browser.capture_note": "“捕获位置”保留新位置;“恢复位置”还原原先的位置。",
|
||||
@@ -814,6 +822,7 @@
|
||||
"cmd.appearance_pick_up": "拾取外观",
|
||||
"cmd.appearance_replace": "替换外观",
|
||||
"cmd.assembly_bom": "物料清单",
|
||||
"cmd.body.print_face": "打印底面",
|
||||
"cmd.body_rename": "重命名实体",
|
||||
"cmd.browser_collapse_all": "全部折叠",
|
||||
"cmd.browser_expand_all": "全部展开",
|
||||
@@ -821,6 +830,7 @@
|
||||
"cmd.browser_move": "移动浏览器项目",
|
||||
"cmd.browser_order": "排列浏览器项目",
|
||||
"cmd.browser_rename_group": "重命名组",
|
||||
"cmd.browser_reparent": "移动到组件",
|
||||
"cmd.browser_ungroup": "取消编组",
|
||||
"cmd.browser_visibility": "显示/隐藏",
|
||||
"cmd.canvas_calibrate": "校准画布",
|
||||
@@ -847,7 +857,9 @@
|
||||
"cmd.component_metadata": "零件属性",
|
||||
"cmd.component_metadata_set": "更改零件属性",
|
||||
"cmd.component_move_bodies": "将实体移至组件",
|
||||
"cmd.component_move_features": "将特征移至组件",
|
||||
"cmd.component_move_sketches": "将草图移至组件",
|
||||
"cmd.component_paste_from_design": "从其他设计粘贴",
|
||||
"cmd.component_paste_new": "粘贴为新对象",
|
||||
"cmd.component_properties": "组件物理属性",
|
||||
"cmd.component_relink": "重新链接源文件",
|
||||
@@ -984,6 +996,7 @@
|
||||
"cmd.motion_trace": "运动轨迹",
|
||||
"cmd.motion_trace_edit": "编辑运动轨迹",
|
||||
"cmd.motion_trace_keep": "保留运动轨迹",
|
||||
"cmd.occurrence_align": "对齐实例",
|
||||
"cmd.occurrence_copy": "粘贴(实例)",
|
||||
"cmd.occurrence_drag": "拖动实例",
|
||||
"cmd.occurrence_ground": "固定",
|
||||
@@ -1074,6 +1087,13 @@
|
||||
"cmd.render_start": "渲染图像",
|
||||
"cmd.render_status": "渲染进度",
|
||||
"cmd.select_clear": "清除选择",
|
||||
"cmd.settings_profile_apply": "应用设置配置文件",
|
||||
"cmd.settings_profile_delete": "删除设置配置文件",
|
||||
"cmd.settings_profile_export": "导出设置配置文件",
|
||||
"cmd.settings_profile_import": "导入设置配置文件",
|
||||
"cmd.settings_profile_list": "设置配置文件",
|
||||
"cmd.settings_profile_rename": "重命名设置配置文件",
|
||||
"cmd.settings_profile_save": "保存设置配置文件",
|
||||
"cmd.sheet_convert": "转换为钣金",
|
||||
"cmd.sheet_export_bend_table": "导出折弯表",
|
||||
"cmd.sheet_export_dxf": "将展开图导出为 DXF",
|
||||
@@ -1087,6 +1107,16 @@
|
||||
"cmd.sheet_refold": "重新折弯",
|
||||
"cmd.sheet_rules": "列出钣金规则",
|
||||
"cmd.sheet_unfold": "展开",
|
||||
"cmd.sketch.construction_line": "构造直线",
|
||||
"cmd.sketch.construction_line.angle": "指定角度构造直线",
|
||||
"cmd.sketch.construction_line.bisector": "角平分线",
|
||||
"cmd.sketch.construction_line.horizontal": "水平构造直线",
|
||||
"cmd.sketch.construction_line.parallel": "平行构造直线",
|
||||
"cmd.sketch.construction_line.perpendicular": "垂直构造直线",
|
||||
"cmd.sketch.construction_line.tangent_at": "曲线上点处的切线",
|
||||
"cmd.sketch.construction_line.tangent_external": "过外部点的切线",
|
||||
"cmd.sketch.construction_line.tangent_two": "公切线",
|
||||
"cmd.sketch.construction_line.vertical": "竖直构造直线",
|
||||
"cmd.sketch_arc3d": "三维圆弧",
|
||||
"cmd.sketch_arc_center_point": "中心点圆弧",
|
||||
"cmd.sketch_arc_tangent": "相切圆弧",
|
||||
@@ -1119,6 +1149,8 @@
|
||||
"cmd.sketch_drawing_bounds": "图纸尺寸",
|
||||
"cmd.sketch_edit": "编辑草图",
|
||||
"cmd.sketch_edit_text": "编辑文字",
|
||||
"cmd.sketch_equation_curve": "方程曲线",
|
||||
"cmd.sketch_equation_curve_edit": "编辑方程曲线",
|
||||
"cmd.sketch_export_dxf": "另存为 DXF",
|
||||
"cmd.sketch_finish_auto_constrain": "使用自动约束完成",
|
||||
"cmd.sketch_fit_curves_to_section": "将曲线拟合到网格截面",
|
||||
@@ -1215,6 +1247,7 @@
|
||||
"cmd.view.render_browser": "渲染浏览器",
|
||||
"cmd.view.render_dock": "移动渲染停靠面板",
|
||||
"cmd.view.render_focus": "渲染专注视图",
|
||||
"cmd.view.status_items": "视口状态项",
|
||||
"cmd.view_ambient_occlusion": "环境光遮蔽",
|
||||
"cmd.view_angle_readout": "视图角度",
|
||||
"cmd.view_apply": "还原命名视图",
|
||||
@@ -1369,8 +1402,21 @@
|
||||
"help.material.assign": "设置所选实体的材料,例如钢、铝或 ABS。用于让质量和重量与实际零件一致。",
|
||||
"help.mit": "MIT 许可证",
|
||||
"help.notice": "NOTICE",
|
||||
"help.occurrence.move": "仅沿关节允许的自由度移动装配零部件。选中零部件的面后,拖动可用的箭头或圆弧。",
|
||||
"help.parameters.change": "打开驱动设计尺寸的命名数值和表达式表。用于在一处修改尺寸,让所有引用它的特征随之更新。",
|
||||
"help.pointcloud.insert": "将 PLY、XYZ 或 PTS 扫描作为点云插入到模型旁。根据测量数据建模时,可将其用作参考。",
|
||||
"help.sketch.construction_line": "创建经过两点的无限构造直线,用于辅助绘制草图而不分割轮廓。",
|
||||
"help.sketch.construction_line.angle": "创建与草图X轴成指定角度的无限构造直线。选择一点后输入角度或选择方向。",
|
||||
"help.sketch.construction_line.bisector": "选择两条相交的草图直线,再选择所需的角平分线。结果随原直线的编辑而变化。",
|
||||
"help.sketch.construction_line.horizontal": "创建经过指定点的无限水平构造直线。后续编辑时保持水平约束。",
|
||||
"help.sketch.construction_line.parallel": "选择草图直线,然后放置与其平行的无限构造直线。右键单击可更换参照。",
|
||||
"help.sketch.construction_line.perpendicular": "选择草图直线,然后放置与其垂直的无限构造直线。右键单击可更换参照。",
|
||||
"help.sketch.construction_line.tangent_at": "在圆或圆弧上的点处,或开放样条曲线、圆锥曲线的端点处创建切线。先选曲线,再选接点。",
|
||||
"help.sketch.construction_line.tangent_external": "依次选择圆或圆弧、外部点和所需切线。预览仅显示接点位于已绘圆弧上的解。",
|
||||
"help.sketch.construction_line.tangent_two": "选择两个圆或圆弧,再从预览中选择公切线。接点必须位于已绘曲线上。",
|
||||
"help.sketch.construction_line.vertical": "创建经过指定点的无限竖直构造直线。后续编辑时保持竖直约束。",
|
||||
"help.sketch.equation_curve": "在一个范围内按公式绘制曲线:x(t) 和 y(t),或 y = f(x)。公式可以使用参数,曲线随参数变化。适用于正弦波、螺旋线或齿轮的渐开线。",
|
||||
"help.sketch.inspect": "打开当前草图的报告:显示剩余的自由度以及是否已完全约束。在完成草图之前,用它找出仍然可以移动的部分。",
|
||||
"help.solid.align": "移动所选实体,使其上的点、面或平面与别处的点、面或平面对齐。用于把一个零件贴靠到另一个零件上,而无需测量距离。",
|
||||
"help.solid.chamfer": "用指定的距离在所选边上切出一个平直的斜面。用于去除锐边,或使销钉、螺钉更容易插入。",
|
||||
"help.solid.combine": "将多个实体合并、从目标实体中切除,或只保留它们共有的体积,还可以保留工具实体。用于合并零件、用一个形体切割另一个形体,或找出两个实体重叠的位置。",
|
||||
@@ -1499,6 +1545,21 @@
|
||||
"joint.one_component": "这些零件是同一组件的实体:{bodies}。接头使一个组件相对另一个组件运动,因此每个零件都需要自己的组件。",
|
||||
"joint.rigid_group_one_component": "这 {count} 个实体都位于同一组件中(或直接位于设计中):请先使用“{command}”。",
|
||||
"joint.rigid_group_select_components": "请选择两个或更多组件。",
|
||||
"joint_move.blocked_hint": "请检查关节类型(例如 Rigid)、固定状态、关节限位和参数驱动值。",
|
||||
"joint_move.blocked_title": "无法移动此零部件",
|
||||
"joint_move.coarse": "靠近轴线时的旋转步长(°)",
|
||||
"joint_move.distance": "相对起点的移动距离",
|
||||
"joint_move.done": "完成",
|
||||
"joint_move.fine": "远离轴线时的旋转步长(°)",
|
||||
"joint_move.fixed": "此零部件没有可操作的关节自由度。",
|
||||
"joint_move.help": "移动 — 拖动箭头或圆弧。按 Esc 取消当前拖动。",
|
||||
"joint_move.legacy_hint": "关闭后使用原有的移动面板。",
|
||||
"joint_move.precision": "将光标移到虚线引导圈外侧可微调旋转。",
|
||||
"joint_move.rotation": "相对起点的旋转角度",
|
||||
"joint_move.select": "请选择一个面或一个装配零部件,然后执行移动。",
|
||||
"joint_move.settings": "装配移动",
|
||||
"joint_move.step": "步长",
|
||||
"joint_move.use_handles": "装配移动使用关节运动手柄",
|
||||
"keymap.command_id": "命令 ID",
|
||||
"keymap.empty": "没有匹配的命令",
|
||||
"keymap.use_anyway": "仍在此处使用 {key}",
|
||||
@@ -1558,6 +1619,10 @@
|
||||
"material.selection.mixed": "不同材料",
|
||||
"measure.at": "位置",
|
||||
"measure.item": "项目 {number}",
|
||||
"measure.quick_copied": "已复制测量值",
|
||||
"measure.quick_copy": "点击复制测量值",
|
||||
"measure.quick_edges": "{count} 条边",
|
||||
"measure.quick_faces": "{count} 个面",
|
||||
"messages.ago_h": "{n} 小时前",
|
||||
"messages.ago_min": "{n} 分钟前",
|
||||
"messages.ago_s": "{n} 秒前",
|
||||
@@ -1593,6 +1658,8 @@
|
||||
"nav.maya.help": "Alt+左键拖动旋转,Alt+中键拖动平移,Alt+右键拖动缩放;中键拖动也可平移",
|
||||
"nav.openscad.help": "在空白处左键拖动旋转,Shift+左键拖动框选,拖动草图几何可编辑;右键或中键拖动平移,Shift+右键或 Shift+中键拖动缩放",
|
||||
"nav.perspective.sketch": "编辑草图时使用正交视图。完成草图后才能切换透视。",
|
||||
"nav.right_drag_orbits.help": "关闭:右键拖动不会移动相机,右键只打开上下文菜单。选择 SolidWorks 鼠标映射时会关闭此项。",
|
||||
"nav.right_drag_orbits.label": "右键拖动旋转",
|
||||
"nav.solidworks.help": "中键拖动旋转,Ctrl+中键拖动平移,Shift+中键拖动缩放,右键拖动旋转",
|
||||
"nav.tinkercad.help": "右键拖动旋转,中键或 Shift+右键拖动平移",
|
||||
"nav.touchpad.help": "按住 Shift 并移动指针可平移;按住 Alt/Option 并移动可旋转。无需按鼠标按钮。垂直滚动可缩放。",
|
||||
@@ -1614,6 +1681,9 @@
|
||||
"navbar.custom.customise": "自定义导航栏…",
|
||||
"navbar.custom.design": "设计",
|
||||
"navbar.custom.duplicate": "此槽位已在栏上。",
|
||||
"navbar.custom.edge": "边缘",
|
||||
"navbar.custom.edge_bottom": "底部",
|
||||
"navbar.custom.edge_top": "顶部",
|
||||
"navbar.custom.fade": "淡化",
|
||||
"navbar.custom.full": "请先移除一个槽位以添加其他槽位。",
|
||||
"navbar.custom.hidden_design": "在设计中隐藏",
|
||||
@@ -1705,6 +1775,11 @@
|
||||
"not a move": "不是移动",
|
||||
"not a number": "不是数字",
|
||||
"open a sketch first": "请先打开一个草图",
|
||||
"parameters.apply_live": "离开字段时立即应用每项更改",
|
||||
"parameters.apply_live_tip": "关闭时:更改会等到“应用”或“确定”,然后设计只为所有更改重建一次。“取消”或 Esc 会放弃这些更改。",
|
||||
"parameters.held": "{count} 项更改等待应用",
|
||||
"parameters.held_hint": "编辑表达式和单位。更改将等到“应用”或“确定”时生效。",
|
||||
"parameters.held_one": "1 项更改等待应用",
|
||||
"parts.automatic_name": "自动",
|
||||
"parts.dimension.across_flats": "对边宽度",
|
||||
"parts.dimension.bore": "内径",
|
||||
@@ -1720,12 +1795,15 @@
|
||||
"parts.dimension.thickness": "厚度",
|
||||
"parts.dimension.width": "宽度",
|
||||
"parts.family.bearing": "深沟球轴承(外形)",
|
||||
"parts.family.button_head_cap_screw": "圆头内六角螺钉",
|
||||
"parts.family.dowel_pin": "圆柱销",
|
||||
"parts.family.hex_bolt": "六角头螺栓",
|
||||
"parts.family.hex_nut": "六角螺母",
|
||||
"parts.family.set_screw": "内六角平端紧定螺钉",
|
||||
"parts.family.socket_head_cap_screw": "内六角圆柱头螺钉",
|
||||
"parts.family.washer": "平垫圈",
|
||||
"parts.holes": "孔(可选)",
|
||||
"parts.placement_hint": "选择一个或多个孔,在每个孔中各装一个零件;或按确定将其放在原点",
|
||||
"pattern.alignment_2": "对齐 2",
|
||||
"pattern.alignment_hint": "数量包含原始图形。居中时副本分布在两侧;数量为偶数时,反转可切换多一个副本的一侧。",
|
||||
"pattern.direction_1": "方向 1",
|
||||
@@ -1778,6 +1856,11 @@
|
||||
"prefs.bottom_centre": "底部居中",
|
||||
"prefs.bottom_right": "右下角",
|
||||
"prefs.browser": "浏览器",
|
||||
"prefs.browser_eye_left": "显示切换位于折叠箭头旁",
|
||||
"prefs.browser_eye_left_note": "浏览器各行的显示切换像以前一样位于折叠箭头旁,而不是在行右端的一列中。",
|
||||
"prefs.browser_reveal_on_hover": "悬停时显示",
|
||||
"prefs.browser_show_note": "“显示”让浏览器始终留在屏幕上。“悬停时显示”会将其隐藏,直到指针移到它的位置或其左边缘的细标签上;指针在其中或其菜单打开时,它保持打开。",
|
||||
"prefs.browser_shown": "显示",
|
||||
"prefs.built_in": "内置",
|
||||
"prefs.button_left": "左键拖动",
|
||||
"prefs.button_middle": "中键拖动",
|
||||
@@ -1825,6 +1908,8 @@
|
||||
"prefs.graphics_card_restart": "重启 SolidCraft 后生效。WGPU_ADAPTER_NAME 优先于此选择。",
|
||||
"prefs.graphics_note": "在速度与平滑度之间取舍。每个选项均以示例展示效果。",
|
||||
"prefs.graphics_presets_note": "预设会同时设置以下选项。",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out": "缩小时隐藏约束符号",
|
||||
"prefs.hide_constraint_glyphs_zoomed_out_note": "草图缩小到一定程度时隐藏约束符号,以免遮挡草图。关闭:任意缩放比例下符号仍保持固定屏幕大小。",
|
||||
"prefs.history": "历史",
|
||||
"prefs.history_origin_bodies": "在顶部显示原点和实体",
|
||||
"prefs.history_origin_bodies_note": "左侧或浏览器下方的历史以活动组件的实体文件夹和原点开头,并带有与浏览器相同的显示切换和菜单。底部的历史保持不变。",
|
||||
@@ -1848,6 +1933,8 @@
|
||||
"prefs.layout_note": "紧凑模式将面板停靠在窗口边缘。浏览器半透明仅适用于浮动模式。助手面板的位置在助手页面中设置。",
|
||||
"prefs.left": "左侧",
|
||||
"prefs.left_click": "左键单击",
|
||||
"prefs.line_drag_draws_one": "按下并拖动绘制一条直线",
|
||||
"prefs.line_drag_draws_one_note": "在直线工具中,按下、拖动再松开,会从按下处到松开处绘制一条直线并在此结束。单击仍会绘制连续的直线。关闭时:拖动与单击一样,在松开处放置一个点。",
|
||||
"prefs.linked_designs": "链接设计",
|
||||
"prefs.live_input": "实时输入",
|
||||
"prefs.live_preview": "实时预览",
|
||||
@@ -1861,6 +1948,9 @@
|
||||
"prefs.max_file_size_step": "STEP 和导入文件",
|
||||
"prefs.max_file_size_web": "网页版可打开最大 512 MB 的 STEP 和导入文件,以及最大 256 MB 的设计:浏览器标签页无法容纳更大的文件。桌面版可提高这些上限。",
|
||||
"prefs.megabytes": "MB",
|
||||
"prefs.menu_grid": "大图标",
|
||||
"prefs.menu_list": "列表",
|
||||
"prefs.menus": "菜单",
|
||||
"prefs.minutes": "分钟",
|
||||
"prefs.minutes_suffix": " min",
|
||||
"prefs.mouse": "鼠标与触控板",
|
||||
@@ -1880,14 +1970,44 @@
|
||||
"prefs.origin_plane_names": "原点平面名称",
|
||||
"prefs.origin_plane_names_note": "浏览器、对话框和列表中显示的名称。{top} 即 XY,{front} 即 XZ,{right} 即 YZ(Z 轴朝上)。命令、脚本和已保存的设计仍使用 XY、XZ 和 YZ。",
|
||||
"prefs.overall_speed": "整体速度",
|
||||
"prefs.parameter_list_rows": "参数列表行数",
|
||||
"prefs.parameter_list_rows_tip": "在空的数值框中按下箭头会列出参数(收藏的在前),最多列出此数量。数量越少,大型设计中的列表越轻。",
|
||||
"prefs.persistent_ribbon_pressed": "突出显示已启用的功能区命令",
|
||||
"prefs.persistent_ribbon_pressed_help": "在效果启用时突出显示相应的功能区命令。关闭此选项可保留原来的中性外观和命令帮助。",
|
||||
"prefs.perspective_fov": "视场角",
|
||||
"prefs.placement": "放置",
|
||||
"prefs.prefer_free_sketch_points": "草图点重合时优先选择可移动的点",
|
||||
"prefs.preview_choices": "所选设置预览",
|
||||
"prefs.print_face_highlight": "打印底面高亮",
|
||||
"prefs.print_face_highlight_tip": "视图中实体打印底面的着色和轮廓强度。0 % 不显示高亮。",
|
||||
"prefs.profile_active": "当前配置文件",
|
||||
"prefs.profile_applied": "已应用配置文件。",
|
||||
"prefs.profile_changed": "保存配置文件后设置已更改。“保存”会将其写入配置文件。",
|
||||
"prefs.profile_deleted": "已删除配置文件。",
|
||||
"prefs.profile_export": "导出…",
|
||||
"prefs.profile_exported": "已导出配置文件。",
|
||||
"prefs.profile_imported": "已导入配置文件。在“当前配置文件”中选择它即可切换。",
|
||||
"prefs.profile_name_hint": "配置文件名称,例如 笔记本",
|
||||
"prefs.profile_rename": "重命名",
|
||||
"prefs.profile_renamed": "已重命名配置文件。",
|
||||
"prefs.profile_save": "保存",
|
||||
"prefs.profile_saved": "已将当前设置保存到配置文件。",
|
||||
"prefs.profile_skipped": "已应用配置文件;{n} 项设置保留了当前值(见日志)。",
|
||||
"prefs.profiles": "设置配置文件",
|
||||
"prefs.profiles_note": "将快捷键、工具栏、导航、径向菜单和界面设置一起以名称保存,并一次切换。",
|
||||
"prefs.project_options_dialog": "Project 选项对话框",
|
||||
"prefs.project_options_dialog_note": "开启:投影前选择“几何体”或“实体”以及“投影链接”。关闭:保留原有的直接选择工作流。",
|
||||
"prefs.quality_default": "默认",
|
||||
"prefs.quality_fastest": "最快",
|
||||
"prefs.quality_slowest": "最慢",
|
||||
"prefs.quality_smoother": "更平滑",
|
||||
"prefs.quick_measure": "在视图角落显示快速测量",
|
||||
"prefs.quick_measure_note": "在视图右下角、历史记录上方显示所选对象的尺寸:边的长度(圆形边显示 Ø 和 R)、面的面积、点的位置、两个对象之间的距离和角度、多条边或多个面的总和。点击即可复制。",
|
||||
"prefs.render_previous_geometry_budget": "使用先前的渲染预览几何内存预算",
|
||||
"prefs.render_previous_geometry_budget_help": "恢复先前的固定几何内存上限(64位桌面为512 MiB,其他平台为128 MiB),替代基于设备的预算。",
|
||||
"prefs.reports_saved": "已保存 {n} 份",
|
||||
"prefs.ribbon_reveal": "在功能区中显示搜索结果",
|
||||
"prefs.ribbon_reveal_note": "将指针悬停在“搜索命令”的结果上时,会显示该命令在功能区中的位置:其选项卡、按钮或面板下拉菜单中的行。从搜索启动的命令会在那里闪烁,从下拉菜单运行的命令会标记其面板。",
|
||||
"prefs.right_click": "右键单击",
|
||||
"prefs.saving": "自动保存和恢复",
|
||||
"prefs.scale_note": "也可在窗口中使用 Ctrl + / Ctrl −。100% 时按钮高度为 28 像素。",
|
||||
@@ -1896,18 +2016,29 @@
|
||||
"prefs.search_empty": "没有匹配的设置",
|
||||
"prefs.select": "选择",
|
||||
"prefs.select_one_item": "选择一个项目",
|
||||
"prefs.select_other_hidden": "使用“选择其他”选择隐藏几何体",
|
||||
"prefs.select_other_hidden_help": "开启:包括指针附近的隐藏实体、草图和被遮挡的边。关闭:恢复原来的列表,仅包含指针正下方的可见几何体。",
|
||||
"prefs.selecting": "选择",
|
||||
"prefs.shift": "Shift",
|
||||
"prefs.shift_add_ctrl_toggle": "Shift 仅添加;Ctrl / Cmd 切换选择",
|
||||
"prefs.shift_add_note": "开启:Shift 添加,Ctrl / Cmd 切换选择。关闭(默认):两者均切换选择。",
|
||||
"prefs.shortcuts": "快捷键",
|
||||
"prefs.single_surface_analysis": "仅使用一个曲面分析",
|
||||
"prefs.single_surface_analysis_help": "关闭时,曲面着色分析和连续性分析可以同时保持启用。开启时,仅保留最后启动或修改的分析。",
|
||||
"prefs.sketch_align_points": "绘制时与其他草图点对齐",
|
||||
"prefs.sketch_align_points_note": "绘制时,点可同时与一个草图点水平对齐、与另一个草图点竖直对齐,并显示虚线参考线;单击后保留两个对齐约束。关闭:仅与上一点对齐,每次一个方向。",
|
||||
"prefs.sketch_conflict_colour": "以冲突颜色显示冲突的几何图形",
|
||||
"prefs.sketch_conflict_colour_note": "草图约束冲突时,不仅失败约束的符号或尺寸,该约束所约束的曲线和点也以冲突颜色绘制。关闭:它们保持平常的颜色。",
|
||||
"prefs.sketch_construction_lines": "扩展构造直线工具",
|
||||
"prefs.sketch_exit_view": "草图结束时的视图",
|
||||
"prefs.sketch_exit_view.keep": "保持当前视图",
|
||||
"prefs.sketch_exit_view.previous": "返回之前的视图",
|
||||
"prefs.sketch_exit_view.unless_rotated": "未旋转时返回",
|
||||
"prefs.sketch_exit_view_note": "“完成草图”、取消或连按两次 Esc 后视图的去向。",
|
||||
"prefs.sketch_open_look_at": "打开草图时转向正对草图",
|
||||
"prefs.sketch_open_look_at_note": "关闭:创建或编辑草图时视图保持不变。需要时用“朝向”正对草图。",
|
||||
"prefs.sketch_recent_snap": "自动吸附到最近的圆心和中点",
|
||||
"prefs.sketch_recent_snap_note": "绘图时,将光标吸附到最近两个圆心或直线边中点的辅助线相交处。关闭:辅助线仅作显示,光标不会移动。",
|
||||
"prefs.sketch_selection": "草图与选择",
|
||||
"prefs.sketch_selection_heading": "草图和选择",
|
||||
"prefs.sketch_selection_note": "草图如何捕捉,以及单击如何选择。",
|
||||
@@ -1952,23 +2083,47 @@
|
||||
"prefs.toast_place": "通知",
|
||||
"prefs.toggle_item": "添加项目,或取消选择",
|
||||
"prefs.toolbar": "工具栏",
|
||||
"prefs.toolbar_tabs": "工具栏选项卡",
|
||||
"prefs.top": "顶部",
|
||||
"prefs.trackpad_zoom_modifier": "按住以下按键时用双指滚动缩放",
|
||||
"prefs.trackpad_zoom_modifier.alt": "⌥ / Alt",
|
||||
"prefs.trackpad_zoom_modifier.cmd": "⌘",
|
||||
"prefs.trackpad_zoom_modifier.ctrl": "Ctrl",
|
||||
"prefs.trackpad_zoom_modifier.help": "仅按住此键并垂直滚动,即可以指针位置为中心缩放。关闭时保留现有滚动行为。",
|
||||
"prefs.trackpad_zoom_modifier.off": "关闭",
|
||||
"prefs.translucent": "半透明",
|
||||
"prefs.under_browser": "浏览器下方",
|
||||
"prefs.under_cursor": "光标下方",
|
||||
"prefs.units_precision": "单位与精度",
|
||||
"prefs.updates": "更新",
|
||||
"prefs.value_boxes_in_view": "在视图中于手柄旁显示数值",
|
||||
"prefs.value_boxes_in_view_tip": "命令的数值(距离、半径等)显示在模型上方手柄旁的框中。关闭后,在命令窗口中输入数值,选取后键盘输入会进入该窗口,模型不会被遮挡。",
|
||||
"prefs.view": "视图行为",
|
||||
"prefs.view_confirm_corner": "在视图角落显示确定和取消",
|
||||
"prefs.view_confirm_corner_note": "打开对话框或草图时,视图右上角的勾号和叉号与对话框的确定和取消作用相同,或完成和取消草图。视图导航器会下移到它们下方。",
|
||||
"prefs.viewport": "视口",
|
||||
"prefs.viewport_analysis_status": "显示视口分析状态",
|
||||
"prefs.viewport_analysis_status_help": "在视口上方显示启用的分析,从各项目打开图例,并按 Esc 关闭最近启用的分析。关闭此选项可恢复角落图例和原来的 Esc 行为。",
|
||||
"prefs.viewport_background": "背景",
|
||||
"prefs.viewport_background_colour": "颜色",
|
||||
"prefs.viewport_background_theme": "主题渐变",
|
||||
"prefs.viewport_section_status": "显示视口剖面状态",
|
||||
"prefs.viewport_section_status_help": "在视口中显示剖面设置。按 Escape 或单击活动的功能区按钮可关闭剖面。禁用以保留原有剖面控件。",
|
||||
"prefs.viewport_status_summary": "汇总视口状态项",
|
||||
"prefs.viewport_status_summary_help": "将三个或更多视口状态项折叠为一个汇总徽章。禁用后,所有项目仍显示在完整的一行中。",
|
||||
"prefs.wheel": "滚轮",
|
||||
"prefs.wheel_trackpad": "滚轮与触控板",
|
||||
"prefs.workspace": "工作区",
|
||||
"prefs.zoom_stop_at_model": "缩放到模型表面时停止",
|
||||
"prefs.zoom_stop_at_model_tip": "3D 鼠标和设备应用向视图中央的表面缩放;拖动缩放固定拖动开始时的点。关闭后可穿过模型。滚轮和捏合手势单独使用向光标缩放设置",
|
||||
"prefs.zoom_toward_cursor": "朝光标缩放",
|
||||
"properties.title": "属性:{name}",
|
||||
"recovery.days_ago": "{count} 天前",
|
||||
"recovery.detail": "{file} · {features} 个特征 · 自动保存于 {when}",
|
||||
"recovery.discard_all": "全部放弃",
|
||||
"recovery.discard_all_detail": "此操作无法撤消。",
|
||||
"recovery.discard_all_title": "放弃 {count} 个自动保存?",
|
||||
"recovery.discard_all_title_one": "放弃 1 个自动保存?",
|
||||
"recovery.hours_ago": "{count} 小时前",
|
||||
"recovery.just_now": "刚刚",
|
||||
"recovery.min_ago": "{count} 分钟前",
|
||||
@@ -2834,7 +2989,9 @@
|
||||
"render.output_ready": "已就绪,可渲染",
|
||||
"render.output_run_check": "运行检查",
|
||||
"render.output_size_limit": "{method}:每边最多 {dimension} px,总计 {pixels} 像素。可用的最大尺寸:{width} × {height}。",
|
||||
"render.output_size_method_profile": "要渲染 {width} × {height},请选择 {method} 和“{profile}”CPU 资源配置,或选择更小的尺寸。",
|
||||
"render.output_size_ok": "尺寸正常 · {width} × {height} px",
|
||||
"render.output_size_profile": "要渲染 {width} × {height},请选择“{profile}”CPU 资源配置,或选择更小的尺寸。",
|
||||
"render.output_swap_orientation": "交换宽度和高度",
|
||||
"render.output_tools_inspector": "请在输出检查器中编辑尺寸和格式。",
|
||||
"render.output_view_image": "查看图像",
|
||||
@@ -3047,6 +3204,7 @@
|
||||
"render.size_custom": "自定义…",
|
||||
"render.size_full_hd": "全高清",
|
||||
"render.size_hd": "HD",
|
||||
"render.size_needs_profile": "{size} · 需要“{profile}”",
|
||||
"render.size_presets": "尺寸预设",
|
||||
"render.size_presets_pending": "随输出编辑器推出",
|
||||
"render.size_preview": "预览",
|
||||
@@ -3296,6 +3454,7 @@
|
||||
"select an axis": "请选择一个轴",
|
||||
"select an axis, a straight or circular edge, or a cylinder, cone or torus face first": "请先选择轴、直边或圆边,或圆柱面、圆锥面或圆环面",
|
||||
"select bodies first": "请先选择实体",
|
||||
"select components first": "请先选择组件",
|
||||
"select corner points, or the two lines of one corner": "请选择角点,或同一个角的两条直线",
|
||||
"select one corner point, or the two lines of one corner": "请选择一个角点,或同一个角的两条直线",
|
||||
"select sheet edges first": "请先选择钣金边",
|
||||
@@ -3314,6 +3473,7 @@
|
||||
"settings.double_click_components": "双击组件以激活它,或在原位编辑链接组件",
|
||||
"settings.frame_rate_details_note": "添加最近各帧耗时的图表(叠加绘制的三角形数)、帧耗时直方图以及 GPU 绘制的内容。点击视图中的帧率可显示或隐藏。",
|
||||
"settings.frame_rate_note": "在视图右下角显示每秒帧数。",
|
||||
"settings.insert_lists_open_designs": "插入设计时先列出其他标签页中打开的设计",
|
||||
"settings.measure_axis_distances": "显示 X/Y/Z 距离",
|
||||
"settings.measure_axis_distances_help": "测量对话框打开时,在总距离之外显示沿世界坐标轴方向的尺寸线和距离。",
|
||||
"settings.msaa_applies_on_restart": "抗锯齿将在下次启动 SolidCraft 时生效",
|
||||
@@ -3332,12 +3492,34 @@
|
||||
"sheet.flange_type_contour": "轮廓",
|
||||
"sheet.flange_type_edge": "边线",
|
||||
"sheet.no_body": "没有钣金实体:请使用法兰 > Base 创建,或使用转换为钣金将板材转换为钣金(选择其较大的平面)。",
|
||||
"sheet.personal_rules.confirm_delete": "确认删除",
|
||||
"sheet.personal_rules.delete": "删除",
|
||||
"sheet.personal_rules.delete_prompt": "删除此个人规则?设计中已有的规则不会改变。",
|
||||
"sheet.personal_rules.full": "个人库中已有64条规则。",
|
||||
"sheet.personal_rules.invalid_name": "请输入不含换行符或控制字符的简短名称。",
|
||||
"sheet.personal_rules.invalid_values": "请填写完整的规则值:每个值都必须能在此设计中计算,厚度为正,K 因子在 0 到 1 之间。",
|
||||
"sheet.personal_rules.missing": "所选个人规则已不可用。",
|
||||
"sheet.personal_rules.name": "规则名称",
|
||||
"sheet.personal_rules.name_exists": "同名个人规则已存在,请使用其他名称。",
|
||||
"sheet.personal_rules.name_hint": "唯一名称",
|
||||
"sheet.personal_rules.overwrite": "保存对所选个人规则的修改",
|
||||
"sheet.personal_rules.rename": "重命名",
|
||||
"sheet.personal_rules.rule": "个人规则",
|
||||
"sheet.personal_rules.save": "另存为新规则",
|
||||
"sheet.personal_rules.scope": "保存在您的配置中,适用于所有设计。",
|
||||
"sheet.personal_rules.select": "选择规则",
|
||||
"sheet.personal_rules.title": "个人规则",
|
||||
"sheet.personal_rules.unsupported": "此规则包含当前版本无法使用的值。",
|
||||
"shortcut.json_error": "参数必须采用 JSON 格式:{error}",
|
||||
"shortcut.no_command": "没有命令 `{id}`;JSON 前的文本必须是命令 ID",
|
||||
"shortcut.pin": "固定到 S 框顶部",
|
||||
"shortcut.unpin": "取消固定",
|
||||
"sketch is missing": "草图不存在",
|
||||
"sketch.degrees_of_freedom": "{count} 个自由度",
|
||||
"sketch.dimension_added_driven": "草图已确定该尺寸,因此已将其添加为被驱动(参考)尺寸",
|
||||
"sketch.dimension_applied": "已应用尺寸",
|
||||
"sketch.dimension_applied_defined": "已应用尺寸;已定义参数 `{name}`",
|
||||
"sketch.dimension_applied_renamed": "已应用尺寸;参数已命名为 `{name}`",
|
||||
"sketch.dof_left": "剩余 {count} 个自由度",
|
||||
"sketch.dof_left_one": "剩余 {count} 个自由度",
|
||||
"sketch.draw_curves": "绘制为 {linetype}",
|
||||
@@ -3364,6 +3546,7 @@
|
||||
"sketch_text.align_right": "右对齐",
|
||||
"sketch_text.bold": "粗体",
|
||||
"sketch_text.builtin_font": "{family}(内置)",
|
||||
"sketch_text.formula": "以 = 开头即可用参数组成文字:='W' + number(Width)",
|
||||
"sketch_text.italic": "斜体",
|
||||
"sketch_text.loading_fonts": "正在查找已安装字体…",
|
||||
"sketch_text.on_path": "文字沿路径排列:由曲线放置",
|
||||
@@ -3372,6 +3555,8 @@
|
||||
"sketch_text.use_font_file": "使用字体文件 {path}",
|
||||
"solid": "实心",
|
||||
"status.editing": "正在编辑 {name}",
|
||||
"status.navigation": "鼠标映射:{mapping}",
|
||||
"status.navigation_tip": "鼠标移动视图的方式。单击可选择其他映射",
|
||||
"status.under_constrained": "欠约束({count} 个自由度)",
|
||||
"status.under_constrained_one": "欠约束({count} 个自由度)",
|
||||
"status.units_tip": "设计的单位。单击可更改",
|
||||
@@ -3405,8 +3590,10 @@
|
||||
"timeline.delete_folders_tip": "在历史记录中保留其中的特征和嵌套文件夹",
|
||||
"timeline.delete_folders_with_features_tip": "删除文件夹及其中的所有特征和嵌套文件夹",
|
||||
"timeline.delete_many": "删除所选的 {count} 个特征",
|
||||
"timeline.edited_rolled_back": "{name} 已更改,但它位于历史标记之后,因此未构建:将标记移到其后即可查看结果",
|
||||
"timeline.feature_error": "错误:{message}",
|
||||
"timeline.feature_hint": "双击编辑 · 拖动以重新排序 · 右键查看更多操作",
|
||||
"timeline.feature_rolled_back": "已回退:位于历史标记之后,因此未构建",
|
||||
"timeline.feature_warning": "警告:{message}",
|
||||
"timeline.group": "新建特征文件夹",
|
||||
"timeline.move_many": "移动时间线项目",
|
||||
@@ -3488,6 +3675,10 @@
|
||||
"ui.3d_mouse_offer": "校准 3D 鼠标可以修正互换或反向的轴,并调整它的速度和手感。",
|
||||
"ui.3d_mouse_offer_never": "不再显示",
|
||||
"ui.3d_mouse_offer_swap": "切换到 Hidraw(直接驱动)",
|
||||
"ui.3d_mouse_orbit": "环绕",
|
||||
"ui.3d_mouse_orbit_classic": "经典",
|
||||
"ui.3d_mouse_orbit_tip": "追踪:3D 鼠标围绕开始旋转时视图中间的模型部分旋转视图,并用一个淡色小球标出该点。经典:围绕视图中心旋转",
|
||||
"ui.3d_mouse_orbit_traced": "追踪",
|
||||
"ui.3d_mouse_reading": "读数",
|
||||
"ui.3d_mouse_reset_axes": "重置轴分配",
|
||||
"ui.3d_mouse_reset_view": "重置视图",
|
||||
@@ -3496,6 +3687,8 @@
|
||||
"ui.3d_mouse_section": "3D 鼠标",
|
||||
"ui.3d_mouse_show_in_view": "在 3D 视图中显示 3D 鼠标",
|
||||
"ui.3d_mouse_show_in_view_tip": "在左下角显示你的 3D 鼠标图示,随你的操作而动。",
|
||||
"ui.3d_mouse_sketch_orbit": "用 3D 鼠标旋转草图",
|
||||
"ui.3d_mouse_sketch_orbit_tip": "草图打开并正对视图时,3D 鼠标也能旋转视图,与鼠标一样。关闭:在你倾斜视图之前,只平移和缩放草图。",
|
||||
"ui.3d_mouse_skip": "我的设备做不到",
|
||||
"ui.3d_mouse_skip_tip": "在两个方向上都跳过这个动作,校准时不包含它。",
|
||||
"ui.3d_mouse_speed": "3D 鼠标速度",
|
||||
@@ -3524,6 +3717,8 @@
|
||||
"ui.3d_mouse_step_twist_counterclockwise": "逆时针扭转摇杆帽,保持住,然后松开。",
|
||||
"ui.3d_mouse_switch_cap": "按回中类型校准",
|
||||
"ui.3d_mouse_switch_trackball": "按轨迹球校准",
|
||||
"ui.3d_mouse_use_direct": "使用直接驱动",
|
||||
"ui.3d_mouse_use_direct_tip": "直接读取 3D 鼠标(hidraw),不经过 spacenavd。",
|
||||
"ui.3d_mouse_view_axis": "视图轴",
|
||||
"ui.3d_mouse_view_off": "关闭",
|
||||
"ui.3d_mouse_view_off_tip": "3D 鼠标驱动程序的配置文件关闭了此轴,因此它的动作不会移动视图。在此选择另一个轴的动作会将两者互换,该动作将不再移动视图。",
|
||||
@@ -3657,6 +3852,8 @@
|
||||
"ui.agent_chat_remove": "从队列中移除",
|
||||
"ui.agent_chat_remove_file": "从这条消息中移除",
|
||||
"ui.agent_chat_remove_imported": "从这条消息中移除;零件仍保留在设计中(撤销可将其删除)",
|
||||
"ui.agent_chat_reply_cut_off": "回复在完成前达到了长度上限,可能不完整。请让智能体继续,或请它回答得更简短。",
|
||||
"ui.agent_chat_reply_declined": "模型拒绝回答这条消息。",
|
||||
"ui.agent_chat_retry": "重试",
|
||||
"ui.agent_chat_right": "右侧",
|
||||
"ui.agent_chat_save": "保存",
|
||||
@@ -3840,6 +4037,7 @@
|
||||
"ui.circle": "圆",
|
||||
"ui.circular_pattern": "圆形阵列",
|
||||
"ui.clear": "清除",
|
||||
"ui.clear_print_face": "清除打印底面",
|
||||
"ui.clear_recent": "清除最近",
|
||||
"ui.clear_the_selection": "清除选择",
|
||||
"ui.click_selects_whole_bodies": "单击选择整个实体",
|
||||
@@ -3874,6 +4072,15 @@
|
||||
"ui.constant": "恒定",
|
||||
"ui.constraints_conflict": "约束冲突",
|
||||
"ui.construction": "构造",
|
||||
"ui.construction.angle_hint": "构造直线:单击一点,然后输入角度或选择方向",
|
||||
"ui.construction.bisector_hint": "角平分线:选择两条相交直线,再选择所需解",
|
||||
"ui.construction.common_hint": "公切线:选择两个圆/圆弧,再选择所需解",
|
||||
"ui.construction.contact_hint": "切线:先选圆/圆弧或开放样条曲线/圆锥曲线,再选接点(自由曲线仅支持端点)",
|
||||
"ui.construction.external_hint": "切线:依次选择圆或圆弧、外部点和所需解",
|
||||
"ui.construction.free_hint": "构造直线:单击两点;右键单击重新开始",
|
||||
"ui.construction.point_hint": "构造直线:单击要经过的点",
|
||||
"ui.construction.reference_hint": "构造直线:先选直线,再选一点;右键单击更换参照",
|
||||
"ui.construction.ribbon_label": "辅助线",
|
||||
"ui.context_menu": "上下文菜单",
|
||||
"ui.continuity_g0": "G0 折痕",
|
||||
"ui.continuity_g1": "G1 相切",
|
||||
@@ -3965,6 +4172,14 @@
|
||||
"ui.end_scale": "末端缩放",
|
||||
"ui.entities": "实体",
|
||||
"ui.equal": "相等",
|
||||
"ui.equation_end": "结束",
|
||||
"ui.equation_explicit": "显式",
|
||||
"ui.equation_form": "形式",
|
||||
"ui.equation_note": "变量是不带单位的数:sin(t) 按弧度计算。不带单位的结果采用设计的单位。",
|
||||
"ui.equation_parametric": "参数式",
|
||||
"ui.equation_x_of_t": "x(t)",
|
||||
"ui.equation_y_of_t": "y(t)",
|
||||
"ui.equation_y_of_x": "y(x)",
|
||||
"ui.equivalent_radius": "等效半径",
|
||||
"ui.expand": "展开",
|
||||
"ui.exportDxf": "导出 DXF…",
|
||||
@@ -4030,6 +4245,7 @@
|
||||
"ui.heading_design": "设计",
|
||||
"ui.heading_draft": "拔模",
|
||||
"ui.heading_edit": "编辑",
|
||||
"ui.heading_equation_curve": "方程曲线",
|
||||
"ui.heading_extrude": "拉伸",
|
||||
"ui.heading_fillet": "圆角",
|
||||
"ui.heading_finish_editing": "完成编辑",
|
||||
@@ -4121,6 +4337,10 @@
|
||||
"ui.import_ellipsis": "导入…",
|
||||
"ui.infinite": "无限",
|
||||
"ui.insert": "插入",
|
||||
"ui.insert_design.browse": "浏览…",
|
||||
"ui.insert_design.open_designs": "已打开的设计",
|
||||
"ui.insert_design.saved_file": "{name} 有未保存的更改,因此插入的是其已保存的文件。请先保存,再使用“更新链接”导入这些更改。",
|
||||
"ui.insert_design.unsaved": "未保存的更改",
|
||||
"ui.inspect": "检查",
|
||||
"ui.intersect": "相交",
|
||||
"ui.isolate": "隔离",
|
||||
@@ -4220,6 +4440,7 @@
|
||||
"ui.pan_zoom_orbit": "平移、缩放、环绕",
|
||||
"ui.parallel": "平行",
|
||||
"ui.parameters": "参数",
|
||||
"ui.part_size_needs_a_part": "请选择已插入的标准零件(螺钉、螺母、垫圈或销)以更改其尺寸。要放大或缩小实体,请使用缩放。",
|
||||
"ui.part_size_shared": "重新生成零件并替换额外添加的特征。此零部件的所有实例都会更新。",
|
||||
"ui.paste": "粘贴",
|
||||
"ui.path": "路径",
|
||||
@@ -4249,12 +4470,17 @@
|
||||
"ui.plugins_skipped": "有 {count} 个文件夹无法读取。",
|
||||
"ui.plugins_version": "{version}",
|
||||
"ui.point": "点",
|
||||
"ui.point_cloud_add_filter": "添加筛选…",
|
||||
"ui.point_cloud_auto_range": "自动范围",
|
||||
"ui.point_cloud_color_by": "着色方式",
|
||||
"ui.point_cloud_file_colors": "文件颜色",
|
||||
"ui.point_cloud_filter_by": "筛选依据",
|
||||
"ui.point_cloud_height_high": "最高高度",
|
||||
"ui.point_cloud_height_low": "最低高度",
|
||||
"ui.point_cloud_legend_filter": "在上方图例中显示或隐藏",
|
||||
"ui.point_cloud_no_file_colors": "文件中没有颜色",
|
||||
"ui.point_cloud_pause": "暂停",
|
||||
"ui.point_cloud_play": "播放",
|
||||
"ui.point_cloud_single_color": "单色",
|
||||
"ui.point_cloud_size": "点大小",
|
||||
"ui.point_cloud_units": "文件单位",
|
||||
@@ -4263,12 +4489,29 @@
|
||||
"ui.polygon": "多边形",
|
||||
"ui.preferences": "首选项",
|
||||
"ui.press_a_key": "按一个键…",
|
||||
"ui.print_face_cleared": "{body}:已清除打印底面",
|
||||
"ui.print_face_input": "打印底面",
|
||||
"ui.print_face_one_body": "打印底面属于单个实体:请单独发送该实体以更改它",
|
||||
"ui.print_face_pick": "选择实体的一个平面,将其设为打印底面",
|
||||
"ui.print_face_set": "{body}:已设置打印底面;发送到切片软件时实体将放在此面上",
|
||||
"ui.profile": "轮廓",
|
||||
"ui.profile_plane": "轮廓平面",
|
||||
"ui.profiles": "轮廓",
|
||||
"ui.project": "投影",
|
||||
"ui.project_face_edges_sketch": "将面的边投影到新草图",
|
||||
"ui.properties": "属性",
|
||||
"ui.properties.copy_matrix": "复制矩阵",
|
||||
"ui.properties.first_moments": "一阶矩",
|
||||
"ui.properties.inertia": "转动惯量",
|
||||
"ui.properties.inertia_note": "相对质心,世界坐标轴 (g·{unit}²)",
|
||||
"ui.properties.inertia_unavailable": "不可用:某个实体的网格未闭合。",
|
||||
"ui.properties.inertia_x": "Ixx, Ixy, Ixz",
|
||||
"ui.properties.inertia_y": "Iyx, Iyy, Iyz",
|
||||
"ui.properties.inertia_z": "Izx, Izy, Izz",
|
||||
"ui.properties.measuring": "正在测量…",
|
||||
"ui.properties.measuring_failed": "测量在完成前已停止。",
|
||||
"ui.properties.principal_axis": "主轴 {number}",
|
||||
"ui.properties.principal_moments": "主惯性矩",
|
||||
"ui.pull_direction": "拔模方向",
|
||||
"ui.quality": "质量",
|
||||
"ui.quantity": "数量",
|
||||
@@ -4314,6 +4557,7 @@
|
||||
"ui.revolve": "旋转",
|
||||
"ui.ribbon_exit": "退出",
|
||||
"ui.ribbon_labels": "显示功能区图标下的文字",
|
||||
"ui.ribbon_menus_skip_pinned": "下拉菜单中不再列出已固定的命令",
|
||||
"ui.ribbon_pin_footer": "固定的命令显示在功能区中。将指针悬停在行上可固定或取消固定。",
|
||||
"ui.ribbon_workspace": "工作区",
|
||||
"ui.right": "右视",
|
||||
@@ -4331,6 +4575,8 @@
|
||||
"ui.select": "选择",
|
||||
"ui.selectOther": "选择其他…",
|
||||
"ui.selectTangentChain": "选择相切链",
|
||||
"ui.select_all": "全选",
|
||||
"ui.select_components_by_face": "选择组件(单击面即选择其所属组件)",
|
||||
"ui.selection": "选择",
|
||||
"ui.selection_modifiers": "选择修饰键",
|
||||
"ui.selection_shift_add_only": "Shift+点击仅添加、不取消选择",
|
||||
@@ -4367,7 +4613,16 @@
|
||||
"ui.sketch": "草图",
|
||||
"ui.sketch_dimension": "草图尺寸",
|
||||
"ui.sketch_grid": "草图网格",
|
||||
"ui.sketch_intersect_geometry": "几何体",
|
||||
"ui.sketch_intersect_projection_link": "投影链接",
|
||||
"ui.sketch_intersect_selection_filter": "选择过滤器",
|
||||
"ui.sketch_modifiers": "草图修饰键",
|
||||
"ui.sketch_project_geometry": "几何体",
|
||||
"ui.sketch_report.all_constrained": "全部已完全约束。",
|
||||
"ui.sketch_report.dof": "自由度",
|
||||
"ui.sketch_report.loose": "未完全约束",
|
||||
"ui.sketch_report.status": "状态",
|
||||
"ui.sketch_report.title": "草图报告",
|
||||
"ui.sketch_scale": "草图比例",
|
||||
"ui.sketches": "草图",
|
||||
"ui.slice": "切片",
|
||||
@@ -4414,6 +4669,11 @@
|
||||
"ui.symmetric": "对称",
|
||||
"ui.symmetry": "对称",
|
||||
"ui.system": "系统",
|
||||
"ui.tab_assemble": "装配",
|
||||
"ui.tab_manage": "管理",
|
||||
"ui.tab_sheet_metal": "钣金",
|
||||
"ui.tab_view": "视图",
|
||||
"ui.tab_weldments": "焊件",
|
||||
"ui.tangent": "相切",
|
||||
"ui.taper_angle": "锥角",
|
||||
"ui.tapped": "攻丝",
|
||||
@@ -4429,6 +4689,7 @@
|
||||
"ui.tip_angle": "尖端角度",
|
||||
"ui.to_object": "到对象",
|
||||
"ui.tool_direction": "刀具方向",
|
||||
"ui.toolbar_tabs_hidden": "所有工具栏选项卡均已隐藏。点击 + 或在此处右键单击即可显示。",
|
||||
"ui.top": "上视",
|
||||
"ui.top_diameter": "顶部直径",
|
||||
"ui.top_radius": "顶部半径",
|
||||
@@ -4466,15 +4727,25 @@
|
||||
"ui.view_centre": "视图中心",
|
||||
"ui.viewport_status_clear": "关闭{name}",
|
||||
"ui.viewport_status_clear_hint": "关闭{name} · Esc",
|
||||
"ui.viewport_status_edges": "{count} 条边",
|
||||
"ui.viewport_status_from": "从 {direction}",
|
||||
"ui.viewport_status_key": "显示{name}的图例",
|
||||
"ui.viewport_status_minimum_radius": "最小半径",
|
||||
"ui.viewport_status_pairs": "{count} 对",
|
||||
"ui.viewport_status_section_hatch": "{setting} · 填充线",
|
||||
"ui.viewport_status_section_plane": "当前平面",
|
||||
"ui.viewport_status_section_tilted": "倾斜 · {offset}",
|
||||
"ui.viewport_status_stripes": "{count} 条条纹",
|
||||
"ui.viewport_status_summary_clear": "全部关闭",
|
||||
"ui.viewport_status_summary_heading": "此视图中",
|
||||
"ui.viewport_status_summary_label": "{name} 和其他 {count} 项",
|
||||
"ui.viewport_status_summary_more": "+{count}",
|
||||
"ui.viewport_theme_follow": "跟随主题",
|
||||
"ui.visual_shaded_hidden_edges": "带隐藏边的着色",
|
||||
"ui.visual_shaded_with_edges": "带边着色",
|
||||
"ui.visual_style": "视觉样式",
|
||||
"ui.visual_wireframe": "线框",
|
||||
"ui.wheel_zoom_speed": "鼠标滚轮缩放速度",
|
||||
"ui.width": "宽度",
|
||||
"ui.window_system": "窗口系统",
|
||||
"ui.window_system_auto": "自动",
|
||||
@@ -4505,7 +4776,9 @@
|
||||
"update.button": "更新",
|
||||
"update.button_version": "更新到 {version}",
|
||||
"update.check_automatically": "自动检查更新",
|
||||
"update.check_for_updates": "检查更新",
|
||||
"update.check_now": "立即检查",
|
||||
"update.check_unavailable": "此安装版本无法检查更新。",
|
||||
"update.checking": "正在检查…",
|
||||
"update.copy": "复制",
|
||||
"update.dmg_opened": "磁盘映像已校验并打开:将 SolidCraft 拖到“应用程序”替换旧版本,然后重启 SolidCraft。",
|
||||
@@ -4528,6 +4801,9 @@
|
||||
"update.prefs_managed": "这是由 {manager} 管理的 SolidCraft {version}。检查时只向 GitHub 询问最新版本,不会发送其他任何内容;请在 {manager} 中更新 SolidCraft。",
|
||||
"update.prefs_note": "当前为 SolidCraft {version}({kind})。检查时只向 GitHub 查询最新版本,不发送其他任何数据。",
|
||||
"update.prefs_web": "重新加载页面以获取最新的网页应用。如果网络不可用或更新无法及时下载完成,则打开已保存的版本;正在进行的下载会继续,供下次重新加载时使用。",
|
||||
"update.refresh_checking": "正在检查最新版本…",
|
||||
"update.refresh_fallback": "无法检查更新的版本;将更新至先前找到的 {version}。",
|
||||
"update.refresh_selected": "正在更新至 {version}。",
|
||||
"update.release_page": "打开发布页面",
|
||||
"update.restart": "立即重启",
|
||||
"update.restart_later": "稍后",
|
||||
|
||||
@@ -243,6 +243,44 @@ fn pushed(z: f32) -> f32 {
|
||||
return clamp(z - select(-push, push, reversed()), 0.0, 1.0);
|
||||
}
|
||||
|
||||
/// A far wall seen through the cut where another body's face lying on it was drawn in front of
|
||||
/// it (a shaft in its bore, #9407): its cap colour again, at its depth pulled toward the eye by
|
||||
/// `touch_depth`, so it wins over that face, which is faceted another way.
|
||||
@fragment
|
||||
fn fs_solid_touch(i: TOut, @builtin(front_facing) front: bool) -> CutOut {
|
||||
var o: CutOut;
|
||||
// Derivatives (in `touch_depth`) first, before `solid` may discard.
|
||||
o.depth = touch_depth(i.wp, i.pos.z);
|
||||
o.c = solid(i, front);
|
||||
return o;
|
||||
}
|
||||
|
||||
@fragment
|
||||
fn fs_solid_touch_flat(i: FOut, @builtin(front_facing) front: bool) -> CutOut {
|
||||
let t = flat_fragment(i, front);
|
||||
var o: CutOut;
|
||||
o.depth = touch_depth(t.wp, t.pos.z);
|
||||
o.c = solid(t, front);
|
||||
return o;
|
||||
}
|
||||
|
||||
/// The depth of `wp` (depth `z`) pulled toward the eye by what may part two faceted copies of
|
||||
/// one surface: 3 pixels' width along the view ray (display refinement keeps a facet's sag about
|
||||
/// a pixel) and 2 pixels of the face's own depth slope (more where it turns from the eye).
|
||||
fn touch_depth(wp: vec3<f32>, z: f32) -> f32 {
|
||||
let px = min(length(dpdx(wp)), length(dpdy(wp)));
|
||||
let slope = max(abs(dpdx(z)), abs(dpdy(z)));
|
||||
var dir = -u.back.xyz;
|
||||
if (u.eye.w > 0.5) { dir = wp - u.eye.xyz; }
|
||||
let len = length(dir);
|
||||
if (len < 1e-12) { return z; }
|
||||
let c = u.vp * vec4<f32>(wp - dir * (3.0 * px / len), 1.0);
|
||||
if (c.w <= 0.0) { return z; }
|
||||
let pulled = c.z / c.w;
|
||||
if (reversed()) { return clamp(max(pulled, z) + 2.0 * slope, 0.0, 1.0); }
|
||||
return clamp(min(pulled, z) - 2.0 * slope, 0.0, 1.0);
|
||||
}
|
||||
|
||||
/// Depth of the section plane on the view ray through `wp` (a far wall seen through the cut),
|
||||
/// never behind the wall itself (`z`).
|
||||
fn cap_depth(wp: vec3<f32>, z: f32) -> f32 {
|
||||
@@ -697,38 +735,96 @@ fn fs_line_all(i: LOut) -> @location(0) vec4<f32> {
|
||||
return out_color(i.c);
|
||||
}
|
||||
|
||||
// Point clouds: each point is a round dot a few pixels across, facing the screen, depth-tested
|
||||
// and written like the model's faces, so the model hides the points behind it and they hide it.
|
||||
// The colour's alpha carries the dot's size (eighths of a pixel).
|
||||
// Point clouds (`view/clouds.rs`): each point is a round dot a few pixels across, facing the
|
||||
// screen, depth-tested and written like the model's faces, so the model hides the points behind
|
||||
// it and they hide it. The cloud's style colours them by their own colour, a ramp or a palette,
|
||||
// and shows only those whose filtered values lie in its ranges or sets.
|
||||
|
||||
struct POut {
|
||||
struct Cloud {
|
||||
style: vec4<f32>, // x: colour (0 own, 1 ramp, 2 palette), y: dot size (px), z, w: ramp range
|
||||
filters: array<vec4<f32>, 4>, // x: kind (0 off, 1 range y…z, 2 whole values y + i for the bits i of w)
|
||||
};
|
||||
@group(1) @binding(3) var<uniform> cloud: Cloud;
|
||||
|
||||
struct CIn {
|
||||
@location(0) p: vec3<f32>,
|
||||
@location(1) v: f32,
|
||||
@location(2) f: vec4<f32>,
|
||||
@location(3) rgb: vec4<f32>,
|
||||
};
|
||||
|
||||
struct COut {
|
||||
@builtin(position) pos: vec4<f32>,
|
||||
@location(0) c: vec4<f32>,
|
||||
@location(1) wp: vec3<f32>,
|
||||
@location(2) at: vec2<f32>,
|
||||
@location(0) wp: vec3<f32>,
|
||||
@location(1) v: f32,
|
||||
@location(2) f: vec4<f32>,
|
||||
@location(3) rgb: vec3<f32>,
|
||||
@location(4) at: vec2<f32>, // the place on its disc
|
||||
@location(5) @interpolate(flat) has: u32,
|
||||
};
|
||||
|
||||
@vertex
|
||||
fn vs_point(@builtin(vertex_index) vi: u32, @location(0) p: vec3<f32>, @location(1) c: vec4<f32>) -> POut {
|
||||
fn vs_cloud_dot(@builtin(vertex_index) vi: u32, i: CIn) -> COut {
|
||||
var xs = array<f32, 6>(-1.0, 1.0, 1.0, -1.0, 1.0, -1.0);
|
||||
var ys = array<f32, 6>(-1.0, -1.0, 1.0, -1.0, 1.0, 1.0);
|
||||
let at = vec2<f32>(xs[vi], ys[vi]);
|
||||
let size = max(c.a * 255.0 / 8.0, 1.0);
|
||||
let centre = u.vp * vec4<f32>(p, 1.0);
|
||||
let half = u.screen.xy * 0.5;
|
||||
var o: POut;
|
||||
o.pos = vec4<f32>(centre.xy + at * size * 0.5 / half * centre.w, centre.z, centre.w);
|
||||
let size = max(cloud.style.y, 1.0);
|
||||
let centre = u.vp * vec4<f32>(i.p, 1.0);
|
||||
var o: COut;
|
||||
o.pos = vec4<f32>(centre.xy + at * size / u.screen.xy * centre.w, centre.z, centre.w);
|
||||
// Behind the eye: nothing.
|
||||
if (near_z(centre) < 0.0) { o.pos = vec4<f32>(0.0, 0.0, 0.0, -1.0); }
|
||||
o.c = vec4<f32>(c.rgb, 1.0);
|
||||
o.wp = p;
|
||||
o.wp = i.p;
|
||||
o.v = i.v;
|
||||
o.f = i.f;
|
||||
o.rgb = i.rgb.rgb;
|
||||
o.has = u32(round(i.rgb.a * 255.0));
|
||||
// Dots under two pixels are squares: a disc that small loses its centre pixel.
|
||||
o.at = at * select(1.0, 0.0, size < 2.0);
|
||||
return o;
|
||||
}
|
||||
|
||||
@fragment
|
||||
fn fs_point(i: POut) -> @location(0) vec4<f32> {
|
||||
if (clipped(i.wp) || dot(i.at, i.at) > 1.0) { discard; }
|
||||
return out_color(i.c);
|
||||
/// Whether filter `f` keeps the value `v`.
|
||||
fn cloud_keeps(f: vec4<f32>, v: f32) -> bool {
|
||||
if (f.x < 0.5) { return true; }
|
||||
if (f.x < 1.5) { return v >= f.y && v <= f.z; }
|
||||
let k = i32(round(v)) - i32(round(f.y));
|
||||
return k >= 0 && k < 32 && ((bitcast<u32>(f.w) >> u32(k)) & 1u) != 0u;
|
||||
}
|
||||
|
||||
fn cloud_ramp(t: f32) -> vec3<f32> {
|
||||
var stops = array<vec3<f32>, 5>(
|
||||
vec3<f32>(40.0, 70.0, 200.0), vec3<f32>(30.0, 170.0, 230.0), vec3<f32>(60.0, 200.0, 90.0),
|
||||
vec3<f32>(240.0, 220.0, 60.0), vec3<f32>(230.0, 70.0, 50.0));
|
||||
let k = clamp(t, 0.0, 1.0) * 4.0;
|
||||
let j = min(u32(k), 3u);
|
||||
return mix(stops[j], stops[j + 1u], k - f32(j)) / 255.0;
|
||||
}
|
||||
|
||||
fn cloud_palette(v: f32) -> vec3<f32> {
|
||||
var colours = array<vec3<f32>, 10>(
|
||||
vec3<f32>(240.0, 140.0, 40.0), vec3<f32>(245.0, 205.0, 65.0), vec3<f32>(230.0, 65.0, 65.0),
|
||||
vec3<f32>(165.0, 75.0, 190.0), vec3<f32>(65.0, 190.0, 115.0), vec3<f32>(75.0, 150.0, 220.0),
|
||||
vec3<f32>(240.0, 120.0, 180.0), vec3<f32>(140.0, 105.0, 75.0), vec3<f32>(120.0, 215.0, 215.0),
|
||||
vec3<f32>(190.0, 190.0, 80.0));
|
||||
if (v < -0.5) { return vec3<f32>(150.0, 160.0, 176.0) / 255.0; }
|
||||
return colours[u32(round(v)) % 10u] / 255.0;
|
||||
}
|
||||
|
||||
|
||||
@fragment
|
||||
fn fs_cloud(o: COut) -> @location(0) vec4<f32> {
|
||||
var out = clipped(o.wp) || dot(o.at, o.at) > 1.0;
|
||||
for (var k = 0u; k < 4u; k++) {
|
||||
out = out || (((o.has >> k) & 1u) != 0u && !cloud_keeps(cloud.filters[k], o.f[k]));
|
||||
}
|
||||
if (out) { discard; }
|
||||
var c = o.rgb;
|
||||
let mode = cloud.style.x;
|
||||
if ((o.has & 16u) != 0u && mode > 1.5) {
|
||||
c = cloud_palette(o.v);
|
||||
} else if ((o.has & 16u) != 0u && mode > 0.5) {
|
||||
c = cloud_ramp((o.v - cloud.style.z) / max(cloud.style.w - cloud.style.z, 1e-12));
|
||||
}
|
||||
return out_color(vec4<f32>(c, 1.0));
|
||||
}
|
||||
|
||||
@@ -175,6 +175,8 @@ impl Tokens {
|
||||
body: Color32::from_rgb(176, 186, 198),
|
||||
body_edge: Color32::from_rgb(40, 44, 52),
|
||||
manipulator: Color32::from_rgb(40, 110, 220),
|
||||
joint_manipulator: Color32::from_rgb(235, 157, 0),
|
||||
joint_axis: Color32::from_rgb(0, 95, 110),
|
||||
preview_add: Color32::from_rgb(112, 160, 226),
|
||||
preview_new: Color32::from_rgb(240, 225, 105),
|
||||
preview_sketch: Color32::from_rgb(32, 190, 96),
|
||||
@@ -352,6 +354,7 @@ impl Tokens {
|
||||
t.hover = Color32::from_rgb(54, 61, 74);
|
||||
t.hover_edge_halo = Color32::from_rgb(203, 203, 203);
|
||||
t.origin_point = Color32::from_rgb(214, 215, 218);
|
||||
t.joint_axis = Color32::from_rgb(110, 240, 250);
|
||||
t.viewport_top = Color32::from_rgb(46, 52, 64);
|
||||
t.viewport_bottom = Color32::from_rgb(46, 52, 64);
|
||||
t.grid = Color32::from_rgb(59, 65, 76);
|
||||
|
||||
@@ -93,6 +93,8 @@
|
||||
"icons.highlight": "#000000",
|
||||
"icons.marker_halo": "#000000",
|
||||
"interference": "#ffffff",
|
||||
"joint_axis": "#ffffff",
|
||||
"joint_manipulator": "#ffffff",
|
||||
"logo": [
|
||||
"#ffffff",
|
||||
"#ffffff",
|
||||
|
||||
@@ -93,6 +93,8 @@
|
||||
"icons.highlight": "#ffffff",
|
||||
"icons.marker_halo": "#ffffff",
|
||||
"interference": "#000000",
|
||||
"joint_axis": "#000000",
|
||||
"joint_manipulator": "#000000",
|
||||
"logo": [
|
||||
"#000000",
|
||||
"#000000",
|
||||
|
||||
@@ -93,6 +93,8 @@
|
||||
"icons.highlight": "#ffffff",
|
||||
"icons.marker_halo": "#000000cc",
|
||||
"interference": "#ff5555",
|
||||
"joint_axis": "#aaaaaa",
|
||||
"joint_manipulator": "#ffff55",
|
||||
"logo": [
|
||||
"#ffffff",
|
||||
"#55ffff",
|
||||
|
||||
@@ -0,0 +1,182 @@
|
||||
//! The browser's groups as a tree: how deep a group sits, who holds whom, and pruning what a
|
||||
//! saved design says about the browser down to what still exists.
|
||||
use crate::document::{BROWSER_FOLDERS, BrowserEntry, BrowserGroup, Document, MAX_GROUP_NESTING};
|
||||
use std::collections::{BTreeMap, BTreeSet};
|
||||
|
||||
impl Document {
|
||||
pub fn browser_group(&self, id: u64) -> Option<&BrowserGroup> {
|
||||
self.browser_groups.iter().find(|g| g.id == id)
|
||||
}
|
||||
|
||||
/// The level of a group: 1 for a top-level group, 2 for a child of one, and so on. A chain
|
||||
/// that loops or runs past the limit counts as one level too deep.
|
||||
pub fn group_level(&self, id: u64) -> usize {
|
||||
let mut level = 0;
|
||||
let mut at = Some(id);
|
||||
while let Some(g) = at {
|
||||
level += 1;
|
||||
if level > MAX_GROUP_NESTING {
|
||||
return level;
|
||||
}
|
||||
at = self.browser_group(g).and_then(|g| g.parent);
|
||||
}
|
||||
level
|
||||
}
|
||||
|
||||
/// Whether `ancestor` is `id` or holds it, at any depth.
|
||||
pub fn group_within(&self, id: u64, ancestor: u64) -> bool {
|
||||
let mut at = Some(id);
|
||||
for _ in 0..=MAX_GROUP_NESTING {
|
||||
match at {
|
||||
Some(g) if g == ancestor => return true,
|
||||
Some(g) => at = self.browser_group(g).and_then(|g| g.parent),
|
||||
None => return false,
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
/// How many levels the group and the groups under it take: 1 for a group with no child group.
|
||||
pub fn group_height(&self, id: u64) -> usize {
|
||||
fn height(d: &Document, id: u64, left: usize) -> usize {
|
||||
if left == 0 {
|
||||
return 1;
|
||||
}
|
||||
1 + d.browser_groups.iter().filter(|g| g.parent == Some(id)).map(|g| height(d, g.id, left - 1)).max().unwrap_or(0)
|
||||
}
|
||||
height(self, id, MAX_GROUP_NESTING + 1)
|
||||
}
|
||||
|
||||
/// The entries of a holder's list in display order: a group's contents, or the folder's top
|
||||
/// level when `holder` is `None`. Groups the list names come where it names them. The child
|
||||
/// groups it does not name (in creation order) go just after the last group it names, or
|
||||
/// first when it names none, so they sit above the items as they always have. Entries for
|
||||
/// groups that are not the holder's children are dropped.
|
||||
pub fn ordered_entries(&self, component: u64, folder: &str, holder: Option<u64>) -> Vec<BrowserEntry> {
|
||||
let listed: &[BrowserEntry] = match holder {
|
||||
Some(g) => self.browser_group(g).map_or(&[], |g| &g.items),
|
||||
None => self.browser_order.get(&format!("{component}/{folder}")).map_or(&[], Vec::as_slice),
|
||||
};
|
||||
let mine: Vec<u64> =
|
||||
self.browser_groups.iter().filter(|g| g.component == component && g.folder == folder && g.parent == holder).map(|g| g.id).collect();
|
||||
let mut out: Vec<BrowserEntry> = Vec::with_capacity(listed.len() + mine.len());
|
||||
for e in listed {
|
||||
match e {
|
||||
BrowserEntry::Group(id) if !mine.contains(id) || out.contains(e) => {}
|
||||
_ => out.push(e.clone()),
|
||||
}
|
||||
}
|
||||
let at = out.iter().rposition(|e| matches!(e, BrowserEntry::Group(_))).map_or(0, |i| i + 1);
|
||||
let unlisted: Vec<BrowserEntry> = mine.iter().map(|id| BrowserEntry::Group(*id)).filter(|e| !out.contains(e)).collect();
|
||||
out.splice(at..at, unlisted);
|
||||
out
|
||||
}
|
||||
|
||||
/// The items in a group and in the groups inside it.
|
||||
pub fn group_item_keys(&self, id: u64) -> Vec<String> {
|
||||
let inside = self.browser_groups.iter().filter(|g| self.group_within(g.id, id));
|
||||
inside.flat_map(|g| g.item_keys().map(str::to_string)).collect()
|
||||
}
|
||||
|
||||
/// The group holding the item directly, in a component's folder.
|
||||
pub fn group_of_item(&self, component: u64, folder: &str, key: &str) -> Option<&BrowserGroup> {
|
||||
self.browser_groups.iter().find(|g| g.component == component && g.folder == folder && g.has_item(key))
|
||||
}
|
||||
|
||||
/// Only the browser's groups and order changed (a group made, nested, moved into, ordered):
|
||||
/// nothing is evaluated and no placement moves. The same whole-Document proof as
|
||||
/// [`Document::differs_only_in_render`]; `next_id` may differ, as a new group takes an id.
|
||||
pub fn differs_only_in_browser(&self, previous: &Document) -> bool {
|
||||
if self.browser_groups == previous.browser_groups && self.browser_order == previous.browser_order {
|
||||
return false;
|
||||
}
|
||||
let mut normalized = previous.clone();
|
||||
normalized.browser_groups.clone_from(&self.browser_groups);
|
||||
normalized.browser_order.clone_from(&self.browser_order);
|
||||
normalized.next_id = self.next_id;
|
||||
*self == normalized
|
||||
}
|
||||
|
||||
/// What [`Document::browser_pruned`] depends on, cheaply: it can only find something to drop
|
||||
/// after a feature, placement, component or group was added or removed. Ids are never
|
||||
/// reused, so a removal followed by an addition still moves `next_id`.
|
||||
pub fn browser_stamp(&self) -> [u64; 6] {
|
||||
let n = |len: usize| u64::try_from(len).unwrap_or(u64::MAX);
|
||||
[
|
||||
self.next_id,
|
||||
n(self.features.len()),
|
||||
n(self.occurrences.len()),
|
||||
n(self.components.len()),
|
||||
n(self.browser_groups.len()),
|
||||
n(self.browser_order.len()),
|
||||
]
|
||||
}
|
||||
|
||||
/// The groups and order lists with what they name that is gone dropped, or `None` when
|
||||
/// nothing is: groups of a missing component or folder, a parent that is missing, elsewhere
|
||||
/// or loops, entries for groups and sketches, construction items and placements that no
|
||||
/// longer exist, repeats, and order lists of missing components. Body names are left alone:
|
||||
/// only an evaluated model knows them.
|
||||
pub fn browser_pruned(&self) -> Option<(Vec<BrowserGroup>, BTreeMap<String, Vec<BrowserEntry>>)> {
|
||||
if self.browser_groups.is_empty() && self.browser_order.is_empty() {
|
||||
return None;
|
||||
}
|
||||
let components: BTreeSet<u64> = self.components.iter().map(|c| c.id).collect();
|
||||
let features: BTreeSet<u64> = self.features.iter().map(|f| f.id).collect();
|
||||
let placed_in: BTreeMap<u64, u64> = self.occurrences.iter().map(|o| (o.id, o.parent)).collect();
|
||||
let component_exists = |c: u64| c == 0 || components.contains(&c);
|
||||
let placed = |component: u64, key: &str| key.parse::<u64>().ok().and_then(|o| placed_in.get(&o)) == Some(&component);
|
||||
// Body names cannot be checked here; the other folders hold feature ids.
|
||||
let item_exists = |folder: &str, component: u64, key: &str| match folder {
|
||||
"bodies" => true,
|
||||
"components" => placed(component, key),
|
||||
_ => key.parse::<u64>().is_ok_and(|id| features.contains(&id)),
|
||||
};
|
||||
let mut groups = self.browser_groups.clone();
|
||||
let mut order = self.browser_order.clone();
|
||||
groups.retain(|g| component_exists(g.component) && BROWSER_FOLDERS.contains(&g.folder.as_str()));
|
||||
let known: BTreeMap<u64, (u64, String)> = groups.iter().map(|g| (g.id, (g.component, g.folder.clone()))).collect();
|
||||
let parents: BTreeMap<u64, Option<u64>> = groups
|
||||
.iter()
|
||||
.map(|g| (g.id, g.parent.filter(|p| *p != g.id && known.get(p).is_some_and(|(c, f)| *c == g.component && *f == g.folder))))
|
||||
.collect();
|
||||
// A loop, or a chain too deep, is cut at the group that makes it.
|
||||
let too_deep = |id: u64| std::iter::successors(Some(id), |g| parents.get(g).copied().flatten()).nth(MAX_GROUP_NESTING).is_some();
|
||||
let kept: BTreeMap<u64, Option<u64>> = parents.iter().map(|(id, p)| (*id, if too_deep(*id) { None } else { *p })).collect();
|
||||
for g in &mut groups {
|
||||
g.parent = kept[&g.id];
|
||||
}
|
||||
let mut taken: BTreeSet<(u64, String, String)> = BTreeSet::new();
|
||||
for g in &mut groups {
|
||||
let (component, folder, id) = (g.component, g.folder.clone(), g.id);
|
||||
let mut seen = BTreeSet::new();
|
||||
g.items.retain(|e| match e {
|
||||
BrowserEntry::Group(c) => kept.get(c) == Some(&Some(id)) && seen.insert(*c),
|
||||
BrowserEntry::Item(k) => item_exists(&folder, component, k) && taken.insert((component, folder.clone(), k.clone())),
|
||||
});
|
||||
}
|
||||
let top = |c: u64, folder: &str, id: u64| kept.get(&id) == Some(&None) && known.get(&id).is_some_and(|(kc, kf)| *kc == c && kf == folder);
|
||||
order.retain(|key, list| {
|
||||
let Some((c, folder)) = key.split_once('/') else { return false };
|
||||
let Some(c) = c.parse::<u64>().ok().filter(|c| component_exists(*c)) else { return false };
|
||||
if !BROWSER_FOLDERS.contains(&folder) {
|
||||
return false;
|
||||
}
|
||||
let mut seen = BTreeSet::new();
|
||||
list.retain(|e| match e {
|
||||
BrowserEntry::Group(id) => top(c, folder, *id) && seen.insert(e.clone()),
|
||||
BrowserEntry::Item(k) => item_exists(folder, c, k) && seen.insert(e.clone()),
|
||||
});
|
||||
!list.is_empty()
|
||||
});
|
||||
(groups != self.browser_groups || order != self.browser_order).then_some((groups, order))
|
||||
}
|
||||
|
||||
/// Put placements of one component in the order the browser shows them: the saved
|
||||
/// `components` order, then the rest as they were.
|
||||
pub fn sort_placements(&self, parent: u64, ids: &mut [u64]) {
|
||||
let Some(order) = self.browser_order.get(&format!("{parent}/components")) else { return };
|
||||
let rank: BTreeMap<&str, usize> = order.iter().enumerate().filter_map(|(i, e)| Some((e.as_item()?, i))).collect();
|
||||
ids.sort_by_cached_key(|id| rank.get(id.to_string().as_str()).copied().unwrap_or(usize::MAX));
|
||||
}
|
||||
}
|
||||
@@ -176,6 +176,8 @@ pub(crate) fn remap_link(
|
||||
remap_link(b, ids, names, bodies, depth + 1);
|
||||
}
|
||||
LinkSource::Plane { name } => mapped_name(name, names),
|
||||
// A construction axis, by name (#9324); the origin axes are no feature's.
|
||||
LinkSource::Axis { name } if !matches!(name.as_str(), "X" | "Y" | "Z") => mapped_name(name, names),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
@@ -253,6 +255,12 @@ impl crate::Feature {
|
||||
for e in sketch.text_exprs_mut() {
|
||||
*e = clone_expression(e, parameters);
|
||||
}
|
||||
// An equation curve's variable is its own: a parameter of that name is not renamed in it.
|
||||
for (variable, e) in sketch.equation_exprs_mut() {
|
||||
let others: BTreeMap<String, String> =
|
||||
parameters.iter().filter(|(old, _)| old.as_str() != variable).map(|(o, n)| (o.clone(), n.clone())).collect();
|
||||
*e = clone_expression(e, &others);
|
||||
}
|
||||
for link in &mut sketch.links {
|
||||
remap_link(&mut link.source, ids, names, bodies, 0);
|
||||
for n in link.face_name.iter_mut().chain(&mut link.edge_name) {
|
||||
|
||||
@@ -81,6 +81,9 @@ impl Document {
|
||||
.filter(|j| occurrences.contains(&j.a.occurrence) || occurrences.contains(&j.b.occurrence))
|
||||
.map(|j| j.id)
|
||||
.collect();
|
||||
for group in &mut self.timeline_groups {
|
||||
group.joints.retain(|id| !joints.contains(id));
|
||||
}
|
||||
let assembly = &mut self.assembly;
|
||||
assembly.joints.retain(|j| !joints.contains(&j.id));
|
||||
assembly.links.retain(|l| !joints.contains(&l.a) && !joints.contains(&l.b));
|
||||
|
||||
@@ -344,10 +344,13 @@ fn model_line(st: &ModelState, g: &GeoRef) -> Result<(Vec3, Vec3)> {
|
||||
_ => Err(bad("the face is not a cylinder, cone or torus")),
|
||||
}
|
||||
}
|
||||
_ => Err(bad("pick a straight or circular edge, or a cylinder, cone or torus face")),
|
||||
_ => Err(bad(MODEL_AXIS_REFS)),
|
||||
}
|
||||
}
|
||||
|
||||
/// What [`model_axis`] says about a reference that is neither an edge nor a face.
|
||||
pub const MODEL_AXIS_REFS: &str = "pick a straight or circular edge, or a cylinder, cone or torus face";
|
||||
|
||||
/// The axis a feature turns about when an edge or face of the model is picked for it (a revolve,
|
||||
/// a circular pattern, a plane at an angle), as [`model_line`] finds it. The direction is
|
||||
/// oriented the same way however the edge or surface runs (its largest component positive), so
|
||||
|
||||
@@ -2736,6 +2736,9 @@ pub struct Document {
|
||||
/// Physical material per body (by body name); others use the default.
|
||||
#[serde(default, skip_serializing_if = "std::collections::BTreeMap::is_empty")]
|
||||
pub materials: std::collections::BTreeMap<String, String>,
|
||||
/// The flat face per body (by body name) that a slicer export lays on the print bed.
|
||||
#[serde(default, skip_serializing_if = "std::collections::BTreeMap::is_empty")]
|
||||
pub print_faces: std::collections::BTreeMap<String, crate::config::ConfigFaceTarget>,
|
||||
/// Physical materials defined in this design (`material.create`), next to the built-in ones.
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub user_materials: Vec<UserMaterial>,
|
||||
@@ -2756,9 +2759,11 @@ pub struct Document {
|
||||
/// order; feature ids remain the source of truth when features are renamed or reordered.
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub timeline_groups: Vec<TimelineGroup>,
|
||||
/// Browser item order per component folder (`"<component>/<folder>"` → item keys).
|
||||
/// Browser order per component folder (`"<component>/<folder>"` → groups and item keys).
|
||||
/// The `components` folder orders a component's sub-components (by placement id); it is not
|
||||
/// drawn as a folder.
|
||||
#[serde(default, skip_serializing_if = "std::collections::BTreeMap::is_empty")]
|
||||
pub browser_order: std::collections::BTreeMap<String, Vec<String>>,
|
||||
pub browser_order: std::collections::BTreeMap<String, Vec<BrowserEntry>>,
|
||||
/// Named views: saved cameras.
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub named_views: Vec<NamedView>,
|
||||
@@ -2847,11 +2852,72 @@ pub struct BrowserGroup {
|
||||
#[serde(default)]
|
||||
pub component: u64,
|
||||
pub folder: String,
|
||||
/// The group that holds this one; `None` is the top level of its folder.
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub parent: Option<u64>,
|
||||
/// The group's items and child groups in display order. A child group missing here still
|
||||
/// belongs to it (its `parent` says so) and is listed after the ones that are here.
|
||||
#[serde(default)]
|
||||
pub items: Vec<String>,
|
||||
pub items: Vec<BrowserEntry>,
|
||||
}
|
||||
|
||||
/// A saved feature-history folder. Folders may nest, and a feature can belong to at most one folder.
|
||||
/// One line of a browser order list: a group (a number in a saved design) or an item (a string:
|
||||
/// an item key or body name, so a body named `"1"` never clashes with group 1).
|
||||
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum BrowserEntry {
|
||||
Group(u64),
|
||||
Item(String),
|
||||
}
|
||||
|
||||
impl From<&str> for BrowserEntry {
|
||||
fn from(key: &str) -> Self {
|
||||
BrowserEntry::Item(key.to_string())
|
||||
}
|
||||
}
|
||||
|
||||
impl From<String> for BrowserEntry {
|
||||
fn from(key: String) -> Self {
|
||||
BrowserEntry::Item(key)
|
||||
}
|
||||
}
|
||||
|
||||
impl BrowserEntry {
|
||||
pub fn item(key: &str) -> Self {
|
||||
BrowserEntry::Item(key.to_string())
|
||||
}
|
||||
|
||||
pub fn as_item(&self) -> Option<&str> {
|
||||
match self {
|
||||
BrowserEntry::Item(k) => Some(k),
|
||||
BrowserEntry::Group(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_item(&self, key: &str) -> bool {
|
||||
self.as_item() == Some(key)
|
||||
}
|
||||
}
|
||||
|
||||
/// How many groups may sit inside one another (a top-level group is level 1).
|
||||
pub const MAX_GROUP_NESTING: usize = 8;
|
||||
|
||||
/// The folders a browser group or order list can be for. `components` only orders sub-components.
|
||||
pub const BROWSER_FOLDERS: [&str; 4] = ["bodies", "sketches", "construction", "components"];
|
||||
|
||||
impl BrowserGroup {
|
||||
/// The keys of the items directly in this group, in order.
|
||||
pub fn item_keys(&self) -> impl Iterator<Item = &str> {
|
||||
self.items.iter().filter_map(BrowserEntry::as_item)
|
||||
}
|
||||
|
||||
/// Whether this group holds the item directly.
|
||||
pub fn has_item(&self, key: &str) -> bool {
|
||||
self.items.iter().any(|e| e.is_item(key))
|
||||
}
|
||||
}
|
||||
|
||||
/// A saved history folder. Folders may nest; each feature or joint belongs to at most one folder.
|
||||
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
|
||||
pub struct TimelineGroup {
|
||||
pub id: u64,
|
||||
@@ -2861,6 +2927,9 @@ pub struct TimelineGroup {
|
||||
pub parent: Option<u64>,
|
||||
#[serde(default)]
|
||||
pub features: Vec<u64>,
|
||||
/// Joints stored in this timeline folder.
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub joints: Vec<u64>,
|
||||
}
|
||||
|
||||
/// The first feature-history folder whose own and nested features do not form one
|
||||
@@ -2979,6 +3048,7 @@ impl Document {
|
||||
body_components: Default::default(),
|
||||
body_offsets: Default::default(),
|
||||
materials: Default::default(),
|
||||
print_faces: Default::default(),
|
||||
user_materials: Vec::new(),
|
||||
appearances: Default::default(),
|
||||
favorites: Default::default(),
|
||||
@@ -2994,7 +3064,7 @@ impl Document {
|
||||
}
|
||||
|
||||
/// Rename body `old` to `new` where the design keeps things by body name outside its
|
||||
/// features: materials, appearances, plastic rules, configuration columns, offsets, components and the
|
||||
/// features: materials, print faces, appearances, plastic rules, configuration columns, offsets, components and the
|
||||
/// browser's groups and order. (The features are the rename command's to change.)
|
||||
///
|
||||
/// A name the design numbered (`Body1`) is not used again after the rename: the design's
|
||||
@@ -3010,6 +3080,10 @@ impl Document {
|
||||
if let Some(m) = self.materials.remove(old) {
|
||||
self.materials.insert(new.to_string(), m);
|
||||
}
|
||||
if let Some(mut face) = self.print_faces.remove(old) {
|
||||
face.body = new.to_string();
|
||||
self.print_faces.insert(new.to_string(), face);
|
||||
}
|
||||
if let Some(rule) = self.plastic.assigned.remove(old) {
|
||||
self.plastic.assigned.insert(new.to_string(), rule);
|
||||
}
|
||||
@@ -3036,15 +3110,16 @@ impl Document {
|
||||
if let Some(c) = self.body_components.remove(old) {
|
||||
self.body_components.insert(new.to_string(), c);
|
||||
}
|
||||
for g in self.browser_groups.iter_mut().filter(|g| g.folder == "bodies") {
|
||||
for k in g.items.iter_mut().filter(|k| *k == old) {
|
||||
*k = new.to_string();
|
||||
let rename = |e: &mut BrowserEntry| {
|
||||
if e.is_item(old) {
|
||||
*e = BrowserEntry::item(new);
|
||||
}
|
||||
};
|
||||
for g in self.browser_groups.iter_mut().filter(|g| g.folder == "bodies") {
|
||||
g.items.iter_mut().for_each(rename);
|
||||
}
|
||||
for (_, v) in self.browser_order.iter_mut().filter(|(k, _)| k.ends_with("/bodies")) {
|
||||
for k in v.iter_mut().filter(|k| *k == old) {
|
||||
*k = new.to_string();
|
||||
}
|
||||
v.iter_mut().for_each(rename);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3363,10 +3438,14 @@ impl Document {
|
||||
/// Read a design file's JSON (any format this build knows; older ones are upgraded).
|
||||
pub fn from_json(s: &str) -> Result<Document> {
|
||||
crate::render_resources::check_json_budget(s)?;
|
||||
let d = crate::format::read(s)?;
|
||||
let mut d = crate::format::read(s)?;
|
||||
if d.features.len() > MAX_FEATURES || d.params.len() > MAX_PARAMS {
|
||||
return Err(DocError::Invalid("document too large".into()));
|
||||
}
|
||||
// A design from elsewhere may nest groups too deep, loop, or name things that are gone.
|
||||
if let Some((groups, order)) = d.browser_pruned() {
|
||||
(d.browser_groups, d.browser_order) = (groups, order);
|
||||
}
|
||||
Ok(d)
|
||||
}
|
||||
pub fn to_json(&self) -> String {
|
||||
@@ -3702,7 +3781,7 @@ impl Document {
|
||||
}
|
||||
|
||||
/// Add or change a parameter. Fails if the result would not evaluate. A new parameter
|
||||
/// without a unit takes the unit of its value (mm, deg or none).
|
||||
/// without a unit takes the unit of its value (a length in the design's units, deg or none).
|
||||
pub fn set_param(&mut self, name: &str, expr_s: &str, unit: Option<&str>, comment: Option<&str>) -> Result<()> {
|
||||
// A text parameter: one with the text unit, or an existing one when no unit is given.
|
||||
match (unit.map(crate::text_params::is_text_unit), self.text_param(name).is_some()) {
|
||||
@@ -3886,10 +3965,11 @@ impl Document {
|
||||
}
|
||||
}
|
||||
|
||||
/// Apply parameter values to every dimension in a sketch, and to its points placed by
|
||||
/// parameters (in place).
|
||||
/// Apply parameter values to every dimension in a sketch, to its points placed by parameters
|
||||
/// and to its equation curves (in place).
|
||||
pub fn apply_dimension_values(&self, vals: &std::collections::BTreeMap<String, expr::Value>, sk: &mut Sketch) -> Result<()> {
|
||||
self.apply_point_values(vals, sk)?;
|
||||
self.apply_equation_values(vals, sk)?;
|
||||
self.apply_pattern_values(vals, sk)?;
|
||||
for c in &mut sk.constraints {
|
||||
if let Some(p) = &c.param {
|
||||
@@ -4010,7 +4090,7 @@ impl Document {
|
||||
return Err(DocError::Invalid("a text's height must be positive".into()));
|
||||
}
|
||||
if let Some(e) = &exprs.text {
|
||||
let words = self.eval_words(e).map_err(|error| DocError::Expr(format!("text: {error}")))?;
|
||||
let words = self.eval_words(e, vals).map_err(|error| DocError::Expr(format!("text: {error}")))?;
|
||||
if words.trim().is_empty() || words.chars().count() > solidcraft_sketch::MAX_TEXT_CHARS {
|
||||
return Err(DocError::Invalid(format!("text: `{e}` gives no words, or too many")));
|
||||
}
|
||||
|
||||
@@ -792,6 +792,11 @@ fn split_piece_of(name: &str) -> Option<&str> {
|
||||
(!n.starts_with('0') && n.parse::<u32>().is_ok()).then_some(base)
|
||||
}
|
||||
|
||||
/// The warning of a sketch whose profile search was cut short (#6896).
|
||||
fn profiles_cut_short_note() -> String {
|
||||
format!("some profiles may be missing: a group of touching curves is cut into more than {} pieces", solidcraft_sketch::MAX_PROFILE_EDGES)
|
||||
}
|
||||
|
||||
/// Add `note` to a feature's warning.
|
||||
fn append_warning(warning: &mut Option<String>, note: String) {
|
||||
*warning = Some(match warning.take() {
|
||||
@@ -2153,7 +2158,14 @@ impl Model {
|
||||
feature_component.entry(f.id).or_insert(f.component);
|
||||
}
|
||||
let watched = crate::progress::begin(doc.features.len());
|
||||
// The features that failed so far in this pass, by id: their names and errors (#9075).
|
||||
let mut failed: std::collections::HashMap<u64, (String, String)> = std::collections::HashMap::new();
|
||||
for (i, f) in doc.features.iter().enumerate() {
|
||||
if let Some(r) = out.last()
|
||||
&& let Some(e) = &r.error
|
||||
{
|
||||
failed.insert(r.id, (r.name.clone(), e.clone()));
|
||||
}
|
||||
self.placement_local = self.placement_local && placement_reuse::local_geometry(f, &feature_component);
|
||||
let rolled_back = i >= marker;
|
||||
// Retain at most one active result per rolled-back feature, even across several
|
||||
@@ -2213,6 +2225,33 @@ impl Model {
|
||||
if state.reserved_body_names != reserved {
|
||||
Arc::make_mut(&mut state).reserved_body_names.clone_from(&reserved);
|
||||
}
|
||||
// A sketch the feature is built from failed earlier in this pass: the feature fails naming
|
||||
// that sketch, with its error, as one using a failed parameter does (#9075), not as a
|
||||
// sketch that must come earlier in the timeline. Never cached: the cache key holds
|
||||
// neither the sketch's name nor its error (a rename, another failing value).
|
||||
let failed_sketch = if failed.is_empty() {
|
||||
None
|
||||
} else {
|
||||
f.kind.input_sketches().into_iter().find_map(|id| failed.get(&id)).map(|(name, e)| format!("sketch `{name}` failed: {e}"))
|
||||
};
|
||||
if let Some(e) = failed_sketch {
|
||||
recomputed += 1;
|
||||
reuse = false;
|
||||
out.push(FeatureResult {
|
||||
id: f.id,
|
||||
name: f.name.clone(),
|
||||
error: Some(e),
|
||||
warning: None,
|
||||
boolean_diagnostics: Default::default(),
|
||||
ms: 0.0,
|
||||
skipped: false,
|
||||
stale: false,
|
||||
fingerprint: fp,
|
||||
unkept: false,
|
||||
state: state.clone(),
|
||||
});
|
||||
continue;
|
||||
}
|
||||
// The same feature on the same inputs: its earlier result.
|
||||
let key =
|
||||
cache_key(f, fp, fingerprint(doc, 0, f, &vals, false, &self.step_digests) ^ placement_digest(doc, f, Some(&state)), ctx, &state);
|
||||
@@ -2523,13 +2562,40 @@ fn point(vals: &BTreeMap<String, Value>, p: &crate::PointExpr) -> Result<Vec3> {
|
||||
|
||||
pub(crate) fn val(vals: &BTreeMap<String, Value>, e: &str, k: Kind) -> Result<f64> {
|
||||
let scale = vals.get(DESIGN_LEN).map(|x| x.v).unwrap_or(1.0);
|
||||
// Non-literal lengths (a parameter ± a bare number) must read that bare number in the design's
|
||||
// units during the expression, not only when the whole result is unit-less (#9015).
|
||||
if k == Kind::Length && scale != 1.0 && !expr::is_literal(e) {
|
||||
let v = expr::eval_with(e, &|n| vals.get(n).copied().ok_or_else(|| DocError::Expr(format!("unknown parameter `{n}`"))))?;
|
||||
return v.to_kind_in(k, expr::Defaults { len: scale, ..expr::Defaults::default() });
|
||||
let defaults = expr::Defaults { len: scale, ..expr::Defaults::default() };
|
||||
let look = |n: &str| vals.get(n).copied().ok_or_else(|| DocError::Expr(format!("unknown parameter `{n}`")));
|
||||
return expr::eval_with_defaults(e, &look, defaults)?.to_kind_in(k, defaults);
|
||||
}
|
||||
Document::eval_in(vals, e, k)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod design_unit_val_tests {
|
||||
use super::*;
|
||||
use expr::Value;
|
||||
|
||||
/// #9015: with inches as the design unit, `baseLength - 1` subtracts one inch (not one mm).
|
||||
#[test]
|
||||
fn bare_offsets_beside_a_length_follow_the_design_units() {
|
||||
let mut vals = BTreeMap::new();
|
||||
vals.insert(DESIGN_LEN.into(), Value::num(25.4));
|
||||
vals.insert("baseLength".into(), Value::length(76.0 * 25.4));
|
||||
let got = val(&vals, "baseLength - 1", Kind::Length).unwrap();
|
||||
assert!((got - 75.0 * 25.4).abs() < 1e-9, "got {got} mm, want 75 in");
|
||||
let got = val(&vals, "baseLength - 1.5", Kind::Length).unwrap();
|
||||
assert!((got - 74.5 * 25.4).abs() < 1e-9, "got {got} mm, want 74.5 in");
|
||||
// An explicit millimetre still wins.
|
||||
let got = val(&vals, "baseLength - 1 mm", Kind::Length).unwrap();
|
||||
assert!((got - (76.0 * 25.4 - 1.0)).abs() < 1e-9, "got {got}");
|
||||
// A bare literal stays millimetres (feature inputs write the design unit in when typed).
|
||||
let got = val(&vals, "2", Kind::Length).unwrap();
|
||||
assert!((got - 2.0).abs() < 1e-12, "got {got}");
|
||||
}
|
||||
}
|
||||
|
||||
/// Collapsing the outline and its holes onto one apex cannot make a manifold solid.
|
||||
fn refuse_loft_holes(r: &Region2) -> Result<()> {
|
||||
if r.holes.is_empty() {
|
||||
@@ -7196,7 +7262,13 @@ fn eval_feature(doc: &Document, vals: &BTreeMap<String, Value>, f: &Feature, st:
|
||||
*warning = Some(warns.join("; "));
|
||||
}
|
||||
sk.validate_periodic_splines()?;
|
||||
let profiles = find_profiles(&sk);
|
||||
// A group of touching curves too large to search whole says so, rather than
|
||||
// leaving profiles out silently (#6896).
|
||||
let search = solidcraft_sketch::find_profiles_checked(&sk);
|
||||
if search.incomplete {
|
||||
append_warning(warning, profiles_cut_short_note());
|
||||
}
|
||||
let profiles = search.profiles;
|
||||
let ends = solidcraft_sketch::loose_ends(&sk);
|
||||
st.sketches.retain(|s| s.feature != f.id);
|
||||
st.sketches.push(Arc::new(SolvedSketch { feature: f.id, name: f.name.clone(), plane, sketch: sk, report, profiles, ends }));
|
||||
|
||||
@@ -647,3 +647,65 @@ fn shared_evaluation_refreshes_live_sketches_and_keeps_unknown_features_conserva
|
||||
assert!(model.results.iter().all(|r| r.error.is_none()));
|
||||
assert!(model.evaluate_shared(&doc), "an unclassified feature must keep the ordinary evaluation path");
|
||||
}
|
||||
|
||||
/// A saved model writes each set of sketch keys once, as the keys it sets and drops relative to
|
||||
/// the set written before it (every state repeating its whole set made a 5,484-feature design's
|
||||
/// model too large for its file, which then kept only some states and evaluated the rest on
|
||||
/// opening). Every state reads back the keys it was evaluated with, also in a model thinned to
|
||||
/// fewer states; a set that names no set before it is refused.
|
||||
#[test]
|
||||
fn saved_states_read_back_their_sketch_keys() {
|
||||
let mut doc = Document::new("Sketch keys");
|
||||
for i in 0..4 {
|
||||
doc.add_feature(line_sketch(PlaneRef::Origin { name: "XY".into() }, Vec2::new(f64::from(i) + 1.0, 1.0)), None).unwrap();
|
||||
for j in 0..3 {
|
||||
let corner = point_expr(Vec3::new(f64::from(i) * 20.0, f64::from(j) * 20.0, 0.0));
|
||||
let kind = FeatureKind::Box { corner, length: "5".into(), width: "5".into(), height: "5".into(), operation: Operation::NewBody };
|
||||
doc.add_feature(kind, None).unwrap();
|
||||
}
|
||||
}
|
||||
let mut model = Model::new();
|
||||
model.evaluate(&doc);
|
||||
let keys = |m: &Model| m.results.iter().map(|r| r.state.sketch_keys.clone()).collect::<Vec<_>>();
|
||||
assert_eq!(model.state().sketch_keys.len(), 4);
|
||||
let saved = model.saved(&doc).unwrap();
|
||||
assert_eq!(saved.records["sketch_key_sets"].as_array().unwrap().len(), 4, "one set per sketch");
|
||||
assert_eq!(saved.records["states"].as_array().unwrap().len(), doc.features.len());
|
||||
assert_eq!(keys(&Model::adopt(&doc, &saved).unwrap()), keys(&model));
|
||||
// The final state alone (every body costs more than the budget): the sets are all kept.
|
||||
let pieces: Vec<Vec<(usize, usize)>> = (0..saved.bodies.len()).map(|i| vec![(i, 1 << 20)]).collect();
|
||||
let (thinned, _, _) = saved.thinned(&pieces, 0).unwrap();
|
||||
assert_eq!(thinned.records["states"].as_array().unwrap().len(), 1);
|
||||
assert_eq!(thinned.final_state().unwrap().sketch_keys, model.state().sketch_keys);
|
||||
assert_eq!(keys(&Model::adopt(&doc, &thinned).unwrap()), keys(&model));
|
||||
// Sets and drops read as written; a base that is not an earlier set is refused.
|
||||
let with_sets = |sets: serde_json::Value| SavedModel {
|
||||
records: {
|
||||
let mut r = saved.records.clone();
|
||||
r["sketch_key_sets"] = sets;
|
||||
r
|
||||
},
|
||||
bodies: saved.bodies.clone(),
|
||||
};
|
||||
let first = *model.state().sketch_keys.keys().next().unwrap();
|
||||
let dropped = with_sets(serde_json::json!([
|
||||
{"set": [[first, "0000000000000001"], [7, "0000000000000002"]], "drop": []},
|
||||
{"base": 0, "set": [], "drop": []},
|
||||
{"base": 1, "set": [[8, "0000000000000003"]], "drop": [first]},
|
||||
{"base": 0, "set": [[7, "00000000000000ff"]], "drop": []},
|
||||
]));
|
||||
let want: BTreeMap<u64, u64> = [(7, 0xff), (first, 1)].into();
|
||||
assert_eq!(dropped.final_state().unwrap().sketch_keys, want);
|
||||
let dropped = with_sets(serde_json::json!([
|
||||
{"set": [[first, "0000000000000001"], [7, "0000000000000002"]], "drop": []},
|
||||
{"base": 0, "set": [], "drop": []},
|
||||
{"base": 0, "set": [], "drop": []},
|
||||
{"base": 1, "set": [[8, "0000000000000003"]], "drop": [first]},
|
||||
]));
|
||||
assert_eq!(dropped.final_state().unwrap().sketch_keys, [(7, 2), (8, 3)].into());
|
||||
for base in [3, 4] {
|
||||
let sets =
|
||||
serde_json::json!([{"set": [], "drop": []}, {"set": [], "drop": []}, {"set": [], "drop": []}, {"base": base, "set": [], "drop": []}]);
|
||||
assert!(with_sets(sets).final_state().is_err(), "base {base}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,6 +161,12 @@ pub const FUNCTIONS: &[(&str, &str)] = &[
|
||||
("ceil", "ceil(x)"),
|
||||
("round", "round(x)"),
|
||||
("exp", "exp(x)"),
|
||||
("sinh", "sinh(x)"),
|
||||
("cosh", "cosh(x)"),
|
||||
("tanh", "tanh(x)"),
|
||||
("asinh", "asinh(x)"),
|
||||
("acosh", "acosh(x), x ≥ 1"),
|
||||
("atanh", "atanh(x), −1 < x < 1"),
|
||||
("ln", "ln(x)"),
|
||||
("log", "log(x) (base 10)"),
|
||||
("log10", "log10(x)"),
|
||||
@@ -344,8 +350,9 @@ fn lex_spans(s: &str) -> Result<Vec<(Tok, usize, usize)>, DocError> {
|
||||
let at = |i: usize| cs.get(i).map(|x| x.0).unwrap_or(s.len());
|
||||
let mut i = 0;
|
||||
let mut out = Vec::new();
|
||||
// Parentheses open at this point: a comma outside them can only be a decimal comma.
|
||||
let mut depth = 0usize;
|
||||
// Parentheses open at this point, innermost last, true for a function call's: a comma directly
|
||||
// in a call separates its arguments, and anywhere else can only be a decimal comma (#9408).
|
||||
let mut parens: Vec<bool> = Vec::new();
|
||||
// A single leading `=` marks the text as a formula (`=d3`, #4681) and is not part of it.
|
||||
if let Some(k) = cs.iter().position(|(_, c)| !c.is_whitespace())
|
||||
&& cs.get(k).is_some_and(|(_, c)| *c == '=')
|
||||
@@ -363,7 +370,7 @@ fn lex_spans(s: &str) -> Result<Vec<(Tok, usize, usize)>, DocError> {
|
||||
while let Some(&(_, c)) = cs.get(i) {
|
||||
if c.is_whitespace() {
|
||||
i += 1;
|
||||
} else if c.is_ascii_digit() || c == '.' || leading_decimal_comma(&cs, i, depth, out.last()) {
|
||||
} else if c.is_ascii_digit() || c == '.' || leading_decimal_comma(&cs, i, in_call(&parens), out.last()) {
|
||||
let st = i;
|
||||
// A leading decimal comma (`,5` for 0,5, #2966) starts the number as `.5` would.
|
||||
let leading_comma = c == ',';
|
||||
@@ -374,11 +381,17 @@ fn lex_spans(s: &str) -> Result<Vec<(Tok, usize, usize)>, DocError> {
|
||||
i += 1;
|
||||
}
|
||||
// A decimal comma (`2,5 mm`, as typed with a numeric keypad in many locales, #1347):
|
||||
// a comma between digits, in a number with no point, outside any parentheses (inside
|
||||
// them a comma separates a function's arguments: `max(1,2)`).
|
||||
// a comma between digits, in a number with no point, not directly in a function call
|
||||
// (there a comma separates arguments: `max(1,2)`).
|
||||
let digit = |k: usize| cs.get(k).is_some_and(|(_, c)| c.is_ascii_digit());
|
||||
let has_point = cs.get(st..i).is_some_and(|ds| ds.iter().any(|(_, c)| *c == '.'));
|
||||
if depth == 0 && !leading_comma && !has_point && digit(i.wrapping_sub(1)) && cs.get(i).is_some_and(|(_, c)| *c == ',') && digit(i + 1) {
|
||||
if !in_call(&parens)
|
||||
&& !leading_comma
|
||||
&& !has_point
|
||||
&& digit(i.wrapping_sub(1))
|
||||
&& cs.get(i).is_some_and(|(_, c)| *c == ',')
|
||||
&& digit(i + 1)
|
||||
{
|
||||
i += 1;
|
||||
while digit(i) {
|
||||
i += 1;
|
||||
@@ -400,7 +413,7 @@ fn lex_spans(s: &str) -> Result<Vec<(Tok, usize, usize)>, DocError> {
|
||||
// A mixed number, as imperial sizes are written (`2 1/8"` is 2.125 in, #1802): a whole
|
||||
// number, then a proper fraction of whole numbers, is one value, not `2 × 1/8`.
|
||||
if t.chars().all(|c| c.is_ascii_digit())
|
||||
&& let Some((fraction, end)) = mixed_fraction(&cs, i, depth)
|
||||
&& let Some((fraction, end)) = mixed_fraction(&cs, i, in_call(&parens))
|
||||
{
|
||||
out.push((Tok::Num(v + fraction), at(st), at(end)));
|
||||
i = end;
|
||||
@@ -438,8 +451,10 @@ fn lex_spans(s: &str) -> Result<Vec<(Tok, usize, usize)>, DocError> {
|
||||
i += 1;
|
||||
} else if "+-*/^(),%".contains(c) {
|
||||
match c {
|
||||
'(' => depth += 1,
|
||||
')' => depth = depth.saturating_sub(1),
|
||||
'(' => parens.push(matches!(out.last(), Some((Tok::Id(_), _, _)))),
|
||||
')' => {
|
||||
parens.pop();
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
out.push((Tok::Op(c), at(i), at(i + 1)));
|
||||
@@ -451,27 +466,32 @@ fn lex_spans(s: &str) -> Result<Vec<(Tok, usize, usize)>, DocError> {
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
/// Whether the innermost open parenthesis is a function call's.
|
||||
fn in_call(parens: &[bool]) -> bool {
|
||||
parens.last() == Some(&true)
|
||||
}
|
||||
|
||||
/// Whether the comma at `i` starts a number, as a leading decimal comma (`,5` for 0,5, #2966).
|
||||
/// It must be outside parentheses (inside them a comma separates arguments, as for any decimal
|
||||
/// comma), be followed by a digit, and stand where an operand is expected: at the start or right
|
||||
/// after `+ - * / ^`. A comma after a number, name, `)` or `%` keeps its meaning (`2 ,5` and
|
||||
/// `1,5,3` stay errors).
|
||||
fn leading_decimal_comma(cs: &[(usize, char)], i: usize, depth: usize, prev: Option<&(Tok, usize, usize)>) -> bool {
|
||||
depth == 0
|
||||
/// It must not be directly in a function call (`in_call`: there a comma separates arguments, as
|
||||
/// for any decimal comma), be followed by a digit, and stand where an operand is expected: at the
|
||||
/// start or right after `( + - * / ^`. A comma after a number, name, `)` or `%` keeps its meaning
|
||||
/// (`2 ,5` and `1,5,3` stay errors).
|
||||
fn leading_decimal_comma(cs: &[(usize, char)], i: usize, in_call: bool, prev: Option<&(Tok, usize, usize)>) -> bool {
|
||||
!in_call
|
||||
&& cs.get(i).is_some_and(|(_, c)| *c == ',')
|
||||
&& cs.get(i + 1).is_some_and(|(_, c)| c.is_ascii_digit())
|
||||
&& match prev {
|
||||
None => true,
|
||||
Some((Tok::Op(op), _, _)) => "+-*/^".contains(*op),
|
||||
Some((Tok::Op(op), _, _)) => "(+-*/^".contains(*op),
|
||||
Some(_) => false,
|
||||
}
|
||||
}
|
||||
|
||||
/// The proper fraction of a mixed number whose whole part ends at `i`: spaces, digits, `/`,
|
||||
/// digits, with nothing after them that would continue the number (`2 1/8.5`, `2 1/8e3`, a
|
||||
/// decimal comma outside parentheses: `2 1/8,5`). Its value and where it ends. `depth`: the
|
||||
/// parentheses open there (inside them a comma separates arguments: `max(2 1/8,1)`).
|
||||
fn mixed_fraction(cs: &[(usize, char)], mut i: usize, depth: usize) -> Option<(f64, usize)> {
|
||||
/// decimal comma: `2 1/8,5`). Its value and where it ends. `in_call`: directly in a function call
|
||||
/// there (a comma separates arguments: `max(2 1/8,1)`).
|
||||
fn mixed_fraction(cs: &[(usize, char)], mut i: usize, in_call: bool) -> Option<(f64, usize)> {
|
||||
let digits = |from: usize| cs.get(from..).map_or(0, |rest| rest.iter().take_while(|(_, c)| c.is_ascii_digit()).count());
|
||||
let space = i;
|
||||
while cs.get(i).is_some_and(|(_, c)| *c == ' ' || *c == '\t') {
|
||||
@@ -485,7 +505,7 @@ fn mixed_fraction(cs: &[(usize, char)], mut i: usize, depth: usize) -> Option<(f
|
||||
let end = i + numerator + 1 + denominator;
|
||||
let next = |k: usize| cs.get(end + k).map(|(_, c)| *c);
|
||||
let continues = matches!(next(0), Some('.'))
|
||||
|| (depth == 0 && matches!(next(0), Some(',')) && next(1).is_some_and(|c| c.is_ascii_digit()))
|
||||
|| (!in_call && matches!(next(0), Some(',')) && next(1).is_some_and(|c| c.is_ascii_digit()))
|
||||
|| (matches!(next(0), Some('e' | 'E')) && next(1).is_some_and(|c| c.is_ascii_digit() || c == '-' || c == '+'));
|
||||
if denominator == 0 || continues {
|
||||
return None;
|
||||
@@ -589,9 +609,11 @@ pub fn is_literal(s: &str) -> bool {
|
||||
}
|
||||
}
|
||||
|
||||
/// Is the expression a bare number without a unit, like `20` or `-1.5`?
|
||||
/// Is the expression a bare number without a unit, like `20` or `-1.5`? A leading `=` only marks
|
||||
/// a formula (#4681), so `=20` is the same bare number.
|
||||
pub fn is_bare_number(s: &str) -> bool {
|
||||
is_literal(s) && s.trim().trim_start_matches(['-', '+']).trim().parse::<f64>().is_ok()
|
||||
let number = s.trim().strip_prefix('=').unwrap_or(s);
|
||||
is_literal(s) && number.trim().trim_start_matches(['-', '+']).trim().parse::<f64>().is_ok()
|
||||
}
|
||||
|
||||
/// Is `s` shaped like a parameter name: a letter or `_`, then letters, digits and `_`? The shape
|
||||
@@ -943,6 +965,24 @@ fn call(f: &str, args: &[Value], d: Defaults) -> Result<Value, DocError> {
|
||||
unit_fn(r * if scale != 0.0 { scale } else { 1.0 }, a)
|
||||
}
|
||||
"exp" => Value::num(num(one()?)?.exp()),
|
||||
"sinh" => Value::num(num(one()?)?.sinh()),
|
||||
"cosh" => Value::num(num(one()?)?.cosh()),
|
||||
"tanh" => Value::num(num(one()?)?.tanh()),
|
||||
"asinh" => Value::num(num(one()?)?.asinh()),
|
||||
"acosh" => {
|
||||
let x = num(one()?)?;
|
||||
if !(x >= 1.0) {
|
||||
return Err(DocError::Expr("`acosh` needs a number of at least 1".into()));
|
||||
}
|
||||
Value::num(x.acosh())
|
||||
}
|
||||
"atanh" => {
|
||||
let x = num(one()?)?;
|
||||
if !(x > -1.0 && x < 1.0) {
|
||||
return Err(DocError::Expr("`atanh` needs a number between -1 and 1, both excluded".into()));
|
||||
}
|
||||
Value::num(x.atanh())
|
||||
}
|
||||
"ln" | "log" | "log10" => {
|
||||
let x = num(one()?)?;
|
||||
if x <= 0.0 {
|
||||
@@ -1214,7 +1254,13 @@ mod tests {
|
||||
// Inside parentheses a comma still separates a function's arguments.
|
||||
assert_eq!(ev("max(1,2)", Kind::Unitless).unwrap(), 2.0);
|
||||
assert_eq!(ev("max(1 mm, 3, 2)", Kind::Length).unwrap(), 3.0);
|
||||
assert_eq!(ev("(2,5)", Kind::Unitless).ok(), None, "a comma inside parentheses is not a decimal comma");
|
||||
// Plain parentheses have no arguments to separate (#9408), also inside a call.
|
||||
assert_eq!(ev("(2,5)", Kind::Unitless).unwrap(), 2.5);
|
||||
assert_eq!(ev("-(width-0,5)/2", Kind::Length).unwrap(), -19.75);
|
||||
assert_eq!(ev("(,5)", Kind::Unitless).unwrap(), 0.5);
|
||||
assert_eq!(ev("(2 1/8,5)", Kind::Unitless).unwrap(), 2.0 / 8.5);
|
||||
assert_eq!(ev("max((1,5), 1)", Kind::Unitless).unwrap(), 1.5);
|
||||
assert_eq!(ev("(max(1,2))", Kind::Unitless).unwrap(), 2.0);
|
||||
// Not between two digits, or a second comma: still an error.
|
||||
for bad in ["2,", "2 ,5", "2, 5", "1,5,3", "1.5,3", ",5,3", ",5.3", "width ,5", "(1) ,5"] {
|
||||
assert!(ev(bad, Kind::Unitless).is_err(), "{bad}");
|
||||
@@ -1328,6 +1374,15 @@ mod tests {
|
||||
assert!((ev("atan2(1; 1)", Kind::Angle).unwrap() - std::f64::consts::FRAC_PI_4).abs() < 1e-12);
|
||||
assert!((ev("exp(ln(5))", Kind::Unitless).unwrap() - 5.0).abs() < 1e-12);
|
||||
assert!((ev("log(1000)", Kind::Unitless).unwrap() - 3.0).abs() < 1e-12);
|
||||
// Hyperbolic functions (#9332): their definitions in exp, identities and inverses.
|
||||
assert!((ev("cosh(1.5) - (exp(1.5) + exp(-1.5)) / 2", Kind::Unitless).unwrap()).abs() < 1e-12);
|
||||
assert!((ev("sinh(1.5) - (exp(1.5) - exp(-1.5)) / 2", Kind::Unitless).unwrap()).abs() < 1e-12);
|
||||
assert!((ev("tanh(0.7) - sinh(0.7) / cosh(0.7)", Kind::Unitless).unwrap()).abs() < 1e-12);
|
||||
assert!((ev("cosh(2) ^ 2 - sinh(2) ^ 2", Kind::Unitless).unwrap() - 1.0).abs() < 1e-12);
|
||||
assert!((ev("asinh(sinh(1.25))", Kind::Unitless).unwrap() - 1.25).abs() < 1e-12);
|
||||
assert!((ev("acosh(cosh(1.25))", Kind::Unitless).unwrap() - 1.25).abs() < 1e-12);
|
||||
assert!((ev("atanh(tanh(0.5))", Kind::Unitless).unwrap() - 0.5).abs() < 1e-12);
|
||||
assert_eq!(ev("cosh(0) + sinh(0) + tanh(0) + asinh(0) + acosh(1) + atanh(0)", Kind::Unitless).unwrap(), 1.0);
|
||||
assert_eq!(ev("floor(2.7) + ceil(0.2) + round(1.5) + abs(-1)", Kind::Unitless).unwrap(), 6.0);
|
||||
assert!((ev("1 rad", Kind::Angle).unwrap() - 1.0).abs() < 1e-12);
|
||||
assert!((ev("acos(0)", Kind::Angle).unwrap() - std::f64::consts::FRAC_PI_2).abs() < 1e-12);
|
||||
@@ -1337,6 +1392,22 @@ mod tests {
|
||||
assert_eq!(ev("width^2 / width", Kind::Length).unwrap(), 40.0);
|
||||
}
|
||||
|
||||
/// The hyperbolic functions (#9332) take a unit-less number, and the inverses refuse what lies
|
||||
/// outside their domain, as `asin` and `ln` do.
|
||||
#[test]
|
||||
fn hyperbolic_functions_refuse_units_and_numbers_outside_their_domain() {
|
||||
for (e, says) in [
|
||||
("cosh(2 mm)", "`cosh` needs a unit-less number"),
|
||||
("tanh(30 deg)", "`tanh` needs a unit-less number"),
|
||||
("acosh(0.5)", "`acosh` needs a number of at least 1"),
|
||||
("atanh(1)", "`atanh` needs a number between -1 and 1"),
|
||||
("atanh(-1.5)", "`atanh` needs a number between -1 and 1"),
|
||||
] {
|
||||
let err = ev(e, Kind::Unitless).map(|v| v.to_string()).unwrap_or_else(|e| e.to_string());
|
||||
assert!(err.contains(says), "{e}: {err}");
|
||||
}
|
||||
}
|
||||
|
||||
/// A count from a length (`(L - 20) / 210`, the 210 read as unit-less) names the fix (#5901).
|
||||
#[test]
|
||||
fn a_length_where_a_count_is_expected_says_to_divide_by_a_length() {
|
||||
@@ -1449,6 +1520,8 @@ mod tests {
|
||||
assert!(is_literal("20") && is_literal("-1.5 in") && is_literal("3 deg"));
|
||||
assert!(!is_literal("d1") && !is_literal("2 * 3") && !is_literal("2 width"));
|
||||
assert!(is_bare_number(" -1.5 ") && is_bare_number("+2") && !is_bare_number("20 mm") && !is_bare_number("(2)"));
|
||||
// A leading `=` only marks a formula (#4681): `=5` is the bare number `5`, not `==5`.
|
||||
assert!(is_bare_number("=5") && is_bare_number(" = -1.5") && !is_bare_number("=5 mm") && !is_bare_number("==5") && !is_bare_number("=d3"));
|
||||
assert_eq!((length_unit_or_mm(" in "), length_unit_or_mm("deg"), length_unit_or_mm("")), ("in", "mm", "mm"));
|
||||
}
|
||||
|
||||
|
||||
@@ -172,32 +172,7 @@ impl Document {
|
||||
author: u64,
|
||||
author_path: &[u64],
|
||||
) -> Result<FaceAnchor> {
|
||||
// A construction certificate that names this face alone, else its exact history name.
|
||||
let certified = body
|
||||
.body
|
||||
.face_plane(index)
|
||||
.ok_or_else(|| DocError::Invalid("this face has no exact planar source; choose a fixed plane instead".into()))
|
||||
.and_then(|source| {
|
||||
let target = self.strong_face_target(body, index, source.origin)?;
|
||||
if target.certificate.is_none() {
|
||||
return Err(DocError::Invalid("this face has no supported construction certificate; choose a fixed plane instead".into()));
|
||||
}
|
||||
let indices = self.configuration_face_indices(body, &target)?;
|
||||
// A copy a pattern or mirror made on the same body carries its seed's certificate,
|
||||
// which finds the seed's face: the copy is attached by its own history name below.
|
||||
if !indices.contains(&index) {
|
||||
return Err(DocError::Invalid("this face has no supported construction certificate; choose a fixed plane instead".into()));
|
||||
}
|
||||
self.coplanar_pieces(body, &indices, |_| true)?;
|
||||
Ok(target)
|
||||
});
|
||||
let target = match certified {
|
||||
Ok(target) => target,
|
||||
Err(error) => match body.body.planar_face(index).and_then(|plane| self.lineage_face_target(body, index, plane.origin)) {
|
||||
Some(target) => target,
|
||||
None => return Err(error),
|
||||
},
|
||||
};
|
||||
let target = self.flat_face_target(body, index)?;
|
||||
let source = self
|
||||
.anchor_face_plane(body, index, target.certificate.as_ref())
|
||||
.ok_or_else(|| DocError::Invalid("this face has no exact planar source; choose a fixed plane instead".into()))?;
|
||||
@@ -220,6 +195,34 @@ impl Document {
|
||||
Ok(anchor)
|
||||
}
|
||||
|
||||
/// A target for flat face `index` of `body` that a rebuild finds again: a construction
|
||||
/// certificate that names this face alone, else its exact history name. What a sketch on a
|
||||
/// face and a print face hold.
|
||||
pub(crate) fn flat_face_target(&self, body: &ModelBody, index: usize) -> Result<ConfigFaceTarget> {
|
||||
let certified = body
|
||||
.body
|
||||
.face_plane(index)
|
||||
.ok_or_else(|| DocError::Invalid("this face has no exact planar source; choose a fixed plane instead".into()))
|
||||
.and_then(|source| {
|
||||
let target = self.strong_face_target(body, index, source.origin)?;
|
||||
if target.certificate.is_none() {
|
||||
return Err(DocError::Invalid("this face has no supported construction certificate; choose a fixed plane instead".into()));
|
||||
}
|
||||
let indices = self.configuration_face_indices(body, &target)?;
|
||||
// A copy a pattern or mirror made on the same body carries its seed's certificate,
|
||||
// which finds the seed's face: the copy is attached by its own history name below.
|
||||
if !indices.contains(&index) {
|
||||
return Err(DocError::Invalid("this face has no supported construction certificate; choose a fixed plane instead".into()));
|
||||
}
|
||||
self.coplanar_pieces(body, &indices, |_| true)?;
|
||||
Ok(target)
|
||||
});
|
||||
match certified {
|
||||
Ok(target) => Ok(target),
|
||||
Err(error) => body.body.planar_face(index).and_then(|plane| self.lineage_face_target(body, index, plane.origin)).ok_or(error),
|
||||
}
|
||||
}
|
||||
|
||||
/// The faces an attachment stands for, and a note when they were found by fallback.
|
||||
///
|
||||
/// An extrude's cap is certified by the loop of sketch curves around it, so editing that
|
||||
|
||||
@@ -46,6 +46,17 @@ impl FeatureKind {
|
||||
found
|
||||
}
|
||||
|
||||
/// Bodies the feature works on (by name).
|
||||
pub fn input_bodies(&self) -> Vec<String> {
|
||||
let mut v = Vec::new();
|
||||
self.walk_refs(&mut |r| {
|
||||
if let Ref::Body(name) = r {
|
||||
v.push(name.as_ref().to_string());
|
||||
}
|
||||
});
|
||||
v
|
||||
}
|
||||
|
||||
/// Point references to sketches and features (both by id) at their copies, and references
|
||||
/// that are still keyed by name at a feature's new name (`timeline.rename`).
|
||||
pub fn remap_refs(&mut self, ids: &BTreeMap<u64, u64>, names: &BTreeMap<String, String>) {
|
||||
|
||||
@@ -712,7 +712,9 @@ pub fn read(s: &str) -> Result<Document> {
|
||||
|| d.params.len() > crate::document::MAX_PARAMS
|
||||
|| d.components.len() > crate::document::MAX_FEATURES
|
||||
|| d.timeline_groups.len() > crate::document::MAX_FEATURES
|
||||
|| d.timeline_groups.iter().any(|group| group.features.len() > crate::document::MAX_FEATURES)
|
||||
|| d.timeline_groups
|
||||
.iter()
|
||||
.any(|group| group.features.len() > crate::document::MAX_FEATURES || group.joints.len() > crate::document::MAX_FEATURES)
|
||||
{
|
||||
return Err(DocError::Invalid("document too large".into()));
|
||||
}
|
||||
@@ -720,6 +722,8 @@ pub fn read(s: &str) -> Result<Document> {
|
||||
let feature_ids: std::collections::BTreeSet<_> = d.features.iter().map(|feature| feature.id).collect();
|
||||
let mut group_ids = std::collections::BTreeSet::new();
|
||||
let mut grouped_features = std::collections::BTreeSet::new();
|
||||
let joint_ids: std::collections::BTreeSet<_> = d.assembly.joints.iter().map(|joint| joint.id).collect();
|
||||
let mut grouped_joints = std::collections::BTreeSet::new();
|
||||
for group in &d.timeline_groups {
|
||||
if group.name.trim().is_empty() || group.name.len() > 128 || !group_ids.insert(group.id) {
|
||||
return Err(DocError::Invalid("damaged design: invalid timeline folder".into()));
|
||||
@@ -727,6 +731,9 @@ pub fn read(s: &str) -> Result<Document> {
|
||||
if group.parent.is_some_and(|parent| parent == group.id) {
|
||||
return Err(DocError::Invalid("damaged design: timeline folder cannot contain itself".into()));
|
||||
}
|
||||
if group.joints.iter().any(|joint| !joint_ids.contains(joint) || !grouped_joints.insert(*joint)) {
|
||||
return Err(DocError::Invalid("damaged design: invalid joint in a timeline folder".into()));
|
||||
}
|
||||
if group.features.iter().any(|feature| !feature_ids.contains(feature) || !grouped_features.insert(*feature)) {
|
||||
return Err(DocError::Invalid("damaged design: invalid feature in a timeline folder".into()));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
//! A sketch saves its equation curves (#8352) in `equations`: for each, the fit point spline it
|
||||
//! places, its formulas (x(t) and y(t), or y = f(x) without `x`), the range of the variable and
|
||||
//! the tolerance its points were chosen for. An older design has none, and its sketches mean
|
||||
//! what they meant. The last release refuses a design that has them (it asks for an update)
|
||||
//! instead of opening the splines as plain fixed splines that no longer follow their formulas.
|
||||
@@ -0,0 +1,3 @@
|
||||
//! Timeline folders save joint ids alongside their feature ids. Older designs default to no
|
||||
//! joint membership; empty membership is omitted. The last release refuses the newer format
|
||||
//! and asks for an update instead of losing folder membership.
|
||||
@@ -0,0 +1,6 @@
|
||||
//! Browser groups can nest and be ordered. A group saves its `parent` group (omitted at the top
|
||||
//! level); a group's items and a folder's `browser_order` list may name groups as numbers beside
|
||||
//! item keys as strings; and `browser_order` has a `"<component>/components"` list ordering a
|
||||
//! component's sub-components by placement id. Older designs read unchanged: they have no
|
||||
//! parents and no group entries. The last release refuses the newer format and asks for an
|
||||
//! update instead of dropping the nesting and the order.
|
||||
@@ -0,0 +1,7 @@
|
||||
//! A point cloud keeps the other properties its file gives its points (#8816): named numbers per
|
||||
//! point in `complex` (`columns`, each whole-numbered or not, and the `names` a whole-numbered one's
|
||||
//! values carry), and it can be coloured by one of them (`color_by: "property"`, with
|
||||
//! `color_property`, the ramp over `height_range`) and shown only where `filters` keep it (ranges,
|
||||
//! or sets of named values). Older designs need no transformation: their clouds have no other
|
||||
//! properties and no filters. The last release refuses a design saved with this (the newer format
|
||||
//! number) instead of opening its clouds without their properties, colouring and filters.
|
||||
@@ -0,0 +1,5 @@
|
||||
//! A design saves the print face of its bodies (`print_faces`, by body name): the flat face a
|
||||
//! slicer export lays on the print bed, held by the same face target a sketch on a face holds.
|
||||
//! An older design has none, and every body is exported as it lies, as before. The last
|
||||
//! release refuses a design that has print faces and asks for an update, instead of opening it
|
||||
//! and losing them on the next save.
|
||||
@@ -191,7 +191,11 @@ impl Document {
|
||||
}
|
||||
let mut out = Vec::with_capacity(found.defs.len());
|
||||
for d in found.defs {
|
||||
next.add_user_param(&d.name, &d.expression, d.unit.as_deref(), None)
|
||||
// A value of no fixed kind (a joint's) is evaluated without the design's units, so
|
||||
// its bare number stays a millimetre length whatever they are (#8865): `w = 5` is
|
||||
// what `5` is there.
|
||||
let unit = d.unit.unwrap_or_else(|| Self::infer_unit_in(&next.param_values().0, &d.expression, "mm"));
|
||||
next.add_user_param(&d.name, &d.expression, Some(&unit), None)
|
||||
.map_err(|e| DocError::Invalid(format!("`{} = {}`: {e}", d.name, d.expression)))?;
|
||||
let unit = next.param(&d.name).map(|p| p.unit.clone()).unwrap_or_default();
|
||||
out.push(Defined { name: d.name, expression: d.expression, unit });
|
||||
|
||||
@@ -23,6 +23,10 @@ use solidcraft_sketch::linalg;
|
||||
|
||||
use crate::{DocError, Document, IDENTITY, Mat, ModelState, Result, apply_point, apply_vector, mat_inverse, mat_mul};
|
||||
|
||||
#[path = "joints_handles.rs"]
|
||||
mod handles;
|
||||
pub use handles::{MotionAxis, motion_axes};
|
||||
|
||||
/// Joints the solver (and the URDF export) reads at most.
|
||||
pub const MAX_JOINTS: usize = 10_000;
|
||||
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
//! The instantaneous motion a joint value gives a selected occurrence. Probe the same
|
||||
//! placement graph and loop solver as a drive, including reversed joints and motion links.
|
||||
use std::collections::BTreeSet;
|
||||
|
||||
use super::{Analysis, Held, MAX_LOOP_VALUES, Solution, apply_links, build, joint_values, link_chains, solve_holding_with_analysis};
|
||||
use crate::{Document, Mat, ModelState, apply_point, apply_vector, mat_inverse, mat_mul};
|
||||
use solidcraft_geom::Vec3;
|
||||
|
||||
/// A driveable value, expressed as an axis of the selected occurrence in world coordinates.
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct MotionAxis {
|
||||
pub joint: u64,
|
||||
pub index: usize,
|
||||
pub origin: Vec3,
|
||||
/// Increasing the value moves/turns the selected occurrence along/about this unit axis.
|
||||
pub axis: Vec3,
|
||||
pub angular: bool,
|
||||
/// Selected motion (mm or radians) per native joint-value unit (mm or radians).
|
||||
pub scale: f64,
|
||||
}
|
||||
|
||||
/// Independent values on this occurrence's anchored chain, excluding fixed, suppressed,
|
||||
/// invalid and zero-range motion. Closed loops must admit the probe before an axis is shown.
|
||||
/// This is a bounded query for an explicit Move operation, not a per-hover rank analysis.
|
||||
pub fn motion_axes(doc: &Document, st: &ModelState, occurrence: u64) -> Vec<MotionAxis> {
|
||||
let asm = &doc.assembly;
|
||||
let values = joint_values(asm);
|
||||
let mut report = Solution::default();
|
||||
let built = build(doc, st, &values, &mut report);
|
||||
let tree = &built.tree;
|
||||
if tree.fixed.contains_key(&occurrence) || !tree.parent.contains_key(&occurrence) || !report.errors.is_empty() {
|
||||
return Vec::new();
|
||||
}
|
||||
let Some(base) = tree.world(occurrence, &values) else { return Vec::new() };
|
||||
let Some(inverse) = mat_inverse(&base) else { return Vec::new() };
|
||||
let path: BTreeSet<u64> = tree.path(occurrence).1.iter().map(|(id, _)| *id).collect();
|
||||
let linked: BTreeSet<_> = asm.links.iter().map(|l| (l.b, l.ib)).collect();
|
||||
let mut variables: Vec<_> = tree
|
||||
.path(occurrence)
|
||||
.1
|
||||
.iter()
|
||||
.filter_map(|(id, _)| tree.joints.get(id))
|
||||
.flat_map(|j| (0..j.kind.dofs().len()).map(move |i| (j.id, i)))
|
||||
.filter(|v| !linked.contains(v))
|
||||
.collect();
|
||||
variables.extend(link_chains(asm, tree, &path, &linked).1);
|
||||
let mut seen = BTreeSet::new();
|
||||
variables.retain(|v| seen.insert(*v));
|
||||
let reference = tree
|
||||
.path(occurrence)
|
||||
.1
|
||||
.first()
|
||||
.and_then(|(id, from_a)| {
|
||||
let (j, frames) = (tree.joints.get(id)?, tree.frames.get(id)?);
|
||||
let (owner, frame) = if *from_a { (j.b.occurrence, &frames.b) } else { (j.a.occurrence, &frames.a) };
|
||||
Some(apply_point(&mat_mul(&tree.world(owner, &values)?, frame), Vec3::ZERO))
|
||||
})
|
||||
.unwrap_or_else(|| apply_point(&base, Vec3::ZERO));
|
||||
let mut out: Vec<MotionAxis> = Vec::new();
|
||||
for (id, index) in variables.into_iter().take(MAX_LOOP_VALUES) {
|
||||
let Some(joint) = tree.joints.get(&id) else { continue };
|
||||
// A parameter expression constrains this value; moving it must not silently erase it.
|
||||
if joint.exprs.value(index).is_some() {
|
||||
continue;
|
||||
}
|
||||
let Some(q) = values.get(&id).and_then(|q| q.get(index)).copied() else { continue };
|
||||
for requested in [1e-3, -1e-3] {
|
||||
let mut probe = values.clone();
|
||||
let Some(slot) = probe.get_mut(&id).and_then(|v| v.get_mut(index)) else { break };
|
||||
*slot = q + requested;
|
||||
if let Some((lo, hi)) = joint.limits.get(index).copied().flatten() {
|
||||
*slot = (*slot).clamp(lo.min(hi), lo.max(hi));
|
||||
}
|
||||
let step = *slot - q;
|
||||
if step.abs() < 1e-10 {
|
||||
continue;
|
||||
}
|
||||
apply_links(asm, &mut probe);
|
||||
let next = if built.closing.is_empty() {
|
||||
tree.world(occurrence, &probe)
|
||||
} else {
|
||||
let mut changed = doc.clone();
|
||||
for j in &mut changed.assembly.joints {
|
||||
if let Some(q) = probe.get(&j.id) {
|
||||
j.values.clone_from(q);
|
||||
}
|
||||
}
|
||||
let held = Held::from([((id, index), q)]);
|
||||
let solved = solve_holding_with_analysis(&changed, st, &held, Analysis::Placement);
|
||||
if solved.conflicts.is_empty() && solved.errors.is_empty() { solved.world.get(&occurrence).copied() } else { None }
|
||||
};
|
||||
let Some(next) = next else { continue };
|
||||
let delta = mat_mul(&next, &inverse);
|
||||
if let Some(axis) = axis_of(delta, step, reference, id, index) {
|
||||
// Coincident values describe the same visible motion; retain the nearest joint.
|
||||
if !out.iter().any(|a| {
|
||||
a.angular == axis.angular
|
||||
&& a.axis.dot(axis.axis).abs() > 1.0 - 1e-6
|
||||
&& (!a.angular || (a.origin - axis.origin).cross(a.axis).len() < 1e-4)
|
||||
}) {
|
||||
out.push(axis);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
fn axis_of(delta: Mat, step: f64, reference: Vec3, joint: u64, index: usize) -> Option<MotionAxis> {
|
||||
let (x, y, z) = (apply_vector(&delta, Vec3::X), apply_vector(&delta, Vec3::Y), apply_vector(&delta, Vec3::Z));
|
||||
let sine = Vec3::new(y.z - z.y, z.x - x.z, x.y - y.x);
|
||||
let angle = sine.len().atan2(x.x + y.y + z.z - 1.0);
|
||||
let translation = apply_point(&delta, Vec3::ZERO);
|
||||
let (origin, axis, angular, scale) = if angle > 1e-8 {
|
||||
let axis = sine.normalized()? * step.signum();
|
||||
let transverse = translation - axis * translation.dot(axis);
|
||||
let centre = (transverse + axis.cross(transverse) / (angle * step.signum() * 0.5).tan()) * 0.5;
|
||||
(centre + axis * reference.dot(axis), axis, true, angle / step.abs())
|
||||
} else {
|
||||
(reference, (translation / step).normalized()?, false, translation.len() / step.abs())
|
||||
};
|
||||
(origin.is_finite() && axis.is_finite() && scale.is_finite() && scale > 1e-8).then_some(MotionAxis { joint, index, origin, axis, angular, scale })
|
||||
}
|
||||
@@ -10,6 +10,7 @@ pub mod appearance_pack;
|
||||
mod assembly;
|
||||
mod body_transfer;
|
||||
mod body_transfer_sheet;
|
||||
mod browser_tree;
|
||||
pub mod pbr_appearance;
|
||||
pub use body_transfer::{valid_transfer_matrix, validate_body_transfer};
|
||||
pub mod canvas;
|
||||
@@ -53,6 +54,8 @@ pub mod physical_material;
|
||||
mod piece_names;
|
||||
pub mod pipe_thread_catalog;
|
||||
pub mod point_cloud;
|
||||
mod point_cloud_complex;
|
||||
pub mod point_cloud_distribution;
|
||||
mod points;
|
||||
mod profile_refs;
|
||||
pub mod progress;
|
||||
@@ -61,6 +64,8 @@ pub use thread_catalog::{TappedThread, TappedThreadFamily, parse_tapped_thread,
|
||||
mod walk;
|
||||
pub use profile_refs::{capture_profile_selection, profile_fallback_notes, profile_selection_indices, profile_selection_indices_lenient};
|
||||
pub mod plastic;
|
||||
mod print_face;
|
||||
pub use print_face::PrintFace;
|
||||
pub mod project;
|
||||
mod project3d;
|
||||
pub mod render_aging;
|
||||
@@ -71,6 +76,7 @@ pub mod render_settings;
|
||||
pub mod render_surface;
|
||||
pub use project3d::iso_grid;
|
||||
pub mod sheet;
|
||||
pub mod sketch_equation;
|
||||
pub mod text_params;
|
||||
|
||||
pub use assembly::{
|
||||
|
||||
@@ -22,7 +22,8 @@ pub struct SavedModel {
|
||||
|
||||
/// Records refer to these at most.
|
||||
const MAX_ITEMS: usize = 1_000_000;
|
||||
/// Bodies, sketches and sheet bodies all the states hold together, at most (a state is a list of clones).
|
||||
/// Bodies, sketches, sheet bodies and sketch keys all the states hold together, at most (a state is
|
||||
/// a list of clones).
|
||||
const MAX_HELD: usize = 50_000_000;
|
||||
/// Longest text a record holds (bytes). A feature's warning can quote every generated name of
|
||||
/// the edges it picked: 122,701 characters in one design, whose saved model was refused, so it
|
||||
@@ -48,6 +49,11 @@ fn unhex(v: &Json) -> Result<u64> {
|
||||
v.as_str().and_then(|s| u64::from_str_radix(s, 16).ok()).ok_or_else(|| bad("saved model: key"))
|
||||
}
|
||||
|
||||
/// A sketch-key set's list `key` (`set` or `drop`).
|
||||
fn keys_list<'a>(set: &'a Json, key: &str) -> Result<&'a Vec<Json>> {
|
||||
set.get(key).and_then(Json::as_array).filter(|l| l.len() <= MAX_ITEMS).ok_or_else(|| bad("saved model: sketch keys"))
|
||||
}
|
||||
|
||||
fn bad(what: &str) -> DocError {
|
||||
DocError::Invalid(what.into())
|
||||
}
|
||||
@@ -128,9 +134,36 @@ struct Writer {
|
||||
sheet_index: HashMap<String, usize>,
|
||||
states: Vec<Json>,
|
||||
state_index: HashMap<usize, usize>,
|
||||
/// The states' sketch keys, each distinct map once, written as the changes from the set
|
||||
/// written before it: every state used to repeat the whole map (one entry per solved sketch),
|
||||
/// 85 % of a 5,484-feature design's records, which then did not fit the cache's manifest.
|
||||
sketch_key_sets: Vec<Json>,
|
||||
sketch_key_index: HashMap<BTreeMap<u64, u64>, usize>,
|
||||
last_sketch_keys: Option<(BTreeMap<u64, u64>, usize)>,
|
||||
}
|
||||
|
||||
impl Writer {
|
||||
/// The place of `keys` among the sketch-key sets, written the first time a state holds them
|
||||
/// (as the changes from the set written last: a later state mostly adds a sketch or two).
|
||||
fn sketch_key_set(&mut self, keys: &BTreeMap<u64, u64>) -> usize {
|
||||
if let Some(i) = self.sketch_key_index.get(keys) {
|
||||
return *i;
|
||||
}
|
||||
let record = match &self.last_sketch_keys {
|
||||
Some((base, at)) => {
|
||||
let set: Vec<Json> = keys.iter().filter(|(f, k)| base.get(f) != Some(k)).map(|(f, k)| json!([f, hex(*k)])).collect();
|
||||
let drop: Vec<u64> = base.keys().filter(|f| !keys.contains_key(f)).copied().collect();
|
||||
json!({"base": at, "set": set, "drop": drop})
|
||||
}
|
||||
None => json!({"set": keys.iter().map(|(f, k)| json!([f, hex(*k)])).collect::<Vec<_>>(), "drop": []}),
|
||||
};
|
||||
self.sketch_key_sets.push(record);
|
||||
let i = self.sketch_key_sets.len() - 1;
|
||||
self.sketch_key_index.insert(keys.clone(), i);
|
||||
self.last_sketch_keys = Some((keys.clone(), i));
|
||||
i
|
||||
}
|
||||
|
||||
fn names(&mut self, b: &ModelBody) -> usize {
|
||||
let id = b.names.id();
|
||||
if let Some(i) = self.names_index.get(&id) {
|
||||
@@ -144,9 +177,6 @@ impl Writer {
|
||||
}
|
||||
|
||||
fn model_body(&mut self, b: &ModelBody) -> Option<usize> {
|
||||
if b.body.is_mesh() {
|
||||
return None;
|
||||
}
|
||||
let key = BodyKey::of(b);
|
||||
if let Some(i) = self.model_body_index.get(&key) {
|
||||
return Some(*i);
|
||||
@@ -216,7 +246,7 @@ impl Writer {
|
||||
"reserved_body_names": st.reserved_body_names.iter().collect::<Vec<_>>(),
|
||||
"sheets": sheets, "construct": serde_json::to_value(&st.construct).ok()?,
|
||||
"threads": serde_json::to_value(&st.threads).ok()?,
|
||||
"sketch_keys": st.sketch_keys.iter().map(|(f, k)| json!([f, hex(*k)])).collect::<Vec<_>>(),
|
||||
"sketch_key_set": self.sketch_key_set(&st.sketch_keys),
|
||||
"blend_edges": serde_json::to_value(&st.blend_edges).ok()?, "fitted": serde_json::to_value(&st.fitted).ok()?,
|
||||
"tapered": serde_json::to_value(&st.tapered).ok()?,
|
||||
});
|
||||
@@ -228,7 +258,7 @@ impl Writer {
|
||||
|
||||
impl Model {
|
||||
/// The model as a design file keeps it: `None` unless it is `doc`'s evaluation without an
|
||||
/// error, holds no mesh bodies, and `doc` keeps no names saved before format 14. Works out
|
||||
/// error and `doc` keeps no names saved before format 14. Works out
|
||||
/// the face names not asked for yet (a saved model keeps them as worked out).
|
||||
pub fn saved(&self, doc: &Document) -> Option<SavedModel> {
|
||||
if self.results.is_empty() || self.results.iter().any(|r| r.error.is_some()) || !self.is_current(doc) || has_legacy_names(doc) {
|
||||
@@ -250,7 +280,7 @@ impl Model {
|
||||
}
|
||||
let records = json!({
|
||||
"features": features, "states": w.states, "model_bodies": w.model_bodies, "names": w.names, "sketches": w.sketches,
|
||||
"sheets": w.sheets,
|
||||
"sheets": w.sheets, "sketch_key_sets": w.sketch_key_sets,
|
||||
});
|
||||
Ok(SavedModel { records, bodies: w.bodies })
|
||||
})
|
||||
@@ -331,9 +361,49 @@ impl SavedModel {
|
||||
for s in list("sheets")? {
|
||||
sheets.push(serde_json::from_value::<crate::sheet::SheetBody>(s.clone()).map_err(|_| bad("saved model: sheet"))?);
|
||||
}
|
||||
let mut states = Vec::new();
|
||||
// The sketch-key sets, each the changes from an earlier one (`base`): a short record can
|
||||
// stand for a large set, so what they hold counts towards MAX_HELD as they are built.
|
||||
let mut key_sets: Vec<BTreeMap<u64, u64>> = Vec::new();
|
||||
let mut held = 0usize;
|
||||
for s in list("states")? {
|
||||
for k in list("sketch_key_sets")? {
|
||||
// A set is the changes from one before it.
|
||||
let base = match k.get("base") {
|
||||
Some(b) => Some(key_sets.get(index(Some(b), key_sets.len())?).ok_or_else(|| bad("saved model: sketch keys"))?),
|
||||
None => None,
|
||||
};
|
||||
let (drop, set) = (keys_list(k, "drop")?, keys_list(k, "set")?);
|
||||
// Counted before the base is copied: at most what the set can hold.
|
||||
held = held.saturating_add(base.map_or(0, BTreeMap::len)).saturating_add(set.len());
|
||||
if held > MAX_HELD {
|
||||
return Err(bad("saved model: sketch keys"));
|
||||
}
|
||||
let mut keys = base.cloned().unwrap_or_default();
|
||||
for f in drop {
|
||||
keys.remove(&f.as_u64().ok_or_else(|| bad("saved model: sketch keys"))?);
|
||||
}
|
||||
for e in set {
|
||||
keys.insert(e.get(0).and_then(Json::as_u64).ok_or_else(|| bad("saved model: sketch keys"))?, unhex(e.get(1).unwrap_or(&Json::Null))?);
|
||||
}
|
||||
key_sets.push(keys);
|
||||
}
|
||||
let records = list("states")?;
|
||||
// What every state holds, counted from its runs and its sketch-key set before any is
|
||||
// built (a hostile file cannot make the states clone more than MAX_HELD items).
|
||||
for s in records {
|
||||
for key in ["bodies", "sketches"] {
|
||||
for run in s.get(key).and_then(Json::as_array).ok_or_else(|| bad("saved model: state"))? {
|
||||
held = held.saturating_add(run.get(1).and_then(Json::as_u64).and_then(|n| usize::try_from(n).ok()).unwrap_or(usize::MAX));
|
||||
}
|
||||
}
|
||||
held = held.saturating_add(s.get("sheets").and_then(Json::as_array).map_or(0, Vec::len));
|
||||
held = held.saturating_add(key_sets.get(index(s.get("sketch_key_set"), key_sets.len())?).map_or(0, BTreeMap::len));
|
||||
if held > MAX_HELD {
|
||||
return Err(bad("saved model: states"));
|
||||
}
|
||||
}
|
||||
// Each state is independent of the others once the records they share are read: built
|
||||
// on threads (a 5,484-feature design spent 3.5 s building them one after another).
|
||||
let built = kernel::map_on_threads(records, 16, |s: &Json| -> Result<ModelState> {
|
||||
// Runs of consecutive indices, each within the list it indexes.
|
||||
let ids = |key: &str, len: usize| -> Result<Vec<usize>> {
|
||||
let mut out = Vec::new();
|
||||
@@ -349,12 +419,8 @@ impl SavedModel {
|
||||
};
|
||||
let field = |key: &str| parse(s.get(key));
|
||||
let invalid = |_| bad("saved model: state");
|
||||
let mut sketch_keys = BTreeMap::new();
|
||||
for k in s.get("sketch_keys").and_then(Json::as_array).ok_or_else(|| bad("saved model: state"))? {
|
||||
sketch_keys
|
||||
.insert(k.get(0).and_then(Json::as_u64).ok_or_else(|| bad("saved model: state"))?, unhex(k.get(1).unwrap_or(&Json::Null))?);
|
||||
}
|
||||
let st = ModelState {
|
||||
let sketch_keys = key_sets.get(index(s.get("sketch_key_set"), key_sets.len())?).cloned().ok_or_else(|| bad("saved model: state"))?;
|
||||
Ok(ModelState {
|
||||
frame_bodies: Default::default(),
|
||||
bodies: ids("bodies", model_bodies.len())?.into_iter().filter_map(|i| model_bodies.get(i).cloned()).collect(),
|
||||
sketches: ids("sketches", sketches.len())?.into_iter().filter_map(|i| sketches.get(i).cloned()).collect(),
|
||||
@@ -377,13 +443,9 @@ impl SavedModel {
|
||||
blend_edges: serde_json::from_value(field("blend_edges")?).map_err(invalid)?,
|
||||
fitted: serde_json::from_value(field("fitted")?).map_err(invalid)?,
|
||||
tapered: serde_json::from_value(field("tapered")?).map_err(invalid)?,
|
||||
};
|
||||
held = held.saturating_add(st.bodies.len()).saturating_add(st.sketches.len()).saturating_add(st.sheets.len());
|
||||
if held > MAX_HELD {
|
||||
return Err(bad("saved model: states"));
|
||||
}
|
||||
states.push(Arc::new(st));
|
||||
}
|
||||
})
|
||||
});
|
||||
let states = built.into_iter().map(|r| r.unwrap_or_else(|| Err(bad("saved model: state"))).map(Arc::new)).collect::<Result<Vec<_>>>()?;
|
||||
Ok(states)
|
||||
}
|
||||
|
||||
@@ -457,7 +519,8 @@ impl SavedModel {
|
||||
let mut stored = std::collections::HashSet::new();
|
||||
// The sheet bodies, each written once and named by place in the states: all kept.
|
||||
let sheets = list("sheets").cloned().unwrap_or_default();
|
||||
let mut used = bytes(sheets.as_slice()).iter().fold(0usize, |t, b| t.saturating_add(*b));
|
||||
let key_sets = list("sketch_key_sets").cloned().unwrap_or_default();
|
||||
let mut used = bytes(sheets.as_slice()).iter().chain(bytes(key_sets.as_slice()).iter()).fold(0usize, |t, b| t.saturating_add(*b));
|
||||
for s in std::iter::once(last).chain(order) {
|
||||
let (mut adds, mut new_names, mut new_sketches) = (HashMap::new(), std::collections::HashSet::new(), std::collections::HashSet::new());
|
||||
let mut records = *state_bytes.get(s)?;
|
||||
@@ -549,7 +612,7 @@ impl SavedModel {
|
||||
}
|
||||
let records = json!({
|
||||
"features": out_features, "states": out_states, "model_bodies": out_bodies, "names": kept_of(names.as_slice(), &names_used),
|
||||
"sketches": kept_of(sketches.as_slice(), &sketches_used), "sheets": sheets,
|
||||
"sketches": kept_of(sketches.as_slice(), &sketches_used), "sheets": sheets, "sketch_key_sets": key_sets,
|
||||
});
|
||||
let kept: Vec<usize> = (0..self.bodies.len()).filter(|i| kernel_used.get(*i) == Some(&true)).collect();
|
||||
let bodies = kept.iter().filter_map(|i| self.bodies.get(*i).cloned()).collect();
|
||||
|
||||
@@ -268,7 +268,7 @@ impl Document {
|
||||
.filter(|(_, _, k)| *k == Kind::Length)
|
||||
.map(|(_, e, _)| {
|
||||
let d = if expr::is_literal(&e) { expr::Defaults::default() } else { expr::Defaults { len: scale, ..expr::Defaults::default() } };
|
||||
expr::eval_with(&e, &look).and_then(|v| v.to_kind_in(Kind::Length, d)).ok()
|
||||
expr::eval_with_defaults(&e, &look, d).and_then(|v| v.to_kind_in(Kind::Length, d)).ok()
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
@@ -585,7 +585,7 @@ impl Document {
|
||||
}
|
||||
let unit = match unit {
|
||||
Some(u) => u.trim().to_string(),
|
||||
None => Self::infer_unit_in(vals, expr_s),
|
||||
None => Self::infer_unit_in(vals, expr_s, &self.units),
|
||||
};
|
||||
self.params.push(crate::Param {
|
||||
name: name.into(),
|
||||
@@ -696,18 +696,19 @@ impl Document {
|
||||
}
|
||||
|
||||
/// The unit for a new parameter with this expression: that of its value; a bare number is
|
||||
/// a length (mm).
|
||||
/// a length in the design's units, as a typed length reads it (#8865).
|
||||
pub(crate) fn infer_unit(&self, e: &str) -> String {
|
||||
Self::infer_unit_in(&self.param_values().0, e)
|
||||
Self::infer_unit_in(&self.param_values().0, e, &self.units)
|
||||
}
|
||||
|
||||
/// [`Document::infer_unit`] against parameter values already worked out.
|
||||
fn infer_unit_in(vals: &BTreeMap<String, Value>, e: &str) -> String {
|
||||
/// [`Document::infer_unit`] against parameter values already worked out, a length taking
|
||||
/// `units` (the design's, or `mm` where a bare number reads as millimetres).
|
||||
pub(crate) fn infer_unit_in(vals: &BTreeMap<String, Value>, e: &str, units: &str) -> String {
|
||||
let v = expr::eval_with(e, &|n| vals.get(n).copied().ok_or_else(|| DocError::Expr(format!("unknown parameter `{n}`"))));
|
||||
match v.ok().and_then(|v| v.kind()) {
|
||||
Some(Kind::Unitless) if !expr::references(e).is_empty() => String::new(),
|
||||
Some(Kind::Angle) => "deg".into(),
|
||||
_ => "mm".into(),
|
||||
_ => expr::length_unit_or_mm(units).to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -896,6 +897,18 @@ impl Document {
|
||||
n += 1;
|
||||
}
|
||||
}
|
||||
// An equation curve's variable hides a parameter of its name: such a parameter is
|
||||
// not what its formulas refer to.
|
||||
for (variable, e) in sketch.equation_exprs_mut() {
|
||||
if variable == old {
|
||||
continue;
|
||||
}
|
||||
let r = expr::rename_reference(e, old, new);
|
||||
if r != *e {
|
||||
*e = r;
|
||||
n += 1;
|
||||
}
|
||||
}
|
||||
for e in sketch.text_word_exprs_mut() {
|
||||
let r = crate::text_params::rename_reference(e, old, new);
|
||||
if r != *e {
|
||||
@@ -1137,6 +1150,19 @@ mod design_length_tests {
|
||||
assert_eq!(written("", 5.0), w("mm", "5 mm"));
|
||||
}
|
||||
|
||||
/// A bare number typed as a formula (`=5`) means the design's units like `5` does.
|
||||
#[test]
|
||||
fn a_formula_that_is_a_bare_number_gets_the_design_unit() {
|
||||
let mut doc = Document::new("Units");
|
||||
doc.units = "in".into();
|
||||
let length = crate::expr::Kind::Length;
|
||||
assert_eq!(doc.with_design_unit("5", length), "5 in");
|
||||
assert_eq!(doc.with_design_unit("=5", length), "=5 in");
|
||||
assert_eq!(doc.with_design_unit("=5 mm", length), "=5 mm");
|
||||
let inches = doc.eval(&doc.with_design_unit("=5", length), length).unwrap();
|
||||
assert!((inches - 127.0).abs() < 1e-9, "{inches}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn the_written_value_reads_back_within_a_micrometre() {
|
||||
for units in ["mm", "cm", "m", "in", "ft"] {
|
||||
|
||||