Compare commits
114 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
181c6599b7 | ||
|
|
fb77d3cf8a | ||
|
|
1a4b19a5e1 | ||
|
|
a9f553729e | ||
|
|
ed96742680 | ||
|
|
5e7816d72d | ||
|
|
abab38e422 | ||
|
|
7835b17379 | ||
|
|
30612a866b | ||
|
|
bba574ce86 | ||
|
|
6d3d725b6c | ||
|
|
948bc06542 | ||
|
|
8f4ee3268d | ||
|
|
8f97bd997b | ||
|
|
18f6c9c24f | ||
|
|
c7bdd041f2 | ||
|
|
f75a011fb3 | ||
|
|
555764914d | ||
|
|
e4be98c7e7 | ||
|
|
701ce9dc0a | ||
|
|
3f950cc11d | ||
|
|
d8ce34a962 | ||
|
|
ef9d5e7862 | ||
|
|
e3f06eff55 | ||
|
|
7a062b7d7b | ||
|
|
121f3297ae | ||
|
|
9951f00979 | ||
|
|
d8bb744ce4 | ||
|
|
4db342b4ae | ||
|
|
e9f96e6d21 | ||
|
|
56c6ebdadf | ||
|
|
4f941a5892 | ||
|
|
bf69046efe | ||
|
|
cdcdb1b443 | ||
|
|
f875e9df4d | ||
|
|
12dd408f0b | ||
|
|
5e53bae9dc | ||
|
|
b19e190004 | ||
|
|
06c8bdc81a | ||
|
|
62338250e8 | ||
|
|
1ff79ebb13 | ||
|
|
2f9678d882 | ||
|
|
94d70cbe55 | ||
|
|
f5c26f97aa | ||
|
|
b367c7d3d6 | ||
|
|
c9cae35946 | ||
|
|
a895b0b583 | ||
|
|
5321c25bb2 | ||
|
|
b39691b879 | ||
|
|
74e7f02668 | ||
|
|
09e1510298 | ||
|
|
0d95a731e3 | ||
|
|
7d5706520b | ||
|
|
e887b3153d | ||
|
|
a7aa897fad | ||
|
|
29e2fd863b | ||
|
|
330cac26ec | ||
|
|
ca9195ba97 | ||
|
|
908270ffff | ||
|
|
942fbcf6f6 | ||
|
|
dbc6bae898 | ||
|
|
8482802375 | ||
|
|
fdd3614204 | ||
|
|
706a2780d9 | ||
|
|
97a90076a4 | ||
|
|
ef85b8f3e1 | ||
|
|
83700a1d1a | ||
|
|
36a363f8ed | ||
|
|
1c8381337a | ||
|
|
f698b27be5 | ||
|
|
f2767cf3bc | ||
|
|
fe873729b6 | ||
|
|
031b35eb06 | ||
|
|
bcc604cf63 | ||
|
|
adf01eed16 | ||
|
|
bd1750f252 | ||
|
|
49adf0ee84 | ||
|
|
04a2fa72a7 | ||
|
|
064c41d419 | ||
|
|
7c92023af7 | ||
|
|
ac01b75342 | ||
|
|
95a7801a50 | ||
|
|
db1ec5d024 | ||
|
|
a96cd8a38f | ||
|
|
45d5789685 | ||
|
|
4b08123a61 | ||
|
|
bfc99ab02c | ||
|
|
6eb8a18430 | ||
|
|
489b8e6549 | ||
|
|
7bb2ecfff1 | ||
|
|
59b4b34840 | ||
|
|
9597888902 | ||
|
|
dbfcc8ba0a | ||
|
|
fd8e9fba83 | ||
|
|
f65d1828fe | ||
|
|
c32601809b | ||
|
|
fdf86a1e56 | ||
|
|
71908523f9 | ||
|
|
2b7d678321 | ||
|
|
5d64fa8369 | ||
|
|
fe6bb4534c | ||
|
|
95daec6814 | ||
|
|
43b104fcc3 | ||
|
|
a33d6b1c1a | ||
|
|
cf67b9306b | ||
|
|
238c86ee98 | ||
|
|
7f56209ca9 | ||
|
|
a3e50cdc02 | ||
|
|
b7c43d8373 | ||
|
|
cadc13f2e0 | ||
|
|
7965d2e081 | ||
|
|
b829a20169 | ||
|
|
653b8b4014 | ||
|
|
a891203204 |
1
.envrc
@@ -2,7 +2,6 @@ if ! has nix_direnv_version || ! nix_direnv_version 2.2.1; then
|
||||
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.1/direnvrc" "sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs="
|
||||
fi
|
||||
|
||||
nix_direnv_watch_file rust-toolchain.toml
|
||||
nix_direnv_watch_file package.json
|
||||
if ! use flake . --impure
|
||||
then
|
||||
|
||||
3
.github/CODEOWNERS
vendored
@@ -17,8 +17,7 @@
|
||||
/gui/src/components/settings/ @Erimelowo @loucass003
|
||||
|
||||
# Rust part of the GUI
|
||||
/gui/src-tauri/ @loucass003
|
||||
/Cargo.lock @loucass003
|
||||
/gui/electron/ @loucass003
|
||||
|
||||
# Some server code~
|
||||
/server/ @ButterscotchV @Eirenliel @Erimelowo
|
||||
|
||||
129
.github/workflows/build-gui.yml
vendored
@@ -1,129 +0,0 @@
|
||||
name: Build GUI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- .github/workflows/build-gui.yml
|
||||
- gui/**
|
||||
- package*.json
|
||||
pull_request:
|
||||
paths:
|
||||
- .github/workflows/build-gui.yml
|
||||
- gui/**
|
||||
- package*.json
|
||||
workflow_dispatch:
|
||||
create:
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
pnpm i
|
||||
cd gui
|
||||
pnpm run lint
|
||||
|
||||
build:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os:
|
||||
[
|
||||
ubuntu-22.04,
|
||||
windows-latest,
|
||||
macos-latest,
|
||||
ubuntu-22.04-arm,
|
||||
windows-11-arm,
|
||||
]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
env:
|
||||
# Don't mark warnings as errors
|
||||
CI: false
|
||||
BUILD_ARCH: ${{ endsWith(matrix.os, 'arm') && 'aarch64' || 'amd64' }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- if: startsWith(matrix.os, 'ubuntu')
|
||||
name: Set up Linux dependencies
|
||||
uses: awalsh128/cache-apt-pkgs-action@v1.6.0
|
||||
with:
|
||||
packages: libgtk-3-dev webkit2gtk-4.1 libappindicator3-dev librsvg2-dev patchelf
|
||||
# Increment to invalidate the cache
|
||||
version: ${{ format('v1.0-{0}', env.BUILD_ARCH) }}
|
||||
# Enables a workaround to attempt to run pre and post install scripts
|
||||
execute_install_scripts: true
|
||||
# Disables uploading logs as a build artifact
|
||||
debug: false
|
||||
|
||||
- if: matrix.os == 'windows-11-arm'
|
||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||
with:
|
||||
cache: false
|
||||
|
||||
- name: Cache cargo dependencies
|
||||
uses: Swatinem/rust-cache@v2
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: pnpm i
|
||||
|
||||
- name: Build
|
||||
shell: bash
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
NODE_OPTIONS: ${{ matrix.os == 'macos-latest' && '--max-old-space-size=4096' || '' }}
|
||||
run: pnpm run skipbundler --config $( ./gui/scripts/gitversion.mjs )
|
||||
|
||||
- if: startsWith(matrix.os, 'windows')
|
||||
name: Upload a Build Artifact (Windows)
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
# Artifact name
|
||||
name: ${{ format('SlimeVR-GUI-Windows-{0}', env.BUILD_ARCH) }}
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: target/release/slimevr.exe
|
||||
|
||||
- if: startsWith(matrix.os, 'ubuntu')
|
||||
name: Upload a Build Artifact (Linux)
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
# Artifact name
|
||||
name: ${{ format('SlimeVR-GUI-Linux-{0}', env.BUILD_ARCH) }}
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: target/release/slimevr
|
||||
|
||||
- if: matrix.os == 'macos-latest'
|
||||
name: Upload a Build Artifact (macOS)
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
# Artifact name
|
||||
name: SlimeVR-GUI-macOS
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: target/release/slimevr
|
||||
291
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,291 @@
|
||||
name: SlimeVR Full Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
tags: ["v*"]
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
setup-matrix:
|
||||
name: Configure Build Matrix
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||
steps:
|
||||
- id: set-matrix
|
||||
shell: bash
|
||||
run: |
|
||||
BASE='[{"os":"ubuntu-22.04","platform":"linux"},{"os":"windows-latest","platform":"windows"},{"os":"macos-latest","platform":"macos"}]'
|
||||
EXTRA='[{"os":"ubuntu-22.04-arm","platform":"linux"},{"os":"windows-11-arm","platform":"windows"}]'
|
||||
|
||||
if [[ "${{ github.ref }}" == refs/tags/v* || "${{ github.ref }}" == refs/heads/main || "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
||||
RESULT=$(echo "$BASE $EXTRA" | jq -c -s 'add')
|
||||
else
|
||||
RESULT=$(echo "$BASE" | jq -c '.')
|
||||
fi
|
||||
echo "matrix={\"include\":$RESULT}" >> "$GITHUB_OUTPUT"
|
||||
gui-checks:
|
||||
name: Gui Checks
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
- name: Setup PNPM
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- name: GUI Lint
|
||||
run: pnpm i && cd gui && pnpm run lint
|
||||
|
||||
java-checks:
|
||||
name: Java Checks
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v5
|
||||
- name: Java Spotless Check
|
||||
run: ./gradlew spotlessCheck --build-cache
|
||||
|
||||
|
||||
build-server-jar:
|
||||
name: Build Desktop Server
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v5
|
||||
- name: Build ShadowJar
|
||||
run: ./gradlew :server:desktop:shadowJar --build-cache
|
||||
- name: Test with Gradle
|
||||
run: ./gradlew :server:desktop:test
|
||||
- name: Upload Server Jar
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: server-jar
|
||||
path: |
|
||||
server/desktop/build/libs/slimevr.jar
|
||||
server/core/resources
|
||||
|
||||
build-gui-frontend:
|
||||
name: Build GUI Assets
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
- name: Setup PNPM
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- name: Build JS
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
run: pnpm i && cd gui && pnpm run build
|
||||
- name: Tar GUI Dist
|
||||
run: tar -czf slimevr-gui-dist.tar.gz -C gui/out .
|
||||
- name: Upload GUI Dist
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: gui-dist
|
||||
path: slimevr-gui-dist.tar.gz
|
||||
|
||||
package-desktop:
|
||||
name: Package Desktop (${{ matrix.platform }} - ${{ matrix.os }})
|
||||
needs: [setup-matrix, build-server-jar, build-gui-frontend]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix: ${{ fromJson(needs.setup-matrix.outputs.matrix) }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
- name: Setup PNPM
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- name: Download Server Jar
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: server-jar
|
||||
path: server
|
||||
- name: Download GUI Dist
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: gui-dist
|
||||
- name: Extract GUI for Electron
|
||||
shell: bash
|
||||
run: mkdir -p gui/out && tar -xzf slimevr-gui-dist.tar.gz -C gui/out
|
||||
- name: Run Electron Builder
|
||||
shell: bash
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
run: |
|
||||
mkdir -p gui/dist/artifacts/linux/ \
|
||||
gui/dist/artifacts/win \
|
||||
gui/dist/artifacts/mac
|
||||
cd gui
|
||||
pnpm i
|
||||
pnpm exec electron-builder --${{ matrix.platform }} \
|
||||
${{ matrix.platform == 'macos' && '--universal' || '' }} \
|
||||
--publish never
|
||||
- name: Collect and Rename Artifacts
|
||||
shell: bash
|
||||
run: |
|
||||
SRC_DIR="${{ github.workspace }}/gui/dist/artifacts"
|
||||
DEST_DIR="${{ github.workspace }}/release-out"
|
||||
mkdir -p "$DEST_DIR"
|
||||
|
||||
if [ "${{ matrix.platform }}" == "windows" ]; then
|
||||
[[ "${{ matrix.os }}" == *"arm"* ]] && SUFFIX="win-aarch64" || SUFFIX="win64"
|
||||
cp "$SRC_DIR"/win/*.zip "$DEST_DIR/SlimeVR-$SUFFIX.zip"
|
||||
|
||||
elif [ "${{ matrix.platform }}" == "linux" ]; then
|
||||
for f in "$SRC_DIR"/linux/*; do
|
||||
[ -d "$f" ] && continue
|
||||
BASE=$(basename "$f")
|
||||
NEW_NAME=$(echo "$BASE" | sed -e 's/x86_64/amd64/g' -e 's/arm64/aarch64/g')
|
||||
cp "$f" "$DEST_DIR/$NEW_NAME"
|
||||
done
|
||||
|
||||
elif [ "${{ matrix.platform }}" == "macos" ]; then
|
||||
cp "$SRC_DIR"/mac/*.dmg "$DEST_DIR/SlimeVR-mac.dmg"
|
||||
fi
|
||||
|
||||
echo "Collected files:"
|
||||
ls -lh "$DEST_DIR"
|
||||
- name: Upload For Release
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: release-${{ matrix.platform }}-${{ matrix.os }}
|
||||
path: release-out/*
|
||||
|
||||
bundle-android:
|
||||
name: Build Android APK
|
||||
needs: [build-gui-frontend]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v5
|
||||
- name: Download GUI Dist
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: gui-dist
|
||||
- name: Extract GUI for Android
|
||||
run: mkdir -p gui/out && tar -xzf slimevr-gui-dist.tar.gz -C gui/out
|
||||
- name: Build APK
|
||||
run: ./gradlew :server:android:build --build-cache
|
||||
env:
|
||||
ANDROID_STORE_FILE: ${{ secrets.ANDROID_STORE_FILE }}
|
||||
ANDROID_STORE_PASSWD: ${{ secrets.ANDROID_STORE_PASSWD }}
|
||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
||||
ANDROID_KEY_PASSWD: ${{ secrets.ANDROID_KEY_PASSWD }}
|
||||
- name: Test with Gradle
|
||||
run: ./gradlew test
|
||||
- name: Prepare APK
|
||||
run: cp server/android/build/outputs/apk/release/*.apk ./SlimeVR-android.apk
|
||||
- name: Upload APK
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: release-android
|
||||
path: SlimeVR-android.apk
|
||||
|
||||
- name: Build Google Play release bundle
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: ./gradlew :server:android:bundleRelease
|
||||
env:
|
||||
ANDROID_STORE_FILE: ${{ secrets.ANDROID_GPLAY_STORE_FILE }}
|
||||
ANDROID_STORE_PASSWD: ${{ secrets.ANDROID_GPLAY_STORE_PASSWD }}
|
||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_GPLAY_KEY_ALIAS }}
|
||||
ANDROID_KEY_PASSWD: ${{ secrets.ANDROID_GPLAY_KEY_PASSWD }}
|
||||
|
||||
- name: Upload the Google Play artifact
|
||||
uses: actions/upload-artifact@v6
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
# Artifact name
|
||||
name: 'SlimeVR-Android-GPDev' # optional, default is artifact
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: server/android/build/outputs/bundle/release/*
|
||||
|
||||
create-release:
|
||||
name: Finalize Release Draft
|
||||
needs: [package-desktop, bundle-android, build-server-jar, build-gui-frontend]
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download All Release Artifacts
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
pattern: release-*
|
||||
path: release-out
|
||||
merge-multiple: true
|
||||
- name: Download Server Jar
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: server-jar
|
||||
path: server
|
||||
- name: Download GUI Dist
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: gui-dist
|
||||
- name: Create GitHub Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
release-out/*
|
||||
server/desktop/build/libs/slimevr.jar
|
||||
slimevr-gui-dist.tar.gz
|
||||
413
.github/workflows/gradle.yaml
vendored
@@ -1,413 +0,0 @@
|
||||
# This workflow will build a Java project with Gradle
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
|
||||
|
||||
name: SlimeVR Server
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
create:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v5
|
||||
|
||||
- run: mkdir ./gui/dist && touch ./gui/dist/somefile
|
||||
shell: bash
|
||||
|
||||
- name: Check code formatting
|
||||
run: ./gradlew spotlessCheck
|
||||
|
||||
- name: Test with Gradle
|
||||
run: ./gradlew test
|
||||
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v5
|
||||
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew :server:desktop:shadowJar
|
||||
|
||||
- name: Upload the Server JAR as a Build Artifact
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
# Artifact name
|
||||
name: 'SlimeVR-Server' # optional, default is artifact
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: server/desktop/build/libs/slimevr.jar
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
server/desktop/build/libs/slimevr.jar
|
||||
|
||||
bundle-android:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v5
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm i
|
||||
|
||||
- name: Build GUI
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
run: cd gui && pnpm run build
|
||||
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew :server:android:build
|
||||
env:
|
||||
ANDROID_STORE_FILE: ${{ secrets.ANDROID_STORE_FILE }}
|
||||
ANDROID_STORE_PASSWD: ${{ secrets.ANDROID_STORE_PASSWD }}
|
||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
||||
ANDROID_KEY_PASSWD: ${{ secrets.ANDROID_KEY_PASSWD }}
|
||||
|
||||
- name: Upload the Android build artifact
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
# Artifact name
|
||||
name: 'SlimeVR-Android' # optional, default is artifact
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: server/android/build/outputs/apk/*
|
||||
|
||||
- name: Prepare for release
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: |
|
||||
cp server/android/build/outputs/apk/release/android-release.apk ./SlimeVR-android.apk
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
./SlimeVR-android.apk
|
||||
|
||||
- name: Build Google Play release bundle
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: ./gradlew :server:android:bundleRelease
|
||||
env:
|
||||
ANDROID_STORE_FILE: ${{ secrets.ANDROID_GPLAY_STORE_FILE }}
|
||||
ANDROID_STORE_PASSWD: ${{ secrets.ANDROID_GPLAY_STORE_PASSWD }}
|
||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_GPLAY_KEY_ALIAS }}
|
||||
ANDROID_KEY_PASSWD: ${{ secrets.ANDROID_GPLAY_KEY_PASSWD }}
|
||||
|
||||
- name: Upload the Google Play artifact
|
||||
uses: actions/upload-artifact@v6
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
# Artifact name
|
||||
name: 'SlimeVR-Android-GPDev' # optional, default is artifact
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: server/android/build/outputs/bundle/release/*
|
||||
|
||||
bundle-linux:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, ubuntu-24.04-arm]
|
||||
runs-on: ${{ matrix.os }}
|
||||
needs: [build, test]
|
||||
if: contains(fromJSON('["workflow_dispatch", "create"]'), github.event_name)
|
||||
|
||||
env:
|
||||
BUILD_ARCH: ${{ endsWith(matrix.os, 'arm') && 'aarch64' || 'amd64' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: 'SlimeVR-Server'
|
||||
path: server/desktop/build/libs/
|
||||
|
||||
- name: Set up Linux dependencies
|
||||
uses: awalsh128/cache-apt-pkgs-action@v1.6.0
|
||||
with:
|
||||
packages: |
|
||||
build-essential curl wget file libssl-dev libgtk-3-dev libappindicator3-dev librsvg2-dev xdg-utils
|
||||
# Increment to invalidate the cache
|
||||
version: ${{ format('v1.0-{0}', env.BUILD_ARCH) }}
|
||||
# Enables a workaround to attempt to run pre and post install scripts
|
||||
execute_install_scripts: true
|
||||
# Disables uploading logs as a build artifact
|
||||
debug: false
|
||||
|
||||
- name: Set up specific Linux versioned dependencies
|
||||
run: |
|
||||
sudo apt-get update && sudo apt-get install -y \
|
||||
libwebkit2gtk-4.1-0=2.44.0-2 \
|
||||
libwebkit2gtk-4.1-dev=2.44.0-2 \
|
||||
libjavascriptcoregtk-4.1-0=2.44.0-2 \
|
||||
libjavascriptcoregtk-4.1-dev=2.44.0-2 \
|
||||
gir1.2-javascriptcoregtk-4.1=2.44.0-2 \
|
||||
gir1.2-webkit2-4.1=2.44.0-2;
|
||||
|
||||
- name: Cache cargo dependencies
|
||||
uses: Swatinem/rust-cache@v2
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm i
|
||||
|
||||
- name: Build
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
run: pnpm run tauri build --config $( ./gui/scripts/gitversion.mjs )
|
||||
|
||||
- name: Make GUI tarball
|
||||
run: |
|
||||
tar czf slimevr-gui-dist.tar.gz -C gui/dist/ .
|
||||
|
||||
- uses: actions/upload-artifact@v6
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
with:
|
||||
name: SlimeVR-GUI-Dist
|
||||
path: ./slimevr-gui-dist.tar.gz
|
||||
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ${{ format('SlimeVR-GUI-Deb-{0}', env.BUILD_ARCH) }}
|
||||
path: target/release/bundle/deb/slimevr*.deb
|
||||
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ${{ format('SlimeVR-GUI-AppImage-{0}', env.BUILD_ARCH) }}
|
||||
path: target/release/bundle/appimage/slimevr*.AppImage
|
||||
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ${{ format('SlimeVR-GUI-RPM-{0}', env.BUILD_ARCH) }}
|
||||
path: target/release/bundle/rpm/slimevr*.rpm
|
||||
|
||||
- name: Prepare for release
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: |
|
||||
cp target/release/bundle/appimage/slimevr*.AppImage "./SlimeVR-$BUILD_ARCH.appimage"
|
||||
cp target/release/bundle/deb/slimevr*.deb "./SlimeVR-$BUILD_ARCH.deb"
|
||||
cp target/release/bundle/rpm/slimevr*.rpm "./SlimeVR-$BUILD_ARCH.rpm"
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
./slimevr-gui-dist.tar.gz
|
||||
./SlimeVR-*.appimage
|
||||
./SlimeVR-*.deb
|
||||
./SlimeVR-*.rpm
|
||||
|
||||
bundle-mac:
|
||||
runs-on: macos-latest
|
||||
needs: [build, test]
|
||||
if: contains(fromJSON('["workflow_dispatch", "create"]'), github.event_name)
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: 'SlimeVR-Server'
|
||||
path: server/desktop/build/libs/
|
||||
|
||||
- name: Cache cargo dependencies
|
||||
uses: Swatinem/rust-cache@v2
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
rustup target add x86_64-apple-darwin
|
||||
pnpm i
|
||||
|
||||
- name: Build
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
NODE_OPTIONS: --max-old-space-size=4096
|
||||
run: pnpm run tauri build --target universal-apple-darwin --config $( ./gui/scripts/gitversion.mjs )
|
||||
|
||||
- name: Modify Application
|
||||
run: |
|
||||
cd target/universal-apple-darwin/release/bundle/macos/slimevr.app/Contents/MacOS
|
||||
cp $( git rev-parse --show-toplevel )/server/desktop/build/libs/slimevr.jar ./
|
||||
cd ../../../
|
||||
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName SlimeVR" slimevr.app/Contents/Info.plist
|
||||
/usr/libexec/PlistBuddy -c "Set :CFBundleName SlimeVR" slimevr.app/Contents/Info.plist
|
||||
codesign --sign - --deep --force slimevr.app
|
||||
mv slimevr.app SlimeVR.app
|
||||
cd ../dmg/
|
||||
./bundle_dmg.sh --volname SlimeVR --icon slimevr 180 170 --app-drop-link 480 170 \
|
||||
--window-size 660 400 --hide-extension ../macos/SlimeVR.app \
|
||||
--volicon ../macos/SlimeVR.app/Contents/Resources/icon.icns --skip-jenkins \
|
||||
--eula ../../../../../LICENSE-MIT slimevr.dmg ../macos/SlimeVR.app
|
||||
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: SlimeVR-GUI-MacApp
|
||||
path: target/universal-apple-darwin/release/bundle/macos/SlimeVR*.app
|
||||
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: SlimeVR-GUI-MacDmg
|
||||
path: target/universal-apple-darwin/release/bundle/dmg/slimevr.dmg
|
||||
|
||||
- name: Prepare for release
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: |
|
||||
cp target/universal-apple-darwin/release/bundle/dmg/slimevr.dmg ./SlimeVR-mac.dmg
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
./SlimeVR-mac.dmg
|
||||
|
||||
bundle-windows:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [windows-latest, windows-11-arm]
|
||||
runs-on: ${{ matrix.os }}
|
||||
needs: [build, test]
|
||||
if: contains(fromJSON('["workflow_dispatch", "create"]'), github.event_name)
|
||||
|
||||
env:
|
||||
BUILD_ARCH: ${{ endsWith(matrix.os, 'arm') && 'win-aarch64' || 'win64' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: 'SlimeVR-Server'
|
||||
path: server/desktop/build/libs/
|
||||
|
||||
- if: matrix.os == 'windows-11-arm'
|
||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||
with:
|
||||
cache: false
|
||||
|
||||
- name: Cache cargo dependencies
|
||||
uses: Swatinem/rust-cache@v2
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: pnpm i
|
||||
|
||||
- name: Build
|
||||
shell: bash
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
run: pnpm run skipbundler --config $( ./gui/scripts/gitversion.mjs )
|
||||
|
||||
- name: Bundle to zips
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir SlimeVR
|
||||
cp gui/src-tauri/icons/icon.ico ./SlimeVR/run.ico
|
||||
cp server/desktop/build/libs/slimevr.jar ./SlimeVR/slimevr.jar
|
||||
cp server/core/resources/* ./SlimeVR/
|
||||
cp target/release/slimevr.exe ./SlimeVR/
|
||||
7z a -tzip "SlimeVR-$BUILD_ARCH.zip" ./SlimeVR/
|
||||
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ${{ format('SlimeVR-GUI-Windows-{0}', env.BUILD_ARCH) }}
|
||||
path: ./SlimeVR*.zip
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: ./SlimeVR-*.zip
|
||||
7
.gitignore
vendored
@@ -34,9 +34,6 @@
|
||||
# ignore gradle build folder
|
||||
build/
|
||||
|
||||
# Rust build artifacts
|
||||
/target
|
||||
|
||||
# direnv has been claimed for Nix usage
|
||||
.direnv/
|
||||
.devenv
|
||||
@@ -46,3 +43,7 @@ local.properties
|
||||
|
||||
# Ignore temporary config
|
||||
vrconfig.yml.tmp
|
||||
|
||||
|
||||
# Nixos
|
||||
.bin/
|
||||
|
||||
1
.vscode/extensions.json
vendored
@@ -7,7 +7,6 @@
|
||||
"gaborv.flatbuffers",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"esbenp.prettier-vscode",
|
||||
"rust-lang.rust-analyzer",
|
||||
"bradlc.vscode-tailwindcss",
|
||||
"EditorConfig.EditorConfig",
|
||||
"macabeus.vscode-fluent",
|
||||
|
||||
@@ -7,8 +7,6 @@ This document describes essential knowledge required to contribute to the SlimeV
|
||||
- [Git](https://git-scm.com/downloads)
|
||||
- [Java v17+](https://adoptium.net/temurin/releases/)
|
||||
- [Node.js v16.9+](https://nodejs.org) (We recommend the use of `nvm` instead of installing Node.js directly)
|
||||
- [Microsoft Edge WebView2](https://developer.microsoft.com/en-us/microsoft-edge/webview2/#download-section) or `webkit2gtk` for Linux
|
||||
- [Rust](https://rustup.rs)
|
||||
|
||||
## Cloning the code
|
||||
First, clone the codebase using git in a terminal in the folder you want.
|
||||
@@ -32,13 +30,13 @@ be at `server/build/libs/slimevr.jar` (you can ignore `server.jar`).
|
||||
|
||||
(Note: Your IDE may be able to do all of the above for you.)
|
||||
|
||||
### Tauri (gui)
|
||||
### Electron (gui)
|
||||
|
||||
- Activate corepack (included with Node.JS) via `corepack enable` (might require administrator permissions)
|
||||
- Run `pnpm i` in your IDE's terminal to download and install dependencies.
|
||||
- To launch the GUI in dev mode, run `pnpm gui`.
|
||||
- Finally, to compile for production, run `pnpm run tauri build`. The result
|
||||
will be at `target/release/slimevr.exe`.
|
||||
- Finally, to compile for production, run `pnpm package:build`. The result
|
||||
will be at `dist/artifacts/` content will change depending of the platform.
|
||||
|
||||
## Code style
|
||||
|
||||
@@ -84,7 +82,7 @@ Import the formatting settings defined in `spotless.xml`, like this:
|
||||
Eclipse will only do a subset of the checks in `spotless`, so you may still want to do
|
||||
`./gradlew spotlessApply` if you ever see an error from spotless.
|
||||
|
||||
### Tauri (gui)
|
||||
### Electron (gui)
|
||||
|
||||
We use ESLint and Prettier to format GUI code.
|
||||
- First, go into the GUI's directory with your terminal by running `cd gui`.
|
||||
|
||||
6898
Cargo.lock
generated
16
Cargo.toml
@@ -1,16 +0,0 @@
|
||||
[workspace]
|
||||
# Use 2021 edition resolver, better resolves crate features.
|
||||
resolver = "2"
|
||||
|
||||
# A list of all rust crates in the workspace.
|
||||
members = ["gui/src-tauri"]
|
||||
|
||||
# These settings can be inherited by workspace members
|
||||
[workspace.package]
|
||||
edition = "2021"
|
||||
license = "MIT OR Apache-2.0"
|
||||
rust-version = "1.82" # Tauri's MSRV
|
||||
repository = "https://github.com/SlimeVR/SlimeVR-Server"
|
||||
|
||||
[profile.release]
|
||||
lto = "thin"
|
||||
242
deny.toml
@@ -1,242 +0,0 @@
|
||||
# This template contains all of the possible sections and their default values
|
||||
|
||||
# Note that all fields that take a lint level have these possible values:
|
||||
# * deny - An error will be produced and the check will fail
|
||||
# * warn - A warning will be produced, but the check will not fail
|
||||
# * allow - No warning or error will be produced, though in some cases a note
|
||||
# will be
|
||||
|
||||
# The values provided in this template are the default values that will be used
|
||||
# when any section or field is not specified in your own configuration
|
||||
|
||||
# Root options
|
||||
|
||||
# The graph table configures how the dependency graph is constructed and thus
|
||||
# which crates the checks are performed against
|
||||
[graph]
|
||||
# If 1 or more target triples (and optionally, target_features) are specified,
|
||||
# only the specified targets will be checked when running `cargo deny check`.
|
||||
# This means, if a particular package is only ever used as a target specific
|
||||
# dependency, such as, for example, the `nix` crate only being used via the
|
||||
# `target_family = "unix"` configuration, that only having windows targets in
|
||||
# this list would mean the nix crate, as well as any of its exclusive
|
||||
# dependencies not shared by any other crates, would be ignored, as the target
|
||||
# list here is effectively saying which targets you are building for.
|
||||
targets = [
|
||||
# The triple can be any string, but only the target triples built in to
|
||||
# rustc (as of 1.40) can be checked against actual config expressions
|
||||
#"x86_64-unknown-linux-musl",
|
||||
# You can also specify which target_features you promise are enabled for a
|
||||
# particular target. target_features are currently not validated against
|
||||
# the actual valid features supported by the target architecture.
|
||||
#{ triple = "wasm32-unknown-unknown", features = ["atomics"] },
|
||||
]
|
||||
# When creating the dependency graph used as the source of truth when checks are
|
||||
# executed, this field can be used to prune crates from the graph, removing them
|
||||
# from the view of cargo-deny. This is an extremely heavy hammer, as if a crate
|
||||
# is pruned from the graph, all of its dependencies will also be pruned unless
|
||||
# they are connected to another crate in the graph that hasn't been pruned,
|
||||
# so it should be used with care. The identifiers are [Package ID Specifications]
|
||||
# (https://doc.rust-lang.org/cargo/reference/pkgid-spec.html)
|
||||
#exclude = []
|
||||
# If true, metadata will be collected with `--all-features`. Note that this can't
|
||||
# be toggled off if true, if you want to conditionally enable `--all-features` it
|
||||
# is recommended to pass `--all-features` on the cmd line instead
|
||||
all-features = false
|
||||
# If true, metadata will be collected with `--no-default-features`. The same
|
||||
# caveat with `all-features` applies
|
||||
no-default-features = false
|
||||
# If set, these feature will be enabled when collecting metadata. If `--features`
|
||||
# is specified on the cmd line they will take precedence over this option.
|
||||
#features = []
|
||||
|
||||
# The output table provides options for how/if diagnostics are outputted
|
||||
[output]
|
||||
# When outputting inclusion graphs in diagnostics that include features, this
|
||||
# option can be used to specify the depth at which feature edges will be added.
|
||||
# This option is included since the graphs can be quite large and the addition
|
||||
# of features from the crate(s) to all of the graph roots can be far too verbose.
|
||||
# This option can be overridden via `--feature-depth` on the cmd line
|
||||
feature-depth = 1
|
||||
|
||||
# This section is considered when running `cargo deny check advisories`
|
||||
# More documentation for the advisories section can be found here:
|
||||
# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html
|
||||
[advisories]
|
||||
# The path where the advisory databases are cloned/fetched into
|
||||
#db-path = "$CARGO_HOME/advisory-dbs"
|
||||
# The url(s) of the advisory databases to use
|
||||
#db-urls = ["https://github.com/rustsec/advisory-db"]
|
||||
# A list of advisory IDs to ignore. Note that ignored advisories will still
|
||||
# output a note when they are encountered.
|
||||
ignore = [
|
||||
#"RUSTSEC-0000-0000",
|
||||
#{ id = "RUSTSEC-0000-0000", reason = "you can specify a reason the advisory is ignored" },
|
||||
#"a-crate-that-is-yanked@0.1.1", # you can also ignore yanked crate versions if you wish
|
||||
#{ crate = "a-crate-that-is-yanked@0.1.1", reason = "you can specify why you are ignoring the yanked crate" },
|
||||
]
|
||||
# If this is true, then cargo deny will use the git executable to fetch advisory database.
|
||||
# If this is false, then it uses a built-in git library.
|
||||
# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support.
|
||||
# See Git Authentication for more information about setting up git authentication.
|
||||
#git-fetch-with-cli = true
|
||||
|
||||
# This section is considered when running `cargo deny check licenses`
|
||||
# More documentation for the licenses section can be found here:
|
||||
# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html
|
||||
[licenses]
|
||||
# List of explicitly allowed licenses
|
||||
# See https://spdx.org/licenses/ for list of possible licenses
|
||||
# [possible values: any SPDX 3.11 short identifier (+ optional exception)].
|
||||
allow = [
|
||||
"MIT",
|
||||
"Apache-2.0",
|
||||
"Apache-2.0 WITH LLVM-exception",
|
||||
"Unicode-3.0",
|
||||
"Unicode-DFS-2016",
|
||||
"MIT-0",
|
||||
"ISC",
|
||||
"BSD-3-Clause",
|
||||
"Zlib",
|
||||
"MPL-2.0",
|
||||
]
|
||||
# The confidence threshold for detecting a license from license text.
|
||||
# The higher the value, the more closely the license text must be to the
|
||||
# canonical license text of a valid SPDX license file.
|
||||
# [possible values: any between 0.0 and 1.0].
|
||||
confidence-threshold = 0.8
|
||||
# Allow 1 or more licenses on a per-crate basis, so that particular licenses
|
||||
# aren't accepted for every possible crate as with the normal allow list
|
||||
exceptions = [
|
||||
# Each entry is the crate and version constraint, and its specific allow
|
||||
# list
|
||||
#{ allow = ["Zlib"], crate = "adler32" },
|
||||
]
|
||||
|
||||
# Some crates don't have (easily) machine readable licensing information,
|
||||
# adding a clarification entry for it allows you to manually specify the
|
||||
# licensing information
|
||||
#[[licenses.clarify]]
|
||||
# The package spec the clarification applies to
|
||||
#crate = "ring"
|
||||
# The SPDX expression for the license requirements of the crate
|
||||
#expression = "MIT AND ISC AND OpenSSL"
|
||||
# One or more files in the crate's source used as the "source of truth" for
|
||||
# the license expression. If the contents match, the clarification will be used
|
||||
# when running the license check, otherwise the clarification will be ignored
|
||||
# and the crate will be checked normally, which may produce warnings or errors
|
||||
# depending on the rest of your configuration
|
||||
#license-files = [
|
||||
# Each entry is a crate relative path, and the (opaque) hash of its contents
|
||||
#{ path = "LICENSE", hash = 0xbd0eed23 }
|
||||
#]
|
||||
|
||||
[licenses.private]
|
||||
# If true, ignores workspace crates that aren't published, or are only
|
||||
# published to private registries.
|
||||
# To see how to mark a crate as unpublished (to the official registry),
|
||||
# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field.
|
||||
ignore = false
|
||||
# One or more private registries that you might publish crates to, if a crate
|
||||
# is only published to private registries, and ignore is true, the crate will
|
||||
# not have its license(s) checked
|
||||
registries = [
|
||||
#"https://sekretz.com/registry
|
||||
]
|
||||
|
||||
# This section is considered when running `cargo deny check bans`.
|
||||
# More documentation about the 'bans' section can be found here:
|
||||
# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html
|
||||
[bans]
|
||||
# Lint level for when multiple versions of the same crate are detected
|
||||
multiple-versions = "warn"
|
||||
# Lint level for when a crate version requirement is `*`
|
||||
wildcards = "allow"
|
||||
# The graph highlighting used when creating dotgraphs for crates
|
||||
# with multiple versions
|
||||
# * lowest-version - The path to the lowest versioned duplicate is highlighted
|
||||
# * simplest-path - The path to the version with the fewest edges is highlighted
|
||||
# * all - Both lowest-version and simplest-path are used
|
||||
highlight = "all"
|
||||
# The default lint level for `default` features for crates that are members of
|
||||
# the workspace that is being checked. This can be overridden by allowing/denying
|
||||
# `default` on a crate-by-crate basis if desired.
|
||||
workspace-default-features = "allow"
|
||||
# The default lint level for `default` features for external crates that are not
|
||||
# members of the workspace. This can be overridden by allowing/denying `default`
|
||||
# on a crate-by-crate basis if desired.
|
||||
external-default-features = "allow"
|
||||
# List of crates that are allowed. Use with care!
|
||||
allow = [
|
||||
#"ansi_term@0.11.0",
|
||||
#{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is allowed" },
|
||||
]
|
||||
# List of crates to deny
|
||||
deny = [
|
||||
#"ansi_term@0.11.0",
|
||||
#{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is banned" },
|
||||
# Wrapper crates can optionally be specified to allow the crate when it
|
||||
# is a direct dependency of the otherwise banned crate
|
||||
#{ crate = "ansi_term@0.11.0", wrappers = ["this-crate-directly-depends-on-ansi_term"] },
|
||||
]
|
||||
|
||||
# List of features to allow/deny
|
||||
# Each entry the name of a crate and a version range. If version is
|
||||
# not specified, all versions will be matched.
|
||||
#[[bans.features]]
|
||||
#crate = "reqwest"
|
||||
# Features to not allow
|
||||
#deny = ["json"]
|
||||
# Features to allow
|
||||
#allow = [
|
||||
# "rustls",
|
||||
# "__rustls",
|
||||
# "__tls",
|
||||
# "hyper-rustls",
|
||||
# "rustls",
|
||||
# "rustls-pemfile",
|
||||
# "rustls-tls-webpki-roots",
|
||||
# "tokio-rustls",
|
||||
# "webpki-roots",
|
||||
#]
|
||||
# If true, the allowed features must exactly match the enabled feature set. If
|
||||
# this is set there is no point setting `deny`
|
||||
#exact = true
|
||||
|
||||
# Certain crates/versions that will be skipped when doing duplicate detection.
|
||||
skip = [
|
||||
#"ansi_term@0.11.0",
|
||||
#{ crate = "ansi_term@0.11.0", reason = "you can specify a reason why it can't be updated/removed" },
|
||||
]
|
||||
# Similarly to `skip` allows you to skip certain crates during duplicate
|
||||
# detection. Unlike skip, it also includes the entire tree of transitive
|
||||
# dependencies starting at the specified crate, up to a certain depth, which is
|
||||
# by default infinite.
|
||||
skip-tree = [
|
||||
#"ansi_term@0.11.0", # will be skipped along with _all_ of its direct and transitive dependencies
|
||||
#{ crate = "ansi_term@0.11.0", depth = 20 },
|
||||
]
|
||||
|
||||
# This section is considered when running `cargo deny check sources`.
|
||||
# More documentation about the 'sources' section can be found here:
|
||||
# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html
|
||||
[sources]
|
||||
# Lint level for what to happen when a crate from a crate registry that is not
|
||||
# in the allow list is encountered
|
||||
unknown-registry = "warn"
|
||||
# Lint level for what to happen when a crate from a git repository that is not
|
||||
# in the allow list is encountered
|
||||
unknown-git = "warn"
|
||||
# List of URLs for allowed crate registries. Defaults to the crates.io index
|
||||
# if not specified. If it is specified but empty, no registries are allowed.
|
||||
allow-registry = ["https://github.com/rust-lang/crates.io-index"]
|
||||
# List of URLs for allowed Git repositories
|
||||
allow-git = []
|
||||
|
||||
[sources.allow-org]
|
||||
# 1 or more github.com organizations to allow git sources for
|
||||
github = [""]
|
||||
# 1 or more gitlab.com organizations to allow git sources for
|
||||
gitlab = [""]
|
||||
# 1 or more bitbucket.org organizations to allow git sources for
|
||||
bitbucket = [""]
|
||||
39
flake.lock
generated
@@ -1,26 +1,5 @@
|
||||
{
|
||||
"nodes": {
|
||||
"fenix": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"rust-analyzer-src": "rust-analyzer-src"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1756795219,
|
||||
"narHash": "sha256-tKBQtz1JLKWrCJUxVkHKR+YKmVpm0KZdJdPWmR2slQ8=",
|
||||
"owner": "nix-community",
|
||||
"repo": "fenix",
|
||||
"rev": "80dbdab137f2809e3c823ed027e1665ce2502d74",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "fenix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
@@ -72,27 +51,9 @@
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"fenix": "fenix",
|
||||
"flake-parts": "flake-parts",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
},
|
||||
"rust-analyzer-src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1756597274,
|
||||
"narHash": "sha256-wfaKRKsEVQDB7pQtAt04vRgFphkVscGRpSx3wG1l50E=",
|
||||
"owner": "rust-lang",
|
||||
"repo": "rust-analyzer",
|
||||
"rev": "21614ed2d3279a9aa1f15c88d293e65a98991b30",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "rust-lang",
|
||||
"ref": "nightly",
|
||||
"repo": "rust-analyzer",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
|
||||
86
flake.nix
@@ -1,74 +1,50 @@
|
||||
{
|
||||
description = "Affordable full-body tracking for VR!";
|
||||
description = "SlimeVR Server & GUI";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||
fenix = {
|
||||
url = "github:nix-community/fenix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
|
||||
outputs = inputs@{ self, nixpkgs, flake-parts, fenix, ... }:
|
||||
outputs = inputs@{ self, nixpkgs, flake-parts, ... }:
|
||||
flake-parts.lib.mkFlake { inherit inputs; } {
|
||||
systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
|
||||
systems = [ "x86_64-linux" ];
|
||||
|
||||
perSystem = { system, lib, ... }:
|
||||
perSystem = { pkgs, ... }:
|
||||
let
|
||||
pkgs = import nixpkgs { inherit system; };
|
||||
runtimeLibs = pkgs: (with pkgs; [
|
||||
jdk17
|
||||
|
||||
rust_toolchain = lib.importTOML ./rust-toolchain.toml;
|
||||
fenixPkgs = fenix.packages.${system};
|
||||
alsa-lib at-spi2-atk at-spi2-core cairo cups dbus expat
|
||||
gdk-pixbuf glib gtk3 libdrm libgbm libglvnd libnotify
|
||||
libxkbcommon mesa nspr nss pango systemd vulkan-loader
|
||||
wayland xorg.libX11 xorg.libXcomposite xorg.libXdamage
|
||||
xorg.libXext xorg.libXfixes xorg.libXrandr xorg.libxcb
|
||||
xorg.libxshmfence libusb1 udev libxcrypt-legacy
|
||||
rpm fpm
|
||||
|
||||
rustToolchainSet = fenixPkgs.fromToolchainName {
|
||||
name = rust_toolchain.toolchain.channel;
|
||||
sha256 = "sha256-+9FmLhAOezBZCOziO0Qct1NOrfpjNsXxc/8I0c7BdKE=";
|
||||
};
|
||||
in {
|
||||
wineWow64Packages.stable
|
||||
zlib squashfsTools fakeroot libarchive icu
|
||||
nodejs_22 pnpm pkg-config python3 gcc gnumake binutils git
|
||||
pkgs.nodePackages.node-gyp-build
|
||||
]);
|
||||
|
||||
devShells.default = pkgs.mkShell {
|
||||
name = "slimevr";
|
||||
slimeShell = pkgs.buildFHSEnv {
|
||||
name = "slimevr-env";
|
||||
targetPkgs = runtimeLibs;
|
||||
profile = ''
|
||||
export JAVA_HOME=${pkgs.jdk17}
|
||||
export PATH="${pkgs.jdk17}/bin:$PATH"
|
||||
|
||||
buildInputs =
|
||||
(with pkgs; [
|
||||
cacert
|
||||
]) ++ lib.optionals pkgs.stdenv.isLinux (with pkgs; [
|
||||
atk cairo dbus dbus.lib dprint gdk-pixbuf glib.out glib-networking
|
||||
gobject-introspection gtk3 harfbuzz libffi libsoup_3 openssl.dev pango
|
||||
pkg-config treefmt webkitgtk_4_1 zlib
|
||||
gst_all_1.gstreamer gst_all_1.gst-plugins-base
|
||||
gst_all_1.gst-plugins-good gst_all_1.gst-plugins-bad
|
||||
librsvg freetype expat libayatana-appindicator udev libusb1
|
||||
]) ++ lib.optionals pkgs.stdenv.isDarwin [
|
||||
pkgs.darwin.apple_sdk.frameworks.Security
|
||||
] ++ [
|
||||
pkgs.jdk17
|
||||
pkgs.kotlin
|
||||
rustToolchainSet.rustc
|
||||
rustToolchainSet.cargo
|
||||
rustToolchainSet.rustfmt
|
||||
];
|
||||
|
||||
nativeBuildInputs = with pkgs; [ pnpm nodejs_22 gradle ];
|
||||
|
||||
RUST_BACKTRACE = 1;
|
||||
GIO_EXTRA_MODULES = "${pkgs.glib-networking}/lib/gio/modules:${pkgs.dconf.lib}/lib/gio/modules";
|
||||
|
||||
shellHook = ''
|
||||
export SLIMEVR_RUST_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
|
||||
export LD_LIBRARY_PATH="${pkgs.udev}/lib:${pkgs.libayatana-appindicator}/lib:$LD_LIBRARY_PATH"
|
||||
export GST_PLUGIN_SYSTEM_PATH_1_0="${pkgs.gst_all_1.gstreamer.out}/lib/gstreamer-1.0:${pkgs.gst_all_1.gst-plugins-base}/lib/gstreamer-1.0:${pkgs.gst_all_1.gst-plugins-good}/lib/gstreamer-1.0:${pkgs.gst_all_1.gst-plugins-bad}/lib/gstreamer-1.0"
|
||||
|
||||
# Force linker and pkg-config to use udev from nixpkgs so libgudev/hidapi
|
||||
# resolve against the correct libudev implementation at link time.
|
||||
export PKG_CONFIG_PATH="${pkgs.udev}/lib/pkgconfig:${pkgs.glib}/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
export LIBRARY_PATH="${pkgs.udev}/lib:$LIBRARY_PATH"
|
||||
export LD_RUN_PATH="${pkgs.udev}/lib:$LD_RUN_PATH"
|
||||
export NIX_LDFLAGS="-L${pkgs.udev}/lib -ludev $NIX_LDFLAGS"
|
||||
export LDFLAGS="-L${pkgs.udev}/lib -Wl,-rpath,${pkgs.udev}/lib -ludev $LDFLAGS"
|
||||
# Tell electron-builder to use system tools instead of downloading them
|
||||
export USE_SYSTEM_FPM=true
|
||||
export USE_SYSTEM_MKSQUASHFS=true
|
||||
'';
|
||||
runScript = "bash";
|
||||
};
|
||||
in
|
||||
{
|
||||
devShells.default = slimeShell.env;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -13,8 +13,10 @@ android.useAndroidX=true
|
||||
android.nonTransitiveRClass=true
|
||||
org.gradle.unsafe.configuration-cache=false
|
||||
|
||||
kotlinVersion=2.0.20
|
||||
spotlessVersion=8.0.0
|
||||
shadowJarVersion=8.3.2
|
||||
buildconfigVersion=5.5.0
|
||||
grgitVersion=5.2.2
|
||||
kotlinVersion=2.3.10
|
||||
spotlessVersion=8.2.1
|
||||
shadowJarVersion=9.3.1
|
||||
buildconfigVersion=6.0.7
|
||||
# We should probably stop using grgit, see:
|
||||
# https://andrewoberstar.com/posts/2024-04-02-dont-commit-to-grgit/
|
||||
grgitVersion=5.3.3
|
||||
|
||||
4
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,7 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
|
||||
distributionSha256Sum=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip
|
||||
distributionSha256Sum=f1771298a70f6db5a29daf62378c4e18a17fc33c9ba6b14362e0cdf40610380d
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
4
gui/.gitignore
vendored
@@ -29,9 +29,13 @@ yarn-error.log*
|
||||
/dist
|
||||
/stats.html
|
||||
vite.config.ts.timestamp*
|
||||
electron.vite.config.*.mjs
|
||||
|
||||
# eslint
|
||||
.eslintcache
|
||||
|
||||
# Sentry Config File
|
||||
.env.sentry-build-plugin
|
||||
|
||||
# electron
|
||||
out/
|
||||
|
||||
70
gui/electron-builder.yml
Normal file
@@ -0,0 +1,70 @@
|
||||
appId: dev.slimevr.SlimeVR
|
||||
productName: SlimeVR
|
||||
# Global naming pattern
|
||||
artifactName: "${productName}-${version}-${os}-${arch}.${ext}"
|
||||
|
||||
directories:
|
||||
output: dist/artifacts/${os}
|
||||
|
||||
asar: true
|
||||
asarUnpack:
|
||||
- out/main/chunks/*.jar
|
||||
|
||||
electronLanguages:
|
||||
- en-US
|
||||
|
||||
files:
|
||||
- out/**/*
|
||||
- index.html
|
||||
- package.json
|
||||
- node_modules/**
|
||||
- "!node_modules/*/{README,readme,README.md,readme.md,CHANGELOG,CHANGELOG.md,changelog.md}"
|
||||
- "!node_modules/*/{test,tests,__tests__,docs,doc,example,examples}"
|
||||
- "!node_modules/*/.{git,github,vscode,editorconfig,eslintrc,prettierrc}"
|
||||
- "!node_modules/**/*.{map,ts,tsx,d.ts}"
|
||||
- "!**/.DS_Store"
|
||||
|
||||
|
||||
linux:
|
||||
category: Game
|
||||
artifactName: "${productName}-${arch}.${ext}"
|
||||
target:
|
||||
- target: AppImage
|
||||
- target: deb
|
||||
- target: rpm
|
||||
extraFiles:
|
||||
- from: "../server/desktop/build/libs/slimevr.jar"
|
||||
to: "."
|
||||
- from: "./electron/resources/69-slimevr-devices.rules"
|
||||
to: "."
|
||||
icon: "./electron/resources/icons"
|
||||
|
||||
deb:
|
||||
depends: [openjdk-17-jre-headless, udev]
|
||||
afterInstall: "./electron/resources/scripts/postinstall.sh"
|
||||
afterRemove: "./electron/resources/scripts/postremove.sh"
|
||||
|
||||
rpm:
|
||||
depends: [java-latest-openjdk, udev]
|
||||
afterInstall: "./electron/resources/scripts/postinstall.sh"
|
||||
afterRemove: "./electron/resources/scripts/postremove.sh"
|
||||
|
||||
win:
|
||||
artifactName: "${productName}-${os}-${arch}.${ext}"
|
||||
target: zip
|
||||
icon: "./electron/resources/icons/icon.ico"
|
||||
extraFiles:
|
||||
- from: "../server/desktop/build/libs/slimevr.jar"
|
||||
to: "."
|
||||
- from: "../server/core/resources"
|
||||
to: "."
|
||||
filter: ["**/*"]
|
||||
|
||||
mac:
|
||||
target: dmg
|
||||
artifactName: "SlimeVR-mac.${ext}"
|
||||
x64ArchFiles: "**/register-protocol-handler.node"
|
||||
icon: "./electron/resources/icons/icon.icns"
|
||||
extraFiles:
|
||||
- from: "../server/desktop/build/libs/slimevr.jar"
|
||||
to: "Resources/slimevr.jar"
|
||||
47
gui/electron.vite.config.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
import { defineConfig } from 'electron-vite'
|
||||
import { resolve } from 'path'
|
||||
import rendererConfig from './vite.config' // Import your existing React config
|
||||
|
||||
export default defineConfig({
|
||||
main: {
|
||||
build: {
|
||||
rollupOptions: {
|
||||
input: resolve(__dirname, 'electron/main/index.ts'),
|
||||
external: [
|
||||
'pino',
|
||||
'pino-pretty',
|
||||
'pino-roll',
|
||||
'commander',
|
||||
'open'
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
preload: {
|
||||
build: {
|
||||
rollupOptions: {
|
||||
input: resolve(__dirname, 'electron/preload/index.ts'),
|
||||
output: {
|
||||
format: 'cjs', // Force CJS for the preload
|
||||
entryFileNames: 'index.js' // Change back to .js
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
renderer: {
|
||||
...rendererConfig,
|
||||
root: '.',
|
||||
build: {
|
||||
commonjsOptions: {
|
||||
// Force Rollup to treat the protocol directory as CommonJS
|
||||
// even though it's not in node_modules
|
||||
include: [/solarxr-protocol/, /node_modules/],
|
||||
// Required for Flatbuffers/Generated code interop
|
||||
transformMixedEsModules: true,
|
||||
},
|
||||
rollupOptions: {
|
||||
input: resolve(__dirname, 'index.html')
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
1
gui/electron/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
resources/java-version/JavaVersion.class
|
||||
12
gui/electron/main/cli.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { program } from "commander";
|
||||
|
||||
program
|
||||
.option('-p --path <path>', 'set launch path')
|
||||
.option(
|
||||
'--skip-server-if-running',
|
||||
'gui will not launch the server if it is already running'
|
||||
)
|
||||
.allowUnknownOption();
|
||||
|
||||
program.parse(process.argv);
|
||||
export const options = program.opts();
|
||||
477
gui/electron/main/index.ts
Normal file
@@ -0,0 +1,477 @@
|
||||
import {
|
||||
app,
|
||||
BrowserWindow,
|
||||
dialog,
|
||||
Menu,
|
||||
nativeImage,
|
||||
net,
|
||||
protocol,
|
||||
screen,
|
||||
shell,
|
||||
Tray,
|
||||
} from 'electron';
|
||||
import { IPC_CHANNELS } from '../shared';
|
||||
import path, { dirname, join } from 'path';
|
||||
import open from 'open';
|
||||
import trayIcon from '../resources/icons/icon.png?asset';
|
||||
import appleTrayIcon from '../resources/icons/Square30x30Logo.png?asset';
|
||||
import { readFile, stat } from 'fs/promises';
|
||||
import { getPlatform, handleIpc, isPortAvailable } from './utils';
|
||||
import {
|
||||
findServerJar,
|
||||
findSystemJRE,
|
||||
getGuiDataFolder,
|
||||
getLogsFolder,
|
||||
getServerDataFolder,
|
||||
getWindowStateFile,
|
||||
} from './paths';
|
||||
import { stores } from './store';
|
||||
import { closeLogger, logger } from './logger';
|
||||
import { writeFileSync } from 'node:fs';
|
||||
|
||||
import { spawn } from 'node:child_process';
|
||||
import { discordPresence } from './presence';
|
||||
import { options } from './cli';
|
||||
import { ServerStatusEvent } from 'electron/preload/interface';
|
||||
import { mkdir } from 'node:fs/promises';
|
||||
import { MenuItem } from 'electron/main';
|
||||
|
||||
// Fixes colors looking washed on linux
|
||||
// Might affect hdr
|
||||
if (process.platform === 'linux') {
|
||||
app.commandLine.appendSwitch('disable-features', 'WaylandWpColorManagerV1');
|
||||
app.commandLine.appendSwitch('force-color-profile', 'srgb');
|
||||
}
|
||||
|
||||
app.setPath('userData', getGuiDataFolder());
|
||||
app.setPath('sessionData', join(getGuiDataFolder(), 'electron'));
|
||||
|
||||
protocol.registerSchemesAsPrivileged([
|
||||
{
|
||||
scheme: 'app',
|
||||
privileges: {
|
||||
standard: true,
|
||||
secure: true,
|
||||
supportFetchAPI: true,
|
||||
corsEnabled: true,
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
let mainWindow: BrowserWindow | null = null;
|
||||
|
||||
handleIpc(IPC_CHANNELS.GH_FETCH, async (e, options) => {
|
||||
if (options.type === 'fw-releases') {
|
||||
return fetch(
|
||||
'https://api.github.com/repos/SlimeVR/SlimeVR-Tracker-ESP/releases'
|
||||
).then((res) => res.json());
|
||||
}
|
||||
if (options.type === 'asset') {
|
||||
if (
|
||||
!options.url.startsWith(
|
||||
'https://github.com/SlimeVR/SlimeVR-Tracker-ESP/releases/download'
|
||||
)
|
||||
)
|
||||
return null;
|
||||
return fetch(options.url).then((res) => res.json());
|
||||
}
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.OS_STATS, async () => {
|
||||
return {
|
||||
type: getPlatform(),
|
||||
};
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.I18N_OVERRIDE, async () => {
|
||||
const overridefile = join(getServerDataFolder(), 'override.ftl');
|
||||
const exists = await stat(overridefile)
|
||||
.then(() => true)
|
||||
.catch(() => false);
|
||||
|
||||
if (!exists) return false;
|
||||
return readFile(overridefile, { encoding: 'utf-8' });
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.LOG, (e, type, ...args) => {
|
||||
let payload: Record<string, unknown> = {};
|
||||
const messageParts: unknown[] = [];
|
||||
|
||||
args.forEach((arg) => {
|
||||
if (arg instanceof Error) {
|
||||
payload.err = arg;
|
||||
} else if (typeof arg === 'object' && arg !== null) {
|
||||
payload = { ...payload, ...arg };
|
||||
} else {
|
||||
messageParts.push(arg);
|
||||
}
|
||||
});
|
||||
|
||||
const msg = messageParts.join(' ');
|
||||
|
||||
switch (type) {
|
||||
case 'error':
|
||||
logger.error(payload, msg);
|
||||
break;
|
||||
case 'warn':
|
||||
logger.warn(payload, msg);
|
||||
break;
|
||||
default:
|
||||
logger.info(payload, msg);
|
||||
}
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.OPEN_URL, (e, url) => {
|
||||
const allowed_urls = [
|
||||
/steam:\/\/.*/,
|
||||
/ms-settings:network$/,
|
||||
/https:\/\/.*\.slimevr\.dev.*/,
|
||||
/https:\/\/github\.com\/.*/,
|
||||
/https:\/\/discord\.gg\/slimevr$/,
|
||||
];
|
||||
if (allowed_urls.find((a) => url.match(a))) open(url);
|
||||
else logger.error({ url }, 'attempted to open non-whitelisted URL');
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.STORAGE, async (e, { type, method, key, value }) => {
|
||||
const store = stores[type];
|
||||
if (!store) throw new Error(`Storage type ${type} not found`);
|
||||
|
||||
switch (method) {
|
||||
case 'get':
|
||||
return store.get(key!);
|
||||
case 'set':
|
||||
return store.set(key!, value);
|
||||
case 'delete':
|
||||
return store.delete(key!);
|
||||
case 'save':
|
||||
return store.save();
|
||||
}
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.DISCORD_PRESENCE, async (e, options) => {
|
||||
if (options.enable && !discordPresence.state.ready) {
|
||||
await discordPresence.connect();
|
||||
discordPresence.updateActivity(options.activity);
|
||||
} else if (!options.enable && discordPresence.state.ready) {
|
||||
discordPresence.destroy();
|
||||
}
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.OPEN_FILE, (e, folder) => {
|
||||
const requestedPath = path.resolve(folder);
|
||||
|
||||
const isAllowed = [getServerDataFolder(), getGuiDataFolder(), getLogsFolder()].some(
|
||||
(parent) => {
|
||||
const absoluteParent = path.resolve(parent);
|
||||
const relative = path.relative(absoluteParent, requestedPath);
|
||||
return !relative.includes('..') && !path.isAbsolute(relative);
|
||||
}
|
||||
);
|
||||
|
||||
if (isAllowed) {
|
||||
shell.openPath(requestedPath);
|
||||
} else {
|
||||
logger.error({ path: requestedPath }, 'Blocked unauthorized path');
|
||||
}
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.GET_FOLDER, (e, folder) => {
|
||||
switch (folder) {
|
||||
case 'config':
|
||||
return getGuiDataFolder();
|
||||
case 'logs':
|
||||
return getLogsFolder();
|
||||
}
|
||||
});
|
||||
|
||||
const windowStateFile = await readFile(getWindowStateFile(), {
|
||||
encoding: 'utf-8',
|
||||
}).catch(() => null);
|
||||
|
||||
const defaultWindowState: {
|
||||
width: number;
|
||||
height: number;
|
||||
x?: number;
|
||||
y?: number;
|
||||
} = {
|
||||
width: 1289.0,
|
||||
height: 709.0,
|
||||
x: undefined,
|
||||
y: undefined,
|
||||
};
|
||||
const windowState = windowStateFile ? JSON.parse(windowStateFile) : defaultWindowState;
|
||||
|
||||
const MIN_WIDTH = 393;
|
||||
const MIN_HEIGHT = 667;
|
||||
|
||||
function validateWindowState(state: typeof defaultWindowState) {
|
||||
if (state.x === undefined || state.y === undefined) {
|
||||
return state;
|
||||
}
|
||||
|
||||
const displays = screen.getAllDisplays();
|
||||
|
||||
const isVisible = displays.some((display) => {
|
||||
return (
|
||||
state.x! >= display.bounds.x &&
|
||||
state.y! >= display.bounds.y &&
|
||||
state.x! + state.width <= display.bounds.x + display.bounds.width &&
|
||||
state.y! + state.height <= display.bounds.y + display.bounds.height
|
||||
);
|
||||
});
|
||||
|
||||
const minWidth = MIN_WIDTH;
|
||||
const minHeight = MIN_HEIGHT;
|
||||
|
||||
if (!isVisible || state.width < minWidth || state.height < minHeight) {
|
||||
return defaultWindowState;
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
const saveWindowState = async () => {
|
||||
await mkdir(dirname(getWindowStateFile()), { recursive: true });
|
||||
writeFileSync(getWindowStateFile(), JSON.stringify(windowState));
|
||||
};
|
||||
|
||||
function createWindow() {
|
||||
const validatedState = validateWindowState(windowState);
|
||||
|
||||
mainWindow = new BrowserWindow({
|
||||
width: validatedState.width,
|
||||
height: validatedState.height,
|
||||
x: validatedState.x,
|
||||
y: validatedState.y,
|
||||
minHeight: MIN_HEIGHT,
|
||||
minWidth: MIN_WIDTH,
|
||||
movable: true,
|
||||
frame: false,
|
||||
roundedCorners: true,
|
||||
webPreferences: {
|
||||
preload: join(__dirname, '../preload/index.js'),
|
||||
nodeIntegration: false,
|
||||
contextIsolation: true,
|
||||
devTools: true,
|
||||
},
|
||||
});
|
||||
|
||||
if (process.env.ELECTRON_RENDERER_URL) {
|
||||
mainWindow.loadURL(process.env.ELECTRON_RENDERER_URL);
|
||||
mainWindow.webContents.openDevTools();
|
||||
} else {
|
||||
mainWindow.loadURL('app://./index.html');
|
||||
}
|
||||
|
||||
mainWindow.on('closed', () => {
|
||||
mainWindow = null;
|
||||
});
|
||||
|
||||
handleIpc('window-actions', (e, action) => {
|
||||
switch (action) {
|
||||
case 'close':
|
||||
mainWindow?.close();
|
||||
break;
|
||||
case 'hide':
|
||||
mainWindow?.hide();
|
||||
break;
|
||||
case 'minimize':
|
||||
mainWindow?.minimize();
|
||||
break;
|
||||
case 'maximize':
|
||||
mainWindow?.maximize();
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
handleIpc('open-dialog', (e, options) => dialog.showOpenDialog(options));
|
||||
handleIpc('save-dialog', (e, options) => dialog.showSaveDialog(options));
|
||||
|
||||
const icon = nativeImage.createFromPath(
|
||||
getPlatform() === 'macos' ? appleTrayIcon : trayIcon
|
||||
);
|
||||
const tray = new Tray(icon);
|
||||
tray.setToolTip('SlimeVR');
|
||||
tray.on('click', () => {
|
||||
mainWindow?.show();
|
||||
});
|
||||
const contextMenu = Menu.buildFromTemplate([
|
||||
{
|
||||
label: 'Show',
|
||||
click: () => {
|
||||
mainWindow?.show();
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Hide',
|
||||
click: () => {
|
||||
mainWindow?.hide();
|
||||
},
|
||||
},
|
||||
{ role: 'quit' },
|
||||
]);
|
||||
tray.setContextMenu(contextMenu);
|
||||
|
||||
const updateWindowState = () => {
|
||||
if (!mainWindow) return;
|
||||
|
||||
windowState.minimized = mainWindow.isMinimized();
|
||||
if (!mainWindow.isMinimized() && !mainWindow.isMaximized()) {
|
||||
const bounds = mainWindow.getBounds();
|
||||
windowState.width = bounds.width;
|
||||
windowState.height = bounds.height;
|
||||
windowState.x = bounds.x;
|
||||
windowState.y = bounds.y;
|
||||
}
|
||||
};
|
||||
|
||||
mainWindow.on('move', updateWindowState);
|
||||
mainWindow.on('resize', updateWindowState);
|
||||
mainWindow.on('minimize', updateWindowState);
|
||||
mainWindow.on('maximize', updateWindowState);
|
||||
|
||||
mainWindow.webContents.on('context-menu', (event, params) => {
|
||||
const menu = new Menu();
|
||||
|
||||
menu.append(
|
||||
new MenuItem({
|
||||
label: 'Inspect Element',
|
||||
click: () => {
|
||||
mainWindow?.webContents.inspectElement(params.x, params.y);
|
||||
},
|
||||
})
|
||||
);
|
||||
|
||||
menu.append(new MenuItem({ type: 'separator' }));
|
||||
menu.append(new MenuItem({ label: 'Copy', role: 'copy' }));
|
||||
menu.append(new MenuItem({ label: 'Paste', role: 'paste' }));
|
||||
|
||||
if (mainWindow) menu.popup({ window: mainWindow });
|
||||
});
|
||||
}
|
||||
|
||||
const checkEnvironmentVariables = () => {
|
||||
const to_check = ['_JAVA_OPTIONS', 'JAVA_TOOL_OPTIONS'];
|
||||
|
||||
const set = to_check.filter((env) => !!process.env[env]);
|
||||
if (set.length > 0) {
|
||||
dialog.showErrorBox(
|
||||
'SlimeVR',
|
||||
`You have environment variables ${set.join(', ')} set, which may cause the SlimeVR Server to fail to launch properly.`
|
||||
);
|
||||
app.quit();
|
||||
}
|
||||
};
|
||||
|
||||
const isServerRunning = async () => !(await isPortAvailable(21110));
|
||||
|
||||
const spawnServer = async () => {
|
||||
if (options.skipServerIfRunning && (await isServerRunning())) {
|
||||
logger.info(
|
||||
{ skipServerIfRunning: options.skipServerIfRunning },
|
||||
'Server is already running, skipping server start'
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const serverJar = findServerJar();
|
||||
if (!serverJar) {
|
||||
logger.info('server jar not found, skipping');
|
||||
return;
|
||||
}
|
||||
const sharedDir = dirname(serverJar);
|
||||
const javaBin = await findSystemJRE(sharedDir);
|
||||
if (!javaBin) {
|
||||
dialog.showErrorBox(
|
||||
'SlimeVR',
|
||||
`Couldn't find a compatible Java version, please download Java 17 or higher`
|
||||
);
|
||||
app.quit()
|
||||
return;
|
||||
}
|
||||
|
||||
logger.info({ javaBin, serverJar }, 'Found Java and server jar');
|
||||
const platform = getPlatform();
|
||||
const serverWorkdir = getServerDataFolder()
|
||||
const serverProcess = spawn(javaBin, ['-Xmx128M', '-jar', serverJar, 'run'], {
|
||||
cwd: serverWorkdir,
|
||||
shell: false,
|
||||
env:
|
||||
platform === 'windows'
|
||||
? {
|
||||
...process.env,
|
||||
APPDATA: app.getPath('appData'),
|
||||
LOCALAPPDATA: process.env['USERPROFILE'] ? path.join(process.env['USERPROFILE'], 'AppData', 'Local') : undefined,
|
||||
}
|
||||
: undefined,
|
||||
});
|
||||
|
||||
const sendToWindow = (event: ServerStatusEvent) => {
|
||||
if (mainWindow && !mainWindow.webContents.isDestroyed()) {
|
||||
mainWindow.webContents.send(IPC_CHANNELS.SERVER_STATUS, event);
|
||||
}
|
||||
};
|
||||
|
||||
serverProcess.stdout?.on('data', (message) => {
|
||||
sendToWindow({ message: message.toString(), type: 'stdout' });
|
||||
});
|
||||
|
||||
serverProcess.stderr?.on('data', (message) => {
|
||||
sendToWindow({ message: message.toString(), type: 'stderr' });
|
||||
});
|
||||
|
||||
serverProcess.on('error', (err) => {
|
||||
logger.info({ err }, 'Error launching the java server');
|
||||
if (!isQuitting) app.quit();
|
||||
})
|
||||
|
||||
serverProcess.on('exit', () => {
|
||||
logger.info('Server process exiting');
|
||||
})
|
||||
|
||||
const exited = new Promise<void>((resolve) => serverProcess.once('exit', resolve));
|
||||
|
||||
return {
|
||||
process: serverProcess,
|
||||
close: () => serverProcess.kill(),
|
||||
waitForExit: () => exited,
|
||||
};
|
||||
};
|
||||
|
||||
let isQuitting = false;
|
||||
|
||||
app.whenReady().then(async () => {
|
||||
// Register protocol handler for app:// scheme to handle assets with leading slashes
|
||||
protocol.handle('app', (request) => {
|
||||
const url = request.url.slice('app://'.length);
|
||||
const filePath = path.normalize(join(__dirname, '../renderer', url));
|
||||
return net.fetch('file://' + filePath);
|
||||
});
|
||||
|
||||
checkEnvironmentVariables();
|
||||
const server = await spawnServer();
|
||||
|
||||
createWindow();
|
||||
|
||||
logger.info('SlimeVR started!');
|
||||
|
||||
app.on('window-all-closed', () => {
|
||||
app.quit();
|
||||
});
|
||||
|
||||
app.on('before-quit', async (event) => {
|
||||
if (isQuitting) return;
|
||||
isQuitting = true;
|
||||
event.preventDefault();
|
||||
logger.info('App quitting, saving...');
|
||||
server?.close();
|
||||
await server?.waitForExit();
|
||||
stores.settings.save();
|
||||
stores.cache.save();
|
||||
discordPresence.destroy();
|
||||
await saveWindowState();
|
||||
await closeLogger();
|
||||
app.exit(0);
|
||||
});
|
||||
});
|
||||
34
gui/electron/main/logger.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import pino from 'pino';
|
||||
import { getLogsFolder } from './paths';
|
||||
import { join } from 'node:path';
|
||||
|
||||
const transport = pino.transport({
|
||||
targets: [
|
||||
{
|
||||
target: 'pino-roll',
|
||||
options: {
|
||||
file: join(getLogsFolder(), 'slimevr-gui.log'),
|
||||
frequency: 'daily',
|
||||
size: '10m',
|
||||
mkdir: true,
|
||||
limit: { count: 7 },
|
||||
},
|
||||
level: 'info',
|
||||
},
|
||||
{
|
||||
target: 'pino-pretty',
|
||||
options: { colorize: true },
|
||||
level: 'debug',
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
export const logger = pino(transport);
|
||||
|
||||
export const closeLogger = () =>
|
||||
new Promise<void>((resolve) => {
|
||||
logger.flush(() => {
|
||||
transport.once('close', resolve);
|
||||
transport.end();
|
||||
});
|
||||
});
|
||||
120
gui/electron/main/paths.ts
Normal file
@@ -0,0 +1,120 @@
|
||||
import { app } from 'electron';
|
||||
import path, { join } from 'node:path';
|
||||
import { getPlatform } from './utils';
|
||||
import { glob } from 'glob';
|
||||
import { spawn } from 'node:child_process';
|
||||
import javaVersionJar from '../resources/java-version/JavaVersion.jar?asset&asarUnpack';
|
||||
import { existsSync } from 'node:fs';
|
||||
import { options } from './cli';
|
||||
|
||||
const javaBin = getPlatform() === 'windows' ? 'java.exe' : 'java';
|
||||
export const CONFIG_IDENTIFIER = 'dev.slimevr.SlimeVR';
|
||||
|
||||
export const getGuiDataFolder = () => {
|
||||
const platform = getPlatform();
|
||||
|
||||
switch (platform) {
|
||||
case 'linux':
|
||||
if (process.env['XDG_DATA_HOME'])
|
||||
return join(process.env['XDG_DATA_HOME'], CONFIG_IDENTIFIER);
|
||||
return join(app.getPath('home'), '.local/share', CONFIG_IDENTIFIER);
|
||||
case 'windows':
|
||||
return join(app.getPath('appData'), CONFIG_IDENTIFIER);
|
||||
case 'macos':
|
||||
return join(
|
||||
app.getPath('home'),
|
||||
'Library/Application Support',
|
||||
CONFIG_IDENTIFIER
|
||||
);
|
||||
case 'unknown':
|
||||
throw 'error';
|
||||
}
|
||||
};
|
||||
|
||||
export const getServerDataFolder = () => {
|
||||
const platform = getPlatform();
|
||||
|
||||
switch (platform) {
|
||||
case 'linux':
|
||||
case 'windows':
|
||||
case 'macos':
|
||||
return join(app.getPath('appData'), CONFIG_IDENTIFIER);
|
||||
case 'unknown':
|
||||
throw 'error';
|
||||
}
|
||||
};
|
||||
|
||||
export const getLogsFolder = () => {
|
||||
return join(getGuiDataFolder(), 'logs');
|
||||
};
|
||||
|
||||
export const getWindowStateFile = () =>
|
||||
join(getServerDataFolder(), '.window-state.json');
|
||||
|
||||
const localJavaBin = (sharedDir: string) => {
|
||||
const jre = join(sharedDir, 'jre/bin', javaBin);
|
||||
return jre;
|
||||
};
|
||||
|
||||
const javaHomeBin = () => {
|
||||
const javaHome = process.env['JAVA_HOME'];
|
||||
if (!javaHome) return null;
|
||||
const javaHomeJre = join(javaHome, 'bin', javaBin);
|
||||
return javaHomeJre;
|
||||
};
|
||||
|
||||
export const findSystemJRE = async (sharedDir: string) => {
|
||||
const paths = [
|
||||
localJavaBin(sharedDir),
|
||||
javaHomeBin(),
|
||||
...(await glob('/usr/lib/jvm/*/bin/' + javaBin)),
|
||||
...(await glob('/Library/Java/JavaVirtualMachines/*/Contents/Home/bin/' + javaBin)),
|
||||
];
|
||||
|
||||
for (const path of paths) {
|
||||
if (!path) continue;
|
||||
|
||||
const version = await new Promise<number | null>((resolve) => {
|
||||
const process = spawn(path, ['-jar', javaVersionJar], {});
|
||||
|
||||
let version: number | null = null;
|
||||
|
||||
process.stdout?.once('data', (data) => {
|
||||
try {
|
||||
version = parseFloat(data.toString());
|
||||
} catch {
|
||||
version = null;
|
||||
}
|
||||
});
|
||||
|
||||
process.on('error', () => {
|
||||
resolve(null);
|
||||
});
|
||||
|
||||
process.on('exit', () => {
|
||||
resolve(version);
|
||||
});
|
||||
});
|
||||
if (version && version >= 17) return path;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
export const findServerJar = () => {
|
||||
const paths = [
|
||||
options.path ? path.resolve(options.path) : undefined,
|
||||
app.isPackaged ? path.resolve(process.resourcesPath) : undefined,
|
||||
// AppImage passes the fakeroot in `APPDIR` env var.
|
||||
process.env['APPDIR']
|
||||
? path.resolve(join(process.env['APPDIR'], 'usr/share/slimevr/'))
|
||||
: undefined,
|
||||
path.dirname(app.getPath('exe')),
|
||||
// For flatpack container
|
||||
path.resolve('/app/share/slimevr/'),
|
||||
path.resolve('/usr/share/slimevr/'),
|
||||
];
|
||||
return paths
|
||||
.filter((p) => !!p)
|
||||
.map((p) => join(p!, 'slimevr.jar'))
|
||||
.find((p) => existsSync(p));
|
||||
};
|
||||
49
gui/electron/main/presence.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
import { Client } from '@xhayper/discord-rpc';
|
||||
import { logger } from './logger';
|
||||
|
||||
export const richPresence = () => {
|
||||
const initialState = () => ({ ready: false, start: Date.now() });
|
||||
|
||||
const state = initialState();
|
||||
|
||||
const client = new Client({
|
||||
clientId: '1237970689009647639',
|
||||
transport: { type: 'ipc' },
|
||||
});
|
||||
client.on('ready', () => {
|
||||
state.ready = true;
|
||||
});
|
||||
|
||||
client.on('disconnected', () => {
|
||||
state.ready = false;
|
||||
});
|
||||
|
||||
return {
|
||||
state,
|
||||
connect: async () => {
|
||||
try {
|
||||
await client.login();
|
||||
} catch (e) {
|
||||
logger.error(e, 'unable to connect to discord rpc');
|
||||
}
|
||||
},
|
||||
updateActivity: (content: string) => {
|
||||
if (!state.ready) return;
|
||||
client.user
|
||||
?.setActivity({
|
||||
state: content,
|
||||
largeImageKey: 'icon',
|
||||
startTimestamp: state.start,
|
||||
})
|
||||
.catch((e) => {
|
||||
logger.error(e, 'unable to update rpc activity');
|
||||
});
|
||||
},
|
||||
destroy: () => {
|
||||
client.destroy();
|
||||
Object.assign(state, initialState());
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export const discordPresence = richPresence();
|
||||
76
gui/electron/main/store.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
||||
import { dirname, join } from "path";
|
||||
import { logger } from "./logger";
|
||||
import { getGuiDataFolder } from "./paths";
|
||||
|
||||
|
||||
export class CustomStore {
|
||||
private data: Record<string, unknown> = {};
|
||||
private saveTimeout: NodeJS.Timeout | null = null;
|
||||
private filePath: string;
|
||||
private debounceMs: number;
|
||||
|
||||
constructor(filePath: string, debounceMs: number = 2000) {
|
||||
this.filePath = filePath;
|
||||
this.debounceMs = debounceMs;
|
||||
this.load();
|
||||
}
|
||||
|
||||
private load() {
|
||||
try {
|
||||
if (existsSync(this.filePath)) {
|
||||
const raw = readFileSync(this.filePath, 'utf-8');
|
||||
this.data = JSON.parse(raw);
|
||||
}
|
||||
} catch (err) {
|
||||
logger.error(err, `Failed to load store at ${this.filePath}`);
|
||||
this.data = {};
|
||||
}
|
||||
}
|
||||
|
||||
/** Set a key and trigger the debounced auto-save */
|
||||
set(key: string, value: unknown) {
|
||||
this.data[key] = value;
|
||||
this.triggerAutoSave();
|
||||
}
|
||||
|
||||
get<T>(key: string): T | undefined {
|
||||
return this.data[key] as T;
|
||||
}
|
||||
|
||||
delete(key: string): boolean {
|
||||
if (key in this.data) {
|
||||
delete this.data[key];
|
||||
this.triggerAutoSave();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private triggerAutoSave() {
|
||||
if (this.saveTimeout) clearTimeout(this.saveTimeout);
|
||||
this.saveTimeout = setTimeout(() => {
|
||||
this.save();
|
||||
}, this.debounceMs);
|
||||
}
|
||||
|
||||
save(): boolean {
|
||||
try {
|
||||
if (this.saveTimeout) clearTimeout(this.saveTimeout);
|
||||
|
||||
const dir = dirname(this.filePath);
|
||||
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
||||
|
||||
writeFileSync(this.filePath, JSON.stringify(this.data, null, 2), 'utf-8');
|
||||
return true;
|
||||
} catch (err) {
|
||||
logger.error(err, 'Save failed', this.filePath);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const stores = {
|
||||
settings: new CustomStore(join(getGuiDataFolder(), 'gui-settings.dat'), 1000),
|
||||
cache: new CustomStore(join(getGuiDataFolder(), 'gui-cache.dat'), 100),
|
||||
};
|
||||
50
gui/electron/main/utils.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
import os from 'os'
|
||||
import { OSStats } from "../preload/interface";
|
||||
import { ipcMain, IpcMainInvokeEvent } from 'electron';
|
||||
import { IpcInvokeMap } from '../shared';
|
||||
import net from 'net'
|
||||
|
||||
export const getPlatform = (): OSStats['type'] => {
|
||||
switch (os.platform()) {
|
||||
case 'darwin':
|
||||
return 'macos';
|
||||
case 'win32':
|
||||
return 'windows';
|
||||
case 'linux':
|
||||
return 'linux';
|
||||
default:
|
||||
return 'unknown';
|
||||
}
|
||||
};
|
||||
|
||||
export const isPortAvailable = (port: number) => {
|
||||
return new Promise((resolve) => {
|
||||
const s = net.createServer();
|
||||
s.once('error', (err) => {
|
||||
s.close();
|
||||
if ("code" in err && err["code"] == "EADDRINUSE") {
|
||||
resolve(false);
|
||||
} else {
|
||||
resolve(false);
|
||||
}
|
||||
});
|
||||
s.once('listening', () => {
|
||||
resolve(true);
|
||||
s.close();
|
||||
});
|
||||
s.listen(port);
|
||||
});
|
||||
};
|
||||
|
||||
export function handleIpc<K extends keyof IpcInvokeMap>(
|
||||
channel: K,
|
||||
handler: (
|
||||
event: IpcMainInvokeEvent,
|
||||
...args: Parameters<IpcInvokeMap[K]>
|
||||
) => ReturnType<IpcInvokeMap[K]>
|
||||
) {
|
||||
ipcMain.handle(channel, (event, ...args) => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
return handler(event, ...args as any);
|
||||
});
|
||||
}
|
||||
40
gui/electron/preload/index.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron';
|
||||
import { IElectronAPI, ServerStatusEvent } from './interface';
|
||||
import { IPC_CHANNELS } from '../shared';
|
||||
|
||||
contextBridge.exposeInMainWorld('electronAPI', {
|
||||
onServerStatus: (callback) => {
|
||||
const subscription = (_event: IpcRendererEvent, value: ServerStatusEvent) =>
|
||||
callback(value);
|
||||
ipcRenderer.on(IPC_CHANNELS.SERVER_STATUS, subscription);
|
||||
return () => ipcRenderer.removeListener(IPC_CHANNELS.SERVER_STATUS, subscription);
|
||||
},
|
||||
openUrl: (url) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_URL, url),
|
||||
osStats: () => ipcRenderer.invoke(IPC_CHANNELS.OS_STATS),
|
||||
close: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'close'),
|
||||
hide: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'hide'),
|
||||
minimize: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'minimize'),
|
||||
maximize: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'maximize'),
|
||||
getStorage: async (type) => {
|
||||
return {
|
||||
get: (key) =>
|
||||
ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'get', key }),
|
||||
set: (key, value) =>
|
||||
ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'set', key, value }),
|
||||
delete: (key) =>
|
||||
ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'delete', key }),
|
||||
save: () => ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'save' }),
|
||||
};
|
||||
},
|
||||
log: (type, ...args) => ipcRenderer.invoke(IPC_CHANNELS.LOG, type, ...args),
|
||||
i18nOverride: async () => ipcRenderer.invoke(IPC_CHANNELS.I18N_OVERRIDE),
|
||||
showDecorations: () => {},
|
||||
setTranslations: () => {},
|
||||
openDialog: (options) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_DIALOG, options),
|
||||
saveDialog: (options) => ipcRenderer.invoke(IPC_CHANNELS.SAVE_DIALOG, options),
|
||||
openConfigFolder: async () => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, await ipcRenderer.invoke(IPC_CHANNELS.GET_FOLDER, 'config')),
|
||||
openLogsFolder: async () => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, await ipcRenderer.invoke(IPC_CHANNELS.GET_FOLDER, 'logs')),
|
||||
openFile: (path) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, path),
|
||||
ghGet: (req) => ipcRenderer.invoke(IPC_CHANNELS.GH_FETCH, req),
|
||||
setPresence: (options) => ipcRenderer.invoke(IPC_CHANNELS.DISCORD_PRESENCE, options)
|
||||
} satisfies IElectronAPI);
|
||||
65
gui/electron/preload/interface.d.ts
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
import {
|
||||
OpenDialogOptions,
|
||||
OpenDialogReturnValue,
|
||||
SaveDialogOptions,
|
||||
SaveDialogReturnValue,
|
||||
} from 'electron';
|
||||
|
||||
export type ServerStatusEvent = {
|
||||
type: 'stdout' | 'stderr' | 'error' | 'terminated' | 'other';
|
||||
message: string;
|
||||
};
|
||||
|
||||
export type OSStats = {
|
||||
type: 'linux' | 'windows' | 'macos' | 'unknown';
|
||||
};
|
||||
|
||||
export interface CrossStorage {
|
||||
set(key: string, value: unknown): Promise<void>;
|
||||
get<T>(key: string): Promise<T | undefined>;
|
||||
delete(key: string): Promise<boolean>;
|
||||
save(): Promise<boolean>;
|
||||
}
|
||||
|
||||
export type GHGet = { type: 'fw-releases' } | { type: 'asset'; url: string };
|
||||
export type GHReturn = {
|
||||
asset: [number, string][] | null;
|
||||
['fw-releases']:
|
||||
| {
|
||||
assets: { browser_download_url: string; name: string; digest: string }[];
|
||||
prerelease: boolean;
|
||||
tag_name: string;
|
||||
body: string;
|
||||
}[]
|
||||
| null;
|
||||
};
|
||||
|
||||
export type DiscordPresence = { enable: false } | { enable: true, activity: string }
|
||||
|
||||
export interface IElectronAPI {
|
||||
onServerStatus: (cb: (data: ServerStatusEvent) => void) => () => void;
|
||||
openUrl: (url: string) => Promise<void>;
|
||||
osStats: () => Promise<OSStats>;
|
||||
openLogsFolder: () => Promise<void>;
|
||||
openConfigFolder: () => Promise<void>;
|
||||
close: () => void;
|
||||
hide: () => void;
|
||||
minimize: () => void;
|
||||
maximize: () => void;
|
||||
showDecorations: (decorations: boolean) => void;
|
||||
setTranslations: (translations: Record<string, string>) => void;
|
||||
i18nOverride: () => Promise<string | false>;
|
||||
getStorage: (type: 'settings' | 'cache') => Promise<CrossStorage>;
|
||||
openDialog: (options: OpenDialogOptions) => Promise<OpenDialogReturnValue>;
|
||||
saveDialog: (options: SaveDialogOptions) => Promise<SaveDialogReturnValue>;
|
||||
log: (type: 'info' | 'error' | 'warn', ...args: unknown[]) => void;
|
||||
openFile: (path: string) => void;
|
||||
ghGet: <T extends GHGet>(options: T) => Promise<GHReturn[T['type']]>;
|
||||
setPresence: (options: DiscordPresence) => void;
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
electronAPI: IElectronAPI;
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 747 B After Width: | Height: | Size: 747 B |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 698 B After Width: | Height: | Size: 698 B |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 1008 B After Width: | Height: | Size: 1008 B |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 922 B After Width: | Height: | Size: 922 B |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 579 B After Width: | Height: | Size: 579 B |
|
Before Width: | Height: | Size: 555 B After Width: | Height: | Size: 555 B |
|
Before Width: | Height: | Size: 848 B After Width: | Height: | Size: 848 B |
|
Before Width: | Height: | Size: 848 B After Width: | Height: | Size: 848 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 645 B After Width: | Height: | Size: 645 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 848 B After Width: | Height: | Size: 848 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
BIN
gui/electron/resources/java-version/JavaVersion.jar
Normal file
@@ -1,8 +1,8 @@
|
||||
public class JavaVersion {
|
||||
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
var version = Runtime.version().version().get(0);
|
||||
System.exit(version);
|
||||
System.out.println(version);
|
||||
}
|
||||
}
|
||||
26
gui/electron/resources/scripts/postinstall.sh
Normal file
@@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
|
||||
SRC="/opt/SlimeVR/69-slimevr-devices.rules"
|
||||
DESTDIRS=("/lib" "/usr/lib")
|
||||
|
||||
if [[ ! -f "$SRC" ]]; then
|
||||
echo "SlimeVR udev rules not found, serial console and dongles may not work" >&2
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Configuring SlimeVR udev rules..."
|
||||
|
||||
for DIR in "${DESTDIRS[@]}"; do
|
||||
if [[ -d "$DIR" && ! -h "$DIR" ]]; then
|
||||
echo "Copying rules to $DIR"
|
||||
install -Dm644 "$SRC" "$DIR/udev/rules.d/69-slimevr-devices.rules"
|
||||
|
||||
if command -v udevadm >/dev/null 2>&1; then
|
||||
udevadm control --reload-rules
|
||||
udevadm trigger
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Couldn't copy SlimeVR udev rules, serial console and dongles may not work" >&2
|
||||
8
gui/electron/resources/scripts/postremove.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
echo "Removing SlimeVR udev rules..."
|
||||
rm -f "/lib/udev/rules.d/69-slimevr-devices.rules"
|
||||
rm -f "/usr/lib/udev/rules.d/69-slimevr-devices.rules"
|
||||
|
||||
if command -v udevadm >/dev/null 2>&1; then
|
||||
udevadm control --reload-rules
|
||||
fi
|
||||
49
gui/electron/shared.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
import {
|
||||
OpenDialogOptions,
|
||||
OpenDialogReturnValue,
|
||||
SaveDialogOptions,
|
||||
SaveDialogReturnValue,
|
||||
} from 'electron';
|
||||
import { DiscordPresence, GHGet, GHReturn, OSStats } from './preload/interface';
|
||||
|
||||
export const IPC_CHANNELS = {
|
||||
SERVER_STATUS: 'server-status',
|
||||
OPEN_URL: 'open-url',
|
||||
OS_STATS: 'os-stats',
|
||||
WINDOW_ACTIONS: 'window-actions',
|
||||
LOG: 'log',
|
||||
STORAGE: 'storage',
|
||||
OPEN_DIALOG: 'open-dialog',
|
||||
SAVE_DIALOG: 'save-dialog',
|
||||
I18N_OVERRIDE: 'i18n-override',
|
||||
OPEN_FILE: 'open-file',
|
||||
GET_FOLDER: 'get-folder',
|
||||
GH_FETCH: 'gh-fetch',
|
||||
DISCORD_PRESENCE: 'discord-presence'
|
||||
} as const;
|
||||
|
||||
export interface IpcInvokeMap {
|
||||
[IPC_CHANNELS.OPEN_URL]: (url: string) => void;
|
||||
[IPC_CHANNELS.OS_STATS]: () => Promise<OSStats>;
|
||||
[IPC_CHANNELS.WINDOW_ACTIONS]: (action: 'close' | 'minimize' | 'maximize' | 'hide') => void;
|
||||
[IPC_CHANNELS.LOG]: (type: 'info' | 'error' | 'warn', ...args: unknown[]) => void;
|
||||
[IPC_CHANNELS.OPEN_DIALOG]: (
|
||||
options: OpenDialogOptions
|
||||
) => Promise<OpenDialogReturnValue>;
|
||||
[IPC_CHANNELS.SAVE_DIALOG]: (
|
||||
options: SaveDialogOptions
|
||||
) => Promise<SaveDialogReturnValue>;
|
||||
[IPC_CHANNELS.I18N_OVERRIDE]: () => Promise<string | false>;
|
||||
[IPC_CHANNELS.STORAGE]: (args: {
|
||||
type: 'settings' | 'cache';
|
||||
method: 'get' | 'set' | 'delete' | 'save';
|
||||
key?: string;
|
||||
value?: unknown;
|
||||
}) => Promise<unknown>;
|
||||
[IPC_CHANNELS.OPEN_FILE]: (path: string) => void;
|
||||
[IPC_CHANNELS.GET_FOLDER]: (folder: 'config' | 'logs') => string;
|
||||
[IPC_CHANNELS.GH_FETCH]: <T extends GHGet>(
|
||||
options: T
|
||||
) => Promise<GHReturn[T['type']]>;
|
||||
[IPC_CHANNELS.DISCORD_PRESENCE]: (options: DiscordPresence) => void;
|
||||
}
|
||||
143
gui/package.json
@@ -1,82 +1,54 @@
|
||||
{
|
||||
"name": "slimevr-ui",
|
||||
"version": "0.5.1",
|
||||
"private": true,
|
||||
"name": "slimevr",
|
||||
"version": "0.0.0",
|
||||
"author": "SlimeVR Team <contact@slimevr.dev>",
|
||||
"homepage": "https://slimevr.dev",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@ryuziii/discord-rpc": "1.0.1-rc.1",
|
||||
"@xhayper/discord-rpc": "^1.3.0",
|
||||
"commander": "^14.0.3",
|
||||
"discord-rich-presence": "^0.0.8",
|
||||
"glob": "^13.0.3",
|
||||
"open": "^11.0.0",
|
||||
"pino": "^10.3.1",
|
||||
"pino-pretty": "^13.1.3",
|
||||
"pino-roll": "^4.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "vite --force",
|
||||
"gui": "electron-vite dev --config electron.vite.config.ts --watch",
|
||||
"build": "electron-vite build --config electron.vite.config.ts",
|
||||
"package": "electron-builder",
|
||||
"package:build": "pnpm build && pnpm package",
|
||||
"preview": "electron-vite preview --config electron.vite.config.ts",
|
||||
"skipbundler": "vite build",
|
||||
"lint": "tsc --noEmit && eslint --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && prettier --check \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"",
|
||||
"lint:fix": "tsc --noEmit && eslint --fix --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && pnpm run format",
|
||||
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"",
|
||||
"javaversion-build": "cd electron/resources/java-version/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class",
|
||||
"gen:javaversion": "cd electron/resources/java-version/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class",
|
||||
"gen:firmware-tool": "openapi-codegen gen firmwareTool"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@dword-design/eslint-plugin-import-alias": "^4.0.9",
|
||||
"@electron/asar": "^4.0.1",
|
||||
"@fluent/bundle": "^0.18.0",
|
||||
"@fluent/react": "^0.15.2",
|
||||
"@fontsource/poppins": "^5.1.0",
|
||||
"@formatjs/intl-localematcher": "^0.2.32",
|
||||
"@hookform/resolvers": "^3.6.0",
|
||||
"@react-hookz/deep-equal": "^3.0.3",
|
||||
"@react-three/drei": "^9.114.3",
|
||||
"@react-three/fiber": "^8.17.10",
|
||||
"@sentry/react": "10.29.0",
|
||||
"@sentry/vite-plugin": "^2.22.7",
|
||||
"@tailwindcss/typography": "^0.5.15",
|
||||
"@tanstack/react-query": "^5.48.0",
|
||||
"@tauri-apps/api": "^2.0.2",
|
||||
"@tauri-apps/plugin-dialog": "^2.0.0",
|
||||
"@tauri-apps/plugin-fs": "2.4.1",
|
||||
"@tauri-apps/plugin-http": "^2.5.0",
|
||||
"@tauri-apps/plugin-log": "~2",
|
||||
"@tauri-apps/plugin-opener": "^2.4.0",
|
||||
"@tauri-apps/plugin-os": "^2.0.0",
|
||||
"@tauri-apps/plugin-shell": "^2.3.0",
|
||||
"@tauri-apps/plugin-store": "^2.4.1",
|
||||
"@tweenjs/tween.js": "^25.0.0",
|
||||
"@twemoji/svg": "^15.0.0",
|
||||
"ajv": "^8.17.1",
|
||||
"browser-fs-access": "^0.35.0",
|
||||
"classnames": "^2.5.1",
|
||||
"convert": "^5.12.0",
|
||||
"flatbuffers": "22.10.26",
|
||||
"intl-pluralrules": "^2.0.1",
|
||||
"ip-num": "^1.5.1",
|
||||
"jotai": "^2.12.2",
|
||||
"prompts": "^2.4.2",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-error-boundary": "^4.0.13",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-hook-form": "^7.63.0",
|
||||
"react-markdown": "^9.0.1",
|
||||
"react-modal": "^3.16.1",
|
||||
"react-responsive": "^10.0.0",
|
||||
"react-router-dom": "^6.26.2",
|
||||
"remark-gfm": "^4.0.0",
|
||||
"semver": "^7.6.3",
|
||||
"solarxr-protocol": "file:../solarxr-protocol",
|
||||
"three": "^0.163.0",
|
||||
"ts-pattern": "^5.4.0",
|
||||
"typescript": "^5.6.3",
|
||||
"use-double-tap": "^1.3.6",
|
||||
"uuid": "^13.0.0",
|
||||
"yup": "^1.4.0"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "vite --force",
|
||||
"build": "vite build",
|
||||
"dev": "tauri dev",
|
||||
"skipbundler": "tauri build --no-bundle",
|
||||
"tauri": "tauri",
|
||||
"lint": "tsc --noEmit && eslint --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && prettier --check \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"",
|
||||
"lint:fix": "tsc --noEmit && eslint --fix --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && pnpm run format",
|
||||
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"",
|
||||
"preview-vite": "vite preview",
|
||||
"javaversion-build": "cd src-tauri/src/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class",
|
||||
"gen:javaversion": "cd src-tauri/src/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class",
|
||||
"gen:firmware-tool": "openapi-codegen gen firmwareTool",
|
||||
"gen:icons": "tauri icon --ios-color '#663499' src-tauri/icons/icon.svg"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@dword-design/eslint-plugin-import-alias": "^4.0.9",
|
||||
"@openapi-codegen/cli": "^3.1.0",
|
||||
"@openapi-codegen/typescript": "^8.0.2",
|
||||
"@react-hookz/deep-equal": "^3.0.3",
|
||||
"@sentry/react": "10.29.0",
|
||||
"@sentry/vite-plugin": "^2.22.7",
|
||||
"@stylistic/eslint-plugin": "^5.5.0",
|
||||
"@tailwindcss/forms": "^0.5.9",
|
||||
"@tauri-apps/cli": "~2",
|
||||
"@tailwindcss/typography": "^0.5.15",
|
||||
"@tanstack/react-query": "^5.48.0",
|
||||
"@tweenjs/tween.js": "^25.0.0",
|
||||
"@twemoji/svg": "^15.0.0",
|
||||
"@types/file-saver": "^2.0.7",
|
||||
"@types/node": "^24.3.1",
|
||||
"@types/react": "^18.3.11",
|
||||
@@ -88,23 +60,54 @@
|
||||
"@typescript-eslint/eslint-plugin": "^8.48.1",
|
||||
"@typescript-eslint/parser": "^8.48.1",
|
||||
"@vitejs/plugin-react": "^4.3.2",
|
||||
"ajv": "^8.17.1",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"cross-env": "^7.0.3",
|
||||
"browser-fs-access": "^0.35.0",
|
||||
"classnames": "^2.5.1",
|
||||
"convert": "^5.12.0",
|
||||
"dmg-license": "^1.0.11",
|
||||
"dotenv": "^16.4.5",
|
||||
"electron": "^40.3.0",
|
||||
"electron-builder": "^26.7.0",
|
||||
"electron-vite": "^5.0.0",
|
||||
"eslint": "^9.39.1",
|
||||
"eslint-import-resolver-typescript": "^3.10.1",
|
||||
"eslint-plugin-import": "^2.32.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.10.2",
|
||||
"eslint-plugin-react": "^7.37.5",
|
||||
"eslint-plugin-react-hooks": "^7.0.1",
|
||||
"flatbuffers": "22.10.26",
|
||||
"globals": "^15.10.0",
|
||||
"intl-pluralrules": "^2.0.1",
|
||||
"ip-num": "^1.5.1",
|
||||
"jotai": "^2.12.2",
|
||||
"prettier": "^3.3.3",
|
||||
"prompts": "^2.4.2",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-error-boundary": "^4.0.13",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-hook-form": "^7.63.0",
|
||||
"react-markdown": "^9.0.1",
|
||||
"react-modal": "^3.16.1",
|
||||
"react-responsive": "^10.0.0",
|
||||
"react-router-dom": "^6.26.2",
|
||||
"remark-gfm": "^4.0.0",
|
||||
"rollup-plugin-visualizer": "^5.12.0",
|
||||
"sass": "^1.79.4",
|
||||
"semver": "^7.6.3",
|
||||
"solarxr-protocol": "file:../solarxr-protocol",
|
||||
"spdx-satisfies": "^5.0.1",
|
||||
"tailwind-gradient-mask-image": "^1.2.0",
|
||||
"tailwindcss": "^3.4.13",
|
||||
"three": "^0.163.0",
|
||||
"ts-pattern": "^5.4.0",
|
||||
"typescript": "^5.6.3",
|
||||
"typescript-eslint": "^8.46.2",
|
||||
"vite": "^5.4.8"
|
||||
}
|
||||
"use-double-tap": "^1.3.6",
|
||||
"uuid": "^13.0.0",
|
||||
"vite": "^5.4.8",
|
||||
"yup": "^1.4.0"
|
||||
},
|
||||
"main": "./out/main/index.js"
|
||||
}
|
||||
|
||||
BIN
gui/public/fonts/noto-sans-v42-latin-regular.woff2
Normal file
@@ -10,7 +10,7 @@
|
||||
websocket-connecting = Připojování k serveru
|
||||
websocket-connection_lost = Ztraceno spojení se serverem. Pokouším se znovu připojit...
|
||||
websocket-connection_lost-desc = Vypadá to že SlimeVR server spadl. Zkontrolujte záznamy protokolů a restartuje aplikaci
|
||||
websocket-timedout = Nelze se připojit k serveru
|
||||
websocket-timedout = Nepodařilo se připojit k serveru
|
||||
websocket-timedout-desc = Vypadá to že buď vypršel časový limit SlimeVR serveru, a nebo došlo k zhroucení. Zkontrolujte záznamy protokolů a restartuje aplikaci
|
||||
websocket-error-close = Ukončit SlimeVR
|
||||
websocket-error-logs = Otevření složku s záznamy protokolů
|
||||
@@ -33,6 +33,10 @@ tips-failed_webgl = Načtení WebGL selhalo.
|
||||
|
||||
## Units
|
||||
|
||||
unit-meter = Metr
|
||||
unit-foot = Foot
|
||||
unit-inch = Palec
|
||||
unit-cm = cm
|
||||
|
||||
## Body parts
|
||||
|
||||
@@ -73,6 +77,8 @@ board_type-WEMOSD1MINI = Wemos D1 Mini
|
||||
board_type-TTGO_TBASE = TTGO T-Base
|
||||
board_type-ESP01 = ESP-01
|
||||
board_type-SLIMEVR = SlimeVR
|
||||
board_type-SLIMEVR_DEV = SlimeVR Dev Board
|
||||
board_type-SLIMEVR_V1_2 = SlimeVR v1.2
|
||||
board_type-LOLIN_C3_MINI = Lolin C3 Mini
|
||||
board_type-BEETLE32C3 = Beetle ESP32-C3
|
||||
board_type-ESP32C3DEVKITM1 = Espressif ESP32-C3 DevKitM-1
|
||||
@@ -84,6 +90,11 @@ board_type-XIAO_ESP32C3 = Seeed Studio XIAO ESP32C3
|
||||
board_type-HARITORA = Haritora
|
||||
board_type-ESP32C6DEVKITC1 = Espressif ESP32-C6 DevKitC-1
|
||||
board_type-GLOVE_IMU_SLIMEVR_DEV = SlimeVR vývojářská IMU rukavice
|
||||
board_type-GESTURES = Gesta
|
||||
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
|
||||
board_type-GENERIC_NRF = Obecné nRF
|
||||
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
|
||||
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
|
||||
|
||||
## Proportions
|
||||
|
||||
@@ -104,7 +115,7 @@ skeleton_bone-LOWER_LEG = Délka dolní části nohy
|
||||
skeleton_bone-FOOT_LENGTH = Délka chodidla
|
||||
skeleton_bone-FOOT_LENGTH-desc =
|
||||
Toto je vzdálenost mezi vaši kotníky a prsty na nohou.
|
||||
Pro upravení, Chodtě po špičkách dokud vaše virtuální nohy nezůstanou na místě.
|
||||
Pro upravení, Choďte po špičkách dokud vaše virtuální nohy nezůstanou na místě.
|
||||
skeleton_bone-FOOT_SHIFT = Odsazení chodidla
|
||||
skeleton_bone-SKELETON_OFFSET = Odsazení kostry
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Vzdálenost ramen
|
||||
@@ -129,7 +140,11 @@ reset-reset_all_warning_default-v2 =
|
||||
Jste si jistí že to chcete udělat?
|
||||
reset-full = Plný Reset
|
||||
reset-mounting = Znovu nastavit nasazení
|
||||
reset-mounting-feet = Obnovit pozice nasazení nohou
|
||||
reset-mounting-fingers = Obnovit pozice nasazení prstů
|
||||
reset-yaw = Rychlý reset
|
||||
reset-error-no_feet_tracker = Žádný tracker nohou nebyl přiřazen
|
||||
reset-error-no_fingers_tracker = Žádné trackery prstů nebyly přiřazeny
|
||||
|
||||
## Serial detection stuff
|
||||
|
||||
@@ -149,11 +164,14 @@ navbar-trackers_assign = Přiřazení trackerů
|
||||
navbar-mounting = Kalibrace nasazení
|
||||
navbar-onboarding = Průvodce nastavením
|
||||
navbar-settings = Nastavení
|
||||
navbar-connect_trackers = Připojte Trackery
|
||||
|
||||
## Biovision hierarchy recording
|
||||
|
||||
bvh-start_recording = Nahrát BVH
|
||||
bvh-stop_recording = Uložit BVH záznam
|
||||
bvh-recording = Nahrávání...
|
||||
bvh-save_title = Uložit BVH záznam
|
||||
|
||||
## Tracking pause
|
||||
|
||||
@@ -194,7 +212,7 @@ widget-imu_visualizer-rotation_raw = Nezpracované
|
||||
widget-imu_visualizer-rotation_preview = Náhled
|
||||
widget-imu_visualizer-acceleration = Akcelerace
|
||||
widget-imu_visualizer-position = Pozice
|
||||
widget-imu_visualizer-stay_aligned = Zůstaň Srovaný (Stay Aligned)
|
||||
widget-imu_visualizer-stay_aligned = Zůstaň Srovnaný (Stay Aligned)
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
@@ -217,12 +235,13 @@ tracker-table-column-name = Název
|
||||
tracker-table-column-type = Typ
|
||||
tracker-table-column-battery = Baterie
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-packet_loss = Ztráta Paketů
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = Teplota °C
|
||||
tracker-table-column-linear-acceleration = Akcel. X/Y/Z
|
||||
tracker-table-column-rotation = Rotace X/Y/Z
|
||||
tracker-table-column-position = Pozice X/Y/Z
|
||||
tracker-table-column-stay_aligned = Zůstaň Srovaný (Stay Aligned)
|
||||
tracker-table-column-stay_aligned = Zůstaň Srovnaný (Stay Aligned)
|
||||
tracker-table-column-url = URL
|
||||
|
||||
## Tracker rotation
|
||||
@@ -258,6 +277,9 @@ tracker-infos-magnetometer-status-v1 =
|
||||
[ENABLED] Povoleno
|
||||
*[NOT_SUPPORTED] Není podporováno
|
||||
}
|
||||
tracker-infos-packet_loss = Ztráta Paketů
|
||||
tracker-infos-packets_lost = Pakety Ztraceny
|
||||
tracker-infos-packets_received = Pakety Přijaty
|
||||
|
||||
## Tracker settings
|
||||
|
||||
@@ -288,10 +310,16 @@ tracker-settings-name_section-label = Název trackeru
|
||||
tracker-settings-forget = Zapomenout tracker
|
||||
tracker-settings-forget-description = Odebere tracker z SlimeVR Serveru a zabrání jeho opětovnému připojení do té doby, dokud nebude server restarován. Konfigurace trackeru nebude ztracena.
|
||||
tracker-settings-forget-label = Zapomenout tracker
|
||||
tracker-settings-update-unavailable-v2 = Žádné vydání nebyla nalezena
|
||||
tracker-settings-update-incompatible = Nelze aktualizovat. Nekompatibilní deska nebo verze firmwaru
|
||||
tracker-settings-update-low-battery = Nelze provést aktualizaci. Baterie má méně než 50%
|
||||
tracker-settings-update-up_to_date = Aktuální
|
||||
tracker-settings-update-blocked = Není dostupná aktualizace. Žádná jiná verze není k dispozici
|
||||
tracker-settings-update = Aktualizovat nyní
|
||||
tracker-settings-update-title = Verze Firmwareu
|
||||
tracker-settings-current-version = Současný
|
||||
tracker-settings-latest-version = Nejnovější
|
||||
tracker-settings-build-date = Datum sestavení
|
||||
|
||||
## Tracker part card info
|
||||
|
||||
@@ -357,16 +385,20 @@ mounting_selection_menu-close = Zavřít
|
||||
|
||||
settings-sidebar-title = Nastavení
|
||||
settings-sidebar-general = Obecné
|
||||
settings-sidebar-steamvr = SteamVR
|
||||
settings-sidebar-tracker_mechanics = Mechanika trackerů
|
||||
settings-sidebar-stay_aligned = Zůstaň Srovaný (Stay Aligned)
|
||||
settings-sidebar-stay_aligned = Zůstaň Srovnaný (Stay Aligned)
|
||||
settings-sidebar-fk_settings = Nastavení trackování
|
||||
settings-sidebar-gesture_control = Ovládání gesty
|
||||
settings-sidebar-interface = Rozhraní
|
||||
settings-sidebar-osc_router = OSC router
|
||||
settings-sidebar-osc_trackers = VRChat OSC tracker
|
||||
settings-sidebar-osc_vmc = VMC
|
||||
settings-sidebar-utils = Nástroje
|
||||
settings-sidebar-serial = Sériová konzole
|
||||
settings-sidebar-appearance = Vzhled
|
||||
settings-sidebar-home = Domovská obrazovka
|
||||
settings-sidebar-checklist = Přehled trackování
|
||||
settings-sidebar-notifications = Notifikace
|
||||
settings-sidebar-behavior = Chování
|
||||
settings-sidebar-firmware-tool = Nástroj pro DIY firmware
|
||||
@@ -452,18 +484,25 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
|
||||
Použití magnetometr na všech trackerech které pro to mají kompatibilní firmware, snížení drifutu v stailních magnetických prostředích.
|
||||
Může být vypnuto pro jednotivé trackery v jejich nastaveních. <b> Prosíme nevypínejte žádný z trackerů při přepínání tohoto nastavení! </b>
|
||||
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = Použít magnetometru na trackerech
|
||||
settings-stay_aligned = Zůstaň Srovaný (Stay Aligned)
|
||||
settings-stay_aligned-description = Zůstaň Srovaný redukuje drift pomocí postupného upravování vašich trackerů do vaší relaxůjící pózy.
|
||||
settings-stay_aligned-setup-label = Nastavte Zůstaň Sronaný
|
||||
settings-stay_aligned-setup-description = Musíte dokončit "Nastvení Zůstaň Srovaný" pro zapnutí Zůstaň Srovnaný.
|
||||
settings-general-tracker_mechanics-trackers_over_usb = Trackery přes USB
|
||||
settings-stay_aligned = Zůstaň Srovnaný (Stay Aligned)
|
||||
settings-stay_aligned-description = Zůstaň Srovnaný (Stay Aligned) redukuje drift pomocí postupného upravování vašich trackerů do vaší relaxůjící pózy.
|
||||
settings-stay_aligned-setup-label = Nastavte Zůstaň Srovnaný (Stay Aligned)
|
||||
settings-stay_aligned-setup-description = Musíte dokončit "Nastavení Zůstaň Srovnaný" pro zapnutí Zůstaň Srovnaný.
|
||||
settings-stay_aligned-warnings-drift_compensation = ⚠ Prosím vypněte Kompenzaci Driftu! Kompenzace driftu bude narušovat funkčnost Zůstaň Srovnaný.
|
||||
settings-stay_aligned-enabled-label = Upravit trackery
|
||||
settings-stay_aligned-hide_yaw_correction-label = Skrýt ladění (pro srovnání s vypnutým Zůstaň Srovnaný)
|
||||
settings-stay_aligned-general-label = Obecné
|
||||
settings-stay_aligned-relaxed_poses-label = Relaxovací Póza
|
||||
settings-stay_aligned-relaxed_poses-description = Zůstaň Srovnaný používá vaše uvolněné pózy k udržení srovnání trackerů. K aktualizaci těchto póz použijte "Nastavte Zůstaň Srovnaný".
|
||||
settings-stay_aligned-relaxed_poses-standing = Upravit trackery při stoje
|
||||
settings-stay_aligned-relaxed_poses-sitting = Upravit pozici trackerů při sezení na židli
|
||||
settings-stay_aligned-relaxed_poses-flat = Upravte pozici trackerů při sezení na zemi, nebo ležení na zádech
|
||||
settings-stay_aligned-relaxed_poses-save_pose = Uložit pózu
|
||||
settings-stay_aligned-relaxed_poses-reset_pose = Obnovit pózu
|
||||
settings-stay_aligned-relaxed_poses-close = Zavřít
|
||||
settings-stay_aligned-debug-label = Ladění
|
||||
settings-stay_aligned-debug-description = Při nahlašování problémů s Zůstaň Srovnaný, prosím zahrňte vaše nastavení.
|
||||
settings-stay_aligned-debug-copy-label = Zkopírovat nastavení do schránky
|
||||
|
||||
## FK/Tracking settings
|
||||
@@ -472,7 +511,7 @@ settings-general-fk_settings = Nastavení trackování
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Podlahovej clip
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Clip podlahy
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
@@ -486,11 +525,14 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = Připnutí k pod
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = Přichycení špiček se pokouší odhadnout rotaci vašich chodidel v případě, že nepoužíváte trackery chodidel.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = Narovnání chodidla při dotyku narovnává chodidla tak, aby byla rovnoběžně se zemí.
|
||||
settings-general-fk_settings-leg_fk = Sledování nohou
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-v1 = Vynutit kalibraci nasazení pro trackery nohou
|
||||
settings-general-fk_settings-enforce_joint_constraints = Limity kostry
|
||||
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints = Prosazování omezení
|
||||
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints-description = Zabránit rotaci kloubům za jejich limit
|
||||
settings-general-fk_settings-enforce_joint_constraints-correct_constraints = Opravit pomocí omezení
|
||||
settings-general-fk_settings-enforce_joint_constraints-correct_constraints-description = Opravit rotaci kloubů, když překročí svůj limit
|
||||
settings-general-fk_settings-ik = Data pozice
|
||||
settings-general-fk_settings-ik-use_position = Použít Data pozice
|
||||
settings-general-fk_settings-arm_fk = Trackování ramen
|
||||
settings-general-fk_settings-arm_fk-description = Vynutit sledování rukou z VR headsetu, i když jsou k dispozici údaje o poloze rukou z trackerů.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Vynutit ruce z VR Headsetu
|
||||
@@ -614,6 +656,9 @@ settings-interface-behavior-error_tracking-description_v2 =
|
||||
|
||||
Aby jsme mohli poskytnout nejlepší zážitek uživatelům, schromažďujeme proto anonymizované zprávy o chybých, metriky výkon a informace o operačním systém. To nám pomáhá zjištovat chyby a problémy s SlimeVR. Tyto matriky jsou schromažďovány prostřednictvím Sentry.io.
|
||||
settings-interface-behavior-error_tracking-label = Odeslat chyby vývojářům
|
||||
settings-interface-behavior-bvh_directory = Cesta pro uložení BVH záznamů
|
||||
settings-interface-behavior-bvh_directory-description = Vyberte cestu k uložení záznamů BHV. namísto toho, abyste pokaždé vybírali, kam je uložit.
|
||||
settings-interface-behavior-bvh_directory-label = Lokace pro BVH nahrávky
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -624,7 +669,7 @@ settings-serial-description =
|
||||
Může být užitečné, pokud potřebujete zjistit, zda se firmware chová špatně.
|
||||
settings-serial-connection_lost = Ztráta připojení k seriálu, Připojení se obnovuje...
|
||||
settings-serial-reboot = Restartovat
|
||||
settings-serial-factory_reset = Obnovení továrního nastavení
|
||||
settings-serial-factory_reset = Obnovení do továrního nastavení
|
||||
# This cares about multilines
|
||||
# <b>text</b> means that the text should be bold
|
||||
settings-serial-factory_reset-warning =
|
||||
@@ -637,6 +682,10 @@ settings-serial-auto_dropdown_item = Auto
|
||||
settings-serial-get_wifi_scan = Skenovat WiFi
|
||||
settings-serial-file_type = Prostý text
|
||||
settings-serial-save_logs = Uložit jako soubor
|
||||
settings-serial-send_command = Odeslat
|
||||
settings-serial-send_command-placeholder = Příkaz...
|
||||
settings-serial-send_command-warning-ok = Vím, co dělám!
|
||||
settings-serial-send_command-warning-cancel = Zrušit
|
||||
|
||||
## OSC router settings
|
||||
|
||||
@@ -729,6 +778,7 @@ settings-osc-vmc-mirror_tracking-label = Zrcadlení trackování
|
||||
|
||||
## Common OSC settings
|
||||
|
||||
settings-osc-common-network-port_banned_error = Port { $port } nelze použít!
|
||||
|
||||
## Advanced settings
|
||||
|
||||
@@ -765,9 +815,14 @@ settings-utils-advanced-open_logs-label = Otevřít složku
|
||||
|
||||
## Home Screen
|
||||
|
||||
settings-home-list-layout = Uspořádání seznamu trackerů
|
||||
settings-home-list-layout-desc = Vyberte jedno z možných uspořádání domovské obrazovky.
|
||||
settings-home-list-layout-grid = Mřížka
|
||||
settings-home-list-layout-table = Tabulka
|
||||
|
||||
## Tracking Checlist
|
||||
|
||||
settings-tracking_checklist-active_steps = Aktivní kroky
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
@@ -784,6 +839,7 @@ onboarding-setup_warning-cancel = Pokračovat v nastavení
|
||||
## Wi-Fi setup
|
||||
|
||||
onboarding-wifi_creds-back = Zpět na úvod
|
||||
onboarding-wifi_creds-v2 = Trackey používající Wi-Fi
|
||||
onboarding-wifi_creds-skip = Přeskočit nastavení Wi-Fi
|
||||
onboarding-wifi_creds-submit = Odeslat!
|
||||
onboarding-wifi_creds-ssid =
|
||||
@@ -793,6 +849,8 @@ onboarding-wifi_creds-ssid-required = Je vyžadován název sítě Wi-Fi
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Heslo
|
||||
.placeholder = Zadejte heslo
|
||||
onboarding-wifi_creds-dongle-title = Trackery používající dongle
|
||||
onboarding-wifi_creds-dongle-continue = Pokračovat s donglem
|
||||
|
||||
## Mounting setup
|
||||
|
||||
@@ -814,7 +872,7 @@ onboarding-reset_tutorial-1 =
|
||||
|
||||
## Setup start
|
||||
|
||||
onboarding-home = Vítejte k SlimeVR
|
||||
onboarding-home = Vítejte ve SlimeVR
|
||||
onboarding-home-start = Pusťme se do toho!
|
||||
|
||||
## Setup done
|
||||
@@ -885,6 +943,7 @@ onboarding-assignment_tutorial-done = Nachystal jsem samolepky a pásky!
|
||||
onboarding-assign_trackers-back = Zpět na přihlašovací údaje Wi-Fi
|
||||
onboarding-assign_trackers-title = Přiřazení trackerů
|
||||
onboarding-assign_trackers-description = Vyberte, na jakou končetinu každý tracker patří. Klikněte na místo, kam chcete umístit tracker
|
||||
onboarding-assign_trackers-unassign_all = Zrušit přiřazení všech trackerů
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
@@ -932,7 +991,7 @@ onboarding-assign_trackers-warning-LEFT_FOOT =
|
||||
|
||||
## Tracker mounting method choose
|
||||
|
||||
onboarding-choose_mounting = Jakou metodu nasazení trackerů použít?
|
||||
onboarding-choose_mounting = Jakou metodu nasazení trackerů chcete použít?
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-description = Správná orientace nasazení zajistí přesné sledování trackerů na těle.
|
||||
onboarding-choose_mounting-auto_mounting = Automatická detekce nasazení
|
||||
@@ -975,12 +1034,15 @@ onboarding-automatic_mounting-mounting_reset-step-0 = 1. Dřepněte si, jako př
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Stiskněte tlačítko "Resetovat nasazení trackerů" a vyčkejte 3 sekundy. Orientace nasazení trackerů se nastaví na základní hodnoty.
|
||||
onboarding-automatic_mounting-preparation-title = Příprava
|
||||
onboarding-automatic_mounting-preparation-v2-step-0 = 1. Stiskněte tlačítko pro "Plný Reset"
|
||||
onboarding-automatic_mounting-preparation-v2-step-2 = 3. Zůstaňte v pozici, dokud 3s časovač neskončí.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = Nasaďte si trackery
|
||||
onboarding-automatic_mounting-put_trackers_on-description = Pro kalibraci směru nasazení použijeme právě přiřazené trackery. Nasaďte si prosím všechny trackery. Můžete zkontrolovat jejich umístění na obrázku vpravo.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = Mám nasazené všechny trackery
|
||||
onboarding-automatic_mounting-return-home = Hotovo
|
||||
|
||||
## Tracker manual proportions setupa
|
||||
|
||||
onboarding-manual_proportions-back-scaled = Jít zpět na Škálování Proporcí
|
||||
onboarding-manual_proportions-title = Manuální proporce těla
|
||||
onboarding-manual_proportions-fine_tuning_button = Automatické jemné doladění proporcí
|
||||
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = Pro použití automatického jemného lazení, prosím připojte VR headset
|
||||
@@ -1081,27 +1143,57 @@ onboarding-automatic_proportions-smol_warning-cancel = Jít zpět
|
||||
|
||||
## User height calibration
|
||||
|
||||
onboarding-user_height-title = Jaká je vaše výška?
|
||||
onboarding-user_height-calculate = Vypočítejte mou výšku automaticky
|
||||
onboarding-user_height-next_step = Uložit a pokračovat
|
||||
onboarding-user_height-manual-proportions = Manuální Proporce
|
||||
onboarding-user_height-calibration-title = Průběh kalibrace
|
||||
onboarding-user_height-calibration-WAITING_FOR_RISE = Postavte se zpátky
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = Ujistěte se, že je vaše hlava ve vodorovné pozici
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = Nedívejte se na podlahu
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = Nedívej se příliš vysoko
|
||||
onboarding-user_height-calibration-RECORDING_HEIGHT = Znovu se postavte a nehýbejte se!
|
||||
onboarding-user_height-calibration-DONE = Úspěch!
|
||||
onboarding-user_height-calibration-ERROR_TIMEOUT = Časový limit kalibrace vypršel, zkuste to znovu.
|
||||
onboarding-user_height-calibration-error = Kalibrace selhala
|
||||
|
||||
## Stay Aligned setup
|
||||
|
||||
onboarding-stay_aligned-title = Zůstaň Srovaný!
|
||||
onboarding-stay_aligned-description = Nakonfigurujte Zustaň Srovnaný, aby byly vaše trackery srovnáný.
|
||||
onboarding-stay_aligned-title = Zůstaň Srovnaný!
|
||||
onboarding-stay_aligned-description = Nakonfigurujte Zůstaň Srovnaný, aby byly vaše trackery srovnány.
|
||||
onboarding-stay_aligned-put_trackers_on-title = Nasaďte si trackery
|
||||
onboarding-stay_aligned-put_trackers_on-trackers_warning = Aktuálně máte méně než 5 připojených a přiřazených trackerů! Toto je minimální počet trackerů potřebné pro správné fungování funkce Zůstaň Srovnaný.
|
||||
onboarding-stay_aligned-put_trackers_on-next = Mám nasazené všechny trackery
|
||||
onboarding-stay_aligned-verify_mounting-title = Zkotrolujte nasazení
|
||||
onboarding-stay_aligned-verify_mounting-step-0 = Zůstaň Srovnaný vyžaduje dobré nasazení. V opačném případě nebudete mít nejlepší zážitek s Zůstaň Srovnaný.
|
||||
onboarding-stay_aligned-verify_mounting-step-1 = 1. Pohybujte se ve stoje.
|
||||
onboarding-stay_aligned-verify_mounting-step-2 = 2. Posaďte se a pohybujte nohama a chodidly.
|
||||
onboarding-stay_aligned-verify_mounting-redo_mounting = Předělat kalibraci nasazení
|
||||
onboarding-stay_aligned-preparation-title = Příprava
|
||||
onboarding-stay_aligned-preparation-tip = Ujistěte se, že stojíte vzpřímeně. koukáte vpřed a máte ruce podél těla.
|
||||
onboarding-stay_aligned-relaxed_poses-standing-title = Uvolněná pozice ve stoje
|
||||
onboarding-stay_aligned-relaxed_poses-standing-step-0 = 1. Stůjte v pohodlné pozici. Relaxujte!
|
||||
onboarding-stay_aligned-relaxed_poses-standing-step-1-v2 = 2. Zmáčkněte tlačítko "Uložit pózu"
|
||||
onboarding-stay_aligned-relaxed_poses-sitting-title = Uvolněná póza při sezení v židli
|
||||
onboarding-stay_aligned-relaxed_poses-sitting-step-0 = 1. Posaďte se do pohodlné pozice, Relaxujte!
|
||||
onboarding-stay_aligned-relaxed_poses-sitting-step-1-v2 = 2. Zmáčkněte tlačítko "Uložit pózu"
|
||||
onboarding-stay_aligned-relaxed_poses-flat-title = Uvolněná pozice při sezení na zemi
|
||||
onboarding-stay_aligned-relaxed_poses-flat-step-1-v2 = 2. Zmáčkněte tlačítko "Uložit pózu"
|
||||
onboarding-stay_aligned-relaxed_poses-skip_step = Přeskočit
|
||||
onboarding-stay_aligned-done-title = Zustaň Srovnaný zapnuto!
|
||||
onboarding-stay_aligned-done-title = Zůstaň Srovnaný zapnuto!
|
||||
onboarding-stay_aligned-done-description = Váš nastavení Zůstaň Srovnaný je dokončeno!
|
||||
onboarding-stay_aligned-done-description-2 = Vaše nastavení je dokončeno! Pokud chcete vaše pózy znovu zkalibrovat, můžete proces zopakovat.
|
||||
onboarding-stay_aligned-previous_step = Předchozí
|
||||
onboarding-stay_aligned-next_step = Další
|
||||
onboarding-stay_aligned-restart = Restart
|
||||
onboarding-stay_aligned-done = Hotovo
|
||||
onboarding-stay_aligned-manual_mounting-done = Hotovo
|
||||
|
||||
## Home
|
||||
|
||||
home-no_trackers = Nebyly zjištěny ani přiřazeny žádné trackery
|
||||
home-settings = Nastavení domovské stránky
|
||||
home-settings-close = Zavřít
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
@@ -1137,8 +1229,28 @@ firmware_tool = Nástroj pro DIY firmwere
|
||||
firmware_tool-description = Umožní vám konfigurovat a flashovat vaše DIY trackery
|
||||
firmware_tool-not_available = Jejda, nástroj pro firmware není v momentální chvíli k dispozici, Vraťte se později!
|
||||
firmware_tool-not_compatible = Nástroj pro firmware není kompatibilní s touhle verzí serveru. Aktualizujte prosím svůj server.
|
||||
firmware_tool-select_source = Vyberte firmware k flashování
|
||||
firmware_tool-select_source-error = Nelze načíst Zdroje
|
||||
firmware_tool-select_source-board_type = Typ desky
|
||||
firmware_tool-select_source-firmware = Zdrojový kód firmwaru
|
||||
firmware_tool-select_source-version = Verze firmwaru
|
||||
firmware_tool-select_source-official = Oficiální
|
||||
firmware_tool-select_source-dev = Vývojářské
|
||||
firmware_tool-select_source-not_selected = Nebyl vybrán žádný zdroj
|
||||
firmware_tool-board_defaults = Nekonfigurujte vaší desku
|
||||
firmware_tool-board_defaults-add = Přidat
|
||||
firmware_tool-board_defaults-reset = Restartovat do výchozího nastavení
|
||||
firmware_tool-board_defaults-error-required = Povinné pole
|
||||
firmware_tool-board_defaults-error-format = Neplatný formát
|
||||
firmware_tool-board_defaults-error-format-number = Není číslo
|
||||
firmware_tool-flash_method_step = Metoda flashování
|
||||
firmware_tool-flash_method_step-description = Prosím zvolte metodu flashování, kterou chcete použít
|
||||
firmware_tool-flash_method_step-ota-v2 =
|
||||
.label = Wi-Fi
|
||||
.description = Použijte "wireless" metodu. Vaše trackery budou používát Wi-Fi pro aktualizování jejich firmweru. Funguje pouze u trackerů, které již byly nastaveny.
|
||||
firmware_tool-flash_method_step-serial-v2 =
|
||||
.label = USB
|
||||
.description = Použíjte USB kabel k aktualizování vaších trackerů
|
||||
firmware_tool-flashbtn_step = Stiskněte tlačítko bootu btn
|
||||
firmware_tool-flashbtn_step-description = Než přejdeme na další krok, je tady pár věcí které musíte udělat
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR = Vypněte tracker, vyndejte z obalu (jestli v nějakém je), Připojte USB kabel k tomuto počítači a poté následujte jeden z kroků revize odpovídající k vaší verzi desky trackeru SlimeVR:
|
||||
@@ -1147,8 +1259,10 @@ firmware_tool-flashbtn_step-board_OTHER =
|
||||
Ve většině případů to znamená stisknutí boot tlačítka na desce trakeru před tím než začne proces flashování.
|
||||
Pokud procesu flashování vyprší čas hned na začátku flashování, to nejspíš znamená že tracker nebyl v řežimu bootloaderu
|
||||
Podívejte se prosím na instrukce procesu flashování pro desku vašeho zařízení, aby jste zjistili jak se dostat do režimu bootloaderu
|
||||
firmware_tool-flash_method_ota-title = Flashování přes Wi-Fi
|
||||
firmware_tool-flash_method_ota-devices = Byla detekována zařízení s OTA:
|
||||
firmware_tool-flash_method_ota-no_devices = Nebyly nalezeny žádné zákadní desky které by mohly být aktualizované pomocí OTA, prosím ujistěte se že jste zvolily správný typ základní desky
|
||||
firmware_tool-flash_method_serial-title = Flashování přes USB
|
||||
firmware_tool-flash_method_serial-wifi = Přihlašovací údaje Wi-Fi:
|
||||
firmware_tool-flash_method_serial-devices-label = Detekována Sériová Zařízení:
|
||||
firmware_tool-flash_method_serial-devices-placeholder = Vyberte sériové zařízení
|
||||
@@ -1157,12 +1271,16 @@ firmware_tool-build_step = Sestavování
|
||||
firmware_tool-build_step-description = Firmwere se sestavuje, čekejte prosím
|
||||
firmware_tool-flashing_step = Flashování
|
||||
firmware_tool-flashing_step-description = Probíhá flashování vašich trackerů, prosím postupujte dle instrukcí na obrazovce
|
||||
firmware_tool-flashing_step-warning-v2 = Během procesu nahrávání prosíme NEVYPÍNEJTE ani NEODPOJUJTE vaše trackery pokud k tomu nejste vyzváni, učiněním můžete způsobit že deska trackeru se stane nefunkční.
|
||||
firmware_tool-flashing_step-flash_more = Flashnout více trackerů
|
||||
firmware_tool-flashing_step-exit = Odejít
|
||||
|
||||
## firmware tool build status
|
||||
|
||||
firmware_tool-build-QUEUED = Čekání na sestavení...
|
||||
firmware_tool-build-CREATING_BUILD_FOLDER = Vytváření složky pro sestavení
|
||||
firmware_tool-build-DOWNLOADING_SOURCE = Stahování zdrojového kódu
|
||||
firmware_tool-build-EXTRACTING_SOURCE = Extrahování zdrojového kódu
|
||||
firmware_tool-build-BUILDING = Sestavování firmweru
|
||||
firmware_tool-build-SAVING = Ukládání sestavení
|
||||
firmware_tool-build-DONE = Sestavení dokončeno
|
||||
@@ -1171,6 +1289,7 @@ firmware_tool-build-ERROR = Nepodařilo se sestavit firmwere
|
||||
## Firmware update status
|
||||
|
||||
firmware_update-status-DOWNLOADING = Stahování firmwaru
|
||||
firmware_update-status-NEED_MANUAL_REBOOT-v2 = Vypněte a znovu zapněte tracker prosím
|
||||
firmware_update-status-AUTHENTICATING = Autentifikování s mcu
|
||||
firmware_update-status-UPLOADING = Nahrávání firmwaru
|
||||
firmware_update-status-SYNCING_WITH_MCU = Synchronizace s MCU
|
||||
@@ -1195,7 +1314,7 @@ firmware_update-no_devices = Prosím ujistěte se, že tracker který chcete akt
|
||||
firmware_update-changelog-title = Aktualizování na { $version }
|
||||
firmware_update-looking_for_devices = Hledání zařízení pro aktualizaci
|
||||
firmware_update-retry = Opakovat
|
||||
firmware_update-update = Aktualizovat Zvolený/é Tracker/y
|
||||
firmware_update-update = Aktualizovat Zvolené Trackery
|
||||
firmware_update-exit = Odejít
|
||||
|
||||
## Tray Menu
|
||||
@@ -1225,10 +1344,15 @@ unknown_device-modal-description =
|
||||
Chcete jej připojit k SlimeVR?
|
||||
unknown_device-modal-confirm = Jasně!
|
||||
unknown_device-modal-forget = Ignoruj
|
||||
# VRChat config warnings
|
||||
vrc_config-page-title = Varování VRChat konfigurace
|
||||
vrc_config-page-desc = Tato stránka slouží k zobrazení vašeho aktuálního stavu nastavení ve VRChat. přesněji, nástavní které jsou nekompatibilní s SlimeVR. Je silně doporučeno poupravit všechny chybné nastavení které jsou zde zobrazeny pro nejlepší zážitek s SlimeVR.
|
||||
vrc_config-page-help = Nemůžete najít specifické nastavení?
|
||||
vrc_config-page-help-desc = Podívejte se na naší <a>dokumentaci k tomuto tématu!</a>
|
||||
vrc_config-page-big_menu = Sledování & IK (Velké Menu)
|
||||
vrc_config-page-big_menu-desc = Nastavení souvicející s IK ve velké nabídce nastavení
|
||||
vrc_config-page-wrist_menu = Sledování & IK (Zápěstní menu)
|
||||
vrc_config-page-wrist_menu-desc = Nastavení související s IK najdete v malém (zápěstním) menu
|
||||
vrc_config-on = Zapnuto
|
||||
vrc_config-off = Vypnuto
|
||||
vrc_config-invalid = Máte špatně nakonfigurované VRChat nastavení!
|
||||
@@ -1241,6 +1365,7 @@ vrc_config-mute-btn = Ztlumení
|
||||
vrc_config-unmute-btn = Zrušit ztlumení
|
||||
vrc_config-legacy_mode = Použít starší řešení IK
|
||||
vrc_config-disable_shoulder_tracking = Vypnout sledování ramen
|
||||
vrc_config-shoulder_width_compensation = Kompenzace Šířky Ramen
|
||||
vrc_config-spine_mode = Režim páteře FTB
|
||||
vrc_config-tracker_model = Model FBT trackeru
|
||||
vrc_config-avatar_measurement_type = Meření avataru
|
||||
@@ -1272,3 +1397,28 @@ error_collection_modal-cancel = Nesouhlasím
|
||||
|
||||
## Tracking checklist section
|
||||
|
||||
tracking_checklist-settings-close = Zavřít
|
||||
tracking_checklist-status-incomplete = Nejste připraveni používat SlimeVR!
|
||||
tracking_checklist-status-complete = Jste připravení k použití SlimeVR
|
||||
tracking_checklist-FULL_RESET = Proveďte plné obnovení
|
||||
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR není zapnut
|
||||
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR není zapnut. Používáte ho pro VR?
|
||||
tracking_checklist-STEAMVR_DISCONNECTED-open = Spusťte SteamVR
|
||||
tracking_checklist-TRACKERS_REST_CALIBRATION = Kalibrujte vaše trackery
|
||||
tracking_checklist-TRACKER_ERROR = Trackery s chybami
|
||||
tracking_checklist-VRCHAT_SETTINGS = Nakonfigurujte nastavení VRChat
|
||||
tracking_checklist-VRCHAT_SETTINGS-open = Přejít k varování ve VRChat
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC = Změňte profil sítě
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = Otevřete Ovládací Panel
|
||||
tracking_checklist-STAY_ALIGNED_CONFIGURED = Nakonfigurujte Zůstaň Srovnaný
|
||||
tracking_checklist-ignore = Ignorovat
|
||||
preview-mocap_mode_soon = Režim Mocap (brzy™)
|
||||
preview-disable_render = Vypnout vykreslování
|
||||
preview-disabled_render = Vykreslování vypnuto
|
||||
toolbar-mounting_calibration = Kalibrace nasazení
|
||||
toolbar-mounting_calibration-default = Tělo
|
||||
toolbar-mounting_calibration-feet = Chodidla
|
||||
toolbar-mounting_calibration-fingers = Prsty
|
||||
toolbar-drift_reset = Restartování driftu
|
||||
toolbar-assigned_trackers = { $count } trackery/ů přiřazeno
|
||||
toolbar-unassigned_trackers = { $count } trackey/ů nepřiřazeno
|
||||
|
||||
@@ -115,6 +115,11 @@ board_type-XIAO_ESP32C3 = Seeed Studio XIAO ESP32C3
|
||||
board_type-HARITORA = Haritora
|
||||
board_type-ESP32C6DEVKITC1 = Espressif ESP32-C6 DevKitC-1
|
||||
board_type-GLOVE_IMU_SLIMEVR_DEV = SlimeVR Dev-IMU-Handschuh
|
||||
board_type-GESTURES = Gesten
|
||||
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
|
||||
board_type-GENERIC_NRF = Generisches nRF
|
||||
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
|
||||
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
|
||||
|
||||
## Proportions
|
||||
|
||||
@@ -180,6 +185,8 @@ reset-mounting-fingers = Fingerkalibrierung
|
||||
reset-yaw = Horizontaler Reset
|
||||
reset-error-no_feet_tracker = Kein Fußtracker zugewiesen
|
||||
reset-error-no_fingers_tracker = Kein Fingertracker zugewiesen
|
||||
reset-error-mounting-need_full_reset = Ein vollständiger Reset ist vor der Tracker-Ausrichtung erforderlich.
|
||||
reset-error-yaw-need_full_reset = Für den Yaw-Reset ist ein vollständiger Reset erforderlich.
|
||||
|
||||
## Serial detection stuff
|
||||
|
||||
@@ -199,6 +206,7 @@ navbar-trackers_assign = Tracker-Zuordnung
|
||||
navbar-mounting = Tracker-Ausrichtung
|
||||
navbar-onboarding = Einrichtungs-Assistent
|
||||
navbar-settings = Einstellungen
|
||||
navbar-connect_trackers = Tracker verbinden
|
||||
|
||||
## Biovision hierarchy recording
|
||||
|
||||
@@ -269,6 +277,7 @@ tracker-table-column-name = Name
|
||||
tracker-table-column-type = Typ
|
||||
tracker-table-column-battery = Batterie
|
||||
tracker-table-column-ping = Latenz
|
||||
tracker-table-column-packet_loss = Paketverlust
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = Temp. °C
|
||||
tracker-table-column-linear-acceleration = Beschleunigung X/Y/Z
|
||||
@@ -310,6 +319,9 @@ tracker-infos-magnetometer-status-v1 =
|
||||
[ENABLED] Angeschalten
|
||||
*[NOT_SUPPORTED] Nicht unterstützt
|
||||
}
|
||||
tracker-infos-packet_loss = Paketverlust
|
||||
tracker-infos-packets_lost = Pakete verloren
|
||||
tracker-infos-packets_received = Pakete empfangen
|
||||
|
||||
## Tracker settings
|
||||
|
||||
@@ -347,6 +359,9 @@ tracker-settings-update-up_to_date = Auf dem neusten Stand
|
||||
tracker-settings-update-blocked = Update nicht verfügbar. Weitere Veröffentlichungen sind nicht verfügbar.
|
||||
tracker-settings-update = Jetzt aktualisieren
|
||||
tracker-settings-update-title = Firmware-Version
|
||||
tracker-settings-current-version = Aktuelle
|
||||
tracker-settings-latest-version = Aktuelleste
|
||||
tracker-settings-build-date = Herstellungsdatum
|
||||
|
||||
## Tracker part card info
|
||||
|
||||
@@ -511,14 +526,19 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
|
||||
Verwendet das Magnetometer auf allen Trackern, die über eine kompatible Firmware verfügen, um den Drift in stabilen magnetischen Umgebungen zu reduzieren.
|
||||
Kann pro Tracker in den Einstellungen des Trackers deaktiviert werden. <b>Bitte schalten Sie keinen der Tracker aus, während Sie dies umschalten!</b>
|
||||
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = Magnetometer auf Trackern verwenden
|
||||
settings-general-tracker_mechanics-trackers_over_usb = Tracker über USB
|
||||
settings-general-tracker_mechanics-trackers_over_usb-enabled-label = Erlaube HID-Tracker eine USB-Direktverbindung
|
||||
settings-stay_aligned = Stay Aligned
|
||||
settings-stay_aligned-description = Stay Aligned reduziert Drift, indem es deine Tracker schrittweise an deine entspannten Posen anpasst.
|
||||
settings-stay_aligned-setup-label = Stay Aligned einrichten
|
||||
settings-stay_aligned-setup-description = Sie müssen Stay Aligned einrichten, um es zu aktivieren.
|
||||
settings-stay_aligned-warnings-drift_compensation = ⚠ Bitte schalten Sie die Driftkompensation aus! Diese steht in Konflikt mit Stay Aligned.
|
||||
settings-stay_aligned-enabled-label = Tracker anpassen
|
||||
settings-stay_aligned-hide_yaw_correction-label = Anpassung ausblenden (zum Vergleich ohne Stay Aligned)
|
||||
settings-stay_aligned-general-label = Allgemein
|
||||
settings-stay_aligned-relaxed_poses-label = Entspannte Posen
|
||||
settings-stay_aligned-relaxed_poses-standing = Tracker im Stehen anpassen
|
||||
settings-stay_aligned-relaxed_poses-sitting = Tracker anpassen, während du auf einem Stuhl sitzt
|
||||
settings-stay_aligned-relaxed_poses-save_pose = Pose speichern
|
||||
settings-stay_aligned-relaxed_poses-reset_pose = Pose zurücksetzen
|
||||
settings-stay_aligned-relaxed_poses-close = Schließen
|
||||
@@ -546,6 +566,8 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = Bodenclip kann d
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = Zehen-Ausrichtung versucht, die Rotation Ihrer Füße zu erraten, wenn keine Fuß-Tracker verwendet werden.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = Fußkorrektur richtet Ihre Füße parallel zum Boden aus, wenn sie den Boden berühren.
|
||||
settings-general-fk_settings-leg_fk = Beintracking
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description-v1 = Erzwinge Fußausrichtungs-Kalibrierung während der Körperausrichtungs-Kalibrierung.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-v1 = Fuß-Ausrichtung kalibrieren
|
||||
settings-general-fk_settings-enforce_joint_constraints = Gelenkgrenzen
|
||||
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints = Grenzen erzwingen
|
||||
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints-description = Verhindert, dass sich Gelenke über ihre Grenzen hinaus drehen
|
||||
@@ -845,10 +867,12 @@ settings-utils-advanced-open_logs-label = Ordner öffnen
|
||||
|
||||
settings-home-list-layout = Layout der Tracker-Liste
|
||||
settings-home-list-layout-desc = Wählen Sie eines der möglichen Startbildschirm-Layouts aus
|
||||
settings-home-list-layout-grid = Raster
|
||||
settings-home-list-layout-table = Tabelle
|
||||
|
||||
## Tracking Checlist
|
||||
|
||||
settings-tracking_checklist-active_steps = Aktive Schritte
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
@@ -863,6 +887,7 @@ onboarding-setup_warning-cancel = Einrichtung fortsetzen
|
||||
## Wi-Fi setup
|
||||
|
||||
onboarding-wifi_creds-back = Zurück zur Einführung
|
||||
onboarding-wifi_creds-v2 = Tracker mit WLAN
|
||||
onboarding-wifi_creds-skip = WLAN-Zugangsdaten überspringen
|
||||
onboarding-wifi_creds-submit = Weiter!
|
||||
onboarding-wifi_creds-ssid =
|
||||
@@ -872,6 +897,8 @@ onboarding-wifi_creds-ssid-required = WLAN-Name ist erforderlich
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Passwort
|
||||
.placeholder = Passwort eingeben
|
||||
onboarding-wifi_creds-dongle-title = Tracker mit einem Dongle
|
||||
onboarding-wifi_creds-dongle-continue = Fahre mit einem Dongle fort
|
||||
|
||||
## Mounting setup
|
||||
|
||||
@@ -970,6 +997,7 @@ onboarding-assignment_tutorial-done = Ich habe Aufkleber und Bänder angebracht!
|
||||
onboarding-assign_trackers-back = Zurück zu den WLAN-Zugangsdaten
|
||||
onboarding-assign_trackers-title = Tracker zuweisen
|
||||
onboarding-assign_trackers-description = Wählen Sie nun aus, welcher Tracker wo befestigt ist. Klicken Sie auf einen Ort, an dem der Tracker platziert ist.
|
||||
onboarding-assign_trackers-unassign_all = Alle Trackerzuweisungen aufheben
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
@@ -1115,6 +1143,9 @@ onboarding-automatic_mounting-mounting_reset-title = Befestigungs-Reset
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Beugen Sie sich in die "Skifahren"-Pose mit gebeugten Beinen, geneigtem Oberkörper und gebeugten Armen.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Drücken Sie die Schaltfläche "Befestigungs-Reset" und warten Sie 3 Sekunden, bevor die Drehungen der Tracker gesetzt werden.
|
||||
onboarding-automatic_mounting-preparation-title = Vorbereitung
|
||||
onboarding-automatic_mounting-preparation-v2-step-0 = 1. Drücke den Knopf "Kompletter Reset".
|
||||
onboarding-automatic_mounting-preparation-v2-step-1 = 2. Stehe aufrecht mit den Armen an den Seiten. Schaue unbedingt nach vorne.
|
||||
onboarding-automatic_mounting-preparation-v2-step-2 = 3. Halte die Position, bis 3 Sekunden abgelaufen sind.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = Legen Sie Ihre Tracker an
|
||||
onboarding-automatic_mounting-put_trackers_on-description = Um die Drehung der Tracker zu kalibrieren, werden die Tracker verwendet, welche Sie gerade zugewiesen haben. Ziehen Sie alle Ihre Tracker an, in der Abbildung rechts können sie sehen um welchen Tracker es sich handelt.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = Ich habe alle meine Tracker angelegt
|
||||
@@ -1128,6 +1159,7 @@ onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = Bitte schlie
|
||||
onboarding-manual_proportions-export = Proportionen exportieren
|
||||
onboarding-manual_proportions-import = Proportionen importieren
|
||||
onboarding-manual_proportions-file_type = Körperproportions-Datei
|
||||
onboarding-manual_proportions-grouped_proportions = Gruppierte Proportionen
|
||||
onboarding-manual_proportions-all_proportions = Alle Proportionen
|
||||
onboarding-manual_proportions-estimated_height = Geschätzte Benutzergröße
|
||||
|
||||
@@ -1216,10 +1248,26 @@ onboarding-automatic_proportions-smol_warning-cancel = Zurück
|
||||
|
||||
## User height calibration
|
||||
|
||||
onboarding-user_height-title = Wie groß bist du?
|
||||
onboarding-user_height-description = Wir brauchen deine Größe, um deine Körperproportionen zu berechnen und deine Bewegungen genau darzustellen. Du kannst dies entweder SlimeVR berechnen lassen oder deine Höhe manuell eingeben.
|
||||
onboarding-user_height-calculate = Berechne meine Körpergröße automatisch
|
||||
onboarding-user_height-next_step = Fortfahren und speichern
|
||||
onboarding-user_height-manual-proportions = Manuelle Körperproportionen
|
||||
onboarding-user_height-calibration-title = Kalibrierungsfortschritt
|
||||
onboarding-user_height-calibration-WAITING_FOR_RISE = Steh wieder auf
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK = Steh wieder auf und schau nach vorne
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = Achte darauf, dass dein Kopf waagerecht ist
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = Schauen sie nicht auf den Boden
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = Schauen sie nicht zu hoch nach oben
|
||||
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = Achten sie darauf, dass der Controller nach unten zeigt
|
||||
onboarding-user_height-calibration-RECORDING_HEIGHT = Steh wieder auf und steh still!
|
||||
onboarding-user_height-calibration-DONE = Erfolg!
|
||||
onboarding-user_height-calibration-ERROR_TIMEOUT = Die Kalibrierung ist abgelaufen, versuche es nochmal.
|
||||
onboarding-user_height-calibration-ERROR_TOO_HIGH = Die erkannte Benutzerhöhe ist zu hoch, versuche es erneut.
|
||||
onboarding-user_height-calibration-error = Kalibrierung fehlgeschlagen
|
||||
onboarding-user_height-reset-warning =
|
||||
<b>Achtung:</b> Die Proportionen werden zurückgesetzt und auf Basis deiner Körpergröße neu berechnet.
|
||||
Bist du dir sicher?
|
||||
|
||||
## Stay Aligned setup
|
||||
|
||||
@@ -1230,20 +1278,34 @@ onboarding-stay_aligned-put_trackers_on-description = Um Ihre Ruheposen zu speic
|
||||
onboarding-stay_aligned-put_trackers_on-trackers_warning = Sie haben derzeit weniger als 5 Tracker verbunden und zugewiesen! Dies ist die Mindestanzahl an Trackern, die erforderlich sind, damit Stay Aligned richtig funktioniert.
|
||||
onboarding-stay_aligned-put_trackers_on-next = Ich habe alle meine Tracker angelegt
|
||||
onboarding-stay_aligned-verify_mounting-title = Tracker-Ausrichtung
|
||||
onboarding-stay_aligned-verify_mounting-step-1 = 1. Bewege dich im Stehen.
|
||||
onboarding-stay_aligned-verify_mounting-step-2 = 2. Setz dich hin und bewege deine Beine und Füße.
|
||||
onboarding-stay_aligned-verify_mounting-step-3 = 3. Wenn deine Tracker nicht an der richtigen Stelle sind, drücke "Ausrichtungskalibrierung wiederholen".
|
||||
onboarding-stay_aligned-verify_mounting-redo_mounting = Tracker-Ausrichtungskalibrierung wiederholen
|
||||
onboarding-stay_aligned-preparation-title = Vorbereitung
|
||||
onboarding-stay_aligned-preparation-tip = Achten Sie darauf, aufrecht zu stehen. Schauen Sie nach vorne und lassen Sie die Arme an den Seiten hängen.
|
||||
onboarding-stay_aligned-relaxed_poses-standing-title = Entspannte Stehpose
|
||||
onboarding-stay_aligned-relaxed_poses-standing-step-0 = 1. Nehmen Sie eine bequeme Haltung ein. Entspannen Sie sich!
|
||||
onboarding-stay_aligned-relaxed_poses-standing-step-1-v2 = 2. Drücken Sie die Taste „Pose speichern“.
|
||||
onboarding-stay_aligned-relaxed_poses-sitting-title = Entspannte Im-Stuhl-sitzen-Pose
|
||||
onboarding-stay_aligned-relaxed_poses-sitting-step-0 = 1. Nehme eine bequeme Haltung ein. Entspanne dich!
|
||||
onboarding-stay_aligned-relaxed_poses-sitting-step-1-v2 = 2. Drücke die Taste „Pose speichern“.
|
||||
onboarding-stay_aligned-relaxed_poses-flat-title = Entspannte Sitzposition auf dem Boden
|
||||
onboarding-stay_aligned-relaxed_poses-flat-step-0 = 1. Setz dich mit den Beinen nach vorne auf den Boden. Entspann dich!
|
||||
onboarding-stay_aligned-relaxed_poses-flat-step-1-v2 = 2. Drücke die Taste „Pose speichern“.
|
||||
onboarding-stay_aligned-relaxed_poses-skip_step = Überspringen
|
||||
onboarding-stay_aligned-done-title = Stay aligned aktiviert!
|
||||
onboarding-stay_aligned-done-description = Dein Stay Aligned-Setup ist komplett!
|
||||
onboarding-stay_aligned-previous_step = Zurück
|
||||
onboarding-stay_aligned-next_step = Weiter
|
||||
onboarding-stay_aligned-restart = Neu starten
|
||||
onboarding-stay_aligned-done = Fertig
|
||||
onboarding-stay_aligned-manual_mounting-done = Fertig
|
||||
|
||||
## Home
|
||||
|
||||
home-no_trackers = Keine Tracker erkannt oder zugewiesen
|
||||
home-settings = Startseiten-Einstellungen
|
||||
home-settings-close = Schließen
|
||||
|
||||
## Trackers Still On notification
|
||||
@@ -1280,12 +1342,19 @@ firmware_tool = DIY Firmware-Tool
|
||||
firmware_tool-description = Erlaubt ihnen das Konfigurieren und Flashen von DIY Trackern
|
||||
firmware_tool-not_available = Das Firmware Tool ist im Moment nicht verfügbar. Versuche sie später erneut!
|
||||
firmware_tool-not_compatible = Das Firmware Tool ist nicht mit dieser Version des Servers kompatibel. Bitte den Server aktualisieren!
|
||||
firmware_tool-select_source = Wähle die Firmware zum Flashen aus
|
||||
firmware_tool-select_source-description = Wähle die Firmware aus, die du auf deinem Board flashen möchtest
|
||||
firmware_tool-select_source-error = Quellen konnten nicht geladen werden
|
||||
firmware_tool-select_source-board_type = Boardtyp
|
||||
firmware_tool-select_source-firmware = Firmware-Quelle
|
||||
firmware_tool-select_source-version = Firmware-Version
|
||||
firmware_tool-select_source-official = Offiziell
|
||||
firmware_tool-select_source-dev = Dev
|
||||
firmware_tool-select_source-not_selected = Keine Quelle ausgewählt
|
||||
firmware_tool-select_source-no_boards = Keine verfügbaren Boards für diese Quelle
|
||||
firmware_tool-select_source-no_versions = Keine verfügbaren Versionen für diese Quelle
|
||||
firmware_tool-board_defaults = Konfigurieren Sie Ihr Board
|
||||
firmware_tool-board_defaults-description = Stelle die Pins oder Einstellungen relativ zu deiner Hardware ein
|
||||
firmware_tool-board_defaults-add = Hinzufügen
|
||||
firmware_tool-board_defaults-reset = Auf Standard zurücksetzen
|
||||
firmware_tool-board_defaults-error-required = Erforderliches Feld
|
||||
@@ -1398,7 +1467,12 @@ unknown_device-modal-forget = Ignorieren
|
||||
# VRChat config warnings
|
||||
vrc_config-page-title = VRChat Konfigurations-Warnungen
|
||||
vrc_config-page-desc = Diese Seite zeigt den Zustand deiner VRChat-Einstellungen und zeigt, welche Einstellungen mit SlimeVR inkompatibel sind. Es wird dringend empfohlen, alle hier angezeigten Warnungen zu beheben, um das beste Nutzererlebnis mit SlimeVR zu gewährleisten.
|
||||
vrc_config-page-help = Kannst du die Einstellungen nicht finden?
|
||||
vrc_config-page-help-desc = Schauen Sie sich unsere <a>Dokumentation zu diesem Thema</a> an!
|
||||
vrc_config-page-big_menu = Tracking & IK (Großes Menü)
|
||||
vrc_config-page-big_menu-desc = Einstellungen im Zusammenhang mit IK im großen Einstellungsmenü
|
||||
vrc_config-page-wrist_menu = Tracking & IK (Handgelenkmenü)
|
||||
vrc_config-page-wrist_menu-desc = Einstellungen im Zusammenhang mit IK im kleinen Einstellungsmenü (Handgelenkmenü)
|
||||
vrc_config-on = An
|
||||
vrc_config-off = Aus
|
||||
vrc_config-invalid = Sie haben falsch konfigurierte VRChat-Einstellungen!
|
||||
@@ -1409,13 +1483,23 @@ vrc_config-current_value = Aktueller Wert
|
||||
vrc_config-mute = Warnung stummschalten
|
||||
vrc_config-mute-btn = Stummschalten
|
||||
vrc_config-unmute-btn = Stummschaltung aufheben
|
||||
vrc_config-legacy_mode = Verwende Legacy IK Solving
|
||||
vrc_config-disable_shoulder_tracking = Schultertracking deaktivieren
|
||||
vrc_config-shoulder_width_compensation = Schulterbreitenkompensation
|
||||
vrc_config-spine_mode = FBT-Wirbelsäulenmodus
|
||||
vrc_config-tracker_model = FBT-Trackermodell
|
||||
vrc_config-avatar_measurement_type = Avatar-Messung
|
||||
vrc_config-calibration_range = Kalibrierungsbereich
|
||||
vrc_config-calibration_visuals = Display-Kalibrierungsvisualisierungen
|
||||
vrc_config-user_height = Echte Benutzergröße
|
||||
vrc_config-spine_mode-UNKNOWN = Unbekannt
|
||||
vrc_config-spine_mode-LOCK_BOTH = Beide sperren
|
||||
vrc_config-spine_mode-LOCK_HEAD = Kopf sperren
|
||||
vrc_config-spine_mode-LOCK_HIP = Hüfte sperren
|
||||
vrc_config-tracker_model-UNKNOWN = Unbekannt
|
||||
vrc_config-tracker_model-AXIS = Achse
|
||||
vrc_config-tracker_model-BOX = Box
|
||||
vrc_config-tracker_model-SPHERE = Sphäre
|
||||
vrc_config-tracker_model-SYSTEM = System
|
||||
vrc_config-avatar_measurement_type-UNKNOWN = Unbekannt
|
||||
vrc_config-avatar_measurement_type-HEIGHT = Höhe
|
||||
@@ -1433,22 +1517,41 @@ error_collection_modal-cancel = Ich will nicht
|
||||
|
||||
## Tracking checklist section
|
||||
|
||||
tracking_checklist = Tracking-Checkliste
|
||||
tracking_checklist-settings = Einstellungen der Tracking-Checkliste
|
||||
tracking_checklist-settings-close = Schließen
|
||||
tracking_checklist-status-incomplete = Du bist nicht darauf vorbereitet, SlimeVR zu benutzen!
|
||||
tracking_checklist-status-partial =
|
||||
{ $count ->
|
||||
[one] Sie haben 1 Warnung!
|
||||
*[other] Sie haben { $count } Warnungen!
|
||||
}
|
||||
tracking_checklist-status-complete = Du bist bereit, SlimeVR zu nutzen!
|
||||
tracking_checklist-MOUNTING_CALIBRATION = Tracker-Ausrichtung durchführen
|
||||
tracking_checklist-FEET_MOUNTING_CALIBRATION = Führe eine Fußmontage-Kalibrierung durch
|
||||
tracking_checklist-FULL_RESET = Führe einen vollständigen Reset durch
|
||||
tracking_checklist-FULL_RESET-desc = Manche Tracker benötigen eine erneute Kalibrierung.
|
||||
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR läuft nicht
|
||||
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR läuft nicht. Nutzen sie es für VR?
|
||||
tracking_checklist-STEAMVR_DISCONNECTED-open = SteamVR starten
|
||||
tracking_checklist-TRACKERS_REST_CALIBRATION = Kalibriere deine Tracker
|
||||
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = Sie haben keine Tracker-Kalibrierung durchgeführt. Bitte lassen Sie Ihre Tracker (gelb markiert) für einige Sekunden auf einer stabilen Oberfläche ruhen.
|
||||
tracking_checklist-TRACKER_ERROR = Tracker mit Fehlern
|
||||
tracking_checklist-TRACKER_ERROR-desc = Einige deiner Tracker haben einen Fehler. Bitte starte die gelb markierten Tracker neu.
|
||||
tracking_checklist-VRCHAT_SETTINGS = VRChat-Einstellungen konfigurieren
|
||||
tracking_checklist-VRCHAT_SETTINGS-desc = Du hast die VRChat-Einstellungen falsch konfiguriert! Das kann sich negativ auf dein Tracking auswirken.
|
||||
tracking_checklist-VRCHAT_SETTINGS-open = Gehen sie zu den VRChat-Warnungen
|
||||
tracking_checklist-UNASSIGNED_HMD = VR-Headset nicht dem Kopf zugewiesen
|
||||
tracking_checklist-UNASSIGNED_HMD-desc = Das VR-Headset sollte als Kopf-Tracker zugewiesen sein.
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC = Ändere dein Netzwerkprofil
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
|
||||
{ $count ->
|
||||
[one] Dein Netzwerkprofil ist derzeit auf Öffentlich ({ $adapters }) eingestellt. Dies wird für das ordnungsgemäße Funktionieren von SlimeVR nicht empfohlen. <PublicFixLink>Hier erfährst du, wie du das beheben kannst.</PublicFixLink>
|
||||
*[other] Einige deiner Netzwerkadapter sind auf Öffentlich eingestellt:¶{ $adapters }¶Das wird nicht empfohlen, damit SlimeVR ordnungsgemäß funktioniert.¶<PublicFixLink>Hier erfährst du, wie du das beheben kannst.</PublicFixLink>
|
||||
}
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = Kontrollpanel öffnen
|
||||
tracking_checklist-STAY_ALIGNED_CONFIGURED = Stay Aligned konfigurieren
|
||||
tracking_checklist-STAY_ALIGNED_CONFIGURED-desc = Zeichne die Stay Aligned-Posen auf, um Drift zu reduzieren
|
||||
tracking_checklist-STAY_ALIGNED_CONFIGURED-open = Öffne den Stay Aligned Assistent
|
||||
tracking_checklist-ignore = Ignorieren
|
||||
preview-mocap_mode_soon = Mocap-Modus (Bald™)
|
||||
@@ -1458,5 +1561,6 @@ toolbar-mounting_calibration = Tracker-Ausrichtung
|
||||
toolbar-mounting_calibration-default = Körper
|
||||
toolbar-mounting_calibration-feet = Füße
|
||||
toolbar-mounting_calibration-fingers = Finger
|
||||
toolbar-drift_reset = Drift-Reset
|
||||
toolbar-assigned_trackers = { $count } Tracker zugewiesen
|
||||
toolbar-unassigned_trackers = { $count } Tracker nicht zugewiesen
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
websocket-connecting = Cargando...
|
||||
websocket-connection_lost = ¡El servidor falló!
|
||||
websocket-connection_lost-desc = Parece que el servidor de SlimeVR ha dejado de funcionar. Revise los registros y reinicie el programa.
|
||||
websocket-timedout = No se ha podido conectar al servidor.
|
||||
websocket-timedout = No se ha podido conectar al servidor
|
||||
websocket-timedout-desc = Parece que el servidor de SlimeVR ha dejado de funcionar o se agotó el tiempo de espera de la conexión. Revise los registros y reinicie el programa
|
||||
websocket-error-close = Salir de SlimeVR
|
||||
websocket-error-logs = Abrir la carpeta de registros
|
||||
@@ -33,6 +33,10 @@ tips-failed_webgl = Fallo al inicializar WebGL.
|
||||
|
||||
## Units
|
||||
|
||||
unit-meter = Metro
|
||||
unit-foot = Pie
|
||||
unit-inch = Pulgada
|
||||
unit-cm = cm
|
||||
|
||||
## Body parts
|
||||
|
||||
@@ -111,6 +115,11 @@ board_type-XIAO_ESP32C3 = Seeed Studio XIAO ESP32C3
|
||||
board_type-HARITORA = Haritora
|
||||
board_type-ESP32C6DEVKITC1 = Espressif ESP32-C6 DevKitC-1
|
||||
board_type-GLOVE_IMU_SLIMEVR_DEV = Guante SlimeVR Dev IMU
|
||||
board_type-GESTURES = Gestos
|
||||
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
|
||||
board_type-GENERIC_NRF = nRF Genérico
|
||||
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
|
||||
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
|
||||
|
||||
## Proportions
|
||||
|
||||
@@ -252,6 +261,10 @@ reset-mounting = Reinicio de montura
|
||||
reset-mounting-feet = Restablecer montura de los pies
|
||||
reset-mounting-fingers = Restablecer montura de los dedos
|
||||
reset-yaw = Reinicio horizontal
|
||||
reset-error-no_feet_tracker = Tracker de pie sin asignar
|
||||
reset-error-no_fingers_tracker = Tracker de dedos sin asignar
|
||||
reset-error-mounting-need_full_reset = Es necesario un reinicio completo antes de montar
|
||||
reset-error-yaw-need_full_reset = Es necesario un reinicio completo antes del reinicio horizontal
|
||||
|
||||
## Serial detection stuff
|
||||
|
||||
@@ -271,10 +284,12 @@ navbar-trackers_assign = Asignación de sensores
|
||||
navbar-mounting = Calibración de montura
|
||||
navbar-onboarding = Asistente de configuración
|
||||
navbar-settings = Ajustes
|
||||
navbar-connect_trackers = Conectar Trackers
|
||||
|
||||
## Biovision hierarchy recording
|
||||
|
||||
bvh-start_recording = Grabar BVH
|
||||
bvh-stop_recording = Guardar grabación BVH
|
||||
bvh-recording = Grabando...
|
||||
bvh-save_title = Guardar grabación BVH
|
||||
|
||||
@@ -418,6 +433,9 @@ tracker-settings-update-up_to_date = Actualizado
|
||||
tracker-settings-update-blocked = Actualización no disponible. No hay otras versiones disponibles
|
||||
tracker-settings-update = Actualizar ahora
|
||||
tracker-settings-update-title = Versión del firmware
|
||||
tracker-settings-current-version = Actual
|
||||
tracker-settings-latest-version = Último
|
||||
tracker-settings-build-date = Fecha de fabricación
|
||||
|
||||
## Tracker part card info
|
||||
|
||||
@@ -495,6 +513,8 @@ settings-sidebar-osc_vmc = VMC
|
||||
settings-sidebar-utils = Utilidades
|
||||
settings-sidebar-serial = Consola serial
|
||||
settings-sidebar-appearance = Apariencia
|
||||
settings-sidebar-home = Pantalla de Inicio
|
||||
settings-sidebar-checklist = Lista de Tracking
|
||||
settings-sidebar-notifications = Notificaciones
|
||||
settings-sidebar-behavior = Comportamiento
|
||||
settings-sidebar-firmware-tool = Herramienta de firmware DIY
|
||||
@@ -651,7 +671,7 @@ settings-general-fk_settings-skeleton_settings-extended_spine_model = Modelo ext
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = Modelo extendido del pelvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = Modelo extendido de la rodilla
|
||||
settings-general-fk_settings-skeleton_settings-ratios = Radios del esqueleto
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = Cambia los valores de los ajustes del esqueleto. Podes llegar a necesitar reajustar tus proporciones después de cambiar estos valores.
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = Cambia los valores de los ajustes del esqueleto. Podrías llegar a necesitar reajustar tus proporciones después de cambiar estos valores.
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = Imputar de la cintura al pecho hasta la cadera
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = Imputar de la cintura al pecho hasta las piernas
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Imputar de la cadera al pecho hasta las piernas
|
||||
@@ -925,9 +945,15 @@ settings-utils-advanced-open_logs-label = Abrir carpeta
|
||||
|
||||
## Home Screen
|
||||
|
||||
settings-home-list-layout = Diseño de la lista de Trackers
|
||||
settings-home-list-layout-desc = Selecciona uno de los posibles diseños de la pantalla de inicio
|
||||
settings-home-list-layout-grid = Cuadrícula
|
||||
settings-home-list-layout-table = Tabla
|
||||
|
||||
## Tracking Checlist
|
||||
|
||||
settings-tracking_checklist-active_steps = Pasos Activos
|
||||
settings-tracking_checklist-active_steps-desc = Lista de todos los pasos en la lista de tracking. Puedes elegir desactivar pasos específicos.
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
@@ -944,6 +970,13 @@ onboarding-setup_warning-cancel = Continuar configuración
|
||||
## Wi-Fi setup
|
||||
|
||||
onboarding-wifi_creds-back = Volver a la introducción
|
||||
onboarding-wifi_creds-v2 = Trackers utilizando Wi-Fi
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description-v2 =
|
||||
La mayoría de trackers (como los trackers oficiales de SlimeVR) utilizan Wi-Fi para conectar al servidor.
|
||||
Por favor utiliza las credenciales de la red Wi-Fi donde tu dispositivo esta actualmente conectado.
|
||||
|
||||
¡Asegúrate de utilizar una conexión Wi-Fi 2.4Ghz para tus trackers!
|
||||
onboarding-wifi_creds-skip = Saltar ajustes de Wi-Fi
|
||||
onboarding-wifi_creds-submit = ¡Enviar!
|
||||
onboarding-wifi_creds-ssid =
|
||||
@@ -953,12 +986,16 @@ onboarding-wifi_creds-ssid-required = Se requiere el nombre del Wi-Fi
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Contraseña
|
||||
.placeholder = Ingresa la contraseña
|
||||
onboarding-wifi_creds-dongle-title = Trackers utilizando un dongle
|
||||
onboarding-wifi_creds-dongle-description = ¡Si tus trackers llegaron con un dongle, conéctalo a tu dispositivo y deberías estar listo para usar!
|
||||
onboarding-wifi_creds-dongle-wip = Esta sección es un trabajo en progreso. Una página dedicada para administrar trackers que se conectan via dongle sera hecha pronto.
|
||||
onboarding-wifi_creds-dongle-continue = Continuar con un dongle
|
||||
|
||||
## Mounting setup
|
||||
|
||||
onboarding-reset_tutorial-back = Volver a la calibración de montura
|
||||
onboarding-reset_tutorial = Reiniciar tutorial
|
||||
onboarding-reset_tutorial-explanation = Mientras estés usando tus trackers, estos pueden empezar a desalinearse por el drift horizontal del IMU, o porque los moviste físicamente. Hay varias formas de arreglar este tipo de problemas.
|
||||
onboarding-reset_tutorial-explanation = Mientras estés usando tus trackers, estos pueden empezar a desalinearse por el desvío horizontal del IMU, o porque los moviste físicamente. Hay varias formas de arreglar este tipo de problemas.
|
||||
onboarding-reset_tutorial-skip = Saltar paso
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-0 =
|
||||
@@ -969,8 +1006,8 @@ onboarding-reset_tutorial-0 =
|
||||
onboarding-reset_tutorial-1 =
|
||||
Toca { $taps } veces el tracker resaltado para activar el reinicio completo.
|
||||
|
||||
Se requiere que estas de forma parada (pose en i). Esto tiene un delay de 3 segundos (configurable) antes de que actualmente suceda.
|
||||
Esto reinicia completamente la posición y rotación de todos tus sensores, debería de arreglar la mayoría de tus problemas.
|
||||
Se requiere que estés de pie (pose en i). Esto tiene una demora de 3 segundos (configurable) antes de que realmente suceda.
|
||||
Esto reinicia completamente la posición y rotación de todos tus trackers. Debería de arreglar la mayoría de los problemas.
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-2 =
|
||||
Toca { $taps } veces el tracker resaltado para activar el reinicio de montura.
|
||||
@@ -1058,6 +1095,7 @@ onboarding-assignment_tutorial-done = ¡Puse las correas y stickers!
|
||||
onboarding-assign_trackers-back = Volver a las credenciales Wi-Fi
|
||||
onboarding-assign_trackers-title = Asignación de sensores
|
||||
onboarding-assign_trackers-description = Debes escoger dónde van los sensores. Has clic en la ubicación donde quieras colocar un sensor
|
||||
onboarding-assign_trackers-unassign_all = Des-asignar todos los trackers
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
@@ -1203,6 +1241,8 @@ onboarding-automatic_mounting-done-restart = Volver al inicio
|
||||
onboarding-automatic_mounting-mounting_reset-title = Reinicio de montura
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Arrodíllate en una posición de «esquiar» con tus piernas dobladas, la parte superior de tu cuerpo inclinada hacia adelante, y tus brazos doblados.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Presiona el botón «Reinicio de montura» y espera 3 segundos hasta que se reinicie la montura.
|
||||
onboarding-automatic_mounting-mounting_reset-feet-step-0 = 1. Párate de puntillas con ambos pies apuntando hacia el frente. Alternativamente puedes hacerlo sentándote en una silla.
|
||||
onboarding-automatic_mounting-mounting_reset-feet-step-1 = 2. Presiona el botón "Calibración de pies" y espera por 3 segundos hasta que la orientación de los trackers se reinicie.
|
||||
onboarding-automatic_mounting-preparation-title = Preparación
|
||||
onboarding-automatic_mounting-preparation-v2-step-0 = 1. Presiona el botón «Reinicio completo».
|
||||
onboarding-automatic_mounting-preparation-v2-step-1 = 2. Párate recto con los brazos a tus lados. Asegúrate de mirar hacia adelante.
|
||||
@@ -1214,6 +1254,7 @@ onboarding-automatic_mounting-return-home = Hecho
|
||||
|
||||
## Tracker manual proportions setupa
|
||||
|
||||
onboarding-manual_proportions-back-scaled = Regresar a Proporciones Escaladas
|
||||
onboarding-manual_proportions-title = Proporciones de cuerpo manuales
|
||||
onboarding-manual_proportions-fine_tuning_button = Ajustar automáticamente las proporciones
|
||||
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = Por favor conecte un visor VR para utilizar el ajuste automático
|
||||
@@ -1313,6 +1354,30 @@ onboarding-automatic_proportions-smol_warning-cancel = Volver
|
||||
|
||||
## User height calibration
|
||||
|
||||
onboarding-user_height-title = ¿Cuál es tu altura?
|
||||
onboarding-user_height-description = Necesitamos tu altura para calcular tus proporciones corporales y representar tus movimientos de manera precisa. Puedes dejar que SlimeVR lo calcule, o puedes ingresar tu altura manualmente.
|
||||
onboarding-user_height-need_head_tracker = Un casco y controles con rastreo posicional son requeridos para realizar la calibración.
|
||||
onboarding-user_height-calculate = Calcular mi altura automáticamente
|
||||
onboarding-user_height-next_step = Continuar y guardar
|
||||
onboarding-user_height-manual-proportions = Proporciones Manuales
|
||||
onboarding-user_height-calibration-title = Progreso de Calibración
|
||||
onboarding-user_height-calibration-RECORDING_FLOOR = Toca el suelo con la punta de tu control
|
||||
onboarding-user_height-calibration-WAITING_FOR_RISE = Vuelve a pararte
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK = Vuelve a pararte y mira hacia adelante
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = Asegúrate de que tu cabeza este derecha
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = No mires al suelo
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = No mires demasiado arriba
|
||||
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = Asegúrate que el control este apuntando hacia abajo
|
||||
onboarding-user_height-calibration-RECORDING_HEIGHT = ¡Vuelve a pararte y no te muevas!
|
||||
onboarding-user_height-calibration-DONE = ¡Éxito!
|
||||
onboarding-user_height-calibration-ERROR_TIMEOUT = Calibración agotada, inténtalo de nuevo.
|
||||
onboarding-user_height-calibration-ERROR_TOO_HIGH = La altura del usuario detectada es demasiado alta, inténtalo de nuevo.
|
||||
onboarding-user_height-calibration-ERROR_TOO_SMALL = La altura del usuario detectada es demasiado baja. Asegúrate de pararte derecho y mirar hacia el frente al final de la calibración.
|
||||
onboarding-user_height-calibration-error = Calibración Fallida
|
||||
onboarding-user_height-manual-tip = Mientras ajustas tu altura, intenta poses distintas y ve como el esqueleto se ajusta a tu cuerpo.
|
||||
onboarding-user_height-reset-warning =
|
||||
<b>Peligro:</b> Esto reiniciará tus proporciones para ser basadas en tu altura.
|
||||
¿Seguro quieres hacer esto?
|
||||
|
||||
## Stay Aligned setup
|
||||
|
||||
@@ -1351,6 +1416,7 @@ onboarding-stay_aligned-done = Hecho
|
||||
## Home
|
||||
|
||||
home-no_trackers = No hay sensores detectados o asignados
|
||||
home-settings = Ajustes de la Página de Inicio
|
||||
home-settings-close = Cerrar
|
||||
|
||||
## Trackers Still On notification
|
||||
@@ -1417,6 +1483,9 @@ firmware_tool-flash_method_step-serial-v2 =
|
||||
firmware_tool-flashbtn_step = Presione el botón de boot
|
||||
firmware_tool-flashbtn_step-description = Antes de pasar al siguiente paso, hay algunas cosas que debe hacer
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR = Apague el sensor, retire la carcasa (si la hay), conecte un cable USB a esta computadora y, a continuación, realice uno de los siguientes pasos de acuerdo con la revisión de la placa SlimeVR:
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR-r11-v2 = Enciende el tracker mientras haces corto en el segundo pad rectangular de FLASH desde el borde en la parte superior de la placa con el protector metálico del microcontrolador. El LED del tracker debería hacer un parpadeo breve.
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR-r12-v2 = Enciende el tracker mientras haces corto en pad circular de FLASH en la parte superior de la placa con el protector metálico del microcontrolador. El LED del tracker debería hacer un parpadeo breve.
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR-r14-v2 = Enciende el tracker mientras pulsas el botón FLASH en la parte superior de la placa. El LED del tracker deberia hacer un parpadeo breve.
|
||||
firmware_tool-flashbtn_step-board_OTHER =
|
||||
Antes de flashear, probablemente tendrá que poner el sensor en modo bootloader.
|
||||
La mayoría de las veces, esto significa presionar el botón de boot en la placa antes de que comience el proceso de flasheo. Si el proceso de flasheo se agota al comienzo, probablemente significa que el sensor no estaba en modo bootloader.
|
||||
@@ -1432,7 +1501,7 @@ firmware_tool-flash_method_serial-no_devices = No se han detectado dispositivos
|
||||
firmware_tool-build_step = Compilando
|
||||
firmware_tool-build_step-description = El firmware se está compilando, por favor espere
|
||||
firmware_tool-flashing_step = Flasheando
|
||||
firmware_tool-flashing_step-description = Sus sensores se están flasheando, por favor siga las instrucciones en la pantalla
|
||||
firmware_tool-flashing_step-description = Sus trackers se están flasheando, por favor siga las instrucciones en la pantalla
|
||||
firmware_tool-flashing_step-warning-v2 = No desconectes o apagues el tracker durante el proceso de subida a menos que se te indique, puede causar que tu placa quede inutilizable.
|
||||
firmware_tool-flashing_step-flash_more = Flashear más sensores
|
||||
firmware_tool-flashing_step-exit = Salir
|
||||
@@ -1559,9 +1628,59 @@ error_collection_modal-cancel = No quiero
|
||||
|
||||
## Tracking checklist section
|
||||
|
||||
tracking_checklist = Lista de Tracking
|
||||
tracking_checklist-settings = Ajustes de la Lista de Tracking
|
||||
tracking_checklist-settings-close = Cerrar
|
||||
tracking_checklist-status-incomplete = ¡No estás listo para usar SlimeVR!
|
||||
tracking_checklist-status-partial =
|
||||
{ $count ->
|
||||
[one] ¡Tienes 1 advertencia!
|
||||
[many] ¡Tienes { $count } advertencias!
|
||||
*[other] { "" }
|
||||
}
|
||||
tracking_checklist-status-complete = ¡Estás listo para usar SlimeVR!
|
||||
tracking_checklist-MOUNTING_CALIBRATION = Realizar una calibración de montura
|
||||
tracking_checklist-FEET_MOUNTING_CALIBRATION = Realizar una calibración de montura de los pies
|
||||
tracking_checklist-FULL_RESET = Realizar un reinicio completo
|
||||
tracking_checklist-FULL_RESET-desc = Algunos trackers necesitan realizar un reinicio.
|
||||
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR no se está ejecutando
|
||||
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR no se esta ejecutando. ¿Lo estas usando para VR?
|
||||
tracking_checklist-STEAMVR_DISCONNECTED-open = Abrir SteamVR
|
||||
tracking_checklist-TRACKERS_REST_CALIBRATION = Calibra tus trackers
|
||||
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = No realizaste una calibración para los trackers. Por favor deja reposar tus trackers (resaltados en amarillo) en una superficie estable por unos segundos.
|
||||
tracking_checklist-TRACKER_ERROR = Trackers con Errores
|
||||
tracking_checklist-TRACKER_ERROR-desc = Algunos de tus trackers tienen un error. Por favor reinicia el tracker resaltado en amarillo.
|
||||
tracking_checklist-VRCHAT_SETTINGS = Configurar ajustes de VRChat
|
||||
tracking_checklist-VRCHAT_SETTINGS-desc = ¡Tienes ajustes mal puestos en VRChat! Esto puede impactar negativamente tu tracking.
|
||||
tracking_checklist-VRCHAT_SETTINGS-open = Ir a Advertencias de VRChat
|
||||
tracking_checklist-UNASSIGNED_HMD = Casco VR sin asignar a Cabeza
|
||||
tracking_checklist-UNASSIGNED_HMD-desc = El casco VR debería estar asignado como un tracker de cabeza.
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC = Cambia tu perfil de red
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
|
||||
{ $count ->
|
||||
[one]
|
||||
Tu perfil de red esta actualmente configurado como Público ({ $adapters }).
|
||||
Esto no es recomendado para el correcto funcionamiento de SlimeVR.
|
||||
<PublicFixLink>Ve como arreglarlo aquí</PublicFixLink>
|
||||
[many]
|
||||
Algunos de tus adaptadores de red están configurados como públicos:
|
||||
{ $adapters }
|
||||
Esto no es recomendado para el correcto funcionamiento de SlimeVR.
|
||||
<PublicFixLink>Ve como arreglarlo aquí</PublicFixLink>
|
||||
*[other] { "" }
|
||||
}
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = Abrir Panel de Control
|
||||
tracking_checklist-STAY_ALIGNED_CONFIGURED = Configurar Stay Aligned
|
||||
tracking_checklist-STAY_ALIGNED_CONFIGURED-desc = Graba las poses de Stay Aligned para reducir el desvío
|
||||
tracking_checklist-STAY_ALIGNED_CONFIGURED-open = Abrir el ayudante de Stay Aligned
|
||||
tracking_checklist-ignore = Ignorar
|
||||
preview-mocap_mode_soon = Modo Mocap (Pronto™)
|
||||
preview-disable_render = Desactivar renderizado
|
||||
preview-disabled_render = Renderizado desactivado
|
||||
toolbar-mounting_calibration = Calibración de montura
|
||||
toolbar-mounting_calibration-default = Cuerpo
|
||||
toolbar-mounting_calibration-feet = Pies
|
||||
toolbar-mounting_calibration-fingers = Dedos
|
||||
toolbar-drift_reset = Reinicio de Desviación
|
||||
toolbar-assigned_trackers = { $count } trackers asignados
|
||||
toolbar-unassigned_trackers = { $count } trackers sin asignar
|
||||
|
||||
@@ -33,6 +33,10 @@ tips-failed_webgl = No se pudo iniciar WebGL.
|
||||
|
||||
## Units
|
||||
|
||||
unit-meter = Metro
|
||||
unit-foot = Pie
|
||||
unit-inch = Pulgada
|
||||
unit-cm = cm
|
||||
|
||||
## Body parts
|
||||
|
||||
@@ -241,10 +245,12 @@ navbar-trackers_assign = Asignación de trackers
|
||||
navbar-mounting = Calibración de montura
|
||||
navbar-onboarding = Asistente de Configuración
|
||||
navbar-settings = Configuración
|
||||
navbar-connect_trackers = Conectar Trackers
|
||||
|
||||
## Biovision hierarchy recording
|
||||
|
||||
bvh-start_recording = Grabar BVH
|
||||
bvh-stop_recording = Guardar grabación BVH
|
||||
bvh-recording = Grabando...
|
||||
bvh-save_title = Guardar grabación BVH
|
||||
|
||||
@@ -381,6 +387,7 @@ tracker-settings-name_section-label = Nombre del tracker
|
||||
tracker-settings-forget = Olvidar tracker
|
||||
tracker-settings-forget-description = Elimina el tracker del servidor SlimeVR y evita que se conecte a él hasta que se reinicie el servidor. La configuración del tracker no se perderá.
|
||||
tracker-settings-forget-label = Olvidar tracker
|
||||
tracker-settings-update-incompatible = No se puede actualizar. Versión de placa o firmware incompatible
|
||||
tracker-settings-update-low-battery = No se puede actualizar. Batería inferior al 50%
|
||||
tracker-settings-update-up_to_date = Actualizado
|
||||
tracker-settings-update-blocked = Actualización no disponible. No hay otras versiones disponibles
|
||||
@@ -451,6 +458,7 @@ mounting_selection_menu-close = Cerrar
|
||||
|
||||
settings-sidebar-title = Configuración
|
||||
settings-sidebar-general = General
|
||||
settings-sidebar-steamvr = SteamVR
|
||||
settings-sidebar-tracker_mechanics = Mecánicas del tracker
|
||||
settings-sidebar-stay_aligned = Mantener Alineado
|
||||
settings-sidebar-fk_settings = Configuración del tracking
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
## Websocket (server) status
|
||||
|
||||
websocket-connecting = Connexion au serveur
|
||||
websocket-connecting = Chargement...
|
||||
websocket-connection_lost = Connexion avec le serveur perdue. Reconnexion...
|
||||
websocket-connection_lost-desc = Il semble que le serveur SlimeVR ait planté. Vérifiez les logs et redémarrez le programme.
|
||||
websocket-timedout = Impossible de se connecter au serveur
|
||||
@@ -33,7 +33,7 @@ tips-failed_webgl = Échec de l'initialisation de WebGL.
|
||||
|
||||
## Units
|
||||
|
||||
unit-meter = Metre
|
||||
unit-meter = Mètre
|
||||
unit-foot = Pied
|
||||
unit-inch = Pouce
|
||||
unit-cm = cm
|
||||
@@ -115,6 +115,11 @@ board_type-XIAO_ESP32C3 = Seeed Studio XIAO ESP32C3
|
||||
board_type-HARITORA = Haritora
|
||||
board_type-ESP32C6DEVKITC1 = Espressif ESP32-C6 DevKitC-1
|
||||
board_type-GLOVE_IMU_SLIMEVR_DEV = SlimeVR Dev IMU Glove
|
||||
board_type-GESTURES = Gestes
|
||||
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
|
||||
board_type-GENERIC_NRF = nRF Générique
|
||||
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
|
||||
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
|
||||
|
||||
## Proportions
|
||||
|
||||
@@ -225,7 +230,7 @@ skeleton_bone-LOWER_ARM-desc =
|
||||
skeleton_bone-HAND_Y = Distance Y des mains
|
||||
skeleton_bone-HAND_Y-desc =
|
||||
Ceci est la distance verticale entre vos poignets et le milieu de vos main.
|
||||
Pour l’ajuster pour la capture de mouvement, ajustez correctement la longueur des bras et modifiez-la jusqu’à ce que votre
|
||||
Pour l’ajuster pour la capture de mouvement, ajustez correctement la longueur des bras et modifiez-la jusqu’à ce que vos
|
||||
capteurs de main soient alignés verticalement avec le milieu de vos mains.
|
||||
Pour l’ajuster pour le suivi des coudes à partir de vos manettes, réglez la longueur des bras à 0 et
|
||||
modifiez-la jusqu’à ce que vos capteurs de coude soient alignés verticalement avec vos poignets.
|
||||
@@ -256,9 +261,10 @@ reset-mounting = Réinitialiser l'alignement
|
||||
reset-mounting-feet = Réinitialiser l'alignement des pieds
|
||||
reset-mounting-fingers = Réinitialiser l'alignement des doigts
|
||||
reset-yaw = Réinitialisation horizontale
|
||||
reset-error-no_feet_tracker = Aucun traqueur de pieds n’est assigné
|
||||
reset-error-no_fingers_tracker = Aucun traqueur de doigts n'est assigné
|
||||
reset-error-no_feet_tracker = Aucun capteur de pieds n’est assigné
|
||||
reset-error-no_fingers_tracker = Aucun capteur de doigts n'est assigné
|
||||
reset-error-mounting-need_full_reset = Nécessite une réinitialisation complète avant de le monter
|
||||
reset-error-yaw-need_full_reset = Nécessite une réinitialisation complète avant une réinitialisation horizontale
|
||||
|
||||
## Serial detection stuff
|
||||
|
||||
@@ -278,6 +284,7 @@ navbar-trackers_assign = Attribution des capteurs
|
||||
navbar-mounting = Alignement des capteurs
|
||||
navbar-onboarding = Assistant de configuration
|
||||
navbar-settings = Réglages
|
||||
navbar-connect_trackers = Connecter les capteurs
|
||||
|
||||
## Biovision hierarchy recording
|
||||
|
||||
@@ -348,6 +355,7 @@ tracker-table-column-name = Nom
|
||||
tracker-table-column-type = Type
|
||||
tracker-table-column-battery = Batterie
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-packet_loss = Pertes de paquets
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = Temp. °C
|
||||
tracker-table-column-linear-acceleration = Accél. X/Y/Z
|
||||
@@ -389,6 +397,9 @@ tracker-infos-magnetometer-status-v1 =
|
||||
[ENABLED] Activé
|
||||
*[NOT_SUPPORTED] Non pris en charge
|
||||
}
|
||||
tracker-infos-packet_loss = Pertes de paquets
|
||||
tracker-infos-packets_lost = Paquets perdus
|
||||
tracker-infos-packets_received = Paquets reçus
|
||||
|
||||
## Tracker settings
|
||||
|
||||
@@ -426,6 +437,9 @@ tracker-settings-update-up_to_date = À jour
|
||||
tracker-settings-update-blocked = Mise à jour non disponible. Aucune autre version disponible
|
||||
tracker-settings-update = Mettre à jour maintenant
|
||||
tracker-settings-update-title = Version du micrologiciel
|
||||
tracker-settings-current-version = Actuel
|
||||
tracker-settings-latest-version = Dernière version
|
||||
tracker-settings-build-date = Date de build
|
||||
|
||||
## Tracker part card info
|
||||
|
||||
@@ -504,6 +518,7 @@ settings-sidebar-utils = Utilitaires
|
||||
settings-sidebar-serial = Console série
|
||||
settings-sidebar-appearance = Apparence
|
||||
settings-sidebar-home = Ecran d'accueil
|
||||
settings-sidebar-checklist = Checklist de suivi
|
||||
settings-sidebar-notifications = Notifications
|
||||
settings-sidebar-behavior = Comportement
|
||||
settings-sidebar-firmware-tool = Outil de micrologiciel DIY
|
||||
@@ -589,6 +604,9 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
|
||||
Utilise le magnétomètre sur tous les capteurs dotés d'un micrologiciel compatible, réduisant ainsi la dérive dans des environnements magnétiques stables.
|
||||
Peut être désactivé par capteur dans les paramètres du capteur. <b>Ne fermez aucun des capteurs en changeant cette option !</b>
|
||||
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = Utiliser le magnétomètre sur les capteurs
|
||||
settings-general-tracker_mechanics-trackers_over_usb = Capteurs via USB
|
||||
settings-general-tracker_mechanics-trackers_over_usb-description = Permet de recevoir des données de suivi HID via USB. Assurez-vous que les capteurs connectés ont <b>la connexion via HID</b> activée !
|
||||
settings-general-tracker_mechanics-trackers_over_usb-enabled-label = Permettre aux capteurs HID de se connecter directement via USB
|
||||
settings-stay_aligned = Garder Aligné
|
||||
settings-stay_aligned-description = Garder Aligné réduit la dérive en ajustant progressivement vos capteurs pour qu’ils correspondent à vos postures détendues.
|
||||
settings-stay_aligned-setup-label = Configurer Garder Aligné
|
||||
@@ -851,7 +869,7 @@ settings-osc-vrchat-network-port_out =
|
||||
settings-osc-vrchat-network-address = Adresse réseau
|
||||
settings-osc-vrchat-network-address-description-v1 = Choisissez l'adresse à laquelle envoyer des données. Peut être laissé intact pour VRChat.
|
||||
settings-osc-vrchat-network-address-placeholder = Adresse IP VRChat
|
||||
settings-osc-vrchat-network-trackers = capteurs
|
||||
settings-osc-vrchat-network-trackers = Capteurs
|
||||
settings-osc-vrchat-network-trackers-description = Sélectionner quels capteurs envoyer via OSC.
|
||||
settings-osc-vrchat-network-trackers-chest = Poitrine
|
||||
settings-osc-vrchat-network-trackers-hip = Hanche
|
||||
@@ -931,11 +949,15 @@ settings-utils-advanced-open_logs-label = Ouvrir le dossier
|
||||
|
||||
## Home Screen
|
||||
|
||||
settings-home-list-layout = Disposition de la liste des capteurs
|
||||
settings-home-list-layout-desc = Sélectionnez l'une des dispositions possibles de l'écran d'accueil
|
||||
settings-home-list-layout-grid = Grille
|
||||
settings-home-list-layout-table = Tableau
|
||||
|
||||
## Tracking Checlist
|
||||
|
||||
settings-tracking_checklist-active_steps = Etapes actives
|
||||
settings-tracking_checklist-active_steps-desc = Liste de toutes les étapes de la checklist de suivi. Vous pouvez choisir de désactiver certaines étapes.
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
@@ -952,6 +974,13 @@ onboarding-setup_warning-cancel = Continuer la configuration
|
||||
## Wi-Fi setup
|
||||
|
||||
onboarding-wifi_creds-back = Retour à l'introduction
|
||||
onboarding-wifi_creds-v2 = Capteurs utilisant le Wi-Fi
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description-v2 =
|
||||
La plupart des capteurs (comme les capteurs officiels SlimeVR) utilisent le Wi-Fi pour se connecter au serveur.
|
||||
Veuillez utiliser les identifiants du réseau Wi-Fi auquel votre appareil est actuellement connecté.
|
||||
|
||||
Assurez-vous d’utiliser une connexion Wi-Fi 2,4 GHz pour vos capteurs !
|
||||
onboarding-wifi_creds-skip = Passer configuration Wi-Fi
|
||||
onboarding-wifi_creds-submit = Valider
|
||||
onboarding-wifi_creds-ssid =
|
||||
@@ -961,6 +990,10 @@ onboarding-wifi_creds-ssid-required = Le nom du Wi-Fi est requis
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Mot de passe du Wi-Fi
|
||||
.placeholder = Mot de passe
|
||||
onboarding-wifi_creds-dongle-title = Capteurs utilisant un dongle
|
||||
onboarding-wifi_creds-dongle-description = Si vos capteurs ont été livrés avec un dongle, branchez-le à votre appareil et vous devriez être prêt !
|
||||
onboarding-wifi_creds-dongle-wip = Cette section est en cours de développement. Une page dédiée à la gestion des capteurs connectés via un dongle sera bientôt créée.
|
||||
onboarding-wifi_creds-dongle-continue = Continuer avec un dongle
|
||||
|
||||
## Mounting setup
|
||||
|
||||
@@ -1066,6 +1099,7 @@ onboarding-assignment_tutorial-done = J'ai mis les autocollants et les sangles !
|
||||
onboarding-assign_trackers-back = Revenir aux identifiants Wi-Fi
|
||||
onboarding-assign_trackers-title = Attribuer des capteurs
|
||||
onboarding-assign_trackers-description = Choisissons où mettre chaque capteur.
|
||||
onboarding-assign_trackers-unassign_all = Désattribuer tout les capteurs
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
@@ -1210,6 +1244,8 @@ onboarding-automatic_mounting-done-restart = Retourner au début
|
||||
onboarding-automatic_mounting-mounting_reset-title = Réinitialisation de l'alignement
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Accroupissez-vous dans une pose de "ski" avec les jambes pliées, le haut du corps incliné vers l'avant et les bras pliés.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Appuyez sur le bouton "Réinitialiser l'alignement" et attendez 3 secondes avant que l'alignement des capteurs se calibre.
|
||||
onboarding-automatic_mounting-mounting_reset-feet-step-0 = 1. Mettez-vous sur la pointe des pieds, les deux pieds pointés vers l’avant. Vous pouvez aussi le faire assis sur une chaise.
|
||||
onboarding-automatic_mounting-mounting_reset-feet-step-1 = 2. Appuyez sur le bouton « Calibration des pieds » et attendez 3 secondes avant que l’orientation de l'alignement des capteurs ne se réinitialise.
|
||||
onboarding-automatic_mounting-preparation-title = Préparation
|
||||
onboarding-automatic_mounting-preparation-v2-step-0 = 1. Appuyez sur le bouton « Réinitialisation complète ».
|
||||
onboarding-automatic_mounting-preparation-v2-step-1 = 2. Tenez-vous droit debout, les bras le long du corps. Assurez-vous de regarder vers l’avant.
|
||||
@@ -1221,6 +1257,7 @@ onboarding-automatic_mounting-return-home = Terminé
|
||||
|
||||
## Tracker manual proportions setupa
|
||||
|
||||
onboarding-manual_proportions-back-scaled = Retour aux proportions mises à l'échelle
|
||||
onboarding-manual_proportions-title = Proportions manuelles du corps
|
||||
onboarding-manual_proportions-fine_tuning_button = Automatiquement ajuster les proportions
|
||||
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = Veuillez connecter un casque VR pour utiliser l'ajustement automatique
|
||||
@@ -1321,9 +1358,29 @@ onboarding-automatic_proportions-smol_warning-cancel = Retour
|
||||
## User height calibration
|
||||
|
||||
onboarding-user_height-title = Quelle est votre taille ?
|
||||
onboarding-user_height-description = Nous avons besoin de votre taille pour calculer les proportions de votre corps ainsi que pour représenter précisément vos mouvements. Vous pouvez laisser SlimeVR la calculer ou entrer votre taille manuellement.
|
||||
onboarding-user_height-need_head_tracker = Un casque VR (ou capteur de tête) et des manettes à position absolue sont nécessaires pour calculer votre taille.
|
||||
onboarding-user_height-calculate = Calculer ma taille automatiquement
|
||||
onboarding-user_height-next_step = Continuer et enregistrer
|
||||
onboarding-user_height-manual-proportions = Proportions manuelles
|
||||
onboarding-user_height-calibration-title = Progression de la calibration
|
||||
onboarding-user_height-calibration-RECORDING_FLOOR = Touchez le sol avec l'extrémité de votre contrôleur
|
||||
onboarding-user_height-calibration-WAITING_FOR_RISE = Relevez-vous
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK = Relevez-vous et regardez droit devant vous
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = Assurez-vous que votre tête est bien droite
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = Ne regardez pas vers le sol
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = Ne regardez pas trop haut
|
||||
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = Assurez-vous que votre manette pointe vers le bas
|
||||
onboarding-user_height-calibration-RECORDING_HEIGHT = Relevez-vous et restez immobile !
|
||||
onboarding-user_height-calibration-DONE = Succès !
|
||||
onboarding-user_height-calibration-ERROR_TIMEOUT = Délais de calibration expiré, veuillez réessayer.
|
||||
onboarding-user_height-calibration-ERROR_TOO_HIGH = La taille détectée est trop grande, veuillez réessayez.
|
||||
onboarding-user_height-calibration-ERROR_TOO_SMALL = La taille détectée est trop petite. Veuillez rester droit et regardez devant vous à la fin de la calibration.
|
||||
onboarding-user_height-calibration-error = Calibration échouée
|
||||
onboarding-user_height-manual-tip = En ajustant votre taille, essayez différentes poses et regardez comment le squelette suit vos mouvements.
|
||||
onboarding-user_height-reset-warning =
|
||||
<b>Attention :</b> Cette action réinitialisera vos proportions pour être basées sur votre taille.
|
||||
Êtes-vous sûr de vouloir continuer ?
|
||||
|
||||
## Stay Aligned setup
|
||||
|
||||
@@ -1358,10 +1415,13 @@ onboarding-stay_aligned-previous_step = Précédent
|
||||
onboarding-stay_aligned-next_step = Prochain
|
||||
onboarding-stay_aligned-restart = Recommencer
|
||||
onboarding-stay_aligned-done = Fait
|
||||
onboarding-stay_aligned-manual_mounting-done = Terminé
|
||||
|
||||
## Home
|
||||
|
||||
home-no_trackers = Aucun capteur détecté ou attribué
|
||||
home-settings = Paramètres de la page d'accueil
|
||||
home-settings-close = Fermer
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
@@ -1406,6 +1466,9 @@ firmware_tool-select_source-firmware = Source du micrologiciel
|
||||
firmware_tool-select_source-version = Version du micrologiciel
|
||||
firmware_tool-select_source-official = Officiel
|
||||
firmware_tool-select_source-dev = Dev
|
||||
firmware_tool-select_source-not_selected = Aucune source sélectionnée
|
||||
firmware_tool-select_source-no_boards = Aucune carte disponible pour cette source
|
||||
firmware_tool-select_source-no_versions = Aucune version disponible pour cette source
|
||||
firmware_tool-board_defaults = Configurez votre carte
|
||||
firmware_tool-board_defaults-description = Réglez les broches ou réglages pour votre matériel
|
||||
firmware_tool-board_defaults-add = Ajouter
|
||||
@@ -1427,6 +1490,9 @@ firmware_tool-flash_method_step-serial-v2 =
|
||||
firmware_tool-flashbtn_step = Appuyez sur le bouton boot
|
||||
firmware_tool-flashbtn_step-description = Avant de passer à l'étape suivante, il y a quelques choses que vous devez faire
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR = Éteignez le capteur, retirez le boîtier (s'il y en a un), connectez un câble USB à votre ordinateur, puis effectuez l'une des étapes suivantes en fonction de la révision de votre carte SlimeVR :
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR-r11-v2 = Allumez le capteur tout en court-circuitant le second pad FLASH rectangulaire à partir du bord en haut de la carte jusqu’à la protection métallique du microcontrôleur. La LED du capteur devrait faire un clignotement rapide.
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR-r12-v2 = Allumez le capteur tout en court-circuitant le pad FLASH circulaire sur le dessus de la carte à la protection métallique du microcontrôleur. La LED du capteur devrait faire un clignotement rapide.
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR-r14-v2 = Allumez le capteur tout en appuyant sur le bouton FLASH sur le dessus de la carte. La LED du capteur devrait faire un clignotement brièvement.
|
||||
firmware_tool-flashbtn_step-board_OTHER =
|
||||
Avant de flash le capteur, vous devrez probablement le mettre en mode bootloader.
|
||||
La plupart du temps, il s'agit d'appuyer sur le bouton boot de la carte avant que le processus de flash ne commence.
|
||||
@@ -1569,3 +1635,54 @@ error_collection_modal-cancel = Je ne veux pas
|
||||
|
||||
## Tracking checklist section
|
||||
|
||||
tracking_checklist = Checklist de suivi
|
||||
tracking_checklist-settings = Paramètres de lachecklist de suivi
|
||||
tracking_checklist-settings-close = Fermer
|
||||
tracking_checklist-status-incomplete = Vous n’êtes pas prêt à utiliser SlimeVR !
|
||||
tracking_checklist-status-partial =
|
||||
{ $count ->
|
||||
[one] Vous avez 1 avertissement !
|
||||
*[other] Vous avez { $count } avertissements !
|
||||
}
|
||||
tracking_checklist-status-complete = Vous êtes prêt à utiliser SlimeVR !
|
||||
tracking_checklist-MOUNTING_CALIBRATION = Effectuer une calibration de l'alignement
|
||||
tracking_checklist-FEET_MOUNTING_CALIBRATION = Effectuer une calibration de l'alignement des pieds
|
||||
tracking_checklist-FULL_RESET = Faire une réinitialisation complète
|
||||
tracking_checklist-FULL_RESET-desc = Certains capteurs nécessitent une réinitialisation.
|
||||
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR n'est pas lancé
|
||||
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR n'est pas lancé. L’utilisez-vous pour la VR ?
|
||||
tracking_checklist-STEAMVR_DISCONNECTED-open = Lancer SteamVR
|
||||
tracking_checklist-TRACKERS_REST_CALIBRATION = Calibrer vos capteurs
|
||||
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = Vous n’avez pas fait de calibration de capteur. Veuillez laisser vos capteurs (surlignés en jaune) reposer sur une surface stable pendant quelques seconds.
|
||||
tracking_checklist-TRACKER_ERROR = Capteurs avec erreur
|
||||
tracking_checklist-TRACKER_ERROR-desc = Certains de vos capteurs ont une erreur. Veuillez redémarrer les capteurs surlignés en jaune.
|
||||
tracking_checklist-VRCHAT_SETTINGS = Configurez les paramètres de VRChat
|
||||
tracking_checklist-VRCHAT_SETTINGS-desc = Vous avez mal configuré les paramètres de VRChat ! Cela peut dégrader votre suivi.
|
||||
tracking_checklist-VRCHAT_SETTINGS-open = Aller sur les avertissements de VRChat
|
||||
tracking_checklist-UNASSIGNED_HMD = Casque VR non attribué à la tête
|
||||
tracking_checklist-UNASSIGNED_HMD-desc = Le casque VR devrait être attribué en tant que capteur de la tête.
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC = Modifier votre profil de réseau
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
|
||||
{ $count ->
|
||||
[one] Votre profil de réseau est actuellement défini comme étant public. Ce n’est pas recommandé pour le fonctionnement correct de SlimeVR. <PublicFixLink>Voyez comment y remédier ici.</PublicFixLink>
|
||||
*[other]
|
||||
Certains de vos adaptateurs réseau sont réglés sur public :
|
||||
{ $adapters }
|
||||
Ce n’est pas recommandé pour que SlimeVR fonctionne correctement.
|
||||
<PublicFixLink>Voyez comment y remédier ici.</PublicFixLink>
|
||||
}
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = Ouvrir le panneau de configuration
|
||||
tracking_checklist-STAY_ALIGNED_CONFIGURED = Configurer Garder Aligné
|
||||
tracking_checklist-STAY_ALIGNED_CONFIGURED-desc = Enregistrez les poses Garder Aligné pour réduire la dérive
|
||||
tracking_checklist-STAY_ALIGNED_CONFIGURED-open = Ouvrir l'assistant de Garder Aligné
|
||||
tracking_checklist-ignore = Ignorer
|
||||
preview-mocap_mode_soon = Mode Mocap (Bientôt™)
|
||||
preview-disable_render = Désactiver le rendu
|
||||
preview-disabled_render = Rendu désactivé
|
||||
toolbar-mounting_calibration = Calibration de l'alignement
|
||||
toolbar-mounting_calibration-default = Corps
|
||||
toolbar-mounting_calibration-feet = Pieds
|
||||
toolbar-mounting_calibration-fingers = Doigts
|
||||
toolbar-drift_reset = Réinitialisation de la dérive
|
||||
toolbar-assigned_trackers = { $count } capteurs assignés
|
||||
toolbar-unassigned_trackers = { $count } capteurs non assignés
|
||||
|
||||
@@ -115,6 +115,11 @@ board_type-XIAO_ESP32C3 = Seeed Studio XIAO ESP32C3
|
||||
board_type-HARITORA = Haritora
|
||||
board_type-ESP32C6DEVKITC1 = Espressif ESP32-C6 DevKitC-1
|
||||
board_type-GLOVE_IMU_SLIMEVR_DEV = SlimeVR Dev IMU Handschoen
|
||||
board_type-GESTURES = Gebaren
|
||||
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
|
||||
board_type-GENERIC_NRF = Generic nRF
|
||||
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
|
||||
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
|
||||
|
||||
## Proportions
|
||||
|
||||
@@ -255,8 +260,8 @@ reset-mounting-fingers = Reset vingermontage
|
||||
reset-yaw = Yaw Reset
|
||||
reset-error-no_feet_tracker = Geen voet-tracker toegewezen
|
||||
reset-error-no_fingers_tracker = Geen vingertracker toegewezen
|
||||
reset-error-mounting-need_full_reset = U heeft een volledige reset nodig voordat u de montagekalibratie kunt uitvoeren.
|
||||
reset-error-yaw-need_full_reset = U heeft een volledige reset nodig voordat u de yaw reset kunt uitvoeren.
|
||||
reset-error-mounting-need_full_reset = Je hebt een volledige reset nodig voordat je een montagekalibratie kunt uitvoeren.
|
||||
reset-error-yaw-need_full_reset = Je hebt een volledige reset nodig voordat je een yaw reset kunt uitvoeren.
|
||||
|
||||
## Serial detection stuff
|
||||
|
||||
@@ -276,6 +281,7 @@ navbar-trackers_assign = Tracker-toewijzing
|
||||
navbar-mounting = Montage-kalibratie
|
||||
navbar-onboarding = Installatiewizard
|
||||
navbar-settings = Instellingen
|
||||
navbar-connect_trackers = Verbind Trackers
|
||||
|
||||
## Biovision hierarchy recording
|
||||
|
||||
@@ -346,6 +352,7 @@ tracker-table-column-name = Naam
|
||||
tracker-table-column-type = Type
|
||||
tracker-table-column-battery = Batterij
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-packet_loss = Pakketverlies
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = Temp. °C
|
||||
tracker-table-column-linear-acceleration = Accel. X/Y/Z
|
||||
@@ -387,6 +394,9 @@ tracker-infos-magnetometer-status-v1 =
|
||||
[ENABLED] Ingeschakeld
|
||||
*[NOT_SUPPORTED] Niet ondersteund
|
||||
}
|
||||
tracker-infos-packet_loss = Pakketverlies
|
||||
tracker-infos-packets_lost = Verloren pakketten
|
||||
tracker-infos-packets_received = Ontvangen pakketten
|
||||
|
||||
## Tracker settings
|
||||
|
||||
@@ -404,8 +414,8 @@ tracker-settings-drift_compensation_section-edit = Laat drift compensatie toe
|
||||
tracker-settings-use_mag = Sta de magnetometer toe op deze tracker.
|
||||
# Multiline!
|
||||
tracker-settings-use_mag-description =
|
||||
Wilt u dat deze tracker de magnetometer gebruikt om drift te verminderen wanneer de magnetometer is toegestaan? <b>Zet de tracker niet uit terwijl u dit aan of uit zet.</b>
|
||||
U moet eerst de magnetometer toestemming geven,<magSetting>click hier om naar de instellingen te gaan</magSetting>.
|
||||
Wilt je dat deze tracker de magnetometer gebruikt om drift te verminderen wanneer de magnetometer is toegestaan? <b>Zet de tracker niet uit terwijl je dit aan of uit zet.</b>
|
||||
Je moet eerst de magnetometer toestemming geven,<magSetting>click hier om naar de instellingen te gaan</magSetting>.
|
||||
tracker-settings-use_mag-label = Laat magnetometer toe
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
@@ -423,6 +433,9 @@ tracker-settings-update-up_to_date = Up to date.
|
||||
tracker-settings-update-blocked = Update is niet beschikbaar. Er zijn geen andere versies beschikbaar.
|
||||
tracker-settings-update = Werk nu bij.
|
||||
tracker-settings-update-title = Firmware versie
|
||||
tracker-settings-current-version = Actueel
|
||||
tracker-settings-latest-version = Nieuwste
|
||||
tracker-settings-build-date = Creatiedatum
|
||||
|
||||
## Tracker part card info
|
||||
|
||||
@@ -583,6 +596,9 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
|
||||
Gebruikt magnetometer op alle trackers die er een compatibele firmware voor hebben, waardoor drift in stabiele magnetische omgevingen wordt verminderd.
|
||||
Je kan dit per individuele tracker uit zetten in de instellingen van de tracker. <b>Sluit geen van de trackers af terwijl u dit in- en uitschakelt!</b>
|
||||
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = Gebruik magnetometer op de trackers
|
||||
settings-general-tracker_mechanics-trackers_over_usb = Trackers via USB
|
||||
settings-general-tracker_mechanics-trackers_over_usb-description = Maakt het mogelijk om HID-trackergegevens via USB te ontvangen. Zorg ervoor dat verbonden trackers <b>"verbinding over HID"</b> hebben ingeschakeld!
|
||||
settings-general-tracker_mechanics-trackers_over_usb-enabled-label = Laat HID-trackers direct via USB verbinden
|
||||
settings-stay_aligned = Blijf in lijn
|
||||
settings-stay_aligned-description = Blijf in lijn vermindert drift door je trackers geleidelijk aan te passen zodat ze overeenkomen met je ontspannen houdingen.
|
||||
settings-stay_aligned-setup-label = Blijf in lijn instellen
|
||||
@@ -634,7 +650,7 @@ settings-general-fk_settings-enforce_joint_constraints-correct_constraints = Cor
|
||||
settings-general-fk_settings-enforce_joint_constraints-correct_constraints-description = Corrigeer gewrichtsrotaties wanneer ze hun limiet overschrijden
|
||||
settings-general-fk_settings-ik = Positie gegevens
|
||||
settings-general-fk_settings-ik-use_position = Positiegegevens gebruiken
|
||||
settings-general-fk_settings-ik-use_position-description = Maakt gebruik van positiegegevens mogelijk van de trackers die deze leveren. Waneer u dit inschakelt, zorg er voor dat u een volledige reset doet en in het spel opnieuw kalibreert.
|
||||
settings-general-fk_settings-ik-use_position-description = Maakt gebruik van positiegegevens mogelijk van de trackers die deze leveren. Zorg er voor dat je een volledige reset doet en opnieuw kalibreert in het spel wanneer je dit inschakelt.
|
||||
settings-general-fk_settings-arm_fk = Arm tracking
|
||||
settings-general-fk_settings-arm_fk-description = Verander de manier waarop de armen worden getrackt.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Dwing armen vanuit HMD
|
||||
@@ -755,9 +771,9 @@ settings-general-interface-discord_presence-message =
|
||||
}
|
||||
settings-interface-behavior-error_tracking = Foutverzameling via Sentry.io
|
||||
settings-interface-behavior-error_tracking-description_v2 =
|
||||
<h1>Geeft u toestemming voor het verzamelen van geanonimiseerde foutgegevens?</h1>
|
||||
<h1>Geef je toestemming voor het verzamelen van geanonimiseerde foutgegevens?</h1>
|
||||
|
||||
<b>We verzamelen geen persoonlijke informatie</b> zoals uw IP-adres of draadloze inloggegevens. SlimeVR hecht veel waarde aan uw privacy!
|
||||
<b>We verzamelen geen persoonlijke informatie</b> zoals jouw IP-adres of draadloze inloggegevens. SlimeVR hecht veel waarde aan je privacy!
|
||||
|
||||
Om de beste gebruikerservaring te bieden, verzamelen we geanonimiseerde foutrapporten, prestatiestatistieken en informatie over het besturingssysteem. Dit helpt ons bij het detecteren van fouten en problemen met SlimeVR. Deze statistieken worden verzameld via Sentry.io.
|
||||
settings-interface-behavior-error_tracking-label = Stuur fouten naar de ontwikkelaars
|
||||
@@ -904,14 +920,14 @@ settings-utils-advanced-reset-all-label = Alles resetten
|
||||
settings-utils-advanced-reset_warning =
|
||||
{ $type ->
|
||||
[gui]
|
||||
<b>Waarschuwing</b>Hiermee worden al uw GUI instellingen teruggezet naar de standaardinstellingen.
|
||||
Weet u zeker dat u dit wilt doen?
|
||||
<b>Waarschuwing</b>Hiermee worden al je GUI instellingen teruggezet naar de standaardinstellingen.
|
||||
Weet je zeker dat je dit wilt doen?
|
||||
[server]
|
||||
<b>Waarschuwing</b>Hiermee worden al uw tracking instellingen teruggezet naar de standaardinstellingen.
|
||||
Weet u zeker dat u dit wilt doen?
|
||||
<b>Waarschuwing</b>Hiermee worden al je tracking instellingen teruggezet naar de standaardinstellingen.
|
||||
Weet je zeker dat je dit wilt doen?
|
||||
*[all]
|
||||
<b>Waarschuwing:</b> Hiermee worden al uw instellingen teruggezet naar de standaardinstellingen.
|
||||
Weet u zeker dat u dit wilt doen?
|
||||
<b>Waarschuwing:</b> Hiermee worden al je instellingen teruggezet naar de standaardinstellingen.
|
||||
Weet je zeker dat je dit wilt doen?
|
||||
}
|
||||
settings-utils-advanced-reset_warning-reset = Instellingen resetten
|
||||
settings-utils-advanced-reset_warning-cancel = Annuleren
|
||||
@@ -949,6 +965,13 @@ onboarding-setup_warning-cancel = Doorgaan met setupgids
|
||||
## Wi-Fi setup
|
||||
|
||||
onboarding-wifi_creds-back = Ga terug naar de introductie
|
||||
onboarding-wifi_creds-v2 = Trackers die Wi-Fi gebruiken
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description-v2 =
|
||||
De meeste trackers (zoals de officiële SlimeVR-trackers) gebruiken Wi-Fi om verbinding te maken met de server.
|
||||
Gebruik de inloggegevens van het Wi-Fi-netwerk waarmee je apparaat momenteel is verbonden.
|
||||
|
||||
Zorg ervoor dat je een 2,4GHz-Wi-Fi-verbinding gebruikt voor jouw trackers!
|
||||
onboarding-wifi_creds-skip = WiFi-instellingen overslaan
|
||||
onboarding-wifi_creds-submit = Verzenden!
|
||||
onboarding-wifi_creds-ssid =
|
||||
@@ -958,6 +981,10 @@ onboarding-wifi_creds-ssid-required = Wi-Fi-naam is vereist
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Paswoord
|
||||
.placeholder = Vul paswoord in
|
||||
onboarding-wifi_creds-dongle-title = Trackers met een dongle
|
||||
onboarding-wifi_creds-dongle-description = Als je trackers met een dongle zijn geleverd, steek die dan in je apparaat en je bent klaar om te beginnen!
|
||||
onboarding-wifi_creds-dongle-wip = Dit gedeelte is nog in ontwikkeling. Er komt binnenkort een aparte pagina om trackers te beheren die via een dongle verbinden.
|
||||
onboarding-wifi_creds-dongle-continue = Ga verder met een dongle
|
||||
|
||||
## Mounting setup
|
||||
|
||||
@@ -1206,7 +1233,7 @@ onboarding-automatic_mounting-done-restart = Terug naar start
|
||||
onboarding-automatic_mounting-mounting_reset-title = Montage-reset
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Ga staan in een "skie"-houding met gebogen benen, je bovenlichaam naar voren gekanteld en armen gebogen.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Druk op de knop "Reset montage" en wacht 3 seconden voordat de montagerichtingen van de trackers opnieuw worden ingesteld.
|
||||
onboarding-automatic_mounting-mounting_reset-feet-step-0 = 1. Sta op uw tenen met beide voeten naar voren gericht. u kunt het ook zittend op een stoel doen.
|
||||
onboarding-automatic_mounting-mounting_reset-feet-step-0 = 1. Sta op je tenen met beide voeten naar voren gericht. Je kunt het ook zittend op een stoel doen.
|
||||
onboarding-automatic_mounting-mounting_reset-feet-step-1 = 2. Druk op de knop "Voetkalibratie" en wacht 3 seconden voordat de montageoriëntaties van de trackers gereset worden.
|
||||
onboarding-automatic_mounting-preparation-title = Voorbereiding
|
||||
onboarding-automatic_mounting-preparation-v2-step-0 = 1. Druk op de knop "Volledige reset".
|
||||
@@ -1246,26 +1273,26 @@ onboarding-automatic_proportions-requirements-title = Vereisten
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-requirements-descriptionv2 = Je hebt voldaan aan de minimale vereisten om je voeten te tracken (over het algemeen 5 trackers). Je hebt je trackers en headset aan en draagt ze. Je trackers en headset zijn verbonden met de SlimeVR server en werken naar behoren (zonder haperingen, loskoppelingen etc.). Je headset stuurt positiedata naar de SlimeVR server (dit vereist doorgaans dat SteamVR draait en verbonden is met SlimeVR via de SlimeVR SteamVR-driver). De tracking werkt en registreert je bewegingen nauwkeurig (je hebt bijvoorbeeld een volledige reset uitgevoerd en de trackers bewegen in de juiste richting bij schoppen, bukken, zitten etc.).
|
||||
onboarding-automatic_proportions-requirements-next = Ik heb de vereisten gelezen
|
||||
onboarding-automatic_proportions-check_height-title-v3 = Meet de hoogte van uw headset
|
||||
onboarding-automatic_proportions-check_height-description-v2 = De hoogte van uw headset (HMD) moet iets minder zijn dan uw volledige lengte, aangezien headsets uw ooghoogte meten. Deze meting wordt gebruikt als basis voor uw lichaamsverhoudingen.
|
||||
onboarding-automatic_proportions-check_height-title-v3 = Meet de hoogte van je headset
|
||||
onboarding-automatic_proportions-check_height-description-v2 = De hoogte van je headset (HMD) moet iets minder zijn dan jouw volledige lengte, aangezien headsets je ooghoogte meten. Deze meting wordt gebruikt als basis voor je lichaamsverhoudingen.
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning-v3 = Begin met meten terwijl je <u>rechtop</u> staat om je lengte te meten. Let erop dat je je handen niet hoger dan je headset tilt, want dat kan de meting beïnvloeden!
|
||||
onboarding-automatic_proportions-check_height-guardian_tip = Als je een losse VR-bril gebruikt, zorg er dan voor dat je guardian/veilige zone is ingeschakeld zodat je lengte correct is gekalibreerd!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Onbekend
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height2 = De hoogte van uw headset is:
|
||||
onboarding-automatic_proportions-check_height-hmd_height2 = De hoogte van je headset is:
|
||||
onboarding-automatic_proportions-check_height-measure-start = Begin met meten
|
||||
onboarding-automatic_proportions-check_height-measure-stop = Stoppen met meten
|
||||
onboarding-automatic_proportions-check_height-measure-reset = Probeer opnieuw te meten
|
||||
onboarding-automatic_proportions-check_height-next_step = Ze zijn goed
|
||||
onboarding-automatic_proportions-check_floor_height-title = Meet uw vloerhoogte (optioneel)
|
||||
onboarding-automatic_proportions-check_floor_height-description = In sommige gevallen wordt uw vloerhoogte mogelijk niet correct ingesteld door uw headset, waardoor de hoogte van de headset hoger wordt gemeten dan zou moeten. U kunt de "hoogte" van uw vloer meten om de hoogte van uw headset te corrigeren.
|
||||
onboarding-automatic_proportions-check_floor_height-title = Meet je vloerhoogte (optioneel)
|
||||
onboarding-automatic_proportions-check_floor_height-description = In sommige gevallen wordt je vloerhoogte mogelijk niet correct ingesteld door je headset, waardoor de hoogte van de headset hoger wordt gemeten dan zou moeten. Je kunt de "hoogte" van je vloer meten om de hoogte van je headset te corrigeren.
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_floor_height-calculation_warning-v2 = Begin met meten en zet een controller op je vloer om de hoogte te meten. Als je zeker weet dat je vloerhoogte klopt, kun je deze stap overslaan.
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_floor_height-floor_height = Uw vloerhoogte is:
|
||||
onboarding-automatic_proportions-check_floor_height-full_height = Uw geschatte volledige lengte is:
|
||||
onboarding-automatic_proportions-check_floor_height-floor_height = Je vloerhoogte is:
|
||||
onboarding-automatic_proportions-check_floor_height-full_height = Je geschatte volledige lengte is:
|
||||
onboarding-automatic_proportions-check_floor_height-measure-start = Begin met meten
|
||||
onboarding-automatic_proportions-check_floor_height-measure-stop = Stoppen met meten
|
||||
onboarding-automatic_proportions-check_floor_height-measure-reset = Probeer opnieuw te meten
|
||||
@@ -1306,7 +1333,7 @@ onboarding-automatic_proportions-error_modal-v2 =
|
||||
<docs>Bekijk de documentatie</docs> of word lid van onze <discord>Discord</discord> voor hulp ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = Begrepen!
|
||||
onboarding-automatic_proportions-smol_warning =
|
||||
Uw ingestelde lengte van { $height } is lager dan de toegestane minimumlengte van { $minHeight }.
|
||||
Jouw ingestelde lengte van { $height } is lager dan de toegestane minimumlengte van { $minHeight }.
|
||||
<b>Voer de metingen opnieuw uit en controleer of ze correct zijn.</b>
|
||||
onboarding-automatic_proportions-smol_warning-cancel = Ga terug
|
||||
|
||||
@@ -1317,6 +1344,25 @@ onboarding-user_height-description = We hebben je lengte nodig om je lichaamspro
|
||||
onboarding-user_height-need_head_tracker = Voor de kalibratie zijn een headset en controllers met positionele tracking vereist.
|
||||
onboarding-user_height-calculate = Bereken mijn lengte automatisch
|
||||
onboarding-user_height-next_step = Doorgaan en opslaan
|
||||
onboarding-user_height-manual-proportions = Handmatige lichaamsverhoudingen
|
||||
onboarding-user_height-calibration-title = Vooruitgang van de kalibratie
|
||||
onboarding-user_height-calibration-RECORDING_FLOOR = Raak de vloer aan met de punt van je controller
|
||||
onboarding-user_height-calibration-WAITING_FOR_RISE = Sta weer op
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK = Sta weer op en kijk vooruit
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = Zorg dat je hoofd vlak staat
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = Kijk niet naar de vloer
|
||||
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = Kijk niet te veel omhoog
|
||||
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = Zorg dat de controller naar beneden wijst
|
||||
onboarding-user_height-calibration-RECORDING_HEIGHT = Sta weer op en blijf stilstaan!
|
||||
onboarding-user_height-calibration-DONE = Gelukt!
|
||||
onboarding-user_height-calibration-ERROR_TIMEOUT = Kalibratie sessie is verlopen, probeer het opnieuw.
|
||||
onboarding-user_height-calibration-ERROR_TOO_HIGH = De gedetecteerde gebruikershoogte is te hoog, probeer het opnieuw.
|
||||
onboarding-user_height-calibration-ERROR_TOO_SMALL = De gedetecteerde gebruikerslengte is te klein. Zorg dat je voor het einde van de kalibratie rechtop staat en naar voren kijkt.
|
||||
onboarding-user_height-calibration-error = Kalibratie mislukt
|
||||
onboarding-user_height-manual-tip = Tijdens het aanpassen van je lengte kan je verschillende poses proberen en kijken hoe het skelet met jouw lichaam overeenkomt.
|
||||
onboarding-user_height-reset-warning =
|
||||
<b>Waarschuwing:</b> Dit zet je verhoudingen terug op basis van jouw lengte.
|
||||
Weet je zeker dat je dit wilt doen?
|
||||
|
||||
## Stay Aligned setup
|
||||
|
||||
@@ -1351,6 +1397,7 @@ onboarding-stay_aligned-previous_step = Vorige
|
||||
onboarding-stay_aligned-next_step = Volgende
|
||||
onboarding-stay_aligned-restart = Herstarten
|
||||
onboarding-stay_aligned-done = Klaar
|
||||
onboarding-stay_aligned-manual_mounting-done = Klaar
|
||||
|
||||
## Home
|
||||
|
||||
@@ -1397,20 +1444,50 @@ firmware_tool = DIY firmware-tool
|
||||
firmware_tool-description = Hiermee kan je uw DIY-trackers configureren en flashen
|
||||
firmware_tool-not_available = Oeps, de firmwaretool is momenteel niet beschikbaar. Kom later terug!
|
||||
firmware_tool-not_compatible = De firmwaretool is niet compatibel met deze versie van de server. Gelieve te updaten!
|
||||
firmware_tool-select_source = Selecteer de firmware die u wilt flashen
|
||||
firmware_tool-select_source-description = Selecteer de firmware die u op uw bord wilt flashen
|
||||
firmware_tool-select_source = Selecteer de firmware die je wilt flashen
|
||||
firmware_tool-select_source-description = Selecteer de firmware die je op jouw bord wilt flashen
|
||||
firmware_tool-select_source-error = Kan bronnen niet laden
|
||||
firmware_tool-select_source-board_type = Type bord
|
||||
firmware_tool-select_source-firmware = Firmware-bron
|
||||
firmware_tool-select_source-version = Firmware versie
|
||||
firmware_tool-select_source-official = Officieel
|
||||
firmware_tool-select_source-dev = Ontwikkelaar
|
||||
firmware_tool-select_source-not_selected = Geen bron geselecteerd
|
||||
firmware_tool-select_source-no_boards = Geen beschikbare borden voor deze bron
|
||||
firmware_tool-select_source-no_versions = Geen beschikbare versies voor deze bron
|
||||
firmware_tool-board_defaults = Configureer je bord
|
||||
firmware_tool-board_defaults-description = Stel de pinnen of instellingen in ten opzichte van jouw hardware
|
||||
firmware_tool-board_defaults-add = Toevoegen
|
||||
firmware_tool-board_defaults-reset = Reset naar standaard
|
||||
firmware_tool-board_defaults-error-required = Verplicht veld
|
||||
firmware_tool-board_defaults-error-format = Ongeldig formaat
|
||||
firmware_tool-board_defaults-error-format-number = Is geen nummer
|
||||
firmware_tool-flash_method_step = Flashing methode
|
||||
firmware_tool-flash_method_step-description = Kies de flashingsmethode die je wilt gebruiken
|
||||
firmware_tool-flash_method_step-ota-v2 =
|
||||
.label = Wi-Fi
|
||||
.description = Gebruik de over-the-air methode. Jouw tracker zal via wifi de firmware bijwerken. Werkt alleen op trackers die al zijn ingesteld.
|
||||
firmware_tool-flash_method_step-ota-info =
|
||||
We gebruiken jouw wifi-inloggegevens om de tracker te flashen en te bevestigen dat alles correct werkte.
|
||||
<b>We slaan je wifi-gegevens niet op!</b>
|
||||
firmware_tool-flash_method_step-serial-v2 =
|
||||
.label = USB
|
||||
.description = Gebruik een USB kabel om jouw tracker up te daten.
|
||||
firmware_tool-flashbtn_step = Druk op de bootknop
|
||||
firmware_tool-flashbtn_step-description = Voordat u naar de volgende stap gaat, zijn er een paar dingen die u moet doen.
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR = Zet de tracker uit, verwijder de behuizing (indien aanwezig), verbind een USB-kabel met deze computer en voer vervolgens een van de volgende stappen uit, afhankelijk van de revisie van uw SlimeVR-board:
|
||||
firmware_tool-flashbtn_step-description = Voordat je naar de volgende stap gaat, zijn er een paar dingen die je moet doen.
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR = Zet de tracker uit, verwijder de behuizing (indien aanwezig), verbind een USB-kabel met deze computer en voer vervolgens een van de volgende stappen uit, afhankelijk van de revisie van je SlimeVR-bord:
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR-r11-v2 = Zet de tracker aan terwijl je het tweede rechthoekige FLASH-contact vlak bij de rand aan de bovenkant van de printplaat kortsluit tot het metalen schild van de microcontroller. De LED van de tracker zou kort moeten knipperen.
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR-r12-v2 = Zet de tracker aan terwijl je het ronde FLASH-contact aan de bovenkant van de printplaat kortsluit tot het metalen schild van de microcontroller. De LED van de tracker zou kort moeten knipperen.
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR-r14-v2 = Zet de tracker aan terwijl je de FLASH-knop aan de bovenkant van de printplaat ingedrukt houdt. De LED van de tracker zou kort moeten knipperen.
|
||||
firmware_tool-flashbtn_step-board_OTHER =
|
||||
Voordat u gaat flashen, moet de tracker waarschijnlijk in de bootloader-modus worden gezet.
|
||||
Voordat je gaat flashen, moet de tracker waarschijnlijk in de bootloader-modus worden gezet.
|
||||
Meestal betekent dit het indrukken van de bootknop op het board voordat het flashproces begint.
|
||||
Als het flashproces time-out bij het begin van het flashen, betekent dit waarschijnlijk dat de tracker niet in de bootloader-modus stond.
|
||||
Raadpleeg de flitsinstructies van uw board om te weten hoe u de bootloader-modus inschakelt.
|
||||
Als het flashproces verloopt bij het begin van het flashen, betekent dit waarschijnlijk dat de tracker niet in de bootloader-modus stond.
|
||||
Raadpleeg de flashing-instructies van je board om te weten hoe je de bootloader-modus inschakelt.
|
||||
firmware_tool-flash_method_ota-title = Flashen over Wi-Fi
|
||||
firmware_tool-flash_method_ota-devices = Gedetecteerde OTA-apparaten:
|
||||
firmware_tool-flash_method_ota-no_devices = Er zijn geen boards die via OTA bijgewerkt kunnen worden, zorg ervoor dat u het juiste boardtype heeft geselecteerd.
|
||||
firmware_tool-flash_method_ota-no_devices = Er zijn geen boards die via OTA bijgewerkt kunnen worden, zorg ervoor dat je het juiste boardtype heeft geselecteerd.
|
||||
firmware_tool-flash_method_serial-title = Flashen over USB
|
||||
firmware_tool-flash_method_serial-wifi = Wi-Fi-gegevens:
|
||||
firmware_tool-flash_method_serial-devices-label = Gedetecteerde serial apparaten:
|
||||
firmware_tool-flash_method_serial-devices-placeholder = Selecteer een serieel apparaat
|
||||
@@ -1425,7 +1502,10 @@ firmware_tool-flashing_step-exit = Sluit
|
||||
|
||||
## firmware tool build status
|
||||
|
||||
firmware_tool-build-QUEUED = Wachten om te maken....
|
||||
firmware_tool-build-CREATING_BUILD_FOLDER = De buildmap maken
|
||||
firmware_tool-build-DOWNLOADING_SOURCE = Broncode wordt gedownload
|
||||
firmware_tool-build-EXTRACTING_SOURCE = Broncode wordt uitgepakt
|
||||
firmware_tool-build-BUILDING = Firmware wordt gebouwd
|
||||
firmware_tool-build-SAVING = De build opslaan
|
||||
firmware_tool-build-DONE = Build voltooid
|
||||
@@ -1540,6 +1620,31 @@ error_collection_modal-cancel = Ik wil het niet
|
||||
|
||||
## Tracking checklist section
|
||||
|
||||
tracking_checklist = Tracking Checklist
|
||||
tracking_checklist-settings = Instellingen voor trackingchecklists
|
||||
tracking_checklist-settings-close = Sluiten
|
||||
tracking_checklist-status-incomplete = U bent niet voorbereid om SlimeVR te gebruiken!
|
||||
tracking_checklist-status-partial =
|
||||
{ $count ->
|
||||
[one] U heeft 1 waarschuwing!
|
||||
*[other] U heeft { $count } waarschuwingen!
|
||||
}
|
||||
tracking_checklist-status-complete = U bent klaar om SlimeVR te gebruiken!
|
||||
tracking_checklist-MOUNTING_CALIBRATION = Voer een montagekalibratie uit
|
||||
tracking_checklist-FEET_MOUNTING_CALIBRATION = Voer een voetmontage-kalibratie uit
|
||||
tracking_checklist-FULL_RESET = Voer een volledige reset uit
|
||||
tracking_checklist-FULL_RESET-desc = Sommige trackers hebben een reset nodig
|
||||
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR draait niet
|
||||
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR draait niet. Gebruik je het voor VR?
|
||||
tracking_checklist-STEAMVR_DISCONNECTED-open = Open SteamVR
|
||||
tracking_checklist-TRACKERS_REST_CALIBRATION = Kalibreer je trackers
|
||||
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = Je hebt geen tracker kalibratie uitgevoerd. Laat je Slimes (gemarkeerd met geel) rusten op een stabiele ondergrond voor een paar secondes.
|
||||
tracking_checklist-TRACKER_ERROR = Trackers met fouten
|
||||
tracking_checklist-TRACKER_ERROR-desc = Sommige van je trackers hebben een fout. Herstart de tracker die in het geel zijn gemarkeerd aub.
|
||||
tracking_checklist-VRCHAT_SETTINGS = Configureer VRChat-instellingen
|
||||
tracking_checklist-VRCHAT_SETTINGS-desc = Je hebt enkele VRchat-instellingen verkeerd geconfigureerd! Dit kan jouw trackingervaring negatief beïnvloeden.
|
||||
tracking_checklist-VRCHAT_SETTINGS-open = Ga naar VRChat Waarschuwingen
|
||||
tracking_checklist-UNASSIGNED_HMD = VR-headset niet toegewezen aan Hoofd
|
||||
tracking_checklist-UNASSIGNED_HMD-desc = De VR-headset moet worden toegewezen als hoofdtracker.
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC = Verander je netwerkprofiel
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
|
||||
@@ -1547,12 +1652,12 @@ tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
|
||||
[one]
|
||||
Uw netwerk-profiel is op dit moment of publiek ingesteld ({ $adapters })
|
||||
Dit wordt niet aanbevolen voor een goede werking van SlimeVR
|
||||
<PublicFixLink>Hiet leest u hoe u dit kunt oplossen</PublicFixLink>
|
||||
<PublicFixLink>Hier lees je hoe je dit kan oplossen</PublicFixLink>
|
||||
*[other]
|
||||
Sommige van uw netwerkadapters staan ingesteld op openbaar:
|
||||
Sommige van je netwerkadapters staan ingesteld op openbaar:
|
||||
{ $adapters }.
|
||||
Dit wordt niet aanbevolen voor een goede werking van SlimeVR.
|
||||
<PublicFixLink>Hier leest u hoe u dit kunt oplossen.</PublicFixLink>
|
||||
<PublicFixLink>Hier lees je hoe je dit kan oplossen.</PublicFixLink>
|
||||
}
|
||||
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = Open Configuratiescherm
|
||||
tracking_checklist-STAY_ALIGNED_CONFIGURED = Configureer Blijf in lijn
|
||||
|
||||
@@ -115,6 +115,11 @@ board_type-XIAO_ESP32C3 = Seeed Studio XIAO ESP32C3
|
||||
board_type-HARITORA = Haritora
|
||||
board_type-ESP32C6DEVKITC1 = Espressif ESP32-C6 DevKitC-1
|
||||
board_type-GLOVE_IMU_SLIMEVR_DEV = บอร์ดพัฒนาถุงมือ IMU SlimeVR
|
||||
board_type-GESTURES = ท่าทางสัมผัส
|
||||
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
|
||||
board_type-GENERIC_NRF = บอร์ด NRF ทั่วไป
|
||||
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
|
||||
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
|
||||
|
||||
## Proportions
|
||||
|
||||
@@ -276,7 +281,7 @@ navbar-home = หน้าหลัก
|
||||
navbar-body_proportions = สัดส่วนร่างกาย
|
||||
navbar-trackers_assign = กำหนดแทร็กเกอร์
|
||||
navbar-mounting = ตั้งศูนย์การติดตั้ง
|
||||
navbar-onboarding = ตัวช่วยตั้งค่าโปรแกรม
|
||||
navbar-onboarding = ตัวช่วยการตั้งค่า
|
||||
navbar-settings = ตั้งค่า
|
||||
navbar-connect_trackers = เชื่อมต่อแทร็กเกอร์
|
||||
|
||||
@@ -349,6 +354,7 @@ tracker-table-column-name = ชื่อ
|
||||
tracker-table-column-type = ชนิด
|
||||
tracker-table-column-battery = แบตเตอรี่
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-packet_loss = สูญเสียแพ็คเก็ต
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = อุณหภูมิ °C
|
||||
tracker-table-column-linear-acceleration = ความเร่ง X/Y/Z
|
||||
@@ -390,6 +396,9 @@ tracker-infos-magnetometer-status-v1 =
|
||||
[ENABLED] เปิดใช้งาน
|
||||
*[NOT_SUPPORTED] ไม่รองรับ
|
||||
}
|
||||
tracker-infos-packet_loss = สูญเสียแพ็คเก็ต
|
||||
tracker-infos-packets_lost = สูญเสียแพ็คเก็ต
|
||||
tracker-infos-packets_received = ได้รับแพ็คเก็ต
|
||||
|
||||
## Tracker settings
|
||||
|
||||
@@ -428,6 +437,7 @@ tracker-settings-update = อัปเดตทันที
|
||||
tracker-settings-update-title = เวอร์ชันเฟิร์มแวร์
|
||||
tracker-settings-current-version = ปัจจุบัน
|
||||
tracker-settings-latest-version = ล่าสุด
|
||||
tracker-settings-build-date = วันที่สร้าง
|
||||
|
||||
## Tracker part card info
|
||||
|
||||
@@ -593,6 +603,9 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
|
||||
ใช้เซ็นเซอร์สนามแม่เหล็กบนแทร็กเกอร์ทั้งหมดที่มีเฟิร์มแวร์ที่เข้ากันได้ ซึ่งช่วยลดดริฟท์ในสภาพแวดล้อมที่มีสนามแม่เหล็กคงที่
|
||||
สามารถปิดการใช้งานสำหรับแทร็กเกอร์แต่ละตัวได้ในการตั้งค่าของแทร็กเกอร์ <b>โปรดอย่าปิดแทร็กเกอร์ ในขณะที่กำลังสลับการตั้งค่านี้!</b>
|
||||
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = ใช้เซ็นเซอร์สนามแม่เหล็กกับแทร็กเกอร์
|
||||
settings-general-tracker_mechanics-trackers_over_usb = ต่อแทร็กเกอร์ผ่าน USB
|
||||
settings-general-tracker_mechanics-trackers_over_usb-description = เปิดใช้งานการรับข้อมูลแทร็กเกอร์แบบ HID ผ่านสาย USB ตรวจสอบว่าแทร็กเกอร์ของคุณได้เปิด <b>การเชื่อมต่อผ่าน HID</b> เอาไว้!
|
||||
settings-general-tracker_mechanics-trackers_over_usb-enabled-label = เปิดให้แทร็กเกอร์แบบ HID ต่อโดยตรงผ่านสาย USB
|
||||
settings-stay_aligned = Stay Aligned
|
||||
settings-stay_aligned-description = Stay Aligned จะลดดริฟท์โดยค่อยๆ ปรับแทร็กเกอร์ให้เข้ากับท่าทางผ่อนคลายของคุณ
|
||||
settings-stay_aligned-setup-label = ตั้งค่า Stay Aligned
|
||||
@@ -896,8 +909,8 @@ settings-utils-advanced = ขั้นสูง
|
||||
settings-utils-advanced-reset-gui = รีเซ็ตตั้งค่า GUI
|
||||
settings-utils-advanced-reset-gui-description = คืนค่าการตั้งค่าเริ่มต้นสำหรับอินเทอร์เฟซ
|
||||
settings-utils-advanced-reset-gui-label = รีเซ็ต GUI
|
||||
settings-utils-advanced-reset-server = รีเซ็ตการตั้งค่าการติดตาม
|
||||
settings-utils-advanced-reset-server-description = คืนค่าการจับตำแหน่งทั้งหมดเป็นค่าเริ่มต้น
|
||||
settings-utils-advanced-reset-server = รีเซ็ตการตั้งค่าแทร็กเกอร์
|
||||
settings-utils-advanced-reset-server-description = คืนค่าเกี่ยวกับแทร็กเกอร์เป็นค่าเริ่มต้น
|
||||
settings-utils-advanced-reset-server-label = รีเซ็ตการจับตำแหน่ง
|
||||
settings-utils-advanced-reset-all = รีเซ็ตการตั้งค่าทั้งหมด
|
||||
settings-utils-advanced-reset-all-description = คืนค่าการตั้งค่าเริ่มต้นสำหรับทั้งอินเทอร์เฟซและการจับตำแหน่ง
|
||||
@@ -1368,6 +1381,7 @@ onboarding-stay_aligned-previous_step = ก่อนหน้า
|
||||
onboarding-stay_aligned-next_step = ต่อไป
|
||||
onboarding-stay_aligned-restart = เริ่มใหม่
|
||||
onboarding-stay_aligned-done = เสร็จแล้ว
|
||||
onboarding-stay_aligned-manual_mounting-done = เสร็จแล้ว
|
||||
|
||||
## Home
|
||||
|
||||
@@ -1418,6 +1432,9 @@ firmware_tool-select_source-firmware = แหล่งที่มาของ
|
||||
firmware_tool-select_source-version = เวอร์ชันของเฟิร์มแวร์
|
||||
firmware_tool-select_source-official = ทางการ
|
||||
firmware_tool-select_source-dev = รุ่นพัฒนา
|
||||
firmware_tool-select_source-not_selected = ยังไม่ได้กำหนดแหล่งเฟิร์มแวร์
|
||||
firmware_tool-select_source-no_boards = ไม่มีเฟิร์มแวร์บอร์ดสำหรับแหล่งนี้
|
||||
firmware_tool-select_source-no_versions = ไม่มีเวอร์ชั่นที่ใช้ได้สำหรับแหล่งนี้
|
||||
firmware_tool-board_defaults = กำหนดค่าบอร์ดของคุณ
|
||||
firmware_tool-board_defaults-description = ตั้งค่า Pin หรือการตั้งค่าที่เกี่ยวข้องกับฮาร์ดแวร์ของคุณ
|
||||
firmware_tool-board_defaults-add = เพิ่ม
|
||||
|
||||
@@ -115,6 +115,11 @@ board_type-XIAO_ESP32C3 = Seeed Studio XIAO ESP32C3
|
||||
board_type-HARITORA = Haritora
|
||||
board_type-ESP32C6DEVKITC1 = Espressif ESP32-C6 DevKitC-1
|
||||
board_type-GLOVE_IMU_SLIMEVR_DEV = SlimeVR开发版IMU手套
|
||||
board_type-GESTURES = 手势
|
||||
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
|
||||
board_type-GENERIC_NRF = nRF系列
|
||||
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR蝴蝶 开发版
|
||||
board_type-SLIMEVR_BUTTERFLY = SlimeVR蝴蝶
|
||||
|
||||
## Proportions
|
||||
|
||||
@@ -262,7 +267,7 @@ serial_detection-close = 关闭
|
||||
|
||||
## Navigation bar
|
||||
|
||||
navbar-home = 主页
|
||||
navbar-home = 主界面
|
||||
navbar-body_proportions = 身体比例
|
||||
navbar-trackers_assign = 追踪器分配
|
||||
navbar-mounting = 佩戴校准
|
||||
@@ -275,7 +280,7 @@ navbar-connect_trackers = 连接追踪器
|
||||
bvh-start_recording = 录制 BVH 文件
|
||||
bvh-stop_recording = 保存 BVH 记录
|
||||
bvh-recording = 录制中...
|
||||
bvh-save_title = 保存BVH记录
|
||||
bvh-save_title = 保存 BVH 记录
|
||||
|
||||
## Tracking pause
|
||||
|
||||
@@ -339,6 +344,7 @@ tracker-table-column-name = 名字
|
||||
tracker-table-column-type = 类型
|
||||
tracker-table-column-battery = 电量
|
||||
tracker-table-column-ping = 延迟
|
||||
tracker-table-column-packet_loss = 丢包
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = 温度 °C
|
||||
tracker-table-column-linear-acceleration = 加速度 X/Y/Z
|
||||
@@ -380,6 +386,9 @@ tracker-infos-magnetometer-status-v1 =
|
||||
[ENABLED] 已启用
|
||||
*[NOT_SUPPORTED] 不支持
|
||||
}
|
||||
tracker-infos-packet_loss = 丢包
|
||||
tracker-infos-packets_lost = 包丢失
|
||||
tracker-infos-packets_received = 包已接收
|
||||
|
||||
## Tracker settings
|
||||
|
||||
@@ -419,6 +428,7 @@ tracker-settings-update = 立即更新
|
||||
tracker-settings-update-title = 固件版本
|
||||
tracker-settings-current-version = 当前版本
|
||||
tracker-settings-latest-version = 最新版本
|
||||
tracker-settings-build-date = 生成日期
|
||||
|
||||
## Tracker part card info
|
||||
|
||||
@@ -526,7 +536,7 @@ settings-general-steamvr-trackers-right_elbow = 右手肘
|
||||
settings-general-steamvr-trackers-left_hand = 左手
|
||||
settings-general-steamvr-trackers-right_hand = 右手
|
||||
settings-general-steamvr-trackers-tracker_toggling = 自动开关追踪器
|
||||
settings-general-steamvr-trackers-tracker_toggling-description = 根据当前已分配的追踪器,自动选择可用的SteamVR虚拟追踪器
|
||||
settings-general-steamvr-trackers-tracker_toggling-description = 根据当前已分配的追踪器,自动选择可用的 SteamVR 虚拟追踪器
|
||||
settings-general-steamvr-trackers-tracker_toggling-label = 自动开关追踪器
|
||||
settings-general-steamvr-trackers-hands-warning =
|
||||
<b>警告:</b>开启手部虚拟追踪器将覆盖手柄的追踪信息。
|
||||
@@ -583,6 +593,9 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
|
||||
在所有有固件支持的追踪器上启用磁力计,在磁场稳定的环境中可以减轻飘移。
|
||||
可以在个别追踪器上禁用本功能。<b>切换此选项时请勿关闭任何一个追踪器的电源!</b>
|
||||
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = 在追踪器上启用磁力计
|
||||
settings-general-tracker_mechanics-trackers_over_usb = 通过USB连接的追踪器
|
||||
settings-general-tracker_mechanics-trackers_over_usb-description = 通过USB接收HID追踪器数据。清确保连接的追踪器启用了 <b>通过HID连接</b> 功能!
|
||||
settings-general-tracker_mechanics-trackers_over_usb-enabled-label = 允许HID追踪器通过USB直接连接
|
||||
settings-stay_aligned = 持续校准
|
||||
settings-stay_aligned-description = 持续校准会逐渐将追踪器对齐到设置的放松姿势,减少追踪器漂移的影响
|
||||
settings-stay_aligned-setup-label = 配置持续校准
|
||||
@@ -753,9 +766,9 @@ settings-interface-behavior-error_tracking-description_v2 =
|
||||
|
||||
为了提供最佳用户体验,我们会收集匿名错误报告、性能指标和操作系统信息。这有助于我们检测 SlimeVR 的错误和问题。这些指标将通过 Sentry.io 收集。
|
||||
settings-interface-behavior-error_tracking-label = 向开发人员发送错误信息
|
||||
settings-interface-behavior-bvh_directory = BVH记录保存目录
|
||||
settings-interface-behavior-bvh_directory-description = 选择保存BVH记录文件的目录
|
||||
settings-interface-behavior-bvh_directory-label = BVH记录保存目录
|
||||
settings-interface-behavior-bvh_directory = BVH 记录保存目录
|
||||
settings-interface-behavior-bvh_directory-description = 选择保存 BVH 记录文件的目录
|
||||
settings-interface-behavior-bvh_directory-label = BVH 记录保存目录
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -1371,6 +1384,7 @@ onboarding-stay_aligned-previous_step = 上一步
|
||||
onboarding-stay_aligned-next_step = 下一步
|
||||
onboarding-stay_aligned-restart = 重新开始
|
||||
onboarding-stay_aligned-done = 完成
|
||||
onboarding-stay_aligned-manual_mounting-done = 完成
|
||||
|
||||
## Home
|
||||
|
||||
@@ -1421,6 +1435,9 @@ firmware_tool-select_source-firmware = 固件来源
|
||||
firmware_tool-select_source-version = 固件版本
|
||||
firmware_tool-select_source-official = 官方
|
||||
firmware_tool-select_source-dev = 开发版
|
||||
firmware_tool-select_source-not_selected = 未选择来源
|
||||
firmware_tool-select_source-no_boards = 此来源无可用的开发板
|
||||
firmware_tool-select_source-no_versions = 此来源无可用的版本
|
||||
firmware_tool-board_defaults = 配置电路板
|
||||
firmware_tool-board_defaults-description = 设置引脚与其他和硬件相关的配置
|
||||
firmware_tool-board_defaults-add = 新增
|
||||
|
||||
@@ -115,6 +115,11 @@ board_type-XIAO_ESP32C3 = Seeed Studio XIAO ESP32C3
|
||||
board_type-HARITORA = Haritora
|
||||
board_type-ESP32C6DEVKITC1 = Espressif ESP32-C6 DevKitC-1
|
||||
board_type-GLOVE_IMU_SLIMEVR_DEV = SlimeVR Dev IMU 手套
|
||||
board_type-GESTURES = litten Yº by Gestures
|
||||
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
|
||||
board_type-GENERIC_NRF = 通用 nRF
|
||||
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
|
||||
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
|
||||
|
||||
## Proportions
|
||||
|
||||
@@ -345,6 +350,7 @@ tracker-table-column-name = 名稱
|
||||
tracker-table-column-type = 類型
|
||||
tracker-table-column-battery = 電量
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-packet_loss = 封包遺失
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = 溫度 ℃
|
||||
tracker-table-column-linear-acceleration = 加速度 X/Y/Z
|
||||
@@ -386,6 +392,9 @@ tracker-infos-magnetometer-status-v1 =
|
||||
[ENABLED] 已啟用
|
||||
*[NOT_SUPPORTED] 不支援
|
||||
}
|
||||
tracker-infos-packet_loss = 封包遺失
|
||||
tracker-infos-packets_lost = 已遺失封包
|
||||
tracker-infos-packets_received = 已接收封包
|
||||
|
||||
## Tracker settings
|
||||
|
||||
@@ -425,6 +434,7 @@ tracker-settings-update = 立即更新
|
||||
tracker-settings-update-title = 韌體版本
|
||||
tracker-settings-current-version = 目前版本
|
||||
tracker-settings-latest-version = 最新版本
|
||||
tracker-settings-build-date = 建置日期
|
||||
|
||||
## Tracker part card info
|
||||
|
||||
@@ -589,6 +599,9 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
|
||||
在所有有韌體支援的追蹤器上使用磁力計,在磁場穩定的環境中可以減緩偏移。
|
||||
開啟此選項後,可以個別在追蹤器選項內停用磁力計。<b>切換此選項時請勿關閉任何一個追蹤器的電源!</b>
|
||||
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = 在追蹤器上啟用磁力計
|
||||
settings-general-tracker_mechanics-trackers_over_usb = 透過 USB 連接的追蹤器
|
||||
settings-general-tracker_mechanics-trackers_over_usb-description = 透過 USB 接收 HID 追蹤器的資料,請確保連接的追蹤器已啟用<b>「透過 HID 連接」</b>的功能。
|
||||
settings-general-tracker_mechanics-trackers_over_usb-enabled-label = 允許 HID 追蹤器透過 USB 直接連接
|
||||
settings-stay_aligned = 持續校正
|
||||
settings-stay_aligned-description = 持續校正功能會逐漸調整追蹤器以對齊到設定的放鬆姿態,進而減少追蹤器偏移的影響。
|
||||
settings-stay_aligned-setup-label = 設定持續校正
|
||||
@@ -947,6 +960,13 @@ onboarding-setup_warning-cancel = 繼續設定
|
||||
## Wi-Fi setup
|
||||
|
||||
onboarding-wifi_creds-back = 返回簡介
|
||||
onboarding-wifi_creds-v2 = 透過 Wi-Fi 連接
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description-v2 =
|
||||
大多數的追蹤器(例如官方的 SlimeVR 追蹤器)使用 Wi-Fi 連接伺服器程式。
|
||||
請輸入目前設備連接的網路的 Wi-Fi 憑證。
|
||||
|
||||
請確保輸入的是 2.4 GHz 頻道的 Wi-Fi 憑證。
|
||||
onboarding-wifi_creds-skip = 跳過 Wi-Fi 設定
|
||||
onboarding-wifi_creds-submit = 送出!
|
||||
onboarding-wifi_creds-ssid =
|
||||
@@ -956,6 +976,10 @@ onboarding-wifi_creds-ssid-required = 必須填寫 Wi-Fi 名稱
|
||||
onboarding-wifi_creds-password =
|
||||
.label = 密碼
|
||||
.placeholder = 輸入密碼
|
||||
onboarding-wifi_creds-dongle-title = 透過接收器連接
|
||||
onboarding-wifi_creds-dongle-description = 如果你的追蹤器有接收器,將其插入你的裝置即可開始使用。
|
||||
onboarding-wifi_creds-dongle-wip = 本部分目前仍在開發階段,將來會推出管理接收器連接追蹤器的專屬頁面。
|
||||
onboarding-wifi_creds-dongle-continue = 使用接收器繼續
|
||||
|
||||
## Mounting setup
|
||||
|
||||
@@ -1362,6 +1386,7 @@ onboarding-stay_aligned-previous_step = 上一步
|
||||
onboarding-stay_aligned-next_step = 下一步
|
||||
onboarding-stay_aligned-restart = 重新開始
|
||||
onboarding-stay_aligned-done = 完成
|
||||
onboarding-stay_aligned-manual_mounting-done = 完成
|
||||
|
||||
## Home
|
||||
|
||||
@@ -1412,6 +1437,9 @@ firmware_tool-select_source-firmware = 韌體來源
|
||||
firmware_tool-select_source-version = 韌體版本
|
||||
firmware_tool-select_source-official = 正式版
|
||||
firmware_tool-select_source-dev = 開發版
|
||||
firmware_tool-select_source-not_selected = 未選擇來源
|
||||
firmware_tool-select_source-no_boards = 此來源沒有可用的開發板
|
||||
firmware_tool-select_source-no_versions = 此來源沒有可用的版本
|
||||
firmware_tool-board_defaults = 設定電路板
|
||||
firmware_tool-board_defaults-description = 設定與硬體相關的腳位或配置
|
||||
firmware_tool-board_defaults-add = 新增
|
||||
|
||||
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 14 KiB |
6
gui/src-tauri/.gitignore
vendored
@@ -1,6 +0,0 @@
|
||||
# Generated by Cargo
|
||||
# will have compiled files and executables
|
||||
/target/
|
||||
WixTools
|
||||
src/JavaVersion.class
|
||||
/gen/schemas
|
||||
@@ -1,3 +0,0 @@
|
||||
export default {
|
||||
'**/*.rs': 'cargo fmt --',
|
||||
};
|
||||
@@ -1,66 +0,0 @@
|
||||
[package]
|
||||
name = "slimevr"
|
||||
version = "0.0.0"
|
||||
|
||||
description = "SlimeVR GUI Application"
|
||||
license.workspace = true
|
||||
repository.workspace = true
|
||||
|
||||
edition.workspace = true
|
||||
rust-version.workspace = true
|
||||
default-run = "slimevr"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[features]
|
||||
# by default Tauri runs in production mode
|
||||
# when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL
|
||||
default = ["custom-protocol"]
|
||||
# this feature is used used for production builds where `devPath` points to the filesystem
|
||||
# DO NOT remove this
|
||||
custom-protocol = ["tauri/custom-protocol"]
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "2.0", features = [] }
|
||||
cfg_aliases = "0.2"
|
||||
shadow-rs = "0.35"
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
tauri = { version = "2.0", features = ["devtools", "tray-icon", "image-png", "rustls-tls"] }
|
||||
tauri-runtime = "2.0"
|
||||
tauri-plugin-dialog = "2.0"
|
||||
tauri-plugin-fs = "2.4.1"
|
||||
tauri-plugin-os = "2.0"
|
||||
tauri-plugin-shell = "2.3.0"
|
||||
tauri-plugin-store = "2.0"
|
||||
flexi_logger = "0.29"
|
||||
log-panics = { version = "2", features = ["with-backtrace"] }
|
||||
log = "0.4"
|
||||
clap = { version = "4.0.29", features = ["derive"] }
|
||||
clap-verbosity-flag = "2"
|
||||
rand = "0.8.5"
|
||||
tempfile = "3"
|
||||
which = "6.0"
|
||||
glob = "0.3"
|
||||
open = "5"
|
||||
shadow-rs = { version = "0.35", default-features = false }
|
||||
const_format = "0.2.30"
|
||||
cfg-if = "1"
|
||||
color-eyre = "0.6"
|
||||
rfd = { version = "0.15", features = ["gtk3"], default-features = false }
|
||||
dirs-next = "2.0.0"
|
||||
discord-sdk = "0.3.6"
|
||||
tokio = { version = "1.37.0", features = ["time"] }
|
||||
itertools = "0.13.0"
|
||||
tauri-plugin-opener = "2.4.0"
|
||||
tauri-plugin-http = "2.5.0"
|
||||
tauri-plugin-log = "2"
|
||||
|
||||
[target.'cfg(windows)'.dependencies]
|
||||
win32job = "1"
|
||||
winreg = "0.52"
|
||||
|
||||
[target.'cfg(target_os = "linux")'.dependencies]
|
||||
libloading = "0.8"
|
||||
@@ -1,15 +0,0 @@
|
||||
use cfg_aliases::cfg_aliases;
|
||||
|
||||
fn main() -> shadow_rs::SdResult<()> {
|
||||
// Bypass for Nix script having libudev-zero and Tauri not liking it
|
||||
if let Some(path) = option_env!("SLIMEVR_RUST_LD_LIBRARY_PATH") {
|
||||
println!("cargo:rustc-env=LD_LIBRARY_PATH={path}");
|
||||
}
|
||||
|
||||
tauri_build::build();
|
||||
cfg_aliases! {
|
||||
mobile: { any(target_os = "ios", target_os = "android") },
|
||||
desktop: { not(any(target_os = "ios", target_os = "android")) }
|
||||
}
|
||||
shadow_rs::new()
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
{
|
||||
"identifier": "migrated",
|
||||
"description": "permissions that were migrated from v1",
|
||||
"local": true,
|
||||
"windows": [
|
||||
"main"
|
||||
],
|
||||
"permissions": [
|
||||
"core:default",
|
||||
"core:window:allow-close",
|
||||
"core:window:allow-toggle-maximize",
|
||||
"core:window:allow-minimize",
|
||||
"core:window:allow-start-dragging",
|
||||
"core:window:allow-hide",
|
||||
"core:window:allow-show",
|
||||
"core:window:allow-set-focus",
|
||||
"core:window:allow-destroy",
|
||||
"core:window:allow-request-user-attention",
|
||||
"core:window:allow-set-decorations",
|
||||
"store:default",
|
||||
"os:allow-os-type",
|
||||
"os:allow-hostname",
|
||||
"os:allow-locale",
|
||||
"dialog:allow-open",
|
||||
"dialog:allow-save",
|
||||
"shell:allow-open",
|
||||
"store:allow-get",
|
||||
"store:allow-set",
|
||||
"store:allow-save",
|
||||
"fs:allow-write-text-file",
|
||||
"fs:allow-read-text-file",
|
||||
"fs:allow-exists",
|
||||
{
|
||||
"identifier": "fs:scope",
|
||||
"allow": [
|
||||
{
|
||||
"path": "$APPDATA"
|
||||
},
|
||||
{
|
||||
"path": "$APPDATA/**"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"identifier": "opener:allow-open-url",
|
||||
"allow": [
|
||||
{
|
||||
"url": "steam:*"
|
||||
},
|
||||
{
|
||||
"url": "ms-settings:network"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"identifier": "http:default",
|
||||
"allow": [
|
||||
{
|
||||
"url": "https://github.com/SlimeVR/SlimeVR-Tracker-ESP/releases/download/*"
|
||||
}
|
||||
]
|
||||
},
|
||||
"opener:default",
|
||||
"log:default"
|
||||
]
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Version=1.5
|
||||
Categories=Game;GTK;
|
||||
Exec={{exec}}
|
||||
Icon={{icon}}
|
||||
|
||||
Name=SlimeVR
|
||||
GenericName=Full-body tracking
|
||||
Comment=An app for facilitating full-body tracking in virtual reality
|
||||
Keywords=FBT;VR;Steam;VRChat;IMU
|
||||
|
||||
Terminal=false
|
||||
Type=Application
|
||||
@@ -1,139 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
dev.slimevr.SlimeVR.metainfo.xml by SlimeVR contributors
|
||||
|
||||
To the extent possible under law, the person who associated CC0 with
|
||||
dev.slimevr.SlimeVR.metainfo.xml has waived all copyright and related or neighboring rights
|
||||
to dev.slimevr.SlimeVR.metainfo.xml.
|
||||
|
||||
You should have received a copy of the CC0 legalcode along with this
|
||||
work. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||
-->
|
||||
<component type="desktop-application">
|
||||
<id>dev.slimevr.SlimeVR</id>
|
||||
|
||||
<name>SlimeVR</name>
|
||||
<summary>Accessible full-body tracking in VR</summary>
|
||||
<developer_name>SlimeVR Team</developer_name>
|
||||
|
||||
<!-- CC0 so attribution is not required -->
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>MIT OR Apache-2.0</project_license>
|
||||
|
||||
<content_rating type="oars-1.1" />
|
||||
<url type="homepage">https://slimevr.dev/</url>
|
||||
<url type="bugtracker">https://github.com/SlimeVR/SlimeVR-Server/issues</url>
|
||||
<url type="faq">https://docs.slimevr.dev/slimevr101.html</url>
|
||||
<url type="donation">https://github.com/sponsors/SlimeVR</url>
|
||||
<url type="vcs-browser">https://github.com/SlimeVR/SlimeVR-Server</url>
|
||||
<url type="translate">https://i18n.slimevr.dev</url>
|
||||
<url type="help">https://docs.slimevr.dev/server-setup/slimevr-setup.html</url>
|
||||
<url type="contribute">https://github.com/SlimeVR/SlimeVR-Server/blob/main/CONTRIBUTING.md</url>
|
||||
<url type="contact">https://discord.gg/SlimeVR</url>
|
||||
<recommends>
|
||||
<display_length compare="ge">300</display_length>
|
||||
</recommends>
|
||||
<supports>
|
||||
<control>pointing</control>
|
||||
<control>keyboard</control>
|
||||
<control>touch</control>
|
||||
</supports>
|
||||
|
||||
<branding>
|
||||
<color type="primary" scheme_preference="light">#BB8AE5</color>
|
||||
<color type="primary" scheme_preference="dark">#663499</color>
|
||||
</branding>
|
||||
|
||||
<description>
|
||||
<p>
|
||||
SlimeVR is a set of open hardware sensors and open source software that facilitates full-body
|
||||
tracking (FBT) in virtual reality. With no base station required, SlimeVR makes wireless
|
||||
VR FBT affordable and comfortable.
|
||||
</p>
|
||||
</description>
|
||||
|
||||
<launchable type="desktop-id">dev.slimevr.SlimeVR.desktop</launchable>
|
||||
<launchable type="desktop-id">safe-mode.dev.slimevr.SlimeVR.desktop</launchable>
|
||||
<screenshots>
|
||||
<screenshot type="default" xml:lang="en">
|
||||
<caption>The onboarding for the GUI</caption>
|
||||
<image>https://raw.githubusercontent.com/SlimeVR/SlimeVR-Server/main/assets/img/onboarding.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
|
||||
<provides>
|
||||
<binary>slimevr</binary>
|
||||
</provides>
|
||||
|
||||
<releases>
|
||||
<release version="0.16.2" date="2025-08-01"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.2</url></release>
|
||||
<release version="0.16.1" date="2025-07-27"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.1</url></release>
|
||||
<release version="0.16.1~rc.2" type="development" date="2025-07-17"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.1-rc.2</url></release>
|
||||
<release version="0.16.1~rc.1" type="development" date="2025-07-04"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.1-rc.1</url></release>
|
||||
<release version="0.16.0" date="2025-07-01"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.0</url></release>
|
||||
<release version="0.16.0~rc.2" type="development" date="2025-06-20"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.0-rc.2</url></release>
|
||||
<release version="0.16.0~rc.1" type="development" date="2025-05-27"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.0-rc.1</url></release>
|
||||
<release version="0.15.0" date="2025-05-19"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0</url></release>
|
||||
<release version="0.15.0~rc.4" type="development" date="2025-05-12"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0-rc.4</url></release>
|
||||
<release version="0.15.0~rc.3" type="development" date="2025-04-28"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0-rc.3</url></release>
|
||||
<release version="0.15.0~rc.2" type="development" date="2025-04-25"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0-rc.2</url></release>
|
||||
<release version="0.15.0~rc.1" type="development" date="2025-04-23"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0-rc.1</url></release>
|
||||
<release version="0.14.1" date="2025-04-15"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.14.1</url></release>
|
||||
<release version="0.14.0" date="2025-04-10"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.14.0</url></release>
|
||||
<release version="0.14.0~rc.2" type="development" date="2025-03-25"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.14.0-rc.2</url></release>
|
||||
<release version="0.14.0~rc.1" type="development" date="2025-02-12"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.14.0-rc1</url></release>
|
||||
<release version="0.13.2" date="2024-11-06"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.2</url></release>
|
||||
<release version="0.13.1" date="2024-11-05"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.1</url></release>
|
||||
<release version="0.13.1~rc.3" type="development" date="2024-10-31"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.1-rc.3</url></release>
|
||||
<release version="0.13.1~rc.2" type="development" date="2024-10-26"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.1-rc.2</url></release>
|
||||
<release version="0.13.1~rc.1" type="development" date="2024-10-16"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.1-rc.1</url></release>
|
||||
<release version="0.13.0" date="2024-09-20"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0</url></release>
|
||||
<release version="0.13.0~rc.4" type="development" date="2024-09-13"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.4</url></release>
|
||||
<release version="0.13.0~rc.3" type="development" date="2024-08-14"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.3</url></release>
|
||||
<release version="0.13.0~rc.2" type="development" date="2024-08-08"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.2</url></release>
|
||||
<release version="0.13.0~rc.1" type="development" date="2024-08-02"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.1</url></release>
|
||||
<release version="0.12.1" date="2024-04-29"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.1</url></release>
|
||||
<release version="0.12.0" date="2024-04-26"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0</url></release>
|
||||
<release version="0.12.0~rc.4" type="development" date="2024-04-21"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.4</url></release>
|
||||
<release version="0.12.0~rc.3" type="development" date="2024-04-14"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.3</url></release>
|
||||
<release version="0.12.0~rc.2" type="development" date="2024-04-09"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.2</url></release>
|
||||
<release version="0.12.0~rc.1" type="development" date="2024-04-04"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.1</url></release>
|
||||
<release version="0.11.0" date="2023-12-23"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.11.0</url></release>
|
||||
<release version="0.11.0~rc.2" type="development" date="2023-12-08"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.11.0-rc.2</url></release>
|
||||
<release version="0.11.0~rc.1" type="development" date="2023-11-23"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.11.0-rc.1</url></release>
|
||||
<release version="0.10.1" date="2023-09-30"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.1</url></release>
|
||||
<release version="0.10.1~rc.1" type="development" date="2023-09-29"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.1-rc.1</url></release>
|
||||
<release version="0.10.0" date="2023-09-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.0</url></release>
|
||||
<release version="0.10.0~rc.2" type="development" date="2023-09-15"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.0-rc.2</url></release>
|
||||
<release version="0.10.0~rc.1" type="development" date="2023-09-02"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.0-rc.1</url></release>
|
||||
<release version="0.9.1" date="2023-08-30"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1</url></release>
|
||||
<release version="0.9.1~rc.4" type="development" date="2023-08-28"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.4</url></release>
|
||||
<release version="0.9.1~rc.3" type="development" date="2023-08-19"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.3</url></release>
|
||||
<release version="0.9.1~rc.2" type="development" date="2023-08-15"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.2</url></release>
|
||||
<release version="0.9.1~rc.1" type="development" date="2023-08-13"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.1</url></release>
|
||||
<release version="0.9.0" date="2023-08-05"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0</url></release>
|
||||
<release version="0.9.0~rc.2" type="development" date="2023-08-02"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0-rc.2</url></release>
|
||||
<release version="0.9.0~rc.1" type="development" date="2023-07-31"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0-rc.1</url></release>
|
||||
<release version="0.8.3" date="2023-07-09"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.3</url></release>
|
||||
<release version="0.8.2" date="2023-07-09"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.2</url></release>
|
||||
<release version="0.8.2~rc.1" type="development" date="2023-07-07"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.2-rc.1</url></release>
|
||||
<release version="0.8.1" date="2023-07-04"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.1</url></release>
|
||||
<release version="0.8.0" date="2023-06-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0</url></release>
|
||||
<release version="0.8.0~rc.3" type="development" date="2023-06-20"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.3</url></release>
|
||||
<release version="0.8.0~rc.2" type="development" date="2023-06-15"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.2</url></release>
|
||||
<release version="0.8.0~rc.1" type="development" date="2023-06-01"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.1</url></release>
|
||||
<release version="0.7.1" date="2023-04-14"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.7.1</url></release>
|
||||
<release version="0.7.0" date="2023-04-11"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.7.0</url></release>
|
||||
<release version="0.6.3" date="2023-02-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.3</url></release>
|
||||
<release version="0.6.2" date="2023-02-17"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.2</url></release>
|
||||
<release version="0.6.1" date="2023-02-12"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.1</url></release>
|
||||
<release version="0.6.0" date="2023-01-05"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.0</url></release>
|
||||
<release version="0.5.1" date="2022-12-12"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.5.1</url></release>
|
||||
<release version="0.5.0" date="2022-12-07"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.5.0</url></release>
|
||||
<release version="0.4.0" date="2022-11-24"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.4.0</url></release>
|
||||
<release version="0.3.1" date="2022-11-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.3.1</url></release>
|
||||
<release version="0.3.0" date="2022-11-16"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.3.0</url></release>
|
||||
<release version="0.2.1" date="2022-08-24"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.2.1</url></release>
|
||||
<release version="0.2.0" date="2022-06-28"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.2.0</url></release>
|
||||
</releases>
|
||||
</component>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |