From e5463d24a1eca537ed1c244bafc24ea3893eef11 Mon Sep 17 00:00:00 2001 From: wheaney <42350981+wheaney@users.noreply.github.com> Date: Fri, 12 Jun 2026 13:41:30 -0700 Subject: [PATCH] Migrate to the new ui-gtk submodule --- .gitmodules | 6 +- bin/package_gnome | 28 +- box/ui/breezyboxruntimeenvironment.py | 40 - .../com.xronlinux.BreezyDesktop.gschema.xml | 2 +- ui-gtk | 1 + ui/bin/dev/use_local_ui.sh | 38 - ui/bin/package | 85 -- ui/bin/update_pot_files | 21 - .../com.xronlinux.BreezyDesktop.desktop.in | 8 - .../com.xronlinux.BreezyDesktop.gschema.xml | 293 ------ ...om.xronlinux.BreezyDesktop.metainfo.xml.in | 15 - .../apps/com.xronlinux.BreezyDesktop.svg | 1 - ui/data/icons/meson.build | 7 - ui/data/meson.build | 36 - ui/docker-build/Dockerfile | 26 - ui/docker-build/init.sh | 22 - ui/docker-build/run-build.sh | 22 - ui/lib/pydbus-0.6.0.dist-info/DESCRIPTION.rst | 115 --- ui/lib/pydbus-0.6.0.dist-info/INSTALLER | 1 - ui/lib/pydbus-0.6.0.dist-info/METADATA | 137 --- ui/lib/pydbus-0.6.0.dist-info/RECORD | 45 - ui/lib/pydbus-0.6.0.dist-info/REQUESTED | 0 ui/lib/pydbus-0.6.0.dist-info/WHEEL | 6 - ui/lib/pydbus-0.6.0.dist-info/metadata.json | 1 - ui/lib/pydbus-0.6.0.dist-info/top_level.txt | 1 - ui/lib/pydbus-0.6.0.dist-info/zip-safe | 1 - ui/lib/pydbus/__init__.py | 4 - ui/lib/pydbus/_inspect3.py | 28 - ui/lib/pydbus/auto_names.py | 21 - ui/lib/pydbus/bus.py | 60 -- ui/lib/pydbus/bus_names.py | 97 -- ui/lib/pydbus/exitable.py | 52 - ui/lib/pydbus/generic.py | 105 -- ui/lib/pydbus/identifier.py | 22 - ui/lib/pydbus/method_call_context.py | 34 - ui/lib/pydbus/proxy.py | 123 --- ui/lib/pydbus/proxy_method.py | 91 -- ui/lib/pydbus/proxy_property.py | 31 - ui/lib/pydbus/proxy_signal.py | 66 -- ui/lib/pydbus/publication.py | 42 - ui/lib/pydbus/registration.py | 156 --- ui/lib/pydbus/request_name.py | 29 - ui/lib/pydbus/subscription.py | 53 - ui/lib/pydbus/timeout.py | 15 - ui/meson.build | 18 - ui/modules/PyXRLinuxDriverIPC | 1 - ui/po/LINGUAS | 1 - ui/po/breezydesktop.pot | 717 ------------- ui/po/de.po | 864 ---------------- ui/po/es.po | 857 ---------------- ui/po/fr.po | 867 ---------------- ui/po/it.po | 864 ---------------- ui/po/ja.po | 849 ---------------- ui/po/meson.build | 1 - ui/po/mo/de/LC_MESSAGES/breezydesktop.mo | Bin 14992 -> 0 bytes ui/po/mo/es/LC_MESSAGES/breezydesktop.mo | Bin 14819 -> 0 bytes ui/po/mo/fr/LC_MESSAGES/breezydesktop.mo | Bin 15239 -> 0 bytes ui/po/mo/it/LC_MESSAGES/breezydesktop.mo | Bin 15181 -> 0 bytes ui/po/mo/ja/LC_MESSAGES/breezydesktop.mo | Bin 17314 -> 0 bytes ui/po/mo/pl/LC_MESSAGES/breezydesktop.mo | Bin 467 -> 0 bytes ui/po/mo/pt_BR/LC_MESSAGES/breezydesktop.mo | Bin 14507 -> 0 bytes ui/po/mo/ru/LC_MESSAGES/breezydesktop.mo | Bin 10969 -> 0 bytes ui/po/mo/sv/LC_MESSAGES/breezydesktop.mo | Bin 8997 -> 0 bytes ui/po/mo/uk_UA/LC_MESSAGES/breezydesktop.mo | Bin 10867 -> 0 bytes ui/po/mo/zh_CN/LC_MESSAGES/breezydesktop.mo | Bin 13131 -> 0 bytes ui/po/pl.po | 718 ------------- ui/po/pt_BR.po | 866 ---------------- ui/po/ru.po | 837 ---------------- ui/po/sv.po | 836 --------------- ui/po/uk_UA.po | 834 --------------- ui/po/zh_CN.po | 816 --------------- ui/src/__init__.py | 0 ui/src/breezydesktop.gresource.xml | 20 - ui/src/breezydesktop.in | 56 -- ui/src/configmanager.py | 193 ---- ui/src/connecteddevice.py | 491 --------- ui/src/customresolutiondialog.py | 21 - ui/src/customresolutiondialogcontent.py | 27 - ui/src/displaydistancedialog.py | 22 - ui/src/displaydistancedialogcontent.py | 50 - ui/src/failedverification.py | 5 - ui/src/files.py | 25 - ui/src/gtk/connected-device.ui | 948 ------------------ .../gtk/custom-resolution-dialog-content.ui | 74 -- ui/src/gtk/custom-resolution-dialog.ui | 18 - ui/src/gtk/display-distance-dialog-content.ui | 42 - ui/src/gtk/display-distance-dialog.ui | 17 - ui/src/gtk/failed-verification.ui | 22 - ui/src/gtk/license-dialog-content.ui | 55 - ui/src/gtk/license-dialog.ui | 16 - ui/src/gtk/no-device.ui | 48 - ui/src/gtk/no-driver.ui | 27 - ui/src/gtk/no-extension.ui | 22 - ui/src/gtk/no-license.ui | 33 - ui/src/gtk/shortcut-dialog.ui | 29 - ui/src/gtk/virtual-display-row.ui | 17 - ui/src/gtk/window.ui | 152 --- ui/src/license.py | 2 - ui/src/licensedialog.py | 14 - ui/src/licensedialogcontent.py | 105 -- ui/src/licensefeaturerow.py | 33 - ui/src/licensetierrow.py | 78 -- ui/src/main.py | 131 --- ui/src/meson.build | 73 -- ui/src/nodevice.py | 47 - ui/src/nodriver.py | 5 - ui/src/noextension.py | 5 - ui/src/nolicense.py | 23 - ui/src/runtime.py | 63 -- ui/src/runtimeenvironment.py | 169 ---- ui/src/runtimes/__init__.py | 7 - ui/src/settingsmanager.py | 16 - ui/src/shortcutdialog.py | 109 -- ui/src/statemanager.py | 177 ---- ui/src/time.py | 22 - ui/src/virtualdisplay.in | 110 -- ui/src/virtualdisplayrow.py | 31 - ui/src/window.py | 112 --- 118 files changed, 10 insertions(+), 15685 deletions(-) delete mode 100644 box/ui/breezyboxruntimeenvironment.py create mode 160000 ui-gtk delete mode 100755 ui/bin/dev/use_local_ui.sh delete mode 100755 ui/bin/package delete mode 100755 ui/bin/update_pot_files delete mode 100644 ui/data/com.xronlinux.BreezyDesktop.desktop.in delete mode 100644 ui/data/com.xronlinux.BreezyDesktop.gschema.xml delete mode 100644 ui/data/com.xronlinux.BreezyDesktop.metainfo.xml.in delete mode 100644 ui/data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg delete mode 100644 ui/data/icons/meson.build delete mode 100644 ui/data/meson.build delete mode 100644 ui/docker-build/Dockerfile delete mode 100755 ui/docker-build/init.sh delete mode 100755 ui/docker-build/run-build.sh delete mode 100644 ui/lib/pydbus-0.6.0.dist-info/DESCRIPTION.rst delete mode 100644 ui/lib/pydbus-0.6.0.dist-info/INSTALLER delete mode 100644 ui/lib/pydbus-0.6.0.dist-info/METADATA delete mode 100644 ui/lib/pydbus-0.6.0.dist-info/RECORD delete mode 100644 ui/lib/pydbus-0.6.0.dist-info/REQUESTED delete mode 100644 ui/lib/pydbus-0.6.0.dist-info/WHEEL delete mode 100644 ui/lib/pydbus-0.6.0.dist-info/metadata.json delete mode 100644 ui/lib/pydbus-0.6.0.dist-info/top_level.txt delete mode 100644 ui/lib/pydbus-0.6.0.dist-info/zip-safe delete mode 100644 ui/lib/pydbus/__init__.py delete mode 100644 ui/lib/pydbus/_inspect3.py delete mode 100644 ui/lib/pydbus/auto_names.py delete mode 100644 ui/lib/pydbus/bus.py delete mode 100644 ui/lib/pydbus/bus_names.py delete mode 100644 ui/lib/pydbus/exitable.py delete mode 100644 ui/lib/pydbus/generic.py delete mode 100644 ui/lib/pydbus/identifier.py delete mode 100644 ui/lib/pydbus/method_call_context.py delete mode 100644 ui/lib/pydbus/proxy.py delete mode 100644 ui/lib/pydbus/proxy_method.py delete mode 100644 ui/lib/pydbus/proxy_property.py delete mode 100644 ui/lib/pydbus/proxy_signal.py delete mode 100644 ui/lib/pydbus/publication.py delete mode 100644 ui/lib/pydbus/registration.py delete mode 100644 ui/lib/pydbus/request_name.py delete mode 100644 ui/lib/pydbus/subscription.py delete mode 100644 ui/lib/pydbus/timeout.py delete mode 100644 ui/meson.build delete mode 160000 ui/modules/PyXRLinuxDriverIPC delete mode 100644 ui/po/LINGUAS delete mode 100644 ui/po/breezydesktop.pot delete mode 100644 ui/po/de.po delete mode 100644 ui/po/es.po delete mode 100644 ui/po/fr.po delete mode 100644 ui/po/it.po delete mode 100644 ui/po/ja.po delete mode 100644 ui/po/meson.build delete mode 100644 ui/po/mo/de/LC_MESSAGES/breezydesktop.mo delete mode 100644 ui/po/mo/es/LC_MESSAGES/breezydesktop.mo delete mode 100644 ui/po/mo/fr/LC_MESSAGES/breezydesktop.mo delete mode 100644 ui/po/mo/it/LC_MESSAGES/breezydesktop.mo delete mode 100644 ui/po/mo/ja/LC_MESSAGES/breezydesktop.mo delete mode 100644 ui/po/mo/pl/LC_MESSAGES/breezydesktop.mo delete mode 100644 ui/po/mo/pt_BR/LC_MESSAGES/breezydesktop.mo delete mode 100644 ui/po/mo/ru/LC_MESSAGES/breezydesktop.mo delete mode 100644 ui/po/mo/sv/LC_MESSAGES/breezydesktop.mo delete mode 100644 ui/po/mo/uk_UA/LC_MESSAGES/breezydesktop.mo delete mode 100644 ui/po/mo/zh_CN/LC_MESSAGES/breezydesktop.mo delete mode 100644 ui/po/pl.po delete mode 100644 ui/po/pt_BR.po delete mode 100644 ui/po/ru.po delete mode 100644 ui/po/sv.po delete mode 100644 ui/po/uk_UA.po delete mode 100644 ui/po/zh_CN.po delete mode 100644 ui/src/__init__.py delete mode 100644 ui/src/breezydesktop.gresource.xml delete mode 100755 ui/src/breezydesktop.in delete mode 100644 ui/src/configmanager.py delete mode 100644 ui/src/connecteddevice.py delete mode 100644 ui/src/customresolutiondialog.py delete mode 100644 ui/src/customresolutiondialogcontent.py delete mode 100644 ui/src/displaydistancedialog.py delete mode 100644 ui/src/displaydistancedialogcontent.py delete mode 100644 ui/src/failedverification.py delete mode 100644 ui/src/files.py delete mode 100644 ui/src/gtk/connected-device.ui delete mode 100644 ui/src/gtk/custom-resolution-dialog-content.ui delete mode 100644 ui/src/gtk/custom-resolution-dialog.ui delete mode 100644 ui/src/gtk/display-distance-dialog-content.ui delete mode 100644 ui/src/gtk/display-distance-dialog.ui delete mode 100644 ui/src/gtk/failed-verification.ui delete mode 100644 ui/src/gtk/license-dialog-content.ui delete mode 100644 ui/src/gtk/license-dialog.ui delete mode 100644 ui/src/gtk/no-device.ui delete mode 100644 ui/src/gtk/no-driver.ui delete mode 100644 ui/src/gtk/no-extension.ui delete mode 100644 ui/src/gtk/no-license.ui delete mode 100644 ui/src/gtk/shortcut-dialog.ui delete mode 100644 ui/src/gtk/virtual-display-row.ui delete mode 100644 ui/src/gtk/window.ui delete mode 100644 ui/src/license.py delete mode 100644 ui/src/licensedialog.py delete mode 100644 ui/src/licensedialogcontent.py delete mode 100644 ui/src/licensefeaturerow.py delete mode 100644 ui/src/licensetierrow.py delete mode 100644 ui/src/main.py delete mode 100644 ui/src/meson.build delete mode 100644 ui/src/nodevice.py delete mode 100644 ui/src/nodriver.py delete mode 100644 ui/src/noextension.py delete mode 100644 ui/src/nolicense.py delete mode 100644 ui/src/runtime.py delete mode 100644 ui/src/runtimeenvironment.py delete mode 100644 ui/src/runtimes/__init__.py delete mode 100644 ui/src/settingsmanager.py delete mode 100644 ui/src/shortcutdialog.py delete mode 100644 ui/src/statemanager.py delete mode 100644 ui/src/time.py delete mode 100755 ui/src/virtualdisplay.in delete mode 100644 ui/src/virtualdisplayrow.py delete mode 100644 ui/src/window.py diff --git a/.gitmodules b/.gitmodules index a9ce0e4..574786d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,12 +8,12 @@ [submodule "modules/sombrero"] path = modules/sombrero url = https://github.com/wheaney/sombrero.git -[submodule "ui/modules/PyXRLinuxDriverIPC"] - path = ui/modules/PyXRLinuxDriverIPC - url = https://github.com/wheaney/PyXRLinuxDriverIPC.git [submodule "gnome/src/shared"] path = gnome/src/shared url = git@github.com:wheaney/breezy-desktop-shared-js.git [submodule "kwin/src/qml/shared"] path = kwin/src/qml/shared url = git@github.com:wheaney/breezy-desktop-shared-js.git +[submodule "ui-gtk"] + path = ui-gtk + url = git@github.com:wheaney/breezy-desktop-ui-gtk.git diff --git a/bin/package_gnome b/bin/package_gnome index 54dc930..cfa7b72 100755 --- a/bin/package_gnome +++ b/bin/package_gnome @@ -9,30 +9,12 @@ ARCH=${ARCH:-$(uname -m)} SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) ROOT_DIR=$(realpath $SCRIPT_DIR/..) VULKAN_DIR=$ROOT_DIR/vulkan -UI_DIR=$ROOT_DIR/ui +UI_DIR=$ROOT_DIR/ui-gtk XR_DRIVER_DIR=$ROOT_DIR/modules/XRLinuxDriver -if [ -z "$GNOME_BACKPORT" ]; then - # standard build for GNOME 45 and up - echo "Building Breezy GNOME for $ARCH, GNOME versions 45 and up" - GNOME_DIR=$ROOT_DIR/gnome - BUILD_FILE_NAME=breezyGNOME-$ARCH.tar.gz -else - # special build process for backports - echo "Building Breezy GNOME backport \"$GNOME_BACKPORT\" for $ARCH" - - # strip the prefix "gnome-" from the backport name, if it's there - GNOME_BACKPORT_NAME=${GNOME_BACKPORT#gnome-} - - GNOME_DIR=$ROOT_DIR/gnome/backports/$GNOME_BACKPORT/gnome - UI_DIR=$ROOT_DIR/gnome/backports/$GNOME_BACKPORT/ui - BUILD_FILE_NAME=breezyGNOME-$GNOME_BACKPORT_NAME-$ARCH.tar.gz - rm -rf $GNOME_DIR/build - - pushd $GNOME_DIR - git submodule update --init - popd -fi +echo "Building Breezy GNOME for $ARCH, GNOME versions 45 and up" +GNOME_DIR=$ROOT_DIR/gnome +BUILD_FILE_NAME=breezyGNOME-$ARCH.tar.gz GNOME_BUILD_DIR=$GNOME_DIR/build mkdir -p $GNOME_BUILD_DIR @@ -97,7 +79,7 @@ popd UI_BUILD_ARTIFACT=$UI_DIR/out/breezyUI-$ARCH.tar.gz if [ ! -e "$UI_BUILD_ARTIFACT" ] || [ "$1" == "--rebuild-ui" ] || [ "$1" == "--rebuild-all" ]; then pushd $UI_DIR - RUNTIME_DIR=$GNOME_DIR/ui bin/package $ARCH + bin/package "$ROOT_DIR/VERSION" "$GNOME_DIR/ui" "$ARCH" popd fi tar -xf $UI_BUILD_ARTIFACT -C $PACKAGE_DIR diff --git a/box/ui/breezyboxruntimeenvironment.py b/box/ui/breezyboxruntimeenvironment.py deleted file mode 100644 index 4df6f45..0000000 --- a/box/ui/breezyboxruntimeenvironment.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Breezy Box runtime environment (headless). - -Stub implementation for the headless "Breezy Box" environment. Unlike the GNOME -environment there is no shell extension to install/enable, no verification step, -and no in-app update prompt. The connected-device view is always shown (with a -fallback label when no glasses are connected). - -Virtual-display support is not yet implemented here; flesh out -``_create_virtual_display_manager`` / ``is_virtual_display_supported`` against -the box backend when it exists. - -This module is packaged into the UI's ``runtimes`` subpackage by the box package -flow, so its imports are relative to the installed ``breezydesktop`` package. -""" - -import logging - -from ..runtimeenvironment import RuntimeEnvironment - -logger = logging.getLogger('breezy_ui') - - -class BreezyBoxRuntimeEnvironment(RuntimeEnvironment): - APP_NAMESPACE = 'breezy_box' - - def __init__(self): - super().__init__() - # On the box the effect is always engaged; there's no extension to gate - # it behind. - self._breezy_enabled = True - - # is_installed(), verify(), check_for_update(), enable()/disable() and the - # NullVirtualDisplayManager defaults from RuntimeEnvironment are all - # appropriate for the box stub. - - @property - def shows_no_device_view(self): - # Always show the connected-device view; no_device_label() supplies the - # text shown when no glasses are connected. - return False diff --git a/gnome/src/schemas/com.xronlinux.BreezyDesktop.gschema.xml b/gnome/src/schemas/com.xronlinux.BreezyDesktop.gschema.xml index 399c9da..cb4ea3a 120000 --- a/gnome/src/schemas/com.xronlinux.BreezyDesktop.gschema.xml +++ b/gnome/src/schemas/com.xronlinux.BreezyDesktop.gschema.xml @@ -1 +1 @@ -../../../ui/data/com.xronlinux.BreezyDesktop.gschema.xml \ No newline at end of file +../../../ui-gtk/data/com.xronlinux.BreezyDesktop.gschema.xml \ No newline at end of file diff --git a/ui-gtk b/ui-gtk new file mode 160000 index 0000000..74d9c34 --- /dev/null +++ b/ui-gtk @@ -0,0 +1 @@ +Subproject commit 74d9c34066f2f9b63a381a3baafa3f01d5c1ff5b diff --git a/ui/bin/dev/use_local_ui.sh b/ui/bin/dev/use_local_ui.sh deleted file mode 100755 index c641c6f..0000000 --- a/ui/bin/dev/use_local_ui.sh +++ /dev/null @@ -1,38 +0,0 @@ -USER_HOME=$(realpath ~) -ARCH=$(uname -m) - -# https://stackoverflow.com/a/246128 -SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) - -if [ -z "$XDG_DATA_HOME" ]; then - XDG_DATA_HOME="$USER_HOME/.local/share" -fi - -if [ -z "$XDG_BIN_HOME" ]; then - XDG_BIN_HOME="$USER_HOME/.local/bin" -fi - - -# create temp directory -tmp_dir=$(mktemp -d -t breezy-gnome-XXXXXXXXXX) -pushd $tmp_dir > /dev/null -echo "Created temp directory: ${tmp_dir}" - -echo "Extracting to: ${tmp_dir}/breezy_ui" -tar -xf $SCRIPT_DIR/../../out/breezyUI-${ARCH}.tar.gz - -echo "Installing the Breezy Desktop UI application" -cp -r breezy_ui/data/* $XDG_DATA_HOME -cp -r breezy_ui/bin/* $XDG_BIN_HOME - -# update copied files to use the local XDG paths -ESCAPED_XDG_DATA_HOME=$(printf '%s\n' "$XDG_DATA_HOME" | sed -e 's/[\/&]/\\&/g') -sed -i -e "s/\/usr\/local\/share/$ESCAPED_XDG_DATA_HOME/g" $XDG_BIN_HOME/breezydesktop -sed -i "/Exec/c\Exec=$XDG_BIN_HOME/breezydesktop" $XDG_DATA_HOME/applications/com.xronlinux.BreezyDesktop.desktop - -glib-compile-schemas $XDG_DATA_HOME/glib-2.0/schemas -update-desktop-database $XDG_DATA_HOME/applications -gtk-update-icon-cache - -popd > /dev/null -rm -rf $tmp_dir \ No newline at end of file diff --git a/ui/bin/package b/ui/bin/package deleted file mode 100755 index d5b2fa6..0000000 --- a/ui/bin/package +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env bash - -# exit when any command fails -set -e - -ARCH=${ARCH:-$(uname -m)} -echo "Building Breezy UI for $ARCH" - -# Directory containing the RuntimeEnvironment implementation(s) to bundle. Every -# *.py in here is copied into the UI's runtimes/ package; the first -# RuntimeEnvironment subclass found at startup becomes the active environment. -# Defaults to the reference GNOME implementation so a standalone UI build (e.g. -# local dev) still has a runtime. -RUNTIME_DIR=${RUNTIME_DIR:-$(realpath "$(dirname "$0")/../../gnome/ui")} -echo "Bundling runtime environment from $RUNTIME_DIR" -if [ ! -d "$RUNTIME_DIR" ]; then - echo "Runtime directory $RUNTIME_DIR does not exist" - exit 1 -fi - -BUILD_PATH=build -UI_BUILD_PATH=$BUILD_PATH/ui -PACKAGE_DIR=$BUILD_PATH/breezy_ui -mkdir -p $UI_BUILD_PATH -mkdir -p $PACKAGE_DIR - -meson setup $UI_BUILD_PATH -pushd $UI_BUILD_PATH -meson compile -popd - -# mimick the XDG directory structure in our archive file so setup can just copy the directories and not individual files -PACKAGE_DATA_DIR=$PACKAGE_DIR/data -PACKAGE_BIN_DIR=$PACKAGE_DIR/bin - -# these are all subdirectories of XDG_DATA_HOME -PACKAGE_BREEZY_DIR=$PACKAGE_DATA_DIR/breezydesktop -PACKAGE_BREEZY_SRC_DIR=$PACKAGE_BREEZY_DIR/breezydesktop -PACKAGE_ICONS_DIR=$PACKAGE_DATA_DIR/icons/hicolor -PACKAGE_LOCALE_DIR=$PACKAGE_DATA_DIR/locale -PACKAGE_APPS_DIR=$PACKAGE_DATA_DIR/applications -PACKAGE_SCHEMAS_DIR=$PACKAGE_DATA_DIR/glib-2.0/schemas - -mkdir -p $PACKAGE_BIN_DIR -mkdir -p $PACKAGE_BREEZY_SRC_DIR -mkdir -p $PACKAGE_ICONS_DIR -mkdir -p $PACKAGE_LOCALE_DIR -mkdir -p $PACKAGE_APPS_DIR -mkdir -p $PACKAGE_SCHEMAS_DIR - -cp src/*.py $PACKAGE_BREEZY_SRC_DIR -cp -r lib $PACKAGE_BREEZY_SRC_DIR - -# bundle the runtimes subpackage and the selected runtime implementation(s) -PACKAGE_RUNTIMES_DIR=$PACKAGE_BREEZY_SRC_DIR/runtimes -mkdir -p $PACKAGE_RUNTIMES_DIR -cp src/runtimes/__init__.py $PACKAGE_RUNTIMES_DIR -cp $RUNTIME_DIR/*.py $PACKAGE_RUNTIMES_DIR -cp -L modules/PyXRLinuxDriverIPC/xrdriveripc.py $PACKAGE_BREEZY_SRC_DIR -cp $UI_BUILD_PATH/src/breezydesktop.gresource $PACKAGE_BREEZY_DIR -cp -r po/mo/* $PACKAGE_LOCALE_DIR -cp data/com.xronlinux.BreezyDesktop.gschema.xml $PACKAGE_SCHEMAS_DIR -cp $UI_BUILD_PATH/src/breezydesktop $PACKAGE_BIN_DIR -cp $UI_BUILD_PATH/src/virtualdisplay $PACKAGE_BIN_DIR -cp $UI_BUILD_PATH/data/com.xronlinux.BreezyDesktop.desktop $PACKAGE_APPS_DIR - -mkdir -p $PACKAGE_ICONS_DIR/64x64/apps -mkdir -p $PACKAGE_ICONS_DIR/128x128/apps -mkdir -p $PACKAGE_ICONS_DIR/256x256/apps -mkdir -p $PACKAGE_ICONS_DIR/1024x1024/apps -rsvg-convert data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg -w 64 -h 64 -o $PACKAGE_ICONS_DIR/64x64/apps/com.xronlinux.BreezyDesktop.png -rsvg-convert data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg -w 128 -h 128 -o $PACKAGE_ICONS_DIR/128x128/apps/com.xronlinux.BreezyDesktop.png -rsvg-convert data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg -w 256 -h 256 -o $PACKAGE_ICONS_DIR/256x256/apps/com.xronlinux.BreezyDesktop.png -rsvg-convert data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg -w 1024 -h 1024 -o $PACKAGE_ICONS_DIR/1024x1024/apps/com.xronlinux.BreezyDesktop.png - -pushd $BUILD_PATH - -tar -zcvf breezyUI-$ARCH.tar.gz breezy_ui - -popd - -mkdir -p out -cp $BUILD_PATH/breezyUI-$ARCH.tar.gz out/ - -rm -rf $BUILD_PATH \ No newline at end of file diff --git a/ui/bin/update_pot_files b/ui/bin/update_pot_files deleted file mode 100755 index 962980c..0000000 --- a/ui/bin/update_pot_files +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) - -pushd $SCRIPT_DIR/.. - -xgettext --from-code=UTF-8 -k_ -kN_ -L Python -o po/breezydesktop.pot src/*.py -xgettext --from-code=UTF-8 -k_ -kN_ -j -L Glade -o po/breezydesktop.pot src/gtk/*.ui - -for file in po/*.po; do - lang=${file##*/} - lang=${lang%.po} - - msgmerge --no-fuzzy-matching --update "po/$lang.po" po/breezydesktop.pot - - outdir="po/mo/$lang/LC_MESSAGES" - mkdir -p "$outdir" - msgfmt -o "$outdir/breezydesktop.mo" "$file" -done - -popd \ No newline at end of file diff --git a/ui/data/com.xronlinux.BreezyDesktop.desktop.in b/ui/data/com.xronlinux.BreezyDesktop.desktop.in deleted file mode 100644 index 0cee462..0000000 --- a/ui/data/com.xronlinux.BreezyDesktop.desktop.in +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=Breezy Desktop -Exec=breezydesktop -Icon=com.xronlinux.BreezyDesktop -Terminal=false -Type=Application -Categories=GTK; -StartupNotify=true diff --git a/ui/data/com.xronlinux.BreezyDesktop.gschema.xml b/ui/data/com.xronlinux.BreezyDesktop.gschema.xml deleted file mode 100644 index 7a9fc9a..0000000 --- a/ui/data/com.xronlinux.BreezyDesktop.gschema.xml +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - backslash']]]> - - Toggle the XR Effect on or off - - Shortcut to toggle the XR Effect. - - - - - space']]]> - - Re-center display - - Shortcut to re-center the virtual display. - - - - - Return']]]> - - Trigger change to display distance - - Shortcut to change the display distance. - - - - - 0']]]> - - Toggle follow mode - - Shortcut to toggle follow mode. - - - - - period']]]> - - Move cursor to focused display - - Shortcut to move the cursor to the focused display. - - - - - 1.05 - - Display distance - - How far away the display appears. Farther will look smaller, closer will look larger. - - - - - 15 - - Follow threshold - - When follow mode is enabled: the threshold, in degrees, at which the display will begin to follow - - - - - 0.85 - - Display distance start - - Start distance when using the "change distance" shortcut. - - - - - 1.05 - - Display distance end - - End distance when using the "toggle display distance" shortcut. - - - - - false - - Widescreen mode - - Enable widescreen/SBS mode - - - - - 1.0 - - Display size - - The size of the display - - - - - "cm" - - Measurement units - - Units to display for physical measurements: "cm" or "in" - - - - - 0.0 - - Viewport offset x - - How far to offset the viewport from the target monitor in the x direction - - - - - 0.0 - - Viewport offset y - - How far to offset the viewport from the target monitor in the y direction - - - - - "automatic" - - Monitor wrapping scheme - - How the monitors are wrapped around the viewport - - - - - 0 - - Monitor spacing - - How far apart the monitors are visually (not logically) - - - - - false - - Curved display - - Enable curved display mode - - - - - -1 - - Look-ahead override - - Manually override the look-ahead calculation - - - - - true - - Use optimal monitor configuration - - Automatically set the optimal monitor configuration upon connection - - - - - false - - Headset as primary - - Automatically set the headset as the primary display upon connection - - - - - false - - Headset display as viewport center - - Use the headset display as the reference point for the center of the viewport - - - - - true - - Use highest refresh rate - - Automatically set the highest refresh rate upon connection - - - - - true - - Fast SBS mode switching - - Enable fast SBS mode switching - - - - - false - - Disable anti-aliasing - - Disable anti-aliasing - - - - - true - - Disable physical displays - - Disable physical displays when XR effect is enabled - - - - - true - - Remove virtual displays on disable - - Remove virtual displays when XR effect is disabled - - - - - false - - Legacy follow mode - - Enable legacy follow mode - - - - - false - - Developer mode - - Enable developer mode - - - - - false - - Log debug messages - - Log debug messages - - - - - false - - Debug no device - - Debug no device - - - - - "" - - Custom monitor product - - Custom monitor product - - - - - 0.0 - - Framerate cap - - Framerate cap - - - - diff --git a/ui/data/com.xronlinux.BreezyDesktop.metainfo.xml.in b/ui/data/com.xronlinux.BreezyDesktop.metainfo.xml.in deleted file mode 100644 index b16137d..0000000 --- a/ui/data/com.xronlinux.BreezyDesktop.metainfo.xml.in +++ /dev/null @@ -1,15 +0,0 @@ - - - com.xronlinux.BreezyDesktop.desktop - CC0-1.0 - GPL-3.0-or-later - Breezy Desktop - XR Desktop Control Panel - -

XR Desktop Control Panel

-
- - Office - Development - -
diff --git a/ui/data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg b/ui/data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg deleted file mode 100644 index 45aed09..0000000 --- a/ui/data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/data/icons/meson.build b/ui/data/icons/meson.build deleted file mode 100644 index 919bfad..0000000 --- a/ui/data/icons/meson.build +++ /dev/null @@ -1,7 +0,0 @@ -application_id = 'com.xronlinux.BreezyDesktop' - -scalable_dir = 'hicolor' / 'scalable' / 'apps' -install_data( - scalable_dir / ('@0@.svg').format(application_id), - install_dir: get_option('datadir') / 'icons' / scalable_dir -) diff --git a/ui/data/meson.build b/ui/data/meson.build deleted file mode 100644 index 71c25bd..0000000 --- a/ui/data/meson.build +++ /dev/null @@ -1,36 +0,0 @@ -desktop_file = i18n.merge_file( - input: 'com.xronlinux.BreezyDesktop.desktop.in', - output: 'com.xronlinux.BreezyDesktop.desktop', - type: 'desktop', - po_dir: '../po', - install: true, - install_dir: get_option('datadir') / 'applications' -) - -desktop_utils = find_program('desktop-file-validate', required: false) -if desktop_utils.found() - test('Validate desktop file', desktop_utils, args: [desktop_file]) -endif - -appstream_file = i18n.merge_file( - input: 'com.xronlinux.BreezyDesktop.metainfo.xml.in', - output: 'com.xronlinux.BreezyDesktop.metainfo.xml', - po_dir: '../po', - install: true, - install_dir: get_option('datadir') / 'metainfo' -) - -appstreamcli = find_program('appstreamcli', required: false, disabler: true) -test('Validate appstream file', appstreamcli, - args: ['validate', '--no-net', '--explain', appstream_file]) - -install_data('com.xronlinux.BreezyDesktop.gschema.xml', - install_dir: get_option('datadir') / 'glib-2.0' / 'schemas' -) - -compile_schemas = find_program('glib-compile-schemas', required: false, disabler: true) -test('Validate schema file', - compile_schemas, - args: ['--strict', '--dry-run', meson.current_source_dir()]) - -subdir('icons') diff --git a/ui/docker-build/Dockerfile b/ui/docker-build/Dockerfile deleted file mode 100644 index 8074855..0000000 --- a/ui/docker-build/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# To run the build from the package root: -# docker buildx build --platform linux/amd64,linux/arm64 -f ./docker-build/Dockerfile -t "breezy-ui" . -# docker run --rm -t -v ./:/source -v --platform linux/amd64 "breezy-ui:amd64" -# docker run --rm -t -v ./:/source -v --platform linux/arm64 "breezy-ui:arm64" - -FROM --platform=$TARGETPLATFORM debian:latest - -ARG TARGETPLATFORM -RUN echo "Target platform: $TARGETPLATFORM" - -RUN apt-get update && apt-get install -y \ - build-essential \ - meson \ - ninja-build \ - librsvg2-bin \ - libglib2.0-dev \ - libgtk-4-common \ - libgtk-4-bin \ - gtk-update-icon-cache \ - desktop-file-utils \ - gettext \ - appstream - -WORKDIR /source - -CMD bin/package \ No newline at end of file diff --git a/ui/docker-build/init.sh b/ui/docker-build/init.sh deleted file mode 100755 index 461feee..0000000 --- a/ui/docker-build/init.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -# might be needed on a fresh docker setup: -# install qemu and qemu-user-static packages -# sudo docker context rm default - -docker run --privileged --rm tonistiigi/binfmt --install all -sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - -if [[ "$1" == "--init" || ! $(docker buildx inspect breezyuibuilder &>/dev/null; echo $?) -eq 0 ]]; then - # start fresh - echo "Creating new docker builder instance" - docker buildx rm breezyuibuilder 2>/dev/null || true - docker buildx create --use --name breezyuibuilder --driver docker-container --driver-opt image=moby/buildkit:latest -else - echo "Using existing docker builder instance" - docker buildx use breezyuibuilder -fi - -echo "Building docker image" -docker buildx build --platform linux/amd64 -f ./docker-build/Dockerfile -t "breezy-ui:amd64" --load . -docker buildx build --platform linux/arm64 -f ./docker-build/Dockerfile -t "breezy-ui:arm64" --load . \ No newline at end of file diff --git a/ui/docker-build/run-build.sh b/ui/docker-build/run-build.sh deleted file mode 100755 index da29d78..0000000 --- a/ui/docker-build/run-build.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -set -e - -USER=${SUDO_USER:-$USER} -GROUP=$(id -gn $USER) - -# Run containers for each architecture -if [[ "$1" == "x86_64" || -z "$1" ]]; then - sudo rm -rf build/ - docker run --rm -t -v ./:/source --platform linux/amd64 "breezy-ui:amd64" - sudo chown -R $USER:$GROUP out/ -fi - -if [[ "$1" == "aarch64" || -z "$1" ]]; then - sudo rm -rf build/ - docker run --rm -t -v ./:/source --platform linux/arm64 "breezy-ui:arm64" - sudo chown -R $USER:$GROUP out/ -fi - -# build directory structure is all owned by root because of docker, delete it all now -sudo rm -rf build/ \ No newline at end of file diff --git a/ui/lib/pydbus-0.6.0.dist-info/DESCRIPTION.rst b/ui/lib/pydbus-0.6.0.dist-info/DESCRIPTION.rst deleted file mode 100644 index 935d652..0000000 --- a/ui/lib/pydbus-0.6.0.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,115 +0,0 @@ -pydbus -====== -.. image:: https://travis-ci.org/LEW21/pydbus.svg?branch=master - :target: https://travis-ci.org/LEW21/pydbus -.. image:: https://badge.fury.io/py/pydbus.svg - :target: https://badge.fury.io/py/pydbus - -Pythonic DBus library. - -Changelog: https://github.com/LEW21/pydbus/releases - -Requirements ------------- -* Python 2.7+ - but works best on 3.4+ (help system is nicer there) -* PyGI_ (not packaged on pypi, you need to install it from your distribution's repository - it's usually called python-gi, python-gobject or pygobject) -* GLib_ 2.46+ and girepository_ 1.46+ (Ubuntu 16.04+) - for object publication support - -.. _PyGI: https://wiki.gnome.org/Projects/PyGObject -.. _GLib: https://developer.gnome.org/glib/ -.. _girepository: https://wiki.gnome.org/Projects/GObjectIntrospection - -Examples --------- - -Send a desktop notification -~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. code-block:: python - - from pydbus import SessionBus - - bus = SessionBus() - notifications = bus.get('.Notifications') - - notifications.Notify('test', 0, 'dialog-information', "Hello World!", "pydbus works :)", [], {}, 5000) - -List systemd units -~~~~~~~~~~~~~~~~~~ -.. code-block:: python - - from pydbus import SystemBus - - bus = SystemBus() - systemd = bus.get(".systemd1") - - for unit in systemd.ListUnits(): - print(unit) - -Start or stop systemd unit -~~~~~~~~~~~~~~~~~~ -.. code-block:: python - - from pydbus import SystemBus - - bus = SystemBus() - systemd = bus.get(".systemd1") - - job1 = systemd.StopUnit("ssh.service", "fail") - job2 = systemd.StartUnit("ssh.service", "fail") - -Watch for new systemd jobs -~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. code-block:: python - - from pydbus import SystemBus - from gi.repository import GLib - - bus = SystemBus() - systemd = bus.get(".systemd1") - - systemd.JobNew.connect(print) - GLib.MainLoop().run() - - # or - - systemd.onJobNew = print - GLib.MainLoop().run() - -View object's API -~~~~~~~~~~~~~~~~~ -.. code-block:: python - - from pydbus import SessionBus - - bus = SessionBus() - notifications = bus.get('.Notifications') - - help(notifications) - -More examples & documentation -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The Tutorial_ contains more examples and docs. - -.. _Tutorial: https://github.com/LEW21/pydbus/blob/master/doc/tutorial.rst - -Copyright Information ---------------------- - -Copyright (C) 2014, 2015, 2016 Linus Lewandowski - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - diff --git a/ui/lib/pydbus-0.6.0.dist-info/INSTALLER b/ui/lib/pydbus-0.6.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/ui/lib/pydbus-0.6.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/ui/lib/pydbus-0.6.0.dist-info/METADATA b/ui/lib/pydbus-0.6.0.dist-info/METADATA deleted file mode 100644 index 83f96fb..0000000 --- a/ui/lib/pydbus-0.6.0.dist-info/METADATA +++ /dev/null @@ -1,137 +0,0 @@ -Metadata-Version: 2.0 -Name: pydbus -Version: 0.6.0 -Summary: Pythonic DBus library -Home-page: https://github.com/LEW21/pydbus -Author: Linus Lewandowski -Author-email: linus@lew21.net -License: LGPLv2+ -Keywords: dbus -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Natural Language :: English -Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+) -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 - -pydbus -====== -.. image:: https://travis-ci.org/LEW21/pydbus.svg?branch=master - :target: https://travis-ci.org/LEW21/pydbus -.. image:: https://badge.fury.io/py/pydbus.svg - :target: https://badge.fury.io/py/pydbus - -Pythonic DBus library. - -Changelog: https://github.com/LEW21/pydbus/releases - -Requirements ------------- -* Python 2.7+ - but works best on 3.4+ (help system is nicer there) -* PyGI_ (not packaged on pypi, you need to install it from your distribution's repository - it's usually called python-gi, python-gobject or pygobject) -* GLib_ 2.46+ and girepository_ 1.46+ (Ubuntu 16.04+) - for object publication support - -.. _PyGI: https://wiki.gnome.org/Projects/PyGObject -.. _GLib: https://developer.gnome.org/glib/ -.. _girepository: https://wiki.gnome.org/Projects/GObjectIntrospection - -Examples --------- - -Send a desktop notification -~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. code-block:: python - - from pydbus import SessionBus - - bus = SessionBus() - notifications = bus.get('.Notifications') - - notifications.Notify('test', 0, 'dialog-information', "Hello World!", "pydbus works :)", [], {}, 5000) - -List systemd units -~~~~~~~~~~~~~~~~~~ -.. code-block:: python - - from pydbus import SystemBus - - bus = SystemBus() - systemd = bus.get(".systemd1") - - for unit in systemd.ListUnits(): - print(unit) - -Start or stop systemd unit -~~~~~~~~~~~~~~~~~~ -.. code-block:: python - - from pydbus import SystemBus - - bus = SystemBus() - systemd = bus.get(".systemd1") - - job1 = systemd.StopUnit("ssh.service", "fail") - job2 = systemd.StartUnit("ssh.service", "fail") - -Watch for new systemd jobs -~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. code-block:: python - - from pydbus import SystemBus - from gi.repository import GLib - - bus = SystemBus() - systemd = bus.get(".systemd1") - - systemd.JobNew.connect(print) - GLib.MainLoop().run() - - # or - - systemd.onJobNew = print - GLib.MainLoop().run() - -View object's API -~~~~~~~~~~~~~~~~~ -.. code-block:: python - - from pydbus import SessionBus - - bus = SessionBus() - notifications = bus.get('.Notifications') - - help(notifications) - -More examples & documentation -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The Tutorial_ contains more examples and docs. - -.. _Tutorial: https://github.com/LEW21/pydbus/blob/master/doc/tutorial.rst - -Copyright Information ---------------------- - -Copyright (C) 2014, 2015, 2016 Linus Lewandowski - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - diff --git a/ui/lib/pydbus-0.6.0.dist-info/RECORD b/ui/lib/pydbus-0.6.0.dist-info/RECORD deleted file mode 100644 index a194108..0000000 --- a/ui/lib/pydbus-0.6.0.dist-info/RECORD +++ /dev/null @@ -1,45 +0,0 @@ -pydbus-0.6.0.dist-info/DESCRIPTION.rst,sha256=pKEYrpPtLiD4ksnqzDs6ZepA9c3uoy5Mjvuxoi1_pEU,3033 -pydbus-0.6.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pydbus-0.6.0.dist-info/METADATA,sha256=JKSoIIJKdCLkuWiXdKtv4bSyMt9rA7BM3_RJbxqk5y4,3838 -pydbus-0.6.0.dist-info/RECORD,, -pydbus-0.6.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pydbus-0.6.0.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 -pydbus-0.6.0.dist-info/metadata.json,sha256=fouQjd0oTDJrVRvQO8dwqvMZbNib8Ui4TgArvHoxzmQ,916 -pydbus-0.6.0.dist-info/top_level.txt,sha256=X1ybDik1ZA7yilKlt-MUQCPJBNlAW9Jp6bHoAYgAgN0,7 -pydbus-0.6.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -pydbus/__init__.py,sha256=5ouUtYT15bJ-LaEFea3ZccXkhlZHyf1ykwKLNnFMlIs,148 -pydbus/__pycache__/__init__.cpython-312.pyc,, -pydbus/__pycache__/_inspect3.cpython-312.pyc,, -pydbus/__pycache__/auto_names.cpython-312.pyc,, -pydbus/__pycache__/bus.cpython-312.pyc,, -pydbus/__pycache__/bus_names.cpython-312.pyc,, -pydbus/__pycache__/exitable.cpython-312.pyc,, -pydbus/__pycache__/generic.cpython-312.pyc,, -pydbus/__pycache__/identifier.cpython-312.pyc,, -pydbus/__pycache__/method_call_context.cpython-312.pyc,, -pydbus/__pycache__/proxy.cpython-312.pyc,, -pydbus/__pycache__/proxy_method.cpython-312.pyc,, -pydbus/__pycache__/proxy_property.cpython-312.pyc,, -pydbus/__pycache__/proxy_signal.cpython-312.pyc,, -pydbus/__pycache__/publication.cpython-312.pyc,, -pydbus/__pycache__/registration.cpython-312.pyc,, -pydbus/__pycache__/request_name.cpython-312.pyc,, -pydbus/__pycache__/subscription.cpython-312.pyc,, -pydbus/__pycache__/timeout.cpython-312.pyc,, -pydbus/_inspect3.py,sha256=lDzzSThwvbMQ3PwY-SVpWByu___QPhbSvPY0xwQScc8,708 -pydbus/auto_names.py,sha256=elJqIT2dIhioBYUMvIqtH6Pt_tFCf29QSzp0QXbndy8,519 -pydbus/bus.py,sha256=dMJAqRq85TJAz8iDZSg8COhjy8sabrofZ2jjSe6Pxds,1565 -pydbus/bus_names.py,sha256=vdkfHdQy_9FzMWkJaXJZpDpvktV9N2TFyRzLE8X1cDI,3533 -pydbus/exitable.py,sha256=FblBVEUjz6DyqgJpOVlE8-TMeVaC1ZPf9wyi7ejQ-gI,982 -pydbus/generic.py,sha256=2K9VNwu-TkMWws818H2BiyLsoX99fZuJgbmoNtVLzjE,2589 -pydbus/identifier.py,sha256=iVrw6rDMyNiQouNUAMpvEhGCz1Bog-R0HwzmvsHs0LY,383 -pydbus/method_call_context.py,sha256=ilIh0jJmmdoJX26UF1uV9eYvdQXXgYoyxzNHKvIJcJA,1039 -pydbus/proxy.py,sha256=Og9VbKJ4sZvr4dI7cBwVKsklWAqfnEmAlSpoaPJIs-g,4203 -pydbus/proxy_method.py,sha256=I741zD_vBixhpeKArTVLaUDTQsZGJ98xaX2SGORJkb0,3089 -pydbus/proxy_property.py,sha256=WUkOV4V8DuvmN1-yAD54IJklZqgJex2eTV2KZ20PJ1k,1066 -pydbus/proxy_signal.py,sha256=D60OxO635erbIknziTzX3QDChhImmjzgUpwjVe8gy6A,2112 -pydbus/publication.py,sha256=oJKPraVVv0YPLWN2-y0KjjjW1Lu4NNTg9lNoVneYLlY,1391 -pydbus/registration.py,sha256=GWBv2lDDLrkYCr9WsaEFS1hZstuXB7OgHdEnvC0Shc4,5565 -pydbus/request_name.py,sha256=jpWNd8H8rlRdJQiNAud-di1jU6gE31JvLOtoXQm_lHE,883 -pydbus/subscription.py,sha256=MBXKRIvLvSgYLIT7A0a3Qn6aAvT6Rcx1b6xudTsr7mQ,2166 -pydbus/timeout.py,sha256=G4o9dVwN7hb4MaPUHlcGpQKtlUSaTGjBTBC7nuza9mI,303 diff --git a/ui/lib/pydbus-0.6.0.dist-info/REQUESTED b/ui/lib/pydbus-0.6.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/ui/lib/pydbus-0.6.0.dist-info/WHEEL b/ui/lib/pydbus-0.6.0.dist-info/WHEEL deleted file mode 100644 index 8b6dd1b..0000000 --- a/ui/lib/pydbus-0.6.0.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.29.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/ui/lib/pydbus-0.6.0.dist-info/metadata.json b/ui/lib/pydbus-0.6.0.dist-info/metadata.json deleted file mode 100644 index 898cdff..0000000 --- a/ui/lib/pydbus-0.6.0.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Natural Language :: English", "License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7"], "extensions": {"python.details": {"contacts": [{"email": "linus@lew21.net", "name": "Linus Lewandowski", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/LEW21/pydbus"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["dbus"], "license": "LGPLv2+", "metadata_version": "2.0", "name": "pydbus", "summary": "Pythonic DBus library", "version": "0.6.0"} \ No newline at end of file diff --git a/ui/lib/pydbus-0.6.0.dist-info/top_level.txt b/ui/lib/pydbus-0.6.0.dist-info/top_level.txt deleted file mode 100644 index d2fe79b..0000000 --- a/ui/lib/pydbus-0.6.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -pydbus diff --git a/ui/lib/pydbus-0.6.0.dist-info/zip-safe b/ui/lib/pydbus-0.6.0.dist-info/zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/ui/lib/pydbus-0.6.0.dist-info/zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/ui/lib/pydbus/__init__.py b/ui/lib/pydbus/__init__.py deleted file mode 100644 index 5576517..0000000 --- a/ui/lib/pydbus/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .bus import SystemBus, SessionBus, connect -from gi.repository.GLib import Variant - -__all__ = ["SystemBus", "SessionBus", "connect", "Variant"] diff --git a/ui/lib/pydbus/_inspect3.py b/ui/lib/pydbus/_inspect3.py deleted file mode 100644 index b0a2f22..0000000 --- a/ui/lib/pydbus/_inspect3.py +++ /dev/null @@ -1,28 +0,0 @@ -from collections import OrderedDict -from inspect import getargspec - -class _empty: - pass - -class Signature: - empty = _empty - - def __init__(self, parameters=None, return_annotation=_empty): - self.parameters = OrderedDict(((param.name, param) for param in parameters)) - self.return_annotation = return_annotation - -class Parameter: - empty = _empty - - POSITIONAL_ONLY = 0 - POSITIONAL_OR_KEYWORD = 1 - KEYWORD_ONLY = 999 - - def __init__(self, name, kind, default=_empty, annotation=_empty): - self.name = name - self.kind = kind - self.annotation = annotation - -def signature(f): - parameters = [Parameter(arg, Parameter.POSITIONAL_OR_KEYWORD) for arg in getargspec(f).args] - return Signature(parameters = parameters) diff --git a/ui/lib/pydbus/auto_names.py b/ui/lib/pydbus/auto_names.py deleted file mode 100644 index 06c6c18..0000000 --- a/ui/lib/pydbus/auto_names.py +++ /dev/null @@ -1,21 +0,0 @@ -from gi.repository import Gio - -def auto_bus_name(bus_name): - if bus_name[0] == ".": - #Default namespace - bus_name = "org.freedesktop" + bus_name - - if not Gio.dbus_is_name(bus_name): - raise ValueError("invalid bus name") - - return bus_name - -def auto_object_path(bus_name, object_path=None): - if object_path is None: - # They always name it like that. - object_path = "/" + bus_name.replace(".", "/") - - if object_path[0] != "/": - object_path = "/" + bus_name.replace(".", "/") + "/" + object_path - - return object_path diff --git a/ui/lib/pydbus/bus.py b/ui/lib/pydbus/bus.py deleted file mode 100644 index 6726390..0000000 --- a/ui/lib/pydbus/bus.py +++ /dev/null @@ -1,60 +0,0 @@ -from gi.repository import Gio -from .proxy import ProxyMixin -from .request_name import RequestNameMixin -from .bus_names import OwnMixin, WatchMixin -from .subscription import SubscriptionMixin -from .registration import RegistrationMixin -from .publication import PublicationMixin - -def pydbus_property(self): - try: - return self._pydbus - except AttributeError: - self._pydbus = Bus(self) - return self._pydbus - -Gio.DBusConnection.pydbus = property(pydbus_property) - -def bus_get(type): - return Gio.bus_get_sync(type, None).pydbus - -def connect(address): - c = Gio.DBusConnection.new_for_address_sync(address, Gio.DBusConnectionFlags.AUTHENTICATION_CLIENT | Gio.DBusConnectionFlags.MESSAGE_BUS_CONNECTION, None, None) - c.pydbus.autoclose = True - return c.pydbus - -class Bus(ProxyMixin, RequestNameMixin, OwnMixin, WatchMixin, SubscriptionMixin, RegistrationMixin, PublicationMixin): - Type = Gio.BusType - - def __init__(self, gio_con): - self.con = gio_con - self.autoclose = False - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - if self.autoclose: - self.con.close_sync(None) - - @property - def dbus(self): - try: - return self._dbus - except AttributeError: - self._dbus = self.get(".DBus")[""] - return self._dbus - - @property - def polkit_authority(self): - try: - return self._polkit_authority - except AttributeError: - self._polkit_authority = self.get(".PolicyKit1", "Authority")[""] - return self._polkit_authority - -def SystemBus(): - return bus_get(Bus.Type.SYSTEM) - -def SessionBus(): - return bus_get(Bus.Type.SESSION) diff --git a/ui/lib/pydbus/bus_names.py b/ui/lib/pydbus/bus_names.py deleted file mode 100644 index 3b27431..0000000 --- a/ui/lib/pydbus/bus_names.py +++ /dev/null @@ -1,97 +0,0 @@ -from gi.repository import Gio -from .exitable import ExitableWithAliases -import warnings - -class NameOwner(ExitableWithAliases("unown")): - Flags = Gio.BusNameOwnerFlags - __slots__ = () - - def __init__(self, con, name, flags, name_aquired_handler, name_lost_handler): - id = Gio.bus_own_name_on_connection(con, name, flags, name_aquired_handler, name_lost_handler) - self._at_exit(lambda: Gio.bus_unown_name(id)) - -class NameWatcher(ExitableWithAliases("unwatch")): - Flags = Gio.BusNameWatcherFlags - __slots__ = () - - def __init__(self, con, name, flags, name_appeared_handler, name_vanished_handler): - id = Gio.bus_watch_name_on_connection(con, name, flags, name_appeared_handler, name_vanished_handler) - self._at_exit(lambda: Gio.bus_unwatch_name(id)) - -class OwnMixin(object): - __slots__ = () - NameOwnerFlags = NameOwner.Flags - - def own_name(self, name, flags=0, name_aquired=None, name_lost=None): - """[DEPRECATED] Asynchronously aquires a bus name. - - Starts acquiring name on the bus specified by bus_type and calls - name_acquired and name_lost when the name is acquired respectively lost. - - To receive name_aquired and name_lost callbacks, you need an event loop. - https://github.com/LEW21/pydbus/blob/master/doc/tutorial.rst#setting-up-an-event-loop - - Parameters - ---------- - name : string - Bus name to aquire - flags : NameOwnerFlags, optional - name_aquired : callable, optional - Invoked when name is acquired - name_lost : callable, optional - Invoked when name is lost - - Returns - ------- - NameOwner - An object you can use as a context manager to unown the name later. - - See Also - -------- - See https://developer.gnome.org/gio/2.44/gio-Owning-Bus-Names.html#g-bus-own-name - for more information. - """ - warnings.warn("own_name() is deprecated, use request_name() instead.", DeprecationWarning) - - name_aquired_handler = (lambda con, name: name_aquired()) if name_aquired is not None else None - name_lost_handler = (lambda con, name: name_lost()) if name_lost is not None else None - return NameOwner(self.con, name, flags, name_aquired_handler, name_lost_handler) - -class WatchMixin(object): - __slots__ = () - NameWatcherFlags = NameWatcher.Flags - - def watch_name(self, name, flags=0, name_appeared=None, name_vanished=None): - """Asynchronously watches a bus name. - - Starts watching name on the bus specified by bus_type and calls - name_appeared and name_vanished when the name is known to have a owner - respectively known to lose its owner. - - To receive name_appeared and name_vanished callbacks, you need an event loop. - https://github.com/LEW21/pydbus/blob/master/doc/tutorial.rst#setting-up-an-event-loop - - Parameters - ---------- - name : string - Bus name to watch - flags : NameWatcherFlags, optional - name_appeared : callable, optional - Invoked when name is known to exist - Called as name_appeared(name_owner). - name_vanished : callable, optional - Invoked when name is known to not exist - - Returns - ------- - NameWatcher - An object you can use as a context manager to unwatch the name later. - - See Also - -------- - See https://developer.gnome.org/gio/2.44/gio-Watching-Bus-Names.html#g-bus-watch-name - for more information. - """ - name_appeared_handler = (lambda con, name, name_owner: name_appeared(name_owner)) if name_appeared is not None else None - name_vanished_handler = (lambda con, name: name_vanished()) if name_vanished is not None else None - return NameWatcher(self.con, name, flags, name_appeared_handler, name_vanished_handler) diff --git a/ui/lib/pydbus/exitable.py b/ui/lib/pydbus/exitable.py deleted file mode 100644 index 0349043..0000000 --- a/ui/lib/pydbus/exitable.py +++ /dev/null @@ -1,52 +0,0 @@ -import inspect - -class Exitable(object): - __slots__ = ("_at_exit_cbs") - - def _at_exit(self, cb): - try: - self._at_exit_cbs - except AttributeError: - self._at_exit_cbs = [] - - self._at_exit_cbs.append(cb) - - def __enter__(self): - return self - - def __exit__(self, exc_type = None, exc_value = None, traceback = None): - if self._exited: - return - - for cb in reversed(self._at_exit_cbs): - call_with_exc = True - try: - inspect.getcallargs(cb, exc_type, exc_value, traceback) - except TypeError: - call_with_exc = False - - if call_with_exc: - cb(exc_type, exc_value, traceback) - else: - cb() - - self._at_exit_cbs = None - - @property - def _exited(self): - try: - return self._at_exit_cbs is None - except AttributeError: - return True - -def ExitableWithAliases(*exit_methods): - class CustomExitable(Exitable): - pass - - def exit(self): - self.__exit__() - - for exit_method_name in exit_methods: - setattr(CustomExitable, exit_method_name, exit) - - return CustomExitable diff --git a/ui/lib/pydbus/generic.py b/ui/lib/pydbus/generic.py deleted file mode 100644 index abeb7ce..0000000 --- a/ui/lib/pydbus/generic.py +++ /dev/null @@ -1,105 +0,0 @@ -"""Generic programming utilities. - -Utilities implemented in this file are not dependent -on dbus, they can be used everywhere. -""" - -class subscription(object): - __slots__ = ("callback_list", "callback") - - def __init__(self, callback_list, callback): - self.callback_list = callback_list - self.callback = callback - self.callback_list.append(callback) - - def unsubscribe(self): - self.callback_list.remove(self.callback) - self.callback_list = None - self.callback = None - - def disconnect(self): - """An alias for unsubscribe()""" - self.unsubscribe() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - if not self.callback is None: - self.unsubscribe() - -class bound_signal(object): - __slots__ = ("__signal__", "__self__") # bound method uses ("__func__", "__self__") - - def __init__(self, signal, instance): - self.__signal__ = signal - self.__self__ = instance - - @property - def callbacks(self): - return self.__signal__.map[self.__self__] - - def connect(self, callback): - """Subscribe to the signal.""" - return self.__signal__.connect(self.__self__, callback) - - def emit(self, *args): - """Emit the signal.""" - self.__signal__.emit(self.__self__, *args) - - def __call__(self, *args): - """Emit the signal.""" - self.emit(*args) - - def __repr__(self): - return "" - -class signal(object): - """Static signal object - - You're expected to set it as a class property:: - - class A: - SomethingHappened = signal() - - Declared this way, it can be used on class instances - to connect signal observers:: - - a = A() - a.SomethingHappened.connect(func) - - and emit the signal:: - - a.SomethingHappened() - - You may pass any parameters to the emiting function - - they will be forwarded to all subscribed callbacks. - """ - - def __init__(self): - self.map = {} - self.__qualname__ = "" # function uses ;) - self.__doc__ = "Signal." - - def connect(self, object, callback): - """Subscribe to the signal.""" - return subscription(self.map.setdefault(object, []), callback) - - def emit(self, object, *args): - """Emit the signal.""" - for cb in self.map.get(object, []): - cb(*args) - - def __get__(self, instance, owner): - if instance is None: - return self - - return bound_signal(self, instance) - - def __set__(self, instance, value): - raise AttributeError("can't set attribute") - - def __repr__(self): - return "" - -bound_method = type(signal().emit) # TODO find a prettier way to get this type diff --git a/ui/lib/pydbus/identifier.py b/ui/lib/pydbus/identifier.py deleted file mode 100644 index f7d4f31..0000000 --- a/ui/lib/pydbus/identifier.py +++ /dev/null @@ -1,22 +0,0 @@ - -try: - isident = str.isidentifier -except: - import re - - isidentre = re.compile("^[a-zA-Z_][a-zA-Z0-9_]*$") - def isident(s): - return isidentre.match(s) is not None - -def filter_identifier(name): - name = name.replace("-", "_") - - safe_name = "" - for c in name: - if not safe_name: - if isident(c): - safe_name += c - else: - if isident("a" + c): - safe_name += c - return safe_name diff --git a/ui/lib/pydbus/method_call_context.py b/ui/lib/pydbus/method_call_context.py deleted file mode 100644 index a565631..0000000 --- a/ui/lib/pydbus/method_call_context.py +++ /dev/null @@ -1,34 +0,0 @@ -from gi.repository import GLib -from collections import namedtuple - -AuthorizationResult = namedtuple("AuthorizationResult", "is_authorized is_challenge details") - -class MethodCallContext(object): - def __init__(self, gdbus_method_invocation): - self._mi = gdbus_method_invocation - - @property - def bus(self): - return self._mi.get_connection().pydbus - - @property - def sender(self): - return self._mi.get_sender() - - @property - def object_path(self): - return self._mi.get_object_path() - - @property - def interface_name(self): - return self._mi.get_interface_name() - - @property - def method_name(self): - return self._mi.get_method_name() - - def check_authorization(self, action_id, details, interactive=False): - return AuthorizationResult(*self.bus.polkit_authority.CheckAuthorization(('system-bus-name', {'name': GLib.Variant("s", self.sender)}), action_id, details, 1 if interactive else 0, '')) - - def is_authorized(self, action_id, details, interactive=False): - return self.check_authorization(action_id, details, interactive).is_authorized diff --git a/ui/lib/pydbus/proxy.py b/ui/lib/pydbus/proxy.py deleted file mode 100644 index c081113..0000000 --- a/ui/lib/pydbus/proxy.py +++ /dev/null @@ -1,123 +0,0 @@ -from gi.repository import GLib -from xml.etree import ElementTree as ET -from .auto_names import * - -from .proxy_method import ProxyMethod -from .proxy_property import ProxyProperty -from .proxy_signal import ProxySignal, OnSignal -from .timeout import timeout_to_glib - -class ProxyMixin(object): - __slots__ = () - - def get(self, bus_name, object_path=None, **kwargs): - """Get a remote object. - - Parameters - ---------- - bus_name : string - Name of the service that exposes this object. - You may start with "." - then org.freedesktop will be automatically prepended. - object_path : string, optional - Path of the object. If not provided, bus_name translated to path format is used. - - Returns - ------- - ProxyObject implementing all the Interfaces exposed by the remote object. - Note that it inherits from multiple Interfaces, so the method you want to use - may be shadowed by another one, eg. from a newer version of the interface. - Therefore, to interact with only a single interface, use: - >>> bus.get("org.freedesktop.systemd1")["org.freedesktop.systemd1.Manager"] - or simply - >>> bus.get(".systemd1")[".Manager"] - which will give you access to the one specific interface. - """ - # Python 2 sux - for kwarg in kwargs: - if kwarg not in ("timeout",): - raise TypeError(self.__qualname__ + " got an unexpected keyword argument '{}'".format(kwarg)) - timeout = kwargs.get("timeout", None) - - bus_name = auto_bus_name(bus_name) - object_path = auto_object_path(bus_name, object_path) - - ret = self.con.call_sync( - bus_name, object_path, - 'org.freedesktop.DBus.Introspectable', "Introspect", None, GLib.VariantType.new("(s)"), - 0, timeout_to_glib(timeout), None) - - if not ret: - raise KeyError("no such object; you might need to pass object path as the 2nd argument for get()") - - xml, = ret.unpack() - - try: - introspection = ET.fromstring(xml) - except: - raise KeyError("object provides invalid introspection XML") - - return CompositeInterface(introspection)(self, bus_name, object_path) - -class ProxyObject(object): - def __init__(self, bus, bus_name, path, object=None): - self._bus = bus - self._bus_name = bus_name - self._path = path - self._object = object if object else self - -def Interface(iface): - - class interface(ProxyObject): - @staticmethod - def _Introspect(): - print(iface.attrib["name"] + ":") - for member in iface: - print("\t" + member.tag + " " + member.attrib["name"]) - print() - - interface.__qualname__ = interface.__name__ = iface.attrib["name"] - interface.__module__ = "DBUS" - - for member in iface: - member_name = member.attrib["name"] - if member.tag == "method": - setattr(interface, member_name, ProxyMethod(interface.__name__, member)) - elif member.tag == "property": - setattr(interface, member_name, ProxyProperty(interface.__name__, member)) - elif member.tag == "signal": - signal = ProxySignal(interface.__name__, member) - setattr(interface, member_name, signal) - setattr(interface, "on" + member_name, OnSignal(signal)) - - return interface - -def CompositeInterface(introspection): - class CompositeObject(ProxyObject): - def __getitem__(self, iface): - if iface == "" or iface[0] == ".": - iface = self._path.replace("/", ".")[1:] + iface - matching_bases = [base for base in type(self).__bases__ if base.__name__ == iface] - - if len(matching_bases) == 0: - raise KeyError(iface) - assert(len(matching_bases) == 1) - - iface_class = matching_bases[0] - return iface_class(self._bus, self._bus_name, self._path, self) - - @classmethod - def _Introspect(cls): - for iface in cls.__bases__: - try: - iface._Introspect() - except: - pass - - ifaces = sorted([x for x in introspection if x.tag == "interface"], key=lambda x: int(x.attrib["name"].startswith("org.freedesktop.DBus."))) - if not ifaces: - raise KeyError("object does not export any interfaces; you might need to pass object path as the 2nd argument for get()") - CompositeObject.__bases__ = tuple(Interface(iface) for iface in ifaces) - CompositeObject.__name__ = "" - CompositeObject.__qualname__ = "(" + "+".join(x.__name__ for x in CompositeObject.__bases__) + ")" - CompositeObject.__module__ = "DBUS" - return CompositeObject diff --git a/ui/lib/pydbus/proxy_method.py b/ui/lib/pydbus/proxy_method.py deleted file mode 100644 index 8798edd..0000000 --- a/ui/lib/pydbus/proxy_method.py +++ /dev/null @@ -1,91 +0,0 @@ -from gi.repository import GLib -from .generic import bound_method -from .identifier import filter_identifier -from .timeout import timeout_to_glib - -try: - from inspect import Signature, Parameter - put_signature_in_doc = False -except: - from ._inspect3 import Signature, Parameter - put_signature_in_doc = True - -class DBUSSignature(Signature): - - def __str__(self): - result = [] - for param in self.parameters.values(): - p = param.name if not param.name.startswith("arg") else "" - if type(param.annotation) == str: - p += ":" + param.annotation - result.append(p) - - rendered = '({})'.format(', '.join(result)) - - if self.return_annotation is not Signature.empty: - rendered += ' -> {}'.format(self.return_annotation) - - return rendered - -class ProxyMethod(object): - def __init__(self, iface_name, method): - self._iface_name = iface_name - self.__name__ = method.attrib["name"] - self.__qualname__ = self._iface_name + "." + self.__name__ - - self._inargs = [(arg.attrib.get("name", ""), arg.attrib["type"]) for arg in method if arg.tag == "arg" and arg.attrib["direction"] == "in"] - self._outargs = [arg.attrib["type"] for arg in method if arg.tag == "arg" and arg.attrib["direction"] == "out"] - self._sinargs = "(" + "".join(x[1] for x in self._inargs) + ")" - self._soutargs = "(" + "".join(self._outargs) + ")" - - self_param = Parameter("self", Parameter.POSITIONAL_ONLY) - pos_params = [] - for i, a in enumerate(self._inargs): - name = filter_identifier(a[0]) - - if not name: - name = "arg" + str(i) - - param = Parameter(name, Parameter.POSITIONAL_ONLY, annotation=a[1]) - - pos_params.append(param) - ret_type = Signature.empty if len(self._outargs) == 0 else self._outargs[0] if len(self._outargs) == 1 else "(" + ", ".join(self._outargs) + ")" - - self.__signature__ = DBUSSignature([self_param] + pos_params, return_annotation=ret_type) - - if put_signature_in_doc: - self.__doc__ = self.__name__ + str(self.__signature__) - - def __call__(self, instance, *args, **kwargs): - argdiff = len(args) - len(self._inargs) - if argdiff < 0: - raise TypeError(self.__qualname__ + " missing {} required positional argument(s)".format(-argdiff)) - elif argdiff > 0: - raise TypeError(self.__qualname__ + " takes {} positional argument(s) but {} was/were given".format(len(self._inargs), len(args))) - - # Python 2 sux - for kwarg in kwargs: - if kwarg not in ("timeout",): - raise TypeError(self.__qualname__ + " got an unexpected keyword argument '{}'".format(kwarg)) - timeout = kwargs.get("timeout", None) - - ret = instance._bus.con.call_sync( - instance._bus_name, instance._path, - self._iface_name, self.__name__, GLib.Variant(self._sinargs, args), GLib.VariantType.new(self._soutargs), - 0, timeout_to_glib(timeout), None).unpack() - - if len(self._outargs) == 0: - return None - elif len(self._outargs) == 1: - return ret[0] - else: - return ret - - def __get__(self, instance, owner): - if instance is None: - return self - - return bound_method(self, instance) - - def __repr__(self): - return "" diff --git a/ui/lib/pydbus/proxy_property.py b/ui/lib/pydbus/proxy_property.py deleted file mode 100644 index e06a17d..0000000 --- a/ui/lib/pydbus/proxy_property.py +++ /dev/null @@ -1,31 +0,0 @@ -from gi.repository import GLib - -class ProxyProperty(object): - def __init__(self, iface_name, property): - self._iface_name = iface_name - self.__name__ = property.attrib["name"] - self.__qualname__ = self._iface_name + "." + self.__name__ - - self._type = property.attrib["type"] - access = property.attrib["access"] - self._readable = access.startswith("read") - self._writeable = access.endswith("write") - self.__doc__ = "(" + self._type + ") " + access - - def __get__(self, instance, owner): - if instance is None: - return self - - if not self._readable: - raise AttributeError("unreadable attribute") - - return instance._object["org.freedesktop.DBus.Properties"].Get(self._iface_name, self.__name__) - - def __set__(self, instance, value): - if instance is None or not self._writeable: - raise AttributeError("can't set attribute") - - instance._object["org.freedesktop.DBus.Properties"].Set(self._iface_name, self.__name__, GLib.Variant(self._type, value)) - - def __repr__(self): - return "" diff --git a/ui/lib/pydbus/proxy_signal.py b/ui/lib/pydbus/proxy_signal.py deleted file mode 100644 index c9a0169..0000000 --- a/ui/lib/pydbus/proxy_signal.py +++ /dev/null @@ -1,66 +0,0 @@ -from .generic import bound_signal - -class ProxySignal(object): - def __init__(self, iface_name, signal): - self._iface_name = iface_name - self.__name__ = signal.attrib["name"] - self.__qualname__ = self._iface_name + "." + self.__name__ - - self._args = [arg.attrib["type"] for arg in signal if arg.tag == "arg"] - self.__doc__ = "Signal. Callback: (" + ", ".join(self._args) + ")" - - def connect(self, object, callback): - """Subscribe to the signal.""" - def signal_fired(sender, object, iface, signal, params): - callback(*params) - return object._bus.subscribe(sender=object._bus_name, object=object._path, iface=self._iface_name, signal=self.__name__, signal_fired=signal_fired) - - def __get__(self, instance, owner): - if instance is None: - return self - - return bound_signal(self, instance) - - def __set__(self, instance, value): - raise AttributeError("can't set attribute") - - def __repr__(self): - return "" - -class OnSignal(object): - def __init__(self, signal): - self.signal = signal - self.__name__ = "on" + signal.__name__ - self.__qualname__ = signal._iface_name + "." + self.__name__ - self.__doc__ = "Assign a callback to subscribe to the signal. Assing None to unsubscribe. Callback: (" + ", ".join(signal._args) + ")" - - def __get__(self, instance, owner): - if instance is None: - return self - - try: - return getattr(instance, "_on" + self.signal.__name__) - except AttributeError: - return None - - def __set__(self, instance, value): - if instance is None: - raise AttributeError("can't set attribute") - - try: - old = getattr(instance, "_sub" + self.signal.__name__) - old.unsubscribe() - except AttributeError: - pass - - if value is None: - delattr(instance, "_on" + self.signal.__name__) - delattr(instance, "_sub" + self.signal.__name__) - return - - sub = self.signal.connect(instance, value) - setattr(instance, "_on" + self.signal.__name__, value) - setattr(instance, "_sub" + self.signal.__name__, sub) - - def __repr__(self): - return "" diff --git a/ui/lib/pydbus/publication.py b/ui/lib/pydbus/publication.py deleted file mode 100644 index ef03825..0000000 --- a/ui/lib/pydbus/publication.py +++ /dev/null @@ -1,42 +0,0 @@ -from gi.repository import Gio -from .exitable import ExitableWithAliases -from .auto_names import * - -class Publication(ExitableWithAliases("unpublish")): - __slots__ = () - - def __init__(self, bus, bus_name, *objects, **kwargs): # allow_replacement=True, replace=False - # Python 2 sux - for kwarg in kwargs: - if kwarg not in ("allow_replacement", "replace",): - raise TypeError(self.__qualname__ + " got an unexpected keyword argument '{}'".format(kwarg)) - allow_replacement = kwargs.get("allow_replacement", True) - replace = kwargs.get("replace", False) - - bus_name = auto_bus_name(bus_name) - - for object_info in objects: - path, object, node_info = (None, None, None) - - if type(object_info) == tuple: - if len(object_info) == 3: - path, object, node_info = object_info - if len(object_info) == 2: - path, object = object_info - if len(object_info) == 1: - object = object_info[0] - else: - object = object_info - - path = auto_object_path(bus_name, path) - self._at_exit(bus.register_object(path, object, node_info).__exit__) - - # Request name only after registering all the objects. - self._at_exit(bus.request_name(bus_name, allow_replacement=allow_replacement, replace=replace).__exit__) - -class PublicationMixin(object): - __slots__ = () - - def publish(self, bus_name, *objects): - """Expose objects on the bus.""" - return Publication(self, bus_name, *objects) diff --git a/ui/lib/pydbus/registration.py b/ui/lib/pydbus/registration.py deleted file mode 100644 index f531539..0000000 --- a/ui/lib/pydbus/registration.py +++ /dev/null @@ -1,156 +0,0 @@ -from __future__ import print_function -import sys, traceback -from gi.repository import GLib, Gio -from . import generic -from .exitable import ExitableWithAliases -from functools import partial -from .method_call_context import MethodCallContext -import logging - -try: - from inspect import signature, Parameter -except: - from ._inspect3 import signature, Parameter - -class ObjectWrapper(ExitableWithAliases("unwrap")): - __slots__ = ["object", "outargs", "readable_properties", "writable_properties"] - - def __init__(self, object, interfaces): - self.object = object - - self.outargs = {} - for iface in interfaces: - for method in iface.methods: - self.outargs[iface.name + "." + method.name] = [arg.signature for arg in method.out_args] - - self.readable_properties = {} - self.writable_properties = {} - for iface in interfaces: - for prop in iface.properties: - if prop.flags & Gio.DBusPropertyInfoFlags.READABLE: - self.readable_properties[iface.name + "." + prop.name] = prop.signature - if prop.flags & Gio.DBusPropertyInfoFlags.WRITABLE: - self.writable_properties[iface.name + "." + prop.name] = prop.signature - - for iface in interfaces: - for signal in iface.signals: - s_name = signal.name - def EmitSignal(iface, signal): - return lambda *args: self.SignalEmitted(iface.name, signal.name, GLib.Variant("(" + "".join(s.signature for s in signal.args) + ")", args)) - self._at_exit(getattr(object, signal.name).connect(EmitSignal(iface, signal)).__exit__) - - if "org.freedesktop.DBus.Properties" not in (iface.name for iface in interfaces): - try: - def onPropertiesChanged(iface, changed, invalidated): - changed = {key: GLib.Variant(self.readable_properties[iface + "." + key], val) for key, val in changed.items()} - args = GLib.Variant("(sa{sv}as)", (iface, changed, invalidated)) - self.SignalEmitted("org.freedesktop.DBus.Properties", "PropertiesChanged", args) - self._at_exit(object.PropertiesChanged.connect(onPropertiesChanged).__exit__) - except AttributeError: - pass - - SignalEmitted = generic.signal() - - def call_method(self, connection, sender, object_path, interface_name, method_name, parameters, invocation): - try: - try: - outargs = self.outargs[interface_name + "." + method_name] - method = getattr(self.object, method_name) - except KeyError: - if interface_name == "org.freedesktop.DBus.Properties": - if method_name == "Get": - method = self.Get - outargs = ["v"] - elif method_name == "GetAll": - method = self.GetAll - outargs = ["a{sv}"] - elif method_name == "Set": - method = self.Set - outargs = [] - else: - raise - else: - raise - - sig = signature(method) - - kwargs = {} - if "dbus_context" in sig.parameters and sig.parameters["dbus_context"].kind in (Parameter.POSITIONAL_OR_KEYWORD, Parameter.KEYWORD_ONLY): - kwargs["dbus_context"] = MethodCallContext(invocation) - - result = method(*parameters, **kwargs) - - if len(outargs) == 0: - invocation.return_value(None) - elif len(outargs) == 1: - invocation.return_value(GLib.Variant("(" + "".join(outargs) + ")", (result,))) - else: - invocation.return_value(GLib.Variant("(" + "".join(outargs) + ")", result)) - - except Exception as e: - logger = logging.getLogger(__name__) - logger.exception("Exception while handling %s.%s()", interface_name, method_name) - - #TODO Think of a better way to translate Python exception types to DBus error types. - e_type = type(e).__name__ - if not "." in e_type: - e_type = "unknown." + e_type - invocation.return_dbus_error(e_type, str(e)) - - def Get(self, interface_name, property_name): - type = self.readable_properties[interface_name + "." + property_name] - result = getattr(self.object, property_name) - return GLib.Variant(type, result) - - def GetAll(self, interface_name): - ret = {} - for name, type in self.readable_properties.items(): - ns, local = name.rsplit(".", 1) - if ns == interface_name: - ret[local] = GLib.Variant(type, getattr(self.object, local)) - return ret - - def Set(self, interface_name, property_name, value): - self.writable_properties[interface_name + "." + property_name] - setattr(self.object, property_name, value) - -class ObjectRegistration(ExitableWithAliases("unregister")): - __slots__ = () - - def __init__(self, bus, path, interfaces, wrapper, own_wrapper=False): - if own_wrapper: - self._at_exit(wrapper.__exit__) - - def func(interface_name, signal_name, parameters): - bus.con.emit_signal(None, path, interface_name, signal_name, parameters) - - self._at_exit(wrapper.SignalEmitted.connect(func).__exit__) - - try: - ids = [bus.con.register_object(path, interface, wrapper.call_method, None, None) for interface in interfaces] - except TypeError as e: - if str(e).startswith("argument vtable: Expected Gio.DBusInterfaceVTable"): - raise Exception("GLib 2.46 is required to publish objects; it is impossible in older versions.") - else: - raise - - self._at_exit(lambda: [bus.con.unregister_object(id) for id in ids]) - -class RegistrationMixin: - __slots__ = () - - def register_object(self, path, object, node_info): - if node_info is None: - try: - node_info = type(object).dbus - except AttributeError: - node_info = type(object).__doc__ - - if type(node_info) != list and type(node_info) != tuple: - node_info = [node_info] - - node_info = [Gio.DBusNodeInfo.new_for_xml(ni) for ni in node_info] - interfaces = sum((ni.interfaces for ni in node_info), []) - - wrapper = ObjectWrapper(object, interfaces) - return ObjectRegistration(self, path, interfaces, wrapper, own_wrapper=True) diff --git a/ui/lib/pydbus/request_name.py b/ui/lib/pydbus/request_name.py deleted file mode 100644 index 96d856c..0000000 --- a/ui/lib/pydbus/request_name.py +++ /dev/null @@ -1,29 +0,0 @@ -from .exitable import ExitableWithAliases - -class NameOwner(ExitableWithAliases("unown")): - __slots__ = () - - def __init__(self, bus, name, allow_replacement, replace): - flags = 4 | (1 if allow_replacement else 0) | (2 if replace else 0) - res = bus.dbus.RequestName(name, flags) - if res == 1: - self._at_exit(lambda: bus.dbus.ReleaseName(name)) - return # OK - if res == 3: - raise RuntimeError("name already exists on the bus") - if res == 4: - raise RuntimeError("you're already the owner of this name") - raise RuntimeError("cannot take ownership of the name") - -class RequestNameMixin(object): - __slots__ = () - - def request_name(self, name, allow_replacement=True, replace=False): - """Aquires a bus name. - - Returns - ------- - NameOwner - An object you can use as a context manager to unown the name later. - """ - return NameOwner(self, name, allow_replacement, replace) diff --git a/ui/lib/pydbus/subscription.py b/ui/lib/pydbus/subscription.py deleted file mode 100644 index 93b0cbb..0000000 --- a/ui/lib/pydbus/subscription.py +++ /dev/null @@ -1,53 +0,0 @@ -from gi.repository import Gio -from .exitable import ExitableWithAliases - -class Subscription(ExitableWithAliases("unsubscribe", "disconnect")): - Flags = Gio.DBusSignalFlags - __slots__ = () - - def __init__(self, con, sender, iface, member, object, arg0, flags, callback): - id = con.signal_subscribe(sender, iface, member, object, arg0, flags, callback) - self._at_exit(lambda: con.signal_unsubscribe(id)) - -class SubscriptionMixin(object): - __slots__ = () - SubscriptionFlags = Subscription.Flags - - def subscribe(self, sender=None, iface=None, signal=None, object=None, arg0=None, flags=0, signal_fired=None): - """Subscribes to matching signals. - - Subscribes to signals on connection and invokes signal_fired callback - whenever the signal is received. - - To receive signal_fired callback, you need an event loop. - https://github.com/LEW21/pydbus/blob/master/doc/tutorial.rst#setting-up-an-event-loop - - Parameters - ---------- - sender : string, optional - Sender name to match on (unique or well-known name) or None to listen from all senders. - iface : string, optional - Interface name to match on or None to match on all interfaces. - signal : string, optional - Signal name to match on or None to match on all signals. - object : string, optional - Object path to match on or None to match on all object paths. - arg0 : string, optional - Contents of first string argument to match on or None to match on all kinds of arguments. - flags : SubscriptionFlags, optional - signal_fired : callable, optional - Invoked when there is a signal matching the requested data. - Parameters: sender, object, iface, signal, params - - Returns - ------- - Subscription - An object you can use as a context manager to unsubscribe from the signal later. - - See Also - -------- - See https://developer.gnome.org/gio/2.44/GDBusConnection.html#g-dbus-connection-signal-subscribe - for more information. - """ - callback = (lambda con, sender, object, iface, signal, params: signal_fired(sender, object, iface, signal, params.unpack())) if signal_fired is not None else lambda *args: None - return Subscription(self.con, sender, iface, signal, object, arg0, flags, callback) diff --git a/ui/lib/pydbus/timeout.py b/ui/lib/pydbus/timeout.py deleted file mode 100644 index 0af65c1..0000000 --- a/ui/lib/pydbus/timeout.py +++ /dev/null @@ -1,15 +0,0 @@ -from gi.repository import GLib, GObject - -def timeout_to_glib(timeout): - if timeout is None: - try: - return GLib.MAXINT - except AttributeError: - # GLib < 2.46 - return GObject.G_MAXINT - else: - try: - timeout = timeout.total_seconds() - except AttributeError: - pass - return int(timeout * 1000) diff --git a/ui/meson.build b/ui/meson.build deleted file mode 100644 index 05d6f6d..0000000 --- a/ui/meson.build +++ /dev/null @@ -1,18 +0,0 @@ -project('breezydesktop', - version: run_command('cat', join_paths('..', 'VERSION'), check: true).stdout().strip(), - meson_version: '>= 0.62.0', - default_options: [ 'warning_level=2', 'werror=false', ], -) - -i18n = import('i18n') -gnome = import('gnome') - -subdir('data') -subdir('src') -subdir('po') - -gnome.post_install( - glib_compile_schemas: true, - gtk_update_icon_cache: true, - update_desktop_database: true, -) diff --git a/ui/modules/PyXRLinuxDriverIPC b/ui/modules/PyXRLinuxDriverIPC deleted file mode 160000 index 40c9979..0000000 --- a/ui/modules/PyXRLinuxDriverIPC +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 40c9979d7e79d31047cb474c154018ce43afb63a diff --git a/ui/po/LINGUAS b/ui/po/LINGUAS deleted file mode 100644 index 25b3c08..0000000 --- a/ui/po/LINGUAS +++ /dev/null @@ -1 +0,0 @@ -de es fr it ja pl pt_BR ru sv uk_UA zh_CN diff --git a/ui/po/breezydesktop.pot b/ui/po/breezydesktop.pot deleted file mode 100644 index d9cbea8..0000000 --- a/ui/po/breezydesktop.pot +++ /dev/null @@ -1,717 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-03 12:40-0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: src/connecteddevice.py:29 -msgid "" -"Switches your glasses into side-by-side mode and doubles the width of the " -"display." -msgstr "" - -#: src/connecteddevice.py:30 -msgid "This feature is not currently supported for your device." -msgstr "" - -#: src/connecteddevice.py:160 -msgid "Set Focused Display Distance" -msgstr "" - -#: src/connecteddevice.py:161 -msgid "Use a closer value so the display zooms in when you look at it." -msgstr "" - -#: src/connecteddevice.py:168 -msgid "Set All Displays Distance" -msgstr "" - -#: src/connecteddevice.py:169 -msgid "Use a farther value so the displays are zoomed out when you look away." -msgstr "" - -#: src/connecteddevice.py:309 -msgid "" -"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, " -"and the pipewire GStreamer plugin are required." -msgstr "" - -#: src/connecteddevice.py:343 -msgid "Focused display" -msgstr "" - -#: src/connecteddevice.py:349 -msgid "All displays" -msgstr "" - -#: src/licensedialogcontent.py:63 -msgid "Paid Tier Status" -msgstr "" - -#: src/licensedialogcontent.py:71 -msgid "Feature Availability" -msgstr "" - -#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104 -#: src/gtk/connected-device.ui:786 -msgid "Disabled" -msgstr "" - -#: src/licensefeaturerow.py:18 -msgid "In trial" -msgstr "" - -#: src/licensefeaturerow.py:18 -msgid "Enabled" -msgstr "" - -#: src/licensefeaturerow.py:24 src/licensetierrow.py:30 -#, python-brace-format -msgid " ({time_remaining} remaining)" -msgstr "" - -#: src/licensefeaturerow.py:30 src/licensetierrow.py:56 -msgid "Productivity Basic" -msgstr "" - -#: src/licensefeaturerow.py:31 src/licensetierrow.py:57 -msgid "Productivity Pro" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Active" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Inactive" -msgstr "" - -#: src/licensetierrow.py:41 -#, python-brace-format -msgid "${amount} USD" -msgstr "" - -#: src/licensetierrow.py:43 -msgid " to renew" -msgstr "" - -#: src/licensetierrow.py:45 -msgid " to upgrade" -msgstr "" - -#: src/licensetierrow.py:47 -msgid "Paid through next renewal period" -msgstr "" - -#: src/licensetierrow.py:63 -msgid " - renewing monthly" -msgstr "" - -#: src/licensetierrow.py:64 -msgid " - renewing yearly" -msgstr "" - -#: src/licensetierrow.py:65 -msgid "with lifetime access" -msgstr "" - -#: src/licensetierrow.py:72 -msgid "Monthly" -msgstr "" - -#: src/licensetierrow.py:73 -msgid "Yearly" -msgstr "" - -#: src/licensetierrow.py:74 -msgid "Lifetime" -msgstr "" - -#: src/time.py:14 -msgid "less than an hour" -msgstr "" - -#: src/time.py:17 -msgid "1 hour" -msgstr "" - -#: src/time.py:17 -#, python-brace-format -msgid "{time_remaining} hours" -msgstr "" - -#: src/time.py:20 -msgid "1 day" -msgstr "" - -#: src/time.py:20 -#, python-brace-format -msgid "{time_remaining} days" -msgstr "" - -#: src/gtk/connected-device.ui:21 -msgid "connected" -msgstr "" - -#: src/gtk/connected-device.ui:31 -msgid "General Settings" -msgstr "" - -#: src/gtk/connected-device.ui:41 -msgid "Features" -msgstr "" - -#: src/gtk/connected-device.ui:45 -msgid "XR effect" -msgstr "" - -#: src/gtk/connected-device.ui:46 -msgid "Enables the Breezy Desktop XR effect." -msgstr "" - -#: src/gtk/connected-device.ui:56 -msgid "Zoom on focus" -msgstr "" - -#: src/gtk/connected-device.ui:57 -msgid "" -"Automatically move a display closer when you look at it.\n" -"Set your preferred focused and unfocused distances in the Adjustments " -"section.\n" -" " -msgstr "" - -#: src/gtk/connected-device.ui:70 -msgid "Follow mode" -msgstr "" - -#: src/gtk/connected-device.ui:71 -msgid "Keep the focused display near the center of your view." -msgstr "" - -#: src/gtk/connected-device.ui:81 -msgid "Curved display" -msgstr "" - -#: src/gtk/connected-device.ui:82 -msgid "Switch between flat and curved displays." -msgstr "" - -#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36 -msgid "Disable physical displays" -msgstr "" - -#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37 -msgid "" -"Automatically disable all physical displays when the XR effect is enabled." -msgstr "" - -#: src/gtk/connected-device.ui:104 -msgid "Virtual displays" -msgstr "" - -#: src/gtk/connected-device.ui:120 -msgid "1080p" -msgstr "" - -#: src/gtk/connected-device.ui:121 -msgid "1440p" -msgstr "" - -#: src/gtk/connected-device.ui:122 -msgid "Add custom" -msgstr "" - -#: src/gtk/connected-device.ui:136 -msgid "Remove custom resolution" -msgstr "" - -#: src/gtk/connected-device.ui:156 -msgid "Rearrange displays" -msgstr "" - -#: src/gtk/connected-device.ui:174 -msgid "Adjustments" -msgstr "" - -#: src/gtk/connected-device.ui:178 -msgid "Display distances" -msgstr "" - -#: src/gtk/connected-device.ui:179 -msgid "Set how close you want displays to appear." -msgstr "" - -#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221 -#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472 -#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530 -#: src/gtk/connected-device.ui:559 -msgid "Change" -msgstr "" - -#: src/gtk/connected-device.ui:234 -msgid "Display size" -msgstr "" - -#: src/gtk/connected-device.ui:235 -msgid "Set how large you want the display to appear." -msgstr "" - -#: src/gtk/connected-device.ui:254 -msgid "full" -msgstr "" - -#: src/gtk/connected-device.ui:264 -msgid "Follow threshold" -msgstr "" - -#: src/gtk/connected-device.ui:265 -msgid "How far away you can look before the display follows." -msgstr "" - -#: src/gtk/connected-device.ui:288 -msgid "Display angling" -msgstr "" - -#: src/gtk/connected-device.ui:289 -msgid "" -"When there are multiple displays, choose how they should angle towards you." -msgstr "" - -#: src/gtk/connected-device.ui:303 -msgid "Automatic" -msgstr "" - -#: src/gtk/connected-device.ui:304 -msgid "Side-angled" -msgstr "" - -#: src/gtk/connected-device.ui:305 -msgid "Top-angled" -msgstr "" - -#: src/gtk/connected-device.ui:306 -msgid "Flat" -msgstr "" - -#: src/gtk/connected-device.ui:316 -msgid "Display spacing" -msgstr "" - -#: src/gtk/connected-device.ui:317 -msgid "Put empty space between displays, when there are multiple." -msgstr "" - -#: src/gtk/connected-device.ui:347 -msgid "Viewport horizontal offset" -msgstr "" - -#: src/gtk/connected-device.ui:348 -msgid "Move the viewport to the left or right of its default position." -msgstr "" - -#: src/gtk/connected-device.ui:365 -msgid "left" -msgstr "" - -#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397 -msgid "center" -msgstr "" - -#: src/gtk/connected-device.ui:369 -msgid "right" -msgstr "" - -#: src/gtk/connected-device.ui:377 -msgid "Viewport vertical offset" -msgstr "" - -#: src/gtk/connected-device.ui:378 -msgid "Move the viewport up or down from its default position." -msgstr "" - -#: src/gtk/connected-device.ui:395 -msgid "down" -msgstr "" - -#: src/gtk/connected-device.ui:399 -msgid "up" -msgstr "" - -#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420 -msgid "Keyboard Shortcuts" -msgstr "" - -#: src/gtk/connected-device.ui:423 -msgid "XR Effect on/off shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:424 -msgid "" -"Quickly enable or disable the XR Effect. You may need to enable the effect " -"manually once in order to enable the shortcut." -msgstr "" - -#: src/gtk/connected-device.ui:452 -msgid "Re-center display shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:453 -msgid "Pin the virtual display to the current position." -msgstr "" - -#: src/gtk/connected-device.ui:481 -msgid "Toggle zoom on focus shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:482 -msgid "Quickly toggle zoom on focus mode." -msgstr "" - -#: src/gtk/connected-device.ui:510 -msgid "Toggle follow mode shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:511 -msgid "Quickly toggle follow mode." -msgstr "" - -#: src/gtk/connected-device.ui:539 -msgid "Summon mouse cursor shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:540 -msgid "Bring the mouse cursor to the center of the focused display." -msgstr "" - -#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585 -msgid "Advanced Settings" -msgstr "" - -#: src/gtk/connected-device.ui:589 -msgid "Units" -msgstr "" - -#: src/gtk/connected-device.ui:590 -msgid "Choose measurement units for size and distance displays." -msgstr "" - -#: src/gtk/connected-device.ui:605 -msgid "Centimeters" -msgstr "" - -#: src/gtk/connected-device.ui:606 -msgid "Inches" -msgstr "" - -#: src/gtk/connected-device.ui:618 -msgid "Find optimal display config" -msgstr "" - -#: src/gtk/connected-device.ui:619 -msgid "" -"Automatically modify the glasses display configuration for maximum " -"resolution and best scaling when plugged in." -msgstr "" - -#: src/gtk/connected-device.ui:629 -msgid "Use highest refresh rate" -msgstr "" - -#: src/gtk/connected-device.ui:630 -msgid "Refresh rate may affect performance, disable this to set it manually." -msgstr "" - -#: src/gtk/connected-device.ui:640 -msgid "Center on glasses' display" -msgstr "" - -#: src/gtk/connected-device.ui:641 -msgid "" -"Center the viewport on the glasses' display, even if the display is not in " -"the middle." -msgstr "" - -#: src/gtk/connected-device.ui:651 -msgid "Always primary display" -msgstr "" - -#: src/gtk/connected-device.ui:652 -msgid "Automatically set the glasses as the primary display when plugged in." -msgstr "" - -#: src/gtk/connected-device.ui:662 -msgid "Remove virtual displays on disable" -msgstr "" - -#: src/gtk/connected-device.ui:663 -msgid "Automatically remove virtual displays when the XR effect is disabled." -msgstr "" - -#: src/gtk/connected-device.ui:673 -msgid "Enable multi-tap detection" -msgstr "" - -#: src/gtk/connected-device.ui:674 -msgid "Enables double-tap to recenter and triple-tap to recalibrate." -msgstr "" - -#: src/gtk/connected-device.ui:684 -msgid "All displays follow mode" -msgstr "" - -#: src/gtk/connected-device.ui:685 -msgid "Follow mode moves all displays, not just the focused one." -msgstr "" - -#: src/gtk/connected-device.ui:701 -msgid "Neck-saver horizontal multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:702 -msgid "Higher values require smaller horizontal head movements." -msgstr "" - -#: src/gtk/connected-device.ui:734 -msgid "Neck-saver vertical multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:735 -msgid "Higher values require smaller vertical head movements." -msgstr "" - -#: src/gtk/connected-device.ui:767 -msgid "Dead-zone threshold (degrees)" -msgstr "" - -#: src/gtk/connected-device.ui:768 -msgid "Stabilize movements below this angle." -msgstr "" - -#: src/gtk/connected-device.ui:799 -msgid "Follow mode movement tracking" -msgstr "" - -#: src/gtk/connected-device.ui:800 -msgid "Choose which movements should be tracked in follow mode." -msgstr "" - -#: src/gtk/connected-device.ui:815 -msgid "Horizontal" -msgstr "" - -#: src/gtk/connected-device.ui:835 -msgid "Vertical" -msgstr "" - -#: src/gtk/connected-device.ui:855 -msgid "Tilt/roll" -msgstr "" - -#: src/gtk/connected-device.ui:873 -msgid "Movement look-ahead" -msgstr "" - -#: src/gtk/connected-device.ui:874 -msgid "" -"Counteracts input lag by predicting head-tracking position ahead of render " -"time. Stick with default unless virtual display drags behind your head " -"movements, jumps ahead, or is very shaky." -msgstr "" - -#: src/gtk/connected-device.ui:892 -msgid "Default" -msgstr "" - -#: src/gtk/connected-device.ui:904 -msgid "Text Scaling" -msgstr "" - -#: src/gtk/connected-device.ui:905 -msgid "Scaling text below 1.0 will simulate a higher resolution display" -msgstr "" - -#: src/gtk/custom-resolution-dialog-content.ui:9 -msgid "Width" -msgstr "" - -#: src/gtk/custom-resolution-dialog-content.ui:42 -msgid "Height" -msgstr "" - -#: src/gtk/custom-resolution-dialog.ui:5 -msgid "Add a Custom Resolution" -msgstr "" - -#: src/gtk/custom-resolution-dialog.ui:10 -msgid "Add" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:35 -msgid "closer" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:36 -msgid "default" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:37 -msgid "farther" -msgstr "" - -#: src/gtk/display-distance-dialog.ui:9 -msgid "Done" -msgstr "" - -#: src/gtk/failed-verification.ui:15 -msgid "Breezy Desktop GNOME invalid setup" -msgstr "" - -#: src/gtk/failed-verification.ui:16 -msgid "" -"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup " -"script. Report this issue if it persists." -msgstr "" - -#: src/gtk/license-dialog-content.ui:15 -msgid "Donate" -msgstr "" - -#: src/gtk/license-dialog-content.ui:31 -msgid "Request a token" -msgstr "" - -#: src/gtk/license-dialog-content.ui:39 -msgid "Verify token" -msgstr "" - -#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139 -msgid "License Details" -msgstr "" - -#: src/gtk/no-device.ui:15 -msgid "No device connected" -msgstr "" - -#: src/gtk/no-device.ui:16 -msgid "Breezy Desktop was unable to detect any supported XR devices." -msgstr "" - -#: src/gtk/no-device.ui:25 -msgid "Auto-enable XR effect" -msgstr "" - -#: src/gtk/no-device.ui:26 -msgid "" -"Automatically enable the Breezy Desktop XR effect when supported glasses are " -"connected." -msgstr "" - -#: src/gtk/no-driver.ui:15 -msgid "No driver running" -msgstr "" - -#: src/gtk/no-driver.ui:16 -msgid "" -"\n" -" If you installed via AUR, make sure you ran the recommended post-" -"install command:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Otherwise, please file an issue on GitHub, or create a new thread " -"in the #troubleshooting channel on Discord.\n" -" " -msgstr "" - -#: src/gtk/no-extension.ui:15 -msgid "Breezy Desktop GNOME extension not ready" -msgstr "" - -#: src/gtk/no-extension.ui:16 -msgid "" -"If you have just run the setup, then you may need to log out and back in to " -"use it. Otherwise, please follow the Breezy GNOME setup instructions." -msgstr "" - -#: src/gtk/no-license.ui:15 -msgid "No license file was found" -msgstr "" - -#: src/gtk/no-license.ui:16 -msgid "" -"\n" -" The first time you use Breezy Desktop, an internet connection is " -"required to retrieve your device's license.\n" -" \n" -" Don't worry, there's no obligation to donate at this time. If you " -"haven't, you'll be given a trial license so you can decide if Breezy Desktop " -"fits your needs. \n" -" \n" -" Once you obtain a license, trial or otherwise, you can use Breezy " -"Desktop offline until features expire (or indefinitely, if you've chosen " -"lifetime access).\n" -" " -msgstr "" - -#: src/gtk/no-license.ui:29 -msgid "Try Again" -msgstr "" - -#: src/gtk/shortcut-dialog.ui:5 -msgid "Assign Keyboard Shortcut" -msgstr "" - -#: src/gtk/shortcut-dialog.ui:20 -msgid "Press your keyboard shortcut or 'Backspace' to disable..." -msgstr "" - -#: src/gtk/window.ui:10 -msgid "Breezy Desktop" -msgstr "" - -#: src/gtk/window.ui:23 -msgid "Menu" -msgstr "" - -#: src/gtk/window.ui:43 -msgid "Some features expire soon" -msgstr "" - -#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102 -msgid "View details" -msgstr "" - -#: src/gtk/window.ui:68 -msgid "Productivity features are disabled" -msgstr "" - -#: src/gtk/window.ui:93 -msgid "" -"Productivity Pro license is inactive — 6DoF features will be unavailable" -msgstr "" - -#: src/gtk/window.ui:119 -msgid "" -"A newer version is available. To update, rerun the breezy_gnome_setup script." -msgstr "" - -#: src/gtk/window.ui:143 -msgid "Force Reset" -msgstr "" - -#: src/gtk/window.ui:147 -msgid "About BreezyDesktop" -msgstr "" diff --git a/ui/po/de.po b/ui/po/de.po deleted file mode 100644 index e17716f..0000000 --- a/ui/po/de.po +++ /dev/null @@ -1,864 +0,0 @@ -# German translations for PACKAGE package. -# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# , 2024. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-03 12:40-0800\n" -"PO-Revision-Date: 2024-08-02 20:54-0700\n" -"Last-Translator: \n" -"Language-Team: German \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: src/connecteddevice.py:29 -msgid "" -"Switches your glasses into side-by-side mode and doubles the width of the " -"display." -msgstr "" -"Schaltet Ihre Brille in den Side-by-Side-Modus und verdoppelt die Breite des " -"Bildschirms." - -#: src/connecteddevice.py:30 -msgid "This feature is not currently supported for your device." -msgstr "Diese Funktion wird von Ihrem Gerät derzeit nicht unterstützt." - -#: src/connecteddevice.py:160 -msgid "Set Focused Display Distance" -msgstr "Setze fokussierte Bildschirmentfernung" - -#: src/connecteddevice.py:161 -msgid "Use a closer value so the display zooms in when you look at it." -msgstr "" -"Nutze einen Näher Wert um den Bildschirm zu vergößern, wenn der Bildschirm " -"angesehen wird." - -#: src/connecteddevice.py:168 -msgid "Set All Displays Distance" -msgstr "Setze alle Bildschirmentfernungen" - -#: src/connecteddevice.py:169 -msgid "Use a farther value so the displays are zoomed out when you look away." -msgstr "" -"Nutze einen Entfernter Wert um den Bildschirm zu verkleinern, wenn diese " -"nicht angesehen werden." - -#: src/connecteddevice.py:309 -msgid "" -"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, " -"and the pipewire GStreamer plugin are required." -msgstr "" -"Virtuelle Bildschirme können nicht hinzugefügt werden.Wayland und xdg-" -"desktop-portal werden benötigt" - -#: src/connecteddevice.py:343 -msgid "Focused display" -msgstr "Fokussierter Bildschirm" - -#: src/connecteddevice.py:349 -msgid "All displays" -msgstr "Gebogene Bildschirm" - -#: src/licensedialogcontent.py:63 -msgid "Paid Tier Status" -msgstr "Bezahlter Tarifstatus" - -#: src/licensedialogcontent.py:71 -msgid "Feature Availability" -msgstr "Funktionsverfügbarkeit" - -#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104 -#: src/gtk/connected-device.ui:786 -msgid "Disabled" -msgstr "Deaktiviert" - -#: src/licensefeaturerow.py:18 -msgid "In trial" -msgstr "Im Test" - -#: src/licensefeaturerow.py:18 -msgid "Enabled" -msgstr "Aktiviert" - -#: src/licensefeaturerow.py:24 src/licensetierrow.py:30 -#, python-brace-format -msgid " ({time_remaining} remaining)" -msgstr " ({time_remaining} verbleibend)" - -#: src/licensefeaturerow.py:30 src/licensetierrow.py:56 -msgid "Productivity Basic" -msgstr "" - -#: src/licensefeaturerow.py:31 src/licensetierrow.py:57 -msgid "Productivity Pro" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Active" -msgstr "Aktiv" - -#: src/licensetierrow.py:24 -msgid "Inactive" -msgstr "Inaktiv" - -#: src/licensetierrow.py:41 -#, python-brace-format -msgid "${amount} USD" -msgstr "${amount} USD" - -#: src/licensetierrow.py:43 -msgid " to renew" -msgstr " zum erneuern" - -#: src/licensetierrow.py:45 -msgid " to upgrade" -msgstr " zum aktualisieren" - -#: src/licensetierrow.py:47 -msgid "Paid through next renewal period" -msgstr "Bezahlt bis zum nächsten Erneuerungszeitraum" - -#: src/licensetierrow.py:63 -msgid " - renewing monthly" -msgstr " - monatlich erneuern" - -#: src/licensetierrow.py:64 -msgid " - renewing yearly" -msgstr " - jährlich erneuern" - -#: src/licensetierrow.py:65 -msgid "with lifetime access" -msgstr "mit lebenslangem Zugriff" - -#: src/licensetierrow.py:72 -msgid "Monthly" -msgstr "Monatlich" - -#: src/licensetierrow.py:73 -msgid "Yearly" -msgstr "Jährlich" - -#: src/licensetierrow.py:74 -msgid "Lifetime" -msgstr "Lebenslang" - -#: src/time.py:14 -msgid "less than an hour" -msgstr "weniger als eine Stunde" - -#: src/time.py:17 -msgid "1 hour" -msgstr "1 Stunde" - -#: src/time.py:17 -#, python-brace-format -msgid "{time_remaining} hours" -msgstr "{time_remaining} Stunden" - -#: src/time.py:20 -msgid "1 day" -msgstr "1 Tag" - -#: src/time.py:20 -#, python-brace-format -msgid "{time_remaining} days" -msgstr "{time_remaining} Tage" - -#: src/gtk/connected-device.ui:21 -msgid "connected" -msgstr "verbunden" - -#: src/gtk/connected-device.ui:31 -msgid "General Settings" -msgstr "Allgemeine Einstellungen" - -#: src/gtk/connected-device.ui:41 -msgid "Features" -msgstr "Funktionen" - -#: src/gtk/connected-device.ui:45 -msgid "XR effect" -msgstr "XR-Effekt" - -#: src/gtk/connected-device.ui:46 -msgid "Enables the Breezy Desktop XR effect." -msgstr "Aktiviert den Breezy Desktop XR-Effekt." - -#: src/gtk/connected-device.ui:56 -msgid "Zoom on focus" -msgstr "" - -#: src/gtk/connected-device.ui:57 -msgid "" -"Automatically move a display closer when you look at it.\n" -"Set your preferred focused and unfocused distances in the Adjustments " -"section.\n" -" " -msgstr "" -"Bewege automatisch einen Bildschirm näher, wenn Sie ihn ansehen.\n" -"Setzen Sie Ihren bevorzugten fokussierten und nicht fokussierten Abstand im " -"Anpassungen Bereich.\n" -" " - -#: src/gtk/connected-device.ui:70 -msgid "Follow mode" -msgstr "Folgemodus" - -#: src/gtk/connected-device.ui:71 -msgid "Keep the focused display near the center of your view." -msgstr "Halten Sie den virtuellen Bildschirm Nahe der Mitte Ihres Blickfelds." - -#: src/gtk/connected-device.ui:81 -msgid "Curved display" -msgstr "Gebogener Bildschirm" - -#: src/gtk/connected-device.ui:82 -msgid "Switch between flat and curved displays." -msgstr "Zwischen flachen und gebogenen Bildschirm wechseln." - -#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36 -msgid "Disable physical displays" -msgstr "Physische Bildschirme deaktivieren" - -#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37 -msgid "" -"Automatically disable all physical displays when the XR effect is enabled." -msgstr "" -"Deaktiviere automatisch alle physikalischen Bildschirme, wenn der XR Effekt " -"aktiviert ist." - -#: src/gtk/connected-device.ui:104 -msgid "Virtual displays" -msgstr "Virtuelle Bildschirme" - -#: src/gtk/connected-device.ui:120 -msgid "1080p" -msgstr "1080p" - -#: src/gtk/connected-device.ui:121 -msgid "1440p" -msgstr "1440p" - -#: src/gtk/connected-device.ui:122 -msgid "Add custom" -msgstr "Eigene Auflösung hinzufügen" - -#: src/gtk/connected-device.ui:136 -msgid "Remove custom resolution" -msgstr "Eigene Auflösung entfernen" - -#: src/gtk/connected-device.ui:156 -msgid "Rearrange displays" -msgstr "Bildschirme neu anordnen" - -#: src/gtk/connected-device.ui:174 -msgid "Adjustments" -msgstr "Einstellungen" - -#: src/gtk/connected-device.ui:178 -msgid "Display distances" -msgstr "Bildschirmentfernung" - -#: src/gtk/connected-device.ui:179 -msgid "Set how close you want displays to appear." -msgstr "Stelle ein, wie nah Ihre Bildschirme erscheinen sollen." - -#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221 -#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472 -#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530 -#: src/gtk/connected-device.ui:559 -msgid "Change" -msgstr "Ändern" - -#: src/gtk/connected-device.ui:234 -msgid "Display size" -msgstr "" - -#: src/gtk/connected-device.ui:235 -msgid "Set how large you want the display to appear." -msgstr "" - -#: src/gtk/connected-device.ui:254 -msgid "full" -msgstr "" - -#: src/gtk/connected-device.ui:264 -msgid "Follow threshold" -msgstr "Folgemodus-Schwelle" - -#: src/gtk/connected-device.ui:265 -msgid "How far away you can look before the display follows." -msgstr "Wie weit Sie wegschauen können, bevor der Bildschirm folgt." - -#: src/gtk/connected-device.ui:288 -msgid "Display angling" -msgstr "Bildschirmgröße" - -#: src/gtk/connected-device.ui:289 -msgid "" -"When there are multiple displays, choose how they should angle towards you." -msgstr "Stelle ein, wie mehrere Bildschirme angewinkelt werden sollen." - -#: src/gtk/connected-device.ui:303 -msgid "Automatic" -msgstr "Automatisch" - -#: src/gtk/connected-device.ui:304 -msgid "Side-angled" -msgstr "Seitlich gewinkelt" - -#: src/gtk/connected-device.ui:305 -msgid "Top-angled" -msgstr "Oben gewinkelt" - -#: src/gtk/connected-device.ui:306 -msgid "Flat" -msgstr "Flach" - -#: src/gtk/connected-device.ui:316 -msgid "Display spacing" -msgstr "Bildschirmgröße" - -#: src/gtk/connected-device.ui:317 -msgid "Put empty space between displays, when there are multiple." -msgstr "" -"Setze einen leeren Bereich zwischen Bildschirme, wenn mehrere vorhanden sind." - -#: src/gtk/connected-device.ui:347 -msgid "Viewport horizontal offset" -msgstr "Horizontaler Anzeigebereich Ausgleich" - -#: src/gtk/connected-device.ui:348 -msgid "Move the viewport to the left or right of its default position." -msgstr "Bewege den Anzeigebreich nach links oder rechts der Anfangsposition." - -#: src/gtk/connected-device.ui:365 -msgid "left" -msgstr "Links" - -#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397 -msgid "center" -msgstr "Mitte" - -#: src/gtk/connected-device.ui:369 -msgid "right" -msgstr "Rechts" - -#: src/gtk/connected-device.ui:377 -msgid "Viewport vertical offset" -msgstr "Vertikaler Anzeigebereich Ausgleich" - -#: src/gtk/connected-device.ui:378 -msgid "Move the viewport up or down from its default position." -msgstr "" -"Bewege den Anzeigebreich nach oberhalb oder unterhalb der Anfangsposition." - -#: src/gtk/connected-device.ui:395 -msgid "down" -msgstr "Unten" - -#: src/gtk/connected-device.ui:399 -msgid "up" -msgstr "Oben" - -#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420 -msgid "Keyboard Shortcuts" -msgstr "Tastenkombinationen" - -#: src/gtk/connected-device.ui:423 -msgid "XR Effect on/off shortcut" -msgstr "XR-Effekt an/aus Tastenkombination" - -#: src/gtk/connected-device.ui:424 -msgid "" -"Quickly enable or disable the XR Effect. You may need to enable the effect " -"manually once in order to enable the shortcut." -msgstr "" -"Schnell den XR-Effekt aktivieren oder deaktivieren. Möglicherweise muss der " -"Effekt einmalig manuell aktiviert werden, um die Tastenkombination zu " -"aktivieren." - -#: src/gtk/connected-device.ui:452 -msgid "Re-center display shortcut" -msgstr "Bildschirm-Zentrierung-Tastenkombination" - -#: src/gtk/connected-device.ui:453 -msgid "Pin the virtual display to the current position." -msgstr "Heften Sie den virtuellen Bildschirm an die aktuelle Position an." - -#: src/gtk/connected-device.ui:481 -msgid "Toggle zoom on focus shortcut" -msgstr "Folgemodus-Tastenkombination umschalten" - -#: src/gtk/connected-device.ui:482 -msgid "Quickly toggle zoom on focus mode." -msgstr "Schnell den Folgemodus wechseln." - -#: src/gtk/connected-device.ui:510 -msgid "Toggle follow mode shortcut" -msgstr "Folgemodus-Tastenkombination umschalten" - -#: src/gtk/connected-device.ui:511 -msgid "Quickly toggle follow mode." -msgstr "Schnell den Folgemodus wechseln." - -#: src/gtk/connected-device.ui:539 -msgid "Summon mouse cursor shortcut" -msgstr "Mauszeigerazeigenkürzel" - -#: src/gtk/connected-device.ui:540 -msgid "Bring the mouse cursor to the center of the focused display." -msgstr "Bewege den Mauszeiger in die Mitte des fokussierten Bildschirms." - -#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585 -msgid "Advanced Settings" -msgstr "Erweiterte Einstellungen" - -#: src/gtk/connected-device.ui:589 -msgid "Units" -msgstr "" - -#: src/gtk/connected-device.ui:590 -msgid "Choose measurement units for size and distance displays." -msgstr "" - -#: src/gtk/connected-device.ui:605 -msgid "Centimeters" -msgstr "" - -#: src/gtk/connected-device.ui:606 -msgid "Inches" -msgstr "" - -#: src/gtk/connected-device.ui:618 -msgid "Find optimal display config" -msgstr "Optimale Bildschirm-Konfiguration finden" - -#: src/gtk/connected-device.ui:619 -msgid "" -"Automatically modify the glasses display configuration for maximum " -"resolution and best scaling when plugged in." -msgstr "" -"Ändern Sie die Bildschirmkonfiguration der Brille automatisch zur maximalen " -"Auflösung und besten Skalierung, wenn sie angeschlossen ist." - -#: src/gtk/connected-device.ui:629 -msgid "Use highest refresh rate" -msgstr "Höchste Bildwiederholrate verwenden" - -#: src/gtk/connected-device.ui:630 -msgid "Refresh rate may affect performance, disable this to set it manually." -msgstr "" -"Die Bildwiederholrate kann die Leistung beeinflussen, deaktivieren Sie dies, " -"um sie manuell festzulegen." - -#: src/gtk/connected-device.ui:640 -msgid "Center on glasses' display" -msgstr "Zentriere auf den Brillenbildschirm" - -#: src/gtk/connected-device.ui:641 -msgid "" -"Center the viewport on the glasses' display, even if the display is not in " -"the middle." -msgstr "" -"Zentriere den Anzeigebereich auf den Brillenbildschirm, selbst wenn der " -"Bildschirm nicht mittig ist." - -#: src/gtk/connected-device.ui:651 -msgid "Always primary display" -msgstr "Immer primärer Bildschirm" - -#: src/gtk/connected-device.ui:652 -msgid "Automatically set the glasses as the primary display when plugged in." -msgstr "" -"Setzen Sie die Brille automatisch als primären Bildschirm, wenn sie " -"angeschlossen ist." - -#: src/gtk/connected-device.ui:662 -msgid "Remove virtual displays on disable" -msgstr "Gebogener Bildschirm" - -#: src/gtk/connected-device.ui:663 -msgid "Automatically remove virtual displays when the XR effect is disabled." -msgstr "" -"Entferne virtuelle Bildschirme automatisch, wenn der XR Effekt deaktiviert " -"ist." - -#: src/gtk/connected-device.ui:673 -msgid "Enable multi-tap detection" -msgstr "Aktiviere Multi Tap Erkennung" - -#: src/gtk/connected-device.ui:674 -msgid "Enables double-tap to recenter and triple-tap to recalibrate." -msgstr "" -"Aktviert die Doppelberührung zum rezentrieren und Dreifach-berührung zum " -"Kalibrieren." - -#: src/gtk/connected-device.ui:684 -msgid "All displays follow mode" -msgstr "Gebogener Bildschirm" - -#: src/gtk/connected-device.ui:685 -msgid "Follow mode moves all displays, not just the focused one." -msgstr "Folgemodus bewegt alle Bildschirme, nicht nur den fokussierten" - -#: src/gtk/connected-device.ui:701 -msgid "Neck-saver horizontal multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:702 -msgid "Higher values require smaller horizontal head movements." -msgstr "" - -#: src/gtk/connected-device.ui:734 -msgid "Neck-saver vertical multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:735 -msgid "Higher values require smaller vertical head movements." -msgstr "" - -#: src/gtk/connected-device.ui:767 -msgid "Dead-zone threshold (degrees)" -msgstr "" - -#: src/gtk/connected-device.ui:768 -msgid "Stabilize movements below this angle." -msgstr "" - -#: src/gtk/connected-device.ui:799 -msgid "Follow mode movement tracking" -msgstr "Folgemodus Bewegungstracking" - -#: src/gtk/connected-device.ui:800 -msgid "Choose which movements should be tracked in follow mode." -msgstr "Setzen Sie, welchen Bewegungen der Folgemodus folgen soll." - -#: src/gtk/connected-device.ui:815 -msgid "Horizontal" -msgstr "Horizontal" - -#: src/gtk/connected-device.ui:835 -msgid "Vertical" -msgstr "Vertikal" - -#: src/gtk/connected-device.ui:855 -msgid "Tilt/roll" -msgstr "Neigen/Rollen" - -#: src/gtk/connected-device.ui:873 -msgid "Movement look-ahead" -msgstr "Bewegungsvorausschau" - -#: src/gtk/connected-device.ui:874 -msgid "" -"Counteracts input lag by predicting head-tracking position ahead of render " -"time. Stick with default unless virtual display drags behind your head " -"movements, jumps ahead, or is very shaky." -msgstr "" -"Wirkt Eingabeverzögerungen entgegen, indem die Kopfverfolgungsposition vor " -"der Renderzeit vorhergesagt wird. Bleiben Sie bei den Standardeinstellungen, " -"es sei denn, der virtuelle Bildschirm hängt hinter Ihren Kopfbewegungen " -"hinterher, springt vor oder ist sehr wackelig." - -#: src/gtk/connected-device.ui:892 -msgid "Default" -msgstr "Standard" - -#: src/gtk/connected-device.ui:904 -msgid "Text Scaling" -msgstr "Textskalierung" - -#: src/gtk/connected-device.ui:905 -msgid "Scaling text below 1.0 will simulate a higher resolution display" -msgstr "Text unter 1.0 skalieren simuliert einen höher aufgelösten Bildschirm" - -#: src/gtk/custom-resolution-dialog-content.ui:9 -msgid "Width" -msgstr "Breite" - -#: src/gtk/custom-resolution-dialog-content.ui:42 -msgid "Height" -msgstr "Höhe" - -#: src/gtk/custom-resolution-dialog.ui:5 -msgid "Add a Custom Resolution" -msgstr "Eigene Auflösung hinzufügen" - -#: src/gtk/custom-resolution-dialog.ui:10 -msgid "Add" -msgstr "Hinzufügen" - -#: src/gtk/display-distance-dialog-content.ui:35 -msgid "closer" -msgstr "Näher" - -#: src/gtk/display-distance-dialog-content.ui:36 -msgid "default" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:37 -msgid "farther" -msgstr "Entfernter" - -#: src/gtk/display-distance-dialog.ui:9 -msgid "Done" -msgstr "Fertig" - -#: src/gtk/failed-verification.ui:15 -msgid "Breezy Desktop GNOME invalid setup" -msgstr "Ungültige Breezy Desktop GNOME-Installation" - -#: src/gtk/failed-verification.ui:16 -msgid "" -"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup " -"script. Report this issue if it persists." -msgstr "" -"Ihre Breezy GNOME-Installation ist ungültig oder unvollständig. Führen Sie " -"das Setup-Skript bitte erneut aus. Melden Sie dieses Problem, falls es " -"weiterhin besteht." - -#: src/gtk/license-dialog-content.ui:15 -msgid "Donate" -msgstr "Spenden" - -#: src/gtk/license-dialog-content.ui:31 -msgid "Request a token" -msgstr "Ein Token anfordern" - -#: src/gtk/license-dialog-content.ui:39 -msgid "Verify token" -msgstr "Token verifizieren" - -#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139 -msgid "License Details" -msgstr "Lizenzdetails" - -#: src/gtk/no-device.ui:15 -msgid "No device connected" -msgstr "Kein Gerät verbunden" - -#: src/gtk/no-device.ui:16 -msgid "Breezy Desktop was unable to detect any supported XR devices." -msgstr "Breezy Desktop konnte kein unterstütztes XR-Gerät erkennen." - -#: src/gtk/no-device.ui:25 -msgid "Auto-enable XR effect" -msgstr "XR-Effekt automatisch aktivieren" - -#: src/gtk/no-device.ui:26 -msgid "" -"Automatically enable the Breezy Desktop XR effect when supported glasses are " -"connected." -msgstr "" -"Automatisch den Breezy Desktop XR-Effekt aktivieren, wenn unterstützte " -"Gläser verbunden werden" - -#: src/gtk/no-driver.ui:15 -msgid "No driver running" -msgstr "Kein Treiber wird ausgeführt" - -#: src/gtk/no-driver.ui:16 -msgid "" -"\n" -" If you installed via AUR, make sure you ran the recommended post-" -"install command:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Otherwise, please file an issue on GitHub, or create a new thread " -"in the #troubleshooting channel on Discord.\n" -" " -msgstr "" -"\n" -" Wenn Sie über das AUR installiert haben, stellen Sie sicher, dass Sie den " -"empfohlenen Post-Installationsbefehl ausgeführt haben:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Andernfalls melden Sie bitte ein Problem auf GitHub oder erstellen Sie " -"einen neuen Thread im Kanal #troubleshooting auf Discord.\n" -" " - -#: src/gtk/no-extension.ui:15 -msgid "Breezy Desktop GNOME extension not ready" -msgstr "Breezy Desktop GNOME-Erweiterung nicht bereit" - -#: src/gtk/no-extension.ui:16 -msgid "" -"If you have just run the setup, then you may need to log out and back in to " -"use it. Otherwise, please follow the Breezy GNOME setup instructions." -msgstr "" -"Wenn Sie die Einrichtung gerade ausgeführt haben, müssen Sie sich " -"möglicherweise abmelden und wieder anmelden, um sie zu verwenden. " -"Andernfalls folgen Sie bitte den Breezy GNOME-Einrichtungsanweisungen." - -#: src/gtk/no-license.ui:15 -msgid "No license file was found" -msgstr "Keine Lizenzdatei wurde gefunden" - -#: src/gtk/no-license.ui:16 -msgid "" -"\n" -" The first time you use Breezy Desktop, an internet connection is " -"required to retrieve your device's license.\n" -" \n" -" Don't worry, there's no obligation to donate at this time. If you " -"haven't, you'll be given a trial license so you can decide if Breezy Desktop " -"fits your needs. \n" -" \n" -" Once you obtain a license, trial or otherwise, you can use Breezy " -"Desktop offline until features expire (or indefinitely, if you've chosen " -"lifetime access).\n" -" " -msgstr "" -"\n" -" Beim ersten Start von Breezy Desktop ist eine Internetverbindung " -"erforderlich, um die Lizenz für Ihr Gerät abzurufen.\n" -" \n" -" Keine Sorge, es besteht keine Verpflichtung, jetzt eine Spende zu tätigen. " -"Wenn Sie nicht spenden, erhalten Sie eine Testlizenz, damit Sie entscheiden " -"können, ob Breezy Desktop Ihren Anforderungen entspricht.\n" -" \n" -" Sobald Sie eine Lizenz, egal ob eine Test- oder Kauflizenz, erhalten haben, " -"können Sie Breezy Desktop offline nutzen, auch wenn die Funktionen ablaufen " -"(oder unbegrenzt, wenn Sie sich für den lebenslangen Zugriff entschieden " -"haben).\n" -" " - -#: src/gtk/no-license.ui:29 -msgid "Try Again" -msgstr "Erneut versuchen" - -#: src/gtk/shortcut-dialog.ui:5 -msgid "Assign Keyboard Shortcut" -msgstr "Tastenkombination zuweisen" - -#: src/gtk/shortcut-dialog.ui:20 -msgid "Press your keyboard shortcut or 'Backspace' to disable..." -msgstr "" -"Drücken Sie Ihre Tastenkombination oder die 'Rücktaste', um ... zu " -"deaktivieren" - -#: src/gtk/window.ui:10 -msgid "Breezy Desktop" -msgstr "Breezy Desktop" - -#: src/gtk/window.ui:23 -msgid "Menu" -msgstr "Menü" - -#: src/gtk/window.ui:43 -msgid "Some features expire soon" -msgstr "Einige Funktionen laufen bald ab" - -#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102 -msgid "View details" -msgstr "Details anzeigen" - -#: src/gtk/window.ui:68 -msgid "Productivity features are disabled" -msgstr "Produktivitätsfunktionen sind deaktiviert" - -#: src/gtk/window.ui:93 -msgid "" -"Productivity Pro license is inactive — 6DoF features will be unavailable" -msgstr "" - -#: src/gtk/window.ui:119 -msgid "" -"A newer version is available. To update, rerun the breezy_gnome_setup script." -msgstr "" - -#: src/gtk/window.ui:143 -msgid "Force Reset" -msgstr "Zurrücksetzung erwzingen" - -#: src/gtk/window.ui:147 -msgid "About BreezyDesktop" -msgstr "Über BreezyDesktop" - -#~ msgid "Side-by-side mode (gaming)" -#~ msgstr "Side-by-Side-Modus (Gaming)" - -#~ msgid "Smooth Follow (gaming)" -#~ msgstr "Glattes Verfolgen (Gaming)" - -#~ msgid "Breezy Desktop (productivity)" -#~ msgstr "Breezy Desktop (Produktivität)" - -#~ msgid "Gaming" -#~ msgstr "Gaming" - -#~ msgid "Productivity" -#~ msgstr "Produktivität" - -#~ msgid "fullscreen" -#~ msgstr "Vollbild" - -#~ msgid "Show full range" -#~ msgstr "Gesamtes Spektrum anzeigen" - -#~ msgid "" -#~ "Unable to add virtual displays on this machine. Wayland and xdg-desktop-" -#~ "portal are required." -#~ msgstr "" -#~ "Virtuelle Bildschirme können nicht hinzugefügt werden.Wayland und xdg-" -#~ "desktop-portal werden benötigt" - -#~ msgid "Fast SBS mode switching" -#~ msgstr "Schnelles SBS-Modus-Wechseln" - -#~ msgid "" -#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen " -#~ "mode is on. May cause instability." -#~ msgstr "" -#~ "Schaltet die Brille sofort in den SBS-Modus, wenn sie angeschlossen ist, " -#~ "wenn der Breitbildmodus aktiviert ist. Kann zu Instabilität führen." - -#, fuzzy -#~ msgid "Set Unfocused Displays Distance" -#~ msgstr "Display-Entfernung" - -#~ msgid "Widescreen mode" -#~ msgstr "Breitbildmodus" - -#~ msgid "" -#~ "Closer appears larger, further appears smaller. Controls depth when in " -#~ "widescreen mode." -#~ msgstr "" -#~ "Näher erscheint größer, weiter erscheint kleiner. Steuert die Tiefe, wenn " -#~ "im Breitbildmodus." - -#~ msgid "" -#~ "Combine with display distance to achieve a comfortable level of depth and " -#~ "size." -#~ msgstr "" -#~ "Kombinieren Sie mit der Display-Entfernung, um eine bequeme Ebene der " -#~ "Tiefe und Größe zu erreichen." - -#~ msgid "Display toggle distances" -#~ msgstr "Umschalten der Display-Entfernungen" - -#~ msgid "" -#~ "Use the buttons to capture the current display distance for use with the " -#~ "keyboard shortcut." -#~ msgstr "" -#~ "Verwenden Sie die Schaltflächen, um die aktuelle Display-Entfernung für " -#~ "die Verwendung mit der Tastenkombination aufzufangen." - -#~ msgid "Display distance shortcut" -#~ msgstr "Display-Entfernung-Tastenkombination" - -#~ msgid "Quickly toggle between two predefined distances." -#~ msgstr "Schnell zwischen zwei vordefinierten Entfernungen wechseln." - -#~ msgid "Start in widescreen mode" -#~ msgstr "Im Breitbildmodus starten" - -#~ msgid "Widescreen mode is not supported for all glasses." -#~ msgstr "Breitbildmodus wird nicht für alle Gläsern unterstützt" diff --git a/ui/po/es.po b/ui/po/es.po deleted file mode 100644 index ee17494..0000000 --- a/ui/po/es.po +++ /dev/null @@ -1,857 +0,0 @@ -# Spanish translations for PACKAGE package. -# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# , 2024. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-03 12:40-0800\n" -"PO-Revision-Date: 2024-08-02 20:55-0700\n" -"Last-Translator: \n" -"Language-Team: Spanish \n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: src/connecteddevice.py:29 -msgid "" -"Switches your glasses into side-by-side mode and doubles the width of the " -"display." -msgstr "" -"Cambia tus gafas al modo lado a lado y duplica el ancho de la pantalla." - -#: src/connecteddevice.py:30 -msgid "This feature is not currently supported for your device." -msgstr "Esta función no es compatible con tu dispositivo en este momento." - -#: src/connecteddevice.py:160 -msgid "Set Focused Display Distance" -msgstr "Ajusta Distancia de Enfoque de la Pantalla" - -#: src/connecteddevice.py:161 -msgid "Use a closer value so the display zooms in when you look at it." -msgstr "" -"Usa un valor más cercano para que la pantalla se acerque cuando la mires." - -#: src/connecteddevice.py:168 -msgid "Set All Displays Distance" -msgstr "Ajusta Todas las Distancias de Pantalla" - -#: src/connecteddevice.py:169 -msgid "Use a farther value so the displays are zoomed out when you look away." -msgstr "" -"Usa un valor más alejado para que las pantallas se alejen cuando apartes la " -"vista." - -#: src/connecteddevice.py:309 -msgid "" -"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, " -"and the pipewire GStreamer plugin are required." -msgstr "" -"No se pueden agregar pantallas virtuales en esta máquina. Se requiere " -"Wayland y xdg-desktop-portal." - -#: src/connecteddevice.py:343 -msgid "Focused display" -msgstr "Pantalla enfocada" - -#: src/connecteddevice.py:349 -msgid "All displays" -msgstr "Todas las pantallas" - -#: src/licensedialogcontent.py:63 -msgid "Paid Tier Status" -msgstr "Estado del Nivel de Membresía Pagada" - -#: src/licensedialogcontent.py:71 -msgid "Feature Availability" -msgstr "Disponibilidad de Características" - -#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104 -#: src/gtk/connected-device.ui:786 -msgid "Disabled" -msgstr "Deshabilitado" - -#: src/licensefeaturerow.py:18 -msgid "In trial" -msgstr "En prueba" - -#: src/licensefeaturerow.py:18 -msgid "Enabled" -msgstr "Habilitado" - -#: src/licensefeaturerow.py:24 src/licensetierrow.py:30 -#, python-brace-format -msgid " ({time_remaining} remaining)" -msgstr " ({time_remaining} restantes)" - -#: src/licensefeaturerow.py:30 src/licensetierrow.py:56 -msgid "Productivity Basic" -msgstr "" - -#: src/licensefeaturerow.py:31 src/licensetierrow.py:57 -msgid "Productivity Pro" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Active" -msgstr "Activo" - -#: src/licensetierrow.py:24 -msgid "Inactive" -msgstr "Inactivo" - -#: src/licensetierrow.py:41 -#, python-brace-format -msgid "${amount} USD" -msgstr "${amount} USD" - -#: src/licensetierrow.py:43 -msgid " to renew" -msgstr " para renovar" - -#: src/licensetierrow.py:45 -msgid " to upgrade" -msgstr " para actualizar" - -#: src/licensetierrow.py:47 -msgid "Paid through next renewal period" -msgstr "Pagado hasta el próximo período de renovación" - -#: src/licensetierrow.py:63 -msgid " - renewing monthly" -msgstr " - renovando mensualmente" - -#: src/licensetierrow.py:64 -msgid " - renewing yearly" -msgstr " - renovando anualmente" - -#: src/licensetierrow.py:65 -msgid "with lifetime access" -msgstr "con acceso de por vida" - -#: src/licensetierrow.py:72 -msgid "Monthly" -msgstr "Mensual" - -#: src/licensetierrow.py:73 -msgid "Yearly" -msgstr "Anual" - -#: src/licensetierrow.py:74 -msgid "Lifetime" -msgstr "De por vida" - -#: src/time.py:14 -msgid "less than an hour" -msgstr "menos de una hora" - -#: src/time.py:17 -msgid "1 hour" -msgstr "1 hora" - -#: src/time.py:17 -#, python-brace-format -msgid "{time_remaining} hours" -msgstr "{time_remaining} horas" - -#: src/time.py:20 -msgid "1 day" -msgstr "1 día" - -#: src/time.py:20 -#, python-brace-format -msgid "{time_remaining} days" -msgstr "{time_remaining} días" - -#: src/gtk/connected-device.ui:21 -msgid "connected" -msgstr "conectado" - -#: src/gtk/connected-device.ui:31 -msgid "General Settings" -msgstr "Configuración General" - -#: src/gtk/connected-device.ui:41 -msgid "Features" -msgstr "Características" - -#: src/gtk/connected-device.ui:45 -msgid "XR effect" -msgstr "Efecto XR" - -#: src/gtk/connected-device.ui:46 -msgid "Enables the Breezy Desktop XR effect." -msgstr "Habilita el efecto XR de Breezy Desktop." - -#: src/gtk/connected-device.ui:56 -msgid "Zoom on focus" -msgstr "Acercar al enfocar" - -#: src/gtk/connected-device.ui:57 -msgid "" -"Automatically move a display closer when you look at it.\n" -"Set your preferred focused and unfocused distances in the Adjustments " -"section.\n" -" " -msgstr "" -"Acercar automáticamente una pantalla cuando la mires.\n" -"Establece tus distancias preferidas de enfoque y desenfoque en la sección de " -"Ajustes.\n" -" " - -#: src/gtk/connected-device.ui:70 -msgid "Follow mode" -msgstr "Modo de seguimiento" - -#: src/gtk/connected-device.ui:71 -msgid "Keep the focused display near the center of your view." -msgstr "Mantener la pantalla enfocada cerca del centro de campo visual." - -#: src/gtk/connected-device.ui:81 -msgid "Curved display" -msgstr "Pantalla curvada" - -#: src/gtk/connected-device.ui:82 -msgid "Switch between flat and curved displays." -msgstr "Cambiar entre pantallas planas y curvadas." - -#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36 -msgid "Disable physical displays" -msgstr "Desactivar pantallas físicas" - -#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37 -msgid "" -"Automatically disable all physical displays when the XR effect is enabled." -msgstr "" -"Desactivar automáticamente todas las pantallas físicas cuando el efecto XR " -"esté habilitado." - -#: src/gtk/connected-device.ui:104 -msgid "Virtual displays" -msgstr "Pantallas virtuales" - -#: src/gtk/connected-device.ui:120 -msgid "1080p" -msgstr "1080p" - -#: src/gtk/connected-device.ui:121 -msgid "1440p" -msgstr "1440p" - -#: src/gtk/connected-device.ui:122 -msgid "Add custom" -msgstr "Añadir personalizada" - -#: src/gtk/connected-device.ui:136 -msgid "Remove custom resolution" -msgstr "Eliminar resolución personalizada" - -#: src/gtk/connected-device.ui:156 -msgid "Rearrange displays" -msgstr "Reorganizar pantallas" - -#: src/gtk/connected-device.ui:174 -msgid "Adjustments" -msgstr "Ajustes" - -#: src/gtk/connected-device.ui:178 -msgid "Display distances" -msgstr "Distancias de la pantalla" - -#: src/gtk/connected-device.ui:179 -msgid "Set how close you want displays to appear." -msgstr "Ajusta cómo de cerca quieres que aparezcan las pantallas." - -#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221 -#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472 -#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530 -#: src/gtk/connected-device.ui:559 -msgid "Change" -msgstr "Cambiar" - -#: src/gtk/connected-device.ui:234 -msgid "Display size" -msgstr "" - -#: src/gtk/connected-device.ui:235 -msgid "Set how large you want the display to appear." -msgstr "" - -#: src/gtk/connected-device.ui:254 -msgid "full" -msgstr "" - -#: src/gtk/connected-device.ui:264 -msgid "Follow threshold" -msgstr "Umbral de seguimiento" - -#: src/gtk/connected-device.ui:265 -msgid "How far away you can look before the display follows." -msgstr "Hasta qué punto puedes mirar antes de que la pantalla siga." - -#: src/gtk/connected-device.ui:288 -msgid "Display angling" -msgstr "Inclinación de la pantalla" - -#: src/gtk/connected-device.ui:289 -msgid "" -"When there are multiple displays, choose how they should angle towards you." -msgstr "Cuando hay múltiples pantallas, elige cómo deben inclinarse hacia ti." - -#: src/gtk/connected-device.ui:303 -msgid "Automatic" -msgstr "Automático" - -#: src/gtk/connected-device.ui:304 -msgid "Side-angled" -msgstr "Inclinación lateral" - -#: src/gtk/connected-device.ui:305 -msgid "Top-angled" -msgstr "Inclinación superior" - -#: src/gtk/connected-device.ui:306 -msgid "Flat" -msgstr "Plano" - -#: src/gtk/connected-device.ui:316 -msgid "Display spacing" -msgstr "Separación de pantallas" - -#: src/gtk/connected-device.ui:317 -msgid "Put empty space between displays, when there are multiple." -msgstr "Poner espacio vacío entre las pantallas, cuando haya varias." - -#: src/gtk/connected-device.ui:347 -msgid "Viewport horizontal offset" -msgstr "Desplazamiento horizontal del visor" - -#: src/gtk/connected-device.ui:348 -msgid "Move the viewport to the left or right of its default position." -msgstr "Mueve el visor a izquierda o derecha de su posición predeterminada." - -#: src/gtk/connected-device.ui:365 -msgid "left" -msgstr "izquierda" - -#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397 -msgid "center" -msgstr "centro" - -#: src/gtk/connected-device.ui:369 -msgid "right" -msgstr "derecha" - -#: src/gtk/connected-device.ui:377 -msgid "Viewport vertical offset" -msgstr "Desplazamiento vertical del visor" - -#: src/gtk/connected-device.ui:378 -msgid "Move the viewport up or down from its default position." -msgstr "Mueve el visor arriba o abajo de su posición predeterminada." - -#: src/gtk/connected-device.ui:395 -msgid "down" -msgstr "abajo" - -#: src/gtk/connected-device.ui:399 -msgid "up" -msgstr "arriba" - -#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420 -msgid "Keyboard Shortcuts" -msgstr "Atajos de teclado" - -#: src/gtk/connected-device.ui:423 -msgid "XR Effect on/off shortcut" -msgstr "Atajo encendido/apagado Efecto XR" - -#: src/gtk/connected-device.ui:424 -msgid "" -"Quickly enable or disable the XR Effect. You may need to enable the effect " -"manually once in order to enable the shortcut." -msgstr "" -"Activa o desactiva rápidamente el Efecto XR. Es posible que necesites " -"activar el efecto manualmente una vez para habilitar el atajo." - -#: src/gtk/connected-device.ui:452 -msgid "Re-center display shortcut" -msgstr "Atajo para recentrar la pantalla" - -#: src/gtk/connected-device.ui:453 -msgid "Pin the virtual display to the current position." -msgstr "Fije la pantalla virtual en la posición actual." - -#: src/gtk/connected-device.ui:481 -msgid "Toggle zoom on focus shortcut" -msgstr "Atajo para alternar el acercamiento al enfocar" - -#: src/gtk/connected-device.ui:482 -msgid "Quickly toggle zoom on focus mode." -msgstr "Modo para alternar rápidamente el acercamiento al enfocar." - -#: src/gtk/connected-device.ui:510 -msgid "Toggle follow mode shortcut" -msgstr "Atajo para alternar el modo de seguimiento" - -#: src/gtk/connected-device.ui:511 -msgid "Quickly toggle follow mode." -msgstr "Activar el modo de seguimiento." - -#: src/gtk/connected-device.ui:539 -msgid "Summon mouse cursor shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:540 -msgid "Bring the mouse cursor to the center of the focused display." -msgstr "" - -#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585 -msgid "Advanced Settings" -msgstr "Configuración Avanzada" - -#: src/gtk/connected-device.ui:589 -msgid "Units" -msgstr "" - -#: src/gtk/connected-device.ui:590 -msgid "Choose measurement units for size and distance displays." -msgstr "" - -#: src/gtk/connected-device.ui:605 -msgid "Centimeters" -msgstr "" - -#: src/gtk/connected-device.ui:606 -msgid "Inches" -msgstr "" - -#: src/gtk/connected-device.ui:618 -msgid "Find optimal display config" -msgstr "Encuentre la configuración de pantalla óptima" - -#: src/gtk/connected-device.ui:619 -msgid "" -"Automatically modify the glasses display configuration for maximum " -"resolution and best scaling when plugged in." -msgstr "" -"Modifique automáticamente la configuración de pantalla de las gafas para " -"obtener la máxima resolución y la mejor escalabilidad cuando estén " -"enchufadas." - -#: src/gtk/connected-device.ui:629 -msgid "Use highest refresh rate" -msgstr "Utilizar la frecuencia de actualización más alta" - -#: src/gtk/connected-device.ui:630 -msgid "Refresh rate may affect performance, disable this to set it manually." -msgstr "" -"La frecuencia de actualización puede afectar el rendimiento, deshabilite " -"esto para configurarlo manualmente." - -#: src/gtk/connected-device.ui:640 -msgid "Center on glasses' display" -msgstr "Centrar en la pantalla de las gafas" - -#: src/gtk/connected-device.ui:641 -msgid "" -"Center the viewport on the glasses' display, even if the display is not in " -"the middle." -msgstr "" -"Centrar el visor en la pantalla de las gafas, incluso si la pantalla no está " -"en el centro." - -#: src/gtk/connected-device.ui:651 -msgid "Always primary display" -msgstr "Siempre como pantalla principal" - -#: src/gtk/connected-device.ui:652 -msgid "Automatically set the glasses as the primary display when plugged in." -msgstr "" -"Automáticamente configurar las gafas como pantalla principal al enchufarse." - -#: src/gtk/connected-device.ui:662 -msgid "Remove virtual displays on disable" -msgstr "Eliminar pantallas virtuales al desactivar" - -#: src/gtk/connected-device.ui:663 -msgid "Automatically remove virtual displays when the XR effect is disabled." -msgstr "" -"Eliminar automáticamente las pantallas virtuales cuando se desactiva el " -"efecto XR." - -#: src/gtk/connected-device.ui:673 -msgid "Enable multi-tap detection" -msgstr "Activar la detección de toques múltiples" - -#: src/gtk/connected-device.ui:674 -msgid "Enables double-tap to recenter and triple-tap to recalibrate." -msgstr "" -"Activa el doble toque para recentrar y el triple toque para recalibrar." - -#: src/gtk/connected-device.ui:684 -msgid "All displays follow mode" -msgstr "Modo de seguimiento de todas las pantallas" - -#: src/gtk/connected-device.ui:685 -msgid "Follow mode moves all displays, not just the focused one." -msgstr "El modo de seguimiento mueve todas las pantallas, no solo la enfocada." - -#: src/gtk/connected-device.ui:701 -msgid "Neck-saver horizontal multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:702 -msgid "Higher values require smaller horizontal head movements." -msgstr "" - -#: src/gtk/connected-device.ui:734 -msgid "Neck-saver vertical multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:735 -msgid "Higher values require smaller vertical head movements." -msgstr "" - -#: src/gtk/connected-device.ui:767 -msgid "Dead-zone threshold (degrees)" -msgstr "" - -#: src/gtk/connected-device.ui:768 -msgid "Stabilize movements below this angle." -msgstr "" - -#: src/gtk/connected-device.ui:799 -msgid "Follow mode movement tracking" -msgstr "Rastreo de movimiento de modo de seguimiento" - -#: src/gtk/connected-device.ui:800 -msgid "Choose which movements should be tracked in follow mode." -msgstr "Elige qué movimientos deben rastrearse en el modo de seguimiento." - -#: src/gtk/connected-device.ui:815 -msgid "Horizontal" -msgstr "Horizontal" - -#: src/gtk/connected-device.ui:835 -msgid "Vertical" -msgstr "Vertical" - -#: src/gtk/connected-device.ui:855 -msgid "Tilt/roll" -msgstr "Inclinación/giro" - -#: src/gtk/connected-device.ui:873 -msgid "Movement look-ahead" -msgstr "Anticipación de movimiento" - -#: src/gtk/connected-device.ui:874 -msgid "" -"Counteracts input lag by predicting head-tracking position ahead of render " -"time. Stick with default unless virtual display drags behind your head " -"movements, jumps ahead, or is very shaky." -msgstr "" -"Compensa el retraso de entrada al predecir la posición de seguimiento de la " -"cabeza antes del tiempo de representación. Manténgase en el valor " -"predeterminado a menos que la pantalla virtual se retrase detrás de los " -"movimientos de la cabeza, se adelante o sea muy inestable." - -#: src/gtk/connected-device.ui:892 -msgid "Default" -msgstr "Predeterminado" - -#: src/gtk/connected-device.ui:904 -msgid "Text Scaling" -msgstr "Escalado de Texto" - -#: src/gtk/connected-device.ui:905 -msgid "Scaling text below 1.0 will simulate a higher resolution display" -msgstr "" -"Escalando el texto por debajo de 1.0 simulará una pantalla de mayor " -"resolución" - -#: src/gtk/custom-resolution-dialog-content.ui:9 -msgid "Width" -msgstr "Anchura" - -#: src/gtk/custom-resolution-dialog-content.ui:42 -msgid "Height" -msgstr "Altura" - -#: src/gtk/custom-resolution-dialog.ui:5 -msgid "Add a Custom Resolution" -msgstr "Añadir una Resolución Personalizada" - -#: src/gtk/custom-resolution-dialog.ui:10 -msgid "Add" -msgstr "Añadir" - -#: src/gtk/display-distance-dialog-content.ui:35 -msgid "closer" -msgstr "más próximo" - -#: src/gtk/display-distance-dialog-content.ui:36 -msgid "default" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:37 -msgid "farther" -msgstr "más lejano" - -#: src/gtk/display-distance-dialog.ui:9 -msgid "Done" -msgstr "Hecho" - -#: src/gtk/failed-verification.ui:15 -msgid "Breezy Desktop GNOME invalid setup" -msgstr "Configuración inválida de Breezy Desktop GNOME" - -#: src/gtk/failed-verification.ui:16 -msgid "" -"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup " -"script. Report this issue if it persists." -msgstr "" -"Su configuración de Breezy GNOME es inválida o incompleta. Vuelva a ejecutar " -"el script de configuración. Informe sobre este problema si persiste." - -#: src/gtk/license-dialog-content.ui:15 -msgid "Donate" -msgstr "Donar" - -#: src/gtk/license-dialog-content.ui:31 -msgid "Request a token" -msgstr "Solicitar un token" - -#: src/gtk/license-dialog-content.ui:39 -msgid "Verify token" -msgstr "Verificar token" - -#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139 -msgid "License Details" -msgstr "Detalles de la Licencia" - -#: src/gtk/no-device.ui:15 -msgid "No device connected" -msgstr "No hay dispositivo conectado" - -#: src/gtk/no-device.ui:16 -msgid "Breezy Desktop was unable to detect any supported XR devices." -msgstr "Breezy Desktop no pudo detectar ningún dispositivo XR compatible." - -#: src/gtk/no-device.ui:25 -msgid "Auto-enable XR effect" -msgstr "Auto-activar efecto XR" - -#: src/gtk/no-device.ui:26 -msgid "" -"Automatically enable the Breezy Desktop XR effect when supported glasses are " -"connected." -msgstr "" -"Habilita automáticamente el efecto Breezy Desktop XR cuando se conectan " -"gafas compatibles." - -#: src/gtk/no-driver.ui:15 -msgid "No driver running" -msgstr "No se está ejecutando ningún controlador" - -#: src/gtk/no-driver.ui:16 -msgid "" -"\n" -" If you installed via AUR, make sure you ran the recommended post-" -"install command:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Otherwise, please file an issue on GitHub, or create a new thread " -"in the #troubleshooting channel on Discord.\n" -" " -msgstr "" -"\n" -" Si instaló a través de AUR, asegúrese de haber ejecutado el comando de " -"instalación recomendado:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" De lo contrario, por favor informe sobre el problema en GitHub, o cree un " -"nuevo hilo en el canal #troubleshooting de Discord.\n" -" " - -#: src/gtk/no-extension.ui:15 -msgid "Breezy Desktop GNOME extension not ready" -msgstr "La extensión de Breezy Desktop GNOME no está lista" - -#: src/gtk/no-extension.ui:16 -msgid "" -"If you have just run the setup, then you may need to log out and back in to " -"use it. Otherwise, please follow the Breezy GNOME setup instructions." -msgstr "" -"Si acaba de ejecutar la configuración, es posible que deba cerrar sesión y " -"volver a iniciar para usarla. De lo contrario, siga las instrucciones de " -"configuración de Breezy GNOME." - -#: src/gtk/no-license.ui:15 -msgid "No license file was found" -msgstr "No se encontró ningún archivo de licencia" - -#: src/gtk/no-license.ui:16 -msgid "" -"\n" -" The first time you use Breezy Desktop, an internet connection is " -"required to retrieve your device's license.\n" -" \n" -" Don't worry, there's no obligation to donate at this time. If you " -"haven't, you'll be given a trial license so you can decide if Breezy Desktop " -"fits your needs. \n" -" \n" -" Once you obtain a license, trial or otherwise, you can use Breezy " -"Desktop offline until features expire (or indefinitely, if you've chosen " -"lifetime access).\n" -" " -msgstr "" -"\n" -" La primera vez que use Breezy Desktop, se requiere una conexión a Internet " -"para recuperar la licencia de su dispositivo.\n" -" \n" -" No se preocupe, no hay ninguna obligación de donar en este momento. Si no " -"lo ha hecho, se le proporcionará una licencia de prueba para que pueda " -"decidir si Breezy Desktop se ajusta a sus necesidades.\n" -" \n" -" Una vez que obtenga una licencia, de prueba o de otro tipo, podrá utilizar " -"Breezy Desktop sin conexión hasta que expiren las características (o " -"indefinidamente, si ha elegido el acceso de por vida). " - -#: src/gtk/no-license.ui:29 -msgid "Try Again" -msgstr "Reintentar" - -#: src/gtk/shortcut-dialog.ui:5 -msgid "Assign Keyboard Shortcut" -msgstr "Asignar método abreviado de teclado" - -#: src/gtk/shortcut-dialog.ui:20 -msgid "Press your keyboard shortcut or 'Backspace' to disable..." -msgstr "" -"Presione su método abreviado de teclado o pulsa 'retroceso' para " -"deshabilitar..." - -#: src/gtk/window.ui:10 -msgid "Breezy Desktop" -msgstr "Breezy Desktop" - -#: src/gtk/window.ui:23 -msgid "Menu" -msgstr "Menú" - -#: src/gtk/window.ui:43 -msgid "Some features expire soon" -msgstr "Algunas funciones expirarán pronto" - -#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102 -msgid "View details" -msgstr "Ver detalles" - -#: src/gtk/window.ui:68 -msgid "Productivity features are disabled" -msgstr "Las funciones de productividad están deshabilitadas" - -#: src/gtk/window.ui:93 -msgid "" -"Productivity Pro license is inactive — 6DoF features will be unavailable" -msgstr "" - -#: src/gtk/window.ui:119 -msgid "" -"A newer version is available. To update, rerun the breezy_gnome_setup script." -msgstr "" - -#: src/gtk/window.ui:143 -msgid "Force Reset" -msgstr "Reinicio forzoso" - -#: src/gtk/window.ui:147 -msgid "About BreezyDesktop" -msgstr "Acerca de BreezyDesktop" - -#~ msgid "Side-by-side mode (gaming)" -#~ msgstr "Modo lado a lado (juegos)" - -#~ msgid "Smooth Follow (gaming)" -#~ msgstr "Seguimiento suave (juegos)" - -#~ msgid "Breezy Desktop (productivity)" -#~ msgstr "Breezy Desktop (productividad)" - -#~ msgid "Gaming" -#~ msgstr "Juegos" - -#~ msgid "Productivity" -#~ msgstr "Productividad" - -#~ msgid "fullscreen" -#~ msgstr "a toda pantalla" - -#~ msgid "Show full range" -#~ msgstr "Mostrar rango completo" - -#~ msgid "" -#~ "Unable to add virtual displays on this machine. Wayland and xdg-desktop-" -#~ "portal are required." -#~ msgstr "" -#~ "No se pueden agregar pantallas virtuales en esta máquina. Se requiere " -#~ "Wayland y xdg-desktop-portal." - -#~ msgid "Fast SBS mode switching" -#~ msgstr "Cambio rápido de modo SBS" - -#~ msgid "" -#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen " -#~ "mode is on. May cause instability." -#~ msgstr "" -#~ "Cambia las gafas al modo SBS (lado a lado) inmediatamente cuando se " -#~ "enchufan, si el modo de pantalla ancha está activado. Puede causar " -#~ "inestabilidad." - -#~ msgid "Set Unfocused Displays Distance" -#~ msgstr "Establecer Distancia de las Pantallas Desenfocadas" - -#~ msgid "Widescreen mode" -#~ msgstr "Modo pantalla ancha" - -#~ msgid "" -#~ "Closer appears larger, further appears smaller. Controls depth when in " -#~ "widescreen mode." -#~ msgstr "" -#~ "Más cerca parece más grande, más lejos parece más pequeño. Controla la " -#~ "profundidad cuando está en modo de pantalla ancha." - -#~ msgid "" -#~ "Combine with display distance to achieve a comfortable level of depth and " -#~ "size." -#~ msgstr "" -#~ "Combínalo con la distancia de la pantalla para lograr un nivel cómodo de " -#~ "profundidad y tamaño." - -#~ msgid "Display toggle distances" -#~ msgstr "Distancias de alternancia de pantalla" - -#~ msgid "" -#~ "Use the buttons to capture the current display distance for use with the " -#~ "keyboard shortcut." -#~ msgstr "" -#~ "Utilice los botones para capturar la distancia actual de la pantalla para " -#~ "su uso con el método abreviado de teclado." - -#~ msgid "Display distance shortcut" -#~ msgstr "Atajo de distancia de pantalla" - -#~ msgid "Quickly toggle between two predefined distances." -#~ msgstr "Cambiar rápidamente entre dos distancias predefinidas." - -#~ msgid "Start in widescreen mode" -#~ msgstr "Empezar en modo pantalla ancha" - -#~ msgid "Widescreen mode is not supported for all glasses." -#~ msgstr "El modo pantalla ancha no está soportado en todas las gafas." diff --git a/ui/po/fr.po b/ui/po/fr.po deleted file mode 100644 index 09d33ce..0000000 --- a/ui/po/fr.po +++ /dev/null @@ -1,867 +0,0 @@ -# French translations for PACKAGE package. -# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# , 2024. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-03 12:40-0800\n" -"PO-Revision-Date: 2024-08-02 20:54-0700\n" -"Last-Translator: \n" -"Language-Team: French \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#: src/connecteddevice.py:29 -msgid "" -"Switches your glasses into side-by-side mode and doubles the width of the " -"display." -msgstr "" -"Basculez vos lunettes en mode Side-By-Side (Côte-à-Côte) et doublez la " -"largeur de l'écran." - -#: src/connecteddevice.py:30 -msgid "This feature is not currently supported for your device." -msgstr "" -"Cette fonctionnalité n'est actuellement pas prise en charge par votre " -"appareil." - -#: src/connecteddevice.py:160 -msgid "Set Focused Display Distance" -msgstr "Définir la distance de l'écran cible" - -#: src/connecteddevice.py:161 -msgid "Use a closer value so the display zooms in when you look at it." -msgstr "" -"Utiliser une valeur plus proche pour que l'écran zoom lorsqu'on le regarde." - -#: src/connecteddevice.py:168 -msgid "Set All Displays Distance" -msgstr "Définir la distance d'affichage de tous les écrans" - -#: src/connecteddevice.py:169 -msgid "Use a farther value so the displays are zoomed out when you look away." -msgstr "" -"Utiliser une valeur plus éloignée afin que les écrans dézooment lorsqu'on ne " -"les regarde plus." - -#: src/connecteddevice.py:309 -msgid "" -"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, " -"and the pipewire GStreamer plugin are required." -msgstr "" -"Impossible d'ajouter des écrans virtuels sur cet appareil. Wayland et xdg-" -"desktop-portal sont nécessaires." - -#: src/connecteddevice.py:343 -msgid "Focused display" -msgstr "Ecran cible" - -#: src/connecteddevice.py:349 -msgid "All displays" -msgstr "Tous les écrans" - -#: src/licensedialogcontent.py:63 -msgid "Paid Tier Status" -msgstr "Statut de l'abonnement payant" - -#: src/licensedialogcontent.py:71 -msgid "Feature Availability" -msgstr "Disponibilité des fonctionnalités" - -#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104 -#: src/gtk/connected-device.ui:786 -msgid "Disabled" -msgstr "Désactivé" - -#: src/licensefeaturerow.py:18 -msgid "In trial" -msgstr "En essai" - -#: src/licensefeaturerow.py:18 -msgid "Enabled" -msgstr "Activé" - -#: src/licensefeaturerow.py:24 src/licensetierrow.py:30 -#, python-brace-format -msgid " ({time_remaining} remaining)" -msgstr " ({time_remaining} restant)" - -#: src/licensefeaturerow.py:30 src/licensetierrow.py:56 -msgid "Productivity Basic" -msgstr "" - -#: src/licensefeaturerow.py:31 src/licensetierrow.py:57 -msgid "Productivity Pro" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Active" -msgstr "Actif" - -#: src/licensetierrow.py:24 -msgid "Inactive" -msgstr "Inactif" - -#: src/licensetierrow.py:41 -#, python-brace-format -msgid "${amount} USD" -msgstr "${amount} USD" - -#: src/licensetierrow.py:43 -msgid " to renew" -msgstr " à renouveler" - -#: src/licensetierrow.py:45 -msgid " to upgrade" -msgstr " à mettre à niveau" - -#: src/licensetierrow.py:47 -msgid "Paid through next renewal period" -msgstr "Payé jusqu'à la prochaine période de renouvellement" - -#: src/licensetierrow.py:63 -msgid " - renewing monthly" -msgstr " - renouvellement mensuel" - -#: src/licensetierrow.py:64 -msgid " - renewing yearly" -msgstr " - renouvellement annuel" - -#: src/licensetierrow.py:65 -msgid "with lifetime access" -msgstr "avec accès à vie" - -#: src/licensetierrow.py:72 -msgid "Monthly" -msgstr "Mensuel" - -#: src/licensetierrow.py:73 -msgid "Yearly" -msgstr "Annuel" - -#: src/licensetierrow.py:74 -msgid "Lifetime" -msgstr "À vie" - -#: src/time.py:14 -msgid "less than an hour" -msgstr "moins d'une heure" - -#: src/time.py:17 -msgid "1 hour" -msgstr "1 heure" - -#: src/time.py:17 -#, python-brace-format -msgid "{time_remaining} hours" -msgstr "{time_remaining} heures" - -#: src/time.py:20 -msgid "1 day" -msgstr "1 jour" - -#: src/time.py:20 -#, python-brace-format -msgid "{time_remaining} days" -msgstr "{time_remaining} jours" - -#: src/gtk/connected-device.ui:21 -msgid "connected" -msgstr "connecté" - -#: src/gtk/connected-device.ui:31 -msgid "General Settings" -msgstr "Paramètres généraux" - -#: src/gtk/connected-device.ui:41 -msgid "Features" -msgstr "Fonctionnalités" - -#: src/gtk/connected-device.ui:45 -msgid "XR effect" -msgstr "Effet XR" - -#: src/gtk/connected-device.ui:46 -msgid "Enables the Breezy Desktop XR effect." -msgstr "Active l'effet Breezy Desktop XR." - -#: src/gtk/connected-device.ui:56 -msgid "Zoom on focus" -msgstr "Zoomer sur l'écran cible" - -#: src/gtk/connected-device.ui:57 -msgid "" -"Automatically move a display closer when you look at it.\n" -"Set your preferred focused and unfocused distances in the Adjustments " -"section.\n" -" " -msgstr "" -"Fait automatiquement avancer l'écran lorsqu'on le regarde. Réglez votre " -"niveau de zoom et de dézoom dans la section Ajustements.\n" -" " - -#: src/gtk/connected-device.ui:70 -msgid "Follow mode" -msgstr "Mode de suivi" - -#: src/gtk/connected-device.ui:71 -msgid "Keep the focused display near the center of your view." -msgstr "Garde l'écran cible près du centre de votre champ de vision." - -#: src/gtk/connected-device.ui:81 -msgid "Curved display" -msgstr "Affichage incurvé" - -#: src/gtk/connected-device.ui:82 -msgid "Switch between flat and curved displays." -msgstr "Basculez entre les affichages plats et incurvés." - -#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36 -msgid "Disable physical displays" -msgstr "Désactiver les écrans physiques" - -#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37 -msgid "" -"Automatically disable all physical displays when the XR effect is enabled." -msgstr "" -"Désactive automatiquement tous les écrans physiques lorsque le mode XR est " -"activé." - -#: src/gtk/connected-device.ui:104 -msgid "Virtual displays" -msgstr "Ecrans virtuels" - -#: src/gtk/connected-device.ui:120 -msgid "1080p" -msgstr "1080p" - -#: src/gtk/connected-device.ui:121 -msgid "1440p" -msgstr "1440p" - -#: src/gtk/connected-device.ui:122 -msgid "Add custom" -msgstr "Ajouter un réglage" - -#: src/gtk/connected-device.ui:136 -msgid "Remove custom resolution" -msgstr "Retirer la résolution personnalisée" - -#: src/gtk/connected-device.ui:156 -msgid "Rearrange displays" -msgstr "Réarranger les écrans" - -#: src/gtk/connected-device.ui:174 -msgid "Adjustments" -msgstr "Réglages" - -#: src/gtk/connected-device.ui:178 -msgid "Display distances" -msgstr "Distance des écrans" - -#: src/gtk/connected-device.ui:179 -msgid "Set how close you want displays to appear." -msgstr "Réglez la distance à laquelle vous voulez que les écrans apparaissent." - -#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221 -#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472 -#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530 -#: src/gtk/connected-device.ui:559 -msgid "Change" -msgstr "Changer" - -#: src/gtk/connected-device.ui:234 -msgid "Display size" -msgstr "" - -#: src/gtk/connected-device.ui:235 -msgid "Set how large you want the display to appear." -msgstr "" - -#: src/gtk/connected-device.ui:254 -msgid "full" -msgstr "" - -#: src/gtk/connected-device.ui:264 -msgid "Follow threshold" -msgstr "Seuil de suivi" - -#: src/gtk/connected-device.ui:265 -msgid "How far away you can look before the display follows." -msgstr "Distance jusqu'où vous pouvez regarder avant que l'affichage ne suive." - -#: src/gtk/connected-device.ui:288 -msgid "Display angling" -msgstr "Orientation des écrans" - -#: src/gtk/connected-device.ui:289 -msgid "" -"When there are multiple displays, choose how they should angle towards you." -msgstr "" -"Lorsqu'il y a plusieur sécrans, définissez comment ils devraient être " -"orientés." - -#: src/gtk/connected-device.ui:303 -msgid "Automatic" -msgstr "Automatique" - -#: src/gtk/connected-device.ui:304 -msgid "Side-angled" -msgstr "Pivot sur le côté" - -#: src/gtk/connected-device.ui:305 -msgid "Top-angled" -msgstr "Pivot sur le dessus" - -#: src/gtk/connected-device.ui:306 -msgid "Flat" -msgstr "Plat" - -#: src/gtk/connected-device.ui:316 -msgid "Display spacing" -msgstr "Espacement des écrans" - -#: src/gtk/connected-device.ui:317 -msgid "Put empty space between displays, when there are multiple." -msgstr "Ajoute un espace vide entre les écrans lorsqu'il y en a plusieurs." - -#: src/gtk/connected-device.ui:347 -msgid "Viewport horizontal offset" -msgstr "Décalage horizontal de l'affichage" - -#: src/gtk/connected-device.ui:348 -msgid "Move the viewport to the left or right of its default position." -msgstr "" -"Décale l'affichage des écrans vers la gauche ou la droite de la position par " -"défaut." - -#: src/gtk/connected-device.ui:365 -msgid "left" -msgstr "gauche" - -#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397 -msgid "center" -msgstr "centre" - -#: src/gtk/connected-device.ui:369 -msgid "right" -msgstr "droite" - -#: src/gtk/connected-device.ui:377 -msgid "Viewport vertical offset" -msgstr "Décalage vertical de l'affichage" - -#: src/gtk/connected-device.ui:378 -msgid "Move the viewport up or down from its default position." -msgstr "" -"Décale l'affichage des écrans au dessus ou au dessous de la position par " -"défaut." - -#: src/gtk/connected-device.ui:395 -msgid "down" -msgstr "bas" - -#: src/gtk/connected-device.ui:399 -msgid "up" -msgstr "haut" - -#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420 -msgid "Keyboard Shortcuts" -msgstr "Raccourcis clavier" - -#: src/gtk/connected-device.ui:423 -msgid "XR Effect on/off shortcut" -msgstr "Raccourci on/off de l'effet XR" - -#: src/gtk/connected-device.ui:424 -msgid "" -"Quickly enable or disable the XR Effect. You may need to enable the effect " -"manually once in order to enable the shortcut." -msgstr "" -"Activez ou désactivez rapidement l'effet XR. Il se peut que vous deviez " -"activer l'effet manuellement une fois pour activer le raccourci." - -#: src/gtk/connected-device.ui:452 -msgid "Re-center display shortcut" -msgstr "Raccourci de recentrage de l'affichage" - -#: src/gtk/connected-device.ui:453 -msgid "Pin the virtual display to the current position." -msgstr "Fixez l'affichage virtuel à la position actuelle" - -#: src/gtk/connected-device.ui:481 -msgid "Toggle zoom on focus shortcut" -msgstr "Raccourci d'activation du zoom sur l'écran ciblé" - -#: src/gtk/connected-device.ui:482 -msgid "Quickly toggle zoom on focus mode." -msgstr "Zoom rapidement sur l'écran que l'on regarde" - -#: src/gtk/connected-device.ui:510 -msgid "Toggle follow mode shortcut" -msgstr "Raccourci de basculement du mode de suivi" - -#: src/gtk/connected-device.ui:511 -msgid "Quickly toggle follow mode." -msgstr "Basculer rapidement le mode de suivi." - -#: src/gtk/connected-device.ui:539 -msgid "Summon mouse cursor shortcut" -msgstr "Raccourci de téléportation de la souris" - -#: src/gtk/connected-device.ui:540 -msgid "Bring the mouse cursor to the center of the focused display." -msgstr "" -"Ramène automatiquement la souris au centre de l'écran que vous regardez." - -#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585 -msgid "Advanced Settings" -msgstr "Paramètres avancés" - -#: src/gtk/connected-device.ui:589 -msgid "Units" -msgstr "" - -#: src/gtk/connected-device.ui:590 -msgid "Choose measurement units for size and distance displays." -msgstr "" - -#: src/gtk/connected-device.ui:605 -msgid "Centimeters" -msgstr "" - -#: src/gtk/connected-device.ui:606 -msgid "Inches" -msgstr "" - -#: src/gtk/connected-device.ui:618 -msgid "Find optimal display config" -msgstr "Trouver la configuration d'affichage optimale" - -#: src/gtk/connected-device.ui:619 -msgid "" -"Automatically modify the glasses display configuration for maximum " -"resolution and best scaling when plugged in." -msgstr "" -"Modifiez automatiquement la configuration d'affichage des lunettes pour une " -"résolution maximale et une meilleure mise à l'échelle lorsque elles sont " -"branchées." - -#: src/gtk/connected-device.ui:629 -msgid "Use highest refresh rate" -msgstr "Utiliser le taux de rafraîchissement le plus élevé" - -#: src/gtk/connected-device.ui:630 -msgid "Refresh rate may affect performance, disable this to set it manually." -msgstr "" -"Un taux de rafraîchissement élevé peut affecter les performances, désactivez-" -"le pour le définir manuellement." - -#: src/gtk/connected-device.ui:640 -msgid "Center on glasses' display" -msgstr "Garder l'écran principal au centre" - -#: src/gtk/connected-device.ui:641 -msgid "" -"Center the viewport on the glasses' display, even if the display is not in " -"the middle." -msgstr "" -"Garde l'écran principal au centre de la vue, même si l'écran n'est pas au " -"milieu." - -#: src/gtk/connected-device.ui:651 -msgid "Always primary display" -msgstr "Affichage principal en permanence" - -#: src/gtk/connected-device.ui:652 -msgid "Automatically set the glasses as the primary display when plugged in." -msgstr "" -"Définissez automatiquement les lunettes comme affichage principal " -"lorsqu'elles sont branchées." - -#: src/gtk/connected-device.ui:662 -msgid "Remove virtual displays on disable" -msgstr "Supprimer les écrans virtuels sur déconnection" - -#: src/gtk/connected-device.ui:663 -msgid "Automatically remove virtual displays when the XR effect is disabled." -msgstr "" -"Supprime automatiquement les écrans virtuels lorsque l'effet XR est " -"désactivé." - -#: src/gtk/connected-device.ui:673 -msgid "Enable multi-tap detection" -msgstr "Activer la détection du tapotement" - -#: src/gtk/connected-device.ui:674 -msgid "Enables double-tap to recenter and triple-tap to recalibrate." -msgstr "Active le double-tap pour recentrer et le triple-tap pour recalibrer." - -#: src/gtk/connected-device.ui:684 -msgid "All displays follow mode" -msgstr "Tous les écrans en mode suivi" - -#: src/gtk/connected-device.ui:685 -msgid "Follow mode moves all displays, not just the focused one." -msgstr "" -"Le mode suivi déplace tous les écrans, pas seulement celui que l'on regarde." - -#: src/gtk/connected-device.ui:701 -msgid "Neck-saver horizontal multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:702 -msgid "Higher values require smaller horizontal head movements." -msgstr "" - -#: src/gtk/connected-device.ui:734 -msgid "Neck-saver vertical multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:735 -msgid "Higher values require smaller vertical head movements." -msgstr "" - -#: src/gtk/connected-device.ui:767 -msgid "Dead-zone threshold (degrees)" -msgstr "" - -#: src/gtk/connected-device.ui:768 -msgid "Stabilize movements below this angle." -msgstr "" - -#: src/gtk/connected-device.ui:799 -msgid "Follow mode movement tracking" -msgstr "Suivi des mouvements en mode suivi" - -#: src/gtk/connected-device.ui:800 -msgid "Choose which movements should be tracked in follow mode." -msgstr "Définissez quels mouvements doivent être suivis en mode suivi." - -#: src/gtk/connected-device.ui:815 -msgid "Horizontal" -msgstr "Horizontaux" - -#: src/gtk/connected-device.ui:835 -msgid "Vertical" -msgstr "Verticaux" - -#: src/gtk/connected-device.ui:855 -msgid "Tilt/roll" -msgstr "Inclinaison" - -#: src/gtk/connected-device.ui:873 -msgid "Movement look-ahead" -msgstr "Anticipation des mouvements" - -#: src/gtk/connected-device.ui:874 -msgid "" -"Counteracts input lag by predicting head-tracking position ahead of render " -"time. Stick with default unless virtual display drags behind your head " -"movements, jumps ahead, or is very shaky." -msgstr "" -"Compense le lag d'entrée en prédisant la position de suivi de la tête avant " -"le temps de rendu. Restez sur la valeur par défaut à moins que l'affichage " -"virtuel ne soit lent, ne saute pas ou ne soit très instable." - -#: src/gtk/connected-device.ui:892 -msgid "Default" -msgstr "Par défaut" - -#: src/gtk/connected-device.ui:904 -msgid "Text Scaling" -msgstr "Mise à l'échelle du texte" - -#: src/gtk/connected-device.ui:905 -msgid "Scaling text below 1.0 will simulate a higher resolution display" -msgstr "" -"Une mise à l'échelle du texte en dessous de 1.0 simulera un affichage de " -"plus haute résolution" - -#: src/gtk/custom-resolution-dialog-content.ui:9 -msgid "Width" -msgstr "Largeur" - -#: src/gtk/custom-resolution-dialog-content.ui:42 -msgid "Height" -msgstr "Hauteur" - -#: src/gtk/custom-resolution-dialog.ui:5 -msgid "Add a Custom Resolution" -msgstr "Ajouter une résolution personnalisée" - -#: src/gtk/custom-resolution-dialog.ui:10 -msgid "Add" -msgstr "Ajouter" - -#: src/gtk/display-distance-dialog-content.ui:35 -msgid "closer" -msgstr "Plus proche" - -#: src/gtk/display-distance-dialog-content.ui:36 -msgid "default" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:37 -msgid "farther" -msgstr "Plus éloigné" - -#: src/gtk/display-distance-dialog.ui:9 -msgid "Done" -msgstr "Terminé" - -#: src/gtk/failed-verification.ui:15 -msgid "Breezy Desktop GNOME invalid setup" -msgstr "Configuration Breezy Desktop GNOME non valide" - -#: src/gtk/failed-verification.ui:16 -msgid "" -"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup " -"script. Report this issue if it persists." -msgstr "" -"Votre configuration Breezy GNOME est invalide ou incomplète. Veuillez " -"exécuter à nouveau le script de configuration. Signalez ce problème s'il " -"persiste." - -#: src/gtk/license-dialog-content.ui:15 -msgid "Donate" -msgstr "Faire un don" - -#: src/gtk/license-dialog-content.ui:31 -msgid "Request a token" -msgstr "Demander un jeton d'authentification" - -#: src/gtk/license-dialog-content.ui:39 -msgid "Verify token" -msgstr "Vérifier le jeton d'authentification" - -#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139 -msgid "License Details" -msgstr "Détails de la licence" - -#: src/gtk/no-device.ui:15 -msgid "No device connected" -msgstr "Aucun appareil connecté" - -#: src/gtk/no-device.ui:16 -msgid "Breezy Desktop was unable to detect any supported XR devices." -msgstr "Breezy Desktop n'a pas pu détecter d'appareils XR pris en charge." - -#: src/gtk/no-device.ui:25 -msgid "Auto-enable XR effect" -msgstr "Activation automatique de l'effet XR" - -#: src/gtk/no-device.ui:26 -msgid "" -"Automatically enable the Breezy Desktop XR effect when supported glasses are " -"connected." -msgstr "" -"Activer automatiquement l'effet Breezy Desktop XR lorsque des lunettes " -"compatibles sont connectées." - -#: src/gtk/no-driver.ui:15 -msgid "No driver running" -msgstr "Aucun pilote en cours d'exécution" - -#: src/gtk/no-driver.ui:16 -msgid "" -"\n" -" If you installed via AUR, make sure you ran the recommended post-" -"install command:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Otherwise, please file an issue on GitHub, or create a new thread " -"in the #troubleshooting channel on Discord.\n" -" " -msgstr "" -"\n" -" Si vous avez installé via AUR, assurez-vous d'avoir exécuté la commande de " -"post-installation recommandée:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Sinon, veuillez signaler le problème sur GitHub, ou créer un nouveau fil de " -"discussion dans le canal #troubleshooting sur Discord.\n" -" " - -#: src/gtk/no-extension.ui:15 -msgid "Breezy Desktop GNOME extension not ready" -msgstr "Extension Breezy Desktop GNOME non prête" - -#: src/gtk/no-extension.ui:16 -msgid "" -"If you have just run the setup, then you may need to log out and back in to " -"use it. Otherwise, please follow the Breezy GNOME setup instructions." -msgstr "" -"Si vous venez d'exécuter la configuration, vous devrez peut-être vous " -"déconnecter et vous reconnecter pour l'utiliser. Sinon, veuillez suivre les " -"instructions d'installation de Breezy GNOME." - -#: src/gtk/no-license.ui:15 -msgid "No license file was found" -msgstr "Aucun fichier de licence trouvé" - -#: src/gtk/no-license.ui:16 -msgid "" -"\n" -" The first time you use Breezy Desktop, an internet connection is " -"required to retrieve your device's license.\n" -" \n" -" Don't worry, there's no obligation to donate at this time. If you " -"haven't, you'll be given a trial license so you can decide if Breezy Desktop " -"fits your needs. \n" -" \n" -" Once you obtain a license, trial or otherwise, you can use Breezy " -"Desktop offline until features expire (or indefinitely, if you've chosen " -"lifetime access).\n" -" " -msgstr "" -"\n" -" La première fois que vous utilisez Breezy Desktop, une connexion Internet " -"est requise pour récupérer la licence de votre appareil.\n" -" \n" -" Ne vous inquiétez pas, vous n'êtes pas obligé de faire un don à ce stade. " -"Si vous ne le faites pas, vous obtiendrez une licence d'essai pour vous " -"permettre de décider si Breezy Desktop répond à vos besoins.\n" -" \n" -" Une fois que vous avez obtenu une licence, d'essai ou autre, vous pouvez " -"utiliser Breezy Desktop hors ligne jusqu'à l'expiration des fonctionnalités " -"(ou indéfiniment, si vous avez choisi l'accès à vie).\n" -" " - -#: src/gtk/no-license.ui:29 -msgid "Try Again" -msgstr "Réessayer" - -#: src/gtk/shortcut-dialog.ui:5 -msgid "Assign Keyboard Shortcut" -msgstr "Attribuer un raccourci clavier" - -#: src/gtk/shortcut-dialog.ui:20 -msgid "Press your keyboard shortcut or 'Backspace' to disable..." -msgstr "" -"Appuyez sur votre raccourci clavier ou sur 'Backspace' pour désactiver..." - -#: src/gtk/window.ui:10 -msgid "Breezy Desktop" -msgstr "Breezy Desktop" - -#: src/gtk/window.ui:23 -msgid "Menu" -msgstr "Menu" - -#: src/gtk/window.ui:43 -msgid "Some features expire soon" -msgstr "Certaines fonctionnalités expirent bientôt" - -#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102 -msgid "View details" -msgstr "Afficher les détails" - -#: src/gtk/window.ui:68 -msgid "Productivity features are disabled" -msgstr "Les fonctionnalités de productivité sont désactivées" - -#: src/gtk/window.ui:93 -msgid "" -"Productivity Pro license is inactive — 6DoF features will be unavailable" -msgstr "" - -#: src/gtk/window.ui:119 -msgid "" -"A newer version is available. To update, rerun the breezy_gnome_setup script." -msgstr "" - -#: src/gtk/window.ui:143 -msgid "Force Reset" -msgstr "Réinitialiser" - -#: src/gtk/window.ui:147 -msgid "About BreezyDesktop" -msgstr "À propos de BreezyDesktop" - -#~ msgid "Side-by-side mode (gaming)" -#~ msgstr "Mode SBS (jeu)" - -#~ msgid "Smooth Follow (gaming)" -#~ msgstr "Suivi fluide (jeu)" - -#~ msgid "Breezy Desktop (productivity)" -#~ msgstr "Breezy Desktop (productivité)" - -#~ msgid "Gaming" -#~ msgstr "Jeu" - -#~ msgid "Productivity" -#~ msgstr "Productivité" - -#~ msgid "fullscreen" -#~ msgstr "Plein écran" - -#~ msgid "Show full range" -#~ msgstr "Afficher toute la gamme" - -#~ msgid "" -#~ "Unable to add virtual displays on this machine. Wayland and xdg-desktop-" -#~ "portal are required." -#~ msgstr "" -#~ "Impossible d'ajouter des écrans virtuels sur cet appareil. Wayland et xdg-" -#~ "desktop-portal sont nécessaires." - -#~ msgid "Fast SBS mode switching" -#~ msgstr "Bascule rapide vers le mode SBS" - -#~ msgid "" -#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen " -#~ "mode is on. May cause instability." -#~ msgstr "" -#~ "Bascule les lunettes vers le mode SBS immédiatement lorsqu'elles sont " -#~ "branchées si le mode grand écran est activé. Peut provoquer des " -#~ "instabilités." - -#~ msgid "Set Unfocused Displays Distance" -#~ msgstr "Régler la distance des écrans que l'on ne regarde pas" - -#~ msgid "Widescreen mode" -#~ msgstr "Mode grand écran" - -#~ msgid "" -#~ "Closer appears larger, further appears smaller. Controls depth when in " -#~ "widescreen mode." -#~ msgstr "" -#~ "Plus proche apparaît plus grand, plus éloigné apparaît plus petit. " -#~ "Contrôle la profondeur lorsque vous êtes en mode grand écran." - -#~ msgid "" -#~ "Combine with display distance to achieve a comfortable level of depth and " -#~ "size." -#~ msgstr "" -#~ "Combinez avec la distance d'affichage pour obtenir un niveau de " -#~ "profondeur et de taille confortable." - -#~ msgid "Display toggle distances" -#~ msgstr "Distances de basculement de l'affichage" - -#~ msgid "" -#~ "Use the buttons to capture the current display distance for use with the " -#~ "keyboard shortcut." -#~ msgstr "" -#~ "Utilisez les boutons pour capturer la distance d'affichage actuelle pour " -#~ "une utilisation avec le raccourci clavier." - -#~ msgid "Display distance shortcut" -#~ msgstr "Raccourci de distance d'affichage" - -#~ msgid "Quickly toggle between two predefined distances." -#~ msgstr "Basculez rapidement entre deux distances prédéfinies." - -#~ msgid "Start in widescreen mode" -#~ msgstr "Démarer en mode grand écran" - -#~ msgid "Widescreen mode is not supported for all glasses." -#~ msgstr "Le mode écran large n'est pas compatible avec toutes les lunettes." diff --git a/ui/po/it.po b/ui/po/it.po deleted file mode 100644 index 5fb2dd1..0000000 --- a/ui/po/it.po +++ /dev/null @@ -1,864 +0,0 @@ -# Italian translations for PACKAGE package. -# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# , 2024. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-03 12:40-0800\n" -"PO-Revision-Date: 2024-08-02 21:14-0700\n" -"Last-Translator: \n" -"Language-Team: Italian \n" -"Language: it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: src/connecteddevice.py:29 -msgid "" -"Switches your glasses into side-by-side mode and doubles the width of the " -"display." -msgstr "" -"Passa i tuoi occhiali in modalità side-by-side e raddoppia la larghezza del " -"display." - -#: src/connecteddevice.py:30 -msgid "This feature is not currently supported for your device." -msgstr "Questa funzione non è attualmente supportata sul tuo dispositivo." - -#: src/connecteddevice.py:160 -msgid "Set Focused Display Distance" -msgstr "Distanza del display con focus" - -#: src/connecteddevice.py:161 -msgid "Use a closer value so the display zooms in when you look at it." -msgstr "" -"Usa un valore più vicino, così che il display si avvicini quando lo guardi." - -#: src/connecteddevice.py:168 -msgid "Set All Displays Distance" -msgstr "Imposta la distanza di tutti i display" - -#: src/connecteddevice.py:169 -msgid "Use a farther value so the displays are zoomed out when you look away." -msgstr "" -"Usa un valore più distante così che i display si allontanino quando distogli " -"lo sguardo." - -#: src/connecteddevice.py:309 -msgid "" -"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, " -"and the pipewire GStreamer plugin are required." -msgstr "" -"Non è possibile aggiungere display virtuali su questo dispositivo. Sono " -"richiesti Wayland e xdg-desktop-portal." - -#: src/connecteddevice.py:343 -msgid "Focused display" -msgstr "Distanza del display col focus" - -#: src/connecteddevice.py:349 -msgid "All displays" -msgstr "Tutti i display" - -#: src/licensedialogcontent.py:63 -msgid "Paid Tier Status" -msgstr "Stato del livello a pagamento" - -#: src/licensedialogcontent.py:71 -msgid "Feature Availability" -msgstr "Disponibilità delle funzionalità" - -#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104 -#: src/gtk/connected-device.ui:786 -msgid "Disabled" -msgstr "Disabilitato" - -#: src/licensefeaturerow.py:18 -msgid "In trial" -msgstr "In prova" - -#: src/licensefeaturerow.py:18 -msgid "Enabled" -msgstr "Abilitato" - -#: src/licensefeaturerow.py:24 src/licensetierrow.py:30 -#, python-brace-format -msgid " ({time_remaining} remaining)" -msgstr " ({time_remaining} rimanenti)" - -#: src/licensefeaturerow.py:30 src/licensetierrow.py:56 -msgid "Productivity Basic" -msgstr "" - -#: src/licensefeaturerow.py:31 src/licensetierrow.py:57 -msgid "Productivity Pro" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Active" -msgstr "Attivo" - -#: src/licensetierrow.py:24 -msgid "Inactive" -msgstr "Inattivo" - -#: src/licensetierrow.py:41 -#, python-brace-format -msgid "${amount} USD" -msgstr "${amount} USD" - -#: src/licensetierrow.py:43 -msgid " to renew" -msgstr " da rinnovare" - -#: src/licensetierrow.py:45 -msgid " to upgrade" -msgstr " per aggiornare" - -#: src/licensetierrow.py:47 -msgid "Paid through next renewal period" -msgstr "Pagato fino al prossimo periodo di rinnovo" - -#: src/licensetierrow.py:63 -msgid " - renewing monthly" -msgstr " - rinnovo mensile" - -#: src/licensetierrow.py:64 -msgid " - renewing yearly" -msgstr " - rinnovo annuale" - -#: src/licensetierrow.py:65 -msgid "with lifetime access" -msgstr "con accesso perpetuo" - -#: src/licensetierrow.py:72 -msgid "Monthly" -msgstr "Mensile" - -#: src/licensetierrow.py:73 -msgid "Yearly" -msgstr "Annuale" - -#: src/licensetierrow.py:74 -msgid "Lifetime" -msgstr "Perpetuo" - -#: src/time.py:14 -msgid "less than an hour" -msgstr "meno di un'ora" - -#: src/time.py:17 -msgid "1 hour" -msgstr "1 ora" - -#: src/time.py:17 -#, python-brace-format -msgid "{time_remaining} hours" -msgstr "{time_remaining} ore" - -#: src/time.py:20 -msgid "1 day" -msgstr "1 giorno" - -#: src/time.py:20 -#, python-brace-format -msgid "{time_remaining} days" -msgstr "{time_remaining} giorni" - -#: src/gtk/connected-device.ui:21 -msgid "connected" -msgstr "connesso" - -#: src/gtk/connected-device.ui:31 -msgid "General Settings" -msgstr "Impostazioni generali" - -#: src/gtk/connected-device.ui:41 -msgid "Features" -msgstr "Funzionalità" - -#: src/gtk/connected-device.ui:45 -msgid "XR effect" -msgstr "Effetto XR" - -#: src/gtk/connected-device.ui:46 -msgid "Enables the Breezy Desktop XR effect." -msgstr "Abilita l'effetto XR di Breezy Desktop." - -#: src/gtk/connected-device.ui:56 -msgid "Zoom on focus" -msgstr "Zoom sul focus" - -#: src/gtk/connected-device.ui:57 -msgid "" -"Automatically move a display closer when you look at it.\n" -"Set your preferred focused and unfocused distances in the Adjustments " -"section.\n" -" " -msgstr "" -"Imposta la tua distanza preferita per i display con focus e non nella " -"sezione Regolazioni." - -#: src/gtk/connected-device.ui:70 -msgid "Follow mode" -msgstr "Modalità di inseguimento" - -#: src/gtk/connected-device.ui:71 -msgid "Keep the focused display near the center of your view." -msgstr "Mantieni il display col focus vicino al centro del tuo campo visivo." - -#: src/gtk/connected-device.ui:81 -msgid "Curved display" -msgstr "Schermo curvo" - -#: src/gtk/connected-device.ui:82 -msgid "Switch between flat and curved displays." -msgstr "Passa da display piatti a curvi." - -#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36 -msgid "Disable physical displays" -msgstr "Disabilita display fisici" - -#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37 -msgid "" -"Automatically disable all physical displays when the XR effect is enabled." -msgstr "" -"Disabilita automaticamente tutti i display fisici quando l'effetto XR è " -"abilitato." - -#: src/gtk/connected-device.ui:104 -msgid "Virtual displays" -msgstr "Display virtuali" - -#: src/gtk/connected-device.ui:120 -msgid "1080p" -msgstr "1080p" - -#: src/gtk/connected-device.ui:121 -msgid "1440p" -msgstr "1440p" - -#: src/gtk/connected-device.ui:122 -msgid "Add custom" -msgstr "Aggiungere personalizzato" - -#: src/gtk/connected-device.ui:136 -msgid "Remove custom resolution" -msgstr "Rimuovi risoluzione personalizzata" - -#: src/gtk/connected-device.ui:156 -msgid "Rearrange displays" -msgstr "Riarrangia i Display" - -#: src/gtk/connected-device.ui:174 -msgid "Adjustments" -msgstr "Regolazioni" - -#: src/gtk/connected-device.ui:178 -msgid "Display distances" -msgstr "Distanze del display" - -#: src/gtk/connected-device.ui:179 -msgid "Set how close you want displays to appear." -msgstr "Imposta quanto vicino vuoi che appaiano i display" - -#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221 -#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472 -#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530 -#: src/gtk/connected-device.ui:559 -msgid "Change" -msgstr "Cambia" - -#: src/gtk/connected-device.ui:234 -msgid "Display size" -msgstr "" - -#: src/gtk/connected-device.ui:235 -msgid "Set how large you want the display to appear." -msgstr "" - -#: src/gtk/connected-device.ui:254 -msgid "full" -msgstr "" - -#: src/gtk/connected-device.ui:264 -msgid "Follow threshold" -msgstr "Soglia di inseguimento" - -#: src/gtk/connected-device.ui:265 -msgid "How far away you can look before the display follows." -msgstr "Quanto lontano puoi guardare prima che il display ti segua." - -#: src/gtk/connected-device.ui:288 -msgid "Display angling" -msgstr "Angolazione del display" - -#: src/gtk/connected-device.ui:289 -msgid "" -"When there are multiple displays, choose how they should angle towards you." -msgstr "" -"Quando ci sonn display multipli, scegli come dovrebbero angolarsi davanti a " -"te." - -#: src/gtk/connected-device.ui:303 -msgid "Automatic" -msgstr "Automatico" - -#: src/gtk/connected-device.ui:304 -msgid "Side-angled" -msgstr "Angolazione su un lato" - -#: src/gtk/connected-device.ui:305 -msgid "Top-angled" -msgstr "Angolazione in alto" - -#: src/gtk/connected-device.ui:306 -msgid "Flat" -msgstr "Piatto" - -#: src/gtk/connected-device.ui:316 -msgid "Display spacing" -msgstr "Spaziatura del display" - -#: src/gtk/connected-device.ui:317 -msgid "Put empty space between displays, when there are multiple." -msgstr "Inserisci spazio vuoto tra i display, quando ce ne sono molteplici." - -#: src/gtk/connected-device.ui:347 -msgid "Viewport horizontal offset" -msgstr "Spostamento orizzontale della visuale" - -#: src/gtk/connected-device.ui:348 -msgid "Move the viewport to the left or right of its default position." -msgstr "" -"Muovi la visuale a sinistra o a destra rispetto alla sua posizione di " -"default." - -#: src/gtk/connected-device.ui:365 -msgid "left" -msgstr "sinistra" - -#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397 -msgid "center" -msgstr "centro" - -#: src/gtk/connected-device.ui:369 -msgid "right" -msgstr "destra" - -#: src/gtk/connected-device.ui:377 -msgid "Viewport vertical offset" -msgstr "Spostamento verticale della visuale" - -#: src/gtk/connected-device.ui:378 -msgid "Move the viewport up or down from its default position." -msgstr "Muovi la visuale su o giù rispetto alla sua posizione di default." - -#: src/gtk/connected-device.ui:395 -msgid "down" -msgstr "giù" - -#: src/gtk/connected-device.ui:399 -msgid "up" -msgstr "su" - -#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420 -msgid "Keyboard Shortcuts" -msgstr "Scorciatoie da tastiera" - -#: src/gtk/connected-device.ui:423 -msgid "XR Effect on/off shortcut" -msgstr "Scorciatoia per on/off dell'effetto XR" - -#: src/gtk/connected-device.ui:424 -msgid "" -"Quickly enable or disable the XR Effect. You may need to enable the effect " -"manually once in order to enable the shortcut." -msgstr "" -"Abilitazione/disabilitazione rapida dell'effetto XR. Può essere necessario " -"abilitare l'effetto manualmente almeno una volta per abilitare la " -"scorciatoia da tastiera." - -#: src/gtk/connected-device.ui:452 -msgid "Re-center display shortcut" -msgstr "Scorciatoia per ricentrare il display" - -#: src/gtk/connected-device.ui:453 -msgid "Pin the virtual display to the current position." -msgstr "Fissa il display virtuale alla posizione attuale." - -#: src/gtk/connected-device.ui:481 -msgid "Toggle zoom on focus shortcut" -msgstr "Scorciatoia per attivare/disattivare lo zoom sul focus" - -#: src/gtk/connected-device.ui:482 -msgid "Quickly toggle zoom on focus mode." -msgstr "Attivazione/disattivazione rapida della modalità di zoom sul focus." - -#: src/gtk/connected-device.ui:510 -msgid "Toggle follow mode shortcut" -msgstr "Scorciatoia per attivare/disattivare la modalità di inseguimento" - -#: src/gtk/connected-device.ui:511 -msgid "Quickly toggle follow mode." -msgstr "Attivazione/disattivazione rapida della modalità di inseguimento." - -#: src/gtk/connected-device.ui:539 -msgid "Summon mouse cursor shortcut" -msgstr "Scorciatoia per richiamare il cursore del mouse " - -#: src/gtk/connected-device.ui:540 -msgid "Bring the mouse cursor to the center of the focused display." -msgstr "Porta il cursore del mouse al centro del display col focus." - -#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585 -msgid "Advanced Settings" -msgstr "Impostazioni avanzate" - -#: src/gtk/connected-device.ui:589 -msgid "Units" -msgstr "" - -#: src/gtk/connected-device.ui:590 -msgid "Choose measurement units for size and distance displays." -msgstr "" - -#: src/gtk/connected-device.ui:605 -msgid "Centimeters" -msgstr "" - -#: src/gtk/connected-device.ui:606 -msgid "Inches" -msgstr "" - -#: src/gtk/connected-device.ui:618 -msgid "Find optimal display config" -msgstr "Trova la configurazione ottimale del display" - -#: src/gtk/connected-device.ui:619 -msgid "" -"Automatically modify the glasses display configuration for maximum " -"resolution and best scaling when plugged in." -msgstr "" -"Modifica automaticamente la configurazione del display degli occhiali per " -"ottenere la massima risoluzione e la migliore scalabilità quando collegati." - -#: src/gtk/connected-device.ui:629 -msgid "Use highest refresh rate" -msgstr "Usa la frequenza di aggiornamento più elevata" - -#: src/gtk/connected-device.ui:630 -msgid "Refresh rate may affect performance, disable this to set it manually." -msgstr "" -"La frequenza di aggiornamento potrebbe influire sulle prestazioni, " -"disabilitala per impostarla manualmente." - -#: src/gtk/connected-device.ui:640 -msgid "Center on glasses' display" -msgstr "Centra sui display degli occhiali" - -#: src/gtk/connected-device.ui:641 -msgid "" -"Center the viewport on the glasses' display, even if the display is not in " -"the middle." -msgstr "" -"Centra la visuale sul display degli occhiali, anche se il display non è nel " -"mezzo." - -#: src/gtk/connected-device.ui:651 -msgid "Always primary display" -msgstr "Imposta sempre come display primario" - -#: src/gtk/connected-device.ui:652 -msgid "Automatically set the glasses as the primary display when plugged in." -msgstr "" -"Imposta automaticamente gli occhiali come display primario quando sono " -"collegati." - -#: src/gtk/connected-device.ui:662 -msgid "Remove virtual displays on disable" -msgstr "Rimuovi il display virtuale quando disabilitato" - -#: src/gtk/connected-device.ui:663 -msgid "Automatically remove virtual displays when the XR effect is disabled." -msgstr "" -"Rimuovi automaticamente i display virtuali quando l'effetto XR è " -"disabilitato." - -#: src/gtk/connected-device.ui:673 -msgid "Enable multi-tap detection" -msgstr "Abilita il riconoscimento del tocco multiplo" - -#: src/gtk/connected-device.ui:674 -msgid "Enables double-tap to recenter and triple-tap to recalibrate." -msgstr "" -"Abilita il doppio tocco per ricentrare e il triplo tocco per ricalibrare." - -#: src/gtk/connected-device.ui:684 -msgid "All displays follow mode" -msgstr "Modalità inseguimento su tutti i display" - -#: src/gtk/connected-device.ui:685 -msgid "Follow mode moves all displays, not just the focused one." -msgstr "" -"La modalità inseguimento muove tutti i display, non solo quello col focus." - -#: src/gtk/connected-device.ui:701 -msgid "Neck-saver horizontal multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:702 -msgid "Higher values require smaller horizontal head movements." -msgstr "" - -#: src/gtk/connected-device.ui:734 -msgid "Neck-saver vertical multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:735 -msgid "Higher values require smaller vertical head movements." -msgstr "" - -#: src/gtk/connected-device.ui:767 -msgid "Dead-zone threshold (degrees)" -msgstr "" - -#: src/gtk/connected-device.ui:768 -msgid "Stabilize movements below this angle." -msgstr "" - -#: src/gtk/connected-device.ui:799 -msgid "Follow mode movement tracking" -msgstr "Tracciamento del movimento nella modalità inseguimento" - -#: src/gtk/connected-device.ui:800 -msgid "Choose which movements should be tracked in follow mode." -msgstr "" -"Scegli quale movimento deve essere tracciato nella modalità inseguimento." - -#: src/gtk/connected-device.ui:815 -msgid "Horizontal" -msgstr "Orizzontale" - -#: src/gtk/connected-device.ui:835 -msgid "Vertical" -msgstr "Verticale" - -#: src/gtk/connected-device.ui:855 -msgid "Tilt/roll" -msgstr "Inclina/ruota" - -#: src/gtk/connected-device.ui:873 -msgid "Movement look-ahead" -msgstr "Anticipo del movimento" - -#: src/gtk/connected-device.ui:874 -msgid "" -"Counteracts input lag by predicting head-tracking position ahead of render " -"time. Stick with default unless virtual display drags behind your head " -"movements, jumps ahead, or is very shaky." -msgstr "" -"Compensa il ritardo di input prevedendo la posizione del tracciamento della " -"testa prima del tempo di rendering. Rimani con il valore predefinito a meno " -"che il display virtuale non rimanga indietro rispetto ai tuoi movimenti, non " -"salti in avanti o sia molto tremolante." - -#: src/gtk/connected-device.ui:892 -msgid "Default" -msgstr "Predefinito" - -#: src/gtk/connected-device.ui:904 -msgid "Text Scaling" -msgstr "Ridimensionamento del testo" - -#: src/gtk/connected-device.ui:905 -msgid "Scaling text below 1.0 will simulate a higher resolution display" -msgstr "" -"Ridimensionando il testo sotto a 1.0 si simula una maggiore risoluzione del " -"display" - -#: src/gtk/custom-resolution-dialog-content.ui:9 -msgid "Width" -msgstr "Larghezza" - -#: src/gtk/custom-resolution-dialog-content.ui:42 -msgid "Height" -msgstr "Altezza" - -#: src/gtk/custom-resolution-dialog.ui:5 -msgid "Add a Custom Resolution" -msgstr "Aggiungi una Risoluzione Personalizzata" - -#: src/gtk/custom-resolution-dialog.ui:10 -msgid "Add" -msgstr "Aggiungi" - -#: src/gtk/display-distance-dialog-content.ui:35 -msgid "closer" -msgstr "più vicino" - -#: src/gtk/display-distance-dialog-content.ui:36 -msgid "default" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:37 -msgid "farther" -msgstr "più lontano" - -#: src/gtk/display-distance-dialog.ui:9 -msgid "Done" -msgstr "Fatto" - -#: src/gtk/failed-verification.ui:15 -msgid "Breezy Desktop GNOME invalid setup" -msgstr "Configurazione non valida di Breezy Desktop GNOME" - -#: src/gtk/failed-verification.ui:16 -msgid "" -"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup " -"script. Report this issue if it persists." -msgstr "" -"La tua configurazione di Breezy GNOME non è valida o è incompleta. Ripeti " -"l'esecuzione dello script di configurazione. Segnala questo problema se " -"persiste." - -#: src/gtk/license-dialog-content.ui:15 -msgid "Donate" -msgstr "Fai una Donazione" - -#: src/gtk/license-dialog-content.ui:31 -msgid "Request a token" -msgstr "Richiesta di un token" - -#: src/gtk/license-dialog-content.ui:39 -msgid "Verify token" -msgstr "Verifica del token" - -#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139 -msgid "License Details" -msgstr "Dettagli della licenza" - -#: src/gtk/no-device.ui:15 -msgid "No device connected" -msgstr "Nessun dispositivo connesso" - -#: src/gtk/no-device.ui:16 -msgid "Breezy Desktop was unable to detect any supported XR devices." -msgstr "Breezy Desktop non ha rilevato nessun dispositivo XR supportato." - -#: src/gtk/no-device.ui:25 -msgid "Auto-enable XR effect" -msgstr "Abilitazione automatica effetto XR" - -#: src/gtk/no-device.ui:26 -msgid "" -"Automatically enable the Breezy Desktop XR effect when supported glasses are " -"connected." -msgstr "" -"Abilita automaticamente l'effetto XR di Breezy Desktop quando vengono " -"connessi degli occhiali supportati." - -#: src/gtk/no-driver.ui:15 -msgid "No driver running" -msgstr "Nessun driver in esecuzione" - -#: src/gtk/no-driver.ui:16 -msgid "" -"\n" -" If you installed via AUR, make sure you ran the recommended post-" -"install command:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Otherwise, please file an issue on GitHub, or create a new thread " -"in the #troubleshooting channel on Discord.\n" -" " -msgstr "" -"\n" -" Se hai installato tramite AUR, assicurati di aver eseguito il " -"comando di post-installazione consigliato:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" In caso contrario, segnala il problema su GitHub o crea un nuovo " -"thread nel canale #troubleshooting su Discord.\n" -" " - -#: src/gtk/no-extension.ui:15 -msgid "Breezy Desktop GNOME extension not ready" -msgstr "Estensione di Breezy Desktop GNOME non pronta" - -#: src/gtk/no-extension.ui:16 -msgid "" -"If you have just run the setup, then you may need to log out and back in to " -"use it. Otherwise, please follow the Breezy GNOME setup instructions." -msgstr "" -"Se hai appena eseguito la configurazione, potrebbe essere necessario " -"disconnettersi e riconnettersi per utilizzarla. In caso contrario, segui le " -"istruzioni di configurazione di Breezy GNOME." - -#: src/gtk/no-license.ui:15 -msgid "No license file was found" -msgstr "Nessun file di licenza trovato" - -#: src/gtk/no-license.ui:16 -msgid "" -"\n" -" The first time you use Breezy Desktop, an internet connection is " -"required to retrieve your device's license.\n" -" \n" -" Don't worry, there's no obligation to donate at this time. If you " -"haven't, you'll be given a trial license so you can decide if Breezy Desktop " -"fits your needs. \n" -" \n" -" Once you obtain a license, trial or otherwise, you can use Breezy " -"Desktop offline until features expire (or indefinitely, if you've chosen " -"lifetime access).\n" -" " -msgstr "" -"\n" -" La prima volta che utilizzi Breezy Desktop, è necessaria una " -"connessione Internet per recuperare la licenza del tuo dispositivo.\n" -" \n" -" Non preoccuparti, non è obbligatorio donare adesso. Se non lo hai " -"già fatto, ti verrà fornita una licenza di prova in modo da poter decidere " -"se Breezy Desktop soddisfa le tue esigenze.\n" -" \n" -" Una volta ottenuta una licenza, di prova o altra, puoi utilizzare " -"Breezy Desktop offline fino alla scadenza delle funzionalità (o a tempo " -"indeterminato, se hai scelto l'accesso perpetuo).\n" -" " - -#: src/gtk/no-license.ui:29 -msgid "Try Again" -msgstr "Riprova" - -#: src/gtk/shortcut-dialog.ui:5 -msgid "Assign Keyboard Shortcut" -msgstr "Assegna una scorciatoia da tastiera" - -#: src/gtk/shortcut-dialog.ui:20 -msgid "Press your keyboard shortcut or 'Backspace' to disable..." -msgstr "Premi la tua scorciatoia da tastiera o 'Backspace' per disabilitare..." - -#: src/gtk/window.ui:10 -msgid "Breezy Desktop" -msgstr "Breezy Desktop" - -#: src/gtk/window.ui:23 -msgid "Menu" -msgstr "Menu" - -#: src/gtk/window.ui:43 -msgid "Some features expire soon" -msgstr "Alcune funzionalità scadranno presto" - -#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102 -msgid "View details" -msgstr "Visualizza dettagli" - -#: src/gtk/window.ui:68 -msgid "Productivity features are disabled" -msgstr "Le funzionalità di produttività sono disabilitate" - -#: src/gtk/window.ui:93 -msgid "" -"Productivity Pro license is inactive — 6DoF features will be unavailable" -msgstr "" - -#: src/gtk/window.ui:119 -msgid "" -"A newer version is available. To update, rerun the breezy_gnome_setup script." -msgstr "" - -#: src/gtk/window.ui:143 -msgid "Force Reset" -msgstr "Reset forzato" - -#: src/gtk/window.ui:147 -msgid "About BreezyDesktop" -msgstr "Informazioni su BreezyDesktop" - -#~ msgid "Side-by-side mode (gaming)" -#~ msgstr "Modalità side-by-side (gaming)" - -#~ msgid "Smooth Follow (gaming)" -#~ msgstr "Smooth Follow (gaming)" - -#~ msgid "Breezy Desktop (productivity)" -#~ msgstr "Breezy Desktop (produttività)" - -#~ msgid "Gaming" -#~ msgstr "Gaming" - -#~ msgid "Productivity" -#~ msgstr "Produttività" - -#~ msgid "fullscreen" -#~ msgstr "schermo intero" - -#~ msgid "Show full range" -#~ msgstr "Visualizza gamma completa" - -#~ msgid "" -#~ "Unable to add virtual displays on this machine. Wayland and xdg-desktop-" -#~ "portal are required." -#~ msgstr "" -#~ "Non è possibile aggiungere display virtuali su questo dispositivo. Sono " -#~ "richiesti Wayland e xdg-desktop-portal." - -#~ msgid "Fast SBS mode switching" -#~ msgstr "Passaggio rapido alla modalità SBS" - -#~ msgid "" -#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen " -#~ "mode is on. May cause instability." -#~ msgstr "" -#~ "Passa immediatamente gli occhiali alla modalità SBS quando vengono " -#~ "collegati, se la modalità widescreen è attiva. Potrebbe causare " -#~ "instabilità." - -#~ msgid "Set Unfocused Displays Distance" -#~ msgstr "Imposta la distanza dei display senza focus" - -#~ msgid "Widescreen mode" -#~ msgstr "Modalità widescreen" - -#~ msgid "" -#~ "Closer appears larger, further appears smaller. Controls depth when in " -#~ "widescreen mode." -#~ msgstr "" -#~ "Più vicino appare più grande, più lontano appare più piccolo. Controlla " -#~ "la profondità quando sei in modalità widescreen." - -#~ msgid "" -#~ "Combine with display distance to achieve a comfortable level of depth and " -#~ "size." -#~ msgstr "" -#~ "Da combinare con la distanza del display per ottenere un livello " -#~ "confortevole di profondità e dimensione." - -#~ msgid "Display toggle distances" -#~ msgstr "Distanze di attivazione del cambio display" - -#~ msgid "" -#~ "Use the buttons to capture the current display distance for use with the " -#~ "keyboard shortcut." -#~ msgstr "" -#~ "Usa i pulsanti per acquisire la distanza attuale del display da " -#~ "utilizzare con la scorciatoia da tastiera." - -#~ msgid "Display distance shortcut" -#~ msgstr "Scorciatoia per la distanza del display" - -#~ msgid "Quickly toggle between two predefined distances." -#~ msgstr "Scambio rapido tra due distanze predefinite." - -#~ msgid "Start in widescreen mode" -#~ msgstr "Si attiva in modalità widescreen" - -#~ msgid "Widescreen mode is not supported for all glasses." -#~ msgstr "" -#~ "Breezy Desktop non è riuscito a rilevare alcun dispositivo XR supportato." diff --git a/ui/po/ja.po b/ui/po/ja.po deleted file mode 100644 index ccc66b0..0000000 --- a/ui/po/ja.po +++ /dev/null @@ -1,849 +0,0 @@ -# Japanese translations for PACKAGE package. -# Copyright (C) 2024-2026 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# , 2024. -# , 2026. -# -# Breezy DesktopやXR、GNOMEのような固有名詞はそのままの表記にしています。 -# 「gaming」が「ゲーミング」なので「productivity」も「プロダクティビティ」とカナ表記にしました。 -# 「glasses」は「XRエフェクト」から「XRメガネ」にしても良かったんですが、繰り返すのもくどいので「メガネ」にしてます。 -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-03 12:40-0800\n" -"PO-Revision-Date: 2026-02-11 07:53+0900\n" -"Last-Translator: iwaim.sub@gmail.com\n" -"Language-Team: Japanese \n" -"Language: ja\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: src/connecteddevice.py:29 -msgid "" -"Switches your glasses into side-by-side mode and doubles the width of the " -"display." -msgstr "メガネを3Dモードに切り替え、表示の幅を2倍にします。" - -#: src/connecteddevice.py:30 -msgid "This feature is not currently supported for your device." -msgstr "現在接続されているデバイスはこの機能に対応していません。" - -#: src/connecteddevice.py:160 -msgid "Set Focused Display Distance" -msgstr "フォーカスされたディスプレイ距離" - -#: src/connecteddevice.py:161 -msgid "Use a closer value so the display zooms in when you look at it." -msgstr "近くに設定すると見たディスプレイにズームインします。" - -#: src/connecteddevice.py:168 -msgid "Set All Displays Distance" -msgstr "すべてのディスプレイ距離" - -#: src/connecteddevice.py:169 -msgid "Use a farther value so the displays are zoomed out when you look away." -msgstr "遠くに設定すると視線の外れたディスプレイがズームアウトします。" - -#: src/connecteddevice.py:309 -msgid "" -"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, " -"and the pipewire GStreamer plugin are required." -msgstr "仮想ディスプレイが追加できません。" - -#: src/connecteddevice.py:343 -msgid "Focused display" -msgstr "フォーカスされたディスプレイ" - -#: src/connecteddevice.py:349 -msgid "All displays" -msgstr "すべてのディスプレイ" - -#: src/licensedialogcontent.py:63 -msgid "Paid Tier Status" -msgstr "有料ティアの状態" - -#: src/licensedialogcontent.py:71 -msgid "Feature Availability" -msgstr "利用できる機能" - -#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104 -#: src/gtk/connected-device.ui:786 -msgid "Disabled" -msgstr "無効" - -#: src/licensefeaturerow.py:18 -msgid "In trial" -msgstr "試用期間中" - -#: src/licensefeaturerow.py:18 -msgid "Enabled" -msgstr "有効" - -#: src/licensefeaturerow.py:24 src/licensetierrow.py:30 -#, python-brace-format -msgid " ({time_remaining} remaining)" -msgstr "(残り {time_remaining})" - -#: src/licensefeaturerow.py:30 src/licensetierrow.py:56 -msgid "Productivity Basic" -msgstr "" - -#: src/licensefeaturerow.py:31 src/licensetierrow.py:57 -msgid "Productivity Pro" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Active" -msgstr "アクティブ" - -#: src/licensetierrow.py:24 -msgid "Inactive" -msgstr "非アクティブ" - -#: src/licensetierrow.py:41 -#, python-brace-format -msgid "${amount} USD" -msgstr "あと${amount} (USD)" - -#: src/licensetierrow.py:43 -msgid " to renew" -msgstr "で更新可能" - -#: src/licensetierrow.py:45 -msgid " to upgrade" -msgstr "でアップグレード可能" - -#: src/licensetierrow.py:47 -msgid "Paid through next renewal period" -msgstr "次の更新期間まで支払済み" - -#: src/licensetierrow.py:63 -msgid " - renewing monthly" -msgstr " - 月払い" - -#: src/licensetierrow.py:64 -msgid " - renewing yearly" -msgstr " - 年払い" - -#: src/licensetierrow.py:65 -msgid "with lifetime access" -msgstr "一括払い済み" - -#: src/licensetierrow.py:72 -msgid "Monthly" -msgstr "月払い" - -#: src/licensetierrow.py:73 -msgid "Yearly" -msgstr "年払い" - -#: src/licensetierrow.py:74 -msgid "Lifetime" -msgstr "一括払い" - -#: src/time.py:14 -msgid "less than an hour" -msgstr "1時間未満" - -#: src/time.py:17 -msgid "1 hour" -msgstr "1時間" - -#: src/time.py:17 -#, python-brace-format -msgid "{time_remaining} hours" -msgstr "{time_remaining}時間" - -#: src/time.py:20 -msgid "1 day" -msgstr "1日" - -#: src/time.py:20 -#, python-brace-format -msgid "{time_remaining} days" -msgstr "{time_remaining}日" - -#: src/gtk/connected-device.ui:21 -msgid "connected" -msgstr "接続済み" - -#: src/gtk/connected-device.ui:31 -msgid "General Settings" -msgstr "一般設定" - -#: src/gtk/connected-device.ui:41 -msgid "Features" -msgstr "機能" - -#: src/gtk/connected-device.ui:45 -msgid "XR effect" -msgstr "XRエフェクト" - -#: src/gtk/connected-device.ui:46 -msgid "Enables the Breezy Desktop XR effect." -msgstr "Breezy DesktopのXRエフェクトを有効にします。" - -#: src/gtk/connected-device.ui:56 -msgid "Zoom on focus" -msgstr "フォーカス時にズーム" - -#: src/gtk/connected-device.ui:57 -msgid "" -"Automatically move a display closer when you look at it.\n" -"Set your preferred focused and unfocused distances in the Adjustments " -"section.\n" -" " -msgstr "" -"見たディスプレイが自動的に近づきます。\n" -"フォーカス時とそれ以外の距離は調整セクションで設定できます。" - -#: src/gtk/connected-device.ui:70 -msgid "Follow mode" -msgstr "フォローモード" - -#: src/gtk/connected-device.ui:71 -msgid "Keep the focused display near the center of your view." -msgstr "仮想ディスプレイを視界の中心近くに保ちます。" - -#: src/gtk/connected-device.ui:81 -msgid "Curved display" -msgstr "曲面ディスプレイ" - -#: src/gtk/connected-device.ui:82 -msgid "Switch between flat and curved displays." -msgstr "平面と曲面ディスプレイを切り替えます。" - -#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36 -msgid "Disable physical displays" -msgstr "物理ディスプレイの無効化" - -#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37 -msgid "" -"Automatically disable all physical displays when the XR effect is enabled." -msgstr "XRエフェクト有効時、自動的に物理ディスプレイを無効化する。" - -#: src/gtk/connected-device.ui:104 -msgid "Virtual displays" -msgstr "仮想ディスプレイ" - -#: src/gtk/connected-device.ui:120 -msgid "1080p" -msgstr "1080p" - -#: src/gtk/connected-device.ui:121 -msgid "1440p" -msgstr "1440p" - -#: src/gtk/connected-device.ui:122 -msgid "Add custom" -msgstr "カスタム解像度" - -#: src/gtk/connected-device.ui:136 -msgid "Remove custom resolution" -msgstr "カスタム解像度の削除" - -#: src/gtk/connected-device.ui:156 -msgid "Rearrange displays" -msgstr "ディスプレイの配置" - -#: src/gtk/connected-device.ui:174 -msgid "Adjustments" -msgstr "調整" - -#: src/gtk/connected-device.ui:178 -msgid "Display distances" -msgstr "ディスプレイ距離" - -#: src/gtk/connected-device.ui:179 -msgid "Set how close you want displays to appear." -msgstr "ディスプレイの表示距離を設定。" - -#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221 -#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472 -#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530 -#: src/gtk/connected-device.ui:559 -msgid "Change" -msgstr "変更" - -#: src/gtk/connected-device.ui:234 -msgid "Display size" -msgstr "ディスプレイサイズ" - -#: src/gtk/connected-device.ui:235 -msgid "Set how large you want the display to appear." -msgstr "ディスプレイの大きさを設定します。" - -#: src/gtk/connected-device.ui:254 -msgid "full" -msgstr "標準" - -#: src/gtk/connected-device.ui:264 -msgid "Follow threshold" -msgstr "フォローしきい値" - -#: src/gtk/connected-device.ui:265 -msgid "How far away you can look before the display follows." -msgstr "ディスプレイがフォロー(追従)を開始するまでの距離" - -#: src/gtk/connected-device.ui:288 -msgid "Display angling" -msgstr "ディスプレイの向き" - -#: src/gtk/connected-device.ui:289 -msgid "" -"When there are multiple displays, choose how they should angle towards you." -msgstr "複数のディスプレイがある場合、ディスプレイの向きを選択します。" - -#: src/gtk/connected-device.ui:303 -msgid "Automatic" -msgstr "自動" - -#: src/gtk/connected-device.ui:304 -msgid "Side-angled" -msgstr "横向き" - -#: src/gtk/connected-device.ui:305 -msgid "Top-angled" -msgstr "縦向き" - -#: src/gtk/connected-device.ui:306 -msgid "Flat" -msgstr "平面" - -#: src/gtk/connected-device.ui:316 -msgid "Display spacing" -msgstr "ディスプレイの隙間" - -#: src/gtk/connected-device.ui:317 -msgid "Put empty space between displays, when there are multiple." -msgstr "複数のディスプレイがある場合、ディスプレイ間の隙間を設定します。" - -#: src/gtk/connected-device.ui:347 -msgid "Viewport horizontal offset" -msgstr "表示域の水平オフセット" - -#: src/gtk/connected-device.ui:348 -msgid "Move the viewport to the left or right of its default position." -msgstr "表示域を左右に移動させます。" - -#: src/gtk/connected-device.ui:365 -msgid "left" -msgstr "左" - -#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397 -msgid "center" -msgstr "中央" - -#: src/gtk/connected-device.ui:369 -msgid "right" -msgstr "→" - -#: src/gtk/connected-device.ui:377 -msgid "Viewport vertical offset" -msgstr "表示域の垂直オフセット" - -#: src/gtk/connected-device.ui:378 -msgid "Move the viewport up or down from its default position." -msgstr "表示域を上下に移動させます。" - -#: src/gtk/connected-device.ui:395 -msgid "down" -msgstr "下" - -#: src/gtk/connected-device.ui:399 -msgid "up" -msgstr "上" - -#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420 -msgid "Keyboard Shortcuts" -msgstr "キーボードショートカット" - -#: src/gtk/connected-device.ui:423 -msgid "XR Effect on/off shortcut" -msgstr "XRエフェクトの切り替え" - -#: src/gtk/connected-device.ui:424 -msgid "" -"Quickly enable or disable the XR Effect. You may need to enable the effect " -"manually once in order to enable the shortcut." -msgstr "" -"XRエフェクトの有効・無効を切り替えます。このショートカットを有効にするために" -"手動で1回XRエフェクトを有効にする必要があります。" - -#: src/gtk/connected-device.ui:452 -msgid "Re-center display shortcut" -msgstr "ディスプレイを中央へ移動" - -#: src/gtk/connected-device.ui:453 -msgid "Pin the virtual display to the current position." -msgstr "仮想ディスプレイを現在の視点に固定します。" - -#: src/gtk/connected-device.ui:481 -msgid "Toggle zoom on focus shortcut" -msgstr "フォーカス時のズーム切り替え" - -#: src/gtk/connected-device.ui:482 -msgid "Quickly toggle zoom on focus mode." -msgstr "フォーカス時のズームをすばやく切り替えます。" - -#: src/gtk/connected-device.ui:510 -msgid "Toggle follow mode shortcut" -msgstr "フォローモードの切り替え" - -#: src/gtk/connected-device.ui:511 -msgid "Quickly toggle follow mode." -msgstr "フォローモードのオン/オフをすばやく切り替えます。" - -#: src/gtk/connected-device.ui:539 -msgid "Summon mouse cursor shortcut" -msgstr "マウスカーソルを呼び戻す" - -#: src/gtk/connected-device.ui:540 -msgid "Bring the mouse cursor to the center of the focused display." -msgstr "フォーカス中のディスプレイの中央にマウスカーソルを移動します。" - -#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585 -msgid "Advanced Settings" -msgstr "詳細設定" - -#: src/gtk/connected-device.ui:589 -msgid "Units" -msgstr "単位" - -#: src/gtk/connected-device.ui:590 -msgid "Choose measurement units for size and distance displays." -msgstr "ディスプレイ距離とサイズの単位を選択します。" - -#: src/gtk/connected-device.ui:605 -msgid "Centimeters" -msgstr "センチメートル(cm)" - -#: src/gtk/connected-device.ui:606 -msgid "Inches" -msgstr "インチ(in)" - -#: src/gtk/connected-device.ui:618 -msgid "Find optimal display config" -msgstr "ディスプレイ設定を最適化する" - -#: src/gtk/connected-device.ui:619 -msgid "" -"Automatically modify the glasses display configuration for maximum " -"resolution and best scaling when plugged in." -msgstr "" -"メガネ接続時、最大解像度と最適なスケーリングのためにディスプレイ設定を自動的" -"に変更します。" - -#: src/gtk/connected-device.ui:629 -msgid "Use highest refresh rate" -msgstr "最大のリフレッシュレートを使用する" - -#: src/gtk/connected-device.ui:630 -msgid "Refresh rate may affect performance, disable this to set it manually." -msgstr "" -"リフレッシュレートはパフォーマンスに影響を与える可能性があります。手動で設定" -"する場合は無効にしてください。" - -#: src/gtk/connected-device.ui:640 -msgid "Center on glasses' display" -msgstr "メガネのディスプレイを中央に" - -#: src/gtk/connected-device.ui:641 -msgid "" -"Center the viewport on the glasses' display, even if the display is not in " -"the middle." -msgstr "" -"ディスプレイが中央にない場合でも、表示域をメガネのディスプレイの中央に配置し" -"ます。" - -#: src/gtk/connected-device.ui:651 -msgid "Always primary display" -msgstr "常にプライマリディスプレイにする" - -#: src/gtk/connected-device.ui:652 -msgid "Automatically set the glasses as the primary display when plugged in." -msgstr "メガネ接続時、自動的にプライマリディスプレイにします。" - -#: src/gtk/connected-device.ui:662 -msgid "Remove virtual displays on disable" -msgstr "無効時に仮想ディスプレイ削除" - -#: src/gtk/connected-device.ui:663 -msgid "Automatically remove virtual displays when the XR effect is disabled." -msgstr "XRエフェクト無効時に仮想ディスプレイを自動的に削除します。" - -#: src/gtk/connected-device.ui:673 -msgid "Enable multi-tap detection" -msgstr "マルチタップ認識を有効化" - -#: src/gtk/connected-device.ui:674 -msgid "Enables double-tap to recenter and triple-tap to recalibrate." -msgstr "" -"ダブルタップで中央へ移動、トリプルタップで再キャリブレーションを有効にしま" -"す。" - -#: src/gtk/connected-device.ui:684 -msgid "All displays follow mode" -msgstr "全画面フォローモード" - -#: src/gtk/connected-device.ui:685 -msgid "Follow mode moves all displays, not just the focused one." -msgstr "" -"フォローモードはフォーカスされてるディスプレイだけでなく全ての画面が移動しま" -"す。" - -#: src/gtk/connected-device.ui:701 -msgid "Neck-saver horizontal multiplier" -msgstr "水平方向の首振り" - -#: src/gtk/connected-device.ui:702 -msgid "Higher values require smaller horizontal head movements." -msgstr "" -"値を大きくすると、水平方向の小さな動きで視点を移動できるようになります。" - -#: src/gtk/connected-device.ui:734 -msgid "Neck-saver vertical multiplier" -msgstr "垂直方向の首振り" - -#: src/gtk/connected-device.ui:735 -msgid "Higher values require smaller vertical head movements." -msgstr "" -"値を大きくすると、垂直方向の小さな動きで視点を移動できるようになります。" - -#: src/gtk/connected-device.ui:767 -msgid "Dead-zone threshold (degrees)" -msgstr "不感帯の閾値(角度)" - -#: src/gtk/connected-device.ui:768 -msgid "Stabilize movements below this angle." -msgstr "この角度以下では動きを検知せず、動作を安定させます。" - -#: src/gtk/connected-device.ui:799 -msgid "Follow mode movement tracking" -msgstr "フォローモード移動設定" - -#: src/gtk/connected-device.ui:800 -msgid "Choose which movements should be tracked in follow mode." -msgstr "フォローモードで追跡する方法を選択します。" - -#: src/gtk/connected-device.ui:815 -msgid "Horizontal" -msgstr "水平" - -#: src/gtk/connected-device.ui:835 -msgid "Vertical" -msgstr "垂直" - -#: src/gtk/connected-device.ui:855 -msgid "Tilt/roll" -msgstr "傾き・回転" - -#: src/gtk/connected-device.ui:873 -msgid "Movement look-ahead" -msgstr "動きの先読み" - -#: src/gtk/connected-device.ui:874 -msgid "" -"Counteracts input lag by predicting head-tracking position ahead of render " -"time. Stick with default unless virtual display drags behind your head " -"movements, jumps ahead, or is very shaky." -msgstr "" -"入力遅延を相殺するために、レンダリング時間前にヘッドトラッキング位置を予測し" -"ます。仮想ディスプレイが頭の動きに遅れたり、先に進んだり、非常に揺れたりする" -"場合を除き、デフォルトのままで問題ありません。" - -#: src/gtk/connected-device.ui:892 -msgid "Default" -msgstr "デフォルト" - -#: src/gtk/connected-device.ui:904 -msgid "Text Scaling" -msgstr "テキストスケーリング" - -#: src/gtk/connected-device.ui:905 -msgid "Scaling text below 1.0 will simulate a higher resolution display" -msgstr "" -"テキストを1.0未満にスケーリングすると、高解像度ディスプレイをシミュレートしま" -"す。" - -#: src/gtk/custom-resolution-dialog-content.ui:9 -msgid "Width" -msgstr "幅" - -#: src/gtk/custom-resolution-dialog-content.ui:42 -msgid "Height" -msgstr "高さ" - -#: src/gtk/custom-resolution-dialog.ui:5 -msgid "Add a Custom Resolution" -msgstr "カスタム解像度を追加" - -#: src/gtk/custom-resolution-dialog.ui:10 -msgid "Add" -msgstr "追加" - -#: src/gtk/display-distance-dialog-content.ui:35 -msgid "closer" -msgstr "近い" - -#: src/gtk/display-distance-dialog-content.ui:36 -msgid "default" -msgstr "デフォルト" - -#: src/gtk/display-distance-dialog-content.ui:37 -msgid "farther" -msgstr "遠い" - -#: src/gtk/display-distance-dialog.ui:9 -msgid "Done" -msgstr "完了" - -#: src/gtk/failed-verification.ui:15 -msgid "Breezy Desktop GNOME invalid setup" -msgstr "Breezy Desktop GNOMEの無効なセットアップ" - -#: src/gtk/failed-verification.ui:16 -msgid "" -"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup " -"script. Report this issue if it persists." -msgstr "" -"Breezy GNOMEのセットアップが無効または不完全です。セットアップスクリプトを再" -"実行してください。問題が解決しない場合は、この問題を報告してください。" - -#: src/gtk/license-dialog-content.ui:15 -msgid "Donate" -msgstr "寄付" - -#: src/gtk/license-dialog-content.ui:31 -msgid "Request a token" -msgstr "トークンをリクエストする" - -#: src/gtk/license-dialog-content.ui:39 -msgid "Verify token" -msgstr "トークンを検証する" - -#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139 -msgid "License Details" -msgstr "ライセンスの詳細" - -#: src/gtk/no-device.ui:15 -msgid "No device connected" -msgstr "デバイスが接続されていません" - -#: src/gtk/no-device.ui:16 -msgid "Breezy Desktop was unable to detect any supported XR devices." -msgstr "Breezy Desktopは対応しているXRデバイスを検出できませんでした。" - -#: src/gtk/no-device.ui:25 -msgid "Auto-enable XR effect" -msgstr "XRエフェクトの自動有効化" - -#: src/gtk/no-device.ui:26 -msgid "" -"Automatically enable the Breezy Desktop XR effect when supported glasses are " -"connected." -msgstr "" -"対応メガネを接続するとBreezy DesktopのXRエフェクトを自動的に開始します。" - -#: src/gtk/no-driver.ui:15 -msgid "No driver running" -msgstr "ドライバーが実行されていません" - -#: src/gtk/no-driver.ui:16 -msgid "" -"\n" -" If you installed via AUR, make sure you ran the recommended post-" -"install command:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Otherwise, please file an issue on GitHub, or create a new thread " -"in the #troubleshooting channel on Discord.\n" -" " -msgstr "" -"\n" -" AUR経由でインストールした場合は、推奨されるポストインストールコマン" -"ドを実行したことを確認してください:\n" -" systemctl --user enable --now xr-driver.service\n" -" \n" -" それ以外の場合は、GitHubで問題を報告するか、Discordの" -"#troubleshootingチャンネルで新しいスレッドを作成してください。\n" -" " - -#: src/gtk/no-extension.ui:15 -msgid "Breezy Desktop GNOME extension not ready" -msgstr "Breezy Desktop GNOME Shell拡張機能が準備できていません" - -#: src/gtk/no-extension.ui:16 -msgid "" -"If you have just run the setup, then you may need to log out and back in to " -"use it. Otherwise, please follow the Breezy GNOME setup instructions." -msgstr "" -"セットアップを実行した直後の場合は、使用する前にログアウトして再度ログインす" -"る必要があるかもしれません。それ以外の場合は、Breezy GNOMEのセットアップ手順" -"に従ってください。" - -#: src/gtk/no-license.ui:15 -msgid "No license file was found" -msgstr "ライセンスファイルが見つかりませんでした" - -#: src/gtk/no-license.ui:16 -msgid "" -"\n" -" The first time you use Breezy Desktop, an internet connection is " -"required to retrieve your device's license.\n" -" \n" -" Don't worry, there's no obligation to donate at this time. If you " -"haven't, you'll be given a trial license so you can decide if Breezy Desktop " -"fits your needs. \n" -" \n" -" Once you obtain a license, trial or otherwise, you can use Breezy " -"Desktop offline until features expire (or indefinitely, if you've chosen " -"lifetime access).\n" -" " -msgstr "" -"\n" -" Breezy Desktopを初めて使用する際は、デバイスライセンスを取得するた" -"めにインターネット接続が必要です。\n" -" \n" -" ご安心ください。今すぐに寄付する必要はありません。寄付していない場" -"合は、Breezy Desktopがニーズに合っているかどうかを判断できる試用ライセンスが" -"提供されます。\n" -" \n" -" ライセンスを取得したら、試用期間中であろうと期限切れるまではBreezy " -"Desktopをオフラインで使用できます。(生涯アクセスを選択した場合は期限はありま" -"せん。)\n" -" " - -#: src/gtk/no-license.ui:29 -msgid "Try Again" -msgstr "もう一度お試しください" - -#: src/gtk/shortcut-dialog.ui:5 -msgid "Assign Keyboard Shortcut" -msgstr "キーボードショートカットを割り当てる" - -#: src/gtk/shortcut-dialog.ui:20 -msgid "Press your keyboard shortcut or 'Backspace' to disable..." -msgstr "" -"キーボードショートカットを押す、または「Backspace」を押して無効にします..." - -#: src/gtk/window.ui:10 -msgid "Breezy Desktop" -msgstr "Breezy Desktop" - -#: src/gtk/window.ui:23 -msgid "Menu" -msgstr "メニュー" - -#: src/gtk/window.ui:43 -msgid "Some features expire soon" -msgstr "一部の機能はもうすぐ期限が切れます" - -#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102 -msgid "View details" -msgstr "詳細を表示" - -#: src/gtk/window.ui:68 -msgid "Productivity features are disabled" -msgstr "プロダクティビティ機能が無効になっています" - -#: src/gtk/window.ui:93 -msgid "" -"Productivity Pro license is inactive — 6DoF features will be unavailable" -msgstr "" - -#: src/gtk/window.ui:119 -msgid "" -"A newer version is available. To update, rerun the breezy_gnome_setup script." -msgstr "" - -#: src/gtk/window.ui:143 -msgid "Force Reset" -msgstr "強制リセット" - -#: src/gtk/window.ui:147 -msgid "About BreezyDesktop" -msgstr "Breezy Desktopについて" - -#~ msgid "Side-by-side mode (gaming)" -#~ msgstr "サイドバイサイドモード(ゲーミング)" - -#~ msgid "Smooth Follow (gaming)" -#~ msgstr "スムーズフォロー(ゲーミング)" - -#~ msgid "Breezy Desktop (productivity)" -#~ msgstr "Breezy Desktop(プロダクティビティ)" - -#~ msgid "Gaming" -#~ msgstr "ゲーミング" - -#~ msgid "Productivity" -#~ msgstr "プロダクティビティ" - -#~ msgid "fullscreen" -#~ msgstr "全画面" - -#~ msgid "Show full range" -#~ msgstr "全範囲を表示" - -#~ msgid "" -#~ "Unable to add virtual displays on this machine. Wayland and xdg-desktop-" -#~ "portal are required." -#~ msgstr "仮想ディスプレイが追加できません。" - -#~ msgid "Fast SBS mode switching" -#~ msgstr "高速SBSモード切り替え" - -#~ msgid "" -#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen " -#~ "mode is on. May cause instability." -#~ msgstr "" -#~ "ワイドスクリーンモードがオンになっている場合、メガネ接続時にたたちにSBS" -#~ "モードに切り替えます。不安定になる可能性があります。" - -#~ msgid "Set Unfocused Displays Distance" -#~ msgstr "フォーカス外のディスプレイ距離" - -#~ msgid "Widescreen mode" -#~ msgstr "ワイドスクリーンモード" - -#~ msgid "" -#~ "Closer appears larger, further appears smaller. Controls depth when in " -#~ "widescreen mode." -#~ msgstr "" -#~ "近づけると大きく見え、遠ざけると小さく見えます。\n" -#~ "ワイドスクリーンモードの奥行きを制御します。" - -#~ msgid "" -#~ "Combine with display distance to achieve a comfortable level of depth and " -#~ "size." -#~ msgstr "" -#~ "ディスプレイ距離と組み合わせて、\n" -#~ "快適な奥行きとサイズを実現します。" - -#~ msgid "Display toggle distances" -#~ msgstr "ディスプレイ距離の切り替え" - -#~ msgid "" -#~ "Use the buttons to capture the current display distance for use with the " -#~ "keyboard shortcut." -#~ msgstr "" -#~ "2個のボタンを使用して、キーボードショートカットで使用する現在のディスプレ" -#~ "イ距離をそれぞれ設定します。" - -#~ msgid "Display distance shortcut" -#~ msgstr "ディスプレイ距離の切り替え" - -#~ msgid "Quickly toggle between two predefined distances." -#~ msgstr "設定してある2個の距離をすばやく切り替えます。" - -#~ msgid "Start in widescreen mode" -#~ msgstr "ワイドスクリーンモードで起動" - -#~ msgid "Widescreen mode is not supported for all glasses." -#~ msgstr "" -#~ "ワイドスクリーンモードはすべてのメガネで対応しているわけではありません。" diff --git a/ui/po/meson.build b/ui/po/meson.build deleted file mode 100644 index 25704f5..0000000 --- a/ui/po/meson.build +++ /dev/null @@ -1 +0,0 @@ -i18n.gettext('breezydesktop', preset: 'glib') diff --git a/ui/po/mo/de/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/de/LC_MESSAGES/breezydesktop.mo deleted file mode 100644 index d72ea5dcb0c4540547f5147cb7186624a6f3360c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14992 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 AGynhq diff --git a/ui/po/mo/es/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/es/LC_MESSAGES/breezydesktop.mo deleted file mode 100644 index eedac0367dcb0d96077ee0915fb9314bfa62f2e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14819 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 OZ`9P>^0N*_w)sDf(XTfE diff --git a/ui/po/mo/fr/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/fr/LC_MESSAGES/breezydesktop.mo deleted file mode 100644 index c27df4908f30d26ba496e07d72be7803608ba6a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15239 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 L?R(+J;?n#N2;g@u diff --git a/ui/po/mo/it/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/it/LC_MESSAGES/breezydesktop.mo deleted file mode 100644 index 07e76136d0c2b98a3eeafd2b8ee3bb2938018527..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15181 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 !uukgmQB%6dD%d%-Sj@E!0i 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 diff --git a/ui/po/mo/pl/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/pl/LC_MESSAGES/breezydesktop.mo deleted file mode 100644 index b47133475bb2482237662f2f9fdff0271b6bbc69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467 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 ylKrBKar`%*LW!v~%!?woNnr(AO{gANs! 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

q7DwbOwBXU132 z;-PKDb=!02P6cgygR#+Y=Wy=a7|Y*iSwG8x&*IUY;Y$Z|;}iKE$4mZVKUX>7uCts{ z>~AR?U6&huzOZgbetcVD;)SsLNN(&%p?f6g*;yF87!0%)2G0dOLxrJrdfQph+Qpi% zb5k&}K?q%cJlu7Fjq)#c23@DauC0Yv4=}YX_2JVoB6@;W;x*EuEJ0+q?Hd~ zl(TaeC)krCc@8$84hH*X(7t;JITkr%Ya3IM4abKsujf?0Z_aY;<|Vq(oSeJsKw)q+ z+zluC(23nV=f-vy&YU+?6*r8VL-R++@}m=PE4DW;wB`4n3EGB(j{SuV;}}oazn|r0 zW{WNDVdsh5=;r)bTVeFY!r%lNl?iQo%;qAiJzH62_J8w2yU~_&bI^VwcdpZ!9su-* z&2XqE>~G7Dohl3-l8>77gY#!>-$KyUnjbx;<^=;M_&3~xhNpbVEPuvy@)x^2z+idzx@nF!BnA6nAe@!J!v|jsq5g!9zjY*9dY zcSDdE(O{nn+grl^cJZT^A-$KwkDI5$$o^tqPk8)baG^&DpD!I`Nq&4VcWxAO7E{}O zF+VV>%-iCQ!TjFc!NiMU*9gz5(0VfHI38>r;{R7xhP`cgwtY!TG5z2|3loqBhG*yq zHjU)Qw_5_t4x3IFcb!tf`1WweP}p+@N{#u8JhWSg7KbzkLSCGgVxcoza<)yXH(ItBofZ$i`bJAvv2}|fyfCs4XPK0)MZtVf%^T#ifY!`W(`VqH;pyJ+ za7*}VCw`tA8_SLNmQ4bEJHq-vtI&ibgPy~NaKl=#cT|iWJF)EO87QtezSX=z?#8Ok zf;kQ`QzBkTVMJF19-cakj*7d^sBrHYY(|;5Qe4mLmfYxGj6FBrpS#dkIP_w;aepwn z16r9R>8yBYqtHHZrnupFVPd>+?qqJf3x7h<7gs6a#+?tP`W?~wI$GbmD=>8%7U?WZHJBI=EP~G$Xn5oiLfdu&>y+N1S?OUobMLOgd7*Ac=OXG65nO=*zD^UpRI&>^^1; zK!Tw)q_BOv%<9<^w2l>9yU4XD8o}bAxpVF1m*IhfK`Uf;1|1X1EOn-uu9%RC8N#>8 zBl(WAVaqz(QNhqy*nZKtePx(X!THk&NzL?CH6@5vc8qZlJ5N-;%^w>RB~1;F93FYagw&I@U1DZghd zz=7Mlm|#pV7~H^)m4#Tir9HptSV>RjMq#!u44nygcN7(q*?jh27QR4PxZ4m;I=2?d%ro%l?^GkuYK@x;q$HGjM_ z7$sv<+O=OK`jo4?|fHMMTN6M_wU@O10H`n&Ze;rf8uK68b6wiwU8~j8rVa zO2;md7FuHIG?@`-oY}>emhiv@MrJ#tQWF>CBVT^U{@my>Q(D-9?a+%hY=j*hSXX6; z2z#C<^bhlEYh<9A*3&vj#ws(as$LK<=;a4ct)h?NenT9{(9-2O#<=>_}v@}*E z{yMPMtq`lxlx=y8+Jc$CJF!Nb+xKX-(YZ@ zfSR8e3tGDL8Z9#_I;rx9cH}O0D(q0G)ul;(@1Qu&xh_+-l=Y{Vwp8hKhA)rP&&|bgeKR!R-G3%WSL;2`ZBo$hVTXND}<^2%o_@R z2{~GeqHtUGXagzN;SL%0HVP$YQak0MLlOvAM{6)|m-9qjT%+1{N;N=z)O!X+;jl)h zmC3iTk(>QXjGF7O`F4>T>&kCD8=Trr2*-|D79wsl~JW`daE%qXTLouXxZ|I}%R rH=UwM-W=t*OR8~m(J^;hG90fvY diff --git a/ui/po/pl.po b/ui/po/pl.po deleted file mode 100644 index c9de508..0000000 --- a/ui/po/pl.po +++ /dev/null @@ -1,718 +0,0 @@ -# Polish translations for PACKAGE package. -# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# , 2024. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-03 12:40-0800\n" -"PO-Revision-Date: 2024-08-16 10:26-0700\n" -"Last-Translator: \n" -"Language-Team: Polish \n" -"Language: pl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2);\n" - -#: src/connecteddevice.py:29 -msgid "" -"Switches your glasses into side-by-side mode and doubles the width of the " -"display." -msgstr "" - -#: src/connecteddevice.py:30 -msgid "This feature is not currently supported for your device." -msgstr "" - -#: src/connecteddevice.py:160 -msgid "Set Focused Display Distance" -msgstr "" - -#: src/connecteddevice.py:161 -msgid "Use a closer value so the display zooms in when you look at it." -msgstr "" - -#: src/connecteddevice.py:168 -msgid "Set All Displays Distance" -msgstr "" - -#: src/connecteddevice.py:169 -msgid "Use a farther value so the displays are zoomed out when you look away." -msgstr "" - -#: src/connecteddevice.py:309 -msgid "" -"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, " -"and the pipewire GStreamer plugin are required." -msgstr "" - -#: src/connecteddevice.py:343 -msgid "Focused display" -msgstr "" - -#: src/connecteddevice.py:349 -msgid "All displays" -msgstr "" - -#: src/licensedialogcontent.py:63 -msgid "Paid Tier Status" -msgstr "" - -#: src/licensedialogcontent.py:71 -msgid "Feature Availability" -msgstr "" - -#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104 -#: src/gtk/connected-device.ui:786 -msgid "Disabled" -msgstr "" - -#: src/licensefeaturerow.py:18 -msgid "In trial" -msgstr "" - -#: src/licensefeaturerow.py:18 -msgid "Enabled" -msgstr "" - -#: src/licensefeaturerow.py:24 src/licensetierrow.py:30 -#, python-brace-format -msgid " ({time_remaining} remaining)" -msgstr "" - -#: src/licensefeaturerow.py:30 src/licensetierrow.py:56 -msgid "Productivity Basic" -msgstr "" - -#: src/licensefeaturerow.py:31 src/licensetierrow.py:57 -msgid "Productivity Pro" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Active" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Inactive" -msgstr "" - -#: src/licensetierrow.py:41 -#, python-brace-format -msgid "${amount} USD" -msgstr "" - -#: src/licensetierrow.py:43 -msgid " to renew" -msgstr "" - -#: src/licensetierrow.py:45 -msgid " to upgrade" -msgstr "" - -#: src/licensetierrow.py:47 -msgid "Paid through next renewal period" -msgstr "" - -#: src/licensetierrow.py:63 -msgid " - renewing monthly" -msgstr "" - -#: src/licensetierrow.py:64 -msgid " - renewing yearly" -msgstr "" - -#: src/licensetierrow.py:65 -msgid "with lifetime access" -msgstr "" - -#: src/licensetierrow.py:72 -msgid "Monthly" -msgstr "" - -#: src/licensetierrow.py:73 -msgid "Yearly" -msgstr "" - -#: src/licensetierrow.py:74 -msgid "Lifetime" -msgstr "" - -#: src/time.py:14 -msgid "less than an hour" -msgstr "" - -#: src/time.py:17 -msgid "1 hour" -msgstr "" - -#: src/time.py:17 -#, python-brace-format -msgid "{time_remaining} hours" -msgstr "" - -#: src/time.py:20 -msgid "1 day" -msgstr "" - -#: src/time.py:20 -#, python-brace-format -msgid "{time_remaining} days" -msgstr "" - -#: src/gtk/connected-device.ui:21 -msgid "connected" -msgstr "" - -#: src/gtk/connected-device.ui:31 -msgid "General Settings" -msgstr "" - -#: src/gtk/connected-device.ui:41 -msgid "Features" -msgstr "" - -#: src/gtk/connected-device.ui:45 -msgid "XR effect" -msgstr "" - -#: src/gtk/connected-device.ui:46 -msgid "Enables the Breezy Desktop XR effect." -msgstr "" - -#: src/gtk/connected-device.ui:56 -msgid "Zoom on focus" -msgstr "" - -#: src/gtk/connected-device.ui:57 -msgid "" -"Automatically move a display closer when you look at it.\n" -"Set your preferred focused and unfocused distances in the Adjustments " -"section.\n" -" " -msgstr "" - -#: src/gtk/connected-device.ui:70 -msgid "Follow mode" -msgstr "" - -#: src/gtk/connected-device.ui:71 -msgid "Keep the focused display near the center of your view." -msgstr "" - -#: src/gtk/connected-device.ui:81 -msgid "Curved display" -msgstr "" - -#: src/gtk/connected-device.ui:82 -msgid "Switch between flat and curved displays." -msgstr "" - -#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36 -msgid "Disable physical displays" -msgstr "" - -#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37 -msgid "" -"Automatically disable all physical displays when the XR effect is enabled." -msgstr "" - -#: src/gtk/connected-device.ui:104 -msgid "Virtual displays" -msgstr "" - -#: src/gtk/connected-device.ui:120 -msgid "1080p" -msgstr "" - -#: src/gtk/connected-device.ui:121 -msgid "1440p" -msgstr "" - -#: src/gtk/connected-device.ui:122 -msgid "Add custom" -msgstr "" - -#: src/gtk/connected-device.ui:136 -msgid "Remove custom resolution" -msgstr "" - -#: src/gtk/connected-device.ui:156 -msgid "Rearrange displays" -msgstr "" - -#: src/gtk/connected-device.ui:174 -msgid "Adjustments" -msgstr "" - -#: src/gtk/connected-device.ui:178 -msgid "Display distances" -msgstr "" - -#: src/gtk/connected-device.ui:179 -msgid "Set how close you want displays to appear." -msgstr "" - -#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221 -#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472 -#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530 -#: src/gtk/connected-device.ui:559 -msgid "Change" -msgstr "" - -#: src/gtk/connected-device.ui:234 -msgid "Display size" -msgstr "" - -#: src/gtk/connected-device.ui:235 -msgid "Set how large you want the display to appear." -msgstr "" - -#: src/gtk/connected-device.ui:254 -msgid "full" -msgstr "" - -#: src/gtk/connected-device.ui:264 -msgid "Follow threshold" -msgstr "" - -#: src/gtk/connected-device.ui:265 -msgid "How far away you can look before the display follows." -msgstr "" - -#: src/gtk/connected-device.ui:288 -msgid "Display angling" -msgstr "" - -#: src/gtk/connected-device.ui:289 -msgid "" -"When there are multiple displays, choose how they should angle towards you." -msgstr "" - -#: src/gtk/connected-device.ui:303 -msgid "Automatic" -msgstr "" - -#: src/gtk/connected-device.ui:304 -msgid "Side-angled" -msgstr "" - -#: src/gtk/connected-device.ui:305 -msgid "Top-angled" -msgstr "" - -#: src/gtk/connected-device.ui:306 -msgid "Flat" -msgstr "" - -#: src/gtk/connected-device.ui:316 -msgid "Display spacing" -msgstr "" - -#: src/gtk/connected-device.ui:317 -msgid "Put empty space between displays, when there are multiple." -msgstr "" - -#: src/gtk/connected-device.ui:347 -msgid "Viewport horizontal offset" -msgstr "" - -#: src/gtk/connected-device.ui:348 -msgid "Move the viewport to the left or right of its default position." -msgstr "" - -#: src/gtk/connected-device.ui:365 -msgid "left" -msgstr "" - -#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397 -msgid "center" -msgstr "" - -#: src/gtk/connected-device.ui:369 -msgid "right" -msgstr "" - -#: src/gtk/connected-device.ui:377 -msgid "Viewport vertical offset" -msgstr "" - -#: src/gtk/connected-device.ui:378 -msgid "Move the viewport up or down from its default position." -msgstr "" - -#: src/gtk/connected-device.ui:395 -msgid "down" -msgstr "" - -#: src/gtk/connected-device.ui:399 -msgid "up" -msgstr "" - -#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420 -msgid "Keyboard Shortcuts" -msgstr "" - -#: src/gtk/connected-device.ui:423 -msgid "XR Effect on/off shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:424 -msgid "" -"Quickly enable or disable the XR Effect. You may need to enable the effect " -"manually once in order to enable the shortcut." -msgstr "" - -#: src/gtk/connected-device.ui:452 -msgid "Re-center display shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:453 -msgid "Pin the virtual display to the current position." -msgstr "" - -#: src/gtk/connected-device.ui:481 -msgid "Toggle zoom on focus shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:482 -msgid "Quickly toggle zoom on focus mode." -msgstr "" - -#: src/gtk/connected-device.ui:510 -msgid "Toggle follow mode shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:511 -msgid "Quickly toggle follow mode." -msgstr "" - -#: src/gtk/connected-device.ui:539 -msgid "Summon mouse cursor shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:540 -msgid "Bring the mouse cursor to the center of the focused display." -msgstr "" - -#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585 -msgid "Advanced Settings" -msgstr "" - -#: src/gtk/connected-device.ui:589 -msgid "Units" -msgstr "" - -#: src/gtk/connected-device.ui:590 -msgid "Choose measurement units for size and distance displays." -msgstr "" - -#: src/gtk/connected-device.ui:605 -msgid "Centimeters" -msgstr "" - -#: src/gtk/connected-device.ui:606 -msgid "Inches" -msgstr "" - -#: src/gtk/connected-device.ui:618 -msgid "Find optimal display config" -msgstr "" - -#: src/gtk/connected-device.ui:619 -msgid "" -"Automatically modify the glasses display configuration for maximum " -"resolution and best scaling when plugged in." -msgstr "" - -#: src/gtk/connected-device.ui:629 -msgid "Use highest refresh rate" -msgstr "" - -#: src/gtk/connected-device.ui:630 -msgid "Refresh rate may affect performance, disable this to set it manually." -msgstr "" - -#: src/gtk/connected-device.ui:640 -msgid "Center on glasses' display" -msgstr "" - -#: src/gtk/connected-device.ui:641 -msgid "" -"Center the viewport on the glasses' display, even if the display is not in " -"the middle." -msgstr "" - -#: src/gtk/connected-device.ui:651 -msgid "Always primary display" -msgstr "" - -#: src/gtk/connected-device.ui:652 -msgid "Automatically set the glasses as the primary display when plugged in." -msgstr "" - -#: src/gtk/connected-device.ui:662 -msgid "Remove virtual displays on disable" -msgstr "" - -#: src/gtk/connected-device.ui:663 -msgid "Automatically remove virtual displays when the XR effect is disabled." -msgstr "" - -#: src/gtk/connected-device.ui:673 -msgid "Enable multi-tap detection" -msgstr "" - -#: src/gtk/connected-device.ui:674 -msgid "Enables double-tap to recenter and triple-tap to recalibrate." -msgstr "" - -#: src/gtk/connected-device.ui:684 -msgid "All displays follow mode" -msgstr "" - -#: src/gtk/connected-device.ui:685 -msgid "Follow mode moves all displays, not just the focused one." -msgstr "" - -#: src/gtk/connected-device.ui:701 -msgid "Neck-saver horizontal multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:702 -msgid "Higher values require smaller horizontal head movements." -msgstr "" - -#: src/gtk/connected-device.ui:734 -msgid "Neck-saver vertical multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:735 -msgid "Higher values require smaller vertical head movements." -msgstr "" - -#: src/gtk/connected-device.ui:767 -msgid "Dead-zone threshold (degrees)" -msgstr "" - -#: src/gtk/connected-device.ui:768 -msgid "Stabilize movements below this angle." -msgstr "" - -#: src/gtk/connected-device.ui:799 -msgid "Follow mode movement tracking" -msgstr "" - -#: src/gtk/connected-device.ui:800 -msgid "Choose which movements should be tracked in follow mode." -msgstr "" - -#: src/gtk/connected-device.ui:815 -msgid "Horizontal" -msgstr "" - -#: src/gtk/connected-device.ui:835 -msgid "Vertical" -msgstr "" - -#: src/gtk/connected-device.ui:855 -msgid "Tilt/roll" -msgstr "" - -#: src/gtk/connected-device.ui:873 -msgid "Movement look-ahead" -msgstr "" - -#: src/gtk/connected-device.ui:874 -msgid "" -"Counteracts input lag by predicting head-tracking position ahead of render " -"time. Stick with default unless virtual display drags behind your head " -"movements, jumps ahead, or is very shaky." -msgstr "" - -#: src/gtk/connected-device.ui:892 -msgid "Default" -msgstr "" - -#: src/gtk/connected-device.ui:904 -msgid "Text Scaling" -msgstr "" - -#: src/gtk/connected-device.ui:905 -msgid "Scaling text below 1.0 will simulate a higher resolution display" -msgstr "" - -#: src/gtk/custom-resolution-dialog-content.ui:9 -msgid "Width" -msgstr "" - -#: src/gtk/custom-resolution-dialog-content.ui:42 -msgid "Height" -msgstr "" - -#: src/gtk/custom-resolution-dialog.ui:5 -msgid "Add a Custom Resolution" -msgstr "" - -#: src/gtk/custom-resolution-dialog.ui:10 -msgid "Add" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:35 -msgid "closer" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:36 -msgid "default" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:37 -msgid "farther" -msgstr "" - -#: src/gtk/display-distance-dialog.ui:9 -msgid "Done" -msgstr "" - -#: src/gtk/failed-verification.ui:15 -msgid "Breezy Desktop GNOME invalid setup" -msgstr "" - -#: src/gtk/failed-verification.ui:16 -msgid "" -"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup " -"script. Report this issue if it persists." -msgstr "" - -#: src/gtk/license-dialog-content.ui:15 -msgid "Donate" -msgstr "" - -#: src/gtk/license-dialog-content.ui:31 -msgid "Request a token" -msgstr "" - -#: src/gtk/license-dialog-content.ui:39 -msgid "Verify token" -msgstr "" - -#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139 -msgid "License Details" -msgstr "" - -#: src/gtk/no-device.ui:15 -msgid "No device connected" -msgstr "" - -#: src/gtk/no-device.ui:16 -msgid "Breezy Desktop was unable to detect any supported XR devices." -msgstr "" - -#: src/gtk/no-device.ui:25 -msgid "Auto-enable XR effect" -msgstr "" - -#: src/gtk/no-device.ui:26 -msgid "" -"Automatically enable the Breezy Desktop XR effect when supported glasses are " -"connected." -msgstr "" - -#: src/gtk/no-driver.ui:15 -msgid "No driver running" -msgstr "" - -#: src/gtk/no-driver.ui:16 -msgid "" -"\n" -" If you installed via AUR, make sure you ran the recommended post-" -"install command:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Otherwise, please file an issue on GitHub, or create a new thread " -"in the #troubleshooting channel on Discord.\n" -" " -msgstr "" - -#: src/gtk/no-extension.ui:15 -msgid "Breezy Desktop GNOME extension not ready" -msgstr "" - -#: src/gtk/no-extension.ui:16 -msgid "" -"If you have just run the setup, then you may need to log out and back in to " -"use it. Otherwise, please follow the Breezy GNOME setup instructions." -msgstr "" - -#: src/gtk/no-license.ui:15 -msgid "No license file was found" -msgstr "" - -#: src/gtk/no-license.ui:16 -msgid "" -"\n" -" The first time you use Breezy Desktop, an internet connection is " -"required to retrieve your device's license.\n" -" \n" -" Don't worry, there's no obligation to donate at this time. If you " -"haven't, you'll be given a trial license so you can decide if Breezy Desktop " -"fits your needs. \n" -" \n" -" Once you obtain a license, trial or otherwise, you can use Breezy " -"Desktop offline until features expire (or indefinitely, if you've chosen " -"lifetime access).\n" -" " -msgstr "" - -#: src/gtk/no-license.ui:29 -msgid "Try Again" -msgstr "" - -#: src/gtk/shortcut-dialog.ui:5 -msgid "Assign Keyboard Shortcut" -msgstr "" - -#: src/gtk/shortcut-dialog.ui:20 -msgid "Press your keyboard shortcut or 'Backspace' to disable..." -msgstr "" - -#: src/gtk/window.ui:10 -msgid "Breezy Desktop" -msgstr "" - -#: src/gtk/window.ui:23 -msgid "Menu" -msgstr "" - -#: src/gtk/window.ui:43 -msgid "Some features expire soon" -msgstr "" - -#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102 -msgid "View details" -msgstr "" - -#: src/gtk/window.ui:68 -msgid "Productivity features are disabled" -msgstr "" - -#: src/gtk/window.ui:93 -msgid "" -"Productivity Pro license is inactive — 6DoF features will be unavailable" -msgstr "" - -#: src/gtk/window.ui:119 -msgid "" -"A newer version is available. To update, rerun the breezy_gnome_setup script." -msgstr "" - -#: src/gtk/window.ui:143 -msgid "Force Reset" -msgstr "" - -#: src/gtk/window.ui:147 -msgid "About BreezyDesktop" -msgstr "" diff --git a/ui/po/pt_BR.po b/ui/po/pt_BR.po deleted file mode 100644 index f9f8393..0000000 --- a/ui/po/pt_BR.po +++ /dev/null @@ -1,866 +0,0 @@ -# Portuguese translations for PACKAGE package. -# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# , 2024. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-03 12:40-0800\n" -"PO-Revision-Date: 2024-08-19 09:39-0700\n" -"Last-Translator: \n" -"Language-Team: Brazilian Portuguese \n" -"Language: pt_BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#: src/connecteddevice.py:29 -msgid "" -"Switches your glasses into side-by-side mode and doubles the width of the " -"display." -msgstr "" -"Altera o modo dos óculos para lado a lado (SBS) e dobra a largura da tela " -"(ultrawide)." - -#: src/connecteddevice.py:30 -msgid "This feature is not currently supported for your device." -msgstr "Este recurso não é atualmente suportado para o seu dispositivo." - -#: src/connecteddevice.py:160 -msgid "Set Focused Display Distance" -msgstr "Distância da tela" - -#: src/connecteddevice.py:161 -msgid "Use a closer value so the display zooms in when you look at it." -msgstr "" -"Use um valor mais aproximado para que as telas se aproximem quando olha para " -"ela." - -#: src/connecteddevice.py:168 -msgid "Set All Displays Distance" -msgstr "Distância da tela" - -#: src/connecteddevice.py:169 -msgid "Use a farther value so the displays are zoomed out when you look away." -msgstr "" -"Use um valor mais distante para que as telas se afastem quando olha para " -"elas." - -#: src/connecteddevice.py:309 -msgid "" -"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, " -"and the pipewire GStreamer plugin are required." -msgstr "" -"Não é possível adicionar telas neste dispositivo. xdg-desktop-portal é " -"requerido." - -#: src/connecteddevice.py:343 -msgid "Focused display" -msgstr "Distância da tela" - -#: src/connecteddevice.py:349 -msgid "All displays" -msgstr "Tela curva" - -#: src/licensedialogcontent.py:63 -msgid "Paid Tier Status" -msgstr "Status do Nível Pago" - -#: src/licensedialogcontent.py:71 -msgid "Feature Availability" -msgstr "Disponibilidade de Recursos" - -#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104 -#: src/gtk/connected-device.ui:786 -msgid "Disabled" -msgstr "Desabilitado" - -#: src/licensefeaturerow.py:18 -msgid "In trial" -msgstr "Em teste" - -#: src/licensefeaturerow.py:18 -msgid "Enabled" -msgstr "Habilitado" - -#: src/licensefeaturerow.py:24 src/licensetierrow.py:30 -#, python-brace-format -msgid " ({time_remaining} remaining)" -msgstr " ({time_remaining} restantes)" - -#: src/licensefeaturerow.py:30 src/licensetierrow.py:56 -msgid "Productivity Basic" -msgstr "" - -#: src/licensefeaturerow.py:31 src/licensetierrow.py:57 -msgid "Productivity Pro" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Active" -msgstr "Ativo" - -#: src/licensetierrow.py:24 -msgid "Inactive" -msgstr "Inativo" - -#: src/licensetierrow.py:41 -#, python-brace-format -msgid "${amount} USD" -msgstr "${amount} USD" - -#: src/licensetierrow.py:43 -msgid " to renew" -msgstr " para renovar" - -#: src/licensetierrow.py:45 -msgid " to upgrade" -msgstr " para atualizar" - -#: src/licensetierrow.py:47 -msgid "Paid through next renewal period" -msgstr "Pago até o próximo período de renovação" - -#: src/licensetierrow.py:63 -msgid " - renewing monthly" -msgstr " - renovando mensalmente" - -#: src/licensetierrow.py:64 -msgid " - renewing yearly" -msgstr " - renovando anualmente" - -#: src/licensetierrow.py:65 -msgid "with lifetime access" -msgstr "com acesso vitalício" - -#: src/licensetierrow.py:72 -msgid "Monthly" -msgstr "Mensal" - -#: src/licensetierrow.py:73 -msgid "Yearly" -msgstr "Anual" - -#: src/licensetierrow.py:74 -msgid "Lifetime" -msgstr "Vitalício" - -#: src/time.py:14 -msgid "less than an hour" -msgstr "menos de uma hora" - -#: src/time.py:17 -msgid "1 hour" -msgstr "1 hora" - -#: src/time.py:17 -#, python-brace-format -msgid "{time_remaining} hours" -msgstr "{time_remaining} horas" - -#: src/time.py:20 -msgid "1 day" -msgstr "1 dia" - -#: src/time.py:20 -#, python-brace-format -msgid "{time_remaining} days" -msgstr "{time_remaining} dias" - -#: src/gtk/connected-device.ui:21 -msgid "connected" -msgstr "conectado" - -#: src/gtk/connected-device.ui:31 -msgid "General Settings" -msgstr "Configurações Gerais" - -#: src/gtk/connected-device.ui:41 -msgid "Features" -msgstr "Recursos" - -#: src/gtk/connected-device.ui:45 -msgid "XR effect" -msgstr "Efeito XR" - -#: src/gtk/connected-device.ui:46 -msgid "Enables the Breezy Desktop XR effect." -msgstr "Habilita o efeito XR do Breezy Desktop." - -#: src/gtk/connected-device.ui:56 -msgid "Zoom on focus" -msgstr "Aproximar na focagem" - -#: src/gtk/connected-device.ui:57 -msgid "" -"Automatically move a display closer when you look at it.\n" -"Set your preferred focused and unfocused distances in the Adjustments " -"section.\n" -" " -msgstr "" -"Mover automaticamente a tela mais perto quando olha nela.\n" -"Defina as suas distâncias preferidas focadas e não focadas nos Ajustes de " -"secção.\n" -" " - -#: src/gtk/connected-device.ui:70 -msgid "Follow mode" -msgstr "Modo de acompanhamento" - -#: src/gtk/connected-device.ui:71 -msgid "Keep the focused display near the center of your view." -msgstr "Mantenha a tela virtual próxima ao centro da sua visão." - -#: src/gtk/connected-device.ui:81 -msgid "Curved display" -msgstr "Tela curva" - -#: src/gtk/connected-device.ui:82 -msgid "Switch between flat and curved displays." -msgstr "Alterne entre tela plana e tela curva." - -#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36 -msgid "Disable physical displays" -msgstr "Desativar as telas físicas" - -#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37 -msgid "" -"Automatically disable all physical displays when the XR effect is enabled." -msgstr "" -"Desactive automaticamente todos as telas físicas quando o efeito XR estiver " -"activado." - -#: src/gtk/connected-device.ui:104 -msgid "Virtual displays" -msgstr "Tela curva" - -#: src/gtk/connected-device.ui:120 -msgid "1080p" -msgstr "1080p" - -#: src/gtk/connected-device.ui:121 -msgid "1440p" -msgstr "1440p" - -#: src/gtk/connected-device.ui:122 -msgid "Add custom" -msgstr "Adicionar" - -#: src/gtk/connected-device.ui:136 -msgid "Remove custom resolution" -msgstr "Remover resolução personalizada" - -#: src/gtk/connected-device.ui:156 -msgid "Rearrange displays" -msgstr "Rearranjar tela" - -#: src/gtk/connected-device.ui:174 -msgid "Adjustments" -msgstr "Ajustes" - -#: src/gtk/connected-device.ui:178 -msgid "Display distances" -msgstr "Distância da tela" - -#: src/gtk/connected-device.ui:179 -msgid "Set how close you want displays to appear." -msgstr "Defina o quão perto quer que as telas apareçam." - -#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221 -#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472 -#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530 -#: src/gtk/connected-device.ui:559 -msgid "Change" -msgstr "Alterar" - -#: src/gtk/connected-device.ui:234 -msgid "Display size" -msgstr "" - -#: src/gtk/connected-device.ui:235 -msgid "Set how large you want the display to appear." -msgstr "" - -#: src/gtk/connected-device.ui:254 -msgid "full" -msgstr "" - -#: src/gtk/connected-device.ui:264 -msgid "Follow threshold" -msgstr "Sensibilidade do modo de acompanhamento" - -#: src/gtk/connected-device.ui:265 -msgid "How far away you can look before the display follows." -msgstr "Quanto você pode mover a cabeça antes que a tela te acompanhe." - -#: src/gtk/connected-device.ui:288 -msgid "Display angling" -msgstr "Tamanho da tela" - -#: src/gtk/connected-device.ui:289 -msgid "" -"When there are multiple displays, choose how they should angle towards you." -msgstr "" -"Quando existirem várias telas, escolha o ângulo em que devem estar virados " -"para si." - -#: src/gtk/connected-device.ui:303 -msgid "Automatic" -msgstr "Automático" - -#: src/gtk/connected-device.ui:304 -msgid "Side-angled" -msgstr "Ângulo lateral" - -#: src/gtk/connected-device.ui:305 -msgid "Top-angled" -msgstr "Ângulo superior" - -#: src/gtk/connected-device.ui:306 -msgid "Flat" -msgstr "Plano" - -#: src/gtk/connected-device.ui:316 -msgid "Display spacing" -msgstr "Tamanho da tela" - -#: src/gtk/connected-device.ui:317 -msgid "Put empty space between displays, when there are multiple." -msgstr "Coloque um espaço vazio entre as telas, quando existem várias." - -#: src/gtk/connected-device.ui:347 -msgid "Viewport horizontal offset" -msgstr "Deslocamento horizontal da janela de visualização" - -#: src/gtk/connected-device.ui:348 -msgid "Move the viewport to the left or right of its default position." -msgstr "" -"Mova a janela de visualização para a esquerda ou direita da sua posição " -"predefinida." - -#: src/gtk/connected-device.ui:365 -msgid "left" -msgstr "esquerda" - -#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397 -msgid "center" -msgstr "centro" - -#: src/gtk/connected-device.ui:369 -msgid "right" -msgstr "direita" - -#: src/gtk/connected-device.ui:377 -msgid "Viewport vertical offset" -msgstr "Deslocamento vertical da janela de visualização" - -#: src/gtk/connected-device.ui:378 -msgid "Move the viewport up or down from its default position." -msgstr "" -"Mova a janela de visualização para cima ou para baixo da sua posição " -"predefinida." - -#: src/gtk/connected-device.ui:395 -msgid "down" -msgstr "baixo" - -#: src/gtk/connected-device.ui:399 -msgid "up" -msgstr "cima" - -#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420 -msgid "Keyboard Shortcuts" -msgstr "Atalhos de teclado" - -#: src/gtk/connected-device.ui:423 -msgid "XR Effect on/off shortcut" -msgstr "Atalho para ligar/desligar o efeito XR" - -#: src/gtk/connected-device.ui:424 -msgid "" -"Quickly enable or disable the XR Effect. You may need to enable the effect " -"manually once in order to enable the shortcut." -msgstr "" -"Ative ou desative rapidamente o Efeito XR. Pode ser necessário ativar o " -"efeito manualmente para ativar o atalho." - -#: src/gtk/connected-device.ui:452 -msgid "Re-center display shortcut" -msgstr "Atalho para recentralizar a tela" - -#: src/gtk/connected-device.ui:453 -msgid "Pin the virtual display to the current position." -msgstr "Traga a tela virtual para onde você está olhando." - -#: src/gtk/connected-device.ui:481 -msgid "Toggle zoom on focus shortcut" -msgstr "Atalho para alternar o modo de acompanhamento" - -#: src/gtk/connected-device.ui:482 -msgid "Quickly toggle zoom on focus mode." -msgstr "Alterne rapidamente o modo de acompanhamento." - -#: src/gtk/connected-device.ui:510 -msgid "Toggle follow mode shortcut" -msgstr "Atalho para alternar o modo de acompanhamento" - -#: src/gtk/connected-device.ui:511 -msgid "Quickly toggle follow mode." -msgstr "Alterne rapidamente o modo de acompanhamento." - -#: src/gtk/connected-device.ui:539 -msgid "Summon mouse cursor shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:540 -msgid "Bring the mouse cursor to the center of the focused display." -msgstr "" - -#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585 -msgid "Advanced Settings" -msgstr "Configurações Avançadas" - -#: src/gtk/connected-device.ui:589 -msgid "Units" -msgstr "" - -#: src/gtk/connected-device.ui:590 -msgid "Choose measurement units for size and distance displays." -msgstr "" - -#: src/gtk/connected-device.ui:605 -msgid "Centimeters" -msgstr "" - -#: src/gtk/connected-device.ui:606 -msgid "Inches" -msgstr "" - -#: src/gtk/connected-device.ui:618 -msgid "Find optimal display config" -msgstr "Encontre a configuração de tela ideal" - -#: src/gtk/connected-device.ui:619 -msgid "" -"Automatically modify the glasses display configuration for maximum " -"resolution and best scaling when plugged in." -msgstr "" -"Modifique automaticamente a configuração de exibição dos óculos para máxima " -"resolução e melhor dimensionamento quando conectado." - -#: src/gtk/connected-device.ui:629 -msgid "Use highest refresh rate" -msgstr "Use a taxa de atualização mais alta" - -#: src/gtk/connected-device.ui:630 -msgid "Refresh rate may affect performance, disable this to set it manually." -msgstr "" -"A taxa de atualização pode afetar o desempenho, desative-a para defini-la " -"manualmente." - -#: src/gtk/connected-device.ui:640 -msgid "Center on glasses' display" -msgstr "Centralize na exposição dos óculos" - -#: src/gtk/connected-device.ui:641 -msgid "" -"Center the viewport on the glasses' display, even if the display is not in " -"the middle." -msgstr "" -"Centralize a janela de visualização no ecrã dos óculos, mesmo que a tela não " -"esteja no meio." - -#: src/gtk/connected-device.ui:651 -msgid "Always primary display" -msgstr "Sempre tela principal" - -#: src/gtk/connected-device.ui:652 -msgid "Automatically set the glasses as the primary display when plugged in." -msgstr "" -"Defina automaticamente os óculos como a tela primária quando conectados." - -#: src/gtk/connected-device.ui:662 -msgid "Remove virtual displays on disable" -msgstr "Tela curva" - -#: src/gtk/connected-device.ui:663 -msgid "Automatically remove virtual displays when the XR effect is disabled." -msgstr "" -"Remove automaticamente as telas virtuais quando o efeito XR está desativado." - -#: src/gtk/connected-device.ui:673 -msgid "Enable multi-tap detection" -msgstr "Ativar detecção de multitoque" - -#: src/gtk/connected-device.ui:674 -msgid "Enables double-tap to recenter and triple-tap to recalibrate." -msgstr "Permite o duplo toque para recentrar e o triplo toque para recalibrar." - -#: src/gtk/connected-device.ui:684 -msgid "All displays follow mode" -msgstr "Tela curva" - -#: src/gtk/connected-device.ui:685 -msgid "Follow mode moves all displays, not just the focused one." -msgstr "O modo Seguir move todas as telas, e não apenas o que está focado." - -#: src/gtk/connected-device.ui:701 -msgid "Neck-saver horizontal multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:702 -msgid "Higher values require smaller horizontal head movements." -msgstr "" - -#: src/gtk/connected-device.ui:734 -msgid "Neck-saver vertical multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:735 -msgid "Higher values require smaller vertical head movements." -msgstr "" - -#: src/gtk/connected-device.ui:767 -msgid "Dead-zone threshold (degrees)" -msgstr "" - -#: src/gtk/connected-device.ui:768 -msgid "Stabilize movements below this angle." -msgstr "" - -#: src/gtk/connected-device.ui:799 -msgid "Follow mode movement tracking" -msgstr "Modo de acompanhamento do movimento" - -#: src/gtk/connected-device.ui:800 -msgid "Choose which movements should be tracked in follow mode." -msgstr "" - -#: src/gtk/connected-device.ui:815 -msgid "Horizontal" -msgstr "Horizontal" - -#: src/gtk/connected-device.ui:835 -msgid "Vertical" -msgstr "Vertical" - -#: src/gtk/connected-device.ui:855 -msgid "Tilt/roll" -msgstr "Inclinação/rolagem" - -#: src/gtk/connected-device.ui:873 -msgid "Movement look-ahead" -msgstr "Antecipação de movimento" - -#: src/gtk/connected-device.ui:874 -msgid "" -"Counteracts input lag by predicting head-tracking position ahead of render " -"time. Stick with default unless virtual display drags behind your head " -"movements, jumps ahead, or is very shaky." -msgstr "" -"Compensa o atraso de entrada prevendo a posição de rastreamento de cabeça " -"antes do tempo de renderização. Mantenha o padrão, a menos que a exibição " -"virtual tenha atrasos, avance ou seja muito instável em relação aos " -"movimentos da cabeça " - -#: src/gtk/connected-device.ui:892 -msgid "Default" -msgstr "Padrão" - -#: src/gtk/connected-device.ui:904 -msgid "Text Scaling" -msgstr "Redimensionamento de Texto" - -#: src/gtk/connected-device.ui:905 -msgid "Scaling text below 1.0 will simulate a higher resolution display" -msgstr "" -"Redimensionar o texto abaixo de 1.0 simulará uma tela de resolução mais alta" - -#: src/gtk/custom-resolution-dialog-content.ui:9 -msgid "Width" -msgstr "Largura" - -#: src/gtk/custom-resolution-dialog-content.ui:42 -msgid "Height" -msgstr "Altura" - -#: src/gtk/custom-resolution-dialog.ui:5 -msgid "Add a Custom Resolution" -msgstr "Adicionar uma Resolução Personalizada" - -#: src/gtk/custom-resolution-dialog.ui:10 -msgid "Add" -msgstr "Adicionar" - -#: src/gtk/display-distance-dialog-content.ui:35 -msgid "closer" -msgstr "mais perto" - -#: src/gtk/display-distance-dialog-content.ui:36 -msgid "default" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:37 -msgid "farther" -msgstr "mais longe" - -#: src/gtk/display-distance-dialog.ui:9 -msgid "Done" -msgstr "Feito" - -#: src/gtk/failed-verification.ui:15 -msgid "Breezy Desktop GNOME invalid setup" -msgstr "Configuração inválida do Breezy Desktop GNOME" - -#: src/gtk/failed-verification.ui:16 -msgid "" -"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup " -"script. Report this issue if it persists." -msgstr "" -"Sua configuração do Breezy GNOME é inválida ou incompleta. Por favor, " -"execute novamente o script de configuração. Relate este problema se " -"persistir." - -#: src/gtk/license-dialog-content.ui:15 -msgid "Donate" -msgstr "Doar" - -#: src/gtk/license-dialog-content.ui:31 -msgid "Request a token" -msgstr "Solicitar um token" - -#: src/gtk/license-dialog-content.ui:39 -msgid "Verify token" -msgstr "Verificar token" - -#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139 -msgid "License Details" -msgstr "Detalhes da Licença" - -#: src/gtk/no-device.ui:15 -msgid "No device connected" -msgstr "Nenhum dispositivo conectado" - -#: src/gtk/no-device.ui:16 -msgid "Breezy Desktop was unable to detect any supported XR devices." -msgstr "" -"O Breezy Desktop não conseguiu detectar nenhum dispositivo XR suportado." - -#: src/gtk/no-device.ui:25 -msgid "Auto-enable XR effect" -msgstr "Efeito XR" - -#: src/gtk/no-device.ui:26 -msgid "" -"Automatically enable the Breezy Desktop XR effect when supported glasses are " -"connected." -msgstr "" -"Ativar automaticamente o efeito Breezy Desktop XR quando os óculos " -"suportados estiverem conectados." - -#: src/gtk/no-driver.ui:15 -msgid "No driver running" -msgstr "Nenhum driver em execução" - -#: src/gtk/no-driver.ui:16 -msgid "" -"\n" -" If you installed via AUR, make sure you ran the recommended post-" -"install command:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Otherwise, please file an issue on GitHub, or create a new thread " -"in the #troubleshooting channel on Discord.\n" -" " -msgstr "" -"\n" -" Se você instalou via AUR, certifique-se de ter executado o comando de pós-" -"instalação recomendado:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Caso contrário, por favor, crie uma issue no GitHub ou um novo tópico no " -"canal #troubleshooting no Discord.\n" -" " - -#: src/gtk/no-extension.ui:15 -msgid "Breezy Desktop GNOME extension not ready" -msgstr "Extensão do Breezy Desktop GNOME não está pronta" - -#: src/gtk/no-extension.ui:16 -msgid "" -"If you have just run the setup, then you may need to log out and back in to " -"use it. Otherwise, please follow the Breezy GNOME setup instructions." -msgstr "" -"Se você acabou de executar a configuração, pode ser necessário fazer logout " -"e login novamente para usá-la. Caso contrário, siga as instruções de " -"configuração do Breezy GNOME." - -#: src/gtk/no-license.ui:15 -msgid "No license file was found" -msgstr "Nenhum arquivo de licença foi encontrado" - -#: src/gtk/no-license.ui:16 -msgid "" -"\n" -" The first time you use Breezy Desktop, an internet connection is " -"required to retrieve your device's license.\n" -" \n" -" Don't worry, there's no obligation to donate at this time. If you " -"haven't, you'll be given a trial license so you can decide if Breezy Desktop " -"fits your needs. \n" -" \n" -" Once you obtain a license, trial or otherwise, you can use Breezy " -"Desktop offline until features expire (or indefinitely, if you've chosen " -"lifetime access).\n" -" " -msgstr "" -"\n" -" A primeira vez que você usar o Breezy Desktop, uma conexão com a " -"internet será necessária para obter a licença do seu dispositivo.\n" -" \n" -" Não se preocupe, não há nenhuma obrigação de doar neste momento. " -"Se você ainda não o fez, será fornecida uma licença de teste para que você " -"possa decidir se o Breezy Desktop atende às suas necessidades.\n" -" \n" -" Uma vez que você obtenha uma licença, de teste ou não, você poderá " -"usar o Breezy Desktop offline até que os recursos expirem (ou " -"indefinidamente, se você escolheu o acesso vitalício).\n" -" " - -#: src/gtk/no-license.ui:29 -msgid "Try Again" -msgstr "Tentar Novamente" - -#: src/gtk/shortcut-dialog.ui:5 -msgid "Assign Keyboard Shortcut" -msgstr "Atribuir Atalho de Teclado" - -#: src/gtk/shortcut-dialog.ui:20 -msgid "Press your keyboard shortcut or 'Backspace' to disable..." -msgstr "Pressione seu atalho de teclado ou 'Backspace' para desativar..." - -#: src/gtk/window.ui:10 -msgid "Breezy Desktop" -msgstr "Breezy Desktop" - -#: src/gtk/window.ui:23 -msgid "Menu" -msgstr "Menu" - -#: src/gtk/window.ui:43 -msgid "Some features expire soon" -msgstr "Algumas funcionalidades expirarão em breve" - -#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102 -msgid "View details" -msgstr "Ver detalhes" - -#: src/gtk/window.ui:68 -msgid "Productivity features are disabled" -msgstr "As funcionalidades de produtividade estão desabilitadas" - -#: src/gtk/window.ui:93 -msgid "" -"Productivity Pro license is inactive — 6DoF features will be unavailable" -msgstr "" - -#: src/gtk/window.ui:119 -msgid "" -"A newer version is available. To update, rerun the breezy_gnome_setup script." -msgstr "" - -#: src/gtk/window.ui:143 -msgid "Force Reset" -msgstr "Forçar redefinição" - -#: src/gtk/window.ui:147 -msgid "About BreezyDesktop" -msgstr "Sobre o BreezyDesktop" - -#~ msgid "Side-by-side mode (gaming)" -#~ msgstr "Modo lado a lado (Jogos)" - -#~ msgid "Smooth Follow (gaming)" -#~ msgstr "Acompanhar Suavemente (Jogos)" - -#~ msgid "Breezy Desktop (productivity)" -#~ msgstr "Breezy Desktop (produtividade)" - -#~ msgid "Gaming" -#~ msgstr "Jogos" - -#~ msgid "Productivity" -#~ msgstr "Produtividade" - -#~ msgid "fullscreen" -#~ msgstr "Tela cheia" - -#~ msgid "Show full range" -#~ msgstr "Mostrar gama completa" - -#~ msgid "" -#~ "Unable to add virtual displays on this machine. Wayland and xdg-desktop-" -#~ "portal are required." -#~ msgstr "" -#~ "Não é possível adicionar telas neste dispositivo. xdg-desktop-portal é " -#~ "requerido." - -#~ msgid "" -#~ "Unable to add virtual displays on this machine. xdg-desktop-portal is " -#~ "required." -#~ msgstr "" -#~ "Não é possível adicionar telas neste dispositivo. xdg-desktop-portal é " -#~ "requerido." - -#~ msgid "Fast SBS mode switching" -#~ msgstr "Alternância rápida do modo SBS" - -#~ msgid "" -#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen " -#~ "mode is on. May cause instability." -#~ msgstr "" -#~ "Altera os óculos para o modo SBS imediatamente quando conectados, se o " -#~ "modo ultrawide estiver ativado. Pode causar instabilidade." - -#~ msgid "Set Unfocused Displays Distance" -#~ msgstr "Distância da tela" - -#~ msgid "Widescreen mode" -#~ msgstr "Modo Ultrawide" - -#~ msgid "" -#~ "Closer appears larger, further appears smaller. Controls depth when in " -#~ "widescreen mode." -#~ msgstr "" -#~ "Mais perto parece maior, mais longe parece menor. Controla a profundidade " -#~ "no modo ultrawide." - -#~ msgid "" -#~ "Combine with display distance to achieve a comfortable level of depth and " -#~ "size." -#~ msgstr "" -#~ "Combine com a distância da tela para alcançar um nível confortável de " -#~ "profundidade e tamanho." - -#~ msgid "Display toggle distances" -#~ msgstr "Alternância das distâncias de tela" - -#~ msgid "" -#~ "Use the buttons to capture the current display distance for use with the " -#~ "keyboard shortcut." -#~ msgstr "" -#~ "Use os botões para obter a distância atual da tela para depois usar com o " -#~ "atalho de teclado." - -#~ msgid "Display distance shortcut" -#~ msgstr "Atalho de distância da tela" - -#~ msgid "Quickly toggle between two predefined distances." -#~ msgstr "Alterne rapidamente entre as duas distâncias predefinidas." - -#~ msgid "Start in widescreen mode" -#~ msgstr "Modo Ultrawide" diff --git a/ui/po/ru.po b/ui/po/ru.po deleted file mode 100644 index 4f510b7..0000000 --- a/ui/po/ru.po +++ /dev/null @@ -1,837 +0,0 @@ -# Russian translations for PACKAGE package. -# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# , 2024. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-03 12:40-0800\n" -"PO-Revision-Date: 2024-08-17 09:39-0700\n" -"Last-Translator: \n" -"Language-Team: Russian \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#: src/connecteddevice.py:29 -msgid "" -"Switches your glasses into side-by-side mode and doubles the width of the " -"display." -msgstr "" -"Переключает очки в режим «сторона к стороне» и удваивает ширину дисплея." - -#: src/connecteddevice.py:30 -msgid "This feature is not currently supported for your device." -msgstr "Эта функция в настоящее время не поддерживается для вашего устройства." - -#: src/connecteddevice.py:160 -#, fuzzy -msgid "Set Focused Display Distance" -msgstr "Расстояние дисплея" - -#: src/connecteddevice.py:161 -msgid "Use a closer value so the display zooms in when you look at it." -msgstr "" - -#: src/connecteddevice.py:168 -#, fuzzy -msgid "Set All Displays Distance" -msgstr "Расстояние дисплея" - -#: src/connecteddevice.py:169 -msgid "Use a farther value so the displays are zoomed out when you look away." -msgstr "" - -#: src/connecteddevice.py:309 -msgid "" -"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, " -"and the pipewire GStreamer plugin are required." -msgstr "" - -#: src/connecteddevice.py:343 -#, fuzzy -msgid "Focused display" -msgstr "Расстояние дисплея" - -#: src/connecteddevice.py:349 -#, fuzzy -msgid "All displays" -msgstr "Изогнутый дисплей" - -#: src/licensedialogcontent.py:63 -msgid "Paid Tier Status" -msgstr "Статус платного уровня" - -#: src/licensedialogcontent.py:71 -msgid "Feature Availability" -msgstr "Статус функций" - -#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104 -#: src/gtk/connected-device.ui:786 -msgid "Disabled" -msgstr "Отключено" - -#: src/licensefeaturerow.py:18 -msgid "In trial" -msgstr "На пробном периоде" - -#: src/licensefeaturerow.py:18 -msgid "Enabled" -msgstr "Включено" - -#: src/licensefeaturerow.py:24 src/licensetierrow.py:30 -#, python-brace-format -msgid " ({time_remaining} remaining)" -msgstr " ({time_remaining} осталось)" - -#: src/licensefeaturerow.py:30 src/licensetierrow.py:56 -msgid "Productivity Basic" -msgstr "" - -#: src/licensefeaturerow.py:31 src/licensetierrow.py:57 -msgid "Productivity Pro" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Active" -msgstr "Активный" - -#: src/licensetierrow.py:24 -msgid "Inactive" -msgstr "Неактивный" - -#: src/licensetierrow.py:41 -#, python-brace-format -msgid "${amount} USD" -msgstr "${amount} USD" - -#: src/licensetierrow.py:43 -msgid " to renew" -msgstr " для обновления" - -#: src/licensetierrow.py:45 -msgid " to upgrade" -msgstr " для апгрейда" - -#: src/licensetierrow.py:47 -msgid "Paid through next renewal period" -msgstr "Оплачено до следующего периода" - -#: src/licensetierrow.py:63 -msgid " - renewing monthly" -msgstr " - ежемесячное обновление" - -#: src/licensetierrow.py:64 -msgid " - renewing yearly" -msgstr " - ежегодное обновление" - -#: src/licensetierrow.py:65 -msgid "with lifetime access" -msgstr "с пожизненным доступом" - -#: src/licensetierrow.py:72 -msgid "Monthly" -msgstr "Ежемесячно" - -#: src/licensetierrow.py:73 -msgid "Yearly" -msgstr "Ежегодно" - -#: src/licensetierrow.py:74 -msgid "Lifetime" -msgstr "Пожизненно" - -#: src/time.py:14 -msgid "less than an hour" -msgstr "менее часа" - -#: src/time.py:17 -msgid "1 hour" -msgstr "1 час" - -#: src/time.py:17 -#, python-brace-format -msgid "{time_remaining} hours" -msgstr "{time_remaining} часов" - -#: src/time.py:20 -msgid "1 day" -msgstr "1 день" - -#: src/time.py:20 -#, python-brace-format -msgid "{time_remaining} days" -msgstr "{time_remaining} дней" - -#: src/gtk/connected-device.ui:21 -msgid "connected" -msgstr "подключено" - -#: src/gtk/connected-device.ui:31 -msgid "General Settings" -msgstr "Общие настройки" - -#: src/gtk/connected-device.ui:41 -msgid "Features" -msgstr "Функции" - -#: src/gtk/connected-device.ui:45 -msgid "XR effect" -msgstr "Эффект XR" - -#: src/gtk/connected-device.ui:46 -msgid "Enables the Breezy Desktop XR effect." -msgstr "Включает эффект Breezy Desktop XR." - -#: src/gtk/connected-device.ui:56 -msgid "Zoom on focus" -msgstr "" - -#: src/gtk/connected-device.ui:57 -msgid "" -"Automatically move a display closer when you look at it.\n" -"Set your preferred focused and unfocused distances in the Adjustments " -"section.\n" -" " -msgstr "" - -#: src/gtk/connected-device.ui:70 -msgid "Follow mode" -msgstr "Режим следования" - -#: src/gtk/connected-device.ui:71 -#, fuzzy -msgid "Keep the focused display near the center of your view." -msgstr "Поддерживает виртуальный дисплей вблизи центра вашего зрения." - -#: src/gtk/connected-device.ui:81 -msgid "Curved display" -msgstr "Изогнутый дисплей" - -#: src/gtk/connected-device.ui:82 -msgid "Switch between flat and curved displays." -msgstr "Переключается между плоскими и изогнутыми дисплеями." - -#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36 -msgid "Disable physical displays" -msgstr "" - -#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37 -msgid "" -"Automatically disable all physical displays when the XR effect is enabled." -msgstr "" - -#: src/gtk/connected-device.ui:104 -#, fuzzy -msgid "Virtual displays" -msgstr "Изогнутый дисплей" - -#: src/gtk/connected-device.ui:120 -msgid "1080p" -msgstr "" - -#: src/gtk/connected-device.ui:121 -msgid "1440p" -msgstr "" - -#: src/gtk/connected-device.ui:122 -msgid "Add custom" -msgstr "" - -#: src/gtk/connected-device.ui:136 -msgid "Remove custom resolution" -msgstr "" - -#: src/gtk/connected-device.ui:156 -#, fuzzy -msgid "Rearrange displays" -msgstr "Изогнутый дисплей" - -#: src/gtk/connected-device.ui:174 -msgid "Adjustments" -msgstr "Настройки" - -#: src/gtk/connected-device.ui:178 -#, fuzzy -msgid "Display distances" -msgstr "Расстояние дисплея" - -#: src/gtk/connected-device.ui:179 -msgid "Set how close you want displays to appear." -msgstr "" - -#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221 -#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472 -#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530 -#: src/gtk/connected-device.ui:559 -msgid "Change" -msgstr "Изменить" - -#: src/gtk/connected-device.ui:234 -msgid "Display size" -msgstr "" - -#: src/gtk/connected-device.ui:235 -msgid "Set how large you want the display to appear." -msgstr "" - -#: src/gtk/connected-device.ui:254 -msgid "full" -msgstr "" - -#: src/gtk/connected-device.ui:264 -msgid "Follow threshold" -msgstr "Порог следования" - -#: src/gtk/connected-device.ui:265 -msgid "How far away you can look before the display follows." -msgstr "" -"Как далеко вы можете отвернуть взгляд, прежде чем дисплей последует за вами." - -#: src/gtk/connected-device.ui:288 -#, fuzzy -msgid "Display angling" -msgstr "Размер дисплея" - -#: src/gtk/connected-device.ui:289 -msgid "" -"When there are multiple displays, choose how they should angle towards you." -msgstr "" - -#: src/gtk/connected-device.ui:303 -msgid "Automatic" -msgstr "" - -#: src/gtk/connected-device.ui:304 -msgid "Side-angled" -msgstr "" - -#: src/gtk/connected-device.ui:305 -msgid "Top-angled" -msgstr "" - -#: src/gtk/connected-device.ui:306 -msgid "Flat" -msgstr "" - -#: src/gtk/connected-device.ui:316 -#, fuzzy -msgid "Display spacing" -msgstr "Размер дисплея" - -#: src/gtk/connected-device.ui:317 -msgid "Put empty space between displays, when there are multiple." -msgstr "" - -#: src/gtk/connected-device.ui:347 -msgid "Viewport horizontal offset" -msgstr "" - -#: src/gtk/connected-device.ui:348 -msgid "Move the viewport to the left or right of its default position." -msgstr "" - -#: src/gtk/connected-device.ui:365 -msgid "left" -msgstr "" - -#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397 -msgid "center" -msgstr "" - -#: src/gtk/connected-device.ui:369 -msgid "right" -msgstr "" - -#: src/gtk/connected-device.ui:377 -msgid "Viewport vertical offset" -msgstr "" - -#: src/gtk/connected-device.ui:378 -msgid "Move the viewport up or down from its default position." -msgstr "" - -#: src/gtk/connected-device.ui:395 -msgid "down" -msgstr "" - -#: src/gtk/connected-device.ui:399 -msgid "up" -msgstr "" - -#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420 -msgid "Keyboard Shortcuts" -msgstr "Сочетания клавиш" - -#: src/gtk/connected-device.ui:423 -msgid "XR Effect on/off shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:424 -msgid "" -"Quickly enable or disable the XR Effect. You may need to enable the effect " -"manually once in order to enable the shortcut." -msgstr "" - -#: src/gtk/connected-device.ui:452 -msgid "Re-center display shortcut" -msgstr "Сочетание клавиш для перецентровки дисплея" - -#: src/gtk/connected-device.ui:453 -msgid "Pin the virtual display to the current position." -msgstr "Фиксировать виртуальный дисплей в текущем положении." - -#: src/gtk/connected-device.ui:481 -#, fuzzy -msgid "Toggle zoom on focus shortcut" -msgstr "Сочетание клавиш для переключения режима следования" - -#: src/gtk/connected-device.ui:482 -#, fuzzy -msgid "Quickly toggle zoom on focus mode." -msgstr "Быстро переключать режим следования." - -#: src/gtk/connected-device.ui:510 -msgid "Toggle follow mode shortcut" -msgstr "Сочетание клавиш для переключения режима следования" - -#: src/gtk/connected-device.ui:511 -msgid "Quickly toggle follow mode." -msgstr "Быстро переключать режим следования." - -#: src/gtk/connected-device.ui:539 -msgid "Summon mouse cursor shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:540 -msgid "Bring the mouse cursor to the center of the focused display." -msgstr "" - -#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585 -msgid "Advanced Settings" -msgstr "Дополнительные настройки" - -#: src/gtk/connected-device.ui:589 -msgid "Units" -msgstr "" - -#: src/gtk/connected-device.ui:590 -msgid "Choose measurement units for size and distance displays." -msgstr "" - -#: src/gtk/connected-device.ui:605 -msgid "Centimeters" -msgstr "" - -#: src/gtk/connected-device.ui:606 -msgid "Inches" -msgstr "" - -#: src/gtk/connected-device.ui:618 -msgid "Find optimal display config" -msgstr "Найти оптимальную конфигурацию дисплея" - -#: src/gtk/connected-device.ui:619 -msgid "" -"Automatically modify the glasses display configuration for maximum " -"resolution and best scaling when plugged in." -msgstr "" -"Автоматически изменять конфигурацию дисплея очков для максимального " -"разрешения и лучшей масштабирования при подключении." - -#: src/gtk/connected-device.ui:629 -msgid "Use highest refresh rate" -msgstr "Использовать высшую частоту обновления" - -#: src/gtk/connected-device.ui:630 -msgid "Refresh rate may affect performance, disable this to set it manually." -msgstr "" -"Частота обновления может повлиять на производительность, отключите это, " -"чтобы установить ее вручную." - -#: src/gtk/connected-device.ui:640 -msgid "Center on glasses' display" -msgstr "" - -#: src/gtk/connected-device.ui:641 -msgid "" -"Center the viewport on the glasses' display, even if the display is not in " -"the middle." -msgstr "" - -#: src/gtk/connected-device.ui:651 -msgid "Always primary display" -msgstr "Всегда основной дисплей" - -#: src/gtk/connected-device.ui:652 -msgid "Automatically set the glasses as the primary display when plugged in." -msgstr "" -"Автоматически устанавливать очки в качестве основного дисплея при " -"подключении." - -#: src/gtk/connected-device.ui:662 -#, fuzzy -msgid "Remove virtual displays on disable" -msgstr "Изогнутый дисплей" - -#: src/gtk/connected-device.ui:663 -msgid "Automatically remove virtual displays when the XR effect is disabled." -msgstr "" - -#: src/gtk/connected-device.ui:673 -msgid "Enable multi-tap detection" -msgstr "" - -#: src/gtk/connected-device.ui:674 -msgid "Enables double-tap to recenter and triple-tap to recalibrate." -msgstr "" - -#: src/gtk/connected-device.ui:684 -#, fuzzy -msgid "All displays follow mode" -msgstr "Изогнутый дисплей" - -#: src/gtk/connected-device.ui:685 -msgid "Follow mode moves all displays, not just the focused one." -msgstr "" - -#: src/gtk/connected-device.ui:701 -msgid "Neck-saver horizontal multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:702 -msgid "Higher values require smaller horizontal head movements." -msgstr "" - -#: src/gtk/connected-device.ui:734 -msgid "Neck-saver vertical multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:735 -msgid "Higher values require smaller vertical head movements." -msgstr "" - -#: src/gtk/connected-device.ui:767 -msgid "Dead-zone threshold (degrees)" -msgstr "" - -#: src/gtk/connected-device.ui:768 -msgid "Stabilize movements below this angle." -msgstr "" - -#: src/gtk/connected-device.ui:799 -msgid "Follow mode movement tracking" -msgstr "" - -#: src/gtk/connected-device.ui:800 -msgid "Choose which movements should be tracked in follow mode." -msgstr "" - -#: src/gtk/connected-device.ui:815 -msgid "Horizontal" -msgstr "" - -#: src/gtk/connected-device.ui:835 -msgid "Vertical" -msgstr "" - -#: src/gtk/connected-device.ui:855 -msgid "Tilt/roll" -msgstr "" - -#: src/gtk/connected-device.ui:873 -msgid "Movement look-ahead" -msgstr "Прогнозирование движения" - -#: src/gtk/connected-device.ui:874 -msgid "" -"Counteracts input lag by predicting head-tracking position ahead of render " -"time. Stick with default unless virtual display drags behind your head " -"movements, jumps ahead, or is very shaky." -msgstr "" -"Компенсирует задержку ввода, прогнозируя положение отслеживания головы до " -"времени рендеринга. Оставайтесь на уровне по умолчанию, если только " -"виртуальный дисплей не отстает от движений вашей головы, не опережает или не " -"очень трясётся." - -#: src/gtk/connected-device.ui:892 -msgid "Default" -msgstr "По умолчанию" - -#: src/gtk/connected-device.ui:904 -msgid "Text Scaling" -msgstr "" - -#: src/gtk/connected-device.ui:905 -msgid "Scaling text below 1.0 will simulate a higher resolution display" -msgstr "" - -#: src/gtk/custom-resolution-dialog-content.ui:9 -msgid "Width" -msgstr "" - -#: src/gtk/custom-resolution-dialog-content.ui:42 -msgid "Height" -msgstr "" - -#: src/gtk/custom-resolution-dialog.ui:5 -msgid "Add a Custom Resolution" -msgstr "" - -#: src/gtk/custom-resolution-dialog.ui:10 -msgid "Add" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:35 -msgid "closer" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:36 -msgid "default" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:37 -msgid "farther" -msgstr "" - -#: src/gtk/display-distance-dialog.ui:9 -msgid "Done" -msgstr "" - -#: src/gtk/failed-verification.ui:15 -msgid "Breezy Desktop GNOME invalid setup" -msgstr "Недействительная настройка Breezy Desktop GNOME" - -#: src/gtk/failed-verification.ui:16 -msgid "" -"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup " -"script. Report this issue if it persists." -msgstr "" -"Ваша настройка Breezy GNOME недействительна или неполна. Пожалуйста, " -"перезапустите скрипт настройки. Сообщите об этой проблеме, если она " -"сохраняется." - -#: src/gtk/license-dialog-content.ui:15 -msgid "Donate" -msgstr "Донатить" - -#: src/gtk/license-dialog-content.ui:31 -msgid "Request a token" -msgstr "Запросить токен" - -#: src/gtk/license-dialog-content.ui:39 -msgid "Verify token" -msgstr "Проверить токен" - -#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139 -msgid "License Details" -msgstr "Подробности лицензии" - -#: src/gtk/no-device.ui:15 -msgid "No device connected" -msgstr "Устройство не подключено" - -#: src/gtk/no-device.ui:16 -msgid "Breezy Desktop was unable to detect any supported XR devices." -msgstr "Breezy Desktop не смог обнаружить никаких поддерживаемых устройств XR." - -#: src/gtk/no-device.ui:25 -#, fuzzy -msgid "Auto-enable XR effect" -msgstr "Эффект XR" - -#: src/gtk/no-device.ui:26 -msgid "" -"Automatically enable the Breezy Desktop XR effect when supported glasses are " -"connected." -msgstr "" - -#: src/gtk/no-driver.ui:15 -msgid "No driver running" -msgstr "Драйвер не запущен" - -#: src/gtk/no-driver.ui:16 -msgid "" -"\n" -" If you installed via AUR, make sure you ran the recommended post-" -"install command:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Otherwise, please file an issue on GitHub, or create a new thread " -"in the #troubleshooting channel on Discord.\n" -" " -msgstr "" -"\n" -" Если вы установили через AUR, убедитесь, что вы запустили " -"рекомендуемую команду пост-установки:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" В противном случае, пожалуйста, создайте запрос на GitHub или " -"новый тред в канале #troubleshooting на Discord.\n" -" " - -#: src/gtk/no-extension.ui:15 -msgid "Breezy Desktop GNOME extension not ready" -msgstr "Расширение Breezy Desktop GNOME не готово" - -#: src/gtk/no-extension.ui:16 -msgid "" -"If you have just run the setup, then you may need to log out and back in to " -"use it. Otherwise, please follow the Breezy GNOME setup instructions." -msgstr "" -"Если вы только что запустили настройку, вам может потребоваться выйти и " -"снова войти, чтобы использовать её. В противном случае, пожалуйста, следуйте " -"инструкциям по настройке Breezy GNOME." - -#: src/gtk/no-license.ui:15 -msgid "No license file was found" -msgstr "Файл лицензии не найден" - -#: src/gtk/no-license.ui:16 -msgid "" -"\n" -" The first time you use Breezy Desktop, an internet connection is " -"required to retrieve your device's license.\n" -" \n" -" Don't worry, there's no obligation to donate at this time. If you " -"haven't, you'll be given a trial license so you can decide if Breezy Desktop " -"fits your needs. \n" -" \n" -" Once you obtain a license, trial or otherwise, you can use Breezy " -"Desktop offline until features expire (or indefinitely, if you've chosen " -"lifetime access).\n" -" " -msgstr "" -"\n" -" При первом использовании Breezy Desktop требуется интернет-" -"соединение для получения лицензии вашего устройства.\n" -" \n" -" Не волнуйтесь, на данный момент нет обязательства донатить. Если " -"вы не сделали этого, вам будет предоставлена пробная лицензия, чтобы вы " -"могли решить, подходит ли вам Breezy Desktop.\n" -" \n" -" После получения лицензии, пробной или иной, вы можете использовать " -"Breezy Desktop офлайн до истечения срока действия функций (или бессрочно, " -"если вы выбрали пожизненный доступ).\n" -" " - -#: src/gtk/no-license.ui:29 -msgid "Try Again" -msgstr "Попробовать еще раз" - -#: src/gtk/shortcut-dialog.ui:5 -msgid "Assign Keyboard Shortcut" -msgstr "Назначить сочетание клавиш" - -#: src/gtk/shortcut-dialog.ui:20 -msgid "Press your keyboard shortcut or 'Backspace' to disable..." -msgstr "Нажмите на свое сочетание клавиш или 'Backspace', чтобы отключить..." - -#: src/gtk/window.ui:10 -msgid "Breezy Desktop" -msgstr "Breezy Desktop" - -#: src/gtk/window.ui:23 -msgid "Menu" -msgstr "Меню" - -#: src/gtk/window.ui:43 -msgid "Some features expire soon" -msgstr "Некоторые функции скоро истекут" - -#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102 -msgid "View details" -msgstr "Просмотреть детали" - -#: src/gtk/window.ui:68 -msgid "Productivity features are disabled" -msgstr "Функции повышения производительности отключены" - -#: src/gtk/window.ui:93 -msgid "" -"Productivity Pro license is inactive — 6DoF features will be unavailable" -msgstr "" - -#: src/gtk/window.ui:119 -msgid "" -"A newer version is available. To update, rerun the breezy_gnome_setup script." -msgstr "" - -#: src/gtk/window.ui:143 -msgid "Force Reset" -msgstr "Сброс" - -#: src/gtk/window.ui:147 -msgid "About BreezyDesktop" -msgstr "О BreezyDesktop" - -#~ msgid "Side-by-side mode (gaming)" -#~ msgstr "Режим «бок о бок» (игровой режим)" - -#~ msgid "Smooth Follow (gaming)" -#~ msgstr "Плавное следование (игровой режим)" - -#~ msgid "Breezy Desktop (productivity)" -#~ msgstr "Breezy Desktop (продуктивный режим)" - -#~ msgid "Gaming" -#~ msgstr "Игровой режим" - -#~ msgid "Productivity" -#~ msgstr "Продуктивный режим" - -#~ msgid "Fast SBS mode switching" -#~ msgstr "Быстрое переключение режима SBS" - -#~ msgid "" -#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen " -#~ "mode is on. May cause instability." -#~ msgstr "" -#~ "Переключает очки в режим SBS сразу при подключении, если режим широкого " -#~ "экрана включен. Может вызвать нестабильность." - -#, fuzzy -#~ msgid "Set Unfocused Displays Distance" -#~ msgstr "Расстояние дисплея" - -#~ msgid "Widescreen mode" -#~ msgstr "Режим широкого экрана" - -#~ msgid "" -#~ "Closer appears larger, further appears smaller. Controls depth when in " -#~ "widescreen mode." -#~ msgstr "" -#~ "Чем ближе, тем больше. Чем дальше, тем меньше. Управляет глубиной при " -#~ "использовании режима широкого экрана." - -#~ msgid "" -#~ "Combine with display distance to achieve a comfortable level of depth and " -#~ "size." -#~ msgstr "" -#~ "Комбинируйте с расстоянием дисплея, чтобы достичь комфортного уровня " -#~ "глубины и размера." - -#~ msgid "Display toggle distances" -#~ msgstr "Переключения расстояние дисплея" - -#~ msgid "" -#~ "Use the buttons to capture the current display distance for use with the " -#~ "keyboard shortcut." -#~ msgstr "" -#~ "Используйте кнопки, чтобы зафиксировать текущее расстояние дисплея для " -#~ "использования с сочетанием клавиш." - -#~ msgid "Display distance shortcut" -#~ msgstr "Сочетание клавиш для расстояния дисплея" - -#~ msgid "Quickly toggle between two predefined distances." -#~ msgstr "Быстро переключаться между двумя предопределенными расстояниями." - -#, fuzzy -#~ msgid "Start in widescreen mode" -#~ msgstr "Режим широкого экрана" diff --git a/ui/po/sv.po b/ui/po/sv.po deleted file mode 100644 index 3399e13..0000000 --- a/ui/po/sv.po +++ /dev/null @@ -1,836 +0,0 @@ -# Swedish translations for PACKAGE package. -# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# , 2024. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-03 12:40-0800\n" -"PO-Revision-Date: 2024-08-16 10:31-0700\n" -"Last-Translator: \n" -"Language-Team: Swedish \n" -"Language: sv\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: src/connecteddevice.py:29 -msgid "" -"Switches your glasses into side-by-side mode and doubles the width of the " -"display." -msgstr "" -"Växlar dina glasögon till side-by-side-läget och dubblerar bredden på " -"visningen." - -#: src/connecteddevice.py:30 -msgid "This feature is not currently supported for your device." -msgstr "Din enhet stöder inte den här funktionen för tillfället." - -#: src/connecteddevice.py:160 -#, fuzzy -msgid "Set Focused Display Distance" -msgstr "Avstånd till skärmen" - -#: src/connecteddevice.py:161 -msgid "Use a closer value so the display zooms in when you look at it." -msgstr "" - -#: src/connecteddevice.py:168 -#, fuzzy -msgid "Set All Displays Distance" -msgstr "Avstånd till skärmen" - -#: src/connecteddevice.py:169 -msgid "Use a farther value so the displays are zoomed out when you look away." -msgstr "" - -#: src/connecteddevice.py:309 -msgid "" -"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, " -"and the pipewire GStreamer plugin are required." -msgstr "" - -#: src/connecteddevice.py:343 -#, fuzzy -msgid "Focused display" -msgstr "Avstånd till skärmen" - -#: src/connecteddevice.py:349 -#, fuzzy -msgid "All displays" -msgstr "Böjd skärm" - -#: src/licensedialogcontent.py:63 -msgid "Paid Tier Status" -msgstr "Betalningsstatus" - -#: src/licensedialogcontent.py:71 -msgid "Feature Availability" -msgstr "Funktions tillgänglighet" - -#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104 -#: src/gtk/connected-device.ui:786 -msgid "Disabled" -msgstr "Inaktiverad" - -#: src/licensefeaturerow.py:18 -msgid "In trial" -msgstr "Provperiod pågår" - -#: src/licensefeaturerow.py:18 -msgid "Enabled" -msgstr "Aktiverad" - -#: src/licensefeaturerow.py:24 src/licensetierrow.py:30 -#, python-brace-format -msgid " ({time_remaining} remaining)" -msgstr " ({time_remaining} kvar)" - -#: src/licensefeaturerow.py:30 src/licensetierrow.py:56 -msgid "Productivity Basic" -msgstr "" - -#: src/licensefeaturerow.py:31 src/licensetierrow.py:57 -msgid "Productivity Pro" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Active" -msgstr "Aktiv" - -#: src/licensetierrow.py:24 -msgid "Inactive" -msgstr "Inaktiv" - -#: src/licensetierrow.py:41 -#, python-brace-format -msgid "${amount} USD" -msgstr "${amount} USD" - -#: src/licensetierrow.py:43 -msgid " to renew" -msgstr " att förnya" - -#: src/licensetierrow.py:45 -msgid " to upgrade" -msgstr " att uppgradera" - -#: src/licensetierrow.py:47 -msgid "Paid through next renewal period" -msgstr "Betald genom nästa förnyelseperiod" - -#: src/licensetierrow.py:63 -msgid " - renewing monthly" -msgstr " - förnyar månadsvis" - -#: src/licensetierrow.py:64 -msgid " - renewing yearly" -msgstr " - förnyar årligen" - -#: src/licensetierrow.py:65 -msgid "with lifetime access" -msgstr "med livstidsåtkomst" - -#: src/licensetierrow.py:72 -msgid "Monthly" -msgstr "Månatlig" - -#: src/licensetierrow.py:73 -msgid "Yearly" -msgstr "Årlig" - -#: src/licensetierrow.py:74 -msgid "Lifetime" -msgstr "Livstid" - -#: src/time.py:14 -msgid "less than an hour" -msgstr "mindre än en timme" - -#: src/time.py:17 -msgid "1 hour" -msgstr "1 timme" - -#: src/time.py:17 -#, python-brace-format -msgid "{time_remaining} hours" -msgstr "{time_remaining} timmar" - -#: src/time.py:20 -msgid "1 day" -msgstr "1 dag" - -#: src/time.py:20 -#, python-brace-format -msgid "{time_remaining} days" -msgstr "{time_remaining} dagar" - -#: src/gtk/connected-device.ui:21 -msgid "connected" -msgstr "ansluten" - -#: src/gtk/connected-device.ui:31 -msgid "General Settings" -msgstr "Allmänna inställningar" - -#: src/gtk/connected-device.ui:41 -msgid "Features" -msgstr "Funktioner" - -#: src/gtk/connected-device.ui:45 -msgid "XR effect" -msgstr "XR-effekt" - -#: src/gtk/connected-device.ui:46 -msgid "Enables the Breezy Desktop XR effect." -msgstr "Aktiverar Breezy Desktop XR-effekten." - -#: src/gtk/connected-device.ui:56 -msgid "Zoom on focus" -msgstr "" - -#: src/gtk/connected-device.ui:57 -msgid "" -"Automatically move a display closer when you look at it.\n" -"Set your preferred focused and unfocused distances in the Adjustments " -"section.\n" -" " -msgstr "" - -#: src/gtk/connected-device.ui:70 -msgid "Follow mode" -msgstr "Följningsläge" - -#: src/gtk/connected-device.ui:71 -#, fuzzy -msgid "Keep the focused display near the center of your view." -msgstr "Håll den virtuella skärmen nära mitten av din syn." - -#: src/gtk/connected-device.ui:81 -msgid "Curved display" -msgstr "Böjd skärm" - -#: src/gtk/connected-device.ui:82 -msgid "Switch between flat and curved displays." -msgstr "Växla mellan platt eller böjd skärm." - -#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36 -msgid "Disable physical displays" -msgstr "" - -#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37 -msgid "" -"Automatically disable all physical displays when the XR effect is enabled." -msgstr "" - -#: src/gtk/connected-device.ui:104 -#, fuzzy -msgid "Virtual displays" -msgstr "Böjd skärm" - -#: src/gtk/connected-device.ui:120 -msgid "1080p" -msgstr "" - -#: src/gtk/connected-device.ui:121 -msgid "1440p" -msgstr "" - -#: src/gtk/connected-device.ui:122 -msgid "Add custom" -msgstr "" - -#: src/gtk/connected-device.ui:136 -msgid "Remove custom resolution" -msgstr "" - -#: src/gtk/connected-device.ui:156 -#, fuzzy -msgid "Rearrange displays" -msgstr "Böjd skärm" - -#: src/gtk/connected-device.ui:174 -msgid "Adjustments" -msgstr "Justeringar" - -#: src/gtk/connected-device.ui:178 -#, fuzzy -msgid "Display distances" -msgstr "Avstånd till skärmen" - -#: src/gtk/connected-device.ui:179 -msgid "Set how close you want displays to appear." -msgstr "" - -#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221 -#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472 -#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530 -#: src/gtk/connected-device.ui:559 -msgid "Change" -msgstr "Ändra" - -#: src/gtk/connected-device.ui:234 -msgid "Display size" -msgstr "" - -#: src/gtk/connected-device.ui:235 -msgid "Set how large you want the display to appear." -msgstr "" - -#: src/gtk/connected-device.ui:254 -msgid "full" -msgstr "" - -#: src/gtk/connected-device.ui:264 -msgid "Follow threshold" -msgstr "Automatisk följtröskel" - -#: src/gtk/connected-device.ui:265 -msgid "How far away you can look before the display follows." -msgstr "Huvudrörelsetröskel för automatisk efterföljning." - -#: src/gtk/connected-device.ui:288 -#, fuzzy -msgid "Display angling" -msgstr "Skärmens storlek" - -#: src/gtk/connected-device.ui:289 -msgid "" -"When there are multiple displays, choose how they should angle towards you." -msgstr "" - -#: src/gtk/connected-device.ui:303 -msgid "Automatic" -msgstr "" - -#: src/gtk/connected-device.ui:304 -msgid "Side-angled" -msgstr "" - -#: src/gtk/connected-device.ui:305 -msgid "Top-angled" -msgstr "" - -#: src/gtk/connected-device.ui:306 -msgid "Flat" -msgstr "" - -#: src/gtk/connected-device.ui:316 -#, fuzzy -msgid "Display spacing" -msgstr "Skärmens storlek" - -#: src/gtk/connected-device.ui:317 -msgid "Put empty space between displays, when there are multiple." -msgstr "" - -#: src/gtk/connected-device.ui:347 -msgid "Viewport horizontal offset" -msgstr "" - -#: src/gtk/connected-device.ui:348 -msgid "Move the viewport to the left or right of its default position." -msgstr "" - -#: src/gtk/connected-device.ui:365 -msgid "left" -msgstr "" - -#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397 -msgid "center" -msgstr "" - -#: src/gtk/connected-device.ui:369 -msgid "right" -msgstr "" - -#: src/gtk/connected-device.ui:377 -msgid "Viewport vertical offset" -msgstr "" - -#: src/gtk/connected-device.ui:378 -msgid "Move the viewport up or down from its default position." -msgstr "" - -#: src/gtk/connected-device.ui:395 -msgid "down" -msgstr "" - -#: src/gtk/connected-device.ui:399 -msgid "up" -msgstr "" - -#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420 -msgid "Keyboard Shortcuts" -msgstr "Tangentbordsgenvägar" - -#: src/gtk/connected-device.ui:423 -msgid "XR Effect on/off shortcut" -msgstr "XR-Effekt genväg på/av" - -#: src/gtk/connected-device.ui:424 -msgid "" -"Quickly enable or disable the XR Effect. You may need to enable the effect " -"manually once in order to enable the shortcut." -msgstr "" -"Skifta snabbt mellan att slå av eller på XR-Effekt. Du kan behöva slå på den " -"manuellt en gång för att genvägen ska fungera." - -#: src/gtk/connected-device.ui:452 -msgid "Re-center display shortcut" -msgstr "Om-centrering tangentbordsgenväg" - -#: src/gtk/connected-device.ui:453 -msgid "Pin the virtual display to the current position." -msgstr "Fäst den virtuella skärmen i den nuvarande positionen." - -#: src/gtk/connected-device.ui:481 -#, fuzzy -msgid "Toggle zoom on focus shortcut" -msgstr "Växla följ läge kort" - -#: src/gtk/connected-device.ui:482 -#, fuzzy -msgid "Quickly toggle zoom on focus mode." -msgstr "Växla snabbt följ läge." - -#: src/gtk/connected-device.ui:510 -msgid "Toggle follow mode shortcut" -msgstr "Växla följ läge kort" - -#: src/gtk/connected-device.ui:511 -msgid "Quickly toggle follow mode." -msgstr "Växla snabbt följ läge." - -#: src/gtk/connected-device.ui:539 -msgid "Summon mouse cursor shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:540 -msgid "Bring the mouse cursor to the center of the focused display." -msgstr "" - -#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585 -msgid "Advanced Settings" -msgstr "Avancerade inställningar" - -#: src/gtk/connected-device.ui:589 -msgid "Units" -msgstr "" - -#: src/gtk/connected-device.ui:590 -msgid "Choose measurement units for size and distance displays." -msgstr "" - -#: src/gtk/connected-device.ui:605 -msgid "Centimeters" -msgstr "" - -#: src/gtk/connected-device.ui:606 -msgid "Inches" -msgstr "" - -#: src/gtk/connected-device.ui:618 -msgid "Find optimal display config" -msgstr "Hitta optimal konfiguration till skärmen" - -#: src/gtk/connected-device.ui:619 -msgid "" -"Automatically modify the glasses display configuration for maximum " -"resolution and best scaling when plugged in." -msgstr "" -"Ändrar automatisk glasögonens skärmkonfiguration för maximal upplösning och " -"bästa skälning när den är ansluten." - -#: src/gtk/connected-device.ui:629 -msgid "Use highest refresh rate" -msgstr "Använd högsta uppdateringsfrekvens" - -#: src/gtk/connected-device.ui:630 -msgid "Refresh rate may affect performance, disable this to set it manually." -msgstr "" -"Uppdateringsfrekvens kan påverka prestanda, inaktivera detta för att ställa " -"in det manuellt." - -#: src/gtk/connected-device.ui:640 -msgid "Center on glasses' display" -msgstr "" - -#: src/gtk/connected-device.ui:641 -msgid "" -"Center the viewport on the glasses' display, even if the display is not in " -"the middle." -msgstr "" - -#: src/gtk/connected-device.ui:651 -msgid "Always primary display" -msgstr "Alltid primär skärm" - -#: src/gtk/connected-device.ui:652 -msgid "Automatically set the glasses as the primary display when plugged in." -msgstr "Ställer automatisk glasögon som primär skärm när den är ansluten." - -#: src/gtk/connected-device.ui:662 -#, fuzzy -msgid "Remove virtual displays on disable" -msgstr "Böjd skärm" - -#: src/gtk/connected-device.ui:663 -msgid "Automatically remove virtual displays when the XR effect is disabled." -msgstr "" - -#: src/gtk/connected-device.ui:673 -msgid "Enable multi-tap detection" -msgstr "" - -#: src/gtk/connected-device.ui:674 -msgid "Enables double-tap to recenter and triple-tap to recalibrate." -msgstr "" - -#: src/gtk/connected-device.ui:684 -#, fuzzy -msgid "All displays follow mode" -msgstr "Böjd skärm" - -#: src/gtk/connected-device.ui:685 -msgid "Follow mode moves all displays, not just the focused one." -msgstr "" - -#: src/gtk/connected-device.ui:701 -msgid "Neck-saver horizontal multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:702 -msgid "Higher values require smaller horizontal head movements." -msgstr "" - -#: src/gtk/connected-device.ui:734 -msgid "Neck-saver vertical multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:735 -msgid "Higher values require smaller vertical head movements." -msgstr "" - -#: src/gtk/connected-device.ui:767 -msgid "Dead-zone threshold (degrees)" -msgstr "" - -#: src/gtk/connected-device.ui:768 -msgid "Stabilize movements below this angle." -msgstr "" - -#: src/gtk/connected-device.ui:799 -msgid "Follow mode movement tracking" -msgstr "" - -#: src/gtk/connected-device.ui:800 -msgid "Choose which movements should be tracked in follow mode." -msgstr "" - -#: src/gtk/connected-device.ui:815 -msgid "Horizontal" -msgstr "" - -#: src/gtk/connected-device.ui:835 -msgid "Vertical" -msgstr "" - -#: src/gtk/connected-device.ui:855 -msgid "Tilt/roll" -msgstr "" - -#: src/gtk/connected-device.ui:873 -msgid "Movement look-ahead" -msgstr "Rörs förväntning" - -#: src/gtk/connected-device.ui:874 -msgid "" -"Counteracts input lag by predicting head-tracking position ahead of render " -"time. Stick with default unless virtual display drags behind your head " -"movements, jumps ahead, or is very shaky." -msgstr "" -"Motverkar ingångsfördröjning genom förutsägelse av huvudrörelser.Behåll " -"standardinställningen om inte skärmen skakar mycket eller rörsig konstigt." - -#: src/gtk/connected-device.ui:892 -msgid "Default" -msgstr "Standard" - -#: src/gtk/connected-device.ui:904 -msgid "Text Scaling" -msgstr "Textskalning" - -#: src/gtk/connected-device.ui:905 -msgid "Scaling text below 1.0 will simulate a higher resolution display" -msgstr "Textskalning under 1.0 kommer att simulera en högre skärmupplösning" - -#: src/gtk/custom-resolution-dialog-content.ui:9 -msgid "Width" -msgstr "" - -#: src/gtk/custom-resolution-dialog-content.ui:42 -msgid "Height" -msgstr "" - -#: src/gtk/custom-resolution-dialog.ui:5 -msgid "Add a Custom Resolution" -msgstr "" - -#: src/gtk/custom-resolution-dialog.ui:10 -msgid "Add" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:35 -msgid "closer" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:36 -msgid "default" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:37 -msgid "farther" -msgstr "" - -#: src/gtk/display-distance-dialog.ui:9 -msgid "Done" -msgstr "" - -#: src/gtk/failed-verification.ui:15 -msgid "Breezy Desktop GNOME invalid setup" -msgstr "Breezy Desktop GNOME ogiltig inställning" - -#: src/gtk/failed-verification.ui:16 -msgid "" -"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup " -"script. Report this issue if it persists." -msgstr "" -"Din Breezy GNOME inställning är ogiltig eller ofullständig. Var god kör " -"inställning skriptet igen. Rapportera detta problem om det fortsätter." - -#: src/gtk/license-dialog-content.ui:15 -msgid "Donate" -msgstr "Donera" - -#: src/gtk/license-dialog-content.ui:31 -msgid "Request a token" -msgstr "Begär en token" - -#: src/gtk/license-dialog-content.ui:39 -msgid "Verify token" -msgstr "Verifiera token" - -#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139 -msgid "License Details" -msgstr "Licensdetaljer" - -#: src/gtk/no-device.ui:15 -msgid "No device connected" -msgstr "Inget enhet ansluten" - -#: src/gtk/no-device.ui:16 -msgid "Breezy Desktop was unable to detect any supported XR devices." -msgstr "Breezy Desktop kunde inte upptäcka enheter som stöder XR." - -#: src/gtk/no-device.ui:25 -msgid "Auto-enable XR effect" -msgstr "Autoaktivering av XR-effekt" - -#: src/gtk/no-device.ui:26 -msgid "" -"Automatically enable the Breezy Desktop XR effect when supported glasses are " -"connected." -msgstr "" -"Aktivera Breezy Desktop XR-effekten automatiskt när glasögon som stöds är " -"anslutna." - -#: src/gtk/no-driver.ui:15 -msgid "No driver running" -msgstr "Inget drivrutin köres" - -#: src/gtk/no-driver.ui:16 -msgid "" -"\n" -" If you installed via AUR, make sure you ran the recommended post-" -"install command:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Otherwise, please file an issue on GitHub, or create a new thread " -"in the #troubleshooting channel on Discord.\n" -" " -msgstr "" -"\n" -" Om du har installerat via AUR, kontrollerar du att du körde den " -"rekommenderade post-install kommandot:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Annars, var god att filer ett problem på GitHub, eller skapa en ny " -"tråd i #troubleshooting kanal på Discord.\n" -" " - -#: src/gtk/no-extension.ui:15 -msgid "Breezy Desktop GNOME extension not ready" -msgstr "Breezy Desktop GNOME tillägg inte redo" - -#: src/gtk/no-extension.ui:16 -msgid "" -"If you have just run the setup, then you may need to log out and back in to " -"use it. Otherwise, please follow the Breezy GNOME setup instructions." -msgstr "" -"Om du har kört inställning, kanske du behöver logga ut och in igen för att " -"använda den. Annars, var god att följa Breezy GNOME inställning " -"instruktioner." - -#: src/gtk/no-license.ui:15 -msgid "No license file was found" -msgstr "Inget licens fil hittades" - -#: src/gtk/no-license.ui:16 -msgid "" -"\n" -" The first time you use Breezy Desktop, an internet connection is " -"required to retrieve your device's license.\n" -" \n" -" Don't worry, there's no obligation to donate at this time. If you " -"haven't, you'll be given a trial license so you can decide if Breezy Desktop " -"fits your needs. \n" -" \n" -" Once you obtain a license, trial or otherwise, you can use Breezy " -"Desktop offline until features expire (or indefinitely, if you've chosen " -"lifetime access).\n" -" " -msgstr "" -"\n" -" Den första gången du använder Breezy Desktop, krävs en internet " -"anslutning för att hämta din enhets licens.\n" -" \n" -" Var inte bekymrad, det finns ingen förpliktelse att donera just " -"nu. Om du inte har, kommer du att få en försöks licens så du kan bestämma om " -"Breezy Desktop passar dina behov. \n" -" \n" -" En gång du har fått en licens, försöks eller annat, kan du använda " -"Breezy Desktop offline tills funktioner upphör (eller oändligt, om du har " -"valt livstidsåtkomst).\n" -" " - -#: src/gtk/no-license.ui:29 -msgid "Try Again" -msgstr "Försök igen" - -#: src/gtk/shortcut-dialog.ui:5 -msgid "Assign Keyboard Shortcut" -msgstr "Tilldela tangentbordsgenvägar" - -#: src/gtk/shortcut-dialog.ui:20 -msgid "Press your keyboard shortcut or 'Backspace' to disable..." -msgstr "Tryck din tangentbordsgenväg eller 'Backspace' för att inaktivera..." - -#: src/gtk/window.ui:10 -msgid "Breezy Desktop" -msgstr "Breezy Desktop" - -#: src/gtk/window.ui:23 -msgid "Menu" -msgstr "Meny" - -#: src/gtk/window.ui:43 -msgid "Some features expire soon" -msgstr "Vissa funktioner upphör snart" - -#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102 -msgid "View details" -msgstr "Se detaljer" - -#: src/gtk/window.ui:68 -msgid "Productivity features are disabled" -msgstr "Produktivitets funktioner är inaktiverade" - -#: src/gtk/window.ui:93 -msgid "" -"Productivity Pro license is inactive — 6DoF features will be unavailable" -msgstr "" - -#: src/gtk/window.ui:119 -msgid "" -"A newer version is available. To update, rerun the breezy_gnome_setup script." -msgstr "" - -#: src/gtk/window.ui:143 -msgid "Force Reset" -msgstr "Tvinga Reset" - -#: src/gtk/window.ui:147 -msgid "About BreezyDesktop" -msgstr "Om BreezyDesktop" - -#~ msgid "Side-by-side mode (gaming)" -#~ msgstr "Side-by-side läge (spel)" - -#~ msgid "Smooth Follow (gaming)" -#~ msgstr "Smidig följning (spel)" - -#~ msgid "Breezy Desktop (productivity)" -#~ msgstr "Breezy Desktop (produktivitet)" - -#~ msgid "Gaming" -#~ msgstr "Spel" - -#~ msgid "Productivity" -#~ msgstr "Produktivitet" - -#~ msgid "Fast SBS mode switching" -#~ msgstr "Snabb SBS läge växling" - -#~ msgid "" -#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen " -#~ "mode is on. May cause instability." -#~ msgstr "" -#~ "Växlar glasögon till SBS läge omedelbart när den är ansluten, om " -#~ "bredbildsläge är på. Kan orsaka instabilitet." - -#, fuzzy -#~ msgid "Set Unfocused Displays Distance" -#~ msgstr "Avstånd till skärmen" - -#~ msgid "Widescreen mode" -#~ msgstr "Bredbildsläge" - -#~ msgid "" -#~ "Closer appears larger, further appears smaller. Controls depth when in " -#~ "widescreen mode." -#~ msgstr "" -#~ "Närmare verkar större, längre verkar mindre. Kontrollerar djupet när du " -#~ "är i bredbildsläge." - -#~ msgid "" -#~ "Combine with display distance to achieve a comfortable level of depth and " -#~ "size." -#~ msgstr "" -#~ "Kombinera med skärmens avstånd för att uppnå en bekväm nivå av djup och " -#~ "storlek." - -#~ msgid "Display toggle distances" -#~ msgstr "Växla skärm-avstånd" - -#~ msgid "" -#~ "Use the buttons to capture the current display distance for use with the " -#~ "keyboard shortcut." -#~ msgstr "" -#~ "Använd knapparna för att fanga nuvarande skärmavståndet för användning " -#~ "med tangentbordsgenvägar." - -#~ msgid "Display distance shortcut" -#~ msgstr "Skärm avstånd genväg" - -#~ msgid "Quickly toggle between two predefined distances." -#~ msgstr "Växla snabbt mellan två fördefinierade avstånd." - -#~ msgid "Start in widescreen mode" -#~ msgstr "Starta i bredbildsläge" - -#~ msgid "Widescreen mode is not supported for all glasses." -#~ msgstr "Bredbildsläge stöds inte av alla glasögon." diff --git a/ui/po/uk_UA.po b/ui/po/uk_UA.po deleted file mode 100644 index f4e15b8..0000000 --- a/ui/po/uk_UA.po +++ /dev/null @@ -1,834 +0,0 @@ -# Ukrainian translations for PACKAGE package. -# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# , 2024. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-03 12:40-0800\n" -"PO-Revision-Date: 2024-08-17 10:08-0700\n" -"Last-Translator: \n" -"Language-Team: Ukrainian \n" -"Language: uk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#: src/connecteddevice.py:29 -msgid "" -"Switches your glasses into side-by-side mode and doubles the width of the " -"display." -msgstr "Переключає окуляри в режим «бок о бок» і подвоює ширину дисплея." - -#: src/connecteddevice.py:30 -msgid "This feature is not currently supported for your device." -msgstr "Ця функція наразі не підтримується на вашому пристрої." - -#: src/connecteddevice.py:160 -#, fuzzy -msgid "Set Focused Display Distance" -msgstr "Відстань дисплея" - -#: src/connecteddevice.py:161 -msgid "Use a closer value so the display zooms in when you look at it." -msgstr "" - -#: src/connecteddevice.py:168 -#, fuzzy -msgid "Set All Displays Distance" -msgstr "Відстань дисплея" - -#: src/connecteddevice.py:169 -msgid "Use a farther value so the displays are zoomed out when you look away." -msgstr "" - -#: src/connecteddevice.py:309 -msgid "" -"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, " -"and the pipewire GStreamer plugin are required." -msgstr "" - -#: src/connecteddevice.py:343 -#, fuzzy -msgid "Focused display" -msgstr "Відстань дисплея" - -#: src/connecteddevice.py:349 -#, fuzzy -msgid "All displays" -msgstr "Викривлений дисплей" - -#: src/licensedialogcontent.py:63 -msgid "Paid Tier Status" -msgstr "Статус платного рівня" - -#: src/licensedialogcontent.py:71 -msgid "Feature Availability" -msgstr "Статус функцій" - -#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104 -#: src/gtk/connected-device.ui:786 -msgid "Disabled" -msgstr "Вимкнено" - -#: src/licensefeaturerow.py:18 -msgid "In trial" -msgstr "У пробному режимі" - -#: src/licensefeaturerow.py:18 -msgid "Enabled" -msgstr "Увімкнено" - -#: src/licensefeaturerow.py:24 src/licensetierrow.py:30 -#, python-brace-format -msgid " ({time_remaining} remaining)" -msgstr "({time_remaining} залишилося)" - -#: src/licensefeaturerow.py:30 src/licensetierrow.py:56 -msgid "Productivity Basic" -msgstr "" - -#: src/licensefeaturerow.py:31 src/licensetierrow.py:57 -msgid "Productivity Pro" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Active" -msgstr "Активний" - -#: src/licensetierrow.py:24 -msgid "Inactive" -msgstr "Неактивний" - -#: src/licensetierrow.py:41 -#, python-brace-format -msgid "${amount} USD" -msgstr "${amount} USD" - -#: src/licensetierrow.py:43 -msgid " to renew" -msgstr " для оновлення" - -#: src/licensetierrow.py:45 -msgid " to upgrade" -msgstr " для удосконалювання" - -#: src/licensetierrow.py:47 -msgid "Paid through next renewal period" -msgstr "Оплата до наступного періоду" - -#: src/licensetierrow.py:63 -msgid " - renewing monthly" -msgstr " - щомісячне продовження" - -#: src/licensetierrow.py:64 -msgid " - renewing yearly" -msgstr " - щорічне продовження" - -#: src/licensetierrow.py:65 -msgid "with lifetime access" -msgstr "з довічним доступом" - -#: src/licensetierrow.py:72 -msgid "Monthly" -msgstr "Щомісячно" - -#: src/licensetierrow.py:73 -msgid "Yearly" -msgstr "Щорічно" - -#: src/licensetierrow.py:74 -msgid "Lifetime" -msgstr "Довічно" - -#: src/time.py:14 -msgid "less than an hour" -msgstr "менше години" - -#: src/time.py:17 -msgid "1 hour" -msgstr "1 година" - -#: src/time.py:17 -#, python-brace-format -msgid "{time_remaining} hours" -msgstr "{time_remaining} годин" - -#: src/time.py:20 -msgid "1 day" -msgstr "1 день" - -#: src/time.py:20 -#, python-brace-format -msgid "{time_remaining} days" -msgstr "{time_remaining} днів" - -#: src/gtk/connected-device.ui:21 -msgid "connected" -msgstr "підключено" - -#: src/gtk/connected-device.ui:31 -msgid "General Settings" -msgstr "Загальні налаштування" - -#: src/gtk/connected-device.ui:41 -msgid "Features" -msgstr "Функції" - -#: src/gtk/connected-device.ui:45 -msgid "XR effect" -msgstr "Ефект XR" - -#: src/gtk/connected-device.ui:46 -msgid "Enables the Breezy Desktop XR effect." -msgstr "Включає ефект Breezy Desktop XR." - -#: src/gtk/connected-device.ui:56 -msgid "Zoom on focus" -msgstr "" - -#: src/gtk/connected-device.ui:57 -msgid "" -"Automatically move a display closer when you look at it.\n" -"Set your preferred focused and unfocused distances in the Adjustments " -"section.\n" -" " -msgstr "" - -#: src/gtk/connected-device.ui:70 -msgid "Follow mode" -msgstr "Режим слідування" - -#: src/gtk/connected-device.ui:71 -#, fuzzy -msgid "Keep the focused display near the center of your view." -msgstr "Зберігае віртуальний дисплей поблизу центру вашого зору." - -#: src/gtk/connected-device.ui:81 -msgid "Curved display" -msgstr "Викривлений дисплей" - -#: src/gtk/connected-device.ui:82 -msgid "Switch between flat and curved displays." -msgstr "Переключается між плоскими і викривленими дисплеями." - -#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36 -msgid "Disable physical displays" -msgstr "" - -#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37 -msgid "" -"Automatically disable all physical displays when the XR effect is enabled." -msgstr "" - -#: src/gtk/connected-device.ui:104 -#, fuzzy -msgid "Virtual displays" -msgstr "Викривлений дисплей" - -#: src/gtk/connected-device.ui:120 -msgid "1080p" -msgstr "" - -#: src/gtk/connected-device.ui:121 -msgid "1440p" -msgstr "" - -#: src/gtk/connected-device.ui:122 -msgid "Add custom" -msgstr "" - -#: src/gtk/connected-device.ui:136 -msgid "Remove custom resolution" -msgstr "" - -#: src/gtk/connected-device.ui:156 -#, fuzzy -msgid "Rearrange displays" -msgstr "Викривлений дисплей" - -#: src/gtk/connected-device.ui:174 -msgid "Adjustments" -msgstr "Налаштування" - -#: src/gtk/connected-device.ui:178 -#, fuzzy -msgid "Display distances" -msgstr "Відстань дисплея" - -#: src/gtk/connected-device.ui:179 -msgid "Set how close you want displays to appear." -msgstr "" - -#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221 -#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472 -#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530 -#: src/gtk/connected-device.ui:559 -msgid "Change" -msgstr "Змінити" - -#: src/gtk/connected-device.ui:234 -msgid "Display size" -msgstr "" - -#: src/gtk/connected-device.ui:235 -msgid "Set how large you want the display to appear." -msgstr "" - -#: src/gtk/connected-device.ui:254 -msgid "full" -msgstr "" - -#: src/gtk/connected-device.ui:264 -msgid "Follow threshold" -msgstr "Поріг слідування" - -#: src/gtk/connected-device.ui:265 -msgid "How far away you can look before the display follows." -msgstr "" -"Як далеко ви можете відвернути ваш взор, перш ніж дисплей почне слідувати за " -"вами." - -#: src/gtk/connected-device.ui:288 -#, fuzzy -msgid "Display angling" -msgstr "Розмір дисплея" - -#: src/gtk/connected-device.ui:289 -msgid "" -"When there are multiple displays, choose how they should angle towards you." -msgstr "" - -#: src/gtk/connected-device.ui:303 -msgid "Automatic" -msgstr "" - -#: src/gtk/connected-device.ui:304 -msgid "Side-angled" -msgstr "" - -#: src/gtk/connected-device.ui:305 -msgid "Top-angled" -msgstr "" - -#: src/gtk/connected-device.ui:306 -msgid "Flat" -msgstr "" - -#: src/gtk/connected-device.ui:316 -#, fuzzy -msgid "Display spacing" -msgstr "Розмір дисплея" - -#: src/gtk/connected-device.ui:317 -msgid "Put empty space between displays, when there are multiple." -msgstr "" - -#: src/gtk/connected-device.ui:347 -msgid "Viewport horizontal offset" -msgstr "" - -#: src/gtk/connected-device.ui:348 -msgid "Move the viewport to the left or right of its default position." -msgstr "" - -#: src/gtk/connected-device.ui:365 -msgid "left" -msgstr "" - -#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397 -msgid "center" -msgstr "" - -#: src/gtk/connected-device.ui:369 -msgid "right" -msgstr "" - -#: src/gtk/connected-device.ui:377 -msgid "Viewport vertical offset" -msgstr "" - -#: src/gtk/connected-device.ui:378 -msgid "Move the viewport up or down from its default position." -msgstr "" - -#: src/gtk/connected-device.ui:395 -msgid "down" -msgstr "" - -#: src/gtk/connected-device.ui:399 -msgid "up" -msgstr "" - -#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420 -msgid "Keyboard Shortcuts" -msgstr "Сполучення клавіш" - -#: src/gtk/connected-device.ui:423 -msgid "XR Effect on/off shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:424 -msgid "" -"Quickly enable or disable the XR Effect. You may need to enable the effect " -"manually once in order to enable the shortcut." -msgstr "" - -#: src/gtk/connected-device.ui:452 -msgid "Re-center display shortcut" -msgstr "Сполучення клавіш для центрування дисплея" - -#: src/gtk/connected-device.ui:453 -msgid "Pin the virtual display to the current position." -msgstr "Фіксувати віртуальний дисплей у поточній позиції." - -#: src/gtk/connected-device.ui:481 -#, fuzzy -msgid "Toggle zoom on focus shortcut" -msgstr "Сполучення клавіш для перемикання режиму слідування" - -#: src/gtk/connected-device.ui:482 -#, fuzzy -msgid "Quickly toggle zoom on focus mode." -msgstr "Швидко перемикати режим слідування." - -#: src/gtk/connected-device.ui:510 -msgid "Toggle follow mode shortcut" -msgstr "Сполучення клавіш для перемикання режиму слідування" - -#: src/gtk/connected-device.ui:511 -msgid "Quickly toggle follow mode." -msgstr "Швидко перемикати режим слідування." - -#: src/gtk/connected-device.ui:539 -msgid "Summon mouse cursor shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:540 -msgid "Bring the mouse cursor to the center of the focused display." -msgstr "" - -#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585 -msgid "Advanced Settings" -msgstr "Додаткові налаштування" - -#: src/gtk/connected-device.ui:589 -msgid "Units" -msgstr "" - -#: src/gtk/connected-device.ui:590 -msgid "Choose measurement units for size and distance displays." -msgstr "" - -#: src/gtk/connected-device.ui:605 -msgid "Centimeters" -msgstr "" - -#: src/gtk/connected-device.ui:606 -msgid "Inches" -msgstr "" - -#: src/gtk/connected-device.ui:618 -msgid "Find optimal display config" -msgstr "Знайти оптимальну конфігурацію дисплея" - -#: src/gtk/connected-device.ui:619 -msgid "" -"Automatically modify the glasses display configuration for maximum " -"resolution and best scaling when plugged in." -msgstr "" -"Автоматично змінює конфігурацію дисплея окулярів для максимальної роздільної " -"здатності і найкращого масштабування при підключенні." - -#: src/gtk/connected-device.ui:629 -msgid "Use highest refresh rate" -msgstr "Використовувати найвищу частоту оновлення" - -#: src/gtk/connected-device.ui:630 -msgid "Refresh rate may affect performance, disable this to set it manually." -msgstr "" -"Частота оновлення може вплинути на продуктивність, вимкніть це, щоб " -"встановити її вручну." - -#: src/gtk/connected-device.ui:640 -msgid "Center on glasses' display" -msgstr "" - -#: src/gtk/connected-device.ui:641 -msgid "" -"Center the viewport on the glasses' display, even if the display is not in " -"the middle." -msgstr "" - -#: src/gtk/connected-device.ui:651 -msgid "Always primary display" -msgstr "Завжди основний дисплей" - -#: src/gtk/connected-device.ui:652 -msgid "Automatically set the glasses as the primary display when plugged in." -msgstr "Автоматично встановлює окуляри як основний дисплей при підключенні." - -#: src/gtk/connected-device.ui:662 -#, fuzzy -msgid "Remove virtual displays on disable" -msgstr "Викривлений дисплей" - -#: src/gtk/connected-device.ui:663 -msgid "Automatically remove virtual displays when the XR effect is disabled." -msgstr "" - -#: src/gtk/connected-device.ui:673 -msgid "Enable multi-tap detection" -msgstr "" - -#: src/gtk/connected-device.ui:674 -msgid "Enables double-tap to recenter and triple-tap to recalibrate." -msgstr "" - -#: src/gtk/connected-device.ui:684 -#, fuzzy -msgid "All displays follow mode" -msgstr "Викривлений дисплей" - -#: src/gtk/connected-device.ui:685 -msgid "Follow mode moves all displays, not just the focused one." -msgstr "" - -#: src/gtk/connected-device.ui:701 -msgid "Neck-saver horizontal multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:702 -msgid "Higher values require smaller horizontal head movements." -msgstr "" - -#: src/gtk/connected-device.ui:734 -msgid "Neck-saver vertical multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:735 -msgid "Higher values require smaller vertical head movements." -msgstr "" - -#: src/gtk/connected-device.ui:767 -msgid "Dead-zone threshold (degrees)" -msgstr "" - -#: src/gtk/connected-device.ui:768 -msgid "Stabilize movements below this angle." -msgstr "" - -#: src/gtk/connected-device.ui:799 -msgid "Follow mode movement tracking" -msgstr "" - -#: src/gtk/connected-device.ui:800 -msgid "Choose which movements should be tracked in follow mode." -msgstr "" - -#: src/gtk/connected-device.ui:815 -msgid "Horizontal" -msgstr "" - -#: src/gtk/connected-device.ui:835 -msgid "Vertical" -msgstr "" - -#: src/gtk/connected-device.ui:855 -msgid "Tilt/roll" -msgstr "" - -#: src/gtk/connected-device.ui:873 -msgid "Movement look-ahead" -msgstr "Прогнозування руху" - -#: src/gtk/connected-device.ui:874 -msgid "" -"Counteracts input lag by predicting head-tracking position ahead of render " -"time. Stick with default unless virtual display drags behind your head " -"movements, jumps ahead, or is very shaky." -msgstr "" -"Компенсує затримку введення, передбачаючи позицію відстеження голови перед " -"часом рендерингу. Залишайтеся при налаштуваннях за замовчуванням, якщо " -"віртуальний дисплей відстає від рухів вашої голови, випереджає або дуже " -"тремтить." - -#: src/gtk/connected-device.ui:892 -msgid "Default" -msgstr "За замовчуванням" - -#: src/gtk/connected-device.ui:904 -msgid "Text Scaling" -msgstr "" - -#: src/gtk/connected-device.ui:905 -msgid "Scaling text below 1.0 will simulate a higher resolution display" -msgstr "" - -#: src/gtk/custom-resolution-dialog-content.ui:9 -msgid "Width" -msgstr "" - -#: src/gtk/custom-resolution-dialog-content.ui:42 -msgid "Height" -msgstr "" - -#: src/gtk/custom-resolution-dialog.ui:5 -msgid "Add a Custom Resolution" -msgstr "" - -#: src/gtk/custom-resolution-dialog.ui:10 -msgid "Add" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:35 -msgid "closer" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:36 -msgid "default" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:37 -msgid "farther" -msgstr "" - -#: src/gtk/display-distance-dialog.ui:9 -msgid "Done" -msgstr "" - -#: src/gtk/failed-verification.ui:15 -msgid "Breezy Desktop GNOME invalid setup" -msgstr "Невірна настройка Breezy Desktop GNOME" - -#: src/gtk/failed-verification.ui:16 -msgid "" -"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup " -"script. Report this issue if it persists." -msgstr "" -"Ваша настройка Breezy GNOME є невірною або неповною. Будь ласка, запустіть " -"скрипт настройки повторно. Повідомте про цю проблему, якщо вона не зникає." - -#: src/gtk/license-dialog-content.ui:15 -msgid "Donate" -msgstr "Донатити" - -#: src/gtk/license-dialog-content.ui:31 -msgid "Request a token" -msgstr "Запитати токен" - -#: src/gtk/license-dialog-content.ui:39 -msgid "Verify token" -msgstr "Перевірити токен" - -#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139 -msgid "License Details" -msgstr "Деталі ліцензії" - -#: src/gtk/no-device.ui:15 -msgid "No device connected" -msgstr "Жоден пристрій не підключено" - -#: src/gtk/no-device.ui:16 -msgid "Breezy Desktop was unable to detect any supported XR devices." -msgstr "Breezy Desktop не зміг виявити жодного підтримуваного XR пристрою." - -#: src/gtk/no-device.ui:25 -#, fuzzy -msgid "Auto-enable XR effect" -msgstr "Ефект XR" - -#: src/gtk/no-device.ui:26 -msgid "" -"Automatically enable the Breezy Desktop XR effect when supported glasses are " -"connected." -msgstr "" - -#: src/gtk/no-driver.ui:15 -msgid "No driver running" -msgstr "Жоден драйвер не запущений" - -#: src/gtk/no-driver.ui:16 -msgid "" -"\n" -" If you installed via AUR, make sure you ran the recommended post-" -"install command:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Otherwise, please file an issue on GitHub, or create a new thread " -"in the #troubleshooting channel on Discord.\n" -" " -msgstr "" -"\n" -" Якщо ви встановили через AUR, переконайтеся, що ви запустили " -"рекомендовану команду після встановлення:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -"В іншому випадку, будь ласка, створіть запит на GitHub або новий тред у " -"каналі #troubleshooting на Discord.\n" -" " - -#: src/gtk/no-extension.ui:15 -msgid "Breezy Desktop GNOME extension not ready" -msgstr "Розширення Breezy Desktop GNOME не готове" - -#: src/gtk/no-extension.ui:16 -msgid "" -"If you have just run the setup, then you may need to log out and back in to " -"use it. Otherwise, please follow the Breezy GNOME setup instructions." -msgstr "" -"Якщо ви тільки що запустили налаштування, можливо, вам потрібно вийти і " -"знову увійти, щоб використовувати його. В іншому випадку, будь ласка, " -"дотримуйтесь інструкцій з налаштування Breezy GNOME." - -#: src/gtk/no-license.ui:15 -msgid "No license file was found" -msgstr "Жоден файл ліцензії не знайдено" - -#: src/gtk/no-license.ui:16 -msgid "" -"\n" -" The first time you use Breezy Desktop, an internet connection is " -"required to retrieve your device's license.\n" -" \n" -" Don't worry, there's no obligation to donate at this time. If you " -"haven't, you'll be given a trial license so you can decide if Breezy Desktop " -"fits your needs. \n" -" \n" -" Once you obtain a license, trial or otherwise, you can use Breezy " -"Desktop offline until features expire (or indefinitely, if you've chosen " -"lifetime access).\n" -" " -msgstr "" -"\n" -"Під час першого запуску програми Breezy Desktop потрібне підключення до " -"Інтернету для отримання ліцензії на пристрій.\n" -" \n" -"Не хвилюйтеся, наразі немає обов'язку донатити. Якщо ви не зробили цього, " -"вам буде надана пробна ліцензія, щоб ви могли вирішити, чи відповідає Breezy " -"Desktop вашим потребам.\n" -" \n" -"Після отримання ліцензії, пробної або іншої, ви можете використовувати " -"Breezy Desktop офлайн до закінчення терміну дії функції (або безстроково, " -"якщо ви обрали довічний доступ).\n" -" " - -#: src/gtk/no-license.ui:29 -msgid "Try Again" -msgstr "Спробуйте ще раз" - -#: src/gtk/shortcut-dialog.ui:5 -msgid "Assign Keyboard Shortcut" -msgstr "Призначити сполучення клавіш" - -#: src/gtk/shortcut-dialog.ui:20 -msgid "Press your keyboard shortcut or 'Backspace' to disable..." -msgstr "Натисніть сполучення клавіш або 'Backspace', щоб відключити..." - -#: src/gtk/window.ui:10 -msgid "Breezy Desktop" -msgstr "Breezy Desktop" - -#: src/gtk/window.ui:23 -msgid "Menu" -msgstr "Меню" - -#: src/gtk/window.ui:43 -msgid "Some features expire soon" -msgstr "Деякі функції закінчуються незабаром" - -#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102 -msgid "View details" -msgstr "Переглянути деталі" - -#: src/gtk/window.ui:68 -msgid "Productivity features are disabled" -msgstr "Функції продуктивного режиму відключені" - -#: src/gtk/window.ui:93 -msgid "" -"Productivity Pro license is inactive — 6DoF features will be unavailable" -msgstr "" - -#: src/gtk/window.ui:119 -msgid "" -"A newer version is available. To update, rerun the breezy_gnome_setup script." -msgstr "" - -#: src/gtk/window.ui:143 -msgid "Force Reset" -msgstr "Скинути" - -#: src/gtk/window.ui:147 -msgid "About BreezyDesktop" -msgstr "Про BreezyDesktop" - -#~ msgid "Side-by-side mode (gaming)" -#~ msgstr "Режим «бок о бок» (ігровий режим)" - -#~ msgid "Smooth Follow (gaming)" -#~ msgstr "Плавне слідування (ігровий режим)" - -#~ msgid "Breezy Desktop (productivity)" -#~ msgstr "Breezy Desktop (продуктивний прежим)" - -#~ msgid "Gaming" -#~ msgstr "Ігровий режим" - -#~ msgid "Productivity" -#~ msgstr "Продуктивний режим" - -#~ msgid "Fast SBS mode switching" -#~ msgstr "Швидке перемикання режиму SBS" - -#~ msgid "" -#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen " -#~ "mode is on. May cause instability." -#~ msgstr "" -#~ "Переключає окуляри в режим SBS відразу після підключення, якщо режим " -#~ "широкого екрана увімкнено. Може викликати нестабільність." - -#, fuzzy -#~ msgid "Set Unfocused Displays Distance" -#~ msgstr "Відстань дисплея" - -#~ msgid "Widescreen mode" -#~ msgstr "Режим широкого екрану" - -#~ msgid "" -#~ "Closer appears larger, further appears smaller. Controls depth when in " -#~ "widescreen mode." -#~ msgstr "" -#~ "Чим ближче, тим більший. Чим далі, тим менший. Керує глибиною при " -#~ "використанні режиму широкого екрана." - -#~ msgid "" -#~ "Combine with display distance to achieve a comfortable level of depth and " -#~ "size." -#~ msgstr "" -#~ "Поєднуйте з відстанню дисплея, щоб досягти комфортного рівня глибини і " -#~ "розміру." - -#~ msgid "Display toggle distances" -#~ msgstr "Перемикання відстані дисплея" - -#~ msgid "" -#~ "Use the buttons to capture the current display distance for use with the " -#~ "keyboard shortcut." -#~ msgstr "" -#~ "Використовуйте кнопки, щоб зафіксувати поточну відстань дисплея для " -#~ "використання з сполученням клавіш." - -#~ msgid "Display distance shortcut" -#~ msgstr "Сполучення клавіш для відстані дисплея" - -#~ msgid "Quickly toggle between two predefined distances." -#~ msgstr "Швидко перемикатися між двома попередньо визначеними відстанями." - -#, fuzzy -#~ msgid "Start in widescreen mode" -#~ msgstr "Режим широкого екрану" diff --git a/ui/po/zh_CN.po b/ui/po/zh_CN.po deleted file mode 100644 index 49aa558..0000000 --- a/ui/po/zh_CN.po +++ /dev/null @@ -1,816 +0,0 @@ -# Chinese translations for PACKAGE package. -# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# , 2024. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-03 12:40-0800\n" -"PO-Revision-Date: 2024-08-02 20:55-0700\n" -"Last-Translator: \n" -"Language-Team: Chinese (simplified) \n" -"Language: zh_CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: src/connecteddevice.py:29 -msgid "" -"Switches your glasses into side-by-side mode and doubles the width of the " -"display." -msgstr "切换到并排模式,并将显示宽度翻倍。" - -#: src/connecteddevice.py:30 -msgid "This feature is not currently supported for your device." -msgstr "您的设备目前不支援此功能。" - -#: src/connecteddevice.py:160 -msgid "Set Focused Display Distance" -msgstr "设定注视中的屏幕的距离" - -#: src/connecteddevice.py:161 -msgid "Use a closer value so the display zooms in when you look at it." -msgstr "近的数值会将您所看向的屏幕放大" - -#: src/connecteddevice.py:168 -msgid "Set All Displays Distance" -msgstr "设定所有屏幕的距离" - -#: src/connecteddevice.py:169 -msgid "Use a farther value so the displays are zoomed out when you look away." -msgstr "远的数值会将您所看向的屏幕缩小" - -#: src/connecteddevice.py:309 -msgid "" -"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, " -"and the pipewire GStreamer plugin are required." -msgstr "无法增加模拟显示。需要安装xdg-desktop-portal和Wayland" - -#: src/connecteddevice.py:343 -msgid "Focused display" -msgstr "注视中的屏幕" - -#: src/connecteddevice.py:349 -msgid "All displays" -msgstr "所有的屏幕" - -#: src/licensedialogcontent.py:63 -msgid "Paid Tier Status" -msgstr "订阅状态" - -#: src/licensedialogcontent.py:71 -msgid "Feature Availability" -msgstr "功能状态" - -#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104 -#: src/gtk/connected-device.ui:786 -msgid "Disabled" -msgstr "已禁用" - -#: src/licensefeaturerow.py:18 -msgid "In trial" -msgstr "试用中" - -#: src/licensefeaturerow.py:18 -msgid "Enabled" -msgstr "已启用" - -#: src/licensefeaturerow.py:24 src/licensetierrow.py:30 -#, python-brace-format -msgid " ({time_remaining} remaining)" -msgstr " (剩下 {time_remaining})" - -#: src/licensefeaturerow.py:30 src/licensetierrow.py:56 -msgid "Productivity Basic" -msgstr "" - -#: src/licensefeaturerow.py:31 src/licensetierrow.py:57 -msgid "Productivity Pro" -msgstr "" - -#: src/licensetierrow.py:24 -msgid "Active" -msgstr "已订阅" - -#: src/licensetierrow.py:24 -msgid "Inactive" -msgstr "未订阅" - -#: src/licensetierrow.py:41 -#, python-brace-format -msgid "${amount} USD" -msgstr "${amount} 美元" - -#: src/licensetierrow.py:43 -msgid " to renew" -msgstr "续订" - -#: src/licensetierrow.py:45 -msgid " to upgrade" -msgstr "升级" - -#: src/licensetierrow.py:47 -msgid "Paid through next renewal period" -msgstr "已支付至下个续订期" - -#: src/licensetierrow.py:63 -msgid " - renewing monthly" -msgstr " - 每月续订" - -#: src/licensetierrow.py:64 -msgid " - renewing yearly" -msgstr " - 每年续订" - -#: src/licensetierrow.py:65 -msgid "with lifetime access" -msgstr "终身会员" - -#: src/licensetierrow.py:72 -msgid "Monthly" -msgstr "每月" - -#: src/licensetierrow.py:73 -msgid "Yearly" -msgstr "每年" - -#: src/licensetierrow.py:74 -msgid "Lifetime" -msgstr "终身" - -#: src/time.py:14 -msgid "less than an hour" -msgstr "不到一个小时" - -#: src/time.py:17 -msgid "1 hour" -msgstr "1小时" - -#: src/time.py:17 -#, python-brace-format -msgid "{time_remaining} hours" -msgstr "{time_remaining} 小时" - -#: src/time.py:20 -msgid "1 day" -msgstr "1天" - -#: src/time.py:20 -#, python-brace-format -msgid "{time_remaining} days" -msgstr "{time_remaining} 天" - -#: src/gtk/connected-device.ui:21 -msgid "connected" -msgstr "已连接" - -#: src/gtk/connected-device.ui:31 -msgid "General Settings" -msgstr "通用设定" - -#: src/gtk/connected-device.ui:41 -msgid "Features" -msgstr "功能" - -#: src/gtk/connected-device.ui:45 -msgid "XR effect" -msgstr "XR 效果" - -#: src/gtk/connected-device.ui:46 -msgid "Enables the Breezy Desktop XR effect." -msgstr "启用 Breezy Desktop XR 效果。" - -#: src/gtk/connected-device.ui:56 -msgid "Zoom on focus" -msgstr "注视自动放大" - -#: src/gtk/connected-device.ui:57 -msgid "" -"Automatically move a display closer when you look at it.\n" -"Set your preferred focused and unfocused distances in the Adjustments " -"section.\n" -" " -msgstr "" -"当您看向着一个屏幕,将此屏幕自动放大。 注视中的屏幕,非注视中的屏幕都可以在" -"「调整页」里设定距离" - -#: src/gtk/connected-device.ui:70 -msgid "Follow mode" -msgstr "跟随模式" - -#: src/gtk/connected-device.ui:71 -msgid "Keep the focused display near the center of your view." -msgstr "将注视中的屏幕保持在视野中心附近。" - -#: src/gtk/connected-device.ui:81 -msgid "Curved display" -msgstr "曲面显示" - -#: src/gtk/connected-device.ui:82 -msgid "Switch between flat and curved displays." -msgstr "平板和曲面显示模式之间切换。" - -#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36 -msgid "Disable physical displays" -msgstr "将所有具体屏幕关闭" - -#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37 -msgid "" -"Automatically disable all physical displays when the XR effect is enabled." -msgstr "XR效果开启时将所有具体屏幕自动关闭" - -#: src/gtk/connected-device.ui:104 -msgid "Virtual displays" -msgstr "模拟屏幕" - -#: src/gtk/connected-device.ui:120 -msgid "1080p" -msgstr "1080p" - -#: src/gtk/connected-device.ui:121 -msgid "1440p" -msgstr "1440p" - -#: src/gtk/connected-device.ui:122 -msgid "Add custom" -msgstr "增加客制化解析度" - -#: src/gtk/connected-device.ui:136 -msgid "Remove custom resolution" -msgstr "删除客制化解析度" - -#: src/gtk/connected-device.ui:156 -msgid "Rearrange displays" -msgstr "改变屏幕顺序" - -#: src/gtk/connected-device.ui:174 -msgid "Adjustments" -msgstr "调整" - -#: src/gtk/connected-device.ui:178 -msgid "Display distances" -msgstr "屏幕距离" - -#: src/gtk/connected-device.ui:179 -msgid "Set how close you want displays to appear." -msgstr "设定您所希望屏幕离你的距离有多近" - -#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221 -#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472 -#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530 -#: src/gtk/connected-device.ui:559 -msgid "Change" -msgstr "更改" - -#: src/gtk/connected-device.ui:234 -msgid "Display size" -msgstr "" - -#: src/gtk/connected-device.ui:235 -msgid "Set how large you want the display to appear." -msgstr "" - -#: src/gtk/connected-device.ui:254 -msgid "full" -msgstr "" - -#: src/gtk/connected-device.ui:264 -msgid "Follow threshold" -msgstr "跟随触发值" - -#: src/gtk/connected-device.ui:265 -msgid "How far away you can look before the display follows." -msgstr "显示内容开始进行跟随模式前您可以看得多远。" - -#: src/gtk/connected-device.ui:288 -msgid "Display angling" -msgstr "屏幕角度" - -#: src/gtk/connected-device.ui:289 -msgid "" -"When there are multiple displays, choose how they should angle towards you." -msgstr "有多屏幕时,选择屏幕向您倾斜的角度" - -#: src/gtk/connected-device.ui:303 -msgid "Automatic" -msgstr "自动" - -#: src/gtk/connected-device.ui:304 -msgid "Side-angled" -msgstr "侧边弯曲" - -#: src/gtk/connected-device.ui:305 -msgid "Top-angled" -msgstr "上下弯曲" - -#: src/gtk/connected-device.ui:306 -msgid "Flat" -msgstr "平面" - -#: src/gtk/connected-device.ui:316 -msgid "Display spacing" -msgstr "屏幕之间缝隙的距差" - -#: src/gtk/connected-device.ui:317 -msgid "Put empty space between displays, when there are multiple." -msgstr "把多屏幕之间插入一个空间" - -#: src/gtk/connected-device.ui:347 -msgid "Viewport horizontal offset" -msgstr "眼镜视口特定水平偏移" - -#: src/gtk/connected-device.ui:348 -msgid "Move the viewport to the left or right of its default position." -msgstr "将眼镜视口从默认位置左右移动" - -#: src/gtk/connected-device.ui:365 -msgid "left" -msgstr "左" - -#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397 -msgid "center" -msgstr "中" - -#: src/gtk/connected-device.ui:369 -msgid "right" -msgstr "右" - -#: src/gtk/connected-device.ui:377 -msgid "Viewport vertical offset" -msgstr "眼镜视口特定垂直偏移" - -#: src/gtk/connected-device.ui:378 -msgid "Move the viewport up or down from its default position." -msgstr "将眼镜视口从默认位置上下移动" - -#: src/gtk/connected-device.ui:395 -msgid "down" -msgstr "下" - -#: src/gtk/connected-device.ui:399 -msgid "up" -msgstr "上" - -#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420 -msgid "Keyboard Shortcuts" -msgstr "键盘快捷键" - -#: src/gtk/connected-device.ui:423 -msgid "XR Effect on/off shortcut" -msgstr "XR效果 开/关 快捷键" - -#: src/gtk/connected-device.ui:424 -msgid "" -"Quickly enable or disable the XR Effect. You may need to enable the effect " -"manually once in order to enable the shortcut." -msgstr "快速启用或禁用 XR 效果。您可能需要先手动启用一次该效果,才能设此快捷键" - -#: src/gtk/connected-device.ui:452 -msgid "Re-center display shortcut" -msgstr "重新居中显示快捷键" - -#: src/gtk/connected-device.ui:453 -msgid "Pin the virtual display to the current position." -msgstr "将虚拟显示固定在当前位置。" - -#: src/gtk/connected-device.ui:481 -msgid "Toggle zoom on focus shortcut" -msgstr "切换注视自动放大模式快捷键" - -#: src/gtk/connected-device.ui:482 -msgid "Quickly toggle zoom on focus mode." -msgstr "快速地切换注视自动放大模式。" - -#: src/gtk/connected-device.ui:510 -msgid "Toggle follow mode shortcut" -msgstr "切换跟随模式快捷键" - -#: src/gtk/connected-device.ui:511 -msgid "Quickly toggle follow mode." -msgstr "快速切换跟随模式。" - -#: src/gtk/connected-device.ui:539 -msgid "Summon mouse cursor shortcut" -msgstr "" - -#: src/gtk/connected-device.ui:540 -msgid "Bring the mouse cursor to the center of the focused display." -msgstr "" - -#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585 -msgid "Advanced Settings" -msgstr "高级设定" - -#: src/gtk/connected-device.ui:589 -msgid "Units" -msgstr "" - -#: src/gtk/connected-device.ui:590 -msgid "Choose measurement units for size and distance displays." -msgstr "" - -#: src/gtk/connected-device.ui:605 -msgid "Centimeters" -msgstr "" - -#: src/gtk/connected-device.ui:606 -msgid "Inches" -msgstr "" - -#: src/gtk/connected-device.ui:618 -msgid "Find optimal display config" -msgstr "寻找最佳显示设定" - -#: src/gtk/connected-device.ui:619 -msgid "" -"Automatically modify the glasses display configuration for maximum " -"resolution and best scaling when plugged in." -msgstr "连接时,可以自动修改眼镜显示设定以表现出最大解析度和最佳的对比。" - -#: src/gtk/connected-device.ui:629 -msgid "Use highest refresh rate" -msgstr "使用最高刷新率" - -#: src/gtk/connected-device.ui:630 -msgid "Refresh rate may affect performance, disable this to set it manually." -msgstr "刷新率可能会影响性能,禁用此功能即可手动设置。" - -#: src/gtk/connected-device.ui:640 -msgid "Center on glasses' display" -msgstr "视口眼镜屏幕固定" - -#: src/gtk/connected-device.ui:641 -msgid "" -"Center the viewport on the glasses' display, even if the display is not in " -"the middle." -msgstr "将眼镜视口对齐眼镜的主要屏幕, 即便此屏幕不在正中间" - -#: src/gtk/connected-device.ui:651 -msgid "Always primary display" -msgstr "每次设置为主要显示" - -#: src/gtk/connected-device.ui:652 -msgid "Automatically set the glasses as the primary display when plugged in." -msgstr "连接时,自动将眼镜设置为主要显示。" - -#: src/gtk/connected-device.ui:662 -msgid "Remove virtual displays on disable" -msgstr "自动模拟屏幕删除" - -#: src/gtk/connected-device.ui:663 -msgid "Automatically remove virtual displays when the XR effect is disabled." -msgstr "XR效果关闭时自动删除所有模拟屏幕" - -#: src/gtk/connected-device.ui:673 -msgid "Enable multi-tap detection" -msgstr "开启多点触控检测" - -#: src/gtk/connected-device.ui:674 -msgid "Enables double-tap to recenter and triple-tap to recalibrate." -msgstr "打开双击重新定位和三击重新校准手势" - -#: src/gtk/connected-device.ui:684 -msgid "All displays follow mode" -msgstr "全屏幕跟随模式" - -#: src/gtk/connected-device.ui:685 -msgid "Follow mode moves all displays, not just the focused one." -msgstr "让跟随模式移动所有的屏幕而不只是注视中的屏幕" - -#: src/gtk/connected-device.ui:701 -msgid "Neck-saver horizontal multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:702 -msgid "Higher values require smaller horizontal head movements." -msgstr "" - -#: src/gtk/connected-device.ui:734 -msgid "Neck-saver vertical multiplier" -msgstr "" - -#: src/gtk/connected-device.ui:735 -msgid "Higher values require smaller vertical head movements." -msgstr "" - -#: src/gtk/connected-device.ui:767 -msgid "Dead-zone threshold (degrees)" -msgstr "" - -#: src/gtk/connected-device.ui:768 -msgid "Stabilize movements below this angle." -msgstr "" - -#: src/gtk/connected-device.ui:799 -msgid "Follow mode movement tracking" -msgstr "跟随模式感应" - -#: src/gtk/connected-device.ui:800 -msgid "Choose which movements should be tracked in follow mode." -msgstr "选择那一些动作会被感应到" - -#: src/gtk/connected-device.ui:815 -msgid "Horizontal" -msgstr "水平动作" - -#: src/gtk/connected-device.ui:835 -msgid "Vertical" -msgstr "垂直动作" - -#: src/gtk/connected-device.ui:855 -msgid "Tilt/roll" -msgstr "倾斜及滚转动作" - -#: src/gtk/connected-device.ui:873 -msgid "Movement look-ahead" -msgstr "移动预测" - -#: src/gtk/connected-device.ui:874 -msgid "" -"Counteracts input lag by predicting head-tracking position ahead of render " -"time. Stick with default unless virtual display drags behind your head " -"movements, jumps ahead, or is very shaky." -msgstr "" -"透过预测头部追踪位置,提前于渲染时间进行预测来抵消输入延迟。除非虚拟显示滞后" -"于头部,提前跳动或非常抖动,请尽量使用默认设置。" - -#: src/gtk/connected-device.ui:892 -msgid "Default" -msgstr "默认" - -#: src/gtk/connected-device.ui:904 -msgid "Text Scaling" -msgstr "字体大小比例" - -#: src/gtk/connected-device.ui:905 -msgid "Scaling text below 1.0 will simulate a higher resolution display" -msgstr "字体缩放小于1.0,将模拟解析度更高的显示效果" - -#: src/gtk/custom-resolution-dialog-content.ui:9 -msgid "Width" -msgstr "宽度" - -#: src/gtk/custom-resolution-dialog-content.ui:42 -msgid "Height" -msgstr "高度" - -#: src/gtk/custom-resolution-dialog.ui:5 -msgid "Add a Custom Resolution" -msgstr "增加客制化解析度" - -#: src/gtk/custom-resolution-dialog.ui:10 -msgid "Add" -msgstr "增加" - -#: src/gtk/display-distance-dialog-content.ui:35 -msgid "closer" -msgstr "近" - -#: src/gtk/display-distance-dialog-content.ui:36 -msgid "default" -msgstr "" - -#: src/gtk/display-distance-dialog-content.ui:37 -msgid "farther" -msgstr "远" - -#: src/gtk/display-distance-dialog.ui:9 -msgid "Done" -msgstr "完成" - -#: src/gtk/failed-verification.ui:15 -msgid "Breezy Desktop GNOME invalid setup" -msgstr "Breezy Desktop GNOME 无效设置" - -#: src/gtk/failed-verification.ui:16 -msgid "" -"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup " -"script. Report this issue if it persists." -msgstr "" -"您的 Breezy GNOME 设置无效或不完整。请重新运行设置脚本。如果问题仍然存在,请" -"报告此问题。" - -#: src/gtk/license-dialog-content.ui:15 -msgid "Donate" -msgstr "捐赠" - -#: src/gtk/license-dialog-content.ui:31 -msgid "Request a token" -msgstr "申请令牌" - -#: src/gtk/license-dialog-content.ui:39 -msgid "Verify token" -msgstr "令牌验证" - -#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139 -msgid "License Details" -msgstr "许可证详细信息" - -#: src/gtk/no-device.ui:15 -msgid "No device connected" -msgstr "未连接设备" - -#: src/gtk/no-device.ui:16 -msgid "Breezy Desktop was unable to detect any supported XR devices." -msgstr "Breezy Desktop 无法检测到任何支援的 XR 设备。" - -#: src/gtk/no-device.ui:25 -msgid "Auto-enable XR effect" -msgstr "自动启动XR效果" - -#: src/gtk/no-device.ui:26 -msgid "" -"Automatically enable the Breezy Desktop XR effect when supported glasses are " -"connected." -msgstr "当支援的设备已连接,将BREEZY DESKTOP XR效果自动启动" - -#: src/gtk/no-driver.ui:15 -msgid "No driver running" -msgstr "未运行驱动程序" - -#: src/gtk/no-driver.ui:16 -msgid "" -"\n" -" If you installed via AUR, make sure you ran the recommended post-" -"install command:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" Otherwise, please file an issue on GitHub, or create a new thread " -"in the #troubleshooting channel on Discord.\n" -" " -msgstr "" -"\n" -" 如果您透过 AUR 安装,请确保运行推荐的后安装命令:\n" -" systemctl --user enable --now xr-driver.service\n" -"\n" -" 否则,请在 GitHub 上提交问题,或在 Discord 的 #troubleshooting 频道中创建新" -"主题。\n" -" " - -#: src/gtk/no-extension.ui:15 -msgid "Breezy Desktop GNOME extension not ready" -msgstr "Breezy Desktop GNOME 扩展尚未启用" - -#: src/gtk/no-extension.ui:16 -msgid "" -"If you have just run the setup, then you may need to log out and back in to " -"use it. Otherwise, please follow the Breezy GNOME setup instructions." -msgstr "" -"如果您刚运行设置,则可能需要注销并重新登录才能使用它。否则,请按照 Breezy " -"GNOME 设置说明进行操作。" - -#: src/gtk/no-license.ui:15 -msgid "No license file was found" -msgstr "未找到许可证文件" - -#: src/gtk/no-license.ui:16 -msgid "" -"\n" -" The first time you use Breezy Desktop, an internet connection is " -"required to retrieve your device's license.\n" -" \n" -" Don't worry, there's no obligation to donate at this time. If you " -"haven't, you'll be given a trial license so you can decide if Breezy Desktop " -"fits your needs. \n" -" \n" -" Once you obtain a license, trial or otherwise, you can use Breezy " -"Desktop offline until features expire (or indefinitely, if you've chosen " -"lifetime access).\n" -" " -msgstr "" -"\n" -" 首次使用 Breezy Desktop 时,需要互联网连接以获取设备许可证。\n" -" \n" -" 不要担心,您无需立即捐赠。如果您尚未捐赠,您将获得试用许可证,以便您可以决" -"定 Breezy Desktop 是否适合您的需求。 \n" -" \n" -" 获得许可证后,无论是试用还是付费,您都可以离线使用 Breezy Desktop(直到功能" -"过期,如果您选择了终身访问,则可以无限期使用)。\n" -" " - -#: src/gtk/no-license.ui:29 -msgid "Try Again" -msgstr "重新尝试" - -#: src/gtk/shortcut-dialog.ui:5 -msgid "Assign Keyboard Shortcut" -msgstr "设置键盘快捷键" - -#: src/gtk/shortcut-dialog.ui:20 -msgid "Press your keyboard shortcut or 'Backspace' to disable..." -msgstr "按下键盘快捷键或 '退格键' 以禁用..." - -#: src/gtk/window.ui:10 -msgid "Breezy Desktop" -msgstr "Breezy Desktop" - -#: src/gtk/window.ui:23 -msgid "Menu" -msgstr "菜单" - -#: src/gtk/window.ui:43 -msgid "Some features expire soon" -msgstr "某些功能即将过期" - -#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102 -msgid "View details" -msgstr "查看详细信息" - -#: src/gtk/window.ui:68 -msgid "Productivity features are disabled" -msgstr "生产模式功能被禁用" - -#: src/gtk/window.ui:93 -msgid "" -"Productivity Pro license is inactive — 6DoF features will be unavailable" -msgstr "" - -#: src/gtk/window.ui:119 -msgid "" -"A newer version is available. To update, rerun the breezy_gnome_setup script." -msgstr "" - -#: src/gtk/window.ui:143 -msgid "Force Reset" -msgstr "强制重置" - -#: src/gtk/window.ui:147 -msgid "About BreezyDesktop" -msgstr "关于 Breezy Desktop" - -#~ msgid "Side-by-side mode (gaming)" -#~ msgstr "并排模式(游戏)" - -#~ msgid "Smooth Follow (gaming)" -#~ msgstr "平滑跟随(游戏)" - -#~ msgid "Breezy Desktop (productivity)" -#~ msgstr "Breezy Desktop (生产力)" - -#~ msgid "Gaming" -#~ msgstr "游戏" - -#~ msgid "Productivity" -#~ msgstr "生产力" - -#~ msgid "fullscreen" -#~ msgstr "全屏" - -#~ msgid "Show full range" -#~ msgstr "显示全范围" - -#~ msgid "" -#~ "Unable to add virtual displays on this machine. Wayland and xdg-desktop-" -#~ "portal are required." -#~ msgstr "无法增加模拟显示。需要安装xdg-desktop-portal和Wayland" - -#~ msgid "" -#~ "Unable to add virtual displays on this machine. xdg-desktop-portal is " -#~ "required." -#~ msgstr "无法增加模拟显示。需要安装xdg-desktop-portal" - -#~ msgid "Fast SBS mode switching" -#~ msgstr "快速并排模式切换" - -#~ msgid "" -#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen " -#~ "mode is on. May cause instability." -#~ msgstr "" -#~ "连接时,如果宽屏模式开启,眼镜会立即切换到 并排模式。这可能会导致不稳定。" - -#~ msgid "Set Unfocused Displays Distance" -#~ msgstr "设定非注视中屏幕距离" - -#~ msgid "Widescreen mode" -#~ msgstr "宽屏模式" - -#~ msgid "" -#~ "Closer appears larger, further appears smaller. Controls depth when in " -#~ "widescreen mode." -#~ msgstr "距离近看起来大,距离远看起来小。调整使用宽屏模式时的深度。" - -#~ msgid "" -#~ "Combine with display distance to achieve a comfortable level of depth and " -#~ "size." -#~ msgstr "可以跟显示距离一起配合来实现舒适的深度和大小。" - -#~ msgid "Display toggle distances" -#~ msgstr "显示切换距离" - -#~ msgid "" -#~ "Use the buttons to capture the current display distance for use with the " -#~ "keyboard shortcut." -#~ msgstr "使用按钮记住当时的显示距离,以设成键盘快捷键。" - -#~ msgid "Display distance shortcut" -#~ msgstr "显示距离快捷键" - -#~ msgid "Quickly toggle between two predefined distances." -#~ msgstr "快速地在两个预定的距离之间切换。" - -#~ msgid "Start in widescreen mode" -#~ msgstr "使用宽屏模式以启动软件" - -#~ msgid "Widescreen mode is not supported for all glasses." -#~ msgstr "宽屏模式不支援每一个型号的XR眼睛" diff --git a/ui/src/__init__.py b/ui/src/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/ui/src/breezydesktop.gresource.xml b/ui/src/breezydesktop.gresource.xml deleted file mode 100644 index 4b17392..0000000 --- a/ui/src/breezydesktop.gresource.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - gtk/connected-device.ui - gtk/custom-resolution-dialog.ui - gtk/custom-resolution-dialog-content.ui - gtk/display-distance-dialog.ui - gtk/display-distance-dialog-content.ui - gtk/failed-verification.ui - gtk/license-dialog.ui - gtk/license-dialog-content.ui - gtk/no-device.ui - gtk/no-driver.ui - gtk/no-extension.ui - gtk/no-license.ui - gtk/shortcut-dialog.ui - gtk/virtual-display-row.ui - gtk/window.ui - - diff --git a/ui/src/breezydesktop.in b/ui/src/breezydesktop.in deleted file mode 100755 index f7446da..0000000 --- a/ui/src/breezydesktop.in +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python3 - -# breezydesktop.in -# -# Copyright 2024 Unknown -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# SPDX-License-Identifier: GPL-3.0-or-later - -import os -import sys - -xdg_data_home = os.getenv('XDG_DATA_HOME', os.path.join(os.path.expanduser('~'), '.local', 'share')) -appdir = os.getenv('APPDIR', xdg_data_home) -locale_dir = os.path.join(appdir, 'locale') -pkgdatadir = os.path.join(appdir, 'breezydesktop') -sys.path.insert(1, pkgdatadir) - -lib_dir = os.path.join(pkgdatadir, 'breezydesktop', 'lib') -sys.path.insert(0, lib_dir) - -import signal -import locale -import gettext - -VERSION = '@VERSION@' - -signal.signal(signal.SIGINT, signal.SIG_DFL) -locale.textdomain('breezydesktop') -locale.setlocale(locale.LC_ALL, locale.getlocale()) -locale.bindtextdomain('breezydesktop', locale_dir) -gettext.install('breezydesktop', locale_dir) -gettext.bindtextdomain('breezydesktop', locale_dir) -gettext.textdomain('breezydesktop') - -if __name__ == '__main__': - import gi - - from gi.repository import Gio - resource = Gio.Resource.load(os.path.join(pkgdatadir, 'breezydesktop.gresource')) - resource._register() - - from breezydesktop import main - sys.exit(main.main(VERSION)) diff --git a/ui/src/configmanager.py b/ui/src/configmanager.py deleted file mode 100644 index 5f2531a..0000000 --- a/ui/src/configmanager.py +++ /dev/null @@ -1,193 +0,0 @@ -import sys -from gi.repository import GObject, GLib -from .xrdriveripc import XRDriverIPC - -class ConfigManager(GObject.GObject): - __gproperties__ = { - 'breezy-desktop-enabled': (bool, 'Breezy Desktop Enabled', 'Whether Breezy Desktop is enabled', False, GObject.ParamFlags.READWRITE), - 'multi-tap-enabled': (bool, 'Multi-Tap Enabled', 'Whether Multi-Tap is enabled', False, GObject.ParamFlags.READWRITE), - 'follow-track-roll': (bool, 'Follow Track Roll', 'Whether to follow on the roll axis', False, GObject.ParamFlags.READWRITE), - 'follow-track-pitch': (bool, 'Follow Track Pitch', 'Whether to follow on the pitch axis', True, GObject.ParamFlags.READWRITE), - 'follow-track-yaw': (bool, 'Follow Track Yaw', 'Whether to follow on the yaw axis', True, GObject.ParamFlags.READWRITE), - 'dead-zone-threshold-deg': ( - float, - 'Dead Zone Threshold (deg)', - 'IMU dead-zone threshold in degrees (0.0 disables)', - 0.0, 5.0, 0.0, - GObject.ParamFlags.READWRITE, - ), - 'neck-saver-horizontal-multiplier': ( - float, - 'Neck Saver Horizontal Multiplier', - 'Multiplier to reduce horizontal head movement', - 1.0, 2.5, 1.0, - GObject.ParamFlags.READWRITE, - ), - 'neck-saver-vertical-multiplier': ( - float, - 'Neck Saver Vertical Multiplier', - 'Multiplier to reduce vertical head movement', - 1.0, 2.5, 1.0, - GObject.ParamFlags.READWRITE, - ) - } - - _instance = None - - @staticmethod - def get_instance(): - if not ConfigManager._instance: - ConfigManager._instance = ConfigManager() - - return ConfigManager._instance - - @staticmethod - def destroy_instance(): - if ConfigManager._instance: - ConfigManager._instance.stop() - ConfigManager._instance = None - - def __init__(self): - GObject.GObject.__init__(self) - self.ipc = XRDriverIPC.get_instance() - self.breezy_desktop_enabled = None - self.multi_tap_enabled = None - self.follow_track_roll = None - self.follow_track_pitch = None - self.follow_track_yaw = None - self.dead_zone_threshold_deg = None - self.neck_saver_horizontal_multiplier = None - self.neck_saver_vertical_multiplier = None - self._running = True - self._refresh_source_id = None - self._refresh_config() - self._refresh_source_id = GLib.timeout_add_seconds(1, self._refresh_config) - - def stop(self): - self._running = False - if self._refresh_source_id is not None: - GLib.source_remove(self._refresh_source_id) - self._refresh_source_id = None - - def _refresh_config(self): - self.config = self.ipc.retrieve_config(False) - if self._is_breezy_desktop_enabled() != self.breezy_desktop_enabled: - self.set_property('breezy-desktop-enabled', self._is_breezy_desktop_enabled()) - - if self.config['multi_tap_enabled'] != self.multi_tap_enabled: - self.set_property('multi-tap-enabled', self.config['multi_tap_enabled']) - - if self.config['smooth_follow_track_roll'] != self.follow_track_roll: - self.set_property('follow-track-roll', self.config['smooth_follow_track_roll']) - - if self.config['smooth_follow_track_pitch'] != self.follow_track_pitch: - self.set_property('follow-track-pitch', self.config['smooth_follow_track_pitch']) - - if self.config['smooth_follow_track_yaw'] != self.follow_track_yaw: - self.set_property('follow-track-yaw', self.config['smooth_follow_track_yaw']) - - if self.config['dead_zone_threshold_deg'] != self.dead_zone_threshold_deg: - self.set_property('dead-zone-threshold-deg', self.config['dead_zone_threshold_deg']) - - if self.config['neck_saver_horizontal_multiplier'] != self.neck_saver_horizontal_multiplier: - self.set_property('neck-saver-horizontal-multiplier', self.config['neck_saver_horizontal_multiplier']) - - if self.config['neck_saver_vertical_multiplier'] != self.neck_saver_vertical_multiplier: - self.set_property('neck-saver-vertical-multiplier', self.config['neck_saver_vertical_multiplier']) - - return self._running - - def _is_breezy_desktop_enabled(self): - return self.config.get('disabled') == False and 'breezy_desktop' in self.config.get('external_mode', []) - - def _set_breezy_desktop_enabled(self, value): - if value: - self.config['disabled'] = False - self.config['output_mode'] = 'external_only' - self.config['external_mode'] = ['breezy_desktop'] - else: - self.config['external_mode'] = [] - - self.ipc.write_config(self.config) - self.breezy_desktop_enabled = value - - def _set_multi_tap_enabled(self, value): - if self.multi_tap_enabled != value: - self.config['multi_tap_enabled'] = value - self.ipc.write_config(self.config) - self.multi_tap_enabled = value - - def _set_follow_track_roll(self, value): - if self.follow_track_roll != value: - self.config['smooth_follow_track_roll'] = value - self.ipc.write_config(self.config) - self.follow_track_roll = value - - def _set_follow_track_pitch(self, value): - if self.follow_track_pitch != value: - self.config['smooth_follow_track_pitch'] = value - self.ipc.write_config(self.config) - self.follow_track_pitch = value - - def _set_follow_track_yaw(self, value): - if self.follow_track_yaw != value: - self.config['smooth_follow_track_yaw'] = value - self.ipc.write_config(self.config) - self.follow_track_yaw = value - - def _set_dead_zone_threshold_deg(self, value): - value = round(min(5.0, max(0.0, float(value))), 2) - if self.dead_zone_threshold_deg != value: - self.config['dead_zone_threshold_deg'] = value - self.ipc.write_config(self.config) - self.dead_zone_threshold_deg = value - - def _set_neck_saver_horizontal_multiplier(self, value): - value = round(min(2.5, max(1.0, float(value))), 2) - if self.neck_saver_horizontal_multiplier != value: - self.config['neck_saver_horizontal_multiplier'] = value - self.ipc.write_config(self.config) - self.neck_saver_horizontal_multiplier = value - - def _set_neck_saver_vertical_multiplier(self, value): - value = round(min(2.5, max(1.0, float(value))), 2) - if self.neck_saver_vertical_multiplier != value: - self.config['neck_saver_vertical_multiplier'] = value - self.ipc.write_config(self.config) - self.neck_saver_vertical_multiplier = value - - def do_set_property(self, prop, value): - if prop.name == 'breezy-desktop-enabled': - self._set_breezy_desktop_enabled(value) - elif prop.name == 'multi-tap-enabled': - self._set_multi_tap_enabled(value) - elif prop.name == 'follow-track-roll': - self._set_follow_track_roll(value) - elif prop.name == 'follow-track-pitch': - self._set_follow_track_pitch(value) - elif prop.name == 'follow-track-yaw': - self._set_follow_track_yaw(value) - elif prop.name == 'dead-zone-threshold-deg': - self._set_dead_zone_threshold_deg(value) - elif prop.name == 'neck-saver-horizontal-multiplier': - self._set_neck_saver_horizontal_multiplier(value) - elif prop.name == 'neck-saver-vertical-multiplier': - self._set_neck_saver_vertical_multiplier(value) - - def do_get_property(self, prop): - if prop.name == 'breezy-desktop-enabled': - return self.breezy_desktop_enabled - elif prop.name == 'multi-tap-enabled': - return self.multi_tap_enabled - elif prop.name == 'follow-track-roll': - return self.follow_track_roll - elif prop.name == 'follow-track-pitch': - return self.follow_track_pitch - elif prop.name == 'follow-track-yaw': - return self.follow_track_yaw - elif prop.name == 'dead-zone-threshold-deg': - return self.dead_zone_threshold_deg - elif prop.name == 'neck-saver-horizontal-multiplier': - return self.neck_saver_horizontal_multiplier - elif prop.name == 'neck-saver-vertical-multiplier': - return self.neck_saver_vertical_multiplier \ No newline at end of file diff --git a/ui/src/connecteddevice.py b/ui/src/connecteddevice.py deleted file mode 100644 index a76570a..0000000 --- a/ui/src/connecteddevice.py +++ /dev/null @@ -1,491 +0,0 @@ -from gi.repository import Gio, GLib, Gtk, GObject -from .configmanager import ConfigManager -from .customresolutiondialog import CustomResolutionDialog -from .displaydistancedialog import DisplayDistanceDialog -from .files import get_state_dir -from .license import BREEZY_GNOME_FEATURES -from .runtimeenvironment import RuntimeEnvironment -from .settingsmanager import SettingsManager -from .shortcutdialog import bind_shortcut_settings -from .statemanager import StateManager -from .virtualdisplayrow import VirtualDisplayRow -from .xrdriveripc import XRDriverIPC - -import gettext -import json -import logging -import os -from pathlib import Path - -_ = gettext.gettext -logger = logging.getLogger('breezy_ui') - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/connected-device.ui') -class ConnectedDevice(Gtk.Box): - __gtype_name__ = "ConnectedDevice" - - widescreen_mode_subtitle = _("Switches your glasses into side-by-side mode and doubles the width of the display.") - widescreen_mode_not_supported_subtitle = _("This feature is not currently supported for your device.") - - device_label = Gtk.Template.Child() - effect_enable_switch = Gtk.Template.Child() - disable_physical_displays_switch = Gtk.Template.Child() - display_zoom_on_focus_switch = Gtk.Template.Child() - display_size_scale = Gtk.Template.Child() - display_size_adjustment = Gtk.Template.Child() - follow_threshold_scale = Gtk.Template.Child() - follow_threshold_adjustment = Gtk.Template.Child() - follow_mode_switch = Gtk.Template.Child() - curved_display_switch = Gtk.Template.Child() - top_features_group = Gtk.Template.Child() - virtual_displays_row = Gtk.Template.Child() - add_virtual_display_menu = Gtk.Template.Child() - add_virtual_display_button = Gtk.Template.Child() - remove_custom_resolution_button = Gtk.Template.Child() - launch_display_settings_row = Gtk.Template.Child() - launch_display_settings_button = Gtk.Template.Child() - all_displays_distance_label = Gtk.Template.Child() - change_all_displays_distance_button = Gtk.Template.Child() - focused_display_distance_label = Gtk.Template.Child() - change_focused_display_distance_button = Gtk.Template.Child() - reassign_toggle_xr_effect_shortcut_button = Gtk.Template.Child() - toggle_xr_effect_shortcut_label = Gtk.Template.Child() - reassign_recenter_display_shortcut_button = Gtk.Template.Child() - recenter_display_shortcut_label = Gtk.Template.Child() - reassign_toggle_display_distance_shortcut_button = Gtk.Template.Child() - toggle_display_distance_shortcut_label = Gtk.Template.Child() - reassign_toggle_follow_shortcut_button = Gtk.Template.Child() - toggle_follow_shortcut_label = Gtk.Template.Child() - reassign_cursor_to_focused_display_shortcut_button = Gtk.Template.Child() - cursor_to_focused_display_shortcut_label = Gtk.Template.Child() - headset_display_as_viewport_center_switch = Gtk.Template.Child() - headset_as_primary_switch = Gtk.Template.Child() - remove_virtual_displays_on_disable_switch = Gtk.Template.Child() - use_optimal_monitor_config_switch = Gtk.Template.Child() - use_highest_refresh_rate_switch = Gtk.Template.Child() - movement_look_ahead_scale = Gtk.Template.Child() - movement_look_ahead_adjustment = Gtk.Template.Child() - text_scaling_scale = Gtk.Template.Child() - text_scaling_adjustment = Gtk.Template.Child() - neck_saver_horizontal_scale = Gtk.Template.Child() - neck_saver_horizontal_adjustment = Gtk.Template.Child() - neck_saver_vertical_scale = Gtk.Template.Child() - neck_saver_vertical_adjustment = Gtk.Template.Child() - dead_zone_threshold_scale = Gtk.Template.Child() - dead_zone_threshold_adjustment = Gtk.Template.Child() - enable_multi_tap_switch = Gtk.Template.Child() - legacy_follow_mode_switch = Gtk.Template.Child() - follow_track_yaw_switch = Gtk.Template.Child() - follow_track_pitch_switch = Gtk.Template.Child() - follow_track_roll_switch = Gtk.Template.Child() - monitor_wrapping_scheme_menu = Gtk.Template.Child() - monitor_spacing_scale = Gtk.Template.Child() - monitor_spacing_adjustment = Gtk.Template.Child() - viewport_offset_x_scale = Gtk.Template.Child() - viewport_offset_x_adjustment = Gtk.Template.Child() - viewport_offset_y_scale = Gtk.Template.Child() - viewport_offset_y_adjustment = Gtk.Template.Child() - units_menu = Gtk.Template.Child() - - def __init__(self): - super(Gtk.Box, self).__init__() - self.init_template() - self.active = True - self.all_enabled_state_inputs = [ - self.display_zoom_on_focus_switch, - self.display_size_scale, - self.follow_mode_switch, - self.follow_threshold_scale, - self.curved_display_switch, - self.add_virtual_display_menu, - self.add_virtual_display_button, - self.change_all_displays_distance_button, - self.change_focused_display_distance_button, - self.movement_look_ahead_scale, - self.monitor_wrapping_scheme_menu, - self.monitor_spacing_scale, - self.viewport_offset_x_scale, - self.viewport_offset_y_scale, - self.neck_saver_horizontal_scale, - self.neck_saver_vertical_scale - ] - - self.settings = SettingsManager.get_instance().settings - self.desktop_settings = SettingsManager.get_instance().desktop_settings - self.ipc = XRDriverIPC.get_instance() - self.runtime = RuntimeEnvironment.get_instance() - self.virtual_display_manager = self.runtime.virtual_display_manager - - self.settings.bind('disable-physical-displays', self.disable_physical_displays_switch, 'active', Gio.SettingsBindFlags.DEFAULT) - self.settings.connect('changed::display-distance', self._handle_display_distance) - self.settings.bind('display-size', self.display_size_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('follow-threshold', self.follow_threshold_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT) - # self.settings.bind('widescreen-mode', self.widescreen_mode_switch, 'active', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('curved-display', self.curved_display_switch, 'active', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('headset-display-as-viewport-center', self.headset_display_as_viewport_center_switch, 'active', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('headset-as-primary', self.headset_as_primary_switch, 'active', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('remove-virtual-displays-on-disable', self.remove_virtual_displays_on_disable_switch, 'active', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('use-optimal-monitor-config', self.use_optimal_monitor_config_switch, 'active', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('use-highest-refresh-rate', self.use_highest_refresh_rate_switch, 'active', Gio.SettingsBindFlags.DEFAULT) - # self.settings.bind('fast-sbs-mode-switching', self.fast_sbs_mode_switch, 'active', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('look-ahead-override', self.movement_look_ahead_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('legacy-follow-mode', self.legacy_follow_mode_switch, 'active', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('monitor-spacing', self.monitor_spacing_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('viewport-offset-x', self.viewport_offset_x_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('viewport-offset-y', self.viewport_offset_y_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT) - self.settings.connect('changed::monitor-wrapping-scheme', self._handle_monitor_wrapping_scheme_setting_changed) - self.desktop_settings.bind('text-scaling-factor', self.text_scaling_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT) - self.display_zoom_on_focus_switch.connect('notify::active', self._handle_zoom_on_focus_switch_changed) - self.monitor_wrapping_scheme_menu.connect('changed', self._handle_monitor_wrapping_scheme_menu_changed) - self._handle_monitor_wrapping_scheme_setting_changed(self.settings, self.settings.get_string('monitor-wrapping-scheme')) - - current_units = self.settings.get_string('units') - self.units_menu.set_active_id(current_units) - self.units_menu.connect('changed', self._handle_units_menu_changed) - - bind_shortcut_settings(self.get_parent(), [ - [self.reassign_toggle_xr_effect_shortcut_button, self.toggle_xr_effect_shortcut_label], - [self.reassign_recenter_display_shortcut_button, self.recenter_display_shortcut_label], - [self.reassign_toggle_display_distance_shortcut_button, self.toggle_display_distance_shortcut_label], - [self.reassign_toggle_follow_shortcut_button, self.toggle_follow_shortcut_label], - [self.reassign_cursor_to_focused_display_shortcut_button, self.cursor_to_focused_display_shortcut_label] - ]) - - self.change_focused_display_distance_button.connect('clicked', - self._on_display_distance_preset_change_button_clicked, - 'toggle-display-distance-start', - self._on_set_focused_display_distance, - _('Set Focused Display Distance'), - _('Use a closer value so the display zooms in when you look at it.'), - 0.2, 1.0 - ) - self.change_all_displays_distance_button.connect('clicked', - self._on_display_distance_preset_change_button_clicked, - 'toggle-display-distance-end', - self._on_set_all_displays_distance, - _('Set All Displays Distance'), - _('Use a farther value so the displays are zoomed out when you look away.'), - 1.0, 2.5 - ) - self._set_all_displays_distance(self.settings.get_double('toggle-display-distance-end')) - self._set_focused_display_distance(self.settings.get_double('toggle-display-distance-start')) - - self.add_virtual_display_menu.set_active_id('create_1080p_display') - self.add_virtual_display_button.connect('clicked', self._on_add_virtual_display) - self.launch_display_settings_button.connect('clicked', self._launch_display_settings) - - self.state_manager = StateManager.get_instance() - self.state_manager.bind_property('follow-mode', self.follow_mode_switch, 'active', GObject.BindingFlags.DEFAULT) - self.state_manager.connect('notify::enabled-features-list', self._handle_enabled_features) - self.state_manager.connect('notify::device-supports-sbs', self._handle_device_supports_sbs) - - self.follow_mode_switch.set_active(self.state_manager.get_property('follow-mode')) - self.follow_mode_switch.connect('notify::active', self._refresh_follow_mode) - self.effect_enable_switch.connect('notify::active', self._handle_switch_enabled_state) - - self.state_manager.connect('notify::connected-device-full-size-cm', self._handle_metric_change) - self.state_manager.connect('notify::connected-device-full-distance-cm', self._handle_metric_change) - self.settings.connect('changed::units', self._handle_units_changed) - - self.config_manager = ConfigManager.get_instance() - self.config_manager.connect('notify::breezy-desktop-enabled', self._handle_enabled_config) - self._bind_switch_to_config(self.enable_multi_tap_switch, 'multi-tap-enabled') - self._bind_switch_to_config(self.follow_track_roll_switch, 'follow-track-roll') - self._bind_switch_to_config(self.follow_track_pitch_switch, 'follow-track-pitch') - self._bind_switch_to_config(self.follow_track_yaw_switch, 'follow-track-yaw') - self._bind_scale_to_config(self.dead_zone_threshold_adjustment, 'dead-zone-threshold-deg') - self._bind_scale_to_config(self.neck_saver_horizontal_adjustment, 'neck-saver-horizontal-multiplier') - self._bind_scale_to_config(self.neck_saver_vertical_adjustment, 'neck-saver-vertical-multiplier') - - self.use_optimal_monitor_config_switch.connect('notify::active', self._refresh_use_optimal_monitor_config) - - self._handle_switch_enabled_state(self.effect_enable_switch, None) - self._handle_display_distance(self.settings, self.settings.get_double('display-distance')) - self._handle_enabled_features(self.state_manager, None) - self._handle_device_supports_sbs(self.state_manager, None) - self._handle_enabled_config(None, None) - self._refresh_use_optimal_monitor_config(self.use_optimal_monitor_config_switch, None) - self.runtime.connect('notify::breezy-enabled', self._handle_enabled_config) - - self._settings_displays_app_info = None - - for appinfo in Gio.AppInfo.get_all(): - if appinfo.get_id() == 'gnome-display-panel.desktop': - self._settings_displays_app_info = appinfo - break - - self.virtual_display_manager.connect('notify::displays', self._on_virtual_displays_update) - self.add_virtual_display_menu.connect('changed', self._on_add_virtual_display_menu_changed) - self.remove_custom_resolution_button.connect('clicked', self._on_custom_resolution_option_remove) - self._on_virtual_displays_update(self.virtual_display_manager, None) - self.virtual_displays_by_pid = {} - - self._default_resolution_options_count = 2 - self._custom_resolution_options = [] - self._custom_resolutions_file_path = Path(os.path.join(get_state_dir(), 'custom_resolutions.json')) - self._load_custom_resolutions() - for id in self._custom_resolution_options: - self.add_virtual_display_menu.insert(self._default_resolution_options_count, id, id) - - def _bind_scale_to_config(self, scale, config_key): - self.config_manager.bind_property(config_key, scale, 'value', Gio.SettingsBindFlags.DEFAULT) - scale.set_value(self.config_manager.get_property(config_key)) - scale.connect('value-changed', lambda widget: self.config_manager.set_property(config_key, widget.get_value())) - - def _bind_switch_to_config(self, switch, config_key): - self.config_manager.bind_property(config_key, switch, 'active', Gio.SettingsBindFlags.DEFAULT) - switch.set_active(self.config_manager.get_property(config_key)) - switch.connect('notify::active', lambda widget, param: self.config_manager.set_property(config_key, widget.get_active())) - - def _handle_zoom_on_focus_switch_changed(self, widget, param): - display_distance = self.settings.get_double('display-distance') - toggle_display_distance_end = self.settings.get_double('toggle-display-distance-end') - toggle_display_distance_start = self.settings.get_double('toggle-display-distance-start') - is_zoom_on_focus_already_enabled = display_distance < toggle_display_distance_end - if widget.get_active() and not is_zoom_on_focus_already_enabled: - self.settings.set_double('display-distance', toggle_display_distance_start) - elif not widget.get_active() and is_zoom_on_focus_already_enabled: - self.settings.set_double('display-distance', toggle_display_distance_end) - - def _handle_units_menu_changed(self, widget): - active_id = widget.get_active_id() or 'cm' - self.settings.set_string('units', active_id) - - def _handle_units_changed(self, *args): - self._set_all_displays_distance(self.settings.get_double('toggle-display-distance-end')) - self._set_focused_display_distance(self.settings.get_double('toggle-display-distance-start')) - - def _handle_metric_change(self, *args): - self._set_all_displays_distance(self.settings.get_double('toggle-display-distance-end')) - self._set_focused_display_distance(self.settings.get_double('toggle-display-distance-start')) - - def _handle_monitor_wrapping_scheme_setting_changed(self, settings, val): - self.monitor_wrapping_scheme_menu.set_active_id(val) - - def _handle_monitor_wrapping_scheme_menu_changed(self, widget): - self.settings.set_string('monitor-wrapping-scheme', widget.get_active_id()) - - def _handle_enabled_features(self, state_manager, val): - enabled_breezy_features = [feature for feature in state_manager.get_property('enabled-features-list') if feature in BREEZY_GNOME_FEATURES] - breezy_features_granted = len(enabled_breezy_features) > 0 - if not breezy_features_granted: - self.effect_enable_switch.set_active(False) - self.effect_enable_switch.set_sensitive(breezy_features_granted) - - def _handle_device_supports_sbs(self, state_manager, val): - if not state_manager.get_property('device-supports-sbs'): - self.settings.set_boolean('widescreen-mode', False) - # self.widescreen_mode_switch.set_sensitive(state_manager.get_property('device-supports-sbs')) - # subtitle = self.widescreen_mode_subtitle if state_manager.get_property('device-supports-sbs') else self.widescreen_mode_not_supported_subtitle - # self.widescreen_mode_row.set_subtitle(subtitle) - - def _handle_enabled_config(self, object, val): - enabled = self.config_manager.get_property('breezy-desktop-enabled') and self.runtime.get_property('breezy-enabled') - if enabled != self.effect_enable_switch.get_active(): - self.effect_enable_switch.set_active(enabled) - - def _handle_switch_enabled_state(self, switch, param): - GLib.idle_add(self._handle_switch_enabled_state_gui, switch, param) - - def _handle_switch_enabled_state_gui(self, switch, param): - requesting_enabled = switch.get_active() - - # never turn off the extension, disabling the effect is done via configs only - if requesting_enabled: - self.runtime.set_property('breezy-enabled', True) - - self.config_manager.set_property('breezy-desktop-enabled', requesting_enabled) - - for widget in self.all_enabled_state_inputs: - widget.set_sensitive(requesting_enabled) - - if not self.runtime.is_virtual_display_supported(): - self.virtual_displays_row.set_subtitle( - _("Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, and the pipewire GStreamer plugin are required.")) - self.add_virtual_display_button.set_sensitive(False) - self.add_virtual_display_menu.set_sensitive(False) - - if requesting_enabled: - self._refresh_follow_mode(self.follow_mode_switch, None) - - def _refresh_follow_mode(self, switch, param): - if (self.state_manager.get_property('follow-mode') == switch.get_active()): - return - - self.ipc.write_control_flags({ - 'enable_breezy_desktop_smooth_follow': switch.get_active() - }) - - def _refresh_use_optimal_monitor_config(self, switch, param): - self.headset_as_primary_switch.set_sensitive(switch.get_active()) - self.use_highest_refresh_rate_switch.set_sensitive(switch.get_active()) - if not switch.get_active(): - self.headset_as_primary_switch.set_active(False) - self.use_highest_refresh_rate_switch.set_active(False) - - def set_device_name(self, name): - self.device_label.set_markup(f"{name}") - - def _handle_display_distance(self, *args): - display_distance = self.settings.get_double('display-distance') - toggle_display_distance_end = self.settings.get_double('toggle-display-distance-end') - - should_zoom_on_focus_be_enabled = display_distance < toggle_display_distance_end - if self.display_zoom_on_focus_switch.get_active() != should_zoom_on_focus_be_enabled: - self.display_zoom_on_focus_switch.set_active(should_zoom_on_focus_be_enabled) - - def _set_focused_display_distance(self, distance): - self.focused_display_distance_label.set_markup(f"{_('Focused display')}: {self._format_distance(distance)}") - self.settings.set_double('toggle-display-distance-start', distance) - - self.display_zoom_on_focus_switch.set_sensitive(distance != self.settings.get_double('toggle-display-distance-end')) - - def _set_all_displays_distance(self, distance): - self.all_displays_distance_label.set_markup(f"{_('All displays')}: {self._format_distance(distance)}") - self.settings.set_double('toggle-display-distance-end', distance) - self.display_zoom_on_focus_switch.set_active(False) - self.display_zoom_on_focus_switch.set_sensitive(distance != self.settings.get_double('toggle-display-distance-start')) - - def _get_units(self): - units = self.settings.get_string('units') - return units if units in ['cm', 'in'] else 'cm' - - def _format_distance(self, normalized): - sm = getattr(self, 'state_manager', None) or StateManager.get_instance() - full_cm = float(sm.get_property('connected-device-full-distance-cm') or 0.0) - if full_cm <= 0: - # Fallback to normalized display if metric unknown - return f"{round(normalized, 2)}" - cm = normalized * full_cm - if self._get_units() == 'in': - inches = cm / 2.54 - return f"{inches:.2f} in" - return f"{cm:.1f} cm" - - def _on_display_distance_preset_change_button_clicked(self, widget, settings_key, on_save_callback, title, subtitle, lower_limit, upper_limit): - dialog = DisplayDistanceDialog(settings_key, on_save_callback, title, subtitle, lower_limit, upper_limit) - dialog.set_transient_for(widget.get_ancestor(Gtk.Window)) - dialog.present() - - def _on_set_all_displays_distance(self, prev_distance, distance): - focused_display_distance = self.settings.get_double('toggle-display-distance-start') - if (distance < focused_display_distance): - self._set_focused_display_distance(distance) - - all_displays_distance = self.settings.get_double('toggle-display-distance-end') - self._set_all_displays_distance(distance) - - # if we were at the unfocused distance, put us at the new unfocused distance - if prev_distance == all_displays_distance: - self.settings.set_double('display-distance', distance) - - def _on_set_focused_display_distance(self, prev_distance, distance): - all_displays_distance = self.settings.get_double('toggle-display-distance-end') - if (distance > all_displays_distance): - self._set_all_displays_distance(distance) - - focused_display_distance = self.settings.get_double('toggle-display-distance-start') - self._set_focused_display_distance(distance) - - # if we were at the focused distance, put us at the new focused distance - if prev_distance == focused_display_distance: - self.settings.set_double('display-distance', distance) - - def _save_custom_resolutions(self): - with open(self._custom_resolutions_file_path, 'w') as f: - json.dump(self._custom_resolution_options, f) - - def _load_custom_resolutions(self): - if self._custom_resolutions_file_path.exists(): - try: - with open(self._custom_resolutions_file_path, 'r') as f: - self._custom_resolution_options = json.load(f) - except Exception: - self._custom_resolution_options = [] - - def _on_add_virtual_display(self, *args): - resolution = self.add_virtual_display_menu.get_active_id() - - if resolution == 'create_1080p_display': - width = 1920 - height = 1080 - elif resolution == 'create_1440p_display': - width = 2560 - height = 1440 - else: - width, height = resolution.split('x') - width = int(width) - height = int(height) - - logger.info(f"Adding virtual display {resolution}") - self.virtual_display_manager.create_virtual_display(width, height, 60) - - def _on_custom_resolution_dialog_add(self, width, height): - width = int(round(width)) - height = int(round(height)) - - id = f"{width}x{height}" - self._custom_resolution_options.append(id) - self._save_custom_resolutions() - - self.add_virtual_display_menu.insert(self._default_resolution_options_count, id, id) - self.add_virtual_display_menu.set_active_id(id) - self._on_add_virtual_display_menu_changed(self.add_virtual_display_menu) - - def _on_add_virtual_display_menu_changed(self, widget): - resolution = widget.get_active_id() - self.remove_custom_resolution_button.set_visible(resolution in self._custom_resolution_options) - - add_custom_resolution_option = resolution == 'add_custom_resolution' - self.add_virtual_display_button.set_sensitive(not add_custom_resolution_option) - - if add_custom_resolution_option: - dialog = CustomResolutionDialog(self._on_custom_resolution_dialog_add) - dialog.set_transient_for(self.get_ancestor(Gtk.Window)) - dialog.present() - - def _on_custom_resolution_option_remove(self, *args): - resolution = self.add_virtual_display_menu.get_active_id() - - for custom_resolution_option in self._custom_resolution_options: - self.add_virtual_display_menu.remove(self._default_resolution_options_count) - - self._custom_resolution_options.remove(resolution) - self._save_custom_resolutions() - - for id in self._custom_resolution_options: - self.add_virtual_display_menu.insert(self._default_resolution_options_count, id, id) - - self.add_virtual_display_menu.set_active_id('create_1080p_display') - self._on_add_virtual_display_menu_changed(self.add_virtual_display_menu) - - def _on_virtual_displays_update(self, virtual_display_manager, val): - GLib.idle_add(self._on_virtual_displays_update_gui, virtual_display_manager) - - def _on_virtual_displays_update_gui(self, virtual_display_manager): - effect_enabled = self.effect_enable_switch.get_active() - virtual_displays_present = len(virtual_display_manager.displays) > 0 - self.monitor_wrapping_scheme_menu.set_sensitive(effect_enabled and virtual_displays_present) - self.monitor_spacing_scale.set_sensitive(effect_enabled and virtual_displays_present) - - self.top_features_group.remove(self.launch_display_settings_row) - for pid, child in self.virtual_displays_by_pid.items(): - self.top_features_group.remove(child) - - self.top_features_group.add(self.launch_display_settings_row) - self.launch_display_settings_row.set_visible( - self._settings_displays_app_info is not None and virtual_displays_present - ) - - new_displays_by_pid = {} - for display in virtual_display_manager.displays: - child = self.virtual_displays_by_pid.get( - display['pid'], - VirtualDisplayRow(display['pid'], display['width'], display['height'], 60)) - self.top_features_group.add(child) - new_displays_by_pid[display['pid']] = child - - self.virtual_displays_by_pid = new_displays_by_pid - - def _launch_display_settings(self, *args): - self._settings_displays_app_info.launch() diff --git a/ui/src/customresolutiondialog.py b/ui/src/customresolutiondialog.py deleted file mode 100644 index 98ae0ef..0000000 --- a/ui/src/customresolutiondialog.py +++ /dev/null @@ -1,21 +0,0 @@ -from gi.repository import Gtk, Gio -from .customresolutiondialogcontent import CustomResolutionDialogContent - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/custom-resolution-dialog.ui') -class CustomResolutionDialog(Gtk.Dialog): - __gtype_name__ = 'CustomResolutionDialog' - - add_button = Gtk.Template.Child() - - def __init__(self, on_add_callback): - super(Gtk.Dialog, self).__init__() - self.init_template() - - self.on_add_callback = on_add_callback - - self.content = CustomResolutionDialogContent(self.add_button, self._on_add_callback) - self.get_content_area().append(self.content) - - def _on_add_callback(self, width, height): - self.on_add_callback(width, height) - self.close() \ No newline at end of file diff --git a/ui/src/customresolutiondialogcontent.py b/ui/src/customresolutiondialogcontent.py deleted file mode 100644 index 5529957..0000000 --- a/ui/src/customresolutiondialogcontent.py +++ /dev/null @@ -1,27 +0,0 @@ -from gi.repository import Gtk, Gio -from .settingsmanager import SettingsManager - -import gettext - -_ = gettext.gettext - - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/custom-resolution-dialog-content.ui') -class CustomResolutionDialogContent(Gtk.Box): - __gtype_name__ = 'CustomResolutionDialogContent' - - custom_resolution_width_scale = Gtk.Template.Child() - custom_resolution_width_adjustment = Gtk.Template.Child() - custom_resolution_height_scale = Gtk.Template.Child() - custom_resolution_height_adjustment = Gtk.Template.Child() - - def __init__(self, add_button, on_add_callback): - super(Gtk.Box, self).__init__() - self.init_template() - - self.on_add_callback = on_add_callback - - add_button.connect('clicked', self._on_add_button_clicked) - - def _on_add_button_clicked(self, button): - self.on_add_callback(self.custom_resolution_width_adjustment.get_value(), self.custom_resolution_height_adjustment.get_value()) \ No newline at end of file diff --git a/ui/src/displaydistancedialog.py b/ui/src/displaydistancedialog.py deleted file mode 100644 index e2a62a6..0000000 --- a/ui/src/displaydistancedialog.py +++ /dev/null @@ -1,22 +0,0 @@ -from gi.repository import Gtk, Gio -from .displaydistancedialogcontent import DisplayDistanceDialogContent - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/display-distance-dialog.ui') -class DisplayDistanceDialog(Gtk.Dialog): - __gtype_name__ = 'DisplayDistanceDialog' - - save_button = Gtk.Template.Child() - - def __init__(self, settings_key, on_save_callback, title, subtitle, lower_limit, upper_limit): - super(Gtk.Dialog, self).__init__() - self.init_template() - - self.on_save_callback = on_save_callback - self.set_title(title) - - self.content = DisplayDistanceDialogContent(settings_key, self.save_button, self._on_save_callback, subtitle, lower_limit, upper_limit) - self.get_content_area().append(self.content) - - def _on_save_callback(self, prev_distance, distance): - self.on_save_callback(prev_distance, distance) - self.close() \ No newline at end of file diff --git a/ui/src/displaydistancedialogcontent.py b/ui/src/displaydistancedialogcontent.py deleted file mode 100644 index 9823a59..0000000 --- a/ui/src/displaydistancedialogcontent.py +++ /dev/null @@ -1,50 +0,0 @@ -from gi.repository import Gtk, Gio -from .settingsmanager import SettingsManager -from .statemanager import StateManager - -import gettext - -_ = gettext.gettext - - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/display-distance-dialog-content.ui') -class DisplayDistanceDialogContent(Gtk.Box): - __gtype_name__ = 'DisplayDistanceDialogContent' - - display_distance_subtitle = Gtk.Template.Child() - display_distance_scale = Gtk.Template.Child() - display_distance_adjustment = Gtk.Template.Child() - - def __init__(self, settings_key, save_button, on_save_callback, subtitle, lower_limit, upper_limit): - super(Gtk.Box, self).__init__() - self.init_template() - - self.display_distance_subtitle.set_markup(f"""{subtitle}""") - - self.on_save_callback = on_save_callback - self.settings = SettingsManager.get_instance().settings - self.state_manager = StateManager.get_instance() - self.prev_distance = self.settings.get_double('display-distance') - self.display_distance_adjustment.set_value(self.settings.get_double(settings_key)) - - self.display_distance_scale.set_format_value_func(lambda scale, val: self._format_distance(val)) - self.state_manager.connect('notify::connected-device-full-distance-cm', lambda *args: self.display_distance_scale.queue_draw()) - self.settings.connect('changed::units', lambda *args: self.display_distance_scale.queue_draw()) - save_button.connect('clicked', self._on_save_button_clicked) - - def _on_save_button_clicked(self, button): - self.on_save_callback(self.prev_distance, self.display_distance_adjustment.get_value()) - - def _get_units(self): - units = self.settings.get_string('units') - return units if units in ['cm', 'in'] else 'cm' - - def _format_distance(self, normalized): - full_cm = float(self.state_manager.get_property('connected-device-full-distance-cm') or 0.0) - if full_cm <= 0: - return f"{round(normalized, 2)}" - cm = normalized * full_cm - if self._get_units() == 'in': - inches = cm / 2.54 - return f"{inches:.2f} in" - return f"{cm:.1f} cm" \ No newline at end of file diff --git a/ui/src/failedverification.py b/ui/src/failedverification.py deleted file mode 100644 index 7ee4875..0000000 --- a/ui/src/failedverification.py +++ /dev/null @@ -1,5 +0,0 @@ -from gi.repository import Gtk - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/failed-verification.ui') -class FailedVerification(Gtk.Box): - __gtype_name__ = "FailedVerification" diff --git a/ui/src/files.py b/ui/src/files.py deleted file mode 100644 index 6cf3c05..0000000 --- a/ui/src/files.py +++ /dev/null @@ -1,25 +0,0 @@ - - -import os - -def get_user_home(): - return os.path.expanduser('~') - -def get_config_dir(): - config_home = os.environ.get('XDG_CONFIG_HOME', '~/.config') - return os.path.expanduser(config_home) - -def get_state_dir(): - # imported lazily to avoid an import cycle (runtime discovery imports - # modules that import this one) - from .runtime import runtime_namespace - state_home = os.environ.get('XDG_STATE_HOME', '~/.local/state') - return os.path.join(os.path.expanduser(state_home), runtime_namespace()) - -def get_data_home(): - data_home = os.environ.get('XDG_DATA_HOME', '~/.local/share') - return os.getenv('APPDIR', os.path.expanduser(data_home)) - -def get_bin_home(): - bin_home = os.environ.get('XDG_BIN_HOME', '~/.local/bin') - return os.getenv('BINDIR', os.path.expanduser(bin_home)) \ No newline at end of file diff --git a/ui/src/gtk/connected-device.ui b/ui/src/gtk/connected-device.ui deleted file mode 100644 index 89fd925..0000000 --- a/ui/src/gtk/connected-device.ui +++ /dev/null @@ -1,948 +0,0 @@ - - - - - diff --git a/ui/src/gtk/custom-resolution-dialog-content.ui b/ui/src/gtk/custom-resolution-dialog-content.ui deleted file mode 100644 index e0625eb..0000000 --- a/ui/src/gtk/custom-resolution-dialog-content.ui +++ /dev/null @@ -1,74 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ui/src/gtk/custom-resolution-dialog.ui b/ui/src/gtk/custom-resolution-dialog.ui deleted file mode 100644 index 44408c3..0000000 --- a/ui/src/gtk/custom-resolution-dialog.ui +++ /dev/null @@ -1,18 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ui/src/gtk/display-distance-dialog-content.ui b/ui/src/gtk/display-distance-dialog-content.ui deleted file mode 100644 index 715e88d..0000000 --- a/ui/src/gtk/display-distance-dialog-content.ui +++ /dev/null @@ -1,42 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ui/src/gtk/display-distance-dialog.ui b/ui/src/gtk/display-distance-dialog.ui deleted file mode 100644 index 8bd3ee8..0000000 --- a/ui/src/gtk/display-distance-dialog.ui +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ui/src/gtk/failed-verification.ui b/ui/src/gtk/failed-verification.ui deleted file mode 100644 index 6f86597..0000000 --- a/ui/src/gtk/failed-verification.ui +++ /dev/null @@ -1,22 +0,0 @@ - - - - - diff --git a/ui/src/gtk/license-dialog-content.ui b/ui/src/gtk/license-dialog-content.ui deleted file mode 100644 index 96545c5..0000000 --- a/ui/src/gtk/license-dialog-content.ui +++ /dev/null @@ -1,55 +0,0 @@ - - - - - diff --git a/ui/src/gtk/license-dialog.ui b/ui/src/gtk/license-dialog.ui deleted file mode 100644 index bf7c6d1..0000000 --- a/ui/src/gtk/license-dialog.ui +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/ui/src/gtk/no-device.ui b/ui/src/gtk/no-device.ui deleted file mode 100644 index e41a52a..0000000 --- a/ui/src/gtk/no-device.ui +++ /dev/null @@ -1,48 +0,0 @@ - - - - - diff --git a/ui/src/gtk/no-driver.ui b/ui/src/gtk/no-driver.ui deleted file mode 100644 index c7a228c..0000000 --- a/ui/src/gtk/no-driver.ui +++ /dev/null @@ -1,27 +0,0 @@ - - - - - diff --git a/ui/src/gtk/no-extension.ui b/ui/src/gtk/no-extension.ui deleted file mode 100644 index 80ed9f8..0000000 --- a/ui/src/gtk/no-extension.ui +++ /dev/null @@ -1,22 +0,0 @@ - - - - - diff --git a/ui/src/gtk/no-license.ui b/ui/src/gtk/no-license.ui deleted file mode 100644 index 2cd3f12..0000000 --- a/ui/src/gtk/no-license.ui +++ /dev/null @@ -1,33 +0,0 @@ - - - - - diff --git a/ui/src/gtk/shortcut-dialog.ui b/ui/src/gtk/shortcut-dialog.ui deleted file mode 100644 index 85da0d4..0000000 --- a/ui/src/gtk/shortcut-dialog.ui +++ /dev/null @@ -1,29 +0,0 @@ - - - - - diff --git a/ui/src/gtk/virtual-display-row.ui b/ui/src/gtk/virtual-display-row.ui deleted file mode 100644 index acb2c2f..0000000 --- a/ui/src/gtk/virtual-display-row.ui +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ui/src/gtk/window.ui b/ui/src/gtk/window.ui deleted file mode 100644 index fec33ba..0000000 --- a/ui/src/gtk/window.ui +++ /dev/null @@ -1,152 +0,0 @@ - - - - -

-
- - License Details - app.license - - - Force Reset - app.reset_driver - - - About BreezyDesktop - app.about - -
-
- diff --git a/ui/src/license.py b/ui/src/license.py deleted file mode 100644 index 3f341b8..0000000 --- a/ui/src/license.py +++ /dev/null @@ -1,2 +0,0 @@ -BREEZY_GNOME_FEATURES = ['productivity', 'productivity_pro'] -BREEZY_GNOME_TIERS = ['productivity', 'productivity_pro'] \ No newline at end of file diff --git a/ui/src/licensedialog.py b/ui/src/licensedialog.py deleted file mode 100644 index 7c9cbc6..0000000 --- a/ui/src/licensedialog.py +++ /dev/null @@ -1,14 +0,0 @@ -from gi.repository import Gtk -from .licensedialogcontent import LicenseDialogContent - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/license-dialog.ui') -class LicenseDialog(Gtk.Dialog): - __gtype_name__ = 'LicenseDialog' - - refresh_license_button = Gtk.Template.Child() - - def __init__(self): - super(Gtk.Dialog, self).__init__() - self.init_template() - self.content = LicenseDialogContent(self.refresh_license_button) - self.get_content_area().append(self.content) \ No newline at end of file diff --git a/ui/src/licensedialogcontent.py b/ui/src/licensedialogcontent.py deleted file mode 100644 index 3b5844c..0000000 --- a/ui/src/licensedialogcontent.py +++ /dev/null @@ -1,105 +0,0 @@ -from gi.repository import Adw, Gtk, GLib -from .nolicense import NoLicense -from .statemanager import StateManager -from .licensetierrow import LicenseTierRow -from .licensefeaturerow import LicenseFeatureRow -from .license import BREEZY_GNOME_FEATURES, BREEZY_GNOME_TIERS -from .xrdriveripc import XRDriverIPC -import gettext - -_ = gettext.gettext - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/license-dialog-content.ui') -class LicenseDialogContent(Gtk.Box): - __gtype_name__ = 'LicenseDialogContent' - - tiers = Gtk.Template.Child() - features = Gtk.Template.Child() - request_token = Gtk.Template.Child() - verify_token = Gtk.Template.Child() - donation_info = Gtk.Template.Child() - - def __init__(self, refresh_license_button): - super(Gtk.Box, self).__init__() - self.init_template() - - # check if it has a set_subtitle_selectable method - if hasattr(self.donation_info, 'set_subtitle_selectable'): - self.donation_info.set_subtitle_selectable(True) - - self.refresh_license_button = refresh_license_button - self.refresh_license_button.connect('clicked', self._refresh_license) - - self.ipc = XRDriverIPC.get_instance() - StateManager.get_instance().connect('notify::license-action-needed', self._handle_license) - self._handle_license(StateManager.get_instance()) - - self.request_token.connect('apply', self._on_request_token) - self.verify_token.connect('apply', self._on_verify_token) - - self.no_license = NoLicense(hide_refresh_button = True) - - def _refresh_license(self, widget): - self.refresh_license_button.set_sensitive(False) - self.ipc.write_control_flags({'refresh_device_license': True}) - GLib.timeout_add_seconds(3, self._handle_license) - - def _handle_license(self, state_manager = None, val = None): - GLib.idle_add(self._handle_license_idle, state_manager or StateManager.get_instance()) - - def _handle_license_idle(self, state_manager): - self.refresh_license_button.set_sensitive(False) - - license_view = state_manager.state['ui_view'].get('license', {}) - self.request_token.set_visible(not state_manager.confirmed_token) - self.verify_token.set_visible(not state_manager.confirmed_token) - - for child in self.tiers: - self.tiers.remove(child) - - for child in self.features: - self.features.remove(child) - - if license_view: - allowed_tiers = set(BREEZY_GNOME_TIERS) - allowed_features = set(BREEZY_GNOME_FEATURES) - - tiers_group = Adw.PreferencesGroup(title=_("Paid Tier Status"), margin_top=20) - has_any_tier = False - for tier_name, tier_details in license_view.get('tiers', {}).items(): - if tier_name not in allowed_tiers: - continue - tiers_group.add(LicenseTierRow(tier_name, tier_details)) - has_any_tier = True - if has_any_tier: - self.tiers.append(tiers_group) - - features_group = Adw.PreferencesGroup(title=_("Feature Availability"), margin_top=20) - has_any_feature = False - for feature_name, feature_details in license_view.get('features', {}).items(): - if feature_name not in allowed_features: - continue - features_group.add(LicenseFeatureRow(feature_name, feature_details)) - has_any_feature = True - if has_any_feature: - self.features.append(features_group) - else: - self.tiers.append(self.no_license) - - self.refresh_license_button.set_sensitive(True) - - def _on_request_token(self, widget): - email_address = self.request_token.get_text() - self.request_token.set_editable(False) - if not self.ipc.request_token(email_address): - self.request_token.set_editable(True) - - def _on_verify_token(self, widget): - token = self.verify_token.get_text() - self.request_token.set_editable(False) - self.verify_token.set_editable(False) - if self.ipc.verify_token(token): - self.ipc.write_control_flags({'refresh_device_license': True}) - else: - self.request_token.set_editable(True) - self.verify_token.set_editable(True) \ No newline at end of file diff --git a/ui/src/licensefeaturerow.py b/ui/src/licensefeaturerow.py deleted file mode 100644 index 1b01c0f..0000000 --- a/ui/src/licensefeaturerow.py +++ /dev/null @@ -1,33 +0,0 @@ -from gi.repository import Adw - -from .time import time_remaining_text -import gettext - -_ = gettext.gettext - -class LicenseFeatureRow(Adw.ActionRow): - - def __init__(self, feature, feature_details): - super().__init__() - - self.set_title(self._feature_name(feature)) - - status = _('Disabled') - is_trial = feature_details.get('is_trial') == True - if feature_details.get('is_enabled') == True: - status = _('In trial') if is_trial else _('Enabled') - - details = '' - funds_needed_in_seconds = feature_details.get('funds_needed_in_seconds') - if funds_needed_in_seconds is not None and funds_needed_in_seconds > 0: - time_remaining = time_remaining_text(funds_needed_in_seconds, is_trial) - if time_remaining: details = _(" ({time_remaining} remaining)").format(time_remaining=time_remaining) - - self.set_subtitle(f"{status}{details}") - - def _feature_name(self, feature): - feature_names = { - 'productivity': lambda: _('Productivity Basic'), - 'productivity_pro': lambda: _('Productivity Pro'), - } - return feature_names[feature]() \ No newline at end of file diff --git a/ui/src/licensetierrow.py b/ui/src/licensetierrow.py deleted file mode 100644 index 153112c..0000000 --- a/ui/src/licensetierrow.py +++ /dev/null @@ -1,78 +0,0 @@ -from gi.repository import Adw, Gtk - -from .time import time_remaining_text -import gettext - -_ = gettext.gettext - -PERIOD_RANKS = { - 'monthly': 1, - 'yearly': 2, - 'lifetime': 3, -} - -class LicenseTierRow(Adw.ExpanderRow): - - def __init__(self, tier, tier_details): - super().__init__() - - self.set_title(self._tier_name(tier)) - - active_period = tier_details.get('active_period') - funds_needed_in_seconds = tier_details.get('funds_needed_in_seconds') - - status = _('Active') if active_period else _('Inactive') - details = '' - if active_period: - details += f" {self._period_description(active_period)}" - if funds_needed_in_seconds is not None and funds_needed_in_seconds > 0: - time_remaining = time_remaining_text(funds_needed_in_seconds) - if time_remaining: details += _(" ({time_remaining} remaining)").format(time_remaining=time_remaining) - if active_period == 'lifetime': - self.set_enable_expansion(False) - self.set_icon_name(None) - - self.set_expanded(False) - self.set_subtitle(f"{status}{details}") - - for period, amount in tier_details['funds_needed_by_period'].items(): - amount_text = None - if amount > 0: - amount_text = _("${amount} USD").format(amount=amount) - if active_period == period: - amount_text += _(" to renew") - elif active_period is not None: - amount_text += _(" to upgrade") - elif active_period is not None and PERIOD_RANKS[period] >= PERIOD_RANKS[active_period]: - amount_text = _("Paid through next renewal period") - - if amount_text is not None: - row_widget = Adw.ActionRow(title=self._period_name(period)) - row_widget.add_suffix(Gtk.Label(label=amount_text, use_markup=True)) - self.add_row(row_widget) - - def _tier_name(self, tier): - tier_names = { - 'productivity': _('Productivity Basic'), - 'productivity_pro': _('Productivity Pro') - } - return tier_names.get(tier) or "" - - def _period_description(self, period): - period_descriptions = { - 'monthly': _(' - renewing monthly'), - 'yearly': _(' - renewing yearly'), - 'lifetime': _('with lifetime access'), - } - - return period_descriptions[period] - - def _period_name(self, period): - period_names = { - 'monthly': _('Monthly'), - 'yearly': _('Yearly'), - 'lifetime': _('Lifetime'), - } - - return period_names[period] - diff --git a/ui/src/main.py b/ui/src/main.py deleted file mode 100644 index 3d58566..0000000 --- a/ui/src/main.py +++ /dev/null @@ -1,131 +0,0 @@ -import os -import sys -import gi -import logging -import argparse - -from logging.handlers import TimedRotatingFileHandler - -gi.require_version('Gtk', '4.0') -gi.require_version('Adw', '1') -gi.require_version('Gio', '2.0') -gi.require_version('GLib', '2.0') - -from gi.repository import Adw, Gtk, Gio, GLib -from .configmanager import ConfigManager -from .files import get_config_dir, get_state_dir -from .licensedialog import LicenseDialog -from .statemanager import StateManager -from .window import BreezydesktopWindow -from .xrdriveripc import XRDriverIPC - -log_dir = os.path.join(get_state_dir(), 'logs/ui') -os.makedirs(log_dir, exist_ok=True) - -logger = logging.getLogger('breezy_ui') -logger.setLevel(logging.INFO) -logname = os.path.join(log_dir, "breezy_desktop.log") -handler = TimedRotatingFileHandler(logname, when="midnight", backupCount=30) -handler.suffix = "%Y%m%d" -formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') -handler.setFormatter(formatter) -logger.addHandler(handler) - -def excepthook(exc_type, exc_value, exc_traceback): - logger.error('Unhandled exception', exc_info=(exc_type, exc_value, exc_traceback)) - -sys.excepthook = excepthook - -XRDriverIPC.set_instance(XRDriverIPC(logger, get_config_dir())) - -if GLib.MAJOR_VERSION * 100 + GLib.MINOR_VERSION >= 274: - APPLICATION_FLAGS = Gio.ApplicationFlags.DEFAULT_FLAGS -else: - # deprecated after Gio version 2.74 - APPLICATION_FLAGS = Gio.ApplicationFlags.FLAGS_NONE - - -class BreezydesktopApplication(Adw.Application): - """The main application singleton class.""" - - def __init__(self, version, skip_verification): - super().__init__(application_id='com.xronlinux.BreezyDesktop', - flags=APPLICATION_FLAGS) - self.version = version - - self.create_action('quit', self.on_quit_action, ['q']) - self.create_action('about', self.on_about_action) - self.create_action('license', self.on_license_action) - self.create_action('reset_driver', self.on_reset_driver_action) - self._skip_verification = skip_verification or False - - # always do this on start-up since the driver sometimes fails to update the license on boot, - # prevent showing a license warning unnecessarily - XRDriverIPC.get_instance().write_control_flags({'request_features': ['productivity', 'productivity_pro']}) - - def do_activate(self): - """Called when the application is activated. - - We raise the application's main window, creating it if - necessary. - """ - win = self.props.active_window - if not win: - win = BreezydesktopWindow(self.version, self._skip_verification, application=self) - win.connect('close-request', lambda *_: self.on_quit_action()) - win.connect('destroy', lambda *_: self.on_quit_action()) - win.present() - - def on_about_action(self, widget, _): - """Callback for the app.about action.""" - about = Gtk.AboutDialog(transient_for=self.props.active_window, - modal=True, - program_name='Breezy Desktop', - logo_icon_name='com.xronlinux.BreezyDesktop', - version=self.version, - authors=['Wayne Heaney'], - copyright='© 2026 Wayne Heaney', - license_type=Gtk.License.GPL_3_0, - wrap_license=True) - about.present() - - def on_license_action(self, widget, _): - dialog = LicenseDialog() - dialog.set_transient_for(self.props.active_window) - dialog.present() - - def on_reset_driver_action(self, widget, _): - XRDriverIPC.get_instance().reset_driver(as_user=None) - - def create_action(self, name, callback, shortcuts=None): - """Add an application action. - - Args: - name: the name of the action - callback: the function to be called when the action is - activated - shortcuts: an optional list of accelerators - """ - action = Gio.SimpleAction.new(name, None) - action.connect("activate", callback) - self.add_action(action) - if shortcuts: - self.set_accels_for_action(f"app.{name}", shortcuts) - - def on_quit_action(self, _action = None, _pspec = None): - win = self.props.active_window - if win: - win.close() - - StateManager.destroy_instance() - ConfigManager.destroy_instance() - self.quit() - - -def main(version): - parser = argparse.ArgumentParser() - parser.add_argument("-sv", "--skip-verification", action="store_true") - args = parser.parse_args() - - app = BreezydesktopApplication(version, args.skip_verification) - return app.run(None) diff --git a/ui/src/meson.build b/ui/src/meson.build deleted file mode 100644 index 5d5b4e6..0000000 --- a/ui/src/meson.build +++ /dev/null @@ -1,73 +0,0 @@ -pkgdatadir = get_option('prefix') / get_option('datadir') / meson.project_name() -moduledir = pkgdatadir / 'breezydesktop' -gnome = import('gnome') - -gnome.compile_resources('breezydesktop', - 'breezydesktop.gresource.xml', - gresource_bundle: true, - install: true, - install_dir: pkgdatadir, -) - -python = import('python') - -conf = configuration_data() -conf.set('PYTHON', python.find_installation('python3').full_path()) -conf.set('VERSION', meson.project_version()) -conf.set('localedir', get_option('prefix') / get_option('localedir')) -conf.set('pkgdatadir', pkgdatadir) - -configure_file( - input: 'breezydesktop.in', - output: 'breezydesktop', - configuration: conf, - install: true, - install_dir: get_option('bindir'), - install_mode: 'r-xr-xr-x' -) - -configure_file( - input: 'virtualdisplay.in', - output: 'virtualdisplay', - configuration: conf, - install: true, - install_dir: get_option('bindir'), - install_mode: 'r-xr-xr-x' -) - -breezydesktop_sources = [ - '../modules/PyXRLinuxDriverIPC/xrdriveripc.py', - '__init__.py', - 'configmanager.py', - 'connecteddevice.py', - 'customresolutiondialog.py', - 'customresolutiondialogcontent.py', - 'displaydistancedialog.py', - 'displaydistancedialogcontent.py', - 'failedverification.py', - 'files.py', - 'license.py', - 'licensedialog.py', - 'licensedialogcontent.py', - 'licensefeaturerow.py', - 'licensetierrow.py', - 'main.py', - 'nodevice.py', - 'nodriver.py', - 'noextension.py', - 'nolicense.py', - 'runtime.py', - 'runtimeenvironment.py', - 'settingsmanager.py', - 'shortcutdialog.py', - 'statemanager.py', - 'time.py', - 'window.py' -] - -install_data(breezydesktop_sources, install_dir: moduledir) -install_subdir('../lib', install_dir: moduledir) - -# the runtimes subpackage marker; a concrete RuntimeEnvironment implementation -# is copied in per-build by the package script (see ui/bin/package). -install_data('runtimes/__init__.py', install_dir: moduledir / 'runtimes') \ No newline at end of file diff --git a/ui/src/nodevice.py b/ui/src/nodevice.py deleted file mode 100644 index 70ea98b..0000000 --- a/ui/src/nodevice.py +++ /dev/null @@ -1,47 +0,0 @@ -from gi.repository import Gio, Gtk -from .configmanager import ConfigManager -from .runtimeenvironment import RuntimeEnvironment -from .settingsmanager import SettingsManager -from .statemanager import StateManager -from .xrdriveripc import XRDriverIPC - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/no-device.ui') -class NoDevice(Gtk.Box): - __gtype_name__ = "NoDevice" - - effect_enable_switch = Gtk.Template.Child() - disable_physical_displays_switch = Gtk.Template.Child() - # widescreen_mode_switch = Gtk.Template.Child() - - def __init__(self): - super(Gtk.Box, self).__init__() - self.init_template() - - self.ipc = XRDriverIPC.get_instance() - self.runtime = RuntimeEnvironment.get_instance() - self.settings = SettingsManager.get_instance().settings - self.config_manager = ConfigManager.get_instance() - self.config_manager.connect('notify::breezy-desktop-enabled', self._handle_enabled_config) - - self.effect_enable_switch.connect('notify::active', self._handle_switch_enabled_state) - # self.settings.bind('widescreen-mode', self.widescreen_mode_switch, 'active', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('disable-physical-displays', self.disable_physical_displays_switch, 'active', Gio.SettingsBindFlags.DEFAULT) - - self._handle_enabled_config(self.config_manager, None) - - def _handle_enabled_config(self, config_manager, val): - enabled = config_manager.get_property('breezy-desktop-enabled') and self.runtime.get_property('breezy-enabled') - if enabled != self.effect_enable_switch.get_active(): - self.effect_enable_switch.set_active(enabled) - - def _handle_switch_enabled_state(self, switch, param): - requesting_enabled = switch.get_active() - - # never turn off the extension, disabling the effect is done via configs only - if requesting_enabled: - self.runtime.set_property('breezy-enabled', True) - - self.config_manager.set_property('breezy-desktop-enabled', requesting_enabled) - - # def _on_widget_destroy(self, widget): - # self.settings.unbind('widescreen-mode', self.widescreen_mode_switch, 'active') diff --git a/ui/src/nodriver.py b/ui/src/nodriver.py deleted file mode 100644 index efde128..0000000 --- a/ui/src/nodriver.py +++ /dev/null @@ -1,5 +0,0 @@ -from gi.repository import Gtk - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/no-driver.ui') -class NoDriver(Gtk.Box): - __gtype_name__ = "NoDriver" diff --git a/ui/src/noextension.py b/ui/src/noextension.py deleted file mode 100644 index ab73c71..0000000 --- a/ui/src/noextension.py +++ /dev/null @@ -1,5 +0,0 @@ -from gi.repository import Gtk - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/no-extension.ui') -class NoExtension(Gtk.Box): - __gtype_name__ = "NoExtension" diff --git a/ui/src/nolicense.py b/ui/src/nolicense.py deleted file mode 100644 index c09112d..0000000 --- a/ui/src/nolicense.py +++ /dev/null @@ -1,23 +0,0 @@ -from gi.repository import Gtk, GLib, GObject - -from .xrdriveripc import XRDriverIPC - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/no-license.ui') -class NoLicense(Gtk.Box): - __gtype_name__ = "NoLicense" - - refresh_license_button = Gtk.Template.Child() - - def __init__(self, hide_refresh_button = False, **kwargs): - super(Gtk.Box, self).__init__() - self.init_template() - - self.ipc = XRDriverIPC.get_instance() - - if hide_refresh_button: - self.refresh_license_button.hide() - else: - self.refresh_license_button.connect("clicked", self.on_refresh_license_button_clicked) - - def on_refresh_license_button_clicked(self, button): - self.ipc.write_control_flags({'refresh_device_license': True}) \ No newline at end of file diff --git a/ui/src/runtime.py b/ui/src/runtime.py deleted file mode 100644 index 5ea3228..0000000 --- a/ui/src/runtime.py +++ /dev/null @@ -1,63 +0,0 @@ -"""Runtime environment discovery. - -Exactly one concrete :class:`~breezydesktop.runtimeenvironment.RuntimeEnvironment` -implementation is bundled into the ``runtimes`` subpackage at package time. This -module finds it (the first one it sees) and exposes both the class and a cheap -way to read its namespace without constructing the (potentially side-effectful) -instance. -""" - -import importlib -import inspect -import logging -import pkgutil - -from .runtimeenvironment import RuntimeEnvironment, DEFAULT_APP_NAMESPACE - -logger = logging.getLogger('breezy_ui') - -_runtime_class = None - - -def get_runtime_class(): - """Return the active RuntimeEnvironment subclass. - - Scans the bundled ``runtimes`` subpackage and returns the first concrete - RuntimeEnvironment subclass found. The result is cached. Raises - RuntimeError if no implementation is bundled. - """ - global _runtime_class - if _runtime_class is not None: - return _runtime_class - - from . import runtimes - - for module_info in pkgutil.iter_modules(runtimes.__path__, runtimes.__name__ + '.'): - try: - module = importlib.import_module(module_info.name) - except Exception as e: - logger.error("Failed to import runtime module %s: %s", module_info.name, e) - continue - - for _, obj in inspect.getmembers(module, inspect.isclass): - if issubclass(obj, RuntimeEnvironment) and obj is not RuntimeEnvironment \ - and obj.__module__ == module_info.name: - logger.info("Using runtime environment %s", obj.__name__) - _runtime_class = obj - return _runtime_class - - raise RuntimeError( - "No RuntimeEnvironment implementation was found in the 'runtimes' package. " - "A runtime implementation must be bundled at package time.") - - -def runtime_namespace(): - """Return the active runtime's application namespace. - - Falls back to the default namespace if no runtime is bundled, so early - bootstrap paths (e.g. log directory setup) never fail. - """ - try: - return get_runtime_class().app_namespace() - except RuntimeError: - return DEFAULT_APP_NAMESPACE diff --git a/ui/src/runtimeenvironment.py b/ui/src/runtimeenvironment.py deleted file mode 100644 index d365136..0000000 --- a/ui/src/runtimeenvironment.py +++ /dev/null @@ -1,169 +0,0 @@ -import gettext - -from gi.repository import GObject - -_ = gettext.gettext - -# Default namespace used for XDG directories, application identity, etc. A -# concrete RuntimeEnvironment should override APP_NAMESPACE. -DEFAULT_APP_NAMESPACE = 'breezy_gnome' - - -class NullVirtualDisplayManager(GObject.GObject): - """A no-op virtual display manager. - - Provides the same interface (the 'displays' property + change - notifications, plus create/destroy methods) that the UI binds to, but - never creates anything. Runtime environments that don't support virtual - displays can use this so the UI degrades gracefully. - """ - __gproperties__ = { - 'displays': (object, 'Displays', 'A list of the displays', GObject.ParamFlags.READWRITE) - } - - def __init__(self): - GObject.GObject.__init__(self) - self._displays = [] - - def create_virtual_display(self, width, height, framerate): - return None - - def destroy_virtual_display(self, pid): - return False - - def do_set_property(self, prop, value): - if prop.name == 'displays': - self._displays = value - - def do_get_property(self, prop): - if prop.name == 'displays': - return self._displays - - -class RuntimeEnvironment(GObject.GObject): - """Abstraction over the host environment the UI is running in. - - A RuntimeEnvironment encapsulates everything that differs between the - environments Breezy can run in (e.g. GNOME Shell vs. a headless Breezy Box): - how the effect is enabled, how the installation is verified, whether/how - updates are checked, how virtual displays are managed, and which optional - views and fields the UI should present. - - The first concrete subclass discovered in the bundled ``runtimes`` package - (see :mod:`breezydesktop.runtime`) is instantiated as the active - environment, so a build can swap behavior simply by packaging a different - implementation. - - Subclasses inherit the ``breezy-enabled`` GObject property; override - :meth:`enable`/:meth:`disable`/:meth:`is_enabled` (and, if needed, - ``do_set_property``/``do_get_property``) to back it with real state. - """ - - # The application/namespace identifier, e.g. 'breezy_gnome' or 'breezy_box'. - # Used for namespacing XDG directories and similar. Subclasses must set - # this. - APP_NAMESPACE = None - - __gproperties__ = { - 'breezy-enabled': (bool, 'Breezy Enabled', 'Whether the Breezy Desktop effect is enabled', False, GObject.ParamFlags.READWRITE) - } - - _instance = None - - @classmethod - def get_instance(cls): - if RuntimeEnvironment._instance is None: - from .runtime import get_runtime_class - RuntimeEnvironment._instance = get_runtime_class()() - return RuntimeEnvironment._instance - - def __init__(self): - GObject.GObject.__init__(self) - self._breezy_enabled = False - self._virtual_display_manager = None - - # --- identity --------------------------------------------------------- - - @classmethod - def app_namespace(cls): - return cls.APP_NAMESPACE or DEFAULT_APP_NAMESPACE - - # --- effect enablement (backs the 'breezy-enabled' property) ---------- - - def is_installed(self): - """Whether the supporting components for this environment are installed. - - Environments with no separate component to install (e.g. a headless - box where the runtime is always present) should return True. - """ - return True - - def is_enabled(self): - return self._breezy_enabled - - def enable(self): - self._breezy_enabled = True - - def disable(self): - self._breezy_enabled = False - - # --- verification ----------------------------------------------------- - - def verify(self): - """Verify the installation. Return True when verification passes (or - when the environment has no verification step).""" - return True - - # --- update checking -------------------------------------------------- - - def check_for_update(self, current_version, callback): - """Asynchronously check for a newer version. - - Implementations that support updates should invoke - ``callback(latest_version_str)`` when a newer version is available. - The default is a no-op (no update prompt). - """ - return None - - # --- optional views / fields ------------------------------------------ - - @property - def shows_no_device_view(self): - """Whether a dedicated "no device connected" view should be shown. - - When False, the connected-device view is always shown and - :meth:`no_device_label` supplies the label used when no device is - actually connected. - """ - return False - - def no_device_label(self): - """Label shown in place of a device name when no device is connected - (only relevant when :attr:`shows_no_device_view` is False).""" - return _("No supported glasses connected") - - # --- virtual displays ------------------------------------------------- - - def is_virtual_display_supported(self): - return False - - def _create_virtual_display_manager(self): - """Build the virtual display manager for this environment. Override to - provide a real implementation.""" - return NullVirtualDisplayManager() - - @property - def virtual_display_manager(self): - if self._virtual_display_manager is None: - self._virtual_display_manager = self._create_virtual_display_manager() - return self._virtual_display_manager - - # --- GObject property plumbing ---------------------------------------- - - def do_set_property(self, prop, value): - if prop.name == 'breezy-enabled' and value != self.is_enabled(): - self.enable() if value else self.disable() - - def do_get_property(self, prop): - if prop.name == 'breezy-enabled': - return self.is_enabled() diff --git a/ui/src/runtimes/__init__.py b/ui/src/runtimes/__init__.py deleted file mode 100644 index 69f7dba..0000000 --- a/ui/src/runtimes/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -"""Bundled runtime environment implementations. - -Exactly one concrete RuntimeEnvironment implementation module is copied into -this package at package time (see ui/bin/package). The implementation is -selected per-build from a runtime source directory (e.g. gnome/ui), so behavior -can be swapped without touching the core UI. -""" diff --git a/ui/src/settingsmanager.py b/ui/src/settingsmanager.py deleted file mode 100644 index ea6cd08..0000000 --- a/ui/src/settingsmanager.py +++ /dev/null @@ -1,16 +0,0 @@ - -from gi.repository import Gio - -class SettingsManager: - _instance = None - - @staticmethod - def get_instance(): - if not SettingsManager._instance: - SettingsManager._instance = SettingsManager() - - return SettingsManager._instance - - def __init__(self): - self.settings = Gio.Settings.new_with_path("com.xronlinux.BreezyDesktop", "/com/xronlinux/BreezyDesktop/") - self.desktop_settings = Gio.Settings.new("org.gnome.desktop.interface") diff --git a/ui/src/shortcutdialog.py b/ui/src/shortcutdialog.py deleted file mode 100644 index 4bb1e3b..0000000 --- a/ui/src/shortcutdialog.py +++ /dev/null @@ -1,109 +0,0 @@ -from gi.repository import Gtk, Gdk -import gettext - -_ = gettext.gettext - -from .settingsmanager import SettingsManager - -# ported from https://github.com/velitasali/gnome-shell-extension-awesome-tiles -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/shortcut-dialog.ui') -class ShortcutDialog(Gtk.Dialog): - __gtype_name__ = 'ShortcutDialog' - - event_controller = Gtk.Template.Child() - - def __init__(self, settings_key): - super(Gtk.Dialog, self).__init__() - self.init_template() - - self.settings_key = settings_key - self.key_pressed_connect_id = self.event_controller.connect('key-pressed', self._on_key_pressed) - - def _on_key_pressed(self, widget, keyval, keycode, state): - mask = state & Gtk.accelerator_get_default_mod_mask() - mask &= ~Gdk.ModifierType.LOCK_MASK - - done = True - if mask == 0 and keyval == Gdk.KEY_Escape: - self.visible = False - elif keyval == Gdk.KEY_BackSpace: - SettingsManager.get_instance().settings.set_strv(self.settings_key, []) - self.close() - elif is_binding_valid(mask, keycode, keyval) and is_accel_valid(state, keyval): - binding = Gtk.accelerator_name_with_keycode( - None, - keyval, - keycode, - state - ) - SettingsManager.get_instance().settings.set_strv(self.settings_key, [binding]) - - self.close() - else: - done = False - - if done and self.key_pressed_connect_id: - self.event_controller.disconnect(self.key_pressed_connect_id) - self.key_pressed_connect_id = None - - return Gdk.EVENT_STOP - -def is_binding_valid(mask, keycode, keyval): - if mask == 0 or mask == Gdk.ModifierType.SHIFT_MASK and keycode != 0: - if keyval >= Gdk.KEY_a and keyval <= Gdk.KEY_z or \ - keyval >= Gdk.KEY_A and keyval <= Gdk.KEY_Z or \ - keyval >= Gdk.KEY_0 and keyval <= Gdk.KEY_9 or \ - keyval >= Gdk.KEY_kana_fullstop and keyval <= Gdk.KEY_semivoicedsound or \ - keyval >= Gdk.KEY_Arabic_comma and keyval <= Gdk.KEY_Arabic_sukun or \ - keyval >= Gdk.KEY_Serbian_dje and keyval <= Gdk.KEY_Cyrillic_HARDSIGN or \ - keyval >= Gdk.KEY_Greek_ALPHAaccent and keyval <= Gdk.KEY_Greek_omega or \ - keyval >= Gdk.KEY_hebrew_doublelowline and keyval <= Gdk.KEY_hebrew_taf or \ - keyval >= Gdk.KEY_Thai_kokai and keyval <= Gdk.KEY_Thai_lekkao or \ - keyval >= Gdk.KEY_Hangul_Kiyeog and keyval <= Gdk.KEY_Hangul_J_YeorinHieuh or \ - keyval == Gdk.KEY_space and mask == 0 or \ - is_keyval_forbidden(keyval): - return False - return True - -def is_keyval_forbidden(keyval): - forbidden_keyvals = [ - Gdk.KEY_Home, - Gdk.KEY_Left, - Gdk.KEY_Up, - Gdk.KEY_Right, - Gdk.KEY_Down, - Gdk.KEY_Page_Up, - Gdk.KEY_Page_Down, - Gdk.KEY_End, - Gdk.KEY_Tab, - Gdk.KEY_KP_Enter, - Gdk.KEY_Return, - Gdk.KEY_Mode_switch - ] - return keyval in forbidden_keyvals - -def is_accel_valid(mask, keyval): - return Gtk.accelerator_valid(keyval, mask) or (keyval == Gdk.KEY_Tab and mask != 0) - -def bind_shortcut_settings(window, widget_tuples): - for widget_tuple in widget_tuples: - widget, label = widget_tuple - SettingsManager.get_instance().settings.connect('changed::' + widget.get_name(), - lambda *args, widget=widget, label=label: reload_shortcut_widget(widget, label)) - widget.connect('clicked', lambda *args, widget=widget: on_assign_shortcut(window, widget)) - - reload_shortcut_widgets(widget_tuples) - -def on_assign_shortcut(window, widget): - dialog = ShortcutDialog(widget.get_name()) - dialog.set_transient_for(widget.get_ancestor(Gtk.Window)) - dialog.present() - -def reload_shortcut_widget(widget, label): - shortcut = SettingsManager.get_instance().settings.get_strv(widget.get_name()) - label.set_accelerator(shortcut[0] if len(shortcut) > 0 else _('Disabled')) - -def reload_shortcut_widgets(widget_tuples): - for widget_tuple in widget_tuples: - widget, label = widget_tuple - reload_shortcut_widget(widget, label) \ No newline at end of file diff --git a/ui/src/statemanager.py b/ui/src/statemanager.py deleted file mode 100644 index 5acbc42..0000000 --- a/ui/src/statemanager.py +++ /dev/null @@ -1,177 +0,0 @@ -import sys -from gi.repository import GObject, GLib -from .time import LICENSE_WARN_SECONDS -from .xrdriveripc import XRDriverIPC - -# shouldn't need a number larger than a year -LICENSE_ACTION_NEEDED_MAX = 60 * 60 * 24 * 366 - -class StateManager(GObject.GObject): - __gsignals__ = { - 'device-update': (GObject.SIGNAL_RUN_FIRST, None, (str,)) - } - - __gproperties__ = { - 'driver-running': (bool, 'Driver Running', 'Whether the driver is running', False, GObject.ParamFlags.READWRITE), - 'follow-mode': (bool, 'Follow Mode', 'Whether the follow mode is enabled', False, GObject.ParamFlags.READWRITE), - 'follow-threshold': (float, 'Follow Threshold', 'The follow threshold', 1.0, 45.0, 15.0, GObject.ParamFlags.READWRITE), - 'widescreen-mode': (bool, 'Widescreen Mode', 'Whether widescreen mode is enabled', False, GObject.ParamFlags.READWRITE), - 'license-action-needed': (bool, 'License Action Needed', 'Whether the license needs attention', False, GObject.ParamFlags.READWRITE), - 'license-present': (bool, 'License Present', 'Whether a license is present', False, GObject.ParamFlags.READWRITE), - 'enabled-features-list': (object, 'Enabled Features List', 'A list of the enabled features', GObject.ParamFlags.READWRITE), - 'device-supports-sbs': (bool, 'Device Supports SBS', 'Whether the connected device supports SBS', False, GObject.ParamFlags.READWRITE), - 'connected-device-pose-has-position': (bool, 'Pose Has Position', 'Whether the connected device provides position tracking (6DoF)', False, GObject.ParamFlags.READWRITE), - 'connected-device-full-distance-cm': (float, 'Full Distance (cm)', 'Device full distance in cm', 0.0, 10000.0, 0.0, GObject.ParamFlags.READWRITE), - 'connected-device-full-size-cm': (float, 'Full Size (cm)', 'Device full display size in cm', 0.0, 10000.0, 0.0, GObject.ParamFlags.READWRITE), - } - - _instance = None - - @staticmethod - def get_instance(): - if not StateManager._instance: - StateManager._instance = StateManager() - - return StateManager._instance - - @staticmethod - def destroy_instance(): - if StateManager._instance: - StateManager._instance.stop() - StateManager._instance = None - - @staticmethod - def device_name(state): - if state.get('connected_device_brand') and state.get('connected_device_model'): - return f"{state['connected_device_brand']} {state['connected_device_model']}" - - return None - - def __init__(self): - GObject.GObject.__init__(self) - self.ipc = XRDriverIPC.get_instance() - self.driver_running = False - self.follow_mode = False - self.follow_threshold = 15.0 - self.widescreen_mode = False - self.connected_device_name = None - self.license_action_needed = False - self.license_action_needed_seconds = 0 - self.confirmed_token = False - self.license_present = False - self.enabled_features = [] - self.device_supports_sbs = False - self.connected_device_pose_has_position = False - self.connected_device_full_distance_cm = 0.0 - self.connected_device_full_size_cm = 0.0 - self._running = True - self._refresh_source_id = None - self._refresh_state() - self._refresh_source_id = GLib.timeout_add_seconds(1, self._refresh_state) - - def stop(self): - self._running = False - if self._refresh_source_id is not None: - GLib.source_remove(self._refresh_source_id) - self._refresh_source_id = None - - def _refresh_state(self): - self.state = self.ipc.retrieve_driver_state() - driver_running = self.state['ui_view'].get('driver_running') - if driver_running != self.driver_running: - self.set_property('driver-running', driver_running) - - new_device_name = StateManager.device_name(self.state) - if self.connected_device_name != new_device_name: - self.connected_device_name = new_device_name - self.emit('device-update', self.connected_device_name) - - license_view = self.state['ui_view'].get('license') - if license_view: - if not self.license_present: - self.set_property('license-present', True) - self.confirmed_token = license_view.get('confirmed_token') == True - action_needed_details = license_view.get('action_needed') - action_needed_seconds = action_needed_details.get('seconds') if action_needed_details else None - - action_needed = action_needed_seconds is not None and action_needed_seconds < LICENSE_WARN_SECONDS - if (action_needed != self.license_action_needed): - self.license_action_needed_seconds = action_needed_seconds - self.set_property('license-action-needed', action_needed) - enabled_features = license_view.get('enabled_features', []) - if self.enabled_features != enabled_features: - self.set_property('enabled-features-list', enabled_features) - elif self.license_present: - self.set_property('license-present', False) - - # only update these properties if a device is still connected - if (self.connected_device_name): - follow_mode = self.state.get('breezy_desktop_smooth_follow_enabled', False) - if follow_mode != self.follow_mode: - self.set_property('follow-mode', follow_mode) - - device_supports_sbs = self.state.get('sbs_mode_supported', False) - if device_supports_sbs != self.device_supports_sbs: - self.set_property('device-supports-sbs', device_supports_sbs) - - widescreen_mode = self.state.get('sbs_mode_enabled', False) - if widescreen_mode != self.widescreen_mode: - self.set_property('widescreen-mode', widescreen_mode) - - pose_has_position = (self.state.get('connected_device_pose_has_position', False) == True) - if pose_has_position != self.connected_device_pose_has_position: - self.set_property('connected-device-pose-has-position', pose_has_position) - - full_distance = self.state.get('connected_device_full_distance_cm') or 0.0 - if full_distance != self.connected_device_full_distance_cm: - self.set_property('connected-device-full-distance-cm', full_distance) - - full_size = self.state.get('connected_device_full_size_cm') or 0.0 - if full_size != self.connected_device_full_size_cm: - self.set_property('connected-device-full-size-cm', full_size) - - return self._running - - def do_set_property(self, prop, value): - if prop.name == 'driver-running': - self.driver_running = value - if prop.name == 'follow-mode': - self.follow_mode = value - if prop.name == 'widescreen-mode': - self.widescreen_mode = value - if prop.name == 'license-action-needed': - self.license_action_needed = value - if prop.name == 'license-present': - self.license_present = value - if prop.name == 'enabled-features-list': - self.enabled_features = value - if prop.name == 'device-supports-sbs': - self.device_supports_sbs = value - if prop.name == 'connected-device-pose-has-position': - self.connected_device_pose_has_position = value - if prop.name == 'connected-device-full-distance-cm': - self.connected_device_full_distance_cm = value - if prop.name == 'connected-device-full-size-cm': - self.connected_device_full_size_cm = value - - def do_get_property(self, prop): - if prop.name == 'driver-running': - return self.driver_running - if prop.name == 'follow-mode': - return self.follow_mode - if prop.name == 'widescreen-mode': - return self.widescreen_mode - if prop.name == 'license-action-needed': - return self.license_action_needed - if prop.name == 'license-present': - return self.license_present - if prop.name == 'enabled-features-list': - return self.enabled_features - if prop.name == 'device-supports-sbs': - return self.device_supports_sbs - if prop.name == 'connected-device-pose-has-position': - return self.connected_device_pose_has_position - if prop.name == 'connected-device-full-distance-cm': - return self.connected_device_full_distance_cm - if prop.name == 'connected-device-full-size-cm': - return self.connected_device_full_size_cm \ No newline at end of file diff --git a/ui/src/time.py b/ui/src/time.py deleted file mode 100644 index 7754385..0000000 --- a/ui/src/time.py +++ /dev/null @@ -1,22 +0,0 @@ -from math import floor -import gettext - -_ = gettext.gettext - -# we'll begin to alert the user when there's less than a week left -LICENSE_WARN_SECONDS = 60 * 60 * 24 * 7 - -def time_remaining_text(seconds, no_cap=False): - if not seconds: - return - - if seconds / 60 < 60: - return _('less than an hour') - elif seconds / (60 * 60) < 24: - time_remaining = floor(seconds / (60 * 60)) - return _('1 hour') if time_remaining == 1 else _("{time_remaining} hours").format(time_remaining=time_remaining) - elif seconds / (24 * 60 * 60) < 30 or no_cap: - time_remaining = floor(seconds / (24 * 60 * 60)) - return _('1 day') if time_remaining == 1 else _("{time_remaining} days").format(time_remaining=time_remaining) - else: - return \ No newline at end of file diff --git a/ui/src/virtualdisplay.in b/ui/src/virtualdisplay.in deleted file mode 100755 index 132a966..0000000 --- a/ui/src/virtualdisplay.in +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python3 - -# virtualdisplay.in -# -# Copyright 2024 Unknown -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# SPDX-License-Identifier: GPL-3.0-or-later - -import logging -import os -import sys - -xdg_data_home = os.getenv('XDG_DATA_HOME', os.path.join(os.path.expanduser('~'), '.local', 'share')) -appdir = os.getenv('APPDIR', xdg_data_home) -pkgdatadir = os.path.join(appdir, 'breezydesktop') -sys.path.insert(1, pkgdatadir) - -lib_dir = os.path.join(pkgdatadir, 'breezydesktop', 'lib') -sys.path.insert(0, lib_dir) - -from logging.handlers import TimedRotatingFileHandler - -config_home = os.environ.get('XDG_CONFIG_HOME', '~/.config') -config_dir = os.path.expanduser(config_home) -state_home = os.environ.get('XDG_STATE_HOME', '~/.local/state') -state_dir = os.path.expanduser(state_home) -breezy_state_dir = os.path.join(state_dir, 'breezy_gnome') -log_dir = os.path.join(breezy_state_dir, 'logs/ui') -os.makedirs(log_dir, exist_ok=True) - -logger = logging.getLogger('breezy_ui') -logger.setLevel(logging.INFO) -logname = os.path.join(log_dir, "breezy_desktop.log") -handler = TimedRotatingFileHandler(logname, when="midnight", backupCount=30) -handler.suffix = "%Y%m%d" -formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') -handler.setFormatter(formatter) -logger.addHandler(handler) - -import sys -import argparse -import signal -import time - -VERSION = '@VERSION@' - -import gi - -gi.require_version('GLib', '2.0') - -from gi.repository import GLib - -def graceful_shutdown(signum, frame): - global virtual_display_instance - global loop - - if virtual_display_instance is not None: - virtual_display_instance.terminate() - -def _on_display_closed(): - global loop - loop.quit() - -def create_display(width, height, framerate): - global virtual_display_instance - - try: - virtual_display_instance = VirtualDisplay(width, height, framerate, _on_display_closed) - virtual_display_instance.create() - except Exception as e: - logger.error(f"Error creating virtual display: {e}") - sys.exit(1) - -if __name__ == "__main__": - from breezydesktop.runtimes import virtualdisplay - from breezydesktop.runtimes.virtualdisplay import VirtualDisplay - - global virtual_display_instance - global loop - - parser = argparse.ArgumentParser(description="Virtual display arguments") - parser.add_argument("--height", type=int, required=True, help="Height of the display") - parser.add_argument("--width", type=int, required=True, help="Width of the display") - parser.add_argument("--framerate", type=int, default=60, help="Framerate of the display") - args = parser.parse_args() - - signal.signal(signal.SIGTERM, graceful_shutdown) - signal.signal(signal.SIGINT, graceful_shutdown) - - loop = GLib.MainLoop() - - try: - GLib.idle_add(create_display, args.width, args.height, args.framerate) - loop.run() - except Exception as e: - logger.error(f"Error in main loop: {e}") - sys.exit(1) \ No newline at end of file diff --git a/ui/src/virtualdisplayrow.py b/ui/src/virtualdisplayrow.py deleted file mode 100644 index de0dc42..0000000 --- a/ui/src/virtualdisplayrow.py +++ /dev/null @@ -1,31 +0,0 @@ -from gi.repository import Adw, Gtk -from .runtimeenvironment import RuntimeEnvironment - -import gettext - -_ = gettext.gettext - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/virtual-display-row.ui') -class VirtualDisplayRow(Adw.ActionRow): - __gtype_name__ = "VirtualDisplayRow" - - remove_virtual_display_button = Gtk.Template.Child() - - def __init__(self, pid, width, height, framerate): - super(Adw.ActionRow, self).__init__() - self.init_template() - self.pid = pid - - icon = Gtk.Image.new_from_icon_name("video-display-symbolic") - - # padding around the icon - self.add_prefix(Gtk.Label(label=" ")) - self.add_prefix(icon) - self.add_prefix(Gtk.Label(label=" ")) - - self.set_subtitle(f"{width} x {height}") - - self.remove_virtual_display_button.connect('clicked', self._remove_virtual_display) - - def _remove_virtual_display(self, widget): - RuntimeEnvironment.get_instance().virtual_display_manager.destroy_virtual_display(self.pid) \ No newline at end of file diff --git a/ui/src/window.py b/ui/src/window.py deleted file mode 100644 index fca8d42..0000000 --- a/ui/src/window.py +++ /dev/null @@ -1,112 +0,0 @@ -from gi.repository import Gtk, GLib -from .license import BREEZY_GNOME_FEATURES -from .licensedialog import LicenseDialog -from .runtimeenvironment import RuntimeEnvironment -from .statemanager import StateManager -from .settingsmanager import SettingsManager -from .connecteddevice import ConnectedDevice -from .failedverification import FailedVerification -from .nodevice import NoDevice -from .nodriver import NoDriver -from .noextension import NoExtension -from .nolicense import NoLicense - -@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/window.ui') -class BreezydesktopWindow(Gtk.ApplicationWindow): - __gtype_name__ = 'BreezydesktopWindow' - - main_content = Gtk.Template.Child() - license_action_needed_banner = Gtk.Template.Child() - license_action_needed_button = Gtk.Template.Child() - missing_breezy_features_banner = Gtk.Template.Child() - missing_breezy_features_button = Gtk.Template.Child() - pose_position_needs_pro_banner = Gtk.Template.Child() - pose_position_needs_pro_button = Gtk.Template.Child() - update_available_banner = Gtk.Template.Child() - - def __init__(self, version, skip_verification, **kwargs): - super().__init__(**kwargs) - - self.runtime = RuntimeEnvironment.get_instance() - self.connected_device = ConnectedDevice() - self.failed_verification = FailedVerification() - self.no_device = NoDevice() - self.no_driver = NoDriver() - self.no_extension = NoExtension() - self.no_license = NoLicense() - - self._skip_verification = skip_verification - - self.settings = SettingsManager.get_instance().settings - self.state_manager = StateManager.get_instance() - self.state_manager.connect('device-update', self._handle_state_update) - self.state_manager.connect('notify::license-action-needed', self._handle_state_update) - self.state_manager.connect('notify::license-present', self._handle_state_update) - self.state_manager.connect('notify::enabled-features-list', self._handle_state_update) - self.state_manager.connect('notify::connected-device-pose-has-position', self._handle_state_update) - self.settings.connect('changed::debug-no-device', self._handle_settings_update) - - self.license_action_needed_button.connect('clicked', self._on_license_button_clicked) - self.missing_breezy_features_button.connect('clicked', self._on_license_button_clicked) - self.pose_position_needs_pro_button.connect('clicked', self._on_license_button_clicked) - - self._handle_state_update(self.state_manager, None) - - self._skip_verification = skip_verification - - self.connect("destroy", self._on_window_destroy) - - self.runtime.check_for_update(version, self._on_update_check_result) - - def _handle_settings_update(self, settings_manager, key): - self._handle_state_update(self.state_manager, None) - - def _handle_state_update(self, state_manager, val): - GLib.idle_add(self._handle_state_update_gui, state_manager) - - def _handle_state_update_gui(self, state_manager): - enabled_features_list = state_manager.get_property('enabled-features-list') or [] - enabled_breezy_features = [feature for feature in enabled_features_list if feature in BREEZY_GNOME_FEATURES] - breezy_features_granted = len(enabled_breezy_features) > 0 - self.missing_breezy_features_banner.set_revealed(not breezy_features_granted) - self.license_action_needed_banner.set_revealed(state_manager.get_property('license-action-needed') == True) - - pose_has_position = state_manager.get_property('connected-device-pose-has-position') == True - pro_enabled = 'productivity_pro' in enabled_features_list - self.pose_position_needs_pro_banner.set_revealed(state_manager.connected_device_name and pose_has_position and breezy_features_granted and not pro_enabled) - - for child in self.main_content: - self.main_content.remove(child) - - if self.settings.get_boolean('debug-no-device'): - self.main_content.append(self.connected_device) - self.connected_device.set_device_name('Fake device') - elif not self._skip_verification and not self.runtime.verify(): - self.main_content.append(self.failed_verification) - elif not self.runtime.is_installed(): - self.main_content.append(self.no_extension) - elif not self.state_manager.driver_running: - self.main_content.append(self.no_driver) - elif not self.state_manager.license_present: - self.main_content.append(self.no_license) - elif not state_manager.connected_device_name and self.runtime.shows_no_device_view: - self.main_content.append(self.no_device) - else: - self.main_content.append(self.connected_device) - self.connected_device.set_device_name(state_manager.connected_device_name or self.runtime.no_device_label()) - - self.set_resizable(True) - self.set_default_size(1, 1) - - return False - - def _on_license_button_clicked(self, widget): - dialog = LicenseDialog() - dialog.set_transient_for(widget.get_ancestor(Gtk.Window)) - dialog.present() - - def _on_update_check_result(self, latest_version): - GLib.idle_add(self.update_available_banner.set_revealed, latest_version is not None) - - def _on_window_destroy(self, widget): - self.state_manager.disconnect_by_func(self._handle_state_update) \ No newline at end of file