mirror of
https://github.com/getumbrel/umbrel.git
synced 2026-10-12 02:14:08 +00:00
Merge branch 'master' into staging-1.3.0
This commit is contained in:
@@ -50,4 +50,4 @@ jobs:
|
||||
packages/os/build/*.update
|
||||
packages/os/build/*.img.zip
|
||||
packages/os/build/*.img.xz
|
||||
packages/os/usb-installer/build/*.img.xz
|
||||
packages/os/usb-installer/build/*.iso.xz
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
name: Update Translations in PR
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened]
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
update-translations:
|
||||
timeout-minutes: 3
|
||||
permissions:
|
||||
contents: write
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- name: Check if enabled
|
||||
run: |
|
||||
if [[ "${{ secrets.TRANSLATIONS_ACTION_IS_ENABLED }}" != "true" ]]; then
|
||||
echo "Translation generation is disabled."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Use bun
|
||||
uses: oven-sh/setup-bun@f4d14e03ff726c06358e5557344e1da148b56cf7 # v1.2.2
|
||||
|
||||
- name: Install dependencies
|
||||
run:
|
||||
bun install
|
||||
working-directory: packages/ui
|
||||
|
||||
- name: Update translations
|
||||
env:
|
||||
TRANSLATIONS_OPENAI_API_KEY: ${{ secrets.TRANSLATIONS_OPENAI_API_KEY }}
|
||||
TRANSLATIONS_OPENAI_MODEL: ${{ secrets.TRANSLATIONS_OPENAI_MODEL }}
|
||||
TRANSLATIONS_SYSTEM_PROMPT: ${{ secrets.TRANSLATIONS_SYSTEM_PROMPT }}
|
||||
TRANSLATIONS_USER_PROMPT: ${{ secrets.TRANSLATIONS_USER_PROMPT }}
|
||||
run: |
|
||||
bun update-translations.js
|
||||
rm -f bun.lockb
|
||||
working-directory: packages/ui
|
||||
|
||||
- name: Push changes
|
||||
uses: stefanzweifel/git-auto-commit-action@8621497c8c39c72f3e2a999a26b4ca1b5058a842 # v5.0.1
|
||||
with:
|
||||
commit_message: Update translations
|
||||
@@ -8,13 +8,7 @@
|
||||
<a href="https://umbrel.com"><strong>umbrel.com »</strong></a>
|
||||
<br />
|
||||
<br />
|
||||
Buy an <a href="https://umbrel.com/umbrel-home">Umbrel Home</a> or install on:
|
||||
<br />
|
||||
<a href="https://umbrel.com/umbrelos#install">Raspberry Pi 4</a>
|
||||
·
|
||||
<a href="https://umbrel.com/umbrelos#install">Raspberry Pi 5</a>
|
||||
·
|
||||
<a href="https://github.com/getumbrel/umbrel/wiki/Install-umbrelOS-on-x86-systems">Any x86 system</a>
|
||||
Buy an <a href="https://umbrel.com/umbrel-home">Umbrel Home</a> or install on a <a href="https://github.com/getumbrel/umbrel/wiki/Install-umbrelOS-on-a-Raspberry-Pi-5">Raspberry Pi 5</a> or <a href="https://github.com/getumbrel/umbrel/wiki/Install-umbrelOS-on-x86-systems">any x86 system</a>.
|
||||
<br />
|
||||
<br />
|
||||
<a href="https://twitter.com/umbrel">
|
||||
@@ -34,16 +28,12 @@
|
||||
|
||||
<br />
|
||||
|
||||
[](https://www.youtube.com/watch?v=Q-vmmboobEM)
|
||||
|
||||
<br />
|
||||
|
||||
<p align="center">
|
||||
At Umbrel, we believe that everyone should be able to enjoy the convenience and benefits of the cloud, without giving up ownership and control of their data.
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
To achieve our vision, we're building a new kind of personal server OS. Instead of paying ransoms for storing your data on someone else's computer while they auction it off to advertisers — you can now easily spin up a server and self-host your data and services at home.
|
||||
To achieve our vision, we're building a new kind of a home server OS. Instead of paying ransoms for storing your data on someone else's computer while they auction it off to advertisers — you can now easily spin up a server and self-host your data and services at home.
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
@@ -56,8 +46,10 @@ Just like the cloud, but one that you own and control.
|
||||
|
||||
## Installing umbrelOS
|
||||
|
||||
- [Instructions to install umbrelOS on a Raspberry Pi 4 and Pi 5](https://umbrel.com/umbrelos#install)
|
||||
- [Instructions to install umbrelOS on any x86 system](https://github.com/getumbrel/umbrel/wiki/Install-umbrelOS-on-x86-systems)
|
||||
- [Install umbrelOS on a Raspberry Pi 5](https://github.com/getumbrel/umbrel/wiki/Install-umbrelOS-on-a-Raspberry-Pi-5)
|
||||
- [Install umbrelOS on any x86 system](https://github.com/getumbrel/umbrel/wiki/Install-umbrelOS-on-x86-Systems)
|
||||
- [Install umbrelOS in a VM](https://github.com/getumbrel/umbrel/wiki/Install-umbrelOS-on-a-Linux-VM)
|
||||
|
||||
|
||||
## Umbrel App Store
|
||||
|
||||
@@ -65,6 +57,24 @@ Just like the cloud, but one that you own and control.
|
||||
|
||||
Here are some of the apps available in the Umbrel App Store. For the complete list of apps, visit [apps.umbrel.com](https://apps.umbrel.com/).
|
||||
|
||||
#### Files & Productivity
|
||||
|
||||
- [Calibre Web](https://apps.umbrel.com/app/calibre-web) — A clean web app for your eBooks
|
||||
- [Nextcloud](https://apps.umbrel.com/app/nextcloud) — Productivity platform that keeps you in control
|
||||
- [Immich](https://apps.umbrel.com/app/immich) - High performance photo and video backup solution
|
||||
- [PhotoPrism](https://apps.umbrel.com/app/photoprism) — Self-host your photo and video library
|
||||
- [SyncThing](https://apps.umbrel.com/app/syncthing) — Peer-to-peer file synchronization between your devices
|
||||
- [Vaultwarden](https://apps.umbrel.com/app/vaultwarden) — Unofficial Bitwarden® compatible server
|
||||
|
||||
#### Media
|
||||
|
||||
- [Jellyfin](https://apps.umbrel.com/app/jellyfin) — The Free Software Media System
|
||||
- [Lidarr](https://apps.umbrel.com/app/lidarr) — Looks and smells like Sonarr but made for music
|
||||
- [Plex](https://apps.umbrel.com/app/plex) — Stream Movies & TV Shows
|
||||
- [Prowlarr](https://apps.umbrel.com/app/prowlarr) — Indexer manager/proxy for Sonarr, Radarr, and Lidarr
|
||||
- [Radarr](https://apps.umbrel.com/app/radarr) — Your movie collection manager
|
||||
- [Sonarr](https://apps.umbrel.com/app/sonarr) — Smart PVR for newsgroup and bittorrent users
|
||||
|
||||
#### Bitcoin & Finance
|
||||
|
||||
- [Bitcoin Node](https://apps.umbrel.com/app/bitcoin) — Run your personal node powered by Bitcoin Core
|
||||
@@ -89,24 +99,6 @@ Here are some of the apps available in the Umbrel App Store. For the complete li
|
||||
- [ChatBot UI](https://apps.umbrel.com/app/chatbot-ui) - ChatGPT but better
|
||||
- [Chatpad AI](https://apps.umbrel.com/app/chatpad-ai) - Premium quality UI for ChatGPT
|
||||
|
||||
#### Files & Productivity
|
||||
|
||||
- [Calibre Web](https://apps.umbrel.com/app/calibre-web) — A clean web app for your eBooks
|
||||
- [Nextcloud](https://apps.umbrel.com/app/nextcloud) — Productivity platform that keeps you in control
|
||||
- [Immich](https://apps.umbrel.com/app/immich) - High performance photo and video backup solution
|
||||
- [PhotoPrism](https://apps.umbrel.com/app/photoprism) — Self-host your photo and video library
|
||||
- [SyncThing](https://apps.umbrel.com/app/syncthing) — Peer-to-peer file synchronization between your devices
|
||||
- [Vaultwarden](https://apps.umbrel.com/app/vaultwarden) — Unofficial Bitwarden® compatible server
|
||||
|
||||
#### Media
|
||||
|
||||
- [Jellyfin](https://apps.umbrel.com/app/jellyfin) — The Free Software Media System
|
||||
- [Lidarr](https://apps.umbrel.com/app/lidarr) — Looks and smells like Sonarr but made for music
|
||||
- [Plex](https://apps.umbrel.com/app/plex) — Stream Movies & TV Shows
|
||||
- [Prowlarr](https://apps.umbrel.com/app/prowlarr) — Indexer manager/proxy for Sonarr, Radarr, and Lidarr
|
||||
- [Radarr](https://apps.umbrel.com/app/radarr) — Your movie collection manager
|
||||
- [Sonarr](https://apps.umbrel.com/app/sonarr) — Smart PVR for newsgroup and bittorrent users
|
||||
|
||||
#### Networking
|
||||
|
||||
- [Pi-hole](https://apps.umbrel.com/app/pi-hole) — Block ads on your entire network
|
||||
|
||||
+2
-13
@@ -1,17 +1,6 @@
|
||||
{
|
||||
"scripts": {
|
||||
"vm:provision": "multipass launch --name umbrel-dev --cpus 4 --memory 8G --disk 50G --mount $PWD:/opt/umbrel-mount 23.10 && multipass exec umbrel-dev -- /opt/umbrel-mount/scripts/vm provision",
|
||||
"vm:shell": "multipass shell umbrel-dev",
|
||||
"vm:exec": "multipass exec --working-directory /home/ubuntu umbrel-dev --",
|
||||
"vm:logs": "multipass exec umbrel-dev -- journalctl --unit umbreld-production --unit umbreld --unit ui --follow --lines 100 --output cat",
|
||||
"vm:enable-development": "multipass exec umbrel-dev -- /opt/umbrel-mount/scripts/vm enable-development",
|
||||
"vm:enable-production": "multipass exec umbrel-dev -- /opt/umbrel-mount/scripts/vm enable-production",
|
||||
"vm:install-deps": "multipass exec umbrel-dev -- /opt/umbrel-mount/scripts/vm install-deps",
|
||||
"vm:trpc": "npm run --silent vm:exec -- UMBREL_DATA_DIR=./data UMBREL_TRPC_ENDPOINT=http://localhost/trpc npm --prefix /home/ubuntu/umbrel/packages/umbreld run start -- client",
|
||||
"vm:start": "multipass start umbrel-dev",
|
||||
"vm:stop": "multipass stop umbrel-dev",
|
||||
"vm:restart": "multipass restart umbrel-dev",
|
||||
"vm:destroy": "multipass delete umbrel-dev && multipass purge",
|
||||
"vm:remount": "multipass mount . umbrel-dev:/opt/umbrel-mount"
|
||||
"dev": "./scripts/umbrel-dev",
|
||||
"dev:help": "npm run dev help"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ apt-get install -y raspberrypi-archive-keyring
|
||||
apt-get install -y \
|
||||
initramfs-tools \
|
||||
raspi-firmware \
|
||||
firmware-brcm80211 \
|
||||
linux-image-rpi-v8 \
|
||||
linux-headers-rpi-v8 \
|
||||
linux-image-rpi-2712 \
|
||||
|
||||
@@ -1 +1 @@
|
||||
console=serial0,115200 console=tty1 rootfstype=ext4 fsck.repair=yes rootwait cgroup_enable=memory swapaccount=1 usb-storage.quirks=152d:1561:u,152d:1576:u,152d:0578:u,125f:a76a:u,04e8:61b6:u
|
||||
console=serial0,115200 console=tty1 rootfstype=ext4 fsck.repair=yes rootwait cgroup_enable=memory swapaccount=1 loglevel=3 usb-storage.quirks=152d:1561:u,152d:1576:u,152d:0578:u,125f:a76a:u,04e8:61b6:u
|
||||
@@ -7,3 +7,13 @@ max_framebuffers=2
|
||||
|
||||
# We want to run the processor in its 64-bit mode.
|
||||
arm_64bit=1
|
||||
|
||||
# Enable NVMe interface
|
||||
# This is not needed if booting with NVMe so potentially
|
||||
# we only want to support that and don't need this.
|
||||
dtparam=nvme
|
||||
|
||||
# This may improve NVMe performance but is not stable:
|
||||
# > The Raspberry Pi 5 is not certified for Gen 3.0 speeds. PCIe Gen 3.0 connections may be unstable.
|
||||
# - https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#pcie-gen-3-0
|
||||
# dtparam=pciex1_gen=3
|
||||
-14
@@ -1,14 +0,0 @@
|
||||
[Unit]
|
||||
Description=Repartition Root Disk
|
||||
DefaultDependencies=no
|
||||
Conflicts=shutdown.target
|
||||
After=initrd-usr-fs.target
|
||||
Before=initrd-root-fs.target shutdown.target data.mount [email protected]
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/bin/systemd-repart --dry-run=no
|
||||
|
||||
[Install]
|
||||
WantedBy=data.mount
|
||||
-14
@@ -1,14 +0,0 @@
|
||||
[Unit]
|
||||
Description=Repartition Root Disk
|
||||
DefaultDependencies=no
|
||||
Conflicts=shutdown.target
|
||||
After=initrd-usr-fs.target
|
||||
Before=initrd-root-fs.target shutdown.target data.mount [email protected]
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/bin/systemd-repart --dry-run=no
|
||||
|
||||
[Install]
|
||||
WantedBy=data.mount
|
||||
@@ -1,14 +0,0 @@
|
||||
[Unit]
|
||||
Description=Repartition Root Disk
|
||||
DefaultDependencies=no
|
||||
Conflicts=shutdown.target
|
||||
After=initrd-usr-fs.target
|
||||
Before=initrd-root-fs.target shutdown.target data.mount [email protected]
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/bin/systemd-repart --dry-run=no
|
||||
|
||||
[Install]
|
||||
WantedBy=data.mount
|
||||
@@ -37,6 +37,15 @@ check_dependencies () {
|
||||
done
|
||||
}
|
||||
|
||||
running_off_sdcard() {
|
||||
if df -h | grep --silent /dev/mmcblk0
|
||||
then
|
||||
echo "true"
|
||||
else
|
||||
echo "false"
|
||||
fi
|
||||
}
|
||||
|
||||
# Returns a list of block device paths
|
||||
list_block_devices () {
|
||||
# We need to run sync here to make sure the filesystem is reflecting the
|
||||
@@ -48,19 +57,49 @@ list_block_devices () {
|
||||
#
|
||||
# sed 's!.*/!!' is to return the device path so we get sda
|
||||
# instead of /sys/block/sda
|
||||
(ls -d /sys/block/sd* 2>/dev/null || true) | sed 's!.*/!!'
|
||||
(ls -d /sys/block/sd* /sys/block/nvme0n* 2>/dev/null || true) | sed 's!.*/!!'
|
||||
}
|
||||
|
||||
# Returns the vendor and model name of a block device
|
||||
get_block_device_model () {
|
||||
device="${1}"
|
||||
vendor=$(cat "/sys/block/${device}/device/vendor")
|
||||
|
||||
if [[ "${device}" == nvme* ]]; then
|
||||
vendor=$(cat "/sys/block/${device}/device/device/vendor")
|
||||
else
|
||||
vendor=$(cat "/sys/block/${device}/device/vendor")
|
||||
fi
|
||||
model=$(cat "/sys/block/${device}/device/model")
|
||||
|
||||
# We echo in a subshell without quotes to strip surrounding whitespace
|
||||
echo "$(echo $vendor) $(echo $model)"
|
||||
}
|
||||
|
||||
# Returns the path of the first partition of a block device
|
||||
get_first_partition_path () {
|
||||
device_path="${1}"
|
||||
if [[ "${device_path}" == /dev/nvme* ]]; then
|
||||
echo "${device_path}p1"
|
||||
else
|
||||
echo "${device_path}1"
|
||||
fi
|
||||
}
|
||||
|
||||
# Check if a block device contains partition layout that looks like
|
||||
# an umbrelOS install
|
||||
is_device_umbrelos_install () {
|
||||
device_path="${1}"
|
||||
|
||||
# Having a 7th partition with the label "data" is a good indicator
|
||||
# this is an umbrelOS install
|
||||
if blkid | grep "${device_path}.*7: " | grep --silent 'LABEL="data"'
|
||||
then
|
||||
echo "true"
|
||||
else
|
||||
echo "false"
|
||||
fi
|
||||
}
|
||||
|
||||
is_partition_ext4 () {
|
||||
partition_path="${1}"
|
||||
# We need to run sync here to make sure the filesystem is reflecting the
|
||||
@@ -73,7 +112,7 @@ is_partition_ext4 () {
|
||||
format_block_device () {
|
||||
device="${1}"
|
||||
device_path="/dev/${device}"
|
||||
partition_path="${device_path}1"
|
||||
partition_path=$(get_first_partition_path "${device_path}")
|
||||
wipefs -a "${device_path}"
|
||||
parted --script "${device_path}" mklabel gpt
|
||||
parted --script "${device_path}" mkpart primary ext4 0% 100%
|
||||
@@ -127,6 +166,12 @@ main () {
|
||||
check_root
|
||||
check_dependencies sed wipefs parted mount sync umount
|
||||
|
||||
if [[ "$(running_off_sdcard)" == "false" ]]
|
||||
then
|
||||
echo "This script should only run when umbrelOS boots from an SD card, exiting..."
|
||||
exit
|
||||
fi
|
||||
|
||||
no_of_block_devices=$(list_block_devices | wc -l)
|
||||
|
||||
retry_for_block_devices=1
|
||||
@@ -167,10 +212,18 @@ main () {
|
||||
# At this point we know there is only one block device attached
|
||||
block_device=$(list_block_devices)
|
||||
block_device_path="/dev/${block_device}"
|
||||
partition_path="${block_device_path}1"
|
||||
partition_path=$(get_first_partition_path "${block_device_path}")
|
||||
block_device_model=$(get_block_device_model $block_device)
|
||||
echo "Found device \"${block_device_model}\""
|
||||
|
||||
echo "Checking if the device contains an umbrelOS install..."
|
||||
if [[ $(is_device_umbrelos_install "${block_device_path}") == "true" ]]
|
||||
then
|
||||
echo "Yes, it looks like this device is an umbrelOS install not a data drive, refusing to wipe it and exiting..."
|
||||
exit 1
|
||||
fi
|
||||
echo "No, it's not"
|
||||
|
||||
echo "Checking if the device is ext4..."
|
||||
|
||||
if is_partition_ext4 "${partition_path}" ; then
|
||||
@@ -226,13 +279,13 @@ main () {
|
||||
echo "Checking Umbrel root is now on external storage..."
|
||||
sync
|
||||
sleep 1
|
||||
df -h "${UMBREL_ROOT}" | grep --quiet '/dev/sd'
|
||||
df -h "${UMBREL_ROOT}" | grep --quiet '/dev/sd\|/dev/nvme'
|
||||
|
||||
echo "Checking ${DOCKER_DIR} is now on external storage..."
|
||||
df -h "${DOCKER_DIR}" | grep --quiet '/dev/sd'
|
||||
df -h "${DOCKER_DIR}" | grep --quiet '/dev/sd\|/dev/nvme'
|
||||
|
||||
echo "Checking ${SWAP_DIR} is now on external storage..."
|
||||
df -h "${SWAP_DIR}" | grep --quiet '/dev/sd'
|
||||
df -h "${SWAP_DIR}" | grep --quiet '/dev/sd\|/dev/nvme'
|
||||
|
||||
echo "Setting up swapfile"
|
||||
rm "${SWAP_FILE}" || true
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
[main]
|
||||
plugins=ifupdown,keyfile
|
||||
dhcp=dhclient
|
||||
|
||||
[ifupdown]
|
||||
managed=false
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# <device> <dir> <type> <options> <dump> <fsck>
|
||||
/ /mnt/root none bind 0 0
|
||||
/data/umbrel-os/var/log /var/log none bind 0 0
|
||||
/data/umbrel-os/var/lib/docker /var/lib/docker none bind 0 0
|
||||
/data/umbrel-os/home /home none bind 0 0
|
||||
# <device> <dir> <type> <options> <dump> <fsck>
|
||||
/ /mnt/root none bind 0 0
|
||||
/data/umbrel-os/var/log /var/log none bind 0 0
|
||||
/data/umbrel-os/var/lib/docker /var/lib/docker none bind 0 0
|
||||
/data/umbrel-os/home /home none bind 0 0
|
||||
/data/umbrel-os/var/lib/systemd/timesync /var/lib/systemd/timesync none bind 0 0
|
||||
@@ -1,3 +0,0 @@
|
||||
# Append the Cloudflare NTS server to the list of NTP servers.
|
||||
# This helps some users who have issues connecting to the default Debian ntp pool.
|
||||
server time.cloudflare.com nts
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../umbrel-tty-message.service
|
||||
@@ -0,0 +1,10 @@
|
||||
[Unit]
|
||||
Description=Display Umbrel access information on TTY
|
||||
After=umbrel.service
|
||||
|
||||
[Service]
|
||||
ExecStart=/opt/umbrel-tty-message/umbrel-tty-message
|
||||
Type=oneshot
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,6 @@
|
||||
# We default to Cloudflare for NTP because some users have issues
|
||||
# connecting to the default Debian ntp pool. If Cloudflare fails
|
||||
# the Debian ntp pool is still used as a fallback.
|
||||
|
||||
[Time]
|
||||
NTP=time.cloudflare.com
|
||||
@@ -0,0 +1,36 @@
|
||||
#!/bin/bash
|
||||
|
||||
get_addresses() {
|
||||
# Get all active wifi and ethernet interfaces
|
||||
local active_interfaces=$(nmcli --terse --fields TYPE,DEVICE con show --active | grep 'ethernet\|wireless' | cut -d ':' -f 2)
|
||||
for interface in $active_interfaces; do
|
||||
# Get the interface IP
|
||||
local ip=$(nmcli --terse --fields IP4.ADDRESS dev show "${interface}" | grep 'IP4.ADDRESS' | cut -d':' -f2 | cut -d'/' -f1)
|
||||
|
||||
# Return the IP
|
||||
echo "${ip}"
|
||||
|
||||
# Return the avahi address
|
||||
avahi-resolve -a "${ip}" | cut -f 2
|
||||
done
|
||||
}
|
||||
|
||||
# Wait for addresses to be assigned
|
||||
while true
|
||||
do
|
||||
addresses=$(get_addresses | sort -r | uniq)
|
||||
[[ "${addresses}" != "" ]] && break
|
||||
sleep 1
|
||||
done
|
||||
|
||||
# Format addresses for printing
|
||||
formatted_addresses=$(echo "${addresses}" | sed 's/^/ http:\/\//')
|
||||
|
||||
# Clear TTY
|
||||
echo -e "\033c" > /dev/tty1
|
||||
|
||||
# Write TTY message
|
||||
echo -n "Your Umbrel is now accessible at:
|
||||
${formatted_addresses}
|
||||
|
||||
umbrel login: " > /dev/tty1
|
||||
@@ -87,10 +87,10 @@ RUN apt-get install --yes acpid
|
||||
RUN systemctl enable acpid
|
||||
|
||||
# Install essential networking services
|
||||
RUN apt-get install --yes isc-dhcp-client network-manager ntp openssh-server
|
||||
RUN apt-get install --yes network-manager systemd-timesyncd openssh-server
|
||||
|
||||
# Install essential system utilities
|
||||
RUN apt-get install --yes sudo nano vim less man iproute2 iputils-ping curl wget ca-certificates dmidecode usbutils
|
||||
RUN apt-get install --yes sudo nano vim less man iproute2 iputils-ping curl wget ca-certificates dmidecode usbutils avahi-utils
|
||||
|
||||
# Add Umbrel user
|
||||
RUN adduser --gecos "" --disabled-password umbrel
|
||||
|
||||
@@ -1,65 +1,38 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
echo "Creating disk image..."
|
||||
rootfs_tar_size="$(du --block-size 1M /data/build/rootfs.tar | awk '{print $1}')"
|
||||
rootfs_buffer="512"
|
||||
disk_size_mb="$((rootfs_tar_size + rootfs_buffer))"
|
||||
disk_size_sector=$(expr $disk_size_mb \* 1024 \* 1024 / 512)
|
||||
disk_image="/data/build/umbrelos-amd64-usb-installer.img"
|
||||
dd if=/dev/zero of="${disk_image}" bs="${disk_size_sector}" count=512
|
||||
rootfs_dir="/tmp/rootfs"
|
||||
iso_image="/tmp/umbrelos-amd64-usb-installer.iso"
|
||||
|
||||
echo Creating disk partitions...
|
||||
gpt_efi="ef00"
|
||||
gpt_root_amd64="8304"
|
||||
sgdisk \
|
||||
--new 1:2048:+200M \
|
||||
--typecode 1:"${gpt_efi}" \
|
||||
--change-name 1:ESP \
|
||||
--new 2:0:0 \
|
||||
--typecode 2:"${gpt_root_amd64}" \
|
||||
--change-name 1:ROOTFS \
|
||||
"${disk_image}"
|
||||
echo "Creating directories for ISO image..."
|
||||
mkdir -p "${rootfs_dir}/boot/grub"
|
||||
|
||||
disk_layout=$(fdisk -l "${disk_image}")
|
||||
echo "${disk_layout}"
|
||||
echo "Extracting rootfs..."
|
||||
tar -xf /data/build/rootfs.tar --directory "${rootfs_dir}"
|
||||
|
||||
echo Attaching partitions to loopback devices...
|
||||
efi_start=$(echo "${disk_layout}" -l "${disk_image}" | grep EFI | awk '{print $2}')
|
||||
efi_size=$(echo "${disk_layout}" -l "${disk_image}" | grep EFI | awk '{print $4}')
|
||||
root_start=$(echo "${disk_layout}" -l "${disk_image}" | grep root | awk '{print $2}')
|
||||
root_size=$(echo "${disk_layout}" -l "${disk_image}" | grep root | awk '{print $4}')
|
||||
efi_device=$(losetup --offset $((512*efi_start)) --sizelimit $((512*efi_size)) --show --find "${disk_image}")
|
||||
root_device=$(losetup --offset $((512*root_start)) --sizelimit $((512*root_size)) --show --find "${disk_image}")
|
||||
echo "Creating grub.cfg..."
|
||||
cat > "${rootfs_dir}/boot/grub/grub.cfg" <<EOF
|
||||
set default=0
|
||||
set timeout=0
|
||||
|
||||
echo Formatting partitions...
|
||||
mkfs.vfat -n "ESP" "${efi_device}"
|
||||
mkfs.ext4 -L "ROOTFS" "${root_device}"
|
||||
set gfxmode=auto
|
||||
insmod all_video
|
||||
insmod gfxterm
|
||||
terminal_output gfxterm
|
||||
|
||||
echo Mounting partitions...
|
||||
efi_mount_point="/mnt/efi"
|
||||
root_mount_point="/mnt/root"
|
||||
mkdir -p "${efi_mount_point}"
|
||||
mkdir -p "${root_mount_point}"
|
||||
mount "${efi_device}" "${efi_mount_point}"
|
||||
mount -t ext4 "${root_device}" "${root_mount_point}"
|
||||
menuentry "umbrelOS" {
|
||||
linux /vmlinuz root=LABEL=UMBRELINSTALLER ro quiet loglevel=0
|
||||
initrd /initrd.img
|
||||
}
|
||||
EOF
|
||||
|
||||
echo Extracting rootfs...
|
||||
tar -xf /data/build/rootfs.tar --directory "${root_mount_point}"
|
||||
echo "Creating ISO image..."
|
||||
grub-mkrescue -o "${iso_image}" -volid "UMBRELINSTALLER" "${rootfs_dir}" -- -hfsplus off
|
||||
|
||||
echo Copying boot directory over to ESP partition...
|
||||
cp -r "${root_mount_point}/boot/." "${efi_mount_point}"
|
||||
tree "${efi_mount_point}"
|
||||
echo
|
||||
echo "Compressing ISO image..."
|
||||
xz --keep --threads 0 --force "${iso_image}"
|
||||
|
||||
echo Unmounting partitions...
|
||||
umount "${root_mount_point}"
|
||||
umount "${efi_mount_point}"
|
||||
echo "Copying to ./build/..."
|
||||
mv "${iso_image}.xz" /data/build/
|
||||
|
||||
echo Detaching loopback devices...
|
||||
losetup --detach "${efi_device}"
|
||||
losetup --detach "${root_device}"
|
||||
|
||||
echo "Compressing image..."
|
||||
xz --keep --threads 0 --force "${disk_image}"
|
||||
|
||||
echo Done!
|
||||
echo "Done!"
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM debian:bookworm
|
||||
|
||||
RUN apt-get -y update
|
||||
RUN apt-get -y install fdisk gdisk qemu-utils dosfstools tree xz-utils
|
||||
RUN apt-get -y install grub-common grub-efi xorriso mtools xz-utils
|
||||
@@ -4,7 +4,11 @@ set -euo pipefail
|
||||
mkdir -p build
|
||||
docker build -f usb-installer.Dockerfile --platform linux/amd64 -t usb-installer ../
|
||||
docker export -o build/rootfs.tar $(docker run -d usb-installer /bin/true)
|
||||
docker build -f builder.Dockerfile -t usb-installer:builder .
|
||||
docker run --entrypoint /data/build.sh -v $PWD:/data --privileged usb-installer:builder
|
||||
docker build -f builder.Dockerfile --platform linux/amd64 -t usb-installer:builder .
|
||||
docker run --entrypoint /data/build.sh -v $PWD:/data --privileged --platform linux/amd64 usb-installer:builder
|
||||
|
||||
# qemu-system-x86_64 -net nic -net user -machine accel=tcg -m 2048 -hda build/umbrelos-amd64-usb-installer.img -bios OVMF.fd
|
||||
# Test CD-ROM boot (used by VMs)
|
||||
# qemu-system-x86_64 -net nic -net user -machine accel=tcg -m 2048 -bios ~/Downloads/OVMF.bin -cdrom umbrelos-amd64-usb-installer.iso
|
||||
|
||||
# Test USB boot (used by physical machines)
|
||||
# qemu-system-x86_64 -net nic -net user -machine accel=tcg -m 2048 -bios ~/Downloads/OVMF.bin -drive if=none,id=stick,format=raw,file=umbrelos-amd64-usb-installer.iso -device nec-usb-xhci,id=xhci -device usb-storage,bus=xhci.0,drive=stick
|
||||
@@ -5,34 +5,7 @@ RUN echo "root:root" | chpasswd
|
||||
RUN apt-get -y update
|
||||
|
||||
# Install Linux kernel, systemd, bootloader and script deps
|
||||
RUN apt-get install --yes --no-install-recommends linux-image-amd64 systemd-sysv systemd-boot xz-utils dmidecode
|
||||
|
||||
# We can't install the bootloader via `bootctl install` from Docker because it complains
|
||||
# about an invalid ESP partition. We can't easily fix it with loopback mounts from a Docker
|
||||
# build environment. Instead we just manually install the bootloader to /boot and
|
||||
# migrate /boot to an ESP partition in a post processing step outside of Docker.
|
||||
RUN mkdir -p "/boot/EFI/systemd/"
|
||||
RUN mkdir -p "/boot/EFI/BOOT/"
|
||||
RUN cp "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" "/boot/EFI/systemd/systemd-bootx64.efi"
|
||||
RUN cp "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" "/boot/EFI/BOOT/bootx64.efi"
|
||||
|
||||
# Generate boot config
|
||||
RUN mkdir -p "/boot/loader/entries"
|
||||
|
||||
RUN echo " \n\
|
||||
title Debian \n\
|
||||
linux $(ls /boot/vmlinuz-* | sed 's/\/boot//') \n\
|
||||
initrd $(ls /boot/initrd.img* | sed 's/\/boot//') \n\
|
||||
options root=LABEL=ROOTFS rw quiet loglevel=1" | tee "/boot/loader/entries/debian.conf"
|
||||
|
||||
RUN echo " \n\
|
||||
default debian \n\
|
||||
timeout 0 \n\
|
||||
console-mode max \n\
|
||||
editor no" | tee "/boot/loader/loader.conf"
|
||||
|
||||
# Verify boot status
|
||||
RUN bootctl --esp-path=/boot status
|
||||
RUN apt-get install --yes --no-install-recommends linux-image-amd64 systemd-sysv xz-utils dmidecode
|
||||
|
||||
# Reduce size
|
||||
# We have to do this extremely aggreseively because we're close to GitHub's 2GB release asset limit
|
||||
|
||||
@@ -138,7 +138,6 @@ function useLogin() {
|
||||
form.submit()
|
||||
}
|
||||
|
||||
console.log(data)
|
||||
return data
|
||||
})
|
||||
}
|
||||
@@ -160,7 +159,6 @@ function useApp(appId: string) {
|
||||
useEffect(() => {
|
||||
fetch(`/v1/apps?app=${appId}`).then(async (res) => {
|
||||
const data = await res.json()
|
||||
console.log(data)
|
||||
setApp({...data, icon: appId ? `https://getumbrel.github.io/umbrel-apps-gallery/${appId}/icon.svg` : undefined})
|
||||
})
|
||||
}, [appId])
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
"react-qr-code": "2.0.12",
|
||||
"react-router-dom": "6.17.0",
|
||||
"react-use": "17.4.0",
|
||||
"recharts": "^2.12.7",
|
||||
"remark-breaks": "^4.0.0",
|
||||
"remark-gfm": "^4.0.0",
|
||||
"remeda": "^1.28.0",
|
||||
@@ -109,6 +110,8 @@
|
||||
"eslint-plugin-react": "^7.33.2",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
"eslint-plugin-react-refresh": "^0.4.3",
|
||||
"fast-glob": "^3.3.2",
|
||||
"openai": "^4.51.0",
|
||||
"postcss": "8.4.31",
|
||||
"prettier": "3.0.3",
|
||||
"prettier-plugin-css-order": "2.0.1",
|
||||
|
||||
Generated
+320
-12
@@ -164,6 +164,9 @@ dependencies:
|
||||
react-use:
|
||||
specifier: 17.4.0
|
||||
version: 17.4.0([email protected])([email protected])
|
||||
recharts:
|
||||
specifier: ^2.12.7
|
||||
version: 2.12.7([email protected])([email protected])
|
||||
remark-breaks:
|
||||
specifier: ^4.0.0
|
||||
version: 4.0.0
|
||||
@@ -253,6 +256,12 @@ devDependencies:
|
||||
eslint-plugin-react-refresh:
|
||||
specifier: ^0.4.3
|
||||
version: 0.4.3([email protected])
|
||||
fast-glob:
|
||||
specifier: ^3.3.2
|
||||
version: 3.3.2
|
||||
openai:
|
||||
specifier: ^4.51.0
|
||||
version: 4.51.0
|
||||
postcss:
|
||||
specifier: 8.4.31
|
||||
version: 8.4.31
|
||||
@@ -2325,6 +2334,48 @@ packages:
|
||||
resolution: {integrity: sha512-Lt9Urpmkd0SS1EqmTkkUhaQD5jMItImRxsvVwzy4lVKPCI67rH7udDUxR8KrZvntlqSXTj833YXiHrU2y658Sw==}
|
||||
dev: false
|
||||
|
||||
/@types/[email protected]:
|
||||
resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==}
|
||||
dev: false
|
||||
|
||||
/@types/[email protected]:
|
||||
resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
|
||||
dev: false
|
||||
|
||||
/@types/[email protected]:
|
||||
resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
|
||||
dev: false
|
||||
|
||||
/@types/[email protected]:
|
||||
resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
|
||||
dependencies:
|
||||
'@types/d3-color': 3.1.3
|
||||
dev: false
|
||||
|
||||
/@types/[email protected]:
|
||||
resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==}
|
||||
dev: false
|
||||
|
||||
/@types/[email protected]:
|
||||
resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==}
|
||||
dependencies:
|
||||
'@types/d3-time': 3.0.3
|
||||
dev: false
|
||||
|
||||
/@types/[email protected]:
|
||||
resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==}
|
||||
dependencies:
|
||||
'@types/d3-path': 3.1.0
|
||||
dev: false
|
||||
|
||||
/@types/[email protected]:
|
||||
resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==}
|
||||
dev: false
|
||||
|
||||
/@types/[email protected]:
|
||||
resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
|
||||
dev: false
|
||||
|
||||
/@types/[email protected]:
|
||||
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
|
||||
dependencies:
|
||||
@@ -2373,6 +2424,19 @@ packages:
|
||||
resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
|
||||
dev: false
|
||||
|
||||
/@types/[email protected]:
|
||||
resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==}
|
||||
dependencies:
|
||||
'@types/node': 20.8.7
|
||||
form-data: 4.0.0
|
||||
dev: true
|
||||
|
||||
/@types/[email protected]:
|
||||
resolution: {integrity: sha512-eXF4pfBNV5DAMKGbI02NnDtWrQ40hAN558/2vvS4gMpMIxaf6JmD7YjnZbq0Q9TDSSkKBamime8ewRoomHdt4g==}
|
||||
dependencies:
|
||||
undici-types: 5.26.5
|
||||
dev: true
|
||||
|
||||
/@types/[email protected]:
|
||||
resolution: {integrity: sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==}
|
||||
dependencies:
|
||||
@@ -2652,6 +2716,13 @@ packages:
|
||||
resolution: {integrity: sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==}
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
|
||||
engines: {node: '>=6.5'}
|
||||
dependencies:
|
||||
event-target-shim: 5.0.1
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
|
||||
engines: {node: '>= 0.6'}
|
||||
@@ -2674,6 +2745,13 @@ packages:
|
||||
hasBin: true
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==}
|
||||
engines: {node: '>= 8.0.0'}
|
||||
dependencies:
|
||||
humanize-ms: 1.2.1
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
|
||||
dependencies:
|
||||
@@ -2842,7 +2920,6 @@ packages:
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
|
||||
dev: false
|
||||
|
||||
/[email protected]([email protected]):
|
||||
resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==}
|
||||
@@ -3142,7 +3219,6 @@ packages:
|
||||
engines: {node: '>= 0.8'}
|
||||
dependencies:
|
||||
delayed-stream: 1.0.0
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
|
||||
@@ -3268,6 +3344,77 @@ packages:
|
||||
uniq: 1.0.1
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
|
||||
engines: {node: '>=12'}
|
||||
dependencies:
|
||||
internmap: 2.0.3
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
|
||||
engines: {node: '>=12'}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
|
||||
engines: {node: '>=12'}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
|
||||
engines: {node: '>=12'}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
|
||||
engines: {node: '>=12'}
|
||||
dependencies:
|
||||
d3-color: 3.1.0
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
|
||||
engines: {node: '>=12'}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
|
||||
engines: {node: '>=12'}
|
||||
dependencies:
|
||||
d3-array: 3.2.4
|
||||
d3-format: 3.1.0
|
||||
d3-interpolate: 3.0.1
|
||||
d3-time: 3.1.0
|
||||
d3-time-format: 4.1.0
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
|
||||
engines: {node: '>=12'}
|
||||
dependencies:
|
||||
d3-path: 3.1.0
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
|
||||
engines: {node: '>=12'}
|
||||
dependencies:
|
||||
d3-time: 3.1.0
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
|
||||
engines: {node: '>=12'}
|
||||
dependencies:
|
||||
d3-array: 3.2.4
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
|
||||
engines: {node: '>=12'}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
|
||||
engines: {node: '>=0.10'}
|
||||
@@ -3305,6 +3452,10 @@ packages:
|
||||
dependencies:
|
||||
ms: 2.1.2
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
|
||||
dependencies:
|
||||
@@ -3346,7 +3497,6 @@ packages:
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
|
||||
engines: {node: '>=0.4.0'}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
|
||||
@@ -3392,6 +3542,13 @@ packages:
|
||||
esutils: 2.0.3
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
|
||||
dependencies:
|
||||
'@babel/runtime': 7.23.2
|
||||
csstype: 3.1.2
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
|
||||
dev: true
|
||||
@@ -3711,6 +3868,15 @@ packages:
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
|
||||
engines: {node: '>=6'}
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
|
||||
engines: {node: '>=10'}
|
||||
@@ -3738,8 +3904,13 @@ packages:
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
|
||||
|
||||
/fast-[email protected].1:
|
||||
resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
|
||||
/fast-[email protected].1:
|
||||
resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
|
||||
engines: {node: '>=8.6.0'}
|
||||
dependencies:
|
||||
'@nodelib/fs.stat': 2.0.5
|
||||
@@ -3841,6 +4012,10 @@ packages:
|
||||
resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==}
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
|
||||
engines: {node: '>= 0.12'}
|
||||
@@ -3850,6 +4025,23 @@ packages:
|
||||
mime-types: 2.1.35
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
|
||||
engines: {node: '>= 6'}
|
||||
dependencies:
|
||||
asynckit: 0.4.0
|
||||
combined-stream: 1.0.8
|
||||
mime-types: 2.1.35
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==}
|
||||
engines: {node: '>= 12.20'}
|
||||
dependencies:
|
||||
node-domexception: 1.0.0
|
||||
web-streams-polyfill: 4.0.0-beta.3
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
|
||||
dev: true
|
||||
@@ -4030,7 +4222,7 @@ packages:
|
||||
dependencies:
|
||||
array-union: 2.1.0
|
||||
dir-glob: 3.0.1
|
||||
fast-glob: 3.3.1
|
||||
fast-glob: 3.3.2
|
||||
ignore: 5.2.4
|
||||
merge2: 1.4.1
|
||||
slash: 3.0.0
|
||||
@@ -4162,6 +4354,12 @@ packages:
|
||||
engines: {node: '>=10.17.0'}
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
|
||||
dependencies:
|
||||
ms: 2.1.2
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==}
|
||||
dev: false
|
||||
@@ -4243,6 +4441,11 @@ packages:
|
||||
side-channel: 1.0.4
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
|
||||
engines: {node: '>=12'}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
|
||||
dependencies:
|
||||
@@ -4635,7 +4838,6 @@ packages:
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
|
||||
@@ -5241,6 +5443,11 @@ packages:
|
||||
engines: {node: '>=v0.6.5'}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
|
||||
engines: {node: '>=10.5.0'}
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
|
||||
engines: {node: 4.x || >=6.0.0}
|
||||
@@ -5251,7 +5458,6 @@ packages:
|
||||
optional: true
|
||||
dependencies:
|
||||
whatwg-url: 5.0.0
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
|
||||
@@ -5371,6 +5577,22 @@ packages:
|
||||
is-wsl: 2.2.0
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-UKuWc3/qQyklqhHM8CbdXCv0Z0obap6T0ECdcO5oATQxAbKE5Ky3YCXFQY207z+eGG6ez4U9wvAcuMygxhmStg==}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
'@types/node': 18.19.34
|
||||
'@types/node-fetch': 2.6.11
|
||||
abort-controller: 3.0.0
|
||||
agentkeepalive: 4.5.0
|
||||
form-data-encoder: 1.7.2
|
||||
formdata-node: 4.4.1
|
||||
node-fetch: 2.7.0
|
||||
web-streams-polyfill: 3.3.3
|
||||
transitivePeerDependencies:
|
||||
- encoding
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
@@ -5977,6 +6199,19 @@ packages:
|
||||
react: 18.2.0
|
||||
dev: false
|
||||
|
||||
/[email protected]([email protected])([email protected]):
|
||||
resolution: {integrity: sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==}
|
||||
peerDependencies:
|
||||
react: ^16.8.0 || ^17.0.0 || ^18.0.0
|
||||
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
|
||||
dependencies:
|
||||
fast-equals: 5.0.1
|
||||
prop-types: 15.8.1
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0([email protected])
|
||||
react-transition-group: 4.4.5([email protected])([email protected])
|
||||
dev: false
|
||||
|
||||
/[email protected](@types/[email protected])([email protected]):
|
||||
resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
|
||||
engines: {node: '>=10'}
|
||||
@@ -5994,6 +6229,20 @@ packages:
|
||||
tslib: 2.6.2
|
||||
dev: false
|
||||
|
||||
/[email protected]([email protected])([email protected]):
|
||||
resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==}
|
||||
peerDependencies:
|
||||
react: '>=16.6.0'
|
||||
react-dom: '>=16.6.0'
|
||||
dependencies:
|
||||
'@babel/runtime': 7.23.2
|
||||
dom-helpers: 5.2.1
|
||||
loose-envify: 1.4.0
|
||||
prop-types: 15.8.1
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0([email protected])
|
||||
dev: false
|
||||
|
||||
/[email protected]([email protected])([email protected]):
|
||||
resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==}
|
||||
peerDependencies:
|
||||
@@ -6048,6 +6297,31 @@ packages:
|
||||
picomatch: 2.3.1
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==}
|
||||
dependencies:
|
||||
decimal.js-light: 2.5.1
|
||||
dev: false
|
||||
|
||||
/[email protected]([email protected])([email protected]):
|
||||
resolution: {integrity: sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==}
|
||||
engines: {node: '>=14'}
|
||||
peerDependencies:
|
||||
react: ^16.0.0 || ^17.0.0 || ^18.0.0
|
||||
react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0
|
||||
dependencies:
|
||||
clsx: 2.0.0
|
||||
eventemitter3: 4.0.7
|
||||
lodash: 4.17.21
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0([email protected])
|
||||
react-is: 16.13.1
|
||||
react-smooth: 4.0.1([email protected])([email protected])
|
||||
recharts-scale: 0.4.5
|
||||
tiny-invariant: 1.3.3
|
||||
victory-vendor: 36.9.2
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@@ -6661,7 +6935,7 @@ packages:
|
||||
chokidar: 3.5.3
|
||||
didyoumean: 1.2.2
|
||||
dlv: 1.1.3
|
||||
fast-glob: 3.3.1
|
||||
fast-glob: 3.3.2
|
||||
glob-parent: 6.0.2
|
||||
is-glob: 4.0.3
|
||||
jiti: 1.20.0
|
||||
@@ -6708,6 +6982,10 @@ packages:
|
||||
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
|
||||
engines: {node: '>=8.17.0'}
|
||||
@@ -6741,7 +7019,6 @@ packages:
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==}
|
||||
@@ -6889,6 +7166,10 @@ packages:
|
||||
resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==}
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==}
|
||||
dependencies:
|
||||
@@ -7080,6 +7361,25 @@ packages:
|
||||
vfile-message: 4.0.2
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==}
|
||||
dependencies:
|
||||
'@types/d3-array': 3.2.1
|
||||
'@types/d3-ease': 3.0.2
|
||||
'@types/d3-interpolate': 3.0.4
|
||||
'@types/d3-scale': 4.0.8
|
||||
'@types/d3-shape': 3.1.6
|
||||
'@types/d3-time': 3.0.3
|
||||
'@types/d3-timer': 3.0.2
|
||||
d3-array: 3.2.4
|
||||
d3-ease: 3.0.1
|
||||
d3-interpolate: 3.0.1
|
||||
d3-scale: 4.0.2
|
||||
d3-shape: 3.2.0
|
||||
d3-time: 3.1.0
|
||||
d3-timer: 3.0.1
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-YKp4AYO/jfCPihL0FPC/kL6lARk+Mi8ohHCYab9cmx5eOmtW8tG6SXOxjaPPjPrf8EwWKi/QcN5xNsLZVlLzUQ==}
|
||||
hasBin: true
|
||||
@@ -7132,16 +7432,24 @@ packages:
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
|
||||
engines: {node: '>= 8'}
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==}
|
||||
engines: {node: '>= 14'}
|
||||
dev: true
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
|
||||
dependencies:
|
||||
tr46: 0.0.3
|
||||
webidl-conversions: 3.0.1
|
||||
dev: false
|
||||
|
||||
/[email protected]:
|
||||
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
JSON file contents are machine generated using the `lokalise.i18n-ally` VSCode extension.
|
||||
+343
-370
@@ -1,398 +1,371 @@
|
||||
{
|
||||
"hello": "Hallo",
|
||||
"desktop.greeting.morning": "Guten Morgen, {{name}}",
|
||||
"desktop.greeting.afternoon": "Guten Tag, {{name}}",
|
||||
"desktop.greeting.evening": "Guten Abend, {{name}}",
|
||||
"search": "Suche",
|
||||
"settings": "Einstellungen",
|
||||
"app-store.title": "App Store",
|
||||
"unknown": "Unbekannt",
|
||||
"app_one": "App",
|
||||
"app_other": "Apps",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"linux": "Linux",
|
||||
"install-your-first-app": "Installiere deine erste App",
|
||||
"logout": "Abmelden",
|
||||
"restart": "Neustarten",
|
||||
"shut-down": "Herunterfahren",
|
||||
"umbrel": "Umbrel",
|
||||
"device": "Gerät",
|
||||
"umbrelos": "umbrelOS",
|
||||
"open-live-usage": "Live-Nutzung öffnen",
|
||||
"account": "Konto",
|
||||
"wallpaper": "Hintergrundbild",
|
||||
"name": "Name",
|
||||
"password": "Passwort",
|
||||
"account-description": "Dein Name und Passwort",
|
||||
"wallpaper-description": "Dein Umbrel Hintergrundbild und Thema",
|
||||
"2fa-description": "Eine zweite Sicherheitsebene für dein Umbrel-Login und Apps",
|
||||
"tor-description": "Greife von überall auf dein Umbrel zu mit einem Tor-Browser",
|
||||
"migration-assistant": "Migrationsassistent",
|
||||
"migration-assistant-description": "Übertrage alle deine Apps und Daten von einem Raspberry Pi zu Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "Der Migration Assistant unterstützt derzeit die Übertragung aller Daten und Apps von einem Raspberry Pi, auf dem umbrelOS läuft, zum Umbrel Home. Öffnen Sie den Migration Assistant auf Ihrem Umbrel Home, um zu beginnen.",
|
||||
"language": "Sprache",
|
||||
"language-description": "Deine bevorzugte umbrelOS Sprache",
|
||||
"app-store.description": "Deine App-Aktualisierungseinstellungen",
|
||||
"migrate": "Migrieren",
|
||||
"change-name": "Name ändern",
|
||||
"change-password": "Passwort ändern",
|
||||
"uptime": "Betriebszeit",
|
||||
"preferences": "Einstellungen",
|
||||
"troubleshoot": "Fehlerbehebung",
|
||||
"troubleshoot-description": "Fehlerbehebung für umbrelOS oder eine App",
|
||||
"device-info-description": "Informationen über dein Gerät",
|
||||
"device-info.view-info": "Informationen anzeigen",
|
||||
"factory-reset": "Werkseinstellungen",
|
||||
"factory-reset.reset": "Zurücksetzen",
|
||||
"factory-reset.desc": "Lösche alle deine umbrelOS Daten und Apps",
|
||||
"software-update.title": "Softwareaktualisierung",
|
||||
"device-info": "Geräteinformation",
|
||||
"software-update.on-latest": "Du verwendest die neueste Version von umbrelOS",
|
||||
"check-for-latest-version": "Nach der neuesten umbrelOS Aktualisierung suchen",
|
||||
"2fa": "2FA",
|
||||
"remote-tor-access": "Remote Tor-Zugang",
|
||||
"software-update.checking": "Suche nach Aktualisierungen...",
|
||||
"software-update.check": "Nach Aktualisierungen suchen",
|
||||
"software-update.new-version": "Neue {{name}} ist verfügbar zur Installation",
|
||||
"software-update.updating-to": "Aktualisiere auf {{name}}",
|
||||
"software-update.callout": "Bitte aktualisiere diese Seite nicht und schalte dein Umbrel nicht aus, während es aktualisiert wird.",
|
||||
"software-update.failed.title": "Softwareaktualisierung fehlgeschlagen",
|
||||
"software-update.failed.description": "Es gab einen Fehler bei der Softwareaktualisierung",
|
||||
"software-update.failed.please-try-again": "Bitte versuche es erneut",
|
||||
"software-update.failed.retry": "Erneut versuchen",
|
||||
"update": "Aktualisieren",
|
||||
"software-update.update-now": "Jetzt aktualisieren",
|
||||
"software-update.view": "Anzeigen",
|
||||
"storage": "Speicherplatz",
|
||||
"storage.low": "Wenig Speicherplatz",
|
||||
"storage.full": "Speicherplatz voll",
|
||||
"something-left": "{{left}} verbleibend",
|
||||
"unexpected-error": "Unerwarteter Fehler",
|
||||
"unexpected-error.heading": "⚠ Fehler",
|
||||
"clipboard.copied": "Kopiert",
|
||||
"close": "Schließen",
|
||||
"something-went-wrong": "⚠ Es ist ein Fehler aufgetreten",
|
||||
"loading": "Lädt",
|
||||
"cmdk.input-placeholder": "Suche nach Apps, Einstellungen oder Aktionen",
|
||||
"no-results-found": "Keine Ergebnisse gefunden",
|
||||
"cmdk.restart-umbrel": "Umbrel neu starten",
|
||||
"cmdk.update-all-apps": "Alle Apps aktualisieren",
|
||||
"cmdk.change-wallpaper": "Hintergrundbild ändern",
|
||||
"cmdk.live-usage": "Live-Nutzung",
|
||||
"cmdk.widgets": "Widgets",
|
||||
"cmdk.frequent-apps": "Häufig verwendet",
|
||||
"app.offline": "Nicht in Betrieb",
|
||||
"app.uninstalling": "Deinstallieren",
|
||||
"app.install": "Installieren",
|
||||
"app.installing": "Installiert",
|
||||
"app.updating": "Aktualisieren",
|
||||
"app.open": "Öffnen",
|
||||
"app.view": "Ansehen",
|
||||
"retry": "Erneut versuchen",
|
||||
"download-logs": "Protokolle herunterladen",
|
||||
"page-title-umbrel": "{{title}} – umbrelOS",
|
||||
"desktop.title": "Desktop",
|
||||
"notifications": "Benachrichtigungen",
|
||||
"device-info.device": "Gerät",
|
||||
"device-info.model-number": "Modellnummer",
|
||||
"device-info.serial-number": "Seriennummer",
|
||||
"memory": "Arbeitsspeicher",
|
||||
"memory.low": "Wenig Arbeitsspeicher",
|
||||
"no-forgot-password-message": "Wenn du dein Passwort verlierst, kannst du dich nicht bei deinem Umbrel anmelden. Stelle sicher, dass du es sicher aufbewahrst.",
|
||||
"settings.contact-support": "Brauchst du Hilfe? <linked>Kontaktiere den Support.</linked>",
|
||||
"temperature": "Temperatur",
|
||||
"temperature.too-hot-suggestion": "Überlege, die Umgebung deines Geräts zu ändern.",
|
||||
"temp.dangerously-hot": "Sehr heiß",
|
||||
"temp.hot": "Heiß",
|
||||
"temp.nice": "Angenehm",
|
||||
"temp.warm": "Warm",
|
||||
"temp.normal": "Normal",
|
||||
"temp.too-cold": "Zu kalt",
|
||||
"temp.cool": "Kühl",
|
||||
"2fa.disable.title": "Zwei-Faktor-Authentifizierung deaktivieren",
|
||||
"2fa.enter-code": "Gib den Code ein, der in deiner Authenticator-App angezeigt wird",
|
||||
"2fa.enable.or-paste": "Oder füge den folgenden Code in deine Authenticator-App ein",
|
||||
"2fa.enable.title": "Zwei-Faktor-Authentifizierung aktivieren",
|
||||
"2fa.enable.scan-this": "Scanne diesen QR-Code mit einer Authenticator-App wie Google Authenticator oder Authy",
|
||||
"settings.app-store-preferences.title": "App Store Einstellungen",
|
||||
"change-name.input-placeholder": "Dein Name",
|
||||
"confirm": "Bestätigen",
|
||||
"cancel": "Abbrechen",
|
||||
"change-password.callout": "Wenn du dein Passwort verlierst, kannst du dich nicht bei deinem Umbrel anmelden. Stelle sicher, dass du es sicher aufbewahrst.",
|
||||
"change-password.current-password": "Aktuelles Passwort",
|
||||
"change-password.new-password": "Neues Passwort",
|
||||
"change-password.repeat-password": "Passwort wiederholen",
|
||||
"restart.restarting": "Neustart",
|
||||
"restart.restarting-message": "Bitte aktualisiere diese Seite nicht und schalte dein Umbrel nicht aus, während es neu startet.",
|
||||
"restart.failed": "Neustart fehlgeschlagen",
|
||||
"restart.confirm.title": "Möchtest du dein Umbrel wirklich neu starten?",
|
||||
"restart.confirm.submit": "Neustarten",
|
||||
"shut-down.complete": "Herunterfahren abgeschlossen",
|
||||
"shut-down.complete-text": "Du kannst jetzt dein Gerät vom Strom trennen.",
|
||||
"shut-down.shutting-down": "Herunterfahren",
|
||||
"shut-down.shutting-down-message": "Bitte aktualisiere diese Seite nicht und schalte dein Umbrel nicht aus, während es herunterfährt.",
|
||||
"shut-down.failed": "Herunterfahren fehlgeschlagen",
|
||||
"shut-down.confirm.title": "Möchtest du dein Umbrel wirklich herunterfahren?",
|
||||
"shut-down.confirm.submit": "Herunterfahren",
|
||||
"tor.enable.title": "Remote Tor-Zugang aktivieren",
|
||||
"tor.enable.failed": "Aktivierung des Tor-Zugangs fehlgeschlagen",
|
||||
"tor.enable.description": "Dies kann einige Minuten dauern",
|
||||
"tor.disable.description": "Dies kann einige Minuten dauern",
|
||||
"tor.enable.submit": "Aktivieren",
|
||||
"troubleshoot.umbrelos-description": "umbrelOS und Systemprotokolle anzeigen",
|
||||
"troubleshoot.app": "App",
|
||||
"troubleshoot.app-description": "Protokolle einer auf deinem Umbrel installierten App anzeigen",
|
||||
"troubleshoot.umbrelos-logs": "umbrelOS-Protokolle",
|
||||
"troubleshoot.system-logs": "Systemprotokolle",
|
||||
"troubleshoot.system-download": "{{label}} herunterladen",
|
||||
"troubleshoot.app-download": "{{app}} Protokolle herunterladen",
|
||||
"app-picker.select-app": "App auswählen...",
|
||||
"app-picker.search": "Suchen...",
|
||||
"troubleshoot.share-with-umbrel-support": "Mit dem Umbrel-Support teilen",
|
||||
"login": "Anmelden",
|
||||
"migration-assistant.prep.body": "Vorbereitung für die Migration",
|
||||
"migration-assistant.prep.button-continue": "Fortfahren",
|
||||
"migration-assistant.prep.callout": "Die Daten auf deinem Umbrel Home, falls vorhanden, werden dauerhaft gelöscht.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Schalte dein Raspberry Pi Umbrel aus.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Verbinde sein externes Laufwerk mit einem USB-Anschluss an deinem Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Wenn du fertig bist, klicke unten auf '{{button}}'.",
|
||||
"migration-assistant.failed": "Irgendetwas stimmt nicht...",
|
||||
"try-again": "Erneut versuchen",
|
||||
"migration-assistant.continue-migration.ready.submit": "Migration starten",
|
||||
"migration-assistant.ready.title": "Du bist bereit für die Migration!",
|
||||
"migration-assistant.ready.description": "Alle deine Daten und Apps sind bereit, auf dein Umbrel Home migriert zu werden",
|
||||
"migration-assistant.ready.hint-header": "Dinge, die du beachten solltest",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Verwende das gleiche Passwort",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Denke daran, dein Raspberry Pi Umbrel-Passwort zu verwenden, um dich bei deinem Umbrel Home anzumelden",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Halte dein Raspberry Pi nach dem Update ausgeschaltet",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Dies hilft, Probleme mit Apps wie Lightning Node zu vermeiden",
|
||||
"migration-assistant.failed.ssd-not-detected.title": "Kein externes Laufwerk erkannt",
|
||||
"migration-assistant.failed.ssd-not-detected.description": "Stelle sicher, dass du das externe Laufwerk deines Raspberry Pi an dein Umbrel Home angeschlossen hast",
|
||||
"migration-assistant.failed.incorrect-ssd.title": "Inkompatibles externes Laufwerk",
|
||||
"migration-assistant.failed.incorrect-ssd.description": "Stelle sicher, dass du das externe Laufwerk deines Raspberry Pi an dein Umbrel Home angeschlossen hast",
|
||||
"live-usage": "Live-Nutzung",
|
||||
"unknown-app": "Unbekannte App",
|
||||
"login.title": "Willkommen zurück",
|
||||
"login.subtitle": "Gib dein Umbrel-Passwort ein, um dich anzumelden",
|
||||
"login.password-label": "Passwort",
|
||||
"login.password.submit": "Anmelden",
|
||||
"login-2fa.title": "Authentifizieren",
|
||||
"login-2fa.subtitle": "Gib den 2FA-Code ein, der in deiner Authenticator-App angezeigt wird",
|
||||
"not-found-404": "Fehlercode: 404",
|
||||
"not-found-404.back": "Zurück",
|
||||
"not-found-404.home": "Zur Startseite",
|
||||
"restart.try-again": "Erneut versuchen",
|
||||
"login-with-umbrel.app-not-found": "App nicht gefunden.",
|
||||
"login-with-umbrel.title": "Mit Umbrel anmelden",
|
||||
"login-with-umbrel.description": "Gib dein Umbrel-Passwort ein, um {{app}} zu öffnen",
|
||||
"create-user": "Benutzer erstellen",
|
||||
"language.select-description": "Bevorzugte umbrelOS-Sprache auswählen",
|
||||
"software-update.current-running": "Du verwendest",
|
||||
"migration-assistant.mobile.start-button": "Migration starten",
|
||||
"tor.enable.mobile.switch-label": "Remote Tor-Zugang aktivieren",
|
||||
"logout.confirm.title": "Möchtest du dich wirklich abmelden?",
|
||||
"logout.confirm.submit": "Abmelden",
|
||||
"2fa.enable.success": "Zwei-Faktor-Authentifizierung aktiviert",
|
||||
"2fa-description": "Eine zweite Sicherheitsebene für dein Umbrel-Login und Apps",
|
||||
"2fa.disable.success": "Zwei-Faktor-Authentifizierung deaktiviert",
|
||||
"apps.uninstalled-all.success": "Alle Apps deinstalliert",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Fehler beim Abrufen erforderlicher Apps",
|
||||
"2fa.disable.title": "Zwei-Faktor-Authentifizierung deaktivieren",
|
||||
"2fa.enable.or-paste": "Oder füge den folgenden Code in deine Authenticator-App ein",
|
||||
"2fa.enable.scan-this": "Scanne diesen QR-Code mit einer Authenticator-App wie Google Authenticator oder Authy",
|
||||
"2fa.enable.success": "Zwei-Faktor-Authentifizierung aktiviert",
|
||||
"2fa.enable.title": "Zwei-Faktor-Authentifizierung aktivieren",
|
||||
"2fa.enter-code": "Gib den Code ein, der in deiner Authenticator-App angezeigt wird",
|
||||
"account": "Konto",
|
||||
"account-description": "Dein Name und Passwort",
|
||||
"advanced-settings": "Erweiterte Einstellungen",
|
||||
"advanced-settings-description": "Öffne das Terminal oder melde dich beim umbrelOS Beta Programm an",
|
||||
"app-not-found": "App nicht gefunden: {{app}}",
|
||||
"app-only-over-tor": "{{app}} kann nur über Tor verwendet werden. Bitte greife über einen Tor-Browser auf dein Umbrel zu deiner Remote-Zugriffs-URL (Einstellungen > Remote Tor-Zugang) zu, um diese App zu öffnen.",
|
||||
"widget.progress.in-progress": "In Bearbeitung",
|
||||
"change-password.failed.current-required": "Aktuelles Passwort ist erforderlich",
|
||||
"change-password.failed.new-required": "Neues Passwort ist erforderlich",
|
||||
"change-password.failed.repeat-required": "Passwortwiederholung ist erforderlich",
|
||||
"change-password.failed.no-match": "Passwörter stimmen nicht überein",
|
||||
"change-password.failed.must-be-unique": "Neues Passwort muss sich vom aktuellen Passwort unterscheiden",
|
||||
"change-password.failed.min-length": "Passwort muss mindestens {{characters}} Zeichen lang sein",
|
||||
"notifications.view": "Anzeigen",
|
||||
"notifications.new-version-available": "{{update}} ist jetzt zur Installation verfügbar",
|
||||
"notifications.cpu.too-hot": "Hohe CPU-Temperatur",
|
||||
"notifications.cpu.too-cold": "Niedrige CPU-Temperatur",
|
||||
"notifications.storage.full": "Der Speicherplatz deines Geräts ist voll",
|
||||
"notifications.memory.low": "Der Arbeitsspeicher deines Geräts ist gering",
|
||||
"notifications.storage.low": "Der Speicherplatz deines Geräts ist niedrig",
|
||||
"software-update.success": "Erfolgreich auf umbrelOS {{version}} aktualisiert",
|
||||
"software-update.failed": "Aktualisierung fehlgeschlagen",
|
||||
"software-update.failed-to-check": "Fehler beim Suchen nach Aktualisierungen",
|
||||
"change-name.failed.name-required": "Name ist erforderlich",
|
||||
"free": "Kostenlos",
|
||||
"app-page.section.about": "Über",
|
||||
"app-page.section.credentials.title": "Standardanmeldeinformationen",
|
||||
"app-page.section.info.compatibility": "Kompatibilität",
|
||||
"app-page.section.info.compatibility-compatible": "Kompatibel",
|
||||
"app-page.section.info.developer": "Entwickler",
|
||||
"app-page.section.info.source-code": "Quellcode",
|
||||
"app-page.section.info.source-code.public": "Öffentlich",
|
||||
"app-page.section.info.submitted-by": "Eingereicht von",
|
||||
"app-page.section.info.title": "Info",
|
||||
"app-page.section.info.version": "Version",
|
||||
"app-page.section.recommendations.title": "Das könnte dir auch gefallen",
|
||||
"app-page.section.release-notes.title": "Neuigkeiten",
|
||||
"app-page.section.release-notes.version": "Version {{version}}",
|
||||
"app-page.section.requires": "Benötigt",
|
||||
"app-page.section.requires.support": "Support erhalten",
|
||||
"app-picker.search": "Suchen...",
|
||||
"app-picker.select-app": "App auswählen...",
|
||||
"app-store.browse-category-apps": "{{category}} Apps durchsuchen",
|
||||
"app-store.category.discover": "Entdecken",
|
||||
"app-store.category.ai": "KI",
|
||||
"app-store.category.all": "Alle Apps",
|
||||
"app-store.category.files": "Dateien & Produktivität",
|
||||
"app-store.category.automation": "Zuhause & Automatisierung",
|
||||
"app-store.category.bitcoin": "Bitcoin",
|
||||
"app-store.category.developer": "Entwicklerwerkzeuge",
|
||||
"app-store.category.discover": "Entdecken",
|
||||
"app-store.category.files": "Dateien & Produktivität",
|
||||
"app-store.category.finance": "Finanzen",
|
||||
"app-store.category.media": "Medien",
|
||||
"app-store.category.networking": "Netzwerk",
|
||||
"app-store.category.social": "Sozial",
|
||||
"app-store.category.automation": "Zuhause & Automatisierung",
|
||||
"app-store.category.ai": "KI",
|
||||
"app-store.category.developer": "Entwicklerwerkzeuge",
|
||||
"community-app-store": "Community App Store",
|
||||
"community-app-store.loading": "Lädt...",
|
||||
"community-app-store.back-to-umbrel-app-store": "Zurück zum Umbrel App Store",
|
||||
"community-app-store.open-button": "Öffnen",
|
||||
"community-app-store.remove-button": "Entfernen",
|
||||
"community-app-stores.description": "Community App Stores ermöglichen es dir, Apps auf deinem Umbrel zu installieren, die möglicherweise nicht im offiziellen Umbrel App Store verfügbar sind. Sie erleichtern auch das Testen von Beta-Versionen von Umbrel-Apps, bevor Entwickler sie im offiziellen Umbrel App Store veröffentlichen.",
|
||||
"community-app-stores.learn-more": "Mehr erfahren",
|
||||
"community-app-stores.warning": "Community App Stores können von jedem erstellt werden. Die darin veröffentlichten Apps sind nicht vom offiziellen Umbrel App Store-Team verifiziert oder geprüft und können potenziell unsicher oder bösartig sein. Sei vorsichtig und füge nur App-Stores von Entwicklern hinzu, denen du vertraust.",
|
||||
"community-app-stores.add-button": "Hinzufügen",
|
||||
"desktop.install-first.for-the-self-hoster": "Für Selbsthoster",
|
||||
"desktop.install-first.for-the-bitcoiner": "Für Bitcoiner",
|
||||
"desktop.install-first.for-the-streamer": "Für Streamer",
|
||||
"desktop.context-menu.edit-widgets": "Widgets bearbeiten",
|
||||
"desktop.context-menu.logout": "Abmelden",
|
||||
"desktop.context-menu.change-wallpaper": "Hintergrundbild ändern",
|
||||
"desktop.not-enough-room": "Verwende einen größeren Bildschirm, um deine Apps anzuzeigen.",
|
||||
"desktop.app.context.go-to-store-page": "Im App Store anzeigen",
|
||||
"desktop.app.context.show-default-credentials": "Standardanmeldeinformationen anzeigen",
|
||||
"desktop.app.context.uninstall": "Deinstallieren",
|
||||
"desktop.install-first.link-to-app-store": "Entdecke mehr im App Store",
|
||||
"migrate.callout": "Schalte dein Umbrel nicht aus, bis die Migration abgeschlossen ist",
|
||||
"app.uninstall.confirm.title": "{{app}} deinstallieren?",
|
||||
"app.uninstall.confirm.submit": "Deinstallieren",
|
||||
"app.uninstall.confirm.description": "Alle mit {{app}} verbundenen Daten werden dauerhaft gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} wird verwendet von",
|
||||
"widgets.edit.title": "Widgets bearbeiten",
|
||||
"widgets.edit.select-up-to-3-widgets": "Wähle bis zu 3 Widgets",
|
||||
"onboarding.create-account": "Konto erstellen",
|
||||
"factory-reset.review.title": "Daten überprüfen",
|
||||
"factory-reset.review.following-will-be-removed": "Folgendes wird von deinem Gerät entfernt",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} installierte App",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} installierte Apps",
|
||||
"app.uninstall.deps.used-by.description_one": "Deinstalliere zuerst {{firstAppToUninstall}}, um {{app}} zu deinstallieren.",
|
||||
"app.uninstall.deps.used-by.description_other": "Deinstalliere zuerst diese Apps, um {{app}} zu deinstallieren.",
|
||||
"app-store.search-apps": "Apps suchen",
|
||||
"app-store.description": "Deine App-Aktualisierungseinstellungen",
|
||||
"app-store.menu.community-app-stores": "Community App Stores",
|
||||
"app-store.search-apps": "Apps suchen",
|
||||
"app-store.search.no-results": "Keine Ergebnisse",
|
||||
"app-store.search.results-for": "Ergebnisse für",
|
||||
"factory-reset.review.submit": "Fortfahren",
|
||||
"factory-reset.review.account-info": "Kontoinformationen und Passwort",
|
||||
"factory-reset.review.total-data": "Gesamtdaten",
|
||||
"factory-reset.review.apps": "Apps",
|
||||
"onboarding.create-account.failed.name-required": "Name ist erforderlich",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Passwörter stimmen nicht überein",
|
||||
"onboarding.create-account.subtitle": "Deine Kontoinformationen werden nur auf deinem Umbrel gespeichert. Stelle sicher, dass du dein Passwort sicher aufbewahrst, da es keine Möglichkeit gibt, es zurückzusetzen.",
|
||||
"onboarding.contact-support": "Support",
|
||||
"onboarding.create-account.name.input-placeholder": "Dein Name",
|
||||
"onboarding.create-account.password.input-label": "Passwort",
|
||||
"onboarding.create-account.confirm-password.input-label": "Passwort bestätigen",
|
||||
"onboarding.create-account.submit": "Erstellen",
|
||||
"onboarding.create-account.submitting": "Wird erstellt",
|
||||
"onboarding.account-created.youre-all-set-name": "Alles bereit, {{name}}.",
|
||||
"legal.privacy-policy": "Datenschutzrichtlinie",
|
||||
"legal.terms-of-service": "Nutzungsbedingungen",
|
||||
"onboarding.account-created.next": "Weiter",
|
||||
"onboarding.account-created.page-title": "Konto erstellt",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "Mit Klick auf 'Weiter' stimmst du den <linked>umbrelOS Nutzungsbedingungen</linked> zu",
|
||||
"onboarding.start.title": "Willkommen bei umbrelOS",
|
||||
"onboarding.start.subtitle": "Dein Heim-Cloud-Server ist bereit zur Einrichtung.",
|
||||
"onboarding.account-created.subtitle": "Dein Umbrel ist jetzt bereit.",
|
||||
"onboarding.start.continue": "Beginnen",
|
||||
"app-page.section.about": "Über",
|
||||
"default-credentials.title": "Anmeldeinformationen für {{app}}",
|
||||
"default-credentials.username": "Standardbenutzername",
|
||||
"default-credentials.password": "Standardpasswort",
|
||||
"default-credentials.open": "{{app}} öffnen",
|
||||
"default-credentials.close": "Verstanden",
|
||||
"default-credentials..dont-show-again": "Nicht mehr anzeigen",
|
||||
"default-credentials.description": "Hier sind die Anmeldeinformationen, die du benötigst, um dich bei der App anzumelden.",
|
||||
"app-page.section.requires": "Benötigt",
|
||||
"app-page.section.requires.support": "Support erhalten",
|
||||
"app-page.section.info.title": "Info",
|
||||
"app-page.section.info.version": "Version",
|
||||
"app-page.section.info.source-code": "Quellcode",
|
||||
"app-page.section.info.source-code.public": "Öffentlich",
|
||||
"app-page.section.info.developer": "Entwickler",
|
||||
"app-page.section.info.submitted-by": "Eingereicht von",
|
||||
"app-page.section.info.compatibility": "Kompatibilität",
|
||||
"app-page.section.info.compatibility-compatible": "Kompatibel",
|
||||
"app-page.section.recommendations.title": "Das könnte dir auch gefallen",
|
||||
"app-page.section.release-notes.title": "Neuigkeiten",
|
||||
"app-page.section.release-notes.version": "Version {{version}}",
|
||||
"app-page.section.credentials.title": "Standardanmeldeinformationen",
|
||||
"auto-update": "Automatische Aktualisierung",
|
||||
"read-less": "Weniger lesen",
|
||||
"read-more": "Mehr lesen",
|
||||
"app-store.title": "App Store",
|
||||
"app-updates.less": "weniger",
|
||||
"app-updates.more": "mehr",
|
||||
"app-updates.no-updates": "Alle Apps sind auf dem neuesten Stand!",
|
||||
"app-updates.update": "Aktualisieren",
|
||||
"app-updates.update-all": "Alle aktualisieren",
|
||||
"app-updates.updates-available-count_one": "{{count}} Aktualisierung verfügbar",
|
||||
"app-updates.updates-available-count_other": "{{count}} Aktualisierungen verfügbar",
|
||||
"app-updates.updating": "Aktualisiert...",
|
||||
"app.install": "Installieren",
|
||||
"app.installing": "Installiert",
|
||||
"app.offline": "Nicht in Betrieb",
|
||||
"app.open": "Öffnen",
|
||||
"app.optimized-for-umbrel-home": "Optimiert für Umbrel Home",
|
||||
"install-first.title": "{{app}} benötigt Zugriff auf",
|
||||
"install-first.description_one": "Installiere diese App, um {{app}} zu installieren.",
|
||||
"install-first.description_other": "Installiere zuerst diese Apps, um {{app}} zu installieren.",
|
||||
"ok": "OK",
|
||||
"factory-reset.confirm.title": "Mit Passwort bestätigen",
|
||||
"factory-reset.confirm.body": "Bestätige Umbrel-Passwort zum Zurücksetzen",
|
||||
"factory-reset.confirm.submit": "Alles löschen und zurücksetzen",
|
||||
"factory-reset.confirm.submit-callout": "Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"factory-reset.confirm.password-label": "Passwort eingeben",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Schalte dein Gerät nicht aus, bis der Reset abgeschlossen ist",
|
||||
"factory-reset.resetting.connecting": "Verbindet",
|
||||
"factory-reset.failed.title": "Zurücksetzen fehlgeschlagen",
|
||||
"factory-reset.failed.message": "Es gab einen Fehler beim Zurücksetzen",
|
||||
"factory-reset.failed.message.please-try-again": "Bitte versuche es erneut",
|
||||
"factory-reset.failed.retry": "Werkseinstellungen erneut versuchen",
|
||||
"factory-reset.success.title": "Zurücksetzen erfolgreich",
|
||||
"factory-reset.success.description": "Alle deine Apps, App-Daten und Kontodaten wurden von deinem Gerät gelöscht. Du kannst jetzt dein Gerät neu starten.",
|
||||
"factory-reset.success.restart-device": "Gerät neu starten",
|
||||
"connecting": "Verbindet...",
|
||||
"migrate.failed.title": "Migration fehlgeschlagen",
|
||||
"migrate.failed.description": "Es gab einen Fehler bei der Migration",
|
||||
"migrate.failed.please-try-again": "Bitte versuche es erneut",
|
||||
"migrate.failed.retry": "Erneut versuchen",
|
||||
"migrate.success.title": "Migration erfolgreich",
|
||||
"migrate.success.description": "Alle deine Apps, App-Daten und Kontodetails wurden auf dein Umbrel Home migriert.",
|
||||
"continue-to-log-in": "Weiter zur Anmeldung",
|
||||
"trpc.checking-backend": "Lädt...",
|
||||
"trpc.backend-unavailable": "Fehler: Verbindung zur System-API fehlgeschlagen",
|
||||
"app.restarting": "Wird neu gestartet",
|
||||
"app.starting": "Wird gestartet",
|
||||
"app.stopped": "Gestoppt",
|
||||
"app.stopping": "Wird gestoppt",
|
||||
"app.uninstall.confirm.description": "Alle mit {{app}} verbundenen Daten werden dauerhaft gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"app.uninstall.confirm.submit": "Deinstallieren",
|
||||
"app.uninstall.confirm.title": "{{app}} deinstallieren?",
|
||||
"app.uninstall.deps.used-by.description_one": "Deinstalliere zuerst {{firstAppToUninstall}}, um {{app}} zu deinstallieren.",
|
||||
"app.uninstall.deps.used-by.description_other": "Deinstalliere zuerst diese Apps, um {{app}} zu deinstallieren.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} wird verwendet von",
|
||||
"app.uninstalling": "Deinstallieren",
|
||||
"app.updating": "Aktualisieren",
|
||||
"app.view": "Ansehen",
|
||||
"app_one": "App",
|
||||
"app_other": "Apps",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Fehler beim Abrufen erforderlicher Apps",
|
||||
"apps.uninstalled-all.success": "Alle Apps deinstalliert",
|
||||
"auth.checking-backend-for-user": "Lädt...",
|
||||
"auth.failed-checking-if-user-logged-in": "Fehler: Auth-Login-Überprüfung fehlgeschlagen",
|
||||
"auth.failed-to-check-if-user-exists": "Fehler: Auth-Existenzprüfung fehlgeschlagen",
|
||||
"redirect.to-onboarding": "Lädt...",
|
||||
"redirect.to-login": "Lädt...",
|
||||
"redirect.to-home": "Lädt...",
|
||||
"widgets.install-an-app-before-using-widgets": "Installiere eine App, um deinen Startbildschirm mit Widgets anzupassen.",
|
||||
"logout-error-generic": "Fehler: Abmeldung fehlgeschlagen",
|
||||
"app.stopping": "Wird gestoppt",
|
||||
"app.starting": "Wird gestartet",
|
||||
"app.restarting": "Wird neu gestartet",
|
||||
"beta-program": "umbrelOS Beta Programm",
|
||||
"beta-program-description": "Melde dich an, um Beta-Updates von umbrelOS zu erhalten, erhalte frühen Zugang zu neuen Funktionen und hilf uns, diese zu verbessern, indem du dein Feedback gibst. Beta-Updates können instabil sein und die Fehlerbehebung kann Kenntnisse des Terminals erfordern.",
|
||||
"cancel": "Abbrechen",
|
||||
"change": "Ändern",
|
||||
"change-name": "Name ändern",
|
||||
"change-name.failed.name-required": "Name ist erforderlich",
|
||||
"change-name.input-placeholder": "Dein Name",
|
||||
"change-password": "Passwort ändern",
|
||||
"change-password.callout": "Wenn du dein Passwort verlierst, kannst du dich nicht bei deinem Umbrel anmelden. Stelle sicher, dass du es sicher aufbewahrst.",
|
||||
"change-password.current-password": "Aktuelles Passwort",
|
||||
"change-password.failed.current-required": "Aktuelles Passwort ist erforderlich",
|
||||
"change-password.failed.min-length": "Passwort muss mindestens {{characters}} Zeichen lang sein",
|
||||
"change-password.failed.must-be-unique": "Neues Passwort muss sich vom aktuellen Passwort unterscheiden",
|
||||
"change-password.failed.new-required": "Neues Passwort ist erforderlich",
|
||||
"change-password.failed.no-match": "Passwörter stimmen nicht überein",
|
||||
"change-password.failed.repeat-required": "Passwortwiederholung ist erforderlich",
|
||||
"change-password.new-password": "Neues Passwort",
|
||||
"change-password.repeat-password": "Passwort wiederholen",
|
||||
"check-for-latest-version": "Nach der neuesten umbrelOS Aktualisierung suchen",
|
||||
"clipboard.copied": "Kopiert",
|
||||
"close": "Schließen",
|
||||
"cmdk.change-wallpaper": "Hintergrundbild ändern",
|
||||
"cmdk.frequent-apps": "Häufig verwendet",
|
||||
"cmdk.input-placeholder": "Suche nach Apps, Einstellungen oder Aktionen",
|
||||
"cmdk.install-from-app-store": "aus dem App Store",
|
||||
"cmdk.live-usage": "Live-Nutzung",
|
||||
"cmdk.restart-umbrel": "Umbrel neu starten",
|
||||
"cmdk.shutdown-umbrel": "Umbrel herunterfahren",
|
||||
"cmdk.update-all-apps": "Alle Apps aktualisieren",
|
||||
"cmdk.widgets": "Widgets",
|
||||
"community-app-store": "Community App Store",
|
||||
"community-app-store.back-to-umbrel-app-store": "Zurück zum Umbrel App Store",
|
||||
"community-app-store.open-button": "Öffnen",
|
||||
"community-app-store.remove-button": "Entfernen",
|
||||
"community-app-stores.add-button": "Hinzufügen",
|
||||
"community-app-stores.description": "Community App Stores ermöglichen es dir, Apps auf deinem Umbrel zu installieren, die möglicherweise nicht im offiziellen Umbrel App Store verfügbar sind. Sie erleichtern auch das Testen von Beta-Versionen von Umbrel-Apps, bevor Entwickler sie im offiziellen Umbrel App Store veröffentlichen.",
|
||||
"community-app-stores.learn-more": "Mehr erfahren",
|
||||
"community-app-stores.warning": "Community App Stores können von jedem erstellt werden. Die darin veröffentlichten Apps sind nicht vom offiziellen Umbrel App Store-Team verifiziert oder geprüft und können potenziell unsicher oder bösartig sein. Sei vorsichtig und füge nur App-Stores von Entwicklern hinzu, denen du vertraust.",
|
||||
"confirm": "Bestätigen",
|
||||
"connecting": "Verbindet...",
|
||||
"continue": "Fortsetzen",
|
||||
"continue-to-log-in": "Weiter zur Anmeldung",
|
||||
"cpu": "CPU",
|
||||
"cpu-core-count": "{{cores}} Threads",
|
||||
"troubleshoot-pick-title": "Fehlerbehebung",
|
||||
"troubleshoot-no-logs-yet": "Noch keine Protokolle",
|
||||
"temperature.too-cold-suggestion": "Überlege, die Umgebung deines Geräts zu ändern",
|
||||
"cmdk.install-from-app-store": "aus dem App Store",
|
||||
"cmdk.shutdown-umbrel": "Umbrel herunterfahren",
|
||||
"tor.enable.success": "Remote Tor-Zugang aktiviert",
|
||||
"tor.enable.progress": "Remote Tor-Zugang wird aktiviert",
|
||||
"tor.disable.success": "Remote Tor-Zugang deaktiviert",
|
||||
"tor.disable.progress": "Remote Tor-Zugang wird deaktiviert",
|
||||
"tor.hidden-service": "Tor Hidden Service URL",
|
||||
"stop": "Stoppen",
|
||||
"software-update.release-notes.title": "Versionshinweise",
|
||||
"app-updates.updates-available-count_one": "{{count}} Aktualisierung verfügbar",
|
||||
"app-updates.updates-available-count_other": "{{count}} Aktualisierungen verfügbar",
|
||||
"app-updates.title": "Aktualisierungen",
|
||||
"app-updates.update-all": "Alle aktualisieren",
|
||||
"app-updates.updating": "Aktualisiert...",
|
||||
"app-updates.update": "Aktualisieren",
|
||||
"app-updates.less": "weniger",
|
||||
"app-updates.more": "mehr",
|
||||
"create-user": "Benutzer erstellen",
|
||||
"default-credentials.close": "Verstanden",
|
||||
"default-credentials.description": "Hier sind die Anmeldeinformationen, die du benötigst, um dich bei der App anzumelden.",
|
||||
"default-credentials.dont-show-again": "Nicht mehr anzeigen",
|
||||
"default-credentials.open": "{{app}} öffnen",
|
||||
"default-credentials.password": "Standardpasswort",
|
||||
"default-credentials.title": "Anmeldeinformationen für {{app}}",
|
||||
"default-credentials.username": "Standardbenutzername",
|
||||
"desktop.app.context.go-to-store-page": "Im App Store anzeigen",
|
||||
"desktop.app.context.show-default-credentials": "Standardanmeldeinformationen anzeigen",
|
||||
"desktop.app.context.uninstall": "Deinstallieren",
|
||||
"desktop.context-menu.change-wallpaper": "Hintergrundbild ändern",
|
||||
"desktop.context-menu.edit-widgets": "Widgets bearbeiten",
|
||||
"desktop.context-menu.logout": "Abmelden",
|
||||
"desktop.greeting.afternoon": "Guten Tag, {{name}}",
|
||||
"desktop.greeting.evening": "Guten Abend, {{name}}",
|
||||
"desktop.greeting.morning": "Guten Morgen, {{name}}",
|
||||
"desktop.install-first.for-the-bitcoiner": "Für Bitcoiner",
|
||||
"desktop.install-first.for-the-self-hoster": "Für Selbsthoster",
|
||||
"desktop.install-first.for-the-streamer": "Für Streamer",
|
||||
"desktop.install-first.link-to-app-store": "Entdecke mehr im App Store",
|
||||
"desktop.not-enough-room": "Verwende einen größeren Bildschirm, um deine Apps anzuzeigen.",
|
||||
"device": "Gerät",
|
||||
"device-info": "Geräteinformation",
|
||||
"device-info-description": "Informationen über dein Gerät",
|
||||
"device-info.device": "Gerät",
|
||||
"device-info.model-number": "Modellnummer",
|
||||
"device-info.serial-number": "Seriennummer",
|
||||
"device-info.view-info": "Informationen anzeigen",
|
||||
"disable": "Deaktivieren",
|
||||
"download-logs": "Protokolle herunterladen",
|
||||
"factory-reset": "Werkseinstellungen",
|
||||
"factory-reset.confirm.body": "Bestätige Umbrel-Passwort zum Zurücksetzen",
|
||||
"factory-reset.confirm.password-label": "Passwort eingeben",
|
||||
"factory-reset.confirm.submit": "Alles löschen und zurücksetzen",
|
||||
"factory-reset.confirm.submit-callout": "Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"factory-reset.desc": "Lösche alle deine umbrelOS Daten und Apps",
|
||||
"factory-reset.failed.message": "Es gab einen Fehler beim Zurücksetzen",
|
||||
"factory-reset.failed.retry": "Werkseinstellungen erneut versuchen",
|
||||
"factory-reset.failed.title": "Zurücksetzen fehlgeschlagen",
|
||||
"factory-reset.reset": "Zurücksetzen",
|
||||
"factory-reset.resetting.connecting": "Verbindet",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Schalte dein Gerät nicht aus, bis der Reset abgeschlossen ist",
|
||||
"factory-reset.review.account-info": "Kontoinformationen und Passwort",
|
||||
"factory-reset.review.apps": "Apps",
|
||||
"factory-reset.review.following-will-be-removed": "Folgendes wird von deinem Gerät entfernt",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} installierte App",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} installierte Apps",
|
||||
"factory-reset.review.submit": "Fortfahren",
|
||||
"factory-reset.review.total-data": "Gesamtdaten",
|
||||
"factory-reset.success.description": "Alle deine Apps, App-Daten und Kontodaten wurden von deinem Gerät gelöscht. Du kannst jetzt dein Gerät neu starten.",
|
||||
"factory-reset.success.restart-device": "Gerät neu starten",
|
||||
"factory-reset.success.title": "Zurücksetzen erfolgreich",
|
||||
"hello": "Hallo",
|
||||
"install-first.description_one": "Installiere diese App, um {{app}} zu installieren.",
|
||||
"install-first.description_other": "Installiere zuerst diese Apps, um {{app}} zu installieren.",
|
||||
"install-first.title": "{{app}} benötigt Zugriff auf",
|
||||
"install-your-first-app": "Installiere deine erste App",
|
||||
"language": "Sprache",
|
||||
"language-description": "Deine bevorzugte umbrelOS Sprache",
|
||||
"language.select-description": "Bevorzugte umbrelOS-Sprache auswählen",
|
||||
"linux": "Linux",
|
||||
"live-usage": "Live-Nutzung",
|
||||
"loading": "Lädt",
|
||||
"local-ip": "Lokale IP",
|
||||
"login-2fa.subtitle": "Gib den 2FA-Code ein, der in deiner Authenticator-App angezeigt wird",
|
||||
"login-2fa.title": "Authentifizieren",
|
||||
"login-with-umbrel.description": "Gib dein Umbrel-Passwort ein, um {{app}} zu öffnen",
|
||||
"login-with-umbrel.title": "Mit Umbrel anmelden",
|
||||
"login.password-label": "Passwort",
|
||||
"login.password.submit": "Anmelden",
|
||||
"login.subtitle": "Gib dein Umbrel-Passwort ein, um dich anzumelden",
|
||||
"login.title": "Willkommen zurück",
|
||||
"logout": "Abmelden",
|
||||
"logout-error-generic": "Fehler: Abmeldung fehlgeschlagen",
|
||||
"logout.confirm.submit": "Abmelden",
|
||||
"logout.confirm.title": "Möchtest du dich wirklich abmelden?",
|
||||
"memory": "Arbeitsspeicher",
|
||||
"memory.low": "Wenig Arbeitsspeicher",
|
||||
"migrate": "Migrieren",
|
||||
"migrate.callout": "Schalte dein Umbrel nicht aus, bis die Migration abgeschlossen ist",
|
||||
"migrate.failed.retry": "Erneut versuchen",
|
||||
"migrate.failed.title": "Migration fehlgeschlagen",
|
||||
"migrate.success.description": "Alle deine Apps, App-Daten und Kontodetails wurden auf dein Umbrel Home migriert.",
|
||||
"migrate.success.title": "Migration erfolgreich",
|
||||
"migration-assistant": "Migrationsassistent",
|
||||
"migration-assistant-description": "Übertrage alle deine Apps und Daten von einem Raspberry Pi zu Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "Der Migration Assistant unterstützt derzeit die Übertragung aller Daten und Apps von einem Raspberry Pi, auf dem umbrelOS läuft, zum Umbrel Home. Öffnen Sie den Migration Assistant auf Ihrem Umbrel Home, um zu beginnen.",
|
||||
"migration-assistant.continue-migration.ready.submit": "Migration starten",
|
||||
"migration-assistant.failed": "Irgendetwas stimmt nicht...",
|
||||
"migration-assistant.failed.retrying-message": "Wiederholen...",
|
||||
"unknown-error": "Unbekannter Fehler",
|
||||
"migration-assistant.mobile.start-button": "Migration starten",
|
||||
"migration-assistant.prep.body": "Vorbereitung für die Migration",
|
||||
"migration-assistant.prep.button-continue": "Fortfahren",
|
||||
"migration-assistant.prep.callout": "Die Daten auf deinem Umbrel Home, falls vorhanden, werden dauerhaft gelöscht.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Verbinde sein externes Laufwerk mit einem USB-Anschluss an deinem Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Wenn du fertig bist, klicke unten auf '{{button}}'.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Schalte dein Raspberry Pi Umbrel aus.",
|
||||
"migration-assistant.ready.description": "Alle deine Daten und Apps sind bereit, auf dein Umbrel Home migriert zu werden",
|
||||
"migration-assistant.ready.hint-header": "Dinge, die du beachten solltest",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Dies hilft, Probleme mit Apps wie Lightning Node zu vermeiden",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Halte dein Raspberry Pi nach dem Update ausgeschaltet",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Denke daran, dein Raspberry Pi Umbrel-Passwort zu verwenden, um dich bei deinem Umbrel Home anzumelden",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Verwende das gleiche Passwort",
|
||||
"migration-assistant.ready.title": "Du bist bereit für die Migration!",
|
||||
"name": "Name",
|
||||
"no-forgot-password-message": "Wenn du dein Passwort verlierst, kannst du dich nicht bei deinem Umbrel anmelden. Stelle sicher, dass du es sicher aufbewahrst.",
|
||||
"no-results-found": "Keine Ergebnisse gefunden",
|
||||
"not-found-404": "Fehlercode: 404",
|
||||
"not-found-404.back": "Zurück",
|
||||
"not-found-404.home": "Zur Startseite",
|
||||
"notifications.cpu.too-hot": "Hohe CPU-Temperatur",
|
||||
"notifications.memory.low": "Der Arbeitsspeicher deines Geräts ist gering",
|
||||
"notifications.new-version-available": "{{update}} ist jetzt zur Installation verfügbar",
|
||||
"notifications.storage.full": "Der Speicherplatz deines Geräts ist voll",
|
||||
"notifications.view": "Anzeigen",
|
||||
"ok": "OK",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "Mit Klick auf 'Weiter' stimmst du den <linked>umbrelOS Nutzungsbedingungen</linked> zu",
|
||||
"onboarding.account-created.next": "Weiter",
|
||||
"onboarding.account-created.subtitle": "Dein Umbrel ist jetzt bereit.",
|
||||
"onboarding.account-created.youre-all-set-name": "Alles bereit, {{name}}.",
|
||||
"onboarding.contact-support": "Support",
|
||||
"onboarding.create-account": "Konto erstellen",
|
||||
"onboarding.create-account.confirm-password.input-label": "Passwort bestätigen",
|
||||
"onboarding.create-account.failed.name-required": "Name ist erforderlich",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Passwörter stimmen nicht überein",
|
||||
"onboarding.create-account.name.input-placeholder": "Dein Name",
|
||||
"onboarding.create-account.password.input-label": "Passwort",
|
||||
"onboarding.create-account.submit": "Erstellen",
|
||||
"onboarding.create-account.submitting": "Wird erstellt",
|
||||
"onboarding.create-account.subtitle": "Deine Kontoinformationen werden nur auf deinem Umbrel gespeichert. Stelle sicher, dass du dein Passwort sicher aufbewahrst, da es keine Möglichkeit gibt, es zurückzusetzen.",
|
||||
"onboarding.start.continue": "Beginnen",
|
||||
"onboarding.start.subtitle": "Dein Heim-Cloud-Server ist bereit zur Einrichtung.",
|
||||
"onboarding.start.title": "Willkommen bei umbrelOS",
|
||||
"open": "Öffnen",
|
||||
"open-live-usage": "Live-Nutzung öffnen",
|
||||
"password": "Passwort",
|
||||
"preferences": "Einstellungen",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"read-less": "Weniger lesen",
|
||||
"read-more": "Mehr lesen",
|
||||
"redirect.to-home": "Lädt...",
|
||||
"redirect.to-login": "Lädt...",
|
||||
"redirect.to-onboarding": "Lädt...",
|
||||
"remote-tor-access": "Remote Tor-Zugang",
|
||||
"restart": "Neustarten",
|
||||
"restart.confirm.submit": "Neustarten",
|
||||
"restart.confirm.title": "Möchtest du dein Umbrel wirklich neu starten?",
|
||||
"restart.restarting": "Neustart",
|
||||
"restart.restarting-message": "Bitte aktualisiere diese Seite nicht und schalte dein Umbrel nicht aus, während es neu startet.",
|
||||
"retry": "Erneut versuchen",
|
||||
"search": "Suche",
|
||||
"settings": "Einstellungen",
|
||||
"settings.app-store-preferences.title": "App Store Einstellungen",
|
||||
"settings.contact-support": "Brauchst du Hilfe? <linked>Kontaktiere den Support.</linked>",
|
||||
"shut-down": "Herunterfahren",
|
||||
"shut-down.complete": "Herunterfahren abgeschlossen",
|
||||
"shut-down.complete-text": "Du kannst jetzt dein Gerät vom Strom trennen.",
|
||||
"shut-down.confirm.submit": "Herunterfahren",
|
||||
"shut-down.confirm.title": "Möchtest du dein Umbrel wirklich herunterfahren?",
|
||||
"shut-down.shutting-down": "Herunterfahren",
|
||||
"shut-down.shutting-down-message": "Bitte aktualisiere diese Seite nicht und schalte dein Umbrel nicht aus, während es herunterfährt.",
|
||||
"software-update.callout": "Bitte aktualisiere diese Seite nicht und schalte dein Umbrel nicht aus, während es aktualisiert wird.",
|
||||
"software-update.check": "Nach Aktualisierungen suchen",
|
||||
"software-update.checking": "Suche nach Aktualisierungen...",
|
||||
"software-update.current-running": "Du verwendest",
|
||||
"software-update.failed": "Aktualisierung fehlgeschlagen",
|
||||
"software-update.failed-to-check": "Fehler beim Suchen nach Aktualisierungen",
|
||||
"software-update.failed.retry": "Erneut versuchen",
|
||||
"software-update.install-now": "Jetzt installieren",
|
||||
"app-updates.no-updates": "Alle Apps sind auf dem neuesten Stand!",
|
||||
"continue": "Fortsetzen",
|
||||
"app.stopped": "Gestoppt",
|
||||
"software-update.new-version": "Neue {{name}} ist verfügbar zur Installation",
|
||||
"software-update.on-latest": "Du verwendest die neueste Version von umbrelOS",
|
||||
"software-update.title": "Softwareaktualisierung",
|
||||
"software-update.updating-to": "Aktualisiere auf {{name}}",
|
||||
"software-update.view": "Anzeigen",
|
||||
"something-left": "{{left}} verbleibend",
|
||||
"something-went-wrong": "⚠ Es ist ein Fehler aufgetreten",
|
||||
"start": "Starten",
|
||||
"stop": "Stoppen",
|
||||
"storage": "Speicherplatz",
|
||||
"storage.full": "Speicherplatz voll",
|
||||
"storage.low": "Wenig Speicherplatz",
|
||||
"temp.dangerously-hot": "Sehr heiß",
|
||||
"temp.nice": "Angenehm",
|
||||
"temp.normal": "Normal",
|
||||
"temp.warm": "Warm",
|
||||
"temperature": "Temperatur",
|
||||
"temperature.too-hot-suggestion": "Überlege, die Umgebung deines Geräts zu ändern.",
|
||||
"terminal": "Terminal",
|
||||
"terminal-description": "Führe benutzerdefinierte Befehle in umbrelOS oder innerhalb einer App aus",
|
||||
"terminal.umbrelos-description": "Führe benutzerdefinierte Befehle in umbrelOS aus",
|
||||
"terminal.app": "App",
|
||||
"terminal.app-description": "Führe benutzerdefinierte Befehle innerhalb einer spezifischen App aus",
|
||||
"open": "Öffnen",
|
||||
"advanced-settings": "Erweiterte Einstellungen",
|
||||
"advanced-settings-description": "Öffne das Terminal oder melde dich beim umbrelOS Beta Programm an",
|
||||
"beta-program": "umbrelOS Beta Programm",
|
||||
"beta-program-description": "Melde dich an, um Beta-Updates von umbrelOS zu erhalten, erhalte frühen Zugang zu neuen Funktionen und hilf uns, diese zu verbessern, indem du dein Feedback gibst. Beta-Updates können instabil sein und die Fehlerbehebung kann Kenntnisse des Terminals erfordern."
|
||||
}
|
||||
"terminal.umbrelos-description": "Führe benutzerdefinierte Befehle in umbrelOS aus",
|
||||
"tor-description": "Greife von überall auf dein Umbrel zu mit einem Tor-Browser",
|
||||
"tor.disable.description": "Dies kann einige Minuten dauern",
|
||||
"tor.disable.progress": "Remote Tor-Zugang wird deaktiviert",
|
||||
"tor.disable.success": "Remote Tor-Zugang deaktiviert",
|
||||
"tor.enable.description": "Dies kann einige Minuten dauern",
|
||||
"tor.enable.mobile.switch-label": "Remote Tor-Zugang aktivieren",
|
||||
"tor.enable.submit": "Aktivieren",
|
||||
"tor.enable.success": "Remote Tor-Zugang aktiviert",
|
||||
"tor.enable.title": "Remote Tor-Zugang aktivieren",
|
||||
"tor.hidden-service": "Tor Hidden Service URL",
|
||||
"troubleshoot": "Fehlerbehebung",
|
||||
"troubleshoot-description": "Fehlerbehebung für umbrelOS oder eine App",
|
||||
"troubleshoot-no-logs-yet": "Noch keine Protokolle",
|
||||
"troubleshoot-pick-title": "Fehlerbehebung",
|
||||
"troubleshoot.app": "App",
|
||||
"troubleshoot.app-description": "Protokolle einer auf deinem Umbrel installierten App anzeigen",
|
||||
"troubleshoot.app-download": "{{app}} Protokolle herunterladen",
|
||||
"troubleshoot.share-with-umbrel-support": "Mit dem Umbrel-Support teilen",
|
||||
"troubleshoot.system-download": "{{label}} herunterladen",
|
||||
"troubleshoot.umbrelos-description": "umbrelOS-Protokolle anzeigen",
|
||||
"troubleshoot.umbrelos-logs": "umbrelOS-Protokolle",
|
||||
"trpc.backend-unavailable": "Fehler: Verbindung zur System-API fehlgeschlagen",
|
||||
"trpc.checking-backend": "Lädt...",
|
||||
"try-again": "Erneut versuchen",
|
||||
"umbrel": "Umbrel",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"umbrelos": "umbrelOS",
|
||||
"unknown": "Unbekannt",
|
||||
"unknown-app": "Unbekannte App",
|
||||
"unknown-error": "Unbekannter Fehler",
|
||||
"uptime": "Betriebszeit",
|
||||
"wallpaper": "Hintergrundbild",
|
||||
"wallpaper-description": "Dein Umbrel Hintergrundbild und Thema",
|
||||
"widget.progress.in-progress": "In Bearbeitung",
|
||||
"widgets.edit.select-up-to-3-widgets": "Wähle bis zu 3 Widgets",
|
||||
"widgets.install-an-app-before-using-widgets": "Installiere eine App, um deinen Startbildschirm mit Widgets anzupassen.",
|
||||
"wifi": "Wi-Fi",
|
||||
"wifi-connect-insecure-message": "Offene Netzwerke können unsicher sein",
|
||||
"wifi-connection-failed": "Verbindung fehlgeschlagen",
|
||||
"wifi-dangerous-change-confirmation-description": "Ein Wechsel des Wi-Fi-Netzwerks kann dich von deinem Umbrel trennen. Um dich erneut zu verbinden, stelle sicher, dass sowohl dein Umbrel als auch das Gerät, von dem aus du darauf zugreifst, im selben Netzwerk sind.",
|
||||
"wifi-dangerous-change-confirmation-title": "Bist du sicher, dass du das Wi-Fi-Netzwerk wechseln möchtest?",
|
||||
"wifi-dangerous-disable-confirmation-description": "Das Deaktivieren von Wi-Fi kann dich von deinem Umbrel trennen. Um dich erneut zu verbinden, stecke ein Ethernet-Kabel in dein Umbrel und stelle sicher, dass sowohl dein Umbrel als auch das Gerät, von dem aus du darauf zugreifst, im selben Netzwerk sind.",
|
||||
"wifi-dangerous-disable-confirmation-title": "Bist du sicher, dass du Wi-Fi deaktivieren möchtest?",
|
||||
"wifi-description": "Verbinde dein Gerät mit einem Wi-Fi-Netzwerk",
|
||||
"wifi-description-long": "Dein Gerät bleibt mit deinem gewählten Wi-Fi verbunden, auch wenn das Ethernet-Kabel entfernt wird, und verbindet sich beim Start automatisch wieder mit dem Wi-Fi.",
|
||||
"wifi-no-networks-message": "Keine Wi-Fi-Netzwerke gefunden",
|
||||
"wifi-searching": "Suche nach Wi-Fi-Netzwerken...",
|
||||
"wifi-unsupported-device-description": "Wi-Fi wird auf diesem Gerät nicht unterstützt. Dies kann an einem fehlenden oder inkompatiblen WLAN-Adapter liegen.",
|
||||
"wifi-view-networks": "Netzwerke anzeigen"
|
||||
}
|
||||
+343
-370
@@ -1,398 +1,371 @@
|
||||
{
|
||||
"hello": "Hello",
|
||||
"desktop.greeting.morning": "Good morning, {{name}}",
|
||||
"desktop.greeting.afternoon": "Good afternoon, {{name}}",
|
||||
"desktop.greeting.evening": "Good evening, {{name}}",
|
||||
"search": "Search",
|
||||
"settings": "Settings",
|
||||
"app-store.title": "App Store",
|
||||
"unknown": "Unknown",
|
||||
"app_one": "app",
|
||||
"app_other": "apps",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"linux": "Linux",
|
||||
"install-your-first-app": "Install your first app",
|
||||
"logout": "Log out",
|
||||
"restart": "Restart",
|
||||
"shut-down": "Shut down",
|
||||
"umbrel": "Umbrel",
|
||||
"device": "Device",
|
||||
"umbrelos": "umbrelOS",
|
||||
"open-live-usage": "Open Live Usage",
|
||||
"account": "Account",
|
||||
"wallpaper": "Wallpaper",
|
||||
"name": "Name",
|
||||
"password": "Password",
|
||||
"account-description": "Your name and password",
|
||||
"wallpaper-description": "Your Umbrel wallpaper and theme",
|
||||
"2fa-description": "A second layer of security for your Umbrel login and apps",
|
||||
"tor-description": "Access your Umbrel from anywhere using a Tor browser",
|
||||
"migration-assistant": "Migration Assistant",
|
||||
"migration-assistant-description": "Transfer all your apps and data from a Raspberry Pi to Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "Migration Assistant currently supports transferring all data and apps from a Raspberry Pi with umbrelOS to the Umbrel Home. Open Migration Assistant on your Umbrel Home to get started.",
|
||||
"language": "Language",
|
||||
"language-description": "Your preferred umbrelOS language",
|
||||
"app-store.description": "Your app update settings",
|
||||
"migrate": "Migrate",
|
||||
"change-name": "Change name",
|
||||
"change-password": "Change password",
|
||||
"uptime": "Uptime",
|
||||
"preferences": "Preferences",
|
||||
"troubleshoot": "Troubleshoot",
|
||||
"troubleshoot-description": "Troubleshoot umbrelOS or an app",
|
||||
"device-info-description": "Information about your device",
|
||||
"device-info.view-info": "View info",
|
||||
"factory-reset": "Factory Reset",
|
||||
"factory-reset.reset": "Reset",
|
||||
"factory-reset.desc": "Delete all of your umbrelOS data and apps",
|
||||
"software-update.title": "Software update",
|
||||
"device-info": "Device info",
|
||||
"software-update.on-latest": "You are on the latest umbrelOS",
|
||||
"check-for-latest-version": "Check for the latest umbrelOS update",
|
||||
"2fa": "2FA",
|
||||
"remote-tor-access": "Remote Tor access",
|
||||
"software-update.checking": "Checking for update...",
|
||||
"software-update.check": "Check for update",
|
||||
"software-update.new-version": "New {{name}} is available to install",
|
||||
"software-update.updating-to": "Updating to {{name}}",
|
||||
"software-update.callout": "Please do not refresh this page or turn off your Umbrel while it is updating.",
|
||||
"software-update.failed.title": "Software update failed",
|
||||
"software-update.failed.description": "There was an error during the software update",
|
||||
"software-update.failed.please-try-again": "Please try again",
|
||||
"software-update.failed.retry": "Retry",
|
||||
"update": "update",
|
||||
"software-update.update-now": "Update now",
|
||||
"software-update.view": "View",
|
||||
"storage": "Storage",
|
||||
"storage.low": "Low storage",
|
||||
"storage.full": "Storage full",
|
||||
"something-left": "{{left}} left",
|
||||
"unexpected-error": "Unexpected error",
|
||||
"unexpected-error.heading": "⚠ Error",
|
||||
"clipboard.copied": "Copied",
|
||||
"close": "Close",
|
||||
"something-went-wrong": "⚠ Something went wrong",
|
||||
"loading": "Loading",
|
||||
"cmdk.input-placeholder": "Search for apps, settings, or actions",
|
||||
"no-results-found": "No results found",
|
||||
"cmdk.restart-umbrel": "Restart Umbrel",
|
||||
"cmdk.update-all-apps": "Update all apps",
|
||||
"cmdk.change-wallpaper": "Change wallpaper",
|
||||
"cmdk.live-usage": "Live Usage",
|
||||
"cmdk.widgets": "Widgets",
|
||||
"cmdk.frequent-apps": "Frequently used",
|
||||
"app.offline": "Not running",
|
||||
"app.uninstalling": "Uninstalling",
|
||||
"app.install": "Install",
|
||||
"app.installing": "Installing",
|
||||
"app.updating": "Updating",
|
||||
"app.open": "Open",
|
||||
"app.view": "View",
|
||||
"retry": "Retry",
|
||||
"download-logs": "Download logs",
|
||||
"page-title-umbrel": "{{title}} – umbrelOS",
|
||||
"desktop.title": "Desktop",
|
||||
"notifications": "Notifications",
|
||||
"device-info.device": "Device",
|
||||
"device-info.model-number": "Model number",
|
||||
"device-info.serial-number": "Serial number",
|
||||
"memory": "Memory",
|
||||
"memory.low": "Low memory",
|
||||
"no-forgot-password-message": "If you lose your password, you won't be able to log into your Umbrel. Make sure to safely secure it.",
|
||||
"settings.contact-support": "Need help? <linked>Contact support.</linked>",
|
||||
"temperature": "Temperature",
|
||||
"temperature.too-hot-suggestion": "Consider changing your device's environment.",
|
||||
"temp.dangerously-hot": "Very hot",
|
||||
"temp.hot": "Hot",
|
||||
"temp.nice": "Nice",
|
||||
"temp.warm": "Warm",
|
||||
"temp.normal": "Normal",
|
||||
"temp.too-cold": "Too cold",
|
||||
"temp.cool": "Cool",
|
||||
"2fa.disable.title": "Disable two-factor authentication",
|
||||
"2fa.enter-code": "Enter the code displayed in your authenticator app",
|
||||
"2fa.enable.or-paste": "Or paste the following code in your authenticator app",
|
||||
"2fa.enable.title": "Enable two-factor authentication",
|
||||
"2fa.enable.scan-this": "Scan this QR code using an authenticator app like Google Authenticator or Authy",
|
||||
"settings.app-store-preferences.title": "App Store Preferences",
|
||||
"change-name.input-placeholder": "Your name",
|
||||
"confirm": "Confirm",
|
||||
"cancel": "Cancel",
|
||||
"change-password.callout": "If you lose your password, you won't be able to log into your Umbrel. Make sure to safely secure it.",
|
||||
"change-password.current-password": "Current password",
|
||||
"change-password.new-password": "New password",
|
||||
"change-password.repeat-password": "Repeat password",
|
||||
"restart.restarting": "Restarting",
|
||||
"restart.restarting-message": "Please do not refresh this page or turn off your Umbrel while it is restarting.",
|
||||
"restart.failed": "Failed to restart",
|
||||
"restart.confirm.title": "Are you sure you want to restart your Umbrel?",
|
||||
"restart.confirm.submit": "Restart",
|
||||
"shut-down.complete": "Shutdown complete",
|
||||
"shut-down.complete-text": "You can now unplug your device from the power.",
|
||||
"shut-down.shutting-down": "Shutting down",
|
||||
"shut-down.shutting-down-message": "Please do not refresh this page or turn off your Umbrel while it is shutting down.",
|
||||
"shut-down.failed": "Failed to shut down",
|
||||
"shut-down.confirm.title": "Are you sure you want to shut down your Umbrel?",
|
||||
"shut-down.confirm.submit": "Shut down",
|
||||
"tor.enable.title": "Enable remote Tor access",
|
||||
"tor.enable.failed": "Failed to enable Tor",
|
||||
"tor.enable.description": "This may take a few minutes",
|
||||
"tor.disable.description": "This may take a few minutes",
|
||||
"tor.enable.submit": "Enable",
|
||||
"troubleshoot.umbrelos-description": "View umbrelOS and system logs",
|
||||
"troubleshoot.app": "App",
|
||||
"troubleshoot.app-description": "View logs of an app installed on your Umbrel",
|
||||
"troubleshoot.umbrelos-logs": "umbrelOS logs",
|
||||
"troubleshoot.system-logs": "System logs",
|
||||
"troubleshoot.system-download": "Download {{label}}",
|
||||
"troubleshoot.app-download": "Download {{app}} logs",
|
||||
"app-picker.select-app": "Select app...",
|
||||
"app-picker.search": "Search...",
|
||||
"troubleshoot.share-with-umbrel-support": "Share with Umbrel Support",
|
||||
"login": "Login",
|
||||
"migration-assistant.prep.body": "Prepare for migration",
|
||||
"migration-assistant.prep.button-continue": "Continue",
|
||||
"migration-assistant.prep.callout": "The data on your Umbrel Home, if any, will be permanently deleted.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Shut down your Raspberry Pi Umbrel.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Connect its external drive to any USB port on your Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Once done, click '{{button}}' below.",
|
||||
"migration-assistant.failed": "Something's not right...",
|
||||
"try-again": "Try again",
|
||||
"migration-assistant.continue-migration.ready.submit": "Start migration",
|
||||
"migration-assistant.ready.title": "You're all set to migrate!",
|
||||
"migration-assistant.ready.description": "All your data and apps are ready to be migrated to your Umbrel Home",
|
||||
"migration-assistant.ready.hint-header": "Things to keep in mind",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Use the same password",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Remember to use your Raspberry Pi Umbrel password to log into your Umbrel Home",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Keep your Raspberry Pi off after the update",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "This helps prevent issues with apps such as Lightning Node",
|
||||
"migration-assistant.failed.ssd-not-detected.title": "Cannot detect any external drive",
|
||||
"migration-assistant.failed.ssd-not-detected.description": "Make sure to connect your Raspberry Pi's external drive to your Umbrel Home",
|
||||
"migration-assistant.failed.incorrect-ssd.title": "Incompatible external drive",
|
||||
"migration-assistant.failed.incorrect-ssd.description": "Make sure you've connected your Raspberry Pi's external drive to your Umbrel Home",
|
||||
"live-usage": "Live Usage",
|
||||
"unknown-app": "Unknown app",
|
||||
"login.title": "Welcome back",
|
||||
"login.subtitle": "Enter your Umbrel password to log in",
|
||||
"login.password-label": "Password",
|
||||
"login.password.submit": "Log in",
|
||||
"login-2fa.title": "Authenticate",
|
||||
"login-2fa.subtitle": "Enter the 2FA code displayed in your authenticator app",
|
||||
"not-found-404": "Error code: 404",
|
||||
"not-found-404.back": "Back",
|
||||
"not-found-404.home": "Go to Home",
|
||||
"restart.try-again": "Retry",
|
||||
"login-with-umbrel.app-not-found": "App not found.",
|
||||
"login-with-umbrel.title": "Log in with Umbrel",
|
||||
"login-with-umbrel.description": "Enter your Umbrel password to open {{app}}",
|
||||
"create-user": "Create user",
|
||||
"language.select-description": "Select preferred umbrelOS language",
|
||||
"software-update.current-running": "You are on",
|
||||
"migration-assistant.mobile.start-button": "Start migration",
|
||||
"tor.enable.mobile.switch-label": "Enable remote Tor access",
|
||||
"logout.confirm.title": "Are you sure you want to log out?",
|
||||
"logout.confirm.submit": "Log out",
|
||||
"2fa.enable.success": "Two-factor authentication enabled",
|
||||
"2fa-description": "A second layer of security for your Umbrel login and apps",
|
||||
"2fa.disable.success": "Two-factor authentication disabled",
|
||||
"apps.uninstalled-all.success": "Uninstalled all apps",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Failed to get required apps",
|
||||
"2fa.disable.title": "Disable two-factor authentication",
|
||||
"2fa.enable.or-paste": "Or paste the following code in your authenticator app",
|
||||
"2fa.enable.scan-this": "Scan this QR code using an authenticator app like Google Authenticator or Authy",
|
||||
"2fa.enable.success": "Two-factor authentication enabled",
|
||||
"2fa.enable.title": "Enable two-factor authentication",
|
||||
"2fa.enter-code": "Enter the code displayed in your authenticator app",
|
||||
"account": "Account",
|
||||
"account-description": "Your name and password",
|
||||
"advanced-settings": "Advanced settings",
|
||||
"advanced-settings-description": "Open terminal or enroll into umbrelOS Beta Program",
|
||||
"app-not-found": "App not found: {{app}}",
|
||||
"app-only-over-tor": "{{app}} can only be used over Tor. Please access your Umbrel in a Tor browser on your remote access URL (Settings > Remote Tor access) to open this app.",
|
||||
"widget.progress.in-progress": "In progress",
|
||||
"change-password.failed.current-required": "Current password is required",
|
||||
"change-password.failed.new-required": "New password is required",
|
||||
"change-password.failed.repeat-required": "Repeat password is required",
|
||||
"change-password.failed.no-match": "Passwords do not match",
|
||||
"change-password.failed.must-be-unique": "New password must be different from the current password",
|
||||
"change-password.failed.min-length": "Password must be at least {{characters}} characters",
|
||||
"notifications.view": "View",
|
||||
"notifications.new-version-available": "{{update}} is now available to install",
|
||||
"notifications.cpu.too-hot": "High CPU temperature",
|
||||
"notifications.cpu.too-cold": "Low CPU temperature",
|
||||
"notifications.storage.full": "Your device's storage is full",
|
||||
"notifications.memory.low": "Your device's memory is low",
|
||||
"notifications.storage.low": "Your device's storage is low",
|
||||
"software-update.success": "Successfully updated to umbrelOS {{version}}",
|
||||
"software-update.failed": "Failed to update",
|
||||
"software-update.failed-to-check": "Failed to check for updates",
|
||||
"change-name.failed.name-required": "Name is required",
|
||||
"free": "Free",
|
||||
"app-page.section.about": "About",
|
||||
"app-page.section.credentials.title": "Default credentials",
|
||||
"app-page.section.info.compatibility": "Compatibility",
|
||||
"app-page.section.info.compatibility-compatible": "Compatible",
|
||||
"app-page.section.info.developer": "Developer",
|
||||
"app-page.section.info.source-code": "Source Code",
|
||||
"app-page.section.info.source-code.public": "Public",
|
||||
"app-page.section.info.submitted-by": "Submitted by",
|
||||
"app-page.section.info.title": "Info",
|
||||
"app-page.section.info.version": "Version",
|
||||
"app-page.section.recommendations.title": "You might also like",
|
||||
"app-page.section.release-notes.title": "What's new",
|
||||
"app-page.section.release-notes.version": "Version {{version}}",
|
||||
"app-page.section.requires": "Requires",
|
||||
"app-page.section.requires.support": "Get support",
|
||||
"app-picker.search": "Search...",
|
||||
"app-picker.select-app": "Select app...",
|
||||
"app-store.browse-category-apps": "Browse {{category}} apps",
|
||||
"app-store.category.discover": "Discover",
|
||||
"app-store.category.ai": "AI",
|
||||
"app-store.category.all": "All apps",
|
||||
"app-store.category.files": "Files & Productivity",
|
||||
"app-store.category.automation": "Home & Automation",
|
||||
"app-store.category.bitcoin": "Bitcoin",
|
||||
"app-store.category.developer": "Developer Tools",
|
||||
"app-store.category.discover": "Discover",
|
||||
"app-store.category.files": "Files & Productivity",
|
||||
"app-store.category.finance": "Finance",
|
||||
"app-store.category.media": "Media",
|
||||
"app-store.category.networking": "Networking",
|
||||
"app-store.category.social": "Social",
|
||||
"app-store.category.automation": "Home & Automation",
|
||||
"app-store.category.ai": "AI",
|
||||
"app-store.category.developer": "Developer Tools",
|
||||
"community-app-store": "Community App Store",
|
||||
"community-app-store.loading": "Loading...",
|
||||
"community-app-store.back-to-umbrel-app-store": "Back to Umbrel App Store",
|
||||
"community-app-store.open-button": "Open",
|
||||
"community-app-store.remove-button": "Remove",
|
||||
"community-app-stores.description": "Community App Stores allow you to install apps on your Umbrel that may not be available in the official Umbrel App Store. They also make it easy to test beta versions of Umbrel apps before developers release them on the official Umbrel App Store.",
|
||||
"community-app-stores.learn-more": "Learn more",
|
||||
"community-app-stores.warning": "Community App Stores can be created by anyone. The apps published in them are not verified or vetted by the official Umbrel App Store team, and can potentially be insecure or malicious. Use caution and only add app stores from developers you trust.",
|
||||
"community-app-stores.add-button": "Add",
|
||||
"desktop.install-first.for-the-self-hoster": "For the self-hoster",
|
||||
"desktop.install-first.for-the-bitcoiner": "For the Bitcoiner",
|
||||
"desktop.install-first.for-the-streamer": "For the streamer",
|
||||
"desktop.context-menu.edit-widgets": "Edit widgets",
|
||||
"desktop.context-menu.logout": "Log out",
|
||||
"desktop.context-menu.change-wallpaper": "Change wallpaper",
|
||||
"desktop.not-enough-room": "Use a larger screen to view your apps.",
|
||||
"desktop.app.context.go-to-store-page": "View in App Store",
|
||||
"desktop.app.context.show-default-credentials": "Show default credentials",
|
||||
"desktop.app.context.uninstall": "Uninstall",
|
||||
"desktop.install-first.link-to-app-store": "Explore more in App Store",
|
||||
"migrate.callout": "Do not turn off your Umbrel until the migration is complete",
|
||||
"app.uninstall.confirm.title": "Uninstall {{app}}?",
|
||||
"app.uninstall.confirm.submit": "Uninstall",
|
||||
"app.uninstall.confirm.description": "All data associated with {{app}} will be permanently deleted. This action cannot be undone.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} is used by",
|
||||
"widgets.edit.title": "Edit widgets",
|
||||
"widgets.edit.select-up-to-3-widgets": "Select up to 3 widgets",
|
||||
"onboarding.create-account": "Create account",
|
||||
"factory-reset.review.title": "Review data",
|
||||
"factory-reset.review.following-will-be-removed": "The following will be removed from your device",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} installed app",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} installed apps",
|
||||
"app.uninstall.deps.used-by.description_one": "Uninstall {{firstAppToUninstall}} first to uninstall {{app}}.",
|
||||
"app.uninstall.deps.used-by.description_other": "Uninstall these apps first to uninstall {{app}}.",
|
||||
"app-store.search-apps": "Search apps",
|
||||
"app-store.description": "Your app update settings",
|
||||
"app-store.menu.community-app-stores": "Community App Stores",
|
||||
"app-store.search-apps": "Search apps",
|
||||
"app-store.search.no-results": "No results",
|
||||
"app-store.search.results-for": "Results for",
|
||||
"factory-reset.review.submit": "Continue",
|
||||
"factory-reset.review.account-info": "Account info and password",
|
||||
"factory-reset.review.total-data": "Total data",
|
||||
"factory-reset.review.apps": "Apps",
|
||||
"onboarding.create-account.failed.name-required": "Name is required",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Passwords do not match",
|
||||
"onboarding.create-account.subtitle": "Your account info is stored only on your Umbrel. Make sure to back up your password safely as there is no way to reset it.",
|
||||
"onboarding.contact-support": "Support",
|
||||
"onboarding.create-account.name.input-placeholder": "Your name",
|
||||
"onboarding.create-account.password.input-label": "Password",
|
||||
"onboarding.create-account.confirm-password.input-label": "Confirm password",
|
||||
"onboarding.create-account.submit": "Create",
|
||||
"onboarding.create-account.submitting": "Creating",
|
||||
"onboarding.account-created.youre-all-set-name": "You're all set, {{name}}.",
|
||||
"legal.privacy-policy": "Privacy Policy",
|
||||
"legal.terms-of-service": "Terms of Service",
|
||||
"onboarding.account-created.next": "Next",
|
||||
"onboarding.account-created.page-title": "Account created",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "By clicking 'Next', you agree to the <linked>umbrelOS Terms of Service</linked>",
|
||||
"onboarding.start.title": "Welcome to umbrelOS",
|
||||
"onboarding.start.subtitle": "Your home cloud server is ready to set up.",
|
||||
"onboarding.account-created.subtitle": "Your Umbrel is now ready.",
|
||||
"onboarding.start.continue": "Start",
|
||||
"app-page.section.about": "About",
|
||||
"default-credentials.title": "Credentials for {{app}}",
|
||||
"default-credentials.username": "Default username",
|
||||
"default-credentials.password": "Default password",
|
||||
"default-credentials.open": "Open {{app}}",
|
||||
"default-credentials.close": "Got it",
|
||||
"default-credentials..dont-show-again": "Don't show this again",
|
||||
"default-credentials.description": "Here are credentials you'll need to log into the app.",
|
||||
"app-page.section.requires": "Requires",
|
||||
"app-page.section.requires.support": "Get support",
|
||||
"app-page.section.info.title": "Info",
|
||||
"app-page.section.info.version": "Version",
|
||||
"app-page.section.info.source-code": "Source Code",
|
||||
"app-page.section.info.source-code.public": "Public",
|
||||
"app-page.section.info.developer": "Developer",
|
||||
"app-page.section.info.submitted-by": "Submitted by",
|
||||
"app-page.section.info.compatibility": "Compatibility",
|
||||
"app-page.section.info.compatibility-compatible": "Compatible",
|
||||
"app-page.section.recommendations.title": "You might also like",
|
||||
"app-page.section.release-notes.title": "What's new",
|
||||
"app-page.section.release-notes.version": "Version {{version}}",
|
||||
"app-page.section.credentials.title": "Default credentials",
|
||||
"auto-update": "Auto-update",
|
||||
"read-less": "Read less",
|
||||
"read-more": "Read more",
|
||||
"app-store.title": "App Store",
|
||||
"app-updates.less": "less",
|
||||
"app-updates.more": "more",
|
||||
"app-updates.no-updates": "All apps are up-to-date!",
|
||||
"app-updates.update": "Update",
|
||||
"app-updates.update-all": "Update all",
|
||||
"app-updates.updates-available-count_one": "{{count}} update available",
|
||||
"app-updates.updates-available-count_other": "{{count}} updates available",
|
||||
"app-updates.updating": "Updating...",
|
||||
"app.install": "Install",
|
||||
"app.installing": "Installing",
|
||||
"app.offline": "Not running",
|
||||
"app.open": "Open",
|
||||
"app.optimized-for-umbrel-home": "Optimized for Umbrel Home",
|
||||
"install-first.title": "{{app}} requires access to",
|
||||
"install-first.description_one": "Install this app to install {{app}}.",
|
||||
"install-first.description_other": "Install these apps first to install {{app}}.",
|
||||
"ok": "OK",
|
||||
"factory-reset.confirm.title": "Confirm with password",
|
||||
"factory-reset.confirm.body": "Confirm Umbrel password to reset",
|
||||
"factory-reset.confirm.submit": "Erase everything and reset",
|
||||
"factory-reset.confirm.submit-callout": "This action cannot be undone.",
|
||||
"factory-reset.confirm.password-label": "Enter password",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Do not turn off your device until the reset is complete",
|
||||
"factory-reset.resetting.connecting": "Connecting",
|
||||
"factory-reset.failed.title": "Reset failed",
|
||||
"factory-reset.failed.message": "There was an error during reset",
|
||||
"factory-reset.failed.message.please-try-again": "Please try again",
|
||||
"factory-reset.failed.retry": "Retry factory reset",
|
||||
"factory-reset.success.title": "Reset successful",
|
||||
"factory-reset.success.description": "All your apps, app data, and account data have been deleted from your device. You may now restart your device.",
|
||||
"factory-reset.success.restart-device": "Restart device",
|
||||
"connecting": "Connecting...",
|
||||
"migrate.failed.title": "Migration failed",
|
||||
"migrate.failed.description": "There was an error during migration",
|
||||
"migrate.failed.please-try-again": "Please try again",
|
||||
"migrate.failed.retry": "Retry",
|
||||
"migrate.success.title": "Migration successful",
|
||||
"migrate.success.description": "All your apps, app data, and account details have been migrated to your Umbrel Home.",
|
||||
"continue-to-log-in": "Continue to log in",
|
||||
"trpc.checking-backend": "Loading...",
|
||||
"trpc.backend-unavailable": "Error: Connection to the system API failed",
|
||||
"app.restarting": "Restarting",
|
||||
"app.starting": "Starting",
|
||||
"app.stopped": "Stopped",
|
||||
"app.stopping": "Stopping",
|
||||
"app.uninstall.confirm.description": "All data associated with {{app}} will be permanently deleted. This action cannot be undone.",
|
||||
"app.uninstall.confirm.submit": "Uninstall",
|
||||
"app.uninstall.confirm.title": "Uninstall {{app}}?",
|
||||
"app.uninstall.deps.used-by.description_one": "Uninstall {{firstAppToUninstall}} first to uninstall {{app}}.",
|
||||
"app.uninstall.deps.used-by.description_other": "Uninstall these apps first to uninstall {{app}}.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} is used by",
|
||||
"app.uninstalling": "Uninstalling",
|
||||
"app.updating": "Updating",
|
||||
"app.view": "View",
|
||||
"app_one": "app",
|
||||
"app_other": "apps",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Failed to get required apps",
|
||||
"apps.uninstalled-all.success": "Uninstalled all apps",
|
||||
"auth.checking-backend-for-user": "Loading...",
|
||||
"auth.failed-checking-if-user-logged-in": "Error: Auth login check failed",
|
||||
"auth.failed-to-check-if-user-exists": "Error: Auth existence check failes",
|
||||
"redirect.to-onboarding": "Loading...",
|
||||
"redirect.to-login": "Loading...",
|
||||
"redirect.to-home": "Loading...",
|
||||
"widgets.install-an-app-before-using-widgets": "Install an app to start customizing your homescreen with widgets.",
|
||||
"logout-error-generic": "Error: Logout failed",
|
||||
"app.stopping": "Stopping",
|
||||
"app.starting": "Starting",
|
||||
"app.restarting": "Restarting",
|
||||
"beta-program": "umbrelOS Beta Program",
|
||||
"beta-program-description": "Opt in to receiving umbrelOS beta updates, gain early access to new features, and help us refine them by providing your feedback. Beta updates might be unstable, and troubleshooting may require familiarity with terminal.",
|
||||
"cancel": "Cancel",
|
||||
"change": "Change",
|
||||
"change-name": "Change name",
|
||||
"change-name.failed.name-required": "Name is required",
|
||||
"change-name.input-placeholder": "Your name",
|
||||
"change-password": "Change password",
|
||||
"change-password.callout": "If you lose your password, you won't be able to log into your Umbrel. Make sure to safely secure it.",
|
||||
"change-password.current-password": "Current password",
|
||||
"change-password.failed.current-required": "Current password is required",
|
||||
"change-password.failed.min-length": "Password must be at least {{characters}} characters",
|
||||
"change-password.failed.must-be-unique": "New password must be different from the current password",
|
||||
"change-password.failed.new-required": "New password is required",
|
||||
"change-password.failed.no-match": "Passwords do not match",
|
||||
"change-password.failed.repeat-required": "Repeat password is required",
|
||||
"change-password.new-password": "New password",
|
||||
"change-password.repeat-password": "Repeat password",
|
||||
"check-for-latest-version": "Check for the latest umbrelOS update",
|
||||
"clipboard.copied": "Copied",
|
||||
"close": "Close",
|
||||
"cmdk.change-wallpaper": "Change wallpaper",
|
||||
"cmdk.frequent-apps": "Frequently used",
|
||||
"cmdk.input-placeholder": "Search for apps, settings, or actions",
|
||||
"cmdk.install-from-app-store": "from App Store",
|
||||
"cmdk.live-usage": "Live Usage",
|
||||
"cmdk.restart-umbrel": "Restart Umbrel",
|
||||
"cmdk.shutdown-umbrel": "Shut down Umbrel",
|
||||
"cmdk.update-all-apps": "Update all apps",
|
||||
"cmdk.widgets": "Widgets",
|
||||
"community-app-store": "Community App Store",
|
||||
"community-app-store.back-to-umbrel-app-store": "Back to Umbrel App Store",
|
||||
"community-app-store.open-button": "Open",
|
||||
"community-app-store.remove-button": "Remove",
|
||||
"community-app-stores.add-button": "Add",
|
||||
"community-app-stores.description": "Community App Stores allow you to install apps on your Umbrel that may not be available in the official Umbrel App Store. They also make it easy to test beta versions of Umbrel apps before developers release them on the official Umbrel App Store.",
|
||||
"community-app-stores.learn-more": "Learn more",
|
||||
"community-app-stores.warning": "Community App Stores can be created by anyone. The apps published in them are not verified or vetted by the official Umbrel App Store team, and can potentially be insecure or malicious. Use caution and only add app stores from developers you trust.",
|
||||
"confirm": "Confirm",
|
||||
"connecting": "Connecting...",
|
||||
"continue": "Continue",
|
||||
"continue-to-log-in": "Continue to log in",
|
||||
"cpu": "CPU",
|
||||
"cpu-core-count": "{{cores}} threads",
|
||||
"troubleshoot-pick-title": "Troubleshoot",
|
||||
"troubleshoot-no-logs-yet": "No logs yet",
|
||||
"temperature.too-cold-suggestion": "Consider changing your device's environment",
|
||||
"cmdk.install-from-app-store": "from App Store",
|
||||
"cmdk.shutdown-umbrel": "Shut down Umbrel",
|
||||
"tor.enable.success": "Remote Tor access enabled",
|
||||
"tor.enable.progress": "Enabling remote Tor access",
|
||||
"tor.disable.success": "Remote Tor access disabled",
|
||||
"tor.disable.progress": "Disabling remote Tor access",
|
||||
"tor.hidden-service": "Tor hidden service URL",
|
||||
"stop": "Stop",
|
||||
"software-update.release-notes.title": "Release notes",
|
||||
"app-updates.updates-available-count_one": "{{count}} update available",
|
||||
"app-updates.updates-available-count_other": "{{count}} updates available",
|
||||
"app-updates.title": "Updates",
|
||||
"app-updates.update-all": "Update all",
|
||||
"app-updates.updating": "Updating...",
|
||||
"app-updates.update": "Update",
|
||||
"app-updates.less": "less",
|
||||
"app-updates.more": "more",
|
||||
"create-user": "Create user",
|
||||
"default-credentials.close": "Got it",
|
||||
"default-credentials.description": "Here are credentials you'll need to log into the app.",
|
||||
"default-credentials.dont-show-again": "Don't show this again",
|
||||
"default-credentials.open": "Open {{app}}",
|
||||
"default-credentials.password": "Default password",
|
||||
"default-credentials.title": "Credentials for {{app}}",
|
||||
"default-credentials.username": "Default username",
|
||||
"desktop.app.context.go-to-store-page": "View in App Store",
|
||||
"desktop.app.context.show-default-credentials": "Show default credentials",
|
||||
"desktop.app.context.uninstall": "Uninstall",
|
||||
"desktop.context-menu.change-wallpaper": "Change wallpaper",
|
||||
"desktop.context-menu.edit-widgets": "Edit widgets",
|
||||
"desktop.context-menu.logout": "Log out",
|
||||
"desktop.greeting.afternoon": "Good afternoon, {{name}}",
|
||||
"desktop.greeting.evening": "Good evening, {{name}}",
|
||||
"desktop.greeting.morning": "Good morning, {{name}}",
|
||||
"desktop.install-first.for-the-bitcoiner": "For the Bitcoiner",
|
||||
"desktop.install-first.for-the-self-hoster": "For the self-hoster",
|
||||
"desktop.install-first.for-the-streamer": "For the streamer",
|
||||
"desktop.install-first.link-to-app-store": "Explore more in App Store",
|
||||
"desktop.not-enough-room": "Use a larger screen to view your apps.",
|
||||
"device": "Device",
|
||||
"device-info": "Device info",
|
||||
"device-info-description": "Information about your device",
|
||||
"device-info.device": "Device",
|
||||
"device-info.model-number": "Model number",
|
||||
"device-info.serial-number": "Serial number",
|
||||
"device-info.view-info": "View info",
|
||||
"disable": "Disable",
|
||||
"download-logs": "Download logs",
|
||||
"factory-reset": "Factory Reset",
|
||||
"factory-reset.confirm.body": "Confirm Umbrel password to reset",
|
||||
"factory-reset.confirm.password-label": "Enter password",
|
||||
"factory-reset.confirm.submit": "Erase everything and reset",
|
||||
"factory-reset.confirm.submit-callout": "This action cannot be undone.",
|
||||
"factory-reset.desc": "Delete all of your umbrelOS data and apps",
|
||||
"factory-reset.failed.message": "There was an error during reset",
|
||||
"factory-reset.failed.retry": "Retry factory reset",
|
||||
"factory-reset.failed.title": "Reset failed",
|
||||
"factory-reset.reset": "Reset",
|
||||
"factory-reset.resetting.connecting": "Connecting",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Do not turn off your device until the reset is complete",
|
||||
"factory-reset.review.account-info": "Account info and password",
|
||||
"factory-reset.review.apps": "Apps",
|
||||
"factory-reset.review.following-will-be-removed": "The following will be removed from your device",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} installed app",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} installed apps",
|
||||
"factory-reset.review.submit": "Continue",
|
||||
"factory-reset.review.total-data": "Total data",
|
||||
"factory-reset.success.description": "All your apps, app data, and account data have been deleted from your device. You may now restart your device.",
|
||||
"factory-reset.success.restart-device": "Restart device",
|
||||
"factory-reset.success.title": "Reset successful",
|
||||
"hello": "Hello",
|
||||
"install-first.description_one": "Install this app to install {{app}}.",
|
||||
"install-first.description_other": "Install these apps first to install {{app}}.",
|
||||
"install-first.title": "{{app}} requires access to",
|
||||
"install-your-first-app": "Install your first app",
|
||||
"language": "Language",
|
||||
"language-description": "Your preferred umbrelOS language",
|
||||
"language.select-description": "Select preferred umbrelOS language",
|
||||
"linux": "Linux",
|
||||
"live-usage": "Live Usage",
|
||||
"loading": "Loading",
|
||||
"local-ip": "Local IP",
|
||||
"login-2fa.subtitle": "Enter the 2FA code displayed in your authenticator app",
|
||||
"login-2fa.title": "Authenticate",
|
||||
"login-with-umbrel.description": "Enter your Umbrel password to open {{app}}",
|
||||
"login-with-umbrel.title": "Log in with Umbrel",
|
||||
"login.password-label": "Password",
|
||||
"login.password.submit": "Log in",
|
||||
"login.subtitle": "Enter your Umbrel password to log in",
|
||||
"login.title": "Welcome back",
|
||||
"logout": "Log out",
|
||||
"logout-error-generic": "Error: Logout failed",
|
||||
"logout.confirm.submit": "Log out",
|
||||
"logout.confirm.title": "Are you sure you want to log out?",
|
||||
"memory": "Memory",
|
||||
"memory.low": "Low memory",
|
||||
"migrate": "Migrate",
|
||||
"migrate.callout": "Do not turn off your Umbrel until the migration is complete",
|
||||
"migrate.failed.retry": "Retry",
|
||||
"migrate.failed.title": "Migration failed",
|
||||
"migrate.success.description": "All your apps, app data, and account details have been migrated to your Umbrel Home.",
|
||||
"migrate.success.title": "Migration successful",
|
||||
"migration-assistant": "Migration Assistant",
|
||||
"migration-assistant-description": "Transfer all your apps and data from a Raspberry Pi to Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "Migration Assistant currently supports transferring all data and apps from a Raspberry Pi with umbrelOS to the Umbrel Home. Open Migration Assistant on your Umbrel Home to get started.",
|
||||
"migration-assistant.continue-migration.ready.submit": "Start migration",
|
||||
"migration-assistant.failed": "Something's not right...",
|
||||
"migration-assistant.failed.retrying-message": "Retrying...",
|
||||
"unknown-error": "Unknown error",
|
||||
"migration-assistant.mobile.start-button": "Start migration",
|
||||
"migration-assistant.prep.body": "Prepare for migration",
|
||||
"migration-assistant.prep.button-continue": "Continue",
|
||||
"migration-assistant.prep.callout": "The data on your Umbrel Home, if any, will be permanently deleted.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Connect its external drive to any USB port on your Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Once done, click '{{button}}' below.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Shut down your Raspberry Pi Umbrel.",
|
||||
"migration-assistant.ready.description": "All your data and apps are ready to be migrated to your Umbrel Home",
|
||||
"migration-assistant.ready.hint-header": "Things to keep in mind",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "This helps prevent issues with apps such as Lightning Node",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Keep your Raspberry Pi off after the update",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Remember to use your Raspberry Pi Umbrel password to log into your Umbrel Home",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Use the same password",
|
||||
"migration-assistant.ready.title": "You're all set to migrate!",
|
||||
"name": "Name",
|
||||
"no-forgot-password-message": "If you lose your password, you won't be able to log into your Umbrel. Make sure to safely secure it.",
|
||||
"no-results-found": "No results found",
|
||||
"not-found-404": "Error code: 404",
|
||||
"not-found-404.back": "Back",
|
||||
"not-found-404.home": "Go to Home",
|
||||
"notifications.cpu.too-hot": "High CPU temperature",
|
||||
"notifications.memory.low": "Your device's memory is low",
|
||||
"notifications.new-version-available": "{{update}} is now available to install",
|
||||
"notifications.storage.full": "Your device's storage is full",
|
||||
"notifications.view": "View",
|
||||
"ok": "OK",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "By clicking 'Next', you agree to the <linked>umbrelOS Terms of Service</linked>",
|
||||
"onboarding.account-created.next": "Next",
|
||||
"onboarding.account-created.subtitle": "Your Umbrel is now ready.",
|
||||
"onboarding.account-created.youre-all-set-name": "You're all set, {{name}}.",
|
||||
"onboarding.contact-support": "Support",
|
||||
"onboarding.create-account": "Create account",
|
||||
"onboarding.create-account.confirm-password.input-label": "Confirm password",
|
||||
"onboarding.create-account.failed.name-required": "Name is required",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Passwords do not match",
|
||||
"onboarding.create-account.name.input-placeholder": "Your name",
|
||||
"onboarding.create-account.password.input-label": "Password",
|
||||
"onboarding.create-account.submit": "Create",
|
||||
"onboarding.create-account.submitting": "Creating",
|
||||
"onboarding.create-account.subtitle": "Your account info is stored only on your Umbrel. Make sure to back up your password safely as there is no way to reset it.",
|
||||
"onboarding.start.continue": "Start",
|
||||
"onboarding.start.subtitle": "Your home cloud server is ready to set up.",
|
||||
"onboarding.start.title": "Welcome to umbrelOS",
|
||||
"open": "Open",
|
||||
"open-live-usage": "Open Live Usage",
|
||||
"password": "Password",
|
||||
"preferences": "Preferences",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"read-less": "Read less",
|
||||
"read-more": "Read more",
|
||||
"redirect.to-home": "Loading...",
|
||||
"redirect.to-login": "Loading...",
|
||||
"redirect.to-onboarding": "Loading...",
|
||||
"remote-tor-access": "Remote Tor access",
|
||||
"restart": "Restart",
|
||||
"restart.confirm.submit": "Restart",
|
||||
"restart.confirm.title": "Are you sure you want to restart your Umbrel?",
|
||||
"restart.restarting": "Restarting",
|
||||
"restart.restarting-message": "Please do not refresh this page or turn off your Umbrel while it is restarting.",
|
||||
"retry": "Retry",
|
||||
"search": "Search",
|
||||
"settings": "Settings",
|
||||
"settings.app-store-preferences.title": "App Store Preferences",
|
||||
"settings.contact-support": "Need help? <linked>Contact support.</linked>",
|
||||
"shut-down": "Shut down",
|
||||
"shut-down.complete": "Shutdown complete",
|
||||
"shut-down.complete-text": "You can now unplug your device from the power.",
|
||||
"shut-down.confirm.submit": "Shut down",
|
||||
"shut-down.confirm.title": "Are you sure you want to shut down your Umbrel?",
|
||||
"shut-down.shutting-down": "Shutting down",
|
||||
"shut-down.shutting-down-message": "Please do not refresh this page or turn off your Umbrel while it is shutting down.",
|
||||
"software-update.callout": "Please do not refresh this page or turn off your Umbrel while it is updating.",
|
||||
"software-update.check": "Check for update",
|
||||
"software-update.checking": "Checking for update...",
|
||||
"software-update.current-running": "You are on",
|
||||
"software-update.failed": "Failed to update",
|
||||
"software-update.failed-to-check": "Failed to check for updates",
|
||||
"software-update.failed.retry": "Retry",
|
||||
"software-update.install-now": "Install now",
|
||||
"app-updates.no-updates": "All apps are up-to-date!",
|
||||
"continue": "Continue",
|
||||
"app.stopped": "Stopped",
|
||||
"software-update.new-version": "New {{name}} is available to install",
|
||||
"software-update.on-latest": "You are on the latest umbrelOS",
|
||||
"software-update.title": "Software update",
|
||||
"software-update.updating-to": "Updating to {{name}}",
|
||||
"software-update.view": "View",
|
||||
"something-left": "{{left}} left",
|
||||
"something-went-wrong": "⚠ Something went wrong",
|
||||
"start": "Start",
|
||||
"stop": "Stop",
|
||||
"storage": "Storage",
|
||||
"storage.full": "Storage full",
|
||||
"storage.low": "Low storage",
|
||||
"temp.dangerously-hot": "Very hot",
|
||||
"temp.nice": "Nice",
|
||||
"temp.normal": "Normal",
|
||||
"temp.warm": "Warm",
|
||||
"temperature": "Temperature",
|
||||
"temperature.too-hot-suggestion": "Consider changing your device's environment.",
|
||||
"terminal": "Terminal",
|
||||
"terminal-description": "Run custom commands in umbrelOS or within an app",
|
||||
"terminal.umbrelos-description": "Run custom commands in umbrelOS",
|
||||
"terminal.app": "App",
|
||||
"terminal.app-description": "Run custom commands within a specific app",
|
||||
"open": "Open",
|
||||
"advanced-settings": "Advanced settings",
|
||||
"advanced-settings-description": "Open terminal or enroll into umbrelOS Beta Program",
|
||||
"beta-program": "umbrelOS Beta Program",
|
||||
"beta-program-description": "Opt in to receiving umbrelOS beta updates, gain early access to new features, and help us refine them by providing your feedback. Beta updates might be unstable, and troubleshooting may require familiarity with terminal."
|
||||
}
|
||||
"terminal.umbrelos-description": "Run custom commands in umbrelOS",
|
||||
"tor-description": "Access your Umbrel from anywhere using a Tor browser",
|
||||
"tor.disable.description": "This may take a few minutes",
|
||||
"tor.disable.progress": "Disabling remote Tor access",
|
||||
"tor.disable.success": "Remote Tor access disabled",
|
||||
"tor.enable.description": "This may take a few minutes",
|
||||
"tor.enable.mobile.switch-label": "Enable remote Tor access",
|
||||
"tor.enable.submit": "Enable",
|
||||
"tor.enable.success": "Remote Tor access enabled",
|
||||
"tor.enable.title": "Enable remote Tor access",
|
||||
"tor.hidden-service": "Tor hidden service URL",
|
||||
"troubleshoot": "Troubleshoot",
|
||||
"troubleshoot-description": "Troubleshoot umbrelOS or an app",
|
||||
"troubleshoot-no-logs-yet": "No logs yet",
|
||||
"troubleshoot-pick-title": "Troubleshoot",
|
||||
"troubleshoot.app": "App",
|
||||
"troubleshoot.app-description": "View logs of an app installed on your Umbrel",
|
||||
"troubleshoot.app-download": "Download {{app}} logs",
|
||||
"troubleshoot.share-with-umbrel-support": "Share with Umbrel Support",
|
||||
"troubleshoot.system-download": "Download {{label}}",
|
||||
"troubleshoot.umbrelos-description": "View umbrelOS logs",
|
||||
"troubleshoot.umbrelos-logs": "umbrelOS logs",
|
||||
"trpc.backend-unavailable": "Error: Connection to the system API failed",
|
||||
"trpc.checking-backend": "Loading...",
|
||||
"try-again": "Try again",
|
||||
"umbrel": "Umbrel",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"umbrelos": "umbrelOS",
|
||||
"unknown": "Unknown",
|
||||
"unknown-app": "Unknown app",
|
||||
"unknown-error": "Unknown error",
|
||||
"uptime": "Uptime",
|
||||
"wallpaper": "Wallpaper",
|
||||
"wallpaper-description": "Your Umbrel wallpaper and theme",
|
||||
"widget.progress.in-progress": "In progress",
|
||||
"widgets.edit.select-up-to-3-widgets": "Select up to 3 widgets",
|
||||
"widgets.install-an-app-before-using-widgets": "Install an app to start customizing your homescreen with widgets.",
|
||||
"wifi": "Wi-Fi",
|
||||
"wifi-connect-insecure-message": "Open networks can be insecure",
|
||||
"wifi-connection-failed": "Unable to connect",
|
||||
"wifi-dangerous-change-confirmation-description": "Changing the Wi-Fi network may disconnect you from your Umbrel. To reconnect, ensure that both your Umbrel and the device you're accessing it from are on the same network.",
|
||||
"wifi-dangerous-change-confirmation-title": "Are you sure you want to change Wi-Fi network?",
|
||||
"wifi-dangerous-disable-confirmation-description": "Disabling Wi-Fi may disconnect you from your Umbrel. To reconnect, plug in an Ethernet cable to your Umbrel and ensure that both your Umbrel and the device you're accessing it from are on the same network.",
|
||||
"wifi-dangerous-disable-confirmation-title": "Are you sure you want to disable Wi-Fi?",
|
||||
"wifi-description": "Connect your device to a Wi-Fi network",
|
||||
"wifi-description-long": "Your device stays connected to your chosen Wi-Fi, even if the Ethernet cable is removed, and automatically reconnects to Wi-Fi on startup.",
|
||||
"wifi-no-networks-message": "No Wi-Fi networks found",
|
||||
"wifi-searching": "Searching for Wi-Fi networks...",
|
||||
"wifi-unsupported-device-description": "Wi-Fi is not supported on this device. This may be due to a missing or incompatible wireless adapter.",
|
||||
"wifi-view-networks": "View networks"
|
||||
}
|
||||
+343
-370
@@ -1,398 +1,371 @@
|
||||
{
|
||||
"hello": "Hola",
|
||||
"desktop.greeting.morning": "Buenos días, {{name}}",
|
||||
"desktop.greeting.afternoon": "Buenas tardes, {{name}}",
|
||||
"desktop.greeting.evening": "Buenas noches, {{name}}",
|
||||
"search": "Buscar",
|
||||
"settings": "Configuración",
|
||||
"app-store.title": "App Store",
|
||||
"unknown": "Desconocido",
|
||||
"app_one": "aplicación",
|
||||
"app_other": "aplicaciones",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"linux": "Linux",
|
||||
"install-your-first-app": "Instala tu primera aplicación",
|
||||
"logout": "Cerrar sesión",
|
||||
"restart": "Reiniciar",
|
||||
"shut-down": "Apagar",
|
||||
"umbrel": "Umbrel",
|
||||
"device": "Dispositivo",
|
||||
"umbrelos": "umbrelOS",
|
||||
"open-live-usage": "Abrir uso en vivo",
|
||||
"account": "Cuenta",
|
||||
"wallpaper": "Fondo de pantalla",
|
||||
"name": "Nombre",
|
||||
"password": "Contraseña",
|
||||
"account-description": "Tu nombre y contraseña",
|
||||
"wallpaper-description": "Tu fondo de pantalla y tema de Umbrel",
|
||||
"2fa-description": "Una segunda capa de seguridad para tu inicio de sesión en Umbrel y aplicaciones",
|
||||
"tor-description": "Accede a tu Umbrel desde cualquier lugar usando un navegador Tor",
|
||||
"migration-assistant": "Asistente de migración",
|
||||
"migration-assistant-description": "Transfiere todas tus aplicaciones y datos de un Raspberry Pi a Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "El Asistente de Migración actualmente admite la transferencia de todos los datos y aplicaciones desde un Raspberry Pi con umbrelOS al Umbrel Home. Abre el Asistente de Migración en tu Umbrel Home para comenzar.",
|
||||
"language": "Idioma",
|
||||
"language-description": "Tu idioma preferido para umbrelOS",
|
||||
"app-store.description": "Tus configuraciones de actualización de aplicaciones",
|
||||
"migrate": "Migrar",
|
||||
"change-name": "Cambiar nombre",
|
||||
"change-password": "Cambiar contraseña",
|
||||
"uptime": "Tiempo de actividad",
|
||||
"preferences": "Preferencias",
|
||||
"troubleshoot": "Solucionar problemas",
|
||||
"troubleshoot-description": "Solucionar problemas de umbrelOS o una aplicación",
|
||||
"device-info-description": "Información sobre tu dispositivo",
|
||||
"device-info.view-info": "Ver información",
|
||||
"factory-reset": "Restablecimiento de fábrica",
|
||||
"factory-reset.reset": "Restablecer",
|
||||
"factory-reset.desc": "Eliminar todos tus datos y aplicaciones de umbrelOS",
|
||||
"software-update.title": "Actualización de software",
|
||||
"device-info": "Información del dispositivo",
|
||||
"software-update.on-latest": "Estás en la última versión de umbrelOS",
|
||||
"check-for-latest-version": "Buscar la última actualización de umbrelOS",
|
||||
"2fa": "2FA",
|
||||
"remote-tor-access": "Acceso remoto Tor",
|
||||
"software-update.checking": "Buscando actualización...",
|
||||
"software-update.check": "Buscar actualización",
|
||||
"software-update.new-version": "Nueva versión {{name}} disponible para instalar",
|
||||
"software-update.updating-to": "Actualizando a {{name}}",
|
||||
"software-update.callout": "Por favor, no refresques esta página ni apagues tu Umbrel mientras se actualiza.",
|
||||
"software-update.failed.title": "La actualización de software ha fallado",
|
||||
"software-update.failed.description": "Hubo un error durante la actualización del software",
|
||||
"software-update.failed.please-try-again": "Por favor, inténtalo de nuevo",
|
||||
"software-update.failed.retry": "Reintentar",
|
||||
"update": "actualización",
|
||||
"software-update.update-now": "Actualizar ahora",
|
||||
"software-update.view": "Ver",
|
||||
"storage": "Almacenamiento",
|
||||
"storage.low": "Almacenamiento bajo",
|
||||
"storage.full": "Almacenamiento lleno",
|
||||
"something-left": "{{left}} restantes",
|
||||
"unexpected-error": "Error inesperado",
|
||||
"unexpected-error.heading": "⚠ Error",
|
||||
"clipboard.copied": "Copiado",
|
||||
"close": "Cerrar",
|
||||
"something-went-wrong": "⚠ Algo salió mal",
|
||||
"loading": "Cargando",
|
||||
"cmdk.input-placeholder": "Buscar aplicaciones, configuraciones o acciones",
|
||||
"no-results-found": "No se encontraron resultados",
|
||||
"cmdk.restart-umbrel": "Reiniciar Umbrel",
|
||||
"cmdk.update-all-apps": "Actualizar todas las aplicaciones",
|
||||
"cmdk.change-wallpaper": "Cambiar fondo de pantalla",
|
||||
"cmdk.live-usage": "Uso en vivo",
|
||||
"cmdk.widgets": "Widgets",
|
||||
"cmdk.frequent-apps": "Usadas frecuentemente",
|
||||
"app.offline": "No en ejecución",
|
||||
"app.uninstalling": "Desinstalando",
|
||||
"app.install": "Instalar",
|
||||
"app.installing": "Instalando",
|
||||
"app.updating": "Actualizando",
|
||||
"app.open": "Abrir",
|
||||
"app.view": "Ver",
|
||||
"retry": "Reintentar",
|
||||
"download-logs": "Descargar registros",
|
||||
"page-title-umbrel": "{{title}} – umbrelOS",
|
||||
"desktop.title": "Escritorio",
|
||||
"notifications": "Notificaciones",
|
||||
"device-info.device": "Dispositivo",
|
||||
"device-info.model-number": "Número de modelo",
|
||||
"device-info.serial-number": "Número de serie",
|
||||
"memory": "Memoria",
|
||||
"memory.low": "Memoria baja",
|
||||
"no-forgot-password-message": "Si pierdes tu contraseña, no podrás iniciar sesión en tu Umbrel. Asegúrate de guardarla de forma segura.",
|
||||
"settings.contact-support": "¿Necesitas ayuda? <linked>Contacta con soporte.</linked>",
|
||||
"temperature": "Temperatura",
|
||||
"temperature.too-hot-suggestion": "Considera cambiar el entorno de tu dispositivo.",
|
||||
"temp.dangerously-hot": "Muy caliente",
|
||||
"temp.hot": "Caliente",
|
||||
"temp.nice": "Agradable",
|
||||
"temp.warm": "Cálido",
|
||||
"temp.normal": "Normal",
|
||||
"temp.too-cold": "Demasiado frío",
|
||||
"temp.cool": "Fresco",
|
||||
"2fa.disable.title": "Desactivar autenticación de dos factores",
|
||||
"2fa.enter-code": "Introduce el código mostrado en tu aplicación de autenticación",
|
||||
"2fa.enable.or-paste": "O pega el siguiente código en tu aplicación de autenticación",
|
||||
"2fa.enable.title": "Activar autenticación de dos factores",
|
||||
"2fa.enable.scan-this": "Escanea este código QR usando una aplicación de autenticación como Google Authenticator o Authy",
|
||||
"settings.app-store-preferences.title": "Preferencias de App Store",
|
||||
"change-name.input-placeholder": "Tu nombre",
|
||||
"confirm": "Confirmar",
|
||||
"cancel": "Cancelar",
|
||||
"change-password.callout": "Si pierdes tu contraseña, no podrás iniciar sesión en tu Umbrel. Asegúrate de guardarla de forma segura.",
|
||||
"change-password.current-password": "Contraseña actual",
|
||||
"change-password.new-password": "Nueva contraseña",
|
||||
"change-password.repeat-password": "Repetir contraseña",
|
||||
"restart.restarting": "Reiniciando",
|
||||
"restart.restarting-message": "Por favor, no refresques esta página ni apagues tu Umbrel mientras se reinicia.",
|
||||
"restart.failed": "No se pudo reiniciar",
|
||||
"restart.confirm.title": "¿Estás seguro de que quieres reiniciar tu Umbrel?",
|
||||
"restart.confirm.submit": "Reiniciar",
|
||||
"shut-down.complete": "Apagado completo",
|
||||
"shut-down.complete-text": "Ahora puedes desconectar tu dispositivo de la energía.",
|
||||
"shut-down.shutting-down": "Apagando",
|
||||
"shut-down.shutting-down-message": "Por favor, no refresques esta página ni apagues tu Umbrel mientras se apaga.",
|
||||
"shut-down.failed": "No se pudo apagar",
|
||||
"shut-down.confirm.title": "¿Estás seguro de que quieres apagar tu Umbrel?",
|
||||
"shut-down.confirm.submit": "Apagar",
|
||||
"tor.enable.title": "Activar acceso remoto Tor",
|
||||
"tor.enable.failed": "No se pudo activar Tor",
|
||||
"tor.enable.description": "Esto puede tardar unos minutos",
|
||||
"tor.disable.description": "Esto puede tardar unos minutos",
|
||||
"tor.enable.submit": "Activar",
|
||||
"troubleshoot.umbrelos-description": "Ver registros de umbrelOS y del sistema",
|
||||
"troubleshoot.app": "Aplicación",
|
||||
"troubleshoot.app-description": "Ver registros de una aplicación instalada en tu Umbrel",
|
||||
"troubleshoot.umbrelos-logs": "Registros de umbrelOS",
|
||||
"troubleshoot.system-logs": "Registros del sistema",
|
||||
"troubleshoot.system-download": "Descargar {{label}}",
|
||||
"troubleshoot.app-download": "Descargar registros de {{app}}",
|
||||
"app-picker.select-app": "Seleccionar aplicación...",
|
||||
"app-picker.search": "Buscar...",
|
||||
"troubleshoot.share-with-umbrel-support": "Compartir con el soporte de Umbrel",
|
||||
"login": "Iniciar sesión",
|
||||
"migration-assistant.prep.body": "Prepararse para la migración",
|
||||
"migration-assistant.prep.button-continue": "Continuar",
|
||||
"migration-assistant.prep.callout": "Los datos en tu Umbrel Home, si los hay, se eliminarán permanentemente.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Apaga tu Umbrel Raspberry Pi.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Conecta su disco externo a cualquier puerto USB en tu Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Una vez hecho, haz clic en '{{button}}' abajo.",
|
||||
"migration-assistant.failed": "Algo no está bien...",
|
||||
"try-again": "Intentar de nuevo",
|
||||
"migration-assistant.continue-migration.ready.submit": "Iniciar migración",
|
||||
"migration-assistant.ready.title": "Todo listo para migrar!",
|
||||
"migration-assistant.ready.description": "Todos tus datos y aplicaciones están listos para ser migrados a tu Umbrel Home",
|
||||
"migration-assistant.ready.hint-header": "Cosas a tener en cuenta",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Usa la misma contraseña",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Recuerda usar tu contraseña de Umbrel Raspberry Pi para iniciar sesión en tu Umbrel Home",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Mantén tu Raspberry Pi apagado después de la actualización",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Esto ayuda a prevenir problemas con aplicaciones como Lightning Node",
|
||||
"migration-assistant.failed.ssd-not-detected.title": "No se puede detectar ningún disco externo",
|
||||
"migration-assistant.failed.ssd-not-detected.description": "Asegúrate de conectar el disco externo de tu Raspberry Pi a tu Umbrel Home",
|
||||
"migration-assistant.failed.incorrect-ssd.title": "Disco externo incompatible",
|
||||
"migration-assistant.failed.incorrect-ssd.description": "Asegúrate de haber conectado el disco externo de tu Raspberry Pi a tu Umbrel Home",
|
||||
"live-usage": "Uso en vivo",
|
||||
"unknown-app": "Aplicación desconocida",
|
||||
"login.title": "Bienvenido de nuevo",
|
||||
"login.subtitle": "Ingresa tu contraseña de Umbrel para iniciar sesión",
|
||||
"login.password-label": "Contraseña",
|
||||
"login.password.submit": "Iniciar sesión",
|
||||
"login-2fa.title": "Autenticar",
|
||||
"login-2fa.subtitle": "Ingresa el código 2FA mostrado en tu aplicación de autenticación",
|
||||
"not-found-404": "Código de error: 404",
|
||||
"not-found-404.back": "Atrás",
|
||||
"not-found-404.home": "Ir a inicio",
|
||||
"restart.try-again": "Reintentar",
|
||||
"login-with-umbrel.app-not-found": "Aplicación no encontrada.",
|
||||
"login-with-umbrel.title": "Iniciar sesión con Umbrel",
|
||||
"login-with-umbrel.description": "Ingresa tu contraseña de Umbrel para abrir {{app}}",
|
||||
"create-user": "Crear usuario",
|
||||
"language.select-description": "Selecciona el idioma preferido para umbrelOS",
|
||||
"software-update.current-running": "Estás en",
|
||||
"migration-assistant.mobile.start-button": "Iniciar migración",
|
||||
"tor.enable.mobile.switch-label": "Activar acceso remoto Tor",
|
||||
"logout.confirm.title": "¿Estás seguro de que quieres cerrar sesión?",
|
||||
"logout.confirm.submit": "Cerrar sesión",
|
||||
"2fa.enable.success": "Autenticación de dos factores activada",
|
||||
"2fa-description": "Una segunda capa de seguridad para tu inicio de sesión en Umbrel y aplicaciones",
|
||||
"2fa.disable.success": "Autenticación de dos factores desactivada",
|
||||
"apps.uninstalled-all.success": "Todas las aplicaciones desinstaladas",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Error al obtener aplicaciones requeridas",
|
||||
"2fa.disable.title": "Desactivar autenticación de dos factores",
|
||||
"2fa.enable.or-paste": "O pega el siguiente código en tu aplicación de autenticación",
|
||||
"2fa.enable.scan-this": "Escanea este código QR usando una aplicación de autenticación como Google Authenticator o Authy",
|
||||
"2fa.enable.success": "Autenticación de dos factores activada",
|
||||
"2fa.enable.title": "Activar autenticación de dos factores",
|
||||
"2fa.enter-code": "Introduce el código mostrado en tu aplicación de autenticación",
|
||||
"account": "Cuenta",
|
||||
"account-description": "Tu nombre y contraseña",
|
||||
"advanced-settings": "Configuración avanzada",
|
||||
"advanced-settings-description": "Abre el terminal o inscríbete en el Programa Beta de umbrelOS",
|
||||
"app-not-found": "Aplicación no encontrada: {{app}}",
|
||||
"app-only-over-tor": "{{app}} solo se puede usar sobre Tor. Por favor, accede a tu Umbrel en un navegador Tor en tu URL de acceso remoto (Configuración > Acceso remoto Tor) para abrir esta aplicación.",
|
||||
"widget.progress.in-progress": "En progreso",
|
||||
"change-password.failed.current-required": "Se requiere contraseña actual",
|
||||
"change-password.failed.new-required": "Se requiere nueva contraseña",
|
||||
"change-password.failed.repeat-required": "Se requiere repetir la contraseña",
|
||||
"change-password.failed.no-match": "Las contraseñas no coinciden",
|
||||
"change-password.failed.must-be-unique": "La nueva contraseña debe ser diferente de la contraseña actual",
|
||||
"change-password.failed.min-length": "La contraseña debe tener al menos {{characters}} caracteres",
|
||||
"notifications.view": "Ver",
|
||||
"notifications.new-version-available": "{{update}} está disponible para instalar",
|
||||
"notifications.cpu.too-hot": "Alta temperatura del CPU",
|
||||
"notifications.cpu.too-cold": "Baja temperatura del CPU",
|
||||
"notifications.storage.full": "El almacenamiento de tu dispositivo está lleno",
|
||||
"notifications.memory.low": "La memoria de tu dispositivo está baja",
|
||||
"notifications.storage.low": "El almacenamiento de tu dispositivo está bajo",
|
||||
"software-update.success": "Actualizado con éxito a umbrelOS {{version}}",
|
||||
"software-update.failed": "Falló la actualización",
|
||||
"software-update.failed-to-check": "Error al buscar actualizaciones",
|
||||
"change-name.failed.name-required": "Se requiere nombre",
|
||||
"free": "Gratis",
|
||||
"app-page.section.about": "Acerca de",
|
||||
"app-page.section.credentials.title": "Credenciales predeterminadas",
|
||||
"app-page.section.info.compatibility": "Compatibilidad",
|
||||
"app-page.section.info.compatibility-compatible": "Compatible",
|
||||
"app-page.section.info.developer": "Desarrollador",
|
||||
"app-page.section.info.source-code": "Código fuente",
|
||||
"app-page.section.info.source-code.public": "Público",
|
||||
"app-page.section.info.submitted-by": "Enviado por",
|
||||
"app-page.section.info.title": "Información",
|
||||
"app-page.section.info.version": "Versión",
|
||||
"app-page.section.recommendations.title": "También te podría gustar",
|
||||
"app-page.section.release-notes.title": "Novedades",
|
||||
"app-page.section.release-notes.version": "Versión {{version}}",
|
||||
"app-page.section.requires": "Requiere",
|
||||
"app-page.section.requires.support": "Obtener soporte",
|
||||
"app-picker.search": "Buscar...",
|
||||
"app-picker.select-app": "Seleccionar aplicación...",
|
||||
"app-store.browse-category-apps": "Explorar aplicaciones de {{category}}",
|
||||
"app-store.category.discover": "Descubrir",
|
||||
"app-store.category.ai": "IA",
|
||||
"app-store.category.all": "Todas las aplicaciones",
|
||||
"app-store.category.files": "Archivos y Productividad",
|
||||
"app-store.category.automation": "Hogar y Automatización",
|
||||
"app-store.category.bitcoin": "Bitcoin",
|
||||
"app-store.category.developer": "Herramientas para Desarrolladores",
|
||||
"app-store.category.discover": "Descubrir",
|
||||
"app-store.category.files": "Archivos y Productividad",
|
||||
"app-store.category.finance": "Finanzas",
|
||||
"app-store.category.media": "Medios",
|
||||
"app-store.category.networking": "Redes",
|
||||
"app-store.category.social": "Social",
|
||||
"app-store.category.automation": "Hogar y Automatización",
|
||||
"app-store.category.ai": "IA",
|
||||
"app-store.category.developer": "Herramientas para Desarrolladores",
|
||||
"community-app-store": "Tienda de Aplicaciones Comunitaria",
|
||||
"community-app-store.loading": "Cargando...",
|
||||
"community-app-store.back-to-umbrel-app-store": "Volver a la Tienda de Aplicaciones de Umbrel",
|
||||
"community-app-store.open-button": "Abrir",
|
||||
"community-app-store.remove-button": "Eliminar",
|
||||
"community-app-stores.description": "Las Tiendas de Aplicaciones Comunitarias te permiten instalar aplicaciones en tu Umbrel que pueden no estar disponibles en la Tienda de Aplicaciones oficial de Umbrel. También facilitan probar versiones beta de aplicaciones de Umbrel antes de que los desarrolladores las lancen en la Tienda de Aplicaciones oficial de Umbrel.",
|
||||
"community-app-stores.learn-more": "Aprender más",
|
||||
"community-app-stores.warning": "Cualquiera puede crear Tiendas de Aplicaciones Comunitarias. Las aplicaciones publicadas en ellas no están verificadas ni revisadas por el equipo de la Tienda de Aplicaciones oficial de Umbrel, y pueden ser potencialmente inseguras o maliciosas. Usa precaución y solo añade tiendas de aplicaciones de desarrolladores en los que confíes.",
|
||||
"community-app-stores.add-button": "Añadir",
|
||||
"desktop.install-first.for-the-self-hoster": "Para el autoalojador",
|
||||
"desktop.install-first.for-the-bitcoiner": "Para el bitcoinero",
|
||||
"desktop.install-first.for-the-streamer": "Para el streamer",
|
||||
"desktop.context-menu.edit-widgets": "Editar widgets",
|
||||
"desktop.context-menu.logout": "Cerrar sesión",
|
||||
"desktop.context-menu.change-wallpaper": "Cambiar fondo de pantalla",
|
||||
"desktop.not-enough-room": "Usa una pantalla más grande para ver tus aplicaciones.",
|
||||
"desktop.app.context.go-to-store-page": "Ver en la Tienda de Aplicaciones",
|
||||
"desktop.app.context.show-default-credentials": "Mostrar credenciales predeterminadas",
|
||||
"desktop.app.context.uninstall": "Desinstalar",
|
||||
"desktop.install-first.link-to-app-store": "Explorar más en la Tienda de Aplicaciones",
|
||||
"migrate.callout": "No apagues tu Umbrel hasta que la migración se complete",
|
||||
"app.uninstall.confirm.title": "¿Desinstalar {{app}}?",
|
||||
"app.uninstall.confirm.submit": "Desinstalar",
|
||||
"app.uninstall.confirm.description": "Todos los datos asociados con {{app}} serán eliminados permanentemente. Esta acción no se puede deshacer.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} es utilizado por",
|
||||
"widgets.edit.title": "Editar widgets",
|
||||
"widgets.edit.select-up-to-3-widgets": "Selecciona hasta 3 widgets",
|
||||
"onboarding.create-account": "Crear cuenta",
|
||||
"factory-reset.review.title": "Revisar datos",
|
||||
"factory-reset.review.following-will-be-removed": "Lo siguiente será eliminado de tu dispositivo",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} aplicación instalada",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} aplicaciones instaladas",
|
||||
"app.uninstall.deps.used-by.description_one": "Desinstala {{firstAppToUninstall}} primero para desinstalar {{app}}.",
|
||||
"app.uninstall.deps.used-by.description_other": "Desinstala estas aplicaciones primero para desinstalar {{app}}.",
|
||||
"app-store.search-apps": "Buscar aplicaciones",
|
||||
"app-store.description": "Tus configuraciones de actualización de aplicaciones",
|
||||
"app-store.menu.community-app-stores": "Tiendas de Aplicaciones Comunitarias",
|
||||
"app-store.search-apps": "Buscar aplicaciones",
|
||||
"app-store.search.no-results": "Sin resultados",
|
||||
"app-store.search.results-for": "Resultados para",
|
||||
"factory-reset.review.submit": "Continuar",
|
||||
"factory-reset.review.account-info": "Información de la cuenta y contraseña",
|
||||
"factory-reset.review.total-data": "Datos totales",
|
||||
"factory-reset.review.apps": "Aplicaciones",
|
||||
"onboarding.create-account.failed.name-required": "Se requiere nombre",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Las contraseñas no coinciden",
|
||||
"onboarding.create-account.subtitle": "La información de tu cuenta se almacena solo en tu Umbrel. Asegúrate de hacer una copia de seguridad de tu contraseña de forma segura, ya que no hay forma de restablecerla.",
|
||||
"onboarding.contact-support": "Soporte",
|
||||
"onboarding.create-account.name.input-placeholder": "Tu nombre",
|
||||
"onboarding.create-account.password.input-label": "Contraseña",
|
||||
"onboarding.create-account.confirm-password.input-label": "Confirmar contraseña",
|
||||
"onboarding.create-account.submit": "Crear",
|
||||
"onboarding.create-account.submitting": "Creando",
|
||||
"onboarding.account-created.youre-all-set-name": "Todo listo, {{name}}.",
|
||||
"legal.privacy-policy": "Política de privacidad",
|
||||
"legal.terms-of-service": "Términos de servicio",
|
||||
"onboarding.account-created.next": "Siguiente",
|
||||
"onboarding.account-created.page-title": "Cuenta creada",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "Al hacer clic en 'Siguiente', aceptas los <linked>Términos de servicio de umbrelOS</linked>",
|
||||
"onboarding.start.title": "Bienvenido a umbrelOS",
|
||||
"onboarding.start.subtitle": "Tu servidor en la nube está listo para configurarse.",
|
||||
"onboarding.account-created.subtitle": "Tu Umbrel ya está listo.",
|
||||
"onboarding.start.continue": "Empezar",
|
||||
"app-page.section.about": "Acerca de",
|
||||
"default-credentials.title": "Credenciales para {{app}}",
|
||||
"default-credentials.username": "Nombre de usuario por defecto",
|
||||
"default-credentials.password": "Contraseña por defecto",
|
||||
"default-credentials.open": "Abrir {{app}}",
|
||||
"default-credentials.close": "Entendido",
|
||||
"default-credentials..dont-show-again": "No mostrar esto de nuevo",
|
||||
"default-credentials.description": "Aquí tienes las credenciales que necesitarás para iniciar sesión en la aplicación.",
|
||||
"app-page.section.requires": "Requiere",
|
||||
"app-page.section.requires.support": "Obtener soporte",
|
||||
"app-page.section.info.title": "Información",
|
||||
"app-page.section.info.version": "Versión",
|
||||
"app-page.section.info.source-code": "Código fuente",
|
||||
"app-page.section.info.source-code.public": "Público",
|
||||
"app-page.section.info.developer": "Desarrollador",
|
||||
"app-page.section.info.submitted-by": "Enviado por",
|
||||
"app-page.section.info.compatibility": "Compatibilidad",
|
||||
"app-page.section.info.compatibility-compatible": "Compatible",
|
||||
"app-page.section.recommendations.title": "También te podría gustar",
|
||||
"app-page.section.release-notes.title": "Novedades",
|
||||
"app-page.section.release-notes.version": "Versión {{version}}",
|
||||
"app-page.section.credentials.title": "Credenciales predeterminadas",
|
||||
"auto-update": "Actualización automática",
|
||||
"read-less": "Leer menos",
|
||||
"read-more": "Leer más",
|
||||
"app-store.title": "App Store",
|
||||
"app-updates.less": "menos",
|
||||
"app-updates.more": "más",
|
||||
"app-updates.no-updates": "¡Todas las aplicaciones están actualizadas!",
|
||||
"app-updates.update": "Actualizar",
|
||||
"app-updates.update-all": "Actualizar todo",
|
||||
"app-updates.updates-available-count_one": "{{count}} actualización disponible",
|
||||
"app-updates.updates-available-count_other": "{{count}} actualizaciones disponibles",
|
||||
"app-updates.updating": "Actualizando...",
|
||||
"app.install": "Instalar",
|
||||
"app.installing": "Instalando",
|
||||
"app.offline": "No en ejecución",
|
||||
"app.open": "Abrir",
|
||||
"app.optimized-for-umbrel-home": "Optimizado para Umbrel Home",
|
||||
"install-first.title": "{{app}} requiere acceso a",
|
||||
"install-first.description_one": "Instala esta aplicación para instalar {{app}}.",
|
||||
"install-first.description_other": "Instala estas aplicaciones primero para instalar {{app}}.",
|
||||
"ok": "OK",
|
||||
"factory-reset.confirm.title": "Confirmar con contraseña",
|
||||
"factory-reset.confirm.body": "Confirma la contraseña de Umbrel para restablecer",
|
||||
"factory-reset.confirm.submit": "Borrar todo y restablecer",
|
||||
"factory-reset.confirm.submit-callout": "Esta acción no se puede deshacer.",
|
||||
"factory-reset.confirm.password-label": "Ingresar contraseña",
|
||||
"factory-reset.resetting.dont-turn-off-device": "No apagues tu dispositivo hasta que el restablecimiento esté completo",
|
||||
"factory-reset.resetting.connecting": "Conectando",
|
||||
"factory-reset.failed.title": "Restablecimiento fallido",
|
||||
"factory-reset.failed.message": "Hubo un error durante el restablecimiento",
|
||||
"factory-reset.failed.message.please-try-again": "Por favor, inténtalo de nuevo",
|
||||
"factory-reset.failed.retry": "Reintentar restablecimiento de fábrica",
|
||||
"factory-reset.success.title": "Restablecimiento exitoso",
|
||||
"factory-reset.success.description": "Todas tus aplicaciones, datos de aplicaciones y datos de cuenta han sido eliminados de tu dispositivo. Ahora puedes reiniciar tu dispositivo.",
|
||||
"factory-reset.success.restart-device": "Reiniciar dispositivo",
|
||||
"connecting": "Conectando...",
|
||||
"migrate.failed.title": "La migración falló",
|
||||
"migrate.failed.description": "Hubo un error durante la migración",
|
||||
"migrate.failed.please-try-again": "Por favor, inténtalo de nuevo",
|
||||
"migrate.failed.retry": "Reintentar",
|
||||
"migrate.success.title": "Migración exitosa",
|
||||
"migrate.success.description": "Todas tus aplicaciones, datos de aplicaciones y detalles de cuenta han sido migrados a tu Umbrel Home.",
|
||||
"continue-to-log-in": "Continuar para iniciar sesión",
|
||||
"trpc.checking-backend": "Cargando...",
|
||||
"trpc.backend-unavailable": "Error: Conexión con la API del sistema fallida",
|
||||
"app.restarting": "Reiniciando",
|
||||
"app.starting": "Iniciando",
|
||||
"app.stopped": "Detenido",
|
||||
"app.stopping": "Deteniendo",
|
||||
"app.uninstall.confirm.description": "Todos los datos asociados con {{app}} serán eliminados permanentemente. Esta acción no se puede deshacer.",
|
||||
"app.uninstall.confirm.submit": "Desinstalar",
|
||||
"app.uninstall.confirm.title": "¿Desinstalar {{app}}?",
|
||||
"app.uninstall.deps.used-by.description_one": "Desinstala {{firstAppToUninstall}} primero para desinstalar {{app}}.",
|
||||
"app.uninstall.deps.used-by.description_other": "Desinstala estas aplicaciones primero para desinstalar {{app}}.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} es utilizado por",
|
||||
"app.uninstalling": "Desinstalando",
|
||||
"app.updating": "Actualizando",
|
||||
"app.view": "Ver",
|
||||
"app_one": "aplicación",
|
||||
"app_other": "aplicaciones",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Error al obtener aplicaciones requeridas",
|
||||
"apps.uninstalled-all.success": "Todas las aplicaciones desinstaladas",
|
||||
"auth.checking-backend-for-user": "Cargando...",
|
||||
"auth.failed-checking-if-user-logged-in": "Error: Falló la verificación de inicio de sesión",
|
||||
"auth.failed-to-check-if-user-exists": "Error: Falló la verificación de existencia",
|
||||
"redirect.to-onboarding": "Cargando...",
|
||||
"redirect.to-login": "Cargando...",
|
||||
"redirect.to-home": "Cargando...",
|
||||
"widgets.install-an-app-before-using-widgets": "Instala una aplicación para comenzar a personalizar tu pantalla de inicio con widgets.",
|
||||
"logout-error-generic": "Error: Falló el cierre de sesión",
|
||||
"app.stopping": "Deteniendo",
|
||||
"app.starting": "Iniciando",
|
||||
"app.restarting": "Reiniciando",
|
||||
"beta-program": "Programa Beta de umbrelOS",
|
||||
"beta-program-description": "Opta por recibir actualizaciones beta de umbrelOS, accede antes a nuevas características y ayúdanos a refinarlas proporcionando tu feedback. Las actualizaciones beta pueden ser inestables y la solución de problemas puede requerir familiaridad con el terminal.",
|
||||
"cancel": "Cancelar",
|
||||
"change": "Cambiar",
|
||||
"change-name": "Cambiar nombre",
|
||||
"change-name.failed.name-required": "Se requiere nombre",
|
||||
"change-name.input-placeholder": "Tu nombre",
|
||||
"change-password": "Cambiar contraseña",
|
||||
"change-password.callout": "Si pierdes tu contraseña, no podrás iniciar sesión en tu Umbrel. Asegúrate de guardarla de forma segura.",
|
||||
"change-password.current-password": "Contraseña actual",
|
||||
"change-password.failed.current-required": "Se requiere contraseña actual",
|
||||
"change-password.failed.min-length": "La contraseña debe tener al menos {{characters}} caracteres",
|
||||
"change-password.failed.must-be-unique": "La nueva contraseña debe ser diferente de la contraseña actual",
|
||||
"change-password.failed.new-required": "Se requiere nueva contraseña",
|
||||
"change-password.failed.no-match": "Las contraseñas no coinciden",
|
||||
"change-password.failed.repeat-required": "Se requiere repetir la contraseña",
|
||||
"change-password.new-password": "Nueva contraseña",
|
||||
"change-password.repeat-password": "Repetir contraseña",
|
||||
"check-for-latest-version": "Buscar la última actualización de umbrelOS",
|
||||
"clipboard.copied": "Copiado",
|
||||
"close": "Cerrar",
|
||||
"cmdk.change-wallpaper": "Cambiar fondo de pantalla",
|
||||
"cmdk.frequent-apps": "Usadas frecuentemente",
|
||||
"cmdk.input-placeholder": "Buscar aplicaciones, configuraciones o acciones",
|
||||
"cmdk.install-from-app-store": "de la Tienda de Aplicaciones",
|
||||
"cmdk.live-usage": "Uso en vivo",
|
||||
"cmdk.restart-umbrel": "Reiniciar Umbrel",
|
||||
"cmdk.shutdown-umbrel": "Apagar Umbrel",
|
||||
"cmdk.update-all-apps": "Actualizar todas las aplicaciones",
|
||||
"cmdk.widgets": "Widgets",
|
||||
"community-app-store": "Tienda de Aplicaciones Comunitaria",
|
||||
"community-app-store.back-to-umbrel-app-store": "Volver a la Tienda de Aplicaciones de Umbrel",
|
||||
"community-app-store.open-button": "Abrir",
|
||||
"community-app-store.remove-button": "Eliminar",
|
||||
"community-app-stores.add-button": "Añadir",
|
||||
"community-app-stores.description": "Las Tiendas de Aplicaciones Comunitarias te permiten instalar aplicaciones en tu Umbrel que pueden no estar disponibles en la Tienda de Aplicaciones oficial de Umbrel. También facilitan probar versiones beta de aplicaciones de Umbrel antes de que los desarrolladores las lancen en la Tienda de Aplicaciones oficial de Umbrel.",
|
||||
"community-app-stores.learn-more": "Aprender más",
|
||||
"community-app-stores.warning": "Cualquiera puede crear Tiendas de Aplicaciones Comunitarias. Las aplicaciones publicadas en ellas no están verificadas ni revisadas por el equipo de la Tienda de Aplicaciones oficial de Umbrel, y pueden ser potencialmente inseguras o maliciosas. Usa precaución y solo añade tiendas de aplicaciones de desarrolladores en los que confíes.",
|
||||
"confirm": "Confirmar",
|
||||
"connecting": "Conectando...",
|
||||
"continue": "Continuar",
|
||||
"continue-to-log-in": "Continuar para iniciar sesión",
|
||||
"cpu": "CPU",
|
||||
"cpu-core-count": "{{cores}} hilos",
|
||||
"troubleshoot-pick-title": "Solucionar problemas",
|
||||
"troubleshoot-no-logs-yet": "Aún no hay registros",
|
||||
"temperature.too-cold-suggestion": "Considera cambiar el entorno de tu dispositivo",
|
||||
"cmdk.install-from-app-store": "de la Tienda de Aplicaciones",
|
||||
"cmdk.shutdown-umbrel": "Apagar Umbrel",
|
||||
"tor.enable.success": "Acceso remoto Tor activado",
|
||||
"tor.enable.progress": "Activando acceso remoto Tor",
|
||||
"tor.disable.success": "Acceso remoto Tor desactivado",
|
||||
"tor.disable.progress": "Desactivando acceso remoto Tor",
|
||||
"tor.hidden-service": "URL del servicio oculto de Tor",
|
||||
"stop": "Detener",
|
||||
"software-update.release-notes.title": "Notas de la versión",
|
||||
"app-updates.updates-available-count_one": "{{count}} actualización disponible",
|
||||
"app-updates.updates-available-count_other": "{{count}} actualizaciones disponibles",
|
||||
"app-updates.title": "Actualizaciones",
|
||||
"app-updates.update-all": "Actualizar todo",
|
||||
"app-updates.updating": "Actualizando...",
|
||||
"app-updates.update": "Actualizar",
|
||||
"app-updates.less": "menos",
|
||||
"app-updates.more": "más",
|
||||
"create-user": "Crear usuario",
|
||||
"default-credentials.close": "Entendido",
|
||||
"default-credentials.description": "Aquí tienes las credenciales que necesitarás para iniciar sesión en la aplicación.",
|
||||
"default-credentials.dont-show-again": "No mostrar esto nuevamente",
|
||||
"default-credentials.open": "Abrir {{app}}",
|
||||
"default-credentials.password": "Contraseña por defecto",
|
||||
"default-credentials.title": "Credenciales para {{app}}",
|
||||
"default-credentials.username": "Nombre de usuario por defecto",
|
||||
"desktop.app.context.go-to-store-page": "Ver en la Tienda de Aplicaciones",
|
||||
"desktop.app.context.show-default-credentials": "Mostrar credenciales predeterminadas",
|
||||
"desktop.app.context.uninstall": "Desinstalar",
|
||||
"desktop.context-menu.change-wallpaper": "Cambiar fondo de pantalla",
|
||||
"desktop.context-menu.edit-widgets": "Editar widgets",
|
||||
"desktop.context-menu.logout": "Cerrar sesión",
|
||||
"desktop.greeting.afternoon": "Buenas tardes, {{name}}",
|
||||
"desktop.greeting.evening": "Buenas noches, {{name}}",
|
||||
"desktop.greeting.morning": "Buenos días, {{name}}",
|
||||
"desktop.install-first.for-the-bitcoiner": "Para el bitcoinero",
|
||||
"desktop.install-first.for-the-self-hoster": "Para el autoalojador",
|
||||
"desktop.install-first.for-the-streamer": "Para el streamer",
|
||||
"desktop.install-first.link-to-app-store": "Explorar más en la Tienda de Aplicaciones",
|
||||
"desktop.not-enough-room": "Usa una pantalla más grande para ver tus aplicaciones.",
|
||||
"device": "Dispositivo",
|
||||
"device-info": "Información del dispositivo",
|
||||
"device-info-description": "Información sobre tu dispositivo",
|
||||
"device-info.device": "Dispositivo",
|
||||
"device-info.model-number": "Número de modelo",
|
||||
"device-info.serial-number": "Número de serie",
|
||||
"device-info.view-info": "Ver información",
|
||||
"disable": "Desactivar",
|
||||
"download-logs": "Descargar registros",
|
||||
"factory-reset": "Restablecimiento de fábrica",
|
||||
"factory-reset.confirm.body": "Confirma la contraseña de Umbrel para restablecer",
|
||||
"factory-reset.confirm.password-label": "Ingresar contraseña",
|
||||
"factory-reset.confirm.submit": "Borrar todo y restablecer",
|
||||
"factory-reset.confirm.submit-callout": "Esta acción no se puede deshacer.",
|
||||
"factory-reset.desc": "Eliminar todos tus datos y aplicaciones de umbrelOS",
|
||||
"factory-reset.failed.message": "Hubo un error durante el restablecimiento",
|
||||
"factory-reset.failed.retry": "Reintentar restablecimiento de fábrica",
|
||||
"factory-reset.failed.title": "Restablecimiento fallido",
|
||||
"factory-reset.reset": "Restablecer",
|
||||
"factory-reset.resetting.connecting": "Conectando",
|
||||
"factory-reset.resetting.dont-turn-off-device": "No apagues tu dispositivo hasta que el restablecimiento esté completo",
|
||||
"factory-reset.review.account-info": "Información de la cuenta y contraseña",
|
||||
"factory-reset.review.apps": "Aplicaciones",
|
||||
"factory-reset.review.following-will-be-removed": "Lo siguiente será eliminado de tu dispositivo",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} aplicación instalada",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} aplicaciones instaladas",
|
||||
"factory-reset.review.submit": "Continuar",
|
||||
"factory-reset.review.total-data": "Datos totales",
|
||||
"factory-reset.success.description": "Todas tus aplicaciones, datos de aplicaciones y datos de cuenta han sido eliminados de tu dispositivo. Ahora puedes reiniciar tu dispositivo.",
|
||||
"factory-reset.success.restart-device": "Reiniciar dispositivo",
|
||||
"factory-reset.success.title": "Restablecimiento exitoso",
|
||||
"hello": "Hola",
|
||||
"install-first.description_one": "Instala esta aplicación para instalar {{app}}.",
|
||||
"install-first.description_other": "Instala estas aplicaciones primero para instalar {{app}}.",
|
||||
"install-first.title": "{{app}} requiere acceso a",
|
||||
"install-your-first-app": "Instala tu primera aplicación",
|
||||
"language": "Idioma",
|
||||
"language-description": "Tu idioma preferido para umbrelOS",
|
||||
"language.select-description": "Selecciona el idioma preferido para umbrelOS",
|
||||
"linux": "Linux",
|
||||
"live-usage": "Uso en vivo",
|
||||
"loading": "Cargando",
|
||||
"local-ip": "IP local",
|
||||
"login-2fa.subtitle": "Ingresa el código 2FA mostrado en tu aplicación de autenticación",
|
||||
"login-2fa.title": "Autenticar",
|
||||
"login-with-umbrel.description": "Ingresa tu contraseña de Umbrel para abrir {{app}}",
|
||||
"login-with-umbrel.title": "Iniciar sesión con Umbrel",
|
||||
"login.password-label": "Contraseña",
|
||||
"login.password.submit": "Iniciar sesión",
|
||||
"login.subtitle": "Ingresa tu contraseña de Umbrel para iniciar sesión",
|
||||
"login.title": "Bienvenido de nuevo",
|
||||
"logout": "Cerrar sesión",
|
||||
"logout-error-generic": "Error: Falló el cierre de sesión",
|
||||
"logout.confirm.submit": "Cerrar sesión",
|
||||
"logout.confirm.title": "¿Estás seguro de que quieres cerrar sesión?",
|
||||
"memory": "Memoria",
|
||||
"memory.low": "Memoria baja",
|
||||
"migrate": "Migrar",
|
||||
"migrate.callout": "No apagues tu Umbrel hasta que la migración se complete",
|
||||
"migrate.failed.retry": "Reintentar",
|
||||
"migrate.failed.title": "La migración falló",
|
||||
"migrate.success.description": "Todas tus aplicaciones, datos de aplicaciones y detalles de cuenta han sido migrados a tu Umbrel Home.",
|
||||
"migrate.success.title": "Migración exitosa",
|
||||
"migration-assistant": "Asistente de migración",
|
||||
"migration-assistant-description": "Transfiere todas tus aplicaciones y datos de un Raspberry Pi a Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "El Asistente de Migración actualmente admite la transferencia de todos los datos y aplicaciones desde un Raspberry Pi con umbrelOS al Umbrel Home. Abre el Asistente de Migración en tu Umbrel Home para comenzar.",
|
||||
"migration-assistant.continue-migration.ready.submit": "Iniciar migración",
|
||||
"migration-assistant.failed": "Algo no está bien...",
|
||||
"migration-assistant.failed.retrying-message": "Reintentando...",
|
||||
"unknown-error": "Error desconocido",
|
||||
"migration-assistant.mobile.start-button": "Iniciar migración",
|
||||
"migration-assistant.prep.body": "Prepararse para la migración",
|
||||
"migration-assistant.prep.button-continue": "Continuar",
|
||||
"migration-assistant.prep.callout": "Los datos en tu Umbrel Home, si los hay, se eliminarán permanentemente.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Conecta su disco externo a cualquier puerto USB en tu Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Una vez hecho, haz clic en '{{button}}' abajo.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Apaga tu Umbrel Raspberry Pi.",
|
||||
"migration-assistant.ready.description": "Todos tus datos y aplicaciones están listos para ser migrados a tu Umbrel Home",
|
||||
"migration-assistant.ready.hint-header": "Cosas a tener en cuenta",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Esto ayuda a prevenir problemas con aplicaciones como Lightning Node",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Mantén tu Raspberry Pi apagado después de la actualización",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Recuerda usar tu contraseña de Umbrel Raspberry Pi para iniciar sesión en tu Umbrel Home",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Usa la misma contraseña",
|
||||
"migration-assistant.ready.title": "Todo listo para migrar!",
|
||||
"name": "Nombre",
|
||||
"no-forgot-password-message": "Si pierdes tu contraseña, no podrás iniciar sesión en tu Umbrel. Asegúrate de guardarla de forma segura.",
|
||||
"no-results-found": "No se encontraron resultados",
|
||||
"not-found-404": "Código de error: 404",
|
||||
"not-found-404.back": "Atrás",
|
||||
"not-found-404.home": "Ir a inicio",
|
||||
"notifications.cpu.too-hot": "Alta temperatura del CPU",
|
||||
"notifications.memory.low": "La memoria de tu dispositivo está baja",
|
||||
"notifications.new-version-available": "{{update}} está disponible para instalar",
|
||||
"notifications.storage.full": "El almacenamiento de tu dispositivo está lleno",
|
||||
"notifications.view": "Ver",
|
||||
"ok": "OK",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "Al hacer clic en 'Siguiente', aceptas los <linked>Términos de servicio de umbrelOS</linked>",
|
||||
"onboarding.account-created.next": "Siguiente",
|
||||
"onboarding.account-created.subtitle": "Tu Umbrel ya está listo.",
|
||||
"onboarding.account-created.youre-all-set-name": "Todo listo, {{name}}.",
|
||||
"onboarding.contact-support": "Soporte",
|
||||
"onboarding.create-account": "Crear cuenta",
|
||||
"onboarding.create-account.confirm-password.input-label": "Confirmar contraseña",
|
||||
"onboarding.create-account.failed.name-required": "Se requiere nombre",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Las contraseñas no coinciden",
|
||||
"onboarding.create-account.name.input-placeholder": "Tu nombre",
|
||||
"onboarding.create-account.password.input-label": "Contraseña",
|
||||
"onboarding.create-account.submit": "Crear",
|
||||
"onboarding.create-account.submitting": "Creando",
|
||||
"onboarding.create-account.subtitle": "La información de tu cuenta se almacena solo en tu Umbrel. Asegúrate de hacer una copia de seguridad de tu contraseña de forma segura, ya que no hay forma de restablecerla.",
|
||||
"onboarding.start.continue": "Empezar",
|
||||
"onboarding.start.subtitle": "Tu servidor en la nube está listo para configurarse.",
|
||||
"onboarding.start.title": "Bienvenido a umbrelOS",
|
||||
"open": "Abrir",
|
||||
"open-live-usage": "Abrir uso en vivo",
|
||||
"password": "Contraseña",
|
||||
"preferences": "Preferencias",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"read-less": "Leer menos",
|
||||
"read-more": "Leer más",
|
||||
"redirect.to-home": "Cargando...",
|
||||
"redirect.to-login": "Cargando...",
|
||||
"redirect.to-onboarding": "Cargando...",
|
||||
"remote-tor-access": "Acceso remoto Tor",
|
||||
"restart": "Reiniciar",
|
||||
"restart.confirm.submit": "Reiniciar",
|
||||
"restart.confirm.title": "¿Estás seguro de que quieres reiniciar tu Umbrel?",
|
||||
"restart.restarting": "Reiniciando",
|
||||
"restart.restarting-message": "Por favor, no refresques esta página ni apagues tu Umbrel mientras se reinicia.",
|
||||
"retry": "Reintentar",
|
||||
"search": "Buscar",
|
||||
"settings": "Configuración",
|
||||
"settings.app-store-preferences.title": "Preferencias de App Store",
|
||||
"settings.contact-support": "¿Necesitas ayuda? <linked>Contacta con soporte.</linked>",
|
||||
"shut-down": "Apagar",
|
||||
"shut-down.complete": "Apagado completo",
|
||||
"shut-down.complete-text": "Ahora puedes desconectar tu dispositivo de la energía.",
|
||||
"shut-down.confirm.submit": "Apagar",
|
||||
"shut-down.confirm.title": "¿Estás seguro de que quieres apagar tu Umbrel?",
|
||||
"shut-down.shutting-down": "Apagando",
|
||||
"shut-down.shutting-down-message": "Por favor, no refresques esta página ni apagues tu Umbrel mientras se apaga.",
|
||||
"software-update.callout": "Por favor, no refresques esta página ni apagues tu Umbrel mientras se actualiza.",
|
||||
"software-update.check": "Buscar actualización",
|
||||
"software-update.checking": "Buscando actualización...",
|
||||
"software-update.current-running": "Estás en",
|
||||
"software-update.failed": "Falló la actualización",
|
||||
"software-update.failed-to-check": "Error al buscar actualizaciones",
|
||||
"software-update.failed.retry": "Reintentar",
|
||||
"software-update.install-now": "Instalar ahora",
|
||||
"app-updates.no-updates": "¡Todas las aplicaciones están actualizadas!",
|
||||
"continue": "Continuar",
|
||||
"app.stopped": "Detenido",
|
||||
"software-update.new-version": "Nueva versión {{name}} disponible para instalar",
|
||||
"software-update.on-latest": "Estás en la última versión de umbrelOS",
|
||||
"software-update.title": "Actualización de software",
|
||||
"software-update.updating-to": "Actualizando a {{name}}",
|
||||
"software-update.view": "Ver",
|
||||
"something-left": "{{left}} restantes",
|
||||
"something-went-wrong": "⚠ Algo salió mal",
|
||||
"start": "Iniciar",
|
||||
"stop": "Detener",
|
||||
"storage": "Almacenamiento",
|
||||
"storage.full": "Almacenamiento lleno",
|
||||
"storage.low": "Almacenamiento bajo",
|
||||
"temp.dangerously-hot": "Muy caliente",
|
||||
"temp.nice": "Agradable",
|
||||
"temp.normal": "Normal",
|
||||
"temp.warm": "Cálido",
|
||||
"temperature": "Temperatura",
|
||||
"temperature.too-hot-suggestion": "Considera cambiar el entorno de tu dispositivo.",
|
||||
"terminal": "Terminal",
|
||||
"terminal-description": "Ejecuta comandos personalizados en umbrelOS o dentro de una aplicación",
|
||||
"terminal.umbrelos-description": "Ejecuta comandos personalizados en umbrelOS",
|
||||
"terminal.app": "App",
|
||||
"terminal.app-description": "Ejecuta comandos personalizados dentro de una app específica",
|
||||
"open": "Abrir",
|
||||
"advanced-settings": "Configuración avanzada",
|
||||
"advanced-settings-description": "Abre el terminal o inscríbete en el Programa Beta de umbrelOS",
|
||||
"beta-program": "Programa Beta de umbrelOS",
|
||||
"beta-program-description": "Opta por recibir actualizaciones beta de umbrelOS, accede antes a nuevas características y ayúdanos a refinarlas proporcionando tu feedback. Las actualizaciones beta pueden ser inestables y la solución de problemas puede requerir familiaridad con el terminal."
|
||||
}
|
||||
"terminal.umbrelos-description": "Ejecuta comandos personalizados en umbrelOS",
|
||||
"tor-description": "Accede a tu Umbrel desde cualquier lugar usando un navegador Tor",
|
||||
"tor.disable.description": "Esto puede tardar unos minutos",
|
||||
"tor.disable.progress": "Desactivando acceso remoto Tor",
|
||||
"tor.disable.success": "Acceso remoto Tor desactivado",
|
||||
"tor.enable.description": "Esto puede tardar unos minutos",
|
||||
"tor.enable.mobile.switch-label": "Activar acceso remoto Tor",
|
||||
"tor.enable.submit": "Activar",
|
||||
"tor.enable.success": "Acceso remoto Tor activado",
|
||||
"tor.enable.title": "Activar acceso remoto Tor",
|
||||
"tor.hidden-service": "URL del servicio oculto de Tor",
|
||||
"troubleshoot": "Solucionar problemas",
|
||||
"troubleshoot-description": "Solucionar problemas de umbrelOS o una aplicación",
|
||||
"troubleshoot-no-logs-yet": "Aún no hay registros",
|
||||
"troubleshoot-pick-title": "Solucionar problemas",
|
||||
"troubleshoot.app": "Aplicación",
|
||||
"troubleshoot.app-description": "Ver registros de una aplicación instalada en tu Umbrel",
|
||||
"troubleshoot.app-download": "Descargar registros de {{app}}",
|
||||
"troubleshoot.share-with-umbrel-support": "Compartir con el soporte de Umbrel",
|
||||
"troubleshoot.system-download": "Descargar {{label}}",
|
||||
"troubleshoot.umbrelos-description": "Ver los registros de umbrelOS",
|
||||
"troubleshoot.umbrelos-logs": "Registros de umbrelOS",
|
||||
"trpc.backend-unavailable": "Error: Conexión con la API del sistema fallida",
|
||||
"trpc.checking-backend": "Cargando...",
|
||||
"try-again": "Intentar de nuevo",
|
||||
"umbrel": "Umbrel",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"umbrelos": "umbrelOS",
|
||||
"unknown": "Desconocido",
|
||||
"unknown-app": "Aplicación desconocida",
|
||||
"unknown-error": "Error desconocido",
|
||||
"uptime": "Tiempo de actividad",
|
||||
"wallpaper": "Fondo de pantalla",
|
||||
"wallpaper-description": "Tu fondo de pantalla y tema de Umbrel",
|
||||
"widget.progress.in-progress": "En progreso",
|
||||
"widgets.edit.select-up-to-3-widgets": "Selecciona hasta 3 widgets",
|
||||
"widgets.install-an-app-before-using-widgets": "Instala una aplicación para comenzar a personalizar tu pantalla de inicio con widgets.",
|
||||
"wifi": "Wi-Fi",
|
||||
"wifi-connect-insecure-message": "Las redes abiertas pueden ser inseguras",
|
||||
"wifi-connection-failed": "No se pudo conectar",
|
||||
"wifi-dangerous-change-confirmation-description": "Cambiar la red Wi-Fi puede desconectarte de tu Umbrel. Para reconectar, asegúrate de que tanto tu Umbrel como el dispositivo desde el que accedes estén en la misma red.",
|
||||
"wifi-dangerous-change-confirmation-title": "¿Estás seguro de que quieres cambiar la red Wi-Fi?",
|
||||
"wifi-dangerous-disable-confirmation-description": "Desactivar el Wi-Fi puede desconectarte de tu Umbrel. Para reconectar, enchufa un cable Ethernet a tu Umbrel y asegúrate de que tanto tu Umbrel como el dispositivo desde el que accedes estén en la misma red.",
|
||||
"wifi-dangerous-disable-confirmation-title": "¿Estás seguro de que quieres desactivar el Wi-Fi?",
|
||||
"wifi-description": "Conecta tu dispositivo a una red Wi-Fi",
|
||||
"wifi-description-long": "Tu dispositivo permanece conectado a tu Wi-Fi elegido, incluso si se quita el cable Ethernet, y se reconecta automáticamente al Wi-Fi al iniciar.",
|
||||
"wifi-no-networks-message": "No se encontraron redes Wi-Fi",
|
||||
"wifi-searching": "Buscando redes Wi-Fi...",
|
||||
"wifi-unsupported-device-description": "El Wi-Fi no es compatible con este dispositivo. Esto puede deberse a un adaptador inalámbrico faltante o incompatible.",
|
||||
"wifi-view-networks": "Ver redes"
|
||||
}
|
||||
+343
-370
@@ -1,398 +1,371 @@
|
||||
{
|
||||
"hello": "Bonjour",
|
||||
"desktop.greeting.morning": "Bonjour, {{name}}",
|
||||
"desktop.greeting.afternoon": "Bon après-midi, {{name}}",
|
||||
"desktop.greeting.evening": "Bonsoir, {{name}}",
|
||||
"search": "Recherche",
|
||||
"settings": "Paramètres",
|
||||
"app-store.title": "App Store",
|
||||
"unknown": "Inconnu",
|
||||
"app_one": "application",
|
||||
"app_other": "applications",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"linux": "Linux",
|
||||
"install-your-first-app": "Installez votre première application",
|
||||
"logout": "Se déconnecter",
|
||||
"restart": "Redémarrer",
|
||||
"shut-down": "Éteindre",
|
||||
"umbrel": "Umbrel",
|
||||
"device": "Appareil",
|
||||
"umbrelos": "umbrelOS",
|
||||
"open-live-usage": "Ouvrir l'utilisation en direct",
|
||||
"account": "Compte",
|
||||
"wallpaper": "Fond d'écran",
|
||||
"name": "Nom",
|
||||
"password": "Mot de passe",
|
||||
"account-description": "Votre nom et mot de passe",
|
||||
"wallpaper-description": "Votre fond d'écran et thème Umbrel",
|
||||
"2fa-description": "Une seconde couche de sécurité pour votre connexion Umbrel et applications",
|
||||
"tor-description": "Accédez à votre Umbrel de n'importe où en utilisant un navigateur Tor",
|
||||
"migration-assistant": "Assistant de migration",
|
||||
"migration-assistant-description": "Transférer toutes vos applications et données d'un Raspberry Pi à Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "L'Assistant de migration prend actuellement en charge le transfert de toutes les données et applications d'un Raspberry Pi exécutant umbrelOS vers l'Umbrel Home. Ouvrez l'Assistant de migration sur votre Umbrel Home pour commencer.",
|
||||
"language": "Langue",
|
||||
"language-description": "Votre langue préférée pour umbrelOS",
|
||||
"app-store.description": "Vos paramètres de mise à jour des applications",
|
||||
"migrate": "Migrer",
|
||||
"change-name": "Changer de nom",
|
||||
"change-password": "Changer le mot de passe",
|
||||
"uptime": "Temps de fonctionnement",
|
||||
"preferences": "Préférences",
|
||||
"troubleshoot": "Dépannage",
|
||||
"troubleshoot-description": "Dépanner umbrelOS ou une application",
|
||||
"device-info-description": "Informations sur votre appareil",
|
||||
"device-info.view-info": "Voir les informations",
|
||||
"factory-reset": "Réinitialisation d'usine",
|
||||
"factory-reset.reset": "Réinitialiser",
|
||||
"factory-reset.desc": "Supprimer toutes vos données et applications umbrelOS",
|
||||
"software-update.title": "Mise à jour logicielle",
|
||||
"device-info": "Infos sur l'appareil",
|
||||
"software-update.on-latest": "Vous utilisez la dernière version d'umbrelOS",
|
||||
"check-for-latest-version": "Vérifier la dernière mise à jour d'umbrelOS",
|
||||
"2fa": "2FA",
|
||||
"remote-tor-access": "Accès Tor à distance",
|
||||
"software-update.checking": "Recherche de mise à jour...",
|
||||
"software-update.check": "Vérifier la mise à jour",
|
||||
"software-update.new-version": "Nouvelle version d'{{name}} disponible à l'installation",
|
||||
"software-update.updating-to": "Mise à jour vers {{name}}",
|
||||
"software-update.callout": "Veuillez ne pas actualiser cette page ou éteindre votre Umbrel pendant la mise à jour.",
|
||||
"software-update.failed.title": "Échec de la mise à jour logicielle",
|
||||
"software-update.failed.description": "Une erreur est survenue lors de la mise à jour logicielle",
|
||||
"software-update.failed.please-try-again": "Veuillez réessayer",
|
||||
"software-update.failed.retry": "Réessayer",
|
||||
"update": "mise à jour",
|
||||
"software-update.update-now": "Mettre à jour maintenant",
|
||||
"software-update.view": "Voir",
|
||||
"storage": "Stockage",
|
||||
"storage.low": "Stockage faible",
|
||||
"storage.full": "Stockage plein",
|
||||
"something-left": "{{left}} restant",
|
||||
"unexpected-error": "Erreur inattendue",
|
||||
"unexpected-error.heading": "⚠ Erreur",
|
||||
"clipboard.copied": "Copié",
|
||||
"close": "Fermer",
|
||||
"something-went-wrong": "⚠ Un problème est survenu",
|
||||
"loading": "Chargement",
|
||||
"cmdk.input-placeholder": "Rechercher des applications, paramètres ou actions",
|
||||
"no-results-found": "Aucun résultat trouvé",
|
||||
"cmdk.restart-umbrel": "Redémarrer Umbrel",
|
||||
"cmdk.update-all-apps": "Mettre à jour toutes les applications",
|
||||
"cmdk.change-wallpaper": "Changer de fond d'écran",
|
||||
"cmdk.live-usage": "Utilisation en direct",
|
||||
"cmdk.widgets": "Widgets",
|
||||
"cmdk.frequent-apps": "Fréquemment utilisé",
|
||||
"app.offline": "Non en cours d'exécution",
|
||||
"app.uninstalling": "Désinstallation",
|
||||
"app.install": "Installer",
|
||||
"app.installing": "Installation",
|
||||
"app.updating": "Mise à jour",
|
||||
"app.open": "Ouvrir",
|
||||
"app.view": "Voir",
|
||||
"retry": "Réessayer",
|
||||
"download-logs": "Télécharger les journaux",
|
||||
"page-title-umbrel": "{{title}} – umbrelOS",
|
||||
"desktop.title": "Bureau",
|
||||
"notifications": "Notifications",
|
||||
"device-info.device": "Appareil",
|
||||
"device-info.model-number": "Numéro de modèle",
|
||||
"device-info.serial-number": "Numéro de série",
|
||||
"memory": "Mémoire",
|
||||
"memory.low": "Mémoire faible",
|
||||
"no-forgot-password-message": "Si vous perdez votre mot de passe, vous ne pourrez pas vous connecter à votre Umbrel. Assurez-vous de le sécuriser soigneusement.",
|
||||
"settings.contact-support": "Besoin d'aide ? <linked>Contactez le support.</linked>",
|
||||
"temperature": "Température",
|
||||
"temperature.too-hot-suggestion": "Envisagez de changer l'environnement de votre appareil.",
|
||||
"temp.dangerously-hot": "Très chaud",
|
||||
"temp.hot": "Chaud",
|
||||
"temp.nice": "Agréable",
|
||||
"temp.warm": "Tiède",
|
||||
"temp.normal": "Normal",
|
||||
"temp.too-cold": "Trop froid",
|
||||
"temp.cool": "Frais",
|
||||
"2fa.disable.title": "Désactiver l'authentification à deux facteurs",
|
||||
"2fa.enter-code": "Entrez le code affiché dans votre application d'authentification",
|
||||
"2fa.enable.or-paste": "Ou collez le code suivant dans votre application d'authentification",
|
||||
"2fa.enable.title": "Activer l'authentification à deux facteurs",
|
||||
"2fa.enable.scan-this": "Scannez ce code QR avec une application d'authentification comme Google Authenticator ou Authy",
|
||||
"settings.app-store-preferences.title": "Préférences de l'App Store",
|
||||
"change-name.input-placeholder": "Votre nom",
|
||||
"confirm": "Confirmer",
|
||||
"cancel": "Annuler",
|
||||
"change-password.callout": "Si vous perdez votre mot de passe, vous ne pourrez pas vous connecter à votre Umbrel. Assurez-vous de le sécuriser soigneusement.",
|
||||
"change-password.current-password": "Mot de passe actuel",
|
||||
"change-password.new-password": "Nouveau mot de passe",
|
||||
"change-password.repeat-password": "Répéter le mot de passe",
|
||||
"restart.restarting": "Redémarrage",
|
||||
"restart.restarting-message": "Veuillez ne pas actualiser cette page ou éteindre votre Umbrel pendant le redémarrage.",
|
||||
"restart.failed": "Échec du redémarrage",
|
||||
"restart.confirm.title": "Êtes-vous sûr de vouloir redémarrer votre Umbrel ?",
|
||||
"restart.confirm.submit": "Redémarrer",
|
||||
"shut-down.complete": "Arrêt complet",
|
||||
"shut-down.complete-text": "Vous pouvez maintenant débrancher votre appareil.",
|
||||
"shut-down.shutting-down": "Arrêt en cours",
|
||||
"shut-down.shutting-down-message": "Veuillez ne pas actualiser cette page ou éteindre votre Umbrel pendant l'arrêt.",
|
||||
"shut-down.failed": "Échec de l'arrêt",
|
||||
"shut-down.confirm.title": "Êtes-vous sûr de vouloir éteindre votre Umbrel ?",
|
||||
"shut-down.confirm.submit": "Éteindre",
|
||||
"tor.enable.title": "Activer l'accès Tor à distance",
|
||||
"tor.enable.failed": "Échec de l'activation de Tor",
|
||||
"tor.enable.description": "Cela peut prendre quelques minutes",
|
||||
"tor.disable.description": "Cela peut prendre quelques minutes",
|
||||
"tor.enable.submit": "Activer",
|
||||
"troubleshoot.umbrelos-description": "Voir les journaux umbrelOS et système",
|
||||
"troubleshoot.app": "Application",
|
||||
"troubleshoot.app-description": "Voir les journaux d'une application installée sur votre Umbrel",
|
||||
"troubleshoot.umbrelos-logs": "Journaux umbrelOS",
|
||||
"troubleshoot.system-logs": "Journaux système",
|
||||
"troubleshoot.system-download": "Télécharger {{label}}",
|
||||
"troubleshoot.app-download": "Télécharger les journaux de {{app}}",
|
||||
"app-picker.select-app": "Sélectionner une application...",
|
||||
"app-picker.search": "Rechercher...",
|
||||
"troubleshoot.share-with-umbrel-support": "Partager avec le support Umbrel",
|
||||
"login": "Connexion",
|
||||
"migration-assistant.prep.body": "Préparation à la migration",
|
||||
"migration-assistant.prep.button-continue": "Continuer",
|
||||
"migration-assistant.prep.callout": "Les données sur votre Umbrel Home, le cas échéant, seront définitivement supprimées.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Éteignez votre Umbrel Raspberry Pi.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Connectez son disque externe à n'importe quel port USB de votre Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Une fois terminé, cliquez sur '{{button}}' ci-dessous.",
|
||||
"migration-assistant.failed": "Quelque chose ne va pas...",
|
||||
"try-again": "Réessayer",
|
||||
"migration-assistant.continue-migration.ready.submit": "Commencer la migration",
|
||||
"migration-assistant.ready.title": "Tout est prêt pour la migration !",
|
||||
"migration-assistant.ready.description": "Toutes vos données et applications sont prêtes à être migrées vers votre Umbrel Home",
|
||||
"migration-assistant.ready.hint-header": "Choses à garder à l'esprit",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Utilisez le même mot de passe",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "N'oubliez pas d'utiliser votre mot de passe Umbrel Raspberry Pi pour vous connecter à votre Umbrel Home",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Gardez votre Raspberry Pi éteint après la mise à jour",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Cela aide à éviter les problèmes avec des applications telles que Lightning Node",
|
||||
"migration-assistant.failed.ssd-not-detected.title": "Aucun disque externe détecté",
|
||||
"migration-assistant.failed.ssd-not-detected.description": "Assurez-vous de connecter le disque externe de votre Raspberry Pi à votre Umbrel Home",
|
||||
"migration-assistant.failed.incorrect-ssd.title": "Disque externe incompatible",
|
||||
"migration-assistant.failed.incorrect-ssd.description": "Assurez-vous d'avoir connecté le disque externe de votre Raspberry Pi à votre Umbrel Home",
|
||||
"live-usage": "Utilisation en direct",
|
||||
"unknown-app": "Application inconnue",
|
||||
"login.title": "Bon retour",
|
||||
"login.subtitle": "Entrez votre mot de passe Umbrel pour vous connecter",
|
||||
"login.password-label": "Mot de passe",
|
||||
"login.password.submit": "Se connecter",
|
||||
"login-2fa.title": "Authentifiez-vous",
|
||||
"login-2fa.subtitle": "Entrez le code 2FA affiché dans votre application d'authentification",
|
||||
"not-found-404": "Code d'erreur : 404",
|
||||
"not-found-404.back": "Retour",
|
||||
"not-found-404.home": "Aller à l'accueil",
|
||||
"restart.try-again": "Réessayer",
|
||||
"login-with-umbrel.app-not-found": "Application non trouvée.",
|
||||
"login-with-umbrel.title": "Se connecter avec Umbrel",
|
||||
"login-with-umbrel.description": "Entrez votre mot de passe Umbrel pour ouvrir {{app}}",
|
||||
"create-user": "Créer un utilisateur",
|
||||
"language.select-description": "Sélectionnez la langue préférée pour umbrelOS",
|
||||
"software-update.current-running": "Vous utilisez",
|
||||
"migration-assistant.mobile.start-button": "Commencer la migration",
|
||||
"tor.enable.mobile.switch-label": "Activer l'accès Tor à distance",
|
||||
"logout.confirm.title": "Êtes-vous sûr de vouloir vous déconnecter ?",
|
||||
"logout.confirm.submit": "Se déconnecter",
|
||||
"2fa.enable.success": "Authentification à deux facteurs activée",
|
||||
"2fa-description": "Une seconde couche de sécurité pour votre connexion Umbrel et applications",
|
||||
"2fa.disable.success": "Authentification à deux facteurs désactivée",
|
||||
"apps.uninstalled-all.success": "Toutes les applications désinstallées",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Échec de la récupération des applications requises",
|
||||
"2fa.disable.title": "Désactiver l'authentification à deux facteurs",
|
||||
"2fa.enable.or-paste": "Ou collez le code suivant dans votre application d'authentification",
|
||||
"2fa.enable.scan-this": "Scannez ce code QR avec une application d'authentification comme Google Authenticator ou Authy",
|
||||
"2fa.enable.success": "Authentification à deux facteurs activée",
|
||||
"2fa.enable.title": "Activer l'authentification à deux facteurs",
|
||||
"2fa.enter-code": "Entrez le code affiché dans votre application d'authentification",
|
||||
"account": "Compte",
|
||||
"account-description": "Votre nom et mot de passe",
|
||||
"advanced-settings": "Paramètres avancés",
|
||||
"advanced-settings-description": "Ouvrez le terminal ou inscrivez-vous au programme bêta d'umbrelOS",
|
||||
"app-not-found": "Application non trouvée : {{app}}",
|
||||
"app-only-over-tor": "{{app}} ne peut être utilisée que via Tor. Veuillez accéder à votre Umbrel dans un navigateur Tor sur votre URL d'accès à distance (Paramètres > Accès Tor à distance) pour ouvrir cette application.",
|
||||
"widget.progress.in-progress": "En cours",
|
||||
"change-password.failed.current-required": "Le mot de passe actuel est requis",
|
||||
"change-password.failed.new-required": "Un nouveau mot de passe est requis",
|
||||
"change-password.failed.repeat-required": "Répétition du mot de passe requise",
|
||||
"change-password.failed.no-match": "Les mots de passe ne correspondent pas",
|
||||
"change-password.failed.must-be-unique": "Le nouveau mot de passe doit être différent du mot de passe actuel",
|
||||
"change-password.failed.min-length": "Le mot de passe doit comporter au moins {{characters}} caractères",
|
||||
"notifications.view": "Voir",
|
||||
"notifications.new-version-available": "{{update}} est maintenant disponible à l'installation",
|
||||
"notifications.cpu.too-hot": "Température élevée du CPU",
|
||||
"notifications.cpu.too-cold": "Température basse du CPU",
|
||||
"notifications.storage.full": "Le stockage de votre appareil est plein",
|
||||
"notifications.memory.low": "La mémoire de votre appareil est faible",
|
||||
"notifications.storage.low": "Le stockage de votre appareil est faible",
|
||||
"software-update.success": "Mise à jour réussie vers umbrelOS {{version}}",
|
||||
"software-update.failed": "Échec de la mise à jour",
|
||||
"software-update.failed-to-check": "Échec de la vérification des mises à jour",
|
||||
"change-name.failed.name-required": "Le nom est requis",
|
||||
"free": "Gratuit",
|
||||
"app-page.section.about": "À propos",
|
||||
"app-page.section.credentials.title": "Identifiants par défaut",
|
||||
"app-page.section.info.compatibility": "Compatibilité",
|
||||
"app-page.section.info.compatibility-compatible": "Compatible",
|
||||
"app-page.section.info.developer": "Développeur",
|
||||
"app-page.section.info.source-code": "Code source",
|
||||
"app-page.section.info.source-code.public": "Public",
|
||||
"app-page.section.info.submitted-by": "Soumis par",
|
||||
"app-page.section.info.title": "Infos",
|
||||
"app-page.section.info.version": "Version",
|
||||
"app-page.section.recommendations.title": "Vous pourriez aussi aimer",
|
||||
"app-page.section.release-notes.title": "Nouveautés",
|
||||
"app-page.section.release-notes.version": "Version {{version}}",
|
||||
"app-page.section.requires": "Nécessite",
|
||||
"app-page.section.requires.support": "Obtenir de l'aide",
|
||||
"app-picker.search": "Rechercher...",
|
||||
"app-picker.select-app": "Sélectionner une application...",
|
||||
"app-store.browse-category-apps": "Parcourir les applications {{category}}",
|
||||
"app-store.category.discover": "Découvrir",
|
||||
"app-store.category.ai": "IA",
|
||||
"app-store.category.all": "Toutes les applications",
|
||||
"app-store.category.files": "Fichiers & Productivité",
|
||||
"app-store.category.automation": "Maison & Automatisation",
|
||||
"app-store.category.bitcoin": "Bitcoin",
|
||||
"app-store.category.developer": "Outils Développeur",
|
||||
"app-store.category.discover": "Découvrir",
|
||||
"app-store.category.files": "Fichiers & Productivité",
|
||||
"app-store.category.finance": "Finance",
|
||||
"app-store.category.media": "Médias",
|
||||
"app-store.category.networking": "Réseautage",
|
||||
"app-store.category.social": "Social",
|
||||
"app-store.category.automation": "Maison & Automatisation",
|
||||
"app-store.category.ai": "IA",
|
||||
"app-store.category.developer": "Outils Développeur",
|
||||
"community-app-store": "App Store Communautaire",
|
||||
"community-app-store.loading": "Chargement...",
|
||||
"community-app-store.back-to-umbrel-app-store": "Retour à l'App Store Umbrel",
|
||||
"community-app-store.open-button": "Ouvrir",
|
||||
"community-app-store.remove-button": "Retirer",
|
||||
"community-app-stores.description": "Les App Stores Communautaires vous permettent d'installer des applications sur votre Umbrel qui peuvent ne pas être disponibles dans l'App Store officiel d'Umbrel. Ils facilitent également le test des versions bêta des applications Umbrel avant que les développeurs les publient sur l'App Store officiel d'Umbrel.",
|
||||
"community-app-stores.learn-more": "En savoir plus",
|
||||
"community-app-stores.warning": "Les App Stores Communautaires peuvent être créés par n'importe qui. Les applications publiées ne sont pas vérifiées ni approuvées par l'équipe de l'App Store officiel d'Umbrel et peuvent potentiellement être non sécurisées ou malveillantes. Soyez prudent et ajoutez uniquement des app stores de développeurs en qui vous avez confiance.",
|
||||
"community-app-stores.add-button": "Ajouter",
|
||||
"desktop.install-first.for-the-self-hoster": "Pour l'auto-hébergement",
|
||||
"desktop.install-first.for-the-bitcoiner": "Pour le Bitcoiner",
|
||||
"desktop.install-first.for-the-streamer": "Pour le streamer",
|
||||
"desktop.context-menu.edit-widgets": "Modifier les widgets",
|
||||
"desktop.context-menu.logout": "Se déconnecter",
|
||||
"desktop.context-menu.change-wallpaper": "Changer de fond d'écran",
|
||||
"desktop.not-enough-room": "Utilisez un écran plus grand pour voir vos applications.",
|
||||
"desktop.app.context.go-to-store-page": "Voir dans l'App Store",
|
||||
"desktop.app.context.show-default-credentials": "Afficher les identifiants par défaut",
|
||||
"desktop.app.context.uninstall": "Désinstaller",
|
||||
"desktop.install-first.link-to-app-store": "Explorer plus dans l'App Store",
|
||||
"migrate.callout": "Ne pas éteindre votre Umbrel jusqu'à ce que la migration soit terminée",
|
||||
"app.uninstall.confirm.title": "Désinstaller {{app}} ?",
|
||||
"app.uninstall.confirm.submit": "Désinstaller",
|
||||
"app.uninstall.confirm.description": "Toutes les données associées à {{app}} seront définitivement supprimées. Cette action est irréversible.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} est utilisé par",
|
||||
"widgets.edit.title": "Modifier les widgets",
|
||||
"widgets.edit.select-up-to-3-widgets": "Sélectionnez jusqu'à 3 widgets",
|
||||
"onboarding.create-account": "Créer un compte",
|
||||
"factory-reset.review.title": "Réviser les données",
|
||||
"factory-reset.review.following-will-be-removed": "Les éléments suivants seront supprimés de votre appareil",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} application installée",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} applications installées",
|
||||
"app.uninstall.deps.used-by.description_one": "Désinstallez {{firstAppToUninstall}} d'abord pour désinstaller {{app}}.",
|
||||
"app.uninstall.deps.used-by.description_other": "Désinstallez ces applications d'abord pour désinstaller {{app}}.",
|
||||
"app-store.search-apps": "Rechercher des applications",
|
||||
"app-store.description": "Vos paramètres de mise à jour des applications",
|
||||
"app-store.menu.community-app-stores": "App Stores Communautaires",
|
||||
"app-store.search-apps": "Rechercher des applications",
|
||||
"app-store.search.no-results": "Aucun résultat",
|
||||
"app-store.search.results-for": "Résultats pour",
|
||||
"factory-reset.review.submit": "Continuer",
|
||||
"factory-reset.review.account-info": "Infos du compte et mot de passe",
|
||||
"factory-reset.review.total-data": "Données totales",
|
||||
"factory-reset.review.apps": "Applications",
|
||||
"onboarding.create-account.failed.name-required": "Le nom est requis",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Les mots de passe ne correspondent pas",
|
||||
"onboarding.create-account.subtitle": "Les informations de votre compte sont stockées uniquement sur votre Umbrel. Assurez-vous de sauvegarder votre mot de passe en toute sécurité car il n'y a aucun moyen de le réinitialiser.",
|
||||
"onboarding.contact-support": "Support",
|
||||
"onboarding.create-account.name.input-placeholder": "Votre nom",
|
||||
"onboarding.create-account.password.input-label": "Mot de passe",
|
||||
"onboarding.create-account.confirm-password.input-label": "Confirmer le mot de passe",
|
||||
"onboarding.create-account.submit": "Créer",
|
||||
"onboarding.create-account.submitting": "Création",
|
||||
"onboarding.account-created.youre-all-set-name": "Tout est prêt, {{name}}.",
|
||||
"legal.privacy-policy": "Politique de confidentialité",
|
||||
"legal.terms-of-service": "Conditions d'utilisation",
|
||||
"onboarding.account-created.next": "Suivant",
|
||||
"onboarding.account-created.page-title": "Compte créé",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "En cliquant sur 'Suivant', vous acceptez les <linked>conditions d'utilisation d'umbrelOS</linked>",
|
||||
"onboarding.start.title": "Bienvenue sur umbrelOS",
|
||||
"onboarding.start.subtitle": "Votre serveur cloud domestique est prêt à être configuré.",
|
||||
"onboarding.account-created.subtitle": "Votre Umbrel est maintenant prêt.",
|
||||
"onboarding.start.continue": "Commencer",
|
||||
"app-page.section.about": "À propos",
|
||||
"default-credentials.title": "Identifiants pour {{app}}",
|
||||
"default-credentials.username": "Nom d'utilisateur par défaut",
|
||||
"default-credentials.password": "Mot de passe par défaut",
|
||||
"default-credentials.open": "Ouvrir {{app}}",
|
||||
"default-credentials.close": "Compris",
|
||||
"default-credentials..dont-show-again": "Ne plus afficher",
|
||||
"default-credentials.description": "Voici les identifiants dont vous aurez besoin pour vous connecter à l'application.",
|
||||
"app-page.section.requires": "Nécessite",
|
||||
"app-page.section.requires.support": "Obtenir de l'aide",
|
||||
"app-page.section.info.title": "Infos",
|
||||
"app-page.section.info.version": "Version",
|
||||
"app-page.section.info.source-code": "Code source",
|
||||
"app-page.section.info.source-code.public": "Public",
|
||||
"app-page.section.info.developer": "Développeur",
|
||||
"app-page.section.info.submitted-by": "Soumis par",
|
||||
"app-page.section.info.compatibility": "Compatibilité",
|
||||
"app-page.section.info.compatibility-compatible": "Compatible",
|
||||
"app-page.section.recommendations.title": "Vous pourriez aussi aimer",
|
||||
"app-page.section.release-notes.title": "Nouveautés",
|
||||
"app-page.section.release-notes.version": "Version {{version}}",
|
||||
"app-page.section.credentials.title": "Identifiants par défaut",
|
||||
"auto-update": "Mise à jour automatique",
|
||||
"read-less": "Lire moins",
|
||||
"read-more": "Lire plus",
|
||||
"app-store.title": "App Store",
|
||||
"app-updates.less": "moins",
|
||||
"app-updates.more": "plus",
|
||||
"app-updates.no-updates": "Toutes les applications sont à jour !",
|
||||
"app-updates.update": "Mettre à jour",
|
||||
"app-updates.update-all": "Mettre à jour tout",
|
||||
"app-updates.updates-available-count_one": "{{count}} mise à jour disponible",
|
||||
"app-updates.updates-available-count_other": "{{count}} mises à jour disponibles",
|
||||
"app-updates.updating": "Mise à jour...",
|
||||
"app.install": "Installer",
|
||||
"app.installing": "Installation",
|
||||
"app.offline": "Non en cours d'exécution",
|
||||
"app.open": "Ouvrir",
|
||||
"app.optimized-for-umbrel-home": "Optimisé pour Umbrel Home",
|
||||
"install-first.title": "{{app}} nécessite l'accès à",
|
||||
"install-first.description_one": "Installez cette application pour installer {{app}}.",
|
||||
"install-first.description_other": "Installez d'abord ces applications pour installer {{app}}.",
|
||||
"ok": "OK",
|
||||
"factory-reset.confirm.title": "Confirmer avec le mot de passe",
|
||||
"factory-reset.confirm.body": "Confirmez le mot de passe Umbrel pour réinitialiser",
|
||||
"factory-reset.confirm.submit": "Effacer tout et réinitialiser",
|
||||
"factory-reset.confirm.submit-callout": "Cette action est irréversible.",
|
||||
"factory-reset.confirm.password-label": "Entrer le mot de passe",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Ne pas éteindre votre appareil jusqu'à ce que la réinitialisation soit complète",
|
||||
"factory-reset.resetting.connecting": "Connexion",
|
||||
"factory-reset.failed.title": "Échec de la réinitialisation",
|
||||
"factory-reset.failed.message": "Une erreur s'est produite pendant la réinitialisation",
|
||||
"factory-reset.failed.message.please-try-again": "Veuillez réessayer",
|
||||
"factory-reset.failed.retry": "Réessayer la réinitialisation d'usine",
|
||||
"factory-reset.success.title": "Réinitialisation réussie",
|
||||
"factory-reset.success.description": "Toutes vos applications, données d'application et données de compte ont été supprimées de votre appareil. Vous pouvez maintenant redémarrer votre appareil.",
|
||||
"factory-reset.success.restart-device": "Redémarrer l'appareil",
|
||||
"connecting": "Connexion...",
|
||||
"migrate.failed.title": "Échec de la migration",
|
||||
"migrate.failed.description": "Une erreur s'est produite pendant la migration",
|
||||
"migrate.failed.please-try-again": "Veuillez réessayer",
|
||||
"migrate.failed.retry": "Réessayer",
|
||||
"migrate.success.title": "Migration réussie",
|
||||
"migrate.success.description": "Toutes vos applications, données d'application et détails de compte ont été migrés vers votre Umbrel Home.",
|
||||
"continue-to-log-in": "Continuer pour se connecter",
|
||||
"trpc.checking-backend": "Chargement...",
|
||||
"trpc.backend-unavailable": "Erreur : Connexion à l'API système échouée",
|
||||
"app.restarting": "Redémarrage",
|
||||
"app.starting": "Démarrage",
|
||||
"app.stopped": "Arrêté",
|
||||
"app.stopping": "Arrêt",
|
||||
"app.uninstall.confirm.description": "Toutes les données associées à {{app}} seront définitivement supprimées. Cette action est irréversible.",
|
||||
"app.uninstall.confirm.submit": "Désinstaller",
|
||||
"app.uninstall.confirm.title": "Désinstaller {{app}} ?",
|
||||
"app.uninstall.deps.used-by.description_one": "Désinstallez {{firstAppToUninstall}} d'abord pour désinstaller {{app}}.",
|
||||
"app.uninstall.deps.used-by.description_other": "Désinstallez ces applications d'abord pour désinstaller {{app}}.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} est utilisé par",
|
||||
"app.uninstalling": "Désinstallation",
|
||||
"app.updating": "Mise à jour",
|
||||
"app.view": "Voir",
|
||||
"app_one": "application",
|
||||
"app_other": "applications",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Échec de la récupération des applications requises",
|
||||
"apps.uninstalled-all.success": "Toutes les applications désinstallées",
|
||||
"auth.checking-backend-for-user": "Chargement...",
|
||||
"auth.failed-checking-if-user-logged-in": "Erreur : Vérification de la connexion échouée",
|
||||
"auth.failed-to-check-if-user-exists": "Erreur : Vérification de l'existence échouée",
|
||||
"redirect.to-onboarding": "Chargement...",
|
||||
"redirect.to-login": "Chargement...",
|
||||
"redirect.to-home": "Chargement...",
|
||||
"widgets.install-an-app-before-using-widgets": "Installez une application pour commencer à personnaliser votre écran d'accueil avec des widgets.",
|
||||
"logout-error-generic": "Erreur : Échec de la déconnexion",
|
||||
"app.stopping": "Arrêt",
|
||||
"app.starting": "Démarrage",
|
||||
"app.restarting": "Redémarrage",
|
||||
"beta-program": "Programme bêta d'umbrelOS",
|
||||
"beta-program-description": "Optez pour recevoir des mises à jour bêta d'umbrelOS, accédez en avant-première à de nouvelles fonctionnalités et aidez-nous à les peaufiner en fournissant vos retours. Les mises à jour bêta peuvent être instables, et le dépannage peut nécessiter une familiarité avec le terminal.",
|
||||
"cancel": "Annuler",
|
||||
"change": "Changer",
|
||||
"change-name": "Changer de nom",
|
||||
"change-name.failed.name-required": "Le nom est requis",
|
||||
"change-name.input-placeholder": "Votre nom",
|
||||
"change-password": "Changer le mot de passe",
|
||||
"change-password.callout": "Si vous perdez votre mot de passe, vous ne pourrez pas vous connecter à votre Umbrel. Assurez-vous de le sécuriser soigneusement.",
|
||||
"change-password.current-password": "Mot de passe actuel",
|
||||
"change-password.failed.current-required": "Le mot de passe actuel est requis",
|
||||
"change-password.failed.min-length": "Le mot de passe doit comporter au moins {{characters}} caractères",
|
||||
"change-password.failed.must-be-unique": "Le nouveau mot de passe doit être différent du mot de passe actuel",
|
||||
"change-password.failed.new-required": "Un nouveau mot de passe est requis",
|
||||
"change-password.failed.no-match": "Les mots de passe ne correspondent pas",
|
||||
"change-password.failed.repeat-required": "Répétition du mot de passe requise",
|
||||
"change-password.new-password": "Nouveau mot de passe",
|
||||
"change-password.repeat-password": "Répéter le mot de passe",
|
||||
"check-for-latest-version": "Vérifier la dernière mise à jour d'umbrelOS",
|
||||
"clipboard.copied": "Copié",
|
||||
"close": "Fermer",
|
||||
"cmdk.change-wallpaper": "Changer de fond d'écran",
|
||||
"cmdk.frequent-apps": "Fréquemment utilisé",
|
||||
"cmdk.input-placeholder": "Rechercher des applications, paramètres ou actions",
|
||||
"cmdk.install-from-app-store": "depuis l'App Store",
|
||||
"cmdk.live-usage": "Utilisation en direct",
|
||||
"cmdk.restart-umbrel": "Redémarrer Umbrel",
|
||||
"cmdk.shutdown-umbrel": "Éteindre Umbrel",
|
||||
"cmdk.update-all-apps": "Mettre à jour toutes les applications",
|
||||
"cmdk.widgets": "Widgets",
|
||||
"community-app-store": "App Store Communautaire",
|
||||
"community-app-store.back-to-umbrel-app-store": "Retour à l'App Store Umbrel",
|
||||
"community-app-store.open-button": "Ouvrir",
|
||||
"community-app-store.remove-button": "Retirer",
|
||||
"community-app-stores.add-button": "Ajouter",
|
||||
"community-app-stores.description": "Les App Stores Communautaires vous permettent d'installer des applications sur votre Umbrel qui peuvent ne pas être disponibles dans l'App Store officiel d'Umbrel. Ils facilitent également le test des versions bêta des applications Umbrel avant que les développeurs les publient sur l'App Store officiel d'Umbrel.",
|
||||
"community-app-stores.learn-more": "En savoir plus",
|
||||
"community-app-stores.warning": "Les App Stores Communautaires peuvent être créés par n'importe qui. Les applications publiées ne sont pas vérifiées ni approuvées par l'équipe de l'App Store officiel d'Umbrel et peuvent potentiellement être non sécurisées ou malveillantes. Soyez prudent et ajoutez uniquement des app stores de développeurs en qui vous avez confiance.",
|
||||
"confirm": "Confirmer",
|
||||
"connecting": "Connexion...",
|
||||
"continue": "Continuer",
|
||||
"continue-to-log-in": "Continuer pour se connecter",
|
||||
"cpu": "CPU",
|
||||
"cpu-core-count": "{{cores}} threads",
|
||||
"troubleshoot-pick-title": "Dépannage",
|
||||
"troubleshoot-no-logs-yet": "Aucun journal pour le moment",
|
||||
"temperature.too-cold-suggestion": "Envisagez de changer l'environnement de votre appareil",
|
||||
"cmdk.install-from-app-store": "depuis l'App Store",
|
||||
"cmdk.shutdown-umbrel": "Éteindre Umbrel",
|
||||
"tor.enable.success": "Accès Tor à distance activé",
|
||||
"tor.enable.progress": "Activation de l'accès Tor à distance",
|
||||
"tor.disable.success": "Accès Tor à distance désactivé",
|
||||
"tor.disable.progress": "Désactivation de l'accès Tor à distance",
|
||||
"tor.hidden-service": "URL du service caché Tor",
|
||||
"stop": "Arrêter",
|
||||
"software-update.release-notes.title": "Notes de version",
|
||||
"app-updates.updates-available-count_one": "{{count}} mise à jour disponible",
|
||||
"app-updates.updates-available-count_other": "{{count}} mises à jour disponibles",
|
||||
"app-updates.title": "Mises à jour",
|
||||
"app-updates.update-all": "Mettre à jour tout",
|
||||
"app-updates.updating": "Mise à jour...",
|
||||
"app-updates.update": "Mettre à jour",
|
||||
"app-updates.less": "moins",
|
||||
"app-updates.more": "plus",
|
||||
"create-user": "Créer un utilisateur",
|
||||
"default-credentials.close": "Compris",
|
||||
"default-credentials.description": "Voici les identifiants dont vous aurez besoin pour vous connecter à l'application.",
|
||||
"default-credentials.dont-show-again": "Ne plus afficher",
|
||||
"default-credentials.open": "Ouvrir {{app}}",
|
||||
"default-credentials.password": "Mot de passe par défaut",
|
||||
"default-credentials.title": "Identifiants pour {{app}}",
|
||||
"default-credentials.username": "Nom d'utilisateur par défaut",
|
||||
"desktop.app.context.go-to-store-page": "Voir dans l'App Store",
|
||||
"desktop.app.context.show-default-credentials": "Afficher les identifiants par défaut",
|
||||
"desktop.app.context.uninstall": "Désinstaller",
|
||||
"desktop.context-menu.change-wallpaper": "Changer de fond d'écran",
|
||||
"desktop.context-menu.edit-widgets": "Modifier les widgets",
|
||||
"desktop.context-menu.logout": "Se déconnecter",
|
||||
"desktop.greeting.afternoon": "Bon après-midi, {{name}}",
|
||||
"desktop.greeting.evening": "Bonsoir, {{name}}",
|
||||
"desktop.greeting.morning": "Bonjour, {{name}}",
|
||||
"desktop.install-first.for-the-bitcoiner": "Pour le Bitcoiner",
|
||||
"desktop.install-first.for-the-self-hoster": "Pour l'auto-hébergement",
|
||||
"desktop.install-first.for-the-streamer": "Pour le streamer",
|
||||
"desktop.install-first.link-to-app-store": "Explorer plus dans l'App Store",
|
||||
"desktop.not-enough-room": "Utilisez un écran plus grand pour voir vos applications.",
|
||||
"device": "Appareil",
|
||||
"device-info": "Infos sur l'appareil",
|
||||
"device-info-description": "Informations sur votre appareil",
|
||||
"device-info.device": "Appareil",
|
||||
"device-info.model-number": "Numéro de modèle",
|
||||
"device-info.serial-number": "Numéro de série",
|
||||
"device-info.view-info": "Voir les informations",
|
||||
"disable": "Désactiver",
|
||||
"download-logs": "Télécharger les journaux",
|
||||
"factory-reset": "Réinitialisation d'usine",
|
||||
"factory-reset.confirm.body": "Confirmez le mot de passe Umbrel pour réinitialiser",
|
||||
"factory-reset.confirm.password-label": "Entrer le mot de passe",
|
||||
"factory-reset.confirm.submit": "Effacer tout et réinitialiser",
|
||||
"factory-reset.confirm.submit-callout": "Cette action est irréversible.",
|
||||
"factory-reset.desc": "Supprimer toutes vos données et applications umbrelOS",
|
||||
"factory-reset.failed.message": "Une erreur s'est produite pendant la réinitialisation",
|
||||
"factory-reset.failed.retry": "Réessayer la réinitialisation d'usine",
|
||||
"factory-reset.failed.title": "Échec de la réinitialisation",
|
||||
"factory-reset.reset": "Réinitialiser",
|
||||
"factory-reset.resetting.connecting": "Connexion",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Ne pas éteindre votre appareil jusqu'à ce que la réinitialisation soit complète",
|
||||
"factory-reset.review.account-info": "Infos du compte et mot de passe",
|
||||
"factory-reset.review.apps": "Applications",
|
||||
"factory-reset.review.following-will-be-removed": "Les éléments suivants seront supprimés de votre appareil",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} application installée",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} applications installées",
|
||||
"factory-reset.review.submit": "Continuer",
|
||||
"factory-reset.review.total-data": "Données totales",
|
||||
"factory-reset.success.description": "Toutes vos applications, données d'application et données de compte ont été supprimées de votre appareil. Vous pouvez maintenant redémarrer votre appareil.",
|
||||
"factory-reset.success.restart-device": "Redémarrer l'appareil",
|
||||
"factory-reset.success.title": "Réinitialisation réussie",
|
||||
"hello": "Bonjour",
|
||||
"install-first.description_one": "Installez cette application pour installer {{app}}.",
|
||||
"install-first.description_other": "Installez d'abord ces applications pour installer {{app}}.",
|
||||
"install-first.title": "{{app}} nécessite l'accès à",
|
||||
"install-your-first-app": "Installez votre première application",
|
||||
"language": "Langue",
|
||||
"language-description": "Votre langue préférée pour umbrelOS",
|
||||
"language.select-description": "Sélectionnez la langue préférée pour umbrelOS",
|
||||
"linux": "Linux",
|
||||
"live-usage": "Utilisation en direct",
|
||||
"loading": "Chargement",
|
||||
"local-ip": "IP locale",
|
||||
"login-2fa.subtitle": "Entrez le code 2FA affiché dans votre application d'authentification",
|
||||
"login-2fa.title": "Authentifiez-vous",
|
||||
"login-with-umbrel.description": "Entrez votre mot de passe Umbrel pour ouvrir {{app}}",
|
||||
"login-with-umbrel.title": "Se connecter avec Umbrel",
|
||||
"login.password-label": "Mot de passe",
|
||||
"login.password.submit": "Se connecter",
|
||||
"login.subtitle": "Entrez votre mot de passe Umbrel pour vous connecter",
|
||||
"login.title": "Bon retour",
|
||||
"logout": "Se déconnecter",
|
||||
"logout-error-generic": "Erreur : Échec de la déconnexion",
|
||||
"logout.confirm.submit": "Se déconnecter",
|
||||
"logout.confirm.title": "Êtes-vous sûr de vouloir vous déconnecter ?",
|
||||
"memory": "Mémoire",
|
||||
"memory.low": "Mémoire faible",
|
||||
"migrate": "Migrer",
|
||||
"migrate.callout": "Ne pas éteindre votre Umbrel jusqu'à ce que la migration soit terminée",
|
||||
"migrate.failed.retry": "Réessayer",
|
||||
"migrate.failed.title": "Échec de la migration",
|
||||
"migrate.success.description": "Toutes vos applications, données d'application et détails de compte ont été migrés vers votre Umbrel Home.",
|
||||
"migrate.success.title": "Migration réussie",
|
||||
"migration-assistant": "Assistant de migration",
|
||||
"migration-assistant-description": "Transférer toutes vos applications et données d'un Raspberry Pi à Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "L'Assistant de migration prend actuellement en charge le transfert de toutes les données et applications d'un Raspberry Pi exécutant umbrelOS vers l'Umbrel Home. Ouvrez l'Assistant de migration sur votre Umbrel Home pour commencer.",
|
||||
"migration-assistant.continue-migration.ready.submit": "Commencer la migration",
|
||||
"migration-assistant.failed": "Quelque chose ne va pas...",
|
||||
"migration-assistant.failed.retrying-message": "Nouvelle tentative...",
|
||||
"unknown-error": "Erreur inconnue",
|
||||
"migration-assistant.mobile.start-button": "Commencer la migration",
|
||||
"migration-assistant.prep.body": "Préparation à la migration",
|
||||
"migration-assistant.prep.button-continue": "Continuer",
|
||||
"migration-assistant.prep.callout": "Les données sur votre Umbrel Home, le cas échéant, seront définitivement supprimées.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Connectez son disque externe à n'importe quel port USB de votre Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Une fois terminé, cliquez sur '{{button}}' ci-dessous.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Éteignez votre Umbrel Raspberry Pi.",
|
||||
"migration-assistant.ready.description": "Toutes vos données et applications sont prêtes à être migrées vers votre Umbrel Home",
|
||||
"migration-assistant.ready.hint-header": "Choses à garder à l'esprit",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Cela aide à éviter les problèmes avec des applications telles que Lightning Node",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Gardez votre Raspberry Pi éteint après la mise à jour",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "N'oubliez pas d'utiliser votre mot de passe Umbrel Raspberry Pi pour vous connecter à votre Umbrel Home",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Utilisez le même mot de passe",
|
||||
"migration-assistant.ready.title": "Tout est prêt pour la migration !",
|
||||
"name": "Nom",
|
||||
"no-forgot-password-message": "Si vous perdez votre mot de passe, vous ne pourrez pas vous connecter à votre Umbrel. Assurez-vous de le sécuriser soigneusement.",
|
||||
"no-results-found": "Aucun résultat trouvé",
|
||||
"not-found-404": "Code d'erreur : 404",
|
||||
"not-found-404.back": "Retour",
|
||||
"not-found-404.home": "Aller à l'accueil",
|
||||
"notifications.cpu.too-hot": "Température élevée du CPU",
|
||||
"notifications.memory.low": "La mémoire de votre appareil est faible",
|
||||
"notifications.new-version-available": "{{update}} est maintenant disponible à l'installation",
|
||||
"notifications.storage.full": "Le stockage de votre appareil est plein",
|
||||
"notifications.view": "Voir",
|
||||
"ok": "OK",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "En cliquant sur 'Suivant', vous acceptez les <linked>conditions d'utilisation d'umbrelOS</linked>",
|
||||
"onboarding.account-created.next": "Suivant",
|
||||
"onboarding.account-created.subtitle": "Votre Umbrel est maintenant prêt.",
|
||||
"onboarding.account-created.youre-all-set-name": "Tout est prêt, {{name}}.",
|
||||
"onboarding.contact-support": "Support",
|
||||
"onboarding.create-account": "Créer un compte",
|
||||
"onboarding.create-account.confirm-password.input-label": "Confirmer le mot de passe",
|
||||
"onboarding.create-account.failed.name-required": "Le nom est requis",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Les mots de passe ne correspondent pas",
|
||||
"onboarding.create-account.name.input-placeholder": "Votre nom",
|
||||
"onboarding.create-account.password.input-label": "Mot de passe",
|
||||
"onboarding.create-account.submit": "Créer",
|
||||
"onboarding.create-account.submitting": "Création",
|
||||
"onboarding.create-account.subtitle": "Les informations de votre compte sont stockées uniquement sur votre Umbrel. Assurez-vous de sauvegarder votre mot de passe en toute sécurité car il n'y a aucun moyen de le réinitialiser.",
|
||||
"onboarding.start.continue": "Commencer",
|
||||
"onboarding.start.subtitle": "Votre serveur cloud domestique est prêt à être configuré.",
|
||||
"onboarding.start.title": "Bienvenue sur umbrelOS",
|
||||
"open": "Ouvrir",
|
||||
"open-live-usage": "Ouvrir l'utilisation en direct",
|
||||
"password": "Mot de passe",
|
||||
"preferences": "Préférences",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"read-less": "Lire moins",
|
||||
"read-more": "Lire plus",
|
||||
"redirect.to-home": "Chargement...",
|
||||
"redirect.to-login": "Chargement...",
|
||||
"redirect.to-onboarding": "Chargement...",
|
||||
"remote-tor-access": "Accès Tor à distance",
|
||||
"restart": "Redémarrer",
|
||||
"restart.confirm.submit": "Redémarrer",
|
||||
"restart.confirm.title": "Êtes-vous sûr de vouloir redémarrer votre Umbrel ?",
|
||||
"restart.restarting": "Redémarrage",
|
||||
"restart.restarting-message": "Veuillez ne pas actualiser cette page ou éteindre votre Umbrel pendant le redémarrage.",
|
||||
"retry": "Réessayer",
|
||||
"search": "Recherche",
|
||||
"settings": "Paramètres",
|
||||
"settings.app-store-preferences.title": "Préférences de l'App Store",
|
||||
"settings.contact-support": "Besoin d'aide ? <linked>Contactez le support.</linked>",
|
||||
"shut-down": "Éteindre",
|
||||
"shut-down.complete": "Arrêt complet",
|
||||
"shut-down.complete-text": "Vous pouvez maintenant débrancher votre appareil.",
|
||||
"shut-down.confirm.submit": "Éteindre",
|
||||
"shut-down.confirm.title": "Êtes-vous sûr de vouloir éteindre votre Umbrel ?",
|
||||
"shut-down.shutting-down": "Arrêt en cours",
|
||||
"shut-down.shutting-down-message": "Veuillez ne pas actualiser cette page ou éteindre votre Umbrel pendant l'arrêt.",
|
||||
"software-update.callout": "Veuillez ne pas actualiser cette page ou éteindre votre Umbrel pendant la mise à jour.",
|
||||
"software-update.check": "Vérifier la mise à jour",
|
||||
"software-update.checking": "Recherche de mise à jour...",
|
||||
"software-update.current-running": "Vous utilisez",
|
||||
"software-update.failed": "Échec de la mise à jour",
|
||||
"software-update.failed-to-check": "Échec de la vérification des mises à jour",
|
||||
"software-update.failed.retry": "Réessayer",
|
||||
"software-update.install-now": "Installer maintenant",
|
||||
"app-updates.no-updates": "Toutes les applications sont à jour !",
|
||||
"continue": "Continuer",
|
||||
"app.stopped": "Arrêté",
|
||||
"software-update.new-version": "Nouvelle version d'{{name}} disponible à l'installation",
|
||||
"software-update.on-latest": "Vous utilisez la dernière version d'umbrelOS",
|
||||
"software-update.title": "Mise à jour logicielle",
|
||||
"software-update.updating-to": "Mise à jour vers {{name}}",
|
||||
"software-update.view": "Voir",
|
||||
"something-left": "{{left}} restant",
|
||||
"something-went-wrong": "⚠ Un problème est survenu",
|
||||
"start": "Démarrer",
|
||||
"stop": "Arrêter",
|
||||
"storage": "Stockage",
|
||||
"storage.full": "Stockage plein",
|
||||
"storage.low": "Stockage faible",
|
||||
"temp.dangerously-hot": "Très chaud",
|
||||
"temp.nice": "Agréable",
|
||||
"temp.normal": "Normal",
|
||||
"temp.warm": "Tiède",
|
||||
"temperature": "Température",
|
||||
"temperature.too-hot-suggestion": "Envisagez de changer l'environnement de votre appareil.",
|
||||
"terminal": "Terminal",
|
||||
"terminal-description": "Exécutez des commandes personnalisées dans umbrelOS ou au sein d'une application",
|
||||
"terminal.umbrelos-description": "Exécutez des commandes personnalisées dans umbrelOS",
|
||||
"terminal.app": "App",
|
||||
"terminal.app-description": "Exécutez des commandes personnalisées dans une application spécifique",
|
||||
"open": "Ouvrir",
|
||||
"advanced-settings": "Paramètres avancés",
|
||||
"advanced-settings-description": "Ouvrez le terminal ou inscrivez-vous au programme bêta d'umbrelOS",
|
||||
"beta-program": "Programme bêta d'umbrelOS",
|
||||
"beta-program-description": "Optez pour recevoir des mises à jour bêta d'umbrelOS, accédez en avant-première à de nouvelles fonctionnalités et aidez-nous à les peaufiner en fournissant vos retours. Les mises à jour bêta peuvent être instables, et le dépannage peut nécessiter une familiarité avec le terminal."
|
||||
}
|
||||
"terminal.umbrelos-description": "Exécutez des commandes personnalisées dans umbrelOS",
|
||||
"tor-description": "Accédez à votre Umbrel de n'importe où en utilisant un navigateur Tor",
|
||||
"tor.disable.description": "Cela peut prendre quelques minutes",
|
||||
"tor.disable.progress": "Désactivation de l'accès Tor à distance",
|
||||
"tor.disable.success": "Accès Tor à distance désactivé",
|
||||
"tor.enable.description": "Cela peut prendre quelques minutes",
|
||||
"tor.enable.mobile.switch-label": "Activer l'accès Tor à distance",
|
||||
"tor.enable.submit": "Activer",
|
||||
"tor.enable.success": "Accès Tor à distance activé",
|
||||
"tor.enable.title": "Activer l'accès Tor à distance",
|
||||
"tor.hidden-service": "URL du service caché Tor",
|
||||
"troubleshoot": "Dépannage",
|
||||
"troubleshoot-description": "Dépanner umbrelOS ou une application",
|
||||
"troubleshoot-no-logs-yet": "Aucun journal pour le moment",
|
||||
"troubleshoot-pick-title": "Dépannage",
|
||||
"troubleshoot.app": "Application",
|
||||
"troubleshoot.app-description": "Voir les journaux d'une application installée sur votre Umbrel",
|
||||
"troubleshoot.app-download": "Télécharger les journaux de {{app}}",
|
||||
"troubleshoot.share-with-umbrel-support": "Partager avec le support Umbrel",
|
||||
"troubleshoot.system-download": "Télécharger {{label}}",
|
||||
"troubleshoot.umbrelos-description": "Afficher les journaux umbrelOS",
|
||||
"troubleshoot.umbrelos-logs": "Journaux umbrelOS",
|
||||
"trpc.backend-unavailable": "Erreur : Connexion à l'API système échouée",
|
||||
"trpc.checking-backend": "Chargement...",
|
||||
"try-again": "Réessayer",
|
||||
"umbrel": "Umbrel",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"umbrelos": "umbrelOS",
|
||||
"unknown": "Inconnu",
|
||||
"unknown-app": "Application inconnue",
|
||||
"unknown-error": "Erreur inconnue",
|
||||
"uptime": "Temps de fonctionnement",
|
||||
"wallpaper": "Fond d'écran",
|
||||
"wallpaper-description": "Votre fond d'écran et thème Umbrel",
|
||||
"widget.progress.in-progress": "En cours",
|
||||
"widgets.edit.select-up-to-3-widgets": "Sélectionnez jusqu'à 3 widgets",
|
||||
"widgets.install-an-app-before-using-widgets": "Installez une application pour commencer à personnaliser votre écran d'accueil avec des widgets.",
|
||||
"wifi": "Wi-Fi",
|
||||
"wifi-connect-insecure-message": "Les réseaux ouverts peuvent être peu sécurisés",
|
||||
"wifi-connection-failed": "Impossible de se connecter",
|
||||
"wifi-dangerous-change-confirmation-description": "Changer de réseau Wi-Fi peut vous déconnecter de votre Umbrel. Pour vous reconnecter, assurez-vous que votre Umbrel et l'appareil à partir duquel vous y accédez sont sur le même réseau.",
|
||||
"wifi-dangerous-change-confirmation-title": "Êtes-vous sûr de vouloir changer de réseau Wi-Fi ?",
|
||||
"wifi-dangerous-disable-confirmation-description": "Désactiver le Wi-Fi peut vous déconnecter de votre Umbrel. Pour vous reconnecter, branchez un câble Ethernet à votre Umbrel et assurez-vous que votre Umbrel et l'appareil à partir duquel vous y accédez sont sur le même réseau.",
|
||||
"wifi-dangerous-disable-confirmation-title": "Êtes-vous sûr de vouloir désactiver le Wi-Fi ?",
|
||||
"wifi-description": "Connectez votre appareil à un réseau Wi-Fi",
|
||||
"wifi-description-long": "Votre appareil reste connecté à votre Wi-Fi choisi, même si le câble Ethernet est retiré, et se reconnecte automatiquement au Wi-Fi au démarrage.",
|
||||
"wifi-no-networks-message": "Aucun réseau Wi-Fi trouvé",
|
||||
"wifi-searching": "Recherche de réseaux Wi-Fi...",
|
||||
"wifi-unsupported-device-description": "Le Wi-Fi n'est pas pris en charge sur cet appareil. Cela peut être dû à un adaptateur sans fil manquant ou incompatible.",
|
||||
"wifi-view-networks": "Voir les réseaux"
|
||||
}
|
||||
@@ -0,0 +1,371 @@
|
||||
{
|
||||
"2fa": "2FA",
|
||||
"2fa-description": "Egy második biztonsági réteg az Umbrel bejelentkezésedhez és az alkalmazásaidhoz",
|
||||
"2fa.disable.success": "Kétlépcsős azonosítás letiltva",
|
||||
"2fa.disable.title": "Kétlépcsős azonosítás letiltása",
|
||||
"2fa.enable.or-paste": "Vagy illeszd be a következő kódot az hitelesítő alkalmazásodba",
|
||||
"2fa.enable.scan-this": "Olvasd be ezt a QR-kódot egy hitelesítő alkalmazással, például a Google Authenticator vagy az Authy segítségével",
|
||||
"2fa.enable.success": "Kétlépcsős azonosítás engedélyezve",
|
||||
"2fa.enable.title": "Kétlépcsős azonosítás engedélyezése",
|
||||
"2fa.enter-code": "Add meg a hitelesítő alkalmazásod által megjelenített kódot",
|
||||
"account": "Fiók",
|
||||
"account-description": "A neved és jelszavad",
|
||||
"advanced-settings": "Haladó beállítások",
|
||||
"advanced-settings-description": "Terminál megnyitása vagy feliratkozás az umbrelOS Beta Programba",
|
||||
"app-not-found": "Alkalmazás nem található: {{app}}",
|
||||
"app-only-over-tor": "A {{app}} csak Tor-on keresztül használható. Kérjük, az alkalmazás megnyitásához lépj be az Umbrel-be egy Tor böngészőben a távoli hozzáférési URL-en (Beállítások > Távoli Tor hozzáférés).",
|
||||
"app-page.section.about": "Rólunk",
|
||||
"app-page.section.credentials.title": "Alapértelmezett hitelesítési adatok",
|
||||
"app-page.section.info.compatibility": "Kompatibilitás",
|
||||
"app-page.section.info.compatibility-compatible": "Kompatibilis",
|
||||
"app-page.section.info.developer": "Fejlesztő",
|
||||
"app-page.section.info.source-code": "Forráskód",
|
||||
"app-page.section.info.source-code.public": "Nyilvános",
|
||||
"app-page.section.info.submitted-by": "Beküldte",
|
||||
"app-page.section.info.title": "Információ",
|
||||
"app-page.section.info.version": "Verzió",
|
||||
"app-page.section.recommendations.title": "Neked is tetszhet",
|
||||
"app-page.section.release-notes.title": "Újdonságok",
|
||||
"app-page.section.release-notes.version": "{{version}} verzió",
|
||||
"app-page.section.requires": "Követelmények",
|
||||
"app-page.section.requires.support": "Támogatás kérése",
|
||||
"app-picker.search": "Keresés...",
|
||||
"app-picker.select-app": "Válassz alkalmazást...",
|
||||
"app-store.browse-category-apps": "Böngészd a(z) {{category}} alkalmazásokat",
|
||||
"app-store.category.ai": "AI",
|
||||
"app-store.category.all": "Összes alkalmazás",
|
||||
"app-store.category.automation": "Otthon és automatizáció",
|
||||
"app-store.category.bitcoin": "Bitcoin",
|
||||
"app-store.category.developer": "Fejlesztői eszközök",
|
||||
"app-store.category.discover": "Felfedezés",
|
||||
"app-store.category.files": "Fájlok és termelékenység",
|
||||
"app-store.category.finance": "Pénzügy",
|
||||
"app-store.category.media": "Média",
|
||||
"app-store.category.networking": "Hálózat",
|
||||
"app-store.category.social": "Közösségi",
|
||||
"app-store.description": "Az alkalmazásfrissítési beállításaid",
|
||||
"app-store.menu.community-app-stores": "Közösségi alkalmazásboltok",
|
||||
"app-store.search-apps": "Alkalmazások keresése",
|
||||
"app-store.search.no-results": "Nincs találat",
|
||||
"app-store.search.results-for": "Eredmények erre",
|
||||
"app-store.title": "Alkalmazásbolt",
|
||||
"app-updates.less": "kevesebb",
|
||||
"app-updates.more": "több",
|
||||
"app-updates.no-updates": "Minden alkalmazás naprakész!",
|
||||
"app-updates.update": "Frissítés",
|
||||
"app-updates.update-all": "Összes frissítése",
|
||||
"app-updates.updates-available-count_one": "{{count}} frissítés elérhető",
|
||||
"app-updates.updates-available-count_other": "{{count}} frissítés elérhető",
|
||||
"app-updates.updating": "Frissítés...",
|
||||
"app.install": "Telepítés",
|
||||
"app.installing": "Telepítés folyamatban",
|
||||
"app.offline": "Nem fut",
|
||||
"app.open": "Megnyitás",
|
||||
"app.optimized-for-umbrel-home": "Optimalizált az Umbrel Home-hoz",
|
||||
"app.restarting": "Újraindítás",
|
||||
"app.starting": "Indítás",
|
||||
"app.stopped": "Leállítva",
|
||||
"app.stopping": "Leállítás",
|
||||
"app.uninstall.confirm.description": "Az {{app}}-hez tartozó összes adat véglegesen törlésre kerül. Ez a művelet nem vonható vissza.",
|
||||
"app.uninstall.confirm.submit": "Eltávolítás",
|
||||
"app.uninstall.confirm.title": "{{app}} eltávolítása?",
|
||||
"app.uninstall.deps.used-by.description_one": "Először távolítsd el a(z) {{firstAppToUninstall}} alkalmazást az {{app}} eltávolításához.",
|
||||
"app.uninstall.deps.used-by.description_other": "Először távolítsd el ezeket az alkalmazásokat az {{app}} eltávolításához.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} használja",
|
||||
"app.uninstalling": "Eltávolítás",
|
||||
"app.updating": "Frissítés",
|
||||
"app.view": "Megtekintés",
|
||||
"app_one": "alkalmazás",
|
||||
"app_other": "alkalmazások",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Nem sikerült megszerezni a szükséges alkalmazásokat",
|
||||
"apps.uninstalled-all.success": "Minden alkalmazás eltávolítva",
|
||||
"auth.checking-backend-for-user": "Betöltés...",
|
||||
"auth.failed-checking-if-user-logged-in": "Hiba: Nem sikerült ellenőrizni a bejelentkezést",
|
||||
"auth.failed-to-check-if-user-exists": "Hiba: Nem sikerült ellenőrizni a felhasználó létezését",
|
||||
"beta-program": "umbrelOS Beta Program",
|
||||
"beta-program-description": "Iratkozz fel az umbrelOS béta frissítésekre, szerezd meg az új funkciók korai hozzáférését, és segíts fejleszteni azokat a visszajelzéseiddel. A béta frissítések instabilak lehetnek, és a hibaelhárítás terminál ismereteket igényelhet.",
|
||||
"cancel": "Mégse",
|
||||
"change": "Változtatás",
|
||||
"change-name": "Név változtatása",
|
||||
"change-name.failed.name-required": "A név megadása kötelező",
|
||||
"change-name.input-placeholder": "A te neved",
|
||||
"change-password": "Jelszó változtatása",
|
||||
"change-password.callout": "Ha elveszted a jelszavad, nem tudsz majd bejelentkezni az Umbrel-be. Biztosítsd, hogy biztonságosan tárolod.",
|
||||
"change-password.current-password": "Jelenlegi jelszó",
|
||||
"change-password.failed.current-required": "A jelenlegi jelszó megadása kötelező",
|
||||
"change-password.failed.min-length": "A jelszónak legalább {{characters}} karakter hosszúnak kell lennie",
|
||||
"change-password.failed.must-be-unique": "Az új jelszónak különböznie kell a jelenlegitől",
|
||||
"change-password.failed.new-required": "Az új jelszó megadása kötelező",
|
||||
"change-password.failed.no-match": "A jelszavak nem egyeznek",
|
||||
"change-password.failed.repeat-required": "A jelszó ismétlése kötelező",
|
||||
"change-password.new-password": "Új jelszó",
|
||||
"change-password.repeat-password": "Jelszó ismétlése",
|
||||
"check-for-latest-version": "Legfrissebb umbrelOS frissítés ellenőrzése",
|
||||
"clipboard.copied": "Másolva",
|
||||
"close": "Bezárás",
|
||||
"cmdk.change-wallpaper": "Háttérkép megváltoztatása",
|
||||
"cmdk.frequent-apps": "Gyakran használt",
|
||||
"cmdk.input-placeholder": "Keresés alkalmazások, beállítások vagy műveletek között",
|
||||
"cmdk.install-from-app-store": "az App Store-ból",
|
||||
"cmdk.live-usage": "Élő használat",
|
||||
"cmdk.restart-umbrel": "Umbrel újraindítása",
|
||||
"cmdk.shutdown-umbrel": "Umbrel leállítása",
|
||||
"cmdk.update-all-apps": "Összes alkalmazás frissítése",
|
||||
"cmdk.widgets": "Widgetek",
|
||||
"community-app-store": "Közösségi Alkalmazásbolt",
|
||||
"community-app-store.back-to-umbrel-app-store": "Vissza az Umbrel Alkalmazásboltba",
|
||||
"community-app-store.open-button": "Megnyitás",
|
||||
"community-app-store.remove-button": "Eltávolítás",
|
||||
"community-app-stores.add-button": "Hozzáadás",
|
||||
"community-app-stores.description": "A Közösségi Alkalmazásboltok lehetővé teszik, hogy olyan alkalmazásokat telepíts az Umbrel-re, amelyek nem elérhetőek az hivatalos Umbrel Alkalmazásboltban. Ezen kívül egyszerűvé teszik az Umbrel alkalmazások béta verzióinak tesztelését, mielőtt a fejlesztők kiadják őket az hivatalos Umbrel Alkalmazásboltban.",
|
||||
"community-app-stores.learn-more": "Tudj meg többet",
|
||||
"community-app-stores.warning": "A Közösségi Alkalmazásboltokat bárki létrehozhatja. Az ezekben közzétett alkalmazásokat nem ellenőrzi vagy vizsgálja az hivatalos Umbrel Alkalmazásbolt csapata, és potenciálisan nem biztonságosak vagy rosszindulatúak lehetnek. Legyél óvatos, és csak olyan alkalmazásboltokat adj hozzá, amelyeket megbízható fejlesztők készítettek.",
|
||||
"confirm": "Megerősítés",
|
||||
"connecting": "Csatlakozás...",
|
||||
"continue": "Folytatás",
|
||||
"continue-to-log-in": "Folytatás a bejelentkezéshez",
|
||||
"cpu": "CPU",
|
||||
"cpu-core-count": "{{cores}} szál",
|
||||
"create-user": "Felhasználó létrehozása",
|
||||
"default-credentials.close": "Rendben",
|
||||
"default-credentials.description": "Itt találod a bejelentkezéshez szükséges hitelesítési adatokat.",
|
||||
"default-credentials.dont-show-again": "Ne mutasd újra ezt",
|
||||
"default-credentials.open": "Nyisd meg a(z) {{app}} alkalmazást",
|
||||
"default-credentials.password": "Alapértelmezett jelszó",
|
||||
"default-credentials.title": "{{app}} hitelesítési adatai",
|
||||
"default-credentials.username": "Alapértelmezett felhasználónév",
|
||||
"desktop.app.context.go-to-store-page": "Megtekintés az Alkalmazásboltban",
|
||||
"desktop.app.context.show-default-credentials": "Alapértelmezett hitelesítési adatok megjelenítése",
|
||||
"desktop.app.context.uninstall": "Eltávolítás",
|
||||
"desktop.context-menu.change-wallpaper": "Háttérkép megváltoztatása",
|
||||
"desktop.context-menu.edit-widgets": "Widgetek szerkesztése",
|
||||
"desktop.context-menu.logout": "Kijelentkezés",
|
||||
"desktop.greeting.afternoon": "Jó délutánt, {{name}}",
|
||||
"desktop.greeting.evening": "Jó estét, {{name}}",
|
||||
"desktop.greeting.morning": "Jó reggelt, {{name}}",
|
||||
"desktop.install-first.for-the-bitcoiner": "A Bitcoin felhasználóknak",
|
||||
"desktop.install-first.for-the-self-hoster": "Az önálló hosztok számára",
|
||||
"desktop.install-first.for-the-streamer": "A streamerek számára",
|
||||
"desktop.install-first.link-to-app-store": "Fedezz fel többet az App Store-ban",
|
||||
"desktop.not-enough-room": "Használj nagyobb képernyőt az alkalmazások megtekintéséhez.",
|
||||
"device": "Eszköz",
|
||||
"device-info": "Eszközinformációk",
|
||||
"device-info-description": "Információk az eszközödről",
|
||||
"device-info.device": "Eszköz",
|
||||
"device-info.model-number": "Modellszám",
|
||||
"device-info.serial-number": "Sorozatszám",
|
||||
"device-info.view-info": "Információ megtekintése",
|
||||
"disable": "Letiltás",
|
||||
"download-logs": "Naplók letöltése",
|
||||
"factory-reset": "Gyári beállítások visszaállítása",
|
||||
"factory-reset.confirm.body": "Erősítsd meg az Umbrel jelszavad a visszaállításhoz",
|
||||
"factory-reset.confirm.password-label": "Jelszó megadása",
|
||||
"factory-reset.confirm.submit": "Mindent törölni és visszaállítani",
|
||||
"factory-reset.confirm.submit-callout": "Ez a művelet nem vonható vissza.",
|
||||
"factory-reset.desc": "Az összes umbrelOS adat és alkalmazás törlése",
|
||||
"factory-reset.failed.message": "Hiba történt a visszaállítás során",
|
||||
"factory-reset.failed.retry": "Visszaállítás újrapróbálása",
|
||||
"factory-reset.failed.title": "Visszaállítás sikertelen",
|
||||
"factory-reset.reset": "Visszaállítás",
|
||||
"factory-reset.resetting.connecting": "Csatlakozás",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Ne kapcsold ki az eszközöd, amíg a visszaállítás be nem fejeződik",
|
||||
"factory-reset.review.account-info": "Fiókinformációk és jelszó",
|
||||
"factory-reset.review.apps": "Alkalmazások",
|
||||
"factory-reset.review.following-will-be-removed": "A következő elemek kerülnek eltávolításra az eszközödről",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} telepített alkalmazás",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} telepített alkalmazás",
|
||||
"factory-reset.review.submit": "Folytatás",
|
||||
"factory-reset.review.total-data": "Összes adat",
|
||||
"factory-reset.success.description": "Az összes alkalmazásod, alkalmazásadataid és fiókadataid törölve lettek az eszközödről. Most újraindíthatod az eszközöd.",
|
||||
"factory-reset.success.restart-device": "Eszköz újraindítása",
|
||||
"factory-reset.success.title": "Sikeres visszaállítás",
|
||||
"hello": "Helló",
|
||||
"install-first.description_one": "Telepítsd ezt az alkalmazást a(z) {{app}} telepítéséhez.",
|
||||
"install-first.description_other": "Telepítsd ezeket az alkalmazásokat a(z) {{app}} telepítéséhez.",
|
||||
"install-first.title": "{{app}} hozzáférést igényel",
|
||||
"install-your-first-app": "Telepítsd az első alkalmazásod",
|
||||
"language": "Nyelv",
|
||||
"language-description": "Az általad preferált umbrelOS nyelv",
|
||||
"language.select-description": "Válaszd ki az umbrelOS preferált nyelvét",
|
||||
"linux": "Linux",
|
||||
"live-usage": "Élő használat",
|
||||
"loading": "Betöltés",
|
||||
"local-ip": "Helyi IP",
|
||||
"login-2fa.subtitle": "Add meg a hitelesítő alkalmazásod által megjelenített 2FA kódot",
|
||||
"login-2fa.title": "Hitelesítés",
|
||||
"login-with-umbrel.description": "Add meg az Umbrel jelszavad a(z) {{app}} megnyitásához",
|
||||
"login-with-umbrel.title": "Bejelentkezés Umbrel-lel",
|
||||
"login.password-label": "Jelszó",
|
||||
"login.password.submit": "Bejelentkezés",
|
||||
"login.subtitle": "Add meg az Umbrel jelszavad a bejelentkezéshez",
|
||||
"login.title": "Üdv újra",
|
||||
"logout": "Kijelentkezés",
|
||||
"logout-error-generic": "Hiba: Kijelentkezés sikertelen",
|
||||
"logout.confirm.submit": "Kijelentkezés",
|
||||
"logout.confirm.title": "Biztosan kijelentkezel?",
|
||||
"memory": "Memória",
|
||||
"memory.low": "Kevés memória",
|
||||
"migrate": "Átvitel",
|
||||
"migrate.callout": "Ne kapcsold ki az Umbrel-t, amíg az átvitel be nem fejeződik",
|
||||
"migrate.failed.retry": "Újrapróbálás",
|
||||
"migrate.failed.title": "Átvitel sikertelen",
|
||||
"migrate.success.description": "Az összes alkalmazásod, alkalmazásadataid és fiókadataid át lettek helyezve az Umbrel Home-ba.",
|
||||
"migrate.success.title": "Sikeres átvitel",
|
||||
"migration-assistant": "Átvitel Segéd",
|
||||
"migration-assistant-description": "Minden alkalmazásod és adatod átvitele egy Raspberry Pi-ról az Umbrel Home-ra",
|
||||
"migration-assistant-unsupported-device-description": "Az Átvitel Segéd jelenleg támogatja az összes adat és alkalmazás átvitelét egy umbrelOS-t futtató Raspberry Pi-ról az Umbrel Home-ra. Nyisd meg az Átvitel Segédet az Umbrel Home-odon a kezdéshez.",
|
||||
"migration-assistant.continue-migration.ready.submit": "Átvitel indítása",
|
||||
"migration-assistant.failed": "Valami nem stimmel...",
|
||||
"migration-assistant.failed.retrying-message": "Újrapróbálkozás...",
|
||||
"migration-assistant.mobile.start-button": "Átvitel indítása",
|
||||
"migration-assistant.prep.body": "Készülj fel az átvitelre",
|
||||
"migration-assistant.prep.button-continue": "Folytatás",
|
||||
"migration-assistant.prep.callout": "Az adatok az Umbrel Home-on, ha vannak, véglegesen törlődnek.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Csatlakoztasd a külső merevlemezt az Umbrel Home bármely USB portjához.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Miután végeztél, kattints az alábbi '{{button}}' gombra.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Kapcsold ki a Raspberry Pi Umbrel-t.",
|
||||
"migration-assistant.ready.description": "Az összes adatod és alkalmazásod készen áll az Umbrel Home-ra való átvitelre",
|
||||
"migration-assistant.ready.hint-header": "Fontos megjegyezni",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Ez segít megelőzni a problémákat az olyan alkalmazásokkal, mint a Lightning Node",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Tartsd kikapcsolva a Raspberry Pi-t a frissítés után",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Ne felejtsd el használni a Raspberry Pi Umbrel jelszavad az Umbrel Home-ba való bejelentkezéshez",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Használd ugyanazt a jelszót",
|
||||
"migration-assistant.ready.title": "Készen állsz az átvitelre!",
|
||||
"name": "Név",
|
||||
"no-forgot-password-message": "Ha elveszted a jelszavad, nem fogsz tudni bejelentkezni az Umbrel-be. Biztosítsd, hogy biztonságosan tárolod.",
|
||||
"no-results-found": "Nincs találat",
|
||||
"not-found-404": "Hibakód: 404",
|
||||
"not-found-404.back": "Vissza",
|
||||
"not-found-404.home": "Vissza a Főoldalra",
|
||||
"notifications.cpu.too-hot": "Magas CPU hőmérséklet",
|
||||
"notifications.memory.low": "Az eszközöd memóriája alacsony",
|
||||
"notifications.new-version-available": "{{update}} most elérhető a telepítéshez",
|
||||
"notifications.storage.full": "Az eszközöd tárhelye megtelt",
|
||||
"notifications.view": "Megtekintés",
|
||||
"ok": "OK",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "A 'Tovább' gombra kattintva elfogadod az <linked>umbrelOS Felhasználási feltételeit</linked>",
|
||||
"onboarding.account-created.next": "Tovább",
|
||||
"onboarding.account-created.subtitle": "Az Umbrel most készen áll.",
|
||||
"onboarding.account-created.youre-all-set-name": "Minden készen áll, {{name}}.",
|
||||
"onboarding.contact-support": "Támogatás",
|
||||
"onboarding.create-account": "Fiók létrehozása",
|
||||
"onboarding.create-account.confirm-password.input-label": "Jelszó megerősítése",
|
||||
"onboarding.create-account.failed.name-required": "A név megadása kötelező",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "A jelszavak nem egyeznek",
|
||||
"onboarding.create-account.name.input-placeholder": "A te neved",
|
||||
"onboarding.create-account.password.input-label": "Jelszó",
|
||||
"onboarding.create-account.submit": "Létrehozás",
|
||||
"onboarding.create-account.submitting": "Létrehozás folyamatban",
|
||||
"onboarding.create-account.subtitle": "Az fiók információk csak az Umbrel-eden tárolódnak. Biztosítsd, hogy biztonságosan tárolod a jelszavad, mivel nincs mód annak visszaállítására.",
|
||||
"onboarding.start.continue": "Kezdés",
|
||||
"onboarding.start.subtitle": "Az otthoni felhő szervered készen áll a beállításra.",
|
||||
"onboarding.start.title": "Üdvözöl az umbrelOS",
|
||||
"open": "Megnyitás",
|
||||
"open-live-usage": "Élő használat megnyitása",
|
||||
"password": "Jelszó",
|
||||
"preferences": "Beállítások",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"read-less": "Kevesebb olvasása",
|
||||
"read-more": "Több olvasása",
|
||||
"redirect.to-home": "Betöltés...",
|
||||
"redirect.to-login": "Betöltés...",
|
||||
"redirect.to-onboarding": "Betöltés...",
|
||||
"remote-tor-access": "Távoli Tor hozzáférés",
|
||||
"restart": "Újraindítás",
|
||||
"restart.confirm.submit": "Újraindítás",
|
||||
"restart.confirm.title": "Biztosan újra akarod indítani az Umbrel-t?",
|
||||
"restart.restarting": "Újraindítás",
|
||||
"restart.restarting-message": "Ne frissítsd ezt az oldalt vagy kapcsold ki az Umbrel-t, amíg újraindul.",
|
||||
"retry": "Újrapróbálás",
|
||||
"search": "Keresés",
|
||||
"settings": "Beállítások",
|
||||
"settings.app-store-preferences.title": "Alkalmazásbolt beállításai",
|
||||
"settings.contact-support": "Segítségre van szükséged? <linked>Lépj kapcsolatba a támogatással.</linked>",
|
||||
"shut-down": "Leállítás",
|
||||
"shut-down.complete": "Leállítás kész",
|
||||
"shut-down.complete-text": "Most már kihúzhatod az eszközt az áramforrásból.",
|
||||
"shut-down.confirm.submit": "Leállítás",
|
||||
"shut-down.confirm.title": "Biztosan le akarod állítani az Umbrel-t?",
|
||||
"shut-down.shutting-down": "Leállítás",
|
||||
"shut-down.shutting-down-message": "Ne frissítsd ezt az oldalt vagy kapcsold ki az Umbrel-t, amíg leáll.",
|
||||
"software-update.callout": "Ne frissítsd ezt az oldalt vagy kapcsold ki az Umbrel-t, amíg frissít.",
|
||||
"software-update.check": "Frissítés ellenőrzése",
|
||||
"software-update.checking": "Frissítés ellenőrzése...",
|
||||
"software-update.current-running": "Az aktuális verzió",
|
||||
"software-update.failed": "Frissítés sikertelen",
|
||||
"software-update.failed-to-check": "Nem sikerült ellenőrizni a frissítéseket",
|
||||
"software-update.failed.retry": "Újrapróbálás",
|
||||
"software-update.install-now": "Telepítés most",
|
||||
"software-update.new-version": "Új {{name}} elérhető a telepítéshez",
|
||||
"software-update.on-latest": "A legfrissebb umbrelOS verziót használod",
|
||||
"software-update.title": "Szoftverfrissítés",
|
||||
"software-update.updating-to": "{{name}} frissítése",
|
||||
"software-update.view": "Megtekintés",
|
||||
"something-left": "{{left}} maradt",
|
||||
"something-went-wrong": "⚠ Valami hiba történt",
|
||||
"start": "Indítás",
|
||||
"stop": "Leállítás",
|
||||
"storage": "Tárhely",
|
||||
"storage.full": "Tárhely megtelt",
|
||||
"storage.low": "Kevés tárhely",
|
||||
"temp.dangerously-hot": "Nagyon forró",
|
||||
"temp.nice": "Kellemes",
|
||||
"temp.normal": "Normál",
|
||||
"temp.warm": "Meleg",
|
||||
"temperature": "Hőmérséklet",
|
||||
"temperature.too-hot-suggestion": "Fontold meg az eszköz környezetének megváltoztatását.",
|
||||
"terminal": "Terminál",
|
||||
"terminal-description": "Egyedi parancsok futtatása az umbrelOS-ben vagy egy alkalmazáson belül",
|
||||
"terminal.app": "Alkalmazás",
|
||||
"terminal.app-description": "Egyedi parancsok futtatása egy adott alkalmazáson belül",
|
||||
"terminal.umbrelos-description": "Egyedi parancsok futtatása az umbrelOS-ben",
|
||||
"tor-description": "Hozzáférés az Umbrel-hez bárhonnan egy Tor böngésző segítségével",
|
||||
"tor.disable.description": "Ez néhány percet igénybe vehet",
|
||||
"tor.disable.progress": "Távoli Tor hozzáférés letiltása",
|
||||
"tor.disable.success": "Távoli Tor hozzáférés letiltva",
|
||||
"tor.enable.description": "Ez néhány percet igénybe vehet",
|
||||
"tor.enable.mobile.switch-label": "Távoli Tor hozzáférés engedélyezése",
|
||||
"tor.enable.submit": "Engedélyezés",
|
||||
"tor.enable.success": "Távoli Tor hozzáférés engedélyezve",
|
||||
"tor.enable.title": "Távoli Tor hozzáférés engedélyezése",
|
||||
"tor.hidden-service": "Tor rejtett szolgáltatás URL",
|
||||
"troubleshoot": "Hibaelhárítás",
|
||||
"troubleshoot-description": "umbrelOS vagy egy alkalmazás hibaelhárítása",
|
||||
"troubleshoot-no-logs-yet": "Nincs napló",
|
||||
"troubleshoot-pick-title": "Hibaelhárítás",
|
||||
"troubleshoot.app": "Alkalmazás",
|
||||
"troubleshoot.app-description": "Egy alkalmazás naplóinak megtekintése az Umbrel-en",
|
||||
"troubleshoot.app-download": "{{app}} naplók letöltése",
|
||||
"troubleshoot.share-with-umbrel-support": "Megosztás az Umbrel támogatással",
|
||||
"troubleshoot.system-download": "{{label}} letöltése",
|
||||
"troubleshoot.umbrelos-description": "umbrelOS naplók megtekintése",
|
||||
"troubleshoot.umbrelos-logs": "umbrelOS naplók",
|
||||
"trpc.backend-unavailable": "Hiba: Nem sikerült kapcsolódni a rendszer API-hoz",
|
||||
"trpc.checking-backend": "Betöltés...",
|
||||
"try-again": "Újrapróbálás",
|
||||
"umbrel": "Umbrel",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"umbrelos": "umbrelOS",
|
||||
"unknown": "Ismeretlen",
|
||||
"unknown-app": "Ismeretlen alkalmazás",
|
||||
"unknown-error": "Ismeretlen hiba",
|
||||
"uptime": "Üzemidő",
|
||||
"wallpaper": "Háttérkép",
|
||||
"wallpaper-description": "Az Umbrel háttérképed és témád",
|
||||
"widget.progress.in-progress": "Folyamatban",
|
||||
"widgets.edit.select-up-to-3-widgets": "Válassz ki legfeljebb 3 widgetet",
|
||||
"widgets.install-an-app-before-using-widgets": "Telepíts egy alkalmazást, hogy elkezdhesd testre szabni a kezdőképernyőt widgetekkel.",
|
||||
"wifi": "Wi-Fi",
|
||||
"wifi-connect-insecure-message": "A nyílt hálózatok nem biztonságosak lehetnek",
|
||||
"wifi-connection-failed": "Nem sikerült csatlakozni",
|
||||
"wifi-dangerous-change-confirmation-description": "A Wi-Fi hálózat megváltoztatása megszakíthatja az Umbrel-hez való csatlakozásodat. A csatlakozás helyreállításához győződj meg arról, hogy mind az Umbrel, mind az eszköz, amelyről hozzáférsz, ugyanazon a hálózaton van.",
|
||||
"wifi-dangerous-change-confirmation-title": "Biztosan meg akarod változtatni a Wi-Fi hálózatot?",
|
||||
"wifi-dangerous-disable-confirmation-description": "A Wi-Fi letiltása megszakíthatja az Umbrel-hez való csatlakozásodat. A csatlakozás helyreállításához csatlakoztass egy Ethernet kábelt az Umbrel-hez, és győződj meg arról, hogy mind az Umbrel, mind az eszköz, amelyről hozzáférsz, ugyanazon a hálózaton van.",
|
||||
"wifi-dangerous-disable-confirmation-title": "Biztosan le akarod tiltani a Wi-Fi-t?",
|
||||
"wifi-description": "Csatlakoztasd az eszközödet egy Wi-Fi hálózathoz",
|
||||
"wifi-description-long": "Az eszközöd a választott Wi-Fi-hez marad csatlakozva, még akkor is, ha az Ethernet kábel eltávolításra kerül, és automatikusan újracsatlakozik a Wi-Fi-hez indításkor.",
|
||||
"wifi-no-networks-message": "Nem található Wi-Fi hálózat",
|
||||
"wifi-searching": "Wi-Fi hálózatok keresése...",
|
||||
"wifi-unsupported-device-description": "Ez az eszköz nem támogatja a Wi-Fi-t. Ez hiányzó vagy inkompatibilis vezeték nélküli adapter miatt lehet.",
|
||||
"wifi-view-networks": "Hálózatok megtekintése"
|
||||
}
|
||||
+343
-370
@@ -1,398 +1,371 @@
|
||||
{
|
||||
"hello": "Ciao",
|
||||
"desktop.greeting.morning": "Buongiorno, {{name}}",
|
||||
"desktop.greeting.afternoon": "Buon pomeriggio, {{name}}",
|
||||
"desktop.greeting.evening": "Buona sera, {{name}}",
|
||||
"search": "Cerca",
|
||||
"settings": "Impostazioni",
|
||||
"app-store.title": "App Store",
|
||||
"unknown": "Sconosciuto",
|
||||
"app_one": "app",
|
||||
"app_other": "app",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"linux": "Linux",
|
||||
"install-your-first-app": "Installa la tua prima app",
|
||||
"logout": "Esci",
|
||||
"restart": "Riavvia",
|
||||
"shut-down": "Spegni",
|
||||
"umbrel": "Umbrel",
|
||||
"device": "Dispositivo",
|
||||
"umbrelos": "umbrelOS",
|
||||
"open-live-usage": "Apri Utilizzo in Tempo Reale",
|
||||
"account": "Account",
|
||||
"wallpaper": "Sfondo",
|
||||
"name": "Nome",
|
||||
"password": "Password",
|
||||
"account-description": "Il tuo nome e password",
|
||||
"wallpaper-description": "Il tuo sfondo e tema Umbrel",
|
||||
"2fa-description": "Un secondo livello di sicurezza per il tuo login e app Umbrel",
|
||||
"tor-description": "Accedi al tuo Umbrel da ovunque usando un browser Tor",
|
||||
"migration-assistant": "Assistente di Migrazione",
|
||||
"migration-assistant-description": "Trasferisci tutte le tue app e dati da un Raspberry Pi a Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "L'assistente di migrazione supporta attualmente il trasferimento di tutti i dati e le app da un Raspberry Pi che esegue umbrelOS a Umbrel Home. Apri l'Assistente di migrazione su Umbrel Home per iniziare.",
|
||||
"language": "Lingua",
|
||||
"language-description": "La tua lingua preferita per umbrelOS",
|
||||
"app-store.description": "Le tue impostazioni di aggiornamento app",
|
||||
"migrate": "Migra",
|
||||
"change-name": "Cambia nome",
|
||||
"change-password": "Cambia password",
|
||||
"uptime": "Tempo di attività",
|
||||
"preferences": "Preferenze",
|
||||
"troubleshoot": "Risoluzione problemi",
|
||||
"troubleshoot-description": "Risolvi problemi di umbrelOS o di un'app",
|
||||
"device-info-description": "Informazioni sul tuo dispositivo",
|
||||
"device-info.view-info": "Visualizza info",
|
||||
"factory-reset": "Ripristino Impostazioni di Fabbrica",
|
||||
"factory-reset.reset": "Ripristina",
|
||||
"factory-reset.desc": "Elimina tutti i tuoi dati e app di umbrelOS",
|
||||
"software-update.title": "Aggiornamento software",
|
||||
"device-info": "Info dispositivo",
|
||||
"software-update.on-latest": "Hai l'ultima versione di umbrelOS",
|
||||
"check-for-latest-version": "Controlla gli aggiornamenti di umbrelOS",
|
||||
"2fa": "2FA",
|
||||
"remote-tor-access": "Accesso remoto Tor",
|
||||
"software-update.checking": "Verifica degli aggiornamenti in corso...",
|
||||
"software-update.check": "Verifica aggiornamenti",
|
||||
"software-update.new-version": "Nuova versione {{name}} disponibile per l'installazione",
|
||||
"software-update.updating-to": "Aggiornamento a {{name}}",
|
||||
"software-update.callout": "Non aggiornare questa pagina o spegnere il tuo Umbrel durante l'aggiornamento.",
|
||||
"software-update.failed.title": "Aggiornamento software fallito",
|
||||
"software-update.failed.description": "Si è verificato un errore durante l'aggiornamento del software",
|
||||
"software-update.failed.please-try-again": "Per favore, riprova",
|
||||
"software-update.failed.retry": "Riprova",
|
||||
"update": "aggiornamento",
|
||||
"software-update.update-now": "Aggiorna ora",
|
||||
"software-update.view": "Visualizza",
|
||||
"storage": "Archiviazione",
|
||||
"storage.low": "Spazio di archiviazione basso",
|
||||
"storage.full": "Archiviazione piena",
|
||||
"something-left": "{{left}} rimanenti",
|
||||
"unexpected-error": "Errore imprevisto",
|
||||
"unexpected-error.heading": "⚠ Errore",
|
||||
"clipboard.copied": "Copiato",
|
||||
"close": "Chiudi",
|
||||
"something-went-wrong": "⚠ Qualcosa è andato storto",
|
||||
"loading": "Caricamento",
|
||||
"cmdk.input-placeholder": "Cerca app, impostazioni o azioni",
|
||||
"no-results-found": "Nessun risultato trovato",
|
||||
"cmdk.restart-umbrel": "Riavvia Umbrel",
|
||||
"cmdk.update-all-apps": "Aggiorna tutte le app",
|
||||
"cmdk.change-wallpaper": "Cambia sfondo",
|
||||
"cmdk.live-usage": "Utilizzo in Tempo Reale",
|
||||
"cmdk.widgets": "Widget",
|
||||
"cmdk.frequent-apps": "Usati frequentemente",
|
||||
"app.offline": "Non in esecuzione",
|
||||
"app.uninstalling": "Disinstallazione",
|
||||
"app.install": "Installa",
|
||||
"app.installing": "Installazione",
|
||||
"app.updating": "Aggiornamento",
|
||||
"app.open": "Apri",
|
||||
"app.view": "Visualizza",
|
||||
"retry": "Riprova",
|
||||
"download-logs": "Scarica log",
|
||||
"page-title-umbrel": "{{title}} – umbrelOS",
|
||||
"desktop.title": "Desktop",
|
||||
"notifications": "Notifiche",
|
||||
"device-info.device": "Dispositivo",
|
||||
"device-info.model-number": "Numero modello",
|
||||
"device-info.serial-number": "Numero di serie",
|
||||
"memory": "Memoria",
|
||||
"memory.low": "Memoria bassa",
|
||||
"no-forgot-password-message": "Se perdi la tua password, non sarai in grado di accedere al tuo Umbrel. Assicurati di conservarla in modo sicuro.",
|
||||
"settings.contact-support": "Hai bisogno di aiuto? <linked>Contatta il supporto.</linked>",
|
||||
"temperature": "Temperatura",
|
||||
"temperature.too-hot-suggestion": "Considera di cambiare l'ambiente del tuo dispositivo.",
|
||||
"temp.dangerously-hot": "Molto caldo",
|
||||
"temp.hot": "Caldo",
|
||||
"temp.nice": "Piacevole",
|
||||
"temp.warm": "Tiepido",
|
||||
"temp.normal": "Normale",
|
||||
"temp.too-cold": "Troppo freddo",
|
||||
"temp.cool": "Fresco",
|
||||
"2fa.disable.title": "Disabilita l'autenticazione a due fattori",
|
||||
"2fa.enter-code": "Inserisci il codice visualizzato nella tua app di autenticazione",
|
||||
"2fa.enable.or-paste": "Oppure incolla il seguente codice nella tua app di autenticazione",
|
||||
"2fa.enable.title": "Abilita l'autenticazione a due fattori",
|
||||
"2fa.enable.scan-this": "Scansiona questo codice QR utilizzando un'app di autenticazione come Google Authenticator o Authy",
|
||||
"settings.app-store-preferences.title": "Preferenze App Store",
|
||||
"change-name.input-placeholder": "Il tuo nome",
|
||||
"confirm": "Conferma",
|
||||
"cancel": "Annulla",
|
||||
"change-password.callout": "Se perdi la tua password, non sarai in grado di accedere al tuo Umbrel. Assicurati di conservarla in modo sicuro.",
|
||||
"change-password.current-password": "Password attuale",
|
||||
"change-password.new-password": "Nuova password",
|
||||
"change-password.repeat-password": "Ripeti password",
|
||||
"restart.restarting": "Riavvio in corso",
|
||||
"restart.restarting-message": "Non aggiornare questa pagina o spegnere il tuo Umbrel durante il riavvio.",
|
||||
"restart.failed": "Riavvio fallito",
|
||||
"restart.confirm.title": "Sei sicuro di voler riavviare il tuo Umbrel?",
|
||||
"restart.confirm.submit": "Riavvia",
|
||||
"shut-down.complete": "Spegnimento completato",
|
||||
"shut-down.complete-text": "Ora puoi scollegare il tuo dispositivo dalla corrente.",
|
||||
"shut-down.shutting-down": "Spegnimento in corso",
|
||||
"shut-down.shutting-down-message": "Non aggiornare questa pagina o spegnere il tuo Umbrel durante lo spegnimento.",
|
||||
"shut-down.failed": "Spegnimento fallito",
|
||||
"shut-down.confirm.title": "Sei sicuro di voler spegnere il tuo Umbrel?",
|
||||
"shut-down.confirm.submit": "Spegni",
|
||||
"tor.enable.title": "Abilita l'accesso remoto Tor",
|
||||
"tor.enable.failed": "Abilitazione di Tor fallita",
|
||||
"tor.enable.description": "Questo potrebbe richiedere alcuni minuti",
|
||||
"tor.disable.description": "Questo potrebbe richiedere alcuni minuti",
|
||||
"tor.enable.submit": "Abilita",
|
||||
"troubleshoot.umbrelos-description": "Visualizza i log di umbrelOS e del sistema",
|
||||
"troubleshoot.app": "App",
|
||||
"troubleshoot.app-description": "Visualizza i log di un'app installata sul tuo Umbrel",
|
||||
"troubleshoot.umbrelos-logs": "Log di umbrelOS",
|
||||
"troubleshoot.system-logs": "Log di sistema",
|
||||
"troubleshoot.system-download": "Scarica {{label}}",
|
||||
"troubleshoot.app-download": "Scarica i log di {{app}}",
|
||||
"app-picker.select-app": "Seleziona app...",
|
||||
"app-picker.search": "Cerca...",
|
||||
"troubleshoot.share-with-umbrel-support": "Condividi con il supporto Umbrel",
|
||||
"login": "Accedi",
|
||||
"migration-assistant.prep.body": "Preparazione alla migrazione",
|
||||
"migration-assistant.prep.button-continue": "Continua",
|
||||
"migration-assistant.prep.callout": "I dati presenti su Umbrel Home, se presenti, verranno eliminati permanentemente.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Spegni il tuo Umbrel su Raspberry Pi.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Collega il suo disco esterno a qualsiasi porta USB del tuo Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Una volta fatto, clicca su '{{button}}' qui sotto.",
|
||||
"migration-assistant.failed": "Qualcosa non va...",
|
||||
"try-again": "Riprova",
|
||||
"migration-assistant.continue-migration.ready.submit": "Inizia la migrazione",
|
||||
"migration-assistant.ready.title": "Tutto pronto per la migrazione!",
|
||||
"migration-assistant.ready.description": "Tutti i tuoi dati e app sono pronti per essere migrati sul tuo Umbrel Home",
|
||||
"migration-assistant.ready.hint-header": "Cose da tenere a mente",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Usa la stessa password",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Ricorda di usare la password del tuo Umbrel su Raspberry Pi per accedere al tuo Umbrel Home",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Tieni spento il tuo Raspberry Pi dopo l'aggiornamento",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Questo aiuta a prevenire problemi con app come Lightning Node",
|
||||
"migration-assistant.failed.ssd-not-detected.title": "Nessun disco esterno rilevato",
|
||||
"migration-assistant.failed.ssd-not-detected.description": "Assicurati di collegare il disco esterno del tuo Raspberry Pi al tuo Umbrel Home",
|
||||
"migration-assistant.failed.incorrect-ssd.title": "Disco esterno incompatibile",
|
||||
"migration-assistant.failed.incorrect-ssd.description": "Assicurati di aver collegato il disco esterno del tuo Raspberry Pi al tuo Umbrel Home",
|
||||
"live-usage": "Utilizzo in Tempo Reale",
|
||||
"unknown-app": "App sconosciuta",
|
||||
"login.title": "Bentornato",
|
||||
"login.subtitle": "Inserisci la tua password Umbrel per accedere",
|
||||
"login.password-label": "Password",
|
||||
"login.password.submit": "Accedi",
|
||||
"login-2fa.title": "Autentica",
|
||||
"login-2fa.subtitle": "Inserisci il codice 2FA visualizzato nella tua app di autenticazione",
|
||||
"not-found-404": "Codice errore: 404",
|
||||
"not-found-404.back": "Indietro",
|
||||
"not-found-404.home": "Vai alla Home",
|
||||
"restart.try-again": "Riprova",
|
||||
"login-with-umbrel.app-not-found": "App non trovata.",
|
||||
"login-with-umbrel.title": "Accedi con Umbrel",
|
||||
"login-with-umbrel.description": "Inserisci la tua password Umbrel per aprire {{app}}",
|
||||
"create-user": "Crea utente",
|
||||
"language.select-description": "Seleziona la lingua preferita per umbrelOS",
|
||||
"software-update.current-running": "Sei su",
|
||||
"migration-assistant.mobile.start-button": "Inizia la migrazione",
|
||||
"tor.enable.mobile.switch-label": "Abilita l'accesso remoto Tor",
|
||||
"logout.confirm.title": "Sei sicuro di voler uscire?",
|
||||
"logout.confirm.submit": "Esci",
|
||||
"2fa.enable.success": "Autenticazione a due fattori abilitata",
|
||||
"2fa-description": "Un secondo livello di sicurezza per il tuo login e app Umbrel",
|
||||
"2fa.disable.success": "Autenticazione a due fattori disabilitata",
|
||||
"apps.uninstalled-all.success": "Tutte le app disinstallate",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Impossibile ottenere le app richieste",
|
||||
"2fa.disable.title": "Disabilita l'autenticazione a due fattori",
|
||||
"2fa.enable.or-paste": "Oppure incolla il seguente codice nella tua app di autenticazione",
|
||||
"2fa.enable.scan-this": "Scansiona questo codice QR utilizzando un'app di autenticazione come Google Authenticator o Authy",
|
||||
"2fa.enable.success": "Autenticazione a due fattori abilitata",
|
||||
"2fa.enable.title": "Abilita l'autenticazione a due fattori",
|
||||
"2fa.enter-code": "Inserisci il codice visualizzato nella tua app di autenticazione",
|
||||
"account": "Account",
|
||||
"account-description": "Il tuo nome e password",
|
||||
"advanced-settings": "Impostazioni avanzate",
|
||||
"advanced-settings-description": "Apri il terminal o iscriviti al Programma Beta di umbrelOS",
|
||||
"app-not-found": "App non trovata: {{app}}",
|
||||
"app-only-over-tor": "{{app}} può essere utilizzata solo tramite Tor. Accedi al tuo Umbrel in un browser Tor all'URL di accesso remoto (Impostazioni > Accesso remoto Tor) per aprire questa app.",
|
||||
"widget.progress.in-progress": "In corso",
|
||||
"change-password.failed.current-required": "Password attuale richiesta",
|
||||
"change-password.failed.new-required": "Nuova password richiesta",
|
||||
"change-password.failed.repeat-required": "Ripeti la password richiesta",
|
||||
"change-password.failed.no-match": "Le password non corrispondono",
|
||||
"change-password.failed.must-be-unique": "La nuova password deve essere diversa dalla password attuale",
|
||||
"change-password.failed.min-length": "La password deve essere di almeno {{characters}} caratteri",
|
||||
"notifications.view": "Visualizza",
|
||||
"notifications.new-version-available": "{{update}} ora disponibile per l'installazione",
|
||||
"notifications.cpu.too-hot": "Temperatura della CPU alta",
|
||||
"notifications.cpu.too-cold": "Temperatura della CPU bassa",
|
||||
"notifications.storage.full": "La memoria del tuo dispositivo è piena",
|
||||
"notifications.memory.low": "La memoria del tuo dispositivo è bassa",
|
||||
"notifications.storage.low": "La memoria del tuo dispositivo è scarsa",
|
||||
"software-update.success": "Aggiornato con successo a umbrelOS {{version}}",
|
||||
"software-update.failed": "Aggiornamento non riuscito",
|
||||
"software-update.failed-to-check": "Impossibile verificare gli aggiornamenti",
|
||||
"change-name.failed.name-required": "Nome richiesto",
|
||||
"free": "Gratis",
|
||||
"app-page.section.about": "Informazioni",
|
||||
"app-page.section.credentials.title": "Credenziali predefinite",
|
||||
"app-page.section.info.compatibility": "Compatibilità",
|
||||
"app-page.section.info.compatibility-compatible": "Compatibile",
|
||||
"app-page.section.info.developer": "Sviluppatore",
|
||||
"app-page.section.info.source-code": "Codice Sorgente",
|
||||
"app-page.section.info.source-code.public": "Pubblico",
|
||||
"app-page.section.info.submitted-by": "Inviato da",
|
||||
"app-page.section.info.title": "Info",
|
||||
"app-page.section.info.version": "Versione",
|
||||
"app-page.section.recommendations.title": "Potrebbero interessarti anche",
|
||||
"app-page.section.release-notes.title": "Novità",
|
||||
"app-page.section.release-notes.version": "Versione {{version}}",
|
||||
"app-page.section.requires": "Richiede",
|
||||
"app-page.section.requires.support": "Ottieni supporto",
|
||||
"app-picker.search": "Cerca...",
|
||||
"app-picker.select-app": "Seleziona app...",
|
||||
"app-store.browse-category-apps": "Esplora le app {{category}}",
|
||||
"app-store.category.discover": "Scopri",
|
||||
"app-store.category.ai": "AI",
|
||||
"app-store.category.all": "Tutte le app",
|
||||
"app-store.category.files": "File & Produttività",
|
||||
"app-store.category.automation": "Casa & Automazione",
|
||||
"app-store.category.bitcoin": "Bitcoin",
|
||||
"app-store.category.developer": "Strumenti per Sviluppatori",
|
||||
"app-store.category.discover": "Scopri",
|
||||
"app-store.category.files": "File & Produttività",
|
||||
"app-store.category.finance": "Finanza",
|
||||
"app-store.category.media": "Media",
|
||||
"app-store.category.networking": "Networking",
|
||||
"app-store.category.social": "Social",
|
||||
"app-store.category.automation": "Casa & Automazione",
|
||||
"app-store.category.ai": "AI",
|
||||
"app-store.category.developer": "Strumenti per Sviluppatori",
|
||||
"community-app-store": "Community App Store",
|
||||
"community-app-store.loading": "Caricamento...",
|
||||
"community-app-store.back-to-umbrel-app-store": "Torna a Umbrel App Store",
|
||||
"community-app-store.open-button": "Apri",
|
||||
"community-app-store.remove-button": "Rimuovi",
|
||||
"community-app-stores.description": "I Community App Store ti permettono di installare app sul tuo Umbrel che potrebbero non essere disponibili nell'Umbrel App Store ufficiale. Ti permettono anche di testare le versioni beta delle app Umbrel prima che gli sviluppatori le rilascino sull'Umbrel App Store ufficiale.",
|
||||
"community-app-stores.learn-more": "Scopri di più",
|
||||
"community-app-stores.warning": "I Community App Store possono essere creati da chiunque. Le app pubblicate non sono verificate o esaminate dal team dell'Umbrel App Store ufficiale e possono potenzialmente essere insicure o dannose. Usa cautela e aggiungi solo app store di sviluppatori di cui ti fidi.",
|
||||
"community-app-stores.add-button": "Aggiungi",
|
||||
"desktop.install-first.for-the-self-hoster": "Per l'auto-ospitante",
|
||||
"desktop.install-first.for-the-bitcoiner": "Per il bitcoiner",
|
||||
"desktop.install-first.for-the-streamer": "Per lo streamer",
|
||||
"desktop.context-menu.edit-widgets": "Modifica widget",
|
||||
"desktop.context-menu.logout": "Esci",
|
||||
"desktop.context-menu.change-wallpaper": "Cambia sfondo",
|
||||
"desktop.not-enough-room": "Usa uno schermo più grande per visualizzare le tue app.",
|
||||
"desktop.app.context.go-to-store-page": "Visualizza in App Store",
|
||||
"desktop.app.context.show-default-credentials": "Mostra credenziali predefinite",
|
||||
"desktop.app.context.uninstall": "Disinstalla",
|
||||
"desktop.install-first.link-to-app-store": "Esplora di più in App Store",
|
||||
"migrate.callout": "Non spegnere il tuo Umbrel fino al completamento della migrazione",
|
||||
"app.uninstall.confirm.title": "Disinstallare {{app}}?",
|
||||
"app.uninstall.confirm.submit": "Disinstalla",
|
||||
"app.uninstall.confirm.description": "Tutti i dati associati a {{app}} verranno eliminati permanentemente. Questa azione non può essere annullata.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} è utilizzata da",
|
||||
"widgets.edit.title": "Modifica widget",
|
||||
"widgets.edit.select-up-to-3-widgets": "Seleziona fino a 3 widget",
|
||||
"onboarding.create-account": "Crea account",
|
||||
"factory-reset.review.title": "Rivedi i dati",
|
||||
"factory-reset.review.following-will-be-removed": "I seguenti verranno rimossi dal tuo dispositivo",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} app installata",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} app installate",
|
||||
"app.uninstall.deps.used-by.description_one": "Disinstalla prima {{firstAppToUninstall}} per disinstallare {{app}}.",
|
||||
"app.uninstall.deps.used-by.description_other": "Disinstalla prima queste app per disinstallare {{app}}.",
|
||||
"app-store.search-apps": "Cerca app",
|
||||
"app-store.description": "Le tue impostazioni di aggiornamento app",
|
||||
"app-store.menu.community-app-stores": "Community App Store",
|
||||
"app-store.search-apps": "Cerca app",
|
||||
"app-store.search.no-results": "Nessun risultato",
|
||||
"app-store.search.results-for": "Risultati per",
|
||||
"factory-reset.review.submit": "Continua",
|
||||
"factory-reset.review.account-info": "Informazioni account e password",
|
||||
"factory-reset.review.total-data": "Dati totali",
|
||||
"factory-reset.review.apps": "App",
|
||||
"onboarding.create-account.failed.name-required": "Nome richiesto",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Le password non corrispondono",
|
||||
"onboarding.create-account.subtitle": "Le informazioni del tuo account sono memorizzate solo sul tuo Umbrel. Assicurati di fare un backup della tua password in modo sicuro poiché non c'è modo di reimpostarla.",
|
||||
"onboarding.contact-support": "Supporto",
|
||||
"onboarding.create-account.name.input-placeholder": "Il tuo nome",
|
||||
"onboarding.create-account.password.input-label": "Password",
|
||||
"onboarding.create-account.confirm-password.input-label": "Conferma password",
|
||||
"onboarding.create-account.submit": "Crea",
|
||||
"onboarding.create-account.submitting": "Creazione",
|
||||
"onboarding.account-created.youre-all-set-name": "Tutto pronto, {{name}}.",
|
||||
"legal.privacy-policy": "Politica sulla Privacy",
|
||||
"legal.terms-of-service": "Termini di Servizio",
|
||||
"onboarding.account-created.next": "Avanti",
|
||||
"onboarding.account-created.page-title": "Account creato",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "Cliccando su 'Avanti', accetti i <linked>Termini di Servizio di umbrelOS</linked>",
|
||||
"onboarding.start.title": "Benvenuto in umbrelOS",
|
||||
"onboarding.start.subtitle": "Il tuo server cloud domestico è pronto per essere configurato.",
|
||||
"onboarding.account-created.subtitle": "Il tuo Umbrel è ora pronto.",
|
||||
"onboarding.start.continue": "Inizia",
|
||||
"app-page.section.about": "Informazioni",
|
||||
"default-credentials.title": "Credenziali per {{app}}",
|
||||
"default-credentials.username": "Nome utente predefinito",
|
||||
"default-credentials.password": "Password predefinita",
|
||||
"default-credentials.open": "Apri {{app}}",
|
||||
"default-credentials.close": "Capito",
|
||||
"default-credentials..dont-show-again": "Non mostrare più",
|
||||
"default-credentials.description": "Ecco le credenziali che ti serviranno per accedere all'app.",
|
||||
"app-page.section.requires": "Richiede",
|
||||
"app-page.section.requires.support": "Ottieni supporto",
|
||||
"app-page.section.info.title": "Info",
|
||||
"app-page.section.info.version": "Versione",
|
||||
"app-page.section.info.source-code": "Codice Sorgente",
|
||||
"app-page.section.info.source-code.public": "Pubblico",
|
||||
"app-page.section.info.developer": "Sviluppatore",
|
||||
"app-page.section.info.submitted-by": "Inviato da",
|
||||
"app-page.section.info.compatibility": "Compatibilità",
|
||||
"app-page.section.info.compatibility-compatible": "Compatibile",
|
||||
"app-page.section.recommendations.title": "Potrebbero interessarti anche",
|
||||
"app-page.section.release-notes.title": "Novità",
|
||||
"app-page.section.release-notes.version": "Versione {{version}}",
|
||||
"app-page.section.credentials.title": "Credenziali predefinite",
|
||||
"auto-update": "Aggiornamento automatico",
|
||||
"read-less": "Leggi meno",
|
||||
"read-more": "Leggi di più",
|
||||
"app-store.title": "App Store",
|
||||
"app-updates.less": "meno",
|
||||
"app-updates.more": "più",
|
||||
"app-updates.no-updates": "Tutte le app sono aggiornate!",
|
||||
"app-updates.update": "Aggiorna",
|
||||
"app-updates.update-all": "Aggiorna tutto",
|
||||
"app-updates.updates-available-count_one": "{{count}} aggiornamento disponibile",
|
||||
"app-updates.updates-available-count_other": "{{count}} aggiornamenti disponibili",
|
||||
"app-updates.updating": "Aggiornamento in corso...",
|
||||
"app.install": "Installa",
|
||||
"app.installing": "Installazione",
|
||||
"app.offline": "Non in esecuzione",
|
||||
"app.open": "Apri",
|
||||
"app.optimized-for-umbrel-home": "Ottimizzato per Umbrel Home",
|
||||
"install-first.title": "{{app}} richiede l'accesso a",
|
||||
"install-first.description_one": "Installa questa app per installare {{app}}.",
|
||||
"install-first.description_other": "Installa prima queste app per installare {{app}}.",
|
||||
"ok": "OK",
|
||||
"factory-reset.confirm.title": "Conferma con password",
|
||||
"factory-reset.confirm.body": "Conferma la password di Umbrel per resettare",
|
||||
"factory-reset.confirm.submit": "Cancella tutto e resetta",
|
||||
"factory-reset.confirm.submit-callout": "Questa azione non può essere annullata.",
|
||||
"factory-reset.confirm.password-label": "Inserisci password",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Non spegnere il dispositivo fino al completamento del reset",
|
||||
"factory-reset.resetting.connecting": "Connessione in corso",
|
||||
"factory-reset.failed.title": "Reset fallito",
|
||||
"factory-reset.failed.message": "Si è verificato un errore durante il reset",
|
||||
"factory-reset.failed.message.please-try-again": "Per favore, riprova",
|
||||
"factory-reset.failed.retry": "Riprova il ripristino impostazioni di fabbrica",
|
||||
"factory-reset.success.title": "Reset riuscito",
|
||||
"factory-reset.success.description": "Tutte le tue app, i dati delle app e i dati dell'account sono stati eliminati dal tuo dispositivo. Ora puoi riavviare il dispositivo.",
|
||||
"factory-reset.success.restart-device": "Riavvia dispositivo",
|
||||
"connecting": "Connessione in corso...",
|
||||
"migrate.failed.title": "Migrazione fallita",
|
||||
"migrate.failed.description": "Si è verificato un errore durante la migrazione",
|
||||
"migrate.failed.please-try-again": "Per favore, riprova",
|
||||
"migrate.failed.retry": "Riprova",
|
||||
"migrate.success.title": "Migrazione riuscita",
|
||||
"migrate.success.description": "Tutte le tue app, i dati delle app e i dettagli dell'account sono stati migrati sul tuo Umbrel Home.",
|
||||
"continue-to-log-in": "Continua per accedere",
|
||||
"trpc.checking-backend": "Caricamento...",
|
||||
"trpc.backend-unavailable": "Errore: Connessione all'API di sistema fallita",
|
||||
"app.restarting": "Riavvio in corso",
|
||||
"app.starting": "Avvio in corso",
|
||||
"app.stopped": "Fermato",
|
||||
"app.stopping": "Fermata in corso",
|
||||
"app.uninstall.confirm.description": "Tutti i dati associati a {{app}} verranno eliminati permanentemente. Questa azione non può essere annullata.",
|
||||
"app.uninstall.confirm.submit": "Disinstalla",
|
||||
"app.uninstall.confirm.title": "Disinstallare {{app}}?",
|
||||
"app.uninstall.deps.used-by.description_one": "Disinstalla prima {{firstAppToUninstall}} per disinstallare {{app}}.",
|
||||
"app.uninstall.deps.used-by.description_other": "Disinstalla prima queste app per disinstallare {{app}}.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} è utilizzata da",
|
||||
"app.uninstalling": "Disinstallazione",
|
||||
"app.updating": "Aggiornamento",
|
||||
"app.view": "Visualizza",
|
||||
"app_one": "app",
|
||||
"app_other": "app",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Impossibile ottenere le app richieste",
|
||||
"apps.uninstalled-all.success": "Tutte le app disinstallate",
|
||||
"auth.checking-backend-for-user": "Caricamento...",
|
||||
"auth.failed-checking-if-user-logged-in": "Errore: Controllo di accesso fallito",
|
||||
"auth.failed-to-check-if-user-exists": "Errore: Controllo di esistenza fallito",
|
||||
"redirect.to-onboarding": "Caricamento...",
|
||||
"redirect.to-login": "Caricamento...",
|
||||
"redirect.to-home": "Caricamento...",
|
||||
"widgets.install-an-app-before-using-widgets": "Installa un'app per iniziare a personalizzare la tua schermata iniziale con i widget.",
|
||||
"logout-error-generic": "Errore: Logout fallito",
|
||||
"app.stopping": "Fermata in corso",
|
||||
"app.starting": "Avvio in corso",
|
||||
"app.restarting": "Riavvio in corso",
|
||||
"beta-program": "Programma Beta di umbrelOS",
|
||||
"beta-program-description": "Opta per ricevere aggiornamenti beta di umbrelOS, accedi in anteprima a nuove funzionalità e aiutaci a perfezionarle fornendo il tuo feedback. Gli aggiornamenti beta possono essere instabili e la risoluzione dei problemi può richiedere familiarità con il terminal.",
|
||||
"cancel": "Annulla",
|
||||
"change": "Modifica",
|
||||
"change-name": "Cambia nome",
|
||||
"change-name.failed.name-required": "Nome richiesto",
|
||||
"change-name.input-placeholder": "Il tuo nome",
|
||||
"change-password": "Cambia password",
|
||||
"change-password.callout": "Se perdi la tua password, non sarai in grado di accedere al tuo Umbrel. Assicurati di conservarla in modo sicuro.",
|
||||
"change-password.current-password": "Password attuale",
|
||||
"change-password.failed.current-required": "Password attuale richiesta",
|
||||
"change-password.failed.min-length": "La password deve essere di almeno {{characters}} caratteri",
|
||||
"change-password.failed.must-be-unique": "La nuova password deve essere diversa dalla password attuale",
|
||||
"change-password.failed.new-required": "Nuova password richiesta",
|
||||
"change-password.failed.no-match": "Le password non corrispondono",
|
||||
"change-password.failed.repeat-required": "Ripeti la password richiesta",
|
||||
"change-password.new-password": "Nuova password",
|
||||
"change-password.repeat-password": "Ripeti password",
|
||||
"check-for-latest-version": "Controlla gli aggiornamenti di umbrelOS",
|
||||
"clipboard.copied": "Copiato",
|
||||
"close": "Chiudi",
|
||||
"cmdk.change-wallpaper": "Cambia sfondo",
|
||||
"cmdk.frequent-apps": "Usati frequentemente",
|
||||
"cmdk.input-placeholder": "Cerca app, impostazioni o azioni",
|
||||
"cmdk.install-from-app-store": "da App Store",
|
||||
"cmdk.live-usage": "Utilizzo in Tempo Reale",
|
||||
"cmdk.restart-umbrel": "Riavvia Umbrel",
|
||||
"cmdk.shutdown-umbrel": "Spegni Umbrel",
|
||||
"cmdk.update-all-apps": "Aggiorna tutte le app",
|
||||
"cmdk.widgets": "Widget",
|
||||
"community-app-store": "Community App Store",
|
||||
"community-app-store.back-to-umbrel-app-store": "Torna a Umbrel App Store",
|
||||
"community-app-store.open-button": "Apri",
|
||||
"community-app-store.remove-button": "Rimuovi",
|
||||
"community-app-stores.add-button": "Aggiungi",
|
||||
"community-app-stores.description": "I Community App Store ti permettono di installare app sul tuo Umbrel che potrebbero non essere disponibili nell'Umbrel App Store ufficiale. Ti permettono anche di testare le versioni beta delle app Umbrel prima che gli sviluppatori le rilascino sull'Umbrel App Store ufficiale.",
|
||||
"community-app-stores.learn-more": "Scopri di più",
|
||||
"community-app-stores.warning": "I Community App Store possono essere creati da chiunque. Le app pubblicate non sono verificate o esaminate dal team dell'Umbrel App Store ufficiale e possono potenzialmente essere insicure o dannose. Usa cautela e aggiungi solo app store di sviluppatori di cui ti fidi.",
|
||||
"confirm": "Conferma",
|
||||
"connecting": "Connessione in corso...",
|
||||
"continue": "Continua",
|
||||
"continue-to-log-in": "Continua per accedere",
|
||||
"cpu": "CPU",
|
||||
"cpu-core-count": "{{cores}} thread",
|
||||
"troubleshoot-pick-title": "Risoluzione problemi",
|
||||
"troubleshoot-no-logs-yet": "Nessun log ancora",
|
||||
"temperature.too-cold-suggestion": "Considera di cambiare l'ambiente del tuo dispositivo",
|
||||
"cmdk.install-from-app-store": "da App Store",
|
||||
"cmdk.shutdown-umbrel": "Spegni Umbrel",
|
||||
"tor.enable.success": "Accesso remoto Tor abilitato",
|
||||
"tor.enable.progress": "Abilitazione dell'accesso remoto Tor in corso",
|
||||
"tor.disable.success": "Accesso remoto Tor disabilitato",
|
||||
"tor.disable.progress": "Disabilitazione dell'accesso remoto Tor in corso",
|
||||
"tor.hidden-service": "URL del servizio nascosto Tor",
|
||||
"stop": "Ferma",
|
||||
"software-update.release-notes.title": "Note di rilascio",
|
||||
"app-updates.updates-available-count_one": "{{count}} aggiornamento disponibile",
|
||||
"app-updates.updates-available-count_other": "{{count}} aggiornamenti disponibili",
|
||||
"app-updates.title": "Aggiornamenti",
|
||||
"app-updates.update-all": "Aggiorna tutto",
|
||||
"app-updates.updating": "Aggiornamento in corso...",
|
||||
"app-updates.update": "Aggiorna",
|
||||
"app-updates.less": "meno",
|
||||
"app-updates.more": "più",
|
||||
"create-user": "Crea utente",
|
||||
"default-credentials.close": "Capito",
|
||||
"default-credentials.description": "Ecco le credenziali che ti serviranno per accedere all'app.",
|
||||
"default-credentials.dont-show-again": "Non mostrare di nuovo",
|
||||
"default-credentials.open": "Apri {{app}}",
|
||||
"default-credentials.password": "Password predefinita",
|
||||
"default-credentials.title": "Credenziali per {{app}}",
|
||||
"default-credentials.username": "Nome utente predefinito",
|
||||
"desktop.app.context.go-to-store-page": "Visualizza in App Store",
|
||||
"desktop.app.context.show-default-credentials": "Mostra credenziali predefinite",
|
||||
"desktop.app.context.uninstall": "Disinstalla",
|
||||
"desktop.context-menu.change-wallpaper": "Cambia sfondo",
|
||||
"desktop.context-menu.edit-widgets": "Modifica widget",
|
||||
"desktop.context-menu.logout": "Esci",
|
||||
"desktop.greeting.afternoon": "Buon pomeriggio, {{name}}",
|
||||
"desktop.greeting.evening": "Buona sera, {{name}}",
|
||||
"desktop.greeting.morning": "Buongiorno, {{name}}",
|
||||
"desktop.install-first.for-the-bitcoiner": "Per il bitcoiner",
|
||||
"desktop.install-first.for-the-self-hoster": "Per l'auto-ospitante",
|
||||
"desktop.install-first.for-the-streamer": "Per lo streamer",
|
||||
"desktop.install-first.link-to-app-store": "Esplora di più in App Store",
|
||||
"desktop.not-enough-room": "Usa uno schermo più grande per visualizzare le tue app.",
|
||||
"device": "Dispositivo",
|
||||
"device-info": "Info dispositivo",
|
||||
"device-info-description": "Informazioni sul tuo dispositivo",
|
||||
"device-info.device": "Dispositivo",
|
||||
"device-info.model-number": "Numero modello",
|
||||
"device-info.serial-number": "Numero di serie",
|
||||
"device-info.view-info": "Visualizza info",
|
||||
"disable": "Disabilita",
|
||||
"download-logs": "Scarica log",
|
||||
"factory-reset": "Ripristino Impostazioni di Fabbrica",
|
||||
"factory-reset.confirm.body": "Conferma la password di Umbrel per resettare",
|
||||
"factory-reset.confirm.password-label": "Inserisci password",
|
||||
"factory-reset.confirm.submit": "Cancella tutto e resetta",
|
||||
"factory-reset.confirm.submit-callout": "Questa azione non può essere annullata.",
|
||||
"factory-reset.desc": "Elimina tutti i tuoi dati e app di umbrelOS",
|
||||
"factory-reset.failed.message": "Si è verificato un errore durante il reset",
|
||||
"factory-reset.failed.retry": "Riprova il ripristino impostazioni di fabbrica",
|
||||
"factory-reset.failed.title": "Reset fallito",
|
||||
"factory-reset.reset": "Ripristina",
|
||||
"factory-reset.resetting.connecting": "Connessione in corso",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Non spegnere il dispositivo fino al completamento del reset",
|
||||
"factory-reset.review.account-info": "Informazioni account e password",
|
||||
"factory-reset.review.apps": "App",
|
||||
"factory-reset.review.following-will-be-removed": "I seguenti verranno rimossi dal tuo dispositivo",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} app installata",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} app installate",
|
||||
"factory-reset.review.submit": "Continua",
|
||||
"factory-reset.review.total-data": "Dati totali",
|
||||
"factory-reset.success.description": "Tutte le tue app, i dati delle app e i dati dell'account sono stati eliminati dal tuo dispositivo. Ora puoi riavviare il dispositivo.",
|
||||
"factory-reset.success.restart-device": "Riavvia dispositivo",
|
||||
"factory-reset.success.title": "Reset riuscito",
|
||||
"hello": "Ciao",
|
||||
"install-first.description_one": "Installa questa app per installare {{app}}.",
|
||||
"install-first.description_other": "Installa prima queste app per installare {{app}}.",
|
||||
"install-first.title": "{{app}} richiede l'accesso a",
|
||||
"install-your-first-app": "Installa la tua prima app",
|
||||
"language": "Lingua",
|
||||
"language-description": "La tua lingua preferita per umbrelOS",
|
||||
"language.select-description": "Seleziona la lingua preferita per umbrelOS",
|
||||
"linux": "Linux",
|
||||
"live-usage": "Utilizzo in Tempo Reale",
|
||||
"loading": "Caricamento",
|
||||
"local-ip": "IP locale",
|
||||
"login-2fa.subtitle": "Inserisci il codice 2FA visualizzato nella tua app di autenticazione",
|
||||
"login-2fa.title": "Autentica",
|
||||
"login-with-umbrel.description": "Inserisci la tua password Umbrel per aprire {{app}}",
|
||||
"login-with-umbrel.title": "Accedi con Umbrel",
|
||||
"login.password-label": "Password",
|
||||
"login.password.submit": "Accedi",
|
||||
"login.subtitle": "Inserisci la tua password Umbrel per accedere",
|
||||
"login.title": "Bentornato",
|
||||
"logout": "Esci",
|
||||
"logout-error-generic": "Errore: Logout fallito",
|
||||
"logout.confirm.submit": "Esci",
|
||||
"logout.confirm.title": "Sei sicuro di voler uscire?",
|
||||
"memory": "Memoria",
|
||||
"memory.low": "Memoria bassa",
|
||||
"migrate": "Migra",
|
||||
"migrate.callout": "Non spegnere il tuo Umbrel fino al completamento della migrazione",
|
||||
"migrate.failed.retry": "Riprova",
|
||||
"migrate.failed.title": "Migrazione fallita",
|
||||
"migrate.success.description": "Tutte le tue app, i dati delle app e i dettagli dell'account sono stati migrati sul tuo Umbrel Home.",
|
||||
"migrate.success.title": "Migrazione riuscita",
|
||||
"migration-assistant": "Assistente di Migrazione",
|
||||
"migration-assistant-description": "Trasferisci tutte le tue app e dati da un Raspberry Pi a Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "L'assistente di migrazione supporta attualmente il trasferimento di tutti i dati e le app da un Raspberry Pi che esegue umbrelOS a Umbrel Home. Apri l'Assistente di migrazione su Umbrel Home per iniziare.",
|
||||
"migration-assistant.continue-migration.ready.submit": "Inizia la migrazione",
|
||||
"migration-assistant.failed": "Qualcosa non va...",
|
||||
"migration-assistant.failed.retrying-message": "Riprova in corso...",
|
||||
"unknown-error": "Errore sconosciuto",
|
||||
"migration-assistant.mobile.start-button": "Inizia la migrazione",
|
||||
"migration-assistant.prep.body": "Preparazione alla migrazione",
|
||||
"migration-assistant.prep.button-continue": "Continua",
|
||||
"migration-assistant.prep.callout": "I dati presenti su Umbrel Home, se presenti, verranno eliminati permanentemente.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Collega il suo disco esterno a qualsiasi porta USB del tuo Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Una volta fatto, clicca su '{{button}}' qui sotto.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Spegni il tuo Umbrel su Raspberry Pi.",
|
||||
"migration-assistant.ready.description": "Tutti i tuoi dati e app sono pronti per essere migrati sul tuo Umbrel Home",
|
||||
"migration-assistant.ready.hint-header": "Cose da tenere a mente",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Questo aiuta a prevenire problemi con app come Lightning Node",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Tieni spento il tuo Raspberry Pi dopo l'aggiornamento",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Ricorda di usare la password del tuo Umbrel su Raspberry Pi per accedere al tuo Umbrel Home",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Usa la stessa password",
|
||||
"migration-assistant.ready.title": "Tutto pronto per la migrazione!",
|
||||
"name": "Nome",
|
||||
"no-forgot-password-message": "Se perdi la tua password, non sarai in grado di accedere al tuo Umbrel. Assicurati di conservarla in modo sicuro.",
|
||||
"no-results-found": "Nessun risultato trovato",
|
||||
"not-found-404": "Codice errore: 404",
|
||||
"not-found-404.back": "Indietro",
|
||||
"not-found-404.home": "Vai alla Home",
|
||||
"notifications.cpu.too-hot": "Temperatura della CPU alta",
|
||||
"notifications.memory.low": "La memoria del tuo dispositivo è bassa",
|
||||
"notifications.new-version-available": "{{update}} ora disponibile per l'installazione",
|
||||
"notifications.storage.full": "La memoria del tuo dispositivo è piena",
|
||||
"notifications.view": "Visualizza",
|
||||
"ok": "OK",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "Cliccando su 'Avanti', accetti i <linked>Termini di Servizio di umbrelOS</linked>",
|
||||
"onboarding.account-created.next": "Avanti",
|
||||
"onboarding.account-created.subtitle": "Il tuo Umbrel è ora pronto.",
|
||||
"onboarding.account-created.youre-all-set-name": "Tutto pronto, {{name}}.",
|
||||
"onboarding.contact-support": "Supporto",
|
||||
"onboarding.create-account": "Crea account",
|
||||
"onboarding.create-account.confirm-password.input-label": "Conferma password",
|
||||
"onboarding.create-account.failed.name-required": "Nome richiesto",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Le password non corrispondono",
|
||||
"onboarding.create-account.name.input-placeholder": "Il tuo nome",
|
||||
"onboarding.create-account.password.input-label": "Password",
|
||||
"onboarding.create-account.submit": "Crea",
|
||||
"onboarding.create-account.submitting": "Creazione",
|
||||
"onboarding.create-account.subtitle": "Le informazioni del tuo account sono memorizzate solo sul tuo Umbrel. Assicurati di fare un backup della tua password in modo sicuro poiché non c'è modo di reimpostarla.",
|
||||
"onboarding.start.continue": "Inizia",
|
||||
"onboarding.start.subtitle": "Il tuo server cloud domestico è pronto per essere configurato.",
|
||||
"onboarding.start.title": "Benvenuto in umbrelOS",
|
||||
"open": "Apri",
|
||||
"open-live-usage": "Apri Utilizzo in Tempo Reale",
|
||||
"password": "Password",
|
||||
"preferences": "Preferenze",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"read-less": "Leggi meno",
|
||||
"read-more": "Leggi di più",
|
||||
"redirect.to-home": "Caricamento...",
|
||||
"redirect.to-login": "Caricamento...",
|
||||
"redirect.to-onboarding": "Caricamento...",
|
||||
"remote-tor-access": "Accesso remoto Tor",
|
||||
"restart": "Riavvia",
|
||||
"restart.confirm.submit": "Riavvia",
|
||||
"restart.confirm.title": "Sei sicuro di voler riavviare il tuo Umbrel?",
|
||||
"restart.restarting": "Riavvio in corso",
|
||||
"restart.restarting-message": "Non aggiornare questa pagina o spegnere il tuo Umbrel durante il riavvio.",
|
||||
"retry": "Riprova",
|
||||
"search": "Cerca",
|
||||
"settings": "Impostazioni",
|
||||
"settings.app-store-preferences.title": "Preferenze App Store",
|
||||
"settings.contact-support": "Hai bisogno di aiuto? <linked>Contatta il supporto.</linked>",
|
||||
"shut-down": "Spegni",
|
||||
"shut-down.complete": "Spegnimento completato",
|
||||
"shut-down.complete-text": "Ora puoi scollegare il tuo dispositivo dalla corrente.",
|
||||
"shut-down.confirm.submit": "Spegni",
|
||||
"shut-down.confirm.title": "Sei sicuro di voler spegnere il tuo Umbrel?",
|
||||
"shut-down.shutting-down": "Spegnimento in corso",
|
||||
"shut-down.shutting-down-message": "Non aggiornare questa pagina o spegnere il tuo Umbrel durante lo spegnimento.",
|
||||
"software-update.callout": "Non aggiornare questa pagina o spegnere il tuo Umbrel durante l'aggiornamento.",
|
||||
"software-update.check": "Verifica aggiornamenti",
|
||||
"software-update.checking": "Verifica degli aggiornamenti in corso...",
|
||||
"software-update.current-running": "Sei su",
|
||||
"software-update.failed": "Aggiornamento non riuscito",
|
||||
"software-update.failed-to-check": "Impossibile verificare gli aggiornamenti",
|
||||
"software-update.failed.retry": "Riprova",
|
||||
"software-update.install-now": "Installa ora",
|
||||
"app-updates.no-updates": "Tutte le app sono aggiornate!",
|
||||
"continue": "Continua",
|
||||
"app.stopped": "Fermato",
|
||||
"software-update.new-version": "Nuova versione {{name}} disponibile per l'installazione",
|
||||
"software-update.on-latest": "Hai l'ultima versione di umbrelOS",
|
||||
"software-update.title": "Aggiornamento software",
|
||||
"software-update.updating-to": "Aggiornamento a {{name}}",
|
||||
"software-update.view": "Visualizza",
|
||||
"something-left": "{{left}} rimanenti",
|
||||
"something-went-wrong": "⚠ Qualcosa è andato storto",
|
||||
"start": "Avvia",
|
||||
"stop": "Ferma",
|
||||
"storage": "Archiviazione",
|
||||
"storage.full": "Archiviazione piena",
|
||||
"storage.low": "Spazio di archiviazione basso",
|
||||
"temp.dangerously-hot": "Molto caldo",
|
||||
"temp.nice": "Piacevole",
|
||||
"temp.normal": "Normale",
|
||||
"temp.warm": "Tiepido",
|
||||
"temperature": "Temperatura",
|
||||
"temperature.too-hot-suggestion": "Considera di cambiare l'ambiente del tuo dispositivo.",
|
||||
"terminal": "Terminal",
|
||||
"terminal-description": "Esegui comandi personalizzati in umbrelOS o all'interno di un'app",
|
||||
"terminal.umbrelos-description": "Esegui comandi personalizzati in umbrelOS",
|
||||
"terminal.app": "App",
|
||||
"terminal.app-description": "Esegui comandi personalizzati all'interno di un'app specifica",
|
||||
"open": "Apri",
|
||||
"advanced-settings": "Impostazioni avanzate",
|
||||
"advanced-settings-description": "Apri il terminal o iscriviti al Programma Beta di umbrelOS",
|
||||
"beta-program": "Programma Beta di umbrelOS",
|
||||
"beta-program-description": "Opta per ricevere aggiornamenti beta di umbrelOS, accedi in anteprima a nuove funzionalità e aiutaci a perfezionarle fornendo il tuo feedback. Gli aggiornamenti beta possono essere instabili e la risoluzione dei problemi può richiedere familiarità con il terminal."
|
||||
}
|
||||
"terminal.umbrelos-description": "Esegui comandi personalizzati in umbrelOS",
|
||||
"tor-description": "Accedi al tuo Umbrel da ovunque usando un browser Tor",
|
||||
"tor.disable.description": "Questo potrebbe richiedere alcuni minuti",
|
||||
"tor.disable.progress": "Disabilitazione dell'accesso remoto Tor in corso",
|
||||
"tor.disable.success": "Accesso remoto Tor disabilitato",
|
||||
"tor.enable.description": "Questo potrebbe richiedere alcuni minuti",
|
||||
"tor.enable.mobile.switch-label": "Abilita l'accesso remoto Tor",
|
||||
"tor.enable.submit": "Abilita",
|
||||
"tor.enable.success": "Accesso remoto Tor abilitato",
|
||||
"tor.enable.title": "Abilita l'accesso remoto Tor",
|
||||
"tor.hidden-service": "URL del servizio nascosto Tor",
|
||||
"troubleshoot": "Risoluzione problemi",
|
||||
"troubleshoot-description": "Risolvi problemi di umbrelOS o di un'app",
|
||||
"troubleshoot-no-logs-yet": "Nessun log ancora",
|
||||
"troubleshoot-pick-title": "Risoluzione problemi",
|
||||
"troubleshoot.app": "App",
|
||||
"troubleshoot.app-description": "Visualizza i log di un'app installata sul tuo Umbrel",
|
||||
"troubleshoot.app-download": "Scarica i log di {{app}}",
|
||||
"troubleshoot.share-with-umbrel-support": "Condividi con il supporto Umbrel",
|
||||
"troubleshoot.system-download": "Scarica {{label}}",
|
||||
"troubleshoot.umbrelos-description": "Visualizza i log di umbrelOS",
|
||||
"troubleshoot.umbrelos-logs": "Log di umbrelOS",
|
||||
"trpc.backend-unavailable": "Errore: Connessione all'API di sistema fallita",
|
||||
"trpc.checking-backend": "Caricamento...",
|
||||
"try-again": "Riprova",
|
||||
"umbrel": "Umbrel",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"umbrelos": "umbrelOS",
|
||||
"unknown": "Sconosciuto",
|
||||
"unknown-app": "App sconosciuta",
|
||||
"unknown-error": "Errore sconosciuto",
|
||||
"uptime": "Tempo di attività",
|
||||
"wallpaper": "Sfondo",
|
||||
"wallpaper-description": "Il tuo sfondo e tema Umbrel",
|
||||
"widget.progress.in-progress": "In corso",
|
||||
"widgets.edit.select-up-to-3-widgets": "Seleziona fino a 3 widget",
|
||||
"widgets.install-an-app-before-using-widgets": "Installa un'app per iniziare a personalizzare la tua schermata iniziale con i widget.",
|
||||
"wifi": "Wi-Fi",
|
||||
"wifi-connect-insecure-message": "Le reti aperte possono essere insicure",
|
||||
"wifi-connection-failed": "Impossibile connettersi",
|
||||
"wifi-dangerous-change-confirmation-description": "Cambiare la rete Wi-Fi può disconnetterti dal tuo Umbrel. Per riconnetterti, assicurati che sia il tuo Umbrel che il dispositivo da cui accedi siano sulla stessa rete.",
|
||||
"wifi-dangerous-change-confirmation-title": "Sei sicuro di voler cambiare la rete Wi-Fi?",
|
||||
"wifi-dangerous-disable-confirmation-description": "Disabilitare il Wi-Fi può disconnetterti dal tuo Umbrel. Per riconnetterti, collega un cavo Ethernet al tuo Umbrel e assicurati che sia il tuo Umbrel che il dispositivo da cui accedi siano sulla stessa rete.",
|
||||
"wifi-dangerous-disable-confirmation-title": "Sei sicuro di voler disabilitare il Wi-Fi?",
|
||||
"wifi-description": "Connetti il tuo dispositivo a una rete Wi-Fi",
|
||||
"wifi-description-long": "Il tuo dispositivo rimane connesso al Wi-Fi scelto, anche se il cavo Ethernet viene rimosso, e si riconnette automaticamente al Wi-Fi all'avvio.",
|
||||
"wifi-no-networks-message": "Nessuna rete Wi-Fi trovata",
|
||||
"wifi-searching": "Ricerca di reti Wi-Fi...",
|
||||
"wifi-unsupported-device-description": "Il Wi-Fi non è supportato su questo dispositivo. Questo potrebbe essere dovuto a un adattatore wireless mancante o incompatibile.",
|
||||
"wifi-view-networks": "Visualizza reti"
|
||||
}
|
||||
+343
-370
@@ -1,398 +1,371 @@
|
||||
{
|
||||
"hello": "こんにちは",
|
||||
"desktop.greeting.morning": "おはようございます、{{name}}",
|
||||
"desktop.greeting.afternoon": "こんにちは、{{name}}",
|
||||
"desktop.greeting.evening": "こんばんは、{{name}}",
|
||||
"search": "検索",
|
||||
"settings": "設定",
|
||||
"app-store.title": "App Store",
|
||||
"unknown": "不明",
|
||||
"app_one": "アプリ",
|
||||
"app_other": "アプリ",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"linux": "Linux",
|
||||
"install-your-first-app": "最初のアプリをインストール",
|
||||
"logout": "ログアウト",
|
||||
"restart": "再起動",
|
||||
"shut-down": "シャットダウン",
|
||||
"umbrel": "Umbrel",
|
||||
"device": "デバイス",
|
||||
"umbrelos": "umbrelOS",
|
||||
"open-live-usage": "ライブ使用状況を開く",
|
||||
"account": "アカウント",
|
||||
"wallpaper": "壁紙",
|
||||
"name": "名前",
|
||||
"password": "パスワード",
|
||||
"account-description": "あなたの名前とパスワード",
|
||||
"wallpaper-description": "あなたのUmbrelの壁紙とテーマ",
|
||||
"2fa-description": "Umbrelのログインとアプリのための二段階認証",
|
||||
"tor-description": "Torブラウザを使用してどこからでもあなたのUmbrelにアクセス",
|
||||
"migration-assistant": "移行アシスタント",
|
||||
"migration-assistant-description": "あなたのアプリとデータをRaspberry PiからUmbrel Homeに転送",
|
||||
"language": "言語",
|
||||
"language-description": "あなたが好むumbrelOSの言語",
|
||||
"app-store.description": "あなたのアプリ更新設定",
|
||||
"migrate": "移行",
|
||||
"change-name": "名前を変更",
|
||||
"change-password": "パスワードを変更",
|
||||
"uptime": "稼働時間",
|
||||
"preferences": "環境設定",
|
||||
"troubleshoot": "トラブルシューティング",
|
||||
"troubleshoot-description": "umbrelOSまたはアプリのトラブルシューティング",
|
||||
"device-info-description": "あなたのデバイスに関する情報",
|
||||
"device-info.view-info": "情報を見る",
|
||||
"factory-reset": "工場出荷時リセット",
|
||||
"factory-reset.reset": "リセット",
|
||||
"factory-reset.desc": "あなたのumbrelOSのデータとアプリをすべて削除",
|
||||
"software-update.title": "ソフトウェアアップデート",
|
||||
"device-info": "デバイス情報",
|
||||
"software-update.on-latest": "最新のumbrelOSを使用中",
|
||||
"check-for-latest-version": "最新のumbrelOSアップデートを確認",
|
||||
"2fa": "2FA",
|
||||
"remote-tor-access": "リモートTorアクセス",
|
||||
"software-update.checking": "アップデートを確認中...",
|
||||
"software-update.check": "アップデートを確認",
|
||||
"software-update.new-version": "新しい{{name}}がインストール可能です",
|
||||
"software-update.updating-to": "{{name}}に更新中",
|
||||
"software-update.callout": "このページを更新したり、アップデート中にUmbrelをオフにしないでください。",
|
||||
"software-update.failed.title": "ソフトウェアアップデート失敗",
|
||||
"software-update.failed.description": "ソフトウェアアップデート中にエラーが発生しました",
|
||||
"software-update.failed.please-try-again": "もう一度試してください",
|
||||
"software-update.failed.retry": "再試行",
|
||||
"update": "アップデート",
|
||||
"software-update.update-now": "今すぐアップデート",
|
||||
"software-update.view": "表示",
|
||||
"storage": "ストレージ",
|
||||
"storage.low": "ストレージ不足",
|
||||
"storage.full": "ストレージがいっぱいです",
|
||||
"something-left": "{{left}}残っています",
|
||||
"unexpected-error": "予期せぬエラー",
|
||||
"unexpected-error.heading": "⚠ エラー",
|
||||
"clipboard.copied": "コピーしました",
|
||||
"close": "閉じる",
|
||||
"something-went-wrong": "⚠ 何か問題が発生しました",
|
||||
"loading": "読み込み中",
|
||||
"cmdk.input-placeholder": "アプリ、設定、またはアクションを検索",
|
||||
"no-results-found": "結果が見つかりませんでした",
|
||||
"cmdk.restart-umbrel": "Umbrelを再起動",
|
||||
"cmdk.update-all-apps": "すべてのアプリをアップデート",
|
||||
"cmdk.change-wallpaper": "壁紙を変更",
|
||||
"cmdk.live-usage": "ライブ使用状況",
|
||||
"cmdk.widgets": "ウィジェット",
|
||||
"cmdk.frequent-apps": "よく使用されるアプリ",
|
||||
"app.offline": "実行されていません",
|
||||
"app.uninstalling": "アンインストール中",
|
||||
"app.install": "インストール",
|
||||
"app.installing": "インストール中",
|
||||
"app.updating": "更新中",
|
||||
"app.open": "開く",
|
||||
"app.view": "表示",
|
||||
"retry": "再試行",
|
||||
"download-logs": "ログをダウンロード",
|
||||
"page-title-umbrel": "{{title}} – umbrelOS",
|
||||
"desktop.title": "デスクトップ",
|
||||
"notifications": "通知",
|
||||
"device-info.device": "デバイス",
|
||||
"device-info.model-number": "モデル番号",
|
||||
"device-info.serial-number": "シリアル番号",
|
||||
"memory": "メモリ",
|
||||
"memory.low": "メモリ不足",
|
||||
"no-forgot-password-message": "パスワードを失った場合、Umbrelにログインできなくなります。安全に保管してください。",
|
||||
"settings.contact-support": "助けが必要ですか?<linked>サポートに連絡する。</linked>",
|
||||
"temperature": "温度",
|
||||
"temperature.too-hot-suggestion": "デバイスの環境を変更することを検討してください。",
|
||||
"temp.dangerously-hot": "非常に熱い",
|
||||
"temp.hot": "熱い",
|
||||
"temp.nice": "快適",
|
||||
"temp.warm": "暖かい",
|
||||
"temp.normal": "正常",
|
||||
"temp.too-cold": "とても寒い",
|
||||
"temp.cool": "冷たい",
|
||||
"2fa.disable.title": "二段階認証を無効にする",
|
||||
"2fa.enter-code": "認証アプリに表示されるコードを入力してください",
|
||||
"2fa.enable.or-paste": "または、以下のコードを認証アプリに貼り付けてください",
|
||||
"2fa.enable.title": "二段階認証を有効にする",
|
||||
"2fa.enable.scan-this": "Google AuthenticatorやAuthyのような認証アプリでこのQRコードをスキャンしてください",
|
||||
"settings.app-store-preferences.title": "App Storeの設定",
|
||||
"change-name.input-placeholder": "あなたの名前",
|
||||
"confirm": "確認",
|
||||
"cancel": "キャンセル",
|
||||
"change-password.callout": "パスワードを失った場合、Umbrelにログインできなくなります。安全に保管してください。",
|
||||
"change-password.current-password": "現在のパスワード",
|
||||
"change-password.new-password": "新しいパスワード",
|
||||
"change-password.repeat-password": "パスワードを再入力",
|
||||
"restart.restarting": "再起動中",
|
||||
"restart.restarting-message": "このページを更新したり、再起動中にUmbrelをオフにしないでください。",
|
||||
"restart.failed": "再起動に失敗しました",
|
||||
"restart.confirm.title": "Umbrelを再起動してもよろしいですか?",
|
||||
"restart.confirm.submit": "再起動",
|
||||
"shut-down.complete": "シャットダウン完了",
|
||||
"shut-down.complete-text": "これでデバイスの電源を抜くことができます。",
|
||||
"shut-down.shutting-down": "シャットダウン中",
|
||||
"shut-down.shutting-down-message": "このページを更新したり、シャットダウン中にUmbrelをオフにしないでください。",
|
||||
"shut-down.failed": "シャットダウンに失敗しました",
|
||||
"shut-down.confirm.title": "Umbrelをシャットダウンしてもよろしいですか?",
|
||||
"shut-down.confirm.submit": "シャットダウン",
|
||||
"tor.enable.title": "リモートTorアクセスを有効にする",
|
||||
"tor.enable.failed": "Torを有効にするのに失敗しました",
|
||||
"tor.enable.description": "これには数分かかる場合があります",
|
||||
"tor.disable.description": "これには数分かかる場合があります",
|
||||
"tor.enable.submit": "有効にする",
|
||||
"troubleshoot.umbrelos-description": "umbrelOSおよびシステムログを表示",
|
||||
"troubleshoot.app": "アプリ",
|
||||
"troubleshoot.app-description": "Umbrelにインストールされているアプリのログを表示",
|
||||
"troubleshoot.umbrelos-logs": "umbrelOSログ",
|
||||
"troubleshoot.system-logs": "システムログ",
|
||||
"troubleshoot.system-download": "{{label}}のダウンロード",
|
||||
"troubleshoot.app-download": "{{app}}ログのダウンロード",
|
||||
"app-picker.select-app": "アプリを選択...",
|
||||
"app-picker.search": "検索...",
|
||||
"troubleshoot.share-with-umbrel-support": "Umbrelサポートと共有",
|
||||
"login": "ログイン",
|
||||
"migration-assistant-unsupported-device-description": "Migration Assistantは現在、umbrelOSを実行しているRaspberry PiからUmbrel Homeへのすべてのデータとアプリの転送をサポートしています。Umbrel HomeでMigration Assistantを開いて開始してください。",
|
||||
"migration-assistant.prep.body": "移行の準備",
|
||||
"migration-assistant.prep.button-continue": "続行",
|
||||
"migration-assistant.prep.callout": "あなたのUmbrel Homeにあるデータが永久に削除されます。",
|
||||
"migration-assistant.prep.shut-down-rpi": "Raspberry Pi Umbrelをシャットダウンしてください。",
|
||||
"migration-assistant.prep.connect-disk-to-home": "その外部ドライブをUmbrel Homeの任意のUSBポートに接続してください。",
|
||||
"migration-assistant.prep.prep-done-continue-message": "完了したら、以下の'{{button}}'をクリックしてください。",
|
||||
"migration-assistant.failed": "何か問題が発生しました...",
|
||||
"try-again": "再試行",
|
||||
"migration-assistant.continue-migration.ready.submit": "移行を開始",
|
||||
"migration-assistant.ready.title": "移行の準備が整いました!",
|
||||
"migration-assistant.ready.description": "あなたのすべてのデータとアプリがUmbrel Homeに移行する準備ができました",
|
||||
"migration-assistant.ready.hint-header": "留意事項",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "同じパスワードを使用",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Umbrel Homeにログインする際には、Raspberry Pi Umbrelのパスワードを使用してください",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "アップデート後はRaspberry Piをオフに保つ",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Lightning Nodeなどのアプリで問題が発生しないようにするためです",
|
||||
"migration-assistant.failed.ssd-not-detected.title": "外部ドライブが検出されません",
|
||||
"migration-assistant.failed.ssd-not-detected.description": "Raspberry Piの外部ドライブをUmbrel Homeに接続していることを確認してください",
|
||||
"migration-assistant.failed.incorrect-ssd.title": "互換性のない外部ドライブ",
|
||||
"migration-assistant.failed.incorrect-ssd.description": "Raspberry Piの外部ドライブをUmbrel Homeに接続していることを確認してください",
|
||||
"live-usage": "ライブ使用状況",
|
||||
"unknown-app": "不明なアプリ",
|
||||
"login.title": "おかえりなさい",
|
||||
"login.subtitle": "Umbrelのパスワードを入力してログインしてください",
|
||||
"login.password-label": "パスワード",
|
||||
"login.password.submit": "ログイン",
|
||||
"login-2fa.title": "認証",
|
||||
"login-2fa.subtitle": "認証アプリに表示される2FAコードを入力してください",
|
||||
"not-found-404": "エラーコード: 404",
|
||||
"not-found-404.back": "戻る",
|
||||
"not-found-404.home": "ホームへ行く",
|
||||
"restart.try-again": "再試行",
|
||||
"login-with-umbrel.app-not-found": "アプリが見つかりません。",
|
||||
"login-with-umbrel.title": "Umbrelでログイン",
|
||||
"login-with-umbrel.description": "{{app}}を開くためにUmbrelのパスワードを入力してください",
|
||||
"create-user": "ユーザーを作成",
|
||||
"language.select-description": "好みのumbrelOS言語を選択",
|
||||
"software-update.current-running": "現在のバージョン",
|
||||
"migration-assistant.mobile.start-button": "移行を開始",
|
||||
"tor.enable.mobile.switch-label": "リモートTorアクセスを有効にする",
|
||||
"logout.confirm.title": "ログアウトしてもよろしいですか?",
|
||||
"logout.confirm.submit": "ログアウト",
|
||||
"2fa.enable.success": "二段階認証が有効にされました",
|
||||
"2fa-description": "Umbrelのログインとアプリのための二段階認証",
|
||||
"2fa.disable.success": "二段階認証が無効にされました",
|
||||
"apps.uninstalled-all.success": "すべてのアプリがアンインストールされました",
|
||||
"apps.uninstall.failed-to-get-required-apps": "必要なアプリの取得に失敗しました",
|
||||
"2fa.disable.title": "二段階認証を無効にする",
|
||||
"2fa.enable.or-paste": "または、以下のコードを認証アプリに貼り付けてください",
|
||||
"2fa.enable.scan-this": "Google AuthenticatorやAuthyのような認証アプリでこのQRコードをスキャンしてください",
|
||||
"2fa.enable.success": "二段階認証が有効にされました",
|
||||
"2fa.enable.title": "二段階認証を有効にする",
|
||||
"2fa.enter-code": "認証アプリに表示されるコードを入力してください",
|
||||
"account": "アカウント",
|
||||
"account-description": "あなたの名前とパスワード",
|
||||
"advanced-settings": "詳細設定",
|
||||
"advanced-settings-description": "Terminalを開くか、umbrelOSベータプログラムに登録する",
|
||||
"app-not-found": "アプリが見つかりません: {{app}}",
|
||||
"app-only-over-tor": "{{app}}はTor経由でのみ使用できます。このアプリを開くには、TorブラウザでリモートアクセスURL(設定 > リモートTorアクセス)にアクセスしてください。",
|
||||
"widget.progress.in-progress": "進行中",
|
||||
"change-password.failed.current-required": "現在のパスワードが必要です",
|
||||
"change-password.failed.new-required": "新しいパスワードが必要です",
|
||||
"change-password.failed.repeat-required": "パスワードの再入力が必要です",
|
||||
"change-password.failed.no-match": "パスワードが一致しません",
|
||||
"change-password.failed.must-be-unique": "新しいパスワードは現在のパスワードと異なる必要があります",
|
||||
"change-password.failed.min-length": "パスワードは少なくとも{{characters}}文字である必要があります",
|
||||
"notifications.view": "表示",
|
||||
"notifications.new-version-available": "{{update}}がインストール可能になりました",
|
||||
"notifications.cpu.too-hot": "CPU温度が高い",
|
||||
"notifications.cpu.too-cold": "CPU温度が低い",
|
||||
"notifications.storage.full": "デバイスのストレージがいっぱいです",
|
||||
"notifications.memory.low": "デバイスのメモリが不足しています",
|
||||
"notifications.storage.low": "デバイスのストレージが不足しています",
|
||||
"software-update.success": "umbrelOS {{version}}に正常に更新されました",
|
||||
"software-update.failed": "更新に失敗しました",
|
||||
"software-update.failed-to-check": "アップデートの確認に失敗しました",
|
||||
"change-name.failed.name-required": "名前が必要です",
|
||||
"free": "無料",
|
||||
"app-page.section.about": "約",
|
||||
"app-page.section.credentials.title": "デフォルト資格情報",
|
||||
"app-page.section.info.compatibility": "互換性",
|
||||
"app-page.section.info.compatibility-compatible": "互換あり",
|
||||
"app-page.section.info.developer": "開発者",
|
||||
"app-page.section.info.source-code": "ソースコード",
|
||||
"app-page.section.info.source-code.public": "公開",
|
||||
"app-page.section.info.submitted-by": "提出者",
|
||||
"app-page.section.info.title": "情報",
|
||||
"app-page.section.info.version": "バージョン",
|
||||
"app-page.section.recommendations.title": "おすすめ",
|
||||
"app-page.section.release-notes.title": "新機能",
|
||||
"app-page.section.release-notes.version": "バージョン {{version}}",
|
||||
"app-page.section.requires": "必要条件",
|
||||
"app-page.section.requires.support": "サポートを受ける",
|
||||
"app-picker.search": "検索...",
|
||||
"app-picker.select-app": "アプリを選択...",
|
||||
"app-store.browse-category-apps": "{{category}}アプリを閲覧",
|
||||
"app-store.category.discover": "発見",
|
||||
"app-store.category.ai": "AI",
|
||||
"app-store.category.all": "すべてのアプリ",
|
||||
"app-store.category.files": "ファイル&生産性",
|
||||
"app-store.category.automation": "家庭&自動化",
|
||||
"app-store.category.bitcoin": "ビットコイン",
|
||||
"app-store.category.developer": "開発者ツール",
|
||||
"app-store.category.discover": "発見",
|
||||
"app-store.category.files": "ファイル&生産性",
|
||||
"app-store.category.finance": "金融",
|
||||
"app-store.category.media": "メディア",
|
||||
"app-store.category.networking": "ネットワーキング",
|
||||
"app-store.category.social": "ソーシャル",
|
||||
"app-store.category.automation": "家庭&自動化",
|
||||
"app-store.category.ai": "AI",
|
||||
"app-store.category.developer": "開発者ツール",
|
||||
"community-app-store": "コミュニティApp Store",
|
||||
"community-app-store.loading": "読み込み中...",
|
||||
"community-app-store.back-to-umbrel-app-store": "Umbrel App Storeに戻る",
|
||||
"community-app-store.open-button": "開く",
|
||||
"community-app-store.remove-button": "削除",
|
||||
"community-app-stores.description": "コミュニティApp Storesを使用すると、公式Umbrel App Storeでは入手できないアプリをUmbrelにインストールできます。これにより、開発者が公式Umbrel App Storeでリリースする前にUmbrelアプリのベータ版をテストするのも簡単になります。",
|
||||
"community-app-stores.learn-more": "もっと学ぶ",
|
||||
"community-app-stores.warning": "コミュニティApp Storesは誰でも作成できます。そこに公開されているアプリは、公式Umbrel App Storeチームによって検証されたり、審査されたりすることはありません。不安定または悪意のある可能性があります。注意して使用し、信頼できる開発者からのアプリストアのみを追加してください。",
|
||||
"community-app-stores.add-button": "追加",
|
||||
"desktop.install-first.for-the-self-hoster": "セルフホスティング用",
|
||||
"desktop.install-first.for-the-bitcoiner": "ビットコイナー用",
|
||||
"desktop.install-first.for-the-streamer": "ストリーマー用",
|
||||
"desktop.context-menu.edit-widgets": "ウィジェットを編集",
|
||||
"desktop.context-menu.logout": "ログアウト",
|
||||
"desktop.context-menu.change-wallpaper": "壁紙を変更",
|
||||
"desktop.not-enough-room": "アプリを表示するにはもっと大きな画面を使用してください。",
|
||||
"desktop.app.context.go-to-store-page": "App Storeで表示",
|
||||
"desktop.app.context.show-default-credentials": "デフォルトの資格情報を表示",
|
||||
"desktop.app.context.uninstall": "アンインストール",
|
||||
"desktop.install-first.link-to-app-store": "App Storeでさらに探索",
|
||||
"migrate.callout": "移行が完了するまでUmbrelをオフにしないでください",
|
||||
"app.uninstall.confirm.title": "{{app}}をアンインストールしますか?",
|
||||
"app.uninstall.confirm.submit": "アンインストール",
|
||||
"app.uninstall.confirm.description": "{{app}}に関連するすべてのデータが永久に削除されます。この操作は元に戻せません。",
|
||||
"app.uninstall.deps.used-by.title": "{{app}}は以下のアプリで使用されています",
|
||||
"widgets.edit.title": "ウィジェットを編集",
|
||||
"widgets.edit.select-up-to-3-widgets": "最大3つのウィジェットを選択",
|
||||
"onboarding.create-account": "アカウントを作成",
|
||||
"factory-reset.review.title": "データを確認",
|
||||
"factory-reset.review.following-will-be-removed": "以下のデータがあなたのデバイスから削除されます",
|
||||
"factory-reset.review.installed-apps_one": "{{count}}個のインストール済みアプリ",
|
||||
"factory-reset.review.installed-apps_other": "{{count}}個のインストール済みアプリ",
|
||||
"app.uninstall.deps.used-by.description_one": "{{app}}をアンインストールする前に、最初に{{firstAppToUninstall}}をアンインストールしてください。",
|
||||
"app.uninstall.deps.used-by.description_other": "これらのアプリを最初にアンインストールして、{{app}}をアンインストールしてください。",
|
||||
"app-store.search-apps": "アプリを検索",
|
||||
"app-store.description": "あなたのアプリ更新設定",
|
||||
"app-store.menu.community-app-stores": "コミュニティApp Stores",
|
||||
"app-store.search-apps": "アプリを検索",
|
||||
"app-store.search.no-results": "結果なし",
|
||||
"app-store.search.results-for": "の結果",
|
||||
"factory-reset.review.submit": "続行",
|
||||
"factory-reset.review.account-info": "アカウント情報とパスワード",
|
||||
"factory-reset.review.total-data": "総データ",
|
||||
"factory-reset.review.apps": "アプリ",
|
||||
"onboarding.create-account.failed.name-required": "名前が必要です",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "パスワードが一致しません",
|
||||
"onboarding.create-account.subtitle": "あなたのアカウント情報はあなたのUmbrelにのみ保存されます。パスワードをリセットする方法がないので、安全にバックアップしてください。",
|
||||
"onboarding.contact-support": "サポート",
|
||||
"onboarding.create-account.name.input-placeholder": "あなたの名前",
|
||||
"onboarding.create-account.password.input-label": "パスワード",
|
||||
"onboarding.create-account.confirm-password.input-label": "パスワードの確認",
|
||||
"onboarding.create-account.submit": "作成",
|
||||
"onboarding.create-account.submitting": "作成中",
|
||||
"onboarding.account-created.youre-all-set-name": "準備完了、{{name}}。",
|
||||
"legal.privacy-policy": "プライバシーポリシー",
|
||||
"legal.terms-of-service": "利用規約",
|
||||
"onboarding.account-created.next": "次へ",
|
||||
"onboarding.account-created.page-title": "アカウント作成完了",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "'次へ'をクリックすることで、<linked>umbrelOSの利用規約</linked>に同意することになります",
|
||||
"onboarding.start.title": "umbrelOSへようこそ",
|
||||
"onboarding.start.subtitle": "あなたのホームクラウドサーバーのセットアップが準備できました。",
|
||||
"onboarding.account-created.subtitle": "あなたのUmbrelが準備できました。",
|
||||
"onboarding.start.continue": "開始",
|
||||
"app-page.section.about": "約",
|
||||
"default-credentials.title": "{{app}}の資格情報",
|
||||
"default-credentials.username": "デフォルトユーザー名",
|
||||
"default-credentials.password": "デフォルトパスワード",
|
||||
"default-credentials.open": "{{app}}を開く",
|
||||
"default-credentials.close": "了解",
|
||||
"default-credentials..dont-show-again": "再び表示しない",
|
||||
"default-credentials.description": "アプリにログインするために必要な資格情報です。",
|
||||
"app-page.section.requires": "必要条件",
|
||||
"app-page.section.requires.support": "サポートを受ける",
|
||||
"app-page.section.info.title": "情報",
|
||||
"app-page.section.info.version": "バージョン",
|
||||
"app-page.section.info.source-code": "ソースコード",
|
||||
"app-page.section.info.source-code.public": "公開",
|
||||
"app-page.section.info.developer": "開発者",
|
||||
"app-page.section.info.submitted-by": "提出者",
|
||||
"app-page.section.info.compatibility": "互換性",
|
||||
"app-page.section.info.compatibility-compatible": "互換あり",
|
||||
"app-page.section.recommendations.title": "おすすめ",
|
||||
"app-page.section.release-notes.title": "新機能",
|
||||
"app-page.section.release-notes.version": "バージョン {{version}}",
|
||||
"app-page.section.credentials.title": "デフォルト資格情報",
|
||||
"auto-update": "自動アップデート",
|
||||
"read-less": "もっと少なく読む",
|
||||
"read-more": "もっと読む",
|
||||
"app-store.title": "App Store",
|
||||
"app-updates.less": "少なく",
|
||||
"app-updates.more": "もっと",
|
||||
"app-updates.no-updates": "すべてのアプリが最新です!",
|
||||
"app-updates.update": "更新",
|
||||
"app-updates.update-all": "すべて更新",
|
||||
"app-updates.updates-available-count_one": "{{count}}個のアップデートが利用可能",
|
||||
"app-updates.updates-available-count_other": "{{count}}個のアップデートが利用可能",
|
||||
"app-updates.updating": "更新中...",
|
||||
"app.install": "インストール",
|
||||
"app.installing": "インストール中",
|
||||
"app.offline": "実行されていません",
|
||||
"app.open": "開く",
|
||||
"app.optimized-for-umbrel-home": "Umbrel Homeに最適化",
|
||||
"install-first.title": "{{app}}のインストールにはアクセスが必要",
|
||||
"install-first.description_one": "このアプリをインストールするためには、まず{{app}}をインストールしてください。",
|
||||
"install-first.description_other": "このアプリをインストールするためには、まずこれらのアプリをインストールしてください。",
|
||||
"ok": "OK",
|
||||
"factory-reset.confirm.title": "パスワードで確認",
|
||||
"factory-reset.confirm.body": "リセットするためにUmbrelパスワードを確認してください",
|
||||
"factory-reset.confirm.submit": "すべてを消去してリセット",
|
||||
"factory-reset.confirm.submit-callout": "この操作は元に戻せません。",
|
||||
"factory-reset.confirm.password-label": "パスワードを入力",
|
||||
"factory-reset.resetting.dont-turn-off-device": "リセットが完了するまでデバイスの電源を切らないでください",
|
||||
"factory-reset.resetting.connecting": "接続中",
|
||||
"factory-reset.failed.title": "リセットに失敗しました",
|
||||
"factory-reset.failed.message": "リセット中にエラーが発生しました",
|
||||
"factory-reset.failed.message.please-try-again": "もう一度試してください",
|
||||
"factory-reset.failed.retry": "工場出荷時リセットを再試行",
|
||||
"factory-reset.success.title": "リセット成功",
|
||||
"factory-reset.success.description": "あなたのデバイスからすべてのアプリ、アプリデータ、およびアカウントデータが削除されました。これでデバイスを再起動することができます。",
|
||||
"factory-reset.success.restart-device": "デバイスを再起動",
|
||||
"connecting": "接続中...",
|
||||
"migrate.failed.title": "移行に失敗しました",
|
||||
"migrate.failed.description": "移行中にエラーが発生しました",
|
||||
"migrate.failed.please-try-again": "もう一度試してください",
|
||||
"migrate.failed.retry": "再試行",
|
||||
"migrate.success.title": "移行成功",
|
||||
"migrate.success.description": "あなたのすべてのアプリ、アプリデータ、アカウント詳細がUmbrel Homeに移行されました。",
|
||||
"continue-to-log-in": "ログインを続ける",
|
||||
"trpc.checking-backend": "読み込み中...",
|
||||
"trpc.backend-unavailable": "エラー: システムAPIへの接続に失敗しました",
|
||||
"app.restarting": "再起動中",
|
||||
"app.starting": "起動中",
|
||||
"app.stopped": "停止済み",
|
||||
"app.stopping": "停止中",
|
||||
"app.uninstall.confirm.description": "{{app}}に関連するすべてのデータが永久に削除されます。この操作は元に戻せません。",
|
||||
"app.uninstall.confirm.submit": "アンインストール",
|
||||
"app.uninstall.confirm.title": "{{app}}をアンインストールしますか?",
|
||||
"app.uninstall.deps.used-by.description_one": "{{app}}をアンインストールする前に、最初に{{firstAppToUninstall}}をアンインストールしてください。",
|
||||
"app.uninstall.deps.used-by.description_other": "これらのアプリを最初にアンインストールして、{{app}}をアンインストールしてください。",
|
||||
"app.uninstall.deps.used-by.title": "{{app}}は以下のアプリで使用されています",
|
||||
"app.uninstalling": "アンインストール中",
|
||||
"app.updating": "更新中",
|
||||
"app.view": "表示",
|
||||
"app_one": "アプリ",
|
||||
"app_other": "アプリ",
|
||||
"apps.uninstall.failed-to-get-required-apps": "必要なアプリの取得に失敗しました",
|
||||
"apps.uninstalled-all.success": "すべてのアプリがアンインストールされました",
|
||||
"auth.checking-backend-for-user": "読み込み中...",
|
||||
"auth.failed-checking-if-user-logged-in": "エラー: Authログインチェックに失敗しました",
|
||||
"auth.failed-to-check-if-user-exists": "エラー: Auth存在チェックに失敗しました",
|
||||
"redirect.to-onboarding": "読み込み中...",
|
||||
"redirect.to-login": "読み込み中...",
|
||||
"redirect.to-home": "読み込み中...",
|
||||
"widgets.install-an-app-before-using-widgets": "ウィジェットを使ってホームスクリーンをカスタマイズするには、アプリをインストールしてください。",
|
||||
"logout-error-generic": "エラー: ログアウトに失敗しました",
|
||||
"app.stopping": "停止中",
|
||||
"app.starting": "起動中",
|
||||
"app.restarting": "再起動中",
|
||||
"beta-program": "umbrelOSベータプログラム",
|
||||
"beta-program-description": "umbrelOSのベータアップデートを受け取ることに同意し、新機能への早期アクセスを得て、フィードバックを提供することでそれらの改善に協力してください。ベータアップデートは不安定な場合があり、トラブルシューティングにはTerminalの知識が必要になることがあります。",
|
||||
"cancel": "キャンセル",
|
||||
"change": "変更",
|
||||
"change-name": "名前を変更",
|
||||
"change-name.failed.name-required": "名前が必要です",
|
||||
"change-name.input-placeholder": "あなたの名前",
|
||||
"change-password": "パスワードを変更",
|
||||
"change-password.callout": "パスワードを失った場合、Umbrelにログインできなくなります。安全に保管してください。",
|
||||
"change-password.current-password": "現在のパスワード",
|
||||
"change-password.failed.current-required": "現在のパスワードが必要です",
|
||||
"change-password.failed.min-length": "パスワードは少なくとも{{characters}}文字である必要があります",
|
||||
"change-password.failed.must-be-unique": "新しいパスワードは現在のパスワードと異なる必要があります",
|
||||
"change-password.failed.new-required": "新しいパスワードが必要です",
|
||||
"change-password.failed.no-match": "パスワードが一致しません",
|
||||
"change-password.failed.repeat-required": "パスワードの再入力が必要です",
|
||||
"change-password.new-password": "新しいパスワード",
|
||||
"change-password.repeat-password": "パスワードを再入力",
|
||||
"check-for-latest-version": "最新のumbrelOSアップデートを確認",
|
||||
"clipboard.copied": "コピーしました",
|
||||
"close": "閉じる",
|
||||
"cmdk.change-wallpaper": "壁紙を変更",
|
||||
"cmdk.frequent-apps": "よく使用されるアプリ",
|
||||
"cmdk.input-placeholder": "アプリ、設定、またはアクションを検索",
|
||||
"cmdk.install-from-app-store": "App Storeからインストール",
|
||||
"cmdk.live-usage": "ライブ使用状況",
|
||||
"cmdk.restart-umbrel": "Umbrelを再起動",
|
||||
"cmdk.shutdown-umbrel": "Umbrelをシャットダウン",
|
||||
"cmdk.update-all-apps": "すべてのアプリをアップデート",
|
||||
"cmdk.widgets": "ウィジェット",
|
||||
"community-app-store": "コミュニティApp Store",
|
||||
"community-app-store.back-to-umbrel-app-store": "Umbrel App Storeに戻る",
|
||||
"community-app-store.open-button": "開く",
|
||||
"community-app-store.remove-button": "削除",
|
||||
"community-app-stores.add-button": "追加",
|
||||
"community-app-stores.description": "コミュニティApp Storesを使用すると、公式Umbrel App Storeでは入手できないアプリをUmbrelにインストールできます。これにより、開発者が公式Umbrel App Storeでリリースする前にUmbrelアプリのベータ版をテストするのも簡単になります。",
|
||||
"community-app-stores.learn-more": "もっと学ぶ",
|
||||
"community-app-stores.warning": "コミュニティApp Storesは誰でも作成できます。そこに公開されているアプリは、公式Umbrel App Storeチームによって検証されたり、審査されたりすることはありません。不安定または悪意のある可能性があります。注意して使用し、信頼できる開発者からのアプリストアのみを追加してください。",
|
||||
"confirm": "確認",
|
||||
"connecting": "接続中...",
|
||||
"continue": "続行",
|
||||
"continue-to-log-in": "ログインを続ける",
|
||||
"cpu": "CPU",
|
||||
"cpu-core-count": "{{cores}}スレッド",
|
||||
"troubleshoot-pick-title": "トラブルシューティング",
|
||||
"troubleshoot-no-logs-yet": "まだログはありません",
|
||||
"temperature.too-cold-suggestion": "デバイスの環境を変更することを検討してください",
|
||||
"cmdk.install-from-app-store": "App Storeからインストール",
|
||||
"cmdk.shutdown-umbrel": "Umbrelをシャットダウン",
|
||||
"tor.enable.success": "リモートTorアクセスが有効にされました",
|
||||
"tor.enable.progress": "リモートTorアクセスを有効にしています",
|
||||
"tor.disable.success": "リモートTorアクセスが無効にされました",
|
||||
"tor.disable.progress": "リモートTorアクセスを無効にしています",
|
||||
"tor.hidden-service": "Tor非公開サービスURL",
|
||||
"stop": "停止",
|
||||
"software-update.release-notes.title": "リリースノート",
|
||||
"app-updates.updates-available-count_one": "{{count}}個のアップデートが利用可能",
|
||||
"app-updates.updates-available-count_other": "{{count}}個のアップデートが利用可能",
|
||||
"app-updates.title": "アップデート",
|
||||
"app-updates.update-all": "すべて更新",
|
||||
"app-updates.updating": "更新中...",
|
||||
"app-updates.update": "更新",
|
||||
"app-updates.less": "少なく",
|
||||
"app-updates.more": "もっと",
|
||||
"create-user": "ユーザーを作成",
|
||||
"default-credentials.close": "了解",
|
||||
"default-credentials.description": "アプリにログインするために必要な資格情報です。",
|
||||
"default-credentials.dont-show-again": "これを再度表示しない",
|
||||
"default-credentials.open": "{{app}}を開く",
|
||||
"default-credentials.password": "デフォルトパスワード",
|
||||
"default-credentials.title": "{{app}}の資格情報",
|
||||
"default-credentials.username": "デフォルトユーザー名",
|
||||
"desktop.app.context.go-to-store-page": "App Storeで表示",
|
||||
"desktop.app.context.show-default-credentials": "デフォルトの資格情報を表示",
|
||||
"desktop.app.context.uninstall": "アンインストール",
|
||||
"desktop.context-menu.change-wallpaper": "壁紙を変更",
|
||||
"desktop.context-menu.edit-widgets": "ウィジェットを編集",
|
||||
"desktop.context-menu.logout": "ログアウト",
|
||||
"desktop.greeting.afternoon": "こんにちは、{{name}}",
|
||||
"desktop.greeting.evening": "こんばんは、{{name}}",
|
||||
"desktop.greeting.morning": "おはようございます、{{name}}",
|
||||
"desktop.install-first.for-the-bitcoiner": "ビットコイナー用",
|
||||
"desktop.install-first.for-the-self-hoster": "セルフホスティング用",
|
||||
"desktop.install-first.for-the-streamer": "ストリーマー用",
|
||||
"desktop.install-first.link-to-app-store": "App Storeでさらに探索",
|
||||
"desktop.not-enough-room": "アプリを表示するにはもっと大きな画面を使用してください。",
|
||||
"device": "デバイス",
|
||||
"device-info": "デバイス情報",
|
||||
"device-info-description": "あなたのデバイスに関する情報",
|
||||
"device-info.device": "デバイス",
|
||||
"device-info.model-number": "モデル番号",
|
||||
"device-info.serial-number": "シリアル番号",
|
||||
"device-info.view-info": "情報を見る",
|
||||
"disable": "無効にする",
|
||||
"download-logs": "ログをダウンロード",
|
||||
"factory-reset": "工場出荷時リセット",
|
||||
"factory-reset.confirm.body": "リセットするためにUmbrelパスワードを確認してください",
|
||||
"factory-reset.confirm.password-label": "パスワードを入力",
|
||||
"factory-reset.confirm.submit": "すべてを消去してリセット",
|
||||
"factory-reset.confirm.submit-callout": "この操作は元に戻せません。",
|
||||
"factory-reset.desc": "あなたのumbrelOSのデータとアプリをすべて削除",
|
||||
"factory-reset.failed.message": "リセット中にエラーが発生しました",
|
||||
"factory-reset.failed.retry": "工場出荷時リセットを再試行",
|
||||
"factory-reset.failed.title": "リセットに失敗しました",
|
||||
"factory-reset.reset": "リセット",
|
||||
"factory-reset.resetting.connecting": "接続中",
|
||||
"factory-reset.resetting.dont-turn-off-device": "リセットが完了するまでデバイスの電源を切らないでください",
|
||||
"factory-reset.review.account-info": "アカウント情報とパスワード",
|
||||
"factory-reset.review.apps": "アプリ",
|
||||
"factory-reset.review.following-will-be-removed": "以下のデータがあなたのデバイスから削除されます",
|
||||
"factory-reset.review.installed-apps_one": "{{count}}個のインストール済みアプリ",
|
||||
"factory-reset.review.installed-apps_other": "{{count}}個のインストール済みアプリ",
|
||||
"factory-reset.review.submit": "続行",
|
||||
"factory-reset.review.total-data": "総データ",
|
||||
"factory-reset.success.description": "あなたのデバイスからすべてのアプリ、アプリデータ、およびアカウントデータが削除されました。これでデバイスを再起動することができます。",
|
||||
"factory-reset.success.restart-device": "デバイスを再起動",
|
||||
"factory-reset.success.title": "リセット成功",
|
||||
"hello": "こんにちは",
|
||||
"install-first.description_one": "このアプリをインストールするためには、まず{{app}}をインストールしてください。",
|
||||
"install-first.description_other": "{{app}}をインストールするには、まずこれらのアプリをインストールしてください。",
|
||||
"install-first.title": "{{app}}のインストールにはアクセスが必要",
|
||||
"install-your-first-app": "最初のアプリをインストール",
|
||||
"language": "言語",
|
||||
"language-description": "あなたが好むumbrelOSの言語",
|
||||
"language.select-description": "好みのumbrelOS言語を選択",
|
||||
"linux": "Linux",
|
||||
"live-usage": "ライブ使用状況",
|
||||
"loading": "読み込み中",
|
||||
"local-ip": "ローカルIP",
|
||||
"login-2fa.subtitle": "認証アプリに表示される2FAコードを入力してください",
|
||||
"login-2fa.title": "認証",
|
||||
"login-with-umbrel.description": "{{app}}を開くためにUmbrelのパスワードを入力してください",
|
||||
"login-with-umbrel.title": "Umbrelでログイン",
|
||||
"login.password-label": "パスワード",
|
||||
"login.password.submit": "ログイン",
|
||||
"login.subtitle": "Umbrelのパスワードを入力してログインしてください",
|
||||
"login.title": "おかえりなさい",
|
||||
"logout": "ログアウト",
|
||||
"logout-error-generic": "エラー: ログアウトに失敗しました",
|
||||
"logout.confirm.submit": "ログアウト",
|
||||
"logout.confirm.title": "ログアウトしてもよろしいですか?",
|
||||
"memory": "メモリ",
|
||||
"memory.low": "メモリ不足",
|
||||
"migrate": "移行",
|
||||
"migrate.callout": "移行が完了するまでUmbrelをオフにしないでください",
|
||||
"migrate.failed.retry": "再試行",
|
||||
"migrate.failed.title": "移行に失敗しました",
|
||||
"migrate.success.description": "あなたのすべてのアプリ、アプリデータ、アカウント詳細がUmbrel Homeに移行されました。",
|
||||
"migrate.success.title": "移行成功",
|
||||
"migration-assistant": "移行アシスタント",
|
||||
"migration-assistant-description": "あなたのアプリとデータをRaspberry PiからUmbrel Homeに転送",
|
||||
"migration-assistant-unsupported-device-description": "Migration Assistantは現在、umbrelOSを実行しているRaspberry PiからUmbrel Homeへのすべてのデータとアプリの転送をサポートしています。Umbrel HomeでMigration Assistantを開いて開始してください。",
|
||||
"migration-assistant.continue-migration.ready.submit": "移行を開始",
|
||||
"migration-assistant.failed": "何か問題が発生しました...",
|
||||
"migration-assistant.failed.retrying-message": "再試行中...",
|
||||
"unknown-error": "不明なエラー",
|
||||
"migration-assistant.mobile.start-button": "移行を開始",
|
||||
"migration-assistant.prep.body": "移行の準備",
|
||||
"migration-assistant.prep.button-continue": "続行",
|
||||
"migration-assistant.prep.callout": "あなたのUmbrel Homeにあるデータが永久に削除されます。",
|
||||
"migration-assistant.prep.connect-disk-to-home": "その外部ドライブをUmbrel Homeの任意のUSBポートに接続してください。",
|
||||
"migration-assistant.prep.prep-done-continue-message": "完了したら、以下の'{{button}}'をクリックしてください。",
|
||||
"migration-assistant.prep.shut-down-rpi": "Raspberry Pi Umbrelをシャットダウンしてください。",
|
||||
"migration-assistant.ready.description": "あなたのすべてのデータとアプリがUmbrel Homeに移行する準備ができました",
|
||||
"migration-assistant.ready.hint-header": "留意事項",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Lightning Nodeなどのアプリで問題が発生しないようにするためです",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "アップデート後はRaspberry Piをオフに保つ",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Umbrel Homeにログインする際には、Raspberry Pi Umbrelのパスワードを使用してください",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "同じパスワードを使用",
|
||||
"migration-assistant.ready.title": "移行の準備が整いました!",
|
||||
"name": "名前",
|
||||
"no-forgot-password-message": "パスワードを失った場合、Umbrelにログインできなくなります。安全に保管してください。",
|
||||
"no-results-found": "結果が見つかりませんでした",
|
||||
"not-found-404": "エラーコード: 404",
|
||||
"not-found-404.back": "戻る",
|
||||
"not-found-404.home": "ホームへ行く",
|
||||
"notifications.cpu.too-hot": "CPU温度が高い",
|
||||
"notifications.memory.low": "デバイスのメモリが不足しています",
|
||||
"notifications.new-version-available": "{{update}}がインストール可能になりました",
|
||||
"notifications.storage.full": "デバイスのストレージがいっぱいです",
|
||||
"notifications.view": "表示",
|
||||
"ok": "OK",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "'次へ'をクリックすることで、<linked>umbrelOSの利用規約</linked>に同意することになります",
|
||||
"onboarding.account-created.next": "次へ",
|
||||
"onboarding.account-created.subtitle": "あなたのUmbrelが準備できました。",
|
||||
"onboarding.account-created.youre-all-set-name": "準備完了、{{name}}。",
|
||||
"onboarding.contact-support": "サポート",
|
||||
"onboarding.create-account": "アカウントを作成",
|
||||
"onboarding.create-account.confirm-password.input-label": "パスワードの確認",
|
||||
"onboarding.create-account.failed.name-required": "名前が必要です",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "パスワードが一致しません",
|
||||
"onboarding.create-account.name.input-placeholder": "あなたの名前",
|
||||
"onboarding.create-account.password.input-label": "パスワード",
|
||||
"onboarding.create-account.submit": "作成",
|
||||
"onboarding.create-account.submitting": "作成中",
|
||||
"onboarding.create-account.subtitle": "あなたのアカウント情報はあなたのUmbrelにのみ保存されます。パスワードをリセットする方法がないので、安全にバックアップしてください。",
|
||||
"onboarding.start.continue": "開始",
|
||||
"onboarding.start.subtitle": "あなたのホームクラウドサーバーのセットアップが準備できました。",
|
||||
"onboarding.start.title": "umbrelOSへようこそ",
|
||||
"open": "開く",
|
||||
"open-live-usage": "ライブ使用状況を開く",
|
||||
"password": "パスワード",
|
||||
"preferences": "環境設定",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"read-less": "もっと少なく読む",
|
||||
"read-more": "もっと読む",
|
||||
"redirect.to-home": "読み込み中...",
|
||||
"redirect.to-login": "読み込み中...",
|
||||
"redirect.to-onboarding": "読み込み中...",
|
||||
"remote-tor-access": "リモートTorアクセス",
|
||||
"restart": "再起動",
|
||||
"restart.confirm.submit": "再起動",
|
||||
"restart.confirm.title": "Umbrelを再起動してもよろしいですか?",
|
||||
"restart.restarting": "再起動中",
|
||||
"restart.restarting-message": "このページを更新したり、再起動中にUmbrelをオフにしないでください。",
|
||||
"retry": "再試行",
|
||||
"search": "検索",
|
||||
"settings": "設定",
|
||||
"settings.app-store-preferences.title": "App Storeの設定",
|
||||
"settings.contact-support": "助けが必要ですか?<linked>サポートに連絡する。</linked>",
|
||||
"shut-down": "シャットダウン",
|
||||
"shut-down.complete": "シャットダウン完了",
|
||||
"shut-down.complete-text": "これでデバイスの電源を抜くことができます。",
|
||||
"shut-down.confirm.submit": "シャットダウン",
|
||||
"shut-down.confirm.title": "Umbrelをシャットダウンしてもよろしいですか?",
|
||||
"shut-down.shutting-down": "シャットダウン中",
|
||||
"shut-down.shutting-down-message": "このページを更新したり、シャットダウン中にUmbrelをオフにしないでください。",
|
||||
"software-update.callout": "このページを更新したり、アップデート中にUmbrelをオフにしないでください。",
|
||||
"software-update.check": "アップデートを確認",
|
||||
"software-update.checking": "アップデートを確認中...",
|
||||
"software-update.current-running": "現在のバージョン",
|
||||
"software-update.failed": "更新に失敗しました",
|
||||
"software-update.failed-to-check": "アップデートの確認に失敗しました",
|
||||
"software-update.failed.retry": "再試行",
|
||||
"software-update.install-now": "今すぐインストール",
|
||||
"app-updates.no-updates": "すべてのアプリが最新です!",
|
||||
"continue": "続行",
|
||||
"app.stopped": "停止済み",
|
||||
"software-update.new-version": "新しい{{name}}がインストール可能です",
|
||||
"software-update.on-latest": "最新のumbrelOSを使用中",
|
||||
"software-update.title": "ソフトウェアアップデート",
|
||||
"software-update.updating-to": "{{name}}に更新中",
|
||||
"software-update.view": "表示",
|
||||
"something-left": "{{left}}残っています",
|
||||
"something-went-wrong": "⚠ 何か問題が発生しました",
|
||||
"start": "開始",
|
||||
"stop": "停止",
|
||||
"storage": "ストレージ",
|
||||
"storage.full": "ストレージがいっぱいです",
|
||||
"storage.low": "ストレージ不足",
|
||||
"temp.dangerously-hot": "非常に熱い",
|
||||
"temp.nice": "快適",
|
||||
"temp.normal": "正常",
|
||||
"temp.warm": "暖かい",
|
||||
"temperature": "温度",
|
||||
"temperature.too-hot-suggestion": "デバイスの環境を変更することを検討してください。",
|
||||
"terminal": "Terminal",
|
||||
"terminal-description": "umbrelOSまたはアプリ内でカスタムコマンドを実行",
|
||||
"terminal.umbrelos-description": "umbrelOSでカスタムコマンドを実行",
|
||||
"terminal.app": "アプリ",
|
||||
"terminal.app-description": "特定のアプリ内でカスタムコマンドを実行",
|
||||
"open": "開く",
|
||||
"advanced-settings": "詳細設定",
|
||||
"advanced-settings-description": "Terminalを開くか、umbrelOSベータプログラムに登録する",
|
||||
"beta-program": "umbrelOSベータプログラム",
|
||||
"beta-program-description": "umbrelOSのベータアップデートを受け取ることに同意し、新機能への早期アクセスを得て、フィードバックを提供することでそれらの改善に協力してください。ベータアップデートは不安定な場合があり、トラブルシューティングにはTerminalの知識が必要になることがあります。"
|
||||
}
|
||||
"terminal.umbrelos-description": "umbrelOSでカスタムコマンドを実行",
|
||||
"tor-description": "Torブラウザを使用してどこからでもあなたのUmbrelにアクセス",
|
||||
"tor.disable.description": "これには数分かかる場合があります",
|
||||
"tor.disable.progress": "リモートTorアクセスを無効にしています",
|
||||
"tor.disable.success": "リモートTorアクセスが無効にされました",
|
||||
"tor.enable.description": "これには数分かかる場合があります",
|
||||
"tor.enable.mobile.switch-label": "リモートTorアクセスを有効にする",
|
||||
"tor.enable.submit": "有効にする",
|
||||
"tor.enable.success": "リモートTorアクセスが有効にされました",
|
||||
"tor.enable.title": "リモートTorアクセスを有効にする",
|
||||
"tor.hidden-service": "Tor非公開サービスURL",
|
||||
"troubleshoot": "トラブルシューティング",
|
||||
"troubleshoot-description": "umbrelOSまたはアプリのトラブルシューティング",
|
||||
"troubleshoot-no-logs-yet": "まだログはありません",
|
||||
"troubleshoot-pick-title": "トラブルシューティング",
|
||||
"troubleshoot.app": "アプリ",
|
||||
"troubleshoot.app-description": "Umbrelにインストールされているアプリのログを表示",
|
||||
"troubleshoot.app-download": "{{app}}ログのダウンロード",
|
||||
"troubleshoot.share-with-umbrel-support": "Umbrelサポートと共有",
|
||||
"troubleshoot.system-download": "{{label}}のダウンロード",
|
||||
"troubleshoot.umbrelos-description": "umbrelOSのログを表示",
|
||||
"troubleshoot.umbrelos-logs": "umbrelOSログ",
|
||||
"trpc.backend-unavailable": "エラー: システムAPIへの接続に失敗しました",
|
||||
"trpc.checking-backend": "読み込み中...",
|
||||
"try-again": "再試行",
|
||||
"umbrel": "Umbrel",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"umbrelos": "umbrelOS",
|
||||
"unknown": "不明",
|
||||
"unknown-app": "不明なアプリ",
|
||||
"unknown-error": "不明なエラー",
|
||||
"uptime": "稼働時間",
|
||||
"wallpaper": "壁紙",
|
||||
"wallpaper-description": "あなたのUmbrelの壁紙とテーマ",
|
||||
"widget.progress.in-progress": "進行中",
|
||||
"widgets.edit.select-up-to-3-widgets": "最大3つのウィジェットを選択",
|
||||
"widgets.install-an-app-before-using-widgets": "ウィジェットを使ってホームスクリーンをカスタマイズするには、アプリをインストールしてください。",
|
||||
"wifi": "Wi-Fi",
|
||||
"wifi-connect-insecure-message": "オープンネットワークは安全でない可能性があります",
|
||||
"wifi-connection-failed": "接続できません",
|
||||
"wifi-dangerous-change-confirmation-description": "Wi-Fiネットワークを変更すると、Umbrelから切断される可能性があります。再接続するには、Umbrelとアクセスしているデバイスの両方が同じネットワーク上にあることを確認してください。",
|
||||
"wifi-dangerous-change-confirmation-title": "本当にWi-Fiネットワークを変更しますか?",
|
||||
"wifi-dangerous-disable-confirmation-description": "Wi-Fiを無効にすると、Umbrelから切断される可能性があります。再接続するには、UmbrelにEthernetケーブルを接続し、Umbrelとアクセスしているデバイスの両方が同じネットワーク上にあることを確認してください。",
|
||||
"wifi-dangerous-disable-confirmation-title": "本当にWi-Fiを無効にしますか?",
|
||||
"wifi-description": "デバイスをWi-Fiネットワークに接続します",
|
||||
"wifi-description-long": "デバイスは選択したWi-Fiに接続されたままになります。Ethernetケーブルが取り外されても、起動時に自動的にWi-Fiに再接続されます。",
|
||||
"wifi-no-networks-message": "Wi-Fiネットワークが見つかりません",
|
||||
"wifi-searching": "Wi-Fiネットワークを検索しています...",
|
||||
"wifi-unsupported-device-description": "このデバイスではWi-Fiがサポートされていません。これは、ワイヤレスアダプタがないか、互換性がないためです。",
|
||||
"wifi-view-networks": "ネットワークを表示"
|
||||
}
|
||||
+343
-370
@@ -1,398 +1,371 @@
|
||||
{
|
||||
"hello": "Hallo",
|
||||
"desktop.greeting.morning": "Goedemorgen, {{name}}",
|
||||
"desktop.greeting.afternoon": "Goedemiddag, {{name}}",
|
||||
"desktop.greeting.evening": "Goedenavond, {{name}}",
|
||||
"search": "Zoeken",
|
||||
"settings": "Instellingen",
|
||||
"app-store.title": "App Store",
|
||||
"unknown": "Onbekend",
|
||||
"app_one": "app",
|
||||
"app_other": "apps",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"linux": "Linux",
|
||||
"install-your-first-app": "Installeer je eerste app",
|
||||
"logout": "Uitloggen",
|
||||
"restart": "Herstarten",
|
||||
"shut-down": "Afsluiten",
|
||||
"umbrel": "Umbrel",
|
||||
"device": "Apparaat",
|
||||
"umbrelos": "umbrelOS",
|
||||
"open-live-usage": "Open Live Usage",
|
||||
"account": "Account",
|
||||
"wallpaper": "Achtergrond",
|
||||
"name": "Naam",
|
||||
"password": "Wachtwoord",
|
||||
"account-description": "Je naam en wachtwoord",
|
||||
"wallpaper-description": "Je Umbrel achtergrond en thema",
|
||||
"2fa-description": "Een tweede beveiligingslaag voor je Umbrel login en apps",
|
||||
"tor-description": "Toegang tot je Umbrel van overal met een Tor browser",
|
||||
"migration-assistant": "Migratieassistent",
|
||||
"migration-assistant-description": "Zet al je apps en gegevens over van een Raspberry Pi naar Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "Migratie-assistent ondersteunt momenteel het overzetten van alle gegevens en apps van een Raspberry Pi met umbrelOS naar de Umbrel Home. Open de Migratie-assistent op uw Umbrel Home om te beginnen.",
|
||||
"language": "Taal",
|
||||
"language-description": "Je voorkeurstaal voor umbrelOS",
|
||||
"app-store.description": "Je app-update instellingen",
|
||||
"migrate": "Migreren",
|
||||
"change-name": "Naam wijzigen",
|
||||
"change-password": "Wachtwoord wijzigen",
|
||||
"uptime": "Uptime",
|
||||
"preferences": "Voorkeuren",
|
||||
"troubleshoot": "Probleemoplossing",
|
||||
"troubleshoot-description": "Los problemen op met umbrelOS of een app",
|
||||
"device-info-description": "Informatie over je apparaat",
|
||||
"device-info.view-info": "Bekijk info",
|
||||
"factory-reset": "Fabrieksinstellingen",
|
||||
"factory-reset.reset": "Reset",
|
||||
"factory-reset.desc": "Verwijder al je umbrelOS-gegevens en apps",
|
||||
"software-update.title": "Software-update",
|
||||
"device-info": "Apparaatinformatie",
|
||||
"software-update.on-latest": "Je gebruikt de nieuwste versie van umbrelOS",
|
||||
"check-for-latest-version": "Controleer op de nieuwste update van umbrelOS",
|
||||
"2fa": "2FA",
|
||||
"remote-tor-access": "Toegang op afstand via Tor",
|
||||
"software-update.checking": "Controleren op updates...",
|
||||
"software-update.check": "Controleer op update",
|
||||
"software-update.new-version": "Nieuwe versie {{name}} is beschikbaar om te installeren",
|
||||
"software-update.updating-to": "Update naar {{name}}",
|
||||
"software-update.callout": "Vernieuw deze pagina niet of zet je Umbrel niet uit terwijl het aan het updaten is.",
|
||||
"software-update.failed.title": "Software-update mislukt",
|
||||
"software-update.failed.description": "Er was een fout tijdens de software-update",
|
||||
"software-update.failed.please-try-again": "Probeer het opnieuw",
|
||||
"software-update.failed.retry": "Opnieuw proberen",
|
||||
"update": "update",
|
||||
"software-update.update-now": "Nu updaten",
|
||||
"software-update.view": "Bekijken",
|
||||
"storage": "Opslag",
|
||||
"storage.low": "Weinig opslag",
|
||||
"storage.full": "Opslag vol",
|
||||
"something-left": "{{left}} over",
|
||||
"unexpected-error": "Onverwachte fout",
|
||||
"unexpected-error.heading": "⚠ Fout",
|
||||
"clipboard.copied": "Gekopieerd",
|
||||
"close": "Sluiten",
|
||||
"something-went-wrong": "⚠ Er ging iets mis",
|
||||
"loading": "Laden",
|
||||
"cmdk.input-placeholder": "Zoek naar apps, instellingen of acties",
|
||||
"no-results-found": "Geen resultaten gevonden",
|
||||
"cmdk.restart-umbrel": "Herstart Umbrel",
|
||||
"cmdk.update-all-apps": "Update alle apps",
|
||||
"cmdk.change-wallpaper": "Wijzig achtergrond",
|
||||
"cmdk.live-usage": "Live Usage",
|
||||
"cmdk.widgets": "Widgets",
|
||||
"cmdk.frequent-apps": "Veel gebruikt",
|
||||
"app.offline": "Niet actief",
|
||||
"app.uninstalling": "Verwijderen",
|
||||
"app.install": "Installeren",
|
||||
"app.installing": "Installeren",
|
||||
"app.updating": "Updaten",
|
||||
"app.open": "Open",
|
||||
"app.view": "Bekijk",
|
||||
"retry": "Opnieuw proberen",
|
||||
"download-logs": "Logbestanden downloaden",
|
||||
"page-title-umbrel": "{{title}} – umbrelOS",
|
||||
"desktop.title": "Bureaublad",
|
||||
"notifications": "Meldingen",
|
||||
"device-info.device": "Apparaat",
|
||||
"device-info.model-number": "Modelnummer",
|
||||
"device-info.serial-number": "Serienummer",
|
||||
"memory": "Geheugen",
|
||||
"memory.low": "Weinig geheugen",
|
||||
"no-forgot-password-message": "Als je je wachtwoord verliest, kun je niet inloggen op je Umbrel. Zorg ervoor dat je het veilig bewaart.",
|
||||
"settings.contact-support": "Hulp nodig? <linked>Contact opnemen met ondersteuning.</linked>",
|
||||
"temperature": "Temperatuur",
|
||||
"temperature.too-hot-suggestion": "Overweeg om de omgeving van je apparaat te veranderen.",
|
||||
"temp.dangerously-hot": "Erg heet",
|
||||
"temp.hot": "Heet",
|
||||
"temp.nice": "Aangenaam",
|
||||
"temp.warm": "Warm",
|
||||
"temp.normal": "Normaal",
|
||||
"temp.too-cold": "Te koud",
|
||||
"temp.cool": "Koel",
|
||||
"2fa.disable.title": "Twee-factor authenticatie uitschakelen",
|
||||
"2fa.enter-code": "Voer de code in die wordt weergegeven in je authenticator-app",
|
||||
"2fa.enable.or-paste": "Of plak de volgende code in je authenticator-app",
|
||||
"2fa.enable.title": "Twee-factor authenticatie inschakelen",
|
||||
"2fa.enable.scan-this": "Scan deze QR-code met een authenticator-app zoals Google Authenticator of Authy",
|
||||
"settings.app-store-preferences.title": "App Store voorkeuren",
|
||||
"change-name.input-placeholder": "Jouw naam",
|
||||
"confirm": "Bevestigen",
|
||||
"cancel": "Annuleren",
|
||||
"change-password.callout": "Als je je wachtwoord verliest, kun je niet inloggen op je Umbrel. Zorg ervoor dat je het veilig bewaart.",
|
||||
"change-password.current-password": "Huidig wachtwoord",
|
||||
"change-password.new-password": "Nieuw wachtwoord",
|
||||
"change-password.repeat-password": "Herhaal wachtwoord",
|
||||
"restart.restarting": "Opnieuw opstarten",
|
||||
"restart.restarting-message": "Vernieuw deze pagina niet of zet je Umbrel niet uit terwijl het opnieuw opstart.",
|
||||
"restart.failed": "Opnieuw opstarten mislukt",
|
||||
"restart.confirm.title": "Weet je zeker dat je je Umbrel opnieuw wilt opstarten?",
|
||||
"restart.confirm.submit": "Herstart",
|
||||
"shut-down.complete": "Afsluiten voltooid",
|
||||
"shut-down.complete-text": "Je kunt je apparaat nu loskoppelen van de stroom.",
|
||||
"shut-down.shutting-down": "Afsluiten",
|
||||
"shut-down.shutting-down-message": "Vernieuw deze pagina niet of zet je Umbrel niet uit terwijl het afsluit.",
|
||||
"shut-down.failed": "Afsluiten mislukt",
|
||||
"shut-down.confirm.title": "Weet je zeker dat je je Umbrel wilt afsluiten?",
|
||||
"shut-down.confirm.submit": "Afsluiten",
|
||||
"tor.enable.title": "Toegang op afstand via Tor inschakelen",
|
||||
"tor.enable.failed": "Tor inschakelen mislukt",
|
||||
"tor.enable.description": "Dit kan enkele minuten duren",
|
||||
"tor.disable.description": "Dit kan enkele minuten duren",
|
||||
"tor.enable.submit": "Inschakelen",
|
||||
"troubleshoot.umbrelos-description": "Bekijk umbrelOS en systeemlogbestanden",
|
||||
"troubleshoot.app": "App",
|
||||
"troubleshoot.app-description": "Bekijk logbestanden van een app geïnstalleerd op je Umbrel",
|
||||
"troubleshoot.umbrelos-logs": "umbrelOS logbestanden",
|
||||
"troubleshoot.system-logs": "Systeemlogbestanden",
|
||||
"troubleshoot.system-download": "Download {{label}}",
|
||||
"troubleshoot.app-download": "Download {{app}} logbestanden",
|
||||
"app-picker.select-app": "Selecteer app...",
|
||||
"app-picker.search": "Zoeken...",
|
||||
"troubleshoot.share-with-umbrel-support": "Delen met Umbrel ondersteuning",
|
||||
"login": "Inloggen",
|
||||
"migration-assistant.prep.body": "Voorbereiden voor migratie",
|
||||
"migration-assistant.prep.button-continue": "Doorgaan",
|
||||
"migration-assistant.prep.callout": "De gegevens op je Umbrel Home, indien aanwezig, worden permanent verwijderd.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Zet je Raspberry Pi Umbrel uit.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Sluit de externe schijf aan op elke USB-poort van je Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Klik op '{{button}}' hieronder als je klaar bent.",
|
||||
"migration-assistant.failed": "Er klopt iets niet...",
|
||||
"try-again": "Probeer opnieuw",
|
||||
"migration-assistant.continue-migration.ready.submit": "Start migratie",
|
||||
"migration-assistant.ready.title": "Je bent klaar voor migratie!",
|
||||
"migration-assistant.ready.description": "Al je gegevens en apps zijn klaar om te worden gemigreerd naar je Umbrel Home",
|
||||
"migration-assistant.ready.hint-header": "Dingen om in gedachten te houden",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Gebruik hetzelfde wachtwoord",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Onthoud om je Raspberry Pi Umbrel wachtwoord te gebruiken om in te loggen op je Umbrel Home",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Houd je Raspberry Pi uit na de update",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Dit helpt problemen met apps zoals Lightning Node te voorkomen",
|
||||
"migration-assistant.failed.ssd-not-detected.title": "Kan geen externe schijf detecteren",
|
||||
"migration-assistant.failed.ssd-not-detected.description": "Zorg ervoor dat je de externe schijf van je Raspberry Pi aansluit op je Umbrel Home",
|
||||
"migration-assistant.failed.incorrect-ssd.title": "Incompatibele externe schijf",
|
||||
"migration-assistant.failed.incorrect-ssd.description": "Zorg ervoor dat je de externe schijf van je Raspberry Pi hebt aangesloten op je Umbrel Home",
|
||||
"live-usage": "Live Usage",
|
||||
"unknown-app": "Onbekende app",
|
||||
"login.title": "Welkom terug",
|
||||
"login.subtitle": "Voer je Umbrel wachtwoord in om in te loggen",
|
||||
"login.password-label": "Wachtwoord",
|
||||
"login.password.submit": "Inloggen",
|
||||
"login-2fa.title": "Authenticeren",
|
||||
"login-2fa.subtitle": "Voer de 2FA-code in die wordt weergegeven in je authenticator-app",
|
||||
"not-found-404": "Foutcode: 404",
|
||||
"not-found-404.back": "Terug",
|
||||
"not-found-404.home": "Ga naar Home",
|
||||
"restart.try-again": "Opnieuw proberen",
|
||||
"login-with-umbrel.app-not-found": "App niet gevonden.",
|
||||
"login-with-umbrel.title": "Inloggen met Umbrel",
|
||||
"login-with-umbrel.description": "Voer je Umbrel wachtwoord in om {{app}} te openen",
|
||||
"create-user": "Gebruiker aanmaken",
|
||||
"language.select-description": "Selecteer voorkeurstaal voor umbrelOS",
|
||||
"software-update.current-running": "Je gebruikt",
|
||||
"migration-assistant.mobile.start-button": "Start migratie",
|
||||
"tor.enable.mobile.switch-label": "Toegang op afstand via Tor inschakelen",
|
||||
"logout.confirm.title": "Weet je zeker dat je wilt uitloggen?",
|
||||
"logout.confirm.submit": "Uitloggen",
|
||||
"2fa.enable.success": "Twee-factor authenticatie ingeschakeld",
|
||||
"2fa-description": "Een tweede beveiligingslaag voor je Umbrel login en apps",
|
||||
"2fa.disable.success": "Twee-factor authenticatie uitgeschakeld",
|
||||
"apps.uninstalled-all.success": "Alle apps gedeïnstalleerd",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Kon vereiste apps niet ophalen",
|
||||
"2fa.disable.title": "Twee-factor authenticatie uitschakelen",
|
||||
"2fa.enable.or-paste": "Of plak de volgende code in je authenticator-app",
|
||||
"2fa.enable.scan-this": "Scan deze QR-code met een authenticator-app zoals Google Authenticator of Authy",
|
||||
"2fa.enable.success": "Twee-factor authenticatie ingeschakeld",
|
||||
"2fa.enable.title": "Twee-factor authenticatie inschakelen",
|
||||
"2fa.enter-code": "Voer de code in die wordt weergegeven in je authenticator-app",
|
||||
"account": "Account",
|
||||
"account-description": "Je naam en wachtwoord",
|
||||
"advanced-settings": "Geavanceerde instellingen",
|
||||
"advanced-settings-description": "Open de terminal of meld je aan voor het umbrelOS Beta Programma",
|
||||
"app-not-found": "App niet gevonden: {{app}}",
|
||||
"app-only-over-tor": "{{app}} kan alleen worden gebruikt over Tor. Gebruik een Tor-browser op je externe toegangs-URL (Instellingen > Toegang op afstand via Tor) om deze app te openen.",
|
||||
"widget.progress.in-progress": "Bezig",
|
||||
"change-password.failed.current-required": "Huidig wachtwoord is vereist",
|
||||
"change-password.failed.new-required": "Nieuw wachtwoord is vereist",
|
||||
"change-password.failed.repeat-required": "Herhaal wachtwoord is vereist",
|
||||
"change-password.failed.no-match": "Wachtwoorden komen niet overeen",
|
||||
"change-password.failed.must-be-unique": "Nieuw wachtwoord moet anders zijn dan het huidige wachtwoord",
|
||||
"change-password.failed.min-length": "Wachtwoord moet minstens {{characters}} tekens lang zijn",
|
||||
"notifications.view": "Bekijken",
|
||||
"notifications.new-version-available": "{{update}} is nu beschikbaar om te installeren",
|
||||
"notifications.cpu.too-hot": "Hoge CPU-temperatuur",
|
||||
"notifications.cpu.too-cold": "Lage CPU-temperatuur",
|
||||
"notifications.storage.full": "De opslag van je apparaat is vol",
|
||||
"notifications.memory.low": "Het geheugen van je apparaat is laag",
|
||||
"notifications.storage.low": "De opslag van je apparaat is laag",
|
||||
"software-update.success": "Succesvol geüpdatet naar umbrelOS {{version}}",
|
||||
"software-update.failed": "Update mislukt",
|
||||
"software-update.failed-to-check": "Kon niet controleren op updates",
|
||||
"change-name.failed.name-required": "Naam is vereist",
|
||||
"free": "Gratis",
|
||||
"app-page.section.about": "Over",
|
||||
"app-page.section.credentials.title": "Standaard inloggegevens",
|
||||
"app-page.section.info.compatibility": "Compatibiliteit",
|
||||
"app-page.section.info.compatibility-compatible": "Compatibel",
|
||||
"app-page.section.info.developer": "Ontwikkelaar",
|
||||
"app-page.section.info.source-code": "Broncode",
|
||||
"app-page.section.info.source-code.public": "Publiek",
|
||||
"app-page.section.info.submitted-by": "Ingediend door",
|
||||
"app-page.section.info.title": "Info",
|
||||
"app-page.section.info.version": "Versie",
|
||||
"app-page.section.recommendations.title": "Dit vind je misschien ook leuk",
|
||||
"app-page.section.release-notes.title": "Wat is nieuw",
|
||||
"app-page.section.release-notes.version": "Versie {{version}}",
|
||||
"app-page.section.requires": "Vereist",
|
||||
"app-page.section.requires.support": "Ondersteuning krijgen",
|
||||
"app-picker.search": "Zoeken...",
|
||||
"app-picker.select-app": "Selecteer app...",
|
||||
"app-store.browse-category-apps": "Blader door {{category}} apps",
|
||||
"app-store.category.discover": "Ontdekken",
|
||||
"app-store.category.ai": "AI",
|
||||
"app-store.category.all": "Alle apps",
|
||||
"app-store.category.files": "Bestanden & Productiviteit",
|
||||
"app-store.category.automation": "Huis & Automatisering",
|
||||
"app-store.category.bitcoin": "Bitcoin",
|
||||
"app-store.category.developer": "Ontwikkelaarshulpmiddelen",
|
||||
"app-store.category.discover": "Ontdekken",
|
||||
"app-store.category.files": "Bestanden & Productiviteit",
|
||||
"app-store.category.finance": "Financiën",
|
||||
"app-store.category.media": "Media",
|
||||
"app-store.category.networking": "Netwerken",
|
||||
"app-store.category.social": "Sociaal",
|
||||
"app-store.category.automation": "Huis & Automatisering",
|
||||
"app-store.category.ai": "AI",
|
||||
"app-store.category.developer": "Ontwikkelaarshulpmiddelen",
|
||||
"community-app-store": "Community App Store",
|
||||
"community-app-store.loading": "Laden...",
|
||||
"community-app-store.back-to-umbrel-app-store": "Terug naar Umbrel App Store",
|
||||
"community-app-store.open-button": "Open",
|
||||
"community-app-store.remove-button": "Verwijderen",
|
||||
"community-app-stores.description": "Community App Stores stellen je in staat om apps op je Umbrel te installeren die mogelijk niet beschikbaar zijn in de officiële Umbrel App Store. Ze maken het ook makkelijk om bètaversies van Umbrel-apps te testen voordat ontwikkelaars deze uitbrengen in de officiële Umbrel App Store.",
|
||||
"community-app-stores.learn-more": "Meer informatie",
|
||||
"community-app-stores.warning": "Community App Stores kunnen door iedereen worden gemaakt. De apps die erin worden gepubliceerd zijn niet geverifieerd of gecontroleerd door het officiële Umbrel App Store-team en kunnen mogelijk onveilig of kwaadaardig zijn. Wees voorzichtig en voeg alleen app-winkels toe van ontwikkelaars die je vertrouwt.",
|
||||
"community-app-stores.add-button": "Toevoegen",
|
||||
"desktop.install-first.for-the-self-hoster": "Voor de zelf-hostende",
|
||||
"desktop.install-first.for-the-bitcoiner": "Voor de Bitcoiner",
|
||||
"desktop.install-first.for-the-streamer": "Voor de streamer",
|
||||
"desktop.context-menu.edit-widgets": "Widgets bewerken",
|
||||
"desktop.context-menu.logout": "Uitloggen",
|
||||
"desktop.context-menu.change-wallpaper": "Achtergrond wijzigen",
|
||||
"desktop.not-enough-room": "Gebruik een groter scherm om je apps te bekijken.",
|
||||
"desktop.app.context.go-to-store-page": "Bekijk in App Store",
|
||||
"desktop.app.context.show-default-credentials": "Standaard inloggegevens tonen",
|
||||
"desktop.app.context.uninstall": "Deïnstalleren",
|
||||
"desktop.install-first.link-to-app-store": "Ontdek meer in App Store",
|
||||
"migrate.callout": "Zet je Umbrel niet uit tot de migratie voltooid is",
|
||||
"app.uninstall.confirm.title": "{{app}} deïnstalleren?",
|
||||
"app.uninstall.confirm.submit": "Deïnstalleren",
|
||||
"app.uninstall.confirm.description": "Alle gegevens geassocieerd met {{app}} worden permanent verwijderd. Deze actie kan niet ongedaan worden gemaakt.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} wordt gebruikt door",
|
||||
"widgets.edit.title": "Widgets bewerken",
|
||||
"widgets.edit.select-up-to-3-widgets": "Selecteer tot 3 widgets",
|
||||
"onboarding.create-account": "Account aanmaken",
|
||||
"factory-reset.review.title": "Gegevens controleren",
|
||||
"factory-reset.review.following-will-be-removed": "Het volgende wordt verwijderd van je apparaat",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} geïnstalleerde app",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} geïnstalleerde apps",
|
||||
"app.uninstall.deps.used-by.description_one": "Deïnstalleer eerst {{firstAppToUninstall}} om {{app}} te deïnstalleren.",
|
||||
"app.uninstall.deps.used-by.description_other": "Deïnstalleer deze apps eerst om {{app}} te deïnstalleren.",
|
||||
"app-store.search-apps": "Apps zoeken",
|
||||
"app-store.description": "Je app-update instellingen",
|
||||
"app-store.menu.community-app-stores": "Community App Stores",
|
||||
"app-store.search-apps": "Apps zoeken",
|
||||
"app-store.search.no-results": "Geen resultaten",
|
||||
"app-store.search.results-for": "Resultaten voor",
|
||||
"factory-reset.review.submit": "Doorgaan",
|
||||
"factory-reset.review.account-info": "Accountinformatie en wachtwoord",
|
||||
"factory-reset.review.total-data": "Totale data",
|
||||
"factory-reset.review.apps": "Apps",
|
||||
"onboarding.create-account.failed.name-required": "Naam is vereist",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Wachtwoorden komen niet overeen",
|
||||
"onboarding.create-account.subtitle": "Je accountgegevens worden alleen op je Umbrel opgeslagen. Zorg ervoor dat je je wachtwoord veilig back-upt, want er is geen manier om het te resetten.",
|
||||
"onboarding.contact-support": "Ondersteuning",
|
||||
"onboarding.create-account.name.input-placeholder": "Jouw naam",
|
||||
"onboarding.create-account.password.input-label": "Wachtwoord",
|
||||
"onboarding.create-account.confirm-password.input-label": "Bevestig wachtwoord",
|
||||
"onboarding.create-account.submit": "Aanmaken",
|
||||
"onboarding.create-account.submitting": "Wordt aangemaakt",
|
||||
"onboarding.account-created.youre-all-set-name": "Je bent helemaal klaar, {{name}}.",
|
||||
"legal.privacy-policy": "Privacybeleid",
|
||||
"legal.terms-of-service": "Servicevoorwaarden",
|
||||
"onboarding.account-created.next": "Volgende",
|
||||
"onboarding.account-created.page-title": "Account aangemaakt",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "Door op 'Volgende' te klikken, ga je akkoord met de <linked>umbrelOS Servicevoorwaarden</linked>",
|
||||
"onboarding.start.title": "Welkom bij umbrelOS",
|
||||
"onboarding.start.subtitle": "Je thuis-cloudserver is klaar voor installatie.",
|
||||
"onboarding.account-created.subtitle": "Je Umbrel is nu klaar.",
|
||||
"onboarding.start.continue": "Start",
|
||||
"app-page.section.about": "Over",
|
||||
"default-credentials.title": "Inloggegevens voor {{app}}",
|
||||
"default-credentials.username": "Standaard gebruikersnaam",
|
||||
"default-credentials.password": "Standaard wachtwoord",
|
||||
"default-credentials.open": "Open {{app}}",
|
||||
"default-credentials.close": "Begrepen",
|
||||
"default-credentials..dont-show-again": "Dit niet meer tonen",
|
||||
"default-credentials.description": "Hier zijn de inloggegevens die je nodig hebt om in te loggen op de app.",
|
||||
"app-page.section.requires": "Vereist",
|
||||
"app-page.section.requires.support": "Ondersteuning krijgen",
|
||||
"app-page.section.info.title": "Info",
|
||||
"app-page.section.info.version": "Versie",
|
||||
"app-page.section.info.source-code": "Broncode",
|
||||
"app-page.section.info.source-code.public": "Publiek",
|
||||
"app-page.section.info.developer": "Ontwikkelaar",
|
||||
"app-page.section.info.submitted-by": "Ingediend door",
|
||||
"app-page.section.info.compatibility": "Compatibiliteit",
|
||||
"app-page.section.info.compatibility-compatible": "Compatibel",
|
||||
"app-page.section.recommendations.title": "Dit vind je misschien ook leuk",
|
||||
"app-page.section.release-notes.title": "Wat is nieuw",
|
||||
"app-page.section.release-notes.version": "Versie {{version}}",
|
||||
"app-page.section.credentials.title": "Standaard inloggegevens",
|
||||
"auto-update": "Auto-update",
|
||||
"read-less": "Lees minder",
|
||||
"read-more": "Lees meer",
|
||||
"app-store.title": "App Store",
|
||||
"app-updates.less": "minder",
|
||||
"app-updates.more": "meer",
|
||||
"app-updates.no-updates": "Alle apps zijn up-to-date!",
|
||||
"app-updates.update": "Update",
|
||||
"app-updates.update-all": "Alles updaten",
|
||||
"app-updates.updates-available-count_one": "{{count}} update beschikbaar",
|
||||
"app-updates.updates-available-count_other": "{{count}} updates beschikbaar",
|
||||
"app-updates.updating": "Updaten...",
|
||||
"app.install": "Installeren",
|
||||
"app.installing": "Installeren",
|
||||
"app.offline": "Niet actief",
|
||||
"app.open": "Open",
|
||||
"app.optimized-for-umbrel-home": "Geoptimaliseerd voor Umbrel Home",
|
||||
"install-first.title": "{{app}} vereist toegang tot",
|
||||
"install-first.description_one": "Installeer deze app om {{app}} te installeren.",
|
||||
"install-first.description_other": "Installeer deze apps eerst om {{app}} te installeren.",
|
||||
"ok": "Oké",
|
||||
"factory-reset.confirm.title": "Bevestig met wachtwoord",
|
||||
"factory-reset.confirm.body": "Bevestig Umbrel wachtwoord om te resetten",
|
||||
"factory-reset.confirm.submit": "Alles wissen en resetten",
|
||||
"factory-reset.confirm.submit-callout": "Deze actie kan niet ongedaan worden gemaakt.",
|
||||
"factory-reset.confirm.password-label": "Voer wachtwoord in",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Zet je apparaat niet uit totdat de reset voltooid is",
|
||||
"factory-reset.resetting.connecting": "Verbinden",
|
||||
"factory-reset.failed.title": "Reset mislukt",
|
||||
"factory-reset.failed.message": "Er was een fout tijdens het resetten",
|
||||
"factory-reset.failed.message.please-try-again": "Probeer het opnieuw",
|
||||
"factory-reset.failed.retry": "Probeer de fabrieksreset opnieuw",
|
||||
"factory-reset.success.title": "Reset succesvol",
|
||||
"factory-reset.success.description": "Al je apps, app-gegevens en accountgegevens zijn verwijderd van je apparaat. Je kunt nu je apparaat opnieuw starten.",
|
||||
"factory-reset.success.restart-device": "Apparaat opnieuw starten",
|
||||
"connecting": "Verbinden...",
|
||||
"migrate.failed.title": "Migratie mislukt",
|
||||
"migrate.failed.description": "Er was een fout tijdens de migratie",
|
||||
"migrate.failed.please-try-again": "Probeer het opnieuw",
|
||||
"migrate.failed.retry": "Probeer opnieuw",
|
||||
"migrate.success.title": "Migratie succesvol",
|
||||
"migrate.success.description": "Al je apps, app-gegevens en accountgegevens zijn gemigreerd naar je Umbrel Home.",
|
||||
"continue-to-log-in": "Ga verder om in te loggen",
|
||||
"trpc.checking-backend": "Laden...",
|
||||
"trpc.backend-unavailable": "Fout: Verbinding met de systeem-API mislukt",
|
||||
"app.restarting": "Herstarten",
|
||||
"app.starting": "Starten",
|
||||
"app.stopped": "Gestopt",
|
||||
"app.stopping": "Stoppen",
|
||||
"app.uninstall.confirm.description": "Alle gegevens geassocieerd met {{app}} worden permanent verwijderd. Deze actie kan niet ongedaan worden gemaakt.",
|
||||
"app.uninstall.confirm.submit": "Deïnstalleren",
|
||||
"app.uninstall.confirm.title": "{{app}} deïnstalleren?",
|
||||
"app.uninstall.deps.used-by.description_one": "Deïnstalleer eerst {{firstAppToUninstall}} om {{app}} te deïnstalleren.",
|
||||
"app.uninstall.deps.used-by.description_other": "Deïnstalleer deze apps eerst om {{app}} te deïnstalleren.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} wordt gebruikt door",
|
||||
"app.uninstalling": "Verwijderen",
|
||||
"app.updating": "Updaten",
|
||||
"app.view": "Bekijk",
|
||||
"app_one": "app",
|
||||
"app_other": "apps",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Kon vereiste apps niet ophalen",
|
||||
"apps.uninstalled-all.success": "Alle apps gedeïnstalleerd",
|
||||
"auth.checking-backend-for-user": "Laden...",
|
||||
"auth.failed-checking-if-user-logged-in": "Fout: Controle op inloggen mislukt",
|
||||
"auth.failed-to-check-if-user-exists": "Fout: Controle op bestaan mislukt",
|
||||
"redirect.to-onboarding": "Laden...",
|
||||
"redirect.to-login": "Laden...",
|
||||
"redirect.to-home": "Laden...",
|
||||
"widgets.install-an-app-before-using-widgets": "Installeer een app om je startscherm aan te passen met widgets.",
|
||||
"logout-error-generic": "Fout: Uitloggen mislukt",
|
||||
"app.stopping": "Stoppen",
|
||||
"app.starting": "Starten",
|
||||
"app.restarting": "Herstarten",
|
||||
"beta-program": "umbrelOS Beta Programma",
|
||||
"beta-program-description": "Meld je aan om beta-updates van umbrelOS te ontvangen, krijg vroegtijdig toegang tot nieuwe functies en help ons deze te verfijnen door jouw feedback te geven. Beta-updates kunnen onstabiel zijn en het oplossen van problemen kan bekendheid met de terminal vereisen.",
|
||||
"cancel": "Annuleren",
|
||||
"change": "Veranderen",
|
||||
"change-name": "Naam wijzigen",
|
||||
"change-name.failed.name-required": "Naam is vereist",
|
||||
"change-name.input-placeholder": "Jouw naam",
|
||||
"change-password": "Wachtwoord wijzigen",
|
||||
"change-password.callout": "Als je je wachtwoord verliest, kun je niet inloggen op je Umbrel. Zorg ervoor dat je het veilig bewaart.",
|
||||
"change-password.current-password": "Huidig wachtwoord",
|
||||
"change-password.failed.current-required": "Huidig wachtwoord is vereist",
|
||||
"change-password.failed.min-length": "Wachtwoord moet minstens {{characters}} tekens lang zijn",
|
||||
"change-password.failed.must-be-unique": "Nieuw wachtwoord moet anders zijn dan het huidige wachtwoord",
|
||||
"change-password.failed.new-required": "Nieuw wachtwoord is vereist",
|
||||
"change-password.failed.no-match": "Wachtwoorden komen niet overeen",
|
||||
"change-password.failed.repeat-required": "Herhaal wachtwoord is vereist",
|
||||
"change-password.new-password": "Nieuw wachtwoord",
|
||||
"change-password.repeat-password": "Herhaal wachtwoord",
|
||||
"check-for-latest-version": "Controleer op de nieuwste update van umbrelOS",
|
||||
"clipboard.copied": "Gekopieerd",
|
||||
"close": "Sluiten",
|
||||
"cmdk.change-wallpaper": "Wijzig achtergrond",
|
||||
"cmdk.frequent-apps": "Veel gebruikt",
|
||||
"cmdk.input-placeholder": "Zoek naar apps, instellingen of acties",
|
||||
"cmdk.install-from-app-store": "uit App Store",
|
||||
"cmdk.live-usage": "Live Usage",
|
||||
"cmdk.restart-umbrel": "Herstart Umbrel",
|
||||
"cmdk.shutdown-umbrel": "Umbrel afsluiten",
|
||||
"cmdk.update-all-apps": "Update alle apps",
|
||||
"cmdk.widgets": "Widgets",
|
||||
"community-app-store": "Community App Store",
|
||||
"community-app-store.back-to-umbrel-app-store": "Terug naar Umbrel App Store",
|
||||
"community-app-store.open-button": "Open",
|
||||
"community-app-store.remove-button": "Verwijderen",
|
||||
"community-app-stores.add-button": "Toevoegen",
|
||||
"community-app-stores.description": "Community App Stores stellen je in staat om apps op je Umbrel te installeren die mogelijk niet beschikbaar zijn in de officiële Umbrel App Store. Ze maken het ook makkelijk om bètaversies van Umbrel-apps te testen voordat ontwikkelaars deze uitbrengen in de officiële Umbrel App Store.",
|
||||
"community-app-stores.learn-more": "Meer informatie",
|
||||
"community-app-stores.warning": "Community App Stores kunnen door iedereen worden gemaakt. De apps die erin worden gepubliceerd zijn niet geverifieerd of gecontroleerd door het officiële Umbrel App Store-team en kunnen mogelijk onveilig of kwaadaardig zijn. Wees voorzichtig en voeg alleen app-winkels toe van ontwikkelaars die je vertrouwt.",
|
||||
"confirm": "Bevestigen",
|
||||
"connecting": "Verbinden...",
|
||||
"continue": "Doorgaan",
|
||||
"continue-to-log-in": "Ga verder om in te loggen",
|
||||
"cpu": "CPU",
|
||||
"cpu-core-count": "{{cores}} threads",
|
||||
"troubleshoot-pick-title": "Probleemoplossing",
|
||||
"troubleshoot-no-logs-yet": "Nog geen logbestanden",
|
||||
"temperature.too-cold-suggestion": "Overweeg om de omgeving van je apparaat te veranderen",
|
||||
"cmdk.install-from-app-store": "uit App Store",
|
||||
"cmdk.shutdown-umbrel": "Umbrel afsluiten",
|
||||
"tor.enable.success": "Toegang op afstand via Tor ingeschakeld",
|
||||
"tor.enable.progress": "Toegang op afstand via Tor inschakelen",
|
||||
"tor.disable.success": "Toegang op afstand via Tor uitgeschakeld",
|
||||
"tor.disable.progress": "Toegang op afstand via Tor uitschakelen",
|
||||
"tor.hidden-service": "Tor verborgen dienst URL",
|
||||
"stop": "Stoppen",
|
||||
"software-update.release-notes.title": "Release-opmerkingen",
|
||||
"app-updates.updates-available-count_one": "{{count}} update beschikbaar",
|
||||
"app-updates.updates-available-count_other": "{{count}} updates beschikbaar",
|
||||
"app-updates.title": "Updates",
|
||||
"app-updates.update-all": "Alles updaten",
|
||||
"app-updates.updating": "Updaten...",
|
||||
"app-updates.update": "Update",
|
||||
"app-updates.less": "minder",
|
||||
"app-updates.more": "meer",
|
||||
"create-user": "Gebruiker aanmaken",
|
||||
"default-credentials.close": "Begrepen",
|
||||
"default-credentials.description": "Hier zijn de inloggegevens die je nodig hebt om in te loggen op de app.",
|
||||
"default-credentials.dont-show-again": "Niet meer tonen",
|
||||
"default-credentials.open": "Open {{app}}",
|
||||
"default-credentials.password": "Standaard wachtwoord",
|
||||
"default-credentials.title": "Inloggegevens voor {{app}}",
|
||||
"default-credentials.username": "Standaard gebruikersnaam",
|
||||
"desktop.app.context.go-to-store-page": "Bekijk in App Store",
|
||||
"desktop.app.context.show-default-credentials": "Standaard inloggegevens tonen",
|
||||
"desktop.app.context.uninstall": "Deïnstalleren",
|
||||
"desktop.context-menu.change-wallpaper": "Achtergrond wijzigen",
|
||||
"desktop.context-menu.edit-widgets": "Widgets bewerken",
|
||||
"desktop.context-menu.logout": "Uitloggen",
|
||||
"desktop.greeting.afternoon": "Goedemiddag, {{name}}",
|
||||
"desktop.greeting.evening": "Goedenavond, {{name}}",
|
||||
"desktop.greeting.morning": "Goedemorgen, {{name}}",
|
||||
"desktop.install-first.for-the-bitcoiner": "Voor de Bitcoiner",
|
||||
"desktop.install-first.for-the-self-hoster": "Voor de zelf-hostende",
|
||||
"desktop.install-first.for-the-streamer": "Voor de streamer",
|
||||
"desktop.install-first.link-to-app-store": "Ontdek meer in App Store",
|
||||
"desktop.not-enough-room": "Gebruik een groter scherm om je apps te bekijken.",
|
||||
"device": "Apparaat",
|
||||
"device-info": "Apparaatinformatie",
|
||||
"device-info-description": "Informatie over je apparaat",
|
||||
"device-info.device": "Apparaat",
|
||||
"device-info.model-number": "Modelnummer",
|
||||
"device-info.serial-number": "Serienummer",
|
||||
"device-info.view-info": "Bekijk info",
|
||||
"disable": "Uitschakelen",
|
||||
"download-logs": "Logbestanden downloaden",
|
||||
"factory-reset": "Fabrieksinstellingen",
|
||||
"factory-reset.confirm.body": "Bevestig Umbrel wachtwoord om te resetten",
|
||||
"factory-reset.confirm.password-label": "Voer wachtwoord in",
|
||||
"factory-reset.confirm.submit": "Alles wissen en resetten",
|
||||
"factory-reset.confirm.submit-callout": "Deze actie kan niet ongedaan worden gemaakt.",
|
||||
"factory-reset.desc": "Verwijder al je umbrelOS-gegevens en apps",
|
||||
"factory-reset.failed.message": "Er was een fout tijdens het resetten",
|
||||
"factory-reset.failed.retry": "Probeer de fabrieksreset opnieuw",
|
||||
"factory-reset.failed.title": "Reset mislukt",
|
||||
"factory-reset.reset": "Reset",
|
||||
"factory-reset.resetting.connecting": "Verbinden",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Zet je apparaat niet uit totdat de reset voltooid is",
|
||||
"factory-reset.review.account-info": "Accountinformatie en wachtwoord",
|
||||
"factory-reset.review.apps": "Apps",
|
||||
"factory-reset.review.following-will-be-removed": "Het volgende wordt verwijderd van je apparaat",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} geïnstalleerde app",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} geïnstalleerde apps",
|
||||
"factory-reset.review.submit": "Doorgaan",
|
||||
"factory-reset.review.total-data": "Totale data",
|
||||
"factory-reset.success.description": "Al je apps, app-gegevens en accountgegevens zijn verwijderd van je apparaat. Je kunt nu je apparaat opnieuw starten.",
|
||||
"factory-reset.success.restart-device": "Apparaat opnieuw starten",
|
||||
"factory-reset.success.title": "Reset succesvol",
|
||||
"hello": "Hallo",
|
||||
"install-first.description_one": "Installeer deze app om {{app}} te installeren.",
|
||||
"install-first.description_other": "Installeer deze apps eerst om {{app}} te installeren.",
|
||||
"install-first.title": "{{app}} vereist toegang tot",
|
||||
"install-your-first-app": "Installeer je eerste app",
|
||||
"language": "Taal",
|
||||
"language-description": "Je voorkeurstaal voor umbrelOS",
|
||||
"language.select-description": "Selecteer voorkeurstaal voor umbrelOS",
|
||||
"linux": "Linux",
|
||||
"live-usage": "Live Usage",
|
||||
"loading": "Laden",
|
||||
"local-ip": "Lokale IP",
|
||||
"login-2fa.subtitle": "Voer de 2FA-code in die wordt weergegeven in je authenticator-app",
|
||||
"login-2fa.title": "Authenticeren",
|
||||
"login-with-umbrel.description": "Voer je Umbrel wachtwoord in om {{app}} te openen",
|
||||
"login-with-umbrel.title": "Inloggen met Umbrel",
|
||||
"login.password-label": "Wachtwoord",
|
||||
"login.password.submit": "Inloggen",
|
||||
"login.subtitle": "Voer je Umbrel wachtwoord in om in te loggen",
|
||||
"login.title": "Welkom terug",
|
||||
"logout": "Uitloggen",
|
||||
"logout-error-generic": "Fout: Uitloggen mislukt",
|
||||
"logout.confirm.submit": "Uitloggen",
|
||||
"logout.confirm.title": "Weet je zeker dat je wilt uitloggen?",
|
||||
"memory": "Geheugen",
|
||||
"memory.low": "Weinig geheugen",
|
||||
"migrate": "Migreren",
|
||||
"migrate.callout": "Zet je Umbrel niet uit tot de migratie voltooid is",
|
||||
"migrate.failed.retry": "Probeer opnieuw",
|
||||
"migrate.failed.title": "Migratie mislukt",
|
||||
"migrate.success.description": "Al je apps, app-gegevens en accountgegevens zijn gemigreerd naar je Umbrel Home.",
|
||||
"migrate.success.title": "Migratie succesvol",
|
||||
"migration-assistant": "Migratieassistent",
|
||||
"migration-assistant-description": "Zet al je apps en gegevens over van een Raspberry Pi naar Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "Migratie-assistent ondersteunt momenteel het overzetten van alle gegevens en apps van een Raspberry Pi met umbrelOS naar de Umbrel Home. Open de Migratie-assistent op uw Umbrel Home om te beginnen.",
|
||||
"migration-assistant.continue-migration.ready.submit": "Start migratie",
|
||||
"migration-assistant.failed": "Er klopt iets niet...",
|
||||
"migration-assistant.failed.retrying-message": "Opnieuw proberen...",
|
||||
"unknown-error": "Onbekende fout",
|
||||
"migration-assistant.mobile.start-button": "Start migratie",
|
||||
"migration-assistant.prep.body": "Voorbereiden voor migratie",
|
||||
"migration-assistant.prep.button-continue": "Doorgaan",
|
||||
"migration-assistant.prep.callout": "De gegevens op je Umbrel Home, indien aanwezig, worden permanent verwijderd.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Sluit de externe schijf aan op elke USB-poort van je Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Klik op '{{button}}' hieronder als je klaar bent.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Zet je Raspberry Pi Umbrel uit.",
|
||||
"migration-assistant.ready.description": "Al je gegevens en apps zijn klaar om te worden gemigreerd naar je Umbrel Home",
|
||||
"migration-assistant.ready.hint-header": "Dingen om in gedachten te houden",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Dit helpt problemen met apps zoals Lightning Node te voorkomen",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Houd je Raspberry Pi uit na de update",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Onthoud om je Raspberry Pi Umbrel wachtwoord te gebruiken om in te loggen op je Umbrel Home",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Gebruik hetzelfde wachtwoord",
|
||||
"migration-assistant.ready.title": "Je bent klaar voor migratie!",
|
||||
"name": "Naam",
|
||||
"no-forgot-password-message": "Als je je wachtwoord verliest, kun je niet inloggen op je Umbrel. Zorg ervoor dat je het veilig bewaart.",
|
||||
"no-results-found": "Geen resultaten gevonden",
|
||||
"not-found-404": "Foutcode: 404",
|
||||
"not-found-404.back": "Terug",
|
||||
"not-found-404.home": "Ga naar Home",
|
||||
"notifications.cpu.too-hot": "Hoge CPU-temperatuur",
|
||||
"notifications.memory.low": "Het geheugen van je apparaat is laag",
|
||||
"notifications.new-version-available": "{{update}} is nu beschikbaar om te installeren",
|
||||
"notifications.storage.full": "De opslag van je apparaat is vol",
|
||||
"notifications.view": "Bekijken",
|
||||
"ok": "Oké",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "Door op 'Volgende' te klikken, ga je akkoord met de <linked>umbrelOS Servicevoorwaarden</linked>",
|
||||
"onboarding.account-created.next": "Volgende",
|
||||
"onboarding.account-created.subtitle": "Je Umbrel is nu klaar.",
|
||||
"onboarding.account-created.youre-all-set-name": "Je bent helemaal klaar, {{name}}.",
|
||||
"onboarding.contact-support": "Ondersteuning",
|
||||
"onboarding.create-account": "Account aanmaken",
|
||||
"onboarding.create-account.confirm-password.input-label": "Bevestig wachtwoord",
|
||||
"onboarding.create-account.failed.name-required": "Naam is vereist",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Wachtwoorden komen niet overeen",
|
||||
"onboarding.create-account.name.input-placeholder": "Jouw naam",
|
||||
"onboarding.create-account.password.input-label": "Wachtwoord",
|
||||
"onboarding.create-account.submit": "Aanmaken",
|
||||
"onboarding.create-account.submitting": "Wordt aangemaakt",
|
||||
"onboarding.create-account.subtitle": "Je accountgegevens worden alleen op je Umbrel opgeslagen. Zorg ervoor dat je je wachtwoord veilig back-upt, want er is geen manier om het te resetten.",
|
||||
"onboarding.start.continue": "Start",
|
||||
"onboarding.start.subtitle": "Je thuis-cloudserver is klaar voor installatie.",
|
||||
"onboarding.start.title": "Welkom bij umbrelOS",
|
||||
"open": "Openen",
|
||||
"open-live-usage": "Open Live Usage",
|
||||
"password": "Wachtwoord",
|
||||
"preferences": "Voorkeuren",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"read-less": "Lees minder",
|
||||
"read-more": "Lees meer",
|
||||
"redirect.to-home": "Laden...",
|
||||
"redirect.to-login": "Laden...",
|
||||
"redirect.to-onboarding": "Laden...",
|
||||
"remote-tor-access": "Toegang op afstand via Tor",
|
||||
"restart": "Herstarten",
|
||||
"restart.confirm.submit": "Herstart",
|
||||
"restart.confirm.title": "Weet je zeker dat je je Umbrel opnieuw wilt opstarten?",
|
||||
"restart.restarting": "Opnieuw opstarten",
|
||||
"restart.restarting-message": "Vernieuw deze pagina niet of zet je Umbrel niet uit terwijl het opnieuw opstart.",
|
||||
"retry": "Opnieuw proberen",
|
||||
"search": "Zoeken",
|
||||
"settings": "Instellingen",
|
||||
"settings.app-store-preferences.title": "App Store voorkeuren",
|
||||
"settings.contact-support": "Hulp nodig? <linked>Contact opnemen met ondersteuning.</linked>",
|
||||
"shut-down": "Afsluiten",
|
||||
"shut-down.complete": "Afsluiten voltooid",
|
||||
"shut-down.complete-text": "Je kunt je apparaat nu loskoppelen van de stroom.",
|
||||
"shut-down.confirm.submit": "Afsluiten",
|
||||
"shut-down.confirm.title": "Weet je zeker dat je je Umbrel wilt afsluiten?",
|
||||
"shut-down.shutting-down": "Afsluiten",
|
||||
"shut-down.shutting-down-message": "Vernieuw deze pagina niet of zet je Umbrel niet uit terwijl het afsluit.",
|
||||
"software-update.callout": "Vernieuw deze pagina niet of zet je Umbrel niet uit terwijl het aan het updaten is.",
|
||||
"software-update.check": "Controleer op update",
|
||||
"software-update.checking": "Controleren op updates...",
|
||||
"software-update.current-running": "Je gebruikt",
|
||||
"software-update.failed": "Update mislukt",
|
||||
"software-update.failed-to-check": "Kon niet controleren op updates",
|
||||
"software-update.failed.retry": "Opnieuw proberen",
|
||||
"software-update.install-now": "Nu installeren",
|
||||
"app-updates.no-updates": "Alle apps zijn up-to-date!",
|
||||
"continue": "Doorgaan",
|
||||
"app.stopped": "Gestopt",
|
||||
"software-update.new-version": "Nieuwe versie {{name}} is beschikbaar om te installeren",
|
||||
"software-update.on-latest": "Je gebruikt de nieuwste versie van umbrelOS",
|
||||
"software-update.title": "Software-update",
|
||||
"software-update.updating-to": "Update naar {{name}}",
|
||||
"software-update.view": "Bekijken",
|
||||
"something-left": "{{left}} over",
|
||||
"something-went-wrong": "⚠ Er ging iets mis",
|
||||
"start": "Starten",
|
||||
"stop": "Stoppen",
|
||||
"storage": "Opslag",
|
||||
"storage.full": "Opslag vol",
|
||||
"storage.low": "Weinig opslag",
|
||||
"temp.dangerously-hot": "Erg heet",
|
||||
"temp.nice": "Aangenaam",
|
||||
"temp.normal": "Normaal",
|
||||
"temp.warm": "Warm",
|
||||
"temperature": "Temperatuur",
|
||||
"temperature.too-hot-suggestion": "Overweeg om de omgeving van je apparaat te veranderen.",
|
||||
"terminal": "Terminal",
|
||||
"terminal-description": "Voer aangepaste commando's uit in umbrelOS of binnen een app",
|
||||
"terminal.umbrelos-description": "Voer aangepaste commando's uit in umbrelOS",
|
||||
"terminal.app": "App",
|
||||
"terminal.app-description": "Voer aangepaste commando's uit binnen een specifieke app",
|
||||
"open": "Openen",
|
||||
"advanced-settings": "Geavanceerde instellingen",
|
||||
"advanced-settings-description": "Open de terminal of meld je aan voor het umbrelOS Beta Programma",
|
||||
"beta-program": "umbrelOS Beta Programma",
|
||||
"beta-program-description": "Meld je aan om beta-updates van umbrelOS te ontvangen, krijg vroegtijdig toegang tot nieuwe functies en help ons deze te verfijnen door jouw feedback te geven. Beta-updates kunnen onstabiel zijn en het oplossen van problemen kan bekendheid met de terminal vereisen."
|
||||
}
|
||||
"terminal.umbrelos-description": "Voer aangepaste commando's uit in umbrelOS",
|
||||
"tor-description": "Toegang tot je Umbrel van overal met een Tor browser",
|
||||
"tor.disable.description": "Dit kan enkele minuten duren",
|
||||
"tor.disable.progress": "Toegang op afstand via Tor uitschakelen",
|
||||
"tor.disable.success": "Toegang op afstand via Tor uitgeschakeld",
|
||||
"tor.enable.description": "Dit kan enkele minuten duren",
|
||||
"tor.enable.mobile.switch-label": "Toegang op afstand via Tor inschakelen",
|
||||
"tor.enable.submit": "Inschakelen",
|
||||
"tor.enable.success": "Toegang op afstand via Tor ingeschakeld",
|
||||
"tor.enable.title": "Toegang op afstand via Tor inschakelen",
|
||||
"tor.hidden-service": "Tor verborgen dienst URL",
|
||||
"troubleshoot": "Probleemoplossing",
|
||||
"troubleshoot-description": "Los problemen op met umbrelOS of een app",
|
||||
"troubleshoot-no-logs-yet": "Nog geen logbestanden",
|
||||
"troubleshoot-pick-title": "Probleemoplossing",
|
||||
"troubleshoot.app": "App",
|
||||
"troubleshoot.app-description": "Bekijk logbestanden van een app geïnstalleerd op je Umbrel",
|
||||
"troubleshoot.app-download": "Download {{app}} logbestanden",
|
||||
"troubleshoot.share-with-umbrel-support": "Delen met Umbrel ondersteuning",
|
||||
"troubleshoot.system-download": "Download {{label}}",
|
||||
"troubleshoot.umbrelos-description": "Bekijk umbrelOS-logboeken",
|
||||
"troubleshoot.umbrelos-logs": "umbrelOS logbestanden",
|
||||
"trpc.backend-unavailable": "Fout: Verbinding met de systeem-API mislukt",
|
||||
"trpc.checking-backend": "Laden...",
|
||||
"try-again": "Probeer opnieuw",
|
||||
"umbrel": "Umbrel",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"umbrelos": "umbrelOS",
|
||||
"unknown": "Onbekend",
|
||||
"unknown-app": "Onbekende app",
|
||||
"unknown-error": "Onbekende fout",
|
||||
"uptime": "Uptime",
|
||||
"wallpaper": "Achtergrond",
|
||||
"wallpaper-description": "Je Umbrel achtergrond en thema",
|
||||
"widget.progress.in-progress": "Bezig",
|
||||
"widgets.edit.select-up-to-3-widgets": "Selecteer tot 3 widgets",
|
||||
"widgets.install-an-app-before-using-widgets": "Installeer een app om je startscherm aan te passen met widgets.",
|
||||
"wifi": "Wi-Fi",
|
||||
"wifi-connect-insecure-message": "Open netwerken kunnen onveilig zijn",
|
||||
"wifi-connection-failed": "Kan niet verbinden",
|
||||
"wifi-dangerous-change-confirmation-description": "Het veranderen van het Wi-Fi-netwerk kan je loskoppelen van je Umbrel. Om opnieuw verbinding te maken, zorg ervoor dat zowel je Umbrel als het apparaat waarmee je toegang hebt tot hetzelfde netwerk behoren.",
|
||||
"wifi-dangerous-change-confirmation-title": "Weet je zeker dat je van Wi-Fi-netwerk wilt veranderen?",
|
||||
"wifi-dangerous-disable-confirmation-description": "Het uitschakelen van Wi-Fi kan je loskoppelen van je Umbrel. Om opnieuw verbinding te maken, sluit je een Ethernet-kabel aan op je Umbrel en zorg je ervoor dat zowel je Umbrel als het apparaat waarmee je toegang hebt tot hetzelfde netwerk behoren.",
|
||||
"wifi-dangerous-disable-confirmation-title": "Weet je zeker dat je Wi-Fi wilt uitschakelen?",
|
||||
"wifi-description": "Verbind je apparaat met een Wi-Fi-netwerk",
|
||||
"wifi-description-long": "Je apparaat blijft verbonden met je gekozen Wi-Fi, zelfs als de Ethernet-kabel wordt verwijderd, en verbindt automatisch opnieuw met Wi-Fi bij het opstarten.",
|
||||
"wifi-no-networks-message": "Geen Wi-Fi-netwerken gevonden",
|
||||
"wifi-searching": "Zoeken naar Wi-Fi-netwerken...",
|
||||
"wifi-unsupported-device-description": "Wi-Fi wordt niet ondersteund op dit apparaat. Dit kan te wijten zijn aan een ontbrekende of incompatibele draadloze adapter.",
|
||||
"wifi-view-networks": "Netwerken bekijken"
|
||||
}
|
||||
+344
-370
@@ -1,397 +1,371 @@
|
||||
{
|
||||
"hello": "Olá",
|
||||
"desktop.greeting.morning": "Bom dia, {{name}}",
|
||||
"desktop.greeting.afternoon": "Boa tarde, {{name}}",
|
||||
"desktop.greeting.evening": "Boa noite, {{name}}",
|
||||
"search": "Pesquisar",
|
||||
"settings": "Configurações",
|
||||
"app-store.title": "App Store",
|
||||
"unknown": "Desconhecido",
|
||||
"app_one": "aplicativo",
|
||||
"app_other": "aplicativos",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"linux": "Linux",
|
||||
"install-your-first-app": "Instale seu primeiro aplicativo",
|
||||
"logout": "Sair",
|
||||
"restart": "Reiniciar",
|
||||
"shut-down": "Desligar",
|
||||
"umbrel": "Umbrel",
|
||||
"device": "Dispositivo",
|
||||
"umbrelos": "umbrelOS",
|
||||
"open-live-usage": "Abrir Uso ao Vivo",
|
||||
"account": "Conta",
|
||||
"wallpaper": "Papel de parede",
|
||||
"name": "Nome",
|
||||
"password": "Senha",
|
||||
"account-description": "Seu nome e senha",
|
||||
"wallpaper-description": "Seu papel de parede e tema do Umbrel",
|
||||
"2fa-description": "Uma segunda camada de segurança para o seu login no Umbrel e aplicativos",
|
||||
"tor-description": "Acesse seu Umbrel de qualquer lugar usando um navegador Tor",
|
||||
"migration-assistant": "Assistente de Migração",
|
||||
"migration-assistant-description": "Transfira todos os seus aplicativos e dados de um Raspberry Pi para o Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "O Assistente de Migração atualmente suporta a transferência de todos os dados e aplicativos de um Raspberry Pi rodando umbrelOS para o Umbrel Home. Abra o Assistente de Migração no seu Umbrel Home para começar.",
|
||||
"language": "Idioma",
|
||||
"language-description": "Seu idioma preferido do umbrelOS",
|
||||
"app-store.description": "Suas configurações de atualização de aplicativos",
|
||||
"migrate": "Migrar",
|
||||
"change-name": "Mudar nome",
|
||||
"change-password": "Mudar senha",
|
||||
"uptime": "Tempo de funcionamento",
|
||||
"preferences": "Preferências",
|
||||
"troubleshoot": "Solucionar problemas",
|
||||
"troubleshoot-description": "Solucione problemas do umbrelOS ou de um aplicativo",
|
||||
"device-info-description": "Informações sobre o seu dispositivo",
|
||||
"device-info.view-info": "Ver informações",
|
||||
"factory-reset": "Restauração de Fábrica",
|
||||
"factory-reset.reset": "Restaurar",
|
||||
"factory-reset.desc": "Apagar todos os seus dados e aplicativos do umbrelOS",
|
||||
"software-update.title": "Atualização de software",
|
||||
"device-info": "Informações do dispositivo",
|
||||
"software-update.on-latest": "Você está na última versão do umbrelOS",
|
||||
"check-for-latest-version": "Verificar a última atualização do umbrelOS",
|
||||
"2fa": "2FA",
|
||||
"remote-tor-access": "Acesso remoto Tor",
|
||||
"software-update.checking": "Verificando atualização...",
|
||||
"software-update.check": "Verificar atualização",
|
||||
"software-update.new-version": "Nova versão do {{name}} disponível para instalação",
|
||||
"software-update.updating-to": "Atualizando para {{name}}",
|
||||
"software-update.callout": "Por favor, não atualize esta página ou desligue seu Umbrel enquanto estiver atualizando.",
|
||||
"software-update.failed.title": "Falha na atualização de software",
|
||||
"software-update.failed.description": "Houve um erro durante a atualização de software",
|
||||
"software-update.failed.please-try-again": "Por favor, tente novamente",
|
||||
"software-update.failed.retry": "Tentar novamente",
|
||||
"update": "atualizar",
|
||||
"software-update.update-now": "Atualizar agora",
|
||||
"software-update.view": "Visualizar",
|
||||
"storage": "Armazenamento",
|
||||
"storage.low": "Armazenamento baixo",
|
||||
"storage.full": "Armazenamento cheio",
|
||||
"something-left": "{{left}} restantes",
|
||||
"unexpected-error": "Erro inesperado",
|
||||
"unexpected-error.heading": "⚠ Erro",
|
||||
"clipboard.copied": "Copiado",
|
||||
"close": "Fechar",
|
||||
"something-went-wrong": "⚠ Algo deu errado",
|
||||
"loading": "Carregando",
|
||||
"cmdk.input-placeholder": "Pesquise por aplicativos, configurações ou ações",
|
||||
"no-results-found": "Nenhum resultado encontrado",
|
||||
"cmdk.restart-umbrel": "Reiniciar Umbrel",
|
||||
"cmdk.update-all-apps": "Atualizar todos os aplicativos",
|
||||
"cmdk.change-wallpaper": "Mudar papel de parede",
|
||||
"cmdk.live-usage": "Uso ao Vivo",
|
||||
"cmdk.widgets": "Widgets",
|
||||
"cmdk.frequent-apps": "Usados frequentemente",
|
||||
"app.offline": "Não está em execução",
|
||||
"app.uninstalling": "Desinstalando",
|
||||
"app.install": "Instalar",
|
||||
"app.installing": "Instalando",
|
||||
"app.updating": "Atualizando",
|
||||
"app.open": "Abrir",
|
||||
"app.view": "Visualizar",
|
||||
"retry": "Tentar novamente",
|
||||
"download-logs": "Baixar registros",
|
||||
"page-title-umbrel": "{{title}} – umbrelOS",
|
||||
"desktop.title": "Área de trabalho",
|
||||
"notifications": "Notificações",
|
||||
"device-info.device": "Dispositivo",
|
||||
"device-info.model-number": "Número do modelo",
|
||||
"device-info.serial-number": "Número de série",
|
||||
"memory": "Memória",
|
||||
"memory.low": "Memória baixa",
|
||||
"no-forgot-password-message": "Se você perder sua senha, não será possível fazer login no seu Umbrel. Certifique-se de guardá-la em segurança.",
|
||||
"settings.contact-support": "Precisa de ajuda? <linked>Contate o suporte.</linked>",
|
||||
"temperature": "Temperatura",
|
||||
"temperature.too-hot-suggestion": "Considere mudar o ambiente do seu dispositivo.",
|
||||
"temp.dangerously-hot": "Muito quente",
|
||||
"temp.hot": "Quente",
|
||||
"temp.nice": "Agradável",
|
||||
"temp.warm": "Morno",
|
||||
"temp.normal": "Normal",
|
||||
"temp.too-cold": "Muito frio",
|
||||
"temp.cool": "Frio",
|
||||
"2fa.disable.title": "Desativar autenticação de dois fatores",
|
||||
"2fa.enter-code": "Digite o código exibido no seu aplicativo autenticador",
|
||||
"2fa.enable.or-paste": "Ou cole o seguinte código no seu aplicativo autenticador",
|
||||
"2fa.enable.title": "Ativar autenticação de dois fatores",
|
||||
"2fa.enable.scan-this": "Escanee este código QR usando um aplicativo autenticador como Google Authenticator ou Authy",
|
||||
"settings.app-store-preferences.title": "Preferências da App Store",
|
||||
"change-name.input-placeholder": "Seu nome",
|
||||
"confirm": "Confirmar",
|
||||
"cancel": "Cancelar",
|
||||
"change-password.callout": "Se você perder sua senha, não será possível fazer login no seu Umbrel. Certifique-se de guardá-la em segurança.",
|
||||
"change-password.current-password": "Senha atual",
|
||||
"change-password.new-password": "Nova senha",
|
||||
"change-password.repeat-password": "Repetir senha",
|
||||
"restart.restarting": "Reiniciando",
|
||||
"restart.restarting-message": "Por favor, não atualize esta página ou desligue seu Umbrel enquanto ele está reiniciando.",
|
||||
"restart.failed": "Falha ao reiniciar",
|
||||
"restart.confirm.title": "Você tem certeza de que deseja reiniciar seu Umbrel?",
|
||||
"restart.confirm.submit": "Reiniciar",
|
||||
"shut-down.complete": "Desligamento completo",
|
||||
"shut-down.complete-text": "Agora você pode desconectar seu dispositivo da energia.",
|
||||
"shut-down.shutting-down": "Desligando",
|
||||
"shut-down.shutting-down-message": "Por favor, não atualize esta página ou desligue seu Umbrel enquanto ele está desligando.",
|
||||
"shut-down.failed": "Falha ao desligar",
|
||||
"shut-down.confirm.title": "Você tem certeza de que deseja desligar seu Umbrel?",
|
||||
"shut-down.confirm.submit": "Desligar",
|
||||
"tor.enable.title": "Ativar acesso remoto Tor",
|
||||
"tor.enable.failed": "Falha ao ativar Tor",
|
||||
"tor.enable.description": "Isso pode levar alguns minutos",
|
||||
"tor.disable.description": "Isso pode levar alguns minutos",
|
||||
"tor.enable.submit": "Ativar",
|
||||
"troubleshoot.umbrelos-description": "Ver registros do umbrelOS e do sistema",
|
||||
"troubleshoot.app": "Aplicativo",
|
||||
"troubleshoot.app-description": "Ver registros de um aplicativo instalado no seu Umbrel",
|
||||
"troubleshoot.umbrelos-logs": "Registros do umbrelOS",
|
||||
"troubleshoot.system-logs": "Registros do sistema",
|
||||
"troubleshoot.system-download": "Baixar {{label}}",
|
||||
"troubleshoot.app-download": "Baixar registros do {{app}}",
|
||||
"app-picker.select-app": "Selecionar aplicativo...",
|
||||
"app-picker.search": "Pesquisar...",
|
||||
"troubleshoot.share-with-umbrel-support": "Compartilhar com o Suporte Umbrel",
|
||||
"login": "Login",
|
||||
"migration-assistant.prep.body": "Preparar para migração",
|
||||
"migration-assistant.prep.button-continue": "Continuar",
|
||||
"migration-assistant.prep.callout": "Os dados no seu Umbrel Home, se houver, serão permanentemente excluídos.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Desligue seu Umbrel Raspberry Pi.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Conecte o disco externo ao qualquer porta USB no seu Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Uma vez feito, clique em '{{button}}' abaixo.",
|
||||
"migration-assistant.failed": "Algo não está certo...",
|
||||
"try-again": "Tentar novamente",
|
||||
"migration-assistant.continue-migration.ready.submit": "Iniciar migração",
|
||||
"migration-assistant.ready.title": "Tudo pronto para migrar!",
|
||||
"migration-assistant.ready.description": "Todos os seus dados e aplicativos estão prontos para serem migrados para o seu Umbrel Home",
|
||||
"migration-assistant.ready.hint-header": "Coisas a ter em mente",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Use a mesma senha",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Lembre-se de usar a senha do seu Umbrel Raspberry Pi para fazer login no seu Umbrel Home",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Mantenha seu Raspberry Pi desligado após a atualização",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Isso ajuda a evitar problemas com aplicativos como o Lightning Node",
|
||||
"migration-assistant.failed.ssd-not-detected.title": "Não é possível detectar nenhum disco externo",
|
||||
"migration-assistant.failed.ssd-not-detected.description": "Certifique-se de conectar o disco externo do seu Raspberry Pi ao seu Umbrel Home",
|
||||
"migration-assistant.failed.incorrect-ssd.title": "Disco externo incompatível",
|
||||
"migration-assistant.failed.incorrect-ssd.description": "Certifique-se de que você conectou o disco externo do seu Raspberry Pi ao seu Umbrel Home",
|
||||
"live-usage": "Uso ao Vivo",
|
||||
"unknown-app": "Aplicativo desconhecido",
|
||||
"login.title": "Bem-vindo de volta",
|
||||
"login.subtitle": "Digite sua senha do Umbrel para fazer login",
|
||||
"login.password-label": "Senha",
|
||||
"login.password.submit": "Entrar",
|
||||
"login-2fa.title": "Autenticar",
|
||||
"login-2fa.subtitle": "Digite o código 2FA exibido no seu aplicativo autenticador",
|
||||
"not-found-404": "Código de erro: 404",
|
||||
"not-found-404.back": "Voltar",
|
||||
"not-found-404.home": "Ir para Início",
|
||||
"restart.try-again": "Tentar novamente",
|
||||
"login-with-umbrel.app-not-found": "Aplicativo não encontrado.",
|
||||
"login-with-umbrel.title": "Entrar com Umbrel",
|
||||
"login-with-umbrel.description": "Digite sua senha do Umbrel para abrir {{app}}",
|
||||
"create-user": "Criar usuário",
|
||||
"language.select-description": "Selecionar o idioma preferido do umbrelOS",
|
||||
"software-update.current-running": "Você está em",
|
||||
"migration-assistant.mobile.start-button": "Iniciar migração",
|
||||
"tor.enable.mobile.switch-label": "Ativar acesso remoto Tor",
|
||||
"logout.confirm.title": "Você tem certeza que deseja sair?",
|
||||
"logout.confirm.submit": "Sair",
|
||||
"2fa.enable.success": "Autenticação de dois fatores ativada",
|
||||
"2fa-description": "Uma segunda camada de segurança para o seu login no Umbrel e aplicativos",
|
||||
"2fa.disable.success": "Autenticação de dois fatores desativada",
|
||||
"apps.uninstalled-all.success": "Todos os aplicativos foram desinstalados",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Falha ao obter aplicativos necessários",
|
||||
"2fa.disable.title": "Desativar autenticação de dois fatores",
|
||||
"2fa.enable.or-paste": "Ou cole o seguinte código no seu aplicativo autenticador",
|
||||
"2fa.enable.scan-this": "Escanee este código QR usando um aplicativo autenticador como Google Authenticator ou Authy",
|
||||
"2fa.enable.success": "Autenticação de dois fatores ativada",
|
||||
"2fa.enable.title": "Ativar autenticação de dois fatores",
|
||||
"2fa.enter-code": "Digite o código exibido no seu aplicativo autenticador",
|
||||
"account": "Conta",
|
||||
"account-description": "Seu nome e senha",
|
||||
"advanced-settings": "Configurações avançadas",
|
||||
"advanced-settings-description": "Abra o terminal ou inscreva-se no Programa Beta do umbrelOS",
|
||||
"app-not-found": "Aplicativo não encontrado: {{app}}",
|
||||
"app-only-over-tor": "{{app}} só pode ser usado através do Tor. Por favor, acesse seu Umbrel em um navegador Tor no seu URL de acesso remoto (Configurações > Acesso remoto Tor) para abrir este aplicativo.",
|
||||
"widget.progress.in-progress": "Em andamento",
|
||||
"change-password.failed.current-required": "A senha atual é necessária",
|
||||
"change-password.failed.new-required": "A nova senha é necessária",
|
||||
"change-password.failed.repeat-required": "É necessário repetir a senha",
|
||||
"change-password.failed.no-match": "As senhas não coincidem",
|
||||
"change-password.failed.must-be-unique": "A nova senha deve ser diferente da senha atual",
|
||||
"change-password.failed.min-length": "A senha deve ter pelo menos {{characters}} caracteres",
|
||||
"notifications.view": "Visualizar",
|
||||
"notifications.new-version-available": "{{update}} agora está disponível para instalação",
|
||||
"notifications.cpu.too-hot": "Temperatura alta da CPU",
|
||||
"notifications.cpu.too-cold": "Temperatura baixa da CPU",
|
||||
"notifications.storage.full": "O armazenamento do seu dispositivo está cheio",
|
||||
"notifications.memory.low": "A memória do seu dispositivo está baixa",
|
||||
"notifications.storage.low": "O armazenamento do seu dispositivo está baixo",
|
||||
"software-update.success": "Atualizado com sucesso para umbrelOS {{version}}",
|
||||
"software-update.failed": "Falha ao atualizar",
|
||||
"software-update.failed-to-check": "Falha ao verificar atualizações",
|
||||
"change-name.failed.name-required": "O nome é necessário",
|
||||
"free": "Grátis",
|
||||
"app-page.section.about": "Sobre",
|
||||
"app-page.section.credentials.title": "Credenciais padrão",
|
||||
"app-page.section.info.compatibility": "Compatibilidade",
|
||||
"app-page.section.info.compatibility-compatible": "Compatível",
|
||||
"app-page.section.info.developer": "Desenvolvedor",
|
||||
"app-page.section.info.source-code": "Código-fonte",
|
||||
"app-page.section.info.source-code.public": "Público",
|
||||
"app-page.section.info.submitted-by": "Enviado por",
|
||||
"app-page.section.info.title": "Informações",
|
||||
"app-page.section.info.version": "Versão",
|
||||
"app-page.section.recommendations.title": "Você também pode gostar",
|
||||
"app-page.section.release-notes.title": "O que há de novo",
|
||||
"app-page.section.release-notes.version": "Versão {{version}}",
|
||||
"app-page.section.requires": "Requer",
|
||||
"app-page.section.requires.support": "Obter suporte",
|
||||
"app-picker.search": "Pesquisar...",
|
||||
"app-picker.select-app": "Selecionar aplicativo...",
|
||||
"app-store.browse-category-apps": "Navegar por aplicativos {{category}}",
|
||||
"app-store.category.discover": "Descobrir",
|
||||
"app-store.category.ai": "IA",
|
||||
"app-store.category.all": "Todos os aplicativos",
|
||||
"app-store.category.files": "Arquivos & Produtividade",
|
||||
"app-store.category.automation": "Casa & Automação",
|
||||
"app-store.category.bitcoin": "Bitcoin",
|
||||
"app-store.category.developer": "Ferramentas de Desenvolvedor",
|
||||
"app-store.category.discover": "Descobrir",
|
||||
"app-store.category.files": "Arquivos & Produtividade",
|
||||
"app-store.category.finance": "Finanças",
|
||||
"app-store.category.media": "Mídia",
|
||||
"app-store.category.networking": "Redes",
|
||||
"app-store.category.social": "Social",
|
||||
"app-store.category.automation": "Casa & Automação",
|
||||
"app-store.category.ai": "IA",
|
||||
"app-store.category.developer": "Ferramentas de Desenvolvedor",
|
||||
"community-app-store": "Loja de Aplicativos da Comunidade",
|
||||
"community-app-store.loading": "Carregando...",
|
||||
"community-app-store.back-to-umbrel-app-store": "Voltar para a App Store do Umbrel",
|
||||
"community-app-store.open-button": "Abrir",
|
||||
"community-app-store.remove-button": "Remover",
|
||||
"community-app-stores.description": "As Lojas de Aplicativos da Comunidade permitem instalar aplicativos no seu Umbrel que podem não estar disponíveis na App Store oficial do Umbrel. Eles também facilitam o teste de versões beta de aplicativos Umbrel antes que os desenvolvedores os lancem na App Store oficial do Umbrel.",
|
||||
"community-app-stores.learn-more": "Saiba mais",
|
||||
"community-app-stores.warning": "As Lojas de Aplicativos da Comunidade podem ser criadas por qualquer pessoa. Os aplicativos publicados nelas não são verificados ou avaliados pela equipe da App Store oficial do Umbrel e podem ser potencialmente inseguros ou maliciosos. Use cautela e adicione apenas lojas de aplicativos de desenvolvedores em quem você confia.",
|
||||
"community-app-stores.add-button": "Adicionar",
|
||||
"desktop.install-first.for-the-self-hoster": "Para o auto-hospedeiro",
|
||||
"desktop.install-first.for-the-bitcoiner": "Para o bitcoiner",
|
||||
"desktop.install-first.for-the-streamer": "Para o streamer",
|
||||
"desktop.context-menu.edit-widgets": "Editar widgets",
|
||||
"desktop.context-menu.logout": "Sair",
|
||||
"desktop.context-menu.change-wallpaper": "Mudar papel de parede",
|
||||
"desktop.not-enough-room": "Use uma tela maior para ver seus aplicativos.",
|
||||
"desktop.app.context.go-to-store-page": "Ver na App Store",
|
||||
"desktop.app.context.show-default-credentials": "Mostrar credenciais padrão",
|
||||
"desktop.app.context.uninstall": "Desinstalar",
|
||||
"desktop.install-first.link-to-app-store": "Explorar mais na App Store",
|
||||
"migrate.callout": "Não desligue seu Umbrel até a migração estar completa",
|
||||
"app.uninstall.confirm.title": "Desinstalar {{app}}?",
|
||||
"app.uninstall.confirm.submit": "Desinstalar",
|
||||
"app.uninstall.confirm.description": "Todos os dados associados a {{app}} serão permanentemente excluídos. Esta ação não pode ser desfeita.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} é usado por",
|
||||
"widgets.edit.title": "Editar widgets",
|
||||
"widgets.edit.select-up-to-3-widgets": "Selecione até 3 widgets",
|
||||
"onboarding.create-account": "Criar conta",
|
||||
"factory-reset.review.title": "Revisar dados",
|
||||
"factory-reset.review.following-will-be-removed": "O seguinte será removido do seu dispositivo",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} aplicativo instalado",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} aplicativos instalados",
|
||||
"app.uninstall.deps.used-by.description_one": "Desinstale {{firstAppToUninstall}} primeiro para desinstalar {{app}}.",
|
||||
"app.uninstall.deps.used-by.description_other": "Desinstale estes aplicativos primeiro para desinstalar {{app}}.",
|
||||
"app-store.search-apps": "Pesquisar aplicativos",
|
||||
"app-store.description": "Suas configurações de atualização de aplicativos",
|
||||
"app-store.menu.community-app-stores": "Lojas de Aplicativos da Comunidade",
|
||||
"app-store.search-apps": "Pesquisar aplicativos",
|
||||
"app-store.search.no-results": "Nenhum resultado",
|
||||
"app-store.search.results-for": "Resultados para",
|
||||
"factory-reset.review.submit": "Continuar",
|
||||
"factory-reset.review.account-info": "Informações da conta e senha",
|
||||
"factory-reset.review.total-data": "Dados totais",
|
||||
"factory-reset.review.apps": "Aplicativos",
|
||||
"onboarding.create-account.failed.name-required": "Nome é necessário",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "As senhas não coincidem",
|
||||
"onboarding.create-account.subtitle": "Suas informações de conta são armazenadas apenas no seu Umbrel. Certifique-se de fazer um backup seguro da sua senha, pois não há como redefini-la.",
|
||||
"onboarding.contact-support": "Suporte",
|
||||
"onboarding.create-account.name.input-placeholder": "Seu nome",
|
||||
"onboarding.create-account.password.input-label": "Senha",
|
||||
"onboarding.create-account.confirm-password.input-label": "Confirmar senha",
|
||||
"onboarding.create-account.submit": "Criar",
|
||||
"onboarding.create-account.submitting": "Criando",
|
||||
"onboarding.account-created.youre-all-set-name": "Tudo pronto, {{name}}.",
|
||||
"legal.privacy-policy": "Política de Privacidade",
|
||||
"legal.terms-of-service": "Termos de Serviço",
|
||||
"onboarding.account-created.next": "Próximo",
|
||||
"onboarding.account-created.page-title": "Conta criada",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "Ao clicar em 'Próximo', você concorda com os <linked>Termos de Serviço do umbrelOS</linked>",
|
||||
"onboarding.start.title": "Bem-vindo ao umbrelOS",
|
||||
"onboarding.start.subtitle": "Seu servidor de nuvem doméstico está pronto para ser configurado.",
|
||||
"onboarding.account-created.subtitle": "Seu Umbrel está agora pronto.",
|
||||
"onboarding.start.continue": "Começar",
|
||||
"app-page.section.about": "Sobre",
|
||||
"default-credentials.title": "Credenciais para {{app}}",
|
||||
"default-credentials.username": "Nome de usuário padrão",
|
||||
"default-credentials.password": "Senha padrão",
|
||||
"default-credentials.open": "Abrir {{app}}",
|
||||
"default-credentials.close": "Entendi",
|
||||
"default-credentials..dont-show-again": "Não mostrar novamente",
|
||||
"default-credentials.description": "Aqui estão as credenciais que você precisará para fazer login no aplicativo.",
|
||||
"app-page.section.requires": "Requer",
|
||||
"app-page.section.requires.support": "Obter suporte",
|
||||
"app-page.section.info.title": "Informações",
|
||||
"app-page.section.info.version": "Versão",
|
||||
"app-page.section.info.source-code": "Código-fonte",
|
||||
"app-page.section.info.source-code.public": "Público",
|
||||
"app-page.section.info.developer": "Desenvolvedor",
|
||||
"app-page.section.info.submitted-by": "Enviado por",
|
||||
"app-page.section.info.compatibility": "Compatibilidade",
|
||||
"app-page.section.info.compatibility-compatible": "Compatível",
|
||||
"app-page.section.recommendations.title": "Você também pode gostar",
|
||||
"app-page.section.release-notes.title": "O que há de novo",
|
||||
"app-page.section.release-notes.version": "Versão {{version}}",
|
||||
"app-page.section.credentials.title": "Credenciais padrão",
|
||||
"auto-update": "Atualização automática",
|
||||
"read-less": "Ler menos",
|
||||
"read-more": "Ler mais",
|
||||
"app-store.title": "App Store",
|
||||
"app-updates.less": "menos",
|
||||
"app-updates.more": "mais",
|
||||
"app-updates.no-updates": "Todos os aplicativos estão atualizados!",
|
||||
"app-updates.update": "Atualizar",
|
||||
"app-updates.update-all": "Atualizar todos",
|
||||
"app-updates.updates-available-count_one": "{{count}} atualização disponível",
|
||||
"app-updates.updates-available-count_other": "{{count}} atualizações disponíveis",
|
||||
"app-updates.updating": "Atualizando...",
|
||||
"app.install": "Instalar",
|
||||
"app.installing": "Instalando",
|
||||
"app.offline": "Não está em execução",
|
||||
"app.open": "Abrir",
|
||||
"app.optimized-for-umbrel-home": "Otimizado para Umbrel Home",
|
||||
"install-first.title": "{{app}} requer acesso a",
|
||||
"install-first.description_one": "Instale este aplicativo para instalar {{app}}.",
|
||||
"install-first.description_other": "Instale esses aplicativos primeiro para instalar {{app}}.",
|
||||
"ok": "OK",
|
||||
"factory-reset.confirm.title": "Confirmar com senha",
|
||||
"factory-reset.confirm.body": "Confirme a senha do Umbrel para resetar",
|
||||
"factory-reset.confirm.submit": "Apagar tudo e resetar",
|
||||
"factory-reset.confirm.submit-callout": "Esta ação não pode ser desfeita.",
|
||||
"factory-reset.confirm.password-label": "Digite a senha",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Não desligue seu dispositivo até o reset estar completo",
|
||||
"factory-reset.resetting.connecting": "Conectando",
|
||||
"factory-reset.failed.title": "Reset falhou",
|
||||
"factory-reset.failed.message": "Houve um erro durante o reset",
|
||||
"factory-reset.failed.message.please-try-again": "Por favor, tente novamente",
|
||||
"factory-reset.failed.retry": "Tentar resetar novamente",
|
||||
"factory-reset.success.title": "Reset bem-sucedido",
|
||||
"factory-reset.success.description": "Todos os seus aplicativos, dados de aplicativos e dados da conta foram excluídos do seu dispositivo. Agora você pode reiniciar o seu dispositivo.",
|
||||
"factory-reset.success.restart-device": "Reiniciar dispositivo",
|
||||
"connecting": "Conectando...",
|
||||
"migrate.failed.title": "Falha na migração",
|
||||
"migrate.failed.description": "Houve um erro durante a migração",
|
||||
"migrate.failed.please-try-again": "Por favor, tente novamente",
|
||||
"migrate.failed.retry": "Tentar novamente",
|
||||
"migrate.success.title": "Migração bem-sucedida",
|
||||
"migrate.success.description": "Todos os seus aplicativos, dados de aplicativos e detalhes da conta foram migrados para o seu Umbrel Home.",
|
||||
"continue-to-log-in": "Continuar para o login",
|
||||
"trpc.checking-backend": "Carregando...",
|
||||
"trpc.backend-unavailable": "Erro: A conexão com a API do sistema falhou",
|
||||
"app.restarting": "Reiniciando",
|
||||
"app.starting": "Iniciando",
|
||||
"app.stopped": "Parado",
|
||||
"app.stopping": "Parando",
|
||||
"app.uninstall.confirm.description": "Todos os dados associados a {{app}} serão permanentemente excluídos. Esta ação não pode ser desfeita.",
|
||||
"app.uninstall.confirm.submit": "Desinstalar",
|
||||
"app.uninstall.confirm.title": "Desinstalar {{app}}?",
|
||||
"app.uninstall.deps.used-by.description_one": "Desinstale {{firstAppToUninstall}} primeiro para desinstalar {{app}}.",
|
||||
"app.uninstall.deps.used-by.description_other": "Desinstale estes aplicativos primeiro para desinstalar {{app}}.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} é usado por",
|
||||
"app.uninstalling": "Desinstalando",
|
||||
"app.updating": "Atualizando",
|
||||
"app.view": "Visualizar",
|
||||
"app_one": "aplicativo",
|
||||
"app_other": "aplicativos",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Falha ao obter aplicativos necessários",
|
||||
"apps.uninstalled-all.success": "Todos os aplicativos foram desinstalados",
|
||||
"auth.checking-backend-for-user": "Carregando...",
|
||||
"auth.failed-checking-if-user-logged-in": "Erro: A verificação de login falhou",
|
||||
"auth.failed-to-check-if-user-exists": "Erro: A verificação de existência falhou",
|
||||
"redirect.to-onboarding": "Carregando...",
|
||||
"redirect.to-login": "Carregando...",
|
||||
"redirect.to-home": "Carregando...",
|
||||
"widgets.install-an-app-before-using-widgets": "Instale um aplicativo para começar a personalizar sua tela inicial com widgets.",
|
||||
"logout-error-generic": "Erro: Falha ao sair",
|
||||
"app.stopping": "Parando",
|
||||
"app.starting": "Iniciando",
|
||||
"app.restarting": "Reiniciando",
|
||||
"beta-program": "Programa Beta do umbrelOS",
|
||||
"beta-program-description": "Opte por receber atualizações beta do umbrelOS, obtenha acesso antecipado a novas funcionalidades e ajude-nos a refiná-las fornecendo seu feedback. Atualizações beta podem ser instáveis e a solução de problemas pode requerer familiaridade com o terminal.",
|
||||
"cancel": "Cancelar",
|
||||
"change": "Mudar",
|
||||
"change-name": "Mudar nome",
|
||||
"change-name.failed.name-required": "O nome é necessário",
|
||||
"change-name.input-placeholder": "Seu nome",
|
||||
"change-password": "Mudar senha",
|
||||
"change-password.callout": "Se você perder sua senha, não será possível fazer login no seu Umbrel. Certifique-se de guardá-la em segurança.",
|
||||
"change-password.current-password": "Senha atual",
|
||||
"change-password.failed.current-required": "A senha atual é necessária",
|
||||
"change-password.failed.min-length": "A senha deve ter pelo menos {{characters}} caracteres",
|
||||
"change-password.failed.must-be-unique": "A nova senha deve ser diferente da senha atual",
|
||||
"change-password.failed.new-required": "A nova senha é necessária",
|
||||
"change-password.failed.no-match": "As senhas não coincidem",
|
||||
"change-password.failed.repeat-required": "É necessário repetir a senha",
|
||||
"change-password.new-password": "Nova senha",
|
||||
"change-password.repeat-password": "Repetir senha",
|
||||
"check-for-latest-version": "Verificar a última atualização do umbrelOS",
|
||||
"clipboard.copied": "Copiado",
|
||||
"close": "Fechar",
|
||||
"cmdk.change-wallpaper": "Mudar papel de parede",
|
||||
"cmdk.frequent-apps": "Usados frequentemente",
|
||||
"cmdk.input-placeholder": "Pesquise por aplicativos, configurações ou ações",
|
||||
"cmdk.install-from-app-store": "da App Store",
|
||||
"cmdk.live-usage": "Uso ao Vivo",
|
||||
"cmdk.restart-umbrel": "Reiniciar Umbrel",
|
||||
"cmdk.shutdown-umbrel": "Desligar Umbrel",
|
||||
"cmdk.update-all-apps": "Atualizar todos os aplicativos",
|
||||
"cmdk.widgets": "Widgets",
|
||||
"community-app-store": "Loja de Aplicativos da Comunidade",
|
||||
"community-app-store.back-to-umbrel-app-store": "Voltar para a App Store do Umbrel",
|
||||
"community-app-store.open-button": "Abrir",
|
||||
"community-app-store.remove-button": "Remover",
|
||||
"community-app-stores.add-button": "Adicionar",
|
||||
"community-app-stores.description": "As Lojas de Aplicativos da Comunidade permitem instalar aplicativos no seu Umbrel que podem não estar disponíveis na App Store oficial do Umbrel. Eles também facilitam o teste de versões beta de aplicativos Umbrel antes que os desenvolvedores os lancem na App Store oficial do Umbrel.",
|
||||
"community-app-stores.learn-more": "Saiba mais",
|
||||
"community-app-stores.warning": "As Lojas de Aplicativos da Comunidade podem ser criadas por qualquer pessoa. Os aplicativos publicados nelas não são verificados ou avaliados pela equipe da App Store oficial do Umbrel e podem ser potencialmente inseguros ou maliciosos. Use cautela e adicione apenas lojas de aplicativos de desenvolvedores em quem você confia.",
|
||||
"confirm": "Confirmar",
|
||||
"connecting": "Conectando...",
|
||||
"continue": "Continuar",
|
||||
"continue-to-log-in": "Continuar para o login",
|
||||
"cpu": "CPU",
|
||||
"cpu-core-count": "{{cores}} núcleos",
|
||||
"troubleshoot-pick-title": "Solucionar problemas",
|
||||
"troubleshoot-no-logs-yet": "Ainda não há registros",
|
||||
"temperature.too-cold-suggestion": "Considere mudar o ambiente do seu dispositivo",
|
||||
"cmdk.install-from-app-store": "da App Store",
|
||||
"cmdk.shutdown-umbrel": "Desligar Umbrel",
|
||||
"tor.enable.success": "Acesso remoto Tor ativado",
|
||||
"tor.enable.progress": "Ativando acesso remoto Tor",
|
||||
"tor.disable.success": "Acesso remoto Tor desativado",
|
||||
"tor.disable.progress": "Desativando acesso remoto Tor",
|
||||
"tor.hidden-service": "URL do serviço oculto Tor",
|
||||
"stop": "Parar",
|
||||
"software-update.release-notes.title": "Notas da versão",
|
||||
"app-updates.updates-available-count_one": "{{count}} atualização disponível",
|
||||
"app-updates.updates-available-count_other": "{{count}} atualizações disponíveis",
|
||||
"app-updates.title": "Atualizações",
|
||||
"app-updates.update-all": "Atualizar todos",
|
||||
"app-updates.updating": "Atualizando...",
|
||||
"app-updates.update": "Atualizar",
|
||||
"app-updates.less": "menos",
|
||||
"app-updates.more": "mais",
|
||||
"create-user": "Criar usuário",
|
||||
"default-credentials.close": "Entendi",
|
||||
"default-credentials.description": "Aqui estão as credenciais que você precisará para fazer login no aplicativo.",
|
||||
"default-credentials.dont-show-again": "Não mostrar isso novamente",
|
||||
"default-credentials.open": "Abrir {{app}}",
|
||||
"default-credentials.password": "Senha padrão",
|
||||
"default-credentials.title": "Credenciais para {{app}}",
|
||||
"default-credentials.username": "Nome de usuário padrão",
|
||||
"desktop.app.context.go-to-store-page": "Ver na App Store",
|
||||
"desktop.app.context.show-default-credentials": "Mostrar credenciais padrão",
|
||||
"desktop.app.context.uninstall": "Desinstalar",
|
||||
"desktop.context-menu.change-wallpaper": "Mudar papel de parede",
|
||||
"desktop.context-menu.edit-widgets": "Editar widgets",
|
||||
"desktop.context-menu.logout": "Sair",
|
||||
"desktop.greeting.afternoon": "Boa tarde, {{name}}",
|
||||
"desktop.greeting.evening": "Boa noite, {{name}}",
|
||||
"desktop.greeting.morning": "Bom dia, {{name}}",
|
||||
"desktop.install-first.for-the-bitcoiner": "Para o bitcoiner",
|
||||
"desktop.install-first.for-the-self-hoster": "Para o auto-hospedeiro",
|
||||
"desktop.install-first.for-the-streamer": "Para o streamer",
|
||||
"desktop.install-first.link-to-app-store": "Explorar mais na App Store",
|
||||
"desktop.not-enough-room": "Use uma tela maior para ver seus aplicativos.",
|
||||
"device": "Dispositivo",
|
||||
"device-info": "Informações do dispositivo",
|
||||
"device-info-description": "Informações sobre o seu dispositivo",
|
||||
"device-info.device": "Dispositivo",
|
||||
"device-info.model-number": "Número do modelo",
|
||||
"device-info.serial-number": "Número de série",
|
||||
"device-info.view-info": "Ver informações",
|
||||
"disable": "Desativar",
|
||||
"download-logs": "Baixar registros",
|
||||
"factory-reset": "Restauração de Fábrica",
|
||||
"factory-reset.confirm.body": "Confirme a senha do Umbrel para resetar",
|
||||
"factory-reset.confirm.password-label": "Digite a senha",
|
||||
"factory-reset.confirm.submit": "Apagar tudo e resetar",
|
||||
"factory-reset.confirm.submit-callout": "Esta ação não pode ser desfeita.",
|
||||
"factory-reset.desc": "Apagar todos os seus dados e aplicativos do umbrelOS",
|
||||
"factory-reset.failed.message": "Houve um erro durante o reset",
|
||||
"factory-reset.failed.retry": "Tentar resetar novamente",
|
||||
"factory-reset.failed.title": "Reset falhou",
|
||||
"factory-reset.reset": "Restaurar",
|
||||
"factory-reset.resetting.connecting": "Conectando",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Não desligue seu dispositivo até o reset estar completo",
|
||||
"factory-reset.review.account-info": "Informações da conta e senha",
|
||||
"factory-reset.review.apps": "Aplicativos",
|
||||
"factory-reset.review.following-will-be-removed": "O seguinte será removido do seu dispositivo",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} aplicativo instalado",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} aplicativos instalados",
|
||||
"factory-reset.review.submit": "Continuar",
|
||||
"factory-reset.review.total-data": "Dados totais",
|
||||
"factory-reset.success.description": "Todos os seus aplicativos, dados de aplicativos e dados da conta foram excluídos do seu dispositivo. Agora você pode reiniciar o seu dispositivo.",
|
||||
"factory-reset.success.restart-device": "Reiniciar dispositivo",
|
||||
"factory-reset.success.title": "Reset bem-sucedido",
|
||||
"hello": "Olá",
|
||||
"install-first.description_one": "Instale este aplicativo para instalar {{app}}.",
|
||||
"install-first.description_other": "Instale esses aplicativos primeiro para instalar {{app}}.",
|
||||
"install-first.title": "{{app}} requer acesso a",
|
||||
"install-your-first-app": "Instale seu primeiro aplicativo",
|
||||
"language": "Idioma",
|
||||
"language-description": "Seu idioma preferido do umbrelOS",
|
||||
"language.select-description": "Selecionar o idioma preferido do umbrelOS",
|
||||
"linux": "Linux",
|
||||
"live-usage": "Uso ao Vivo",
|
||||
"loading": "Carregando",
|
||||
"local-ip": "IP Local",
|
||||
"login-2fa.subtitle": "Digite o código 2FA exibido no seu aplicativo autenticador",
|
||||
"login-2fa.title": "Autenticar",
|
||||
"login-with-umbrel.description": "Digite sua senha do Umbrel para abrir {{app}}",
|
||||
"login-with-umbrel.title": "Entrar com Umbrel",
|
||||
"login.password-label": "Senha",
|
||||
"login.password.submit": "Entrar",
|
||||
"login.subtitle": "Digite sua senha do Umbrel para fazer login",
|
||||
"login.title": "Bem-vindo de volta",
|
||||
"logout": "Sair",
|
||||
"logout-error-generic": "Erro: Falha ao sair",
|
||||
"logout.confirm.submit": "Sair",
|
||||
"logout.confirm.title": "Você tem certeza que deseja sair?",
|
||||
"memory": "Memória",
|
||||
"memory.low": "Memória baixa",
|
||||
"migrate": "Migrar",
|
||||
"migrate.callout": "Não desligue seu Umbrel até a migração estar completa",
|
||||
"migrate.failed.retry": "Tentar novamente",
|
||||
"migrate.failed.title": "Falha na migração",
|
||||
"migrate.success.description": "Todos os seus aplicativos, dados de aplicativos e detalhes da conta foram migrados para o seu Umbrel Home.",
|
||||
"migrate.success.title": "Migração bem-sucedida",
|
||||
"migration-assistant": "Assistente de Migração",
|
||||
"migration-assistant-description": "Transfira todos os seus aplicativos e dados de um Raspberry Pi para o Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "O Assistente de Migração atualmente suporta a transferência de todos os dados e aplicativos de um Raspberry Pi rodando umbrelOS para o Umbrel Home. Abra o Assistente de Migração no seu Umbrel Home para começar.",
|
||||
"migration-assistant.continue-migration.ready.submit": "Iniciar migração",
|
||||
"migration-assistant.failed": "Algo não está certo...",
|
||||
"migration-assistant.failed.retrying-message": "Tentando novamente...",
|
||||
"unknown-error": "Erro desconhecido",
|
||||
"migration-assistant.mobile.start-button": "Iniciar migração",
|
||||
"migration-assistant.prep.body": "Preparar para migração",
|
||||
"migration-assistant.prep.button-continue": "Continuar",
|
||||
"migration-assistant.prep.callout": "Os dados no seu Umbrel Home, se houver, serão permanentemente excluídos.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Conecte o disco externo ao qualquer porta USB no seu Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Uma vez feito, clique em '{{button}}' abaixo.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Desligue seu Umbrel Raspberry Pi.",
|
||||
"migration-assistant.ready.description": "Todos os seus dados e aplicativos estão prontos para serem migrados para o seu Umbrel Home",
|
||||
"migration-assistant.ready.hint-header": "Coisas a ter em mente",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Isso ajuda a evitar problemas com aplicativos como o Lightning Node",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Mantenha seu Raspberry Pi desligado após a atualização",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Lembre-se de usar a senha do seu Umbrel Raspberry Pi para fazer login no seu Umbrel Home",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Use a mesma senha",
|
||||
"migration-assistant.ready.title": "Tudo pronto para migrar!",
|
||||
"name": "Nome",
|
||||
"no-forgot-password-message": "Se você perder sua senha, não será possível fazer login no seu Umbrel. Certifique-se de guardá-la em segurança.",
|
||||
"no-results-found": "Nenhum resultado encontrado",
|
||||
"not-found-404": "Código de erro: 404",
|
||||
"not-found-404.back": "Voltar",
|
||||
"not-found-404.home": "Ir para Início",
|
||||
"notifications.cpu.too-hot": "Temperatura alta da CPU",
|
||||
"notifications.memory.low": "A memória do seu dispositivo está baixa",
|
||||
"notifications.new-version-available": "{{update}} agora está disponível para instalação",
|
||||
"notifications.storage.full": "O armazenamento do seu dispositivo está cheio",
|
||||
"notifications.view": "Visualizar",
|
||||
"ok": "OK",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "Ao clicar em 'Próximo', você concorda com os <linked>Termos de Serviço do umbrelOS</linked>",
|
||||
"onboarding.account-created.next": "Próximo",
|
||||
"onboarding.account-created.subtitle": "Seu Umbrel está agora pronto.",
|
||||
"onboarding.account-created.youre-all-set-name": "Tudo pronto, {{name}}.",
|
||||
"onboarding.contact-support": "Suporte",
|
||||
"onboarding.create-account": "Criar conta",
|
||||
"onboarding.create-account.confirm-password.input-label": "Confirmar senha",
|
||||
"onboarding.create-account.failed.name-required": "Nome é necessário",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "As senhas não coincidem",
|
||||
"onboarding.create-account.name.input-placeholder": "Seu nome",
|
||||
"onboarding.create-account.password.input-label": "Senha",
|
||||
"onboarding.create-account.submit": "Criar",
|
||||
"onboarding.create-account.submitting": "Criando",
|
||||
"onboarding.create-account.subtitle": "Suas informações de conta são armazenadas apenas no seu Umbrel. Certifique-se de fazer um backup seguro da sua senha, pois não há como redefini-la.",
|
||||
"onboarding.start.continue": "Começar",
|
||||
"onboarding.start.subtitle": "Seu servidor de nuvem doméstico está pronto para ser configurado.",
|
||||
"onboarding.start.title": "Bem-vindo ao umbrelOS",
|
||||
"open": "Abrir",
|
||||
"open-live-usage": "Abrir Uso ao Vivo",
|
||||
"password": "Senha",
|
||||
"preferences": "Preferências",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"read-less": "Ler menos",
|
||||
"read-more": "Ler mais",
|
||||
"redirect.to-home": "Carregando...",
|
||||
"redirect.to-login": "Carregando...",
|
||||
"redirect.to-onboarding": "Carregando...",
|
||||
"remote-tor-access": "Acesso remoto Tor",
|
||||
"restart": "Reiniciar",
|
||||
"restart.confirm.submit": "Reiniciar",
|
||||
"restart.confirm.title": "Você tem certeza de que deseja reiniciar seu Umbrel?",
|
||||
"restart.restarting": "Reiniciando",
|
||||
"restart.restarting-message": "Por favor, não atualize esta página ou desligue seu Umbrel enquanto ele está reiniciando.",
|
||||
"retry": "Tentar novamente",
|
||||
"search": "Pesquisar",
|
||||
"settings": "Configurações",
|
||||
"settings.app-store-preferences.title": "Preferências da App Store",
|
||||
"settings.contact-support": "Precisa de ajuda? <linked>Contate o suporte.</linked>",
|
||||
"shut-down": "Desligar",
|
||||
"shut-down.complete": "Desligamento completo",
|
||||
"shut-down.complete-text": "Agora você pode desconectar seu dispositivo da energia.",
|
||||
"shut-down.confirm.submit": "Desligar",
|
||||
"shut-down.confirm.title": "Você tem certeza de que deseja desligar seu Umbrel?",
|
||||
"shut-down.shutting-down": "Desligando",
|
||||
"shut-down.shutting-down-message": "Por favor, não atualize esta página ou desligue seu Umbrel enquanto ele está desligando.",
|
||||
"software-update.callout": "Por favor, não atualize esta página ou desligue seu Umbrel enquanto estiver atualizando.",
|
||||
"software-update.check": "Verificar atualização",
|
||||
"software-update.checking": "Verificando atualização...",
|
||||
"software-update.current-running": "Você está em",
|
||||
"software-update.failed": "Falha ao atualizar",
|
||||
"software-update.failed-to-check": "Falha ao verificar atualizações",
|
||||
"software-update.failed.retry": "Tentar novamente",
|
||||
"software-update.install-now": "Instalar agora",
|
||||
"app-updates.no-updates": "Todos os aplicativos estão atualizados!",
|
||||
"continue": "Continuar",
|
||||
"app.stopped": "Parado",
|
||||
"software-update.new-version": "Nova versão do {{name}} disponível para instalação",
|
||||
"software-update.on-latest": "Você está na última versão do umbrelOS",
|
||||
"software-update.title": "Atualização de software",
|
||||
"software-update.updating-to": "Atualizando para {{name}}",
|
||||
"software-update.view": "Visualizar",
|
||||
"something-left": "{{left}} restantes",
|
||||
"something-went-wrong": "⚠ Algo deu errado",
|
||||
"start": "Iniciar",
|
||||
"stop": "Parar",
|
||||
"storage": "Armazenamento",
|
||||
"storage.full": "Armazenamento cheio",
|
||||
"storage.low": "Armazenamento baixo",
|
||||
"temp.dangerously-hot": "Muito quente",
|
||||
"temp.nice": "Agradável",
|
||||
"temp.normal": "Normal",
|
||||
"temp.warm": "Morno",
|
||||
"temperature": "Temperatura",
|
||||
"temperature.too-hot-suggestion": "Considere mudar o ambiente do seu dispositivo.",
|
||||
"terminal": "Terminal",
|
||||
"terminal-description": "Execute comandos personalizados no umbrelOS ou dentro de um app",
|
||||
"terminal.umbrelos-description": "Execute comandos personalizados no umbrelOS",
|
||||
"terminal.app": "App",
|
||||
"terminal.app-description": "Execute comandos personalizados dentro de um app específico",
|
||||
"open": "Abrir",
|
||||
"advanced-settings": "Configurações avançadas",
|
||||
"advanced-settings-description": "Abra o terminal ou inscreva-se no Programa Beta do umbrelOS",
|
||||
"beta-program": "Programa Beta do umbrelOS",
|
||||
"beta-program-description": "Opte por receber atualizações beta do umbrelOS, obtenha acesso antecipado a novas funcionalidades e ajude-nos a refiná-las fornecendo seu feedback. Atualizações beta podem ser instáveis e a solução de problemas pode requerer familiaridade com o terminal."
|
||||
}
|
||||
"terminal.umbrelos-description": "Execute comandos personalizados no umbrelOS",
|
||||
"tor-description": "Acesse seu Umbrel de qualquer lugar usando um navegador Tor",
|
||||
"tor.disable.description": "Isso pode levar alguns minutos",
|
||||
"tor.disable.progress": "Desativando acesso remoto Tor",
|
||||
"tor.disable.success": "Acesso remoto Tor desativado",
|
||||
"tor.enable.description": "Isso pode levar alguns minutos",
|
||||
"tor.enable.mobile.switch-label": "Ativar acesso remoto Tor",
|
||||
"tor.enable.submit": "Ativar",
|
||||
"tor.enable.success": "Acesso remoto Tor ativado",
|
||||
"tor.enable.title": "Ativar acesso remoto Tor",
|
||||
"tor.hidden-service": "URL do serviço oculto Tor",
|
||||
"troubleshoot": "Solucionar problemas",
|
||||
"troubleshoot-description": "Solucione problemas do umbrelOS ou de um aplicativo",
|
||||
"troubleshoot-no-logs-yet": "Ainda não há registros",
|
||||
"troubleshoot-pick-title": "Solucionar problemas",
|
||||
"troubleshoot.app": "Aplicativo",
|
||||
"troubleshoot.app-description": "Ver registros de um aplicativo instalado no seu Umbrel",
|
||||
"troubleshoot.app-download": "Baixar registros do {{app}}",
|
||||
"troubleshoot.share-with-umbrel-support": "Compartilhar com o Suporte Umbrel",
|
||||
"troubleshoot.system-download": "Baixar {{label}}",
|
||||
"troubleshoot.umbrelos-description": "Ver logs do umbrelOS",
|
||||
"troubleshoot.umbrelos-logs": "Registros do umbrelOS",
|
||||
"trpc.backend-unavailable": "Erro: A conexão com a API do sistema falhou",
|
||||
"trpc.checking-backend": "Carregando...",
|
||||
"try-again": "Tentar novamente",
|
||||
"umbrel": "Umbrel",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"umbrelos": "umbrelOS",
|
||||
"unknown": "Desconhecido",
|
||||
"unknown-app": "Aplicativo desconhecido",
|
||||
"unknown-error": "Erro desconhecido",
|
||||
"uptime": "Tempo de funcionamento",
|
||||
"wallpaper": "Papel de parede",
|
||||
"wallpaper-description": "Seu papel de parede e tema do Umbrel",
|
||||
"widget.progress.in-progress": "Em andamento",
|
||||
"widgets.edit.select-up-to-3-widgets": "Selecione até 3 widgets",
|
||||
"widgets.install-an-app-before-using-widgets": "Instale um aplicativo para começar a personalizar sua tela inicial com widgets.",
|
||||
"wifi": "Wi-Fi",
|
||||
"wifi-connect-insecure-message": "Redes abertas podem ser inseguras",
|
||||
"wifi-connection-failed": "Não foi possível conectar",
|
||||
"wifi-dangerous-change-confirmation-description": "Mudar a rede Wi-Fi pode desconectá-lo do seu Umbrel. Para reconectar, certifique-se de que tanto o seu Umbrel quanto o dispositivo de onde você está acessando estejam na mesma rede.",
|
||||
"wifi-dangerous-change-confirmation-title": "Tem certeza de que deseja mudar a rede Wi-Fi?",
|
||||
"wifi-dangerous-disable-confirmation-description": "Desativar o Wi-Fi pode desconectá-lo do seu Umbrel. Para reconectar, conecte um cabo Ethernet ao seu Umbrel e certifique-se de que tanto o seu Umbrel quanto o dispositivo de onde você está acessando estejam na mesma rede.",
|
||||
"wifi-dangerous-disable-confirmation-title": "Tem certeza de que deseja desativar o Wi-Fi?",
|
||||
"wifi-description": "Conecte seu dispositivo a uma rede Wi-Fi",
|
||||
"wifi-description-long": "Seu dispositivo permanece conectado ao Wi-Fi escolhido, mesmo que o cabo Ethernet seja removido, e reconecta-se automaticamente ao Wi-Fi ao iniciar.",
|
||||
"wifi-no-networks-message": "Nenhuma rede Wi-Fi encontrada",
|
||||
"wifi-searching": "Procurando redes Wi-Fi...",
|
||||
"wifi-unsupported-device-description": "O Wi-Fi não é suportado neste dispositivo. Isso pode ser devido a um adaptador sem fio ausente ou incompatível.",
|
||||
"wifi-view-networks": "Ver redes"
|
||||
}
|
||||
@@ -0,0 +1,371 @@
|
||||
{
|
||||
"2fa": "2FA",
|
||||
"2fa-description": "Umbrel girişiniz ve uygulamalarınız için ikinci bir güvenlik katmanı",
|
||||
"2fa.disable.success": "İki faktörlü kimlik doğrulama devre dışı bırakıldı",
|
||||
"2fa.disable.title": "İki faktörlü kimlik doğrulamayı devre dışı bırak",
|
||||
"2fa.enable.or-paste": "Veya aşağıdaki kodu kimlik doğrulama uygulamanıza yapıştırın",
|
||||
"2fa.enable.scan-this": "Google Authenticator veya Authy gibi bir kimlik doğrulama uygulamasıyla bu QR kodunu tarayın",
|
||||
"2fa.enable.success": "İki faktörlü kimlik doğrulama etkinleştirildi",
|
||||
"2fa.enable.title": "İki faktörlü kimlik doğrulamayı etkinleştir",
|
||||
"2fa.enter-code": "Kimlik doğrulama uygulamanızda görüntülenen kodu girin",
|
||||
"account": "Hesap",
|
||||
"account-description": "Adınız ve şifreniz",
|
||||
"advanced-settings": "Gelişmiş ayarlar",
|
||||
"advanced-settings-description": "Terminali açın veya umbrelOS Beta Programına katılın",
|
||||
"app-not-found": "Uygulama bulunamadı: {{app}}",
|
||||
"app-only-over-tor": "{{app}} yalnızca Tor üzerinden kullanılabilir. Bu uygulamayı açmak için uzaktan erişim URL'inizde (Ayarlar > Uzaktan Tor erişimi) bir Tor tarayıcısında Umbrel'inize erişin.",
|
||||
"app-page.section.about": "Hakkında",
|
||||
"app-page.section.credentials.title": "Varsayılan kimlik bilgileri",
|
||||
"app-page.section.info.compatibility": "Uyumluluk",
|
||||
"app-page.section.info.compatibility-compatible": "Uyumlu",
|
||||
"app-page.section.info.developer": "Geliştirici",
|
||||
"app-page.section.info.source-code": "Kaynak Kodu",
|
||||
"app-page.section.info.source-code.public": "Herkese açık",
|
||||
"app-page.section.info.submitted-by": "Gönderen",
|
||||
"app-page.section.info.title": "Bilgi",
|
||||
"app-page.section.info.version": "Sürüm",
|
||||
"app-page.section.recommendations.title": "Bunları da beğenebilirsiniz",
|
||||
"app-page.section.release-notes.title": "Yenilikler",
|
||||
"app-page.section.release-notes.version": "Sürüm {{version}}",
|
||||
"app-page.section.requires": "Gereksinimler",
|
||||
"app-page.section.requires.support": "Destek al",
|
||||
"app-picker.search": "Ara...",
|
||||
"app-picker.select-app": "Uygulama seç...",
|
||||
"app-store.browse-category-apps": "{{category}} uygulamalarına göz at",
|
||||
"app-store.category.ai": "Yapay Zeka",
|
||||
"app-store.category.all": "Tüm uygulamalar",
|
||||
"app-store.category.automation": "Ev ve Otomasyon",
|
||||
"app-store.category.bitcoin": "Bitcoin",
|
||||
"app-store.category.developer": "Geliştirici Araçları",
|
||||
"app-store.category.discover": "Keşfet",
|
||||
"app-store.category.files": "Dosyalar ve Üretkenlik",
|
||||
"app-store.category.finance": "Finans",
|
||||
"app-store.category.media": "Medya",
|
||||
"app-store.category.networking": "Ağ",
|
||||
"app-store.category.social": "Sosyal",
|
||||
"app-store.description": "Uygulama güncelleme ayarlarınız",
|
||||
"app-store.menu.community-app-stores": "Topluluk Uygulama Mağazaları",
|
||||
"app-store.search-apps": "Uygulama ara",
|
||||
"app-store.search.no-results": "Sonuç yok",
|
||||
"app-store.search.results-for": "Sonuçlar",
|
||||
"app-store.title": "Uygulama Mağazası",
|
||||
"app-updates.less": "daha az",
|
||||
"app-updates.more": "daha fazla",
|
||||
"app-updates.no-updates": "Tüm uygulamalar güncel!",
|
||||
"app-updates.update": "Güncelle",
|
||||
"app-updates.update-all": "Hepsini güncelle",
|
||||
"app-updates.updates-available-count_one": "{{count}} güncelleme mevcut",
|
||||
"app-updates.updates-available-count_other": "{{count}} güncelleme mevcut",
|
||||
"app-updates.updating": "Güncelleniyor...",
|
||||
"app.install": "Yükle",
|
||||
"app.installing": "Yükleniyor",
|
||||
"app.offline": "Çalışmıyor",
|
||||
"app.open": "Aç",
|
||||
"app.optimized-for-umbrel-home": "Umbrel Home için optimize edilmiş",
|
||||
"app.restarting": "Yeniden başlatılıyor",
|
||||
"app.starting": "Başlatılıyor",
|
||||
"app.stopped": "Durduruldu",
|
||||
"app.stopping": "Durduruluyor",
|
||||
"app.uninstall.confirm.description": "{{app}} ile ilgili tüm veriler kalıcı olarak silinecek. Bu işlem geri alınamaz.",
|
||||
"app.uninstall.confirm.submit": "Kaldır",
|
||||
"app.uninstall.confirm.title": "{{app}} kaldırılacak mı?",
|
||||
"app.uninstall.deps.used-by.description_one": "{{app}}'i kaldırmak için önce {{firstAppToUninstall}}'i kaldırın.",
|
||||
"app.uninstall.deps.used-by.description_other": "{{app}}'i kaldırmak için önce bu uygulamaları kaldırın.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} kullanılıyor",
|
||||
"app.uninstalling": "Kaldırılıyor",
|
||||
"app.updating": "Güncelleniyor",
|
||||
"app.view": "Görünüm",
|
||||
"app_one": "uygulama",
|
||||
"app_other": "uygulamalar",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Gerekli uygulamalar alınamadı",
|
||||
"apps.uninstalled-all.success": "Tüm uygulamalar kaldırıldı",
|
||||
"auth.checking-backend-for-user": "Yükleniyor...",
|
||||
"auth.failed-checking-if-user-logged-in": "Hata: Kimlik doğrulama giriş kontrolü başarısız",
|
||||
"auth.failed-to-check-if-user-exists": "Hata: Kimlik doğrulama varlık kontrolü başarısız oldu",
|
||||
"beta-program": "umbrelOS Beta Programı",
|
||||
"beta-program-description": "umbrelOS beta güncellemelerini almaya kaydolun, yeni özelliklere erken erişim kazanın ve geri bildirim sağlayarak bunları geliştirmemize yardımcı olun. Beta güncellemeleri kararsız olabilir ve sorun giderme terminal bilgisi gerektirebilir.",
|
||||
"cancel": "İptal",
|
||||
"change": "Değiştir",
|
||||
"change-name": "Adı değiştir",
|
||||
"change-name.failed.name-required": "Ad gerekli",
|
||||
"change-name.input-placeholder": "Adınız",
|
||||
"change-password": "Şifre değiştir",
|
||||
"change-password.callout": "Şifrenizi kaybederseniz, Umbrel'e giriş yapamazsınız. Şifrenizi güvenli bir şekilde sakladığınızdan emin olun.",
|
||||
"change-password.current-password": "Mevcut şifre",
|
||||
"change-password.failed.current-required": "Mevcut şifre gerekli",
|
||||
"change-password.failed.min-length": "Şifre en az {{characters}} karakter olmalıdır",
|
||||
"change-password.failed.must-be-unique": "Yeni şifre mevcut şifreden farklı olmalıdır",
|
||||
"change-password.failed.new-required": "Yeni şifre gerekli",
|
||||
"change-password.failed.no-match": "Şifreler eşleşmiyor",
|
||||
"change-password.failed.repeat-required": "Şifreyi tekrar girin",
|
||||
"change-password.new-password": "Yeni şifre",
|
||||
"change-password.repeat-password": "Şifreyi tekrar girin",
|
||||
"check-for-latest-version": "En son umbrelOS güncellemesini kontrol et",
|
||||
"clipboard.copied": "Kopyalandı",
|
||||
"close": "Kapat",
|
||||
"cmdk.change-wallpaper": "Duvar kağıdını değiştir",
|
||||
"cmdk.frequent-apps": "Sık kullanılanlar",
|
||||
"cmdk.input-placeholder": "Uygulamalar, ayarlar veya eylemler için ara",
|
||||
"cmdk.install-from-app-store": "App Store'dan",
|
||||
"cmdk.live-usage": "Canlı Kullanım",
|
||||
"cmdk.restart-umbrel": "Umbrel'i yeniden başlat",
|
||||
"cmdk.shutdown-umbrel": "Umbrel'i kapat",
|
||||
"cmdk.update-all-apps": "Tüm uygulamaları güncelle",
|
||||
"cmdk.widgets": "Widget'lar",
|
||||
"community-app-store": "Topluluk Uygulama Mağazası",
|
||||
"community-app-store.back-to-umbrel-app-store": "Umbrel Uygulama Mağazasına geri dön",
|
||||
"community-app-store.open-button": "Aç",
|
||||
"community-app-store.remove-button": "Kaldır",
|
||||
"community-app-stores.add-button": "Ekle",
|
||||
"community-app-stores.description": "Topluluk Uygulama Mağazaları, Umbrel'inize resmi Umbrel Uygulama Mağazasında bulunmayan uygulamaları yüklemenizi sağlar.",
|
||||
"community-app-stores.learn-more": "Daha fazla bilgi edinin",
|
||||
"community-app-stores.warning": "Topluluk Uygulama Mağazaları herhangi biri tarafından oluşturulabilir. Bu mağazalarda yayımlanan uygulamalar, resmi Umbrel Uygulama Mağazası ekibi tarafından doğrulanmaz veya denetlenmez ve potansiyel olarak güvensiz veya kötü amaçlı olabilir. Dikkatli olun ve yalnızca güvendiğiniz geliştiricilerin uygulama mağazalarını ekleyin.",
|
||||
"confirm": "Onayla",
|
||||
"connecting": "Bağlanıyor...",
|
||||
"continue": "Devam et",
|
||||
"continue-to-log-in": "Girişe devam et",
|
||||
"cpu": "CPU",
|
||||
"cpu-core-count": "{{cores}} çekirdek",
|
||||
"create-user": "Kullanıcı oluştur",
|
||||
"default-credentials.close": "Anladım",
|
||||
"default-credentials.description": "Uygulamaya giriş yapmak için gerekli kimlik bilgileri burada.",
|
||||
"default-credentials.dont-show-again": "Bunu bir daha gösterme",
|
||||
"default-credentials.open": "{{app}}'i aç",
|
||||
"default-credentials.password": "Varsayılan şifre",
|
||||
"default-credentials.title": "{{app}} için kimlik bilgileri",
|
||||
"default-credentials.username": "Varsayılan kullanıcı adı",
|
||||
"desktop.app.context.go-to-store-page": "App Store'da görüntüle",
|
||||
"desktop.app.context.show-default-credentials": "Varsayılan kimlik bilgilerini göster",
|
||||
"desktop.app.context.uninstall": "Kaldır",
|
||||
"desktop.context-menu.change-wallpaper": "Duvar kağıdını değiştir",
|
||||
"desktop.context-menu.edit-widgets": "Widget'ları düzenle",
|
||||
"desktop.context-menu.logout": "Çıkış yap",
|
||||
"desktop.greeting.afternoon": "İyi öğleden sonra, {{name}}",
|
||||
"desktop.greeting.evening": "İyi akşamlar, {{name}}",
|
||||
"desktop.greeting.morning": "Günaydın, {{name}}",
|
||||
"desktop.install-first.for-the-bitcoiner": "Bitcoin kullanıcıları için",
|
||||
"desktop.install-first.for-the-self-hoster": "Kendi sunucusunu barındıranlar için",
|
||||
"desktop.install-first.for-the-streamer": "Yayıncılar için",
|
||||
"desktop.install-first.link-to-app-store": "App Store'da daha fazlasını keşfet",
|
||||
"desktop.not-enough-room": "Uygulamalarınızı görüntülemek için daha büyük bir ekran kullanın.",
|
||||
"device": "Cihaz",
|
||||
"device-info": "Cihaz bilgisi",
|
||||
"device-info-description": "Cihazınız hakkında bilgi",
|
||||
"device-info.device": "Cihaz",
|
||||
"device-info.model-number": "Model numarası",
|
||||
"device-info.serial-number": "Seri numarası",
|
||||
"device-info.view-info": "Bilgileri görüntüle",
|
||||
"disable": "Devre dışı bırak",
|
||||
"download-logs": "Günlükleri indir",
|
||||
"factory-reset": "Fabrika ayarlarına sıfırla",
|
||||
"factory-reset.confirm.body": "Sıfırlamak için Umbrel şifresini onaylayın",
|
||||
"factory-reset.confirm.password-label": "Şifreyi girin",
|
||||
"factory-reset.confirm.submit": "Her şeyi sil ve sıfırla",
|
||||
"factory-reset.confirm.submit-callout": "Bu işlem geri alınamaz.",
|
||||
"factory-reset.desc": "Tüm umbrelOS verilerinizi ve uygulamalarınızı silin",
|
||||
"factory-reset.failed.message": "Sıfırlama sırasında bir hata oluştu",
|
||||
"factory-reset.failed.retry": "Fabrika ayarlarına sıfırlamayı tekrar deneyin",
|
||||
"factory-reset.failed.title": "Sıfırlama başarısız",
|
||||
"factory-reset.reset": "Sıfırla",
|
||||
"factory-reset.resetting.connecting": "Bağlanıyor",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Sıfırlama tamamlanana kadar cihazınızı kapatmayın",
|
||||
"factory-reset.review.account-info": "Hesap bilgileri ve şifre",
|
||||
"factory-reset.review.apps": "Uygulamalar",
|
||||
"factory-reset.review.following-will-be-removed": "Cihazınızdan aşağıdakiler kaldırılacak",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} yüklü uygulama",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} yüklü uygulama",
|
||||
"factory-reset.review.submit": "Devam et",
|
||||
"factory-reset.review.total-data": "Toplam veri",
|
||||
"factory-reset.success.description": "Tüm uygulamalarınız, uygulama verileriniz ve hesap verileriniz cihazınızdan silindi. Şimdi cihazınızı yeniden başlatabilirsiniz.",
|
||||
"factory-reset.success.restart-device": "Cihazı yeniden başlat",
|
||||
"factory-reset.success.title": "Sıfırlama başarılı",
|
||||
"hello": "Merhaba",
|
||||
"install-first.description_one": "{{app}}'i yüklemek için bu uygulamayı yükleyin.",
|
||||
"install-first.description_other": "{{app}}'i yüklemek için önce bu uygulamaları yükleyin.",
|
||||
"install-first.title": "{{app}}'in erişmesi gerekenler",
|
||||
"install-your-first-app": "İlk uygulamanızı yükleyin",
|
||||
"language": "Dil",
|
||||
"language-description": "Tercih ettiğiniz umbrelOS dili",
|
||||
"language.select-description": "Tercih edilen umbrelOS dilini seçin",
|
||||
"linux": "Linux",
|
||||
"live-usage": "Canlı Kullanım",
|
||||
"loading": "Yükleniyor",
|
||||
"local-ip": "Yerel IP",
|
||||
"login-2fa.subtitle": "Kimlik doğrulama uygulamanızda görüntülenen 2FA kodunu girin",
|
||||
"login-2fa.title": "Kimlik doğrulama",
|
||||
"login-with-umbrel.description": "{{app}}'i açmak için Umbrel şifrenizi girin",
|
||||
"login-with-umbrel.title": "Umbrel ile giriş yap",
|
||||
"login.password-label": "Şifre",
|
||||
"login.password.submit": "Giriş yap",
|
||||
"login.subtitle": "Giriş yapmak için Umbrel şifrenizi girin",
|
||||
"login.title": "Tekrar hoş geldiniz",
|
||||
"logout": "Çıkış yap",
|
||||
"logout-error-generic": "Hata: Çıkış yapılamadı",
|
||||
"logout.confirm.submit": "Çıkış yap",
|
||||
"logout.confirm.title": "Çıkış yapmak istediğinize emin misiniz?",
|
||||
"memory": "Bellek",
|
||||
"memory.low": "Düşük bellek",
|
||||
"migrate": "Geçiş yap",
|
||||
"migrate.callout": "Geçiş tamamlanana kadar Umbrel'inizi kapatmayın",
|
||||
"migrate.failed.retry": "Tekrar dene",
|
||||
"migrate.failed.title": "Geçiş başarısız",
|
||||
"migrate.success.description": "Tüm uygulamalarınız, uygulama verileriniz ve hesap detaylarınız Umbrel Home'a aktarıldı.",
|
||||
"migrate.success.title": "Geçiş başarılı",
|
||||
"migration-assistant": "Geçiş Asistanı",
|
||||
"migration-assistant-description": "Tüm uygulamalarınızı ve verilerinizi Raspberry Pi'den Umbrel Home'a aktarın",
|
||||
"migration-assistant-unsupported-device-description": "Geçiş Asistanı şu anda tüm verilerinizi ve uygulamalarınızı umbrelOS ile Raspberry Pi'den Umbrel Home'a aktarmayı desteklemektedir. Başlamak için Umbrel Home'unuzda Geçiş Asistanını açın.",
|
||||
"migration-assistant.continue-migration.ready.submit": "Geçişi başlat",
|
||||
"migration-assistant.failed": "Bir şeyler doğru değil...",
|
||||
"migration-assistant.failed.retrying-message": "Tekrar deneniyor...",
|
||||
"migration-assistant.mobile.start-button": "Geçişi başlat",
|
||||
"migration-assistant.prep.body": "Geçiş için hazırlanın",
|
||||
"migration-assistant.prep.button-continue": "Devam et",
|
||||
"migration-assistant.prep.callout": "Eğer varsa, Umbrel Home'daki veriler kalıcı olarak silinecek.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Harici diskini herhangi bir USB portuna bağlayın.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "İşlem tamamlandığında aşağıdaki '{{button}}' butonuna tıklayın.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Raspberry Pi Umbrel'inizi kapatın.",
|
||||
"migration-assistant.ready.description": "Tüm verileriniz ve uygulamalarınız Umbrel Home'a aktarılmaya hazır",
|
||||
"migration-assistant.ready.hint-header": "Dikkat edilmesi gerekenler",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Bu, Lightning Node gibi uygulamalardaki sorunları önlemeye yardımcı olur",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Güncellemeden sonra Raspberry Pi'yi kapalı tutun",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Umbrel Home'a giriş yapmak için Raspberry Pi Umbrel şifrenizi kullanmayı unutmayın",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Aynı şifreyi kullanın",
|
||||
"migration-assistant.ready.title": "Geçiş yapmaya hazırsınız!",
|
||||
"name": "Ad",
|
||||
"no-forgot-password-message": "Şifrenizi kaybederseniz, Umbrel'e giriş yapamazsınız. Şifrenizi güvenli bir şekilde sakladığınızdan emin olun.",
|
||||
"no-results-found": "Sonuç bulunamadı",
|
||||
"not-found-404": "Hata kodu: 404",
|
||||
"not-found-404.back": "Geri",
|
||||
"not-found-404.home": "Ana sayfaya git",
|
||||
"notifications.cpu.too-hot": "Yüksek CPU sıcaklığı",
|
||||
"notifications.memory.low": "Cihazınızın belleği düşük",
|
||||
"notifications.new-version-available": "{{update}} artık indirilebilir",
|
||||
"notifications.storage.full": "Cihazınızın depolama alanı dolu",
|
||||
"notifications.view": "Görüntüle",
|
||||
"ok": "Tamam",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "'İleri' butonuna tıklayarak <linked>umbrelOS Hizmet Şartları</linked>'nı kabul ediyorsunuz",
|
||||
"onboarding.account-created.next": "İleri",
|
||||
"onboarding.account-created.subtitle": "Umbrel'iniz artık hazır.",
|
||||
"onboarding.account-created.youre-all-set-name": "Hazırsınız, {{name}}.",
|
||||
"onboarding.contact-support": "Destek",
|
||||
"onboarding.create-account": "Hesap oluştur",
|
||||
"onboarding.create-account.confirm-password.input-label": "Şifreyi onayla",
|
||||
"onboarding.create-account.failed.name-required": "Ad gerekli",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Şifreler eşleşmiyor",
|
||||
"onboarding.create-account.name.input-placeholder": "Adınız",
|
||||
"onboarding.create-account.password.input-label": "Şifre",
|
||||
"onboarding.create-account.submit": "Oluştur",
|
||||
"onboarding.create-account.submitting": "Oluşturuluyor",
|
||||
"onboarding.create-account.subtitle": "Hesap bilgileriniz yalnızca Umbrel'inizde saklanır. Şifrenizi güvenli bir şekilde yedeklediğinizden emin olun çünkü sıfırlama imkanı yoktur.",
|
||||
"onboarding.start.continue": "Başla",
|
||||
"onboarding.start.subtitle": "Ev bulut sunucunuz kuruluma hazır.",
|
||||
"onboarding.start.title": "umbrelOS'a hoş geldiniz",
|
||||
"open": "Aç",
|
||||
"open-live-usage": "Canlı Kullanımı Aç",
|
||||
"password": "Şifre",
|
||||
"preferences": "Tercihler",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"read-less": "Daha az oku",
|
||||
"read-more": "Daha fazla oku",
|
||||
"redirect.to-home": "Yükleniyor...",
|
||||
"redirect.to-login": "Yükleniyor...",
|
||||
"redirect.to-onboarding": "Yükleniyor...",
|
||||
"remote-tor-access": "Uzaktan Tor erişimi",
|
||||
"restart": "Yeniden başlat",
|
||||
"restart.confirm.submit": "Yeniden başlat",
|
||||
"restart.confirm.title": "Umbrel'inizi yeniden başlatmak istediğinizden emin misiniz?",
|
||||
"restart.restarting": "Yeniden başlatılıyor",
|
||||
"restart.restarting-message": "Yeniden başlatılırken bu sayfayı yenilemeyin veya Umbrel'inizi kapatmayın.",
|
||||
"retry": "Tekrar dene",
|
||||
"search": "Ara",
|
||||
"settings": "Ayarlar",
|
||||
"settings.app-store-preferences.title": "Uygulama Mağazası Tercihleri",
|
||||
"settings.contact-support": "Yardım mı lazım? <linked>Destek ile iletişime geçin.</linked>",
|
||||
"shut-down": "Kapat",
|
||||
"shut-down.complete": "Kapatma tamamlandı",
|
||||
"shut-down.complete-text": "Cihazınızı şimdi güçten çekebilirsiniz.",
|
||||
"shut-down.confirm.submit": "Kapat",
|
||||
"shut-down.confirm.title": "Umbrel'inizi kapatmak istediğinizden emin misiniz?",
|
||||
"shut-down.shutting-down": "Kapatılıyor",
|
||||
"shut-down.shutting-down-message": "Kapatılırken bu sayfayı yenilemeyin veya Umbrel'inizi kapatmayın.",
|
||||
"software-update.callout": "Güncelleme sırasında bu sayfayı yenilemeyin veya Umbrel'inizi kapatmayın.",
|
||||
"software-update.check": "Güncellemeleri kontrol et",
|
||||
"software-update.checking": "Güncellemeler kontrol ediliyor...",
|
||||
"software-update.current-running": "Mevcut sürümünüz",
|
||||
"software-update.failed": "Güncelleme başarısız",
|
||||
"software-update.failed-to-check": "Güncellemeler kontrol edilemedi",
|
||||
"software-update.failed.retry": "Tekrar dene",
|
||||
"software-update.install-now": "Şimdi yükle",
|
||||
"software-update.new-version": "Yeni {{name}} indirilebilir",
|
||||
"software-update.on-latest": "En son umbrelOS sürümündesiniz",
|
||||
"software-update.title": "Yazılım güncellemesi",
|
||||
"software-update.updating-to": "{{name}} sürümüne güncelleniyor",
|
||||
"software-update.view": "Görüntüle",
|
||||
"something-left": "{{left}} kaldı",
|
||||
"something-went-wrong": "⚠ Bir şeyler ters gitti",
|
||||
"start": "Başlat",
|
||||
"stop": "Durdur",
|
||||
"storage": "Depolama",
|
||||
"storage.full": "Depolama dolu",
|
||||
"storage.low": "Düşük depolama alanı",
|
||||
"temp.dangerously-hot": "Çok sıcak",
|
||||
"temp.nice": "Güzel",
|
||||
"temp.normal": "Normal",
|
||||
"temp.warm": "Ilık",
|
||||
"temperature": "Sıcaklık",
|
||||
"temperature.too-hot-suggestion": "Cihazınızın ortamını değiştirmeyi düşünün.",
|
||||
"terminal": "Terminal",
|
||||
"terminal-description": "umbrelOS'ta veya bir uygulama içinde özel komutlar çalıştırın",
|
||||
"terminal.app": "Uygulama",
|
||||
"terminal.app-description": "Belirli bir uygulama içinde özel komutlar çalıştırın",
|
||||
"terminal.umbrelos-description": "umbrelOS'ta özel komutlar çalıştırın",
|
||||
"tor-description": "Tor tarayıcı kullanarak Umbrel'inize her yerden erişin",
|
||||
"tor.disable.description": "Bu birkaç dakika sürebilir",
|
||||
"tor.disable.progress": "Uzaktan Tor erişimi devre dışı bırakılıyor",
|
||||
"tor.disable.success": "Uzaktan Tor erişimi devre dışı bırakıldı",
|
||||
"tor.enable.description": "Bu birkaç dakika sürebilir",
|
||||
"tor.enable.mobile.switch-label": "Uzaktan Tor erişimini etkinleştir",
|
||||
"tor.enable.submit": "Etkinleştir",
|
||||
"tor.enable.success": "Uzaktan Tor erişimi etkinleştirildi",
|
||||
"tor.enable.title": "Uzaktan Tor erişimini etkinleştir",
|
||||
"tor.hidden-service": "Tor gizli servis URL'si",
|
||||
"troubleshoot": "Sorun giderme",
|
||||
"troubleshoot-description": "umbrelOS veya bir uygulama sorunlarını giderin",
|
||||
"troubleshoot-no-logs-yet": "Henüz günlük yok",
|
||||
"troubleshoot-pick-title": "Sorun giderme",
|
||||
"troubleshoot.app": "Uygulama",
|
||||
"troubleshoot.app-description": "Umbrel'inize yüklü bir uygulamanın günlüklerini görüntüleyin",
|
||||
"troubleshoot.app-download": "{{app}} günlüklerini indir",
|
||||
"troubleshoot.share-with-umbrel-support": "Umbrel Destek ile paylaş",
|
||||
"troubleshoot.system-download": "{{label}} indir",
|
||||
"troubleshoot.umbrelos-description": "umbrelOS günlüklerini görüntüleyin",
|
||||
"troubleshoot.umbrelos-logs": "umbrelOS günlükleri",
|
||||
"trpc.backend-unavailable": "Hata: Sistem API bağlantısı başarısız oldu",
|
||||
"trpc.checking-backend": "Yükleniyor...",
|
||||
"try-again": "Tekrar deneyin",
|
||||
"umbrel": "Umbrel",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"umbrelos": "umbrelOS",
|
||||
"unknown": "Bilinmeyen",
|
||||
"unknown-app": "Bilinmeyen uygulama",
|
||||
"unknown-error": "Bilinmeyen hata",
|
||||
"uptime": "Çalışma süresi",
|
||||
"wallpaper": "Duvar kağıdı",
|
||||
"wallpaper-description": "Umbrel duvar kağıdınız ve temanız",
|
||||
"widget.progress.in-progress": "Devam ediyor",
|
||||
"widgets.edit.select-up-to-3-widgets": "En fazla 3 widget seçin",
|
||||
"widgets.install-an-app-before-using-widgets": "Ana ekranınızı widget'larla özelleştirmeye başlamak için bir uygulama yükleyin.",
|
||||
"wifi": "Wi-Fi",
|
||||
"wifi-connect-insecure-message": "Açık ağlar güvensiz olabilir",
|
||||
"wifi-connection-failed": "Bağlanılamadı",
|
||||
"wifi-dangerous-change-confirmation-description": "Wi-Fi ağını değiştirmek, Umbrel'iniz ile olan bağlantınızı kesebilir. Yeniden bağlanmak için, Umbrel'inizin ve erişim sağladığınız cihazın aynı ağda olduğundan emin olun.",
|
||||
"wifi-dangerous-change-confirmation-title": "Wi-Fi ağını değiştirmek istediğinizden emin misiniz?",
|
||||
"wifi-dangerous-disable-confirmation-description": "Wi-Fi'yi devre dışı bırakmak, Umbrel'iniz ile olan bağlantınızı kesebilir. Yeniden bağlanmak için, Umbrel'inize bir Ethernet kablosu takın ve Umbrel'iniz ile erişim sağladığınız cihazın aynı ağda olduğundan emin olun.",
|
||||
"wifi-dangerous-disable-confirmation-title": "Wi-Fi'yi devre dışı bırakmak istediğinizden emin misiniz?",
|
||||
"wifi-description": "Cihazınızı bir Wi-Fi ağına bağlayın",
|
||||
"wifi-description-long": "Ethernet kablosu çıkarılsa bile cihazınız seçtiğiniz Wi-Fi'ye bağlı kalır ve başlatıldığında otomatik olarak Wi-Fi'ye yeniden bağlanır.",
|
||||
"wifi-no-networks-message": "Wi-Fi ağı bulunamadı",
|
||||
"wifi-searching": "Wi-Fi ağları aranıyor...",
|
||||
"wifi-unsupported-device-description": "Bu cihaz Wi-Fi'yi desteklemiyor. Bu, eksik veya uyumsuz bir kablosuz adaptörden kaynaklanabilir.",
|
||||
"wifi-view-networks": "Ağları görüntüle"
|
||||
}
|
||||
@@ -0,0 +1,371 @@
|
||||
{
|
||||
"2fa": "2FA",
|
||||
"2fa-description": "Другий рівень безпеки для вашого входу в Umbrel і програм",
|
||||
"2fa.disable.success": "Двофакторну автентифікацію вимкнено",
|
||||
"2fa.disable.title": "Вимкнути двофакторну автентифікацію",
|
||||
"2fa.enable.or-paste": "Або вставте наступний код у вашу програму-аутентифікатор",
|
||||
"2fa.enable.scan-this": "Скануйте цей QR-код за допомогою програми-аутентифікатора, такого як Google Authenticator або Authy",
|
||||
"2fa.enable.success": "Двофакторну автентифікацію увімкнено",
|
||||
"2fa.enable.title": "Увімкнути двофакторну автентифікацію",
|
||||
"2fa.enter-code": "Введіть код, показаний у вашій програмі-аутентифікаторі",
|
||||
"account": "Акаунт",
|
||||
"account-description": "Ваше ім'я та пароль",
|
||||
"advanced-settings": "Розширені налаштування",
|
||||
"advanced-settings-description": "Відкрити термінал або зареєструватися в Beta Program umbrelOS",
|
||||
"app-not-found": "Програму не знайдено: {{app}}",
|
||||
"app-only-over-tor": "{{app}} можна використовувати тільки через Tor. Доступ до вашого Umbrel за допомогою Tor браузера за віддаленою URL-адресою (Налаштування > Віддалений доступ Tor), щоб відкрити цю програму.",
|
||||
"app-page.section.about": "Про",
|
||||
"app-page.section.credentials.title": "Стандартні облікові дані",
|
||||
"app-page.section.info.compatibility": "Сумісність",
|
||||
"app-page.section.info.compatibility-compatible": "Сумісний",
|
||||
"app-page.section.info.developer": "Розробник",
|
||||
"app-page.section.info.source-code": "Вихідний код",
|
||||
"app-page.section.info.source-code.public": "Публічний",
|
||||
"app-page.section.info.submitted-by": "Подано",
|
||||
"app-page.section.info.title": "Інформація",
|
||||
"app-page.section.info.version": "Версія",
|
||||
"app-page.section.recommendations.title": "Вам також може сподобатися",
|
||||
"app-page.section.release-notes.title": "Що нового",
|
||||
"app-page.section.release-notes.version": "Версія {{version}}",
|
||||
"app-page.section.requires": "Вимагає",
|
||||
"app-page.section.requires.support": "Отримати підтримку",
|
||||
"app-picker.search": "Пошук...",
|
||||
"app-picker.select-app": "Виберіть програму...",
|
||||
"app-store.browse-category-apps": "Перегляд програм у категорії {{category}}",
|
||||
"app-store.category.ai": "Штучний інтелект",
|
||||
"app-store.category.all": "Всі програми",
|
||||
"app-store.category.automation": "Дім і автоматизація",
|
||||
"app-store.category.bitcoin": "Біткойн",
|
||||
"app-store.category.developer": "Інструменти розробника",
|
||||
"app-store.category.discover": "Відкривати",
|
||||
"app-store.category.files": "Файли та продуктивність",
|
||||
"app-store.category.finance": "Фінанси",
|
||||
"app-store.category.media": "Медіа",
|
||||
"app-store.category.networking": "Мережі",
|
||||
"app-store.category.social": "Соціальні мережі",
|
||||
"app-store.description": "Налаштування оновлення ваших програм",
|
||||
"app-store.menu.community-app-stores": "Спільнота магазинів програм",
|
||||
"app-store.search-apps": "Пошук програм",
|
||||
"app-store.search.no-results": "Немає результатів",
|
||||
"app-store.search.results-for": "Результати для",
|
||||
"app-store.title": "App Store",
|
||||
"app-updates.less": "менше",
|
||||
"app-updates.more": "більше",
|
||||
"app-updates.no-updates": "Всі програми оновлені!",
|
||||
"app-updates.update": "Оновити",
|
||||
"app-updates.update-all": "Оновити все",
|
||||
"app-updates.updates-available-count_one": "Доступно {{count}} оновлення",
|
||||
"app-updates.updates-available-count_other": "Доступно {{count}} оновлень",
|
||||
"app-updates.updating": "Оновлення...",
|
||||
"app.install": "Встановити",
|
||||
"app.installing": "Встановлення",
|
||||
"app.offline": "Не працює",
|
||||
"app.open": "Відкрити",
|
||||
"app.optimized-for-umbrel-home": "Оптимізовано для Umbrel Home",
|
||||
"app.restarting": "Перезапуск",
|
||||
"app.starting": "Запуск",
|
||||
"app.stopped": "Зупинено",
|
||||
"app.stopping": "Зупинка",
|
||||
"app.uninstall.confirm.description": "Всі дані, пов'язані з {{app}}, будуть безповоротно видалені. Ця дія не може бути скасована.",
|
||||
"app.uninstall.confirm.submit": "Видалити",
|
||||
"app.uninstall.confirm.title": "Видалити {{app}}?",
|
||||
"app.uninstall.deps.used-by.description_one": "Спочатку видаліть {{firstAppToUninstall}}, щоб видалити {{app}}.",
|
||||
"app.uninstall.deps.used-by.description_other": "Спочатку видаліть ці програми, щоб видалити {{app}}.",
|
||||
"app.uninstall.deps.used-by.title": "{{app}} використовується",
|
||||
"app.uninstalling": "Видалення",
|
||||
"app.updating": "Оновлення",
|
||||
"app.view": "Переглянути",
|
||||
"app_one": "програма",
|
||||
"app_other": "програми",
|
||||
"apps.uninstall.failed-to-get-required-apps": "Не вдалося отримати необхідні програми",
|
||||
"apps.uninstalled-all.success": "Всі програми видалено",
|
||||
"auth.checking-backend-for-user": "Завантаження...",
|
||||
"auth.failed-checking-if-user-logged-in": "Помилка: перевірка входу не вдалася",
|
||||
"auth.failed-to-check-if-user-exists": "Помилка: перевірка існування не вдалася",
|
||||
"beta-program": "umbrelOS Beta Program",
|
||||
"beta-program-description": "Оптимізуйте отримання бета-оновлень umbrelOS, отримуйте ранній доступ до нових функцій та допомагайте нам удосконалювати їх, надаючи свій зворотній зв'язок. Бета-оновлення можуть бути нестабільними, а вирішення проблем може вимагати знайомства з терміналом.",
|
||||
"cancel": "Скасувати",
|
||||
"change": "Змінити",
|
||||
"change-name": "Змінити ім'я",
|
||||
"change-name.failed.name-required": "Ім'я обов'язкове",
|
||||
"change-name.input-placeholder": "Ваше ім'я",
|
||||
"change-password": "Змінити пароль",
|
||||
"change-password.callout": "Якщо ви забудете свій пароль, ви не зможете увійти до свого Umbrel. Переконайтеся, що ви надійно зберегли його.",
|
||||
"change-password.current-password": "Поточний пароль",
|
||||
"change-password.failed.current-required": "Поточний пароль обов'язковий",
|
||||
"change-password.failed.min-length": "Пароль повинен містити щонайменше {{characters}} символів",
|
||||
"change-password.failed.must-be-unique": "Новий пароль повинен відрізнятися від поточного пароля",
|
||||
"change-password.failed.new-required": "Новий пароль обов'язковий",
|
||||
"change-password.failed.no-match": "Паролі не співпадають",
|
||||
"change-password.failed.repeat-required": "Повторіть пароль обов'язково",
|
||||
"change-password.new-password": "Новий пароль",
|
||||
"change-password.repeat-password": "Повторіть пароль",
|
||||
"check-for-latest-version": "Перевірити останнє оновлення umbrelOS",
|
||||
"clipboard.copied": "Скопійовано",
|
||||
"close": "Закрити",
|
||||
"cmdk.change-wallpaper": "Змінити фон",
|
||||
"cmdk.frequent-apps": "Часто використовувані",
|
||||
"cmdk.input-placeholder": "Пошук програм, налаштувань або дій",
|
||||
"cmdk.install-from-app-store": "з App Store",
|
||||
"cmdk.live-usage": "Живий використання",
|
||||
"cmdk.restart-umbrel": "Перезапустити Umbrel",
|
||||
"cmdk.shutdown-umbrel": "Вимкнути Umbrel",
|
||||
"cmdk.update-all-apps": "Оновити всі програми",
|
||||
"cmdk.widgets": "Віджети",
|
||||
"community-app-store": "Community App Store",
|
||||
"community-app-store.back-to-umbrel-app-store": "Назад до Umbrel App Store",
|
||||
"community-app-store.open-button": "Відкрити",
|
||||
"community-app-store.remove-button": "Видалити",
|
||||
"community-app-stores.add-button": "Додати",
|
||||
"community-app-stores.description": "Community App Stores дозволяють встановлювати програми на ваш Umbrel, які можуть бути недоступні в офіційному Umbrel App Store. Вони також спрощують тестування бета-версій програм Umbrel перед їх випуском в офіційному Umbrel App Store.",
|
||||
"community-app-stores.learn-more": "Дізнатися більше",
|
||||
"community-app-stores.warning": "Community App Stores можуть бути створені будь-ким. Програми, опубліковані в них, не перевірені та не затверджені командою офіційного Umbrel App Store і можуть бути небезпечними або зловмисними. Використовуйте обережно та додавайте магазини програм тільки від розробників, яким ви довіряєте.",
|
||||
"confirm": "Підтвердити",
|
||||
"connecting": "Підключення...",
|
||||
"continue": "Продовжити",
|
||||
"continue-to-log-in": "Продовжити вхід",
|
||||
"cpu": "ЦП",
|
||||
"cpu-core-count": "{{cores}} потоки",
|
||||
"create-user": "Створити користувача",
|
||||
"default-credentials.close": "Зрозуміло",
|
||||
"default-credentials.description": "Ось облікові дані, які вам знадобляться для входу в програму.",
|
||||
"default-credentials.dont-show-again": "Більше не показувати це",
|
||||
"default-credentials.open": "Відкрити {{app}}",
|
||||
"default-credentials.password": "Пароль за замовчуванням",
|
||||
"default-credentials.title": "Облікові дані для {{app}}",
|
||||
"default-credentials.username": "Ім'я користувача за замовчуванням",
|
||||
"desktop.app.context.go-to-store-page": "Переглянути в App Store",
|
||||
"desktop.app.context.show-default-credentials": "Показати облікові дані за замовчуванням",
|
||||
"desktop.app.context.uninstall": "Видалити",
|
||||
"desktop.context-menu.change-wallpaper": "Змінити фон",
|
||||
"desktop.context-menu.edit-widgets": "Редагувати віджети",
|
||||
"desktop.context-menu.logout": "Вийти",
|
||||
"desktop.greeting.afternoon": "Доброго дня, {{name}}",
|
||||
"desktop.greeting.evening": "Добрий вечір, {{name}}",
|
||||
"desktop.greeting.morning": "Доброго ранку, {{name}}",
|
||||
"desktop.install-first.for-the-bitcoiner": "Для Біткойнера",
|
||||
"desktop.install-first.for-the-self-hoster": "Для власного хостингу",
|
||||
"desktop.install-first.for-the-streamer": "Для стрімера",
|
||||
"desktop.install-first.link-to-app-store": "Дізнатися більше в App Store",
|
||||
"desktop.not-enough-room": "Використовуйте більший екран для перегляду програм.",
|
||||
"device": "Пристрій",
|
||||
"device-info": "Інформація про пристрій",
|
||||
"device-info-description": "Інформація про ваш пристрій",
|
||||
"device-info.device": "Пристрій",
|
||||
"device-info.model-number": "Номер моделі",
|
||||
"device-info.serial-number": "Серійний номер",
|
||||
"device-info.view-info": "Переглянути інформацію",
|
||||
"disable": "Вимкнути",
|
||||
"download-logs": "Завантажити журнали",
|
||||
"factory-reset": "Скидання до заводських налаштувань",
|
||||
"factory-reset.confirm.body": "Підтвердьте пароль Umbrel для скидання",
|
||||
"factory-reset.confirm.password-label": "Введіть пароль",
|
||||
"factory-reset.confirm.submit": "Стерти все і скинути",
|
||||
"factory-reset.confirm.submit-callout": "Цю дію не можна скасувати.",
|
||||
"factory-reset.desc": "Видалити всі дані umbrelOS і програми",
|
||||
"factory-reset.failed.message": "Виникла помилка під час скидання",
|
||||
"factory-reset.failed.retry": "Спробуйте скидання ще раз",
|
||||
"factory-reset.failed.title": "Скидання не вдалося",
|
||||
"factory-reset.reset": "Скинути",
|
||||
"factory-reset.resetting.connecting": "Підключення",
|
||||
"factory-reset.resetting.dont-turn-off-device": "Не вимикайте пристрій, доки скидання не завершиться",
|
||||
"factory-reset.review.account-info": "Інформація про акаунт та пароль",
|
||||
"factory-reset.review.apps": "Програми",
|
||||
"factory-reset.review.following-will-be-removed": "Наступне буде видалено з вашого пристрою",
|
||||
"factory-reset.review.installed-apps_one": "{{count}} встановлена програма",
|
||||
"factory-reset.review.installed-apps_other": "{{count}} встановлених програм",
|
||||
"factory-reset.review.submit": "Продовжити",
|
||||
"factory-reset.review.total-data": "Загальний обсяг даних",
|
||||
"factory-reset.success.description": "Всі ваші програми, дані програм і облікові дані були видалені з вашого пристрою. Тепер ви можете перезавантажити свій пристрій.",
|
||||
"factory-reset.success.restart-device": "Перезавантажити пристрій",
|
||||
"factory-reset.success.title": "Скидання успішне",
|
||||
"hello": "Привіт",
|
||||
"install-first.description_one": "Встановіть цю програму, щоб встановити {{app}}.",
|
||||
"install-first.description_other": "Спочатку встановіть ці програми, щоб встановити {{app}}.",
|
||||
"install-first.title": "{{app}} вимагає доступу до",
|
||||
"install-your-first-app": "Встановіть свою першу програму",
|
||||
"language": "Мова",
|
||||
"language-description": "Ваша бажана мова umbrelOS",
|
||||
"language.select-description": "Виберіть бажану мову umbrelOS",
|
||||
"linux": "Linux",
|
||||
"live-usage": "Живе використання",
|
||||
"loading": "Завантаження",
|
||||
"local-ip": "Локальний IP",
|
||||
"login-2fa.subtitle": "Введіть код 2FA, відображений у вашій програмі-аутентифікаторі",
|
||||
"login-2fa.title": "Аутентифікація",
|
||||
"login-with-umbrel.description": "Введіть пароль Umbrel, щоб відкрити {{app}}",
|
||||
"login-with-umbrel.title": "Увійти з Umbrel",
|
||||
"login.password-label": "Пароль",
|
||||
"login.password.submit": "Увійти",
|
||||
"login.subtitle": "Введіть пароль Umbrel для входу",
|
||||
"login.title": "З поверненням",
|
||||
"logout": "Вийти",
|
||||
"logout-error-generic": "Помилка: вихід не вдався",
|
||||
"logout.confirm.submit": "Вийти",
|
||||
"logout.confirm.title": "Ви впевнені, що хочете вийти?",
|
||||
"memory": "Пам'ять",
|
||||
"memory.low": "Низький рівень пам'яті",
|
||||
"migrate": "Мігрувати",
|
||||
"migrate.callout": "Не вимикайте ваш Umbrel, доки міграція не завершиться",
|
||||
"migrate.failed.retry": "Спробувати знову",
|
||||
"migrate.failed.title": "Міграція не вдалася",
|
||||
"migrate.success.description": "Всі ваші програми, дані програм і деталі облікового запису були перенесені на ваш Umbrel Home.",
|
||||
"migrate.success.title": "Міграція успішна",
|
||||
"migration-assistant": "Помічник з міграції",
|
||||
"migration-assistant-description": "Передайте всі ваші програми та дані з Raspberry Pi на Umbrel Home",
|
||||
"migration-assistant-unsupported-device-description": "Помічник з міграції наразі підтримує передачу всіх даних і програм з Raspberry Pi з umbrelOS на Umbrel Home. Відкрийте Помічник з міграції на вашому Umbrel Home, щоб почати.",
|
||||
"migration-assistant.continue-migration.ready.submit": "Почати міграцію",
|
||||
"migration-assistant.failed": "Щось не так...",
|
||||
"migration-assistant.failed.retrying-message": "Повторна спроба...",
|
||||
"migration-assistant.mobile.start-button": "Почати міграцію",
|
||||
"migration-assistant.prep.body": "Підготуйтеся до міграції",
|
||||
"migration-assistant.prep.button-continue": "Продовжити",
|
||||
"migration-assistant.prep.callout": "Дані на вашому Umbrel Home, якщо такі є, будуть безповоротно видалені.",
|
||||
"migration-assistant.prep.connect-disk-to-home": "Підключіть його зовнішній диск до будь-якого USB-порту вашого Umbrel Home.",
|
||||
"migration-assistant.prep.prep-done-continue-message": "Коли будете готові, натисніть '{{button}}' нижче.",
|
||||
"migration-assistant.prep.shut-down-rpi": "Вимкніть ваш Raspberry Pi Umbrel.",
|
||||
"migration-assistant.ready.description": "Всі ваші дані та програми готові до перенесення на ваш Umbrel Home",
|
||||
"migration-assistant.ready.hint-header": "Речі, які варто пам'ятати",
|
||||
"migration-assistant.ready.hint-keep-pi-off.description": "Це допомагає запобігти проблемам з програмами, такими як Lightning Node",
|
||||
"migration-assistant.ready.hint-keep-pi-off.title": "Тримайте ваш Raspberry Pi вимкненим після оновлення",
|
||||
"migration-assistant.ready.hint-use-same-password.description": "Не забудьте використовувати пароль від вашого Raspberry Pi Umbrel для входу в ваш Umbrel Home",
|
||||
"migration-assistant.ready.hint-use-same-password.title": "Використовуйте той самий пароль",
|
||||
"migration-assistant.ready.title": "Ви готові до міграції!",
|
||||
"name": "Ім'я",
|
||||
"no-forgot-password-message": "Якщо ви забудете свій пароль, ви не зможете увійти в Umbrel. Переконайтеся, що ви надійно зберегли його.",
|
||||
"no-results-found": "Результатів не знайдено",
|
||||
"not-found-404": "Код помилки: 404",
|
||||
"not-found-404.back": "Назад",
|
||||
"not-found-404.home": "Перейти на головну",
|
||||
"notifications.cpu.too-hot": "Висока температура ЦП",
|
||||
"notifications.memory.low": "Низький рівень пам'яті вашого пристрою",
|
||||
"notifications.new-version-available": "{{update}} доступна для встановлення",
|
||||
"notifications.storage.full": "Пам'ять вашого пристрою заповнена",
|
||||
"notifications.view": "Переглянути",
|
||||
"ok": "OK",
|
||||
"onboarding.account-created.by-clicking-button-you-agree": "Натискаючи 'Далі', ви погоджуєтеся з <linked>Умовами обслуговування umbrelOS</linked>",
|
||||
"onboarding.account-created.next": "Далі",
|
||||
"onboarding.account-created.subtitle": "Ваш Umbrel готовий.",
|
||||
"onboarding.account-created.youre-all-set-name": "Ви готові, {{name}}.",
|
||||
"onboarding.contact-support": "Підтримка",
|
||||
"onboarding.create-account": "Створити акаунт",
|
||||
"onboarding.create-account.confirm-password.input-label": "Підтвердити пароль",
|
||||
"onboarding.create-account.failed.name-required": "Ім'я обов'язкове",
|
||||
"onboarding.create-account.failed.passwords-dont-match": "Паролі не співпадають",
|
||||
"onboarding.create-account.name.input-placeholder": "Ваше ім'я",
|
||||
"onboarding.create-account.password.input-label": "Пароль",
|
||||
"onboarding.create-account.submit": "Створити",
|
||||
"onboarding.create-account.submitting": "Створення",
|
||||
"onboarding.create-account.subtitle": "Ваша інформація облікового запису зберігається лише на вашому Umbrel. Переконайтеся, що ви надійно зберегли свій пароль, оскільки його не можна скинути.",
|
||||
"onboarding.start.continue": "Почати",
|
||||
"onboarding.start.subtitle": "Ваш домашній хмарний сервер готовий до налаштування.",
|
||||
"onboarding.start.title": "Ласкаво просимо до umbrelOS",
|
||||
"open": "Відкрити",
|
||||
"open-live-usage": "Відкрити Живе використання",
|
||||
"password": "Пароль",
|
||||
"preferences": "Налаштування",
|
||||
"raspberry-pi": "Raspberry Pi",
|
||||
"read-less": "Читати менше",
|
||||
"read-more": "Читати більше",
|
||||
"redirect.to-home": "Завантаження...",
|
||||
"redirect.to-login": "Завантаження...",
|
||||
"redirect.to-onboarding": "Завантаження...",
|
||||
"remote-tor-access": "Віддалений доступ через Tor",
|
||||
"restart": "Перезапустити",
|
||||
"restart.confirm.submit": "Перезапустити",
|
||||
"restart.confirm.title": "Ви впевнені, що хочете перезапустити Umbrel?",
|
||||
"restart.restarting": "Перезапуск",
|
||||
"restart.restarting-message": "Будь ласка, не оновлюйте цю сторінку і не вимикайте ваш Umbrel, доки він перезапускається.",
|
||||
"retry": "Спробувати ще раз",
|
||||
"search": "Пошук",
|
||||
"settings": "Налаштування",
|
||||
"settings.app-store-preferences.title": "Налаштування App Store",
|
||||
"settings.contact-support": "Потрібна допомога? <linked>Зв'яжіться з підтримкою.</linked>",
|
||||
"shut-down": "Вимкнути",
|
||||
"shut-down.complete": "Вимкнення завершено",
|
||||
"shut-down.complete-text": "Тепер ви можете відключити пристрій від живлення.",
|
||||
"shut-down.confirm.submit": "Вимкнути",
|
||||
"shut-down.confirm.title": "Ви впевнені, що хочете вимкнути Umbrel?",
|
||||
"shut-down.shutting-down": "Вимкнення",
|
||||
"shut-down.shutting-down-message": "Будь ласка, не оновлюйте цю сторінку і не вимикайте ваш Umbrel, доки він вимикається.",
|
||||
"software-update.callout": "Будь ласка, не оновлюйте цю сторінку і не вимикайте ваш Umbrel під час оновлення.",
|
||||
"software-update.check": "Перевірити наявність оновлень",
|
||||
"software-update.checking": "Перевірка наявності оновлень...",
|
||||
"software-update.current-running": "Ви використовуєте",
|
||||
"software-update.failed": "Не вдалося оновити",
|
||||
"software-update.failed-to-check": "Не вдалося перевірити наявність оновлень",
|
||||
"software-update.failed.retry": "Спробувати ще раз",
|
||||
"software-update.install-now": "Встановити зараз",
|
||||
"software-update.new-version": "Доступна нова {{name}} для встановлення",
|
||||
"software-update.on-latest": "У вас найновіша версія umbrelOS",
|
||||
"software-update.title": "Оновлення програмного забезпечення",
|
||||
"software-update.updating-to": "Оновлення до {{name}}",
|
||||
"software-update.view": "Переглянути",
|
||||
"something-left": "Залишилося {{left}}",
|
||||
"something-went-wrong": "⚠ Щось пішло не так",
|
||||
"start": "Почати",
|
||||
"stop": "Зупинити",
|
||||
"storage": "Зберігання",
|
||||
"storage.full": "Пам'ять заповнена",
|
||||
"storage.low": "Низький рівень зберігання",
|
||||
"temp.dangerously-hot": "Дуже гаряче",
|
||||
"temp.nice": "Приємно",
|
||||
"temp.normal": "Нормально",
|
||||
"temp.warm": "Тепло",
|
||||
"temperature": "Температура",
|
||||
"temperature.too-hot-suggestion": "Розгляньте можливість зміни середовища вашого пристрою.",
|
||||
"terminal": "Термінал",
|
||||
"terminal-description": "Виконуйте власні команди в umbrelOS або в межах програми",
|
||||
"terminal.app": "Програма",
|
||||
"terminal.app-description": "Виконуйте власні команди в межах певної програми",
|
||||
"terminal.umbrelos-description": "Виконуйте власні команди в umbrelOS",
|
||||
"tor-description": "Доступ до вашого Umbrel з будь-якого місця за допомогою браузера Tor",
|
||||
"tor.disable.description": "Це може зайняти кілька хвилин",
|
||||
"tor.disable.progress": "Вимкнення віддаленого доступу Tor",
|
||||
"tor.disable.success": "Віддалений доступ Tor вимкнено",
|
||||
"tor.enable.description": "Це може зайняти кілька хвилин",
|
||||
"tor.enable.mobile.switch-label": "Увімкнути віддалений доступ Tor",
|
||||
"tor.enable.submit": "Увімкнути",
|
||||
"tor.enable.success": "Віддалений доступ Tor увімкнено",
|
||||
"tor.enable.title": "Увімкнути віддалений доступ Tor",
|
||||
"tor.hidden-service": "URL прихованої служби Tor",
|
||||
"troubleshoot": "Вирішення проблем",
|
||||
"troubleshoot-description": "Вирішити проблеми з umbrelOS або програмою",
|
||||
"troubleshoot-no-logs-yet": "Ще немає журналів",
|
||||
"troubleshoot-pick-title": "Вирішення проблем",
|
||||
"troubleshoot.app": "Програма",
|
||||
"troubleshoot.app-description": "Переглянути журнали програми, встановленої на вашому Umbrel",
|
||||
"troubleshoot.app-download": "Завантажити журнали {{app}}",
|
||||
"troubleshoot.share-with-umbrel-support": "Поділитися з підтримкою Umbrel",
|
||||
"troubleshoot.system-download": "Завантажити {{label}}",
|
||||
"troubleshoot.umbrelos-description": "Переглянути журнали umbrelOS",
|
||||
"troubleshoot.umbrelos-logs": "Журнали umbrelOS",
|
||||
"trpc.backend-unavailable": "Помилка: не вдалося підключитися до системного API",
|
||||
"trpc.checking-backend": "Завантаження...",
|
||||
"try-again": "Спробувати ще раз",
|
||||
"umbrel": "Umbrel",
|
||||
"umbrel-home": "Umbrel Home",
|
||||
"umbrelos": "umbrelOS",
|
||||
"unknown": "Невідомо",
|
||||
"unknown-app": "Невідома програма",
|
||||
"unknown-error": "Невідома помилка",
|
||||
"uptime": "Час роботи",
|
||||
"wallpaper": "Фон",
|
||||
"wallpaper-description": "Ваш фон та тема Umbrel",
|
||||
"widget.progress.in-progress": "В процесі",
|
||||
"widgets.edit.select-up-to-3-widgets": "Виберіть до 3 віджетів",
|
||||
"widgets.install-an-app-before-using-widgets": "Встановіть програму, щоб почати налаштування головного екрану за допомогою віджетів.",
|
||||
"wifi": "Wi-Fi",
|
||||
"wifi-connect-insecure-message": "Відкриті мережі можуть бути небезпечними",
|
||||
"wifi-connection-failed": "Не вдалося підключитися",
|
||||
"wifi-dangerous-change-confirmation-description": "Зміна мережі Wi-Fi може відключити вас від вашого Umbrel. Для повторного підключення переконайтеся, що і ваш Umbrel, і пристрій, з якого ви отримуєте до нього доступ, знаходяться в одній мережі.",
|
||||
"wifi-dangerous-change-confirmation-title": "Ви впевнені, що хочете змінити мережу Wi-Fi?",
|
||||
"wifi-dangerous-disable-confirmation-description": "Вимкнення Wi-Fi може відключити вас від вашого Umbrel. Для повторного підключення підключіть Ethernet-кабель до вашого Umbrel і переконайтеся, що і ваш Umbrel, і пристрій, з якого ви отримуєте до нього доступ, знаходяться в одній мережі.",
|
||||
"wifi-dangerous-disable-confirmation-title": "Ви впевнені, що хочете вимкнути Wi-Fi?",
|
||||
"wifi-description": "Підключіть ваш пристрій до Wi-Fi мережі",
|
||||
"wifi-description-long": "Ваш пристрій залишатиметься підключеним до обраної Wi-Fi мережі, навіть якщо Ethernet-кабель буде відключено, і автоматично підключатиметься до Wi-Fi при запуску.",
|
||||
"wifi-no-networks-message": "Wi-Fi мережі не знайдено",
|
||||
"wifi-searching": "Пошук Wi-Fi мереж...",
|
||||
"wifi-unsupported-device-description": "Wi-Fi не підтримується на цьому пристрої. Це може бути через відсутність або несумісність бездротового адаптера.",
|
||||
"wifi-view-networks": "Переглянути мережі"
|
||||
}
|
||||
@@ -173,6 +173,9 @@ function CmdkContent() {
|
||||
{/* List rows */}
|
||||
<SettingsSearchItem value={t('change-name')} onSelect={() => navigate('settings/account/change-name')} />
|
||||
<SettingsSearchItem value={t('change-password')} onSelect={() => navigate('settings/account/change-password')} />
|
||||
<SettingsSearchItem value={'wifi'} onSelect={() => navigate('/settings/wifi')}>
|
||||
{t('wifi')}
|
||||
</SettingsSearchItem>
|
||||
<SettingsSearchItem value={'2fa'} onSelect={() => navigate('/settings/2fa')}>
|
||||
{t('2fa')}
|
||||
</SettingsSearchItem>
|
||||
|
||||
@@ -40,6 +40,7 @@ export function Markdown({className, ...props}: React.ComponentProps<typeof Mark
|
||||
a: (props) => (
|
||||
<a
|
||||
className='decoration-white/30 underline-offset-2 outline-none transition-opacity hover:opacity-80 focus:opacity-80'
|
||||
target='_blank'
|
||||
{...props}
|
||||
/>
|
||||
),
|
||||
|
||||
@@ -29,7 +29,7 @@ export function CopyableField({
|
||||
<div
|
||||
className={cn(
|
||||
// 'items-stretch' to make sure button is the same height as the field
|
||||
'flex max-w-full items-stretch overflow-hidden rounded-4 border border-dashed border-white/5 bg-white/4 text-14 leading-none text-white/40 outline-none focus-visible:border-white/40',
|
||||
'flex max-w-full items-stretch rounded-4 border border-dashed border-white/5 bg-white/4 text-14 leading-none text-white/40 outline-none focus-visible:border-white/40',
|
||||
className,
|
||||
)}
|
||||
>
|
||||
@@ -38,7 +38,7 @@ export function CopyableField({
|
||||
ref={ref}
|
||||
onClick={() => setTimeout(() => ref.current?.select())}
|
||||
className={cn(
|
||||
'block flex-1 appearance-none truncate bg-transparent py-1.5 pl-2.5 font-mono outline-none',
|
||||
'block flex-1 appearance-none truncate bg-transparent py-1.5 pl-2.5 font-mono outline-none min-w-0',
|
||||
narrow && 'py-0.5',
|
||||
)}
|
||||
type={isPassword && !focused ? 'password' : 'text'}
|
||||
|
||||
@@ -17,6 +17,7 @@ type IconProps = {
|
||||
export const sizeMap = {
|
||||
sm: '12px',
|
||||
default: '14px',
|
||||
'input-short': '16px',
|
||||
'md-squared': '16px',
|
||||
lg: '17px',
|
||||
xl: '13px',
|
||||
|
||||
@@ -34,7 +34,7 @@ export function ImmersiveDialogContent({
|
||||
showScroll = false,
|
||||
}: {
|
||||
children: React.ReactNode
|
||||
size?: 'default' | 'lg' | 'xl'
|
||||
size?: 'default' | 'md' | 'lg' | 'xl'
|
||||
short?: boolean
|
||||
showScroll?: boolean
|
||||
}) {
|
||||
@@ -46,6 +46,7 @@ export function ImmersiveDialogContent({
|
||||
dialogContentAnimationSlideClass,
|
||||
short ? immersiveContentShortClass : immersiveContentTallClass,
|
||||
// overrides default size
|
||||
size === 'md' && 'max-w-[900px]',
|
||||
size === 'lg' && 'max-w-[980px]',
|
||||
size === 'xl' && 'max-w-[1440px]',
|
||||
'p-0',
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import {TbLoader} from 'react-icons/tb'
|
||||
|
||||
import {t} from '@/utils/i18n'
|
||||
|
||||
export function Loading({children}: {children?: React.ReactNode}) {
|
||||
@@ -9,6 +11,15 @@ export function Loading({children}: {children?: React.ReactNode}) {
|
||||
)
|
||||
}
|
||||
|
||||
export function Loading2({children}: {children?: React.ReactNode}) {
|
||||
return (
|
||||
<div className='flex items-center gap-1'>
|
||||
<TbLoader className='white size-4 animate-spin opacity-50 shadow-sm' />
|
||||
{children ?? t('loading')}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export function Spinner({size = '4'}: {size?: string}) {
|
||||
return (
|
||||
<svg
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
import {AnimationControls, useAnimation} from 'framer-motion'
|
||||
import {useLayoutEffect, useRef} from 'react'
|
||||
|
||||
export function useAutoHeightAnimation(deps: any[]): [AnimationControls, React.RefObject<HTMLDivElement>] {
|
||||
const controls = useAnimation()
|
||||
const ref = useRef<HTMLDivElement>(null)
|
||||
const height = useRef<number | null>(null)
|
||||
|
||||
useLayoutEffect(() => {
|
||||
if (!ref.current) return
|
||||
ref.current.style.height = 'auto'
|
||||
const newHeight = ref.current.offsetHeight
|
||||
|
||||
//console.log( newHeight )
|
||||
if (height.current !== null) {
|
||||
controls.set({height: height.current})
|
||||
controls.start({height: newHeight, opacity: 1})
|
||||
}
|
||||
|
||||
height.current = newHeight
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [ref, controls, ...deps])
|
||||
|
||||
return [controls, ref]
|
||||
}
|
||||
@@ -17,13 +17,10 @@ export function useColorThief(ref: React.RefObject<HTMLImageElement>) {
|
||||
useEffect(() => {
|
||||
if (!ref.current) return
|
||||
if (!intersection) return
|
||||
console.log('ratio', intersection.intersectionRatio)
|
||||
if (intersection.intersectionRatio === 0) return
|
||||
|
||||
const img = ref.current
|
||||
|
||||
console.log('img.complete')
|
||||
|
||||
if (img.complete) {
|
||||
const rgbArr = colorThief.getPalette(img, colorCount)
|
||||
setColors(processColors(rgbArr))
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
import {useState} from 'react'
|
||||
|
||||
import {trpcReact} from '@/trpc/trpc'
|
||||
import {isCpuTooCold, isCpuTooHot} from '@/utils/system'
|
||||
import {CpuType} from '@/utils/temperature'
|
||||
|
||||
export function useCpuTemp() {
|
||||
const [enabled, setEnabled] = useState(true)
|
||||
@@ -18,16 +16,13 @@ export function useCpuTemp() {
|
||||
},
|
||||
})
|
||||
|
||||
const temp = cpuTempQ.data
|
||||
|
||||
const cpuType: CpuType = 'pi' // TODO: get from system
|
||||
const temp = cpuTempQ.data?.temperature
|
||||
const warning = cpuTempQ.data?.warning
|
||||
|
||||
return {
|
||||
temp,
|
||||
cpuType,
|
||||
warning,
|
||||
isLoading: cpuTempQ.isLoading,
|
||||
isHot: isCpuTooHot(cpuType, temp),
|
||||
isCold: isCpuTooCold(cpuType, temp),
|
||||
error: cpuTempQ.error,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ export function useCpu(options: {poll?: boolean} = {}) {
|
||||
// Sometimes we won't be able to get disk usage, so prevent retry
|
||||
retry: false,
|
||||
// We do want refetching to happen on a schedule though
|
||||
refetchInterval: options.poll ? 500 : undefined,
|
||||
refetchInterval: options.poll ? 1000 : undefined,
|
||||
})
|
||||
|
||||
return {
|
||||
@@ -18,13 +18,21 @@ export function useCpu(options: {poll?: boolean} = {}) {
|
||||
//
|
||||
percentUsed: cpuQ.data?.totalUsed ?? 0,
|
||||
threads: cpuQ.data?.threads ?? 0,
|
||||
system: cpuQ.data?.system ?? 0,
|
||||
apps: sort(cpuQ.data?.apps ?? [], (a, b) => b.used - a.used),
|
||||
apps: sort(
|
||||
[
|
||||
...(cpuQ.data?.apps ?? []),
|
||||
{
|
||||
id: 'umbreld-system',
|
||||
used: cpuQ.data?.system ?? 0,
|
||||
},
|
||||
],
|
||||
(a, b) => b.used - a.used,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
export function useCpuForUi(options: {poll?: boolean} = {}) {
|
||||
const {isLoading, percentUsed, threads, system, apps} = useCpu({poll: options.poll})
|
||||
const {isLoading, percentUsed, threads, apps} = useCpu({poll: options.poll})
|
||||
|
||||
if (isLoading) {
|
||||
return {
|
||||
@@ -40,7 +48,6 @@ export function useCpuForUi(options: {poll?: boolean} = {}) {
|
||||
value: Math.ceil(percentUsed) + '%',
|
||||
progress: percentUsed / 100,
|
||||
secondaryValue: t('cpu-core-count', {cores: threads}),
|
||||
system,
|
||||
apps,
|
||||
} as const
|
||||
}
|
||||
|
||||
@@ -7,12 +7,14 @@ import {t} from '@/utils/i18n'
|
||||
import {maybePrettyBytes} from '@/utils/pretty-bytes'
|
||||
import {isDiskFull, isDiskLow, trpcDiskToLocal} from '@/utils/system'
|
||||
|
||||
const ONE_SECOND = 1000
|
||||
|
||||
export function useDisk(options: {poll?: boolean} = {}) {
|
||||
const diskQ = trpcReact.system.diskUsage.useQuery(undefined, {
|
||||
// Sometimes we won't be able to get disk usage, so prevent retry
|
||||
retry: false,
|
||||
// We do want refetching to happen on a schedule though
|
||||
refetchInterval: options.poll ? 500 : undefined,
|
||||
refetchInterval: options.poll ? ONE_SECOND * 10 : undefined,
|
||||
})
|
||||
|
||||
const transformed = trpcDiskToLocal(diskQ.data)
|
||||
@@ -22,16 +24,27 @@ export function useDisk(options: {poll?: boolean} = {}) {
|
||||
isLoading: diskQ.isLoading,
|
||||
//
|
||||
...transformed,
|
||||
system: diskQ.data?.system,
|
||||
downloads: diskQ.data?.downloads,
|
||||
apps: sort(diskQ.data?.apps ?? [], (a, b) => b.used - a.used),
|
||||
apps: sort(
|
||||
[
|
||||
...(diskQ.data?.apps ?? []),
|
||||
{
|
||||
id: 'umbreld-system',
|
||||
used: diskQ.data?.system ?? 0,
|
||||
},
|
||||
{
|
||||
id: 'umbreld-downloads',
|
||||
used: diskQ.data?.downloads ?? 0,
|
||||
},
|
||||
],
|
||||
(a, b) => b.used - a.used,
|
||||
),
|
||||
isDiskLow: isDiskLow(transformed?.available),
|
||||
isDiskFull: isDiskFull(transformed?.available),
|
||||
}
|
||||
}
|
||||
|
||||
export function useDiskForUi(options: {poll?: boolean} = {}) {
|
||||
const {isLoading, used, size, available, isDiskFull, isDiskLow, system, downloads, apps} = useDisk({
|
||||
const {isLoading, used, size, available, isDiskFull, isDiskLow, apps} = useDisk({
|
||||
poll: options.poll,
|
||||
})
|
||||
|
||||
@@ -55,8 +68,54 @@ export function useDiskForUi(options: {poll?: boolean} = {}) {
|
||||
.toNumber(),
|
||||
isDiskLow,
|
||||
isDiskFull,
|
||||
system,
|
||||
downloads,
|
||||
apps,
|
||||
} as const
|
||||
}
|
||||
|
||||
export function useSystemDisk(options: {poll?: boolean} = {}) {
|
||||
const diskQ = trpcReact.system.systemDiskUsage.useQuery(undefined, {
|
||||
// Sometimes we won't be able to get disk usage, so prevent retry
|
||||
retry: false,
|
||||
// We do want refetching to happen on a schedule though
|
||||
refetchInterval: options.poll ? ONE_SECOND * 10 : undefined,
|
||||
})
|
||||
|
||||
const transformed = trpcDiskToLocal(diskQ.data)
|
||||
|
||||
return {
|
||||
data: diskQ.data,
|
||||
isLoading: diskQ.isLoading,
|
||||
//
|
||||
...transformed,
|
||||
isDiskLow: isDiskLow(transformed?.available),
|
||||
isDiskFull: isDiskFull(transformed?.available),
|
||||
}
|
||||
}
|
||||
|
||||
export function useSystemDiskForUi(options: {poll?: boolean} = {}) {
|
||||
const {isLoading, used, size, available, isDiskFull, isDiskLow} = useSystemDisk({
|
||||
poll: options.poll,
|
||||
})
|
||||
|
||||
if (isLoading) {
|
||||
return {
|
||||
isLoading: true,
|
||||
value: LOADING_DASH,
|
||||
valueSub: '/ ' + LOADING_DASH,
|
||||
secondaryValue: LOADING_DASH,
|
||||
progress: 0,
|
||||
} as const
|
||||
}
|
||||
|
||||
return {
|
||||
isLoading: false,
|
||||
value: maybePrettyBytes(used),
|
||||
valueSub: `/ ${maybePrettyBytes(size)}`,
|
||||
secondaryValue: t('something-left', {left: maybePrettyBytes(available)}),
|
||||
progress: BigNumber(used ?? 0)
|
||||
.dividedBy(size ?? 0)
|
||||
.toNumber(),
|
||||
isDiskLow,
|
||||
isDiskFull,
|
||||
} as const
|
||||
}
|
||||
|
||||
@@ -26,8 +26,11 @@ export const languages = [
|
||||
{name: 'Español', code: 'es'},
|
||||
{name: 'Français', code: 'fr'},
|
||||
{name: 'Italiano', code: 'it'},
|
||||
{name: 'Magyar', code: 'hu'},
|
||||
{name: 'Nederlands', code: 'nl'},
|
||||
{name: 'Português', code: 'pt'},
|
||||
{name: 'Українська', code: 'uk'},
|
||||
{name: 'Türkçe', code: 'tr'},
|
||||
{name: '日本語', code: 'ja'},
|
||||
] as const
|
||||
|
||||
|
||||
@@ -63,7 +63,6 @@ export function useLaunchApp() {
|
||||
function openApp(app: UserApp, path?: string) {
|
||||
trackAppOpen(app.id)
|
||||
// Don't prefix by default because this is called from widgets
|
||||
// https://discord.com/channels/936693236339183716/940192361743540245/1212269980066779197
|
||||
// We don't wanna be prefixing every time
|
||||
const url = path ? urlJoin(appToUrl(app), path) : appToUrlWithAppPath(app)
|
||||
window.open(url, '_blank')?.focus()
|
||||
|
||||
@@ -7,12 +7,12 @@ import {t} from '@/utils/i18n'
|
||||
import {maybePrettyBytes} from '@/utils/pretty-bytes'
|
||||
import {isMemoryLow, trpcMemoryToLocal} from '@/utils/system'
|
||||
|
||||
export function useMemory(options: {poll?: boolean} = {}) {
|
||||
const memoryQ = trpcReact.system.memoryUsage.useQuery(undefined, {
|
||||
export function useSystemMemory(options: {poll?: boolean} = {}) {
|
||||
const memoryQ = trpcReact.system.systemMemoryUsage.useQuery(undefined, {
|
||||
// Sometimes we won't be able to get disk usage, so prevent retry
|
||||
retry: false,
|
||||
// We do want refetching to happen on a schedule though
|
||||
refetchInterval: options.poll ? 2000 : undefined,
|
||||
refetchInterval: options.poll ? 1000 : undefined,
|
||||
})
|
||||
|
||||
const transformed = trpcMemoryToLocal(memoryQ.data)
|
||||
@@ -22,14 +22,66 @@ export function useMemory(options: {poll?: boolean} = {}) {
|
||||
isLoading: memoryQ.isLoading,
|
||||
//
|
||||
...transformed,
|
||||
system: memoryQ.data?.system,
|
||||
apps: sort(memoryQ.data?.apps ?? [], (a, b) => b.used - a.used),
|
||||
isMemoryLow: isMemoryLow({size: transformed?.size, used: transformed?.used}),
|
||||
}
|
||||
}
|
||||
|
||||
export function useMemory(options: {poll?: boolean} = {}) {
|
||||
const memoryQ = trpcReact.system.memoryUsage.useQuery(undefined, {
|
||||
// Sometimes we won't be able to get disk usage, so prevent retry
|
||||
retry: false,
|
||||
// We do want refetching to happen on a schedule though
|
||||
refetchInterval: options.poll ? 1000 : undefined,
|
||||
})
|
||||
|
||||
const transformed = trpcMemoryToLocal(memoryQ.data)
|
||||
|
||||
return {
|
||||
data: memoryQ.data,
|
||||
isLoading: memoryQ.isLoading,
|
||||
//
|
||||
...transformed,
|
||||
apps: sort(
|
||||
[
|
||||
...(memoryQ.data?.apps ?? []),
|
||||
{
|
||||
id: 'umbreld-system',
|
||||
used: memoryQ.data?.system ?? 0,
|
||||
},
|
||||
],
|
||||
(a, b) => b.used - a.used,
|
||||
),
|
||||
isMemoryLow: isMemoryLow({size: transformed?.size, used: transformed?.used}),
|
||||
}
|
||||
}
|
||||
|
||||
export function useSystemMemoryForUi(options: {poll?: boolean} = {}) {
|
||||
const {isLoading, used, size, available, isMemoryLow} = useSystemMemory({poll: options.poll})
|
||||
|
||||
if (isLoading) {
|
||||
return {
|
||||
isLoading: true,
|
||||
value: LOADING_DASH,
|
||||
valueSub: '/ ' + LOADING_DASH,
|
||||
secondaryValue: LOADING_DASH,
|
||||
progress: 0,
|
||||
} as const
|
||||
}
|
||||
|
||||
return {
|
||||
isLoading: false,
|
||||
value: maybePrettyBytes(used),
|
||||
valueSub: `/ ${maybePrettyBytes(size)}`,
|
||||
secondaryValue: t('something-left', {left: maybePrettyBytes(available)}),
|
||||
progress: BigNumber(used ?? 0)
|
||||
.dividedBy(size ?? 0)
|
||||
.toNumber(),
|
||||
isMemoryLow,
|
||||
} as const
|
||||
}
|
||||
|
||||
export function useMemoryForUi(options: {poll?: boolean} = {}) {
|
||||
const {isLoading, used, size, available, isMemoryLow, system, apps} = useMemory({poll: options.poll})
|
||||
const {isLoading, used, size, available, isMemoryLow, apps} = useMemory({poll: options.poll})
|
||||
|
||||
if (isLoading) {
|
||||
return {
|
||||
@@ -50,7 +102,6 @@ export function useMemoryForUi(options: {poll?: boolean} = {}) {
|
||||
.dividedBy(size ?? 0)
|
||||
.toNumber(),
|
||||
isMemoryLow,
|
||||
system,
|
||||
apps,
|
||||
} as const
|
||||
}
|
||||
|
||||
@@ -5,8 +5,7 @@ import {ExternalToast} from 'sonner'
|
||||
import {toast} from '@/components/ui/toast'
|
||||
import {trpcClient} from '@/trpc/trpc'
|
||||
import {t} from '@/utils/i18n'
|
||||
import {isCpuTooCold, isCpuTooHot, isTrpcDiskFull, isTrpcMemoryLow} from '@/utils/system'
|
||||
import {CpuType} from '@/utils/temperature'
|
||||
import {isCpuTooHot, isTrpcDiskFull, isTrpcMemoryLow} from '@/utils/system'
|
||||
|
||||
function useMounted() {
|
||||
const [mounted, setMounted] = useState(false)
|
||||
@@ -38,16 +37,13 @@ export function useSettingsNotificationCount() {
|
||||
const res = Promise.allSettled([
|
||||
trpcClient.system.checkUpdate.query(),
|
||||
trpcClient.system.cpuTemperature.query(),
|
||||
trpcClient.system.memoryUsage.query(),
|
||||
trpcClient.system.diskUsage.query(),
|
||||
trpcClient.system.systemMemoryUsage.query(),
|
||||
trpcClient.system.systemDiskUsage.query(),
|
||||
])
|
||||
|
||||
const cpuType: CpuType = 'pi'
|
||||
|
||||
const toastIds: (string | number)[] = []
|
||||
|
||||
res.then((allData) => {
|
||||
console.log('allData', allData)
|
||||
const [checkUpdateResult, cpuTempResult, memoryResult, diskResult] = allData ?? []
|
||||
|
||||
let currCount = 0
|
||||
@@ -96,16 +92,12 @@ export function useSettingsNotificationCount() {
|
||||
}
|
||||
|
||||
if (cpuTempResult.status === 'fulfilled') {
|
||||
const cpuTemp = cpuTempResult.value
|
||||
const warning = cpuTempResult.value.warning
|
||||
|
||||
if (isCpuTooHot(cpuType, cpuTemp)) {
|
||||
if (isCpuTooHot(warning)) {
|
||||
currCount++
|
||||
const id = toast.warning(t('notifications.cpu.too-hot'), cpuTempToastOptions)
|
||||
toastIds.push(id)
|
||||
} else if (isCpuTooCold(cpuType, cpuTemp)) {
|
||||
currCount++
|
||||
const id = toast.warning(t('notifications.cpu.too-cold'), cpuTempToastOptions)
|
||||
toastIds.push(id)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -62,7 +62,6 @@ export function useWidgets() {
|
||||
} else {
|
||||
enable(widgetId)
|
||||
}
|
||||
console.log(widgetId)
|
||||
}
|
||||
|
||||
const appFromWidgetId = (id: string) => {
|
||||
|
||||
@@ -4,7 +4,9 @@ import {useCmdkOpen} from '@/components/cmdk'
|
||||
import {DefaultCredentialsDialog} from '@/modules/app-store/app-page/default-credentials-dialog'
|
||||
import {DesktopContent} from '@/modules/desktop/desktop-content'
|
||||
import {InstallFirstApp} from '@/modules/desktop/install-first-app'
|
||||
import {DesktopWifiButtonConnected} from '@/modules/wifi/desktop-wifi-button-connected'
|
||||
import {useApps} from '@/providers/apps'
|
||||
import {tw} from '@/utils/tw'
|
||||
|
||||
export function Desktop() {
|
||||
const {userApps, isLoading} = useApps()
|
||||
@@ -21,7 +23,12 @@ export function Desktop() {
|
||||
}
|
||||
|
||||
function InstallFirstAppPage() {
|
||||
return <InstallFirstApp />
|
||||
return (
|
||||
<>
|
||||
<InstallFirstApp />
|
||||
<DesktopWifiButtonConnected className={topRightPositionerClass} />
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
function DesktopPage() {
|
||||
@@ -44,8 +51,11 @@ function DesktopPage() {
|
||||
}
|
||||
>
|
||||
<DesktopContent onSearchClick={() => setOpen(true)} />
|
||||
<DesktopWifiButtonConnected className={topRightPositionerClass} />
|
||||
</div>
|
||||
<DefaultCredentialsDialog />
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
const topRightPositionerClass = tw`absolute right-5 top-5 z-10`
|
||||
|
||||
@@ -134,7 +134,7 @@ function ShowCredentialsBeforeOpenCheckbox({appId}: {appId: string}) {
|
||||
onCheckedChange={(c) => handleShowCredentialsBeforeOpenChange(!!c)}
|
||||
/>
|
||||
<label htmlFor={checkboxId} className={cn(checkboxLabelClass, 'text-13')}>
|
||||
{t('default-credentials..dont-show-again')}
|
||||
{t('default-credentials.dont-show-again')}
|
||||
</label>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -25,6 +25,12 @@ export function ReadMoreMarkdownSection({children}: {children: string}) {
|
||||
/** If the available space is close to not enough, we don't collapse */
|
||||
const WIGGLE_ROOM = 20
|
||||
setShowReadMore(el.scrollHeight > el.clientHeight + WIGGLE_ROOM)
|
||||
|
||||
const handleFocus = () => setIsExpanded(true)
|
||||
el.addEventListener('focusin', handleFocus)
|
||||
return () => {
|
||||
el.removeEventListener('focusin', handleFocus)
|
||||
}
|
||||
}, [children])
|
||||
|
||||
return (
|
||||
|
||||
@@ -39,12 +39,10 @@ export function usePaginator(pageCount: number) {
|
||||
setScrollingWithCode(false)
|
||||
}, 200)
|
||||
|
||||
console.log('scroll')
|
||||
if (scrollingWithCode) return
|
||||
if (!el) return
|
||||
const index = Math.round(el.scrollLeft / el.clientWidth)
|
||||
setPage(index)
|
||||
console.log(el.scrollLeft, el.clientWidth)
|
||||
}
|
||||
|
||||
// scrollend doesn't work as well here
|
||||
|
||||
@@ -215,9 +215,9 @@ export function AppIconConnected({appId}: {appId: string}) {
|
||||
{!inProgress && (
|
||||
<>
|
||||
{appInstall.state !== 'stopped' ? (
|
||||
<ContextMenuItem onSelect={appInstall.stop}>{t('stop')}</ContextMenuItem>
|
||||
) : (
|
||||
<ContextMenuItem onSelect={appInstall.start}>{t('start')}</ContextMenuItem>
|
||||
<ContextMenuItem onSelect={appInstall.stop}>{t('stop')}</ContextMenuItem>
|
||||
) : (
|
||||
<ContextMenuItem onSelect={appInstall.start}>{t('start')}</ContextMenuItem>
|
||||
)}
|
||||
<ContextMenuItem onSelect={appInstall.restart}>{t('restart')}</ContextMenuItem>
|
||||
<ContextMenuItem onSelect={() => navigate(`/settings/troubleshoot/app/${appId}`)}>
|
||||
|
||||
@@ -26,7 +26,6 @@ export function DesktopContextMenu({children}: {children: React.ReactNode}) {
|
||||
</ContextMenuItem>
|
||||
<ContextMenuItem
|
||||
onSelect={() => {
|
||||
console.log(contentRef.current)
|
||||
// get bounding box
|
||||
const {top, left} = contentRef.current!.getBoundingClientRect()
|
||||
anchorRef.current!.style.top = `${top}px`
|
||||
|
||||
@@ -57,7 +57,7 @@ export function Widget({appId, config: manifestConfig}: {appId: string; config:
|
||||
|
||||
const handleClick = (link?: string) => {
|
||||
if (appId === 'live-usage' && systemAppsKeyed['UMBREL_live-usage']) {
|
||||
navigate('/?dialog=live-usage')
|
||||
navigate(link || '?dialog=live-usage')
|
||||
} else if (app) {
|
||||
// Launching directly because it's weird to have credentials show up
|
||||
// Users will likely open the app by clicking the icon before adding a widget associated with the app
|
||||
|
||||
@@ -179,9 +179,9 @@ export const liveUsageWidgets: [
|
||||
example: {
|
||||
items: [
|
||||
{
|
||||
icon: 'system-widget-storage',
|
||||
subtext: 'Storage',
|
||||
text: '1.75 TB',
|
||||
icon: 'system-widget-cpu',
|
||||
subtext: 'CPU',
|
||||
text: '24%',
|
||||
},
|
||||
{
|
||||
icon: 'system-widget-memory',
|
||||
@@ -189,9 +189,9 @@ export const liveUsageWidgets: [
|
||||
text: '5.8 GB',
|
||||
},
|
||||
{
|
||||
icon: 'system-widget-cpu',
|
||||
subtext: 'CPU',
|
||||
text: '24%',
|
||||
icon: 'system-widget-storage',
|
||||
subtext: 'Storage',
|
||||
text: '1.75 TB',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
import {Link} from 'react-router-dom'
|
||||
|
||||
import {WifiIcon2} from '@/modules/wifi/icon'
|
||||
import {cn} from '@/shadcn-lib/utils'
|
||||
import {trpcReact} from '@/trpc/trpc'
|
||||
import {signalToBars} from '@/utils/wifi'
|
||||
|
||||
export function DesktopWifiButtonConnected({className}: {className?: string}) {
|
||||
const wifiQ = trpcReact.wifi.connected.useQuery()
|
||||
|
||||
if (wifiQ.isLoading || wifiQ.data?.status !== 'connected') return null
|
||||
|
||||
return (
|
||||
<Link
|
||||
className={cn(
|
||||
'rounded-6 outline-none ring-white/20 transition-[background,shadow] animate-in fade-in focus-visible:bg-white/6 focus-visible:ring-2 focus-visible:backdrop-blur-sm',
|
||||
className,
|
||||
)}
|
||||
to='/settings/wifi'
|
||||
>
|
||||
<WifiIcon2 bars={signalToBars(wifiQ.data?.signal ?? 0)} className='size-9' />
|
||||
</Link>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
import {SVGProps, useId} from 'react'
|
||||
import {TbWifi, TbWifi0, TbWifi1, TbWifi2, TbWifiOff} from 'react-icons/tb'
|
||||
|
||||
import {cn} from '@/shadcn-lib/utils'
|
||||
|
||||
export function WifiIcon({bars = 4, className}: {bars: number; className?: string}) {
|
||||
const components = [TbWifiOff, TbWifi0, TbWifi1, TbWifi2, TbWifi]
|
||||
|
||||
const Comp = components[bars]
|
||||
|
||||
if (bars === 0) {
|
||||
return (
|
||||
<div className={cn('relative bg-red-500/20', className)}>
|
||||
<TbWifiOff className={cn('opacity-20 absolute-center', className)} />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={cn('relative bg-red-500/20', className)}>
|
||||
<TbWifi className={cn('opacity-20 absolute-center', className)} />
|
||||
<Comp className={cn('absolute-center', className)} />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export function WifiIcon2({bars = 4, ...props}: {bars: number} & SVGProps<SVGSVGElement>) {
|
||||
const uniqueId = useId()
|
||||
|
||||
return (
|
||||
<svg xmlns='http://www.w3.org/2000/svg' width={24} height={24} viewBox='0 0 24 24' fill='currentColor' {...props}>
|
||||
<defs>
|
||||
<path
|
||||
id={`${uniqueId}-a`}
|
||||
fillRule='evenodd'
|
||||
d='M11.002 17.177a1 1 0 0 1 1-1h.009a1 1 0 1 1 0 2h-.009a1 1 0 0 1-1-1Z'
|
||||
clipRule='evenodd'
|
||||
/>
|
||||
<path
|
||||
id={`${uniqueId}-b`}
|
||||
fillRule='evenodd'
|
||||
d='M12.002 14.726a2.45 2.45 0 0 0-1.733.718 1 1 0 1 1-1.414-1.415 4.451 4.451 0 0 1 6.294 0 1 1 0 1 1-1.414 1.415 2.45 2.45 0 0 0-1.733-.718Z'
|
||||
clipRule='evenodd'
|
||||
/>
|
||||
<path
|
||||
id={`${uniqueId}-c`}
|
||||
fillRule='evenodd'
|
||||
d='M12.002 11.274a5.9 5.9 0 0 0-4.174 1.729 1 1 0 1 1-1.414-1.414 7.901 7.901 0 0 1 11.176 0 1 1 0 1 1-1.415 1.414 5.9 5.9 0 0 0-4.173-1.729Z'
|
||||
clipRule='evenodd'
|
||||
/>
|
||||
<path
|
||||
id={`${uniqueId}-d`}
|
||||
fillRule='evenodd'
|
||||
d='M18.643 10.565c-3.68-3.657-9.603-3.654-13.254-.002a1 1 0 1 1-1.415-1.414c4.435-4.436 11.622-4.432 16.08-.002a1 1 0 1 1-1.41 1.418Z'
|
||||
clipRule='evenodd'
|
||||
/>
|
||||
</defs>
|
||||
<use fillRule='evenodd' clipRule='evenodd' href={`#${uniqueId}-a`} className='opacity-20' />
|
||||
{bars >= 1 && <use fillRule='evenodd' clipRule='evenodd' href={`#${uniqueId}-a`} />}
|
||||
<use fillRule='evenodd' clipRule='evenodd' href={`#${uniqueId}-b`} className='opacity-20' />
|
||||
{bars >= 2 && <use fillRule='evenodd' clipRule='evenodd' href={`#${uniqueId}-b`} />}
|
||||
<use fillRule='evenodd' clipRule='evenodd' href={`#${uniqueId}-c`} className='opacity-20' />
|
||||
{bars >= 3 && <use fillRule='evenodd' clipRule='evenodd' href={`#${uniqueId}-c`} />}
|
||||
<use fillRule='evenodd' clipRule='evenodd' href={`#${uniqueId}-d`} className='opacity-20' />
|
||||
{bars >= 4 && <use fillRule='evenodd' clipRule='evenodd' href={`#${uniqueId}-d`} />}
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export function WifiIcon2Circled({bars = 4, isConnected}: {bars: number; isConnected?: boolean}) {
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
'grid size-6 shrink-0 place-items-center rounded-full border border-white/20 bg-white/10 bg-white/6',
|
||||
isConnected && 'bg-brand',
|
||||
)}
|
||||
>
|
||||
<WifiIcon2
|
||||
className='size-5'
|
||||
bars={bars}
|
||||
style={{
|
||||
filter: 'drop-shadow(0px 0px 2px rgba(255,255,255,.5))',
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export function LockIcon() {
|
||||
return (
|
||||
<svg width='12' height='12' viewBox='0 0 12 12' fill='none' xmlns='http://www.w3.org/2000/svg' className='shrink-0'>
|
||||
<path
|
||||
fill-rule='evenodd'
|
||||
clip-rule='evenodd'
|
||||
d='M4.91724 2.38599C5.20441 2.09883 5.59389 1.9375 6 1.9375C6.40611 1.9375 6.79559 2.09883 7.08276 2.38599C7.36992 2.67316 7.53125 3.06264 7.53125 3.46875V4.96875H4.46875V3.46875C4.46875 3.06264 4.63008 2.67316 4.91724 2.38599ZM3.53125 4.96875V3.46875C3.53125 2.814 3.79135 2.18606 4.25433 1.72308C4.71731 1.2601 5.34525 1 6 1C6.65475 1 7.28269 1.2601 7.74567 1.72308C8.20865 2.18606 8.46875 2.814 8.46875 3.46875V4.96875H8.5C9.32843 4.96875 10 5.64032 10 6.46875V9.46875C10 10.2972 9.32843 10.9688 8.5 10.9688H3.5C2.67157 10.9688 2 10.2972 2 9.46875V6.46875C2 5.64032 2.67157 4.96875 3.5 4.96875H3.53125Z'
|
||||
fill='currentColor'
|
||||
/>
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,440 @@
|
||||
import {AnimatePresence, motion} from 'framer-motion'
|
||||
import {ReactNode, useEffect, useRef, useState} from 'react'
|
||||
import {TbAlertTriangle} from 'react-icons/tb'
|
||||
import {Drawer as DrawerPrimitive} from 'vaul'
|
||||
|
||||
import {Loading} from '@/components/ui/loading'
|
||||
import {useAutoHeightAnimation} from '@/hooks/use-auto-height-animation'
|
||||
import {useIsSmallMobile} from '@/hooks/use-is-mobile'
|
||||
import {WifiListItemContent} from '@/modules/wifi/wifi-item-content'
|
||||
import {
|
||||
AlertDialog,
|
||||
AlertDialogAction,
|
||||
AlertDialogCancel,
|
||||
AlertDialogContent,
|
||||
AlertDialogDescription,
|
||||
AlertDialogFooter,
|
||||
AlertDialogHeader,
|
||||
AlertDialogTitle,
|
||||
} from '@/shadcn-components/ui/alert-dialog'
|
||||
import {Button} from '@/shadcn-components/ui/button'
|
||||
import {Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle} from '@/shadcn-components/ui/dialog'
|
||||
import {Drawer, DrawerContent, DrawerDescription, DrawerHeader, DrawerTitle} from '@/shadcn-components/ui/drawer'
|
||||
import {PasswordInput} from '@/shadcn-components/ui/input'
|
||||
import {ScrollArea} from '@/shadcn-components/ui/scroll-area'
|
||||
import {Switch} from '@/shadcn-components/ui/switch'
|
||||
import {cn} from '@/shadcn-lib/utils'
|
||||
import {RouterOutput, trpcReact, WifiNetwork, WifiStatus, WifiStatusUi} from '@/trpc/trpc'
|
||||
import {t} from '@/utils/i18n'
|
||||
import {tw} from '@/utils/tw'
|
||||
|
||||
type NetworkStatus = RouterOutput['wifi']['connected']
|
||||
|
||||
export function WifiDrawerOrDialogContent() {
|
||||
const ctx = trpcReact.useContext()
|
||||
const statusQ = trpcReact.wifi.connected.useQuery()
|
||||
const networkStatus = statusQ.data
|
||||
|
||||
const disconnectMut = trpcReact.wifi.disconnect.useMutation({
|
||||
onSuccess: () => {
|
||||
ctx.wifi.connected.invalidate()
|
||||
},
|
||||
})
|
||||
|
||||
const networksQ = trpcReact.wifi.networks.useQuery(undefined, {
|
||||
// If we come back to the tab after 2 seconds away, we want to refresh the networks
|
||||
staleTime: 2000,
|
||||
})
|
||||
const namedNetworks = networksQ.data?.filter((network) => !!network.ssid)
|
||||
|
||||
const [controls, ref] = useAutoHeightAnimation([networksQ.isFetching])
|
||||
|
||||
const [disableAlertOpen, setDisableAlertOpen] = useState(false)
|
||||
|
||||
return (
|
||||
<DrawerOrDialogContent
|
||||
header={
|
||||
statusQ.data?.status === 'connected' && (
|
||||
<>
|
||||
<Switch
|
||||
className='mt-0 disabled:pointer-events-none'
|
||||
checked={statusQ.data?.status === 'connected'}
|
||||
onCheckedChange={(toCheck) => !toCheck && setDisableAlertOpen(true)}
|
||||
disabled={disconnectMut.isLoading || statusQ.isFetching || statusQ.data?.status !== 'connected'}
|
||||
/>
|
||||
<AlertDialog open={disableAlertOpen} onOpenChange={setDisableAlertOpen}>
|
||||
<AlertDialogContent>
|
||||
<AlertDialogHeader>
|
||||
<AlertDialogTitle>{t('wifi-dangerous-disable-confirmation-title')}</AlertDialogTitle>
|
||||
<AlertDialogDescription>
|
||||
{t('wifi-dangerous-disable-confirmation-description')}
|
||||
</AlertDialogDescription>
|
||||
</AlertDialogHeader>
|
||||
<AlertDialogFooter>
|
||||
<AlertDialogAction
|
||||
variant='destructive'
|
||||
onClick={() => {
|
||||
// Invalidate queries so other parts of the interface can update
|
||||
ctx.wifi.connected.invalidate()
|
||||
disconnectMut.mutate()
|
||||
setDisableAlertOpen(false)
|
||||
}}
|
||||
>
|
||||
{t('disable')}
|
||||
</AlertDialogAction>
|
||||
<AlertDialogCancel>{t('cancel')}</AlertDialogCancel>
|
||||
</AlertDialogFooter>
|
||||
</AlertDialogContent>
|
||||
</AlertDialog>
|
||||
</>
|
||||
)
|
||||
}
|
||||
>
|
||||
<motion.div
|
||||
className='overflow-hidden'
|
||||
animate={controls}
|
||||
transition={{
|
||||
duration: 0.3,
|
||||
ease: 'easeInOut',
|
||||
}}
|
||||
>
|
||||
<div ref={ref}>
|
||||
{networksQ.isLoading ? (
|
||||
<Message>
|
||||
<Loading>{t('wifi-searching')}</Loading>
|
||||
</Message>
|
||||
) : (
|
||||
<EnabledContent
|
||||
namedNetworks={namedNetworks}
|
||||
networkStatus={networkStatus}
|
||||
isLoading={networksQ.isFetching}
|
||||
errorMessage={networksQ.error?.message}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</motion.div>
|
||||
</DrawerOrDialogContent>
|
||||
)
|
||||
}
|
||||
|
||||
export function WifiDrawerOrDialog(props: React.ComponentProps<typeof DrawerPrimitive.Root>) {
|
||||
const isMobile = useIsSmallMobile()
|
||||
const Wrapper = isMobile ? Drawer : Dialog
|
||||
|
||||
return <Wrapper {...props} />
|
||||
}
|
||||
|
||||
export function DrawerOrDialogContent({header, children}: {header?: ReactNode; children: ReactNode}) {
|
||||
const title = t('wifi')
|
||||
|
||||
const isMobile = useIsSmallMobile()
|
||||
|
||||
const Content = isMobile ? DrawerContent : DialogContent
|
||||
const Header = isMobile ? DrawerHeader : DialogHeader
|
||||
const Title = isMobile ? DrawerTitle : DialogTitle
|
||||
const Description = isMobile ? DrawerDescription : DialogDescription
|
||||
|
||||
return (
|
||||
<Content className='mx-auto px-[20px] py-[30px] sm:max-w-[560px]'>
|
||||
<Header className='flex flex-row items-center justify-between gap-4'>
|
||||
<div className='space-y-0.5'>
|
||||
<Title>{title}</Title>
|
||||
<Description className='text-12 leading-tight'>{t('wifi-description-long')}</Description>
|
||||
</div>
|
||||
{header}
|
||||
</Header>
|
||||
{children}
|
||||
</Content>
|
||||
)
|
||||
}
|
||||
|
||||
export function EnabledContent({
|
||||
isLoading,
|
||||
errorMessage,
|
||||
namedNetworks,
|
||||
networkStatus,
|
||||
}: {
|
||||
isLoading?: boolean
|
||||
errorMessage?: string
|
||||
namedNetworks?: WifiNetwork[]
|
||||
networkStatus?: NetworkStatus
|
||||
}) {
|
||||
const [openSsid, setOpenSsid] = useState<string | undefined>(undefined)
|
||||
const currentSsid = networkStatus?.status === 'disconnected' ? undefined : networkStatus?.ssid
|
||||
|
||||
// Scroll to top when connected network changes
|
||||
// But we don't wanna scroll to the top when a network is added or removed
|
||||
const scrollRef = useRef<HTMLDivElement>(null)
|
||||
useEffect(() => {
|
||||
if (scrollRef.current) {
|
||||
scrollRef.current.scrollTop = 0
|
||||
}
|
||||
}, [currentSsid])
|
||||
|
||||
if (errorMessage) {
|
||||
return <Message>{errorMessage}</Message>
|
||||
}
|
||||
|
||||
const currentStatus = networkStatus?.status
|
||||
const connectedNetwork =
|
||||
currentStatus === 'connected' ? namedNetworks?.find((network) => network.ssid === currentSsid) : undefined
|
||||
|
||||
// named networks except the one we're currently connected to
|
||||
const availableNetworks = namedNetworks?.filter((network) => network.ssid !== connectedNetwork?.ssid)
|
||||
|
||||
if (!namedNetworks || namedNetworks.length === 0) {
|
||||
return <Message>{t('wifi-no-networks-message')}</Message>
|
||||
}
|
||||
|
||||
return (
|
||||
<ScrollArea
|
||||
scrollbarClass='my-3'
|
||||
className={cn('flex h-[380px] flex-col rounded-12 bg-white/5 transition-opacity', isLoading && 'opacity-50')}
|
||||
viewportRef={scrollRef}
|
||||
>
|
||||
{connectedNetwork && (
|
||||
<div className={cn(wifiListItemClass, 'pointer-events-none')}>
|
||||
<WifiListItemContent status='connected' network={connectedNetwork} />
|
||||
</div>
|
||||
)}
|
||||
{availableNetworks?.map((network) => (
|
||||
<Network
|
||||
key={network.ssid}
|
||||
network={network}
|
||||
isWifiActive={currentStatus === 'connected'}
|
||||
isOpen={openSsid === network.ssid}
|
||||
setIsOpen={(o) => (o ? setOpenSsid(network.ssid) : setOpenSsid(undefined))}
|
||||
status={network.ssid === currentSsid ? currentStatus : undefined}
|
||||
/>
|
||||
))}
|
||||
</ScrollArea>
|
||||
)
|
||||
}
|
||||
|
||||
function Network({
|
||||
network,
|
||||
status,
|
||||
isOpen,
|
||||
setIsOpen,
|
||||
isWifiActive,
|
||||
}: {
|
||||
network: WifiNetwork
|
||||
status?: WifiStatus
|
||||
isOpen: boolean
|
||||
isWifiActive: boolean
|
||||
setIsOpen: (open: boolean) => void
|
||||
}) {
|
||||
const passwordInputRef = useRef<HTMLInputElement>(null)
|
||||
|
||||
const ctx = trpcReact.useContext()
|
||||
const connectMut = trpcReact.wifi.connect.useMutation({
|
||||
onMutate: () => {
|
||||
ctx.wifi.connected.cancel()
|
||||
},
|
||||
onSuccess: () => setIsOpen(false),
|
||||
onError: () => {
|
||||
setTimeout(() => {
|
||||
passwordInputRef.current?.select()
|
||||
passwordInputRef.current?.focus()
|
||||
}, 200)
|
||||
},
|
||||
onSettled: () => {
|
||||
ctx.wifi.connected.invalidate()
|
||||
},
|
||||
})
|
||||
|
||||
useEffect(() => {
|
||||
// Reset error
|
||||
if (!isOpen) {
|
||||
connectMut.reset()
|
||||
}
|
||||
}, [isOpen, connectMut])
|
||||
|
||||
const connect = ({ssid, password}: {ssid: string; password?: string}) => {
|
||||
connectMut.mutate({ssid, password})
|
||||
}
|
||||
|
||||
const statusUi = connectMut.isLoading ? 'loading' : status
|
||||
|
||||
// Show password error under the password input and other errors in a differnt place
|
||||
const errorMessage = connectMut.error?.message
|
||||
const isPasswordError = errorMessage === 'Incorrect password'
|
||||
const passwordError = isPasswordError ? errorMessage : undefined
|
||||
const otherError = isPasswordError ? undefined : errorMessage
|
||||
|
||||
const ConnectComponent = isWifiActive ? ConnectWithConfirmation : Connect
|
||||
|
||||
return (
|
||||
<motion.div
|
||||
// use position layout to avoid stretching
|
||||
layout='position'
|
||||
key={network.ssid}
|
||||
className={cn(wifiListItemClass, '!gap-0')}
|
||||
onClick={() => setIsOpen(true)}
|
||||
role={isOpen ? undefined : 'button'}
|
||||
tabIndex={0}
|
||||
>
|
||||
<WifiListItemContent network={network} status={statusUi} error={otherError} />
|
||||
<AnimatePresence>
|
||||
{isOpen && !connectMut.isLoading && (
|
||||
<AnimateHeight>
|
||||
<ConnectComponent
|
||||
passwordInputRef={passwordInputRef}
|
||||
network={network}
|
||||
status={statusUi}
|
||||
onConnect={connect}
|
||||
error={passwordError}
|
||||
/>
|
||||
</AnimateHeight>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
</motion.div>
|
||||
)
|
||||
}
|
||||
|
||||
function AnimateHeight({children}: {children: ReactNode}) {
|
||||
return (
|
||||
<motion.div
|
||||
layout='position'
|
||||
initial={{opacity: 0, height: 0}}
|
||||
animate={{
|
||||
height: 'auto',
|
||||
opacity: 1,
|
||||
marginTop: 8,
|
||||
transition: {
|
||||
height: {
|
||||
duration: 0.15,
|
||||
},
|
||||
opacity: {
|
||||
duration: 0.15,
|
||||
delay: 0.15,
|
||||
},
|
||||
},
|
||||
}}
|
||||
exit={{
|
||||
height: 0,
|
||||
opacity: 0,
|
||||
marginTop: 0,
|
||||
transition: {
|
||||
height: {
|
||||
duration: 0.15,
|
||||
},
|
||||
opacity: {
|
||||
duration: 0.15,
|
||||
},
|
||||
},
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</motion.div>
|
||||
)
|
||||
}
|
||||
|
||||
type ConnectData = {ssid: string; password?: string}
|
||||
type ConnectProps = {
|
||||
network: WifiNetwork
|
||||
status?: WifiStatusUi
|
||||
onConnect: ({ssid, password}: ConnectData) => void
|
||||
error?: string
|
||||
passwordInputRef?: React.RefObject<HTMLInputElement>
|
||||
}
|
||||
|
||||
function ConnectWithConfirmation({onConnect, ...rest}: ConnectProps) {
|
||||
const [data, setData] = useState<ConnectData | undefined>(undefined)
|
||||
const [open, setOpen] = useState(false)
|
||||
|
||||
return (
|
||||
<>
|
||||
<Connect
|
||||
onConnect={(data) => {
|
||||
setData(data)
|
||||
setOpen(true)
|
||||
}}
|
||||
{...rest}
|
||||
/>
|
||||
<AlertDialog open={open} onOpenChange={setOpen}>
|
||||
<AlertDialogContent>
|
||||
<AlertDialogHeader>
|
||||
<AlertDialogTitle>{t('wifi-dangerous-change-confirmation-title')}</AlertDialogTitle>
|
||||
<AlertDialogDescription>{t('wifi-dangerous-change-confirmation-description')}</AlertDialogDescription>
|
||||
</AlertDialogHeader>
|
||||
<AlertDialogFooter>
|
||||
<AlertDialogAction
|
||||
variant='destructive'
|
||||
onClick={() => {
|
||||
if (!data) return
|
||||
onConnect(data)
|
||||
setOpen(false)
|
||||
}}
|
||||
>
|
||||
{t('change')}
|
||||
</AlertDialogAction>
|
||||
<AlertDialogCancel>{t('cancel')}</AlertDialogCancel>
|
||||
</AlertDialogFooter>
|
||||
</AlertDialogContent>
|
||||
</AlertDialog>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export function Connect({network, status, onConnect, error, passwordInputRef}: ConnectProps) {
|
||||
const [password, setPassword] = useState('')
|
||||
|
||||
if (status === 'loading') {
|
||||
return null
|
||||
}
|
||||
|
||||
if (network.authenticated) {
|
||||
return (
|
||||
<form
|
||||
onSubmit={(e) => {
|
||||
e.preventDefault()
|
||||
onConnect({ssid: network.ssid, password})
|
||||
}}
|
||||
className='flex gap-2'
|
||||
>
|
||||
<PasswordInput
|
||||
inputRef={passwordInputRef}
|
||||
autoFocus
|
||||
label='Password'
|
||||
sizeVariant={'short'}
|
||||
className='flex-1'
|
||||
value={password}
|
||||
onValueChange={setPassword}
|
||||
error={error}
|
||||
/>
|
||||
<Button type='submit' variant='primary' size='input-short'>
|
||||
Connect
|
||||
</Button>
|
||||
</form>
|
||||
)
|
||||
} else {
|
||||
return (
|
||||
<form
|
||||
onSubmit={(e) => {
|
||||
e.preventDefault()
|
||||
onConnect({ssid: network.ssid})
|
||||
}}
|
||||
className='flex items-center gap-2'
|
||||
>
|
||||
<div className='flex flex-1 items-center gap-1 text-sm text-yellow-300'>
|
||||
<TbAlertTriangle className='size-4' />
|
||||
<span>{t('wifi-connect-insecure-message')}</span>
|
||||
</div>
|
||||
<Button type='submit' variant='primary' size='input-short' autoFocus>
|
||||
Connect
|
||||
</Button>
|
||||
</form>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export function Message({children}: {children?: React.ReactNode}) {
|
||||
return (
|
||||
<div className='grid h-32 place-items-center rounded-12 bg-white/6 p-4'>
|
||||
<div className='text-center text-14 font-medium -tracking-2 opacity-60'>{children}</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export const wifiListItemClass = tw`w-full p-3 hover:bg-white/6 focus-within:bg-white/6 transition-colors border-b border-t first:border-t-0 last:border-b-0 mb-[-1px] border-white/6 outline-none flex flex-col gap-3`
|
||||
@@ -0,0 +1,35 @@
|
||||
import {TbAlertCircle} from 'react-icons/tb'
|
||||
import {isString} from 'remeda'
|
||||
|
||||
import {Spinner} from '@/components/ui/loading'
|
||||
import {LockIcon, WifiIcon2Circled} from '@/modules/wifi/icon'
|
||||
import {WifiNetwork, WifiStatusUi} from '@/trpc/trpc'
|
||||
import {t} from '@/utils/i18n'
|
||||
import {signalToBars} from '@/utils/wifi'
|
||||
|
||||
export function WifiListItemContent({
|
||||
network,
|
||||
status,
|
||||
error,
|
||||
}: {
|
||||
network: WifiNetwork
|
||||
status?: WifiStatusUi
|
||||
error?: string
|
||||
}) {
|
||||
return (
|
||||
<div className='flex w-full items-center gap-2.5'>
|
||||
<WifiIcon2Circled bars={signalToBars(network.signal)} isConnected={status === 'connected'} />
|
||||
<div className='flex flex-1 items-center gap-2 truncate'>
|
||||
<h3 className='truncate text-15 font-medium leading-none -tracking-2'>{network.ssid}</h3>
|
||||
{network.authenticated && <LockIcon />}
|
||||
</div>
|
||||
{status === 'loading' && <Spinner />}
|
||||
{error && (
|
||||
<div className='flex items-center gap-1 text-13 font-medium -tracking-2 text-destructive2-lightest'>
|
||||
<TbAlertCircle className='size-4' />
|
||||
{isString(error) ? error : t('wifi-connection-failed')}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import {UNKNOWN} from '@/constants'
|
||||
import {WifiNetwork} from '@/trpc/trpc'
|
||||
import {signalToBars} from '@/utils/wifi'
|
||||
|
||||
import {LockIcon, WifiIcon2} from './icon'
|
||||
|
||||
export function WifiListRowConnectedDescription({network}: {network: Partial<WifiNetwork>}) {
|
||||
return (
|
||||
// `h-3` prevents height from being different between the `disconnected` and `connected` states
|
||||
<span className='flex h-3 items-center gap-1'>
|
||||
<WifiIcon2 bars={signalToBars(network.signal ?? 0)} className='size-4' />
|
||||
{network.ssid ?? UNKNOWN()}
|
||||
{network.authenticated && <LockIcon />}
|
||||
</span>
|
||||
)
|
||||
}
|
||||
@@ -4,7 +4,7 @@ import {filter} from 'remeda'
|
||||
import {trpcReact, UserApp, UserAppWithoutError} from '@/trpc/trpc'
|
||||
import {keyBy} from '@/utils/misc'
|
||||
|
||||
type AppT = {
|
||||
export type AppT = {
|
||||
id: string
|
||||
name: string
|
||||
icon: string
|
||||
|
||||
@@ -42,7 +42,6 @@ export function GlobalSystemStateProvider({children}: {children: ReactNode}) {
|
||||
const ctx = trpcReact.useContext()
|
||||
|
||||
const onSuccess = (didWork: boolean) => {
|
||||
console.log('global-system-state: onSuccess')
|
||||
// Cancel last query in case it returns as still running
|
||||
ctx.system.status.cancel()
|
||||
// alert('shouldLogoutOnRunning: true')
|
||||
@@ -68,7 +67,6 @@ export function GlobalSystemStateProvider({children}: {children: ReactNode}) {
|
||||
|
||||
if (!IS_DEV) {
|
||||
if (systemStatusQ.error && !triggered) {
|
||||
console.log('global-system-state: systemStatusQ.error')
|
||||
// This error should get caught by a parent error boundary component
|
||||
// TODO: figure out what to do about network errors
|
||||
throw systemStatusQ.error
|
||||
@@ -88,11 +86,9 @@ export function GlobalSystemStateProvider({children}: {children: ReactNode}) {
|
||||
}, [setShouldLogout, shouldLogoutOnRunning, status, triggered])
|
||||
|
||||
useEffect(() => {
|
||||
console.log('global-system-state: useEffect')
|
||||
if (status === 'running' && shouldLogoutOnRunning === true) {
|
||||
// Rely on page reload to reset `triggered` state
|
||||
// setTriggered(false)
|
||||
console.log('global-system-state: go to login')
|
||||
setShouldLogout(false)
|
||||
// Delay the stuff after `setShouldLogout(false)` to ensure that local storage is updated. We wouldn't want to take the user through this again
|
||||
setTimeout(() => {
|
||||
|
||||
@@ -14,6 +14,8 @@ import {t} from '@/utils/i18n'
|
||||
|
||||
import {useDiscoverQuery} from './use-discover-query'
|
||||
|
||||
const getAppById = (appId, apps) => apps.find(app => app.id === appId);
|
||||
|
||||
export default function Discover() {
|
||||
return (
|
||||
<>
|
||||
@@ -51,7 +53,7 @@ function DiscoverContent() {
|
||||
key={section.heading + section.subheading}
|
||||
title={section.heading}
|
||||
overline={section.subheading}
|
||||
apps={apps.filter((app) => section.apps.includes(app.id))}
|
||||
apps={section.apps.map(appId => getAppById(appId, apps)).filter(app => app !== undefined)}
|
||||
/>
|
||||
)
|
||||
}
|
||||
@@ -62,7 +64,7 @@ function DiscoverContent() {
|
||||
key={section.heading + section.subheading}
|
||||
overline={section.subheading}
|
||||
title={section.heading}
|
||||
apps={apps.filter((app) => section.apps.includes(app.id))}
|
||||
apps={section.apps.map(appId => getAppById(appId, apps)).filter(app => app !== undefined)}
|
||||
/>
|
||||
)
|
||||
}
|
||||
@@ -71,7 +73,7 @@ function DiscoverContent() {
|
||||
return (
|
||||
<AppsThreeColumnSection
|
||||
key={section.heading + section.subheading}
|
||||
apps={apps.filter((app) => section.apps.includes(app.id))}
|
||||
apps={section.apps.map(appId => getAppById(appId, apps)).filter(app => app !== undefined)}
|
||||
overline={section.subheading}
|
||||
title={section.heading}
|
||||
textLocation={section.textLocation}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import {DialogPortal} from '@radix-ui/react-dialog'
|
||||
import {ReactNode} from 'react'
|
||||
import {motion} from 'framer-motion'
|
||||
import {ReactNode, useEffect, useState} from 'react'
|
||||
import {ErrorBoundary} from 'react-error-boundary'
|
||||
import {useLocation, useNavigate} from 'react-router-dom'
|
||||
import {Area, AreaChart, ResponsiveContainer, XAxis, YAxis} from 'recharts'
|
||||
|
||||
import {AppIcon} from '@/components/app-icon'
|
||||
import {Card} from '@/components/ui/card'
|
||||
@@ -15,10 +17,9 @@ import {
|
||||
import {SegmentedControl} from '@/components/ui/segmented-control'
|
||||
import {LOADING_DASH} from '@/constants'
|
||||
import {useCpuForUi} from '@/hooks/use-cpu'
|
||||
import {useDiskForUi} from '@/hooks/use-disk'
|
||||
import {useIsSmallMobile} from '@/hooks/use-is-mobile'
|
||||
import {useMemoryForUi} from '@/hooks/use-memory'
|
||||
import {systemAppsKeyed, useApps} from '@/providers/apps'
|
||||
import {useDiskForUi, useSystemDiskForUi} from '@/hooks/use-disk'
|
||||
import {useMemoryForUi, useSystemMemoryForUi} from '@/hooks/use-memory'
|
||||
import {AppT, systemAppsKeyed, useApps} from '@/providers/apps'
|
||||
import {Progress} from '@/shadcn-components/ui/progress'
|
||||
import {cn} from '@/shadcn-lib/utils'
|
||||
import {useDialogOpenProps} from '@/utils/dialog'
|
||||
@@ -35,7 +36,7 @@ export default function LiveUsageDialog() {
|
||||
<ImmersiveDialog {...dialogProps}>
|
||||
<DialogPortal>
|
||||
<ImmersiveDialogOverlay />
|
||||
<ImmersiveDialogContent size='lg' showScroll>
|
||||
<ImmersiveDialogContent size='md' showScroll>
|
||||
<h1 className={immersiveDialogTitleClass}>{title}</h1>
|
||||
<ErrorBoundary FallbackComponent={ErrorBoundaryCardFallback}>
|
||||
<LiveUsageContent />
|
||||
@@ -49,161 +50,258 @@ export default function LiveUsageDialog() {
|
||||
type SelectedTab = 'storage' | 'memory' | 'cpu'
|
||||
|
||||
function LiveUsageContent() {
|
||||
const isSmall = useIsSmallMobile()
|
||||
const {search} = useLocation()
|
||||
const navigate = useNavigate()
|
||||
const queryParams = new URLSearchParams(search)
|
||||
const selectedTab = (queryParams.get('tab') as SelectedTab) || 'storage'
|
||||
const selectedTab = (queryParams.get('tab') as SelectedTab) || 'cpu'
|
||||
|
||||
const setSelectedTab = (tab: SelectedTab) => {
|
||||
queryParams.set('tab', tab)
|
||||
navigate({search: queryParams.toString()})
|
||||
}
|
||||
|
||||
if (isSmall) {
|
||||
return (
|
||||
<div className='grid gap-y-5'>
|
||||
{isSmall && (
|
||||
<SegmentedControl
|
||||
size='lg'
|
||||
tabs={[
|
||||
{id: 'storage', label: t('storage')},
|
||||
{id: 'memory', label: t('memory')},
|
||||
{id: 'cpu', label: t('cpu')},
|
||||
]}
|
||||
value={selectedTab}
|
||||
onValueChange={setSelectedTab}
|
||||
/>
|
||||
)}
|
||||
{/* Key to make sure we reset the error */}
|
||||
<ErrorBoundary key={selectedTab} FallbackComponent={ErrorBoundaryCardFallback}>
|
||||
{selectedTab === 'storage' && <StorageSection />}
|
||||
{selectedTab === 'memory' && <MemorySection />}
|
||||
{selectedTab === 'cpu' && <CpuSection />}
|
||||
</ErrorBoundary>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
// Poll for cpu and memory usage, but do not poll for disk usage
|
||||
// As disk-usage doesn't change much in real-time but the calculation causes
|
||||
// CPU spikes
|
||||
const cpuUsage = useCpuForUi({poll: true})
|
||||
const memoryUsage = useSystemMemoryForUi({poll: true})
|
||||
const diskUsage = useSystemDiskForUi()
|
||||
|
||||
// Initialize cpu and memory charts with 30 "0" values so there's a clean base line from where they start populating with
|
||||
const [cpuChartData, setCpuChartData] = useState<Array<{value: number}>>(new Array(30).fill({value: 0}))
|
||||
const [memoryChartData, setMemoryChartData] = useState<Array<{value: number}>>(new Array(30).fill({value: 0}))
|
||||
|
||||
// Update cpu and memory charts whenever their progress values update
|
||||
useEffect(() => {
|
||||
setCpuChartData((prevData: Array<{value: number}>) => [...prevData.slice(1), {value: cpuUsage.progress * 100 || 0}])
|
||||
}, [cpuUsage.progress])
|
||||
|
||||
useEffect(() => {
|
||||
setMemoryChartData((prevData: Array<{value: number}>) => [
|
||||
...prevData.slice(1),
|
||||
{value: memoryUsage.progress * 100 || 0},
|
||||
])
|
||||
}, [memoryUsage.progress])
|
||||
|
||||
return (
|
||||
<div className='grid grid-cols-3 gap-x-4'>
|
||||
<LiveUsageSection title={t('storage')}>
|
||||
<ErrorBoundary FallbackComponent={ErrorBoundaryCardFallback}>
|
||||
<StorageSection />
|
||||
</ErrorBoundary>
|
||||
</LiveUsageSection>
|
||||
<LiveUsageSection title={t('memory')}>
|
||||
<ErrorBoundary FallbackComponent={ErrorBoundaryCardFallback}>
|
||||
<MemorySection />
|
||||
</ErrorBoundary>
|
||||
</LiveUsageSection>
|
||||
<LiveUsageSection title={t('cpu')}>
|
||||
<ErrorBoundary FallbackComponent={ErrorBoundaryCardFallback}>
|
||||
<CpuSection />
|
||||
</ErrorBoundary>
|
||||
</LiveUsageSection>
|
||||
<div className='grid gap-y-5'>
|
||||
{/* Hidden on mobile, as we show regular tabs */}
|
||||
<div className='hidden columns-3 sm:block'>
|
||||
<button className='block w-full text-left focus:outline-none' onClick={() => setSelectedTab('cpu')}>
|
||||
<UsageCard
|
||||
title={t('cpu')}
|
||||
value={cpuUsage.value}
|
||||
progressLabel={cpuUsage.secondaryValue}
|
||||
progress={cpuUsage.progress}
|
||||
active={selectedTab === 'cpu'}
|
||||
chart={cpuChartData}
|
||||
/>
|
||||
</button>
|
||||
<button className='block w-full text-left focus:outline-none' onClick={() => setSelectedTab('memory')}>
|
||||
<UsageCard
|
||||
title={t('memory')}
|
||||
value={memoryUsage.value}
|
||||
valueSub={memoryUsage.valueSub}
|
||||
progressLabel={memoryUsage.secondaryValue}
|
||||
progress={memoryUsage.progress}
|
||||
rightChildren={memoryUsage.isMemoryLow && <ErrorMessage>{t('memory.low')}</ErrorMessage>}
|
||||
active={selectedTab === 'memory'}
|
||||
chart={memoryChartData}
|
||||
/>
|
||||
</button>
|
||||
<button className='block w-full text-left focus:outline-none' onClick={() => setSelectedTab('storage')}>
|
||||
<UsageCard
|
||||
title={t('storage')}
|
||||
value={diskUsage.value}
|
||||
valueSub={diskUsage.valueSub}
|
||||
progressLabel={diskUsage.secondaryValue}
|
||||
progress={diskUsage.progress}
|
||||
rightChildren={
|
||||
<>
|
||||
{diskUsage.isDiskLow && <ErrorMessage>{t('storage.low')}</ErrorMessage>}
|
||||
{diskUsage.isDiskFull && <ErrorMessage>{t('storage.full')}</ErrorMessage>}
|
||||
</>
|
||||
}
|
||||
active={selectedTab === 'storage'}
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Shown only on mobile */}
|
||||
<div className='sm:hidden'>
|
||||
<SegmentedControl
|
||||
size='lg'
|
||||
tabs={[
|
||||
{id: 'cpu', label: t('cpu')},
|
||||
{id: 'memory', label: t('memory')},
|
||||
{id: 'storage', label: t('storage')},
|
||||
]}
|
||||
value={selectedTab}
|
||||
onValueChange={setSelectedTab}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Key to make sure we reset the error */}
|
||||
<ErrorBoundary key={selectedTab} FallbackComponent={ErrorBoundaryCardFallback}>
|
||||
{selectedTab === 'cpu' && <CpuSection />}
|
||||
{selectedTab === 'memory' && <MemorySection />}
|
||||
{selectedTab === 'storage' && <StorageSection />}
|
||||
</ErrorBoundary>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
// ---
|
||||
|
||||
function LiveUsageSection({title, children}: {title: string; children: React.ReactNode}) {
|
||||
const isSmall = useIsSmallMobile()
|
||||
|
||||
if (isSmall) return children
|
||||
|
||||
return (
|
||||
<div className='flex flex-col gap-3'>
|
||||
<h2 className='text-17 font-semibold -tracking-2 text-white/80'>{title}</h2>
|
||||
{children}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function StorageSection() {
|
||||
const {isLoading, value, valueSub, secondaryValue, progress, isDiskLow, isDiskFull, system, downloads, apps} =
|
||||
useDiskForUi({
|
||||
poll: true,
|
||||
})
|
||||
const {isLoading, value, valueSub, secondaryValue, progress, isDiskLow, isDiskFull, apps} = useDiskForUi({
|
||||
poll: true,
|
||||
})
|
||||
|
||||
return (
|
||||
<>
|
||||
<ProgressCard
|
||||
value={value}
|
||||
valueSub={valueSub}
|
||||
progressLabel={secondaryValue}
|
||||
progress={progress}
|
||||
rightChildren={
|
||||
<>
|
||||
{isDiskLow && <ErrorMessage>{t('storage.low')}</ErrorMessage>}
|
||||
{isDiskFull && <ErrorMessage>{t('storage.full')}</ErrorMessage>}
|
||||
</>
|
||||
}
|
||||
/>
|
||||
{isLoading && <AppListSkeleton />}
|
||||
<AppList system={system} downloads={downloads} apps={apps} formatValue={(v) => maybePrettyBytes(v)} />
|
||||
<div className='sm:hidden'>
|
||||
<UsageCard
|
||||
value={value}
|
||||
valueSub={valueSub}
|
||||
progressLabel={secondaryValue}
|
||||
progress={progress}
|
||||
rightChildren={
|
||||
<>
|
||||
{isDiskLow && <ErrorMessage>{t('storage.low')}</ErrorMessage>}
|
||||
{isDiskFull && <ErrorMessage>{t('storage.full')}</ErrorMessage>}
|
||||
</>
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
{isLoading && <AppListSkeleton systemApps={[systemAppsKeyed.UMBREL_system, systemAppsKeyed.UMBREL_downloads]} />}
|
||||
<AppList apps={apps} formatValue={(v) => maybePrettyBytes(v)} />
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
function MemorySection() {
|
||||
const {isLoading, value, valueSub, secondaryValue, progress, isMemoryLow, system, apps} = useMemoryForUi({poll: true})
|
||||
const {isLoading, value, valueSub, secondaryValue, progress, isMemoryLow, apps} = useMemoryForUi({poll: true})
|
||||
|
||||
return (
|
||||
<>
|
||||
<ProgressCard
|
||||
value={value}
|
||||
valueSub={valueSub}
|
||||
progressLabel={secondaryValue}
|
||||
progress={progress}
|
||||
rightChildren={isMemoryLow && <ErrorMessage>{t('memory.low')}</ErrorMessage>}
|
||||
/>
|
||||
{isLoading && <AppListSkeleton />}
|
||||
<AppList system={system} apps={apps} formatValue={(v) => maybePrettyBytes(v)} />
|
||||
<div className='sm:hidden'>
|
||||
<UsageCard
|
||||
value={value}
|
||||
valueSub={valueSub}
|
||||
progressLabel={secondaryValue}
|
||||
progress={progress}
|
||||
rightChildren={isMemoryLow && <ErrorMessage>{t('memory.low')}</ErrorMessage>}
|
||||
/>
|
||||
</div>
|
||||
{isLoading && <AppListSkeleton systemApps={[systemAppsKeyed.UMBREL_system]} />}
|
||||
<AppList apps={apps} formatValue={(v) => maybePrettyBytes(v)} />
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
function CpuSection() {
|
||||
const {isLoading, value, secondaryValue, progress, system, apps} = useCpuForUi({poll: true})
|
||||
const {isLoading, value, secondaryValue, progress, apps} = useCpuForUi({poll: true})
|
||||
|
||||
return (
|
||||
<>
|
||||
<ProgressCard value={value} progressLabel={secondaryValue} progress={progress} />
|
||||
{isLoading && <AppListSkeleton />}
|
||||
<AppList system={system} apps={apps} formatValue={(v) => formatNumberI18n(v) + '%'} />
|
||||
<div className='sm:hidden'>
|
||||
<UsageCard value={value} progressLabel={secondaryValue} progress={progress} />
|
||||
</div>
|
||||
{isLoading && <AppListSkeleton systemApps={[systemAppsKeyed.UMBREL_system]} />}
|
||||
<AppList apps={apps} formatValue={(v) => formatNumberI18n(v) + '%'} />
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
function ProgressCard({
|
||||
function UsageCard({
|
||||
active,
|
||||
title,
|
||||
value,
|
||||
valueSub,
|
||||
progressLabel,
|
||||
progress = 0,
|
||||
rightChildren,
|
||||
chart,
|
||||
}: {
|
||||
active?: boolean
|
||||
title?: string
|
||||
value?: string
|
||||
valueSub?: string
|
||||
progressLabel?: string
|
||||
progress?: number
|
||||
rightChildren?: ReactNode
|
||||
chart?: Array<any>
|
||||
}) {
|
||||
return (
|
||||
<Card className='flex flex-col gap-4'>
|
||||
<div className='flex items-center justify-between gap-2'>
|
||||
<div className='flex min-w-0 items-end gap-1 text-24 font-semibold leading-none -tracking-3 opacity-80'>
|
||||
<span className='min-w-0 truncate'>{value ?? LOADING_DASH}</span>
|
||||
<span className='min-w-0 flex-1 truncate text-13 font-bold opacity-[45%]'>{valueSub}</span>
|
||||
</div>
|
||||
{rightChildren}
|
||||
</div>
|
||||
<div className='flex flex-col gap-2'>
|
||||
<div className='text-13 font-semibold -tracking-2 opacity-40'>{progressLabel}</div>
|
||||
<Progress value={progress * 100} variant='primary' />
|
||||
</div>
|
||||
</Card>
|
||||
<motion.div className='relative p-[2px]'>
|
||||
<motion.div
|
||||
className='absolute left-0 top-0 z-[-1] h-full w-full rounded-[12px] bg-gradient-to-b from-brand/90 to-brand/15'
|
||||
initial={{opacity: 0}}
|
||||
animate={{opacity: active ? 1 : 0}}
|
||||
transition={active ? {duration: 0.3, delay: 0.1} : {duration: 0.3}}
|
||||
/>
|
||||
<motion.div
|
||||
className='relative translate-x-0 translate-y-0 transform overflow-hidden rounded-12'
|
||||
initial={{backgroundColor: 'rgba(30, 30, 30, 0)'}}
|
||||
animate={{backgroundColor: active ? 'rgba(30, 30, 30, 1)' : 'rgba(30, 30, 30, 0)'}}
|
||||
transition={active ? {duration: 0.3} : {duration: 0.3, delay: 0.1}}
|
||||
>
|
||||
<motion.div
|
||||
className='absolute left-0 top-0 z-[0] h-full w-full rounded-[12px] bg-gradient-to-b from-brand/15 to-brand/0'
|
||||
initial={{opacity: 0}}
|
||||
animate={{opacity: active ? 1 : 0}}
|
||||
transition={active ? {duration: 0.3, delay: 0.05} : {duration: 0.3}}
|
||||
/>
|
||||
{chart && (
|
||||
<ResponsiveContainer
|
||||
style={{position: 'absolute', bottom: -1, left: '-0.5%', zIndex: 0, borderRadius: 12}}
|
||||
width='101%'
|
||||
height='100%'
|
||||
>
|
||||
<AreaChart data={chart} margin={{bottom: 0}}>
|
||||
<defs>
|
||||
<linearGradient id={`${title}GradientChartColor`} x1='0' y1='0' x2='0' y2='1'>
|
||||
<stop
|
||||
offset='5%'
|
||||
style={{stopColor: active ? 'hsl(var(--color-brand) / 0.3)' : 'rgba(255, 255, 255, 0.05)'}}
|
||||
/>
|
||||
<stop
|
||||
offset='95%'
|
||||
style={{stopColor: active ? 'hsl(var(--color-brand) / 0)' : 'rgba(255, 255, 255, 0)'}}
|
||||
/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<YAxis domain={[0, 100]} hide={true} />
|
||||
<XAxis hide={true} />
|
||||
<Area
|
||||
isAnimationActive={false}
|
||||
type='monotone'
|
||||
dataKey='value'
|
||||
style={{stroke: active ? 'hsl(var(--color-brand) / 0.2)' : 'rgba(255, 255, 255, 0.05)'}}
|
||||
fillOpacity={1}
|
||||
fill={`url(#${title}GradientChartColor)`}
|
||||
legendType='none'
|
||||
dot={false}
|
||||
/>
|
||||
</AreaChart>
|
||||
</ResponsiveContainer>
|
||||
)}
|
||||
<Card className={`flex flex-col gap-3`}>
|
||||
<div className='hidden items-center justify-between gap-2 sm:flex'>
|
||||
<span className='leading-2 text-[0.8rem] font-bold opacity-40'>{title || ''}</span>
|
||||
{rightChildren}
|
||||
</div>
|
||||
<div className='flex min-w-0 items-end gap-1 text-24 font-semibold leading-none -tracking-3 opacity-80'>
|
||||
<span className='min-w-0 truncate'>{value ?? LOADING_DASH}</span>
|
||||
<span className='min-w-0 flex-1 truncate text-13 font-bold opacity-[45%]'>{valueSub}</span>
|
||||
</div>
|
||||
<div className='flex flex-col gap-2'>
|
||||
<div className='text-13 font-semibold -tracking-2 opacity-40'>{progressLabel}</div>
|
||||
<Progress value={progress * 100} variant='primary' />
|
||||
</div>
|
||||
</Card>
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -218,17 +316,7 @@ function ErrorMessage({children}: {children?: ReactNode}) {
|
||||
|
||||
// --
|
||||
|
||||
function AppList({
|
||||
system,
|
||||
downloads,
|
||||
apps,
|
||||
formatValue,
|
||||
}: {
|
||||
system?: number
|
||||
downloads?: number
|
||||
apps?: {id: string; used: number}[]
|
||||
formatValue: (value: number) => string
|
||||
}) {
|
||||
function AppList({apps, formatValue}: {apps?: {id: string; used: number}[]; formatValue: (value: number) => string}) {
|
||||
const {userAppsKeyed} = useApps()
|
||||
|
||||
if (userAppsKeyed === undefined) return null
|
||||
@@ -236,35 +324,32 @@ function AppList({
|
||||
|
||||
return (
|
||||
<div className={appListClass}>
|
||||
<AppListRow
|
||||
icon={systemAppsKeyed.UMBREL_system.icon}
|
||||
title={systemAppsKeyed.UMBREL_system.name}
|
||||
value={system === undefined ? LOADING_DASH : formatValue(system)}
|
||||
/>
|
||||
{downloads !== undefined && (
|
||||
<AppListRow
|
||||
icon={systemAppsKeyed.UMBREL_downloads.icon}
|
||||
title={systemAppsKeyed.UMBREL_downloads.name}
|
||||
value={downloads === undefined ? LOADING_DASH : formatValue(downloads)}
|
||||
/>
|
||||
)}
|
||||
{apps?.map(({id, used}) => (
|
||||
<AppListRow
|
||||
key={id}
|
||||
icon={userAppsKeyed[id]?.icon}
|
||||
title={userAppsKeyed[id]?.name || t('unknown-app')}
|
||||
value={formatValue(used)}
|
||||
/>
|
||||
))}
|
||||
{apps?.map(({id, used}) => {
|
||||
let icon = userAppsKeyed[id]?.icon
|
||||
let title = userAppsKeyed[id]?.name || t('unknown-app')
|
||||
if (id === 'umbreld-system') {
|
||||
icon = systemAppsKeyed.UMBREL_system.icon
|
||||
title = systemAppsKeyed.UMBREL_system.name
|
||||
}
|
||||
if (id === 'umbreld-downloads') {
|
||||
icon = systemAppsKeyed.UMBREL_downloads.icon
|
||||
title = systemAppsKeyed.UMBREL_downloads.name
|
||||
}
|
||||
return <AppListRow key={id} icon={icon} title={title} value={formatValue(used)} />
|
||||
})}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export function AppListSkeleton() {
|
||||
export function AppListSkeleton({systemApps}: {systemApps?: Array<AppT>}) {
|
||||
const {userApps} = useApps()
|
||||
// Show a list of user-installed and system apps
|
||||
// with no values
|
||||
return (
|
||||
<div className={appListClass}>
|
||||
{/* TODO: derive app count and use that here */}
|
||||
<AppListRow title={LOADING_DASH} value={LOADING_DASH} />
|
||||
{[...(systemApps || []), ...(userApps || [])].map((app) => {
|
||||
return <AppListRow key={app.id} title={app.name} icon={app.icon} value='' />
|
||||
})}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -4,25 +4,25 @@ import {useIsMobile} from '@/hooks/use-is-mobile'
|
||||
import {tempDescriptions, tempDescriptionsKeyed, TempUnit, useTempUnit} from '@/hooks/use-temp-unit'
|
||||
import {cn} from '@/shadcn-lib/utils'
|
||||
import {t} from '@/utils/i18n'
|
||||
import {isCpuTooCold, isCpuTooHot} from '@/utils/system'
|
||||
import {celciusToFahrenheit, CpuType, tempToColor, tempToMessage} from '@/utils/temperature'
|
||||
import {isCpuTooHot} from '@/utils/system'
|
||||
import {celciusToFahrenheit, tempWarningToColor, tempWarningToMessage} from '@/utils/temperature'
|
||||
|
||||
import {cardErrorClass, cardSecondaryValueClass, cardTitleClass, cardValueClass} from './shared'
|
||||
|
||||
export function CpuTempCardContent({
|
||||
tempInCelcius,
|
||||
defaultUnit,
|
||||
cpuType,
|
||||
warning,
|
||||
}: {
|
||||
tempInCelcius?: number
|
||||
defaultUnit?: TempUnit
|
||||
cpuType: CpuType
|
||||
warning?: string
|
||||
}) {
|
||||
const [unit, setUnit] = useTempUnit(defaultUnit)
|
||||
|
||||
const tempNumber = unit === 'c' ? tempInCelcius : celciusToFahrenheit(tempInCelcius)
|
||||
const tempUnitLabel = tempDescriptionsKeyed[unit].label
|
||||
const tempMessage = tempNumber === 69 ? t('temp.nice') : tempToMessage(cpuType, tempInCelcius)
|
||||
const tempMessage = tempNumber === 69 ? t('temp.nice') : tempWarningToMessage(warning)
|
||||
|
||||
// 60% opacity to base 16
|
||||
const opacity = (60).toString(16)
|
||||
@@ -43,8 +43,8 @@ export function CpuTempCardContent({
|
||||
className={cn('h-[5px] w-[5px] rounded-full ring-3', !isUnknown && 'animate-pulse')}
|
||||
style={
|
||||
{
|
||||
backgroundColor: tempToColor(cpuType, tempInCelcius),
|
||||
'--tw-ring-color': tempToColor(cpuType, tempInCelcius) + opacity,
|
||||
backgroundColor: tempWarningToColor(warning),
|
||||
'--tw-ring-color': tempWarningToColor(warning) + opacity,
|
||||
} as React.CSSProperties // forcing because of `--tw-ring-color`
|
||||
}
|
||||
/>
|
||||
@@ -59,12 +59,7 @@ export function CpuTempCardContent({
|
||||
onValueChange={setUnit}
|
||||
/>
|
||||
</div>
|
||||
{isCpuTooHot(cpuType, tempInCelcius ?? 0) && (
|
||||
<span className={cardErrorClass}>{t('temperature.too-hot-suggestion')}</span>
|
||||
)}
|
||||
{isCpuTooCold(cpuType, tempInCelcius ?? 0) && (
|
||||
<span className={cardErrorClass}>{t('temperature.too-cold-suggestion')}</span>
|
||||
)}
|
||||
{isCpuTooHot(warning) && <span className={cardErrorClass}>{t('temperature.too-hot-suggestion')}</span>}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import {useMemoryForUi} from '@/hooks/use-memory'
|
||||
import {useSystemMemoryForUi} from '@/hooks/use-memory'
|
||||
import {t} from '@/utils/i18n'
|
||||
|
||||
import {ProgressStatCardContent} from './progress-card-content'
|
||||
import {cardErrorClass} from './shared'
|
||||
|
||||
export function MemoryCardContent() {
|
||||
const {value, valueSub, secondaryValue, progress, isMemoryLow} = useMemoryForUi()
|
||||
const {value, valueSub, secondaryValue, progress, isMemoryLow} = useSystemMemoryForUi()
|
||||
|
||||
return (
|
||||
<ProgressStatCardContent
|
||||
|
||||
@@ -8,6 +8,7 @@ import {
|
||||
TbSettingsMinus,
|
||||
TbTool,
|
||||
TbUser,
|
||||
TbWifi,
|
||||
} from 'react-icons/tb'
|
||||
import {Link, useNavigate} from 'react-router-dom'
|
||||
|
||||
@@ -16,16 +17,16 @@ import {Link, useNavigate} from 'react-router-dom'
|
||||
import {TorIcon2} from '@/assets/tor-icon2'
|
||||
import {ButtonLink} from '@/components/ui/button-link'
|
||||
import {Card} from '@/components/ui/card'
|
||||
import {LOADING_DASH, SETTINGS_SYSTEM_CARDS_ID, UNKNOWN} from '@/constants'
|
||||
import {SETTINGS_SYSTEM_CARDS_ID, UNKNOWN} from '@/constants'
|
||||
import {useCpuTemp} from '@/hooks/use-cpu-temp'
|
||||
import {useDeviceInfo} from '@/hooks/use-device-info'
|
||||
import {useLanguage} from '@/hooks/use-language'
|
||||
import {useQueryParams} from '@/hooks/use-query-params'
|
||||
import {useTorEnabled} from '@/hooks/use-tor-enabled'
|
||||
import {DesktopPreviewFrame} from '@/modules/desktop/desktop-preview'
|
||||
import {DesktopPreviewConnected} from '@/modules/desktop/desktop-preview-basic'
|
||||
import {WifiListRowConnectedDescription} from '@/modules/wifi/wifi-list-row-connected-description'
|
||||
import {SettingsSummary} from '@/routes/settings/_components/settings-summary'
|
||||
import {trpcReact} from '@/trpc/trpc'
|
||||
import {duration} from '@/utils/date-time'
|
||||
import {t} from '@/utils/i18n'
|
||||
import {firstNameFromFullName} from '@/utils/misc'
|
||||
|
||||
@@ -37,14 +38,12 @@ import {ContactSupportLink} from './shared'
|
||||
import {StorageCardContent} from './storage-card-content'
|
||||
|
||||
export function SettingsContentMobile() {
|
||||
const [languageCode] = useLanguage()
|
||||
const {addLinkSearchParams} = useQueryParams()
|
||||
const navigate = useNavigate()
|
||||
const userQ = trpcReact.user.get.useQuery()
|
||||
const cpuTemp = useCpuTemp()
|
||||
const deviceInfo = useDeviceInfo()
|
||||
const osVersionQ = trpcReact.system.version.useQuery()
|
||||
const uptimeQ = trpcReact.system.uptime.useQuery()
|
||||
const wifiQ = trpcReact.wifi.connected.useQuery()
|
||||
const tor = useTorEnabled()
|
||||
// const isUmbrelHomeQ = trpcReact.migration.isUmbrelHome.useQuery()
|
||||
// const isUmbrelHome = !!isUmbrelHomeQ.data
|
||||
@@ -83,19 +82,11 @@ export function SettingsContentMobile() {
|
||||
|
||||
<div className='mx-2.5'>
|
||||
<h2 className='text-24 font-bold leading-none -tracking-4'>
|
||||
{firstNameFromFullName(userQ.data.name)}’s <span className='opacity-40'>{t('umbrel')}</span>
|
||||
{userQ.data?.name && `${firstNameFromFullName(userQ.data?.name)}’s`}{' '}
|
||||
<span className='opacity-40'>{t('umbrel')}</span>
|
||||
</h2>
|
||||
<div className='pt-5' />
|
||||
<dl className='grid grid-cols-2 gap-x-5 gap-y-2 text-14 leading-none -tracking-2'>
|
||||
<dt className='opacity-40'>{t('device')}</dt>
|
||||
<dd>{deviceInfo.data?.device || LOADING_DASH}</dd>
|
||||
<dt className='opacity-40'>{t('umbrelos')}</dt>
|
||||
<dd>{osVersionQ.isLoading ? LOADING_DASH : `${osVersionQ.data?.name}` ?? UNKNOWN()}</dd>
|
||||
<dt className='opacity-40'>{t('uptime')}</dt>
|
||||
<dd>{uptimeQ.isLoading ? LOADING_DASH : duration(uptimeQ.data, languageCode)}</dd>
|
||||
{/* TODO: add tor hidden service */}
|
||||
{/* But for now, assume mobile users don't have tor */}
|
||||
</dl>
|
||||
<SettingsSummary />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -133,7 +124,7 @@ export function SettingsContentMobile() {
|
||||
</Link>
|
||||
|
||||
<Card>
|
||||
<CpuTempCardContent cpuType={cpuTemp.cpuType} tempInCelcius={cpuTemp.temp} />
|
||||
<CpuTempCardContent warning={cpuTemp.warning} tempInCelcius={cpuTemp.temp} />
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
@@ -150,6 +141,18 @@ export function SettingsContentMobile() {
|
||||
description={t('wallpaper-description')}
|
||||
onClick={() => navigate('wallpaper')}
|
||||
/>
|
||||
<ListRowMobile
|
||||
icon={TbWifi}
|
||||
title={t('wifi')}
|
||||
description={
|
||||
wifiQ.data?.status === 'connected' ? (
|
||||
<WifiListRowConnectedDescription network={wifiQ.data} />
|
||||
) : (
|
||||
t('wifi-description')
|
||||
)
|
||||
}
|
||||
onClick={() => navigate('wifi')}
|
||||
/>
|
||||
<ListRowMobile
|
||||
icon={Tb2Fa}
|
||||
title={t('2fa')}
|
||||
|
||||
@@ -8,7 +8,7 @@ import {
|
||||
RiShutDownLine,
|
||||
RiUserLine,
|
||||
} from 'react-icons/ri'
|
||||
import {TbServer, TbSettingsMinus, TbTool} from 'react-icons/tb'
|
||||
import {TbServer, TbSettingsMinus, TbTool, TbWifi} from 'react-icons/tb'
|
||||
import {useNavigate, useParams} from 'react-router-dom'
|
||||
|
||||
import {Card} from '@/components/ui/card'
|
||||
@@ -17,18 +17,17 @@ import {CoverMessage, CoverMessageParagraph} from '@/components/ui/cover-message
|
||||
import {IconButton} from '@/components/ui/icon-button'
|
||||
import {IconButtonLink} from '@/components/ui/icon-button-link'
|
||||
import {Loading} from '@/components/ui/loading'
|
||||
import {LOADING_DASH, SETTINGS_SYSTEM_CARDS_ID, UNKNOWN} from '@/constants'
|
||||
import {SETTINGS_SYSTEM_CARDS_ID} from '@/constants'
|
||||
import {useCpuTemp} from '@/hooks/use-cpu-temp'
|
||||
import {useDeviceInfo} from '@/hooks/use-device-info'
|
||||
import {useLanguage} from '@/hooks/use-language'
|
||||
import {useTorEnabled} from '@/hooks/use-tor-enabled'
|
||||
import {DesktopPreviewFrame} from '@/modules/desktop/desktop-preview'
|
||||
import {DesktopPreviewConnected} from '@/modules/desktop/desktop-preview-basic'
|
||||
import {WifiListRowConnectedDescription} from '@/modules/wifi/wifi-list-row-connected-description'
|
||||
import {LanguageDropdownContent, LanguageDropdownTrigger} from '@/routes/settings/_components/language-dropdown'
|
||||
import {SettingsSummary} from '@/routes/settings/_components/settings-summary'
|
||||
import {DropdownMenu} from '@/shadcn-components/ui/dropdown-menu'
|
||||
import {Switch} from '@/shadcn-components/ui/switch'
|
||||
import {trpcReact} from '@/trpc/trpc'
|
||||
import {duration} from '@/utils/date-time'
|
||||
import {useLinkToDialog} from '@/utils/dialog'
|
||||
import {t} from '@/utils/i18n'
|
||||
import {firstNameFromFullName} from '@/utils/misc'
|
||||
@@ -45,18 +44,15 @@ import {WallpaperPicker} from './wallpaper-picker'
|
||||
export function SettingsContent() {
|
||||
const navigate = useNavigate()
|
||||
const linkToDialog = useLinkToDialog()
|
||||
const [languageCode] = useLanguage()
|
||||
const [langOpen, setLangOpen] = useState(false)
|
||||
|
||||
const tor = useTorEnabled()
|
||||
const deviceInfo = useDeviceInfo()
|
||||
const cpuTemp = useCpuTemp()
|
||||
|
||||
const [userQ, uptimeQ, is2faEnabledQ, osVersionQ] = trpcReact.useQueries((t) => [
|
||||
const [userQ, wifiSupportedQ, is2faEnabledQ] = trpcReact.useQueries((t) => [
|
||||
t.user.get(),
|
||||
t.system.uptime(),
|
||||
t.wifi.supported(),
|
||||
t.user.is2faEnabled(),
|
||||
t.system.version(),
|
||||
])
|
||||
|
||||
const hiddenServiceQ = trpcReact.system.hiddenService.useQuery(undefined, {
|
||||
@@ -86,24 +82,11 @@ export function SettingsContent() {
|
||||
<Card className='flex flex-wrap items-center justify-between gap-5'>
|
||||
<div>
|
||||
<h2 className='text-24 font-bold leading-none -tracking-4'>
|
||||
{/* TODO: interpolate here */}
|
||||
{firstNameFromFullName(userQ.data?.name ?? UNKNOWN())}’s <span className='opacity-40'>{t('umbrel')}</span>
|
||||
{userQ.data?.name && `${firstNameFromFullName(userQ.data?.name)}’s`}{' '}
|
||||
<span className='opacity-40'>{t('umbrel')}</span>
|
||||
</h2>
|
||||
<div className='pt-5' />
|
||||
<dl
|
||||
className='grid grid-cols-2 items-center gap-x-5 gap-y-2 text-14 leading-none -tracking-2'
|
||||
style={{
|
||||
// Makes columns not all the same width
|
||||
gridTemplateColumns: 'auto auto',
|
||||
}}
|
||||
>
|
||||
<dt className='opacity-40'>{t('device')}</dt>
|
||||
<dd>{deviceInfo.data?.device || LOADING_DASH}</dd>
|
||||
<dt className='opacity-40'>{t('umbrelos')}</dt>
|
||||
<dd>{osVersionQ.isLoading ? LOADING_DASH : `${osVersionQ.data?.name}` ?? UNKNOWN()}</dd>
|
||||
<dt className='opacity-40'>{t('uptime')}</dt>
|
||||
<dd>{uptimeQ.isLoading ? LOADING_DASH : duration(uptimeQ.data, languageCode)}</dd>
|
||||
</dl>
|
||||
<SettingsSummary />
|
||||
</div>
|
||||
<div className='flex w-full flex-col items-stretch gap-2.5 md:w-auto md:flex-row'>
|
||||
<IconButtonLink to={linkToDialog('logout')} size='xl' icon={RiLogoutCircleRLine}>
|
||||
@@ -129,7 +112,7 @@ export function SettingsContent() {
|
||||
<CpuCardContent />
|
||||
</Card>
|
||||
<Card>
|
||||
<CpuTempCardContent cpuType={cpuTemp.cpuType} tempInCelcius={cpuTemp.temp} />
|
||||
<CpuTempCardContent warning={cpuTemp.warning} tempInCelcius={cpuTemp.temp} />
|
||||
</Card>
|
||||
<div className='mx-auto'>
|
||||
<IconButtonLink icon={RiPulseLine} to={linkToDialog('live-usage')}>
|
||||
@@ -161,6 +144,13 @@ export function SettingsContent() {
|
||||
<WallpaperPicker />
|
||||
</div>
|
||||
</ListRow>
|
||||
{wifiSupportedQ.data ? (
|
||||
<WifiSupportedListRow />
|
||||
) : (
|
||||
<ListRow title={t('wifi')} description={t('wifi-description')}>
|
||||
<Switch checked={false} onCheckedChange={() => navigate('wifi-unsupported')} />
|
||||
</ListRow>
|
||||
)}
|
||||
<ListRow title={t('2fa')} description={t('2fa-description')} disabled={is2faEnabledQ.isLoading}>
|
||||
<Switch checked={is2faEnabledQ.data} onCheckedChange={() => navigate('2fa')} />
|
||||
</ListRow>
|
||||
@@ -229,3 +219,24 @@ export function SettingsContent() {
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function WifiSupportedListRow() {
|
||||
const navigate = useNavigate()
|
||||
const wifiQ = trpcReact.wifi.connected.useQuery()
|
||||
|
||||
return wifiQ.data?.status === 'connected' ? (
|
||||
<ListRow
|
||||
title={t('wifi')}
|
||||
description={<WifiListRowConnectedDescription network={wifiQ.data} />}
|
||||
disabled={wifiQ.isLoading}
|
||||
>
|
||||
<IconButtonLink to={'wifi'} icon={TbWifi}>
|
||||
{t('wifi-view-networks')}
|
||||
</IconButtonLink>
|
||||
</ListRow>
|
||||
) : (
|
||||
<ListRow title={t('wifi')} description={t('wifi-description')} disabled={wifiQ.isLoading}>
|
||||
<Switch checked={false} onCheckedChange={() => navigate('wifi')} />
|
||||
</ListRow>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
import {Link} from 'react-router-dom'
|
||||
|
||||
import {LOADING_DASH, UNKNOWN} from '@/constants'
|
||||
import {useDeviceInfo} from '@/hooks/use-device-info'
|
||||
import {useLanguage} from '@/hooks/use-language'
|
||||
import {trpcReact} from '@/trpc/trpc'
|
||||
import {duration} from '@/utils/date-time'
|
||||
import {t} from '@/utils/i18n'
|
||||
|
||||
export function SettingsSummary() {
|
||||
const [languageCode] = useLanguage()
|
||||
const deviceInfo = useDeviceInfo()
|
||||
const osVersionQ = trpcReact.system.version.useQuery()
|
||||
const uptimeQ = trpcReact.system.uptime.useQuery()
|
||||
const ipAddresses = trpcReact.system.getIpAddresses.useQuery()
|
||||
|
||||
return (
|
||||
<dl
|
||||
className='grid grid-cols-2 items-center gap-x-5 gap-y-2 text-14 leading-none -tracking-2'
|
||||
style={{
|
||||
// Makes columns not all the same width
|
||||
gridTemplateColumns: 'auto auto',
|
||||
}}
|
||||
>
|
||||
<dt className='opacity-40'>{t('device')}</dt>
|
||||
<dd>{deviceInfo.data?.device || LOADING_DASH}</dd>
|
||||
<dt className='opacity-40'>{t('umbrelos')}</dt>
|
||||
<dd>{osVersionQ.isLoading ? LOADING_DASH : `${osVersionQ.data?.name}` ?? UNKNOWN()}</dd>
|
||||
<dt className='opacity-40'>{t('local-ip')}</dt>
|
||||
<dd>
|
||||
{ipAddresses.data?.length
|
||||
? ipAddresses.data.map((ip: string, index: number) => (
|
||||
<>
|
||||
<Link to={`http://${ip}`} target='_blank'>
|
||||
{ip}
|
||||
</Link>
|
||||
{index < ipAddresses.data.length - 1 && ', '}
|
||||
</>
|
||||
))
|
||||
: LOADING_DASH}
|
||||
</dd>
|
||||
<dt className='opacity-40'>{t('uptime')}</dt>
|
||||
<dd>{uptimeQ.isLoading ? LOADING_DASH : duration(uptimeQ.data, languageCode)}</dd>
|
||||
</dl>
|
||||
)
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
import {useDiskForUi} from '@/hooks/use-disk'
|
||||
import {useSystemDiskForUi} from '@/hooks/use-disk'
|
||||
import {t} from '@/utils/i18n'
|
||||
|
||||
import {ProgressStatCardContent} from './progress-card-content'
|
||||
import {cardErrorClass} from './shared'
|
||||
|
||||
export function StorageCardContent() {
|
||||
const {value, valueSub, secondaryValue, progress, isDiskLow, isDiskFull} = useDiskForUi()
|
||||
const {value, valueSub, secondaryValue, progress, isDiskLow, isDiskFull} = useSystemDiskForUi()
|
||||
|
||||
return (
|
||||
<ProgressStatCardContent
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
import {TbTerminal2} from 'react-icons/tb'
|
||||
|
||||
import {IconButtonLink} from '@/components/ui/icon-button-link'
|
||||
import {useSettingsDialogProps} from '@/routes/settings/_components/shared'
|
||||
import {
|
||||
Drawer,
|
||||
DrawerContent,
|
||||
DrawerHeader,
|
||||
DrawerTitle,
|
||||
} from '@/shadcn-components/ui/drawer'
|
||||
import {Dialog, DialogHeader, DialogScrollableContent, DialogTitle} from '@/shadcn-components/ui/dialog'
|
||||
import {useIsMobile} from '@/hooks/use-is-mobile'
|
||||
import {useSoftwareUpdate} from '@/hooks/use-software-update'
|
||||
import {useSettingsDialogProps} from '@/routes/settings/_components/shared'
|
||||
import {Dialog, DialogHeader, DialogScrollableContent, DialogTitle} from '@/shadcn-components/ui/dialog'
|
||||
import {Drawer, DrawerContent, DrawerHeader, DrawerTitle} from '@/shadcn-components/ui/drawer'
|
||||
import {Switch} from '@/shadcn-components/ui/switch'
|
||||
import {trpcReact} from '@/trpc/trpc'
|
||||
import {t} from '@/utils/i18n'
|
||||
@@ -85,10 +81,12 @@ export default function AdvancedSettingsDrawerOrDialog() {
|
||||
function useIsBetaChannel() {
|
||||
const releaseChannelQ = trpcReact.system.getReleaseChannel.useQuery()
|
||||
const isChecked = releaseChannelQ.data === 'beta'
|
||||
const {checkLatest} = useSoftwareUpdate()
|
||||
|
||||
const releaseChannelMut = trpcReact.system.setReleaseChannel.useMutation({
|
||||
onSuccess: () => {
|
||||
releaseChannelQ.refetch()
|
||||
checkLatest()
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
@@ -41,6 +41,8 @@ const StartMigrationDrawerOrDialog = React.lazy(() =>
|
||||
default: m.StartMigrationDrawerOrDialog,
|
||||
})),
|
||||
)
|
||||
const Wifi = React.lazy(() => import('@/routes/settings/wifi'))
|
||||
const WifiUnsupported = React.lazy(() => import('@/routes/settings/wifi-unsupported'))
|
||||
const AccountDrawer = React.lazy(() =>
|
||||
import('@/routes/settings/mobile/account').then((m) => ({default: m.AccountDrawer})),
|
||||
)
|
||||
@@ -116,9 +118,11 @@ export function Settings() {
|
||||
{/* Fall-through `/account` to here. If going to account, always show drawer, even if on desktop */}
|
||||
{<Route path='/account/:accountTab' Component={AccountDrawer} />}
|
||||
{isMobile && <Route path='/wallpaper' Component={WallpaperDrawer} />}
|
||||
<Route path='/wifi' Component={Wifi} />
|
||||
<Route path='/wifi-unsupported' Component={WifiUnsupported} />
|
||||
<Route path='/tor' Component={isMobile ? TorDrawer : ConfirmEnableTorDialog} />
|
||||
{/* Not choosing based on `isMobile` because we don't want the dialog state to get reset if you resize the browser window. But also we want the same `/settings/migration-assistant` path for the first dialog/drawer you see */}
|
||||
{<Route path='/migration-assistant' Component={StartMigrationDrawerOrDialog} />}
|
||||
<Route path='/migration-assistant' Component={StartMigrationDrawerOrDialog} />
|
||||
{isMobile && <Route path='/language' Component={LanguageDrawer} />}
|
||||
<Route path='/troubleshoot/*' Component={TroubleshootDialog} />
|
||||
<Route path='/terminal/*' Component={TerminalDialog} />
|
||||
|
||||
@@ -1,51 +1,23 @@
|
||||
import {useNavigate, useParams} from 'react-router-dom'
|
||||
|
||||
import {ImmersiveDialogFooter} from '@/components/ui/immersive-dialog'
|
||||
import {SegmentedControl} from '@/components/ui/segmented-control'
|
||||
import {ImmersivePickerDialogContent} from '@/modules/immersive-picker'
|
||||
import {
|
||||
downloadUtf8Logs,
|
||||
LogResults,
|
||||
SystemLogType,
|
||||
TroubleshootTitleBackLink,
|
||||
} from '@/routes/settings/troubleshoot/_shared'
|
||||
import {LogResults, SystemLogType, TroubleshootTitleBackLink} from '@/routes/settings/troubleshoot/_shared'
|
||||
import {Button} from '@/shadcn-components/ui/button'
|
||||
import {trpcReact} from '@/trpc/trpc'
|
||||
import {t} from '@/utils/i18n'
|
||||
|
||||
export default function TroubleshootUmbrelOs() {
|
||||
const tabs = [
|
||||
{id: 'umbrelos', label: t('troubleshoot.umbrelos-logs')},
|
||||
{id: 'system', label: t('troubleshoot.system-logs')},
|
||||
] as const satisfies readonly {id: SystemLogType; label: string}[]
|
||||
|
||||
const defaultTab = tabs[0].id
|
||||
// const [activeTab, setActiveTab] = useLocalStorage2<SystemLogType>('troubleshoot-system-active-tab', defaultTab)
|
||||
|
||||
const navigate = useNavigate()
|
||||
const params = useParams<{systemTab: SystemLogType}>()
|
||||
const activeTab = params.systemTab ?? defaultTab
|
||||
const setActiveTab = (tab: SystemLogType) => {
|
||||
navigate(`/settings/troubleshoot/umbrelos/${tab}`, {
|
||||
replace: true,
|
||||
})
|
||||
}
|
||||
const logs = useSystemLogs(activeTab ?? defaultTab)
|
||||
|
||||
const activeLabel = tabs.find((tab) => tab.id === activeTab)?.label
|
||||
const logs = useSystemLogs('system')
|
||||
|
||||
return (
|
||||
<ImmersivePickerDialogContent>
|
||||
<div className='flex w-full flex-wrap items-center justify-between'>
|
||||
<div className='flex w-full items-center justify-between'>
|
||||
<TroubleshootTitleBackLink />
|
||||
<SegmentedControl size='lg' tabs={tabs} value={activeTab} onValueChange={setActiveTab} />
|
||||
</div>
|
||||
<LogResults key={activeTab}>{logs}</LogResults>
|
||||
<LogResults>{logs}</LogResults>
|
||||
<ImmersiveDialogFooter className='justify-center'>
|
||||
<Button variant='primary' size='dialog' onClick={() => downloadUtf8Logs(logs, activeTab)}>
|
||||
{t('troubleshoot.system-download', {label: activeLabel})}
|
||||
<Button variant='primary' size='dialog' onClick={() => (window.location.href = '/logs')}>
|
||||
{t('troubleshoot.system-download', {label: t('troubleshoot.umbrelos-logs')})}
|
||||
</Button>
|
||||
{/* <Button size='dialog'>{t('troubleshoot.share-with-umbrel-support')}</Button> */}
|
||||
</ImmersiveDialogFooter>
|
||||
</ImmersivePickerDialogContent>
|
||||
)
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
import {TbWifi} from 'react-icons/tb'
|
||||
|
||||
import {useSettingsDialogProps} from '@/routes/settings/_components/shared'
|
||||
import {
|
||||
AlertDialog,
|
||||
AlertDialogAction,
|
||||
AlertDialogContent,
|
||||
AlertDialogDescription,
|
||||
AlertDialogFooter,
|
||||
AlertDialogHeader,
|
||||
AlertDialogTitle,
|
||||
} from '@/shadcn-components/ui/alert-dialog'
|
||||
import {t} from '@/utils/i18n'
|
||||
|
||||
export default function WifiUnsupported() {
|
||||
const dialogProps = useSettingsDialogProps()
|
||||
|
||||
return (
|
||||
<AlertDialog {...dialogProps}>
|
||||
<AlertDialogContent>
|
||||
<AlertDialogHeader>
|
||||
<AlertDialogTitle>{t('wifi')}</AlertDialogTitle>
|
||||
</AlertDialogHeader>
|
||||
<div className='mt-2 flex justify-center'>
|
||||
<Icon />
|
||||
</div>
|
||||
<AlertDialogDescription className='text-center'>
|
||||
{t('wifi-unsupported-device-description')}
|
||||
</AlertDialogDescription>
|
||||
<AlertDialogFooter>
|
||||
<AlertDialogAction onClick={() => dialogProps.onOpenChange(false)}>{t('ok')}</AlertDialogAction>
|
||||
</AlertDialogFooter>
|
||||
</AlertDialogContent>
|
||||
</AlertDialog>
|
||||
)
|
||||
}
|
||||
|
||||
function Icon() {
|
||||
return (
|
||||
// Stolen from factory reset sidebar icon
|
||||
<div
|
||||
className='grid h-[67px] w-[67px] place-items-center rounded-15 bg-white/6'
|
||||
style={{boxShadow: '0 1px 1px #ffffff33 inset'}}
|
||||
>
|
||||
<TbWifi className='h-[40px] w-[40px]' />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
import {WifiDrawerOrDialog, WifiDrawerOrDialogContent} from '@/modules/wifi/wifi-drawer-or-dialog'
|
||||
import {useSettingsDialogProps} from '@/routes/settings/_components/shared'
|
||||
|
||||
export default function Wifi() {
|
||||
const dialogProps = useSettingsDialogProps()
|
||||
|
||||
return (
|
||||
<WifiDrawerOrDialog {...dialogProps}>
|
||||
<WifiDrawerOrDialogContent />
|
||||
</WifiDrawerOrDialog>
|
||||
)
|
||||
}
|
||||
@@ -25,6 +25,7 @@ const buttonVariants = cva(
|
||||
sm: 'rounded-full h-[25px] px-[10px] text-12 gap-2',
|
||||
'md-squared': 'rounded-8 h-[36px] px-[10px] text-13 gap-2',
|
||||
default: 'rounded-full h-[30px] px-2.5 text-12',
|
||||
'input-short': 'rounded-full h-9 px-4 text-13 font-medium min-w-[80px]',
|
||||
dialog:
|
||||
'rounded-full h-[42px] md:h-[30px] min-w-[80px] px-4 font-semibold w-full md:w-auto md:font-medium text-13',
|
||||
lg: 'rounded-full h-[40px] px-[15px] text-15',
|
||||
|
||||
@@ -70,6 +70,7 @@ export function PasswordInput({
|
||||
autoFocus,
|
||||
sizeVariant,
|
||||
inputRef,
|
||||
className,
|
||||
}: {
|
||||
value?: string
|
||||
/** Calling it a label rather than a placeholder */
|
||||
@@ -79,10 +80,11 @@ export function PasswordInput({
|
||||
autoFocus?: boolean
|
||||
sizeVariant?: VariantProps<typeof inputVariants>['sizeVariant']
|
||||
inputRef?: React.Ref<HTMLInputElement>
|
||||
className?: string
|
||||
}) {
|
||||
const [showPassword, setShowPassword] = React.useState(false)
|
||||
return (
|
||||
<div>
|
||||
<div className={className}>
|
||||
<div className={cn(iconRightClasses.root)}>
|
||||
<Input
|
||||
ref={inputRef}
|
||||
|
||||
@@ -1,24 +1,17 @@
|
||||
import * as React from "react"
|
||||
import * as LabelPrimitive from "@radix-ui/react-label"
|
||||
import { cva, type VariantProps } from "class-variance-authority"
|
||||
import * as LabelPrimitive from '@radix-ui/react-label'
|
||||
import {cva, type VariantProps} from 'class-variance-authority'
|
||||
import * as React from 'react'
|
||||
|
||||
import { cn } from "@/shadcn-lib/utils"
|
||||
import {cn} from '@/shadcn-lib/utils'
|
||||
|
||||
const labelVariants = cva(
|
||||
"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||
)
|
||||
const labelVariants = cva('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70')
|
||||
|
||||
const Label = React.forwardRef<
|
||||
React.ElementRef<typeof LabelPrimitive.Root>,
|
||||
React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &
|
||||
VariantProps<typeof labelVariants>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<LabelPrimitive.Root
|
||||
ref={ref}
|
||||
className={cn(labelVariants(), className)}
|
||||
{...props}
|
||||
/>
|
||||
React.ElementRef<typeof LabelPrimitive.Root>,
|
||||
React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>
|
||||
>(({className, ...props}, ref) => (
|
||||
<LabelPrimitive.Root ref={ref} className={cn(labelVariants(), className)} {...props} />
|
||||
))
|
||||
Label.displayName = LabelPrimitive.Root.displayName
|
||||
|
||||
export { Label }
|
||||
export {Label}
|
||||
|
||||
@@ -1,49 +1,54 @@
|
||||
import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'
|
||||
import * as React from 'react'
|
||||
import {mergeRefs} from 'react-merge-refs'
|
||||
|
||||
import {useFadeScroller} from '@/components/fade-scroller'
|
||||
import {cn} from '@/shadcn-lib/utils'
|
||||
|
||||
const ScrollArea = React.forwardRef<
|
||||
React.ElementRef<typeof ScrollAreaPrimitive.Root>,
|
||||
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> & {
|
||||
dialogInset?: boolean
|
||||
orientation?: 'horizontal' | 'vertical'
|
||||
}
|
||||
>(({className, children, dialogInset, orientation = 'vertical', ...props}, ref) => {
|
||||
const {scrollerClass, ref: scrollerRef} = useFadeScroller('y')
|
||||
return (
|
||||
<ScrollAreaPrimitive.Root
|
||||
ref={ref}
|
||||
className={cn('relative overflow-hidden', className)}
|
||||
scrollHideDelay={0}
|
||||
{...props}
|
||||
>
|
||||
<ScrollAreaPrimitive.Viewport
|
||||
ref={scrollerRef}
|
||||
className={cn(
|
||||
// Setting `block` to fix issues with radix `ScrollArea` component
|
||||
// https://github.com/radix-ui/primitives/issues/926#issuecomment-1015279283
|
||||
'flex h-full w-full rounded-[inherit] *:!block *:flex-grow',
|
||||
orientation === 'vertical' && 'flex-col',
|
||||
scrollerClass,
|
||||
)}
|
||||
type Props = React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> & {
|
||||
dialogInset?: boolean
|
||||
scrollbarClass?: string
|
||||
orientation?: 'horizontal' | 'vertical'
|
||||
viewportRef?: React.RefObject<HTMLDivElement>
|
||||
}
|
||||
|
||||
const ScrollArea = React.forwardRef<React.ElementRef<typeof ScrollAreaPrimitive.Root>, Props>(
|
||||
({className, children, viewportRef, dialogInset, scrollbarClass, orientation = 'vertical', ...props}, ref) => {
|
||||
const {scrollerClass, ref: scrollerRef} = useFadeScroller('y')
|
||||
return (
|
||||
<ScrollAreaPrimitive.Root
|
||||
ref={ref}
|
||||
className={cn('relative overflow-hidden', className)}
|
||||
scrollHideDelay={0}
|
||||
{...props}
|
||||
>
|
||||
{children}
|
||||
</ScrollAreaPrimitive.Viewport>
|
||||
<ScrollBar dialogInset={dialogInset} orientation={orientation} />
|
||||
<ScrollAreaPrimitive.Corner />
|
||||
</ScrollAreaPrimitive.Root>
|
||||
)
|
||||
})
|
||||
<ScrollAreaPrimitive.Viewport
|
||||
ref={mergeRefs([viewportRef, scrollerRef])}
|
||||
className={cn(
|
||||
// Setting `block` to fix issues with radix `ScrollArea` component
|
||||
// https://github.com/radix-ui/primitives/issues/926#issuecomment-1015279283
|
||||
'flex h-full w-full rounded-[inherit] *:!block *:flex-grow',
|
||||
orientation === 'vertical' && 'flex-col',
|
||||
scrollerClass,
|
||||
)}
|
||||
>
|
||||
{children}
|
||||
</ScrollAreaPrimitive.Viewport>
|
||||
<ScrollBar dialogInset={dialogInset} scrollbarClass={scrollbarClass} orientation={orientation} />
|
||||
<ScrollAreaPrimitive.Corner />
|
||||
</ScrollAreaPrimitive.Root>
|
||||
)
|
||||
},
|
||||
)
|
||||
ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName
|
||||
|
||||
const ScrollBar = React.forwardRef<
|
||||
React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
|
||||
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar> & {
|
||||
dialogInset?: boolean
|
||||
scrollbarClass?: string
|
||||
}
|
||||
>(({className, dialogInset, orientation = 'vertical', ...props}, ref) => (
|
||||
>(({className, dialogInset, scrollbarClass, orientation = 'vertical', ...props}, ref) => (
|
||||
<ScrollAreaPrimitive.ScrollAreaScrollbar
|
||||
ref={ref}
|
||||
orientation={orientation}
|
||||
@@ -53,6 +58,7 @@ const ScrollBar = React.forwardRef<
|
||||
orientation === 'vertical' && dialogInset && 'my-5',
|
||||
orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent p-[3px]',
|
||||
orientation === 'horizontal' && dialogInset && 'mx-5',
|
||||
scrollbarClass,
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
|
||||
@@ -79,6 +79,13 @@ export type AppStateOrLoading = 'loading' | AppState
|
||||
|
||||
export type UserAppWithoutError = Exclude<RouterOutput['apps']['list'][number], {id: string; error: string}>
|
||||
|
||||
// Omitting `active` because we get the connection status from `WifiStatus` since it's more detailed and
|
||||
// don't wanna get confused on the frontend with two different ways of getting the connection status
|
||||
export type WifiNetwork = Omit<RouterOutput['wifi']['networks'][number], 'active'>
|
||||
export type WifiStatus = Exclude<RouterOutput['wifi']['connected'], undefined>['status']
|
||||
// `loading` is not returned by the backend, but is used in the frontend
|
||||
export type WifiStatusUi = WifiStatus | 'loading'
|
||||
|
||||
// ---
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import {formatDistance, Locale} from 'date-fns'
|
||||
import {formatDistanceStrict, Locale} from 'date-fns'
|
||||
import {de, enUS, es, fr, it, ja, nl, pt} from 'date-fns/locale'
|
||||
|
||||
import {UNKNOWN} from '@/constants'
|
||||
@@ -21,5 +21,11 @@ const langCodeToDateLocale: Record<SupportedLanguageCode, Locale> = {
|
||||
|
||||
export function duration(seconds: number | undefined, languageCode: SupportedLanguageCode) {
|
||||
if (seconds === undefined) return UNKNOWN()
|
||||
return formatDistance(0, seconds * 1000, {includeSeconds: true, locale: langCodeToDateLocale[languageCode]})
|
||||
|
||||
// if duration is more than 7 days, then force
|
||||
// to show duration in days instead of months
|
||||
if (seconds > 7 * 24 * 60 * 60) {
|
||||
return formatDistanceStrict(0, seconds * 1000, {unit: 'day', locale: langCodeToDateLocale[languageCode]})
|
||||
}
|
||||
return formatDistanceStrict(0, seconds * 1000, {locale: langCodeToDateLocale[languageCode]})
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import {RouterOutput} from '@/trpc/trpc'
|
||||
import {CpuType, TEMP_THRESHOLDS} from '@/utils/temperature'
|
||||
|
||||
export function trpcDiskToLocal(data?: RouterOutput['system']['diskUsage']) {
|
||||
export function trpcDiskToLocal(
|
||||
data?: RouterOutput['system']['diskUsage'] | RouterOutput['system']['systemDiskUsage'],
|
||||
) {
|
||||
if (data === undefined) return undefined
|
||||
|
||||
const used = data?.totalUsed
|
||||
@@ -15,7 +16,9 @@ export function trpcDiskToLocal(data?: RouterOutput['system']['diskUsage']) {
|
||||
}
|
||||
}
|
||||
|
||||
export function trpcMemoryToLocal(data?: RouterOutput['system']['memoryUsage']) {
|
||||
export function trpcMemoryToLocal(
|
||||
data?: RouterOutput['system']['memoryUsage'] | RouterOutput['system']['systemMemoryUsage'],
|
||||
) {
|
||||
if (data === undefined) return undefined
|
||||
|
||||
const used = data?.totalUsed
|
||||
@@ -28,15 +31,15 @@ export function trpcMemoryToLocal(data?: RouterOutput['system']['memoryUsage'])
|
||||
}
|
||||
}
|
||||
|
||||
export function isTrpcDiskFull(data?: RouterOutput['system']['diskUsage']) {
|
||||
export function isTrpcDiskFull(data?: RouterOutput['system']['systemDiskUsage']) {
|
||||
return isDiskFull(trpcDiskToLocal(data)?.available)
|
||||
}
|
||||
|
||||
export function isTrpcDiskLow(data?: RouterOutput['system']['diskUsage']) {
|
||||
export function isTrpcDiskLow(data?: RouterOutput['system']['systemDiskUsage']) {
|
||||
return isDiskLow(trpcDiskToLocal(data)?.available)
|
||||
}
|
||||
|
||||
export function isTrpcMemoryLow(data?: RouterOutput['system']['memoryUsage']) {
|
||||
export function isTrpcMemoryLow(data?: RouterOutput['system']['systemMemoryUsage']) {
|
||||
return isMemoryLow({size: data?.size, used: data?.totalUsed})
|
||||
}
|
||||
|
||||
@@ -56,14 +59,9 @@ export function isDiskFull(remaining?: number) {
|
||||
return remaining < 100000000
|
||||
}
|
||||
|
||||
export function isCpuTooCold(cpuType: CpuType, cpuTemperature?: number) {
|
||||
if (cpuTemperature === undefined) return false
|
||||
return cpuTemperature < TEMP_THRESHOLDS[cpuType].cold
|
||||
}
|
||||
|
||||
export function isCpuTooHot(cpuType: CpuType, cpuTemperature?: number) {
|
||||
if (cpuTemperature === undefined) return false
|
||||
return cpuTemperature > TEMP_THRESHOLDS[cpuType].hot
|
||||
export function isCpuTooHot(warning?: string) {
|
||||
if (warning === undefined) return false
|
||||
return warning === 'hot'
|
||||
}
|
||||
|
||||
export function isMemoryLow({size, used}: {size?: number; used?: number}) {
|
||||
|
||||
@@ -1,73 +1,33 @@
|
||||
import {LOADING_DASH} from '@/constants'
|
||||
import {t} from '@/utils/i18n'
|
||||
|
||||
type Thresholds = {
|
||||
cold: number
|
||||
throttle: number
|
||||
hot: number
|
||||
}
|
||||
|
||||
/**
|
||||
* The `nuc` type is for Intel NUCs, and the `pi` type is for Raspberry Pis.
|
||||
* The Umbrel Home is a `nuc`, and most custom Umbrel setups would be that.
|
||||
* Thresholds are in degrees Celsius.
|
||||
* https://discord.com/channels/936693236339183716/1212119508521590915/1212309347099484191
|
||||
*/
|
||||
export const cpuTypes = ['pi', 'nuc'] as const
|
||||
|
||||
export type CpuType = (typeof cpuTypes)[number]
|
||||
|
||||
export const TEMP_THRESHOLDS = {
|
||||
pi: {
|
||||
cold: -40,
|
||||
throttle: 80,
|
||||
hot: 85,
|
||||
},
|
||||
nuc: {
|
||||
cold: -40,
|
||||
throttle: 100,
|
||||
hot: 105,
|
||||
},
|
||||
} as const satisfies Record<CpuType, Thresholds>
|
||||
|
||||
export function celciusToFahrenheit(tempInCelcius?: number) {
|
||||
if (tempInCelcius === undefined) return undefined
|
||||
return Math.round((tempInCelcius * 9) / 5 + 32)
|
||||
}
|
||||
|
||||
export function tempToColor(cpuType: CpuType, tempInCelcius?: number) {
|
||||
const thresholds = TEMP_THRESHOLDS[cpuType]
|
||||
if (tempInCelcius === undefined) return '#CCCCCC'
|
||||
export function tempWarningToColor(warning?: string) {
|
||||
if (warning === undefined) return '#CCCCCC'
|
||||
|
||||
if (tempInCelcius < thresholds.cold) {
|
||||
return '#6BF1E9'
|
||||
}
|
||||
if (tempInCelcius >= thresholds.cold && tempInCelcius <= thresholds.throttle) {
|
||||
return '#96F16B'
|
||||
}
|
||||
if (tempInCelcius > thresholds.throttle && tempInCelcius <= thresholds.hot) {
|
||||
if (warning === 'warm') {
|
||||
return '#E6E953'
|
||||
}
|
||||
if (tempInCelcius > thresholds.hot) {
|
||||
if (warning === 'hot') {
|
||||
return '#F45252'
|
||||
}
|
||||
return '#CCCCCC'
|
||||
return '#96F16B'
|
||||
}
|
||||
|
||||
export function tempToMessage(cpuType: CpuType, tempInCelcius?: number) {
|
||||
if (tempInCelcius === undefined) return LOADING_DASH
|
||||
export function tempWarningToMessage(warning?: string) {
|
||||
if (warning === undefined) return LOADING_DASH
|
||||
|
||||
const thresholds = TEMP_THRESHOLDS[cpuType]
|
||||
if (tempInCelcius < thresholds.cold) {
|
||||
return t('temp.too-cold')
|
||||
}
|
||||
if (tempInCelcius >= thresholds.cold && tempInCelcius <= thresholds.throttle) {
|
||||
if (warning === 'normal') {
|
||||
return t('temp.normal')
|
||||
}
|
||||
if (tempInCelcius > thresholds.throttle && tempInCelcius <= thresholds.hot) {
|
||||
if (warning === 'warm') {
|
||||
return t('temp.warm')
|
||||
}
|
||||
if (tempInCelcius > thresholds.hot) {
|
||||
if (warning === 'hot') {
|
||||
return t('temp.dangerously-hot')
|
||||
}
|
||||
return t('temp.normal')
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
export function signalToBars(signal: number) {
|
||||
const bars = Math.ceil(signal / 25)
|
||||
return bars
|
||||
}
|
||||
@@ -15,6 +15,7 @@ import SheetStory from '@stories/routes/stories/sheet'
|
||||
import TailwindStory from '@stories/routes/stories/tailwind'
|
||||
import Trpc from '@stories/routes/stories/trpc'
|
||||
import WidgetsStory from '@stories/routes/stories/widgets'
|
||||
import WifiStory from '@stories/routes/stories/wifi'
|
||||
|
||||
import {EnsureLoggedIn} from '@/modules/auth/ensure-logged-in'
|
||||
import {AvailableAppsProvider} from '@/providers/available-apps'
|
||||
@@ -96,6 +97,11 @@ export const storyLinks: StoryRoute[] = [
|
||||
</EnsureLoggedIn>
|
||||
),
|
||||
},
|
||||
{
|
||||
name: 'Wifi',
|
||||
path: '/wifi',
|
||||
Component: WifiStory,
|
||||
},
|
||||
{
|
||||
name: 'Markdown',
|
||||
path: '/markdown',
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import {ReactQueryDevtools} from '@tanstack/react-query-devtools'
|
||||
import {ReactNode, useState} from 'react'
|
||||
import {RouterProvider} from 'react-router-dom'
|
||||
|
||||
@@ -15,6 +16,7 @@ init(
|
||||
<TrpcProvider>
|
||||
<RouterProvider router={storiesRouter} />
|
||||
<TrpcMarker />
|
||||
<ReactQueryDevtools initialIsOpen={false} position='bottom-right' />
|
||||
</TrpcProvider>
|
||||
</SimpleWallpaperProvider>,
|
||||
)
|
||||
|
||||
@@ -18,6 +18,7 @@ import {TorIcon2} from '@/assets/tor-icon2'
|
||||
import {Alert, ErrorAlert} from '@/components/ui/alert'
|
||||
import {sizeMap} from '@/components/ui/icon'
|
||||
import {IconButton} from '@/components/ui/icon-button'
|
||||
import {listItemClass} from '@/components/ui/list'
|
||||
import {Loading} from '@/components/ui/loading'
|
||||
import {NumberedList, NumberedListItem} from '@/components/ui/numbered-list'
|
||||
import {SegmentedControl} from '@/components/ui/segmented-control'
|
||||
@@ -115,6 +116,15 @@ export default function Stories() {
|
||||
funny that they couldn't help but laugh. And once they started laughing, they couldn't stop.
|
||||
</div>
|
||||
</ScrollArea>
|
||||
<ScrollArea className='h-[200px] w-[350px] rounded-12 bg-white/6' scrollbarClass='my-3'>
|
||||
<div className='divide-y divide-white/6 '>
|
||||
{Array.from({length: 20}).map((_, i) => (
|
||||
<div key={i} className={listItemClass}>
|
||||
hello {i}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</ScrollArea>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import {H1, H2} from '@stories/components'
|
||||
import {H1, H2, H3} from '@stories/components'
|
||||
|
||||
import {Button} from '@/shadcn-components/ui/button'
|
||||
import {Input, InputError, PasswordInput} from '@/shadcn-components/ui/input'
|
||||
import {tw} from '@/utils/tw'
|
||||
|
||||
@@ -7,12 +8,30 @@ export default function InputExamples() {
|
||||
return (
|
||||
<div className='flex flex-col gap-4 bg-neutral-800 p-4'>
|
||||
<H1>Input</H1>
|
||||
<H2>Default</H2>
|
||||
<H2>sizeVariant</H2>
|
||||
<H3>default</H3>
|
||||
<Input placeholder='Name' />
|
||||
<H3>short</H3>
|
||||
<div className='flex items-center gap-2'>
|
||||
<Input sizeVariant={'short'} placeholder='Name' />
|
||||
<Button size='input-short'>Button</Button>
|
||||
<Button variant='primary' size='input-short'>
|
||||
Button
|
||||
</Button>
|
||||
</div>
|
||||
<H3>short-square</H3>
|
||||
<div className='flex items-center gap-2'>
|
||||
<Input sizeVariant={'short-square'} placeholder='Name' />
|
||||
<Button size='md-squared'>Button</Button>
|
||||
<Button variant='primary' size='md-squared'>
|
||||
Button
|
||||
</Button>
|
||||
</div>
|
||||
<H2>Disabled</H2>
|
||||
<Input placeholder='Name' disabled />
|
||||
<H2>Test</H2>
|
||||
<H2>Password</H2>
|
||||
<PasswordInput />
|
||||
<H2>Input error</H2>
|
||||
<InputErrorExample />
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -12,10 +12,9 @@ import {DeviceInfoContent, HostEnvironmentIcon} from '@/routes/settings/_compone
|
||||
import {ProgressStatCardContent} from '@/routes/settings/_components/progress-card-content'
|
||||
import {Button} from '@/shadcn-components/ui/button'
|
||||
import {Separator} from '@/shadcn-components/ui/separator'
|
||||
import {CpuType, cpuTypes, TEMP_THRESHOLDS} from '@/utils/temperature'
|
||||
|
||||
export default function SettingsStory() {
|
||||
const [cpuType, setCpuType] = useState<CpuType>('pi')
|
||||
const [cpuWarning, setCpuWarning] = useState<string>('normal')
|
||||
|
||||
const wId = shuffle(wallpaperIds)[0]
|
||||
|
||||
@@ -110,9 +109,9 @@ export default function SettingsStory() {
|
||||
<SegmentedControl
|
||||
size='lg'
|
||||
// variant={variant}
|
||||
tabs={cpuTypes.map((type) => ({id: type, label: type.toUpperCase()}))}
|
||||
value={cpuType}
|
||||
onValueChange={setCpuType}
|
||||
tabs={['normal', 'warm', 'hot'].map((warning) => ({id: warning, label: warning.toUpperCase()}))}
|
||||
value={cpuWarning}
|
||||
onValueChange={setCpuWarning}
|
||||
/>
|
||||
<Button
|
||||
onClick={() => {
|
||||
@@ -125,70 +124,34 @@ export default function SettingsStory() {
|
||||
<H3>Extreme</H3>
|
||||
<div className='w-[300px] resize-x overflow-auto bg-red-500/10 p-4'>
|
||||
<Card>
|
||||
<CpuTempCardContent cpuType={cpuType} tempInCelcius={-999999} />
|
||||
<CpuTempCardContent warning={cpuWarning} tempInCelcius={-999999} />
|
||||
</Card>
|
||||
</div>
|
||||
<div className='w-[300px] resize-x overflow-auto bg-red-500/10 p-4'>
|
||||
<Card>
|
||||
<CpuTempCardContent cpuType={cpuType} tempInCelcius={999999} />
|
||||
<CpuTempCardContent warning={cpuWarning} tempInCelcius={999999} />
|
||||
</Card>
|
||||
</div>
|
||||
<H3>undefined</H3>
|
||||
<Card>
|
||||
<CpuTempCardContent cpuType={cpuType} />
|
||||
<CpuTempCardContent warning={cpuWarning} />
|
||||
</Card>
|
||||
<H3>NaN</H3>
|
||||
<Card>
|
||||
<CpuTempCardContent cpuType={cpuType} tempInCelcius={NaN} defaultUnit='c' />
|
||||
<CpuTempCardContent warning={cpuWarning} tempInCelcius={NaN} defaultUnit='c' />
|
||||
</Card>
|
||||
<H3>Infinity</H3>
|
||||
<Card>
|
||||
<CpuTempCardContent cpuType={cpuType} tempInCelcius={Infinity} defaultUnit='c' />
|
||||
<CpuTempCardContent warning={cpuWarning} tempInCelcius={Infinity} defaultUnit='c' />
|
||||
</Card>
|
||||
<H3>69</H3>
|
||||
<Card>
|
||||
<CpuTempCardContent cpuType={cpuType} tempInCelcius={69} defaultUnit='c' />
|
||||
<CpuTempCardContent warning={cpuWarning} tempInCelcius={69} defaultUnit='c' />
|
||||
</Card>
|
||||
<Card>
|
||||
<CpuTempCardContent cpuType={cpuType} tempInCelcius={20.5} defaultUnit='f' />
|
||||
<CpuTempCardContent warning={cpuWarning} tempInCelcius={20.5} defaultUnit='f' />
|
||||
</Card>
|
||||
<Separator />
|
||||
<TempThresholds />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export function TempThresholds() {
|
||||
return (
|
||||
<div className='flex flex-row gap-2'>
|
||||
{cpuTypes.map((type) => (
|
||||
<div key={type} className='space-y-2'>
|
||||
<H3>{type}</H3>
|
||||
{tempThresholds(type).map((temp) => (
|
||||
<Card key={temp}>
|
||||
<CpuTempCardContent cpuType={type} tempInCelcius={temp} />
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function tempThresholds(cpuType: CpuType) {
|
||||
const TEMP_TOO_COLD = TEMP_THRESHOLDS[cpuType].cold
|
||||
const TEMP_NORMAL_MIN = TEMP_THRESHOLDS[cpuType].cold
|
||||
const TEMP_NORMAL_MAX = TEMP_THRESHOLDS[cpuType].throttle
|
||||
const TEMP_THROTTLE = TEMP_THRESHOLDS[cpuType].throttle
|
||||
const TEMP_TOO_HOT = TEMP_THRESHOLDS[cpuType].hot
|
||||
|
||||
return [
|
||||
TEMP_TOO_COLD - 1,
|
||||
// TEMP_TOO_COLD,
|
||||
TEMP_NORMAL_MIN,
|
||||
TEMP_NORMAL_MAX,
|
||||
TEMP_THROTTLE + 1,
|
||||
TEMP_TOO_HOT,
|
||||
TEMP_TOO_HOT + 1,
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
import {LockIcon, WifiIcon, WifiIcon2, WifiIcon2Circled} from '@/modules/wifi/icon'
|
||||
import {Connect, wifiListItemClass} from '@/modules/wifi/wifi-drawer-or-dialog'
|
||||
import {WifiListItemContent} from '@/modules/wifi/wifi-item-content'
|
||||
import {cn} from '@/shadcn-lib/utils'
|
||||
import {WifiNetwork} from '@/trpc/trpc'
|
||||
import {signalToBars} from '@/utils/wifi'
|
||||
|
||||
const network: WifiNetwork = {
|
||||
ssid: 'My Wifi',
|
||||
signal: 100,
|
||||
authenticated: true,
|
||||
}
|
||||
|
||||
export default function WifiStory() {
|
||||
return (
|
||||
<div className='flex flex-col gap-2'>
|
||||
<div className='flex text-green-400'>
|
||||
<LockIcon />
|
||||
<div className='opacity-50'>
|
||||
<LockIcon />
|
||||
</div>
|
||||
</div>
|
||||
strength (bars):
|
||||
<div className='flex text-green-400'>
|
||||
{[0, 1, 2, 3, 4].map((bars) => (
|
||||
<div key={bars}>
|
||||
<WifiIcon className='size-5' bars={bars} />
|
||||
<WifiIcon2 className='size-5' bars={bars} />
|
||||
<span>{bars}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
strength (signal):
|
||||
<div className='flex'>
|
||||
{[0, 1, 25, 26, 50, 51, 75, 76, 100].map((signal) => (
|
||||
<div key={signal} className='w-[40px]'>
|
||||
<WifiIcon2Circled bars={signalToBars(signal)} />
|
||||
<span>{signal}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div className='flex'>
|
||||
{[0, 1, 25, 26, 50, 51, 75, 76, 100].map((signal) => (
|
||||
<div key={signal} className='w-[40px]'>
|
||||
<WifiIcon2Circled bars={signalToBars(signal)} isConnected />
|
||||
<span>{signal}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div
|
||||
className={cn(
|
||||
'grid size-6 shrink-0 place-items-center rounded-full border border-white/20 bg-white/10 bg-white/6',
|
||||
'bg-brand',
|
||||
)}
|
||||
>
|
||||
<WifiIcon2 className='size-5' bars={4} />
|
||||
</div>
|
||||
<div className='overflow-hidden rounded-12 bg-white/6'>
|
||||
<div className={wifiListItemClass}>
|
||||
<WifiListItemContent network={network} status='connected' />
|
||||
</div>
|
||||
<div className={wifiListItemClass}>
|
||||
<WifiListItemContent network={network} status='disconnected' />
|
||||
</div>
|
||||
<div className={wifiListItemClass}>
|
||||
<WifiListItemContent network={network} status='loading' />
|
||||
</div>
|
||||
<div className={wifiListItemClass}>
|
||||
<WifiListItemContent network={network} error='Network not found' />
|
||||
</div>
|
||||
<b>Password error for authenticated wifi</b>
|
||||
<div className={wifiListItemClass}>
|
||||
<WifiListItemContent
|
||||
network={{
|
||||
...network,
|
||||
ssid: 'Voluptate incididunt commodo elit veniam nostrud ipsum minim qui aliqua. Velit minim exercitation laboris consectetur nulla elit id mollit sit velit ea. Sunt sunt commodo incididunt officia esse mollit consequat in ad nulla esse laboris. Laboris cupidatat incididunt duis cupidatat proident deserunt labore. Sint est veniam et aliqua eiusmod cillum ut ex Lorem tempor do ad dolore.',
|
||||
}}
|
||||
status='disconnected'
|
||||
/>
|
||||
<Connect
|
||||
network={network}
|
||||
status='connected'
|
||||
onConnect={({ssid, password}) => alert(`ssid:${ssid} pw:${password}`)}
|
||||
error='Invalid password'
|
||||
/>
|
||||
</div>
|
||||
<b>Any other error for authenticated wifi</b>
|
||||
<div className={wifiListItemClass}>
|
||||
<WifiListItemContent
|
||||
network={{
|
||||
...network,
|
||||
ssid: 'Voluptate incididunt commodo elit veniam nostrud ipsum minim qui aliqua. Velit minim exercitation laboris consectetur nulla elit id mollit sit velit ea. Sunt sunt commodo incididunt officia esse mollit consequat in ad nulla esse laboris. Laboris cupidatat incididunt duis cupidatat proident deserunt labore. Sint est veniam et aliqua eiusmod cillum ut ex Lorem tempor do ad dolore.',
|
||||
}}
|
||||
status='disconnected'
|
||||
error='Network not found'
|
||||
/>
|
||||
<Connect
|
||||
network={network}
|
||||
status='connected'
|
||||
onConnect={({ssid, password}) => alert(`ssid:${ssid} pw:${password}`)}
|
||||
/>
|
||||
</div>
|
||||
<b>Any error for public wifi</b>
|
||||
<div className={wifiListItemClass}>
|
||||
<WifiListItemContent
|
||||
network={{
|
||||
...network,
|
||||
ssid: 'Unauthenticated',
|
||||
authenticated: false,
|
||||
}}
|
||||
error='Network not found'
|
||||
/>
|
||||
<Connect
|
||||
network={{...network, ssid: 'Unauthenticated', authenticated: false}}
|
||||
error='Hello'
|
||||
onConnect={({ssid, password}) => alert(`ssid:${ssid} pw:${password}`)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className='pb-10' />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -3,6 +3,7 @@ import tailwindTypography from '@tailwindcss/typography'
|
||||
import {mapValues} from 'remeda'
|
||||
import tailwindCssAnimate from 'tailwindcss-animate'
|
||||
import defaultTheme from 'tailwindcss/defaultTheme'
|
||||
import {PluginAPI} from 'tailwindcss/types/config'
|
||||
|
||||
import {screens} from './src/utils/tw'
|
||||
|
||||
@@ -178,5 +179,16 @@ export default {
|
||||
}),
|
||||
},
|
||||
},
|
||||
plugins: [tailwindCssAnimate, tailwindContainerQueries, tailwindTypography],
|
||||
plugins: [tailwindCssAnimate, tailwindContainerQueries, tailwindTypography, utilPlugin],
|
||||
}
|
||||
|
||||
function utilPlugin(plugin: PluginAPI) {
|
||||
plugin.addUtilities({
|
||||
'.absolute-center': {
|
||||
position: 'absolute',
|
||||
left: '50%',
|
||||
top: '50%',
|
||||
transform: 'translate(-50%, -50%)',
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
import fs from 'fs'
|
||||
import path from 'path'
|
||||
import process from 'process'
|
||||
import fg from 'fast-glob'
|
||||
import OpenAI from 'openai'
|
||||
|
||||
const exampleTranslationKeys = [
|
||||
'account-description',
|
||||
'wallpaper-description',
|
||||
'2fa-description',
|
||||
'tor-description',
|
||||
'migration-assistant',
|
||||
'migration-assistant-description',
|
||||
'language',
|
||||
'language-description',
|
||||
'app-store.description',
|
||||
'migrate',
|
||||
'change-name',
|
||||
'change-password',
|
||||
'onboarding.account-created.youre-all-set-name',
|
||||
]
|
||||
|
||||
const localesDirectory = path.join(process.cwd(), 'public', 'locales')
|
||||
const englishReferenceFilePath = path.join(localesDirectory, 'en.json')
|
||||
|
||||
const languageMapping = {
|
||||
en: 'English',
|
||||
de: 'German',
|
||||
es: 'Spanish',
|
||||
fr: 'French',
|
||||
it: 'Italian',
|
||||
ja: 'Japanese',
|
||||
nl: 'Dutch',
|
||||
pt: 'Portuguese',
|
||||
tr: 'Turkish',
|
||||
uk: 'Ukrainian',
|
||||
hu: 'Hungarian',
|
||||
}
|
||||
|
||||
// Generates translations
|
||||
async function generateTranslation(englishReferenceContent, textToTranslate, targetLanguage, existingLanguageContent) {
|
||||
const openai = new OpenAI({apiKey: process.env.TRANSLATIONS_OPENAI_API_KEY})
|
||||
const model = process.env.TRANSLATIONS_OPENAI_MODEL
|
||||
const systemPromptTemplate = process.env.TRANSLATIONS_SYSTEM_PROMPT
|
||||
const userPromptTemplate = process.env.TRANSLATIONS_USER_PROMPT
|
||||
|
||||
const inputExample = exampleTranslationKeys.map((key) => `'${key}': '${englishReferenceContent[key]}'`).join(', ')
|
||||
const outputExample = exampleTranslationKeys.map((key) => `'${key}': '${existingLanguageContent[key]}'`).join(', ')
|
||||
const systemPrompt = systemPromptTemplate
|
||||
.replace('replace_input_example', inputExample)
|
||||
.replace('replace_output_example', outputExample)
|
||||
.replace('replace_target_language', languageMapping[targetLanguage])
|
||||
const userPrompt = userPromptTemplate
|
||||
.replace('replace_target_language', languageMapping[targetLanguage])
|
||||
.replace('replace_target_language', languageMapping[targetLanguage])
|
||||
.replace('replace_text_to_translate', JSON.stringify(textToTranslate))
|
||||
|
||||
const completion = await openai.chat.completions.create({
|
||||
messages: [
|
||||
{role: 'system', content: systemPrompt},
|
||||
{role: 'user', content: userPrompt},
|
||||
],
|
||||
model,
|
||||
response_format: {type: 'json_object'},
|
||||
})
|
||||
|
||||
return completion.choices[0].message.content
|
||||
}
|
||||
|
||||
async function removeUnusedTranslations(englishReferenceContent) {
|
||||
const tsxFiles = await fg([
|
||||
'src/**/*.tsx',
|
||||
'src/**/*.ts',
|
||||
'stories/src/**/*.tsx',
|
||||
'stories/src/**/*.ts',
|
||||
'app-auth/src/**/*.tsx',
|
||||
'app-auth/src/**/*.ts',
|
||||
])
|
||||
const unusedKeys = []
|
||||
|
||||
for (const key in englishReferenceContent) {
|
||||
let isKeyUsed = false
|
||||
for (const file of tsxFiles) {
|
||||
const content = fs.readFileSync(file, 'utf8')
|
||||
// Checks for t('key'), i18nKey='key', t("key"), i18nKey="key"
|
||||
let keyToTest = key
|
||||
|
||||
// https://www.i18next.com/translation-function/plurals
|
||||
if (key.endsWith('_one')) {
|
||||
keyToTest = key.slice(0, -4)
|
||||
} else if (key.endsWith('_other')) {
|
||||
keyToTest = key.slice(0, -6)
|
||||
}
|
||||
const keyPatterns = [`t('${keyToTest}'`, `i18nKey='${keyToTest}'`, `t("${keyToTest}"`, `i18nKey="${keyToTest}"`]
|
||||
if (keyPatterns.some((pattern) => content.includes(pattern))) {
|
||||
isKeyUsed = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if (!isKeyUsed) {
|
||||
unusedKeys.push(key)
|
||||
}
|
||||
}
|
||||
// Delete unused keys from englishReferenceContent
|
||||
for (const key of unusedKeys) {
|
||||
console.log(`Removing unused translation key: '${key}'`)
|
||||
delete englishReferenceContent[key]
|
||||
}
|
||||
// Save the updated englishReferenceContent to file
|
||||
fs.writeFileSync(englishReferenceFilePath, JSON.stringify(englishReferenceContent, null, 2), 'utf8')
|
||||
}
|
||||
|
||||
// Check for missing or redundant translations in locale files and generates them if needed
|
||||
async function generateAndWriteTranslations(englishReferenceContent, localeFile) {
|
||||
const localeFilePath = path.join(localesDirectory, localeFile)
|
||||
let localeFileContent = JSON.parse(fs.readFileSync(localeFilePath, 'utf8'))
|
||||
const targetLanguage = localeFile.split('.')[0]
|
||||
|
||||
// Remove keys in which no longer exist in en.json
|
||||
localeFileContent = Object.fromEntries(
|
||||
Object.entries(localeFileContent).filter(([key]) => key in englishReferenceContent),
|
||||
)
|
||||
|
||||
// Check for variable mismatches between English and translated content for each key-value pair
|
||||
for (const [key, value] of Object.entries(englishReferenceContent)) {
|
||||
const variableRegex = /{{\w+}}/g
|
||||
const englishVariables = value.match(variableRegex)
|
||||
const translatedValue = localeFileContent[key]
|
||||
if (translatedValue) {
|
||||
const translatedVariables = translatedValue.match(variableRegex)
|
||||
if (englishVariables && (!translatedVariables || englishVariables.length !== translatedVariables.length)) {
|
||||
console.log(`'${key}' in file '${localeFile}' is missing variable(s), deleting it to regenerate...`)
|
||||
delete localeFileContent[key]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get missing translations
|
||||
const missingTranslations = Object.keys(englishReferenceContent).reduce((missing, key) => {
|
||||
if (!Object.prototype.hasOwnProperty.call(localeFileContent, key)) {
|
||||
console.log(`Missing translation for key '${key}' in file '${localeFile}'`)
|
||||
missing[key] = englishReferenceContent[key]
|
||||
}
|
||||
return missing
|
||||
}, {})
|
||||
|
||||
// Generate translations for missing keys
|
||||
if (Object.keys(missingTranslations).length > 0) {
|
||||
const generatedTranslation = await generateTranslation(
|
||||
englishReferenceContent,
|
||||
missingTranslations,
|
||||
targetLanguage,
|
||||
localeFileContent,
|
||||
)
|
||||
const generatedTranslationJson = JSON.parse(generatedTranslation)
|
||||
localeFileContent = {...localeFileContent, ...generatedTranslationJson}
|
||||
}
|
||||
|
||||
// Sort keys
|
||||
const sortedLocaleContent = Object.keys(localeFileContent)
|
||||
.sort()
|
||||
.reduce((result, key) => {
|
||||
result[key] = localeFileContent[key]
|
||||
return result
|
||||
}, {})
|
||||
|
||||
fs.writeFileSync(localeFilePath, JSON.stringify(sortedLocaleContent, null, 2), 'utf8')
|
||||
}
|
||||
|
||||
async function checkAndGenerateTranslations(englishReferenceContent) {
|
||||
const localeFiles = fs.readdirSync(localesDirectory)
|
||||
const translationPromises = localeFiles.map((localeFile) =>
|
||||
generateAndWriteTranslations(englishReferenceContent, localeFile),
|
||||
)
|
||||
await Promise.all(translationPromises)
|
||||
}
|
||||
|
||||
async function start() {
|
||||
let englishReferenceContent = JSON.parse(fs.readFileSync(englishReferenceFilePath, 'utf8'))
|
||||
await removeUnusedTranslations(englishReferenceContent)
|
||||
// Reload content as ununsed keys might have been removed
|
||||
englishReferenceContent = JSON.parse(fs.readFileSync(englishReferenceFilePath, 'utf8'))
|
||||
checkAndGenerateTranslations(englishReferenceContent)
|
||||
}
|
||||
|
||||
start()
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user