Compare commits

..
Author SHA1 Message Date
Hanif Koh f0c8eae488 Add #pragma once to Headers Without an Include Guard 2026-10-11 14:54:56 +08:00
115 changed files with 4534 additions and 14698 deletions
+7 -132
View File
@@ -20,37 +20,19 @@ on:
required: false required: false
type: boolean type: boolean
# Read by scripts/ci_deps_cache.sh.
env:
REPO: ${{ github.repository }}
WORKFLOW_REF: ${{ github.workflow_ref }}
BASE_REF: ${{ github.base_ref }}
jobs: jobs:
check_cache: # determines if there is a cache and outputs variables used in caching process check_cache: # determines if there is a cache and outputs variables used in caching process
name: Check Cache name: Check Cache
# Hosted macOS runners are scarce, so their lookup runs on Linux. runs-on: ${{ inputs.os }}
runs-on: ${{ startsWith(inputs.os, 'macos-') && 'ubuntu-24.04' || inputs.os }}
outputs: outputs:
cache-key: ${{ steps.set_outputs.outputs.cache-key }} cache-key: ${{ steps.set_outputs.outputs.cache-key }}
cache-path: ${{ steps.set_outputs.outputs.cache-path }} cache-path: ${{ steps.set_outputs.outputs.cache-path }}
valid-cache: ${{ steps.cache_deps.outputs.cache-hit }} valid-cache: ${{ steps.cache_deps.outputs.cache-hit }}
macos-path: ${{ steps.macos_path.outputs.path }}
key-inputs: ${{ steps.wait_check.outputs.key-inputs }}
wait-for: ${{ steps.wait_check.outputs.wait-for }}
wait-since: ${{ steps.wait_check.outputs.wait-since }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v7 uses: actions/checkout@v7
with: with:
lfs: 'false' lfs: 'false'
# The wait check compares the merge commit with its first parent.
fetch-depth: ${{ startsWith(inputs.os, 'macos-') && 2 || 1 }}
# Fetches only deps/, which the key hashes, and the wait script.
sparse-checkout: |
/deps/
/scripts/ci_deps_cache.sh
sparse-checkout-cone-mode: false
- name: set outputs - name: set outputs
id: set_outputs id: set_outputs
@@ -58,138 +40,31 @@ jobs:
# Anything that changes how the tree is built belongs in the key, or a job # Anything that changes how the tree is built belongs in the key, or a job
# restores one it cannot use. Linux amd64 passes no arch deliberately, so # restores one it cannot use. Linux amd64 passes no arch deliberately, so
# 'linux-clang' keeps the cache it already has. # 'linux-clang' keeps the cache it already has.
cache-os: ${{ (runner.os == 'macOS' || startsWith(inputs.os, 'macos-')) && format('{0}-{1}', inputs.os, inputs.arch) || (runner.os == 'Windows' && format('windows-{0}-{1}', inputs.arch, inputs.compiler) || format('linux-clang{0}', inputs.arch && format('-{0}', inputs.arch) || '')) }} cache-os: ${{ runner.os == 'macOS' && format('{0}-{1}', inputs.os, inputs.arch) || (runner.os == 'Windows' && format('windows-{0}-{1}', inputs.arch, inputs.compiler) || format('linux-clang{0}', inputs.arch && format('-{0}', inputs.arch) || '')) }}
# The Windows ARM64 deps build in build-arm64, all others under build; # The Windows ARM64 deps build in build-arm64, all others under build;
# build_deps.yml and build_orca.yml pass the Windows directory to build_win.bat. # build_deps.yml and build_orca.yml pass the Windows directory to build_win.bat.
dep-folder-name: ${{ (runner.os == 'macOS' || startsWith(inputs.os, 'macos-')) && format('/{0}', inputs.arch) || (runner.os == 'Windows' && inputs.arch == 'arm64') && '-arm64/OrcaSlicer_dep' || '/OrcaSlicer_dep' }} dep-folder-name: ${{ runner.os == 'macOS' && format('/{0}', inputs.arch) || (runner.os == 'Windows' && inputs.arch == 'arm64') && '-arm64/OrcaSlicer_dep' || '/OrcaSlicer_dep' }}
output-cmd: ${{ runner.os == 'Windows' && '$env:GITHUB_OUTPUT' || '"$GITHUB_OUTPUT"'}} output-cmd: ${{ runner.os == 'Windows' && '$env:GITHUB_OUTPUT' || '"$GITHUB_OUTPUT"'}}
run: | run: |
echo cache-key=${{ env.cache-os }}-cache-orcaslicer_deps-build-${{ hashFiles('deps/**') }} >> ${{ env.output-cmd }} echo cache-key=${{ env.cache-os }}-cache-orcaslicer_deps-build-${{ hashFiles('deps/**') }} >> ${{ env.output-cmd }}
# Relative to the workspace, which differs from the build's when this job runs on Linux. echo cache-path=${{ github.workspace }}/deps/build${{ env.dep-folder-name }} >> ${{ env.output-cmd }}
echo cache-path=deps/build${{ env.dep-folder-name }} >> ${{ env.output-cmd }}
# actions/cache matches the path too, so a Linux lookup for macOS uses the
# workspace of a hosted macOS job.
- name: macOS cache path
id: macos_path
if: ${{ startsWith(inputs.os, 'macos-') }}
run: echo "path=/Users/runner/work/${GITHUB_REPOSITORY#*/}/${GITHUB_REPOSITORY#*/}/${{ steps.set_outputs.outputs.cache-path }}" >> "$GITHUB_OUTPUT"
- name: load cache - name: load cache
id: cache_deps id: cache_deps
uses: actions/cache@v6 uses: actions/cache@v6
with: with:
path: ${{ steps.macos_path.outputs.path || format('{0}/{1}', github.workspace, steps.set_outputs.outputs.cache-path) }} path: ${{ steps.set_outputs.outputs.cache-path }}
key: ${{ steps.set_outputs.outputs.cache-key }} key: ${{ steps.set_outputs.outputs.cache-key }}
lookup-only: true lookup-only: true
# A pull request that misses the cache can wait for a base branch build of the same deps.
- name: check for a base branch build to wait for
id: wait_check
if: ${{ startsWith(inputs.os, 'macos-') && github.event_name == 'pull_request' && steps.cache_deps.outputs.cache-hit != 'true' }}
env:
GH_TOKEN: ${{ github.token }}
run: bash scripts/ci_deps_cache.sh check
wait_for_deps:
name: Wait for base branch deps
needs: [check_cache]
if: ${{ needs.check_cache.outputs.wait-for != '' }}
runs-on: ubuntu-24.04
env:
WAIT_MINUTES: 120
# Must exceed WAIT_MINUTES.
timeout-minutes: 130
# Waiting runs queue here, and only the first one holds a runner.
concurrency:
group: deps-wait-${{ github.base_ref }}-${{ needs.check_cache.outputs.cache-key }}
queue: max
outputs:
hit: ${{ steps.lookup.outputs.cache-hit }}
steps:
- name: Checkout
uses: actions/checkout@v7
with:
sparse-checkout: scripts/ci_deps_cache.sh
sparse-checkout-cone-mode: false
- name: wait for the deps cache
env:
GH_TOKEN: ${{ github.token }}
KEY: ${{ needs.check_cache.outputs.cache-key }}
KEY_INPUTS: ${{ needs.check_cache.outputs.key-inputs }}
WAIT_FOR: ${{ needs.check_cache.outputs.wait-for }}
WAIT_SINCE: ${{ needs.check_cache.outputs.wait-since }}
ARCH: ${{ inputs.arch }}
run: bash scripts/ci_deps_cache.sh wait
- name: load cache
id: lookup
uses: actions/cache@v6
with:
path: ${{ needs.check_cache.outputs.macos-path }}
key: ${{ needs.check_cache.outputs.cache-key }}
lookup-only: true
# Hosted macOS runners are scarce, so a pull request's macOS build waits until
# one is free that push and nightly builds do not need. See the script.
macos_admission:
name: Wait for a macOS runner
needs: [check_cache, wait_for_deps]
if: ${{ !cancelled() && needs.check_cache.result == 'success' && startsWith(inputs.os, 'macos-') && github.event_name == 'pull_request' && !contains(github.event.pull_request.labels.*.name, 'macos-priority') }}
runs-on: ubuntu-24.04
env:
WAIT_MINUTES: 240
PRIORITY: false
# Must exceed WAIT_MINUTES.
timeout-minutes: 250
# One line for every arch of every pull request, and only its first job polls.
concurrency:
group: macos-admission
queue: max
steps: &macos_admission_steps
- name: Checkout
uses: actions/checkout@v7
with:
sparse-checkout: scripts/ci_macos_admission.py
sparse-checkout-cone-mode: false
- name: wait for a macOS runner
env:
GH_TOKEN: ${{ github.token }}
MACOS_RUNNER_LIMIT: ${{ vars.MACOS_RUNNER_LIMIT }}
# -u, or the log shows nothing until the wait ends.
run: python3 -u scripts/ci_macos_admission.py
# The macos-priority label, when the run starts, puts a pull request in its own
# line, which the normal one yields to. The names are fixed, because a skipped
# job is listed under its unevaluated name, and the script matches both.
macos_admission_priority:
name: Wait for a macOS runner (priority)
needs: [check_cache, wait_for_deps]
if: ${{ !cancelled() && needs.check_cache.result == 'success' && startsWith(inputs.os, 'macos-') && github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'macos-priority') }}
runs-on: ubuntu-24.04
env:
WAIT_MINUTES: 240
PRIORITY: true
# Must exceed WAIT_MINUTES.
timeout-minutes: 250
concurrency:
group: macos-admission-priority
queue: max
steps: *macos_admission_steps
build_deps: # call next step build_deps: # call next step
name: Build Deps name: Build Deps
needs: [check_cache, wait_for_deps, macos_admission, macos_admission_priority] needs: [check_cache]
# A failed wait counts as no cache, so the deps are built here. A failed
# admission still builds rather than skip macOS.
if: ${{ !cancelled() && needs.check_cache.result == 'success' }}
uses: ./.github/workflows/build_deps.yml uses: ./.github/workflows/build_deps.yml
with: with:
cache-key: ${{ needs.check_cache.outputs.cache-key }} cache-key: ${{ needs.check_cache.outputs.cache-key }}
cache-path: ${{ needs.check_cache.outputs.cache-path }} cache-path: ${{ needs.check_cache.outputs.cache-path }}
valid-cache: ${{ needs.check_cache.outputs.valid-cache == 'true' || needs.wait_for_deps.outputs.hit == 'true' }} valid-cache: ${{ needs.check_cache.outputs.valid-cache == 'true' }}
os: ${{ inputs.os }} os: ${{ inputs.os }}
arch: ${{ inputs.arch }} arch: ${{ inputs.arch }}
compiler: ${{ inputs.compiler }} compiler: ${{ inputs.compiler }}
+2 -2
View File
@@ -45,7 +45,7 @@ jobs:
- name: load cached deps - name: load cached deps
uses: actions/cache@v6 uses: actions/cache@v6
with: with:
path: ${{ github.workspace }}/${{ inputs.cache-path }} path: ${{ inputs.cache-path }}
key: ${{ inputs.cache-key }} key: ${{ inputs.cache-key }}
- uses: lukka/get-cmake@latest - uses: lukka/get-cmake@latest
@@ -122,7 +122,7 @@ jobs:
choco install strawberryperl choco install strawberryperl
} }
# cache-path is the install directory inside the deps build directory. # cache-path is the install directory inside the deps build directory.
$deps = (Split-Path "${{ github.workspace }}/${{ inputs.cache-path }}").Replace('\', '/') $deps = (Split-Path "${{ inputs.cache-path }}").Replace('\', '/')
# -l compiles with Visual Studio's clang-cl and -x builds with Ninja; --msvc --msbuild is cl under the Visual Studio generator. # -l compiles with Visual Studio's clang-cl and -x builds with Ninja; --msvc --msbuild is cl under the Visual Studio generator.
$flags = if ("${{ inputs.compiler }}" -eq "clang") { "-l", "-x" } else { "--msvc", "--msbuild" } $flags = if ("${{ inputs.compiler }}" -eq "clang") { "-l", "-x" } else { "--msvc", "--msbuild" }
.\build_win.bat -d --arch ${{ inputs.arch }} --deps-dir $deps @flags .\build_win.bat -d --arch ${{ inputs.arch }} --deps-dir $deps @flags
+2 -9
View File
@@ -44,7 +44,7 @@ jobs:
if: ${{ !(runner.os == 'macOS' && inputs.macos-combine-only) }} if: ${{ !(runner.os == 'macOS' && inputs.macos-combine-only) }}
uses: actions/cache@v6 uses: actions/cache@v6
with: with:
path: ${{ github.workspace }}/${{ inputs.cache-path }} path: ${{ inputs.cache-path }}
key: ${{ inputs.cache-key }} key: ${{ inputs.cache-key }}
fail-on-cache-miss: true fail-on-cache-miss: true
@@ -179,13 +179,6 @@ jobs:
if: runner.os == 'macOS' && !inputs.macos-combine-only && !vars.SELF_HOSTED if: runner.os == 'macOS' && !inputs.macos-combine-only && !vars.SELF_HOSTED
run: | run: |
df -hI / df -hI /
# Deleting the unused Xcodes takes minutes, so only do it when the
# build might not fit. A cold build uses under 4 GiB after this step.
avail_gib=$(df -g / | awk 'NR == 2 { print $4 }')
if [ "$avail_gib" -ge 15 ]; then
echo "$avail_gib GiB free, enough for the build"
exit 0
fi
# Keep only the selected Xcode # Keep only the selected Xcode
xcode=$(basename "$(cd "$(xcode-select -p)/../.." && pwd -P)") xcode=$(basename "$(cd "$(xcode-select -p)/../.." && pwd -P)")
sudo find /Applications -maxdepth 1 -type d -name "Xcode_*.app" ! -name "$xcode" -exec rm -rf {} + sudo find /Applications -maxdepth 1 -type d -name "Xcode_*.app" ! -name "$xcode" -exec rm -rf {} +
@@ -467,7 +460,7 @@ jobs:
# --tests builds the unit tests too; the unit_tests_windows_* jobs run them. # --tests builds the unit tests too; the unit_tests_windows_* jobs run them.
run: | run: |
# cache-path is the install directory inside the deps build directory. # cache-path is the install directory inside the deps build directory.
$deps = (Split-Path "${{ github.workspace }}/${{ inputs.cache-path }}").Replace('\', '/') $deps = (Split-Path "${{ inputs.cache-path }}").Replace('\', '/')
# -l compiles with Visual Studio's clang-cl and -x builds with Ninja; --msvc --msbuild is cl under the Visual Studio generator. # -l compiles with Visual Studio's clang-cl and -x builds with Ninja; --msvc --msbuild is cl under the Visual Studio generator.
$flags = if ("${{ inputs.compiler }}" -eq "clang") { "-l", "-x" } else { "--msvc", "--msbuild" } $flags = if ("${{ inputs.compiler }}" -eq "clang") { "-l", "-x" } else { "--msvc", "--msbuild" }
.\build_win.bat -s --tests -i --arch ${{ inputs.arch }} --build-dir $env:BUILD_DIR --deps-dir $deps @flags .\build_win.bat -s --tests -i --arch ${{ inputs.arch }} --build-dir $env:BUILD_DIR --deps-dir $deps @flags
+19 -476
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -11797,118 +11797,6 @@ msgstr ""
msgid "parse json failed" msgid "parse json failed"
msgstr "" msgstr ""
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr ""
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr ""
msgid "Get Started"
msgstr ""
msgid "Please select your login region"
msgstr ""
msgid "Finish"
msgstr ""
msgid "Printer Selection"
msgstr ""
msgid "Vendors"
msgstr ""
msgid "Custom Printer"
msgstr ""
msgid "Create"
msgstr ""
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr ""
msgid "New printers found"
msgstr ""
#, possible-c-format, possible-boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr ""
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr ""
msgid "Vendor"
msgstr ""
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
msgid "Clear all"
msgstr ""
msgid "At least one filament must be selected."
msgstr ""
msgid "Do you want to use the default filament?"
msgstr ""
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr ""
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr ""
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr ""
msgid "[Action Required] " msgid "[Action Required] "
msgstr "" msgstr ""
@@ -14457,6 +14345,9 @@ msgstr ""
msgid "money/kg" msgid "money/kg"
msgstr "" msgstr ""
msgid "Vendor"
msgstr ""
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "" msgstr ""
@@ -18495,6 +18386,9 @@ msgstr ""
msgid "Calibrate" msgid "Calibrate"
msgstr "" msgstr ""
msgid "Finish"
msgstr ""
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "" msgstr ""
@@ -18987,6 +18881,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "" msgstr ""
msgid "Filament type"
msgstr ""
msgid "PLA" msgid "PLA"
msgstr "" msgstr ""
@@ -19509,6 +19406,9 @@ msgstr ""
msgid "Filament Preset" msgid "Filament Preset"
msgstr "" msgstr ""
msgid "Create"
msgstr ""
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "" msgstr ""
@@ -19784,9 +19684,6 @@ msgid ""
"Can be shared with others." "Can be shared with others."
msgstr "" msgstr ""
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -20843,33 +20740,6 @@ msgstr ""
msgid "PresetBundle" msgid "PresetBundle"
msgstr "" msgstr ""
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "" msgstr ""
@@ -20903,12 +20773,6 @@ msgstr ""
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "" msgstr ""
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "" msgstr ""
@@ -25173,6 +25037,9 @@ msgstr ""
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "" msgstr ""
msgid "Custom Printer"
msgstr ""
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "" msgstr ""
@@ -26305,27 +26172,6 @@ msgstr ""
msgid "Printer plugins" msgid "Printer plugins"
msgstr "" msgstr ""
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
msgid "Restore defaults"
msgstr ""
msgid "Invalid JSON"
msgstr ""
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "" msgstr ""
@@ -26339,6 +26185,9 @@ msgid ""
"This discards the preset's override and uses the global configuration." "This discards the preset's override and uses the global configuration."
msgstr "" msgstr ""
msgid "Restore defaults"
msgstr ""
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "" msgstr ""
@@ -26390,215 +26239,6 @@ msgstr ""
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "" msgstr ""
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, possible-c-format, possible-boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, possible-c-format, possible-boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, possible-c-format, possible-boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, possible-c-format, possible-boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, possible-c-format, possible-boost-format
msgid "Run \"%s\""
msgstr ""
#, possible-c-format, possible-boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
#, possible-c-format, possible-boost-format #, possible-c-format, possible-boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
msgstr "" msgstr ""
@@ -26757,54 +26397,6 @@ msgstr ""
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "" msgstr ""
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr ""
msgid "Edit Project Info"
msgstr ""
msgid "Model Information"
msgstr ""
msgid "Accessories"
msgstr ""
msgid "Profile Information"
msgstr ""
msgid "Model name"
msgstr ""
msgid "Created by"
msgstr ""
msgid "Remixed by"
msgstr ""
msgid "Shared by"
msgstr ""
msgid "Model description"
msgstr ""
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr ""
msgid "Profile Author"
msgstr ""
msgid "Profile description"
msgstr ""
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "" msgstr ""
@@ -26823,16 +26415,6 @@ msgstr ""
msgid "Terminal" msgid "Terminal"
msgstr "" msgstr ""
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, possible-c-format, possible-boost-format
msgid "Process exited with code: %s"
msgstr ""
msgid "A command is already running." msgid "A command is already running."
msgstr "" msgstr ""
@@ -27143,21 +26725,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr ""
msgid "Create new project"
msgstr ""
msgid "Recently opened"
msgstr ""
msgid "Open Containing Folder"
msgstr ""
msgid "Forward" msgid "Forward"
msgstr "" msgstr ""
@@ -27281,30 +26848,6 @@ msgstr ""
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "" msgstr ""
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "" msgstr ""
+26 -479
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: 2025-03-15 10:55+0100\n" "PO-Revision-Date: 2025-03-15 10:55+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
@@ -4492,7 +4492,7 @@ msgstr "Desar"
msgctxt "Navigation" msgctxt "Navigation"
msgid "Back" msgid "Back"
msgstr "Enrere" msgstr "Darrera"
msgid "Example" msgid "Example"
msgstr "Exemple" msgstr "Exemple"
@@ -13009,119 +13009,6 @@ msgstr "L'inici de sessió ha fallat. Torneu-ho a provar."
msgid "parse json failed" msgid "parse json failed"
msgstr "l'anàlisi del json ha fallat" msgstr "l'anàlisi del json ha fallat"
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr "Benvingut a Orca Slicer"
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr "Orca Slicer es configurarà en diversos passos. Comencem!"
msgid "Get Started"
msgstr "Comença"
msgid "Please select your login region"
msgstr "Si us plau selecciona la teva regió d'inici de sessió"
msgid "Finish"
msgstr "Acabar"
msgid "Printer Selection"
msgstr "Selecció d'Impressora"
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Impressora personalitzada"
msgid "Create"
msgstr "Crear"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr "S'ha de seleccionar almenys una impressora."
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr "Selecció de Filament"
msgid "System Filaments"
msgstr "Filaments del Sistema"
msgid "Custom Filaments"
msgstr "Filaments Personalitzats"
msgid "Create New"
msgstr "Crear Nou"
msgid "Filament type"
msgstr "Tipus de filament"
msgid "Vendor"
msgstr "Fabricant"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
msgid "Clear all"
msgstr "Netejar tot"
msgid "At least one filament must be selected."
msgstr "S'ha de seleccionar almenys un filament."
msgid "Do you want to use the default filament?"
msgstr "Vols utilitzar el filament per defecte?"
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Això desactiva totes les funcions al núvol, inclosa la sincronització de perfils amb Orca Cloud. Els usuaris que prefereixin treballar completament fora de línia poden activar aquesta opció."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Nota: quan el Mode Sigil·lós està activat, no es farà cap còpia de seguretat dels vostres perfils d'usuari a Orca Cloud."
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr "Connectors propietaris"
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr "Alguns proveïdors d'impressora requereixen connectors propietaris per comunicar-se amb les seves impressores. Si us plau selecciona el connector corresponent si utilitzes aquestes impressores."
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr "Tingues en compte que aquests connectors no són desenvolupats ni mantinguts per OrcaSlicer. S'han d'utilitzar a la teva discreció i risc."
msgid "Install Bambu Network plug-in"
msgstr "Instal·lar connector Bambu Network"
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Acció necessària] " msgstr "[Acció necessària] "
@@ -16142,6 +16029,9 @@ msgstr "Preu del filament. Només per a estadístiques"
msgid "money/kg" msgid "money/kg"
msgstr "diners/kg" msgstr "diners/kg"
msgid "Vendor"
msgstr "Fabricant"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Fabricant del filament. Només per a mostrar" msgstr "Fabricant del filament. Només per a mostrar"
@@ -20634,6 +20524,9 @@ msgstr "Recalibratge"
msgid "Calibrate" msgid "Calibrate"
msgstr "Calibrar" msgstr "Calibrar"
msgid "Finish"
msgstr "Acabar"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Com usar el resultat del calibratge?" msgstr "Com usar el resultat del calibratge?"
@@ -21181,6 +21074,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Calibratge de temperatura" msgstr "Calibratge de temperatura"
msgid "Filament type"
msgstr "Tipus de filament"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -21783,6 +21679,9 @@ msgstr "per exemple, Bàsic, Mat, Seda, Marbre"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Perfil de Filament" msgstr "Perfil de Filament"
msgid "Create"
msgstr "Crear"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "El proveïdor no està seleccionat, torneu a seleccionar el proveïdor." msgstr "El proveïdor no està seleccionat, torneu a seleccionar el proveïdor."
@@ -22097,9 +21996,6 @@ msgstr ""
"Impressora i tots els perfils de filament i de procés que pertanyen a la impressora.\n" "Impressora i tots els perfils de filament i de procés que pertanyen a la impressora.\n"
"Es pot compartir amb altres persones." "Es pot compartir amb altres persones."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -23307,33 +23203,6 @@ msgstr "Si s'activa, els valors anteriors es desen com a valors per defecte per
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
# AI Translated # AI Translated
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "La carpeta del paquet no existeix." msgstr "La carpeta del paquet no existeix."
@@ -23378,12 +23247,6 @@ msgstr "Cancel·lar la subscripció al paquet"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
# AI Translated # AI Translated
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Desar el paquet de perfils" msgstr "Desar el paquet de perfils"
@@ -28929,6 +28792,10 @@ msgstr "La meva configuració"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Configuració d'impressora personalitzada" msgstr "Configuració d'impressora personalitzada"
# AI Translated
msgid "Custom Printer"
msgstr "Impressora personalitzada"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Definir un perfil d'impressora personalitzat" msgstr "Definir un perfil d'impressora personalitzat"
@@ -30424,28 +30291,6 @@ msgstr "Connectors de filament"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Connectors d'impressora" msgstr "Connectors d'impressora"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Restaurar els valors predeterminats"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "La configuració no és un JSON vàlid. Els canvis no s'han desat." msgstr "La configuració no és un JSON vàlid. Els canvis no s'han desat."
@@ -30465,6 +30310,10 @@ msgstr ""
"\n" "\n"
"Això descarta la substitució del perfil i utilitza la configuració global." "Això descarta la substitució del perfil i utilitza la configuració global."
# AI Translated
msgid "Restore defaults"
msgstr "Restaurar els valors predeterminats"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "S'utilitza la configuració global. Deseu el perfil perquè es conservi." msgstr "S'utilitza la configuració global. Deseu el perfil perquè es conservi."
@@ -30534,215 +30383,6 @@ msgstr "Instal·lant el connector"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "S'ha instal·lat \"%s\"." msgstr "S'ha instal·lat \"%s\"."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -30959,54 +30599,6 @@ msgstr "No s'ha pogut tornar a carregar el connector."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "S'ha tornat a carregar \"%s\"." msgstr "S'ha tornat a carregar \"%s\"."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr "No hi ha informació del model"
msgid "Edit Project Info"
msgstr "Editar Informació del Projecte"
msgid "Model Information"
msgstr "Informació del Model"
msgid "Accessories"
msgstr "Accessoris"
msgid "Profile Information"
msgstr "Informació del Perfil"
msgid "Model name"
msgstr "Nom del model"
msgid "Created by"
msgstr "Creat per"
msgid "Remixed by"
msgstr "Remesclat per"
msgid "Shared by"
msgstr "Compartit per"
msgid "Model description"
msgstr "Descripció del model"
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr "Nom del perfil"
msgid "Profile Author"
msgstr "Autor del perfil"
msgid "Profile description"
msgstr "Descripció del perfil"
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Paràmetres del mode de purga" msgstr "Paràmetres del mode de purga"
@@ -31031,16 +30623,6 @@ msgstr "Redueix els residus de purga i imprimeix més ràpid. Pot causar una lle
msgid "Terminal" msgid "Terminal"
msgstr "Terminal" msgstr "Terminal"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Ja s'està executant una ordre." msgstr "Ja s'està executant una ordre."
@@ -31438,21 +31020,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr "No s'ha detectat el connector Bambu Network. Fes clic <a>aquí</a> per instal·lar-lo."
msgid "Create new project"
msgstr "Crear nou projecte"
msgid "Recently opened"
msgstr "Obert recentment"
msgid "Open Containing Folder"
msgstr "Obrir Carpeta Contenidora"
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Endavant" msgstr "Endavant"
@@ -31621,30 +31188,6 @@ msgstr "El connector \"%s\" sol·licita permís per a l'esdeveniment d'auditoria
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Sol·licitud de permís del connector" msgstr "Sol·licitud de permís del connector"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "La interfície de configuració del connector era buida. Es mostra l'editor predeterminat." msgstr "La interfície de configuració del connector era buida. Es mostra l'editor predeterminat."
@@ -32457,6 +32000,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Dibuixeu un perfil tancat per activar-ho" #~ msgstr "Dibuixeu un perfil tancat per activar-ho"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Esborrar-ho tot"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Resultat buit" #~ msgstr "Resultat buit"
+25 -478
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: Jakub Hencl\n" "Last-Translator: Jakub Hencl\n"
"Language-Team: \n" "Language-Team: \n"
@@ -13009,119 +13009,6 @@ msgstr "Přihlášení se nezdařilo. Zkuste to prosím znovu."
msgid "parse json failed" msgid "parse json failed"
msgstr "zpracování json se nezdařilo" msgstr "zpracování json se nezdařilo"
msgid "Loading…"
msgstr "Načtení probíhá…"
msgid "Welcome to Orca Slicer"
msgstr "Vítejte v Orca Slicer"
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr "Orca Slicer bude nastaven v několika krocích. Začněme!"
msgid "Get Started"
msgstr "Začínáme"
msgid "Please select your login region"
msgstr "Vyberte prosím svou oblast přihlášení"
msgid "Finish"
msgstr "Dokončit"
msgid "Printer Selection"
msgstr "Výběr tiskárny"
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Vlastní tiskárna"
msgid "Create"
msgstr "Vytvořit"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr "Musí být vybrána alespoň jedna tiskárna."
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr "Výběr Filamentu"
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr "Typ filamentu"
msgid "Vendor"
msgstr "Dodavatel"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
msgid "Clear all"
msgstr "Vymazat vše"
msgid "At least one filament must be selected."
msgstr "Musí být vybraný alespoň jeden Filament."
msgid "Do you want to use the default filament?"
msgstr "Chcete použít výchozí Filament?"
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Tím se vypnou všechny cloudové funkce včetně synchronizace profilů s Orca Cloud. Uživatelé, kteří chtějí pracovat zcela offline, mohou tuto možnost zapnout."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Poznámka: Je-li Stealth režim zapnut, nebudou vaše uživatelské profily zálohovány do Orca Cloud."
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr "Instalovat Bambu Network plug-in"
# AI Translated # AI Translated
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Vyžadována akce] " msgstr "[Vyžadována akce] "
@@ -16119,6 +16006,9 @@ msgstr "Cena filamentu. Pouze pro statistické účely."
msgid "money/kg" msgid "money/kg"
msgstr "peníze/kg" msgstr "peníze/kg"
msgid "Vendor"
msgstr "Dodavatel"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Dodavatel filamentu. Pouze pro zobrazení." msgstr "Dodavatel filamentu. Pouze pro zobrazení."
@@ -20575,6 +20465,9 @@ msgstr "Rekalibrace"
msgid "Calibrate" msgid "Calibrate"
msgstr "Kalibrovat" msgstr "Kalibrovat"
msgid "Finish"
msgstr "Dokončit"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Jak použít výsledek kalibrace?" msgstr "Jak použít výsledek kalibrace?"
@@ -21119,6 +21012,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Kalibrace teploty" msgstr "Kalibrace teploty"
msgid "Filament type"
msgstr "Typ filamentu"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -21721,6 +21617,9 @@ msgstr "např. Basic, Matte, Silk, Marble"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "filamentový přednastavený profil" msgstr "filamentový přednastavený profil"
msgid "Create"
msgstr "Vytvořit"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Dodavatel není vybrán, prosím vyberte jej znovu." msgstr "Dodavatel není vybrán, prosím vyberte jej znovu."
@@ -22032,9 +21931,6 @@ msgstr ""
"Tiskárna a všechny předvolby filamentů a procesů, které k ní patří.\n" "Tiskárna a všechny předvolby filamentů a procesů, které k ní patří.\n"
"Lze sdílet s ostatními." "Lze sdílet s ostatními."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -23305,33 +23201,6 @@ msgstr "Je-li zapnuto, budou výše uvedené hodnoty uloženy jako výchozí pro
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
# AI Translated # AI Translated
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "Složka balíčku neexistuje." msgstr "Složka balíčku neexistuje."
@@ -23376,12 +23245,6 @@ msgstr "Zrušit odběr balíčku"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
# AI Translated # AI Translated
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Uložit balíček předvoleb" msgstr "Uložit balíček předvoleb"
@@ -28941,6 +28804,10 @@ msgstr "Moje nastavení"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Nastavení vlastní tiskárny" msgstr "Nastavení vlastní tiskárny"
# AI Translated
msgid "Custom Printer"
msgstr "Vlastní tiskárna"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Definujte vlastní profil tiskárny" msgstr "Definujte vlastní profil tiskárny"
@@ -30438,28 +30305,6 @@ msgstr "Pluginy filamentu"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Pluginy tiskárny" msgstr "Pluginy tiskárny"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Obnovit výchozí"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "Konfigurace není platný JSON. Vaše změny nebyly uloženy." msgstr "Konfigurace není platný JSON. Vaše změny nebyly uloženy."
@@ -30479,6 +30324,10 @@ msgstr ""
"\n" "\n"
"Tím se zahodí přepsání v předvolbě a použije se globální konfigurace." "Tím se zahodí přepsání v předvolbě a použije se globální konfigurace."
# AI Translated
msgid "Restore defaults"
msgstr "Obnovit výchozí"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Používá se globální konfigurace. Pro trvalé uložení uložte předvolbu." msgstr "Používá se globální konfigurace. Pro trvalé uložení uložte předvolbu."
@@ -30548,215 +30397,6 @@ msgstr "Instalace pluginu"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "Nainstalováno: „%s“." msgstr "Nainstalováno: „%s“."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -30973,54 +30613,6 @@ msgstr "Opětovné načtení pluginu se nezdařilo."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "Znovu načteno: „%s“." msgstr "Znovu načteno: „%s“."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr ""
msgid "Edit Project Info"
msgstr ""
msgid "Model Information"
msgstr "Informace o modelu"
msgid "Accessories"
msgstr "Příslušenství"
msgid "Profile Information"
msgstr "Informace o profilu"
msgid "Model name"
msgstr "Název modelu"
msgid "Created by"
msgstr "Vytvořil"
msgid "Remixed by"
msgstr "Přepracováno"
msgid "Shared by"
msgstr "Sdíleno"
msgid "Model description"
msgstr "Popis modelu"
msgid "BOM"
msgstr "Seznam součástek (BOM)"
msgid "Profile name"
msgstr "Název profilu"
msgid "Profile Author"
msgstr "Autor profilu"
msgid "Profile description"
msgstr "Popis profilu"
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Nastavení režimu čištění" msgstr "Nastavení režimu čištění"
@@ -31045,16 +30637,6 @@ msgstr "Snižuje odpad při čištění a tiskne rychleji. Může způsobit mír
msgid "Terminal" msgid "Terminal"
msgstr "Terminál" msgstr "Terminál"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Příkaz již běží." msgstr "Příkaz již běží."
@@ -31452,21 +31034,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr "Síťový plug-in Bambu nebyl zjištěn. Klikněte <a>zde</a> k instalaci."
msgid "Create new project"
msgstr "Vytvořit nový projekt"
msgid "Recently opened"
msgstr "Nedávno otevřeno"
msgid "Open Containing Folder"
msgstr "Otevřít složku obsahující"
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Vpřed" msgstr "Vpřed"
@@ -31635,30 +31202,6 @@ msgstr "Plugin „%s“ žádá o oprávnění pro auditní událost Pythonu „
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Žádost pluginu o oprávnění" msgstr "Žádost pluginu o oprávnění"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "Konfigurační rozhraní pluginu bylo prázdné. Zobrazuje se výchozí editor." msgstr "Konfigurační rozhraní pluginu bylo prázdné. Zobrazuje se výchozí editor."
@@ -32468,6 +32011,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Pro aktivaci nakreslete uzavřený profil" #~ msgstr "Pro aktivaci nakreslete uzavřený profil"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Vymazat vše"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Prázdný výsledek" #~ msgstr "Prázdný výsledek"
+25 -479
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: Heiko Liebscher <hliebschergmail.com>\n" "Last-Translator: Heiko Liebscher <hliebschergmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -12758,120 +12758,6 @@ msgstr "Anmeldung fehlgeschlagen. Bitte versuchen Sie es erneut."
msgid "parse json failed" msgid "parse json failed"
msgstr "JSON-Parsing fehlgeschlagen" msgstr "JSON-Parsing fehlgeschlagen"
msgid "Loading…"
msgstr "Laden…"
msgid "Welcome to Orca Slicer"
msgstr "Willkommen im Orca Slicer"
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr "Das Orca Slicer wird in mehreren Schritten eingerichtet. Lass uns anfangen!"
msgid "Get Started"
msgstr "Loslegen"
msgid "Please select your login region"
msgstr "Bitte wählen Sie Ihre Login-Region aus"
msgid "Finish"
msgstr "Fertig"
msgid "Printer Selection"
msgstr "Druckerauswahl"
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Benutzerdefinierter Drucker"
msgid "Create"
msgstr "Erstellen"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr "Es muss mindestens ein Drucker ausgewählt sein."
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr "Filamentauswahl"
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr "Filamenttyp"
msgid "Vendor"
msgstr "Hersteller"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
# AI Translated
msgid "Clear all"
msgstr "Alle löschen"
msgid "At least one filament must be selected."
msgstr "Es muss mindestens ein Filament ausgewählt sein."
msgid "Do you want to use the default filament?"
msgstr "Möchten Sie das Standard-Filament verwenden?"
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Dies deaktiviert alle Cloud-Funktionen, einschließlich der Profil-Synchronisierung mit Orca Cloud. Benutzer, die es vorziehen, vollständig offline zu arbeiten, können diese Option aktivieren."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Hinweis: Wenn der Unsichtbare Modus aktiviert ist, werden Ihre Benutzerprofile nicht in Orca Cloud gesichert."
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr "Bambu Network-Plug-in installieren"
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Aktion erforderlich] " msgstr "[Aktion erforderlich] "
@@ -15818,6 +15704,9 @@ msgstr "Filamentpreis. Nur für statistische Zwecke."
msgid "money/kg" msgid "money/kg"
msgstr "Kosten/kg" msgstr "Kosten/kg"
msgid "Vendor"
msgstr "Hersteller"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Hersteller des Filaments. Nur zur Anzeige." msgstr "Hersteller des Filaments. Nur zur Anzeige."
@@ -20211,6 +20100,9 @@ msgstr "Rekalibrierung"
msgid "Calibrate" msgid "Calibrate"
msgstr "Kalibrieren" msgstr "Kalibrieren"
msgid "Finish"
msgstr "Fertig"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Wie wird das Kalibrierungsergebnis verwendet?" msgstr "Wie wird das Kalibrierungsergebnis verwendet?"
@@ -20751,6 +20643,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Temperatur Test" msgstr "Temperatur Test"
msgid "Filament type"
msgstr "Filamenttyp"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -21330,6 +21225,9 @@ msgstr "z.B. Basic, Matte, Silk, Marble"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Filamentprofil" msgstr "Filamentprofil"
msgid "Create"
msgstr "Erstellen"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Hersteller ist nicht ausgewählt, bitte Hersteller erneut auswählen." msgstr "Hersteller ist nicht ausgewählt, bitte Hersteller erneut auswählen."
@@ -21637,9 +21535,6 @@ msgstr ""
"Drucker und alle Filament- und Prozessprofile, die zum Drucker gehören.\n" "Drucker und alle Filament- und Prozessprofile, die zum Drucker gehören.\n"
"Kann mit anderen geteilt werden." "Kann mit anderen geteilt werden."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -22744,33 +22639,6 @@ msgstr "Wenn aktiviert, werden die obigen Werte als Standardwerte für zukünfti
msgid "PresetBundle" msgid "PresetBundle"
msgstr "Preset-Bündel" msgstr "Preset-Bündel"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "Bündelordner existiert nicht." msgstr "Bündelordner existiert nicht."
@@ -22804,12 +22672,6 @@ msgstr "Bündel abbestellen"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "Preset-Bündel exportieren" msgstr "Preset-Bündel exportieren"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Preset-Bündel speichern" msgstr "Preset-Bündel speichern"
@@ -28337,6 +28199,10 @@ msgstr "Meine Einstellungen"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Benutzerdefinierte Druckereinrichtung" msgstr "Benutzerdefinierte Druckereinrichtung"
# AI Translated
msgid "Custom Printer"
msgstr "Benutzerdefinierter Drucker"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Ein benutzerdefiniertes Druckerprofil festlegen" msgstr "Ein benutzerdefiniertes Druckerprofil festlegen"
@@ -29825,28 +29691,6 @@ msgstr "Filament-Plugins"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Drucker-Plugins" msgstr "Drucker-Plugins"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Standardwerte wiederherstellen"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "Die Konfiguration ist kein gültiges JSON. Ihre Änderungen wurden nicht gespeichert." msgstr "Die Konfiguration ist kein gültiges JSON. Ihre Änderungen wurden nicht gespeichert."
@@ -29866,6 +29710,10 @@ msgstr ""
"\n" "\n"
"Dadurch wird die Überschreibung des Profils verworfen und die globale Konfiguration verwendet." "Dadurch wird die Überschreibung des Profils verworfen und die globale Konfiguration verwendet."
# AI Translated
msgid "Restore defaults"
msgstr "Standardwerte wiederherstellen"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Globale Konfiguration wird verwendet. Speichern Sie das Profil, um dies dauerhaft zu übernehmen." msgstr "Globale Konfiguration wird verwendet. Speichern Sie das Profil, um dies dauerhaft zu übernehmen."
@@ -29935,215 +29783,6 @@ msgstr "Plugin wird installiert"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "„%s“ installiert." msgstr "„%s“ installiert."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -30360,54 +29999,6 @@ msgstr "Plugin konnte nicht neu geladen werden."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "„%s“ neu geladen." msgstr "„%s“ neu geladen."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr ""
msgid "Edit Project Info"
msgstr ""
msgid "Model Information"
msgstr "Modellinformationen"
msgid "Accessories"
msgstr "Zubehör"
msgid "Profile Information"
msgstr "Profilinformationen"
msgid "Model name"
msgstr "Modellname"
msgid "Created by"
msgstr "Erstellt von"
msgid "Remixed by"
msgstr "Remixed von"
msgid "Shared by"
msgstr "Geteilt von"
msgid "Model description"
msgstr "Modellbeschreibung"
msgid "BOM"
msgstr "Stückliste"
msgid "Profile name"
msgstr "Profilname"
msgid "Profile Author"
msgstr "Profilautor"
msgid "Profile description"
msgstr "Profilbeschreibung"
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Einstellungen des Spülmodus" msgstr "Einstellungen des Spülmodus"
@@ -30432,16 +30023,6 @@ msgstr "Reduziert den Spülabfall und druckt schneller. Kann zu leichter Farbver
msgid "Terminal" msgid "Terminal"
msgstr "Terminal" msgstr "Terminal"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Ein Befehl wird bereits ausgeführt." msgstr "Ein Befehl wird bereits ausgeführt."
@@ -30839,21 +30420,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr "Das Bambu Network-Plug-in wurde nicht erkannt. Klicken Sie <a>hier</a>, um es zu installieren."
msgid "Create new project"
msgstr "Neues Projekt erstellen"
msgid "Recently opened"
msgstr "Zuletzt geöffnet"
msgid "Open Containing Folder"
msgstr "Enthaltenden Ordner öffnen"
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Vorwärts" msgstr "Vorwärts"
@@ -31022,30 +30588,6 @@ msgstr "Plugin „%s“ fordert eine Berechtigung für das Python-Audit-Ereignis
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Berechtigungsanfrage eines Plugins" msgstr "Berechtigungsanfrage eines Plugins"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "Die Konfigurationsoberfläche des Plugins war leer. Der Standardeditor wird angezeigt." msgstr "Die Konfigurationsoberfläche des Plugins war leer. Der Standardeditor wird angezeigt."
@@ -31853,6 +31395,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Zum Aktivieren ein geschlossenes Profil zeichnen" #~ msgstr "Zum Aktivieren ein geschlossenes Profil zeichnen"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Alle löschen"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Leeres Ergebnis" #~ msgstr "Leeres Ergebnis"
+19 -476
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: 2026-06-17 15:44-0300\n" "PO-Revision-Date: 2026-06-17 15:44-0300\n"
"Last-Translator: Alexandre Folle de Menezes\n" "Last-Translator: Alexandre Folle de Menezes\n"
"Language-Team: \n" "Language-Team: \n"
@@ -11793,118 +11793,6 @@ msgstr ""
msgid "parse json failed" msgid "parse json failed"
msgstr "" msgstr ""
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr ""
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr ""
msgid "Get Started"
msgstr ""
msgid "Please select your login region"
msgstr ""
msgid "Finish"
msgstr ""
msgid "Printer Selection"
msgstr ""
msgid "Vendors"
msgstr ""
msgid "Custom Printer"
msgstr ""
msgid "Create"
msgstr ""
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr ""
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr ""
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr ""
msgid "Vendor"
msgstr ""
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
msgid "Clear all"
msgstr ""
msgid "At least one filament must be selected."
msgstr ""
msgid "Do you want to use the default filament?"
msgstr ""
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr ""
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr ""
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr ""
msgid "[Action Required] " msgid "[Action Required] "
msgstr "" msgstr ""
@@ -14453,6 +14341,9 @@ msgstr ""
msgid "money/kg" msgid "money/kg"
msgstr "" msgstr ""
msgid "Vendor"
msgstr ""
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "" msgstr ""
@@ -18491,6 +18382,9 @@ msgstr ""
msgid "Calibrate" msgid "Calibrate"
msgstr "" msgstr ""
msgid "Finish"
msgstr ""
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "" msgstr ""
@@ -18983,6 +18877,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "" msgstr ""
msgid "Filament type"
msgstr ""
msgid "PLA" msgid "PLA"
msgstr "" msgstr ""
@@ -19505,6 +19402,9 @@ msgstr ""
msgid "Filament Preset" msgid "Filament Preset"
msgstr "" msgstr ""
msgid "Create"
msgstr ""
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "" msgstr ""
@@ -19780,9 +19680,6 @@ msgid ""
"Can be shared with others." "Can be shared with others."
msgstr "" msgstr ""
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -20839,33 +20736,6 @@ msgstr ""
msgid "PresetBundle" msgid "PresetBundle"
msgstr "" msgstr ""
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "" msgstr ""
@@ -20899,12 +20769,6 @@ msgstr ""
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "" msgstr ""
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "" msgstr ""
@@ -25169,6 +25033,9 @@ msgstr ""
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "" msgstr ""
msgid "Custom Printer"
msgstr ""
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "" msgstr ""
@@ -26301,27 +26168,6 @@ msgstr ""
msgid "Printer plugins" msgid "Printer plugins"
msgstr "" msgstr ""
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
msgid "Restore defaults"
msgstr ""
msgid "Invalid JSON"
msgstr ""
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "" msgstr ""
@@ -26335,6 +26181,9 @@ msgid ""
"This discards the preset's override and uses the global configuration." "This discards the preset's override and uses the global configuration."
msgstr "" msgstr ""
msgid "Restore defaults"
msgstr ""
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "" msgstr ""
@@ -26386,215 +26235,6 @@ msgstr ""
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "" msgstr ""
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
msgstr "" msgstr ""
@@ -26753,54 +26393,6 @@ msgstr ""
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "" msgstr ""
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr ""
msgid "Edit Project Info"
msgstr ""
msgid "Model Information"
msgstr ""
msgid "Accessories"
msgstr ""
msgid "Profile Information"
msgstr ""
msgid "Model name"
msgstr ""
msgid "Created by"
msgstr ""
msgid "Remixed by"
msgstr ""
msgid "Shared by"
msgstr ""
msgid "Model description"
msgstr ""
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr ""
msgid "Profile Author"
msgstr ""
msgid "Profile description"
msgstr ""
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "" msgstr ""
@@ -26819,16 +26411,6 @@ msgstr ""
msgid "Terminal" msgid "Terminal"
msgstr "" msgstr ""
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
msgid "A command is already running." msgid "A command is already running."
msgstr "" msgstr ""
@@ -27139,21 +26721,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr ""
msgid "Create new project"
msgstr ""
msgid "Recently opened"
msgstr ""
msgid "Open Containing Folder"
msgstr ""
msgid "Forward" msgid "Forward"
msgstr "" msgstr ""
@@ -27277,30 +26844,6 @@ msgstr ""
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "" msgstr ""
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "" msgstr ""
+27 -478
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: Ian A. Bassi <>\n" "Last-Translator: Ian A. Bassi <>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -12463,119 +12463,6 @@ msgstr "El inicio de sesión ha fallado. Inténtalo de nuevo."
msgid "parse json failed" msgid "parse json failed"
msgstr "error al analizar el json" msgstr "error al analizar el json"
msgid "Loading…"
msgstr "Cargando…"
msgid "Welcome to Orca Slicer"
msgstr "Bienvenido a Orca Slicer"
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr "Orca Slicer se configurará mediante varios pasos. ¡Comencemos!"
msgid "Get Started"
msgstr "Comenzar"
msgid "Please select your login region"
msgstr "Por favor, seleccione su región:"
msgid "Finish"
msgstr "Finalizar"
msgid "Printer Selection"
msgstr "Selección de la impresora"
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Impresora personalizada"
msgid "Create"
msgstr "Crear"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr "Al menos se debe seleccionar una impresora."
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr "Selección de filamento"
msgid "System Filaments"
msgstr "Filamentos del sistema"
msgid "Custom Filaments"
msgstr "Filamentos personalizados"
msgid "Create New"
msgstr "Crear nuevo"
msgid "Filament type"
msgstr "Tipo de filamento"
msgid "Vendor"
msgstr "Fabricante"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
msgid "Clear all"
msgstr "Limpiar todo"
msgid "At least one filament must be selected."
msgstr "Al menos se debe seleccionar un filamento."
msgid "Do you want to use the default filament?"
msgstr "¿Desea usar el filamento por defecto?"
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Esto desactiva todas las funciones en la nube, incluida la sincronización de perfiles con Orca Cloud. Los usuarios que prefieran trabajar totalmente sin conexión pueden activar esta opción."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Nota: Cuando el modo sigiloso está activado, no se realizará ninguna copia de seguridad de tus perfiles de usuario en Orca Cloud."
msgid "Enable Stealth Mode."
msgstr "Activar modo sigiloso."
msgid "Proprietary Plugins"
msgstr "Plugins propietarios"
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr "Algunos proveedores de impresoras requieren plugins propietarios para la comunicación con sus impresoras. Seleccione el plugin correspondiente si utiliza tales impresoras."
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr "Tenga en cuenta que estos plugins no están desarrollados ni mantenidos por OrcaSlicer. Deben usarse bajo su propia responsabilidad."
msgid "Install Bambu Network plug-in"
msgstr "Instalar plug-in Bambu Network"
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Acción requerida] " msgstr "[Acción requerida] "
@@ -15475,6 +15362,9 @@ msgstr "Precio del filamento. Sólo para las estadísticas."
msgid "money/kg" msgid "money/kg"
msgstr "moneda/kg" msgstr "moneda/kg"
msgid "Vendor"
msgstr "Fabricante"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Fabricante del filamento. Para mostrar solamente." msgstr "Fabricante del filamento. Para mostrar solamente."
@@ -19830,6 +19720,9 @@ msgstr "Recalibración"
msgid "Calibrate" msgid "Calibrate"
msgstr "Calibración" msgstr "Calibración"
msgid "Finish"
msgstr "Finalizar"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "¿Cómo usar el resultado de la calibración?" msgstr "¿Cómo usar el resultado de la calibración?"
@@ -20374,6 +20267,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Calibración de temperatura" msgstr "Calibración de temperatura"
msgid "Filament type"
msgstr "Tipo de filamento"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -20952,6 +20848,9 @@ msgstr "por ejemplo: Básico, Mate, Seda, Mármol"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Perfil de Filamento" msgstr "Perfil de Filamento"
msgid "Create"
msgstr "Crear"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "El fabricante no ha sido seleccionado, por favor, seleccione el fabricante." msgstr "El fabricante no ha sido seleccionado, por favor, seleccione el fabricante."
@@ -21258,9 +21157,6 @@ msgstr ""
"Impresora y todos los perfiles de filamento y proceso que pertenecen a la impresora.\n" "Impresora y todos los perfiles de filamento y proceso que pertenecen a la impresora.\n"
"Se puede compartir con otros." "Se puede compartir con otros."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -22355,33 +22251,6 @@ msgstr "Si está activado, los valores anteriores se guardan como los predetermi
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PaqueteDePerfiles" msgstr "PaqueteDePerfiles"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "La carpeta «Bundle» no existe." msgstr "La carpeta «Bundle» no existe."
@@ -22415,12 +22284,6 @@ msgstr "Desuscribirse del paquete"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportarPaqueteDePerfiles" msgstr "ExportarPaqueteDePerfiles"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Guardar paquete de perfiles" msgstr "Guardar paquete de perfiles"
@@ -27897,6 +27760,10 @@ msgstr "Mis ajustes"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Configuración de impresora personalizada" msgstr "Configuración de impresora personalizada"
# AI Translated
msgid "Custom Printer"
msgstr "Impresora personalizada"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Definir un perfil de impresora personalizado" msgstr "Definir un perfil de impresora personalizado"
@@ -29384,28 +29251,6 @@ msgstr "Plugins de filamento"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Plugins de impresora" msgstr "Plugins de impresora"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Restaurar valores predeterminados"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "La configuración no es un JSON válido. No se guardaron los cambios." msgstr "La configuración no es un JSON válido. No se guardaron los cambios."
@@ -29425,6 +29270,10 @@ msgstr ""
"\n" "\n"
"Esto descarta la configuración propia del perfil y usa la configuración global." "Esto descarta la configuración propia del perfil y usa la configuración global."
# AI Translated
msgid "Restore defaults"
msgstr "Restaurar valores predeterminados"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Usando la configuración global. Guarde el perfil para conservarla." msgstr "Usando la configuración global. Guarde el perfil para conservarla."
@@ -29494,215 +29343,6 @@ msgstr "Instalando plugin"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "Se ha instalado \"%s\"." msgstr "Se ha instalado \"%s\"."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -29919,54 +29559,6 @@ msgstr "No se pudo recargar el plugin."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "Se ha recargado \"%s\"." msgstr "Se ha recargado \"%s\"."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr "No hay información sobre el modelo"
msgid "Edit Project Info"
msgstr "Editar información del proyecto"
msgid "Model Information"
msgstr "Información del modelo"
msgid "Accessories"
msgstr "Accesorios"
msgid "Profile Information"
msgstr "Información del perfil"
msgid "Model name"
msgstr "Nombre del modelo"
msgid "Created by"
msgstr "Creado por"
msgid "Remixed by"
msgstr "Remixado por"
msgid "Shared by"
msgstr "Compartido por"
msgid "Model description"
msgstr "Descripción del modelo"
msgid "BOM"
msgstr "Lista de materiales"
msgid "Profile name"
msgstr "Nombre del perfil"
msgid "Profile Author"
msgstr "Autor del perfil"
msgid "Profile description"
msgstr "Descripción del perfil"
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Ajustes del modo de purga" msgstr "Ajustes del modo de purga"
@@ -29991,16 +29583,6 @@ msgstr "Reduce el desperdicio de purga e imprime más rápido. Puede causar una
msgid "Terminal" msgid "Terminal"
msgstr "Terminal" msgstr "Terminal"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Ya se está ejecutando un comando." msgstr "Ya se está ejecutando un comando."
@@ -30398,21 +29980,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr "Plug-in de Bambu Network no detectado. Haga clic <a>aquí</a> para instalarlo."
msgid "Create new project"
msgstr "Crear nuevo proyecto"
msgid "Recently opened"
msgstr "Abiertos recientemente"
msgid "Open Containing Folder"
msgstr "Abrir carpeta contenedora"
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Adelante" msgstr "Adelante"
@@ -30581,30 +30148,6 @@ msgstr "El plugin \"%s\" solicita permiso para el evento de auditoría de Python
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Solicitud de permiso del plugin" msgstr "Solicitud de permiso del plugin"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "La interfaz de configuración del plugin estaba vacía. Se muestra el editor predeterminado." msgstr "La interfaz de configuración del plugin estaba vacía. Se muestra el editor predeterminado."
@@ -31408,6 +30951,9 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Dibuje un perfil cerrado para activarlo" #~ msgstr "Dibuje un perfil cerrado para activarlo"
#~ msgid "Clear all"
#~ msgstr "Borrar todo"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Resultado vacío" #~ msgstr "Resultado vacío"
@@ -35987,6 +35533,9 @@ msgstr ""
#~ msgid "Preview only mode for G-Code file." #~ msgid "Preview only mode for G-Code file."
#~ msgstr "Modo de vista previa sólo para el archivo G-Code." #~ msgstr "Modo de vista previa sólo para el archivo G-Code."
#~ msgid "Printer Selection"
#~ msgstr "Selección de la impresora"
#~ msgid "Purging after filament change will be done inside objects' infills. This may lower the amount of waste and decrease the print time. If the walls are printed with transparent filament, the mixed color infill will be seen outside" #~ msgid "Purging after filament change will be done inside objects' infills. This may lower the amount of waste and decrease the print time. If the walls are printed with transparent filament, the mixed color infill will be seen outside"
#~ msgstr "La purga tras el cambio de filamento se realizará dentro del relleno de los objetos. Esto puede reducir la cantidad de residuos y disminuir el tiempo de impresión. Si las paredes se imprimen con filamento transparente, el mezclado se podrá ver en el exterior." #~ msgstr "La purga tras el cambio de filamento se realizará dentro del relleno de los objetos. Esto puede reducir la cantidad de residuos y disminuir el tiempo de impresión. Si las paredes se imprimen con filamento transparente, el mezclado se podrá ver en el exterior."
+25 -479
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: 2026-07-20 13:33+0200\n" "PO-Revision-Date: 2026-07-20 13:33+0200\n"
"Last-Translator: Manu Goiogana <mgoiogana@gmail.com>\n" "Last-Translator: Manu Goiogana <mgoiogana@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -12579,120 +12579,6 @@ msgstr "Saio-hasierak huts egin du. Saiatu berriro."
msgid "parse json failed" msgid "parse json failed"
msgstr "JSONa analizatzeak huts egin du" msgstr "JSONa analizatzeak huts egin du"
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr ""
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr ""
msgid "Get Started"
msgstr ""
msgid "Please select your login region"
msgstr ""
msgid "Finish"
msgstr "Amaitu"
msgid "Printer Selection"
msgstr ""
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Inprimagailu pertsonalizatua"
msgid "Create"
msgstr "Sortu"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr ""
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr ""
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr "Filamentu mota"
msgid "Vendor"
msgstr "Hornitzailea"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
# AI Translated
msgid "Clear all"
msgstr "Garbitu dena"
msgid "At least one filament must be selected."
msgstr ""
msgid "Do you want to use the default filament?"
msgstr ""
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Honek hodeiko eginbide guztiak desgaitzen ditu, Orca Cloud profilen sinkronizazioa barne. Guztiz lineaz kanpo lan egin nahi duten erabiltzaileek aukera hau gaitu dezakete."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Oharra: Modu ezkutua gaituta dagoenean, zure erabiltzaile-profilen segurtasun-kopiarik ez da egingo Orca Cloud-en."
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr ""
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Ekintza behar da] " msgstr "[Ekintza behar da] "
@@ -15623,6 +15509,9 @@ msgstr "Filamentuaren prezioa, estatistiketarako soilik."
msgid "money/kg" msgid "money/kg"
msgstr "dirua/kg" msgstr "dirua/kg"
msgid "Vendor"
msgstr "Hornitzailea"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Filamentuaren hornitzailea. Bistaratzeko soilik." msgstr "Filamentuaren hornitzailea. Bistaratzeko soilik."
@@ -20001,6 +19890,9 @@ msgstr "Birkalibrazioa"
msgid "Calibrate" msgid "Calibrate"
msgstr "Kalibratu" msgstr "Kalibratu"
msgid "Finish"
msgstr "Amaitu"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Nola erabil ditzaket kalibrazio-emaitzak?" msgstr "Nola erabil ditzaket kalibrazio-emaitzak?"
@@ -20546,6 +20438,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Tenperaturaren kalibrazioa" msgstr "Tenperaturaren kalibrazioa"
msgid "Filament type"
msgstr "Filamentu mota"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -21125,6 +21020,9 @@ msgstr "adib. Oinarrizkoa, Matea, Zeta, Marmola"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Filamentu-aurrezarpena" msgstr "Filamentu-aurrezarpena"
msgid "Create"
msgstr "Sortu"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Ez da hornitzailerik hautatu; hautatu berriro." msgstr "Ez da hornitzailerik hautatu; hautatu berriro."
@@ -21428,9 +21326,6 @@ msgstr ""
"Inprimagailua eta hari dagozkion filamentuen eta prozesuen aurrezarpen guztiak.\n" "Inprimagailua eta hari dagozkion filamentuen eta prozesuen aurrezarpen guztiak.\n"
"Besteekin parteka daitezke." "Besteekin parteka daitezke."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -22528,33 +22423,6 @@ msgstr "Gaituz gero, goiko balioak etorkizuneko STEP inportazioetan erabiliko di
msgid "PresetBundle" msgid "PresetBundle"
msgstr "Aurrezarpen-paketea" msgstr "Aurrezarpen-paketea"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "Pakete-karpeta ez da existitzen." msgstr "Pakete-karpeta ez da existitzen."
@@ -22588,12 +22456,6 @@ msgstr "Utzi paketearen harpidetza"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "Esportatu aurrezarpen-paketea" msgstr "Esportatu aurrezarpen-paketea"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Gorde aurrezarpen sorta" msgstr "Gorde aurrezarpen sorta"
@@ -28080,6 +27942,10 @@ msgstr "Nire ezarpenak"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Inprimagailu pertsonalizatuaren konfigurazioa" msgstr "Inprimagailu pertsonalizatuaren konfigurazioa"
# AI Translated
msgid "Custom Printer"
msgstr "Inprimagailu pertsonalizatua"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Definitu inprimagailu-profil pertsonalizatu bat" msgstr "Definitu inprimagailu-profil pertsonalizatu bat"
@@ -29575,28 +29441,6 @@ msgstr "Filamentu-pluginak"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Inprimagailu-pluginak" msgstr "Inprimagailu-pluginak"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Leheneratu lehenetsiak"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "Konfigurazioa ez da baliozko JSON bat. Zure aldaketak ez dira gorde." msgstr "Konfigurazioa ez da baliozko JSON bat. Zure aldaketak ez dira gorde."
@@ -29616,6 +29460,10 @@ msgstr ""
"\n" "\n"
"Honek aurrezarpenaren gainidazketa baztertzen du eta konfigurazio globala erabiltzen du." "Honek aurrezarpenaren gainidazketa baztertzen du eta konfigurazio globala erabiltzen du."
# AI Translated
msgid "Restore defaults"
msgstr "Leheneratu lehenetsiak"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Konfigurazio globala erabiltzen. Gorde aurrezarpena iraunarazteko." msgstr "Konfigurazio globala erabiltzen. Gorde aurrezarpena iraunarazteko."
@@ -29685,215 +29533,6 @@ msgstr "Plugina instalatzen"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "\"%s\" instalatu da." msgstr "\"%s\" instalatu da."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -30110,54 +29749,6 @@ msgstr "Ezin izan da plugina birkargatu."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "\"%s\" birkargatu da." msgstr "\"%s\" birkargatu da."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr ""
msgid "Edit Project Info"
msgstr ""
msgid "Model Information"
msgstr ""
msgid "Accessories"
msgstr ""
msgid "Profile Information"
msgstr ""
msgid "Model name"
msgstr ""
msgid "Created by"
msgstr ""
msgid "Remixed by"
msgstr ""
msgid "Shared by"
msgstr ""
msgid "Model description"
msgstr ""
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr ""
msgid "Profile Author"
msgstr ""
msgid "Profile description"
msgstr ""
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Purgatze-moduaren ezarpenak" msgstr "Purgatze-moduaren ezarpenak"
@@ -30182,16 +29773,6 @@ msgstr "Purgatze-hondakinak murrizten ditu eta azkarrago inprimatzen du. Kolore-
msgid "Terminal" msgid "Terminal"
msgstr "Terminala" msgstr "Terminala"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Komando bat exekutatzen ari da dagoeneko." msgstr "Komando bat exekutatzen ari da dagoeneko."
@@ -30589,21 +30170,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr ""
msgid "Create new project"
msgstr ""
msgid "Recently opened"
msgstr ""
msgid "Open Containing Folder"
msgstr ""
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Aurrera" msgstr "Aurrera"
@@ -30772,30 +30338,6 @@ msgstr "\"%s\" pluginak baimena eskatzen du \"%s\" Python ikuskaritza-gertaerara
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Pluginaren baimen-eskaera" msgstr "Pluginaren baimen-eskaera"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "Pluginaren konfigurazio-interfazea hutsik zegoen. Editore lehenetsia erakusten." msgstr "Pluginaren konfigurazio-interfazea hutsik zegoen. Editore lehenetsia erakusten."
@@ -31600,6 +31142,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Marraztu profil itxi bat gaitzeko" #~ msgstr "Marraztu profil itxi bat gaitzeko"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Garbitu dena"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Emaitza hutsa" #~ msgstr "Emaitza hutsa"
+26 -480
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Guislain Cyril, Thomas Lété\n" "Language-Team: Guislain Cyril, Thomas Lété\n"
@@ -4313,7 +4313,7 @@ msgstr "Enregistrer"
msgctxt "Navigation" msgctxt "Navigation"
msgid "Back" msgid "Back"
msgstr "Retour" msgstr "Arrière"
msgid "Example" msgid "Example"
msgstr "Exemple" msgstr "Exemple"
@@ -12610,120 +12610,6 @@ msgstr "Échec de la connexion. Veuillez réessayer."
msgid "parse json failed" msgid "parse json failed"
msgstr "Échec de l’analyse du JSON" msgstr "Échec de l’analyse du JSON"
msgid "Loading…"
msgstr "Chargement en cours…"
msgid "Welcome to Orca Slicer"
msgstr "Bienvenue sur Orca Slicer"
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr "Orca Slicer sera configuré en plusieurs étapes. Commençons !"
msgid "Get Started"
msgstr "Commencer"
msgid "Please select your login region"
msgstr "Veuillez sélectionner votre région de connexion"
msgid "Finish"
msgstr "Terminer"
msgid "Printer Selection"
msgstr "Sélection de l'imprimante"
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Imprimante personnalisée"
msgid "Create"
msgstr "Créer"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr "Au moins une imprimante doit être sélectionnée."
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr "Sélection des filaments"
msgid "System Filaments"
msgstr "Filaments du système"
msgid "Custom Filaments"
msgstr "Filaments personnalisés"
msgid "Create New"
msgstr "Créer un nouveau filament"
msgid "Filament type"
msgstr "Filament"
msgid "Vendor"
msgstr "Fabricant"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
# AI Translated
msgid "Clear all"
msgstr "Tout effacer"
msgid "At least one filament must be selected."
msgstr "Au moins un filament doit être sélectionné."
msgid "Do you want to use the default filament?"
msgstr "Voulez-vous utiliser le filament par défaut ?"
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Ceci désactive toutes les fonctionnalités cloud, y compris la synchronisation des profils Orca Cloud. Les utilisateurs qui préfèrent travailler entièrement hors ligne peuvent activer cette option."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Remarque : lorsque le mode furtif est activé, vos profils utilisateur ne sont pas sauvegardés dans Orca Cloud."
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr "Veuillez noter que ces plugins ne sont pas développés ou maintenus par OrcaSlicer. Ils doivent être utilisés à votre propre discrétion et à vos propres risques."
msgid "Install Bambu Network plug-in"
msgstr "Installer le plugin Bambu Network"
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Action requise] " msgstr "[Action requise] "
@@ -15654,6 +15540,9 @@ msgstr "Coût du filament. Pour les statistiques uniquement"
msgid "money/kg" msgid "money/kg"
msgstr "argent/kg" msgstr "argent/kg"
msgid "Vendor"
msgstr "Fabricant"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Vendeur du filament. Pour affichage uniquement" msgstr "Vendeur du filament. Pour affichage uniquement"
@@ -20031,6 +19920,9 @@ msgstr "Recalibration"
msgid "Calibrate" msgid "Calibrate"
msgstr "Calibrer" msgstr "Calibrer"
msgid "Finish"
msgstr "Terminer"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Comment utiliser le résultat de la calibration ?" msgstr "Comment utiliser le résultat de la calibration ?"
@@ -20574,6 +20466,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Calibration de Température" msgstr "Calibration de Température"
msgid "Filament type"
msgstr "Filament"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -21152,6 +21047,9 @@ msgstr "par exemple : Basic, Matte, Silk, Marble"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Préréglage du filament" msgstr "Préréglage du filament"
msgid "Create"
msgstr "Créer"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Le fournisseur n’est pas sélectionné, veuillez le sélectionner à nouveau." msgstr "Le fournisseur n’est pas sélectionné, veuillez le sélectionner à nouveau."
@@ -21458,9 +21356,6 @@ msgstr ""
"Imprimante et tous les préréglages de filament et de traitement qui appartiennent à l’imprimante.\n" "Imprimante et tous les préréglages de filament et de traitement qui appartiennent à l’imprimante.\n"
"Peut être partagé avec d’autres." "Peut être partagé avec d’autres."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -22563,33 +22458,6 @@ msgstr "Si activé, les valeurs ci-dessus sont stockées comme valeurs par défa
msgid "PresetBundle" msgid "PresetBundle"
msgstr "Paquet de préréglages" msgstr "Paquet de préréglages"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "Le dossier du paquet n’existe pas." msgstr "Le dossier du paquet n’existe pas."
@@ -22623,12 +22491,6 @@ msgstr "Se désabonner du paquet"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "Exporter le paquet de préréglages" msgstr "Exporter le paquet de préréglages"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Enregistrer le paquet de préréglages" msgstr "Enregistrer le paquet de préréglages"
@@ -27833,6 +27695,10 @@ msgstr "Mes réglages"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Configuration d’une imprimante personnalisée" msgstr "Configuration d’une imprimante personnalisée"
# AI Translated
msgid "Custom Printer"
msgstr "Imprimante personnalisée"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Définir un profil d’imprimante personnalisé" msgstr "Définir un profil d’imprimante personnalisé"
@@ -29321,28 +29187,6 @@ msgstr "Plugins de filament"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Plugins d’imprimante" msgstr "Plugins d’imprimante"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Restaurer les valeurs par défaut"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "La configuration n’est pas un JSON valide. Vos modifications n’ont pas été enregistrées." msgstr "La configuration n’est pas un JSON valide. Vos modifications n’ont pas été enregistrées."
@@ -29362,6 +29206,10 @@ msgstr ""
"\n" "\n"
"Cela supprime la surcharge du préréglage et utilise la configuration globale." "Cela supprime la surcharge du préréglage et utilise la configuration globale."
# AI Translated
msgid "Restore defaults"
msgstr "Restaurer les valeurs par défaut"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Utilisation de la configuration globale. Enregistrez le préréglage pour la conserver." msgstr "Utilisation de la configuration globale. Enregistrez le préréglage pour la conserver."
@@ -29431,215 +29279,6 @@ msgstr "Installation du plugin"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "« %s » installé." msgstr "« %s » installé."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -29856,54 +29495,6 @@ msgstr "Échec du rechargement du plugin."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "« %s » rechargé." msgstr "« %s » rechargé."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr "Pas d'information sur le modèle"
msgid "Edit Project Info"
msgstr "Modifier les informations du projet"
msgid "Model Information"
msgstr "Informations sur le modèle"
msgid "Accessories"
msgstr "Accessoires"
msgid "Profile Information"
msgstr "Informations de profil"
msgid "Model name"
msgstr "Nom du modèle"
msgid "Created by"
msgstr "Créé par"
msgid "Remixed by"
msgstr "Remixé par"
msgid "Shared by"
msgstr "Partagé par"
msgid "Model description"
msgstr "Description du modèle"
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr "Nom du profil"
msgid "Profile Author"
msgstr "Auteur du profil"
msgid "Profile description"
msgstr "Description du profil"
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Réglages du mode de purge" msgstr "Réglages du mode de purge"
@@ -29928,16 +29519,6 @@ msgstr "Réduit les déchets d’amorçage et imprime plus vite. Peut provoquer
msgid "Terminal" msgid "Terminal"
msgstr "Terminal" msgstr "Terminal"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Une commande est déjà en cours d’exécution." msgstr "Une commande est déjà en cours d’exécution."
@@ -30335,21 +29916,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr "Le plug-in Bambu Network n'est pas détecté. Cliquez <a>ici</a> pour l'installer."
msgid "Create new project"
msgstr "Créer un nouveau projet"
msgid "Recently opened"
msgstr "Récemment ouvert"
msgid "Open Containing Folder"
msgstr "Ouvrir le dossier contenant"
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Avancer" msgstr "Avancer"
@@ -30518,30 +30084,6 @@ msgstr "Le plugin « %s » demande l’autorisation pour l’événement d’aud
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Demande d’autorisation d’un plugin" msgstr "Demande d’autorisation d’un plugin"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "L’interface de configuration du plugin était vide. Affichage de l’éditeur par défaut." msgstr "L’interface de configuration du plugin était vide. Affichage de l’éditeur par défaut."
@@ -31346,6 +30888,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Dessinez un profil fermé pour activer" #~ msgstr "Dessinez un profil fermé pour activer"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Tout effacer"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Résultat vide" #~ msgstr "Résultat vide"
+25 -479
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"Language: hu\n" "Language: hu\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -12923,120 +12923,6 @@ msgstr "Sikertelen bejelentkezés. Próbáld újra."
msgid "parse json failed" msgid "parse json failed"
msgstr "a JSON feldolgozása sikertelen" msgstr "a JSON feldolgozása sikertelen"
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr ""
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr ""
msgid "Get Started"
msgstr ""
msgid "Please select your login region"
msgstr ""
msgid "Finish"
msgstr "Kész"
msgid "Printer Selection"
msgstr ""
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Egyedi nyomtató"
msgid "Create"
msgstr "Létrehoz"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr ""
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr ""
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr "Filament típusa"
msgid "Vendor"
msgstr "Gyártó"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
# AI Translated
msgid "Clear all"
msgstr "Összes törlése"
msgid "At least one filament must be selected."
msgstr ""
msgid "Do you want to use the default filament?"
msgstr ""
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Ez kikapcsolja az összes felhőfunkciót, beleértve az Orca Cloud profilszinkronizálást is. Azok a felhasználók kapcsolhatják be, akik teljesen offline szeretnének dolgozni."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Megjegyzés: ha a lopakodó mód be van kapcsolva, a felhasználói profiljaidról nem készül biztonsági mentés az Orca Cloudba."
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr ""
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Művelet szükséges] " msgstr "[Művelet szükséges] "
@@ -16049,6 +15935,9 @@ msgstr "A filament ára, kizárólag statisztikai célokra."
msgid "money/kg" msgid "money/kg"
msgstr "pénz/kg" msgstr "pénz/kg"
msgid "Vendor"
msgstr "Gyártó"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Filamentgyártó." msgstr "Filamentgyártó."
@@ -20526,6 +20415,9 @@ msgstr "Újrakalibrálás"
msgid "Calibrate" msgid "Calibrate"
msgstr "Kalibrálás" msgstr "Kalibrálás"
msgid "Finish"
msgstr "Kész"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Hogyan használjam a kalibrálási eredményeket?" msgstr "Hogyan használjam a kalibrálási eredményeket?"
@@ -21069,6 +20961,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Hőmérséklet kalibrálás" msgstr "Hőmérséklet kalibrálás"
msgid "Filament type"
msgstr "Filament típusa"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -21665,6 +21560,9 @@ msgstr "pl.: Basic, Matt, Silk, Marble"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Filamentbeállítás" msgstr "Filamentbeállítás"
msgid "Create"
msgstr "Létrehoz"
# AI Translated # AI Translated
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Nincs kiválasztva gyártó; kérlek, válaszd ki újra a gyártót." msgstr "Nincs kiválasztva gyártó; kérlek, válaszd ki újra a gyártót."
@@ -21982,9 +21880,6 @@ msgstr ""
"A nyomtató és az ahhoz tartozó összes filament- és folyamatbeállítás.\n" "A nyomtató és az ahhoz tartozó összes filament- és folyamatbeállítás.\n"
"Megosztható másokkal." "Megosztható másokkal."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -23188,33 +23083,6 @@ msgstr "Ha be van kapcsolva, a fenti értékek alapértelmezettként tárolódna
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
# AI Translated # AI Translated
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "A csomagmappa nem létezik." msgstr "A csomagmappa nem létezik."
@@ -23259,12 +23127,6 @@ msgstr "Leiratkozás a csomagról"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
# AI Translated # AI Translated
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Beállításcsomag mentése" msgstr "Beállításcsomag mentése"
@@ -28807,6 +28669,10 @@ msgstr "Saját beállítások"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Egyedi nyomtató beállítása" msgstr "Egyedi nyomtató beállítása"
# AI Translated
msgid "Custom Printer"
msgstr "Egyedi nyomtató"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Egyedi nyomtatóprofil létrehozása" msgstr "Egyedi nyomtatóprofil létrehozása"
@@ -30303,28 +30169,6 @@ msgstr "Filamentbővítmények"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Nyomtatóbővítmények" msgstr "Nyomtatóbővítmények"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Alapértékek visszaállítása"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "A konfiguráció nem érvényes JSON. A módosításaid nem lettek mentve." msgstr "A konfiguráció nem érvényes JSON. A módosításaid nem lettek mentve."
@@ -30344,6 +30188,10 @@ msgstr ""
"\n" "\n"
"Ez elveti a beállítás felülírását, és a globális konfigurációt használja." "Ez elveti a beállítás felülírását, és a globális konfigurációt használja."
# AI Translated
msgid "Restore defaults"
msgstr "Alapértékek visszaállítása"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "A globális konfiguráció van használatban. A megőrzéséhez mentsd a beállítást." msgstr "A globális konfiguráció van használatban. A megőrzéséhez mentsd a beállítást."
@@ -30413,215 +30261,6 @@ msgstr "Bővítmény telepítése"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "\"%s\" telepítve." msgstr "\"%s\" telepítve."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -30838,54 +30477,6 @@ msgstr "Nem sikerült újratölteni a bővítményt."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "\"%s\" újratöltve." msgstr "\"%s\" újratöltve."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr ""
msgid "Edit Project Info"
msgstr ""
msgid "Model Information"
msgstr ""
msgid "Accessories"
msgstr ""
msgid "Profile Information"
msgstr ""
msgid "Model name"
msgstr ""
msgid "Created by"
msgstr ""
msgid "Remixed by"
msgstr ""
msgid "Shared by"
msgstr ""
msgid "Model description"
msgstr ""
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr ""
msgid "Profile Author"
msgstr ""
msgid "Profile description"
msgstr ""
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Öblítési mód beállításai" msgstr "Öblítési mód beállításai"
@@ -30910,16 +30501,6 @@ msgstr "Csökkenti az előkészítési hulladékot, és gyorsabban nyomtat. Enyh
msgid "Terminal" msgid "Terminal"
msgstr "Terminál" msgstr "Terminál"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Már fut egy parancs." msgstr "Már fut egy parancs."
@@ -31317,21 +30898,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr ""
msgid "Create new project"
msgstr ""
msgid "Recently opened"
msgstr ""
msgid "Open Containing Folder"
msgstr ""
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Előre" msgstr "Előre"
@@ -31500,30 +31066,6 @@ msgstr "A(z) \"%s\" bővítmény engedélyt kér a(z) \"%s\" Python audit esemé
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Bővítmény engedélykérése" msgstr "Bővítmény engedélykérése"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "A bővítmény konfigurációs felülete üres volt. Az alapértelmezett szerkesztő jelenik meg." msgstr "A bővítmény konfigurációs felülete üres volt. Az alapértelmezett szerkesztő jelenik meg."
@@ -32332,6 +31874,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Az engedélyezéshez rajzolj egy zárt profilt" #~ msgstr "Az engedélyezéshez rajzolj egy zárt profilt"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Összes törlése"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Üres eredmény" #~ msgstr "Üres eredmény"
+26 -479
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
@@ -4416,7 +4416,7 @@ msgstr "Salva"
msgctxt "Navigation" msgctxt "Navigation"
msgid "Back" msgid "Back"
msgstr "Indietro" msgstr "Posteriore"
msgid "Example" msgid "Example"
msgstr "Esempio" msgstr "Esempio"
@@ -12868,119 +12868,6 @@ msgstr "Accesso non riuscito. Riprova."
msgid "parse json failed" msgid "parse json failed"
msgstr "analisi del JSON non riuscita" msgstr "analisi del JSON non riuscita"
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr "Benvenuti in OrcaSlicer"
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr "OrcaSlicer verrà configurato seguendo diversi passaggi. Cominciamo!"
msgid "Get Started"
msgstr "Inizia"
msgid "Please select your login region"
msgstr "Seleziona la tua regione di accesso"
msgid "Finish"
msgstr "Fine"
msgid "Printer Selection"
msgstr "Selezione della stampante"
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Stampante personalizzata"
msgid "Create"
msgstr "Crea"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr "È necessario selezionare almeno una stampante."
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr "Selezione del filamento"
msgid "System Filaments"
msgstr "Filamenti di sistema"
msgid "Custom Filaments"
msgstr "Filamenti personalizzati"
msgid "Create New"
msgstr "Crea Nuovo"
msgid "Filament type"
msgstr "Tipo filamento"
msgid "Vendor"
msgstr "Produttore"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
msgid "Clear all"
msgstr "Cancella tutto"
msgid "At least one filament must be selected."
msgstr "È necessario selezionare almeno un filamento."
msgid "Do you want to use the default filament?"
msgstr "Vuoi utilizzare il filamento predefinito?"
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Questo disabilita tutte le funzionalità cloud, inclusa la sincronizzazione dei profili di Orca Cloud. Gli utenti che preferiscono lavorare completamente offline possono abilitare questa opzione."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Nota: quando la Modalità Stealth è abilitata, i tuoi profili utente non verranno salvati come backup su Orca Cloud."
msgid "Enable Stealth Mode."
msgstr "Abilita la modalità invisibile."
msgid "Proprietary Plugins"
msgstr "Moduli proprietari"
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr "Le stampanti di alcuni produttori richiedono dei moduli proprietari per far in modo che la comunicazione abbia successo. Seleziona il modulo corrispondente se utilizzi tali stampanti."
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr "Si prega di notare che questi moduli non sono sviluppati o mantenuti da OrcaSlicer. Dovrebbero essere utilizzati a proprio rischio e discrezione."
msgid "Install Bambu Network plug-in"
msgstr "Installa il modulo di rete Bambu"
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Azione necessaria] " msgstr "[Azione necessaria] "
@@ -15966,6 +15853,9 @@ msgstr "Prezzo del filamento, solo a fini statistici."
msgid "money/kg" msgid "money/kg"
msgstr "soldi/kg" msgstr "soldi/kg"
msgid "Vendor"
msgstr "Produttore"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Produttore del filamento. Solo per dettagli." msgstr "Produttore del filamento. Solo per dettagli."
@@ -20398,6 +20288,9 @@ msgstr "Ricalibrazione"
msgid "Calibrate" msgid "Calibrate"
msgstr "Calibra" msgstr "Calibra"
msgid "Finish"
msgstr "Fine"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Come utilizzare il risultato della calibrazione?" msgstr "Come utilizzare il risultato della calibrazione?"
@@ -20941,6 +20834,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Calibrazione della temperatura" msgstr "Calibrazione della temperatura"
msgid "Filament type"
msgstr "Tipo filamento"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -21537,6 +21433,9 @@ msgstr "ad esempio Base, Opaco, Seta, Marmo"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Profilo filamento" msgstr "Profilo filamento"
msgid "Create"
msgstr "Crea"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Il produttore non è stato selezionato, si prega di selezionare nuovamente il produttore." msgstr "Il produttore non è stato selezionato, si prega di selezionare nuovamente il produttore."
@@ -21847,9 +21746,6 @@ msgstr ""
"Stampante e tutti profili di filamento e processo che appartengono alla stampante.\n" "Stampante e tutti profili di filamento e processo che appartengono alla stampante.\n"
"Può essere condiviso con altri." "Può essere condiviso con altri."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -23060,33 +22956,6 @@ msgstr "Se abilitata, i valori sopra riportati vengono memorizzati come valori p
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
# AI Translated # AI Translated
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "La cartella del bundle non esiste." msgstr "La cartella del bundle non esiste."
@@ -23131,12 +23000,6 @@ msgstr "Annulla sottoscrizione bundle"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
# AI Translated # AI Translated
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Salva bundle di profili" msgstr "Salva bundle di profili"
@@ -28678,6 +28541,10 @@ msgstr "Le mie impostazioni"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Configurazione stampante personalizzata" msgstr "Configurazione stampante personalizzata"
# AI Translated
msgid "Custom Printer"
msgstr "Stampante personalizzata"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Definisci un profilo stampante personalizzato" msgstr "Definisci un profilo stampante personalizzato"
@@ -30165,28 +30032,6 @@ msgstr "Plugin filamento"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Plugin stampante" msgstr "Plugin stampante"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Ripristina predefiniti"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "La configurazione non è un JSON valido. Le modifiche non sono state salvate." msgstr "La configurazione non è un JSON valido. Le modifiche non sono state salvate."
@@ -30206,6 +30051,10 @@ msgstr ""
"\n" "\n"
"Verrà scartata la personalizzazione del profilo e sarà usata la configurazione globale." "Verrà scartata la personalizzazione del profilo e sarà usata la configurazione globale."
# AI Translated
msgid "Restore defaults"
msgstr "Ripristina predefiniti"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Uso della configurazione globale. Salva il profilo per renderla permanente." msgstr "Uso della configurazione globale. Salva il profilo per renderla permanente."
@@ -30275,215 +30124,6 @@ msgstr "Installazione plugin"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "\"%s\" installato." msgstr "\"%s\" installato."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -30700,54 +30340,6 @@ msgstr "Impossibile ricaricare il plugin."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "\"%s\" ricaricato." msgstr "\"%s\" ricaricato."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr "Nessuna informazione sul modello"
msgid "Edit Project Info"
msgstr "Modifica informazioni progetto"
msgid "Model Information"
msgstr "Informazioni sul modello"
msgid "Accessories"
msgstr "Accessori"
msgid "Profile Information"
msgstr "Informazioni sul profilo"
msgid "Model name"
msgstr "Nome del modello"
msgid "Created by"
msgstr "Creato da"
msgid "Remixed by"
msgstr "Modificato da"
msgid "Shared by"
msgstr "Condiviso da"
msgid "Model description"
msgstr "Descrizione del modello"
msgid "BOM"
msgstr "Elenco dei materiali"
msgid "Profile name"
msgstr "Nome del profilo"
msgid "Profile Author"
msgstr "Autore del profilo"
msgid "Profile description"
msgstr "Descrizione del profilo"
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Impostazioni modalità di spurgo" msgstr "Impostazioni modalità di spurgo"
@@ -30772,16 +30364,6 @@ msgstr "Riduce lo scarto di spurgo e stampa più velocemente. Può causare una l
msgid "Terminal" msgid "Terminal"
msgstr "Terminale" msgstr "Terminale"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Un comando è già in esecuzione." msgstr "Un comando è già in esecuzione."
@@ -31179,21 +30761,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr "Modulo di rete Bambu non rilevato. Fai clic <a>qui</a> per installarlo."
msgid "Create new project"
msgstr "Crea un nuovo progetto"
msgid "Recently opened"
msgstr "Aperti di recente"
msgid "Open Containing Folder"
msgstr "Apri cartella con contenuto"
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Avanti" msgstr "Avanti"
@@ -31362,30 +30929,6 @@ msgstr "Il plugin \"%s\" richiede l'autorizzazione per l'evento di audit Python
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Richiesta di autorizzazione del plugin" msgstr "Richiesta di autorizzazione del plugin"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "L'interfaccia di configurazione del plugin era vuota. Viene mostrato l'editor predefinito." msgstr "L'interfaccia di configurazione del plugin era vuota. Viene mostrato l'editor predefinito."
@@ -32194,6 +31737,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Disegna un profilo chiuso per abilitare" #~ msgstr "Disegna un profilo chiuso per abilitare"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Cancella tutto"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Risultato vuoto" #~ msgstr "Risultato vuoto"
+26 -480
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
@@ -4417,7 +4417,7 @@ msgstr "保存"
msgctxt "Navigation" msgctxt "Navigation"
msgid "Back" msgid "Back"
msgstr "戻る" msgstr "背面"
msgid "Example" msgid "Example"
msgstr "例" msgstr "例"
@@ -12896,120 +12896,6 @@ msgstr "ログインに失敗しました。もう一度お試しください。
msgid "parse json failed" msgid "parse json failed"
msgstr "JSONの解析に失敗しました" msgstr "JSONの解析に失敗しました"
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr ""
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr ""
msgid "Get Started"
msgstr ""
msgid "Please select your login region"
msgstr ""
msgid "Finish"
msgstr "完了"
msgid "Printer Selection"
msgstr ""
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "カスタムプリンター"
msgid "Create"
msgstr "作成"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr ""
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr ""
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr "フィラメントタイプ"
msgid "Vendor"
msgstr "ベンダー"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
# AI Translated
msgid "Clear all"
msgstr "すべてクリア"
msgid "At least one filament must be selected."
msgstr ""
msgid "Do you want to use the default filament?"
msgstr ""
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "クラウド機能をすべて無効にします (Orca Cloudのプロファイル同期を含む)。完全にオフラインで作業したいユーザーはこのオプションを有効にできます。"
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "注意: ステルスモードを有効にすると、ユーザープロファイルはOrca Cloudにバックアップされません。"
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr ""
msgid "[Action Required] " msgid "[Action Required] "
msgstr "【対応が必要】 " msgstr "【対応が必要】 "
@@ -16094,6 +15980,9 @@ msgstr "フィラメントの価格です。統計目的にのみ使用されま
msgid "money/kg" msgid "money/kg"
msgstr "USD/kg" msgstr "USD/kg"
msgid "Vendor"
msgstr "ベンダー"
# AI Translated # AI Translated
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "フィラメントのメーカーです。表示専用です。" msgstr "フィラメントのメーカーです。表示専用です。"
@@ -20877,6 +20766,9 @@ msgstr "再キャリブレーション"
msgid "Calibrate" msgid "Calibrate"
msgstr "キャリブレーション" msgstr "キャリブレーション"
msgid "Finish"
msgstr "完了"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "キャリブレーション結果をどのように活用できますか?" msgstr "キャリブレーション結果をどのように活用できますか?"
@@ -21434,6 +21326,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "温度キャリブレーション" msgstr "温度キャリブレーション"
msgid "Filament type"
msgstr "フィラメントタイプ"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -22057,6 +21952,9 @@ msgstr "例: Basic, Matte, Silk, Marble"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "フィラメントプリセット" msgstr "フィラメントプリセット"
msgid "Create"
msgstr "作成"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "ベンダーが選択されていません。ベンダーを再選択してください。" msgstr "ベンダーが選択されていません。ベンダーを再選択してください。"
@@ -22378,9 +22276,6 @@ msgstr ""
"プリンターと、そのプリンターに属するすべてのフィラメントおよびプロセスのプリセットです。\n" "プリンターと、そのプリンターに属するすべてのフィラメントおよびプロセスのプリセットです。\n"
"他のユーザーと共有できます。" "他のユーザーと共有できます。"
msgid "Include custom bed texture and model"
msgstr ""
# AI Translated # AI Translated
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
@@ -23590,33 +23485,6 @@ msgstr "有効にすると、上記の値が今後のSTEPインポートで使
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
# AI Translated # AI Translated
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "バンドルフォルダが存在しません。" msgstr "バンドルフォルダが存在しません。"
@@ -23661,12 +23529,6 @@ msgstr "バンドルの購読を解除"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
# AI Translated # AI Translated
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "プリセットバンドルを保存" msgstr "プリセットバンドルを保存"
@@ -29197,6 +29059,10 @@ msgstr "マイ設定"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "カスタムプリンターのセットアップ" msgstr "カスタムプリンターのセットアップ"
# AI Translated
msgid "Custom Printer"
msgstr "カスタムプリンター"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "カスタムプリンタープロファイルを定義" msgstr "カスタムプリンタープロファイルを定義"
@@ -30685,28 +30551,6 @@ msgstr "フィラメントプラグイン"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "プリンタープラグイン" msgstr "プリンタープラグイン"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "デフォルトに戻す"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "設定が有効なJSONではありません。変更は保存されませんでした。" msgstr "設定が有効なJSONではありません。変更は保存されませんでした。"
@@ -30726,6 +30570,10 @@ msgstr ""
"\n" "\n"
"プリセットでの上書き設定を破棄し、グローバル設定を使用します。" "プリセットでの上書き設定を破棄し、グローバル設定を使用します。"
# AI Translated
msgid "Restore defaults"
msgstr "デフォルトに戻す"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "グローバル設定を使用しています。保持するにはプリセットを保存してください。" msgstr "グローバル設定を使用しています。保持するにはプリセットを保存してください。"
@@ -30795,215 +30643,6 @@ msgstr "プラグインをインストール中"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "「%s」をインストールしました。" msgstr "「%s」をインストールしました。"
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -31220,54 +30859,6 @@ msgstr "プラグインの再読み込みに失敗しました。"
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "「%s」を再読み込みしました。" msgstr "「%s」を再読み込みしました。"
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr ""
msgid "Edit Project Info"
msgstr ""
msgid "Model Information"
msgstr ""
msgid "Accessories"
msgstr ""
msgid "Profile Information"
msgstr ""
msgid "Model name"
msgstr ""
msgid "Created by"
msgstr ""
msgid "Remixed by"
msgstr ""
msgid "Shared by"
msgstr ""
msgid "Model description"
msgstr ""
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr ""
msgid "Profile Author"
msgstr ""
msgid "Profile description"
msgstr ""
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "フラッシュモードの設定" msgstr "フラッシュモードの設定"
@@ -31292,16 +30883,6 @@ msgstr "プライムの廃材を減らし、より速く印刷します。わず
msgid "Terminal" msgid "Terminal"
msgstr "ターミナル" msgstr "ターミナル"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "コマンドはすでに実行中です。" msgstr "コマンドはすでに実行中です。"
@@ -31699,21 +31280,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr ""
msgid "Create new project"
msgstr ""
msgid "Recently opened"
msgstr ""
msgid "Open Containing Folder"
msgstr ""
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "進む" msgstr "進む"
@@ -31882,30 +31448,6 @@ msgstr "プラグイン「%s」がPython監査イベント「%s」の許可を
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "プラグインの権限リクエスト" msgstr "プラグインの権限リクエスト"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "プラグインの設定UIが空でした。デフォルトのエディターを表示します。" msgstr "プラグインの設定UIが空でした。デフォルトのエディターを表示します。"
@@ -32728,6 +32270,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "有効にするには閉じたプロファイルを描画してください" #~ msgstr "有効にするには閉じたプロファイルを描画してください"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "すべてクリア"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "結果が空です" #~ msgstr "結果が空です"
+25 -479
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: 2025-06-02 17:12+0900\n" "PO-Revision-Date: 2025-06-02 17:12+0900\n"
"Last-Translator: crwusiz <crwusiz@gmail.com>\n" "Last-Translator: crwusiz <crwusiz@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -13088,120 +13088,6 @@ msgstr "로그인에 실패했습니다. 다시 시도하십시오."
msgid "parse json failed" msgid "parse json failed"
msgstr "JSON 구문 분석 실패" msgstr "JSON 구문 분석 실패"
msgid "Loading…"
msgstr "로딩 중……"
msgid "Welcome to Orca Slicer"
msgstr "Orca Slicer에 오신 것을 환영합니다"
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr "Orca Slicer는 여러 단계로 설정됩니다. 시작!"
msgid "Get Started"
msgstr "시작"
msgid "Please select your login region"
msgstr "로그인 지역을 선택해주세요"
msgid "Finish"
msgstr "완료"
msgid "Printer Selection"
msgstr "프린터 선택"
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "사용자 정의 프린터"
msgid "Create"
msgstr "생성"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr "하나 이상의 프린터를 선택해야 합니다."
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr "필라멘트 선택"
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr "필라멘트 유형"
msgid "Vendor"
msgstr "제조사"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
# AI Translated
msgid "Clear all"
msgstr "모두 지우기"
msgid "At least one filament must be selected."
msgstr "하나 이상의 필라멘트를 선택해야 합니다."
msgid "Do you want to use the default filament?"
msgstr "기본 필라멘트를 사용하시겠습니까?"
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "이 옵션은 Orca Cloud 프로필 동기화를 포함한 모든 클라우드 기능을 비활성화합니다. 완전히 오프라인으로 작업하려는 사용자는 이 옵션을 활성화할 수 있습니다."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "참고: 스텔스 모드를 활성화하면 사용자 프로필이 Orca Cloud에 백업되지 않습니다."
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr "Bambu 네트워크 플러그인 설치"
# AI Translated # AI Translated
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[조치 필요] " msgstr "[조치 필요] "
@@ -16286,6 +16172,9 @@ msgstr "필라멘트 가격. 통계 전용"
msgid "money/kg" msgid "money/kg"
msgstr "가격/kg" msgstr "가격/kg"
msgid "Vendor"
msgstr "제조사"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "필라멘트 제조사" msgstr "필라멘트 제조사"
@@ -20877,6 +20766,9 @@ msgstr "재교정"
msgid "Calibrate" msgid "Calibrate"
msgstr "교정" msgstr "교정"
msgid "Finish"
msgstr "완료"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "교정 결과를 어떻게 사용하나요?" msgstr "교정 결과를 어떻게 사용하나요?"
@@ -21423,6 +21315,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "온도 교정" msgstr "온도 교정"
msgid "Filament type"
msgstr "필라멘트 유형"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -22057,6 +21952,9 @@ msgstr "예를 들어 기본, 매트, 실크, 마블"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "필라멘트 사전 설정" msgstr "필라멘트 사전 설정"
msgid "Create"
msgstr "생성"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "공급업체가 선택되지 않았습니다. 공급업체를 다시 선택하세요." msgstr "공급업체가 선택되지 않았습니다. 공급업체를 다시 선택하세요."
@@ -22372,9 +22270,6 @@ msgstr ""
"프린터와 프린터에 속한 모든 필라멘트 및 프로세스 사전 설정.\n" "프린터와 프린터에 속한 모든 필라멘트 및 프로세스 사전 설정.\n"
"다른 사람과 공유할 수 있습니다." "다른 사람과 공유할 수 있습니다."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -23607,33 +23502,6 @@ msgstr "활성화하면 위의 값이 이후 STEP 가져오기에 사용되는
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
# AI Translated # AI Translated
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "번들 폴더가 존재하지 않습니다." msgstr "번들 폴더가 존재하지 않습니다."
@@ -23678,12 +23546,6 @@ msgstr "번들 구독 취소"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
# AI Translated # AI Translated
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "사전 설정 번들 저장" msgstr "사전 설정 번들 저장"
@@ -29216,6 +29078,10 @@ msgstr "내 설정"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "사용자 정의 프린터 설정" msgstr "사용자 정의 프린터 설정"
# AI Translated
msgid "Custom Printer"
msgstr "사용자 정의 프린터"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "사용자 정의 프린터 프로파일 정의" msgstr "사용자 정의 프린터 프로파일 정의"
@@ -30703,28 +30569,6 @@ msgstr "필라멘트 플러그인"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "프린터 플러그인" msgstr "프린터 플러그인"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "기본값 복원"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "구성이 올바른 JSON이 아닙니다. 변경 사항이 저장되지 않았습니다." msgstr "구성이 올바른 JSON이 아닙니다. 변경 사항이 저장되지 않았습니다."
@@ -30744,6 +30588,10 @@ msgstr ""
"\n" "\n"
"사전 설정의 재정의를 버리고 전역 구성을 사용합니다." "사전 설정의 재정의를 버리고 전역 구성을 사용합니다."
# AI Translated
msgid "Restore defaults"
msgstr "기본값 복원"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "전역 구성을 사용합니다. 유지하려면 사전 설정을 저장하십시오." msgstr "전역 구성을 사용합니다. 유지하려면 사전 설정을 저장하십시오."
@@ -30813,215 +30661,6 @@ msgstr "플러그인 설치 중"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "\"%s\"을(를) 설치했습니다." msgstr "\"%s\"을(를) 설치했습니다."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -31238,54 +30877,6 @@ msgstr "플러그인을 다시 불러오지 못했습니다."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "\"%s\"을(를) 다시 불러왔습니다." msgstr "\"%s\"을(를) 다시 불러왔습니다."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr ""
msgid "Edit Project Info"
msgstr ""
msgid "Model Information"
msgstr ""
msgid "Accessories"
msgstr ""
msgid "Profile Information"
msgstr ""
msgid "Model name"
msgstr ""
msgid "Created by"
msgstr ""
msgid "Remixed by"
msgstr ""
msgid "Shared by"
msgstr ""
msgid "Model description"
msgstr ""
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr ""
msgid "Profile Author"
msgstr ""
msgid "Profile description"
msgstr ""
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "플러시 모드 설정" msgstr "플러시 모드 설정"
@@ -31310,16 +30901,6 @@ msgstr "프라임 낭비를 줄이고 더 빠르게 출력합니다. 색상이
msgid "Terminal" msgid "Terminal"
msgstr "터미널" msgstr "터미널"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "명령이 이미 실행 중입니다." msgstr "명령이 이미 실행 중입니다."
@@ -31717,21 +31298,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr "Bambu 네트워크 플러그인이 감지되지 않습니다. 여기를 <a>클릭</a> 하여 설치하세요."
msgid "Create new project"
msgstr "새 프로젝트 생성"
msgid "Recently opened"
msgstr "최근 사용"
msgid "Open Containing Folder"
msgstr "포함된 폴더 열기"
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "앞으로" msgstr "앞으로"
@@ -31900,30 +31466,6 @@ msgstr "플러그인 \"%s\"이(가) Python 감사 이벤트 \"%s\"에 대한 권
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "플러그인 권한 요청" msgstr "플러그인 권한 요청"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "플러그인의 구성 UI가 비어 있습니다. 기본 편집기를 표시합니다." msgstr "플러그인의 구성 UI가 비어 있습니다. 기본 편집기를 표시합니다."
@@ -32737,6 +32279,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "활성화하려면 닫힌 프로파일을 그리십시오" #~ msgstr "활성화하려면 닫힌 프로파일을 그리십시오"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "모두 지우기"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "결과가 비어 있음" #~ msgstr "결과가 비어 있음"
+1 -2
View File
@@ -333,8 +333,6 @@ src/slic3r/GUI/OAuthDialog.cpp
src/slic3r/GUI/PluginPickerDialog.cpp src/slic3r/GUI/PluginPickerDialog.cpp
src/slic3r/GUI/PluginsConfigDialog.cpp src/slic3r/GUI/PluginsConfigDialog.cpp
src/slic3r/GUI/PluginsDialog.cpp src/slic3r/GUI/PluginsDialog.cpp
src/slic3r/GUI/PrinterWebView.cpp
src/slic3r/GUI/Project.cpp
src/slic3r/GUI/PublishSettingsDialog.hpp src/slic3r/GUI/PublishSettingsDialog.hpp
src/slic3r/GUI/PurgeModeDialog.cpp src/slic3r/GUI/PurgeModeDialog.cpp
src/slic3r/GUI/TerminalDialog.cpp src/slic3r/GUI/TerminalDialog.cpp
@@ -343,6 +341,7 @@ src/slic3r/GUI/TextureLibrary.cpp
src/slic3r/GUI/TextureProjectorFrame.cpp src/slic3r/GUI/TextureProjectorFrame.cpp
src/slic3r/GUI/UVEditorCanvas.cpp src/slic3r/GUI/UVEditorCanvas.cpp
src/slic3r/GUI/UserManager.cpp src/slic3r/GUI/UserManager.cpp
src/slic3r/GUI/WebDownPluginDlg.cpp
src/slic3r/GUI/WebViewDialog.cpp src/slic3r/GUI/WebViewDialog.cpp
src/slic3r/GUI/Widgets/AMSItem.cpp src/slic3r/GUI/Widgets/AMSItem.cpp
src/slic3r/GUI/Widgets/DialogButtons.cpp src/slic3r/GUI/Widgets/DialogButtons.cpp
+25 -478
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: 2026-07-02 14:13+0300\n" "PO-Revision-Date: 2026-07-02 14:13+0300\n"
"Last-Translator: Gintaras Kučinskas <sharanchius@gmail.com>\n" "Last-Translator: Gintaras Kučinskas <sharanchius@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -12871,119 +12871,6 @@ msgstr "Prisijungti nepavyko. Bandykite dar kartą."
msgid "parse json failed" msgid "parse json failed"
msgstr "nepavyko išanalizuoti json" msgstr "nepavyko išanalizuoti json"
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr "Pasisveikinkite su Orca Slicer"
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr "Orca Slicer bus nustatyta per kelis žingsnius. Pradėkime!"
msgid "Get Started"
msgstr "Pradėti"
msgid "Please select your login region"
msgstr "Pasirinkite prisijungimo regioną"
msgid "Finish"
msgstr "Baigti"
msgid "Printer Selection"
msgstr "Spausdintuvo pasirinkimas"
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Pasirinktinis spausdintuvas"
msgid "Create"
msgstr "Sukurti"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr "Turi būti pasirinktas bent vienas spausdintuvas."
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr "Gijos pasirinkimas"
msgid "System Filaments"
msgstr "Sistemos gijos"
msgid "Custom Filaments"
msgstr "Pasirinktinės gijos"
msgid "Create New"
msgstr "Sukurti naują"
msgid "Filament type"
msgstr "Gijos tipas"
msgid "Vendor"
msgstr "Prekės ženklas"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
msgid "Clear all"
msgstr "Išvalyti visus"
msgid "At least one filament must be selected."
msgstr "Turi būti pasirinkta bent viena gija."
msgid "Do you want to use the default filament?"
msgstr "Ar norite naudoti numatytąją giją?"
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Išjungia visas debesijos funkcijas, įskaitant „Orca Cloud“ profilių sinchronizavimą. Naudotojai, kurie nori dirbti visiškai neprisijungę prie tinklo, gali įjungti šią parinktį."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Pastaba: kai įjungtas slaptas režimas, jūsų naudotojo profilių atsarginės kopijos nebus kuriamos „Orca Cloud“ debesyje."
msgid "Enable Stealth Mode."
msgstr "Įjungti slaptą režimą."
msgid "Proprietary Plugins"
msgstr "Patentuoti papildiniai"
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr "Kai kurie spausdintuvų gamintojai reikalauja patentuotų papildinių, kad būtų galima bendrauti su jų spausdintuvais. Jei naudojate tokius spausdintuvus, pasirinkite atitinkamą papildinį."
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr "Atkreipkite dėmesį, kad OrcaSlicer šių papildinių nesukuria ir neprižiūri. Juos turėtumėte naudoti savo nuožiūra ir rizika."
msgid "Install Bambu Network plug-in"
msgstr "Įdiegti Bambu tinklo papildinį"
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Reikalingas veiksmas] " msgstr "[Reikalingas veiksmas] "
@@ -15950,6 +15837,9 @@ msgstr "Gijos kaina, tik statistikai."
msgid "money/kg" msgid "money/kg"
msgstr "pinigų/kg" msgstr "pinigų/kg"
msgid "Vendor"
msgstr "Prekės ženklas"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Gijos prekės ženklas. Tik parodymui." msgstr "Gijos prekės ženklas. Tik parodymui."
@@ -20394,6 +20284,9 @@ msgstr "Perkalibruoti"
msgid "Calibrate" msgid "Calibrate"
msgstr "Kalibruoti" msgstr "Kalibruoti"
msgid "Finish"
msgstr "Baigti"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Kaip galiu panaudoti kalibravimo rezultatus?" msgstr "Kaip galiu panaudoti kalibravimo rezultatus?"
@@ -20940,6 +20833,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Temperatūros kalibravimas" msgstr "Temperatūros kalibravimas"
msgid "Filament type"
msgstr "Gijos tipas"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -21519,6 +21415,9 @@ msgstr "pvz., pagrindinis, matinis, šilkinis, marmurinis"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Gijos profilis" msgstr "Gijos profilis"
msgid "Create"
msgstr "Sukurti"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Prekės ženklas nepasirinktas; prašome pasirinkti prekės ženklą iš naujo." msgstr "Prekės ženklas nepasirinktas; prašome pasirinkti prekės ženklą iš naujo."
@@ -21828,9 +21727,6 @@ msgstr ""
"Spausdintuvas ir visi jam priklausantys gijos bei proceso profiliai.\n" "Spausdintuvas ir visi jam priklausantys gijos bei proceso profiliai.\n"
"Galima bendrinti su kitais." "Galima bendrinti su kitais."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -22934,33 +22830,6 @@ msgstr "Jei įjungta, aukščiau nurodytos vertės yra išsaugomos kaip numatyto
msgid "PresetBundle" msgid "PresetBundle"
msgstr "ProfiliųRinkinys" msgstr "ProfiliųRinkinys"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "Rinkinio aplankas neegzistuoja." msgstr "Rinkinio aplankas neegzistuoja."
@@ -22994,12 +22863,6 @@ msgstr "Atsisakyti rinkinio prenumeratos"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "EksportuotiProfiliųRinkinį" msgstr "EksportuotiProfiliųRinkinį"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Išsaugoti profilių rinkinį" msgstr "Išsaugoti profilių rinkinį"
@@ -28541,6 +28404,10 @@ msgstr "Mano nustatymai"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Pasirinktinio spausdintuvo sąranka" msgstr "Pasirinktinio spausdintuvo sąranka"
# AI Translated
msgid "Custom Printer"
msgstr "Pasirinktinis spausdintuvas"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Apibrėžti pasirinktinio spausdintuvo profilį" msgstr "Apibrėžti pasirinktinio spausdintuvo profilį"
@@ -30038,28 +29905,6 @@ msgstr "Gijų papildiniai"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Spausdintuvo papildiniai" msgstr "Spausdintuvo papildiniai"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Atkurti numatytąsias reikšmes"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "Konfigūracija nėra tinkamas JSON. Jūsų pakeitimai neišsaugoti." msgstr "Konfigūracija nėra tinkamas JSON. Jūsų pakeitimai neišsaugoti."
@@ -30079,6 +29924,10 @@ msgstr ""
"\n" "\n"
"Tai atmes profilyje perrašytą konfigūraciją ir bus naudojama bendroji konfigūracija." "Tai atmes profilyje perrašytą konfigūraciją ir bus naudojama bendroji konfigūracija."
# AI Translated
msgid "Restore defaults"
msgstr "Atkurti numatytąsias reikšmes"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Naudojama bendroji konfigūracija. Išsaugokite profilį, kad tai išliktų." msgstr "Naudojama bendroji konfigūracija. Išsaugokite profilį, kad tai išliktų."
@@ -30148,215 +29997,6 @@ msgstr "Diegiamas papildinys"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "Įdiegta: „%s“." msgstr "Įdiegta: „%s“."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -30573,54 +30213,6 @@ msgstr "Nepavyko iš naujo įkelti papildinio."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "Iš naujo įkelta: „%s“." msgstr "Iš naujo įkelta: „%s“."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr "Nėra informacijos apie modelį"
msgid "Edit Project Info"
msgstr "Redaguoti projekto informaciją"
msgid "Model Information"
msgstr "Modelio informacija"
msgid "Accessories"
msgstr "Priedai"
msgid "Profile Information"
msgstr "Profilio informacija"
msgid "Model name"
msgstr "Modelio pavadinimas"
msgid "Created by"
msgstr "Sukurta"
msgid "Remixed by"
msgstr "Perkurta"
msgid "Shared by"
msgstr "Pasidalinta"
msgid "Model description"
msgstr "Modelio aprašymas"
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr "Profilio pavadinimas"
msgid "Profile Author"
msgstr "Profilio autorius"
msgid "Profile description"
msgstr "Profilio aprašymas"
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Pravalymo režimo nustatymai" msgstr "Pravalymo režimo nustatymai"
@@ -30645,16 +30237,6 @@ msgstr "Sumažina pravalymo atliekas ir spausdina greičiau. Spalvos gali šiek
msgid "Terminal" msgid "Terminal"
msgstr "Terminalas" msgstr "Terminalas"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Komanda jau vykdoma." msgstr "Komanda jau vykdoma."
@@ -31052,21 +30634,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr "Neprisiregistruota"
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr "Neaptiktas Bambu tinklo papildinys. Spustelėkite <a>čia</a> jo diegimui."
msgid "Create new project"
msgstr "Sukurti naują projektą"
msgid "Recently opened"
msgstr "Neseniai atidaryti"
msgid "Open Containing Folder"
msgstr "Atidaryti katalogą, kuriame yra"
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Pirmyn" msgstr "Pirmyn"
@@ -31235,30 +30802,6 @@ msgstr "Papildinys „%s“ prašo leidimo Python audito įvykiui „%s“."
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Papildinio leidimo užklausa" msgstr "Papildinio leidimo užklausa"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "Papildinio konfigūracijos sąsaja tuščia. Rodomas numatytasis redaktorius." msgstr "Papildinio konfigūracijos sąsaja tuščia. Rodomas numatytasis redaktorius."
@@ -32066,6 +31609,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Nubrėžkite uždarą profilį, kad įjungtumėte" #~ msgstr "Nubrėžkite uždarą profilį, kad įjungtumėte"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Išvalyti viską"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Tuščias rezultatas" #~ msgstr "Tuščias rezultatas"
+26 -480
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
@@ -4789,7 +4789,7 @@ msgstr "Bewaar"
msgctxt "Navigation" msgctxt "Navigation"
msgid "Back" msgid "Back"
msgstr "Terug" msgstr "Achterzijde"
msgid "Example" msgid "Example"
msgstr "Voorbeeld" msgstr "Voorbeeld"
@@ -13891,120 +13891,6 @@ msgstr "Inloggen mislukt. Probeer het opnieuw."
msgid "parse json failed" msgid "parse json failed"
msgstr "json parsen mislukt" msgstr "json parsen mislukt"
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr ""
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr ""
msgid "Get Started"
msgstr ""
msgid "Please select your login region"
msgstr ""
msgid "Finish"
msgstr "Klaar"
msgid "Printer Selection"
msgstr ""
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Aangepaste printer"
msgid "Create"
msgstr "Creëren"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr ""
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr ""
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr "Filamenttype"
msgid "Vendor"
msgstr "Leverancier"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
# AI Translated
msgid "Clear all"
msgstr "Alles wissen"
msgid "At least one filament must be selected."
msgstr ""
msgid "Do you want to use the default filament?"
msgstr ""
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Hiermee worden alle cloudfuncties uitgeschakeld, inclusief het synchroniseren van Orca Cloud-profielen. Gebruikers die volledig offline willen werken, kunnen deze optie inschakelen."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Let op: wanneer de Stealth-modus is ingeschakeld, worden uw gebruikersprofielen niet geback-upt naar Orca Cloud."
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr ""
# AI Translated # AI Translated
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Actie vereist] " msgstr "[Actie vereist] "
@@ -17254,6 +17140,9 @@ msgstr "Filament prijs. Alleen voor statistieken"
msgid "money/kg" msgid "money/kg"
msgstr "Prijs per KG" msgstr "Prijs per KG"
msgid "Vendor"
msgstr "Leverancier"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Verkoper van filament. Alleen voor show" msgstr "Verkoper van filament. Alleen voor show"
@@ -22234,6 +22123,9 @@ msgstr "Herkalibratie"
msgid "Calibrate" msgid "Calibrate"
msgstr "Kalibreren" msgstr "Kalibreren"
msgid "Finish"
msgstr "Klaar"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Hoe kan ik kalibratieresultaten gebruiken?" msgstr "Hoe kan ik kalibratieresultaten gebruiken?"
@@ -22804,6 +22696,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Temperatuurkalibratie" msgstr "Temperatuurkalibratie"
msgid "Filament type"
msgstr "Filamenttype"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -23449,6 +23344,9 @@ msgstr "bijv. Basic, Mat, Zijde, Marmer"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Filament voorinstelling" msgstr "Filament voorinstelling"
msgid "Create"
msgstr "Creëren"
# AI Translated # AI Translated
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Er is geen leverancier geselecteerd; selecteer de leverancier opnieuw." msgstr "Er is geen leverancier geselecteerd; selecteer de leverancier opnieuw."
@@ -23777,9 +23675,6 @@ msgstr ""
"De printer en alle filament- en procesvoorinstellingen die bij de printer horen.\n" "De printer en alle filament- en procesvoorinstellingen die bij de printer horen.\n"
"Kan met anderen worden gedeeld." "Kan met anderen worden gedeeld."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -25102,33 +24997,6 @@ msgstr "Indien ingeschakeld worden de bovenstaande waarden opgeslagen als standa
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
# AI Translated # AI Translated
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "De bundelmap bestaat niet." msgstr "De bundelmap bestaat niet."
@@ -25173,12 +25041,6 @@ msgstr "Abonnement op bundel opzeggen"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
# AI Translated # AI Translated
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Voorinstellingenbundel opslaan" msgstr "Voorinstellingenbundel opslaan"
@@ -30734,6 +30596,10 @@ msgstr "Mijn instellingen"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Aangepaste printer instellen" msgstr "Aangepaste printer instellen"
# AI Translated
msgid "Custom Printer"
msgstr "Aangepaste printer"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Een aangepast printerprofiel definiëren" msgstr "Een aangepast printerprofiel definiëren"
@@ -32229,28 +32095,6 @@ msgstr "Filamentplug-ins"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Printerplug-ins" msgstr "Printerplug-ins"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Standaardwaarden herstellen"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "De configuratie is geen geldige JSON. Uw wijzigingen zijn niet opgeslagen." msgstr "De configuratie is geen geldige JSON. Uw wijzigingen zijn niet opgeslagen."
@@ -32270,6 +32114,10 @@ msgstr ""
"\n" "\n"
"Hiermee wordt de overschrijving in de voorinstelling verworpen en wordt de globale configuratie gebruikt." "Hiermee wordt de overschrijving in de voorinstelling verworpen en wordt de globale configuratie gebruikt."
# AI Translated
msgid "Restore defaults"
msgstr "Standaardwaarden herstellen"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Globale configuratie wordt gebruikt. Sla de voorinstelling op om dit permanent te maken." msgstr "Globale configuratie wordt gebruikt. Sla de voorinstelling op om dit permanent te maken."
@@ -32339,215 +32187,6 @@ msgstr "Plug-in wordt geïnstalleerd"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "\"%s\" geïnstalleerd." msgstr "\"%s\" geïnstalleerd."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -32764,54 +32403,6 @@ msgstr "Herladen van de plug-in is mislukt."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "\"%s\" herladen." msgstr "\"%s\" herladen."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr ""
msgid "Edit Project Info"
msgstr ""
msgid "Model Information"
msgstr ""
msgid "Accessories"
msgstr ""
msgid "Profile Information"
msgstr ""
msgid "Model name"
msgstr ""
msgid "Created by"
msgstr ""
msgid "Remixed by"
msgstr ""
msgid "Shared by"
msgstr ""
msgid "Model description"
msgstr ""
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr ""
msgid "Profile Author"
msgstr ""
msgid "Profile description"
msgstr ""
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Instellingen spoelmodus" msgstr "Instellingen spoelmodus"
@@ -32836,16 +32427,6 @@ msgstr "Vermindert prime-afval en print sneller. Kan lichte kleurvermenging of k
msgid "Terminal" msgid "Terminal"
msgstr "Terminal" msgstr "Terminal"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Er wordt al een opdracht uitgevoerd." msgstr "Er wordt al een opdracht uitgevoerd."
@@ -33243,21 +32824,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr ""
msgid "Create new project"
msgstr ""
msgid "Recently opened"
msgstr ""
msgid "Open Containing Folder"
msgstr ""
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Vooruit" msgstr "Vooruit"
@@ -33426,30 +32992,6 @@ msgstr "Plug-in \"%s\" vraagt toestemming voor de Python-auditgebeurtenis \"%s\"
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Toestemmingsverzoek van plug-in" msgstr "Toestemmingsverzoek van plug-in"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "De configuratie-UI van de plug-in was leeg. De standaardeditor wordt getoond." msgstr "De configuratie-UI van de plug-in was leeg. De standaardeditor wordt getoond."
@@ -34265,6 +33807,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Teken een gesloten profiel om dit in te schakelen" #~ msgstr "Teken een gesloten profiel om dit in te schakelen"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Alles wissen"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Leeg resultaat" #~ msgstr "Leeg resultaat"
+25 -478
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: OrcaSlicer 2.3.0-rc\n" "Project-Id-Version: OrcaSlicer 2.3.0-rc\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: Krzysztof Morga <<tlumaczeniebs@gmail.com>>\n" "Last-Translator: Krzysztof Morga <<tlumaczeniebs@gmail.com>>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -4504,7 +4504,7 @@ msgstr "Zapisz"
msgctxt "Navigation" msgctxt "Navigation"
msgid "Back" msgid "Back"
msgstr "Wstecz" msgstr "Tył"
msgid "Example" msgid "Example"
msgstr "Przykład" msgstr "Przykład"
@@ -13186,118 +13186,6 @@ msgstr "Logowanie nie powiodło się. Spróbuj ponownie."
msgid "parse json failed" msgid "parse json failed"
msgstr "analiza pliku json nie powiodła się" msgstr "analiza pliku json nie powiodła się"
msgid "Loading…"
msgstr "Ładowanie trwa…"
msgid "Welcome to Orca Slicer"
msgstr "Witamy w Orca Slicer"
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr "Orca Slicer zostanie skonfigurowany w kilku krokach. Zacznijmy!"
msgid "Get Started"
msgstr "Rozpocznij"
msgid "Please select your login region"
msgstr "Proszę wybrać swój region logowania"
msgid "Finish"
msgstr "Zakończ"
msgid "Printer Selection"
msgstr "Wybór drukarki"
msgid "Vendors"
msgstr ""
msgid "Custom Printer"
msgstr "Niestandardowa drukarka"
msgid "Create"
msgstr "Utwórz"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr "Przynajmniej jedna drukarka musi być wybrana."
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr "Wybór filamentu"
msgid "System Filaments"
msgstr "Systemowe filamenty"
msgid "Custom Filaments"
msgstr "Niestandardowe filamenty"
msgid "Create New"
msgstr "Utwórz nowy"
msgid "Filament type"
msgstr "Rodzaj filamentu"
msgid "Vendor"
msgstr "Dostawca"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
msgid "Clear all"
msgstr "Wyczyść wszystko"
msgid "At least one filament must be selected."
msgstr "Przynajmniej jeden filament musi być wybrany."
msgid "Do you want to use the default filament?"
msgstr "Czy chcesz użyć domyślnego filamentu?"
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Wyłącza wszystkie funkcje chmurowe, w tym synchronizację profili Orca Cloud. Użytkownicy, którzy wolą pracować całkowicie offline, mogą włączyć tę opcję."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Uwaga: gdy tryb Stealth jest włączony, Twoje profile użytkownika nie będą kopiowane do Orca Cloud."
msgid "Enable Stealth Mode."
msgstr "Włącz tryb «Niewidzialny»"
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr "Niektórzy dostawcy drukarek wymagają własnych wtyczek do komunikacji ze swoimi drukarkami. Proszę wybrać odpowiednią wtyczkę, jeśli korzystasz z takich drukarek."
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr "Proszę mieć świadomość, że te wtyczki nie są rozwijane ani utrzymywane przez OrcaSlicer. Powinny być używane na własne ryzyko i z rozwagą."
msgid "Install Bambu Network plug-in"
msgstr "Zainstaluj wtyczkę Bambu Network"
# AI Translated # AI Translated
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Wymagane działanie] " msgstr "[Wymagane działanie] "
@@ -16356,6 +16244,9 @@ msgstr "Cena filamentu. Tylko do celów statystycznych"
msgid "money/kg" msgid "money/kg"
msgstr "zł/kg" msgstr "zł/kg"
msgid "Vendor"
msgstr "Dostawca"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Dostawca filamentu. Tylko do celów prezentacyjnych" msgstr "Dostawca filamentu. Tylko do celów prezentacyjnych"
@@ -20919,6 +20810,9 @@ msgstr "Rekalibracja"
msgid "Calibrate" msgid "Calibrate"
msgstr "Kalibruj" msgstr "Kalibruj"
msgid "Finish"
msgstr "Zakończ"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Jak używać wyniku kalibracji?" msgstr "Jak używać wyniku kalibracji?"
@@ -21467,6 +21361,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Kalibracja temperatury" msgstr "Kalibracja temperatury"
msgid "Filament type"
msgstr "Rodzaj filamentu"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -22105,6 +22002,9 @@ msgstr "np. Basic, Matte, Silk, Marble"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Ustawienie profilu filamentu" msgstr "Ustawienie profilu filamentu"
msgid "Create"
msgstr "Utwórz"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Dostawca nie jest wybrany, proszę ponownie wybrać producenta." msgstr "Dostawca nie jest wybrany, proszę ponownie wybrać producenta."
@@ -22417,9 +22317,6 @@ msgstr ""
"Profil drukarki oraz wszystkie ustawienia filamentu i procesu, które do niej należą.\n" "Profil drukarki oraz wszystkie ustawienia filamentu i procesu, które do niej należą.\n"
"Można je udostępniać innym osobom." "Można je udostępniać innym osobom."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -23656,33 +23553,6 @@ msgstr "Jeśli opcja jest włączona, powyższe wartości są zapisywane jako do
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
# AI Translated # AI Translated
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "Folder pakietu nie istnieje." msgstr "Folder pakietu nie istnieje."
@@ -23727,12 +23597,6 @@ msgstr "Anuluj subskrypcję pakietu"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
# AI Translated # AI Translated
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Zapisz pakiet profili" msgstr "Zapisz pakiet profili"
@@ -29254,6 +29118,9 @@ msgstr "Moje ustawienia"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Ustawienie Własnej Drukarki" msgstr "Ustawienie Własnej Drukarki"
msgid "Custom Printer"
msgstr "Niestandardowa drukarka"
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Zdefiniuj własny profil drukarki" msgstr "Zdefiniuj własny profil drukarki"
@@ -30698,28 +30565,6 @@ msgstr "Wtyczki filamentu"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Wtyczki drukarki" msgstr "Wtyczki drukarki"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Przywróć domyślne"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "Konfiguracja nie jest prawidłowym JSON. Zmiany nie zostały zapisane." msgstr "Konfiguracja nie jest prawidłowym JSON. Zmiany nie zostały zapisane."
@@ -30739,6 +30584,10 @@ msgstr ""
"\n" "\n"
"Spowoduje to odrzucenie nadpisania z profilu i użycie konfiguracji globalnej." "Spowoduje to odrzucenie nadpisania z profilu i użycie konfiguracji globalnej."
# AI Translated
msgid "Restore defaults"
msgstr "Przywróć domyślne"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Używana jest konfiguracja globalna. Zapisz profil, aby to zachować." msgstr "Używana jest konfiguracja globalna. Zapisz profil, aby to zachować."
@@ -30808,215 +30657,6 @@ msgstr "Instalowanie wtyczki"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "Zainstalowano „%s”." msgstr "Zainstalowano „%s”."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -31233,54 +30873,6 @@ msgstr "Nie udało się ponownie wczytać wtyczki."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "Ponownie wczytano „%s”." msgstr "Ponownie wczytano „%s”."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr "Brak informacji o modelu"
msgid "Edit Project Info"
msgstr "Edytuj informacje o projekcie"
msgid "Model Information"
msgstr "Informacje o modelu"
msgid "Accessories"
msgstr "Akcesoria"
msgid "Profile Information"
msgstr "Informacje o profilu"
msgid "Model name"
msgstr "Nazwa modelu"
msgid "Created by"
msgstr "Utworzone przez"
msgid "Remixed by"
msgstr ""
msgid "Shared by"
msgstr ""
msgid "Model description"
msgstr "Opis modelu"
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr "Nazwa profilu"
msgid "Profile Author"
msgstr "Autor profilu"
msgid "Profile description"
msgstr "Opis profilu"
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Ustawienia trybu płukania" msgstr "Ustawienia trybu płukania"
@@ -31305,16 +30897,6 @@ msgstr "Zmniejsza ilość odpadu z płukania i przyspiesza druk. Może powodowa
msgid "Terminal" msgid "Terminal"
msgstr "Terminal" msgstr "Terminal"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Polecenie jest już uruchomione." msgstr "Polecenie jest już uruchomione."
@@ -31712,21 +31294,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr "Wtyczka Bambu Network nie wykryta. Kliknij <a>tutaj</a> aby zainstalować."
msgid "Create new project"
msgstr "Utwórz nowy projekt"
msgid "Recently opened"
msgstr "Ostatnio otwarte"
msgid "Open Containing Folder"
msgstr "Otwórz folder zawierający"
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Dalej" msgstr "Dalej"
@@ -31881,30 +31448,6 @@ msgstr "Wtyczka „%s” prosi o uprawnienie do zdarzenia audytu Pythona „%s
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Prośba wtyczki o uprawnienia" msgstr "Prośba wtyczki o uprawnienia"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "Interfejs konfiguracji wtyczki był pusty. Wyświetlany jest domyślny edytor." msgstr "Interfejs konfiguracji wtyczki był pusty. Wyświetlany jest domyślny edytor."
@@ -32717,6 +32260,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Narysuj zamknięty profil, aby włączyć" #~ msgstr "Narysuj zamknięty profil, aby włączyć"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Wyczyść wszystko"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Pusty wynik" #~ msgstr "Pusty wynik"
+25 -478
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: 2026-07-26 11:14-0300\n" "PO-Revision-Date: 2026-07-26 11:14-0300\n"
"Last-Translator: Alexandre Folle de Menezes\n" "Last-Translator: Alexandre Folle de Menezes\n"
"Language-Team: Portuguese, Brazilian\n" "Language-Team: Portuguese, Brazilian\n"
@@ -12407,119 +12407,6 @@ msgstr "Falha no login. Tente novamente."
msgid "parse json failed" msgid "parse json failed"
msgstr "falha ao processar o json" msgstr "falha ao processar o json"
msgid "Loading…"
msgstr "Carregamento em andamento…"
msgid "Welcome to Orca Slicer"
msgstr "Bem-vindo ao Orca Slicer"
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr "Orca Slicer será configurado em várias etapas. Vamos começar!"
msgid "Get Started"
msgstr "Vamos Começar"
msgid "Please select your login region"
msgstr "Por favor, selecione sua região de login"
msgid "Finish"
msgstr "Terminar"
msgid "Printer Selection"
msgstr "Seleção de Impressora"
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Impressora Personalizada"
msgid "Create"
msgstr "Criar"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr "Pelo menos uma impressora deve ser selecionada."
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr "Seleção de Filamento"
msgid "System Filaments"
msgstr "Filamentos do Sistema"
msgid "Custom Filaments"
msgstr "Filamentos Personalizados"
msgid "Create New"
msgstr "Criar Novo"
msgid "Filament type"
msgstr "Tipo de Filamento"
msgid "Vendor"
msgstr "Fornecedor"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
msgid "Clear all"
msgstr "Limpar tudo"
msgid "At least one filament must be selected."
msgstr "Pelo menos um filamento deve ser selecionado."
msgid "Do you want to use the default filament?"
msgstr "Você deseja usar o filamento padrão?"
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Isso desativa todos os recursos da nuvem, incluindo a sincronização de perfis do Orca Cloud. Usuários que preferem trabalhar totalmente offline podem ativar esta opção."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Nota: quando o Modo Furtivo está ativado, seus perfis de usuário não serão copiados para o Orca Cloud."
msgid "Enable Stealth Mode."
msgstr "Habilita Modo Furtivo."
msgid "Proprietary Plugins"
msgstr "Plugins Proprietários"
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr "Algumass fabricantes de impressoras exigem plugins proprietários para comunicação com suas impressoras. Se você utiliza tais impressoras, selecione o plug-in correspondente."
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr "Por favor seja cuidadoso estes plugins não são desenvolvidos ou mantidos por OrcaSlicer. Eles devem ser usados por sua conta e risco."
msgid "Install Bambu Network plug-in"
msgstr "Instalar Bambu Network plug-in"
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Ação Necessária] " msgstr "[Ação Necessária] "
@@ -15412,6 +15299,9 @@ msgstr "Preço do filamento, para propósito estatístico apenas."
msgid "money/kg" msgid "money/kg"
msgstr "dinheiro/kg" msgstr "dinheiro/kg"
msgid "Vendor"
msgstr "Fornecedor"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Fornecedor do filamento. Apenas para mostrar." msgstr "Fornecedor do filamento. Apenas para mostrar."
@@ -19732,6 +19622,9 @@ msgstr "Recalibração"
msgid "Calibrate" msgid "Calibrate"
msgstr "Calibrar" msgstr "Calibrar"
msgid "Finish"
msgstr "Terminar"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Como posso usar o resultado da calibração?" msgstr "Como posso usar o resultado da calibração?"
@@ -20273,6 +20166,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Calibração de Temperatura" msgstr "Calibração de Temperatura"
msgid "Filament type"
msgstr "Tipo de Filamento"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -20843,6 +20739,9 @@ msgstr "Ex.: Básico, Fosco, Seda, Mármore"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Predefinição de Filamento" msgstr "Predefinição de Filamento"
msgid "Create"
msgstr "Criar"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "O fornecedor não está selecionado, por favor reselecione o fornecedor." msgstr "O fornecedor não está selecionado, por favor reselecione o fornecedor."
@@ -21149,9 +21048,6 @@ msgstr ""
"Predefinições de impressora e todos os filamentos e processos que pertencem à impressora.\n" "Predefinições de impressora e todos os filamentos e processos que pertencem à impressora.\n"
"Pode ser compartilhado com outros." "Pode ser compartilhado com outros."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -22244,33 +22140,6 @@ msgstr "Se ativado, os valores acima são armazenados como os padrões usados pa
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "A pasta do pacote não existe." msgstr "A pasta do pacote não existe."
@@ -22304,12 +22173,6 @@ msgstr "Cancelar inscrição do Pacote"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Salvar pacote de predefinições" msgstr "Salvar pacote de predefinições"
@@ -27769,6 +27632,10 @@ msgstr "Minhas configurações"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Configuração de Impressora Personalizada" msgstr "Configuração de Impressora Personalizada"
# AI Translated
msgid "Custom Printer"
msgstr "Impressora Personalizada"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Definir um perfil de impressora personalizado" msgstr "Definir um perfil de impressora personalizado"
@@ -29265,28 +29132,6 @@ msgstr "Plugins de filamento"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Plugins de impressora" msgstr "Plugins de impressora"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Restaurar padrões"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "A configuração não é um JSON válido. Suas alterações não foram salvas." msgstr "A configuração não é um JSON válido. Suas alterações não foram salvas."
@@ -29306,6 +29151,10 @@ msgstr ""
"\n" "\n"
"Isso descarta a substituição da predefinição e usa a configuração global." "Isso descarta a substituição da predefinição e usa a configuração global."
# AI Translated
msgid "Restore defaults"
msgstr "Restaurar padrões"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Usando a configuração global. Salve a predefinição para mantê-la." msgstr "Usando a configuração global. Salve a predefinição para mantê-la."
@@ -29375,215 +29224,6 @@ msgstr "Instalando plugin"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "\"%s\" instalado." msgstr "\"%s\" instalado."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -29800,54 +29440,6 @@ msgstr "Falha ao recarregar o plugin."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "\"%s\" recarregado." msgstr "\"%s\" recarregado."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr "Sem informação do modelo"
msgid "Edit Project Info"
msgstr "Editar Info do Projeto"
msgid "Model Information"
msgstr "Informações do Modelo"
msgid "Accessories"
msgstr "Acessórios"
msgid "Profile Information"
msgstr "Informações do Perfil"
msgid "Model name"
msgstr "Nome do Modelo"
msgid "Created by"
msgstr "Criado por"
msgid "Remixed by"
msgstr "Remixado por"
msgid "Shared by"
msgstr "Compartilhado por"
msgid "Model description"
msgstr "Descrição do Modelo"
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr "Nome do Perfil"
msgid "Profile Author"
msgstr "Autor do Perfil"
msgid "Profile description"
msgstr "Descrição do Perfil"
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Configurações do Modo de Purga" msgstr "Configurações do Modo de Purga"
@@ -29872,16 +29464,6 @@ msgstr "Reduz o desperdício de purga e imprime mais rápido. Pode causar leve m
msgid "Terminal" msgid "Terminal"
msgstr "Terminal" msgstr "Terminal"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Um comando já está em execução." msgstr "Um comando já está em execução."
@@ -30279,21 +29861,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr "Bambu Network plug-in não detectado. Clique <a>aqui</a> para instalar isto."
msgid "Create new project"
msgstr "Criar Novo Projeto"
msgid "Recently opened"
msgstr "Aberto Recentemente"
msgid "Open Containing Folder"
msgstr "Abrir pasta de Conteúdo"
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Avançar" msgstr "Avançar"
@@ -30462,30 +30029,6 @@ msgstr "O plugin \"%s\" está solicitando permissão para o evento de auditoria
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Solicitação de permissão do plugin" msgstr "Solicitação de permissão do plugin"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "A interface de configuração do plugin estava vazia. Exibindo o editor padrão." msgstr "A interface de configuração do plugin estava vazia. Exibindo o editor padrão."
@@ -31289,6 +30832,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Desenhe um perfil fechado para ativar" #~ msgstr "Desenhe um perfil fechado para ativar"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Limpar tudo"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Resultado vazio" #~ msgstr "Resultado vazio"
+25 -478
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: OrcaSlicer V2.5.0\n" "Project-Id-Version: OrcaSlicer V2.5.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: 2026-02-25 13:38+0300\n" "PO-Revision-Date: 2026-02-25 13:38+0300\n"
"Last-Translator: Felix14_v2\n" "Last-Translator: Felix14_v2\n"
"Language-Team: Felix14_v2 (ДС/ТГ: @felix14_v2, почта: aleks111001@list.ru), Andylg <andylg@yandex.ru>\n" "Language-Team: Felix14_v2 (ДС/ТГ: @felix14_v2, почта: aleks111001@list.ru), Andylg <andylg@yandex.ru>\n"
@@ -12885,119 +12885,6 @@ msgstr "Ошибка входа. Попробуйте ещё раз."
msgid "parse json failed" msgid "parse json failed"
msgstr "не удалось обработать JSON" msgstr "не удалось обработать JSON"
msgid "Loading…"
msgstr "Загрузка..."
msgid "Welcome to Orca Slicer"
msgstr "Приветствуем в Orca Slicer!"
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr "Для настройки Orca Slicer необходимо пройти несколько этапов. Давайте начнём!"
msgid "Get Started"
msgstr "Начать"
msgid "Please select your login region"
msgstr "Выбор региона"
msgid "Finish"
msgstr "Завершить"
msgid "Printer Selection"
msgstr "Выбор принтера"
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Пользовательский принтер"
msgid "Create"
msgstr "Создать"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr "Должен быть выбран хотя бы один принтер."
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr "Выбор материала"
msgid "System Filaments"
msgstr "Системные материалы"
msgid "Custom Filaments"
msgstr "Пользовательские материалы"
msgid "Create New"
msgstr "Создать новый"
msgid "Filament type"
msgstr "Тип материала"
msgid "Vendor"
msgstr "Производитель"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
msgid "Clear all"
msgstr "Очистить"
msgid "At least one filament must be selected."
msgstr "Должен быть выбран хотя бы один материал."
msgid "Do you want to use the default filament?"
msgstr "Выбрать материалы по умолчанию?"
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr ""
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr ""
msgid "Enable Stealth Mode."
msgstr "Включить режим конфиденциальности"
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr "Для связи с некоторыми моделями принтеров требуются проприетарные плагины. Выберите соответствующий плагин, если у вас такой принтер."
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr "Имейте в виду, что эти плагины не разрабатываются и не поддерживаются OrcaSlicer. Используйте их на свой страх и риск."
msgid "Install Bambu Network plug-in"
msgstr "Установить сетевой плагин Bambu"
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Требуется действие] " msgstr "[Требуется действие] "
@@ -16058,6 +15945,9 @@ msgstr "Стоимость материала. Используется при
msgid "money/kg" msgid "money/kg"
msgstr "цена за кг" msgstr "цена за кг"
msgid "Vendor"
msgstr "Производитель"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Производитель материала. Информационный параметр." msgstr "Производитель материала. Информационный параметр."
@@ -20884,6 +20774,9 @@ msgstr "Перекалибровка"
msgid "Calibrate" msgid "Calibrate"
msgstr "Калибровка" msgstr "Калибровка"
msgid "Finish"
msgstr "Завершить"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Как использовать результаты калибровки?" msgstr "Как использовать результаты калибровки?"
@@ -21435,6 +21328,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Калибровка температуры" msgstr "Калибровка температуры"
msgid "Filament type"
msgstr "Тип материала"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -22023,6 +21919,9 @@ msgstr "например обычная, матовая, шёлковая, мр
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Профиль материала" msgstr "Профиль материала"
msgid "Create"
msgstr "Создать"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Производитель не выбран; пожалуйста, выберите его заново." msgstr "Производитель не выбран; пожалуйста, выберите его заново."
@@ -22337,9 +22236,6 @@ msgstr ""
"и настроек печати, связанные с выбранным принтером.\n" "и настроек печати, связанные с выбранным принтером.\n"
"Этими файлами можно поделиться с другими пользователями." "Этими файлами можно поделиться с другими пользователями."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -23457,33 +23353,6 @@ msgstr "Активируйте для сохранения настроек им
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "Хранилище пакета профилей не найдено." msgstr "Хранилище пакета профилей не найдено."
@@ -23520,12 +23389,6 @@ msgstr "Ошибка"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Сохранить пакет профилей" msgstr "Сохранить пакет профилей"
@@ -29036,6 +28899,10 @@ msgstr "Мои настройки"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Настройка пользовательского принтера" msgstr "Настройка пользовательского принтера"
# AI Translated
msgid "Custom Printer"
msgstr "Пользовательский принтер"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Задать профиль пользовательского принтера" msgstr "Задать профиль пользовательского принтера"
@@ -30532,28 +30399,6 @@ msgstr "Плагины материалов"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Плагины принтеров" msgstr "Плагины принтеров"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Восстановить по умолчанию"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "Конфигурация не является допустимым JSON. Изменения не сохранены." msgstr "Конфигурация не является допустимым JSON. Изменения не сохранены."
@@ -30573,6 +30418,10 @@ msgstr ""
"\n" "\n"
"Переопределение в профиле будет отменено, и будет использоваться глобальная конфигурация." "Переопределение в профиле будет отменено, и будет использоваться глобальная конфигурация."
# AI Translated
msgid "Restore defaults"
msgstr "Восстановить по умолчанию"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Используется глобальная конфигурация. Сохраните профиль, чтобы закрепить изменения." msgstr "Используется глобальная конфигурация. Сохраните профиль, чтобы закрепить изменения."
@@ -30642,215 +30491,6 @@ msgstr "Установка плагина"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "Плагин «%s» установлен." msgstr "Плагин «%s» установлен."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -31067,54 +30707,6 @@ msgstr "Не удалось перезагрузить плагин."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "«%s» перезагружен." msgstr "«%s» перезагружен."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr "Информация отсутствует"
msgid "Edit Project Info"
msgstr "Изменить информацию"
msgid "Model Information"
msgstr "Информация о модели"
msgid "Accessories"
msgstr "Прикреплённые файлы"
msgid "Profile Information"
msgstr "Информация о профиле"
msgid "Model name"
msgstr "Имя модели"
msgid "Created by"
msgstr "Автор"
msgid "Remixed by"
msgstr "Модифицировано"
msgid "Shared by"
msgstr "Поделиться"
msgid "Model description"
msgstr "Описание модели"
msgid "BOM"
msgstr "Список материалов"
msgid "Profile name"
msgstr "Имя профиля"
msgid "Profile Author"
msgstr "Профиль автора"
msgid "Profile description"
msgstr "Описание профиля"
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Настройки режима прочистки" msgstr "Настройки режима прочистки"
@@ -31139,16 +30731,6 @@ msgstr "Уменьшает отходы прочистки и ускоряет
msgid "Terminal" msgid "Terminal"
msgstr "Консоль" msgstr "Консоль"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Команда уже выполняется." msgstr "Команда уже выполняется."
@@ -31546,21 +31128,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr "Сетевой плагин Bambu не обнаружен. Нажмите <a>здесь</a>, чтобы установить его."
msgid "Create new project"
msgstr "Создать новый проект"
msgid "Recently opened"
msgstr "Недавно открытые"
msgid "Open Containing Folder"
msgstr "Открыть папку с файлом"
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Вперёд" msgstr "Вперёд"
@@ -31729,30 +31296,6 @@ msgstr "Плагин «%s» запрашивает разрешение на с
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Запрос разрешения плагина" msgstr "Запрос разрешения плагина"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "Интерфейс настройки плагина пуст. Показан редактор по умолчанию." msgstr "Интерфейс настройки плагина пуст. Показан редактор по умолчанию."
@@ -32554,6 +32097,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Нарисуйте замкнутый профиль, чтобы включить" #~ msgstr "Нарисуйте замкнутый профиль, чтобы включить"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Очистить всё"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Пустой результат" #~ msgstr "Пустой результат"
+25 -479
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"Language: sv\n" "Language: sv\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -14097,120 +14097,6 @@ msgstr "Inloggningen misslyckades. Försök igen."
msgid "parse json failed" msgid "parse json failed"
msgstr "det gick inte att tolka json" msgstr "det gick inte att tolka json"
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr ""
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr ""
msgid "Get Started"
msgstr ""
msgid "Please select your login region"
msgstr ""
msgid "Finish"
msgstr "Slutför"
msgid "Printer Selection"
msgstr ""
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Anpassad skrivare"
msgid "Create"
msgstr "Skapa"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr ""
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr ""
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr "Filament typ"
msgid "Vendor"
msgstr "Leverantör"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
# AI Translated
msgid "Clear all"
msgstr "Rensa alla"
msgid "At least one filament must be selected."
msgstr ""
msgid "Do you want to use the default filament?"
msgstr ""
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Detta stänger av alla molnfunktioner, inklusive profilsynkronisering med Orca Cloud. Användare som föredrar att arbeta helt offline kan aktivera det här alternativet."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Obs! När Stealth-läget är aktiverat säkerhetskopieras inte dina användarprofiler till Orca Cloud."
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr ""
# AI Translated # AI Translated
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Åtgärd krävs] " msgstr "[Åtgärd krävs] "
@@ -17503,6 +17389,9 @@ msgstr "Filament pris, endast för statistiska ändamål"
msgid "money/kg" msgid "money/kg"
msgstr "pris/kg" msgstr "pris/kg"
msgid "Vendor"
msgstr "Leverantör"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Försäljare av filament. Endast för visning" msgstr "Försäljare av filament. Endast för visning"
@@ -22530,6 +22419,9 @@ msgstr "Omkalibrering"
msgid "Calibrate" msgid "Calibrate"
msgstr "Kalibrera" msgstr "Kalibrera"
msgid "Finish"
msgstr "Slutför"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Hur kan jag använda kalibreringsresultaten?" msgstr "Hur kan jag använda kalibreringsresultaten?"
@@ -23108,6 +23000,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Kalibrering av temperatur" msgstr "Kalibrering av temperatur"
msgid "Filament type"
msgstr "Filament typ"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -23761,6 +23656,9 @@ msgstr "t.ex. Basic, Matt, Silke, Marmor"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Filament inställning" msgstr "Filament inställning"
msgid "Create"
msgstr "Skapa"
# AI Translated # AI Translated
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Ingen tillverkare är vald; välj tillverkare igen." msgstr "Ingen tillverkare är vald; välj tillverkare igen."
@@ -24090,9 +23988,6 @@ msgstr ""
"Skrivaren och alla filament- och processförinställningar som hör till skrivaren.\n" "Skrivaren och alla filament- och processförinställningar som hör till skrivaren.\n"
"Kan delas med andra." "Kan delas med andra."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -25445,33 +25340,6 @@ msgstr "Om detta är aktiverat sparas värdena ovan som standard för framtida S
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
# AI Translated # AI Translated
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "Paketmappen finns inte." msgstr "Paketmappen finns inte."
@@ -25516,12 +25384,6 @@ msgstr "Avprenumerera på paket"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
# AI Translated # AI Translated
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Spara förinställningspaket" msgstr "Spara förinställningspaket"
@@ -31075,6 +30937,10 @@ msgstr "Mina inställningar"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Konfiguration av anpassad skrivare" msgstr "Konfiguration av anpassad skrivare"
# AI Translated
msgid "Custom Printer"
msgstr "Anpassad skrivare"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Definiera en anpassad skrivarprofil" msgstr "Definiera en anpassad skrivarprofil"
@@ -32563,28 +32429,6 @@ msgstr "Filamentinsticksmoduler"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Skrivarinsticksmoduler" msgstr "Skrivarinsticksmoduler"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Återställ standardvärden"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "Konfigurationen är inte giltig JSON. Dina ändringar sparades inte." msgstr "Konfigurationen är inte giltig JSON. Dina ändringar sparades inte."
@@ -32604,6 +32448,10 @@ msgstr ""
"\n" "\n"
"Detta förkastar förinställningens åsidosättning och använder den globala konfigurationen." "Detta förkastar förinställningens åsidosättning och använder den globala konfigurationen."
# AI Translated
msgid "Restore defaults"
msgstr "Återställ standardvärden"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Använder den globala konfigurationen. Spara förinställningen för att behålla den." msgstr "Använder den globala konfigurationen. Spara förinställningen för att behålla den."
@@ -32673,215 +32521,6 @@ msgstr "Installerar insticksmodul"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "\"%s\" har installerats." msgstr "\"%s\" har installerats."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -33098,54 +32737,6 @@ msgstr "Det gick inte att läsa in insticksmodulen igen."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "\"%s\" har lästs in igen." msgstr "\"%s\" har lästs in igen."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr ""
msgid "Edit Project Info"
msgstr ""
msgid "Model Information"
msgstr ""
msgid "Accessories"
msgstr ""
msgid "Profile Information"
msgstr ""
msgid "Model name"
msgstr ""
msgid "Created by"
msgstr ""
msgid "Remixed by"
msgstr ""
msgid "Shared by"
msgstr ""
msgid "Model description"
msgstr ""
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr ""
msgid "Profile Author"
msgstr ""
msgid "Profile description"
msgstr ""
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Inställningar för rensningsläge" msgstr "Inställningar för rensningsläge"
@@ -33170,16 +32761,6 @@ msgstr "Minskar spillet från priming och skriver ut snabbare. Kan orsaka lätt
msgid "Terminal" msgid "Terminal"
msgstr "Terminal" msgstr "Terminal"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Ett kommando körs redan." msgstr "Ett kommando körs redan."
@@ -33577,21 +33158,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr ""
msgid "Create new project"
msgstr ""
msgid "Recently opened"
msgstr ""
msgid "Open Containing Folder"
msgstr ""
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Framåt" msgstr "Framåt"
@@ -33760,30 +33326,6 @@ msgstr "Insticksmodulen \"%s\" begär behörighet för Python-granskningshändel
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Behörighetsbegäran från insticksmodul" msgstr "Behörighetsbegäran från insticksmodul"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "Insticksmodulens konfigurationsgränssnitt var tomt. Standardredigeraren visas." msgstr "Insticksmodulens konfigurationsgränssnitt var tomt. Standardredigeraren visas."
@@ -34613,6 +34155,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Rita en sluten profil för att aktivera" #~ msgstr "Rita en sluten profil för att aktivera"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Rensa alla"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Tomt resultat" #~ msgstr "Tomt resultat"
+25 -479
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: 2026-06-19 13:40+0700\n" "PO-Revision-Date: 2026-06-19 13:40+0700\n"
"Last-Translator: Icezaza\n" "Last-Translator: Icezaza\n"
"Language-Team: Thai\n" "Language-Team: Thai\n"
@@ -12782,120 +12782,6 @@ msgstr "การเข้าสู่ระบบล้มเหลว โป
msgid "parse json failed" msgid "parse json failed"
msgstr "แยกวิเคราะห์ json ไม่สำเร็จ" msgstr "แยกวิเคราะห์ json ไม่สำเร็จ"
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr ""
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr ""
msgid "Get Started"
msgstr ""
msgid "Please select your login region"
msgstr ""
msgid "Finish"
msgstr "เสร็จ"
msgid "Printer Selection"
msgstr ""
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "เครื่องพิมพ์แบบกำหนดเอง"
msgid "Create"
msgstr "สร้าง"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr ""
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr ""
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr "ชนิดเส้นพลาสติก"
msgid "Vendor"
msgstr "ผู้ขาย"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
# AI Translated
msgid "Clear all"
msgstr "ล้างทั้งหมด"
msgid "At least one filament must be selected."
msgstr ""
msgid "Do you want to use the default filament?"
msgstr ""
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "ตัวเลือกนี้จะปิดการใช้งานฟีเจอร์คลาวด์ทั้งหมด รวมถึงการซิงก์โปรไฟล์ Orca Cloud ผู้ใช้ที่ต้องการทำงานแบบออฟไลน์ทั้งหมดสามารถเปิดตัวเลือกนี้ได้"
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "หมายเหตุ: เมื่อเปิดโหมดซ่อนตัว โปรไฟล์ผู้ใช้ของคุณจะไม่ถูกสำรองไปยัง Orca Cloud"
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr ""
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[ต้องดำเนินการ]" msgstr "[ต้องดำเนินการ]"
@@ -15842,6 +15728,9 @@ msgstr "ราคาเส้นพลาสติก. สำหรับสถ
msgid "money/kg" msgid "money/kg"
msgstr "เงิน/กก." msgstr "เงิน/กก."
msgid "Vendor"
msgstr "ผู้ขาย"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "ผู้จำหน่ายเส้นพลาสติก. สำหรับการแสดงเท่านั้น" msgstr "ผู้จำหน่ายเส้นพลาสติก. สำหรับการแสดงเท่านั้น"
@@ -20265,6 +20154,9 @@ msgstr "การปรับเทียบใหม่"
msgid "Calibrate" msgid "Calibrate"
msgstr "ปรับเทียบ" msgstr "ปรับเทียบ"
msgid "Finish"
msgstr "เสร็จ"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "จะใช้ผลการสอบเทียบได้อย่างไร?" msgstr "จะใช้ผลการสอบเทียบได้อย่างไร?"
@@ -20811,6 +20703,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "การปรับเทียบอุณหภูมิ" msgstr "การปรับเทียบอุณหภูมิ"
msgid "Filament type"
msgstr "ชนิดเส้นพลาสติก"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -21389,6 +21284,9 @@ msgstr "เช่น พื้นฐาน, เนื้อด้าน, ไห
msgid "Filament Preset" msgid "Filament Preset"
msgstr "พรีเซ็ตเส้นพลาสติก" msgstr "พรีเซ็ตเส้นพลาสติก"
msgid "Create"
msgstr "สร้าง"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "ไม่ได้เลือกผู้ขาย โปรดเลือกผู้ขายอีกครั้ง" msgstr "ไม่ได้เลือกผู้ขาย โปรดเลือกผู้ขายอีกครั้ง"
@@ -21692,9 +21590,6 @@ msgstr ""
"เครื่องพิมพ์และเส้นพลาสติกและค่าที่ตั้งล่วงหน้ากระบวนการทั้งหมดที่เป็นของเครื่องพิมพ์\n" "เครื่องพิมพ์และเส้นพลาสติกและค่าที่ตั้งล่วงหน้ากระบวนการทั้งหมดที่เป็นของเครื่องพิมพ์\n"
"สามารถแบ่งปันกับผู้อื่นได้" "สามารถแบ่งปันกับผู้อื่นได้"
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -22842,33 +22737,6 @@ msgstr "หากเปิดใช้งาน ค่าด้านบนจ
msgid "PresetBundle" msgid "PresetBundle"
msgstr "ชุดค่าที่ตั้งไว้ล่วงหน้า" msgstr "ชุดค่าที่ตั้งไว้ล่วงหน้า"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "ไม่มีโฟลเดอร์ชุด" msgstr "ไม่มีโฟลเดอร์ชุด"
@@ -22902,12 +22770,6 @@ msgstr "ยกเลิกการติดตามชุด"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ส่งออกชุดค่าที่ตั้งไว้ล่วงหน้า" msgstr "ส่งออกชุดค่าที่ตั้งไว้ล่วงหน้า"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "บันทึกชุดค่าที่ตั้งไว้ล่วงหน้า" msgstr "บันทึกชุดค่าที่ตั้งไว้ล่วงหน้า"
@@ -28425,6 +28287,10 @@ msgstr "การตั้งค่าของฉัน"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "ตั้งค่าเครื่องพิมพ์แบบกำหนดเอง" msgstr "ตั้งค่าเครื่องพิมพ์แบบกำหนดเอง"
# AI Translated
msgid "Custom Printer"
msgstr "เครื่องพิมพ์แบบกำหนดเอง"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "กำหนดโปรไฟล์เครื่องพิมพ์แบบกำหนดเอง" msgstr "กำหนดโปรไฟล์เครื่องพิมพ์แบบกำหนดเอง"
@@ -29920,28 +29786,6 @@ msgstr "ปลั๊กอินเส้นพลาสติก"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "ปลั๊กอินเครื่องพิมพ์" msgstr "ปลั๊กอินเครื่องพิมพ์"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "คืนค่าเริ่มต้น"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "การกำหนดค่าไม่ใช่ JSON ที่ถูกต้อง การเปลี่ยนแปลงของคุณไม่ได้รับการบันทึก" msgstr "การกำหนดค่าไม่ใช่ JSON ที่ถูกต้อง การเปลี่ยนแปลงของคุณไม่ได้รับการบันทึก"
@@ -29961,6 +29805,10 @@ msgstr ""
"\n" "\n"
"การดำเนินการนี้จะทิ้งค่าที่พรีเซ็ตแทนที่ไว้และใช้การกำหนดค่าส่วนกลาง" "การดำเนินการนี้จะทิ้งค่าที่พรีเซ็ตแทนที่ไว้และใช้การกำหนดค่าส่วนกลาง"
# AI Translated
msgid "Restore defaults"
msgstr "คืนค่าเริ่มต้น"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "กำลังใช้การกำหนดค่าส่วนกลาง บันทึกพรีเซ็ตเพื่อเก็บการเปลี่ยนแปลงไว้" msgstr "กำลังใช้การกำหนดค่าส่วนกลาง บันทึกพรีเซ็ตเพื่อเก็บการเปลี่ยนแปลงไว้"
@@ -30030,215 +29878,6 @@ msgstr "กำลังติดตั้งปลั๊กอิน"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "ติดตั้ง \"%s\" แล้ว" msgstr "ติดตั้ง \"%s\" แล้ว"
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -30455,54 +30094,6 @@ msgstr "ไม่สามารถโหลดปลั๊กอินใหม
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "โหลด \"%s\" ใหม่แล้ว" msgstr "โหลด \"%s\" ใหม่แล้ว"
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr ""
msgid "Edit Project Info"
msgstr ""
msgid "Model Information"
msgstr ""
msgid "Accessories"
msgstr ""
msgid "Profile Information"
msgstr ""
msgid "Model name"
msgstr ""
msgid "Created by"
msgstr ""
msgid "Remixed by"
msgstr ""
msgid "Shared by"
msgstr ""
msgid "Model description"
msgstr ""
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr ""
msgid "Profile Author"
msgstr ""
msgid "Profile description"
msgstr ""
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "การตั้งค่าโหมดไล่เส้น" msgstr "การตั้งค่าโหมดไล่เส้น"
@@ -30527,16 +30118,6 @@ msgstr "ลดเส้นพลาสติกที่เสียจากก
msgid "Terminal" msgid "Terminal"
msgstr "เทอร์มินัล" msgstr "เทอร์มินัล"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "มีคำสั่งกำลังทำงานอยู่แล้ว" msgstr "มีคำสั่งกำลังทำงานอยู่แล้ว"
@@ -30934,21 +30515,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr ""
msgid "Create new project"
msgstr ""
msgid "Recently opened"
msgstr ""
msgid "Open Containing Folder"
msgstr ""
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "ไปข้างหน้า" msgstr "ไปข้างหน้า"
@@ -31117,30 +30683,6 @@ msgstr "ปลั๊กอิน \"%s\" กำลังขอสิทธิ์
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "คำขอสิทธิ์ของปลั๊กอิน" msgstr "คำขอสิทธิ์ของปลั๊กอิน"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "UI การกำหนดค่าของปลั๊กอินว่างเปล่า กำลังแสดงตัวแก้ไขเริ่มต้น" msgstr "UI การกำหนดค่าของปลั๊กอินว่างเปล่า กำลังแสดงตัวแก้ไขเริ่มต้น"
@@ -31946,6 +31488,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "วาดโปรไฟล์ปิดเพื่อเปิดใช้งาน" #~ msgstr "วาดโปรไฟล์ปิดเพื่อเปิดใช้งาน"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "ล้างทั้งหมด"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "ผลลัพธ์ว่างเปล่า" #~ msgstr "ผลลัพธ์ว่างเปล่า"
+26 -479
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: 2026-08-21 23:18+0300\n" "PO-Revision-Date: 2026-08-21 23:18+0300\n"
"Last-Translator: GlauTech\n" "Last-Translator: GlauTech\n"
"Language-Team: \n" "Language-Team: \n"
@@ -4450,7 +4450,7 @@ msgstr "Kaydet"
msgctxt "Navigation" msgctxt "Navigation"
msgid "Back" msgid "Back"
msgstr "Geri" msgstr "Arka"
msgid "Example" msgid "Example"
msgstr "Örnek" msgstr "Örnek"
@@ -12952,119 +12952,6 @@ msgstr "Giriş başarısız oldu. Lütfen yeniden deneyin."
msgid "parse json failed" msgid "parse json failed"
msgstr "json ayrıştırma başarısız oldu" msgstr "json ayrıştırma başarısız oldu"
msgid "Loading…"
msgstr "Yükleme devam ediyor…"
msgid "Welcome to Orca Slicer"
msgstr "Orca Slicer'a hoş geldiniz"
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr "Orca Dilimleyici birkaç adımda kurulacaktır. Hadi başlayalım!"
msgid "Get Started"
msgstr "Başla"
msgid "Please select your login region"
msgstr "Lütfen giriş bölgenizi seçin"
msgid "Finish"
msgstr "Bitir"
msgid "Printer Selection"
msgstr "Yazıcı Seçimi"
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Özel Yazıcı"
msgid "Create"
msgstr "Oluştur"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr "En az bir yazıcı seçilmelidir."
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr "Filament Seçimi"
msgid "System Filaments"
msgstr "Sistem Filamentleri"
msgid "Custom Filaments"
msgstr "Özel Filamentler"
msgid "Create New"
msgstr "Yeni Oluştur"
msgid "Filament type"
msgstr "Filament türü"
msgid "Vendor"
msgstr "Satıcı"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
msgid "Clear all"
msgstr "Hepsini temizle"
msgid "At least one filament must be selected."
msgstr "En az bir filament seçilmelidir."
msgid "Do you want to use the default filament?"
msgstr "Varsayılan filamenti kullanmak ister misiniz ?"
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Bu, Orca Cloud profil eşitlemesi dahil tüm bulut özelliklerini devre dışı bırakır. Tamamen çevrimdışı çalışmayı tercih eden kullanıcılar bu seçeneği etkinleştirebilir."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Not: Gizli Mod etkinken kullanıcı profilleriniz Orca Cloud'a yedeklenmez."
msgid "Enable Stealth Mode."
msgstr "Gizli Modu etkinleştirin."
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr "Bazı yazıcı üreticileri, yazıcılarıyla iletişim için özel eklentilere ihtiyaç duyar. Bu tür yazıcılar kullanıyorsanız lütfen ilgili eklentiyi seçin."
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr "Lütfen bu eklentilerin OrcaSlicer tarafından geliştirilmediğini veya bakımının yapılmadığını unutmayın. Kendi takdirinize ve riskinize göre kullanılmalıdırlar."
msgid "Install Bambu Network plug-in"
msgstr "Bambu Ağı eklentisini yükleyin"
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[İşlem Gerekli] " msgstr "[İşlem Gerekli] "
@@ -16078,6 +15965,9 @@ msgstr "Filament fiyatı. Yalnızca istatistikler için."
msgid "money/kg" msgid "money/kg"
msgstr "ücret/kg" msgstr "ücret/kg"
msgid "Vendor"
msgstr "Satıcı"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Filament satıcısı. Yalnızca gösteri için." msgstr "Filament satıcısı. Yalnızca gösteri için."
@@ -20573,6 +20463,9 @@ msgstr "Yeniden kalibrasyon"
msgid "Calibrate" msgid "Calibrate"
msgstr "Kalibre et" msgstr "Kalibre et"
msgid "Finish"
msgstr "Bitir"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Kalibrasyon sonucu nasıl kullanılır?" msgstr "Kalibrasyon sonucu nasıl kullanılır?"
@@ -21122,6 +21015,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Sıcaklık kalibrasyonu" msgstr "Sıcaklık kalibrasyonu"
msgid "Filament type"
msgstr "Filament türü"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -21727,6 +21623,9 @@ msgstr "Örneğin. Basic, Mat, İpek, Mermer"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Filament Ön Ayarı" msgstr "Filament Ön Ayarı"
msgid "Create"
msgstr "Oluştur"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Satıcı seçilmedi, lütfen satıcıyı yeniden seçin." msgstr "Satıcı seçilmedi, lütfen satıcıyı yeniden seçin."
@@ -22036,9 +21935,6 @@ msgstr ""
"Yazıcı ve yazıcıya ait tüm filament ve işlem ön ayarları.\n" "Yazıcı ve yazıcıya ait tüm filament ve işlem ön ayarları.\n"
"Başkalarıyla paylaşılabilir." "Başkalarıyla paylaşılabilir."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -23245,33 +23141,6 @@ msgstr "Etkinleştirildiğinde yukarıdaki değerler, gelecekteki STEP içe akta
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
# AI Translated # AI Translated
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "Paket klasörü mevcut değil." msgstr "Paket klasörü mevcut değil."
@@ -23316,12 +23185,6 @@ msgstr "Paket Aboneliğinden Çık"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
# AI Translated # AI Translated
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Ön ayar paketini kaydet" msgstr "Ön ayar paketini kaydet"
@@ -28867,6 +28730,10 @@ msgstr "Ayarlarım"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Özel Yazıcı Kurulumu" msgstr "Özel Yazıcı Kurulumu"
# AI Translated
msgid "Custom Printer"
msgstr "Özel Yazıcı"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Özel bir yazıcı profili tanımlayın" msgstr "Özel bir yazıcı profili tanımlayın"
@@ -30363,28 +30230,6 @@ msgstr "Filament eklentileri"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Yazıcı eklentileri" msgstr "Yazıcı eklentileri"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Varsayılanları geri yükle"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "Yapılandırma geçerli bir JSON değil. Değişiklikleriniz kaydedilmedi." msgstr "Yapılandırma geçerli bir JSON değil. Değişiklikleriniz kaydedilmedi."
@@ -30404,6 +30249,10 @@ msgstr ""
"\n" "\n"
"Bu, ön ayarın geçersiz kılmasını siler ve genel yapılandırmayı kullanır." "Bu, ön ayarın geçersiz kılmasını siler ve genel yapılandırmayı kullanır."
# AI Translated
msgid "Restore defaults"
msgstr "Varsayılanları geri yükle"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Genel yapılandırma kullanılıyor. Kalıcı hale getirmek için ön ayarı kaydedin." msgstr "Genel yapılandırma kullanılıyor. Kalıcı hale getirmek için ön ayarı kaydedin."
@@ -30473,215 +30322,6 @@ msgstr "Eklenti yükleniyor"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "\"%s\" yüklendi." msgstr "\"%s\" yüklendi."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -30898,54 +30538,6 @@ msgstr "Eklenti yeniden yüklenemedi."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "\"%s\" yeniden yüklendi." msgstr "\"%s\" yeniden yüklendi."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr "Model bilgisi yok"
msgid "Edit Project Info"
msgstr "Proje Bilgilerini Düzenle"
msgid "Model Information"
msgstr "Model Bilgileri"
msgid "Accessories"
msgstr "Aksesuarlar"
msgid "Profile Information"
msgstr "Profil Bilgisi"
msgid "Model name"
msgstr "Model adı"
msgid "Created by"
msgstr "Oluşturan"
msgid "Remixed by"
msgstr "Değiştiren"
msgid "Shared by"
msgstr "Paylaşan"
msgid "Model description"
msgstr "Model açıklaması"
msgid "BOM"
msgstr "Malzeme Listesi"
msgid "Profile name"
msgstr "Profil ismi"
msgid "Profile Author"
msgstr "Profil Yazarı"
msgid "Profile description"
msgstr "Profil açıklaması"
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Yıkama Modu Ayarları" msgstr "Yıkama Modu Ayarları"
@@ -30970,16 +30562,6 @@ msgstr "Prime atığını azaltır ve daha hızlı yazdırır. Hafif renk karı
msgid "Terminal" msgid "Terminal"
msgstr "Terminal" msgstr "Terminal"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Zaten çalışan bir komut var." msgstr "Zaten çalışan bir komut var."
@@ -31377,21 +30959,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr "Bambu Ağı eklentisi algılanmadı. Yüklemek için <a>burayı</a> tıklayın."
msgid "Create new project"
msgstr "Yeni proje oluştur"
msgid "Recently opened"
msgstr "Yakın zamanda açıldı"
msgid "Open Containing Folder"
msgstr "Dosyayı içeren klasörü açınız"
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "İleri" msgstr "İleri"
@@ -31560,30 +31127,6 @@ msgstr "\"%s\" eklentisi \"%s\" Python denetim olayı için izin istiyor."
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Eklenti izin isteği" msgstr "Eklenti izin isteği"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "Eklentinin yapılandırma arayüzü boştu. Varsayılan düzenleyici gösteriliyor." msgstr "Eklentinin yapılandırma arayüzü boştu. Varsayılan düzenleyici gösteriliyor."
@@ -32396,6 +31939,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Etkinleştirmek için kapalı bir profil çizin" #~ msgstr "Etkinleştirmek için kapalı bir profil çizin"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Tümünü temizle"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Boş sonuç" #~ msgstr "Boş sonuç"
+26 -480
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: orcaslicerua\n" "Project-Id-Version: orcaslicerua\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: 2026-07-17 16:25+0300\n" "PO-Revision-Date: 2026-07-17 16:25+0300\n"
"Last-Translator: Andrij Mizyk <andm1zyk@proton.me>\n" "Last-Translator: Andrij Mizyk <andm1zyk@proton.me>\n"
"Language-Team: Ukrainian\n" "Language-Team: Ukrainian\n"
@@ -4365,7 +4365,7 @@ msgstr "Зберегти"
msgctxt "Navigation" msgctxt "Navigation"
msgid "Back" msgid "Back"
msgstr "Назад" msgstr "Ззаду"
msgid "Example" msgid "Example"
msgstr "Приклад" msgstr "Приклад"
@@ -13012,120 +13012,6 @@ msgstr "Не вдалося ввійти. Спробуйте ще раз."
msgid "parse json failed" msgid "parse json failed"
msgstr "не вдалося зчитати json" msgstr "не вдалося зчитати json"
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr ""
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr ""
msgid "Get Started"
msgstr ""
msgid "Please select your login region"
msgstr ""
msgid "Finish"
msgstr "Завершити"
msgid "Printer Selection"
msgstr ""
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Власний принтер"
msgid "Create"
msgstr "Створити"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr ""
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr ""
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr "Тип філаменту"
msgid "Vendor"
msgstr "Виробник"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
# AI Translated
msgid "Clear all"
msgstr "Очистити все"
msgid "At least one filament must be selected."
msgstr ""
msgid "Do you want to use the default filament?"
msgstr ""
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Це вимикає всі хмарні функції, зокрема синхронізацію профілів Orca Cloud. Користувачі, які надають перевагу повністю автономній роботі, можуть увімкнути цю опцію."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Примітка: коли увімкнено прихований режим, ваші профілі користувача не резервуватимуться в Orca Cloud."
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr ""
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Необхідна дія] " msgstr "[Необхідна дія] "
@@ -16201,6 +16087,9 @@ msgstr "Ціна філаменту. Тільки для статистики"
msgid "money/kg" msgid "money/kg"
msgstr "грн/кг" msgstr "грн/кг"
msgid "Vendor"
msgstr "Виробник"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Виробник філаменту. Для показу, тільки для відображення" msgstr "Виробник філаменту. Для показу, тільки для відображення"
@@ -20801,6 +20690,9 @@ msgstr "Перекалібрування"
msgid "Calibrate" msgid "Calibrate"
msgstr "Калібрувати" msgstr "Калібрувати"
msgid "Finish"
msgstr "Завершити"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Як використовувати результат калібрування?" msgstr "Як використовувати результат калібрування?"
@@ -21361,6 +21253,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Калібрування температури" msgstr "Калібрування температури"
msgid "Filament type"
msgstr "Тип філаменту"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -21971,6 +21866,9 @@ msgstr "наприклад, Basic, Matte, Silk, Marble"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Набір параметрів філаменту" msgstr "Набір параметрів філаменту"
msgid "Create"
msgstr "Створити"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Виробник не вибраний. Будь ласка, перевиберіть виробника." msgstr "Виробник не вибраний. Будь ласка, перевиберіть виробника."
@@ -22280,9 +22178,6 @@ msgstr ""
"Принтер і всі нитки та налаштування процесу, які належать принтеру.\n" "Принтер і всі нитки та налаштування процесу, які належать принтеру.\n"
"Ними можна ділитись з іншими." "Ними можна ділитись з іншими."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -23407,33 +23302,6 @@ msgstr "Якщо дозволено, значення вище зберігат
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "Тека набору не існує." msgstr "Тека набору не існує."
@@ -23467,12 +23335,6 @@ msgstr "Відписатися від набору"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Зберегти набір пресету" msgstr "Зберегти набір пресету"
@@ -29033,6 +28895,10 @@ msgstr "Мої налаштування"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Налаштування власного принтера" msgstr "Налаштування власного принтера"
# AI Translated
msgid "Custom Printer"
msgstr "Власний принтер"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Створіть профіль власного принтера" msgstr "Створіть профіль власного принтера"
@@ -30530,28 +30396,6 @@ msgstr "Плагіни філаменту"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Плагіни принтера" msgstr "Плагіни принтера"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Відновити типові"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "Конфігурація не є коректним JSON. Ваші зміни не збережено." msgstr "Конфігурація не є коректним JSON. Ваші зміни не збережено."
@@ -30571,6 +30415,10 @@ msgstr ""
"\n" "\n"
"Це відкине перевизначення в пресеті й застосує глобальну конфігурацію." "Це відкине перевизначення в пресеті й застосує глобальну конфігурацію."
# AI Translated
msgid "Restore defaults"
msgstr "Відновити типові"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Використовується глобальна конфігурація. Збережіть пресет, щоб зміни залишилися." msgstr "Використовується глобальна конфігурація. Збережіть пресет, щоб зміни залишилися."
@@ -30640,215 +30488,6 @@ msgstr "Встановлення плагіна"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "Встановлено «%s»." msgstr "Встановлено «%s»."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -31065,54 +30704,6 @@ msgstr "Не вдалося перезавантажити плагін."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "Перезавантажено «%s»." msgstr "Перезавантажено «%s»."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr ""
msgid "Edit Project Info"
msgstr ""
msgid "Model Information"
msgstr ""
msgid "Accessories"
msgstr ""
msgid "Profile Information"
msgstr ""
msgid "Model name"
msgstr ""
msgid "Created by"
msgstr ""
msgid "Remixed by"
msgstr ""
msgid "Shared by"
msgstr ""
msgid "Model description"
msgstr ""
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr ""
msgid "Profile Author"
msgstr ""
msgid "Profile description"
msgstr ""
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Налаштування режиму очищення" msgstr "Налаштування режиму очищення"
@@ -31137,16 +30728,6 @@ msgstr "Зменшує відходи підготовки та пришвидш
msgid "Terminal" msgid "Terminal"
msgstr "Термінал" msgstr "Термінал"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Команда вже виконується." msgstr "Команда вже виконується."
@@ -31544,21 +31125,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr ""
msgid "Create new project"
msgstr ""
msgid "Recently opened"
msgstr ""
msgid "Open Containing Folder"
msgstr ""
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Уперед" msgstr "Уперед"
@@ -31727,30 +31293,6 @@ msgstr "Плагін «%s» запитує дозвіл на подію ауди
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Запит дозволу плагіна" msgstr "Запит дозволу плагіна"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "Інтерфейс конфігурації плагіна порожній. Показано типовий редактор." msgstr "Інтерфейс конфігурації плагіна порожній. Показано типовий редактор."
@@ -32567,6 +32109,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Намалюйте замкнений профіль, щоб увімкнути" #~ msgstr "Намалюйте замкнений профіль, щоб увімкнути"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Очистити все"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Порожній результат" #~ msgstr "Порожній результат"
+26 -480
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: 2025-10-02 17:43+0700\n" "PO-Revision-Date: 2025-10-02 17:43+0700\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: hainguyen.ts13@gmail.com\n" "Language-Team: hainguyen.ts13@gmail.com\n"
@@ -4628,7 +4628,7 @@ msgstr "Lưu"
msgctxt "Navigation" msgctxt "Navigation"
msgid "Back" msgid "Back"
msgstr "Quay lại" msgstr "Sau"
msgid "Example" msgid "Example"
msgstr "Ví dụ" msgstr "Ví dụ"
@@ -13561,120 +13561,6 @@ msgstr "Đăng nhập thất bại. Vui lòng thử lại."
msgid "parse json failed" msgid "parse json failed"
msgstr "phân tích json thất bại" msgstr "phân tích json thất bại"
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr ""
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr ""
msgid "Get Started"
msgstr ""
msgid "Please select your login region"
msgstr ""
msgid "Finish"
msgstr "Hoàn thành"
msgid "Printer Selection"
msgstr ""
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "Máy in tùy chỉnh"
msgid "Create"
msgstr "Tạo"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr ""
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr ""
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr "Loại filament"
msgid "Vendor"
msgstr "Nhà cung cấp"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
# AI Translated
msgid "Clear all"
msgstr "Xóa tất cả"
msgid "At least one filament must be selected."
msgstr ""
msgid "Do you want to use the default filament?"
msgstr ""
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "Tùy chọn này tắt toàn bộ tính năng cloud, bao gồm cả đồng bộ hồ sơ Orca Cloud. Người dùng muốn làm việc hoàn toàn ngoại tuyến có thể bật tùy chọn này."
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "Lưu ý: Khi Chế độ ẩn danh được bật, hồ sơ người dùng của bạn sẽ không được sao lưu lên Orca Cloud."
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr ""
# AI Translated # AI Translated
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Cần thao tác] " msgstr "[Cần thao tác] "
@@ -16768,6 +16654,9 @@ msgstr "Giá filament. Chỉ cho thống kê."
msgid "money/kg" msgid "money/kg"
msgstr "tiền/kg" msgstr "tiền/kg"
msgid "Vendor"
msgstr "Nhà cung cấp"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "Nhà cung cấp filament. Chỉ để hiển thị." msgstr "Nhà cung cấp filament. Chỉ để hiển thị."
@@ -21318,6 +21207,9 @@ msgstr "Hiệu chỉnh lại"
msgid "Calibrate" msgid "Calibrate"
msgstr "Hiệu chỉnh" msgstr "Hiệu chỉnh"
msgid "Finish"
msgstr "Hoàn thành"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "Cách sử dụng kết quả hiệu chỉnh?" msgstr "Cách sử dụng kết quả hiệu chỉnh?"
@@ -21879,6 +21771,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "Hiệu chỉnh nhiệt độ" msgstr "Hiệu chỉnh nhiệt độ"
msgid "Filament type"
msgstr "Loại filament"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -22501,6 +22396,9 @@ msgstr "ví dụ Cơ bản, Mờ, Lụa, Đá cẩm thạch"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Cài đặt sẵn filament" msgstr "Cài đặt sẵn filament"
msgid "Create"
msgstr "Tạo"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "Nhà cung cấp không được chọn, vui lòng chọn lại nhà cung cấp." msgstr "Nhà cung cấp không được chọn, vui lòng chọn lại nhà cung cấp."
@@ -22815,9 +22713,6 @@ msgstr ""
"Máy in và tất cả các loại sợi in 3D cùng các cài đặt quy trình đi kèm với máy in.\n" "Máy in và tất cả các loại sợi in 3D cùng các cài đặt quy trình đi kèm với máy in.\n"
"Có thể chia sẻ với người khác." "Có thể chia sẻ với người khác."
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -24092,33 +23987,6 @@ msgstr "Nếu bật, các giá trị ở trên sẽ được lưu làm mặc đ
msgid "PresetBundle" msgid "PresetBundle"
msgstr "PresetBundle" msgstr "PresetBundle"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
# AI Translated # AI Translated
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "Thư mục gói không tồn tại." msgstr "Thư mục gói không tồn tại."
@@ -24163,12 +24031,6 @@ msgstr "Hủy đăng ký gói"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "ExportPresetBundle" msgstr "ExportPresetBundle"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
# AI Translated # AI Translated
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "Lưu gói cài đặt sẵn" msgstr "Lưu gói cài đặt sẵn"
@@ -29706,6 +29568,10 @@ msgstr "Cài đặt của tôi"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "Thiết lập máy in tùy chỉnh" msgstr "Thiết lập máy in tùy chỉnh"
# AI Translated
msgid "Custom Printer"
msgstr "Máy in tùy chỉnh"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "Định nghĩa hồ sơ máy in tùy chỉnh" msgstr "Định nghĩa hồ sơ máy in tùy chỉnh"
@@ -31201,28 +31067,6 @@ msgstr "Plugin filament"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "Plugin máy in" msgstr "Plugin máy in"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "Khôi phục mặc định"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "Cấu hình không phải là JSON hợp lệ. Các thay đổi của bạn chưa được lưu." msgstr "Cấu hình không phải là JSON hợp lệ. Các thay đổi của bạn chưa được lưu."
@@ -31242,6 +31086,10 @@ msgstr ""
"\n" "\n"
"Thao tác này sẽ hủy phần ghi đè của cài đặt sẵn và dùng cấu hình chung." "Thao tác này sẽ hủy phần ghi đè của cài đặt sẵn và dùng cấu hình chung."
# AI Translated
msgid "Restore defaults"
msgstr "Khôi phục mặc định"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "Đang dùng cấu hình chung. Hãy lưu cài đặt sẵn để giữ lại thay đổi." msgstr "Đang dùng cấu hình chung. Hãy lưu cài đặt sẵn để giữ lại thay đổi."
@@ -31311,215 +31159,6 @@ msgstr "Đang cài đặt plugin"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "Đã cài đặt \"%s\"." msgstr "Đã cài đặt \"%s\"."
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -31736,54 +31375,6 @@ msgstr "Tải lại plugin thất bại."
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "Đã tải lại \"%s\"." msgstr "Đã tải lại \"%s\"."
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr ""
msgid "Edit Project Info"
msgstr ""
msgid "Model Information"
msgstr ""
msgid "Accessories"
msgstr ""
msgid "Profile Information"
msgstr ""
msgid "Model name"
msgstr ""
msgid "Created by"
msgstr ""
msgid "Remixed by"
msgstr ""
msgid "Shared by"
msgstr ""
msgid "Model description"
msgstr ""
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr ""
msgid "Profile Author"
msgstr ""
msgid "Profile description"
msgstr ""
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "Cài đặt chế độ xả" msgstr "Cài đặt chế độ xả"
@@ -31808,16 +31399,6 @@ msgstr "Giảm lượng nhựa xả bỏ và in nhanh hơn. Có thể gây lẫn
msgid "Terminal" msgid "Terminal"
msgstr "Terminal" msgstr "Terminal"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "Một lệnh khác đang chạy." msgstr "Một lệnh khác đang chạy."
@@ -32215,21 +31796,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr ""
msgid "Create new project"
msgstr ""
msgid "Recently opened"
msgstr ""
msgid "Open Containing Folder"
msgstr ""
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "Tiến" msgstr "Tiến"
@@ -32398,30 +31964,6 @@ msgstr "Plugin \"%s\" đang yêu cầu quyền cho sự kiện audit Python \"%s
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "Yêu cầu quyền của plugin" msgstr "Yêu cầu quyền của plugin"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "Giao diện cấu hình của plugin trống. Đang hiển thị trình chỉnh sửa mặc định." msgstr "Giao diện cấu hình của plugin trống. Đang hiển thị trình chỉnh sửa mặc định."
@@ -33236,6 +32778,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "Vẽ một biên dạng khép kín để bật" #~ msgstr "Vẽ một biên dạng khép kín để bật"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "Xóa tất cả"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "Kết quả rỗng" #~ msgstr "Kết quả rỗng"
File diff suppressed because it is too large Load Diff
+26 -481
View File
@@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-11 16:21+0800\n" "POT-Creation-Date: 2026-10-11 08:37+0800\n"
"PO-Revision-Date: 2025-11-28 13:48-0600\n" "PO-Revision-Date: 2025-11-28 13:48-0600\n"
"Last-Translator: tntchn <15895303+tntchn@users.noreply.github.com>\n" "Last-Translator: tntchn <15895303+tntchn@users.noreply.github.com>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -4354,10 +4354,9 @@ msgstr "校正完成。如下圖中的範例,請在您的熱床上找到最均
msgid "Save" msgid "Save"
msgstr "儲存" msgstr "儲存"
# AI Translated
msgctxt "Navigation" msgctxt "Navigation"
msgid "Back" msgid "Back"
msgstr "返回" msgstr "背面"
msgid "Example" msgid "Example"
msgstr "範例" msgstr "範例"
@@ -12768,120 +12767,6 @@ msgstr "登入失敗。請再試一次。"
msgid "parse json failed" msgid "parse json failed"
msgstr "解析 json 失敗" msgstr "解析 json 失敗"
msgid "Loading…"
msgstr ""
msgid "Welcome to Orca Slicer"
msgstr "歡迎使用 Orca Slicer"
# AI Translated
msgid "Orca Slicer will be set up in several steps. Let's start!"
msgstr "Orca Slicer 將透過幾個步驟完成設定。讓我們開始吧!"
msgid "Get Started"
msgstr "開始"
msgid "Please select your login region"
msgstr "請選擇登入區域"
msgid "Finish"
msgstr "完成"
msgid "Printer Selection"
msgstr "選擇列印裝置"
msgid "Vendors"
msgstr ""
# AI Translated
msgid "Custom Printer"
msgstr "自訂列印裝置"
msgid "Create"
msgstr "建立"
msgid "Check for new printers"
msgstr ""
msgid "At least one printer must be selected."
msgstr "至少需要選擇一款列印裝置。"
msgid "New printers found"
msgstr ""
#, c-format, boost-format
msgid "New printer vendors installed: %s"
msgstr ""
msgid "New printer vendors were found, but installation was cancelled."
msgstr ""
msgid "No new printers found."
msgstr ""
msgid "Filament Selection"
msgstr "選擇線材"
msgid "System Filaments"
msgstr ""
msgid "Custom Filaments"
msgstr ""
msgid "Create New"
msgstr ""
msgid "Filament type"
msgstr "線材類型"
msgid "Vendor"
msgstr "廠牌"
msgid "No items"
msgstr ""
msgid "Filter items"
msgstr ""
msgid "Checked"
msgstr ""
msgid "Unchecked"
msgstr ""
msgid "Select filtered"
msgstr ""
msgid "Clear all"
msgstr "清空"
msgid "At least one filament must be selected."
msgstr "至少要選擇一款線材。"
msgid "Do you want to use the default filament?"
msgstr "你希望使用預設的線材列表嗎?"
msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option."
msgstr "這會停用所有雲端功能,包括 Orca Cloud 設定檔同步。偏好完全離線工作的使用者可以啟用此選項。"
msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "注意:啟用無痕模式時,您的使用者設定檔將不會備份到 Orca Cloud。"
msgid "Enable Stealth Mode."
msgstr ""
msgid "Proprietary Plugins"
msgstr ""
msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers."
msgstr ""
msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk."
msgstr ""
msgid "Install Bambu Network plug-in"
msgstr "安裝 Bambu 網路外掛"
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[需要操作] " msgstr "[需要操作] "
@@ -15793,6 +15678,9 @@ msgstr "線材的價格。只用於統計資訊"
msgid "money/kg" msgid "money/kg"
msgstr "元/公斤" msgstr "元/公斤"
msgid "Vendor"
msgstr "廠牌"
msgid "Vendor of filament. For show only." msgid "Vendor of filament. For show only."
msgstr "列印線材的廠牌。僅用於展示" msgstr "列印線材的廠牌。僅用於展示"
@@ -20181,6 +20069,9 @@ msgstr "重新校正"
msgid "Calibrate" msgid "Calibrate"
msgstr "校正" msgstr "校正"
msgid "Finish"
msgstr "完成"
msgid "How can I use calibration results?" msgid "How can I use calibration results?"
msgstr "如何使用校正結果?" msgstr "如何使用校正結果?"
@@ -20725,6 +20616,9 @@ msgstr ""
msgid "Temperature calibration" msgid "Temperature calibration"
msgstr "溫度校正" msgstr "溫度校正"
msgid "Filament type"
msgstr "線材類型"
msgid "PLA" msgid "PLA"
msgstr "PLA" msgstr "PLA"
@@ -21303,6 +21197,9 @@ msgstr "例如:基本、霧面、絲光、大理石"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "線材預設" msgstr "線材預設"
msgid "Create"
msgstr "建立"
msgid "Vendor is not selected; please reselect vendor." msgid "Vendor is not selected; please reselect vendor."
msgstr "廠牌尚未選擇,請重新選擇廠牌。" msgstr "廠牌尚未選擇,請重新選擇廠牌。"
@@ -21610,9 +21507,6 @@ msgstr ""
"列印裝置及所有屬於該列印裝置的線材和處理預設設定。 \n" "列印裝置及所有屬於該列印裝置的線材和處理預設設定。 \n"
"可以與他人分享。" "可以與他人分享。"
msgid "Include custom bed texture and model"
msgstr ""
msgid "" msgid ""
"User's filament preset set.\n" "User's filament preset set.\n"
"Can be shared with others." "Can be shared with others."
@@ -22760,33 +22654,6 @@ msgstr "若啟用,上述數值會儲存為未來 STEP 匯入所使用的預設
msgid "PresetBundle" msgid "PresetBundle"
msgstr "設定檔組" msgstr "設定檔組"
msgid "Export Presets"
msgstr ""
msgid "Open folder in explorer"
msgstr ""
msgid "Delete bundle"
msgstr ""
msgid "Unsubscribe bundle"
msgstr ""
msgid "Update available"
msgstr ""
msgid "Unauthorized bundle"
msgstr ""
msgid "Open this bundle in your browser"
msgstr ""
msgid "Subscribed"
msgstr ""
msgid "Local"
msgstr ""
msgid "Bundle folder does not exist." msgid "Bundle folder does not exist."
msgstr "設定檔組資料夾不存在。" msgstr "設定檔組資料夾不存在。"
@@ -22820,12 +22687,6 @@ msgstr "取消訂閱設定檔組"
msgid "ExportPresetBundle" msgid "ExportPresetBundle"
msgstr "匯出設定檔組" msgstr "匯出設定檔組"
msgid "Export to OrcaCloud"
msgstr ""
msgid "Export to folder"
msgstr ""
msgid "Save preset bundle" msgid "Save preset bundle"
msgstr "儲存設定檔組" msgstr "儲存設定檔組"
@@ -28348,6 +28209,10 @@ msgstr "我的設定"
msgid "Custom Printer Setup" msgid "Custom Printer Setup"
msgstr "自訂列印裝置設定" msgstr "自訂列印裝置設定"
# AI Translated
msgid "Custom Printer"
msgstr "自訂列印裝置"
# AI Translated # AI Translated
msgid "Define a custom printer profile" msgid "Define a custom printer profile"
msgstr "定義自訂列印裝置設定檔" msgstr "定義自訂列印裝置設定檔"
@@ -29843,28 +29708,6 @@ msgstr "線材外掛"
msgid "Printer plugins" msgid "Printer plugins"
msgstr "列印裝置外掛" msgstr "列印裝置外掛"
msgid "This preset does not use any plugin capabilities"
msgstr ""
msgid "Capabilities used by this preset"
msgstr ""
msgid "Capability configuration (JSON)"
msgstr ""
msgid "Plugin configuration"
msgstr ""
msgid "Discard this preset's override and use the global configuration again"
msgstr ""
# AI Translated
msgid "Restore defaults"
msgstr "還原預設值"
msgid "Invalid JSON"
msgstr ""
# AI Translated # AI Translated
msgid "The configuration is not valid JSON. Your changes were not saved." msgid "The configuration is not valid JSON. Your changes were not saved."
msgstr "設定不是有效的 JSON。您的變更未儲存。" msgstr "設定不是有效的 JSON。您的變更未儲存。"
@@ -29884,6 +29727,10 @@ msgstr ""
"\n" "\n"
"這會捨棄此預設中的覆寫值,並改用全域設定。" "這會捨棄此預設中的覆寫值,並改用全域設定。"
# AI Translated
msgid "Restore defaults"
msgstr "還原預設值"
# AI Translated # AI Translated
msgid "Using global configuration. Save the preset to persist it." msgid "Using global configuration. Save the preset to persist it."
msgstr "正在使用全域設定。請儲存預設以保留此設定。" msgstr "正在使用全域設定。請儲存預設以保留此設定。"
@@ -29953,215 +29800,6 @@ msgstr "正在安裝外掛"
msgid "Installed \"%s\"." msgid "Installed \"%s\"."
msgstr "已安裝「%s」。" msgstr "已安裝「%s」。"
msgid "Search plugins"
msgstr ""
msgid "Clear search"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Match whole word"
msgstr ""
msgid "More plugin install options"
msgstr ""
msgid "Install plugin"
msgstr ""
msgid "Install local plugin"
msgstr ""
msgid "Activate"
msgstr ""
msgid "Sort by name"
msgstr ""
msgid "Sort by version"
msgstr ""
msgid "Plugin Version"
msgstr ""
msgid "Sort by source"
msgstr ""
msgid "Source"
msgstr ""
msgid "Sort by status"
msgstr ""
msgctxt "Plugin"
msgid "Status"
msgstr ""
msgid "Drag to resize; double-click to reset"
msgstr ""
msgid "Resize the plugin list"
msgstr ""
msgid "Plugin details"
msgstr ""
msgid "Plugin Info"
msgstr ""
msgid "Description"
msgstr ""
msgid "Config"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Diagnostics"
msgstr ""
msgid "Types"
msgstr ""
msgid "Installed Version"
msgstr ""
msgid "Latest Version"
msgstr ""
msgid "Update to the latest version"
msgstr ""
msgid "No description available"
msgstr ""
msgid "Select a plugin to configure its capabilities"
msgstr ""
msgid "Configurable capabilities"
msgstr ""
msgid "Discard the settings saved for this capability and restore the plugin's defaults"
msgstr ""
msgid "Plugin changelog"
msgstr ""
msgid "Date"
msgstr ""
msgid "Changes"
msgstr ""
msgid "No changelog available"
msgstr ""
msgid "No issues detected"
msgstr ""
msgid "No plugins found"
msgstr ""
#, c-format, boost-format
msgid "No plugins match \"%s\""
msgstr ""
msgid "Mine"
msgstr ""
msgid "Orphaned"
msgstr ""
msgid "Some plugin capabilities are enabled"
msgstr ""
#, c-format, boost-format
msgid "Collapse %s capabilities"
msgstr ""
#, c-format, boost-format
msgid "Expand %s capabilities"
msgstr ""
msgid "Collapse capabilities"
msgstr ""
msgid "Expand capabilities"
msgstr ""
msgid "Open this plugin in your browser"
msgstr ""
#, c-format, boost-format
msgid "Capabilities: %s"
msgstr ""
msgctxt "Plugin"
msgid "Capabilities"
msgstr ""
#, c-format, boost-format
msgid "Run \"%s\""
msgstr ""
#, c-format, boost-format
msgid "Enable %s"
msgstr ""
msgid "Unauthorized for updates"
msgstr ""
msgid "Loading the plugin…"
msgstr ""
msgid "This plugin exposes no capabilities"
msgstr ""
msgid "Activate this plugin to configure its capabilities"
msgstr ""
msgid "View on OrcaCloud <a>here</a>"
msgstr ""
msgid "Activated"
msgstr ""
msgid "Runtime error"
msgstr ""
msgid "Inactive"
msgstr ""
msgid "This plugin is active and ready to be used."
msgstr ""
msgid "This plugin is still loading."
msgstr ""
msgid "This plugin is blocked until its error is fixed."
msgstr ""
msgid "This plugin is loaded but a capability reported an error."
msgstr ""
msgid "This plugin is inactive. Activate it to install or load it."
msgstr ""
msgid "Select a plugin to view its status and details."
msgstr ""
msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."
msgstr ""
msgid "A newer plugin version is available."
msgstr ""
msgid "Cloud updates are unavailable because this plugin is unauthorized for updates."
msgstr ""
# AI Translated # AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Failed to activate \"%s\"." msgid "Failed to activate \"%s\"."
@@ -30378,54 +30016,6 @@ msgstr "重新載入外掛失敗。"
msgid "Reloaded \"%s\"." msgid "Reloaded \"%s\"."
msgstr "已重新載入「%s」。" msgstr "已重新載入「%s」。"
msgid "Printer Connection"
msgstr ""
msgid "Please set up your printer connection to view the device."
msgstr ""
msgid "No model information"
msgstr "沒有模型相關資訊"
msgid "Edit Project Info"
msgstr "編輯專案資訊"
msgid "Model Information"
msgstr ""
msgid "Accessories"
msgstr ""
msgid "Profile Information"
msgstr ""
msgid "Model name"
msgstr ""
msgid "Created by"
msgstr ""
msgid "Remixed by"
msgstr ""
msgid "Shared by"
msgstr ""
msgid "Model description"
msgstr ""
msgid "BOM"
msgstr ""
msgid "Profile name"
msgstr ""
msgid "Profile Author"
msgstr ""
msgid "Profile description"
msgstr ""
# AI Translated # AI Translated
msgid "Purge Mode Settings" msgid "Purge Mode Settings"
msgstr "清理模式設定" msgstr "清理模式設定"
@@ -30450,16 +30040,6 @@ msgstr "減少清理廢料並加快列印。可能會造成輕微混色或細小
msgid "Terminal" msgid "Terminal"
msgstr "終端機" msgstr "終端機"
msgid "python ... or uv ..."
msgstr ""
msgid "Plugin terminal ready."
msgstr ""
#, c-format, boost-format
msgid "Process exited with code: %s"
msgstr ""
# AI Translated # AI Translated
msgid "A command is already running." msgid "A command is already running."
msgstr "已有指令正在執行。" msgstr "已有指令正在執行。"
@@ -30857,21 +30437,6 @@ msgstr ""
msgid "Click an island on the canvas first, in Island mode." msgid "Click an island on the canvas first, in Island mode."
msgstr "" msgstr ""
msgid "Not signed in"
msgstr ""
msgid "Bambu Network plug-in not detected. Click <a>here</a> to install it."
msgstr "沒有發現 Bambu 網路外掛,請<a>下載</a>並安裝。"
msgid "Create new project"
msgstr "建立一個新專案"
msgid "Recently opened"
msgstr "最近開啟檔案"
msgid "Open Containing Folder"
msgstr "開啟所在的資料夾"
# AI Translated # AI Translated
msgid "Forward" msgid "Forward"
msgstr "前進" msgstr "前進"
@@ -31040,30 +30605,6 @@ msgstr "外掛「%s」正在請求 Python 稽核事件「%s」的權限。"
msgid "Plugin permission request" msgid "Plugin permission request"
msgstr "外掛權限請求" msgstr "外掛權限請求"
msgid "Printer connection"
msgstr ""
msgid "Pages"
msgstr ""
msgid "Analysis"
msgstr ""
msgid "Importer"
msgstr ""
msgid "Exporter"
msgstr ""
msgid "Visualization"
msgstr ""
msgid "Script"
msgstr ""
msgid "Slicing Pipeline"
msgstr ""
# AI Translated # AI Translated
msgid "The plugin's configuration UI was empty. Showing the default editor." msgid "The plugin's configuration UI was empty. Showing the default editor."
msgstr "外掛的設定介面為空。將顯示預設編輯器。" msgstr "外掛的設定介面為空。將顯示預設編輯器。"
@@ -31889,6 +31430,10 @@ msgstr ""
#~ msgid "Draw a closed profile to enable" #~ msgid "Draw a closed profile to enable"
#~ msgstr "請繪製封閉輪廓以啟用" #~ msgstr "請繪製封閉輪廓以啟用"
# AI Translated
#~ msgid "Clear all"
#~ msgstr "全部清除"
# AI Translated # AI Translated
#~ msgid "Empty result" #~ msgid "Empty result"
#~ msgstr "結果為空" #~ msgstr "結果為空"
File diff suppressed because it is too large Load Diff
@@ -10,7 +10,7 @@
<link rel="stylesheet" type="text/css" href="../css/theme.css" /> <link rel="stylesheet" type="text/css" href="../css/theme.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script> <script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script> <script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script> <script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script> <script type="text/javascript" src="../js/common.js"></script>
<script src="./index.js"></script> <script src="./index.js"></script>
@@ -23,14 +23,14 @@
<div class="cbr-column-title-container"> <div class="cbr-column-title-container">
<div class="search-icon"></div> <div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="1"/> <input type="text" class="cbr-search-bar" placeholder=" " tabindex="1"/>
<span class="cbr-search-placeholder" data-i18n="printer">Printer</span> <span class="cbr-search-placeholder trans" tid="t15">printer</span>
<div class="clear-icon"></div> <div class="clear-icon"></div>
</div> </div>
<div class="cbr-content thin-scroll" id="MachineList"> <div class="cbr-content thin-scroll" id="MachineList">
<div class="CValues"> <div class="CValues">
<label><input type="checkbox" mode="all" onClick="ChooseAllMachine()" /><span data-i18n="all">All</span></label> <label><input type="checkbox" mode="all" onClick="ChooseAllMachine()" /><span class="trans" tid="t11">all</span></label>
</div> </div>
<div class="cbr-no-items" data-i18n="no_items">No items</div> <div class="cbr-no-items">No items</div>
</div> </div>
</div> </div>
@@ -38,14 +38,14 @@
<div class="cbr-column-title-container"> <div class="cbr-column-title-container">
<div class="search-icon"></div> <div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="2"/> <input type="text" class="cbr-search-bar" placeholder=" " tabindex="2"/>
<span class="cbr-search-placeholder" data-i18n="filament">Filament</span> <span class="cbr-search-placeholder trans" tid="t16">filament</span>
<div class="clear-icon"></div> <div class="clear-icon"></div>
</div> </div>
<div class="cbr-content thin-scroll" id="FilatypeList"> <div class="cbr-content thin-scroll" id="FilatypeList">
<div class="CValues"> <div class="CValues">
<label><input type="checkbox" onClick="ChooseAllFilament()" /><span data-i18n="all">All</span></label> <label><input type="checkbox" class="trans" tid="t11" onClick="ChooseAllFilament()" /><span class="trans" tid="t11">all</span></label>
</div> </div>
<div class="cbr-no-items" data-i18n="no_items">No items</div> <div class="cbr-no-items">No items</div>
</div> </div>
</div> </div>
@@ -53,22 +53,22 @@
<div class="cbr-column-title-container"> <div class="cbr-column-title-container">
<div class="search-icon"></div> <div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="3"/> <input type="text" class="cbr-search-bar" placeholder=" " tabindex="3"/>
<span class="cbr-search-placeholder" data-i18n="process">Process</span> <span class="cbr-search-placeholder trans" tid="t17">presets</span>
<div class="clear-icon"></div> <div class="clear-icon"></div>
</div> </div>
<div class="cbr-content thin-scroll" id="PresetList"> <div class="cbr-content thin-scroll" id="PresetList">
<div class="CValues"> <div class="CValues">
<label><input type="checkbox" onClick="ChooseAllPreset()" /><span data-i18n="all">All</span></label> <label><input type="checkbox" class="trans" tid="t11" onClick="ChooseAllPreset()" /><span class="trans" tid="t11">all</span></label>
</div> </div>
<div class="cbr-no-items" data-i18n="no_items">No items</div> <div class="cbr-no-items">No items</div>
</div> </div>
</div> </div>
</div> </div>
<div id="AcceptArea"> <div id="AcceptArea">
<div id="export_cloud_btn" class="ButtonStyleConfirm ButtonTypeChoice" data-i18n="export_cloud">Export to OrcaCloud</div> <div id="export_cloud_btn" class="ButtonStyleConfirm ButtonTypeChoice">Export to OrcaCloud</div>
<div id="export_local_btn" class="ButtonStyleRegular ButtonTypeChoice" data-i18n="export_folder">Export to folder</div> <div id="export_local_btn" class="ButtonStyleRegular ButtonTypeChoice">Export to folder</div>
<div id="close_btn" class="ButtonStyleRegular ButtonTypeChoice" data-i18n="close">Close</div> <div id="close_btn" class="ButtonStyleRegular ButtonTypeChoice">Close</div>
</div> </div>
</body> </body>
@@ -12,7 +12,8 @@ var g_search = {
function OnInit() function OnInit()
{ {
TranslatePage(); if (typeof TranslatePage === "function")
TranslatePage();
InstallInputSafeKeydown(); InstallInputSafeKeydown();
BindSearchInputs(); BindSearchInputs();
@@ -16,31 +16,29 @@
<h1 id="pagePresetName" class="page-title"></h1> <h1 id="pagePresetName" class="page-title"></h1>
</header> </header>
<div id="configEmpty" class="detail-empty" data-i18n="no_capabilities">This preset does not use any plugin capabilities</div> <div id="configEmpty" class="detail-empty">This preset does not use any plugin capabilities</div>
<div id="configLayout" class="config-layout" hidden> <div id="configLayout" class="config-layout" hidden>
<div id="configSidebar" class="config-sidebar thin-scroll" role="listbox" <div id="configSidebar" class="config-sidebar thin-scroll" role="listbox"
aria-label="Capabilities used by this preset" data-i18n-aria-label="capabilities_label"></div> aria-label="Capabilities used by this preset"></div>
<div class="config-view"> <div class="config-view">
<div id="configError" class="config-error" role="status" aria-live="polite" hidden></div> <div id="configError" class="config-error" role="status" aria-live="polite" hidden></div>
<div id="configEditor" class="config-editor" hidden> <div id="configEditor" class="config-editor" hidden>
<textarea id="configText" class="config-textarea thin-scroll" spellcheck="false" <textarea id="configText" class="config-textarea thin-scroll" spellcheck="false"
autocomplete="off" autocapitalize="off" aria-label="Capability configuration (JSON)" autocomplete="off" autocapitalize="off" aria-label="Capability configuration (JSON)"></textarea>
data-i18n-aria-label="config_json_label"></textarea>
</div> </div>
<!-- Custom capability UI. Sandboxed without allow-same-origin, so the plugin's HTML runs in <!-- Custom capability UI. Sandboxed without allow-same-origin, so the plugin's HTML runs in
an opaque origin and reaches the host only through the injected window.orca bridge. --> an opaque origin and reaches the host only through the injected window.orca bridge. -->
<iframe id="configCustom" class="config-custom" title="Plugin configuration" data-i18n-title="config_frame_title" <iframe id="configCustom" class="config-custom" title="Plugin configuration"
sandbox="allow-scripts" referrerpolicy="no-referrer" hidden></iframe> sandbox="allow-scripts" referrerpolicy="no-referrer" hidden></iframe>
<div id="configFooter" class="config-view-footer" hidden> <div id="configFooter" class="config-view-footer" hidden>
<span id="configValidation" class="config-validation" role="status" aria-live="polite"></span> <span id="configValidation" class="config-validation" role="status" aria-live="polite"></span>
<div class="config-actions"> <div class="config-actions">
<button id="configRestoreBtn" class="ButtonStyleRegular ButtonTypeChoice" type="button" <button id="configRestoreBtn" class="ButtonStyleRegular ButtonTypeChoice" type="button"
title="Discard this preset's override and use the global configuration again" title="Discard this preset's override and use the global configuration again">
data-i18n-title="restore_title" data-i18n="restore_defaults">
Restore defaults Restore defaults
</button> </button>
<button id="configSaveBtn" class="ButtonStyleConfirm ButtonTypeChoice" type="button" data-i18n="save">Save</button> <button id="configSaveBtn" class="ButtonStyleConfirm ButtonTypeChoice" type="button">Save</button>
</div> </div>
</div> </div>
</div> </div>
@@ -50,7 +48,6 @@
<span id="statusText" class="status-text"></span> <span id="statusText" class="status-text"></span>
</footer> </footer>
</main> </main>
<script src="../../include/i18n.js"></script>
<script src="../js/plugin-config-ui.js"></script> <script src="../js/plugin-config-ui.js"></script>
<script src="index.js"></script> <script src="index.js"></script>
</body> </body>
@@ -304,7 +304,7 @@ function ValidateConfigText() {
SetConfigValidation(""); SetConfigValidation("");
return true; return true;
} catch (err) { } catch (err) {
SetConfigValidation(String(err?.message || T("invalid_json", "Invalid JSON"))); SetConfigValidation(String(err?.message || "Invalid JSON"));
return false; return false;
} }
} }
@@ -393,8 +393,6 @@ function OnCustomConfigMessage(event) {
} }
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
TranslatePage();
const sidebar = document.getElementById("configSidebar"); const sidebar = document.getElementById("configSidebar");
if (sidebar) if (sidebar)
sidebar.addEventListener("click", OnConfigSidebarClick); sidebar.addEventListener("click", OnConfigSidebarClick);
+42 -49
View File
@@ -12,7 +12,7 @@
<link rel="stylesheet" type="text/css" href="../css/theme.css" /> <link rel="stylesheet" type="text/css" href="../css/theme.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script> <script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script> <script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script> <script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script> <script type="text/javascript" src="../js/common.js"></script>
<script src="../js/plugin-config-ui.js"></script> <script src="../js/plugin-config-ui.js"></script>
@@ -32,10 +32,8 @@
</svg> </svg>
</span> </span>
<input id="plugin_search_input" class="plugin-search-input" type="text" <input id="plugin_search_input" class="plugin-search-input" type="text"
placeholder="Search plugins" autocomplete="off" spellcheck="false" aria-label="Search plugins" placeholder="Search plugins" autocomplete="off" spellcheck="false" aria-label="Search plugins" />
data-i18n-placeholder="search_plugins" data-i18n-aria-label="search_plugins" /> <button id="plugin_search_clear" class="plugin-search-clear" type="button" title="Clear" aria-label="Clear search">
<button id="plugin_search_clear" class="plugin-search-clear" type="button" title="Clear" aria-label="Clear search"
data-i18n-title="clear" data-i18n-aria-label="clear_search">
<svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" <svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor"
stroke-width="1.6" stroke-linecap="round" aria-hidden="true"> stroke-width="1.6" stroke-linecap="round" aria-hidden="true">
<line x1="5" y1="5" x2="11" y2="11" /> <line x1="5" y1="5" x2="11" y2="11" />
@@ -43,28 +41,27 @@
</svg> </svg>
</button> </button>
<button id="plugin_search_cc" class="plugin-search-toggle" type="button" <button id="plugin_search_cc" class="plugin-search-toggle" type="button"
aria-pressed="false" title="Match case" data-i18n-title="match_case">Aa</button> aria-pressed="false" title="Match case">Aa</button>
<button id="plugin_search_w" class="plugin-search-toggle" type="button" <button id="plugin_search_w" class="plugin-search-toggle" type="button"
aria-pressed="false" title="Match whole word" data-i18n-title="match_whole_word"><span class="plugin-search-underline">ab</span></button> aria-pressed="false" title="Match whole word"><span class="plugin-search-underline">ab</span></button>
</div> </div>
<!-- <button id="open_terminal" class="ButtonStyleRegular ButtonTypeChoice left-btn">--> <!-- <button id="open_terminal" class="ButtonStyleRegular ButtonTypeChoice left-btn">-->
<!-- Open Terminal--> <!-- Open Terminal-->
<!-- </button>--> <!-- </button>-->
<button id="refresh_btn" class="ButtonStyleRegular ButtonTypeChoice" data-i18n="refresh"> <button id="refresh_btn" class="ButtonStyleRegular ButtonTypeChoice">
Refresh Refresh
</button> </button>
<div id="exploreDropdown" class="explore-dropdown"> <div id="exploreDropdown" class="explore-dropdown">
<button id="explore_menu_btn" class="ButtonStyleConfirm ButtonTypeChoice explore-menu-btn" type="button" <button id="explore_menu_btn" class="ButtonStyleConfirm ButtonTypeChoice explore-menu-btn" type="button"
aria-haspopup="true" aria-expanded="false" aria-controls="exploreMenu" title="More plugin install options" aria-haspopup="true" aria-expanded="false" aria-controls="exploreMenu" title="More plugin install options">
data-i18n-title="install_options">
<span class="explore-menu-icon" aria-hidden="true"></span> <span class="explore-menu-icon" aria-hidden="true"></span>
</button> </button>
<button id="explore_btn" class="ButtonStyleConfirm ButtonTypeChoice explore-main-btn" type="button"> <button id="explore_btn" class="ButtonStyleConfirm ButtonTypeChoice explore-main-btn" type="button">
Install plugin Install plugin
</button> </button>
<div id="exploreMenu" class="explore-menu" role="menu" hidden> <div id="exploreMenu" class="explore-menu" role="menu" hidden>
<button type="button" class="explore-menu-item" role="menuitem" data-install-action="explore" data-i18n="install_plugin">Install plugin</button> <button type="button" class="explore-menu-item" role="menuitem" data-install-action="explore">Install plugin</button>
<button type="button" class="explore-menu-item" role="menuitem" data-install-action="install-local" data-i18n="install_local_plugin">Install local plugin</button> <button type="button" class="explore-menu-item" role="menuitem" data-install-action="install-local">Install local plugin</button>
</div> </div>
</div> </div>
</div> </div>
@@ -72,15 +69,15 @@
<main class="content"> <main class="content">
<section class="pane plugin-list-pane"> <section class="pane plugin-list-pane">
<div class="hdr plugin-cols"> <div class="hdr plugin-cols">
<span data-i18n="activate">Activate</span> <span>Activate</span>
<span class="sort-th" data-sort-field="name" role="button" tabindex="0" <span class="sort-th" data-sort-field="name" role="button" tabindex="0"
title="Sort by name" data-i18n-title="sort_by_name" data-i18n="name">Name<span class="sort-tri" aria-hidden="true"></span></span> title="Sort by name">Name<span class="sort-tri" aria-hidden="true"></span></span>
<span class="sort-th" data-sort-field="version" role="button" tabindex="0" <span class="sort-th" data-sort-field="version" role="button" tabindex="0"
title="Sort by version" data-i18n-title="sort_by_version" data-i18n="plugin_version">Plugin Version<span class="sort-tri" aria-hidden="true"></span></span> title="Sort by version">Plugin Version<span class="sort-tri" aria-hidden="true"></span></span>
<span class="sort-th" data-sort-field="source" role="button" tabindex="0" <span class="sort-th" data-sort-field="source" role="button" tabindex="0"
title="Sort by source" data-i18n-title="sort_by_source" data-i18n="source">Source<span class="sort-tri" aria-hidden="true"></span></span> title="Sort by source">Source<span class="sort-tri" aria-hidden="true"></span></span>
<span class="sort-th" data-sort-field="status" role="button" tabindex="0" <span class="sort-th" data-sort-field="status" role="button" tabindex="0"
title="Sort by status" data-i18n-title="sort_by_status" data-i18n="status">Status<span class="sort-tri" aria-hidden="true"></span></span> title="Sort by status">Status<span class="sort-tri" aria-hidden="true"></span></span>
</div> </div>
<div id="pluginList" class="body thin-scroll"></div> <div id="pluginList" class="body thin-scroll"></div>
</section> </section>
@@ -88,21 +85,20 @@
<!-- Drag to redistribute the dialog's height between the list and the details pane; the hit <!-- Drag to redistribute the dialog's height between the list and the details pane; the hit
area is the whole strip, the visible divider is the line drawn inside it. --> area is the whole strip, the visible divider is the line drawn inside it. -->
<div id="paneSplitter" class="pane-splitter" role="separator" aria-orientation="horizontal" <div id="paneSplitter" class="pane-splitter" role="separator" aria-orientation="horizontal"
aria-label="Resize the plugin list" title="Drag to resize; double-click to reset" aria-label="Resize the plugin list" title="Drag to resize; double-click to reset"></div>
data-i18n-aria-label="resize_list" data-i18n-title="resize_hint"></div>
<section class="pane details-pane"> <section class="pane details-pane">
<div class="detail-tabs" role="tablist" aria-label="Plugin details" data-i18n-aria-label="details_label"> <div class="detail-tabs" role="tablist" aria-label="Plugin details">
<button id="pluginInfoTab" class="detail-tab active" type="button" role="tab" <button id="pluginInfoTab" class="detail-tab active" type="button" role="tab"
aria-selected="true" aria-controls="pluginInfoPanel" data-tab="plugin-info" data-i18n="tab_info">Plugin Info</button> aria-selected="true" aria-controls="pluginInfoPanel" data-tab="plugin-info">Plugin Info</button>
<button id="descriptionTab" class="detail-tab" type="button" role="tab" tabindex="-1" <button id="descriptionTab" class="detail-tab" type="button" role="tab" tabindex="-1"
aria-selected="false" aria-controls="descriptionPanel" data-tab="description" data-i18n="description">Description</button> aria-selected="false" aria-controls="descriptionPanel" data-tab="description">Description</button>
<button id="configTab" class="detail-tab" type="button" role="tab" tabindex="-1" <button id="configTab" class="detail-tab" type="button" role="tab" tabindex="-1"
aria-selected="false" aria-controls="configPanel" data-tab="config" data-i18n="tab_config">Config</button> aria-selected="false" aria-controls="configPanel" data-tab="config">Config</button>
<button id="changelogTab" class="detail-tab" type="button" role="tab" tabindex="-1" <button id="changelogTab" class="detail-tab" type="button" role="tab" tabindex="-1"
aria-selected="false" aria-controls="changelogPanel" data-tab="changelog" data-i18n="tab_changelog">Changelog</button> aria-selected="false" aria-controls="changelogPanel" data-tab="changelog">Changelog</button>
<button id="diagnosticsTab" class="detail-tab" type="button" role="tab" tabindex="-1" <button id="diagnosticsTab" class="detail-tab" type="button" role="tab" tabindex="-1"
aria-selected="false" aria-controls="diagnosticsPanel" data-tab="diagnostics" data-i18n="tab_diagnostics">Diagnostics</button> aria-selected="false" aria-controls="diagnosticsPanel" data-tab="diagnostics">Diagnostics</button>
</div> </div>
<div class="detail-tab-panels"> <div class="detail-tab-panels">
@@ -114,32 +110,31 @@
</div> </div>
<div class="detail-fields"> <div class="detail-fields">
<div class="detail-field-row"> <div class="detail-field-row">
<div class="detail-label" data-i18n="source">Source</div> <div class="detail-label">Source</div>
<div id="detailSource" class="detail-value">-</div> <div id="detailSource" class="detail-value">-</div>
</div> </div>
<div class="detail-field-row"> <div class="detail-field-row">
<div class="detail-label" data-i18n="types">Types</div> <div class="detail-label">Types</div>
<div id="detailTypes" class="detail-value">-</div> <div id="detailTypes" class="detail-value">-</div>
</div> </div>
<div class="detail-field-row"> <div class="detail-field-row">
<div class="detail-label" data-i18n="author">Author</div> <div class="detail-label">Author</div>
<div id="detailAuthor" class="detail-value">-</div> <div id="detailAuthor" class="detail-value">-</div>
</div> </div>
<div class="detail-field-row"> <div class="detail-field-row">
<div class="detail-label" data-i18n="installed_version">Installed Version</div> <div class="detail-label">Installed Version</div>
<div class="detail-value"> <div class="detail-value">
<span id="detailInstalledVersion">-</span> <span id="detailInstalledVersion">-</span>
</div> </div>
</div> </div>
<div class="detail-field-row"> <div class="detail-field-row">
<div class="detail-label" data-i18n="latest_version">Latest Version</div> <div class="detail-label">Latest Version</div>
<div class="detail-value detail-version-row"> <div class="detail-value detail-version-row">
<span id="detailLatestVersion">-</span> <span id="detailLatestVersion">-</span>
<span id="detailUpdateBadge" class="version-update-badge" hidden <span id="detailUpdateBadge" class="version-update-badge" hidden
aria-label="Update available" title="Update available" aria-label="Update available" title="Update available"></span>
data-i18n-aria-label="update_available" data-i18n-title="update_available"></span>
<button id="detailUpdateBtn" type="button" class="plugin-update-btn" hidden <button id="detailUpdateBtn" type="button" class="plugin-update-btn" hidden
title="Update to the latest version" data-i18n-title="update_title" data-i18n="update">Update</button> title="Update to the latest version">Update</button>
</div> </div>
</div> </div>
</div> </div>
@@ -148,27 +143,26 @@
<section id="descriptionPanel" class="detail-tab-panel thin-scroll" role="tabpanel" tabindex="0" <section id="descriptionPanel" class="detail-tab-panel thin-scroll" role="tabpanel" tabindex="0"
aria-labelledby="descriptionTab" data-panel="description" hidden> aria-labelledby="descriptionTab" data-panel="description" hidden>
<h2 class="detail-section-title" data-i18n="description">Description</h2> <h2 class="detail-section-title">Description</h2>
<div id="detailDescription" class="detail-description" data-i18n="no_description">No description available</div> <div id="detailDescription" class="detail-description">No description available</div>
</section> </section>
<section id="configPanel" class="detail-tab-panel" role="tabpanel" tabindex="0" <section id="configPanel" class="detail-tab-panel" role="tabpanel" tabindex="0"
aria-labelledby="configTab" data-panel="config" hidden> aria-labelledby="configTab" data-panel="config" hidden>
<div id="configEmpty" class="detail-empty" data-i18n="config_select_plugin">Select a plugin to configure its capabilities</div> <div id="configEmpty" class="detail-empty">Select a plugin to configure its capabilities</div>
<div id="configLayout" class="config-layout" hidden> <div id="configLayout" class="config-layout" hidden>
<div id="configSidebar" class="config-sidebar thin-scroll" role="listbox" <div id="configSidebar" class="config-sidebar thin-scroll" role="listbox"
aria-label="Configurable capabilities" data-i18n-aria-label="configurable_capabilities"></div> aria-label="Configurable capabilities"></div>
<div class="config-view"> <div class="config-view">
<div id="configError" class="config-error" role="status" aria-live="polite" hidden></div> <div id="configError" class="config-error" role="status" aria-live="polite" hidden></div>
<div id="configEditor" class="config-editor" hidden> <div id="configEditor" class="config-editor" hidden>
<textarea id="configText" class="config-textarea thin-scroll" spellcheck="false" <textarea id="configText" class="config-textarea thin-scroll" spellcheck="false"
autocomplete="off" autocapitalize="off" aria-label="Capability configuration (JSON)" autocomplete="off" autocapitalize="off" aria-label="Capability configuration (JSON)"></textarea>
data-i18n-aria-label="config_json_label"></textarea>
</div> </div>
<!-- Custom capability UI. Sandboxed without allow-same-origin, so the plugin's HTML <!-- Custom capability UI. Sandboxed without allow-same-origin, so the plugin's HTML
runs in an opaque origin and reaches the host only through the injected runs in an opaque origin and reaches the host only through the injected
window.orca bridge. --> window.orca bridge. -->
<iframe id="configCustom" class="config-custom" title="Plugin configuration" data-i18n-title="config_frame_title" <iframe id="configCustom" class="config-custom" title="Plugin configuration"
sandbox="allow-scripts" referrerpolicy="no-referrer" hidden></iframe> sandbox="allow-scripts" referrerpolicy="no-referrer" hidden></iframe>
<!-- JSON-editor chrome only: a custom UI renders its own save/restore controls and <!-- JSON-editor chrome only: a custom UI renders its own save/restore controls and
drives them through the window.orca bridge. --> drives them through the window.orca bridge. -->
@@ -176,11 +170,10 @@
<span id="configValidation" class="config-validation" role="status" aria-live="polite"></span> <span id="configValidation" class="config-validation" role="status" aria-live="polite"></span>
<div class="config-actions"> <div class="config-actions">
<button id="configRestoreBtn" class="ButtonStyleRegular ButtonTypeChoice" type="button" <button id="configRestoreBtn" class="ButtonStyleRegular ButtonTypeChoice" type="button"
title="Discard the settings saved for this capability and restore the plugin's defaults" title="Discard the settings saved for this capability and restore the plugin's defaults">
data-i18n-title="restore_title" data-i18n="restore_defaults">
Restore defaults Restore defaults
</button> </button>
<button id="configSaveBtn" class="ButtonStyleConfirm ButtonTypeChoice" type="button" data-i18n="save">Save</button> <button id="configSaveBtn" class="ButtonStyleConfirm ButtonTypeChoice" type="button">Save</button>
</div> </div>
</div> </div>
</div> </div>
@@ -189,22 +182,22 @@
<section id="changelogPanel" class="detail-tab-panel thin-scroll" role="tabpanel" tabindex="0" <section id="changelogPanel" class="detail-tab-panel thin-scroll" role="tabpanel" tabindex="0"
aria-labelledby="changelogTab" data-panel="changelog" hidden> aria-labelledby="changelogTab" data-panel="changelog" hidden>
<table id="changelogTable" class="detail-table changelog-table" aria-label="Plugin changelog" data-i18n-aria-label="changelog_label"> <table id="changelogTable" class="detail-table changelog-table" aria-label="Plugin changelog">
<thead> <thead>
<tr> <tr>
<th scope="col" data-i18n="version">Version</th> <th scope="col">Version</th>
<th scope="col" data-i18n="date">Date</th> <th scope="col">Date</th>
<th scope="col" data-i18n="changes">Changes</th> <th scope="col">Changes</th>
</tr> </tr>
</thead> </thead>
<tbody id="changelogBody"></tbody> <tbody id="changelogBody"></tbody>
</table> </table>
<div id="changelogEmpty" class="detail-empty" data-i18n="no_changelog" hidden>No changelog available</div> <div id="changelogEmpty" class="detail-empty" hidden>No changelog available</div>
</section> </section>
<section id="diagnosticsPanel" class="detail-tab-panel thin-scroll" role="tabpanel" tabindex="0" <section id="diagnosticsPanel" class="detail-tab-panel thin-scroll" role="tabpanel" tabindex="0"
aria-labelledby="diagnosticsTab" data-panel="diagnostics" hidden> aria-labelledby="diagnosticsTab" data-panel="diagnostics" hidden>
<div id="detailStatusBody" class="detail-status-body" data-i18n="no_issues">No issues detected</div> <div id="detailStatusBody" class="detail-status-body">No issues detected</div>
</section> </section>
</div> </div>
</section> </section>
+49 -67
View File
@@ -1,11 +1,11 @@
const pluginsById = new Map(); const pluginsById = new Map();
const pluginInstallActions = { const pluginInstallActions = {
"explore": { "explore": {
label: T("install_plugin", "Install plugin"), label: "Install plugin",
command: "open_plugin_hub" command: "open_plugin_hub"
}, },
"install-local": { "install-local": {
label: T("install_local_plugin", "Install local plugin"), label: "Install local plugin",
command: "install_local_plugin" command: "install_local_plugin"
} }
}; };
@@ -47,7 +47,8 @@ function OnInit() {
exploreMenu = document.getElementById("exploreMenu"); exploreMenu = document.getElementById("exploreMenu");
exploreMenuButton = document.getElementById("explore_menu_btn"); exploreMenuButton = document.getElementById("explore_menu_btn");
TranslatePage(); if (typeof TranslatePage === "function")
TranslatePage();
document.getElementById("refresh_btn")?.addEventListener("click", () => SendMessage("refresh_plugins")); document.getElementById("refresh_btn")?.addEventListener("click", () => SendMessage("refresh_plugins"));
document.getElementById("explore_btn")?.addEventListener("click", () => { document.getElementById("explore_btn")?.addEventListener("click", () => {
@@ -448,7 +449,7 @@ function RenderPlugins() {
if (pluginsById.size === 0) { if (pluginsById.size === 0) {
const empty = document.createElement("div"); const empty = document.createElement("div");
empty.className = "empty-state"; empty.className = "empty-state";
empty.textContent = T("no_plugins", "No plugins found"); empty.textContent = "No plugins found";
pluginList.appendChild(empty); pluginList.appendChild(empty);
SyncPluginListHeaderGutter(); SyncPluginListHeaderGutter();
return; return;
@@ -503,9 +504,11 @@ function RenderPlugins() {
if (searching && shown === 0) { if (searching && shown === 0) {
const empty = document.createElement("div"); const empty = document.createElement("div");
empty.className = "empty-state"; empty.className = "empty-state";
empty.appendChild(document.createTextNode('No plugins match "'));
const term = document.createElement("b"); const term = document.createElement("b");
term.textContent = pluginSearch.query; term.textContent = pluginSearch.query;
AppendTemplate(empty, T("no_match", 'No plugins match "%s"'), term); empty.appendChild(term);
empty.appendChild(document.createTextNode('"'));
pluginList.appendChild(empty); pluginList.appendChild(empty);
} }
@@ -596,13 +599,13 @@ function IsPluginLoading(plugin) {
function SourceLabel(source) { function SourceLabel(source) {
switch (String(source || "").toLowerCase()) { switch (String(source || "").toLowerCase()) {
case "mine": case "mine":
return T("source_mine", "Mine"); return "Mine";
case "subscribed": case "subscribed":
return T("source_subscribed", "Subscribed"); return "Subscribed";
case "orphaned": case "orphaned":
return T("source_orphaned", "Orphaned"); return "Orphaned";
default: default:
return T("source_local", "Local"); return "Local";
} }
} }
@@ -638,7 +641,7 @@ function CheckCell(row, plugin) {
checkbox.dataset.pluginKey = row.dataset.pluginKey; checkbox.dataset.pluginKey = row.dataset.pluginKey;
if (checkbox.indeterminate) { if (checkbox.indeterminate) {
checkbox.setAttribute("aria-checked", "mixed"); checkbox.setAttribute("aria-checked", "mixed");
checkbox.setAttribute("aria-label", T("mixed_capabilities", "Some plugin capabilities are enabled")); checkbox.setAttribute("aria-label", "Some plugin capabilities are enabled");
} }
const checkboxMark = document.createElement("span"); const checkboxMark = document.createElement("span");
checkboxMark.className = "plugin-checkbox-mark"; checkboxMark.className = "plugin-checkbox-mark";
@@ -661,14 +664,9 @@ function LabelCell(plugin, isExpanded = false, capabilityCount = 0, nameRanges =
const expandButton = document.createElement("button"); const expandButton = document.createElement("button");
expandButton.type = "button"; expandButton.type = "button";
expandButton.className = "plugin-expand-btn"; expandButton.className = "plugin-expand-btn";
const labelName = pluginLabelText || "plugin"; expandButton.setAttribute("aria-label", `${isExpanded ? "Collapse" : "Expand"} ${pluginLabelText || "plugin"} capabilities`);
expandButton.setAttribute("aria-label", isExpanded
? T("collapse_named", "Collapse %s capabilities", labelName)
: T("expand_named", "Expand %s capabilities", labelName));
expandButton.setAttribute("aria-expanded", isExpanded ? "true" : "false"); expandButton.setAttribute("aria-expanded", isExpanded ? "true" : "false");
expandButton.title = isExpanded expandButton.title = isExpanded ? "Collapse capabilities" : "Expand capabilities";
? T("collapse", "Collapse capabilities")
: T("expand", "Expand capabilities");
const icon = document.createElement("span"); const icon = document.createElement("span");
icon.className = "plugin-expand-icon"; icon.className = "plugin-expand-icon";
expandButton.appendChild(icon); expandButton.appendChild(icon);
@@ -690,7 +688,7 @@ function LabelCell(plugin, isExpanded = false, capabilityCount = 0, nameRanges =
if (hasCloudLink) { if (hasCloudLink) {
labelElement.href = "#"; labelElement.href = "#";
labelElement.classList.add("plugin-cloud-link"); labelElement.classList.add("plugin-cloud-link");
labelElement.title = T("open_in_browser", "Open this plugin in your browser"); labelElement.title = "Open this plugin in your browser";
} }
nameWrap.appendChild(labelElement); nameWrap.appendChild(labelElement);
@@ -698,7 +696,7 @@ function LabelCell(plugin, isExpanded = false, capabilityCount = 0, nameRanges =
const countBadge = document.createElement("span"); const countBadge = document.createElement("span");
countBadge.className = "plugin-capability-count"; countBadge.className = "plugin-capability-count";
countBadge.textContent = String(capabilityCount); countBadge.textContent = String(capabilityCount);
countBadge.title = T("capability_count", "Capabilities: %s", capabilityCount); countBadge.title = `${capabilityCount} capabilities`;
nameWrap.appendChild(countBadge); nameWrap.appendChild(countBadge);
} }
labelCell.appendChild(nameWrap); labelCell.appendChild(nameWrap);
@@ -724,7 +722,7 @@ function RenderCapabilityTree(plugin, capabilities, capRanges = null) {
const tree = document.createElement("div"); const tree = document.createElement("div");
tree.className = "capabilities-tree"; tree.className = "capabilities-tree";
tree.setAttribute("role", "group"); tree.setAttribute("role", "group");
tree.setAttribute("aria-label", T("capabilities", "Capabilities")); tree.setAttribute("aria-label", "Capabilities");
capabilities.forEach((capability, index) => { capabilities.forEach((capability, index) => {
tree.appendChild(RenderCapabilityRow(plugin, capability, index === capabilities.length - 1, capRanges)); tree.appendChild(RenderCapabilityRow(plugin, capability, index === capabilities.length - 1, capRanges));
@@ -771,7 +769,7 @@ function RenderCapabilityRow(plugin, capability, isLast, capRanges = null) {
const runButton = document.createElement("button"); const runButton = document.createElement("button");
runButton.type = "button"; runButton.type = "button";
runButton.className = "capability-run-btn script-run-btn"; runButton.className = "capability-run-btn script-run-btn";
runButton.title = T("run_named", 'Run "%s"', capabilityName); runButton.title = `Run "${capabilityName}"`;
runButton.setAttribute("aria-label", runButton.title); runButton.setAttribute("aria-label", runButton.title);
const runIcon = document.createElement("span"); const runIcon = document.createElement("span");
runIcon.className = "icon16 plugin-run-icon"; runIcon.className = "icon16 plugin-run-icon";
@@ -806,7 +804,7 @@ function CapabilityCheckCell(plugin, capability) {
checkbox.dataset.capabilityToggle = "true"; checkbox.dataset.capabilityToggle = "true";
checkbox.dataset.capabilityName = capabilityName; checkbox.dataset.capabilityName = capabilityName;
checkbox.dataset.capabilityType = capabilityType; checkbox.dataset.capabilityType = capabilityType;
checkbox.setAttribute("aria-label", T("enable_named", "Enable %s", capabilityName)); checkbox.setAttribute("aria-label", `Enable ${capabilityName || "capability"}`);
const checkboxMark = document.createElement("span"); const checkboxMark = document.createElement("span");
checkboxMark.className = "plugin-checkbox-mark"; checkboxMark.className = "plugin-checkbox-mark";
checkboxLabel.appendChild(checkbox); checkboxLabel.appendChild(checkbox);
@@ -828,7 +826,7 @@ function VersionCell(plugin) {
const versionLabel = document.createElement("span"); const versionLabel = document.createElement("span");
versionLabel.className = "version-value"; versionLabel.className = "version-value";
versionLabel.textContent = GetDisplayVersion(plugin) || T("not_available", "N/A"); versionLabel.textContent = GetDisplayVersion(plugin) || "N/A";
cell.appendChild(versionLabel); cell.appendChild(versionLabel);
const updateBadge = UpdateStatusBadge(plugin); const updateBadge = UpdateStatusBadge(plugin);
@@ -847,11 +845,11 @@ function UpdateStatusBadge(plugin) {
badge.className = "version-update-badge"; badge.className = "version-update-badge";
if (updateStatus === "unauthorized") { if (updateStatus === "unauthorized") {
badge.classList.add("is-warning"); badge.classList.add("is-warning");
badge.title = T("unauthorized", "Unauthorized for updates"); badge.title = "Unauthorized for updates";
badge.setAttribute("aria-label", badge.title); badge.setAttribute("aria-label", "Unauthorized for updates");
} else { } else {
badge.title = T("update_available", "Update available"); badge.title = "Update available";
badge.setAttribute("aria-label", badge.title); badge.setAttribute("aria-label", "Update available");
} }
return badge; return badge;
@@ -864,7 +862,7 @@ function StatusCell(plugin) {
const statusLabel = document.createElement("span"); const statusLabel = document.createElement("span");
statusLabel.className = "status-label"; statusLabel.className = "status-label";
statusLabel.textContent = StatusLabel(plugin); statusLabel.textContent = GetStatus(plugin);
cell.appendChild(statusLabel); cell.appendChild(statusLabel);
return cell; return cell;
@@ -877,7 +875,7 @@ function RenderDetails() {
const detailStatusBody = document.getElementById("detailStatusBody"); const detailStatusBody = document.getElementById("detailStatusBody");
SetText("detailInstalledVersion", SetText("detailInstalledVersion",
plugin ? (IsPluginInstalled(plugin) ? (GetInstalledVersion(plugin) || "-") : T("not_installed", "Not installed")) : "-"); plugin ? (IsPluginInstalled(plugin) ? (GetInstalledVersion(plugin) || "-") : "Not installed") : "-");
SetText("detailLatestVersion", plugin ? (GetLatestVersion(plugin) || "-") : "-"); SetText("detailLatestVersion", plugin ? (GetLatestVersion(plugin) || "-") : "-");
const detailSource = document.getElementById("detailSource"); const detailSource = document.getElementById("detailSource");
if (detailSource) { if (detailSource) {
@@ -935,12 +933,12 @@ function RenderConfig(plugin) {
// Capabilities only exist once the plugin is activated: say that, rather than claiming it has // Capabilities only exist once the plugin is activated: say that, rather than claiming it has
// none to configure. // none to configure.
empty.textContent = !plugin empty.textContent = !plugin
? T("config_select_plugin", "Select a plugin to configure its capabilities") ? "Select a plugin to configure its capabilities"
: (IsPluginLoading(plugin) : (IsPluginLoading(plugin)
? T("config_loading", "Loading the plugin…") ? "Loading the plugin…"
: (GetStatus(plugin) === "Activated" : (GetStatus(plugin) === "Activated"
? T("config_no_capabilities", "This plugin exposes no capabilities") ? "This plugin exposes no capabilities"
: T("config_activate", "Activate this plugin to configure its capabilities"))); : "Activate this plugin to configure its capabilities"));
empty.hidden = false; empty.hidden = false;
layout.hidden = true; layout.hidden = true;
sidebar.replaceChildren(); sidebar.replaceChildren();
@@ -1123,7 +1121,7 @@ function ValidateConfigText() {
SetConfigValidation(""); SetConfigValidation("");
return true; return true;
} catch (err) { } catch (err) {
SetConfigValidation(String(err?.message || T("invalid_json", "Invalid JSON"))); SetConfigValidation(String(err?.message || "Invalid JSON"));
return false; return false;
} }
} }
@@ -1239,19 +1237,21 @@ function RenderDescription(plugin) {
const isCloud = plugin && (plugin.source === "mine" || plugin.source === "subscribed" || plugin.source === "orphaned"); const isCloud = plugin && (plugin.source === "mine" || plugin.source === "subscribed" || plugin.source === "orphaned");
if (isCloud && String(plugin?.sharing_token || "")) { if (isCloud && String(plugin?.sharing_token || "")) {
node.appendChild(document.createTextNode("View on OrcaCloud "));
const link = document.createElement("a"); const link = document.createElement("a");
link.href = "#"; link.href = "#";
link.className = "plugin-cloud-link"; link.className = "plugin-cloud-link";
link.title = T("open_in_browser", "Open this plugin in your browser"); link.textContent = "here";
link.title = "Open this plugin in your browser";
link.addEventListener("click", (event) => { link.addEventListener("click", (event) => {
event.preventDefault(); event.preventDefault();
sendOpenPluginOnCloud(String(plugin.plugin_key || "")); sendOpenPluginOnCloud(String(plugin.plugin_key || ""));
}); });
AppendTemplate(node, T("view_on_cloud", "View on OrcaCloud <a>here</a>"), link); node.appendChild(link);
return; return;
} }
node.textContent = T("no_description", "No description available"); node.textContent = "No description available";
} }
function RenderChangelog(plugin) { function RenderChangelog(plugin) {
@@ -1305,8 +1305,8 @@ function ApplyDetailUpdateBadge(node, plugin) {
if (updateStatus === "unauthorized") { if (updateStatus === "unauthorized") {
node.hidden = false; node.hidden = false;
node.classList.add("is-warning"); node.classList.add("is-warning");
node.title = T("unauthorized", "Unauthorized for updates"); node.title = "Unauthorized for updates";
node.setAttribute("aria-label", node.title); node.setAttribute("aria-label", "Unauthorized for updates");
return; return;
} }
@@ -1339,37 +1339,19 @@ function UpdateSelectedPlugin() {
}); });
} }
// The status arrives as an identifier, which also names the status-* CSS classes.
function StatusLabel(plugin) {
switch (GetStatus(plugin)) {
case "Activated":
return T("status_activated", "Activated");
case "Loading":
return T("status_loading", "Loading");
case "Error":
return T("status_error", "Error");
case "RuntimeError":
return T("status_runtime_error", "Runtime error");
case "Inactive":
return T("status_inactive", "Inactive");
default:
return GetStatus(plugin);
}
}
function StatusDescription(plugin) { function StatusDescription(plugin) {
switch (GetStatus(plugin)) { switch (GetStatus(plugin)) {
case "Activated": case "Activated":
return T("status_activated_desc", "This plugin is active and ready to be used."); return "This plugin is active and ready to be used.";
case "Loading": case "Loading":
return T("status_loading_desc", "This plugin is still loading."); return "This plugin is still loading.";
case "Error": case "Error":
return T("status_error_desc", "This plugin is blocked until its error is fixed."); return "This plugin is blocked until its error is fixed.";
case "RuntimeError": case "RuntimeError":
return T("status_runtime_error_desc", "This plugin is loaded but a capability reported an error."); return "This plugin is loaded but a capability reported an error.";
case "Inactive": case "Inactive":
default: default:
return T("status_inactive_desc", "This plugin is inactive. Activate it to install or load it."); return "This plugin is inactive. Activate it to install or load it.";
} }
} }
@@ -1377,13 +1359,13 @@ function RenderDetailSummary(container, plugin) {
container.replaceChildren(); container.replaceChildren();
if (!plugin) { if (!plugin) {
container.textContent = T("select_plugin", "Select a plugin to view its status and details."); container.textContent = "Select a plugin to view its status and details.";
return; return;
} }
const statusChip = document.createElement("span"); const statusChip = document.createElement("span");
statusChip.className = `detail-status-chip status-${GetStatus(plugin).toLowerCase()}`; statusChip.className = `detail-status-chip status-${GetStatus(plugin).toLowerCase()}`;
statusChip.textContent = StatusLabel(plugin); statusChip.textContent = GetStatus(plugin);
container.appendChild(statusChip); container.appendChild(statusChip);
const message = document.createElement("div"); const message = document.createElement("div");
@@ -1395,7 +1377,7 @@ function RenderDetailSummary(container, plugin) {
if (plugin.orphaned === true) { if (plugin.orphaned === true) {
const warning = document.createElement("div"); const warning = document.createElement("div");
warning.className = "detail-description detail-warning-text"; warning.className = "detail-description detail-warning-text";
warning.textContent = T("orphaned_note", "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."); warning.textContent = "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used.";
container.appendChild(warning); container.appendChild(warning);
} }
@@ -1403,14 +1385,14 @@ function RenderDetailSummary(container, plugin) {
if (updateStatus === "update_available") { if (updateStatus === "update_available") {
const note = document.createElement("div"); const note = document.createElement("div");
note.className = "detail-description detail-note-text"; note.className = "detail-description detail-note-text";
note.textContent = T("newer_version_note", "A newer plugin version is available."); note.textContent = "A newer plugin version is available.";
container.appendChild(note); container.appendChild(note);
} }
if (updateStatus === "unauthorized") { if (updateStatus === "unauthorized") {
const note = document.createElement("div"); const note = document.createElement("div");
note.className = "detail-description detail-note-text is-warning"; note.className = "detail-description detail-note-text is-warning";
note.textContent = T("unauthorized_note", "Cloud updates are unavailable because this plugin is unauthorized for updates."); note.textContent = "Cloud updates are unavailable because this plugin is unauthorized for updates.";
container.appendChild(note); container.appendChild(note);
} }
} }
@@ -11,7 +11,7 @@
<link rel="stylesheet" type="text/css" href="../css/theme.css" /> <link rel="stylesheet" type="text/css" href="../css/theme.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script> <script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script> <script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script> <script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script> <script type="text/javascript" src="../js/common.js"></script>
<!-- <script type="text/javascript" src="./23.js"></script> --> <!-- <script type="text/javascript" src="./23.js"></script> -->
@@ -21,7 +21,7 @@
<div class="app"> <div class="app">
<div class="split"> <div class="split">
<div class="top-toolbar"> <div class="top-toolbar">
<button id="refresh_btn" class="ButtonStyleConfirm ButtonTypeChoice toolbar-btn" data-i18n="refresh">Refresh</button> <button id="refresh_btn" class="ButtonStyleConfirm ButtonTypeChoice toolbar-btn">Refresh</button>
<!-- <label class="auto-update-switch" for="auto_update_toggle"> <!-- <label class="auto-update-switch" for="auto_update_toggle">
<span class="auto-update-label">Auto update</span> <span class="auto-update-label">Auto update</span>
@@ -35,18 +35,18 @@
<section class="pane top"> <section class="pane top">
<div class="hdr top-cols"> <div class="hdr top-cols">
<span data-i18n="name">Name</span> <span>Name</span>
<span data-i18n="type">Type</span> <span>Type</span>
<span data-i18n="version">Version</span> <span>Version</span>
<span data-i18n="update">Update</span> <span>Update</span>
</div> </div>
<div id="topList" class="body"></div> <div id="topList" class="body"></div>
</section> </section>
<section class="pane bottom"> <section class="pane bottom">
<div class="hdr bot-cols"> <div class="hdr bot-cols">
<span data-i18n="name">Name</span> <span>Name</span>
<span data-i18n="type">Type</span> <span>Type</span>
</div> </div>
<div id="bottomList" class="body"></div> <div id="bottomList" class="body"></div>
</section> </section>
@@ -55,15 +55,15 @@
<!-- Footer --> <!-- Footer -->
<div id="AcceptArea"> <div id="AcceptArea">
<div id="export_btn" class="ButtonStyleConfirm ButtonTypeChoice" data-i18n="export_presets" hidden>Export Presets</div> <div id="export_btn" class="ButtonStyleConfirm ButtonTypeChoice" hidden>Export Presets</div>
<div id="close_btn" class="ButtonStyleRegular ButtonTypeChoice" data-i18n="close">Close</div> <div id="close_btn" class="ButtonStyleRegular ButtonTypeChoice">Close</div>
</div> </div>
<!-- Context Menu --> <!-- Context Menu -->
<div id="ctxMenu" class="ctx" hidden> <div id="ctxMenu" class="ctx" hidden>
<button class="ctx-item" data-action="open_folder" data-i18n="open_folder">Open folder in explorer</button> <button class="ctx-item" data-action="open_folder">Open folder in explorer</button>
<button id = "delete_btn" class="ctx-item-delete" data-action="delete_bundle" data-i18n="delete_bundle" hidden>Delete bundle</button> <button id = "delete_btn" class="ctx-item-delete" data-action="delete_bundle" hidden>Delete bundle</button>
<button id = "unsubscribe_btn" class="ctx-item-subscribed" data-action="unsubscribe_bundle" data-i18n="unsubscribe_bundle" hidden>Unsubscribe bundle</button> <button id = "unsubscribe_btn" class="ctx-item-subscribed" data-action="unsubscribe_bundle" hidden>Unsubscribe bundle</button>
</div> </div>
@@ -3,14 +3,8 @@ const bundlesById = new Map(); // bundleId -> bundle object
const printersByBundle = new Map(); // bundleId -> Map(index -> printerName) const printersByBundle = new Map(); // bundleId -> Map(index -> printerName)
const filamentsByBundle = new Map(); // bundleId -> Map(index -> filamentName) const filamentsByBundle = new Map(); // bundleId -> Map(index -> filamentName)
const processesByBundle = new Map(); // bundleId -> Map(index -> presetName) const processesByBundle = new Map(); // bundleId -> Map(index -> presetName)
const UPDATE_TOOLTIP = T("update_available", "Update available"); const UPDATE_TOOLTIP = "Update available";
const UNAUTHORIZED_TOOLTIP = T("unauthorized_bundle", "Unauthorized bundle"); const UNAUTHORIZED_TOOLTIP = "Unauthorized bundle";
// Display names for the bundle types the native side sends (also kept raw in data-bundle-type).
const BUNDLE_TYPE_LABELS = {
Subscribed: T("type_subscribed", "Subscribed"),
Local: T("type_local", "Local"),
Default: T("type_default", "Default")
};
// ========= DOM ========= // ========= DOM =========
let topList = null; let topList = null;
@@ -236,11 +230,11 @@ function renderTop() {
: `<span class="bundle-status-icon-spacer" aria-hidden="true"></span>`} : `<span class="bundle-status-icon-spacer" aria-hidden="true"></span>`}
${ ${
b.type === "Subscribed" ? b.type === "Subscribed" ?
`<a href="#" class="bundle-name-text bundle-cloud-link" title="${escapeAttr(T("open_in_browser", "Open this bundle in your browser"))}">${escapeHtml(b.name)}</a>` `<a href="#" class="bundle-name-text bundle-cloud-link" title="Open this bundle in your browser">${escapeHtml(b.name)}</a>`
: `<span class="bundle-name-text">${escapeHtml(b.name)}</span>` : `<span class="bundle-name-text">${escapeHtml(b.name)}</span>`
} }
</div> </div>
<span title="${escapeAttr(BundleTypeLabel(b.type))}">${escapeHtml(BundleTypeLabel(b.type))}</span> <span title="${escapeAttr(b.type)}">${escapeHtml(b.type)}</span>
<span title="${escapeAttr(b.version)}">${escapeHtml(b.version)}</span> <span title="${escapeAttr(b.version)}">${escapeHtml(b.version)}</span>
<div class="cell bundle-update-cell"> <div class="cell bundle-update-cell">
<button <button
@@ -248,7 +242,7 @@ function renderTop() {
class="bundle-update-btn ${(!b.unauthorized && b.update_available) ? "is-enabled" : "is-disabled"}" class="bundle-update-btn ${(!b.unauthorized && b.update_available) ? "is-enabled" : "is-disabled"}"
${(!b.unauthorized && b.update_available) ? "" : "disabled"} ${(!b.unauthorized && b.update_available) ? "" : "disabled"}
data-id="${escapeAttr(b.id)}" data-id="${escapeAttr(b.id)}"
>${escapeHtml(T("update", "Update"))}</button> >Update</button>
</div> </div>
</div> </div>
`).join(""); `).join("");
@@ -288,9 +282,9 @@ function renderBottomForBundle(bundleId) {
// Convert to a flat list of rows { typeLabel, name } // Convert to a flat list of rows { typeLabel, name }
const rows = []; const rows = [];
for (const [, name] of printers) rows.push({ type: T("printer", "Printer"), name }); for (const [, name] of printers) rows.push({ type: "Printer", name });
for (const [, name] of filaments) rows.push({ type: T("filament", "Filament"), name }); for (const [, name] of filaments) rows.push({ type: "Filament", name });
for (const [, name] of processes) rows.push({ type: T("process", "Process"), name }); for (const [, name] of processes) rows.push({ type: "Process", name });
bottomList.innerHTML = rows.map((r, idx) => ` bottomList.innerHTML = rows.map((r, idx) => `
<div class="row" data-id="${escapeAttr(bundleId)}" data-idx="${idx}"> <div class="row" data-id="${escapeAttr(bundleId)}" data-idx="${idx}">
@@ -357,10 +351,6 @@ function hideMenu() {
contextRow = null; contextRow = null;
} }
// ========= Utilities ========= // ========= Utilities =========
function BundleTypeLabel(type) {
return BUNDLE_TYPE_LABELS[type] || type;
}
function safeJsonParse(s) { function safeJsonParse(s) {
try { return JSON.parse(s); } catch { return null; } try { return JSON.parse(s); } catch { return null; }
} }
+112 -158
View File
@@ -9,8 +9,6 @@
// - action.input "percent"/"tab" -> NativeCommands catalog (phases handled in activateEntry) // - action.input "percent"/"tab" -> NativeCommands catalog (phases handled in activateEntry)
// - action.icon SVG base name -> AppAction::icon / resources/images/<name>.svg // - action.icon SVG base name -> AppAction::icon / resources/images/<name>.svg
// - action.desc/wiki -> AppAction::tooltip / help_url (footer detail strip) // - action.desc/wiki -> AppAction::tooltip / help_url (footer detail strip)
// - action.*_en / tab.title_en -> ActionRegistry action_json / tab_options (English search aliases,
// sent only when they differ from the displayed text)
// - payload.tooltip_expanded -> ActionRegistry::tooltip_expanded (persisted footer state) // - payload.tooltip_expanded -> ActionRegistry::tooltip_expanded (persisted footer state)
// - action list is frecency-sorted -> ActionRegistry::snapshot() // - action list is frecency-sorted -> ActionRegistry::snapshot()
@@ -99,85 +97,45 @@ var ghostEl = null, ghostTypedEl = null, ghostSuffixEl = null;
var activeCompletion = null; var activeCompletion = null;
// ---- pure helpers (no DOM; unit-tested) ------------------------------------- // ---- pure helpers (no DOM; unit-tested) -------------------------------------
// Every searchable field of an action: its text, its ranking weight (title > group/category > // Pre-normalized haystacks, cached on the action object. The fold is length-preserving (1:1 per
// source/aliases) and the matchIndex key its highlight ranges go to (null for a search-only field). // char) so the ranges FuzzyRangesNorm returns slice the ORIGINAL title/group/source text correctly.
// - group vs source: the eyebrow (header) line shows group when present, else source. Settings keep // The action objects arrive from C++ and are stable for the dialog's lifetime, so we compute these once.
// an empty group so their source path is the eyebrow; commands / plates / recents carry a non-empty function titleNorm(a) {
// group. Splitting the two lets a match range stay aligned to whichever string the eyebrow renders. if (a._tn === undefined)
// - full_label: search-only alias for the descriptive name when the title differs (e.g. "Reverse on a._tn = NormText(a.title, false);
// even" vs "Overhang reversal"). Never rendered, so no highlight ranges. return a._tn;
// - plugin category / type: the visible "Plugins" category, plus the plugin kind as searchable
// metadata, so typing "plugin" finds runnable plugin actions even when neither their capability
// nor plugin name contains that word. Keep both category forms.
// - *_en: English counterparts of the translated fields, sent by C++ only when they differ from the
// displayed text (a non-English UI), so the page can still be searched in English. Each carries the
// weight of the localized field it mirrors, so a match ranks the same in either language. Search-only,
// except their ranges, which drive the row's English hint (see ENGLISH_HINT_FIELDS).
var SEARCH_FIELDS = [
{ text: function (a) { return a.title; }, weight: SCORE_TITLE, range: "title" },
{ text: function (a) { return a.group; }, weight: SCORE_GROUP, range: "group" },
{ text: function (a) { return a.source; }, weight: 0, range: "source" },
{ text: function (a) { return a.full_label; }, weight: 0, range: null },
{ text: function (a) { return a.kind === "plugin" ? T("sd_plugins", "Plugins") : ""; }, weight: SCORE_GROUP, range: "plugin" },
{ text: function (a) { return a.kind === "plugin" ? "plugin plugins" : ""; }, weight: SCORE_GROUP, range: null },
{ text: function (a) { return a.title_en; }, weight: SCORE_TITLE, range: "title_en" },
{ text: function (a) { return a.group_en; }, weight: SCORE_GROUP, range: "group_en" },
{ text: function (a) { return a.source_en; }, weight: 0, range: "source_en" },
{ text: function (a) { return a.full_label_en; }, weight: 0, range: "full_label_en" }
];
var MATCH_RANGE_KEYS = SEARCH_FIELDS.map(function (f) { return f.range; }).filter(Boolean);
// English aliases a row can match through. `range` names the matchIndex key matchFields fills for that
// field; the hint shows the action's English name (title_en), falling back to whichever alias matched.
var ENGLISH_HINT_FIELDS = [
{ range: "title_en", text: function (a) { return a.title_en; } },
{ range: "group_en", text: function (a) { return a.group_en; } },
{ range: "source_en", text: function (a) { return a.source_en; } },
{ range: "full_label_en", text: function (a) { return a.full_label_en; } }
];
// The English alias to show as a muted hint on an action row, or null. Only a row whose match came
// through an English alias gets one (a visible translated highlight, or a local-only alias, needs
// none). The hint is the action's English NAME - highlighted when the name itself matched, otherwise
// shown plain - so the row identifies the action instead of repeating its translated eyebrow: a
// "Process : Speed" breadcrumb match still names the setting ("Inner wall"), not the breadcrumb again.
function englishHint(a, mi, visibleMatch) {
if (!mi || visibleMatch) return null;
var matched = null;
for (var i = 0; i < ENGLISH_HINT_FIELDS.length; i++) {
if (mi[ENGLISH_HINT_FIELDS[i].range]) { matched = ENGLISH_HINT_FIELDS[i]; break; }
}
if (!matched) return null;
if (a.title_en) return { text: a.title_en, ranges: mi.title_en || null };
var text = matched.text(a);
return text ? { text: text, ranges: mi[matched.range] } : null;
} }
// The eyebrow (header) line shows group when present, else source. Settings keep an empty group so
// The English breadcrumb a row matched through (a command's group, a setting's source path), with its // their source path is the eyebrow; commands / plates / recents carry a non-empty group. Splitting the
// highlight ranges, or null when neither matched. Shown beside the translated eyebrow so an English // two lets a match range stay aligned to whichever string the eyebrow actually renders.
// hit is visible where it landed, alongside the English name hint on the row-name line. function groupNorm(a) {
function englishBreadcrumb(a, mi) { if (a._gn === undefined)
if (!mi) return null; a._gn = NormText(a.group || "", false);
if (mi.group_en && a.group_en) return { text: a.group_en, ranges: mi.group_en }; return a._gn;
if (mi.source_en && a.source_en) return { text: a.source_en, ranges: mi.source_en };
return null;
} }
function sourceNorm(a) {
// The action's non-empty SEARCH_FIELDS as pre-normalized haystacks ({norm, weight, range}), cached on if (a._sn === undefined)
// the action object. The action objects arrive from C++ and are stable for the dialog's lifetime, so a._sn = NormText(a.source || "", false);
// this runs once per action; skipping empty fields keeps the per-keystroke scan to the text an action return a._sn;
// actually has (an English UI pays nothing for the aliases it never receives). The fold is }
// length-preserving (1:1 per char) so the ranges FuzzyRangesNorm returns slice the ORIGINAL text. function pluginCategoryNorm(a) {
function searchFields(a) { if (a._pcn === undefined)
if (a._sf === undefined) { a._pcn = a.kind === "plugin" ? NormText(T("sd_plugins", "Plugins"), false) : "";
a._sf = []; return a._pcn;
for (var i = 0; i < SEARCH_FIELDS.length; i++) { }
var norm = NormText(SEARCH_FIELDS[i].text(a) || "", false); // Plugin type is searchable metadata, so typing "plugin" can find runnable plugin actions even
if (norm) // when neither their capability nor plugin name contains that word. Keep both category forms.
a._sf.push({ norm: norm, weight: SEARCH_FIELDS[i].weight, range: SEARCH_FIELDS[i].range }); function pluginTypeNorm(a) {
} if (a._pn === undefined)
} a._pn = a.kind === "plugin" ? NormText("plugin plugins", false) : "";
return a._sf; return a._pn;
}
// Search-only alias for the descriptive name when the title differs (e.g. "Reverse on even" vs
// "Overhang reversal"). Never rendered, so no highlight ranges.
function fullNorm(a) {
if (a._fn === undefined)
a._fn = NormText(a.full_label || "", false);
return a._fn;
} }
// Match one pre-normalized field vs one pre-normalized needle. Returns {score, ranges, contiguous} // Match one pre-normalized field vs one pre-normalized needle. Returns {score, ranges, contiguous}
@@ -217,22 +175,26 @@ function tokenWordRe(token) {
return new RegExp("\\b" + EscapeRegExp(token) + "\\b"); return new RegExp("\\b" + EscapeRegExp(token) + "\\b");
} }
// One needle (the whole query, or one token of it) against every SEARCH_FIELDS field of an action. // One token's best match across an action's searchable fields, keeping per-field ranges for
// Returns {score, ranges}: the best weighted field score (contiguous > fuzzy, then field weight, then // highlighting. Returns {score, title, group, source}, or null if no field matches.
// start/gaps) and the ranges of each matching highlighted field keyed by its range name. Null when no function tokenMatch(a, token, wwRe) {
// field matches. var t = fieldMatchScore(titleNorm(a), token, wwRe);
function matchFields(a, needle, wwRe) { var g = fieldMatchScore(groupNorm(a), token, wwRe);
var fields = searchFields(a); var s = fieldMatchScore(sourceNorm(a), token, wwRe);
var best = null, ranges = null; // allocated on the first match: most actions match nothing var f = fieldMatchScore(fullNorm(a), token, wwRe);
for (var i = 0; i < fields.length; i++) { var p = fieldMatchScore(pluginCategoryNorm(a), token, wwRe);
var field = fields[i]; var typeMatch = fieldMatchScore(pluginTypeNorm(a), token, wwRe);
var m = fieldMatchScore(field.norm, needle, wwRe); if (!t && !g && !s && !f && !p && !typeMatch) return null;
if (!m) continue; var score = Math.max(
var v = (m.contiguous ? SCORE_CONTIGUOUS : 0) + field.weight + m.score; t ? (t.contiguous ? SCORE_CONTIGUOUS : 0) + SCORE_TITLE + t.score : -Infinity,
if (best === null || v > best) best = v; g ? (g.contiguous ? SCORE_CONTIGUOUS : 0) + SCORE_GROUP + g.score : -Infinity,
if (field.range) (ranges || (ranges = {}))[field.range] = m.ranges; s ? (s.contiguous ? SCORE_CONTIGUOUS : 0) + s.score : -Infinity,
} f ? (f.contiguous ? SCORE_CONTIGUOUS : 0) + f.score : -Infinity,
return best === null ? null : { score: best, ranges: ranges || {} }; p ? (p.contiguous ? SCORE_CONTIGUOUS : 0) + SCORE_GROUP + p.score : -Infinity,
typeMatch ? (typeMatch.contiguous ? SCORE_CONTIGUOUS : 0) + SCORE_GROUP + typeMatch.score : -Infinity
);
return { score: score, title: t ? t.ranges : null, group: g ? g.ranges : null, source: s ? s.ranges : null,
plugin: p ? p.ranges : null };
} }
// Merge per-field token ranges into sorted, coalesced ranges for highlighting. Overlapping or adjacent // Merge per-field token ranges into sorted, coalesced ranges for highlighting. Overlapping or adjacent
@@ -255,6 +217,24 @@ function mergeRanges(ranges) {
return out; return out;
} }
// Combine per-field scores into one value, or null when nothing matched.
// Ranking: contiguous > fuzzy, then title > group/category > source/full alias, then start/gaps.
function scoreFields(t, g, s, f, p, typeMatch) {
var best = null;
function consider(m, weight) {
if (!m) return;
var v = (m.contiguous ? SCORE_CONTIGUOUS : 0) + weight + m.score;
best = best === null ? v : Math.max(best, v);
}
consider(t, SCORE_TITLE);
consider(g, SCORE_GROUP);
consider(s, 0);
consider(f, 0);
consider(p, SCORE_GROUP);
consider(typeMatch, SCORE_GROUP);
return best;
}
// The unified main-phase search: every action (command/plugin/setting) matching the query, ranked // The unified main-phase search: every action (command/plugin/setting) matching the query, ranked
// by relevance (not by action type). Sets matchIndex so rows highlight their match ranges. The query // by relevance (not by action type). Sets matchIndex so rows highlight their match ranges. The query
// is normalized ONCE per pass - FuzzyRangesNorm then runs against each action's pre-normalized // is normalized ONCE per pass - FuzzyRangesNorm then runs against each action's pre-normalized
@@ -265,8 +245,8 @@ function mergeRanges(ranges) {
// - tokens: every whitespace-separated word must match SOME field, but different words may match // - tokens: every whitespace-separated word must match SOME field, but different words may match
// different fields. This is what lets "speed acceleration inner" find "Inner wall" whose path is // different fields. This is what lets "speed acceleration inner" find "Inner wall" whose path is
// "Process : Speed : Acceleration" (title + source breadcrumb together). // "Process : Speed : Acceleration" (title + source breadcrumb together).
// full_label, canonical plugin kind and the English counterparts (*_en) are searchable aliases. The // full_label and canonical plugin kind are searchable aliases. The visible category is also searchable
// visible category is also searchable so its own match can be highlighted in plugin rows. // so its own match can be highlighted in plugin rows.
// A phrase match always outranks a distributed token match. // A phrase match always outranks a distributed token match.
function searchActions(actions, query) { function searchActions(actions, query) {
var q = (query || "").trim(); var q = (query || "").trim();
@@ -282,43 +262,50 @@ function searchActions(actions, query) {
// Compiled once per pass, reused over every field: non-global so no exec()/lastIndex state leaks // Compiled once per pass, reused over every field: non-global so no exec()/lastIndex state leaks
// between fields, and EscapeRegExp keeps regex metachars in the query literal. // between fields, and EscapeRegExp keeps regex metachars in the query literal.
var wwRe = new RegExp("\\b" + EscapeRegExp(searchNeedle) + "\\b"); var wwRe = new RegExp("\\b" + EscapeRegExp(searchNeedle) + "\\b");
// A one-word query's only token is the needle itself, so its token pass would repeat the failed
// phrase match exactly; such an action is dropped without it.
var tokenPass = searchTokens.length !== 1 || searchTokens[0] !== searchNeedle;
var scored = []; var scored = [];
var seen = {}; var seen = {};
for (var i = 0; i < list.length; i++) { for (var i = 0; i < list.length; i++) {
var a = list[i]; var a = list[i];
var phrase = matchFields(a, searchNeedle, wwRe); var t = fieldMatchScore(titleNorm(a), searchNeedle, wwRe);
var score, perField; var g = fieldMatchScore(groupNorm(a), searchNeedle, wwRe);
if (phrase) { var s = fieldMatchScore(sourceNorm(a), searchNeedle, wwRe);
score = phrase.score + SCORE_PHRASE; var f = fieldMatchScore(fullNorm(a), searchNeedle, wwRe);
var p = fieldMatchScore(pluginCategoryNorm(a), searchNeedle, wwRe);
var typeMatch = fieldMatchScore(pluginTypeNorm(a), searchNeedle, wwRe);
var phrase = scoreFields(t, g, s, f, p, typeMatch);
var score, ranges;
if (phrase !== null) {
score = phrase + SCORE_PHRASE;
ranges = { title: t ? t.ranges : null, group: g ? g.ranges : null, source: s ? s.ranges : null,
plugin: p ? p.ranges : null };
} else { } else {
if (!tokenPass) continue;
// Require every token; a token that matches nothing drops the action immediately. Ranges // Require every token; a token that matches nothing drops the action immediately. Ranges
// from all matching tokens are merged per field so each matched word highlights. // from all matching tokens are merged per field so each matched word highlights.
var sum = 0, all = true; var sum = 0, titleR = null, groupR = null, sourceR = null, pluginR = null, all = true;
perField = {};
for (var tokenIndex = 0; tokenIndex < searchTokens.length; tokenIndex++) { for (var tokenIndex = 0; tokenIndex < searchTokens.length; tokenIndex++) {
var m = matchFields(a, searchTokens[tokenIndex], searchTokenRes[tokenIndex]); var m = tokenMatch(a, searchTokens[tokenIndex], searchTokenRes[tokenIndex]);
if (!m) { all = false; break; } if (!m) { all = false; break; }
sum += m.score; sum += m.score;
for (var key in m.ranges) if (m.title) (titleR || (titleR = [])).push(m.title);
(perField[key] || (perField[key] = [])).push(m.ranges[key]); if (m.group) (groupR || (groupR = [])).push(m.group);
if (m.source) (sourceR || (sourceR = [])).push(m.source);
if (m.plugin) (pluginR || (pluginR = [])).push(m.plugin);
} }
if (!all) continue; if (!all) continue;
score = sum; score = sum;
ranges = { title: mergeRanges(titleR), group: mergeRanges(groupR), source: mergeRanges(sourceR),
plugin: mergeRanges(pluginR) };
} }
// Ranges are per-field against the ACTUAL text drawn: title for the row-name, group (or source // Ranges are per-field against the ACTUAL text drawn: title for the row-name, and group (or
// when group is empty) for the eyebrow, and title_en for the English hint - so highlight offsets // source when group is empty) for the eyebrow - so highlight offsets stay aligned to the label.
// stay aligned to the label. matchIndex[a.id] = {
var entry = { useEyebrowGroup: !!(a.group) }; title: ranges.title,
for (var k = 0; k < MATCH_RANGE_KEYS.length; k++) { group: ranges.group,
var rangeKey = MATCH_RANGE_KEYS[k]; source: ranges.source,
entry[rangeKey] = phrase ? phrase.ranges[rangeKey] || null : mergeRanges(perField[rangeKey]); plugin: ranges.plugin,
} useEyebrowGroup: !!(a.group)
matchIndex[a.id] = entry; };
scored.push({ a: a, s: score }); scored.push({ a: a, s: score });
seen[a.id] = true; seen[a.id] = true;
} }
@@ -363,8 +350,7 @@ function completionFor(query, list) {
var top = (list || []).slice(0, 10); var top = (list || []).slice(0, 10);
for (var i = 0; i < top.length; i++) { for (var i = 0; i < top.length; i++) {
var a = top[i]; var a = top[i];
// English aliases after the displayed text, so English typing completes in a localized UI. var fields = [a.title, a.group, a.source, a.full_label];
var fields = [a.title, a.group, a.source, a.full_label, a.title_en, a.group_en, a.source_en, a.full_label_en];
for (var f = 0; f < fields.length; f++) { for (var f = 0; f < fields.length; f++) {
var words = completionWords(fields[f]); var words = completionWords(fields[f]);
for (var w = 0; w < words.length; w++) { for (var w = 0; w < words.length; w++) {
@@ -441,30 +427,16 @@ function tabTitle(t) {
return title || prettySource((t && t.id) || ""); return title || prettySource((t && t.id) || "");
} }
// Filter the tab list by a fuzzy title/id/English-title match (title_en is sent only when the page // Filter the tab list by a fuzzy title/id match. Pure so the node-vm test can exercise it.
// label is translated). Pure so the node-vm test can exercise it.
function filterTabs(tabs, query) { function filterTabs(tabs, query) {
var q = (query || "").trim(); var q = (query || "").trim();
if (!q) if (!q)
return (tabs || []).slice(0); return (tabs || []).slice(0);
return (tabs || []).filter(function (t) { return (tabs || []).filter(function (t) {
return FuzzyRanges(tabTitle(t), q, false) || FuzzyRanges(t.id, q, false) || return FuzzyRanges(tabTitle(t), q, false) || FuzzyRanges(t.id, q, false);
(t.title_en && FuzzyRanges(t.title_en, q, false));
}); });
} }
// The English title of a tab matched only through it, with its highlight ranges, or null when the tab
// matched its translated title or id (so it already shows why) or has no English title.
function tabAliasHint(t, query) {
var q = (query || "").trim();
if (!q || !t || !t.title_en)
return null;
if (FuzzyRanges(tabTitle(t), q, false) || FuzzyRanges(t.id, q, false))
return null;
var ranges = FuzzyRanges(t.title_en, q, false);
return ranges ? { text: t.title_en, ranges: ranges } : null;
}
function shouldRenderActionList(query) { function shouldRenderActionList(query) {
return !!((query || "").trim()); return !!((query || "").trim());
} }
@@ -999,21 +971,8 @@ function renderActionRow(a, i) {
var showPluginCategory = a.kind === "plugin" && (typedQuery || isRecent); var showPluginCategory = a.kind === "plugin" && (typedQuery || isRecent);
var eyebrow = actionEyebrow(a, query, isRecent); var eyebrow = actionEyebrow(a, query, isRecent);
var eyebrowMatch = mi ? (showPluginCategory ? mi.plugin : (mi.useEyebrowGroup ? mi.group : mi.source)) : null; var eyebrowMatch = mi ? (showPluginCategory ? mi.plugin : (mi.useEyebrowGroup ? mi.group : mi.source)) : null;
// The eyebrow line: the translated breadcrumb, and beside it the English breadcrumb when the query shell.left.insertBefore(markedText("row-eyebrow", eyebrow, eyebrowMatch), shell.line);
// matched that (non-English UI), so an English hit on a breadcrumb is visible where it landed.
var eyebrowLine = document.createElement("div");
eyebrowLine.className = "row-eyebrow-line";
eyebrowLine.appendChild(markedText("row-eyebrow", eyebrow, eyebrowMatch));
var enBreadcrumb = englishBreadcrumb(a, mi);
if (enBreadcrumb)
eyebrowLine.appendChild(markedText("row-eyebrow-en", enBreadcrumb.text, enBreadcrumb.ranges));
shell.left.insertBefore(eyebrowLine, shell.line);
shell.line.appendChild(markedText("row-name", a.title, mi ? mi.title : null)); shell.line.appendChild(markedText("row-name", a.title, mi ? mi.title : null));
// A row found only through an English alias shows the action's English name, highlighted when the
// name itself matched, so the match makes sense even when the translated row resembles nothing.
var hint = englishHint(a, mi, mi ? (mi.title || eyebrowMatch) : null);
if (hint)
shell.line.appendChild(markedText("row-alias", hint.text, hint.ranges));
var badge = modeBadge(a, USER_MODE); var badge = modeBadge(a, USER_MODE);
if (badge) { if (badge) {
var tag = document.createElement("span"); var tag = document.createElement("span");
@@ -1191,11 +1150,6 @@ function renderTabRow(t, i) {
name.className = "row-name"; name.className = "row-name";
name.textContent = label; name.textContent = label;
shell.line.appendChild(name); shell.line.appendChild(name);
// A tab found only through its English title shows that title, highlighted, so the match is
// explained even when the translated label looks nothing like the query.
var hint = tabAliasHint(t, query);
if (hint)
shell.line.appendChild(markedText("row-alias", hint.text, hint.ranges));
shell.row.onclick = function () { sel = { zone: "list", i: i }; render({ resize: true }); }; shell.row.onclick = function () { sel = { zone: "list", i: i }; render({ resize: true }); };
shell.row.ondblclick = function () { sel = { zone: "list", i: i }; jumpToTab(t); }; shell.row.ondblclick = function () { sel = { zone: "list", i: i }; jumpToTab(t); };
return shell.row; return shell.row;
@@ -1467,8 +1421,8 @@ function focusInput() { setTimeout(function () { if (qEl) qEl.focus(); }, 0); }
function OnInit() { function OnInit() {
qEl = $("q"); listEl = $("list"); favEl = $("favBar"); clearEl = $("clear"); eyeEl = $("favEyebrow"); countEl = $("count"); detailEl = $("detail"); qEl = $("q"); listEl = $("list"); favEl = $("favBar"); clearEl = $("clear"); eyeEl = $("favEyebrow"); countEl = $("count"); detailEl = $("detail");
ghostEl = $("ghost"); ghostTypedEl = $("ghostTyped"); ghostSuffixEl = $("ghostSuffix"); ghostEl = $("ghost"); ghostTypedEl = $("ghostTyped"); ghostSuffixEl = $("ghostSuffix");
// This page has no data-i18n markup and defines its own `$` and T(), so it does not load // text.js's TranslatePage() targets jQuery `.trans` nodes; this page has none and defines its own
// include/i18n.js. Its strings all go through T(). // `$`, so don't call it. Runtime strings go through T() instead.
qEl.placeholder = T("sd_search", "Search actions"); qEl.placeholder = T("sd_search", "Search actions");
qEl.setAttribute("aria-label", T("sd_search", "Search actions")); qEl.setAttribute("aria-label", T("sd_search", "Search actions"));
if (clearEl) { if (clearEl) {
@@ -50,25 +50,6 @@ assert.equal(ctx.filterTabs(tabOptions, "Device").length, 1,
"a typed query matches a tab title"); "a typed query matches a tab title");
assert.deepEqual(ctx.filterTabs(tabOptions, "zzz"), [], assert.deepEqual(ctx.filterTabs(tabOptions, "zzz"), [],
"a typed query with no match returns an empty list"); "a typed query with no match returns an empty list");
// A translated tab whose id is not its English name carries title_en, so English still finds it.
const localizedTabs = [
{ id: "monitor", title: "设备", title_en: "Device" },
{ id: "prepare", title: "准备" }
];
assert.deepEqual(ctx.filterTabs(localizedTabs, "device").map(function (t) { return t.id; }), ["monitor"],
"a localized tab matches its English title");
assert.deepEqual(ctx.filterTabs(localizedTabs, "设备").map(function (t) { return t.id; }), ["monitor"],
"a localized tab still matches its translated title");
// A tab found only through its English title shows it as a hint; one that matched its translated
// title or id already shows why, and one without an English title has nothing to show.
assert.deepEqual(ctx.tabAliasHint(localizedTabs[0], "device"), { text: "Device", ranges: [[0, 6]] },
"an English-only tab match yields the English title and its highlight ranges");
assert.equal(ctx.tabAliasHint(localizedTabs[0], "设备"), null,
"a translated-title tab match draws no English hint");
assert.equal(ctx.tabAliasHint(localizedTabs[0], "monitor"), null,
"a tab matched by its id draws no English hint");
assert.equal(ctx.tabAliasHint(localizedTabs[1], "Device"), null,
"a tab with no English title has no hint");
// tabTitle: pages added with an empty title (e.g. MainFrame's Home tab) fall back to the id. // tabTitle: pages added with an empty title (e.g. MainFrame's Home tab) fall back to the id.
assert.equal(ctx.tabTitle({ id: "home", title: "" }), "Home", assert.equal(ctx.tabTitle({ id: "home", title: "" }), "Home",
@@ -211,89 +192,6 @@ assert.equal(ctx.completionFor("", compPool), null, "an empty query has no compl
assert.equal(ctx.completionFor("zzz", ctx.searchActions(compPool, "zzz")), null, assert.equal(ctx.completionFor("zzz", ctx.searchActions(compPool, "zzz")), null,
"a query with no match has no completion"); "a query with no match has no completion");
// English aliases: in a non-English UI each translated field may carry its English counterpart
// (*_en), searched with the weight of the field it mirrors. An English UI sends none.
const zhPool = [
{ id: "rev", title: "反转偶数层悬垂方向", full_label: "悬垂反转", source: "工艺 : 质量 : 悬垂",
title_en: "Reverse on even", full_label_en: "Overhang reversal", source_en: "Process : Quality : Overhangs",
group: "", input: "" },
{ id: "slice", title: "切片并预览", source: "OrcaSlicer", group: "切片和导出",
title_en: "Slice and Preview", group_en: "Slice & Export", input: "" },
{ id: "brim", title: "Brim宽度", source: "工艺 : 其他 : Brim", source_en: "Process : Others : Brim",
group: "", input: "" }
];
assert.deepEqual(ctx.searchActions(zhPool, "reverse on even").map(function (a) { return a.id; }), ["rev"],
"an English query finds a translated setting through its English title");
assert.equal(ctx.matchIndex.rev.title, null, "an English-only match does not highlight the translated title");
assert.deepEqual(ctx.matchIndex.rev.title_en, [[0, 15]], "the English title keeps its ranges for the hint");
assert.deepEqual(ctx.searchActions(zhPool, "偶数层").map(function (a) { return a.id; }), ["rev"],
"the translated title is still searchable");
assert.equal(ctx.matchIndex.rev.title_en, null, "a translated-title match leaves no English hint ranges");
assert.deepEqual(ctx.searchActions(zhPool, "reverse 悬垂").map(function (a) { return a.id; }), ["rev"],
"a mixed query may match one token in English and another in the translation");
assert.deepEqual(ctx.searchActions(zhPool, "overhang reversal").map(function (a) { return a.id; }), ["rev"],
"the English full_label alias is searchable");
assert.deepEqual(ctx.searchActions(zhPool, "export").map(function (a) { return a.id; }), ["slice"],
"the English group alias is searchable");
assert.deepEqual(ctx.searchActions(zhPool, "brim").map(function (a) { return a.id; }), ["brim"],
"a translation that keeps the English word matches the displayed title");
assert.deepEqual(ctx.matchIndex.brim.title, [[0, 4]], "that match highlights the displayed title, so no hint is drawn");
// Weights mirror the localized fields: an English title match outranks an English breadcrumb match.
const zhRankPool = [
{ id: "src", title: "内壁", source: "工艺 : 速度", source_en: "Process : Speed", group: "", input: "" },
{ id: "ttl", title: "速度", source: "工艺 : 其他", title_en: "Speed", group: "", input: "" }
];
assert.deepEqual(ctx.searchActions(zhRankPool, "speed").map(function (a) { return a.id; }), ["ttl", "src"],
"an English title match outranks an English breadcrumb match, as their localized fields do");
// Absent aliases (an English UI) leave no English hint; every pool above has none and ranks as before.
ctx.searchActions(pool, "layer");
assert.equal(ctx.matchIndex.c1.title_en, null, "an action without English aliases has no English hint ranges");
assert.equal(ctx.completionFor("reverse o", ctx.searchActions(zhPool, "reverse o")).suffix, "n",
"completion extends an English word from title_en");
assert.equal(ctx.completionFor("quality overh", ctx.searchActions(zhPool, "quality overh")).suffix, "angs",
"completion also reaches the English breadcrumb");
// A row matched only through an English group/source/full_label alias still names the action in
// English: the hint is title_en (the English name), not the alias that matched, so a breadcrumb hit
// does not just repeat the translated eyebrow.
ctx.searchActions(zhPool, "export");
assert.deepEqual(ctx.matchIndex.slice.group_en, [[8, 14]], "the English group keeps its ranges");
assert.deepEqual(ctx.englishHint(zhPool[1], ctx.matchIndex.slice, null), { text: "Slice and Preview", ranges: null },
"an English group match names the action, unhighlighted");
assert.deepEqual(ctx.englishBreadcrumb(zhPool[1], ctx.matchIndex.slice), { text: "Slice & Export", ranges: [[8, 14]] },
"an English group match shows the English breadcrumb beside the eyebrow");
ctx.searchActions(zhPool, "overhang reversal");
assert.deepEqual(ctx.matchIndex.rev.full_label_en, [[0, 17]], "the English full_label keeps its ranges");
assert.deepEqual(ctx.englishHint(zhPool[0], ctx.matchIndex.rev, null), { text: "Reverse on even", ranges: null },
"an English full_label match names the action, unhighlighted");
ctx.searchActions(zhPool, "quality");
assert.deepEqual(ctx.matchIndex.rev.source_en, [[10, 17]], "the English breadcrumb keeps its ranges");
assert.deepEqual(ctx.englishHint(zhPool[0], ctx.matchIndex.rev, null), { text: "Reverse on even", ranges: null },
"an English breadcrumb match names the action, not the breadcrumb");
assert.deepEqual(ctx.englishBreadcrumb(zhPool[0], ctx.matchIndex.rev), { text: "Process : Quality : Overhangs", ranges: [[10, 17]] },
"an English breadcrumb match shows the English breadcrumb beside the eyebrow");
// The name itself matching is the one case that highlights the hint.
ctx.searchActions(zhPool, "reverse on even");
assert.deepEqual(ctx.englishHint(zhPool[0], ctx.matchIndex.rev, null), { text: "Reverse on even", ranges: [[0, 15]] },
"an English title match names and highlights the action");
assert.equal(ctx.englishBreadcrumb(zhPool[0], ctx.matchIndex.rev), null,
"an English title match shows no breadcrumb hint");
// A breadcrumb match with no English name falls back to the matched alias.
assert.deepEqual(ctx.englishHint({ title_en: "", source_en: "Process : Speed" }, { source_en: [[10, 15]] }, null),
{ text: "Process : Speed", ranges: [[10, 15]] }, "without an English name the matched alias is shown");
// A visible translated highlight suppresses the hint even when an English alias also matched.
ctx.searchActions(zhPool, "brim");
assert.equal(ctx.englishHint(zhPool[2], ctx.matchIndex.brim, ctx.matchIndex.brim.title), null,
"a row that highlights its translated title draws no English hint");
// The reported case: "process speed" matches only the English breadcrumb of "Inner wall", so the hint
// names the setting rather than echoing the breadcrumb.
const zhInner = [{ id: "inner", title: "内壁", title_en: "Inner wall", source: "工艺 : 速度",
source_en: "Process : Speed", group: "", input: "" }];
ctx.searchActions(zhInner, "process speed");
assert.deepEqual(ctx.englishHint(zhInner[0], ctx.matchIndex.inner, null), { text: "Inner wall", ranges: null },
"a breadcrumb-only match names the setting in English");
assert.deepEqual(ctx.englishBreadcrumb(zhInner[0], ctx.matchIndex.inner), { text: "Process : Speed", ranges: [[0, 8], [10, 15]] },
"a breadcrumb-only match shows the English breadcrumb beside the eyebrow");
// actionCategory: a command/dynamic action's group is its category; a setting uses the top-level // actionCategory: a command/dynamic action's group is its category; a setting uses the top-level
// source segment; every plugin shares one header; a category-less action falls back to "Other". // source segment; every plugin shares one header; a category-less action falls back to "Other".
assert.equal(ctx.actionCategory({ id: "c", group: "Help", source: "OrcaSlicer", kind: "command" }), "Help", assert.equal(ctx.actionCategory({ id: "c", group: "Help", source: "OrcaSlicer", kind: "command" }), "Help",
@@ -558,9 +456,9 @@ assert.equal(ctx.stateFromPayload({}).tooltipExpanded, true, "expansion defaults
assert.equal(ctx.stateFromPayload({ tooltip_expanded: false }).tooltipExpanded, false, "a collapsed payload is honored"); assert.equal(ctx.stateFromPayload({ tooltip_expanded: false }).tooltipExpanded, false, "a collapsed payload is honored");
assert.equal(ctx.stateFromPayload({ tooltip_expanded: true }).tooltipExpanded, true, "an expanded payload is honored"); assert.equal(ctx.stateFromPayload({ tooltip_expanded: true }).tooltipExpanded, true, "an expanded payload is honored");
// resultCountText: a search counts the shown matches only ("Matching actions: N"); the total is used // resultCountText: a search counts the shown matches only ("Showing N actions"); the total is used
// solely for the empty-query count. // solely for the empty-query count.
assert.equal(ctx.resultCountText(100, 3, "lay"), "Matching actions: 3", "a search reports the shown match count only"); assert.equal(ctx.resultCountText(100, 3, "lay"), "Showing 3 actions", "a search reports the shown match count only");
assert.equal(ctx.resultCountText(100, 100, ""), "Actions: 100", "an empty query reports the total"); assert.equal(ctx.resultCountText(100, 100, ""), "100 actions", "an empty query reports the total");
console.log("ok"); console.log("ok");
+1 -38
View File
@@ -390,31 +390,7 @@ body {
flex-direction: column; flex-direction: column;
} }
/* Eyebrow line: the translated breadcrumb, plus the English breadcrumb beside it when it matched. */
.row-eyebrow-line {
display: flex;
align-items: baseline;
gap: 6px;
min-width: 0;
overflow: hidden;
}
.row-eyebrow { .row-eyebrow {
font-size: 10px;
line-height: 1.3;
color: var(--muted, var(--orca-muted, #6b7280));
opacity: .85;
flex: 0 1 auto;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* English breadcrumb of a row found only through it (non-English UI); gives way to the translation. */
.row-eyebrow-en {
flex: 0 100 auto;
min-width: 0;
font-size: 10px; font-size: 10px;
line-height: 1.3; line-height: 1.3;
color: var(--muted, var(--orca-muted, #6b7280)); color: var(--muted, var(--orca-muted, #6b7280));
@@ -438,21 +414,8 @@ body {
white-space: nowrap; white-space: nowrap;
} }
/* English title of a row found only through it (non-English UI); gives way to the title first. */
.row-alias {
flex: 0 100 auto;
min-width: 0;
font-size: 11px;
color: var(--muted, var(--orca-muted, #6b7280));
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.row-name mark, .row-name mark,
.row-eyebrow mark, .row-eyebrow mark {
.row-eyebrow-en mark,
.row-alias mark {
background: var(--plugin-status-warn-bg); background: var(--plugin-status-warn-bg);
color: var(--plugin-status-warn); color: var(--plugin-status-warn);
border-radius: 2px; border-radius: 2px;
@@ -11,7 +11,7 @@
<link rel="stylesheet" href="./styles.css" /> <link rel="stylesheet" href="./styles.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script> <script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script> <script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script> <script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../../include/xterm/xterm.js"></script> <script type="text/javascript" src="../../include/xterm/xterm.js"></script>
<script type="text/javascript" src="../../include/xterm/xterm-addon-fit.js"></script> <script type="text/javascript" src="../../include/xterm/xterm-addon-fit.js"></script>
@@ -21,8 +21,8 @@
<div class="app"> <div class="app">
<div id="terminal-container"></div> <div id="terminal-container"></div>
<div class="input-row"> <div class="input-row">
<input type="text" id="cmd-input" placeholder="python ... or uv ..." data-i18n-placeholder="command_hint" /> <input type="text" id="cmd-input" placeholder="python ... or uv ..." />
<button id="run-btn" data-i18n="run">Run</button> <button id="run-btn">Run</button>
</div> </div>
</div> </div>
</body> </body>
+4 -3
View File
@@ -36,7 +36,8 @@ function WatchXtermTheme() {
} }
function OnInit() { function OnInit() {
TranslatePage(); if (typeof TranslatePage === "function")
TranslatePage();
term = new Terminal({ term = new Terminal({
cursorBlink: true, cursorBlink: true,
@@ -76,7 +77,7 @@ function OnInit() {
onRun(); onRun();
}); });
term.writeln(T("ready", "Plugin terminal ready.")); term.writeln("Plugin terminal ready.");
} }
function onRun() { function onRun() {
@@ -121,7 +122,7 @@ function HandleStudio(value) {
case "process_done": case "process_done":
setRunning(false); setRunning(false);
term.writeln("\x1b[90m" + T("exit_code", "Process exited with code: %s", payload.exit_code) + "\x1b[0m"); term.writeln("\x1b[90mProcess exited with code: " + payload.exit_code + "\x1b[0m");
break; break;
case "process_error": case "process_error":
+2 -2
View File
@@ -9,7 +9,7 @@
<link rel="stylesheet" type="text/css" href="../css/dark.css" /> <link rel="stylesheet" type="text/css" href="../css/dark.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script> <script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script> <script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script> <script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script> <script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="load.js"></script> <script type="text/javascript" src="load.js"></script>
@@ -17,7 +17,7 @@
<body onLoad="OnInit()"> <body onLoad="OnInit()">
<div id="LoadBlock"> <div id="LoadBlock">
<img id="LoadingSvg" src="loading.svg" /> <img id="LoadingSvg" src="loading.svg" />
<div id="LoadTip" data-i18n="loading">Loading…</div> <div id="LoadTip" class="trans" tid="t126">Loading……</div>
</div> </div>
</body> </body>
</html> </html>
+4 -4
View File
@@ -9,7 +9,7 @@
<link rel="stylesheet" type="text/css" href="../css/dark.css" /> <link rel="stylesheet" type="text/css" href="../css/dark.css" />
<link rel="stylesheet" type="text/css" href="1.css" /> <link rel="stylesheet" type="text/css" href="1.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script> <script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script> <script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script> <script type="text/javascript" src="../js/common.js"></script>
</head> </head>
@@ -17,10 +17,10 @@
<div id="SlicerIcon" style="text-align: center;"> <div id="SlicerIcon" style="text-align: center;">
<img src="../../image/logo.png"/> <img src="../../image/logo.png"/>
</div> </div>
<div id="Title" data-i18n="welcome">Welcome to Orca Slicer</div> <div id="Title" class="trans" tid="t1">Welcome to Orca Slicer</div>
<div id="STip" data-i18n="setup_intro">Orca Slicer will be set up in several steps. Let's start!</div> <div id="STip" class="trans" tid="t2">Orca Slicer will be setup in several steps. Let's start!</div>
<div id="BtnArea"> <div id="BtnArea">
<a id="StartBtn" class="ButtonStyleConfirm ButtonTypeChoice" href="../11/index.html" data-i18n="get_started">Get Started</a> <a id="StartBtn" class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t24" href="../11/index.html">Get Started</a>
</div> </div>
</body> </body>
</html> </html>
+8 -8
View File
@@ -10,23 +10,23 @@
<link rel="stylesheet" type="text/css" href="../css/dark.css" /> <link rel="stylesheet" type="text/css" href="../css/dark.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script> <script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script> <script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script> <script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script> <script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="11.js"></script> <script type="text/javascript" src="11.js"></script>
</head> </head>
<body onLoad="OnInit()"> <body onLoad="OnInit()">
<div id="Title"> <div id="Title">
<div data-i18n="login_region">Please select your login region</div> <div class="trans" tid="t47">Please select your login region</div>
</div> </div>
<div id="Content"> <div id="Content">
<div id="EarthIcon"><img src="earth.png"/></div> <div id="EarthIcon"><img src="earth.png"/></div>
<div id="RegionList"> <div id="RegionList">
<div class="RegionItem RegionSelected TextS1" region="Asia-Pacific" onclick="ChooseRegion('Asia-Pacific')" data-i18n="asia_pacific">Asia-Pacific</div> <div class="trans RegionItem RegionSelected TextS1" tid="t48" region="Asia-Pacific" onclick="ChooseRegion('Asia-Pacific')">Asia-Pacific</div>
<div class="RegionItem" region="China" onclick="ChooseRegion('China')" data-i18n="china">China</div> <div class="trans RegionItem" tid="t49" region="China" onclick="ChooseRegion('China')">China</div>
<div class="RegionItem" region="Europe" onclick="ChooseRegion('Europe')" data-i18n="europe">Europe</div> <div class="trans RegionItem" tid="t60" region="Europe" onclick="ChooseRegion('Europe')">Europe</div>
<div class="RegionItem" region="North America" onclick="ChooseRegion('North America')" data-i18n="north_america">North America</div> <div class="trans RegionItem" tid="t61" region="North America" onclick="ChooseRegion('North America')">North America</div>
<div class="RegionItem" region="Others" onclick="ChooseRegion('Others')" data-i18n="others">Others</div> <div class="trans RegionItem" tid="t62" region="Others" onclick="ChooseRegion('Others')">Others</div>
</div> </div>
<!-- <div id="ChangeTip"> <!-- <div id="ChangeTip">
<div><img class="TipIcon" src="tip.png" /></div> <div><img class="TipIcon" src="tip.png" /></div>
@@ -34,7 +34,7 @@
</div>--> </div>-->
</div> </div>
<div id="AcceptArea"> <div id="AcceptArea">
<div class="ButtonStyleConfirm ButtonTypeChoice" id="AcceptBtn" onclick="GotoPolicyPage()" data-i18n="next">Next</div> <div class="ButtonStyleConfirm ButtonTypeChoice trans" id="AcceptBtn" tid="t9" onclick="GotoPolicyPage()">Next</div>
</div> </div>
</body> </body>
</html> </html>
+10 -11
View File
@@ -50,17 +50,17 @@ function HandleStudio( pVal )
let hasError = pVal.hasOwnProperty("error"); let hasError = pVal.hasOwnProperty("error");
noticeBar.classList.toggle("notice-error", hasError); noticeBar.classList.toggle("notice-error", hasError);
if (hasError) { if (hasError) {
noticeBar.textContent = T("error", "Error"); noticeBar.textContent = "Error";
noticeText.textContent = pVal["error"]; noticeText.textContent = pVal["error"];
} else if (pVal["vendors"] && pVal["vendors"].length > 0) { } else if (pVal["vendors"] && pVal["vendors"].length > 0) {
noticeBar.textContent = T("new_printers_found", "New printers found"); noticeBar.textContent = "New printers found";
noticeText.textContent = T("new_vendors_installed", "New printer vendors installed: %s", pVal["vendors"].join(", ")); noticeText.textContent = "New printer vendors installed: " + pVal["vendors"].join(", ");
} else if (pVal["declined"]) { } else if (pVal["declined"]) {
noticeBar.textContent = T("information", "Information"); noticeBar.textContent = "Information";
noticeText.textContent = T("vendors_declined", "New printer vendors were found, but installation was cancelled."); noticeText.textContent = "New printer vendors were found, but installation was cancelled.";
} else { } else {
noticeBar.textContent = T("information", "Information"); noticeBar.textContent = "Information";
noticeText.textContent = T("no_new_printers", "No new printers found."); noticeText.textContent = "No new printers found.";
} }
ShowNotice(1); ShowNotice(1);
@@ -272,7 +272,7 @@ function CreateVendorBlock(vendorName)
if( alt == "BBL" ) if( alt == "BBL" )
alt = "Bambu Lab"; alt = "Bambu Lab";
if( alt == "Custom") if( alt == "Custom")
alt = T("custom_printer", "Custom Printer"); alt = "Custom Printer";
if( alt == "Other") if( alt == "Other")
alt = "Orca colosseum"; alt = "Orca colosseum";
@@ -315,7 +315,7 @@ function CreatePrinterBlock(OneModel)
' </div>'+ ' </div>'+
' <div class="PrinterInfoMark">?</div>'+ ' <div class="PrinterInfoMark">?</div>'+
' <div class="PrinterInfo">'+ ' <div class="PrinterInfo">'+
' <div class="title">' + T("nozzle", "Nozzle") + '</div>'+ ' <div class="title trans">Nozzle</div>'+
' <div class="value">' + OneModel['nozzle_diameter'].replaceAll(";", " · ") + '</div>'+ ' <div class="value">' + OneModel['nozzle_diameter'].replaceAll(";", " · ") + '</div>'+
' </div>'+ ' </div>'+
' <div style="display: flex;">'+ ' <div style="display: flex;">'+
@@ -377,8 +377,7 @@ function OnExit()
if( nTotal==0 ) { if( nTotal==0 ) {
let noticeBar = document.getElementById("NoticeBar"); let noticeBar = document.getElementById("NoticeBar");
noticeBar.classList.add("notice-error"); noticeBar.classList.add("notice-error");
noticeBar.textContent = T("error", "Error"); noticeBar.textContent = "Error";
document.getElementById("NoticeText").textContent = T("printer_required", "At least one printer must be selected.");
ShowNotice(1); ShowNotice(1);
return 0; return 0;
} }
+9 -9
View File
@@ -12,7 +12,7 @@
<script type="text/javascript" src="test.js"></script> <script type="text/javascript" src="test.js"></script>
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script> <script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script> <script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script> <script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script> <script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../21/common.js"></script> <!-- ORCA use common sources for setup guide and standalone dialog --> <script type="text/javascript" src="../21/common.js"></script> <!-- ORCA use common sources for setup guide and standalone dialog -->
@@ -20,12 +20,12 @@
</head> </head>
<body onLoad="OnInit()"> <body onLoad="OnInit()">
<div id="Title"> <div id="Title">
<div data-i18n="printer_selection">Printer Selection</div> <div class="trans" tid="t10">Printer Selection</div>
</div> </div>
<div id="SidebarContainer"> <div id="SidebarContainer">
<div id="Sidebar" class="thin-scroll"> <div id="Sidebar" class="thin-scroll">
<div class="title" data-i18n="vendors">Vendors</div> <div class="title">Vendors</div>
<div class="area" id="SidebarVendors"> <div class="area" id="SidebarVendors">
<!-- <div class="SidebarItem"></div> --> <!-- <div class="SidebarItem"></div> -->
</div> </div>
@@ -39,7 +39,7 @@
<div class="search" hasvalue="0"> <div class="search" hasvalue="0">
<div class="search-icon icon16"></div> <div class="search-icon icon16"></div>
<input type="text" class="searchTerm" placeholder=" " oninput="textInput(this)"> <input type="text" class="searchTerm" placeholder=" " oninput="textInput(this)">
<span class="search-placeholder" data-i18n="search">Search</span> <span class="search-placeholder trans">Search...</span>
</div> </div>
<div class="LayoutSelector"> <div class="LayoutSelector">
<div class="TabGroup"> <div class="TabGroup">
@@ -81,17 +81,17 @@
</div> </div>
<div id="AcceptArea"> <div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice" id="PreBtn" onclick="window.open('../1/index.html','_self')" data-i18n="back">Back</div> <div class="ButtonStyleRegular ButtonTypeChoice trans" id="PreBtn" tid="t8" onclick="window.open('../1/index.html','_self')">Back</div>
<div class="ButtonStyleConfirm ButtonTypeChoice" id="AcceptBtn" onclick="GotoFilamentPage()" data-i18n="next">Next</div> <div class="ButtonStyleConfirm ButtonTypeChoice trans" id="AcceptBtn" tid="t9" onclick="GotoFilamentPage()">Next</div>
</div> </div>
<div id="NoticeMask"></div> <div id="NoticeMask"></div>
<div id="NoticeBody"> <div id="NoticeBody">
<div id="NoticeBar" data-i18n="error">Error</div> <div id="NoticeBar" class="trans" tid="t18">error</div>
<div id="NoticeContent"> <div id="NoticeContent">
<div id="NoticeText" data-i18n="printer_required">At least one printer must be selected.</div> <div id="NoticeText" class="trans" tid="t37">At least one printer must be selected.</div>
<div id="NoticeBtns"> <div id="NoticeBtns">
<div class="ButtonStyleConfirm ButtonTypeChoice" onClick="ShowNotice(0)" data-i18n="ok">OK</div> <div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t36" onClick="ShowNotice(0)">ok</div>
</div> </div>
</div> </div>
</div> </div>
+27 -27
View File
@@ -12,7 +12,7 @@
<script type="text/javascript" src="test.js"></script> <script type="text/javascript" src="test.js"></script>
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script> <script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script> <script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script> <script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script> <script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../22/common.js"></script> <!-- ORCA use common sources for setup guide and standalone dialog --> <script type="text/javascript" src="../22/common.js"></script> <!-- ORCA use common sources for setup guide and standalone dialog -->
@@ -20,7 +20,7 @@
</head> </head>
<body onLoad="OnInit()"> <body onLoad="OnInit()">
<div id="Title"> <div id="Title">
<div data-i18n="filament_selection">Filament Selection</div> <div class="trans" tid="t14">Filament Selection</div>
</div> </div>
<div id="Content" class="ZScrol"> <div id="Content" class="ZScrol">
<!-- ORCA column browser --> <!-- ORCA column browser -->
@@ -29,14 +29,14 @@
<div class="cbr-column-title-container"> <div class="cbr-column-title-container">
<div class="search-icon"></div> <div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="1"/> <input type="text" class="cbr-search-bar" placeholder=" " tabindex="1"/>
<span class="cbr-search-placeholder" data-i18n="printer">Printer</span> <span class="cbr-search-placeholder trans" tid="t15">printer</span>
<div class="clear-icon"></div> <div class="clear-icon"></div>
</div> </div>
<div class="cbr-content thin-scroll" id="MachineList"> <div class="cbr-content thin-scroll" id="MachineList">
<div class="CValues"> <div class="CValues">
<label><input type="checkbox" mode="all" onClick="ChooseAllMachine()" /><span data-i18n="all">All</span></label> <label><input type="checkbox" mode="all" onClick="ChooseAllMachine()" /><span class="trans" tid="t11">all</span></label>
</div> </div>
<div class="cbr-no-items" data-i18n="no_items">No items</div> <div class="cbr-no-items">No items</div>
</div> </div>
</div> </div>
@@ -44,14 +44,14 @@
<div class="cbr-column-title-container"> <div class="cbr-column-title-container">
<div class="search-icon"></div> <div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="2"/> <input type="text" class="cbr-search-bar" placeholder=" " tabindex="2"/>
<span class="cbr-search-placeholder" data-i18n="filament_type">Filament type</span> <span class="cbr-search-placeholder trans" tid="t16">filament type</span>
<div class="clear-icon"></div> <div class="clear-icon"></div>
</div> </div>
<div class="cbr-content thin-scroll" id="FilatypeList"> <div class="cbr-content thin-scroll" id="FilatypeList">
<div class="CValues"> <div class="CValues">
<label><input type="checkbox" onClick="ChooseAllFilament()" /><span data-i18n="all">All</span></label> <label><input type="checkbox" class="trans" tid="t11" onClick="ChooseAllFilament()" /><span class="trans" tid="t11">all</span></label>
</div> </div>
<div class="cbr-no-items" data-i18n="no_items">No items</div> <div class="cbr-no-items">No items</div>
</div> </div>
</div> </div>
@@ -59,14 +59,14 @@
<div class="cbr-column-title-container"> <div class="cbr-column-title-container">
<div class="search-icon"></div> <div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="3"/> <input type="text" class="cbr-search-bar" placeholder=" " tabindex="3"/>
<span class="cbr-search-placeholder" data-i18n="vendor">Vendor</span> <span class="cbr-search-placeholder trans" tid="t17">vendor</span>
<div class="clear-icon"></div> <div class="clear-icon"></div>
</div> </div>
<div class="cbr-content thin-scroll" id="VendorList"> <div class="cbr-content thin-scroll" id="VendorList">
<div class="CValues"> <div class="CValues">
<label><input type="checkbox" onClick="ChooseAllVendor()" /><span data-i18n="all">All</span></label> <label><input type="checkbox" class="trans" tid="t11" onClick="ChooseAllVendor()" /><span class="trans" tid="t11">all</span></label>
</div> </div>
<div class="cbr-no-items" data-i18n="no_items">No items</div> <div class="cbr-no-items">No items</div>
</div> </div>
</div> </div>
@@ -75,48 +75,48 @@
<div class="cbr-filter-box"> <div class="cbr-filter-box">
<div class="filter-icon"></div> <div class="filter-icon"></div>
<input type="text" class="cbr-filter-bar" placeholder=" " tabindex="4"/> <input type="text" class="cbr-filter-bar" placeholder=" " tabindex="4"/>
<span class="cbr-filter-placeholder" data-i18n="filter_items">Filter items</span> <span class="cbr-filter-placeholder trans">Filter items</span>
<div class="clear-icon"></div> <div class="clear-icon"></div>
</div> </div>
<div class="ComboBox NoLabel"> <div class="ComboBox NoLabel">
<div class="arrow-icon"></div> <div class="arrow-icon"></div>
<select id="filter-tags"> <select id="filter-tags">
<option value="0" disabled selected hidden></option> <option value="0" disabled selected hidden></option>
<option value="1" data-i18n="checked">Checked</option> <option value="1">Checked</option>
<option value="2" data-i18n="unchecked">Unchecked</option> <option value="2">Unchecked</option>
</select> </select>
</div> </div>
<div class="list-item-count"></div> <div class="list-item-count"></div>
<div class="cbr-filter-btns"> <div class="cbr-filter-btns">
<span class="cbr-filter-mode-filter" data-i18n="select_filtered">Select filtered</span> <span class="cbr-filter-mode-filter trans">Select filtered</span>
<span class="cbr-filter-mode-visible" data-i18n="select_visible">Select visible</span> <span class="cbr-filter-mode-visible trans">Select visible</span>
<div class="ButtonStyleConfirm ButtonTypeWindow" onClick="SelectAllFilament(1)" data-i18n="all">All</div> <div class="ButtonStyleConfirm ButtonTypeWindow trans" tid="t11" onClick="SelectAllFilament(1)">all</div>
<div class="ButtonStyleRegular ButtonTypeWindow" onClick="SelectAllFilament(0)" data-i18n="clear_all">Clear all</div> <div class="ButtonStyleRegular ButtonTypeWindow trans" tid="t12" onClick="SelectAllFilament(0)">Clear all</div>
</div> </div>
</div> </div>
<div class="cbr-content thin-scroll" id="ItemBlockArea"> <div class="cbr-content thin-scroll" id="ItemBlockArea">
<!-- <label class="MItem"><input type="checkbox" class="trans" tid="t11" onClick="SelectAllFilament()" /><span class="trans" tid="t11">all</span></label> --> <!-- <label class="MItem"><input type="checkbox" class="trans" tid="t11" onClick="SelectAllFilament()" /><span class="trans" tid="t11">all</span></label> -->
<div class="cbr-no-items" data-i18n="no_items">No items</div> <div class="cbr-no-items">No items</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div id="AcceptArea"> <div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice" id="PreBtn" onclick="ReturnPreviewPage()" data-i18n="back">Back</div> <div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t8" id="PreBtn" onclick="ReturnPreviewPage()">Back</div>
<div class="ButtonStyleRegular ButtonTypeChoice" id="AcceptBtn" onclick="FinishGuide()" data-i18n="finish">Finish</div> <div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t25" id="AcceptBtn" onclick="FinishGuide()">finish</div>
<div class="ButtonStyleConfirm ButtonTypeChoice" id="GotoNetPluginBtn" onclick="GotoNetPluginPage()" data-i18n="next">Next</div> <div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t9" id="GotoNetPluginBtn" onclick="GotoNetPluginPage()">Next</div>
</div> </div>
<div id="NoticeMask"> <div id="NoticeMask">
</div> </div>
<div id="NoticeBody"> <div id="NoticeBody">
<div id="NoticeBar" data-i18n="error">Error</div> <div id="NoticeBar" class="trans" tid="t18">error</div>
<div id="NoticeContent"> <div id="NoticeContent">
<div id="NoticeText" data-i18n="filament_required">At least one filament must be selected.</div> <div id="NoticeText" class="trans" tid="t19">At least one filament must be selected. </div>
<div id="NoticeText" data-i18n="use_default_filament">Do you want to use the default filament?</div> <div id="NoticeText" class="trans" tid="t20">Do you want to use default filament ?</div>
<div id="NoticeBtns"> <div id="NoticeBtns">
<div class="ButtonStyleConfirm ButtonTypeChoice" onClick="ChooseDefaultFilament()" data-i18n="yes">Yes</div> <div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t21" onClick="ChooseDefaultFilament()">Yes</div>
<div class="ButtonStyleRegular ButtonTypeChoice" onClick="ShowNotice(0)" data-i18n="no">No</div> <div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t22" onClick="ShowNotice(0)">No</div>
</div> </div>
</div> </div>
</div> </div>
+28 -28
View File
@@ -11,7 +11,7 @@
<link rel="stylesheet" type="text/css" href="../css/dark.css" /> <link rel="stylesheet" type="text/css" href="../css/dark.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script> <script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script> <script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script> <script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script> <script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../22/common.js"></script> <!-- ORCA use common sources for setup guide and standalone dialog --> <script type="text/javascript" src="../22/common.js"></script> <!-- ORCA use common sources for setup guide and standalone dialog -->
@@ -19,8 +19,8 @@
</head> </head>
<body onLoad="OnInit()"> <body onLoad="OnInit()">
<div id="Title"> <div id="Title">
<div id="SystemFilamentBtn" class="TitleSelected" onClick="OnSelectMenu(1)" data-i18n="system_filaments">System Filaments</div> <div id="SystemFilamentBtn" class="TitleSelected trans" tid="t109" onClick="OnSelectMenu(1)">System Filaments</div>
<div id="CustomFilamentBtn" class="TitleUnselected" onClick="OnSelectMenu(2)" data-i18n="custom_filaments">Custom Filaments</div> <div id="CustomFilamentBtn" class="TitleUnselected trans" tid="t110" onClick="OnSelectMenu(2)">Custom Filaments</div>
</div> </div>
<div id="Content" class="ZScrol"> <div id="Content" class="ZScrol">
@@ -32,14 +32,14 @@
<div class="cbr-column-title-container"> <div class="cbr-column-title-container">
<div class="search-icon"></div> <div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="1"/> <input type="text" class="cbr-search-bar" placeholder=" " tabindex="1"/>
<span class="cbr-search-placeholder" data-i18n="printer">Printer</span> <span class="cbr-search-placeholder trans" tid="t15">printer</span>
<div class="clear-icon"></div> <div class="clear-icon"></div>
</div> </div>
<div class="cbr-content thin-scroll" id="MachineList"> <div class="cbr-content thin-scroll" id="MachineList">
<div class="CValues"> <div class="CValues">
<label><input type="checkbox" mode="all" onClick="ChooseAllMachine()" /><span data-i18n="all">All</span></label> <label><input type="checkbox" mode="all" onClick="ChooseAllMachine()" /><span class="trans" tid="t11">all</span></label>
</div> </div>
<div class="cbr-no-items" data-i18n="no_items">No items</div> <div class="cbr-no-items">No items</div>
</div> </div>
</div> </div>
@@ -47,14 +47,14 @@
<div class="cbr-column-title-container"> <div class="cbr-column-title-container">
<div class="search-icon"></div> <div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="2"/> <input type="text" class="cbr-search-bar" placeholder=" " tabindex="2"/>
<span class="cbr-search-placeholder" data-i18n="filament_type">Filament type</span> <span class="cbr-search-placeholder trans" tid="t16">filament type</span>
<div class="clear-icon"></div> <div class="clear-icon"></div>
</div> </div>
<div class="cbr-content thin-scroll" id="FilatypeList"> <div class="cbr-content thin-scroll" id="FilatypeList">
<div class="CValues"> <div class="CValues">
<label><input type="checkbox" onClick="ChooseAllFilament()" /><span data-i18n="all">All</span></label> <label><input type="checkbox" class="trans" tid="t11" onClick="ChooseAllFilament()" /><span class="trans" tid="t11">all</span></label>
</div> </div>
<div class="cbr-no-items" data-i18n="no_items">No items</div> <div class="cbr-no-items">No items</div>
</div> </div>
</div> </div>
@@ -62,14 +62,14 @@
<div class="cbr-column-title-container"> <div class="cbr-column-title-container">
<div class="search-icon"></div> <div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="3"/> <input type="text" class="cbr-search-bar" placeholder=" " tabindex="3"/>
<span class="cbr-search-placeholder" data-i18n="vendor">Vendor</span> <span class="cbr-search-placeholder trans" tid="t17">vendor</span>
<div class="clear-icon"></div> <div class="clear-icon"></div>
</div> </div>
<div class="cbr-content thin-scroll" id="VendorList"> <div class="cbr-content thin-scroll" id="VendorList">
<div class="CValues"> <div class="CValues">
<label><input type="checkbox" onClick="ChooseAllVendor()" /><span data-i18n="all">All</span></label> <label><input type="checkbox" class="trans" tid="t11" onClick="ChooseAllVendor()" /><span class="trans" tid="t11">all</span></label>
</div> </div>
<div class="cbr-no-items" data-i18n="no_items">No items</div> <div class="cbr-no-items">No items</div>
</div> </div>
</div> </div>
@@ -78,28 +78,28 @@
<div class="cbr-filter-box"> <div class="cbr-filter-box">
<div class="filter-icon"></div> <div class="filter-icon"></div>
<input type="text" class="cbr-filter-bar" placeholder=" " tabindex="4"/> <input type="text" class="cbr-filter-bar" placeholder=" " tabindex="4"/>
<span class="cbr-filter-placeholder" data-i18n="filter_items">Filter items</span> <span class="cbr-filter-placeholder trans">Filter items</span>
<div class="clear-icon"></div> <div class="clear-icon"></div>
</div> </div>
<div class="ComboBox NoLabel"> <div class="ComboBox NoLabel">
<div class="arrow-icon"></div> <div class="arrow-icon"></div>
<select id="filter-tags"> <select id="filter-tags">
<option value="0" disabled selected hidden></option> <option value="0" disabled selected hidden></option>
<option value="1" data-i18n="checked">Checked</option> <option value="1">Checked</option>
<option value="2" data-i18n="unchecked">Unchecked</option> <option value="2">Unchecked</option>
</select> </select>
</div> </div>
<div class="list-item-count"></div> <div class="list-item-count"></div>
<div class="cbr-filter-btns"> <div class="cbr-filter-btns">
<span class="cbr-filter-mode-filter" data-i18n="select_filtered">Select filtered</span> <span class="cbr-filter-mode-filter trans">Select filtered</span>
<span class="cbr-filter-mode-visible" data-i18n="select_visible">Select visible</span> <span class="cbr-filter-mode-visible trans">Select visible</span>
<div class="ButtonStyleConfirm ButtonTypeWindow" onClick="SelectAllFilament(1)" data-i18n="all">All</div> <div class="ButtonStyleConfirm ButtonTypeWindow trans" tid="t11" onClick="SelectAllFilament(1)">all</div>
<div class="ButtonStyleRegular ButtonTypeWindow" onClick="SelectAllFilament(0)" data-i18n="clear_all">Clear all</div> <div class="ButtonStyleRegular ButtonTypeWindow trans" tid="t12" onClick="SelectAllFilament(0)">Clear all</div>
</div> </div>
</div> </div>
<div class="cbr-content thin-scroll" id="ItemBlockArea"> <div class="cbr-content thin-scroll" id="ItemBlockArea">
<!-- <label class="MItem"><input type="checkbox" class="trans" tid="t11" onClick="SelectAllFilament()" /><span class="trans" tid="t11">all</span></label> --> <!-- <label class="MItem"><input type="checkbox" class="trans" tid="t11" onClick="SelectAllFilament()" /><span class="trans" tid="t11">all</span></label> -->
<div class="cbr-no-items" data-i18n="no_items">No items</div> <div class="cbr-no-items">No items</div>
</div> </div>
</div> </div>
</div> </div>
@@ -108,7 +108,7 @@
<div id="CustomFilamentsArea"> <div id="CustomFilamentsArea">
<div id="CFilament_Btn_Area"> <div id="CFilament_Btn_Area">
<div class="ButtonStyleConfirm ButtonTypeWindow" onClick="OnClickCustomFilamentAdd()" data-i18n="create_new">Create New</div> <div class="ButtonStyleConfirm ButtonTypeWindow trans" tid="t111" onClick="OnClickCustomFilamentAdd()">Create New</div>
</div> </div>
<div id="CFilament_List" class="thin-scroll"> <div id="CFilament_List" class="thin-scroll">
</div> </div>
@@ -116,19 +116,19 @@
</div> </div>
<div id="AcceptArea"> <div id="AcceptArea">
<div class="ButtonStyleConfirm ButtonTypeChoice" id="AcceptBtn" onclick="ConfirmSelect()" data-i18n="confirm">Confirm</div> <div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t39" id="AcceptBtn" onclick="ConfirmSelect()">Confirm</div>
<div class="ButtonStyleRegular ButtonTypeChoice" id="PreBtn" onclick="CancelSelect()" data-i18n="cancel">Cancel</div> <div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t38" id="PreBtn" onclick="CancelSelect()">Cancel</div>
</div> </div>
<div id="NoticeMask"> <div id="NoticeMask">
</div> </div>
<div id="NoticeBody"> <div id="NoticeBody">
<div id="NoticeBar" data-i18n="error">Error</div> <div id="NoticeBar" class="trans" tid="t18">error</div>
<div id="NoticeContent"> <div id="NoticeContent">
<div id="NoticeText" data-i18n="filament_required">At least one filament must be selected.</div> <div id="NoticeText" class="trans" tid="t19">At least one filament must be selected. </div>
<div id="NoticeText" data-i18n="use_default_filament">Do you want to use the default filament?</div> <div id="NoticeText" class="trans" tid="t20">Do you want to use default filament ?</div>
<div id="NoticeBtns"> <div id="NoticeBtns">
<div class="ButtonStyleConfirm ButtonTypeChoice" onClick="ChooseDefaultFilament()" data-i18n="yes">Yes</div> <div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t21" onClick="ChooseDefaultFilament()">yes</div>
<div class="ButtonStyleRegular ButtonTypeChoice" onClick="ShowNotice(0)" data-i18n="no">No</div> <div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t22" onClick="ShowNotice(0)">no</div>
</div> </div>
</div> </div>
</div> </div>
+11 -11
View File
@@ -12,7 +12,7 @@
<!-- <script type="text/javascript" src="test.js"></script> --> <!-- <script type="text/javascript" src="test.js"></script> -->
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script> <script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script> <script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script> <script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script> <script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../21/common.js"></script> <!-- ORCA use common sources for setup guide and standalone dialog --> <script type="text/javascript" src="../21/common.js"></script> <!-- ORCA use common sources for setup guide and standalone dialog -->
@@ -20,12 +20,12 @@
</head> </head>
<body onLoad="OnInit()"> <body onLoad="OnInit()">
<div id="Title"> <div id="Title">
<div data-i18n="printer_selection">Printer Selection</div> <div class="trans" tid="t10">Printer Selection</div>
</div> </div>
<div id="SidebarContainer"> <div id="SidebarContainer">
<div id="Sidebar" class="thin-scroll"> <div id="Sidebar" class="thin-scroll">
<div class="title" data-i18n="vendors">Vendors</div> <div class="title">Vendors</div>
<div class="area" id="SidebarVendors"> <div class="area" id="SidebarVendors">
<!-- <div class="SidebarItem"></div> --> <!-- <div class="SidebarItem"></div> -->
</div> </div>
@@ -39,7 +39,7 @@
<div class="search" hasvalue="0"> <div class="search" hasvalue="0">
<div class="search-icon icon16"></div> <div class="search-icon icon16"></div>
<input type="text" class="searchTerm" placeholder=" " oninput="textInput(this)"> <input type="text" class="searchTerm" placeholder=" " oninput="textInput(this)">
<span class="search-placeholder" data-i18n="search">Search</span> <span class="search-placeholder trans">Search...</span>
</div> </div>
<div class="LayoutSelector"> <div class="LayoutSelector">
<div class="TabGroup"> <div class="TabGroup">
@@ -81,19 +81,19 @@
</div> </div>
<div id="AcceptArea"> <div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice" id="CreateBtn" onclick="CreateNewPrinter()" data-i18n="create">Create</div> <div class="ButtonStyleRegular ButtonTypeChoice trans" id="CreateBtn" onclick="CreateNewPrinter()">Create</div>
<div class="ButtonStyleRegular ButtonTypeChoice" id="CheckNewPrintersBtn" onclick="CheckForNewPrinters()" data-i18n="check_new_printers">Check for new printers</div> <div class="ButtonStyleRegular ButtonTypeChoice" id="CheckNewPrintersBtn" onclick="CheckForNewPrinters()">Check for new printers</div>
<div class="ButtonStyleConfirm ButtonTypeChoice" id="AcceptBtn" onclick="ConfirmSelect()" data-i18n="confirm">Confirm</div> <div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t39" id="AcceptBtn" onclick="ConfirmSelect()">Confirm</div>
<div class="ButtonStyleRegular ButtonTypeChoice" id="PreBtn" onclick="CancelSelect()" data-i18n="cancel">Cancel</div> <div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t38" id="PreBtn" onclick="CancelSelect()">Cancel</div>
</div> </div>
<div id="NoticeMask"></div> <div id="NoticeMask"></div>
<div id="NoticeBody"> <div id="NoticeBody">
<div id="NoticeBar" data-i18n="error">Error</div> <div id="NoticeBar" class="trans" tid="t18">error</div>
<div id="NoticeContent"> <div id="NoticeContent">
<div id="NoticeText" data-i18n="printer_required">At least one printer must be selected.</div> <div id="NoticeText" class="trans" tid="t37">At least one printer must be selected.</div>
<div id="NoticeBtns"> <div id="NoticeBtns">
<div class="ButtonStyleConfirm ButtonTypeChoice" onClick="ShowNotice(0)" data-i18n="ok">OK</div> <div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t36" onClick="ShowNotice(0)">ok</div>
</div> </div>
</div> </div>
</div> </div>
+46
View File
@@ -0,0 +1,46 @@
.PolicyArea
{
background-color: #4A4A51;
}
#PolicyTxt
{
padding: 12px;
word-wrap:break-word;
overflow-y: auto;
min-height: 200px;
text-indent: 2em;
border-style: solid;
border-width: 1px;
border-color: #D7D7D7;
}
#PolicyTxt::-webkit-scrollbar {/*滚动条整体样式*/
width: 5px; /*高宽分别对应横竖滚动条的尺寸*/
height: 1px;
}
#PolicyTxt::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background-color: #AAAAAA;
}
#PolicyTxt::-webkit-scrollbar-track {/*滚动条里面轨道*/
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
border-radius: 10px;
background: #EDEDED;
}
#C_List li
{
margin-left: 4em;
}
p
{
text-indent:2em;
margin-bottom: 2px;
}
+80
View File
@@ -0,0 +1,80 @@
function OnInit()
{
TranslatePage();
SendPrivacySelect();
}
function SendPrivacySelect()
{
let nVal="refuse";
if( $('#ChoosePrivacy').is(':checked') )
nVal="agree";
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="user_private_choice";
tSend['data']={};
tSend['data']['action']=nVal;
SendWXMessage( JSON.stringify(tSend) );
}
function GotoNextPage()
{
RequestProfile();
}
function RequestProfile()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="request_userguide_profile";
SendWXMessage( JSON.stringify(tSend) );
}
function HandleStudio( pVal )
{
let strCmd=pVal['command'];
//alert(strCmd);
if(strCmd=='response_userguide_profile')
{
HandleModelInfo(pVal['response']);
}
}
function HandleModelInfo( pVal )
{
let Modellist=pVal["model"];
let nModel=Modellist.length;
if(nModel==1)
{
// let pModel=Modellist[0];
//
// var tSend={};
// tSend['sequence_id']=Math.round(new Date() / 1000);
// tSend['command']="save_userguide_models";
// tSend['data']={};
//
// let ModelName=pModel['model'];
//
// tSend['data'][ModelName]={};
// tSend['data'][ModelName]['model']=pModel['model'];
// tSend['data'][ModelName]['nozzle_diameter']=pModel['nozzle_diameter'];
// tSend['data'][ModelName]['vendor']=pModel['vendor'];
//
// SendWXMessage( JSON.stringify(tSend) );
window.location.href="../22/index.html";
return;
}
window.location.href="../21/index.html";
}
+40
View File
@@ -0,0 +1,40 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Cache-Control" content="max-age=7200" />
<title>引导_P1</title>
<link rel="stylesheet" type="text/css" href="../../include/global.css" /> <!-- ORCA One for all-->
<link rel="stylesheet" type="text/css" href="../css/common.css" />
<link rel="stylesheet" type="text/css" href="3.css" />
<link rel="stylesheet" type="text/css" href="../css/dark.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="./3.js"></script>
</head>
<body onLoad="OnInit()">
<div id="Title">
<div class="trans" tid="t6">We kindly request your help to improve<br/> everyone's printing</div>
</div>
<div id="Content">
<div id="PolicyTxt" class="TextS2 TextArea1 ZScrol">
<a class="trans" tid="t54">In the 3D Printing community, we learn from each other’s successes and failures to adjust our own slicing parameters and settings. Orca Slicer follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training Orca Slicer to be smarter by feeding them the real-world data. If you are willing, this service will access information from your error logs and usage logs, which may include information described in </a><a class="HyperLink trans" tid="t55" href="https://bambulab.com/policies/privacy" target="_blank">Privacy Policy</a><a class="trans" tid="t56">
. We will not collect any Personal Data by which an individual can be identified directly or indirectly, including without limitation names, addresses, payment information, or phone numbers. By enabling this service, you agree to these terms and the statement about Privacy Policy.
</a>
</div>
<br/>
<label> <!-- ORCA use label tag to allow checkbox to toggle when user clicked to text -->
<input id="ChoosePrivacy" type="checkbox" onClick="SendPrivacySelect()" onChange="SendPrivacySelect()" />
<span class="trans TextS1" tid="t7">Allow sending anonymous data</span>
</label>
</div>
<div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t8" id="PreBtn" onclick="window.open('../11/index.html','_self')">Back</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t9" id="AcceptBtn" onclick="GotoNextPage()">Next</div>
</div>
</body>
</html>
+40
View File
@@ -0,0 +1,40 @@
#PolicyTxt
{
background-color: #EBEBEB;
padding: 12px;
word-wrap:break-word;
overflow-y: scroll;
min-height: 200px;
text-indent: 2em;
}
#PolicyTxt::-webkit-scrollbar {/*滚动条整体样式*/
width: 5px; /*高宽分别对应横竖滚动条的尺寸*/
height: 1px;
}
#PolicyTxt::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background-color: #AAAAAA;
}
#PolicyTxt::-webkit-scrollbar-track {/*滚动条里面轨道*/
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
border-radius: 10px;
background: #EDEDED;
}
#C_List li
{
margin-left: 4em;
}
p
{
text-indent:2em;
margin-bottom: 2px;
}
+80
View File
@@ -0,0 +1,80 @@
function OnInit()
{
TranslatePage();
SendPrivacySelect();
}
function SendPrivacySelect()
{
let nVal="refuse";
if( $('#ChoosePrivacy').is(':checked') )
nVal="agree";
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="user_private_choice";
tSend['data']={};
tSend['data']['action']=nVal;
SendWXMessage( JSON.stringify(tSend) );
}
function GotoNextPage()
{
RequestProfile();
}
function RequestProfile()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="request_userguide_profile";
SendWXMessage( JSON.stringify(tSend) );
}
function HandleStudio( pVal )
{
let strCmd=pVal['command'];
//alert(strCmd);
if(strCmd=='response_userguide_profile')
{
HandleModelInfo(pVal['response']);
}
}
function HandleModelInfo( pVal )
{
let Modellist=pVal["model"];
let nModel=Modellist.length;
if(nModel==1)
{
// let pModel=Modellist[0];
//
// var tSend={};
// tSend['sequence_id']=Math.round(new Date() / 1000);
// tSend['command']="save_userguide_models";
// tSend['data']={};
//
// let ModelName=pModel['model'];
//
// tSend['data'][ModelName]={};
// tSend['data'][ModelName]['model']=pModel['model'];
// tSend['data'][ModelName]['nozzle_diameter']=pModel['nozzle_diameter'];
// tSend['data'][ModelName]['vendor']=pModel['vendor'];
//
// SendWXMessage( JSON.stringify(tSend) );
window.location.href="../22/index.html";
return;
}
window.location.href="../21/index.html";
}
+39
View File
@@ -0,0 +1,39 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Cache-Control" content="max-age=7200" />
<title>引导_P1</title>
<link rel="stylesheet" type="text/css" href="../../include/global.css" /> <!-- ORCA One for all-->
<link rel="stylesheet" type="text/css" href="../css/common.css" />
<link rel="stylesheet" type="text/css" href="31.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="./31.js"></script>
</head>
<body onLoad="OnInit()">
<div id="Title">
<div class="trans" tid="t6">We kindly request your help to improve<br/> everyone's printing</div>
</div>
<div id="Content">
<div id="PolicyTxt">
<a class="trans" tid="t54">In the 3D Printing community, we learn from each other’s successes and failures to adjust our own slicing parameters and settings. Orca Slicer follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training Orca Slicer to be smarter by feeding them the real-world data. If you are willing, this service will access information from your error logs and usage logs, which may include information described in </a><a class="HyperLink trans" tid="t55" href="https://bambulab.com/policies/privacy" target="_blank">Privacy Policy</a><a class="trans" tid="t56">
. We will not collect any Personal Data by which an individual can be identified directly or indirectly, including without limitation names, addresses, payment information, or phone numbers. By enabling this service, you agree to these terms and the statement about Privacy Policy.
</a>
</div>
<br/>
<label><!-- ORCA use label tag to allow checkbox to toggle when user clicked to text -->
<input id="ChoosePrivacy" type="checkbox" onClick="SendPrivacySelect()" onChange="SendPrivacySelect()" />
<span class="trans" tid="t7">Allow sending anonymous data</span>
</label>
</div>
<div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t8" id="PreBtn" onclick="window.open('../11/index.html','_self')">Back</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t9" id="AcceptBtn" onclick="GotoNextPage()">Next</div>
</div>
</body>
</html>
+8 -8
View File
@@ -10,32 +10,32 @@
<link rel="stylesheet" type="text/css" href="4orca.css" /> <link rel="stylesheet" type="text/css" href="4orca.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script> <script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script> <script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script> <script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script> <script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="4orca.js"></script> <script type="text/javascript" src="4orca.js"></script>
</head> </head>
<body onLoad="OnInit()"> <body onLoad="OnInit()">
<div id="Title"> <div id="Title">
<div data-i18n="stealth_mode">Stealth Mode</div> <div class="trans" tid="orca3">Stealth Mode</div>
</div> </div>
<div id="Content"> <div id="Content">
<div id="FeatureText"> <div id="FeatureText">
<div><a class="TextS1" data-i18n="stealth_mode_desc">This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option.</a></div> <div><a tid="orca4" class="trans TextS1">This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option.</a></div>
<br/> <br/>
<div><a class="TextS2" data-i18n="stealth_mode_note">Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud.</a></div> <div><a tid="orca12" class="trans TextS2">Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud.</a></div>
</div> </div>
<!-- ORCA use label tag to allow checkbox to toggle when user clicked to text --> <!-- ORCA use label tag to allow checkbox to toggle when user clicked to text -->
<label id="CheckArea"><input id="StealthMode" onClick="SendStealthModeCheck()" type="checkbox"><a class="TextS1" data-i18n="enable_stealth_mode">Enable Stealth Mode.</a></label> <label id="CheckArea"><input id="StealthMode" onClick="SendStealthModeCheck()" type="checkbox"><a tid="orca5" class="trans TextS1">Enable Stealth Mode.</a></label>
<div id="RestartText"></div> <div id="RestartText" tid="t70" class="trans" ></div>
</div> </div>
<div id="AcceptArea"> <div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice" id="PreBtn" onclick="window.history.back()" data-i18n="back">Back</div> <div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t8" id="PreBtn" onclick="window.history.back()">Back</div>
<div class="ButtonStyleConfirm ButtonTypeChoice" id="GotoNetPluginBtn" onclick="GotoNetPluginPage()" data-i18n="next">Next</div> <div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t9" id="GotoNetPluginBtn" onclick="GotoNetPluginPage()">Next</div>
</div> </div>
</body> </body>
</html> </html>
+8 -8
View File
@@ -10,20 +10,20 @@
<link rel="stylesheet" type="text/css" href="5.css" /> <link rel="stylesheet" type="text/css" href="5.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script> <script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script> <script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script> <script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script> <script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="5.js"></script> <script type="text/javascript" src="5.js"></script>
</head> </head>
<body onLoad="OnInit()"> <body onLoad="OnInit()">
<div id="Title"> <div id="Title">
<div data-i18n="proprietary_plugins">Proprietary Plugins</div> <div class="trans" tid="t64">Proprietary Plugins</div>
</div> </div>
<div id="Content"> <div id="Content">
<div id="FeatureText"> <div id="FeatureText">
<div><a class="TextS1" data-i18n="proprietary_plugins_desc">Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers.</a></div> <div><a tid="t75" class="trans TextS1">Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers.</a></div>
<div><a class="TextS1" data-i18n="proprietary_plugins_risk">Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk.</a></div> <div><a tid="t65" class="trans TextS1">Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk.</a></div>
<!-- <div><span class="TextPoint">●</span>&nbsp;&nbsp;<a tid="t65" class="trans" ></a></div> <!-- <div><span class="TextPoint">●</span>&nbsp;&nbsp;<a tid="t65" class="trans" ></a></div>
<div><span class="TextPoint">●</span>&nbsp;&nbsp;<a tid="t66" class="trans" ></a></div> <div><span class="TextPoint">●</span>&nbsp;&nbsp;<a tid="t66" class="trans" ></a></div>
@@ -33,13 +33,13 @@
<!-- ORCA use label tag to allow checkbox to toggle when user clicked to text --> <!-- ORCA use label tag to allow checkbox to toggle when user clicked to text -->
<label id="CheckArea"><input id="InstallCheck" onClick="SendInstallPluginCheck()" type="checkbox"><a class="TextS1" data-i18n="install_bambu_plugin">Install Bambu Network plug-in</a></label> <label id="CheckArea"><input id="InstallCheck" onClick="SendInstallPluginCheck()" type="checkbox"><a tid="t69" class="trans TextS1">Install Bambu Network Plug-in. </a></label>
<div id="RestartText"></div> <div id="RestartText" tid="t70" class="trans" ></div>
</div> </div>
<div id="AcceptArea"> <div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice" id="PreBtn" onclick="window.history.back()" data-i18n="back">Back</div> <div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t8" id="PreBtn" onclick="window.history.back()">Back</div>
<div class="ButtonStyleConfirm ButtonTypeChoice" id="AcceptBtn" onclick="FinishGuide()" data-i18n="finish">Finish</div> <div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t25" id="AcceptBtn" onclick="FinishGuide()">Finish</div>
</div> </div>
</body> </body>
</html> </html>
+138
View File
@@ -0,0 +1,138 @@
*
{
padding: 0;
border: 0;
margin: 0;
font-family: "system-ui", "Segoe UI", Roboto, Oxygen, Ubuntu, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-sans;
}
html,body
{
font-size: 14px;
height:100%;
}
.LinkBtn
{
color: #1200FF;
cursor: pointer;
}
.LinkBtn:hover
{
text-decoration:underline;
}
.Btn_Green
{
padding: 1.5mm 6mm;
font-size: 14px;
text-align: center;
background-color: #009688;
border-radius: 6px;
color: #fff;
cursor: pointer;
display: inline-block;
border: 1px solid #02c7b3;
}
.Btn_Green:hover
{
background-color:#4db6ac;
}
#DownBlock
{
height: 60%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
#DownArea
{
width:80%;
height: 50%;
line-height: 50px;
display: inline;
}
#DownText
{
display: flex;
align-items: center;
}
#RetryBtn
{
background-image:url("restart.png");
background-size: 100% 100%;
width: 20px;
height: 20px;
margin-left: 20px;
display: none;
}
#DownPercent
{
height:20px;
}
#PercentBkg
{
height:20px;
background-color:#CFCFCF;
border-radius: 20px;
}
#PercentTip
{
float: left;
height:20px;
width: 0%;
background-color:#009688;
border-radius: 20px;
}
#DownSuccessTip
{
width:80%;
display: none;
text-align: center;
}
#InstallFailedTip
{
display:none;
height: auto;
}
/*------Btn Area------*/
#BtnBlock
{
height:40%;
display: flex;
justify-content: center;
align-items: center;
}
#CancelBtn
{
display: inline;
}
#RestartBtn
{
display: none;
}
#CloseBtn
{
display: none;
}
+167
View File
@@ -0,0 +1,167 @@
function OnInit()
{
//let strInput=JSON.stringify(cData);
//HandleStudio(strInput);
// let tVal={};
// tVal['status']=3;
// tVal['percent']=30;
//
// HandStatusPercent(tVal);
TranslatePage();
SendDownloadCmd();
}
function SendDownloadCmd()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="Begin_Download_network_plugin";
SendWXMessage( JSON.stringify(tSend) );
}
function HandleStudio( pVal )
{
let strCmd=pVal['command'];
//alert(strCmd);
if(strCmd=='ShowStatusPercent')
{
HandStatusPercent(pVal['data']);
}
}
function HandStatusPercent( pVal )
{
let nStatus=pVal['status']*1;
let nPercent=pVal['percent'];
if(nStatus==0)
{
//正常下载
$('#DownStepText').attr("tid","t71");
$('#RetryBtn').hide();
$('#PercentTip').css("width",nPercent+'%');
}
else if(nStatus==1)
{
//下载失败 或 解压缩补丁包失败
$('#DownStepText').attr("tid","t72");
$('#PercentTip').css("width",0+'%');
$('#RetryBtn').show();
}
else if(nStatus==2)
{
//下载完成
$('#PercentTip').css("width",100+'%');
setTimeout("SendInstallPluginCmd()",100);
}
else if(nStatus==3)
{
//解压缩补丁包失败
$('#DownArea').hide();
$("#InstallFailedTip").show();
$('#CancelBtn').hide();
$('#RestartBtn').hide();
$('#CloseBtn').show();
}
else if(nStatus==4)
{
//安装补丁包完成
$('#DownArea').hide();
$('#DownSuccessTip').show();
$('#CancelBtn').hide();
$('#CloseBtn').hide();
$('#RestartBtn').show();
//pTimer=setInterval("RunInverse()",1000);
}
TranslatePage();
}
var nCount=3;
var pTimer=null;
function RunInverse()
{
$('#CountNumber').text(nCount+'');
nCount--;
if(nCount==-1)
{
RestartBambuStudio();
}
}
function RetryDownload()
{
$('#DownStepText').attr("tid","t71");
$('#PercentTip').css("width",0+'%');
SendDownloadCmd();
}
function CancelDownload()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="netplugin_download_cancel";
SendWXMessage( JSON.stringify(tSend) );
}
function SendInstallPluginCmd()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="begin_install_plugin";
SendWXMessage( JSON.stringify(tSend) );
}
function RestartBambuStudio()
{
if( pTimer!=null )
{
clearInterval(pTimer);
pTimer=null;
}
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="restart_studio";
SendWXMessage( JSON.stringify(tSend) );
}
function CloseDownDialog()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="close_download_dialog";
SendWXMessage( JSON.stringify(tSend) );
}
function OpenPluginFolder()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="open_plugin_folder";
SendWXMessage( JSON.stringify(tSend) );
}
+49
View File
@@ -0,0 +1,49 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Cache-Control" content="max-age=7200" />
<title>引导_P1</title>
<link rel="stylesheet" type="text/css" href="../../include/global.css" /> <!-- ORCA One for all-->
<link rel="stylesheet" type="text/css" href="6.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="6.js"></script>
</head>
<body onLoad="OnInit()">
<div id="DownBlock">
<div id="DownArea">
<div id="DownText">
<div id="DownStepText" class="trans" tid="t71">Downloading</div>
<div id="RetryBtn" onClick="RetryDownload()"></div>
</div>
<div>
<div id="PercentTip"></div>
<div id="PercentBkg"></div>
</div>
</div>
<div id="DownSuccessTip" class="trans" tid="t73">Installation successful.</div>
<div id="InstallFailedTip">
<div><a class="trans" tid="t79">Failed to install plug-in. </a><a class="trans" tid="t80">Try the following steps:</a></div>
<div><a class="trans" tid="t81">1, Click </a><a class="trans LinkBtn" tid="t77" onClick="OpenPluginFolder()">here</a><a class="trans" tid="t82"> to open the plug-in directory</a> </div>
<div class="trans" tid="t83">2, Close all open Orca Slicer</div>
<div class="trans" tid="t84">3, Delete all files under the plug-in directory</div>
<div class="trans" tid="t85">4, Reopen Orca Slicer and install the plug-in again</div>
</div>
</div>
<div id="BtnBlock">
<div id="CancelBtn" class="ButtonStyleRegular ButtonTypeChoice trans" tid="t38" onClick="CancelDownload()" >Cancel</div>
<div id="RestartBtn" class="ButtonStyleRegular ButtonTypeChoice trans" tid="t25" onClick="RestartBambuStudio()">Finish</div>
<div id="CloseBtn" class="ButtonStyleRegular ButtonTypeChoice trans" tid="t86" onClick="CloseDownDialog()" >Close </div>
</div>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

+15 -15
View File
@@ -15,7 +15,7 @@
<link rel="stylesheet" type="text/css" href="../include/swiper/swiper-bundle.min.css" /> <link rel="stylesheet" type="text/css" href="../include/swiper/swiper-bundle.min.css" />
<script type="text/javascript" src="../include/swiper/swiper-bundle.min.js"></script> <script type="text/javascript" src="../include/swiper/swiper-bundle.min.js"></script>
<script type="text/javascript" src="../include/i18n.js"></script> <script type="text/javascript" src="../data/text.js"></script>
<script type="text/javascript" src="js/home.js"></script> <script type="text/javascript" src="js/home.js"></script>
</head> </head>
@@ -33,7 +33,7 @@
<span id="UserName" class="AccountName"></span> <span id="UserName" class="AccountName"></span>
<span class="AccountSecondary">Orca Cloud</span> <span class="AccountSecondary">Orca Cloud</span>
</span> </span>
<span class="AccountSignIn" data-i18n="login">Login</span> <span class="AccountSignIn trans" tid="t26">Login</span>
<svg class="AccountChevron" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <svg class="AccountChevron" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M3 4.75L6 7.75L9 4.75" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/> <path d="M3 4.75L6 7.75L9 4.75" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/>
</svg> </svg>
@@ -46,7 +46,7 @@
<svg class="SectionChevron" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <svg class="SectionChevron" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M4.5 2.5L8 6L4.5 9.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> <path d="M4.5 2.5L8 6L4.5 9.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg> </svg>
<span class="SectionLabel">Bambu Cloud</span> <span class="SectionLabel trans" tid="orca6">Bambu Cloud</span>
<span id="BambuStatusDot"></span> <span id="BambuStatusDot"></span>
</div> </div>
@@ -58,16 +58,16 @@
</span> </span>
<span class="AccountText"> <span class="AccountText">
<span id="BambuUserName" class="AccountName"></span> <span id="BambuUserName" class="AccountName"></span>
<span class="AccountSecondary" data-i18n="not_signed_in">Not signed in</span> <span class="AccountSecondary trans" tid="orca8">Not signed in</span>
</span> </span>
<span class="AccountSignIn" data-i18n="login">Login</span> <span class="AccountSignIn trans" tid="t26">Login</span>
<svg class="AccountChevron" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <svg class="AccountChevron" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M3 4.75L6 7.75L9 4.75" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/> <path d="M3 4.75L6 7.75L9 4.75" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/>
</svg> </svg>
</div> </div>
<div id="NoPluginTip"> <div id="NoPluginTip">
<div id="NoPluginText" class="RedFont"><a class="LinkBtn" onClick="BeginDownloadNetworkPlugin()"></a></div> <div id="NoPluginText"><a class="RedFont trans" tid="t76">Network plugin not detected. Click </a><a Class="LinkBtn trans" onClick="BeginDownloadNetworkPlugin()" tid="t77">here</a><a class="RedFont trans" tid="t78"> to install it.</a></div>
</div> </div>
</div> </div>
</div> </div>
@@ -79,7 +79,7 @@
<div id="AccountMenuHandle" role="presentation"></div> <div id="AccountMenuHandle" role="presentation"></div>
<div id="AccountMenuLogout" role="menuitem" tabindex="0" onClick="OnAccountMenuLogout()"> <div id="AccountMenuLogout" role="menuitem" tabindex="0" onClick="OnAccountMenuLogout()">
<span id="AccountMenuLogoutIcon"></span> <span id="AccountMenuLogoutIcon"></span>
<span data-i18n="log_out">Log Out</span> <span class="trans" tid="t50">Log out</span>
</div> </div>
</div> </div>
@@ -88,7 +88,7 @@
<div id="BtnArea"> <div id="BtnArea">
<div menu="recent" class="BtnItem BtnItemSelected" onClick="GotoMenu('recent')"> <div menu="recent" class="BtnItem BtnItemSelected" onClick="GotoMenu('recent')">
<div class="BtnIcon "><img class="LeftIcon" src="img/i2.png" /></div> <div class="BtnIcon "><img class="LeftIcon" src="img/i2.png" /></div>
<div data-i18n="recent">Recent</div> <div class="trans" tid="t28">recent</div>
</div> </div>
<div class="BtnItem BtnShortcut" onClick="OpenUrlInLocalBrowser('https://cloud.orcaslicer.com')"> <div class="BtnItem BtnShortcut" onClick="OpenUrlInLocalBrowser('https://cloud.orcaslicer.com')">
<div class="BtnIcon "><img class="ShortcutBrandIcon" src="../image/logo.png" /></div> <div class="BtnIcon "><img class="ShortcutBrandIcon" src="../image/logo.png" /></div>
@@ -119,14 +119,14 @@
<div class="MenuItem" onClick="OnClickNewProject()"> <div class="MenuItem" onClick="OnClickNewProject()">
<div class="MenuIcon"><img src="img/i4.png"></div> <div class="MenuIcon"><img src="img/i4.png"></div>
<div> <div>
<div class="TextS1" data-i18n="new_project">New Project</div> <div class="trans TextS1" tid="t31">new project</div>
<div class="MenuDesc" data-i18n="create_new_project">Create new project</div> <div class="MenuDesc trans" tid="t32">create new project</div>
</div> </div>
</div> </div>
<div class="MenuItem" onClick="OnClickOpenProject()"> <div class="MenuItem" onClick="OnClickOpenProject()">
<div class="MenuIcon"><img src="img/i5.png"></div> <div class="MenuIcon"><img src="img/i5.png"></div>
<div> <div>
<div class="TextS1" data-i18n="open_project">Open Project</div> <div class="trans TextS1" tid="t33">open project</div>
<div class="MenuDesc">3mf</div> <div class="MenuDesc">3mf</div>
</div> </div>
</div> </div>
@@ -135,8 +135,8 @@
<div id="DebugText"></div> <div id="DebugText"></div>
<div id="RecentFileArea"> <div id="RecentFileArea">
<div id="RecentTitleBlock"> <div id="RecentTitleBlock">
<div id="RecentTitle" class="Content-Title TextS1" data-i18n="recently_opened">Recently opened</div> <div id="RecentTitle" class="Content-Title trans TextS1" tid="t35">recent open</div>
<div id="RecentClearAllBtn" class="ButtonStyleRegular ButtonTypeWindow" onClick="OnDeleteAllRecentFiles()" data-i18n="clear_all">Clear all</div> <div id="RecentClearAllBtn" class="ButtonStyleRegular ButtonTypeWindow trans" tid="t12" onClick="OnDeleteAllRecentFiles()">Clear all</div>
</div> </div>
<div id="FileList"> <div id="FileList">
<!-- <div class="FileItem" onClick="OnOpenRecentFile('aaaa')" fpath='d:\model\11.3mf'> <!-- <div class="FileItem" onClick="OnOpenRecentFile('aaaa')" fpath='d:\model\11.3mf'>
@@ -219,11 +219,11 @@
<div id="recnet_context_menu"> <div id="recnet_context_menu">
<div id="CT_Delete_Bar" class="CT_Item" onClick="OnDeleteRecentFile()"> <div id="CT_Delete_Bar" class="CT_Item" onClick="OnDeleteRecentFile()">
<div class="CT_Icon CT_Delete"></div> <div class="CT_Icon CT_Delete"></div>
<div class="CT_Text" data-i18n="remove">Remove</div> <div class="CT_Text trans" tid="t88">clear</div>
</div> </div>
<div id="CT_Folder_Bar" class="CT_Item " onClick="OnExploreRecentFile()" > <div id="CT_Folder_Bar" class="CT_Item " onClick="OnExploreRecentFile()" >
<div class="CT_Icon CT_Explore"></div> <div class="CT_Icon CT_Explore"></div>
<div class="CT_Text" data-i18n="open_containing_folder">Open Containing Folder</div> <div class="CT_Text trans" tid="t89">open in explorer </div>
</div> </div>
</div> </div>
-4
View File
@@ -6,10 +6,6 @@ function OnInit()
{ {
//-----Official----- //-----Official-----
TranslatePage(); TranslatePage();
let pluginTip = document.getElementById("NoPluginText");
if (pluginTip)
AppendTemplate(pluginTip, T("plugin_not_detected", "Bambu Network plug-in not detected. Click <a>here</a> to install it."),
pluginTip.querySelector("a"));
SendMsg_GetLoginInfo(); SendMsg_GetLoginInfo();
SendMsg_GetBambuLoginInfo(); SendMsg_GetBambuLoginInfo();
-55
View File
@@ -1,55 +0,0 @@
// Localized text for the bundled web pages. The hosting window injects the page's strings, translated
// through the .po catalogs, as window.ORCA_UI_STRINGS before any page script runs
// (WebViewHostDialog::localized_strings_script). The English in the markup and in the T() calls is the
// fallback for a page opened outside the app.
// The string for `key`, else `fallback`. Each further argument fills the next %s.
function T(key, fallback, ...args) {
const strings = (typeof ORCA_UI_STRINGS !== "undefined" && ORCA_UI_STRINGS) || {};
let text = strings[key] !== undefined ? String(strings[key]) : fallback;
// A replacer function, so a "$" in a value (a plugin name, say) is not read as a pattern.
args.forEach((arg) => { text = text.replace("%s", () => String(arg)); });
return text;
}
// Appends `template` to `node`, putting the nodes that follow in place of its markers, in order, so a
// translation can move them within the sentence. %s inserts the node as it is (a search term, say);
// <a>label</a> inserts it with the label as its text, so the translation words the link together with
// the sentence around it.
function AppendTemplate(node, template, ...nodes) {
let end = 0;
let next = 0;
for (const marker of template.matchAll(/%s|<a>(.*?)<\/a>/g)) {
if (marker.index > end)
node.appendChild(document.createTextNode(template.slice(end, marker.index)));
const inserted = nodes[next++];
if (inserted) {
if (marker[1] !== undefined)
inserted.textContent = marker[1];
node.appendChild(inserted);
}
end = marker.index + marker[0].length;
}
if (end < template.length)
node.appendChild(document.createTextNode(template.slice(end)));
}
// Translates the static markup: data-i18n names the key for an element's own text (child elements
// such as icons and sort arrows are kept), data-i18n-title, data-i18n-placeholder and
// data-i18n-aria-label the key for that attribute. Translating again is harmless, so a page can call
// this after adding markup.
function TranslatePage() {
document.querySelectorAll("[data-i18n]").forEach((el) => {
const textNode = Array.from(el.childNodes).find((n) => n.nodeType === Node.TEXT_NODE && n.nodeValue.trim());
const text = T(el.dataset.i18n, textNode ? textNode.nodeValue.trim() : "");
if (textNode)
textNode.nodeValue = text;
else
el.insertBefore(document.createTextNode(text), el.firstChild);
});
["title", "placeholder", "aria-label"].forEach((attr) => {
document.querySelectorAll(`[data-i18n-${attr}]`).forEach((el) => {
el.setAttribute(attr, T(el.getAttribute(`data-i18n-${attr}`), el.getAttribute(attr) || ""));
});
});
}
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -221,15 +221,15 @@ function ShowModelInfo( pModel )
switch(UploadType) switch(UploadType)
{ {
case 'remix': case 'remix':
$('#ModelAuthorType').text(T('remixed_by', 'Remixed by')); $('#ModelAuthorType').attr('tid','t93');
break; break;
case 'shared': case 'shared':
$('#ModelAuthorType').text(T('shared_by', 'Shared by')); $('#ModelAuthorType').attr('tid','t94');
break; break;
case 'origin': case 'origin':
case 'profile': case 'profile':
default: default:
$('#ModelAuthorType').text(T('created_by', 'Created by')); $('#ModelAuthorType').attr('tid','t92');
break; break;
} }
+3 -3
View File
@@ -6,7 +6,7 @@
<title>Printer Connection Required</title> <title>Printer Connection Required</title>
<link rel="stylesheet" type="text/css" href="css/home.css" /> <link rel="stylesheet" type="text/css" href="css/home.css" />
<link rel="stylesheet" type="text/css" href="css/dark.css" /> <link rel="stylesheet" type="text/css" href="css/dark.css" />
<script type="text/javascript" src="../include/i18n.js"></script> <script type="text/javascript" src="../data/text.js"></script>
<script type="text/javascript" src="../include/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../homepage/js/json2.js"></script> <script type="text/javascript" src="../homepage/js/json2.js"></script>
<script type="text/javascript" src="../homepage/js/globalapi.js"></script> <script type="text/javascript" src="../homepage/js/globalapi.js"></script>
@@ -14,8 +14,8 @@
</head> </head>
<body onLoad="OnInit()"> <body onLoad="OnInit()">
<div class="container"> <div class="container">
<h1 data-i18n="printer_connection">Printer Connection</h1> <h1 class="trans">Printer Connection</h1>
<p data-i18n="printer_connection_setup">Please set up your printer connection to view the device.</p> <p class="trans">Please set up your printer connection to view the device.</p>
<img src="setup_connection.gif" alt="Printer connection setup demonstration" style="max-width: 100%; height: auto; display: block;"/> <img src="setup_connection.gif" alt="Printer connection setup demonstration" style="max-width: 100%; height: auto; display: block;"/>
</div> </div>
</body> </body>
-128
View File
@@ -1,128 +0,0 @@
#!/usr/bin/env bash
# Lets a pull request's macOS deps build wait for a push build of the base
# branch that builds the same deps, from a Linux job. `check` runs after a cache
# miss and names a queued or running base build with the same deps/ and .github/
# to wait for, unless the pull request changes either. `wait` waits until that
# build saves KEY. actions/cache then confirms the entry can be restored.
#
# Environment: GH_TOKEN, REPO, WORKFLOW_REF and BASE_REF, plus KEY_INPUTS,
# WAIT_FOR, WAIT_SINCE, WAIT_MINUTES, KEY and ARCH for `wait`.
# Writes key-inputs, wait-for and wait-since to $GITHUB_OUTPUT.
set -uo pipefail
workflow=${WORKFLOW_REF%%@*}
workflow=${workflow##*/}
# Must match the job names in build_all.yml, build_check_cache.yml and build_deps.yml.
check_job_name="build_macos_arch (${ARCH:-}) / Check Cache"
deps_job_name="build_macos_arch (${ARCH:-}) / Build Deps / Build Deps"
out() { echo "$1" >> "${GITHUB_OUTPUT:-/dev/stdout}"; }
# The cache key depends on deps/ and on the workflows under .github/.
local_key_inputs() { echo "$(git rev-parse "$1:.github") $(git rev-parse "$1:deps")"; }
remote_key_inputs() {
gh api "repos/$REPO/git/trees/$1" < /dev/null \
--jq '[.tree[] | select(.path == ".github" or .path == "deps") | {key: .path, value: .sha}] | from_entries | "\(.[".github"]) \(.deps)"'
}
# Prints the id of a push build of the base branch that has not finished, is not
# one of the ids in $1, and has KEY_INPUTS.
matching_base_build() {
local status runs id sha
runs=$(for status in in_progress queued pending waiting requested; do
gh api -X GET "repos/$REPO/actions/workflows/$workflow/runs" \
-f branch="$BASE_REF" -f event=push -f status="$status" -f per_page=10 < /dev/null \
| jq -r '.workflow_runs[] | "\(.id) \(.head_sha)"'
done)
while read -r id sha; do
[ -n "$id" ] || continue
[[ " ${1:-} " == *" $id "* ]] && continue
if [ "$(remote_key_inputs "$sha")" = "$KEY_INPUTS" ]; then
echo "$id"
return
fi
done <<< "$runs"
}
check() {
KEY_INPUTS=$(local_key_inputs HEAD)
out "key-inputs=$KEY_INPUTS"
if [ "$KEY_INPUTS" != "$(local_key_inputs HEAD^1)" ]; then
echo "This pull request changes deps/ or .github/, so it builds its own deps."
return
fi
local id
id=$(matching_base_build)
if [ -n "$id" ]; then
echo "Build $id of $BASE_REF has the same deps/ and .github/. Waiting for its cache."
out "wait-for=$id"
out "wait-since=$(date +%s)"
else
echo "No build of $BASE_REF is building these deps."
fi
}
key_saved() {
gh cache list -R "$REPO" --ref "refs/heads/$BASE_REF" --key "$KEY" --json key < /dev/null \
| jq -e --arg key "$KEY" 'any(.[]; .key == $key)' > /dev/null
}
wait_for() {
# Counts the limit from the check, including time queued behind other waiting
# pull requests.
local id=$WAIT_FOR seen=$WAIT_FOR deadline=$((${WAIT_SINCE:-$(date +%s)} + WAIT_MINUTES * 60)) jobs job check warned=
while [ "$(date +%s)" -lt "$deadline" ]; do
if key_saved; then
echo "Found $KEY."
return
fi
jobs=$(gh api -X GET "repos/$REPO/actions/runs/$id/jobs" -f filter=latest -f per_page=100 < /dev/null)
job=$(jq -r --arg name "$deps_job_name" 'first(.jobs[] | select(.name == $name) | "\(.status) \(.conclusion)") // ""' <<< "$jobs")
case "$job" in
"completed success" | "completed skipped")
# The new entry can take a moment to be listed, and a skipped job means
# the build found the cache, possibly under the default branch.
for _ in 1 2 3; do
key_saved && { echo "Found $KEY."; return; }
sleep 20
done
echo "Build $id of $BASE_REF finished its deps without saving $KEY."
return ;;
"completed cancelled") ;;
completed*)
echo "The deps job of build $id of $BASE_REF did not succeed."
return ;;
# The deps job exists only once the build's cache check has succeeded.
"")
case "$(gh api "repos/$REPO/actions/runs/$id" --jq '"\(.status) \(.conclusion)"' < /dev/null)" in
"completed cancelled") ;;
completed*)
check=$(jq -r --arg name "$check_job_name" 'first(.jobs[] | select(.name == $name) | .conclusion) // ""' <<< "$jobs")
if [ -z "$warned" ] && { [ -z "$check" ] || [ "$check" = success ]; }; then
echo "::warning title=Deps wait::Build $id of $BASE_REF has no job named \"$deps_job_name\". If the build jobs were renamed, update scripts/ci_deps_cache.sh. This does not affect this pull request."
warned=1
fi ;;
*)
sleep 120
continue ;;
esac ;;
*)
sleep 120
continue ;;
esac
# Follows another unfinished build with the same key inputs, such as the
# push that replaced a cancelled one.
id=$(matching_base_build "$seen")
[ -n "$id" ] || break
seen="$seen $id"
echo "Following build $id of $BASE_REF."
done
echo "No build of $BASE_REF saved $KEY."
}
case "${1:-}" in
check) check ;;
wait) wait_for ;;
*) echo "usage: $0 check|wait" >&2; exit 2 ;;
esac
-269
View File
@@ -1,269 +0,0 @@
#!/usr/bin/env python3
"""Holds a pull request's macOS build until a hosted macOS runner is free for it.
Runs from a Linux job in build_check_cache.yml, once per macOS arch, in a single
repo-wide line (a concurrency group with queue: max), so only the job at the
front of the line polls. It lets its arch in when the runners every active Build
all run holds or still needs, plus one for this arch, fit in MACOS_RUNNER_LIMIT:
- A push, nightly or manual run holds RESERVE runners until its macOS work is
done. The jobs API lists only the jobs a run has reached, so what it still
needs cannot be counted and is reserved instead.
- A pull request run holds one runner for each arch let in until that arch's
app build is done, and none after. A run holding a runner while it waits for
its other arch would deadlock: the other arch can sit in the line behind a
pull request that waits for that runner.
- A run holds at least the macOS jobs it has queued or running.
A pull request's universal build and tests skip the line and are not held for
in advance. They take minutes, and holding two runners for them through the
slower arch's build left runners idle while other builds waited.
- In the minutes around the nightly's cron time, RESERVE runners are held for it
until its run appears.
A pull request labelled macos-priority when its run starts waits in a separate
line under the same rule, and the normal line counts every priority arch still
waiting as holding a runner, so the next free runners go to it.
Any API error repeated FAILURES_BEFORE_ADMIT times, and the WAIT_MINUTES limit,
let the arch in, so a fault here never blocks pull requests.
Environment: GH_TOKEN, REPO, WORKFLOW_REF, GITHUB_RUN_ID, and optionally PRIORITY,
MACOS_RUNNER_LIMIT, WAIT_MINUTES, POLL_SECONDS and GITHUB_API_URL.
"""
import datetime
import json
import os
import sys
import time
import urllib.error
import urllib.parse
import urllib.request
# A push, nightly or manual run builds arm64 and x86_64 at the same time, then
# the universal build and the macOS tests at the same time.
RESERVE = 2
# Must match the job names in build_all.yml and build_check_cache.yml.
ARCH_PREFIX = "build_macos_arch ("
GATE = "Wait for a macOS runner"
PRIORITY_GATE = GATE + " (priority)"
FINAL_JOBS = {"Build macOS Universal", "macOS arm64"}
# Must match the cron in build_all.yml.
NIGHTLY_UTC = datetime.time(2, 15)
NIGHTLY_REPO = "OrcaSlicer/OrcaSlicer"
NIGHTLY_LEAD = datetime.timedelta(minutes=10)
NIGHTLY_GRACE = datetime.timedelta(minutes=45)
ACTIVE = {"queued", "in_progress", "waiting", "pending", "requested"}
# Runs created this recently are listed whatever their status.
RECENT = datetime.timedelta(hours=24)
FAILURES_BEFORE_ADMIT = 3
def is_macos(job):
return any(label.startswith("macos-") for label in job.get("labels") or [])
def macos_done(jobs):
"""True once the universal build and the macOS tests have finished or been skipped.
Both start together when the arch builds finish."""
# A skipped caller job is listed under its own name, a started one as "<name> / <job>".
final = [job for job in jobs if job["name"].split(" / ")[0] in FINAL_JOBS]
return bool(final) and all(job["status"] == "completed" for job in final)
def gates(jobs, names=(GATE, PRIORITY_GATE)):
return [job for job in jobs if job["name"].split(" / ")[-1] in names]
def arch_of(job):
name = job["name"]
return name[len(ARCH_PREFIX):name.find(")")] if name.startswith(ARCH_PREFIX) else None
def admitted_arches(jobs):
return {arch_of(job) for job in gates(jobs) if job["conclusion"] == "success"}
def arch_built(jobs, arch):
"""True once the arch's app build finished, or one of its jobs failed or was cancelled."""
own = [job for job in jobs if arch_of(job) == arch]
return any(job["conclusion"] in ("failure", "cancelled") for job in own) or \
any(" / Build OrcaSlicer" in job["name"] and job["status"] == "completed" for job in own)
def priority_waiting(jobs):
"""How many of the run's arches wait in the priority line."""
return sum(1 for job in gates(jobs, (PRIORITY_GATE,)) if job["status"] != "completed")
def run_demand(run, jobs, yield_to_priority=False):
"""macOS runners a run holds or still needs. With yield_to_priority, each
priority arch still waiting counts as holding one."""
# A run with no jobs that is pending waits behind another run of its
# concurrency group, which holds the runners for both.
if not jobs and run["status"] in ("pending", "waiting"):
return 0
active = sum(1 for job in jobs if is_macos(job) and job["status"] in ACTIVE)
if macos_done(jobs):
return active
if run["event"] != "pull_request":
return max(active, RESERVE)
held = sum(1 for arch in admitted_arches(jobs) if not arch_built(jobs, arch))
if yield_to_priority:
held += priority_waiting(jobs)
return max(active, held)
def nightly_window(now):
"""The window around today's nightly cron time, as (start, end) in UTC."""
cron = datetime.datetime.combine(now.date(), NIGHTLY_UTC, tzinfo=datetime.timezone.utc)
return cron - NIGHTLY_LEAD, cron + NIGHTLY_GRACE
def parse_time(value):
return datetime.datetime.fromisoformat(value.replace("Z", "+00:00"))
class Api:
def __init__(self, token, url="https://api.github.com"):
self.token = token
self.url = url.rstrip("/")
# The token's hourly limit is shared by every workflow in the repository,
# so what the last response says is left shows their use too.
self.calls = 0
self.remaining = self.limit = "?"
def get(self, path, **params):
query = urllib.parse.urlencode(params)
request = urllib.request.Request(f"{self.url}/{path}?{query}", headers={
"Accept": "application/vnd.github+json",
"Authorization": f"Bearer {self.token}",
"X-GitHub-Api-Version": "2022-11-28",
})
self.calls += 1
try:
with urllib.request.urlopen(request, timeout=30) as response:
self.note_rate_limit(response.headers)
return json.load(response)
except urllib.error.HTTPError as error:
# A rate-limited request fails, and its headers say so.
self.note_rate_limit(error.headers)
raise
def note_rate_limit(self, headers):
self.remaining = headers.get("X-RateLimit-Remaining", "?")
self.limit = headers.get("X-RateLimit-Limit", "?")
def usage(self, calls_before):
return f" API calls this check: {self.calls - calls_before}, rate limit left: {self.remaining} of {self.limit}"
def list_runs(api, repo, workflow, **params):
runs, page = [], 1
while True:
body = api.get(f"repos/{repo}/actions/workflows/{workflow}/runs",
per_page=100, page=page, **params)
runs += body["workflow_runs"]
if len(runs) >= body["total_count"] or not body["workflow_runs"]:
return runs
page += 1
def latest_run(api, repo, workflow, **params):
runs = api.get(f"repos/{repo}/actions/workflows/{workflow}/runs",
per_page=1, **params)["workflow_runs"]
return runs[0] if runs else None
def measure(api, repo, workflow, run_id, now, priority=False):
"""Total macOS runners held or needed, and one line per run that holds any.
The priority line does not count the priority runs waiting behind it."""
total, lines = 0, []
# A run is listed as queued whenever one of its jobs waits for a runner, and
# as pending whenever one waits in a concurrency group, so runs in any of these
# can hold runners. A run that moves between the lists between the calls is
# in neither, as one is whenever the job ahead of this one leaves the line, so
# runs created recently are listed by creation time as well, and this run is
# read directly.
since = (now - RECENT).strftime("%Y-%m-%dT%H:%M:%SZ")
runs = {run["id"]: run for status in ("in_progress", "queued", "pending", "waiting")
for run in list_runs(api, repo, workflow, status=status)}
runs.update((run["id"], run) for run in list_runs(api, repo, workflow, created=f">={since}")
if run["status"] != "completed")
runs[run_id] = api.get(f"repos/{repo}/actions/runs/{run_id}")
for run in runs.values():
jobs = api.get(f"repos/{repo}/actions/runs/{run['id']}/jobs",
filter="latest", per_page=100)["jobs"]
own = run["id"] == run_id
demand = run_demand(run, jobs, yield_to_priority=not priority and not own)
if demand:
total += demand
waiting = ", priority, waiting" if priority_waiting(jobs) and not own else ""
lines.append(f" {demand} run {run['id']} ({run['event']}, {run['head_branch']}{waiting})")
# build_all.yml runs the nightly only in the main repository.
start, end = nightly_window(now)
if repo == NIGHTLY_REPO and start <= now < end:
last = latest_run(api, repo, workflow, event="schedule")
if not last or parse_time(last["created_at"]) < start:
total += RESERVE
lines.append(f" {RESERVE} the nightly, due at {NIGHTLY_UTC:%H:%M} UTC")
return total, lines
def wait(measure_now, limit, wait_minutes, poll_seconds,
clock=time.monotonic, sleep=time.sleep, log=print):
"""Polls until this arch fits. Returns the reason it was let in."""
deadline = clock() + wait_minutes * 60
failures = 0
while True:
try:
total, lines = measure_now()
except (urllib.error.URLError, OSError, ValueError, KeyError, TypeError) as error:
failures += 1
log(f"::warning title=macOS admission::Could not read the queue ({error}).")
if failures >= FAILURES_BEFORE_ADMIT:
return "the queue could not be read"
else:
failures = 0
log(f"{total} of {limit} macOS runners held or needed:")
for line in lines:
log(line)
if total + 1 <= limit:
return "a runner is free"
if clock() + poll_seconds >= deadline:
return f"it waited {wait_minutes} minutes"
sleep(poll_seconds)
def main():
repo = os.environ["REPO"]
workflow = os.environ["WORKFLOW_REF"].split("@")[0].rsplit("/", 1)[-1]
api = Api(os.environ["GH_TOKEN"], os.environ.get("GITHUB_API_URL", "https://api.github.com"))
run_id = int(os.environ["GITHUB_RUN_ID"])
limit = int(os.environ.get("MACOS_RUNNER_LIMIT") or 5)
def measure_now():
calls_before = api.calls
try:
total, lines = measure(api, repo, workflow, run_id, datetime.datetime.now(datetime.timezone.utc),
priority=os.environ.get("PRIORITY") == "true")
except Exception:
print(api.usage(calls_before).strip())
raise
return total, lines + [api.usage(calls_before)]
reason = wait(
measure_now,
limit,
wait_minutes=int(os.environ.get("WAIT_MINUTES") or 240),
poll_seconds=int(os.environ.get("POLL_SECONDS") or 180),
)
print(f"Letting this macOS build in: {reason}.")
if __name__ == "__main__":
sys.exit(main())
-370
View File
@@ -1,370 +0,0 @@
#!/usr/bin/env python3
"""Tests for scripts/ci_macos_admission.py (stdlib unittest, no external deps).
Run from the repo root: python -m unittest discover -s scripts/tests -v
"""
import datetime
import os
import sys
import unittest
import urllib.error
from unittest import mock
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
import ci_macos_admission as admission # noqa: E402
UTC = datetime.timezone.utc
NOON = datetime.datetime(2026, 10, 10, 12, 0, tzinfo=UTC)
def job(name, status="completed", conclusion="success", labels=("macos-15",)):
return {"name": name, "status": status, "conclusion": conclusion, "labels": list(labels)}
def gate(arch, status="completed", conclusion="success", priority=False):
suffix = " (priority)" if priority else ""
return job(f"build_macos_arch ({arch}) / Wait for a macOS runner{suffix}", status, conclusion,
labels=("ubuntu-24.04",))
def build(arch, status="in_progress"):
return job(f"build_macos_arch ({arch}) / Build Deps / Build OrcaSlicer / Build OrcaSlicer",
status, None if status != "completed" else "success")
CHECK_CACHE = job("build_macos_arch (arm64) / Check Cache", labels=("ubuntu-24.04",))
UNIVERSAL_DONE = job("Build macOS Universal / Build OrcaSlicer")
TESTS_DONE = job("macOS arm64 / Unit Tests")
PUSH = {"id": 1, "event": "push", "head_branch": "main", "status": "in_progress"}
PR = {"id": 2, "event": "pull_request", "head_branch": "topic", "status": "in_progress"}
class MacosDoneTest(unittest.TestCase):
def test_not_done_before_the_final_jobs_are_listed(self):
self.assertFalse(admission.macos_done([CHECK_CACHE, build("arm64", "completed")]))
def test_not_done_while_a_final_job_runs(self):
running = job("macOS arm64 / Unit Tests", "in_progress", None)
self.assertFalse(admission.macos_done([UNIVERSAL_DONE, running]))
def test_done_when_the_final_jobs_finished(self):
self.assertTrue(admission.macos_done([build("arm64", "completed"), UNIVERSAL_DONE, TESTS_DONE]))
def test_done_when_the_final_jobs_were_skipped(self):
# A skipped caller job is listed under its own name, without labels.
skipped = [job("Build macOS Universal", conclusion="skipped", labels=()),
job("macOS arm64", conclusion="skipped", labels=())]
self.assertTrue(admission.macos_done(skipped))
class RunDemandTest(unittest.TestCase):
def test_push_reserves_before_its_macos_jobs_are_listed(self):
self.assertEqual(admission.run_demand(PUSH, []), admission.RESERVE)
self.assertEqual(admission.run_demand(PUSH, [CHECK_CACHE]), admission.RESERVE)
def test_push_keeps_its_reserve_between_stages(self):
jobs = [build("arm64", "completed"), build("x86_64", "completed")]
self.assertEqual(admission.run_demand(PUSH, jobs), admission.RESERVE)
def test_push_releases_when_macos_is_done(self):
jobs = [build("arm64", "completed"), UNIVERSAL_DONE, TESTS_DONE]
self.assertEqual(admission.run_demand(PUSH, jobs), 0)
def test_queued_jobs_count_as_busy(self):
jobs = [build("arm64", "queued")]
self.assertEqual(admission.run_demand(PR, jobs), 1)
def test_pull_request_holds_nothing_before_it_is_let_in(self):
self.assertEqual(admission.run_demand(PR, [CHECK_CACHE, gate("arm64", "in_progress", None)]), 0)
def test_one_arch_let_in_holds_a_runner_until_it_is_built(self):
# Including before its first macOS job is listed, and between its stages.
self.assertEqual(admission.run_demand(PR, [gate("arm64")]), 1)
self.assertEqual(admission.run_demand(PR, [gate("arm64"), build("arm64")]), 1)
def test_one_arch_let_in_holds_nothing_once_it_is_built(self):
# Its other arch may be in the line behind a pull request waiting for this
# runner, so holding it would deadlock.
jobs = [gate("arm64"), build("arm64", "completed"), gate("x86_64", "pending", None)]
self.assertEqual(admission.run_demand(PR, jobs), 0)
def test_one_arch_let_in_holds_nothing_once_it_failed(self):
failed = job("build_macos_arch (arm64) / Build Deps / Build Deps", conclusion="failure")
self.assertEqual(admission.run_demand(PR, [gate("arm64"), failed]), 0)
def test_both_arches_let_in_hold_only_what_still_builds(self):
# The universal build and tests are not held for in advance.
jobs = [gate("arm64"), gate("x86_64"), build("arm64", "completed"), build("x86_64")]
self.assertEqual(admission.run_demand(PR, jobs), 1)
def test_universal_build_and_tests_count_once_queued(self):
built = [gate("arm64"), gate("x86_64"), build("arm64", "completed"), build("x86_64", "completed")]
self.assertEqual(admission.run_demand(PR, built), 0)
queued = [job("Build macOS Universal / Build OrcaSlicer", "queued", None),
job("macOS arm64 / Unit Tests", "in_progress", None)]
self.assertEqual(admission.run_demand(PR, built + queued), 2)
def test_pull_request_releases_when_macos_is_done(self):
jobs = [gate("arm64"), gate("x86_64"), UNIVERSAL_DONE, TESTS_DONE]
self.assertEqual(admission.run_demand(PR, jobs), 0)
def test_pull_request_without_the_line_holds_what_it_runs(self):
# A run started from a workflow without the line.
self.assertEqual(admission.run_demand(PR, [build("arm64"), build("x86_64", "queued")]), 2)
def test_finished_and_non_macos_jobs_are_not_counted(self):
jobs = [build("arm64", "completed"), CHECK_CACHE,
job("build_linux (ubuntu-24.04) / Check Cache", "in_progress", None, ("ubuntu-24.04",))]
self.assertEqual(admission.run_demand(PR, jobs), 0)
class PriorityTest(unittest.TestCase):
WAITING = [gate("arm64", "in_progress", None, priority=True), gate("x86_64", "pending", None, priority=True)]
def test_normal_line_yields_to_a_waiting_priority_run(self):
self.assertEqual(admission.run_demand(PR, self.WAITING, yield_to_priority=True), admission.RESERVE)
def test_priority_line_does_not_count_priority_runs_behind_it(self):
self.assertEqual(admission.run_demand(PR, self.WAITING), 0)
def test_a_waiting_normal_run_is_not_yielded_to(self):
waiting = [gate("arm64", "in_progress", None), gate("x86_64", "pending", None)]
self.assertEqual(admission.run_demand(PR, waiting, yield_to_priority=True), 0)
def test_a_priority_run_half_let_in_still_counts_its_waiting_arch(self):
jobs = [gate("arm64", priority=True), gate("x86_64", "pending", None, priority=True)]
self.assertEqual(admission.run_demand(PR, jobs), 1)
self.assertEqual(admission.run_demand(PR, jobs, yield_to_priority=True), 2)
def test_skipped_priority_jobs_of_other_platforms_are_not_waiting(self):
jobs = [job("build_linux (ubuntu-24.04) / Wait for a macOS runner (priority)",
conclusion="skipped", labels=("ubuntu-24.04",))]
self.assertEqual(admission.run_demand(PR, jobs, yield_to_priority=True), 0)
def test_measure_from_each_line(self):
api = FakeApi({("runs", "pending"): [dict(PR, status="pending")], jobs_path(2): self.WAITING})
total, lines = admission.measure(api, "o/r", "build_all.yml", 99, NOON)
self.assertEqual(total, admission.RESERVE)
self.assertIn("priority, waiting", lines[0])
total, _ = admission.measure(api, "o/r", "build_all.yml", 99, NOON, priority=True)
self.assertEqual(total, 0)
def test_own_waiting_run_is_not_counted(self):
api = FakeApi({("runs", "pending"): [dict(PR, status="pending")], jobs_path(2): self.WAITING})
total, _ = admission.measure(api, "o/r", "build_all.yml", 2, NOON)
self.assertEqual(total, 0)
class FakeApi:
"""Answers GET requests from a dict of path -> list of pages (or one body)."""
def __init__(self, responses):
self.responses = responses
self.calls = []
def get(self, path, **params):
self.calls.append((path, params))
if path.endswith("/runs") and ("status" in params or "created" in params):
runs = self.responses.get(("runs", params.get("status", "recent")), [])
start = (params["page"] - 1) * params["per_page"]
return {"total_count": len(runs), "workflow_runs": runs[start:start + params["per_page"]]}
if path.endswith("/runs"):
return {"workflow_runs": self.responses.get(("runs", params.get("event")), [])[:1]}
if path.endswith("/jobs"):
return {"jobs": self.responses.get(path, [])}
# A run read by its id, by default a pull request with no jobs listed.
return self.responses.get(path, dict(PR, id=int(path.rsplit("/", 1)[-1])))
def jobs_path(run_id):
return f"repos/o/r/actions/runs/{run_id}/jobs"
class MeasureTest(unittest.TestCase):
def test_sums_in_progress_and_queued_runs(self):
queued_pr = dict(PR, id=3, status="queued")
api = FakeApi({
("runs", "in_progress"): [PUSH, PR],
("runs", "queued"): [queued_pr],
jobs_path(1): [CHECK_CACHE],
jobs_path(2): [gate("arm64"), build("arm64")],
jobs_path(3): [gate("arm64"), gate("x86_64"), build("arm64", "queued")],
})
total, lines = admission.measure(api, "o/r", "build_all.yml", 99, NOON)
self.assertEqual(total, admission.RESERVE + 1 + admission.RESERVE)
self.assertEqual(len(lines), 3)
def test_counts_a_pending_run_that_holds_runners(self):
# One of its jobs waits in a concurrency group while its macOS builds run.
pending_pr = dict(PR, status="pending")
api = FakeApi({("runs", "pending"): [pending_pr], jobs_path(2): [gate("arm64"), build("arm64")]})
total, _ = admission.measure(api, "o/r", "build_all.yml", 99, NOON)
self.assertEqual(total, 1)
def test_a_push_waiting_behind_another_holds_nothing(self):
api = FakeApi({("runs", "pending"): [dict(PUSH, status="pending")], jobs_path(1): []})
total, _ = admission.measure(api, "o/r", "build_all.yml", 99, NOON)
self.assertEqual(total, 0)
def test_reads_every_page_of_runs(self):
runs = [dict(PR, id=i) for i in range(150)]
responses = {("runs", "in_progress"): runs}
responses.update({jobs_path(i): [gate("arm64")] for i in range(150)})
total, _ = admission.measure(FakeApi(responses), "o/r", "build_all.yml", 999, NOON)
self.assertEqual(total, 150)
def test_reserves_for_the_nightly_until_its_run_appears(self):
due = datetime.datetime(2026, 10, 10, 2, 10, tzinfo=UTC)
yesterday = {"created_at": "2026-10-09T02:20:00Z"}
total, lines = admission.measure(
FakeApi({("runs", "schedule"): [yesterday]}), "OrcaSlicer/OrcaSlicer", "build_all.yml", 99, due)
self.assertEqual(total, admission.RESERVE)
self.assertIn("nightly", lines[0])
def test_no_nightly_reserve_once_its_run_exists(self):
due = datetime.datetime(2026, 10, 10, 2, 30, tzinfo=UTC)
today = {"created_at": "2026-10-10T02:21:00Z"}
total, _ = admission.measure(
FakeApi({("runs", "schedule"): [today]}), "OrcaSlicer/OrcaSlicer", "build_all.yml", 99, due)
self.assertEqual(total, 0)
def test_no_nightly_reserve_in_a_fork(self):
due = datetime.datetime(2026, 10, 10, 2, 10, tzinfo=UTC)
total, _ = admission.measure(FakeApi({}), "fork/OrcaSlicer", "build_all.yml", 99, due)
self.assertEqual(total, 0)
def test_counts_a_run_in_both_lists_once(self):
api = FakeApi({
("runs", "in_progress"): [PUSH],
("runs", "queued"): [dict(PUSH, status="queued")],
jobs_path(1): [],
})
total, _ = admission.measure(api, "o/r", "build_all.yml", 99, NOON)
self.assertEqual(total, admission.RESERVE)
def test_counts_its_own_run(self):
jobs = [gate("arm64"), build("arm64"), gate("x86_64", "in_progress", None)]
api = FakeApi({("runs", "in_progress"): [PR], jobs_path(2): jobs})
self.assertEqual(admission.measure(api, "o/r", "build_all.yml", 2, NOON)[0], 1)
def test_a_run_whose_other_arch_waits_behind_this_one_does_not_block_it(self):
# The line is A-arm64, B-arm64, A-x86_64. A's arm64 is built and its
# x86_64 is pending behind B, so A must not hold a runner B waits for.
other = dict(PR, id=1, status="pending")
api = FakeApi({
("runs", "pending"): [other, dict(PR, status="pending")],
jobs_path(1): [gate("arm64"), build("arm64", "completed"), gate("x86_64", "pending", None)],
jobs_path(2): [gate("arm64", "in_progress", None)],
})
total, _ = admission.measure(api, "o/r", "build_all.yml", 2, NOON)
self.assertEqual(total, 0)
def test_counts_its_own_run_when_no_status_list_has_it(self):
# The run moves from pending to in_progress as its last gate leaves the
# line, and is in neither list while that gate checks.
jobs = [gate("x86_64"), build("x86_64", "queued"), gate("arm64", "in_progress", None)]
api = FakeApi({jobs_path(2): jobs})
self.assertEqual(admission.measure(api, "o/r", "build_all.yml", 2, NOON)[0], 1)
def test_counts_a_recent_run_that_no_status_list_has(self):
api = FakeApi({("runs", "recent"): [PR], jobs_path(2): [gate("arm64"), build("arm64")]})
self.assertEqual(admission.measure(api, "o/r", "build_all.yml", 99, NOON)[0], 1)
def test_lists_recent_runs_from_a_day_before(self):
api = FakeApi({})
admission.measure(api, "o/r", "build_all.yml", 99, NOON)
self.assertIn(">=2026-10-09T12:00:00Z", [params.get("created") for _, params in api.calls])
def test_finished_recent_runs_are_not_read(self):
done = dict(PUSH, status="completed")
api = FakeApi({("runs", "recent"): [done]})
total, _ = admission.measure(api, "o/r", "build_all.yml", 99, NOON)
self.assertEqual(total, 0)
self.assertNotIn(jobs_path(1), [path for path, _ in api.calls])
def test_no_nightly_lookup_outside_its_window(self):
api = FakeApi({})
admission.measure(api, "o/r", "build_all.yml", 99, NOON)
self.assertFalse(any("event" in params for _, params in api.calls))
class ApiTest(unittest.TestCase):
class Response:
def __init__(self, headers):
self.headers = headers
def __enter__(self):
return self
def __exit__(self, *_):
return False
def read(self):
return b"{}"
def test_reports_calls_and_the_rate_limit_left(self):
api = admission.Api("token")
responses = [self.Response({}),
self.Response({"X-RateLimit-Remaining": "812", "X-RateLimit-Limit": "1000"})]
with mock.patch.object(admission.urllib.request, "urlopen", side_effect=responses):
api.get("first")
calls_before = api.calls
api.get("second")
self.assertEqual(api.usage(0), " API calls this check: 2, rate limit left: 812 of 1000")
self.assertEqual(api.usage(calls_before), " API calls this check: 1, rate limit left: 812 of 1000")
def test_reads_the_rate_limit_from_a_failed_request(self):
api = admission.Api("token")
headers = {"X-RateLimit-Remaining": "0", "X-RateLimit-Limit": "1000"}
error = urllib.error.HTTPError("url", 403, "Forbidden", headers, None)
with mock.patch.object(admission.urllib.request, "urlopen", side_effect=error), \
self.assertRaises(urllib.error.HTTPError):
api.get("runs")
self.assertEqual(api.usage(0), " API calls this check: 1, rate limit left: 0 of 1000")
class WaitTest(unittest.TestCase):
def run_wait(self, results, limit=5, wait_minutes=60, poll_seconds=120):
results = iter(results)
now = [0.0]
def measure_now():
result = next(results)
if isinstance(result, Exception):
raise result
return result, []
def sleep(seconds):
now[0] += seconds
reason = admission.wait(measure_now, limit, wait_minutes, poll_seconds,
clock=lambda: now[0], sleep=sleep, log=lambda _: None)
return reason, now[0]
def test_lets_in_when_a_runner_fits(self):
self.assertEqual(self.run_wait([4]), ("a runner is free", 0))
def test_waits_while_full(self):
self.assertEqual(self.run_wait([5, 6, 4]), ("a runner is free", 240))
def test_lets_in_after_repeated_api_errors(self):
error = urllib.error.URLError("rate limited")
reason, _ = self.run_wait([error, error, error])
self.assertEqual(reason, "the queue could not be read")
def test_a_good_read_resets_the_error_count(self):
error = urllib.error.URLError("rate limited")
reason, _ = self.run_wait([error, error, 5, error, error, 3])
self.assertEqual(reason, "a runner is free")
def test_lets_in_at_the_time_limit(self):
reason, elapsed = self.run_wait([5] * 100, wait_minutes=10, poll_seconds=120)
self.assertEqual(reason, "it waited 10 minutes")
self.assertLess(elapsed, 600)
if __name__ == "__main__":
unittest.main()
+27 -39
View File
@@ -8968,16 +8968,6 @@ static float overhang_fan_overlap_threshold(int overhang_fan_threshold)
} }
} }
static bool overhang_fan_active(float overlap, int overhang_fan_threshold, ExtrusionRole role)
{
if (role == erBridgeInfill || role == erOverhangPerimeter)
return true;
if (overhang_fan_threshold == Overhang_threshold_none)
return is_external_perimeter(role);
const float overlap_threshold = overhang_fan_overlap_threshold(overhang_fan_threshold);
return overlap_threshold >= 0.f && overlap <= overlap_threshold;
}
std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_description, double speed) std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_description, double speed)
{ {
std::string gcode; std::string gcode;
@@ -9336,10 +9326,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d
} }
} }
bool requires_segmented_extrusion = false; bool variable_speed = false;
// A uniform fan state can be represented by the normal path-wide marker. Only a
// transition within the path requires point-by-point emission.
bool path_overhang_fan_active = false;
std::vector<ProcessedPoint> new_points {}; std::vector<ProcessedPoint> new_points {};
const bool need_overhang_detection = NOZZLE_CONFIG(enable_overhang_speed) || const bool need_overhang_detection = NOZZLE_CONFIG(enable_overhang_speed) ||
@@ -9411,21 +9398,13 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d
ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters), ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters),
fan_overlap_threshold); fan_overlap_threshold);
} }
if (!NOZZLE_CONFIG(enable_overhang_speed)) variable_speed = std::any_of(new_points.begin(), new_points.end(),
for (ProcessedPoint &point : new_points) [speed](const ProcessedPoint &p) { return fabs(double(p.speed) - speed) > 1; }); // Ignore small speed variations (under 1mm/sec)
point.speed = speed; if (FILAMENT_CONFIG(enable_overhang_bridge_fan) && m_enable_cooling_markers) {
requires_segmented_extrusion = std::any_of(new_points.begin(), new_points.end(), if (!NOZZLE_CONFIG(enable_overhang_speed))
[speed](const ProcessedPoint &point) { return fabs(double(point.speed) - speed) > 1; }); // Ignore small speed variations (under 1mm/sec) for (ProcessedPoint &point : new_points)
if (FILAMENT_CONFIG(enable_overhang_bridge_fan) && m_enable_cooling_markers && fan_overlap_threshold >= 0.f && point.speed = speed;
!new_points.empty()) { variable_speed = new_points.size() > 1;
path_overhang_fan_active = new_points.front().overlap <= fan_overlap_threshold;
// An overhang-fan state change needs separate extrusion moves so the cooling buffer can insert
// the corresponding fan command between them.
requires_segmented_extrusion = requires_segmented_extrusion ||
std::adjacent_find(new_points.begin(), new_points.end(), [fan_overlap_threshold](const ProcessedPoint &previous,
const ProcessedPoint &current) {
return (previous.overlap <= fan_overlap_threshold) != (current.overlap <= fan_overlap_threshold);
}) != new_points.end();
} }
} }
@@ -9563,17 +9542,22 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d
auto overhang_fan_threshold = FILAMENT_CONFIG(overhang_fan_threshold); auto overhang_fan_threshold = FILAMENT_CONFIG(overhang_fan_threshold);
auto enable_overhang_bridge_fan = FILAMENT_CONFIG(enable_overhang_bridge_fan); auto enable_overhang_bridge_fan = FILAMENT_CONFIG(enable_overhang_bridge_fan);
if (enable_overhang_bridge_fan &&
(path.role() == erBridgeInfill || path.role() == erOverhangPerimeter ||
(overhang_fan_threshold == Overhang_threshold_none && is_external_perimeter(path.role()))))
path_overhang_fan_active = true;
// { "0%", Overhang_threshold_none }, // { "0%", Overhang_threshold_none },
// { "10%", Overhang_threshold_1_4 }, // { "10%", Overhang_threshold_1_4 },
// { "25%", Overhang_threshold_2_4 }, // { "25%", Overhang_threshold_2_4 },
// { "50%", Overhang_threshold_3_4 }, // { "50%", Overhang_threshold_3_4 },
// { "75%", Overhang_threshold_4_4 }, // { "75%", Overhang_threshold_4_4 },
// { "95%", Overhang_threshold_bridge } // { "95%", Overhang_threshold_bridge }
auto check_overhang_fan = [&overhang_fan_threshold](float overlap, ExtrusionRole role) {
if (role == erBridgeInfill || role == erOverhangPerimeter) { // ORCA: Split out bridge infill to internal and external to apply separate fan settings
return true;
}
if (overhang_fan_threshold == Overhang_threshold_none)
return is_external_perimeter(role);
const float overlap_threshold = overhang_fan_overlap_threshold(overhang_fan_threshold);
return overlap_threshold >= 0.f && overlap <= overlap_threshold;
};
std::string comment; std::string comment;
if (m_enable_cooling_markers) { if (m_enable_cooling_markers) {
comment = ";_EXTRUDE_SET_SPEED"; comment = ";_EXTRUDE_SET_SPEED";
@@ -9644,7 +9628,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d
} }
}; };
if (!requires_segmented_extrusion) { if (!variable_speed) {
// F is mm per minute. // F is mm per minute.
if( (std::abs(writer().get_current_speed() - F) > EPSILON) || (std::abs(_mm3_per_mm - m_last_mm3_mm) > EPSILON) ){ if( (std::abs(writer().get_current_speed() - F) > EPSILON) || (std::abs(_mm3_per_mm - m_last_mm3_mm) > EPSILON) ){
// ORCA: Adaptive PA code segment when adjusting PA within the same feature // ORCA: Adaptive PA code segment when adjusting PA within the same feature
@@ -9694,7 +9678,11 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d
{ {
if (m_enable_cooling_markers) { if (m_enable_cooling_markers) {
if (enable_overhang_bridge_fan) { if (enable_overhang_bridge_fan) {
append_role_based_fan_marker(erOverhangPerimeter, "_OVERHANG"sv, path_overhang_fan_active); // BBS: Overhang_threshold_none means Overhang_threshold_1_4 and forcing cooling for all external
// perimeter
append_role_based_fan_marker(erOverhangPerimeter, "_OVERHANG"sv,
(overhang_fan_threshold == Overhang_threshold_none && is_external_perimeter(path.role())) ||
(path.role() == erBridgeInfill || path.role() == erOverhangPerimeter)); // ORCA: Add support for separate internal bridge fan speed control
// ORCA: Add support for separate internal bridge fan speed control // ORCA: Add support for separate internal bridge fan speed control
append_role_based_fan_marker(erInternalBridgeInfill, "_INTERNAL_BRIDGE"sv, path.role() == erInternalBridgeInfill); append_role_based_fan_marker(erInternalBridgeInfill, "_INTERNAL_BRIDGE"sv, path.role() == erInternalBridgeInfill);
@@ -9844,7 +9832,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d
bool pre_fan_enabled = false; bool pre_fan_enabled = false;
bool cur_fan_enabled = false; bool cur_fan_enabled = false;
if( m_enable_cooling_markers && enable_overhang_bridge_fan) if( m_enable_cooling_markers && enable_overhang_bridge_fan)
pre_fan_enabled = overhang_fan_active(new_points[0].overlap, overhang_fan_threshold, path.role()); pre_fan_enabled = check_overhang_fan(new_points[0].overlap, path.role());
if(path.role() == erInternalBridgeInfill) // ORCA: Add support for separate internal bridge fan speed control if(path.role() == erInternalBridgeInfill) // ORCA: Add support for separate internal bridge fan speed control
pre_fan_enabled = true; pre_fan_enabled = true;
@@ -9858,7 +9846,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d
tag_belt_band((pre_processed_point.p.x() + processed_point.p.x()) / 2, (pre_processed_point.p.y() + processed_point.p.y()) / 2); tag_belt_band((pre_processed_point.p.x() + processed_point.p.x()) / 2, (pre_processed_point.p.y() + processed_point.p.y()) / 2);
if (m_enable_cooling_markers) { if (m_enable_cooling_markers) {
if (enable_overhang_bridge_fan) { if (enable_overhang_bridge_fan) {
cur_fan_enabled = overhang_fan_active(processed_point.overlap, overhang_fan_threshold, path.role()); cur_fan_enabled = check_overhang_fan(processed_point.overlap, path.role());
append_role_based_fan_marker(erOverhangPerimeter, "_OVERHANG"sv, pre_fan_enabled && cur_fan_enabled); append_role_based_fan_marker(erOverhangPerimeter, "_OVERHANG"sv, pre_fan_enabled && cur_fan_enabled);
pre_fan_enabled = cur_fan_enabled; pre_fan_enabled = cur_fan_enabled;
@@ -9961,7 +9949,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d
m_writer.extrude_to_xyz(gcode, dest3d, dE * e_ratio, flow_description.empty() ? description : flow_description); m_writer.extrude_to_xyz(gcode, dest3d, dE * e_ratio, flow_description.empty() ? description : flow_description);
} }
// Inline farthest-point snapshot on the segmented emission path. Inert unless the // Inline farthest-point snapshot on the variable-speed emission path. Inert unless the
// farthest-point subsystem is on, matching the other paths. // farthest-point subsystem is on, matching the other paths.
check_and_insert_timelapse(processed_point.p.to_point()); check_and_insert_timelapse(processed_point.p.to_point());
+2
View File
@@ -571,6 +571,8 @@ set(SLIC3R_GUI_SOURCES
GUI/UserNotification.hpp GUI/UserNotification.hpp
GUI/UVEditorCanvas.cpp GUI/UVEditorCanvas.cpp
GUI/UVEditorCanvas.hpp GUI/UVEditorCanvas.hpp
GUI/WebDownPluginDlg.cpp
GUI/WebDownPluginDlg.hpp
GUI/WebGuideDialog.cpp GUI/WebGuideDialog.cpp
GUI/WebGuideDialog.hpp GUI/WebGuideDialog.hpp
GUI/WebUserLoginDialog.cpp GUI/WebUserLoginDialog.cpp
+56 -103
View File
@@ -206,52 +206,19 @@ constexpr const char* kPlateGotoPrefix = "orca_plate_goto";
constexpr const char* kRecentProjectPrefix = "orca_recent_project"; constexpr const char* kRecentProjectPrefix = "orca_recent_project";
// Display context for a setting action's eyebrow, e.g. the "Process" in "Process : Quality : Layers". // Display context for a setting action's eyebrow, e.g. the "Process" in "Process : Quality : Layers".
// Keyed by the option's preset type so the palette reads like the settings sidebar tabs. Untranslated: // Keyed by the option's preset type so the palette reads like the settings sidebar tabs.
// the caller translates it for the displayed breadcrumb and keeps it for the English one. std::string setting_type_context(Preset::Type type)
const char* setting_type_context(Preset::Type type)
{ {
switch (type) { switch (type) {
case Preset::TYPE_FILAMENT: case Preset::TYPE_FILAMENT:
case Preset::TYPE_SLA_MATERIAL: return L("Filament"); case Preset::TYPE_SLA_MATERIAL: return _u8L("Filament");
case Preset::TYPE_PRINTER: return L("Printer"); case Preset::TYPE_PRINTER: return _u8L("Printer");
case Preset::TYPE_PRINT: case Preset::TYPE_PRINT:
case Preset::TYPE_SLA_PRINT: case Preset::TYPE_SLA_PRINT:
default: return L("Process"); default: return _u8L("Process");
} }
} }
// A setting's text in one language. The displayed text and its English search aliases both come from
// here, so in an English UI the two are equal and no alias is sent.
struct SettingText
{
std::string title; // the label the settings row draws
std::string full_label; // the descriptive ConfigOptionDef name when it differs from title: a
// search-only alias ("overhang reversal" still finds "Reverse on even")
std::string source; // the full settings path "Process : Quality : Layers". The JS renders
// group || source and searches every field, so putting the whole path in
// source both displays it and makes it matchable by any segment.
};
SettingText setting_text(const std::wstring& def_label, const std::string& display_label, const wxString& row_label, bool row_multi,
const std::string& type_name, const std::wstring& category, const std::wstring& group)
{
SettingText text;
const std::string def = boost::nowide::narrow(def_label);
text.title = into_u8(Search::resolve_setting_title(from_u8(display_label), row_label, row_multi));
if (text.title.empty())
text.title = def;
if (text.title != def)
text.full_label = def;
std::wstring path = boost::nowide::widen(type_name);
if (!category.empty())
path += L" : " + category;
if (!group.empty())
path += L" : " + group;
text.source = boost::nowide::narrow(path);
return text;
}
// Stable, non-localized mode token for the webview, which maps it to a badge ("Developer" etc.). // Stable, non-localized mode token for the webview, which maps it to a badge ("Developer" etc.).
const char* mode_key(ConfigOptionMode mode) const char* mode_key(ConfigOptionMode mode)
{ {
@@ -338,9 +305,8 @@ struct PlateAction : AppAction
PlateAction(int index, std::string title, std::string source_name) PlateAction(int index, std::string title, std::string source_name)
: AppAction(AppActionId{id_for(index)}, std::move(title), kOrcaSourceKey, std::move(source_name)), plate_index(index) : AppAction(AppActionId{id_for(index)}, std::move(title), kOrcaSourceKey, std::move(source_name)), plate_index(index)
{ {
this->kind = AppActionKind::Command; this->kind = AppActionKind::Command;
this->group_en = L("Plate"); this->group = _u8L("Plate");
this->group = I18N::translate_utf8(this->group_en);
} }
AppActionRunResult run(const std::string& /*param*/) const override AppActionRunResult run(const std::string& /*param*/) const override
@@ -362,9 +328,8 @@ struct RecentProjectAction : AppAction
RecentProjectAction(std::string path, std::string title, std::string source) RecentProjectAction(std::string path, std::string title, std::string source)
: AppAction(AppActionId{id_for(path)}, std::move(title), kOrcaSourceKey, std::move(source)), file_path(std::move(path)) : AppAction(AppActionId{id_for(path)}, std::move(title), kOrcaSourceKey, std::move(source)), file_path(std::move(path))
{ {
this->kind = AppActionKind::Command; this->kind = AppActionKind::Command;
this->group_en = L("Recent Projects"); this->group = _u8L("Recent Projects");
this->group = I18N::translate_utf8(this->group_en);
} }
AppActionRunResult run(const std::string& /*param*/) const override AppActionRunResult run(const std::string& /*param*/) const override
@@ -377,30 +342,6 @@ struct RecentProjectAction : AppAction
} // namespace } // namespace
nlohmann::json action_json(const AppAction& a)
{
nlohmann::json j({{"id", a.id()},
{"title", a.title()},
{"full_label", a.full_label},
{"source", a.source_name()},
{"group", a.group},
{"kind", a.kind == AppActionKind::Plugin ? "plugin" : "command"},
{"input", a.input},
{"icon", a.icon},
{"mode", mode_key(a.required_mode)},
{"desc", a.tooltip},
{"wiki", !a.help_url.empty()}});
auto add_alias = [&j](const char* key, const std::string& english, const std::string& local) {
if (!english.empty() && english != local)
j[key] = english;
};
add_alias("title_en", a.title_en, a.title());
add_alias("group_en", a.group_en, a.group);
add_alias("source_en", a.source_en, a.source_name());
add_alias("full_label_en", a.full_label_en, a.full_label);
return j;
}
ActionRegistry::~ActionRegistry() = default; ActionRegistry::~ActionRegistry() = default;
void ActionRegistry::init() void ActionRegistry::init()
@@ -489,8 +430,7 @@ void ActionRegistry::relocalize_builtins()
// Drop only the built-in commands; plugins and the dynamically materialised families are // Drop only the built-in commands; plugins and the dynamically materialised families are
// either unlocalized or rebuilt per snapshot. remove() only erases the map entry, and upsert() // either unlocalized or rebuilt per snapshot. remove() only erases the map entry, and upsert()
// re-seeds favourites/stats from config, so key-based ids keep their pinned state. make_action() // re-seeds favourites/stats from config, so key-based ids keep their pinned state.
// translates in the new locale.
std::vector<std::string> stale; std::vector<std::string> stale;
for (const auto& [id, action] : m_actions) for (const auto& [id, action] : m_actions)
if (action->source_key() == kOrcaSourceKey && action->kind == AppActionKind::Command) if (action->source_key() == kOrcaSourceKey && action->kind == AppActionKind::Command)
@@ -498,6 +438,7 @@ void ActionRegistry::relocalize_builtins()
for (const std::string& id : stale) for (const std::string& id : stale)
remove(id); remove(id);
NativeCommands::rebuild_catalog();
for (const NativeCommand& c : NativeCommands::catalog()) for (const NativeCommand& c : NativeCommands::catalog())
upsert(NativeCommands::make_action(c)); upsert(NativeCommands::make_action(c));
} }
@@ -731,22 +672,28 @@ void ActionRegistry::materialize_setting_actions()
const std::string id = SettingAction::id_for(opt.opt_key(), opt.type); const std::string id = SettingAction::id_for(opt.opt_key(), opt.type);
seen.insert(id); seen.insert(id);
// The localized text the page shows, and its English search aliases from the untranslated row // The page draws Line::label; the descriptive ConfigOptionDef name stays a search-only alias
// label, def name and breadcrumb. // ("overhang reversal" still finds "Reverse on even").
const char* type_context = setting_type_context(opt.type); const std::string search_label = boost::nowide::narrow(opt.label_local.empty() ? opt.label : opt.label_local);
SettingText local = setting_text(opt.label_local.empty() ? opt.label : opt.label_local, opt.display_label, row.label, row.multi, std::string title = into_u8(Search::resolve_setting_title(from_u8(opt.display_label), row.label, row.multi));
I18N::translate_utf8(type_context), opt.category_local, opt.group_local); if (title.empty())
SettingText english = setting_text(opt.label, opt.display_label_en, row.label_en, row.multi, type_context, title = search_label;
Tab::translate_category(opt.category, opt.type, false).ToStdWstring(), opt.group);
// group stays empty so the source path is the single display/search breadcrumb rather than // Eyebrow/source = the full settings path "Process : Quality : Layers" (localized). The JS
// being duplicated. // renders group || source and searches source + " " + group, so putting the whole path in
auto action = std::make_unique<SettingAction>(opt.opt_key(), opt.type, local.title, std::string(), opt.category, local.source, // source both displays it and makes it matchable by any segment (e.g. a "quality" query).
opt.mode); std::wstring path = boost::nowide::widen(setting_type_context(opt.type));
action->full_label = std::move(local.full_label); if (!opt.category_local.empty())
action->title_en = std::move(english.title); path += L" : " + opt.category_local;
action->full_label_en = std::move(english.full_label); if (!opt.group_local.empty())
action->source_en = std::move(english.source); path += L" : " + opt.group_local;
// title = the label the settings row draws; group stays empty so the source path (above) is
// the single display/search breadcrumb rather than being duplicated.
auto action = std::make_unique<SettingAction>(opt.opt_key(), opt.type, title, std::string(), opt.category,
boost::nowide::narrow(path), opt.mode);
if (title != search_label)
action->full_label = search_label;
// Tile pictogram = the icon of the setting's own group header (e.g. Advanced -> param_advanced), // Tile pictogram = the icon of the setting's own group header (e.g. Advanced -> param_advanced),
// the one shown next to it in the page. Fall back to the page/category icon for groups // the one shown next to it in the page. Fall back to the page/category icon for groups
@@ -804,14 +751,13 @@ void ActionRegistry::materialize_plate_actions()
seen.insert(id); seen.insert(id);
// "Go to Plate N" + " (name)" when the plate is named, matching the object-list label. // "Go to Plate N" + " (name)" when the plate is named, matching the object-list label.
const char* go_to_plate = L("Go to Plate"); std::string title(_u8L("Go to Plate"));
std::string suffix = " " + std::to_string(i + 1); title += " " + std::to_string(i + 1);
const std::string name = plate->get_plate_name(); const std::string name = plate->get_plate_name();
if (!name.empty()) if (!name.empty())
suffix += " (" + name + ")"; title += " (" + name + ")";
auto action = std::make_unique<PlateAction>(int(i), I18N::translate_utf8(go_to_plate) + suffix, kOrcaSourceName); auto action = std::make_unique<PlateAction>(int(i), title, kOrcaSourceName);
action->title_en = go_to_plate + suffix;
seed_from(stats, favs, id, *action); seed_from(stats, favs, id, *action);
auto const action_id = action->id(); auto const action_id = action->id();
auto const app_action = std::shared_ptr<AppAction>(std::move(action)); auto const app_action = std::shared_ptr<AppAction>(std::move(action));
@@ -922,9 +868,23 @@ nlohmann::json ActionRegistry::snapshot()
return a->id() < b->id(); return a->id() < b->id();
}); });
auto action_to_json = [](const AppAction* a) {
return nlohmann::json({{"id", a->id()},
{"title", a->title()},
{"full_label", a->full_label},
{"source", a->source_name()},
{"group", a->group},
{"kind", a->kind == AppActionKind::Plugin ? "plugin" : "command"},
{"input", a->input},
{"icon", a->icon},
{"mode", mode_key(a->required_mode)},
{"desc", a->tooltip},
{"wiki", !a->help_url.empty()}});
};
nlohmann::json actions = nlohmann::json::array(); nlohmann::json actions = nlohmann::json::array();
for (const AppAction* a : sorted) for (const AppAction* a : sorted)
actions.push_back(action_json(*a)); actions.push_back(action_to_json(a));
// why: favourites is the ORDERED pin list - it must come from favourite_actions // why: favourites is the ORDERED pin list - it must come from favourite_actions
// as stored, not be re-derived from the frecency-sorted actions (that would // as stored, not be re-derived from the frecency-sorted actions (that would
@@ -957,7 +917,7 @@ nlohmann::json ActionRegistry::snapshot()
recent.resize(recent_limit); recent.resize(recent_limit);
nlohmann::json recent_json = nlohmann::json::array(); nlohmann::json recent_json = nlohmann::json::array();
for (const AppAction* a : recent) for (const AppAction* a : recent)
recent_json.push_back(action_json(*a)); recent_json.push_back(action_to_json(a));
return {{"actions", std::move(actions)}, return {{"actions", std::move(actions)},
{"favourites", std::move(favourites)}, {"favourites", std::move(favourites)},
@@ -977,21 +937,14 @@ nlohmann::json ActionRegistry::tab_options() const
MainFrame* mf = wxGetApp().mainframe; MainFrame* mf = wxGetApp().mainframe;
if (!mf || !mf->m_tabpanel) if (!mf || !mf->m_tabpanel)
return out; return out;
// English labels of the built-in pages whose id is not already their English name, so the tab
// picker can be searched in English in any UI language.
static const std::unordered_map<std::string, const char*> english_labels{
{TAB_ID_MONITOR, L("Device")}, {TAB_ID_MONITOR_WEB, L("Device (Web)")}, {TAB_ID_MULTI_DEVICE, L("Multi-device")}};
Notebook* notebook = mf->m_tabpanel; Notebook* notebook = mf->m_tabpanel;
for (size_t i = 0; i < notebook->GetPageCount(); ++i) { for (size_t i = 0; i < notebook->GetPageCount(); ++i) {
const wxString id = notebook->GetPageName(i); const wxString id = notebook->GetPageName(i);
if (id.empty()) if (id.empty())
continue; continue;
const std::string title = notebook->GetPageLabel(i).ToStdString(); out.push_back({{"id", id.ToStdString()},
nlohmann::json tab({{"id", id.ToStdString()}, {"title", title}, {"icon", notebook->GetPageIcon(i)}}); {"title", notebook->GetPageLabel(i).ToStdString()},
if (auto it = english_labels.find(id.ToStdString()); it != english_labels.end() && title != it->second) {"icon", notebook->GetPageIcon(i)}});
tab["title_en"] = it->second;
out.push_back(std::move(tab));
} }
return out; return out;
} }
-13
View File
@@ -88,14 +88,6 @@ struct AppAction
// Search-only alias when the title differs from the descriptive ConfigOptionDef name (e.g. title // Search-only alias when the title differs from the descriptive ConfigOptionDef name (e.g. title
// "Reverse on even", full_label "Overhang reversal"). Empty when the two agree. // "Reverse on even", full_label "Overhang reversal"). Empty when the two agree.
std::string full_label; std::string full_label;
// Search-only English counterparts of title(), group, source_name() and full_label, so a
// localized UI can still be searched in English. Each is derived exactly like the localized
// text it mirrors, minus the translation, so in an English UI it equals that text. Empty when
// there is no translated counterpart.
std::string title_en;
std::string group_en;
std::string source_en;
std::string full_label_en;
// Full wiki URL, when the action has one (SettingActions whose row declared a label_path). // Full wiki URL, when the action has one (SettingActions whose row declared a label_path).
std::string help_url; std::string help_url;
@@ -146,11 +138,6 @@ inline bool requires_mode_switch(ConfigOptionMode setting_mode, ConfigOptionMode
// hand-edited config must never grow the quick-launch bar past `limit`, and a duplicated id must collapse to its first pin. // hand-edited config must never grow the quick-launch bar past `limit`, and a duplicated id must collapse to its first pin.
std::vector<std::string> cap_favourites(const std::vector<std::string>& ids, size_t limit); std::vector<std::string> cap_favourites(const std::vector<std::string>& ids, size_t limit);
// One action as the Speed Dial page receives it. Each English alias (title_en, group_en, source_en,
// full_label_en) is sent only when it is non-empty and differs from its localized counterpart, so an
// English UI receives none and searches exactly the displayed text.
nlohmann::json action_json(const AppAction& a);
// Self-contained sink and single owner of runnable actions for the app session. // Self-contained sink and single owner of runnable actions for the app session.
// //
// Workflow: // Workflow:
+1 -1
View File
@@ -1020,7 +1020,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, in
const BrimType brim_type = config->opt_enum<BrimType>("brim_type"); const BrimType brim_type = config->opt_enum<BrimType>("brim_type");
const bool have_auto_brim_ear = brim_type == btEar && !is_belt_tilted; const bool have_auto_brim_ear = brim_type == btEar && !is_belt_tilted;
const bool have_painted_brim_ear = brim_type == btPainted && !is_belt_tilted; const bool have_painted_brim_ear = brim_type == btPainted && !is_belt_tilted;
set_option_label("brim_width", have_auto_brim_ear ? L("Brim ear radius") : L("Brim width")); set_option_label("brim_width", have_auto_brim_ear ? _L("Brim ear radius") : _L("Brim width"));
const auto brim_width = config->opt_float("brim_width"); const auto brim_width = config->opt_float("brim_width");
// Automatic brim ear settings require a non-zero brim width. // Automatic brim ear settings require a non-zero brim width.
toggle_field("brim_ears_max_angle", brim_width > 0.0f); toggle_field("brim_ears_max_angle", brim_width > 0.0f);
-2
View File
@@ -80,8 +80,6 @@ public:
t_config_option_keys const &applying_keys() const; t_config_option_keys const &applying_keys() const;
void toggle_field(const std::string& field_key, const bool toggle, int opt_index = -1); void toggle_field(const std::string& field_key, const bool toggle, int opt_index = -1);
void toggle_line(const std::string& field_key, const bool toggle, int opt_index = -1); void toggle_line(const std::string& field_key, const bool toggle, int opt_index = -1);
// Renames an option's row. `label` is the untranslated English msgid (an L("...") string); the
// row translates it for display.
void set_option_label(const std::string& field_key, const wxString& label, int opt_index = -1); void set_option_label(const std::string& field_key, const wxString& label, int opt_index = -1);
// FFF print // FFF print
@@ -64,20 +64,6 @@ void ExportPresetBundleDialog::Init()
wxSize(820, 660), wxSize(640, 640)); wxSize(820, 660), wxSize(640, 640));
} }
nlohmann::json ExportPresetBundleDialog::localized_strings() const
{
return {
{"printer", _u8L("Printer")},
{"filament", _u8L("Filament")},
{"process", _u8L("Process")},
{"all", _u8L("All")},
{"no_items", _u8L("No items")},
{"export_cloud", _u8L("Export to OrcaCloud")},
{"export_folder", _u8L("Export to folder")},
{"close", _u8L("Close")},
};
}
void ExportPresetBundleDialog::on_script_message(const nlohmann::json& j) void ExportPresetBundleDialog::on_script_message(const nlohmann::json& j)
{ {
if (handle_common_script_command(j)) if (handle_common_script_command(j))
@@ -8,7 +8,6 @@
#include "libslic3r/AppConfig.hpp" #include "libslic3r/AppConfig.hpp"
#include "libslic3r/Preset.hpp" #include "libslic3r/Preset.hpp"
#include <slic3r/GUI/GUI.hpp> #include <slic3r/GUI/GUI.hpp>
#include <nlohmann/json_fwd.hpp>
#include <wx/chartype.h> #include <wx/chartype.h>
#include <unordered_map> #include <unordered_map>
#include <string> #include <string>
@@ -67,7 +66,6 @@ public:
void InitExportData(); void InitExportData();
void on_script_message(const nlohmann::json& payload) override; void on_script_message(const nlohmann::json& payload) override;
nlohmann::json localized_strings() const override;
void OnRequestPresets(); void OnRequestPresets();
void OnExportData(const wxString& path, const wxString& name, nlohmann::json data); void OnExportData(const wxString& path, const wxString& name, nlohmann::json data);
+2 -15
View File
@@ -379,24 +379,14 @@ void FilamentGroupPopup::OnTimer(wxTimerEvent &event)
// leaving event got triggered. So the timer is stopped first, then started // leaving event got triggered. So the timer is stopped first, then started
// again, causing the popup being dismissed immediately. // again, causing the popup being dismissed immediately.
// To fix this, we check if cursor is still inside the popup window before // To fix this, we check if cursor is still inside the popup window before
// dismissing, and keep checking while it is: a leave event is not guaranteed // dismissing.
// to follow, and a popup left open keeps grabbing the mouse capture.
wxPoint pos = this->ScreenToClient(wxGetMousePosition()); wxPoint pos = this->ScreenToClient(wxGetMousePosition());
if (this->GetClientRect().Contains(pos)) { if (this->GetClientRect().Contains(pos)) return;
StartTimer();
return;
}
#endif #endif
Dismiss(); Dismiss();
} }
FilamentGroupPopup::~FilamentGroupPopup()
{
m_timer->Stop();
delete m_timer;
}
void FilamentGroupPopup::Dismiss() { void FilamentGroupPopup::Dismiss() {
m_active = false; m_active = false;
PopupWindow::Dismiss(); PopupWindow::Dismiss();
@@ -415,10 +405,7 @@ void FilamentGroupPopup::OnEnterWindow(wxMouseEvent &)
// Ignore spurious ENTER synthesized by PopupWindow::OnMouseEvent2 on macOS. // Ignore spurious ENTER synthesized by PopupWindow::OnMouseEvent2 on macOS.
wxPoint pos = this->ScreenToClient(wxGetMousePosition()); wxPoint pos = this->ScreenToClient(wxGetMousePosition());
if (!this->GetClientRect().Contains(pos)) return; if (!this->GetClientRect().Contains(pos)) return;
// On macOS the timer keeps running instead, and OnTimer closes the popup once the cursor has left it.
#ifndef __APPLE__
ResetTimer(); ResetTimer();
#endif
} }
void FilamentGroupPopup::UpdateButtonStatus(int hover_idx) void FilamentGroupPopup::UpdateButtonStatus(int hover_idx)
-1
View File
@@ -27,7 +27,6 @@ class FilamentGroupPopup : public PopupWindow
{ {
public: public:
FilamentGroupPopup(wxWindow *parent); FilamentGroupPopup(wxWindow *parent);
~FilamentGroupPopup() override;
void tryPopup(Plater* plater,PartPlate* plate, bool slice_all); void tryPopup(Plater* plater,PartPlate* plate, bool slice_all);
void tryClose(); void tryClose();
void Dismiss() override; void Dismiss() override;
-9
View File
@@ -20,8 +20,6 @@
#include <wx/gdicmn.h> #include <wx/gdicmn.h>
#include <wx/dialog.h> #include <wx/dialog.h>
#include "slic3r/GUI/FilamentMapPanel.hpp" #include "slic3r/GUI/FilamentMapPanel.hpp"
#include "slic3r/GUI/FilamentGroupPopup.hpp"
#include "slic3r/GUI/MainFrame.hpp"
namespace Slic3r { namespace GUI { namespace Slic3r { namespace GUI {
@@ -379,13 +377,6 @@ FilamentMapMode FilamentMapDialog::get_mode()
int FilamentMapDialog::ShowModal() int FilamentMapDialog::ShowModal()
{ {
// The Slice-plate hover popup is a transient popup that keeps grabbing the mouse
// capture while shown. Left behind this modal dialog it would starve the dialog of
// mouse events, so close it synchronously first, whichever path opened the dialog.
if (MainFrame* frame = wxGetApp().mainframe;
frame && frame->m_filament_group_popup && frame->m_filament_group_popup->IsShown())
frame->m_filament_group_popup->Dismiss();
update_panel_status(m_page_type); update_panel_status(m_page_type);
return wxDialog::ShowModal(); return wxDialog::ShowModal();
} }
+6
View File
@@ -2309,6 +2309,12 @@ wxBoxSizer* MainFrame::create_side_tools()
bool slice = true; bool slice = true;
// The Slice-plate hover popup is a transient popup that keeps grabbing
// the mouse capture while shown. Left behind the modal grouping dialog it
// would starve that dialog of mouse events, so close it synchronously first.
if (m_filament_group_popup)
m_filament_group_popup->Dismiss();
auto curr_plate = m_plater->get_partplate_list().get_curr_plate(); auto curr_plate = m_plater->get_partplate_list().get_curr_plate();
#ifdef __linux__ #ifdef __linux__
PresetBundle* preset = wxGetApp().preset_bundle; PresetBundle* preset = wxGetApp().preset_bundle;
+113 -106
View File
@@ -142,24 +142,19 @@ struct CommandAction : AppAction
AppActionRunResult run(const std::string& param) const override { return NativeCommands::run(command_key, param); } AppActionRunResult run(const std::string& param) const override { return NativeCommands::run(command_key, param); }
explicit CommandAction(const NativeCommand& c) explicit CommandAction(const NativeCommand& c)
: AppAction(AppActionId{AppAction::compose_id(kCommandPrefix, c.key, kOrcaSourceKey)}, I18N::translate_utf8(c.title), kOrcaSourceKey, : AppAction(AppActionId{AppAction::compose_id(kCommandPrefix, c.key, kOrcaSourceKey)}, c.title, kOrcaSourceKey, kOrcaSourceName)
kOrcaSourceName)
, command_key(c.key) , command_key(c.key)
{ {
this->kind = AppActionKind::Command; this->kind = AppActionKind::Command;
this->group = I18N::translate_utf8(c.group); this->group = c.group;
this->title_en = c.title; this->input = c.input;
this->group_en = c.group; this->icon = c.icon;
this->input = c.input;
this->icon = c.icon;
} }
}; };
std::vector<NativeCommand> build_command_catalog() std::vector<NativeCommand> build_command_catalog()
{ {
std::vector<NativeCommand> out; std::vector<NativeCommand> out;
// `title` and `group` are the untranslated English msgids, L("...")-marked at each call so xgettext
// extracts them.
auto add = [&](std::string key, std::string title, std::string group, std::function<AppActionRunResult(const std::string&)> runner, auto add = [&](std::string key, std::string title, std::string group, std::function<AppActionRunResult(const std::string&)> runner,
std::string input = {}, std::string icon = {}) { std::string input = {}, std::string icon = {}) {
out.push_back({std::move(key), std::move(title), std::move(group), std::move(input), std::move(icon), std::move(runner)}); out.push_back({std::move(key), std::move(title), std::move(group), std::move(input), std::move(icon), std::move(runner)});
@@ -171,7 +166,7 @@ std::vector<NativeCommand> build_command_catalog()
}; };
// ---- Slice & Export ---- // ---- Slice & Export ----
add_with_icon("slice_and_preview", L("Slice and Preview"), L("Slice & Export"), "media_play", [](const std::string&) { add_with_icon("slice_and_preview", _u8L("Slice and Preview"), _u8L("Slice & Export"), "media_play", [](const std::string&) {
Plater* plater = wxGetApp().plater(); Plater* plater = wxGetApp().plater();
if (plater) { if (plater) {
plater->reslice(); plater->reslice();
@@ -183,7 +178,7 @@ std::vector<NativeCommand> build_command_catalog()
}); });
add_with_icon( add_with_icon(
"go_to_layer", L("Go to layer (percent)"), L("Commands"), "height_range_layer", "go_to_layer", _u8L("Go to layer (percent)"), _u8L("Commands"), "height_range_layer",
[](const std::string& param) { [](const std::string& param) {
Plater* plater = wxGetApp().plater(); Plater* plater = wxGetApp().plater();
if (plater) { if (plater) {
@@ -199,7 +194,7 @@ std::vector<NativeCommand> build_command_catalog()
// "go_to_tab" is two-phase: the palette collects the tab after activating it, then hands the tab // "go_to_tab" is two-phase: the palette collects the tab after activating it, then hands the tab
// id back as `param` (same contract as go_to_layer's percent). // id back as `param` (same contract as go_to_layer's percent).
add( add(
"go_to_tab", L("Go to tab..."), L("Commands"), "go_to_tab", _u8L("Go to tab..."), _u8L("Commands"),
[](const std::string& param) { [](const std::string& param) {
if (MainFrame* mf = wxGetApp().mainframe; mf && !param.empty()) if (MainFrame* mf = wxGetApp().mainframe; mf && !param.empty())
mf->select_tab(from_u8(param)); mf->select_tab(from_u8(param));
@@ -207,41 +202,41 @@ std::vector<NativeCommand> build_command_catalog()
}, },
"tab"); "tab");
add_with_icon("load_project", L("Load Project"), L("Commands"), "menu_open", [](const std::string&) { add_with_icon("load_project", _u8L("Load Project"), _u8L("Commands"), "menu_open", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->load_project(); plater->load_project();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("save_project", L("Save Project"), L("Commands"), "menu_save", [](const std::string&) { add_with_icon("save_project", _u8L("Save Project"), _u8L("Commands"), "menu_save", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->save_project(false); plater->save_project(false);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("save_project_as", L("Save Project As"), L("Commands"), "menu_save", [](const std::string&) { add_with_icon("save_project_as", _u8L("Save Project As"), _u8L("Commands"), "menu_save", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->save_project(true); plater->save_project(true);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("open_preferences", L("Preferences"), L("Commands"), "cog", [](const std::string&) { add_with_icon("open_preferences", _u8L("Preferences"), _u8L("Commands"), "cog", [](const std::string&) {
wxGetApp().open_preferences(); wxGetApp().open_preferences();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
// ---- Mode ---- // ---- Mode ----
add_with_icon("mode_simple", L("Mode: Simple"), L("Mode"), "advanced", [](const std::string&) { add_with_icon("mode_simple", _u8L("Mode: Simple"), _u8L("Mode"), "advanced", [](const std::string&) {
wxGetApp().set_mode(comSimple); wxGetApp().set_mode(comSimple);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("mode_advanced", L("Mode: Advanced"), L("Mode"), "advanced", [](const std::string&) { add_with_icon("mode_advanced", _u8L("Mode: Advanced"), _u8L("Mode"), "advanced", [](const std::string&) {
wxGetApp().set_mode(comAdvanced); wxGetApp().set_mode(comAdvanced);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("mode_expert", L("Mode: Expert"), L("Mode"), "advanced", [](const std::string&) { add_with_icon("mode_expert", _u8L("Mode: Expert"), _u8L("Mode"), "advanced", [](const std::string&) {
wxGetApp().set_mode(comExpert); wxGetApp().set_mode(comExpert);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
// Mirrors Preferences > Developer > Developer mode: flip the flag, persist, refresh the UI. // Mirrors Preferences > Developer > Developer mode: flip the flag, persist, refresh the UI.
add_with_icon("toggle_developer_mode", L("Toggle Developer Mode"), L("Mode"), "advanced", [](const std::string&) { add_with_icon("toggle_developer_mode", _u8L("Toggle Developer Mode"), _u8L("Mode"), "advanced", [](const std::string&) {
GUI_App& app = wxGetApp(); GUI_App& app = wxGetApp();
const bool on = !app.app_config->get_bool("developer_mode"); const bool on = !app.app_config->get_bool("developer_mode");
app.app_config->set_bool("developer_mode", on); app.app_config->set_bool("developer_mode", on);
@@ -251,27 +246,27 @@ std::vector<NativeCommand> build_command_catalog()
}); });
// ---- Export pipeline ---- // ---- Export pipeline ----
add_with_icon("export_gcode", L("Export G-code"), L("Slice & Export"), "custom-gcode_gcode", [](const std::string&) { add_with_icon("export_gcode", _u8L("Export G-code"), _u8L("Slice & Export"), "custom-gcode_gcode", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->export_gcode(false); plater->export_gcode(false);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("export_stl", L("Export STL"), L("Slice & Export"), "save", [](const std::string&) { add_with_icon("export_stl", _u8L("Export STL"), _u8L("Slice & Export"), "save", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->export_stl(); plater->export_stl();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("export_3mf", L("Export 3MF"), L("Slice & Export"), "menu_save", [](const std::string&) { add_with_icon("export_3mf", _u8L("Export 3MF"), _u8L("Slice & Export"), "menu_save", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->export_core_3mf(); plater->export_core_3mf();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("export_sliced_file", L("Export Sliced File"), L("Slice & Export"), "save", [](const std::string&) { add_with_icon("export_sliced_file", _u8L("Export Sliced File"), _u8L("Slice & Export"), "save", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->export_gcode_3mf(false); plater->export_gcode_3mf(false);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("export_all_sliced_file", L("Export All Sliced Files"), L("Slice & Export"), "save", [](const std::string&) { add_with_icon("export_all_sliced_file", _u8L("Export All Sliced Files"), _u8L("Slice & Export"), "save", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->export_gcode_3mf(true); plater->export_gcode_3mf(true);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
@@ -280,39 +275,39 @@ std::vector<NativeCommand> build_command_catalog()
// ---- Calibration ---- // ---- Calibration ----
// The tab-strip calib_sf glyph is drawn white for the dark tab bar and vanishes on the palette's // The tab-strip calib_sf glyph is drawn white for the dark tab bar and vanishes on the palette's
// light tile, so each wizard borrows the matching settings-group icon instead (gray + accent green). // light tile, so each wizard borrows the matching settings-group icon instead (gray + accent green).
add_with_icon("calib_temperature", L("Temperature Calibration"), L("Calibration"), "param_temperature", add_with_icon("calib_temperature", _u8L("Temperature Calibration"), _u8L("Calibration"), "param_temperature",
[](const std::string&) { return calib_command(CalibKind::Temperature); }); [](const std::string&) { return calib_command(CalibKind::Temperature); });
add_with_icon("calib_max_volumetric", L("Max Volumetric Speed Calibration"), L("Calibration"), "param_volumetric_speed", add_with_icon("calib_max_volumetric", _u8L("Max Volumetric Speed Calibration"), _u8L("Calibration"), "param_volumetric_speed",
[](const std::string&) { return calib_command(CalibKind::MaxVolumetric); }); [](const std::string&) { return calib_command(CalibKind::MaxVolumetric); });
add_with_icon("calib_pressure_advance", L("Pressure Advance Calibration"), L("Calibration"), "param_flow_ratio_and_pressure_advance", add_with_icon("calib_pressure_advance", _u8L("Pressure Advance Calibration"), _u8L("Calibration"), "param_flow_ratio_and_pressure_advance",
[](const std::string&) { return calib_command(CalibKind::PressureAdvance); }); [](const std::string&) { return calib_command(CalibKind::PressureAdvance); });
add_with_icon("calib_flow_ratio", L("Flow Ratio Calibration"), L("Calibration"), "param_flow_ratio_and_pressure_advance", add_with_icon("calib_flow_ratio", _u8L("Flow Ratio Calibration"), _u8L("Calibration"), "param_flow_ratio_and_pressure_advance",
[](const std::string&) { return calib_command(CalibKind::FlowRatio); }); [](const std::string&) { return calib_command(CalibKind::FlowRatio); });
add_with_icon("calib_retraction", L("Retraction Calibration"), L("Calibration"), "param_retraction", add_with_icon("calib_retraction", _u8L("Retraction Calibration"), _u8L("Calibration"), "param_retraction",
[](const std::string&) { return calib_command(CalibKind::Retraction); }); [](const std::string&) { return calib_command(CalibKind::Retraction); });
add_with_icon("calib_cornering", L("Cornering Calibration"), L("Calibration"), "param_precision", add_with_icon("calib_cornering", _u8L("Cornering Calibration"), _u8L("Calibration"), "param_precision",
[](const std::string&) { return calib_command(CalibKind::Cornering); }); [](const std::string&) { return calib_command(CalibKind::Cornering); });
add_with_icon("calib_input_shaping_freq", L("Input Shaping Frequency Calibration"), L("Calibration"), "param_resonance_avoidance", add_with_icon("calib_input_shaping_freq", _u8L("Input Shaping Frequency Calibration"), _u8L("Calibration"), "param_resonance_avoidance",
[](const std::string&) { return calib_command(CalibKind::InputShapingFreq); }); [](const std::string&) { return calib_command(CalibKind::InputShapingFreq); });
add_with_icon("calib_input_shaping_damp", L("Input Shaping Damping Calibration"), L("Calibration"), "param_resonance_avoidance", add_with_icon("calib_input_shaping_damp", _u8L("Input Shaping Damping Calibration"), _u8L("Calibration"), "param_resonance_avoidance",
[](const std::string&) { return calib_command(CalibKind::InputShapingDamp); }); [](const std::string&) { return calib_command(CalibKind::InputShapingDamp); });
add_with_icon("calib_vfa", L("VFA Calibration"), L("Calibration"), "param_speed", [](const std::string&) { return calib_command(CalibKind::VFA); }); add_with_icon("calib_vfa", _u8L("VFA Calibration"), _u8L("Calibration"), "param_speed", [](const std::string&) { return calib_command(CalibKind::VFA); });
// ---- View ---- // ---- View ----
// Titles are L("...")-marked here (not via a variable) so xgettext can extract them. // Titles are built with _u8L here (not via a variable) so xgettext can extract them.
for (auto [key, dir, title] : for (auto [key, dir, title] :
std::initializer_list<std::tuple<const char*, const char*, std::string>>{{"view_top", "top", L("View: Top")}, std::initializer_list<std::tuple<const char*, const char*, std::string>>{{"view_top", "top", _u8L("View: Top")},
{"view_bottom", "bottom", L("View: Bottom")}, {"view_bottom", "bottom", _u8L("View: Bottom")},
{"view_front", "front", L("View: Front")}, {"view_front", "front", _u8L("View: Front")},
{"view_rear", "rear", L("View: Rear")}, {"view_rear", "rear", _u8L("View: Rear")},
{"view_left", "left", L("View: Left")}, {"view_left", "left", _u8L("View: Left")},
{"view_right", "right", L("View: Right")}, {"view_right", "right", _u8L("View: Right")},
{"view_iso", "iso", L("View: Isometric")}}) { {"view_iso", "iso", _u8L("View: Isometric")}}) {
std::string k = key, d = dir; std::string k = key, d = dir;
add(k, title, L("View"), add(k, title, _u8L("View"),
[d](const std::string&) { return view_command(wxGetApp().plater(), d); }); [d](const std::string&) { return view_command(wxGetApp().plater(), d); });
} }
add("view_default", L("View: Default"), L("View"), [](const std::string&) { add("view_default", _u8L("View: Default"), _u8L("View"), [](const std::string&) {
Plater* plater = wxGetApp().plater(); Plater* plater = wxGetApp().plater();
if (plater) { if (plater) {
plater->select_view("plate"); plater->select_view("plate");
@@ -321,75 +316,75 @@ std::vector<NativeCommand> build_command_catalog()
} }
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add("view_fit_bed", L("Fit Bed to View"), L("View"), [](const std::string&) { add("view_fit_bed", _u8L("Fit Bed to View"), _u8L("View"), [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
if (GLCanvas3D* canvas = plater->get_current_canvas3D()) if (GLCanvas3D* canvas = plater->get_current_canvas3D())
canvas->zoom_to_bed(); canvas->zoom_to_bed();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add("view_toggle_perspective", L("Toggle Perspective"), L("View"), [](const std::string&) { add("view_toggle_perspective", _u8L("Toggle Perspective"), _u8L("View"), [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->get_camera().select_next_type(); plater->get_camera().select_next_type();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("reset_window_layout", L("Reset Window Layout"), L("View"), "toolbar_reset", [](const std::string&) { add_with_icon("reset_window_layout", _u8L("Reset Window Layout"), _u8L("View"), "toolbar_reset", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->reset_window_layout(); plater->reset_window_layout();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
// ---- Object ---- // ---- Object ----
add_with_icon("obj_delete", L("Delete Selected"), L("Object"), "delete", [](const std::string&) { add_with_icon("obj_delete", _u8L("Delete Selected"), _u8L("Object"), "delete", [](const std::string&) {
return object_op(wxGetApp().plater(), [](Plater* p) { return !p->is_selection_empty(); }, [](Plater* p) { p->remove_selected(); }); return object_op(wxGetApp().plater(), [](Plater* p) { return !p->is_selection_empty(); }, [](Plater* p) { p->remove_selected(); });
}); });
add_with_icon("obj_delete_all", L("Delete All Objects"), L("Object"), "delete", [](const std::string&) { add_with_icon("obj_delete_all", _u8L("Delete All Objects"), _u8L("Object"), "delete", [](const std::string&) {
return object_op( return object_op(
wxGetApp().plater(), [](Plater* p) { return p->can_delete_all(); }, [](Plater* p) { p->delete_all_objects_from_model(); }); wxGetApp().plater(), [](Plater* p) { return p->can_delete_all(); }, [](Plater* p) { p->delete_all_objects_from_model(); });
}); });
add_with_icon("obj_mirror_x", L("Mirror X"), L("Object"), "menu_mirror_x", [](const std::string&) { add_with_icon("obj_mirror_x", _u8L("Mirror X"), _u8L("Object"), "menu_mirror_x", [](const std::string&) {
return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_mirror(); }, [](Plater* p) { p->mirror(Axis::X); }); return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_mirror(); }, [](Plater* p) { p->mirror(Axis::X); });
}); });
add_with_icon("obj_mirror_y", L("Mirror Y"), L("Object"), "menu_mirror_y", [](const std::string&) { add_with_icon("obj_mirror_y", _u8L("Mirror Y"), _u8L("Object"), "menu_mirror_y", [](const std::string&) {
return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_mirror(); }, [](Plater* p) { p->mirror(Axis::Y); }); return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_mirror(); }, [](Plater* p) { p->mirror(Axis::Y); });
}); });
add_with_icon("obj_mirror_z", L("Mirror Z"), L("Object"), "menu_mirror_z", [](const std::string&) { add_with_icon("obj_mirror_z", _u8L("Mirror Z"), _u8L("Object"), "menu_mirror_z", [](const std::string&) {
return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_mirror(); }, [](Plater* p) { p->mirror(Axis::Z); }); return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_mirror(); }, [](Plater* p) { p->mirror(Axis::Z); });
}); });
add_with_icon("obj_split_objects", L("Split to Objects"), L("Object"), "menu_split_objects", [](const std::string&) { add_with_icon("obj_split_objects", _u8L("Split to Objects"), _u8L("Object"), "menu_split_objects", [](const std::string&) {
return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_split_to_objects(); }, [](Plater* p) { p->split_object(true); }); return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_split_to_objects(); }, [](Plater* p) { p->split_object(true); });
}); });
add_with_icon("obj_split_parts", L("Split to Parts"), L("Object"), "menu_split_parts", [](const std::string&) { add_with_icon("obj_split_parts", _u8L("Split to Parts"), _u8L("Object"), "menu_split_parts", [](const std::string&) {
return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_split_to_volumes(); }, [](Plater* p) { p->split_volume(); }); return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_split_to_volumes(); }, [](Plater* p) { p->split_volume(); });
}); });
add("obj_center", L("Center Selected on Plate"), L("Object"), [](const std::string&) { add("obj_center", _u8L("Center Selected on Plate"), _u8L("Object"), [](const std::string&) {
return object_op(wxGetApp().plater(), [](Plater* p) { return !p->is_selection_empty(); }, [](Plater* p) { p->center_selection(); }); return object_op(wxGetApp().plater(), [](Plater* p) { return !p->is_selection_empty(); }, [](Plater* p) { p->center_selection(); });
}); });
add_with_icon("obj_drop", L("Drop to Bed"), L("Object"), "toolbar_flatten", [](const std::string&) { add_with_icon("obj_drop", _u8L("Drop to Bed"), _u8L("Object"), "toolbar_flatten", [](const std::string&) {
return object_op(wxGetApp().plater(), [](Plater* p) { return !p->is_selection_empty(); }, [](Plater* p) { p->drop_selection(); }); return object_op(wxGetApp().plater(), [](Plater* p) { return !p->is_selection_empty(); }, [](Plater* p) { p->drop_selection(); });
}); });
add("obj_fit_volume", L("Scale to Fit Print Volume"), L("Object"), [](const std::string&) { add("obj_fit_volume", _u8L("Scale to Fit Print Volume"), _u8L("Object"), [](const std::string&) {
return object_op( return object_op(
wxGetApp().plater(), [](Plater* p) { return p->can_scale_to_print_volume(); }, wxGetApp().plater(), [](Plater* p) { return p->can_scale_to_print_volume(); },
[](Plater* p) { p->scale_selection_to_fit_print_volume(); }); [](Plater* p) { p->scale_selection_to_fit_print_volume(); });
}); });
add_with_icon("obj_instances_up", L("Increase Instances"), L("Object"), "instance_add", [](const std::string&) { add_with_icon("obj_instances_up", _u8L("Increase Instances"), _u8L("Object"), "instance_add", [](const std::string&) {
return object_op( return object_op(
wxGetApp().plater(), [](Plater* p) { return p->can_increase_instances(); }, [](Plater* p) { p->increase_instances(); }); wxGetApp().plater(), [](Plater* p) { return p->can_increase_instances(); }, [](Plater* p) { p->increase_instances(); });
}); });
add_with_icon("obj_instances_down", L("Decrease Instances"), L("Object"), "instance_remove", [](const std::string&) { add_with_icon("obj_instances_down", _u8L("Decrease Instances"), _u8L("Object"), "instance_remove", [](const std::string&) {
return object_op( return object_op(
wxGetApp().plater(), [](Plater* p) { return p->can_decrease_instances(); }, [](Plater* p) { p->decrease_instances(); }); wxGetApp().plater(), [](Plater* p) { return p->can_decrease_instances(); }, [](Plater* p) { p->decrease_instances(); });
}); });
add_with_icon("obj_arrange", L("Auto-Arrange"), L("Object"), "toolbar_arrange", [](const std::string&) { add_with_icon("obj_arrange", _u8L("Auto-Arrange"), _u8L("Object"), "toolbar_arrange", [](const std::string&) {
return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_arrange(); }, [](Plater* p) { p->arrange(); }); return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_arrange(); }, [](Plater* p) { p->arrange(); });
}); });
add_with_icon("obj_orient", L("Auto-Orient"), L("Object"), "toolbar_orient", [](const std::string&) { add_with_icon("obj_orient", _u8L("Auto-Orient"), _u8L("Object"), "toolbar_orient", [](const std::string&) {
return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_arrange(); }, [](Plater* p) { p->orient(); }); return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_arrange(); }, [](Plater* p) { p->orient(); });
}); });
// ---- Add Primitive ---- (the Add > Add Primitive submenu; creates a new object) // ---- Add Primitive ---- (the Add > Add Primitive submenu; creates a new object)
auto add_primitive = [&](std::string key, std::string title, std::string icon, const char* type_name) { auto add_primitive = [&](std::string key, std::string title, std::string icon, const char* type_name) {
add_with_icon(std::move(key), std::move(title), L("Add Primitive"), std::move(icon), [type_name](const std::string&) { add_with_icon(std::move(key), std::move(title), _u8L("Add Primitive"), std::move(icon), [type_name](const std::string&) {
Plater* plater = wxGetApp().plater(); Plater* plater = wxGetApp().plater();
if (plater) { if (plater) {
ensure_3d_view(plater); ensure_3d_view(plater);
@@ -399,13 +394,13 @@ std::vector<NativeCommand> build_command_catalog()
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
}; };
add_primitive("add_primitive_cube", L("Cube"), "menu_obj_cube", "Cube"); add_primitive("add_primitive_cube", _u8L("Cube"), "menu_obj_cube", "Cube");
add_primitive("add_primitive_cylinder", L("Cylinder"), "menu_obj_cylinder", "Cylinder"); add_primitive("add_primitive_cylinder", _u8L("Cylinder"), "menu_obj_cylinder", "Cylinder");
add_primitive("add_primitive_sphere", L("Sphere"), "menu_obj_sphere", "Sphere"); add_primitive("add_primitive_sphere", _u8L("Sphere"), "menu_obj_sphere", "Sphere");
add_primitive("add_primitive_cone", L("Cone"), "menu_obj_cone", "Cone"); add_primitive("add_primitive_cone", _u8L("Cone"), "menu_obj_cone", "Cone");
add_primitive("add_primitive_disc", L("Disc"), "menu_obj_disc", "Disc"); add_primitive("add_primitive_disc", _u8L("Disc"), "menu_obj_disc", "Disc");
add_primitive("add_primitive_torus", L("Torus"), "menu_obj_torus", "Torus"); add_primitive("add_primitive_torus", _u8L("Torus"), "menu_obj_torus", "Torus");
add_with_icon("add_primitive_text", L("Text"), L("Add Primitive"), "menu_obj_text", [](const std::string&) { add_with_icon("add_primitive_text", _u8L("Text"), _u8L("Add Primitive"), "menu_obj_text", [](const std::string&) {
Plater* plater = wxGetApp().plater(); Plater* plater = wxGetApp().plater();
if (plater) { if (plater) {
ensure_3d_view(plater); ensure_3d_view(plater);
@@ -415,7 +410,7 @@ std::vector<NativeCommand> build_command_catalog()
} }
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("add_primitive_svg", L("SVG"), L("Add Primitive"), "menu_obj_svg", [](const std::string&) { add_with_icon("add_primitive_svg", _u8L("SVG"), _u8L("Add Primitive"), "menu_obj_svg", [](const std::string&) {
Plater* plater = wxGetApp().plater(); Plater* plater = wxGetApp().plater();
if (plater) { if (plater) {
ensure_3d_view(plater); ensure_3d_view(plater);
@@ -429,7 +424,7 @@ std::vector<NativeCommand> build_command_catalog()
// ---- Add Handy models ---- (the Add > Add Handy models submenu) // ---- Add Handy models ---- (the Add > Add Handy models submenu)
const std::vector<MenuFactory::HandyModel>& handy = MenuFactory::handy_models(); const std::vector<MenuFactory::HandyModel>& handy = MenuFactory::handy_models();
for (std::size_t i = 0; i < handy.size(); ++i) { for (std::size_t i = 0; i < handy.size(); ++i) {
add("add_handy_" + std::string(handy[i].key), handy[i].label, L("Add Handy models"), add("add_handy_" + std::string(handy[i].key), Slic3r::GUI::I18N::translate_utf8(handy[i].label), _u8L("Add Handy models"),
[i](const std::string&) { [i](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
ensure_3d_view(plater); ensure_3d_view(plater);
@@ -439,7 +434,7 @@ std::vector<NativeCommand> build_command_catalog()
} }
// ---- Plate ---- // ---- Plate ----
add_with_icon("plate_add", L("Add Plate"), L("Plate"), "toolbar_add_plate", [](const std::string&) { add_with_icon("plate_add", _u8L("Add Plate"), _u8L("Plate"), "toolbar_add_plate", [](const std::string&) {
Plater* plater = wxGetApp().plater(); Plater* plater = wxGetApp().plater();
if (!is_fff_plater(plater)) if (!is_fff_plater(plater))
return plate_unavailable(); return plate_unavailable();
@@ -448,7 +443,7 @@ std::vector<NativeCommand> build_command_catalog()
plater->add_plate(); plater->add_plate();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("plate_duplicate", L("Duplicate Plate"), L("Plate"), "menu_copy", [](const std::string&) { add_with_icon("plate_duplicate", _u8L("Duplicate Plate"), _u8L("Plate"), "menu_copy", [](const std::string&) {
Plater* plater = wxGetApp().plater(); Plater* plater = wxGetApp().plater();
if (!is_fff_plater(plater)) if (!is_fff_plater(plater))
return plate_unavailable(); return plate_unavailable();
@@ -457,7 +452,7 @@ std::vector<NativeCommand> build_command_catalog()
plater->duplicate_plate(); plater->duplicate_plate();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("plate_delete", L("Delete Plate"), L("Plate"), "delete", [](const std::string&) { add_with_icon("plate_delete", _u8L("Delete Plate"), _u8L("Plate"), "delete", [](const std::string&) {
Plater* plater = wxGetApp().plater(); Plater* plater = wxGetApp().plater();
if (!is_fff_plater(plater)) if (!is_fff_plater(plater))
return plate_unavailable(); return plate_unavailable();
@@ -466,7 +461,7 @@ std::vector<NativeCommand> build_command_catalog()
plater->delete_plate(); plater->delete_plate();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("plate_rename", L("Rename Plate"), L("Plate"), "plate_name_edit", [](const std::string&) { add_with_icon("plate_rename", _u8L("Rename Plate"), _u8L("Plate"), "plate_name_edit", [](const std::string&) {
Plater* plater = wxGetApp().plater(); Plater* plater = wxGetApp().plater();
if (!is_fff_plater(plater)) if (!is_fff_plater(plater))
return plate_unavailable(); return plate_unavailable();
@@ -477,7 +472,7 @@ std::vector<NativeCommand> build_command_catalog()
curr->set_plate_name(dlg.get_plate_name().ToUTF8().data()); curr->set_plate_name(dlg.get_plate_name().ToUTF8().data());
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("plate_toggle_lock", L("Toggle Plate Lock"), L("Plate"), "lock_normal", [](const std::string&) { add_with_icon("plate_toggle_lock", _u8L("Toggle Plate Lock"), _u8L("Plate"), "lock_normal", [](const std::string&) {
Plater* plater = wxGetApp().plater(); Plater* plater = wxGetApp().plater();
if (!is_fff_plater(plater)) if (!is_fff_plater(plater))
return plate_unavailable(); return plate_unavailable();
@@ -487,7 +482,7 @@ std::vector<NativeCommand> build_command_catalog()
plates.lock_plate(index, !plates.is_locked(index)); plates.lock_plate(index, !plates.is_locked(index));
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("plate_goto", L("Go to Plate"), L("Plate"), "go_next_plate", [](const std::string& param) { add_with_icon("plate_goto", _u8L("Go to Plate"), _u8L("Plate"), "go_next_plate", [](const std::string& param) {
Plater* plater = wxGetApp().plater(); Plater* plater = wxGetApp().plater();
if (!is_fff_plater(plater)) if (!is_fff_plater(plater))
return plate_unavailable(); return plate_unavailable();
@@ -505,7 +500,7 @@ std::vector<NativeCommand> build_command_catalog()
}); });
// ---- Printer / device connection ---- // ---- Printer / device connection ----
add_with_icon("sync_ams", L("Synchronize Filament List from AMS"), L("Printer"), "ams_fila_sync", [](const std::string&) { add_with_icon("sync_ams", _u8L("Synchronize Filament List from AMS"), _u8L("Printer"), "ams_fila_sync", [](const std::string&) {
Plater* plater = wxGetApp().plater(); Plater* plater = wxGetApp().plater();
DeviceManager* dev = wxGetApp().getDeviceManager(); DeviceManager* dev = wxGetApp().getDeviceManager();
if (dev && dev->get_selected_machine() && plater) { if (dev && dev->get_selected_machine() && plater) {
@@ -516,11 +511,11 @@ std::vector<NativeCommand> build_command_catalog()
}); });
// ---- Presets / cloud ---- // ---- Presets / cloud ----
add_with_icon("preset_bundle", L("Open Preset Bundle"), L("Presets"), "menu_edit_preset", [](const std::string&) { add_with_icon("preset_bundle", _u8L("Open Preset Bundle"), _u8L("Presets"), "menu_edit_preset", [](const std::string&) {
wxGetApp().open_presetbundledialog(); wxGetApp().open_presetbundledialog();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("sync_presets", L("Sync Presets"), L("Presets"), "printer_sync_ok", [](const std::string&) { add_with_icon("sync_presets", _u8L("Sync Presets"), _u8L("Presets"), "printer_sync_ok", [](const std::string&) {
if (!wxGetApp().is_user_login()) if (!wxGetApp().is_user_login())
return AppActionRunResult{AppActionRunResult::Level::Info, _L("Sign in to sync presets.")}; return AppActionRunResult{AppActionRunResult::Level::Info, _L("Sign in to sync presets.")};
wxGetApp().restart_sync_user_preset(); wxGetApp().restart_sync_user_preset();
@@ -528,7 +523,7 @@ std::vector<NativeCommand> build_command_catalog()
}); });
// ---- Import ---- // ---- Import ----
add_with_icon("import_file", L("Import 3MF/STL/STEP/SVG/OBJ/AMF"), L("Import"), "menu_open", [](const std::string&) { add_with_icon("import_file", _u8L("Import 3MF/STL/STEP/SVG/OBJ/AMF"), _u8L("Import"), "menu_open", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) { if (Plater* plater = wxGetApp().plater()) {
#ifdef __APPLE__ #ifdef __APPLE__
plater->add_model(); plater->add_model();
@@ -538,71 +533,71 @@ std::vector<NativeCommand> build_command_catalog()
} }
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("import_zip_archive", L("Import ZIP Archive"), L("Import"), "menu_open", [](const std::string&) { add_with_icon("import_zip_archive", _u8L("Import ZIP Archive"), _u8L("Import"), "menu_open", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->import_zip_archive(); plater->import_zip_archive();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("import_configs", L("Import Configs"), L("Import"), "menu_open", [](const std::string&) { add_with_icon("import_configs", _u8L("Import Configs"), _u8L("Import"), "menu_open", [](const std::string&) {
if (MainFrame* mf = wxGetApp().mainframe) if (MainFrame* mf = wxGetApp().mainframe)
mf->load_config_file(); mf->load_config_file();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
// ---- Export extras ---- // ---- Export extras ----
add_with_icon("export_stl_multi", L("Export All Objects as STLs"), L("Export"), "save", [](const std::string&) { add_with_icon("export_stl_multi", _u8L("Export All Objects as STLs"), _u8L("Export"), "save", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->export_stl(false, false, true); plater->export_stl(false, false, true);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("export_drc_single", L("Export All Objects as DRC (one file)"), L("Export"), "save", [](const std::string&) { add_with_icon("export_drc_single", _u8L("Export All Objects as DRC (one file)"), _u8L("Export"), "save", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->export_stl(false, false, false, FT_DRC); plater->export_stl(false, false, false, FT_DRC);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("export_drc_multi", L("Export All Objects as DRCs"), L("Export"), "save", [](const std::string&) { add_with_icon("export_drc_multi", _u8L("Export All Objects as DRCs"), _u8L("Export"), "save", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->export_stl(false, false, true, FT_DRC); plater->export_stl(false, false, true, FT_DRC);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("export_toolpaths_obj", L("Export Toolpaths as OBJ"), L("Export"), "custom-gcode_gcode", [](const std::string&) { add_with_icon("export_toolpaths_obj", _u8L("Export Toolpaths as OBJ"), _u8L("Export"), "custom-gcode_gcode", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) if (Plater* plater = wxGetApp().plater())
plater->export_toolpaths_to_obj(); plater->export_toolpaths_to_obj();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("export_config", L("Export Preset Bundle"), L("Export"), "save", [](const std::string&) { add_with_icon("export_config", _u8L("Export Preset Bundle"), _u8L("Export"), "save", [](const std::string&) {
if (MainFrame* mf = wxGetApp().mainframe) if (MainFrame* mf = wxGetApp().mainframe)
mf->export_config(); mf->export_config();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
// ---- Help ---- (mirrors the top-bar Help menu, plus the wiki/YouTube links) // ---- Help ---- (mirrors the top-bar Help menu, plus the wiki/YouTube links)
add("help_keyboard_shortcuts", L("Keyboard Shortcuts"), L("Help"), [](const std::string&) { add("help_keyboard_shortcuts", _u8L("Keyboard Shortcuts"), _u8L("Help"), [](const std::string&) {
wxGetApp().keyboard_shortcuts(ShortcutContext::Global); wxGetApp().keyboard_shortcuts(ShortcutContext::Global);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add("help_setup_wizard", L("Setup Wizard"), L("Help"), [](const std::string&) { add("help_setup_wizard", _u8L("Setup Wizard"), _u8L("Help"), [](const std::string&) {
wxGetApp().ShowUserGuide(); wxGetApp().ShowUserGuide();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("help_open_config_folder", L("Show Configuration Folder"), L("Help"), "open_project", [](const std::string&) { add_with_icon("help_open_config_folder", _u8L("Show Configuration Folder"), _u8L("Help"), "open_project", [](const std::string&) {
Slic3r::GUI::desktop_open_datadir_folder(); Slic3r::GUI::desktop_open_datadir_folder();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add("help_troubleshoot", L("Troubleshoot Center"), L("Help"), [](const std::string&) { add("help_troubleshoot", _u8L("Troubleshoot Center"), _u8L("Help"), [](const std::string&) {
wxGetApp().troubleshoot(); wxGetApp().troubleshoot();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add("help_network_test", L("Open Network Test"), L("Help"), [](const std::string&) { add("help_network_test", _u8L("Open Network Test"), _u8L("Help"), [](const std::string&) {
NetworkTestDialog dlg(wxGetApp().mainframe); NetworkTestDialog dlg(wxGetApp().mainframe);
dlg.ShowModal(); dlg.ShowModal();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add("help_benchmark_3d_scene", L("Benchmark 3D Scene"), L("Help"), [](const std::string&) { add("help_benchmark_3d_scene", _u8L("Benchmark 3D Scene"), _u8L("Help"), [](const std::string&) {
run_scene_benchmark(); run_scene_benchmark();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("help_tip_of_the_day", L("Show Tip of the Day"), L("Help"), "info", [](const std::string&) { add_with_icon("help_tip_of_the_day", _u8L("Show Tip of the Day"), _u8L("Help"), "info", [](const std::string&) {
if (Plater* plater = wxGetApp().plater()) { if (Plater* plater = wxGetApp().plater()) {
plater->get_dailytips()->open(); plater->get_dailytips()->open();
if (GLCanvas3D* canvas = plater->get_current_canvas3D()) if (GLCanvas3D* canvas = plater->get_current_canvas3D())
@@ -610,37 +605,37 @@ std::vector<NativeCommand> build_command_catalog()
} }
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("help_check_updates", L("Check for Updates"), L("Help"), "refresh", [](const std::string&) { add_with_icon("help_check_updates", _u8L("Check for Updates"), _u8L("Help"), "refresh", [](const std::string&) {
wxGetApp().check_new_version_sf(true, 1); wxGetApp().check_new_version_sf(true, 1);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("help_about", L("About OrcaSlicer"), L("Help"), "OrcaSlicer_gradient_circle", [](const std::string&) { add_with_icon("help_about", _u8L("About OrcaSlicer"), _u8L("Help"), "OrcaSlicer_gradient_circle", [](const std::string&) {
Slic3r::GUI::about(); Slic3r::GUI::about();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add_with_icon("open_wiki", L("Open Wiki"), L("Help"), "link_wiki_img", [](const std::string&) { add_with_icon("open_wiki", _u8L("Open Wiki"), _u8L("Help"), "link_wiki_img", [](const std::string&) {
wxLaunchDefaultBrowser("https://www.orcaslicer.com/wiki/", wxBROWSER_NEW_WINDOW); wxLaunchDefaultBrowser("https://www.orcaslicer.com/wiki/", wxBROWSER_NEW_WINDOW);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add("open_youtube", L("Open YouTube Channel"), L("Help"), [](const std::string&) { add("open_youtube", _u8L("Open YouTube Channel"), _u8L("Help"), [](const std::string&) {
wxLaunchDefaultBrowser("https://www.youtube.com/@OfficialOrcaSlicer/videos", wxBROWSER_NEW_WINDOW); wxLaunchDefaultBrowser("https://www.youtube.com/@OfficialOrcaSlicer/videos", wxBROWSER_NEW_WINDOW);
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
// ---- Plugins ---- // ---- Plugins ----
add("open_plugins", L("Open Plugins"), L("Plugins"), [](const std::string&) { add("open_plugins", _u8L("Open Plugins"), _u8L("Plugins"), [](const std::string&) {
wxGetApp().open_plugins_dialog(); wxGetApp().open_plugins_dialog();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add("refresh_plugins", L("Refresh Plugins"), L("Plugins"), [](const std::string&) { add("refresh_plugins", _u8L("Refresh Plugins"), _u8L("Plugins"), [](const std::string&) {
wxGetApp().refresh_plugins(); wxGetApp().refresh_plugins();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add("install_plugin", L("Install Plugin"), L("Plugins"), [](const std::string&) { add("install_plugin", _u8L("Install Plugin"), _u8L("Plugins"), [](const std::string&) {
open_plugin_hub(); open_plugin_hub();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
add("install_local_plugin", L("Install Local Plugin"), L("Plugins"), [](const std::string&) { add("install_local_plugin", _u8L("Install Local Plugin"), _u8L("Plugins"), [](const std::string&) {
wxGetApp().install_local_plugin(); wxGetApp().install_local_plugin();
return AppActionRunResult{AppActionRunResult::Level::Success}; return AppActionRunResult{AppActionRunResult::Level::Success};
}); });
@@ -648,12 +643,24 @@ std::vector<NativeCommand> build_command_catalog()
return out; return out;
} }
std::vector<NativeCommand>& catalog_storage()
{
static std::vector<NativeCommand> commands = build_command_catalog();
return commands;
}
} // namespace } // namespace
const std::vector<NativeCommand>& NativeCommands::catalog() const std::vector<NativeCommand>& NativeCommands::catalog()
{ {
static const std::vector<NativeCommand> commands = build_command_catalog(); return catalog_storage();
return commands; }
void NativeCommands::rebuild_catalog()
{
// build_command_catalog() re-runs _u8L under the current locale, so replacing the storage
// refreshes every translated title/group after a language switch.
catalog_storage() = build_command_catalog();
} }
std::unique_ptr<AppAction> NativeCommands::make_action(const NativeCommand& command) std::unique_ptr<AppAction> NativeCommands::make_action(const NativeCommand& command)
+10 -8
View File
@@ -16,25 +16,27 @@ namespace Slic3r { namespace GUI {
struct NativeCommand struct NativeCommand
{ {
std::string key; std::string key;
std::string title; // untranslated English msgid; make_action() translates it for display std::string title;
std::string group; // likewise std::string group;
std::string input; // "percent"/"tab" or "" for immediate run std::string input; // "percent"/"tab" or "" for immediate run
std::string icon; // SVG base name, or "" to render a blank tile std::string icon; // SVG base name, or "" to render a blank tile
std::function<AppActionRunResult(const std::string& param)> runner; std::function<AppActionRunResult(const std::string& param)> runner;
}; };
namespace NativeCommands { namespace NativeCommands {
// The full built-in command catalog. Built on first use and reused; it holds no translated text, so // The full built-in command catalog. Built on first use and reused; call rebuild_catalog() after a
// it stays valid across a UI language switch. UI thread only. // live UI language switch so the translated titles/groups match the new locale. UI thread only.
const std::vector<NativeCommand>& catalog(); const std::vector<NativeCommand>& catalog();
// Rebuilds the catalog in the current locale. UI thread only.
void rebuild_catalog();
// Dispatches `key` to its runner (unknown keys return a quiet Info). UI thread only. // Dispatches `key` to its runner (unknown keys return a quiet Info). UI thread only.
AppActionRunResult run(const std::string& key, const std::string& param = {}); AppActionRunResult run(const std::string& key, const std::string& param = {});
// Materialises one catalog entry as a runnable AppAction, titled in the current UI language with the // Materialises one catalog entry as a runnable AppAction. Keeps the catalog's identity,
// English title/group kept as search aliases. Keeps the catalog's identity, presentation and // presentation and behaviour as the single source of truth; ActionRegistry only stores and
// behaviour as the single source of truth; ActionRegistry only stores and dispatches the result. // dispatches the result. UI thread only.
// UI thread only.
std::unique_ptr<AppAction> make_action(const NativeCommand& command); std::unique_ptr<AppAction> make_action(const NativeCommand& command);
} // namespace NativeCommands } // namespace NativeCommands
+2 -3
View File
@@ -275,8 +275,7 @@ void OptionsGroup::append_line(const Line& line)
const wxString leaf = (leaf_src == L_CONTEXT("Top", "Layers") || leaf_src == L_CONTEXT("Bottom", "Layers")) ? const wxString leaf = (leaf_src == L_CONTEXT("Top", "Layers") || leaf_src == L_CONTEXT("Bottom", "Layers")) ?
_L_CONTEXT(leaf_src, "Layers") : _L_CONTEXT(leaf_src, "Layers") :
_(leaf_src); _(leaf_src);
index.set_line_label(opt.opt_id, type, Search::compose_display_label(line.label, leaf, multi), index.set_line_label(opt.opt_id, type, Search::compose_display_label(line.label, leaf, multi));
Search::compose_display_label(line.label_en, from_u8(leaf_src), multi));
} }
} }
@@ -651,7 +650,7 @@ Line OptionsGroup::create_single_option_line(const Option& option, const std::st
{ {
wxString tooltip = _(get_formatted_tooltip_text(option.opt, option.opt_id)); wxString tooltip = _(get_formatted_tooltip_text(option.opt, option.opt_id));
Line retval{from_u8(option.opt.label), tooltip}; Line retval{_(option.opt.label), tooltip};
retval.label_path = path; retval.label_path = path;
retval.append_option(option); retval.append_option(option);
+2 -7
View File
@@ -61,7 +61,6 @@ class Line : public UndoValueUIManager
bool m_is_separator{ false }; bool m_is_separator{ false };
public: public:
wxString label; wxString label;
wxString label_en; // untranslated English of `label`, searchable by the Speed Dial in any UI language
wxString label_tooltip; wxString label_tooltip;
std::string label_path; std::string label_path;
bool undo_to_sys{false}; // BBS: object config bool undo_to_sys{false}; // BBS: object config
@@ -87,16 +86,12 @@ public:
void append_widget(const widget_t widget) { void append_widget(const widget_t widget) {
m_extra_widgets.push_back(widget); m_extra_widgets.push_back(widget);
} }
// `label` and `tooltip` are the untranslated English msgids; they are translated for display.
Line(wxString label, wxString tooltip) : Line(wxString label, wxString tooltip) :
label(_(label)), label_en(label), label_tooltip(_(tooltip)) {} label(_(label)), label_tooltip(_(tooltip)) {}
Line() : m_is_separator(true) {} Line() : m_is_separator(true) {}
// `new_label` is the untranslated English msgid (an L("...") string), like the ctor's label:
// it is translated for display and kept as label_en.
void set_label(const wxString& new_label) { void set_label(const wxString& new_label) {
label = _(new_label); label = new_label;
label_en = new_label;
if (label_widget != nullptr) { if (label_widget != nullptr) {
label_widget->SetLabel(label + (label.IsEmpty() ? "" : ": ")); label_widget->SetLabel(label + (label.IsEmpty() ? "" : ": "));
label_widget->Refresh(); label_widget->Refresh();
-14
View File
@@ -54,20 +54,6 @@ PluginsConfigDialog::PluginsConfigDialog(wxWindow* parent, Preset::Type type, co
PluginsConfigDialog::~PluginsConfigDialog() { m_alive->store(false, std::memory_order_release); } PluginsConfigDialog::~PluginsConfigDialog() { m_alive->store(false, std::memory_order_release); }
nlohmann::json PluginsConfigDialog::localized_strings() const
{
return {
{"no_capabilities", _u8L("This preset does not use any plugin capabilities")},
{"capabilities_label", _u8L("Capabilities used by this preset")},
{"config_json_label", _u8L("Capability configuration (JSON)")},
{"config_frame_title", _u8L("Plugin configuration")},
{"restore_title", _u8L("Discard this preset's override and use the global configuration again")},
{"restore_defaults", _u8L("Restore defaults")},
{"save", _u8L("Save")},
{"invalid_json", _u8L("Invalid JSON")},
};
}
const Preset* PluginsConfigDialog::current_preset() const const Preset* PluginsConfigDialog::current_preset() const
{ {
const PresetBundle* bundle = wxGetApp().preset_bundle; const PresetBundle* bundle = wxGetApp().preset_bundle;
-2
View File
@@ -2,7 +2,6 @@
#include <slic3r/GUI/Widgets/WebViewHostDialog.hpp> #include <slic3r/GUI/Widgets/WebViewHostDialog.hpp>
#include <libslic3r/Preset.hpp> #include <libslic3r/Preset.hpp>
#include <nlohmann/json_fwd.hpp>
#include <slic3r/plugin/PluginConfig.hpp> #include <slic3r/plugin/PluginConfig.hpp>
#include <atomic> #include <atomic>
@@ -32,7 +31,6 @@ public:
private: private:
void on_script_message(const nlohmann::json& payload) override; void on_script_message(const nlohmann::json& payload) override;
nlohmann::json localized_strings() const override;
// Runs one web command on a clean main-loop stack; see on_script_message. // Runs one web command on a clean main-loop stack; see on_script_message.
void handle_web_command(const nlohmann::json& payload); void handle_web_command(const nlohmann::json& payload);
+2 -93
View File
@@ -175,7 +175,7 @@ nlohmann::json build_plugin_payload_item(const PluginDialogItem& dialog_item)
for (const PluginCapabilityView& capability : dialog_item.capabilities) { for (const PluginCapabilityView& capability : dialog_item.capabilities) {
nlohmann::json c; nlohmann::json c;
c["name"] = capability.id.name; c["name"] = capability.id.name;
c["type"] = PluginConfig::capability_type_label(capability.id.type); c["type"] = plugin_capability_type_display_name(capability.id.type);
c["type_key"] = plugin_capability_type_to_string(capability.id.type); c["type_key"] = plugin_capability_type_to_string(capability.id.type);
c["enabled"] = capability.enabled; c["enabled"] = capability.enabled;
c["can_toggle"] = capability.can_toggle; c["can_toggle"] = capability.can_toggle;
@@ -326,7 +326,7 @@ PluginDialogItem build_plugin_dialog_item(const PluginDescriptor& descriptor)
item.type_labels.push_back(label); item.type_labels.push_back(label);
} else { } else {
for (const auto& capability : capabilities) { for (const auto& capability : capabilities) {
const std::string label = PluginConfig::capability_type_label(capability->type()); const std::string label = plugin_capability_type_display_name(capability->type());
if (std::find(item.type_labels.begin(), item.type_labels.end(), label) == item.type_labels.end()) if (std::find(item.type_labels.begin(), item.type_labels.end(), label) == item.type_labels.end())
item.type_labels.push_back(label); item.type_labels.push_back(label);
} }
@@ -586,97 +586,6 @@ PluginsDialog::PluginsDialog(wxWindow* parent, wxWindowID id, const wxString&, c
: WebViewHostDialog(parent, id, _L("Plugins"), pos, size, style) : WebViewHostDialog(parent, id, _L("Plugins"), pos, size, style)
{ create_webview("web/dialog/PluginsDialog/index.html", _L("Plugins"), wxSize(900, 820), wxSize(760, 715)); } { create_webview("web/dialog/PluginsDialog/index.html", _L("Plugins"), wxSize(900, 820), wxSize(760, 715)); }
nlohmann::json PluginsDialog::localized_strings() const
{
return {
{"search_plugins", _u8L("Search plugins")},
{"clear", _u8L("Clear")},
{"clear_search", _u8L("Clear search")},
{"match_case", _u8L("Match case")},
{"match_whole_word", _u8L("Match whole word")},
{"refresh", _u8L("Refresh")},
{"install_options", _u8L("More plugin install options")},
{"install_plugin", _u8L("Install plugin")},
{"install_local_plugin", _u8L("Install local plugin")},
{"activate", _u8L("Activate")},
{"sort_by_name", _u8L("Sort by name")},
{"name", _u8L("Name")},
{"sort_by_version", _u8L("Sort by version")},
{"plugin_version", _u8L("Plugin Version")},
{"sort_by_source", _u8L("Sort by source")},
{"source", _u8L("Source")},
{"sort_by_status", _u8L("Sort by status")},
{"status", _u8L_CONTEXT("Status", "Plugin")},
{"resize_hint", _u8L("Drag to resize; double-click to reset")},
{"resize_list", _u8L("Resize the plugin list")},
{"details_label", _u8L("Plugin details")},
{"tab_info", _u8L("Plugin Info")},
{"description", _u8L("Description")},
{"tab_config", _u8L("Config")},
{"tab_changelog", _u8L("Changelog")},
{"tab_diagnostics", _u8L("Diagnostics")},
{"types", _u8L("Types")},
{"author", _u8L("Author")},
{"installed_version", _u8L("Installed Version")},
{"latest_version", _u8L("Latest Version")},
{"update_available", _u8L("Update available")},
{"update_title", _u8L("Update to the latest version")},
{"update", _u8L("Update")},
{"no_description", _u8L("No description available")},
{"config_select_plugin", _u8L("Select a plugin to configure its capabilities")},
{"configurable_capabilities", _u8L("Configurable capabilities")},
{"config_json_label", _u8L("Capability configuration (JSON)")},
{"config_frame_title", _u8L("Plugin configuration")},
{"restore_title", _u8L("Discard the settings saved for this capability and restore the plugin's defaults")},
{"restore_defaults", _u8L("Restore defaults")},
{"save", _u8L("Save")},
{"changelog_label", _u8L("Plugin changelog")},
{"version", _u8L("Version")},
{"date", _u8L("Date")},
{"changes", _u8L("Changes")},
{"no_changelog", _u8L("No changelog available")},
{"no_issues", _u8L("No issues detected")},
{"no_plugins", _u8L("No plugins found")},
{"no_match", _u8L("No plugins match \"%s\"")},
{"source_mine", _u8L("Mine")},
{"source_subscribed", _u8L("Subscribed")},
{"source_orphaned", _u8L("Orphaned")},
{"source_local", _u8L("Local")},
{"mixed_capabilities", _u8L("Some plugin capabilities are enabled")},
{"collapse_named", _u8L("Collapse %s capabilities")},
{"expand_named", _u8L("Expand %s capabilities")},
{"collapse", _u8L("Collapse capabilities")},
{"expand", _u8L("Expand capabilities")},
{"open_in_browser", _u8L("Open this plugin in your browser")},
{"capability_count", _u8L("Capabilities: %s")},
{"capabilities", _u8L_CONTEXT("Capabilities", "Plugin")},
{"run_named", _u8L("Run \"%s\"")},
{"enable_named", _u8L("Enable %s")},
{"not_available", _u8L("N/A")},
{"unauthorized", _u8L("Unauthorized for updates")},
{"not_installed", _u8L("Not installed")},
{"config_loading", _u8L("Loading the plugin…")},
{"config_no_capabilities", _u8L("This plugin exposes no capabilities")},
{"config_activate", _u8L("Activate this plugin to configure its capabilities")},
{"invalid_json", _u8L("Invalid JSON")},
{"view_on_cloud", _u8L("View on OrcaCloud <a>here</a>")},
{"status_activated", _u8L("Activated")},
{"status_loading", _u8L("Loading")},
{"status_error", _u8L("Error")},
{"status_runtime_error", _u8L("Runtime error")},
{"status_inactive", _u8L("Inactive")},
{"status_activated_desc", _u8L("This plugin is active and ready to be used.")},
{"status_loading_desc", _u8L("This plugin is still loading.")},
{"status_error_desc", _u8L("This plugin is blocked until its error is fixed.")},
{"status_runtime_error_desc", _u8L("This plugin is loaded but a capability reported an error.")},
{"status_inactive_desc", _u8L("This plugin is inactive. Activate it to install or load it.")},
{"select_plugin", _u8L("Select a plugin to view its status and details.")},
{"orphaned_note", _u8L("Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used.")},
{"newer_version_note", _u8L("A newer plugin version is available.")},
{"unauthorized_note", _u8L("Cloud updates are unavailable because this plugin is unauthorized for updates.")},
};
}
PluginsDialog::~PluginsDialog() { m_alive->store(false, std::memory_order_release); } PluginsDialog::~PluginsDialog() { m_alive->store(false, std::memory_order_release); }
void PluginsDialog::set_open_terminal_dlg_fn() void PluginsDialog::set_open_terminal_dlg_fn()
-2
View File
@@ -11,7 +11,6 @@
#include <functional> #include <functional>
#include <memory> #include <memory>
#include <mutex> #include <mutex>
#include <nlohmann/json_fwd.hpp>
#include <optional> #include <optional>
#include <string> #include <string>
#include <thread> #include <thread>
@@ -238,7 +237,6 @@ private:
void open_plugin_on_cloud(const std::string& sharing_token); void open_plugin_on_cloud(const std::string& sharing_token);
void open_plugin_hub(); void open_plugin_hub();
void on_script_message(const nlohmann::json& payload) override; void on_script_message(const nlohmann::json& payload) override;
nlohmann::json localized_strings() const override;
// Runs one web command on a clean main-loop stack; see on_script_message. // Runs one web command on a clean main-loop stack; see on_script_message.
void handle_web_command(const nlohmann::json& payload); void handle_web_command(const nlohmann::json& payload);
// Re-raises this dialog after a transient modal it opened (file dialog, message box, // Re-raises this dialog after a transient modal it opened (file dialog, message box,
-25
View File
@@ -208,31 +208,6 @@ void PresetBundleDialog::create()
wxSize(820, 660), wxSize(640, 640)); wxSize(820, 660), wxSize(640, 640));
} }
nlohmann::json PresetBundleDialog::localized_strings() const
{
return {
{"refresh", _u8L("Refresh")},
{"name", _u8L("Name")},
{"type", _u8L("Type")},
{"version", _u8L("Version")},
{"update", _u8L("Update")},
{"export_presets", _u8L("Export Presets")},
{"close", _u8L("Close")},
{"open_folder", _u8L("Open folder in explorer")},
{"delete_bundle", _u8L("Delete bundle")},
{"unsubscribe_bundle", _u8L("Unsubscribe bundle")},
{"update_available", _u8L("Update available")},
{"unauthorized_bundle", _u8L("Unauthorized bundle")},
{"open_in_browser", _u8L("Open this bundle in your browser")},
{"type_subscribed", _u8L("Subscribed")},
{"type_local", _u8L("Local")},
{"type_default", _u8L("Default")},
{"printer", _u8L("Printer")},
{"filament", _u8L("Filament")},
{"process", _u8L("Process")},
};
}
bool PresetBundleDialog::DeleteBundleById(const wxString& id) bool PresetBundleDialog::DeleteBundleById(const wxString& id)
{ {
auto* b = wxGetApp().preset_bundle; auto* b = wxGetApp().preset_bundle;
-2
View File
@@ -8,7 +8,6 @@
#include <atomic> #include <atomic>
#include <boost/thread/detail/thread.hpp> #include <boost/thread/detail/thread.hpp>
#include <libslic3r/PresetBundle.hpp> #include <libslic3r/PresetBundle.hpp>
#include <nlohmann/json_fwd.hpp>
#include <memory> #include <memory>
#include <slic3r/GUI/GUI.hpp> #include <slic3r/GUI/GUI.hpp>
#include <string> #include <string>
@@ -64,7 +63,6 @@ public:
// webview events // webview events
void on_script_message(const nlohmann::json& payload) override; void on_script_message(const nlohmann::json& payload) override;
nlohmann::json localized_strings() const override;
void StartDialogWorker(); void StartDialogWorker();
void StopDialogWorker(); void StopDialogWorker();
-16
View File
@@ -20,9 +20,6 @@
#include <wx/toolbar.h> #include <wx/toolbar.h>
#include <slic3r/GUI/Widgets/WebView.hpp> #include <slic3r/GUI/Widgets/WebView.hpp>
#include <slic3r/GUI/Widgets/WebViewHostDialog.hpp>
#include "I18N.hpp"
#include <nlohmann/json.hpp>
#include <wx/utils.h> #include <wx/utils.h>
#include <wx/webview.h> #include <wx/webview.h>
@@ -110,17 +107,6 @@ static void inject_vue_resize_workaround(wxWebView *webView)
} }
#endif #endif
// The strings of the page shown when the printer has no connection set up
// (resources/web/orca/missing_connection.html), keyed by its data-i18n ids.
static void add_page_strings(wxWebView *webView)
{
const nlohmann::json strings = {
{"printer_connection", _u8L("Printer Connection")},
{"printer_connection_setup", _u8L("Please set up your printer connection to view the device.")},
};
webView->AddUserScript(wxString::FromUTF8(WebViewHostDialog::localized_strings_script(strings)));
}
PrinterWebView::PrinterWebView(wxWindow *parent) PrinterWebView::PrinterWebView(wxWindow *parent)
: wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize)
, m_browser(nullptr) , m_browser(nullptr)
@@ -175,7 +161,6 @@ PrinterWebView::~PrinterWebView()
void PrinterWebView::create_browser() void PrinterWebView::create_browser()
{ {
m_browser = WebView::CreateWebView(this, ""); m_browser = WebView::CreateWebView(this, "");
add_page_strings(m_browser);
#ifdef __linux__ #ifdef __linux__
inject_vue_resize_workaround(m_browser); inject_vue_resize_workaround(m_browser);
@@ -293,7 +278,6 @@ void PrinterWebView::SendAPIKey()
// Re-inject the vue-resize/WebKitGTK workaround that RemoveAllUserScripts just cleared. // Re-inject the vue-resize/WebKitGTK workaround that RemoveAllUserScripts just cleared.
inject_vue_resize_workaround(m_browser); inject_vue_resize_workaround(m_browser);
#endif #endif
add_page_strings(m_browser);
m_browser->AddUserScript(script); m_browser->AddUserScript(script);
m_browser->Reload(); m_browser->Reload();
+1 -29
View File
@@ -51,9 +51,7 @@
#include <wx/tglbtn.h> #include <wx/tglbtn.h>
#include "GUI_App.hpp" #include "GUI_App.hpp"
#include "I18N.hpp"
#include <slic3r/GUI/Widgets/WebView.hpp> #include <slic3r/GUI/Widgets/WebView.hpp>
#include <slic3r/GUI/Widgets/WebViewHostDialog.hpp>
#include "slic3r/GUI/Jobs/SendJob.hpp" #include "slic3r/GUI/Jobs/SendJob.hpp"
#include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/Plater.hpp"
@@ -67,29 +65,6 @@ namespace Slic3r { namespace GUI {
wxDEFINE_EVENT(EVT_PROJECT_RELOAD, wxCommandEvent); wxDEFINE_EVENT(EVT_PROJECT_RELOAD, wxCommandEvent);
// The project page's strings (resources/web/model), keyed by their data-i18n and T() ids.
static json project_page_strings()
{
return {
{"no_model_info", _u8L("No model information")},
{"edit_project_info", _u8L("Edit Project Info")},
{"model_information", _u8L("Model Information")},
{"accessories", _u8L("Accessories")},
{"profile_information", _u8L("Profile Information")},
{"model_name", _u8L("Model name")},
{"created_by", _u8L("Created by")},
{"remixed_by", _u8L("Remixed by")},
{"shared_by", _u8L("Shared by")},
{"model_description", _u8L("Model description")},
{"bom", _u8L("BOM")},
{"assembly_guide", _u8L("Assembly Guide")},
{"other", _u8L("Other")},
{"profile_name", _u8L("Profile name")},
{"profile_author", _u8L("Profile Author")},
{"profile_description", _u8L("Profile description")},
};
}
const std::vector<std::string> license_list = { const std::vector<std::string> license_list = {
"BSD License", "BSD License",
"Apache License", "Apache License",
@@ -142,13 +117,10 @@ void ProjectPanel::shutdown()
void ProjectPanel::create_browser() void ProjectPanel::create_browser()
{ {
// Created empty and loaded after the strings are added, so the first load already has them. m_browser = WebView::CreateWebView(this, m_project_home_url);
m_browser = WebView::CreateWebView(this, wxEmptyString);
m_browser->AddUserScript(wxString::FromUTF8(WebViewHostDialog::localized_strings_script(project_page_strings())));
m_browser->Bind(wxEVT_WEBVIEW_NAVIGATED, &ProjectPanel::on_navigated, this); m_browser->Bind(wxEVT_WEBVIEW_NAVIGATED, &ProjectPanel::on_navigated, this);
m_browser->Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &ProjectPanel::OnScriptMessage, this, m_browser->GetId()); m_browser->Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &ProjectPanel::OnScriptMessage, this, m_browser->GetId());
m_browser->Bind(wxEVT_WEBVIEW_NAVIGATING, &ProjectPanel::onWebNavigating, this); m_browser->Bind(wxEVT_WEBVIEW_NAVIGATING, &ProjectPanel::onWebNavigating, this);
WebView::LoadUrl(m_browser, m_project_home_url);
} }
void ProjectPanel::reset_browser() void ProjectPanel::reset_browser()
+3 -5
View File
@@ -63,7 +63,7 @@ static Option make_option(const std::string &key, Preset::Type type, const wxStr
GUI::Tab::translate_category(category, type).ToStdWstring(), false, mode, tooltip, gc.path, GUI::Tab::translate_category(category, type).ToStdWstring(), false, mode, tooltip, gc.path,
// The settings page draws Line::label; carrying it lets the Speed Dial name a setting // The settings page draws Line::label; carrying it lets the Speed Dial name a setting
// the way the page does. `label`/`label_local` stay the search-oriented name. // the way the page does. `label`/`label_local` stay the search-oriented name.
into_u8(gc.line_label), into_u8(gc.line_label_en)}; into_u8(gc.line_label)};
return option; return option;
} }
@@ -250,13 +250,11 @@ void SettingsIndex::set_path(const std::string &opt_key, Preset::Type type, cons
m_groups_and_categories[get_key(opt_key, type)].path = path; m_groups_and_categories[get_key(opt_key, type)].path = path;
} }
void SettingsIndex::set_line_label(const std::string &opt_key, Preset::Type type, const wxString &label, const wxString &label_en) void SettingsIndex::set_line_label(const std::string &opt_key, Preset::Type type, const wxString &label)
{ {
if (label.IsEmpty()) if (label.IsEmpty())
return; return;
GroupAndCategory &gc = m_groups_and_categories[get_key(opt_key, type)]; m_groups_and_categories[get_key(opt_key, type)].line_label = label;
gc.line_label = label;
gc.line_label_en = label_en;
} }
} // namespace Search } // namespace Search
+6 -9
View File
@@ -28,14 +28,12 @@ struct GroupAndCategory
wxString group; wxString group;
wxString category; wxString category;
wxString icon; // icon of the group's own header, or empty wxString icon; // icon of the group's own header, or empty
wxString line_label; // label the settings row actually draws (Line::label), or empty wxString line_label; // label the settings row actually draws (Line::label), or empty
wxString line_label_en; // untranslated English of line_label, or empty std::string path; // wiki path (Line::label_path) of the option's line, or empty
std::string path; // wiki path (Line::label_path) of the option's line, or empty
}; };
// Title for a setting: the row label, qualified with the field leaf when the row packs several // Title for a setting: the row label, qualified with the field leaf when the row packs several
// options (e.g. "Cool Plate \u2013 First layer"). Pure; both inputs are in the same language (the // options (e.g. "Cool Plate \u2013 First layer"). Pure; inputs are already localized.
// localized title, or its English counterpart).
inline wxString compose_display_label(const wxString& line_label, const wxString& leaf_label, bool multi) inline wxString compose_display_label(const wxString& line_label, const wxString& leaf_label, bool multi)
{ {
if (line_label.empty()) if (line_label.empty())
@@ -75,7 +73,6 @@ struct Option
std::string tooltip; // localized ConfigOptionDef::tooltip, or empty std::string tooltip; // localized ConfigOptionDef::tooltip, or empty
std::string wiki_path; // Line::label_path for the option's row, or empty std::string wiki_path; // Line::label_path for the option's row, or empty
std::string display_label; // label the settings row draws (localized); empty falls back to label std::string display_label; // label the settings row draws (localized); empty falls back to label
std::string display_label_en; // untranslated English of display_label, or empty
std::string opt_key() const; std::string opt_key() const;
}; };
@@ -101,9 +98,9 @@ public:
void add_key(const std::string &opt_key, Preset::Type type, const wxString &group, const wxString &category, void add_key(const std::string &opt_key, Preset::Type type, const wxString &group, const wxString &category,
const wxString &icon = wxEmptyString); const wxString &icon = wxEmptyString);
void set_path(const std::string &opt_key, Preset::Type type, const std::string &path); void set_path(const std::string &opt_key, Preset::Type type, const std::string &path);
// Record the label the option's row draws and its untranslated English, so the Speed Dial names a // Record the label the option's row draws, so the Speed Dial names a setting like the page
// setting like the page (ConfigOptionDef::label/full_label is a search name, not the row text). // (ConfigOptionDef::label/full_label is a search name, not the row text).
void set_line_label(const std::string &opt_key, Preset::Type type, const wxString &label, const wxString &label_en); void set_line_label(const std::string &opt_key, Preset::Type type, const wxString &label);
const std::vector<Option> &options() const { return m_options; } const std::vector<Option> &options() const { return m_options; }
const std::vector<Option> &all_options() const { return m_all_modes; } const std::vector<Option> &all_options() const { return m_all_modes; }
+14 -3
View File
@@ -84,8 +84,9 @@ void focus_webview(wxWebView* browser, bool page_ready)
browser->RunScript("focusInput();"); browser->RunScript("focusInput();");
} }
// Localized strings for the Speed Dial page (see WebViewHostDialog::localized_strings). The page's own T() // Localized strings for the Speed Dial page, injected as a document-start user script. The page's
// reads them; its JS literals are only a fallback before the script runs / in the node vm test. // T() reads window.ORCA_UI_STRINGS, so these flow through the same .po pipeline as the rest of the
// UI (the JS literals are only a fallback before the script runs / in the node vm test).
// %% is a literal '%': T() collapses it after substituting %s. Keep the shortcut tokens out of the // %% is a literal '%': T() collapses it after substituting %s. Keep the shortcut tokens out of the
// translated text so the platform prefix (Alt+/⌥+, Ctrl+/⌘+) stays correct. // translated text so the platform prefix (Alt+/⌥+, Ctrl+/⌘+) stays correct.
nlohmann::json speed_dial_ui_strings() nlohmann::json speed_dial_ui_strings()
@@ -174,7 +175,17 @@ SpeedDialWebDialog::SpeedDialWebDialog(wxWindow* parent)
SpeedDialWebDialog::~SpeedDialWebDialog() { m_alive->store(false, std::memory_order_release); } SpeedDialWebDialog::~SpeedDialWebDialog() { m_alive->store(false, std::memory_order_release); }
nlohmann::json SpeedDialWebDialog::localized_strings() const { return speed_dial_ui_strings(); } // Document-start hook: hand the page its translated strings before speeddial.js runs, so the first
// paint is already localized. The table is built when the dialog is created; a live language switch
// rebuilds the GUI (and with it this dialog), so the next open re-injects the new locale.
void SpeedDialWebDialog::add_user_scripts()
{
if (wxWebView* wv = browser()) {
const std::string js = "window.ORCA_UI_STRINGS = " +
speed_dial_ui_strings().dump(-1, ' ', false, nlohmann::json::error_handler_t::ignore) + ";";
wv->AddUserScript(wxString::FromUTF8(js));
}
}
void SpeedDialWebDialog::request_show() void SpeedDialWebDialog::request_show()
{ {
+1 -1
View File
@@ -22,7 +22,7 @@ public:
void request_show(); void request_show();
private: private:
nlohmann::json localized_strings() const override; void add_user_scripts() override;
void on_script_message(const nlohmann::json& payload) override; void on_script_message(const nlohmann::json& payload) override;
void handle_web_command(const nlohmann::json& payload); void handle_web_command(const nlohmann::json& payload);
void resize_to_content(int height); void resize_to_content(int height);
+8 -9
View File
@@ -817,24 +817,23 @@ Slic3r::GUI::PageShp Tab::add_options_page(const wxString& title, const std::str
// Names of categories is save in English always. We translate them only for UI. // Names of categories is save in English always. We translate them only for UI.
// But category "Extruder n" can't be translated regularly (using _()), so // But category "Extruder n" can't be translated regularly (using _()), so
// just for this category we should splite the title and translate "Extruder" word separately // just for this category we should splite the title and translate "Extruder" word separately
wxString Tab::translate_category(const wxString& title, Preset::Type preset_type, bool translate) wxString Tab::translate_category(const wxString& title, Preset::Type preset_type)
{ {
auto tr = [translate](const wxString& s) { return translate ? _(s) : s; };
if (preset_type == Preset::TYPE_PRINTER && title.Contains("Extruder ")) { if (preset_type == Preset::TYPE_PRINTER && title.Contains("Extruder ")) {
auto preset = wxGetApp().preset_bundle; auto preset = wxGetApp().preset_bundle;
if (preset && preset->is_bbl_vendor()) { if (preset && preset->is_bbl_vendor()) {
if (title == "Extruder 1") return tr(L("Left Extruder")); if (title == "Extruder 1") return _("Left Extruder");
if (title == "Extruder 2") return tr(L("Right Extruder")); if (title == "Extruder 2") return _("Right Extruder");
} }
return tr(L("Extruder")) + title.SubString(8, title.Last()); return _("Extruder") + title.SubString(8, title.Last());
} }
// Orca: one "Extruder" page serves all extruders; name it "Extruders" when there are several. // Orca: one "Extruder" page serves all extruders; name it "Extruders" when there are several.
if (preset_type == Preset::TYPE_PRINTER && title == "Extruder") { if (preset_type == Preset::TYPE_PRINTER && title == "Extruder") {
auto preset = wxGetApp().preset_bundle; auto preset = wxGetApp().preset_bundle;
if (preset && preset->get_printer_extruder_count() > 1) if (preset && preset->get_printer_extruder_count() > 1)
return tr(L("Extruders")); return _("Extruders");
} }
return tr(title); return _(title);
} }
void Tab::OnActivate() void Tab::OnActivate()
@@ -1866,14 +1865,14 @@ Tab::SettingRowState Tab::setting_row_state(const std::string &opt_id) const
if (opt.opt_id != opt_id) if (opt.opt_id != opt_id)
continue; continue;
if (line.toggle_visible) // shown on any owning page is enough if (line.toggle_visible) // shown on any owning page is enough
return {true, line.label, line.label_en, line.get_options().size() > 1}; return {true, line.label, line.get_options().size() > 1};
found = true; found = true;
} }
} }
} }
} }
// Never registered on a page -> visible, but with no row label to contribute. // Never registered on a page -> visible, but with no row label to contribute.
return {!found, wxString(), wxString(), false}; return {!found, wxString(), false};
} }
// To be called by custom widgets, load a value into a config, // To be called by custom widgets, load a value into a config,

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