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 d72ea5d..0000000 Binary files a/ui/po/mo/de/LC_MESSAGES/breezydesktop.mo and /dev/null differ 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 eedac03..0000000 Binary files a/ui/po/mo/es/LC_MESSAGES/breezydesktop.mo and /dev/null differ 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 c27df49..0000000 Binary files a/ui/po/mo/fr/LC_MESSAGES/breezydesktop.mo and /dev/null differ 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 07e7613..0000000 Binary files a/ui/po/mo/it/LC_MESSAGES/breezydesktop.mo and /dev/null differ diff --git a/ui/po/mo/ja/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/ja/LC_MESSAGES/breezydesktop.mo deleted file mode 100644 index 5ed17f6..0000000 Binary files a/ui/po/mo/ja/LC_MESSAGES/breezydesktop.mo and /dev/null differ 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 b471334..0000000 Binary files a/ui/po/mo/pl/LC_MESSAGES/breezydesktop.mo and /dev/null differ diff --git a/ui/po/mo/pt_BR/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/pt_BR/LC_MESSAGES/breezydesktop.mo deleted file mode 100644 index e43acfc..0000000 Binary files a/ui/po/mo/pt_BR/LC_MESSAGES/breezydesktop.mo and /dev/null differ diff --git a/ui/po/mo/ru/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/ru/LC_MESSAGES/breezydesktop.mo deleted file mode 100644 index e6ef777..0000000 Binary files a/ui/po/mo/ru/LC_MESSAGES/breezydesktop.mo and /dev/null differ diff --git a/ui/po/mo/sv/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/sv/LC_MESSAGES/breezydesktop.mo deleted file mode 100644 index eb20106..0000000 Binary files a/ui/po/mo/sv/LC_MESSAGES/breezydesktop.mo and /dev/null differ diff --git a/ui/po/mo/uk_UA/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/uk_UA/LC_MESSAGES/breezydesktop.mo deleted file mode 100644 index 1b27b78..0000000 Binary files a/ui/po/mo/uk_UA/LC_MESSAGES/breezydesktop.mo and /dev/null differ diff --git a/ui/po/mo/zh_CN/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/zh_CN/LC_MESSAGES/breezydesktop.mo deleted file mode 100644 index 6382075..0000000 Binary files a/ui/po/mo/zh_CN/LC_MESSAGES/breezydesktop.mo and /dev/null differ 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