diff --git a/.gitignore b/.gitignore index a9b274e..fc25d01 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ gschemas.compiled .flatpak-builder/ out/ *.po~ +gnome-44-max/ diff --git a/README.md b/README.md index a1b3353..7c42f00 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ This repo contains a collection of tools to enable virtual desktop environments for gaming and productivity on Linux using [supported XR glasses](https://github.com/wheaney/XRLinuxDriver#supported-devices). -There are two installations at the moment. **Note: Only install one of these at a time, as they invalidate each other's installations. This is only temporary.** +There are two installations at the moment. **Note: Don't manually install either of these if you're running the Decky plugin on the same machine, as they invalidate each other's installations. This is only temporary.** * [Breezy GNOME](#breezy-gnome) for desktop support, primarily in GNOME Linux desktop environments * [Breezy Vulkan](#breezy-vulkan) primarily for gaming but would work with pretty much any application that uses Vulkan rendering. @@ -29,9 +29,7 @@ Breezy GNOME is in AUR (but not pacman, yet). To install, run these commands fro #### All other distros 1. Download the Breezy GNOME [setup script](https://github.com/wheaney/breezy-desktop/releases/latest/download/breezy_gnome_setup) and set the execute flag (e.g. from the terminal: `chmod +x ~/Downloads/breezy_gnome_setup`) -2. Run the setup script: - * For **GNOME 45+**: `~/Downloads/breezy_gnome_setup` - * For **GNOME 42-44**: `~/Downloads/breezy_gnome_setup --tag gnome-44-max` +2. Run the setup script: `~/Downloads/breezy_gnome_setup` ### Steam Deck desktop mode diff --git a/bin/breezy_gnome_setup b/bin/breezy_gnome_setup index 6ec8bb9..31fe60b 100755 --- a/bin/breezy_gnome_setup +++ b/bin/breezy_gnome_setup @@ -11,23 +11,40 @@ if [ "$(id -u)" == "0" ]; then exit 1 fi -start_dir=$(pwd) +check_command() { + if ! command -v "$1" &>/dev/null; then + echo "Please install \"$1\" and make sure it's available in your \$PATH, then rerun the setup." + exit 1 + fi +} + +check_command "gnome-shell" ARCH=$(uname -m) +FILE_NAME="breezyGNOME-$ARCH.tar.gz" +if [ "$(gnome-shell --version | cut -d' ' -f3 | cut -d'.' -f1)" -lt 45 ]; then + echo "Performing setup for GNOME 44 and below ($ARCH)" + FILE_NAME="breezyGNOME-44-max-$ARCH.tar.gz" +else + echo "Performing setup for GNOME 45 and up ($ARCH)" +fi + +start_dir=$(pwd) + # create temp directory tmp_dir=$(mktemp -d -t breezy-gnome-XXXXXXXXXX) pushd $tmp_dir > /dev/null echo "Created temp directory: ${tmp_dir}" -binary_download_url="https://github.com/wheaney/breezy-desktop/releases/latest/download/breezyGNOME-$ARCH.tar.gz" +binary_download_url="https://github.com/wheaney/breezy-desktop/releases/latest/download/$FILE_NAME" if [ "$1" = "-v" ] then metrics_version="$2" binary_path_arg="$3" elif [ "$1" = "--tag" ] && [ -n "$2" ] then - binary_download_url="https://github.com/wheaney/breezy-desktop/releases/download/$2/breezyGNOME-$ARCH.tar.gz" + binary_download_url="https://github.com/wheaney/breezy-desktop/releases/download/$2/$FILE_NAME" else binary_path_arg="$1" fi @@ -35,10 +52,10 @@ fi if [ -z "$binary_path_arg" ] then # download and unzip the binary - echo "Downloading to: ${tmp_dir}/breezyGNOME-$ARCH.tar.gz" + echo "Downloading to: ${tmp_dir}/$FILE_NAME" curl -L -O $binary_download_url - binary_path_arg="breezyGNOME-$ARCH.tar.gz" else + FILE_NAME=$(basename $binary_path_arg) if [[ "$binary_path_arg" = /* ]]; then abs_path="$binary_path_arg" else @@ -49,7 +66,7 @@ else fi echo "Extracting to: ${tmp_dir}/breezy_gnome" -tar -xf $(basename $binary_path_arg) +tar -xf $FILE_NAME pushd breezy_gnome > /dev/null diff --git a/bin/package_gnome b/bin/package_gnome index 1f9dd0f..b0e6c29 100755 --- a/bin/package_gnome +++ b/bin/package_gnome @@ -4,15 +4,34 @@ set -e ARCH=${ARCH:-$(uname -m)} -echo "Building Breezy GNOME for $ARCH" # https://stackoverflow.com/a/246128 SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) ROOT_DIR=$(realpath $SCRIPT_DIR/..) VULKAN_DIR=$ROOT_DIR/vulkan -GNOME_DIR=$ROOT_DIR/gnome + +if [ -z "$GNOME_44_MAX" ]; 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 patched build for GNOME 44 and below + echo "Building Breezy GNOME for $ARCH, GNOME versions 44 and below" + + # use a special directory for the GNOME 44 max build, ignored by git + GNOME_DIR=$ROOT_DIR/gnome-44-max + rm -rf $GNOME_DIR + mkdir $GNOME_DIR + BUILD_FILE_NAME=breezyGNOME-44-max-$ARCH.tar.gz + + # copy the GNOME extension source code to the new directory and apply + # a patch that makes it compatible with GNOME 44 and below + cp -ra $ROOT_DIR/gnome/* $GNOME_DIR + rm -rf $GNOME_DIR/build + git apply gnome-44-max.patch +fi GNOME_BUILD_DIR=$GNOME_DIR/build -BUILD_FILE_NAME=breezyGNOME-$ARCH.tar.gz mkdir -p $GNOME_BUILD_DIR if [ -e "$GNOME_BUILD_DIR/$BUILD_FILE_NAME" ]; then @@ -65,11 +84,11 @@ rm -rf $TMP_DIR cp $XR_DRIVER_BINARY $PACKAGE_DIR/xrDriver.tar.gz cp $XR_DRIVER_DIR/bin/xr_driver_setup $PACKAGE_DIR/bin -gnome/bin/package_extension -cp gnome/out/breezydesktop@xronlinux.com.shell-extension.zip $PACKAGE_DIR +$GNOME_DIR/bin/package_extension +cp $GNOME_DIR/out/breezydesktop@xronlinux.com.shell-extension.zip $PACKAGE_DIR # create a checksum that combines the checksums of all files in the directory -pushd gnome/src +pushd $GNOME_DIR/src GNOME_MANIFEST_LINE=$(find -L . -type f ! -name "*.compiled" -exec sha256sum {} \; | sort | sha256sum | sed 's/ .*//') popd diff --git a/bin/package_vulkan b/bin/package_vulkan index 9b32988..72f8f3b 100755 --- a/bin/package_vulkan +++ b/bin/package_vulkan @@ -41,8 +41,8 @@ cp $VKBASALT_BUILD_DIR/builddir/src/libvkbasalt.so $PACKAGE_DIR/vkBasalt.64/ cp $VKBASALT_BUILD_DIR/builddir/config/vkBasalt.json $PACKAGE_DIR/vkBasalt.64/ cp $VKBASALT_BUILD_DIR/builddir.32/src/libvkbasalt.so $PACKAGE_DIR/vkBasalt.32/ -# copy Sombrero FX, get ReShade headers -cp modules/sombrero/*.fx $PACKAGE_DIR +# copy Sombrero shader, get ReShade headers +cp modules/sombrero/*.frag $PACKAGE_DIR cp modules/sombrero/*.png $PACKAGE_DIR wget -P $PACKAGE_DIR https://raw.githubusercontent.com/crosire/reshade-shaders/384465d0287999caa6190b5ebea506200b4f4a0a/Shaders/ReShade.fxh wget -P $PACKAGE_DIR https://raw.githubusercontent.com/crosire/reshade-shaders/384465d0287999caa6190b5ebea506200b4f4a0a/Shaders/ReShadeUI.fxh @@ -93,7 +93,7 @@ cp $XR_DRIVER_DIR/bin/xr_driver_setup $PACKAGE_DIR/bin # include any file that doesn't get modified during setup (e.g. vkBasalt.json files) pushd $PACKAGE_DIR echo $XR_DRIVER_MANIFEST_LINE > manifest -sha256sum bin/breezy_vulkan_uninstall vkBasalt.64/libvkbasalt.so vkBasalt.32/libvkbasalt.so *.fx* *.png >> manifest +sha256sum bin/breezy_vulkan_uninstall vkBasalt.64/libvkbasalt.so vkBasalt.32/libvkbasalt.so *.frag *.fx* *.png >> manifest popd # bundle everything up diff --git a/gnome-44-max.patch b/gnome-44-max.patch new file mode 100644 index 0000000..ce9b4bf --- /dev/null +++ b/gnome-44-max.patch @@ -0,0 +1,427 @@ +diff --git a/gnome-44-max/bin/setup b/gnome-44-max/bin/setup +index 7ee291a..3bd001b 100755 +--- a/gnome-44-max/bin/setup ++++ b/gnome-44-max/bin/setup +@@ -11,6 +11,7 @@ check_command() { + + check_command "flatpak" + check_command "gnome-extensions" ++check_command "glib-compile-schemas" + + # This script gets packaged with the release and should do the bulk of the setup work. This allows this setup to be tied + # to a specific release of the code, and guarantees it will never run along-side newer or older binaries. +@@ -78,8 +79,10 @@ echo "Copying the manifest file to ${DATA_DIR}" + mkdir -p $DATA_DIR + cp manifest $DATA_DIR + +-echo "Installing the breezydesktop@xronlinux.com GNOME extension" +-gnome-extensions install --force breezydesktop@xronlinux.com.shell-extension.zip ++EXTENSION_UUID="breezydesktop@xronlinux.com" ++echo "Installing the $EXTENSION_UUID GNOME extension" ++gnome-extensions install --force "$EXTENSION_UUID.shell-extension.zip" ++glib-compile-schemas "$GNOME_SHELL_DATA_DIR/extensions/$EXTENSION_UUID/schemas" + + echo "Installing the Breezy Desktop UI Flatpak (this may take a couple minutes the first time)" + flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo +diff --git a/gnome-44-max/src/cursor.js b/gnome-44-max/src/cursor.js +index 36ad7ee..41102a0 100644 +--- a/gnome-44-max/src/cursor.js ++++ b/gnome-44-max/src/cursor.js +@@ -15,11 +15,11 @@ + // You should have received a copy of the GNU General Public License + // along with this program. If not, see . + +-import Clutter from 'gi://Clutter'; +-import GObject from 'gi://GObject'; ++const Clutter = imports.gi.Clutter; ++const GObject = imports.gi.GObject; + + // Copied almost verbatim from ui/magnifier.js. +-export const MouseSpriteContent = GObject.registerClass({ ++var MouseSpriteContent = GObject.registerClass({ + Implements: [Clutter.Content], + }, class MouseSpriteContent extends GObject.Object { + _init() { +diff --git a/gnome-44-max/src/cursormanager.js b/gnome-44-max/src/cursormanager.js +index 44b3f5f..fa65a4a 100644 +--- a/gnome-44-max/src/cursormanager.js ++++ b/gnome-44-max/src/cursormanager.js +@@ -1,11 +1,15 @@ +-import Clutter from 'gi://Clutter'; +-import Meta from 'gi://Meta'; +-import * as PointerWatcher from 'resource:///org/gnome/shell/ui/pointerWatcher.js'; +-import { MouseSpriteContent } from './cursor.js'; +-import Globals from './globals.js'; ++const Clutter = imports.gi.Clutter; ++const Meta = imports.gi.Meta; ++const PointerWatcher = imports.ui.pointerWatcher; ++ ++const ExtensionUtils = imports.misc.extensionUtils; ++const Me = ExtensionUtils.getCurrentExtension(); ++ ++const Globals = Me.imports.globals; ++const { MouseSpriteContent } = Me.imports.cursor; + + // Taken from https://github.com/jkitching/soft-brightness-plus +-export class CursorManager { ++var CursorManager = class CursorManager { + constructor(mainActor, refreshRate) { + this._mainActor = mainActor; + this._refreshRate = refreshRate; +@@ -208,7 +212,7 @@ export class CursorManager { + + _queueVisibilityUpdate() { + this._queued_visibility_update = true; +- this._cursorTrackerSetPointerVisibleBound(false); ++ if (this._cursorTrackerSetPointerVisibleBound) this._cursorTrackerSetPointerVisibleBound(false); + this._queueSpriteUpdate(); + } + +diff --git a/gnome-44-max/src/extension.js b/gnome-44-max/src/extension.js +index cd17162..435154d 100644 +--- a/gnome-44-max/src/extension.js ++++ b/gnome-44-max/src/extension.js +@@ -1,19 +1,21 @@ +-import Clutter from 'gi://Clutter' +-import Gio from 'gi://Gio'; +-import GLib from 'gi://GLib'; +-import Meta from 'gi://Meta'; +-import Shell from 'gi://Shell'; +-import St from 'gi://St'; +- +-import { CursorManager } from './cursormanager.js'; +-import Globals from './globals.js'; +-import { Logger } from './logger.js'; +-import { MonitorManager } from './monitormanager.js'; +-import { isValidKeepAlive } from './time.js'; +-import { IPC_FILE_PATH, XREffect } from './xrEffect.js'; +- +-import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js'; +-import * as Main from 'resource:///org/gnome/shell/ui/main.js'; ++const Clutter = imports.gi.Clutter; ++const Gio = imports.gi.Gio; ++const GLib = imports.gi.GLib; ++const Meta = imports.gi.Meta; ++const Shell = imports.gi.Shell; ++const St = imports.gi.St; ++ ++const Main = imports.ui.main; ++ ++const ExtensionUtils = imports.misc.extensionUtils; ++const Me = ExtensionUtils.getCurrentExtension(); ++ ++const Globals = Me.imports.globals; ++const { CursorManager } = Me.imports.cursormanager; ++const { Logger } = Me.imports.logger; ++const { MonitorManager } = Me.imports.monitormanager; ++const { isValidKeepAlive } = Me.imports.time; ++const { IPC_FILE_PATH, XREffect } = Me.imports.xrEffect; + + const NESTED_MONITOR_PRODUCT = 'MetaMonitor'; + const SUPPORTED_MONITOR_PRODUCTS = [ +@@ -29,11 +31,10 @@ const SUPPORTED_MONITOR_PRODUCTS = [ + NESTED_MONITOR_PRODUCT + ]; + +-export default class BreezyDesktopExtension extends Extension { +- constructor(metadata, uuid) { +- super(metadata, uuid); +- +- this.settings = this.getSettings(); ++class BreezyDesktopExtension { ++ constructor(extensionPath) { ++ this.path = extensionPath; ++ this.settings = ExtensionUtils.getSettings(); + + // Set/destroyed by enable/disable + this._cursor_manager = null; +@@ -593,6 +594,6 @@ export default class BreezyDesktopExtension extends Extension { + } + } + +-function init() { +- return new Extension(); ++function init(meta) { ++ return new BreezyDesktopExtension(meta.path); + } +diff --git a/gnome-44-max/src/globals.js b/gnome-44-max/src/globals.js +index 124d2e1..79a3a87 100644 +--- a/gnome-44-max/src/globals.js ++++ b/gnome-44-max/src/globals.js +@@ -2,5 +2,4 @@ const Globals = { + logger: null, + ipc_file: null, // Gio.File instance, file exists if set + extension_dir: null // string path +-} +-export default Globals; +\ No newline at end of file ++} +\ No newline at end of file +diff --git a/gnome-44-max/src/ipc.js b/gnome-44-max/src/ipc.js +index a729368..d5f7ab0 100644 +--- a/gnome-44-max/src/ipc.js ++++ b/gnome-44-max/src/ipc.js +@@ -1,30 +1,30 @@ +-export const UINT8_SIZE = 1; +-export const BOOL_SIZE = UINT8_SIZE; +-export const UINT_SIZE = 4; +-export const FLOAT_SIZE = 4; ++var UINT8_SIZE = 1; ++var BOOL_SIZE = UINT8_SIZE; ++var UINT_SIZE = 4; ++var FLOAT_SIZE = 4; + +-export const DATA_VIEW_INFO_OFFSET_INDEX = 0; +-export const DATA_VIEW_INFO_SIZE_INDEX = 1; +-export const DATA_VIEW_INFO_COUNT_INDEX = 2; ++var DATA_VIEW_INFO_OFFSET_INDEX = 0; ++var DATA_VIEW_INFO_SIZE_INDEX = 1; ++var DATA_VIEW_INFO_COUNT_INDEX = 2; + + // computes the end offset, exclusive +-export function dataViewEnd(dataViewInfo) { ++function dataViewEnd(dataViewInfo) { + return dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX] + dataViewInfo[DATA_VIEW_INFO_SIZE_INDEX] * dataViewInfo[DATA_VIEW_INFO_COUNT_INDEX]; + } + +-export function dataViewUint8(dataView, dataViewInfo) { ++function dataViewUint8(dataView, dataViewInfo) { + return dataView.getUint8(dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX]); + } + +-export function dataViewUint(dataView, dataViewInfo) { ++function dataViewUint(dataView, dataViewInfo) { + return dataView.getUint32(dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX], true); + } + +-export function dataViewBigUint(dataView, dataViewInfo) { ++function dataViewBigUint(dataView, dataViewInfo) { + return Number(dataView.getBigUint64(dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX], true)); + } + +-export function dataViewUint32Array(dataView, dataViewInfo) { ++function dataViewUint32Array(dataView, dataViewInfo) { + const uintArray = [] + let offset = dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX]; + for (let i = 0; i < dataViewInfo[DATA_VIEW_INFO_COUNT_INDEX]; i++) { +@@ -34,7 +34,7 @@ export function dataViewUint32Array(dataView, dataViewInfo) { + return uintArray; + } + +-export function dataViewUint8Array(dataView, dataViewInfo) { ++function dataViewUint8Array(dataView, dataViewInfo) { + const uintArray = [] + let offset = dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX]; + for (let i = 0; i < dataViewInfo[DATA_VIEW_INFO_SIZE_INDEX] * dataViewInfo[DATA_VIEW_INFO_COUNT_INDEX]; i++) { +@@ -44,11 +44,11 @@ export function dataViewUint8Array(dataView, dataViewInfo) { + return uintArray; + } + +-export function dataViewFloat(dataView, dataViewInfo) { ++function dataViewFloat(dataView, dataViewInfo) { + return dataView.getFloat32(dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX], true); + } + +-export function dataViewFloatArray(dataView, dataViewInfo) { ++function dataViewFloatArray(dataView, dataViewInfo) { + const floatArray = [] + let offset = dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX]; + for (let i = 0; i < dataViewInfo[DATA_VIEW_INFO_COUNT_INDEX]; i++) { +diff --git a/gnome-44-max/src/logger.js b/gnome-44-max/src/logger.js +index 50450c1..8b307fc 100644 +--- a/gnome-44-max/src/logger.js ++++ b/gnome-44-max/src/logger.js +@@ -14,15 +14,15 @@ + // You should have received a copy of the GNU General Public License + // along with this program. If not, see . + +-import * as Config from 'resource:///org/gnome/shell/misc/config.js'; +-import Gio from 'gi://Gio'; +-import GLib from 'gi://GLib'; +-import GObject from 'gi://GObject'; +-import System from 'system'; ++const Config = imports.misc.config; ++const Gio = imports.gi.Gio; ++const GLib = imports.gi.GLib; ++const GObject = imports.gi.GObject; ++const System = imports.system; + + const LOG_DIR_NAME = 'breezy_gnome/logs/gjs'; + +-export const Logger = GObject.registerClass({ ++var Logger = GObject.registerClass({ + GTypeName: 'Logger', + Properties: { + 'title': GObject.ParamSpec.string( +diff --git a/gnome-44-max/src/math.js b/gnome-44-max/src/math.js +index 497274e..6c98cdb 100644 +--- a/gnome-44-max/src/math.js ++++ b/gnome-44-max/src/math.js +@@ -1,3 +1,3 @@ +-export function degreeToRadian(degree) { ++function degreeToRadian(degree) { + return degree * Math.PI / 180; + } +\ No newline at end of file +diff --git a/gnome-44-max/src/metadata.json b/gnome-44-max/src/metadata.json +index b9b5ebf..c888f94 100644 +--- a/gnome-44-max/src/metadata.json ++++ b/gnome-44-max/src/metadata.json +@@ -5,7 +5,7 @@ + "settings-schema": "com.xronlinux.BreezyDesktop", + "session-modes": ["user", "unlock-dialog"], + "shell-version": [ +- "45", "46" ++ "42", "43", "44" + ], + "url": "https://github.com/wheaney/breezy-desktop" + } +\ No newline at end of file +diff --git a/gnome-44-max/src/monitormanager.js b/gnome-44-max/src/monitormanager.js +index ca8a6a5..075ba63 100644 +--- a/gnome-44-max/src/monitormanager.js ++++ b/gnome-44-max/src/monitormanager.js +@@ -16,12 +16,15 @@ + // You should have received a copy of the GNU General Public License + // along with this program. If not, see . + +-import Gio from 'gi://Gio'; +-import GObject from 'gi://GObject'; ++const Gio = imports.gi.Gio; ++const GObject = imports.gi.GObject; + +-import * as Main from 'resource:///org/gnome/shell/ui/main.js'; ++const Main = imports.ui.main; + +-import Globals from './globals.js'; ++const ExtensionUtils = imports.misc.extensionUtils; ++const Me = ExtensionUtils.getCurrentExtension(); ++ ++const Globals = Me.imports.globals; + + let cachedDisplayConfigProxy = null; + +@@ -43,7 +46,7 @@ function getDisplayConfigProxy(extPath) { + return cachedDisplayConfigProxy; + } + +-export function newDisplayConfig(extPath, callback) { ++function newDisplayConfig(extPath, callback) { + const DisplayConfigProxy = getDisplayConfigProxy(extPath); + new DisplayConfigProxy( + Gio.DBus.session, +@@ -243,7 +246,7 @@ function performOptimalModeCheck(displayConfigProxy, connectorName, headsetAsPri + } + + // Monitor change handling +-export const MonitorManager = GObject.registerClass({ ++var MonitorManager = GObject.registerClass({ + Properties: { + 'use-optimal-monitor-config': GObject.ParamSpec.boolean( + 'use-optimal-monitor-config', +diff --git a/gnome-44-max/src/shader.js b/gnome-44-max/src/shader.js +index f70c96d..352be40 100644 +--- a/gnome-44-max/src/shader.js ++++ b/gnome-44-max/src/shader.js +@@ -1,6 +1,6 @@ +-import Gio from 'gi://Gio'; ++const Gio = imports.gi.Gio; + +-export function getShaderSource(path) { ++function getShaderSource(path) { + const file = Gio.file_new_for_path(path); + const data = file.load_contents(null); + +diff --git a/gnome-44-max/src/time.js b/gnome-44-max/src/time.js +index 7883b9b..5478d2a 100644 +--- a/gnome-44-max/src/time.js ++++ b/gnome-44-max/src/time.js +@@ -1,11 +1,11 @@ +-export function getEpochSec() { ++function getEpochSec() { + return toSec(Date.now()); + } + +-export function toSec(milliseconds) { ++function toSec(milliseconds) { + return Math.floor(milliseconds / 1000); + } + +-export function isValidKeepAlive(dateSec, strictCheck = false) { ++function isValidKeepAlive(dateSec, strictCheck = false) { + return Math.abs(toSec(Date.now()) - dateSec) <= (strictCheck ? 1 : 5); + } +\ No newline at end of file +diff --git a/gnome-44-max/src/xrEffect.js b/gnome-44-max/src/xrEffect.js +index 2680cae..bfb036f 100644 +--- a/gnome-44-max/src/xrEffect.js ++++ b/gnome-44-max/src/xrEffect.js +@@ -1,13 +1,15 @@ +-import Clutter from 'gi://Clutter'; +-import Cogl from 'gi://Cogl'; +-import GdkPixbuf from 'gi://GdkPixbuf'; +-import GLib from 'gi://GLib'; +-import GObject from 'gi://GObject'; +-import Shell from 'gi://Shell'; +- +-import Globals from './globals.js'; +- +-import { ++const Clutter = imports.gi.Clutter; ++const Cogl = imports.gi.Cogl; ++const GdkPixbuf = imports.gi.GdkPixbuf; ++const GLib = imports.gi.GLib; ++const GObject = imports.gi.GObject; ++const Shell = imports.gi.Shell; ++ ++const ExtensionUtils = imports.misc.extensionUtils; ++const Me = ExtensionUtils.getCurrentExtension(); ++ ++const Globals = Me.imports.globals; ++const { + dataViewEnd, + dataViewUint8, + dataViewBigUint, +@@ -21,12 +23,12 @@ import { + FLOAT_SIZE, + UINT_SIZE, + UINT8_SIZE +-} from "./ipc.js"; +-import { degreeToRadian } from "./math.js"; +-import { getShaderSource } from "./shader.js"; +-import { isValidKeepAlive, toSec } from "./time.js"; ++} = Me.imports.ipc; ++const { degreeToRadian } = Me.imports.math; ++const { getShaderSource } = Me.imports.shader; ++const { isValidKeepAlive, toSec } = Me.imports.time; + +-export const IPC_FILE_PATH = "/dev/shm/breezy_desktop_imu"; ++var IPC_FILE_PATH = "/dev/shm/breezy_desktop_imu"; + + // the driver should be using the same data layout version + const DATA_LAYOUT_VERSION = 3; +@@ -220,7 +222,7 @@ function checkParityByte(dataView) { + return parityByte === parity; + } + +-export const XREffect = GObject.registerClass({ ++var XREffect = GObject.registerClass({ + Properties: { + 'supported-device-detected': GObject.ParamSpec.boolean( + 'supported-device-detected', +@@ -360,8 +362,13 @@ export const XREffect = GObject.registerClass({ + if (!this._initialized) { + this.set_uniform_float(this.get_uniform_location('uDesktopTexture'), 1, [0]); + +- this.get_pipeline().set_layer_texture(1, calibratingImage.get_texture()); +- this.get_pipeline().set_layer_texture(2, customBannerImage.get_texture()); ++ try { ++ // this can break in GNOME 42 ++ this.get_pipeline().set_layer_texture(1, calibratingImage.get_texture()); ++ this.get_pipeline().set_layer_texture(2, customBannerImage.get_texture()); ++ } catch (e) { ++ Globals.logger.log(`ERROR: xrEffect.js vfunc_paint_target ${e.message}\n${e.stack}`); ++ } + this.get_pipeline().set_uniform_1i(this.get_uniform_location('uCalibratingTexture'), 1); + this.get_pipeline().set_uniform_1i(this.get_uniform_location('uCustomBannerTexture'), 2); + diff --git a/gnome/src/IMUAdjust.frag b/gnome/src/IMUAdjust.frag deleted file mode 120000 index ffacb50..0000000 --- a/gnome/src/IMUAdjust.frag +++ /dev/null @@ -1 +0,0 @@ -../../modules/sombrero/IMUAdjust.frag \ No newline at end of file diff --git a/gnome/src/Sombrero.frag b/gnome/src/Sombrero.frag new file mode 120000 index 0000000..40e9a22 --- /dev/null +++ b/gnome/src/Sombrero.frag @@ -0,0 +1 @@ +../../modules/sombrero/Sombrero.frag \ No newline at end of file diff --git a/gnome/src/xrEffect.js b/gnome/src/xrEffect.js index bfb036f..922ec0f 100644 --- a/gnome/src/xrEffect.js +++ b/gnome/src/xrEffect.js @@ -54,8 +54,7 @@ const shaderUniformLocations = { 'imu_quat_data': null, 'look_ahead_cfg': null, 'look_ahead_ms': null, - 'trim_width_percent': null, - 'trim_height_percent': null, + 'trim_percent': null, 'display_size': null, 'display_north_offset': null, 'lens_vector': null, @@ -143,9 +142,12 @@ function setIntermittentUniformVariables() { const halfFovYRads = halfFovZRads * displayAspectRatio; const fovHalfWidths = [Math.tan(halfFovYRads), Math.tan(halfFovZRads)]; const fovWidths = [fovHalfWidths[0] * 2, fovHalfWidths[1] * 2]; + const lensDistanceRatio = dataViewFloat(dataView, LENS_DISTANCE_RATIO); + let lensFromCenter = 0.0; let texcoordXLimits = [0.0, 1.0]; let texcoordXLimitsRight = [0.0, 1.0]; if (sbsEnabled) { + lensFromCenter = lensDistanceRatio / 3.0; if (sbsContent) { texcoordXLimits[1] = 0.5; texcoordXLimitsRight[0] = 0.5; @@ -156,10 +158,10 @@ function setIntermittentUniformVariables() { } else if (!sbsModeStretched) { texcoordXLimits[0] = 0.25; texcoordXLimits[1] = 0.75; + texcoordXLimitsRight[0] = 0.25; + texcoordXLimitsRight[1] = 0.75; } } - const lensDistanceRatio = dataViewFloat(dataView, LENS_DISTANCE_RATIO); - const lensFromCenter = lensDistanceRatio / 3.0; const lensVector = [lensDistanceRatio, lensFromCenter, 0.0]; const lensVectorRight = [lensDistanceRatio, -lensFromCenter, 0.0]; @@ -173,8 +175,7 @@ function setIntermittentUniformVariables() { transferUniformFloat(this, 'lens_distance_ratio', dataView, LENS_DISTANCE_RATIO); // computed values with no dataViewInfo, so we set these manually - setSingleFloat(this, 'trim_width_percent', trimWidthPercent); - setSingleFloat(this, 'trim_height_percent', trimHeightPercent); + this.set_uniform_float(shaderUniformLocations['trim_percent'], 2, [trimWidthPercent, trimHeightPercent]); setSingleFloat(this, 'half_fov_z_rads', halfFovZRads); setSingleFloat(this, 'half_fov_y_rads', halfFovYRads); this.set_uniform_float(shaderUniformLocations['fov_half_widths'], 2, fovHalfWidths); @@ -193,7 +194,7 @@ function setIntermittentUniformVariables() { if (enabled && this.widescreen_mode_state !== sbsEnabled) this.widescreen_mode_state = sbsEnabled; // these variables are always in play, even if enabled is false - setSingleFloat(this, 'enabled', enabled ? 1.0 : 0.0); + setSingleFloat(this, 'virtual_display_enabled', enabled ? 1.0 : 0.0); setSingleFloat(this, 'show_banner', imuResetState ? 1.0 : 0.0); setSingleFloat(this, 'sbs_enabled', sbsEnabled ? 1.0 : 0.0); setSingleFloat(this, 'custom_banner_enabled', dataViewUint8(dataView, CUSTOM_BANNER_ENABLED) !== 0 ? 1.0 : 0.0); @@ -347,8 +348,8 @@ var XREffect = GObject.registerClass({ } vfunc_build_pipeline() { - const code = getShaderSource(`${Globals.extension_dir}/IMUAdjust.frag`); - const main = 'PS_IMU_Transform(vec4(0, 0, 0, 0), cogl_tex_coord_in[0].xy, cogl_color_out);'; + const code = getShaderSource(`${Globals.extension_dir}/Sombrero.frag`); + const main = 'PS_Sombrero(true, false, source_to_display_ratio, show_banner, cogl_tex_coord_in[0].xy, cogl_color_out);'; this.add_glsl_snippet(Shell.SnippetHook.FRAGMENT, code, main, false); } @@ -360,7 +361,7 @@ var XREffect = GObject.registerClass({ let buffer = new Uint8Array(data[1]).buffer; this._dataView = new DataView(buffer); if (!this._initialized) { - this.set_uniform_float(this.get_uniform_location('uDesktopTexture'), 1, [0]); + this.set_uniform_float(this.get_uniform_location('screenTexture'), 1, [0]); try { // this can break in GNOME 42 @@ -369,8 +370,8 @@ var XREffect = GObject.registerClass({ } catch (e) { Globals.logger.log(`ERROR: xrEffect.js vfunc_paint_target ${e.message}\n${e.stack}`); } - this.get_pipeline().set_uniform_1i(this.get_uniform_location('uCalibratingTexture'), 1); - this.get_pipeline().set_uniform_1i(this.get_uniform_location('uCustomBannerTexture'), 2); + this.get_pipeline().set_uniform_1i(this.get_uniform_location('calibratingTexture'), 1); + this.get_pipeline().set_uniform_1i(this.get_uniform_location('customBannerTexture'), 2); for (let key in shaderUniformLocations) { shaderUniformLocations[key] = this.get_uniform_location(key); diff --git a/modules/XRLinuxDriver b/modules/XRLinuxDriver index 2e07ebe..d7415dc 160000 --- a/modules/XRLinuxDriver +++ b/modules/XRLinuxDriver @@ -1 +1 @@ -Subproject commit 2e07ebe241afc9582065f974e19f3d0d6dec5c0c +Subproject commit d7415dc00a29afb5db844fd5867de4f0cc09d85d diff --git a/modules/sombrero b/modules/sombrero index ec3f82a..46b9988 160000 --- a/modules/sombrero +++ b/modules/sombrero @@ -1 +1 @@ -Subproject commit ec3f82aa4834847adf1f0c640eba4b87b6f3ff65 +Subproject commit 46b99881e066fdc8a90b36dd9f83cc9894ecffa0 diff --git a/ui/meson.build b/ui/meson.build index e0beda9..c4bd796 100644 --- a/ui/meson.build +++ b/ui/meson.build @@ -1,5 +1,5 @@ project('breezydesktop', - version: '0.1.1', + version: '0.11.0', meson_version: '>= 0.62.0', default_options: [ 'warning_level=2', 'werror=false', ], ) diff --git a/ui/po/LINGUAS b/ui/po/LINGUAS index 82bd741..25b3c08 100644 --- a/ui/po/LINGUAS +++ b/ui/po/LINGUAS @@ -1 +1 @@ -de es fr it ja pl sv zh_CN \ No newline at end of file +de es fr it ja pl pt_BR ru sv uk_UA zh_CN diff --git a/ui/po/fr.po b/ui/po/fr.po index 2764ed7..295aee6 100644 --- a/ui/po/fr.po +++ b/ui/po/fr.po @@ -5,6 +5,7 @@ # msgid "" msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-08-15 15:19-0700\n" @@ -22,285 +23,296 @@ 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:17 msgid "This feature is not currently supported for your device." -msgstr "" +msgstr "Cette fonctionnalité n'est actuellement pas prise en charge par votre appareil." #: src/licensedialog.py:49 msgid "Paid Tier Status" -msgstr "" +msgstr "Statut de l'abonnement payant" #: src/licensedialog.py:57 msgid "Feature Availability" -msgstr "" +msgstr "Disponibilité des fonctionnalités" #: src/licensefeaturerow.py:15 src/shortcutdialog.py:107 msgid "Disabled" -msgstr "" +msgstr "Désactivé" #: src/licensefeaturerow.py:18 msgid "In trial" -msgstr "" +msgstr "En essai" #: src/licensefeaturerow.py:18 msgid "Enabled" -msgstr "" +msgstr "Activé" #: src/licensefeaturerow.py:24 src/licensetierrow.py:30 #, python-brace-format msgid " ({time_remaining} remaining)" -msgstr "" +msgstr " ({time_remaining} restant)" #: src/licensefeaturerow.py:32 msgid "Side-by-side mode (gaming)" -msgstr "" +msgstr "Mode SBS (jeu)" #: src/licensefeaturerow.py:33 msgid "Smooth Follow (gaming)" -msgstr "" +msgstr "Suivi fluide (jeu)" #: src/licensefeaturerow.py:34 msgid "Breezy Desktop (productivity)" -msgstr "" +msgstr "Breezy Desktop (productivité)" #: src/licensetierrow.py:24 msgid "Active" -msgstr "" +msgstr "Actif" #: src/licensetierrow.py:24 msgid "Inactive" -msgstr "" +msgstr "Inactif" #: src/licensetierrow.py:41 #, python-brace-format msgid "${amount} USD" -msgstr "" +msgstr "${amount} USD" #: src/licensetierrow.py:43 msgid " to renew" -msgstr "" +msgstr " à renouveler" #: src/licensetierrow.py:45 msgid " to upgrade" -msgstr "" +msgstr " à mettre à niveau" #: src/licensetierrow.py:47 msgid "Paid through next renewal period" -msgstr "" +msgstr "Payé jusqu'à la prochaine période de renouvellement" #: src/licensetierrow.py:56 msgid "Gaming" -msgstr "" +msgstr "Jeu" #: src/licensetierrow.py:57 msgid "Productivity" -msgstr "" +msgstr "Productivité" #: src/licensetierrow.py:63 msgid " - renewing monthly" -msgstr "" +msgstr " - renouvellement mensuel" #: src/licensetierrow.py:64 msgid " - renewing yearly" -msgstr "" +msgstr " - renouvellement annuel" #: src/licensetierrow.py:65 msgid "with lifetime access" -msgstr "" +msgstr "avec accès à vie" #: src/licensetierrow.py:72 msgid "Monthly" -msgstr "" +msgstr "Mensuel" #: src/licensetierrow.py:73 msgid "Yearly" -msgstr "" +msgstr "Annuel" #: src/licensetierrow.py:74 msgid "Lifetime" -msgstr "" +msgstr "À vie" #: src/time.py:14 msgid "less than an hour" -msgstr "" +msgstr "moins d'une heure" #: src/time.py:17 msgid "1 hour" -msgstr "" +msgstr "1 heure" #: src/time.py:17 #, python-brace-format msgid "{time_remaining} hours" -msgstr "" +msgstr "{time_remaining} heures" #: src/time.py:20 msgid "1 day" -msgstr "" +msgstr "1 jour" #: src/time.py:20 #, python-brace-format msgid "{time_remaining} days" -msgstr "" +msgstr "{time_remaining} jours" #: src/gtk/connected-device.ui:21 msgid "connected" -msgstr "" +msgstr "connecté" #: src/gtk/connected-device.ui:31 msgid "General Settings" -msgstr "" +msgstr "Paramètres généraux" #: src/gtk/connected-device.ui:41 msgid "Features" -msgstr "" +msgstr "Fonctionnalités" #: src/gtk/connected-device.ui:44 msgid "XR effect" -msgstr "" +msgstr "Effet XR" #: src/gtk/connected-device.ui:45 msgid "Enables the Breezy Desktop XR effect." -msgstr "" +msgstr "Active l'effet Breezy Desktop XR." #: src/gtk/connected-device.ui:55 msgid "Widescreen mode" -msgstr "" +msgstr "Mode grand écran" #: src/gtk/connected-device.ui:66 msgid "Follow mode" -msgstr "" +msgstr "Mode de suivi" #: src/gtk/connected-device.ui:67 msgid "Keep the virtual display near the center of your view." -msgstr "" +msgstr "Gardez l'affichage virtuel près du centre de votre champ de vision." #: src/gtk/connected-device.ui:77 msgid "Curved display" -msgstr "" +msgstr "Affichage incurvé" #: src/gtk/connected-device.ui:78 msgid "Switch between flat and curved displays." -msgstr "" +msgstr "Basculez entre les affichages plats et incurvés." #: src/gtk/connected-device.ui:91 msgid "Adjustments" -msgstr "" +msgstr "Réglages" #: src/gtk/connected-device.ui:94 msgid "Display distance" -msgstr "" +msgstr "Distance d'affichage" #: src/gtk/connected-device.ui:95 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." #: src/gtk/connected-device.ui:123 msgid "Display size" -msgstr "" +msgstr "Taille de l'affichage" #: src/gtk/connected-device.ui:124 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." #: src/gtk/connected-device.ui:152 msgid "Display toggle distances" -msgstr "" +msgstr "Distances de basculement de l'affichage" #: src/gtk/connected-device.ui:153 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." #: src/gtk/connected-device.ui:178 msgid "Follow threshold" -msgstr "" +msgstr "Seuil de suivi" #: src/gtk/connected-device.ui:179 msgid "How far away you can look before the display follows." -msgstr "" +msgstr "Distance jusqu'où vous pouvez regarder avant que l'affichage ne suive." #: src/gtk/connected-device.ui:209 src/gtk/connected-device.ui:215 msgid "Keyboard Shortcuts" -msgstr "" +msgstr "Raccourcis clavier" #: src/gtk/connected-device.ui:218 msgid "Re-center display shortcut" -msgstr "" +msgstr "Raccourci de recentrage de l'affichage" #: src/gtk/connected-device.ui:219 msgid "Pin the virtual display to the current position." -msgstr "" +msgstr "Fixez l'affichage virtuel à la position actuelle." #: src/gtk/connected-device.ui:238 src/gtk/connected-device.ui:267 #: src/gtk/connected-device.ui:296 msgid "Change" -msgstr "" +msgstr "Changer" #: src/gtk/connected-device.ui:247 msgid "Display distance shortcut" -msgstr "" +msgstr "Raccourci de distance d'affichage" #: src/gtk/connected-device.ui:248 msgid "Quickly toggle between two predefined distances." -msgstr "" +msgstr "Basculez rapidement entre deux distances prédéfinies." #: src/gtk/connected-device.ui:276 msgid "Toggle follow mode shortcut" -msgstr "" +msgstr "Raccourci de basculement du mode de suivi" #: src/gtk/connected-device.ui:277 msgid "Quickly toggle follow mode." -msgstr "" +msgstr "Basculer rapidement le mode de suivi." #: src/gtk/connected-device.ui:312 src/gtk/connected-device.ui:318 msgid "Advanced Settings" -msgstr "" +msgstr "Paramètres avancés" #: src/gtk/connected-device.ui:321 msgid "Find optimal display config" -msgstr "" +msgstr "Trouver la configuration d'affichage optimale" #: src/gtk/connected-device.ui:322 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:332 msgid "Use highest refresh rate" -msgstr "" +msgstr "Utiliser le taux de rafraîchissement le plus élevé" #: src/gtk/connected-device.ui:333 msgid "Refresh rate may affect performance, disable this to set it manually." -msgstr "" +msgstr "Un taux de rafraîchissement élevé peut affecter les performances, désactivez-le pour le définir manuellement." #: src/gtk/connected-device.ui:343 msgid "Always primary display" -msgstr "" +msgstr "Affichage principal en permanence" #: src/gtk/connected-device.ui:344 msgid "Automatically set the glasses as the primary display when plugged in." -msgstr "" +msgstr "Définissez automatiquement les lunettes comme affichage principal lorsqu'elles sont branchées." #: src/gtk/connected-device.ui:354 msgid "Fast SBS mode switching" -msgstr "" +msgstr "Bascule rapide vers le mode SBS" #: src/gtk/connected-device.ui:355 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." #: src/gtk/connected-device.ui:365 msgid "Movement look-ahead" -msgstr "" +msgstr "Prédiction de mouvement" #: src/gtk/connected-device.ui:366 msgid "" @@ -308,48 +320,54 @@ msgid "" "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:384 msgid "Default" -msgstr "" +msgstr "Par défaut" #: src/gtk/failed-verification.ui:13 msgid "Breezy Desktop GNOME invalid setup" -msgstr "" +msgstr "Configuration Breezy Desktop GNOME non valide" #: src/gtk/failed-verification.ui:14 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.ui:5 src/gtk/window.ui:55 msgid "License Details" -msgstr "" +msgstr "Détails de la licence" #: src/gtk/license-dialog.ui:27 msgid "Donate" -msgstr "" +msgstr "Faire un don" #: src/gtk/license-dialog.ui:44 msgid "Request a token" -msgstr "" +msgstr "Demander un jeton d'authentification" #: src/gtk/license-dialog.ui:52 msgid "Verify token" -msgstr "" +msgstr "Vérifier le jeton d'authentification" #: src/gtk/no-device.ui:13 msgid "No device connected" -msgstr "" +msgstr "Aucun appareil connecté" #: src/gtk/no-device.ui:14 msgid "Breezy Desktop was unable to detect any supported XR devices." -msgstr "" +msgstr "Breezy Desktop n'a pas pu détecter d'appareils XR pris en charge." #: src/gtk/no-driver.ui:13 msgid "No driver running" -msgstr "" +msgstr "Aucun pilote en cours d'exécution" #: src/gtk/no-driver.ui:14 msgid "" @@ -362,20 +380,31 @@ msgid "" "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:13 msgid "Breezy Desktop GNOME extension not ready" -msgstr "" +msgstr "Extension Breezy Desktop GNOME non prête" #: src/gtk/no-extension.ui:14 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:13 msgid "No license file was found" -msgstr "" +msgstr "Aucun fichier de licence trouvé" #: src/gtk/no-license.ui:14 msgid "" @@ -392,43 +421,55 @@ msgid "" "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:27 msgid "Try Again" -msgstr "" +msgstr "Réessayer" #: src/gtk/shortcut-dialog.ui:5 msgid "Assign Keyboard Shortcut" -msgstr "" +msgstr "Attribuer un raccourci clavier" #: src/gtk/shortcut-dialog.ui:20 msgid "Press your keyboard shortcut or 'Backspace' to disable..." -msgstr "" +msgstr "Appuyez sur votre raccourci clavier ou sur 'Backspace' pour désactiver..." #: src/gtk/window.ui:10 msgid "Breezy Desktop" -msgstr "" +msgstr "Breezy Desktop" #: src/gtk/window.ui:23 msgid "Menu" -msgstr "" +msgstr "Menu" #: src/gtk/window.ui:35 msgid "Some features expire soon" -msgstr "" +msgstr "Certaines fonctionnalités expirent bientôt" #: src/gtk/window.ui:36 src/gtk/window.ui:43 msgid "View details" -msgstr "" +msgstr "Afficher les détails" #: src/gtk/window.ui:42 msgid "Productivity features are disabled" -msgstr "" +msgstr "Les fonctionnalités de productivité sont désactivées" #: src/gtk/window.ui:59 msgid "Force Reset" -msgstr "" +msgstr "Réinitialiser" #: src/gtk/window.ui:63 msgid "About BreezyDesktop" -msgstr "" +msgstr "À propos de BreezyDesktop" diff --git a/ui/po/fr/LC_MESSAGES/breezydesktop.mo b/ui/po/fr/LC_MESSAGES/breezydesktop.mo index 742d696..244a50e 100644 Binary files a/ui/po/fr/LC_MESSAGES/breezydesktop.mo and b/ui/po/fr/LC_MESSAGES/breezydesktop.mo differ diff --git a/ui/po/ja.po b/ui/po/ja.po index f86ffae..015ed58 100644 --- a/ui/po/ja.po +++ b/ui/po/ja.po @@ -5,7 +5,7 @@ # # Breezy DesktopやXR、GNOMEのような固有名詞はそのままの表記にしています。 #「gaming」が「ゲーミング」なので「productivity」も「プロダクティビティ」とカナ表記にしました。 -#「glasses」は「XR効果」から「XRメガネ」にしても良かったんですが、繰り返すのもくどいので「メガネ」にしてます。 +#「glasses」は「XRエフェクト」から「XRメガネ」にしても良かったんですが、繰り返すのもくどいので「メガネ」にしてます。 # msgid "" msgstr "" @@ -25,15 +25,15 @@ msgstr "" msgid "" "Switches your glasses into side-by-side mode and doubles the width of the " "display." -msgstr "ARグラスをサイドバイサイドモードに切り替え、表示の幅を2倍にします。" +msgstr "メガネを3Dモードに切り替え、表示の幅を2倍にします。" #: src/connecteddevice.py:17 msgid "This feature is not currently supported for your device." -msgstr "この機能は現在、お使いのデバイスではサポートされていません。" +msgstr "この機能は現在接続されているデバイスではサポートされていません。" #: src/licensedialog.py:49 msgid "Paid Tier Status" -msgstr "有料会員資格" +msgstr "有料ティアの状態" #: src/licensedialog.py:57 msgid "Feature Availability" @@ -45,7 +45,7 @@ msgstr "無効" #: src/licensefeaturerow.py:18 msgid "In trial" -msgstr "試用中" +msgstr "試用期間中" #: src/licensefeaturerow.py:18 msgid "Enabled" @@ -79,15 +79,15 @@ msgstr "非アクティブ" #: src/licensetierrow.py:41 #, python-brace-format msgid "${amount} USD" -msgstr "${amount}ドル" +msgstr "あと${amount} (USD)" #: src/licensetierrow.py:43 msgid " to renew" -msgstr "を更新" +msgstr "で更新可能" #: src/licensetierrow.py:45 msgid " to upgrade" -msgstr "にアップグレード" +msgstr "でアップグレード可能" #: src/licensetierrow.py:47 msgid "Paid through next renewal period" @@ -103,27 +103,27 @@ msgstr "プロダクティビティ" #: src/licensetierrow.py:63 msgid " - renewing monthly" -msgstr " - 毎月更新" +msgstr " - 月払い" #: src/licensetierrow.py:64 msgid " - renewing yearly" -msgstr " - 毎年更新" +msgstr " - 年払い" #: src/licensetierrow.py:65 msgid "with lifetime access" -msgstr "生涯アクセス権付き" +msgstr "一括払い済み" #: src/licensetierrow.py:72 msgid "Monthly" -msgstr "月額" +msgstr "月払い" #: src/licensetierrow.py:73 msgid "Yearly" -msgstr "年額" +msgstr "年払い" #: src/licensetierrow.py:74 msgid "Lifetime" -msgstr "生涯" +msgstr "一括払い" #: src/time.py:14 msgid "less than an hour" @@ -161,11 +161,11 @@ msgstr "機能" #: src/gtk/connected-device.ui:44 msgid "XR effect" -msgstr "XR効果" +msgstr "XRエフェクト" #: src/gtk/connected-device.ui:45 msgid "Enables the Breezy Desktop XR effect." -msgstr "Breezy DesktopのXR効果を有効にします。" +msgstr "Breezy DesktopのXRエフェクトを有効にします。" #: src/gtk/connected-device.ui:55 msgid "Widescreen mode" @@ -193,14 +193,15 @@ msgstr "調整" #: src/gtk/connected-device.ui:94 msgid "Display distance" -msgstr "ディスプレイとの距離" +msgstr "ディスプレイ距離" #: src/gtk/connected-device.ui:95 msgid "" "Closer appears larger, further appears smaller. Controls depth when in " "widescreen mode." msgstr "" -"近づけると大きく見え、遠ざけると小さく見えます。ワイドスクリーンモードの奥行きを制御します。" +"近づけると大きく見え、遠ざけると小さく見えます。\n" +"ワイドスクリーンモードの奥行きを制御します。" #: src/gtk/connected-device.ui:123 msgid "Display size" @@ -211,11 +212,11 @@ msgid "" "Combine with display distance to achieve a comfortable level of depth and " "size." msgstr "" -"ディスプレイ距離と組み合わせて、奥行きとサイズの快適なレベルを達成します。" +"ディスプレイ距離と組み合わせて、\n快適な奥行きとサイズを実現します。" #: src/gtk/connected-device.ui:152 msgid "Display toggle distances" -msgstr "ディスプレイ距離切り替え" +msgstr "ディスプレイ距離の切り替え" #: src/gtk/connected-device.ui:153 msgid "" @@ -230,7 +231,7 @@ msgstr "フォローしきい値" #: src/gtk/connected-device.ui:179 msgid "How far away you can look before the display follows." -msgstr "どれだけ遠ざかるとディスプレイがフォロー(追従)するか" +msgstr "ディスプレイがフォロー(追従)を開始するまでの距離" #: src/gtk/connected-device.ui:209 src/gtk/connected-device.ui:215 msgid "Keyboard Shortcuts" @@ -238,7 +239,7 @@ msgstr "キーボードショートカット" #: src/gtk/connected-device.ui:218 msgid "Re-center display shortcut" -msgstr "中心へ移動するショートカット" +msgstr "ディスプレイを中央へ移動" #: src/gtk/connected-device.ui:219 msgid "Pin the virtual display to the current position." @@ -251,7 +252,7 @@ msgstr "変更" #: src/gtk/connected-device.ui:247 msgid "Display distance shortcut" -msgstr "ディスプレイ距離ショートカット" +msgstr "ディスプレイ距離の切り替え" #: src/gtk/connected-device.ui:248 msgid "Quickly toggle between two predefined distances." @@ -259,11 +260,11 @@ msgstr "設定してある2個の距離をすばやく切り替えます。" #: src/gtk/connected-device.ui:276 msgid "Toggle follow mode shortcut" -msgstr "フォローモードに切り替えるショートカット" +msgstr "フォローモードの切り替え" #: src/gtk/connected-device.ui:277 msgid "Quickly toggle follow mode." -msgstr "フォローモードにすばやく切り替えます。" +msgstr "フォローモードのオン/オフをすばやく切り替えます。" #: src/gtk/connected-device.ui:312 src/gtk/connected-device.ui:318 msgid "Advanced Settings" @@ -336,7 +337,7 @@ msgstr "" #: src/gtk/license-dialog.ui:5 src/gtk/window.ui:55 msgid "License Details" -msgstr "ライセンス詳細" +msgstr "ライセンスの詳細" #: src/gtk/license-dialog.ui:27 msgid "Donate" @@ -411,11 +412,11 @@ msgid "" " " msgstr "" "\n" -" Breezy Desktopを初めて使用する際は、デバイスのライセンスを取得するためにインターネット接続が必要です。\n" +" Breezy Desktopを初めて使用する際は、デバイスライセンスを取得するためにインターネット接続が必要です。\n" " \n" -" 寄付する義務はありません。まだであれば、Breezy Desktopがニーズに合っているかどうかを判断できるトライアルライセンスが提供されます。\n" +" ご安心ください。今すぐに寄付する必要はありません。寄付していない場合は、Breezy Desktopがニーズに合っているかどうかを判断できる試用ライセンスが提供されます。\n" " \n" -" ライセンスを取得したら、トライアルであろうと、Breezy Desktopをオフラインで使用できます。機能が期限切れるまで(または生涯アクセスを選択した場合)、無期限に使用できます。\n" +" ライセンスを取得したら、試用期間中であろうと期限切れるまではBreezy Desktopをオフラインで使用できます。(生涯アクセスを選択した場合は期限はありません。)\n" " " #: src/gtk/no-license.ui:27 diff --git a/ui/po/ja/LC_MESSAGES/breezydesktop.mo b/ui/po/ja/LC_MESSAGES/breezydesktop.mo index d4fc671..9566ea2 100644 Binary files a/ui/po/ja/LC_MESSAGES/breezydesktop.mo and b/ui/po/ja/LC_MESSAGES/breezydesktop.mo differ diff --git a/ui/po/pt_BR.po b/ui/po/pt_BR.po new file mode 100644 index 0000000..543d965 --- /dev/null +++ b/ui/po/pt_BR.po @@ -0,0 +1,477 @@ +# 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: 2024-08-19 09:50-0700\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:16 +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:17 +msgid "This feature is not currently supported for your device." +msgstr "Este recurso não é atualmente suportado para o seu dispositivo." + +#: src/licensedialog.py:49 +msgid "Paid Tier Status" +msgstr "Status do Nível Pago" + +#: src/licensedialog.py:57 +msgid "Feature Availability" +msgstr "Disponibilidade de Recursos" + +#: src/licensefeaturerow.py:15 src/shortcutdialog.py:107 +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:32 +msgid "Side-by-side mode (gaming)" +msgstr "Modo lado a lado (Jogos)" + +#: src/licensefeaturerow.py:33 +msgid "Smooth Follow (gaming)" +msgstr "Acompanhar Suavemente (Jogos)" + +#: src/licensefeaturerow.py:34 +msgid "Breezy Desktop (productivity)" +msgstr "Breezy Desktop (produtividade)" + +#: src/licensetierrow.py:24 +msgid "Active" +msgstr "Ativo" + +#: src/licensetierrow.py:24 +msgid "Inactive" +msgstr "Inativo" + +#: src/licensetierrow.py:41 +#, fuzzy, 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:56 +msgid "Gaming" +msgstr "Jogos" + +#: src/licensetierrow.py:57 +msgid "Productivity" +msgstr "Produtividade" + +#: 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:44 +msgid "XR effect" +msgstr "Efeito XR" + +#: src/gtk/connected-device.ui:45 +msgid "Enables the Breezy Desktop XR effect." +msgstr "Habilita o efeito XR do Breezy Desktop." + +#: src/gtk/connected-device.ui:55 +msgid "Widescreen mode" +msgstr "Modo Ultrawide" + +#: src/gtk/connected-device.ui:66 +msgid "Follow mode" +msgstr "Modo de acompanhamento" + +#: src/gtk/connected-device.ui:67 +msgid "Keep the virtual 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:77 +msgid "Curved display" +msgstr "Tela curva" + +#: src/gtk/connected-device.ui:78 +msgid "Switch between flat and curved displays." +msgstr "Alterne entre tela plana e tela curva." + +#: src/gtk/connected-device.ui:91 +msgid "Adjustments" +msgstr "Ajustes" + +#: src/gtk/connected-device.ui:94 +msgid "Display distance" +msgstr "Distância da tela" + +#: src/gtk/connected-device.ui:95 +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." + +#: src/gtk/connected-device.ui:123 +msgid "Display size" +msgstr "Tamanho da tela" + +#: src/gtk/connected-device.ui:124 +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." + +#: src/gtk/connected-device.ui:152 +msgid "Display toggle distances" +msgstr "Alternância das distâncias de tela" + +#: src/gtk/connected-device.ui:153 +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." + +#: src/gtk/connected-device.ui:178 +msgid "Follow threshold" +msgstr "Sensibilidade do modo de acompanhamento" + +#: src/gtk/connected-device.ui:179 +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:209 src/gtk/connected-device.ui:215 +msgid "Keyboard Shortcuts" +msgstr "Atalhos de teclado" + +#: src/gtk/connected-device.ui:218 +msgid "Re-center display shortcut" +msgstr "Atalho para recentralizar a tela" + +#: src/gtk/connected-device.ui:219 +msgid "Pin the virtual display to the current position." +msgstr "Traga a tela virtual para onde você está olhando." + +#: src/gtk/connected-device.ui:238 src/gtk/connected-device.ui:267 +#: src/gtk/connected-device.ui:296 +msgid "Change" +msgstr "Alterar" + +#: src/gtk/connected-device.ui:247 +msgid "Display distance shortcut" +msgstr "Atalho de distância da tela" + +#: src/gtk/connected-device.ui:248 +msgid "Quickly toggle between two predefined distances." +msgstr "Alterne rapidamente entre as duas distâncias predefinidas." + +#: src/gtk/connected-device.ui:276 +msgid "Toggle follow mode shortcut" +msgstr "Atalho para alternar o modo de acompanhamento" + +#: src/gtk/connected-device.ui:277 +msgid "Quickly toggle follow mode." +msgstr "Alterne rapidamente o modo de acompanhamento." + +#: src/gtk/connected-device.ui:312 src/gtk/connected-device.ui:318 +msgid "Advanced Settings" +msgstr "Configurações Avançadas" + +#: src/gtk/connected-device.ui:321 +msgid "Find optimal display config" +msgstr "Encontre a configuração de tela ideal" + +#: src/gtk/connected-device.ui:322 +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:332 +msgid "Use highest refresh rate" +msgstr "Use a taxa de atualização mais alta" + +#: src/gtk/connected-device.ui:333 +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:343 +msgid "Always primary display" +msgstr "Sempre tela principal" + +#: src/gtk/connected-device.ui:344 +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:354 +msgid "Fast SBS mode switching" +msgstr "Alternância rápida do modo SBS" + +#: src/gtk/connected-device.ui:355 +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." + +#: src/gtk/connected-device.ui:365 +msgid "Movement look-ahead" +msgstr "Antecipação de movimento" + +#: src/gtk/connected-device.ui:366 +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:384 +msgid "Default" +msgstr "Padrão" + +#: src/gtk/failed-verification.ui:13 +msgid "Breezy Desktop GNOME invalid setup" +msgstr "Configuração inválida do Breezy Desktop GNOME" + +#: src/gtk/failed-verification.ui:14 +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.ui:5 src/gtk/window.ui:55 +msgid "License Details" +msgstr "Detalhes da Licença" + +#: src/gtk/license-dialog.ui:27 +msgid "Donate" +msgstr "Doar" + +#: src/gtk/license-dialog.ui:44 +msgid "Request a token" +msgstr "Solicitar um token" + +#: src/gtk/license-dialog.ui:52 +msgid "Verify token" +msgstr "Verificar token" + +#: src/gtk/no-device.ui:13 +msgid "No device connected" +msgstr "Nenhum dispositivo conectado" + +#: src/gtk/no-device.ui:14 +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-driver.ui:13 +msgid "No driver running" +msgstr "Nenhum driver em execução" + +#: src/gtk/no-driver.ui:14 +#, fuzzy +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 "" +" 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." + +#: src/gtk/no-extension.ui:13 +msgid "Breezy Desktop GNOME extension not ready" +msgstr "Extensão do Breezy Desktop GNOME não está pronta" + +#: src/gtk/no-extension.ui:14 +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:13 +msgid "No license file was found" +msgstr "Nenhum arquivo de licença foi encontrado" + +#: src/gtk/no-license.ui:14 +#, fuzzy +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 "" +" 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)." + +#: src/gtk/no-license.ui:27 +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:35 +msgid "Some features expire soon" +msgstr "Algumas funcionalidades expirarão em breve" + +#: src/gtk/window.ui:36 src/gtk/window.ui:43 +msgid "View details" +msgstr "Ver detalhes" + +#: src/gtk/window.ui:42 +msgid "Productivity features are disabled" +msgstr "As funcionalidades de produtividade estão desabilitadas" + +#: src/gtk/window.ui:59 +msgid "Force Reset" +msgstr "Forçar redefinição" + +#: src/gtk/window.ui:63 +msgid "About BreezyDesktop" +msgstr "Sobre o BreezyDesktop" diff --git a/ui/po/pt_BR/LC_MESSAGES/breezydesktop.mo b/ui/po/pt_BR/LC_MESSAGES/breezydesktop.mo new file mode 100644 index 0000000..1794ccb Binary files /dev/null and b/ui/po/pt_BR/LC_MESSAGES/breezydesktop.mo differ diff --git a/ui/po/ru.po b/ui/po/ru.po new file mode 100644 index 0000000..83efc79 --- /dev/null +++ b/ui/po/ru.po @@ -0,0 +1,482 @@ +# 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: 2024-08-17 09:44-0700\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:16 +msgid "" +"Switches your glasses into side-by-side mode and doubles the width of the " +"display." +msgstr "" +"Переключает очки в режим «сторона к стороне» и удваивает ширину дисплея." + +#: src/connecteddevice.py:17 +msgid "This feature is not currently supported for your device." +msgstr "Эта функция в настоящее время не поддерживается для вашего устройства." + +#: src/licensedialog.py:49 +msgid "Paid Tier Status" +msgstr "Статус платного уровня" + +#: src/licensedialog.py:57 +msgid "Feature Availability" +msgstr "Статус функций" + +#: src/licensefeaturerow.py:15 src/shortcutdialog.py:107 +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:32 +msgid "Side-by-side mode (gaming)" +msgstr "Режим «бок о бок» (игровой режим)" + +#: src/licensefeaturerow.py:33 +msgid "Smooth Follow (gaming)" +msgstr "Плавное следование (игровой режим)" + +#: src/licensefeaturerow.py:34 +msgid "Breezy Desktop (productivity)" +msgstr "Breezy Desktop (продуктивный режим)" + +#: 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:56 +msgid "Gaming" +msgstr "Игровой режим" + +#: src/licensetierrow.py:57 +msgid "Productivity" +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:44 +msgid "XR effect" +msgstr "Эффект XR" + +#: src/gtk/connected-device.ui:45 +msgid "Enables the Breezy Desktop XR effect." +msgstr "Включает эффект Breezy Desktop XR." + +#: src/gtk/connected-device.ui:55 +msgid "Widescreen mode" +msgstr "Режим широкого экрана" + +#: src/gtk/connected-device.ui:66 +msgid "Follow mode" +msgstr "Режим следования" + +#: src/gtk/connected-device.ui:67 +msgid "Keep the virtual display near the center of your view." +msgstr "Поддерживает виртуальный дисплей вблизи центра вашего зрения." + +#: src/gtk/connected-device.ui:77 +msgid "Curved display" +msgstr "Изогнутый дисплей" + +#: src/gtk/connected-device.ui:78 +msgid "Switch between flat and curved displays." +msgstr "Переключается между плоскими и изогнутыми дисплеями." + +#: src/gtk/connected-device.ui:91 +msgid "Adjustments" +msgstr "Настройки" + +#: src/gtk/connected-device.ui:94 +msgid "Display distance" +msgstr "Расстояние дисплея" + +#: src/gtk/connected-device.ui:95 +msgid "" +"Closer appears larger, further appears smaller. Controls depth when in " +"widescreen mode." +msgstr "" +"Чем ближе, тем больше. Чем дальше, тем меньше. Управляет глубиной при " +"использовании режима широкого экрана." + +#: src/gtk/connected-device.ui:123 +msgid "Display size" +msgstr "Размер дисплея" + +#: src/gtk/connected-device.ui:124 +msgid "" +"Combine with display distance to achieve a comfortable level of depth and " +"size." +msgstr "" +"Комбинируйте с расстоянием дисплея, чтобы достичь комфортного уровня глубины " +"и размера." + +#: src/gtk/connected-device.ui:152 +msgid "Display toggle distances" +msgstr "Переключения расстояние дисплея" + +#: src/gtk/connected-device.ui:153 +msgid "" +"Use the buttons to capture the current display distance for use with the " +"keyboard shortcut." +msgstr "" +"Используйте кнопки, чтобы зафиксировать текущее расстояние дисплея для " +"использования с сочетанием клавиш." + +#: src/gtk/connected-device.ui:178 +msgid "Follow threshold" +msgstr "Порог следования" + +#: src/gtk/connected-device.ui:179 +msgid "How far away you can look before the display follows." +msgstr "" +"Как далеко вы можете отвернуть взгляд, прежде чем дисплей последует за " +"вами." + +#: src/gtk/connected-device.ui:209 src/gtk/connected-device.ui:215 +msgid "Keyboard Shortcuts" +msgstr "Сочетания клавиш" + +#: src/gtk/connected-device.ui:218 +msgid "Re-center display shortcut" +msgstr "Сочетание клавиш для перецентровки дисплея" + +#: src/gtk/connected-device.ui:219 +msgid "Pin the virtual display to the current position." +msgstr "Фиксировать виртуальный дисплей в текущем положении." + +#: src/gtk/connected-device.ui:238 src/gtk/connected-device.ui:267 +#: src/gtk/connected-device.ui:296 +msgid "Change" +msgstr "Изменить" + +#: src/gtk/connected-device.ui:247 +msgid "Display distance shortcut" +msgstr "Сочетание клавиш для расстояния дисплея" + +#: src/gtk/connected-device.ui:248 +msgid "Quickly toggle between two predefined distances." +msgstr "Быстро переключаться между двумя предопределенными расстояниями." + +#: src/gtk/connected-device.ui:276 +msgid "Toggle follow mode shortcut" +msgstr "Сочетание клавиш для переключения режима следования" + +#: src/gtk/connected-device.ui:277 +msgid "Quickly toggle follow mode." +msgstr "Быстро переключать режим следования." + +#: src/gtk/connected-device.ui:312 src/gtk/connected-device.ui:318 +msgid "Advanced Settings" +msgstr "Дополнительные настройки" + +#: src/gtk/connected-device.ui:321 +msgid "Find optimal display config" +msgstr "Найти оптимальную конфигурацию дисплея" + +#: src/gtk/connected-device.ui:322 +msgid "" +"Automatically modify the glasses display configuration for maximum " +"resolution and best scaling when plugged in." +msgstr "" +"Автоматически изменять конфигурацию дисплея очков для максимального " +"разрешения и лучшей масштабирования при подключении." + +#: src/gtk/connected-device.ui:332 +msgid "Use highest refresh rate" +msgstr "Использовать высшую частоту обновления" + +#: src/gtk/connected-device.ui:333 +msgid "Refresh rate may affect performance, disable this to set it manually." +msgstr "" +"Частота обновления может повлиять на производительность, отключите это, " +"чтобы установить ее вручную." + +#: src/gtk/connected-device.ui:343 +msgid "Always primary display" +msgstr "Всегда основной дисплей" + +#: src/gtk/connected-device.ui:344 +msgid "Automatically set the glasses as the primary display when plugged in." +msgstr "" +"Автоматически устанавливать очки в качестве основного дисплея при " +"подключении." + +#: src/gtk/connected-device.ui:354 +msgid "Fast SBS mode switching" +msgstr "Быстрое переключение режима SBS" + +#: src/gtk/connected-device.ui:355 +msgid "" +"Switches glasses to SBS mode immediately when plugged in, if widescreen mode " +"is on. May cause instability." +msgstr "" +"Переключает очки в режим SBS сразу при подключении, если режим широкого " +"экрана включен. Может вызвать нестабильность." + +#: src/gtk/connected-device.ui:365 +msgid "Movement look-ahead" +msgstr "Прогнозирование движения" + +#: src/gtk/connected-device.ui:366 +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:384 +msgid "Default" +msgstr "По умолчанию" + +#: src/gtk/failed-verification.ui:13 +msgid "Breezy Desktop GNOME invalid setup" +msgstr "Недействительная настройка Breezy Desktop GNOME" + +#: src/gtk/failed-verification.ui:14 +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.ui:5 src/gtk/window.ui:55 +msgid "License Details" +msgstr "Подробности лицензии" + +#: src/gtk/license-dialog.ui:27 +msgid "Donate" +msgstr "Донатить" + +#: src/gtk/license-dialog.ui:44 +msgid "Request a token" +msgstr "Запросить токен" + +#: src/gtk/license-dialog.ui:52 +msgid "Verify token" +msgstr "Проверить токен" + +#: src/gtk/no-device.ui:13 +msgid "No device connected" +msgstr "Устройство не подключено" + +#: src/gtk/no-device.ui:14 +msgid "Breezy Desktop was unable to detect any supported XR devices." +msgstr "Breezy Desktop не смог обнаружить никаких поддерживаемых устройств XR." + +#: src/gtk/no-driver.ui:13 +msgid "No driver running" +msgstr "Драйвер не запущен" + +#: src/gtk/no-driver.ui:14 +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:13 +msgid "Breezy Desktop GNOME extension not ready" +msgstr "Расширение Breezy Desktop GNOME не готово" + +#: src/gtk/no-extension.ui:14 +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:13 +msgid "No license file was found" +msgstr "Файл лицензии не найден" + +#: src/gtk/no-license.ui:14 +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:27 +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:35 +msgid "Some features expire soon" +msgstr "Некоторые функции скоро истекут" + +#: src/gtk/window.ui:36 src/gtk/window.ui:43 +msgid "View details" +msgstr "Просмотреть детали" + +#: src/gtk/window.ui:42 +msgid "Productivity features are disabled" +msgstr "Функции повышения производительности отключены" + +#: src/gtk/window.ui:59 +msgid "Force Reset" +msgstr "Сброс" + +#: src/gtk/window.ui:63 +msgid "About BreezyDesktop" +msgstr "О BreezyDesktop" \ No newline at end of file diff --git a/ui/po/ru/LC_MESSAGES/breezydesktop.mo b/ui/po/ru/LC_MESSAGES/breezydesktop.mo new file mode 100644 index 0000000..17b4db3 Binary files /dev/null and b/ui/po/ru/LC_MESSAGES/breezydesktop.mo differ diff --git a/ui/po/uk_UA.po b/ui/po/uk_UA.po new file mode 100644 index 0000000..9cbecff --- /dev/null +++ b/ui/po/uk_UA.po @@ -0,0 +1,460 @@ +# 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: 2024-08-15 15:36-0700\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:16 +msgid "" +"Switches your glasses into side-by-side mode and doubles the width of the " +"display." +msgstr "Переключає окуляри в режим «бок о бок» і подвоює ширину дисплея." + +#: src/connecteddevice.py:17 +msgid "This feature is not currently supported for your device." +msgstr "Ця функція наразі не підтримується на вашому пристрої." + +#: src/licensedialog.py:49 +msgid "Paid Tier Status" +msgstr "Статус платного рівня" + +#: src/licensedialog.py:57 +msgid "Feature Availability" +msgstr "Статус функцій" + +#: src/licensefeaturerow.py:15 src/shortcutdialog.py:107 +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:32 +msgid "Side-by-side mode (gaming)" +msgstr "Режим «бок о бок» (ігровий режим)" + +#: src/licensefeaturerow.py:33 +msgid "Smooth Follow (gaming)" +msgstr "Плавне слідування (ігровий режим)" + +#: src/licensefeaturerow.py:34 +msgid "Breezy Desktop (productivity)" +msgstr "Breezy Desktop (продуктивний прежим)" + +#: 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:56 +msgid "Gaming" +msgstr "Ігровий режим" + +#: src/licensetierrow.py:57 +msgid "Productivity" +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:44 +msgid "XR effect" +msgstr "Ефект XR" + +#: src/gtk/connected-device.ui:45 +msgid "Enables the Breezy Desktop XR effect." +msgstr "Включає ефект Breezy Desktop XR." + +#: src/gtk/connected-device.ui:55 +msgid "Widescreen mode" +msgstr "Режим широкого екрану" + +#: src/gtk/connected-device.ui:66 +msgid "Follow mode" +msgstr "Режим слідування" + +#: src/gtk/connected-device.ui:67 +msgid "Keep the virtual display near the center of your view." +msgstr "Зберігае віртуальний дисплей поблизу центру вашого зору." + +#: src/gtk/connected-device.ui:77 +msgid "Curved display" +msgstr "Викривлений дисплей" + +#: src/gtk/connected-device.ui:78 +msgid "Switch between flat and curved displays." +msgstr "Переключается між плоскими і викривленими дисплеями." + +#: src/gtk/connected-device.ui:91 +msgid "Adjustments" +msgstr "Налаштування" + +#: src/gtk/connected-device.ui:94 +msgid "Display distance" +msgstr "Відстань дисплея" + +#: src/gtk/connected-device.ui:95 +msgid "" +"Closer appears larger, further appears smaller. Controls depth when in " +"widescreen mode." +msgstr "Чим ближче, тим більший. Чим далі, тим менший. Керує глибиною при " +"використанні режиму широкого екрана." + +#: src/gtk/connected-device.ui:123 +msgid "Display size" +msgstr "Розмір дисплея" + +#: src/gtk/connected-device.ui:124 +msgid "" +"Combine with display distance to achieve a comfortable level of depth and " +"size." +msgstr "Поєднуйте з відстанню дисплея, щоб досягти комфортного рівня глибини і розміру." + +#: src/gtk/connected-device.ui:152 +msgid "Display toggle distances" +msgstr "Перемикання відстані дисплея" + +#: src/gtk/connected-device.ui:153 +msgid "" +"Use the buttons to capture the current display distance for use with the " +"keyboard shortcut." +msgstr "Використовуйте кнопки, щоб зафіксувати поточну відстань дисплея для використання " +"з сполученням клавіш." + +#: src/gtk/connected-device.ui:178 +msgid "Follow threshold" +msgstr "Поріг слідування" + +#: src/gtk/connected-device.ui:179 +msgid "How far away you can look before the display follows." +msgstr "Як далеко ви можете відвернути ваш взор, перш ніж дисплей почне слідувати за вами." + +#: src/gtk/connected-device.ui:209 src/gtk/connected-device.ui:215 +msgid "Keyboard Shortcuts" +msgstr "Сполучення клавіш" + +#: src/gtk/connected-device.ui:218 +msgid "Re-center display shortcut" +msgstr "Сполучення клавіш для центрування дисплея" + +#: src/gtk/connected-device.ui:219 +msgid "Pin the virtual display to the current position." +msgstr "Фіксувати віртуальний дисплей у поточній позиції." + +#: src/gtk/connected-device.ui:238 src/gtk/connected-device.ui:267 +#: src/gtk/connected-device.ui:296 +msgid "Change" +msgstr "Змінити" + +#: src/gtk/connected-device.ui:247 +msgid "Display distance shortcut" +msgstr "Сполучення клавіш для відстані дисплея" + +#: src/gtk/connected-device.ui:248 +msgid "Quickly toggle between two predefined distances." +msgstr "Швидко перемикатися між двома попередньо визначеними відстанями." + +#: src/gtk/connected-device.ui:276 +msgid "Toggle follow mode shortcut" +msgstr "Сполучення клавіш для перемикання режиму слідування" + +#: src/gtk/connected-device.ui:277 +msgid "Quickly toggle follow mode." +msgstr "Швидко перемикати режим слідування." + +#: src/gtk/connected-device.ui:312 src/gtk/connected-device.ui:318 +msgid "Advanced Settings" +msgstr "Додаткові налаштування" + +#: src/gtk/connected-device.ui:321 +msgid "Find optimal display config" +msgstr "Знайти оптимальну конфігурацію дисплея" + +#: src/gtk/connected-device.ui:322 +msgid "" +"Automatically modify the glasses display configuration for maximum " +"resolution and best scaling when plugged in." +msgstr "Автоматично змінює конфігурацію дисплея окулярів для максимальної " +"роздільної здатності і найкращого масштабування при підключенні." + +#: src/gtk/connected-device.ui:332 +msgid "Use highest refresh rate" +msgstr "Використовувати найвищу частоту оновлення" + +#: src/gtk/connected-device.ui:333 +msgid "Refresh rate may affect performance, disable this to set it manually." +msgstr "Частота оновлення може вплинути на продуктивність, вимкніть це, " +"щоб встановити її вручну." + +#: src/gtk/connected-device.ui:343 +msgid "Always primary display" +msgstr "Завжди основний дисплей" + +#: src/gtk/connected-device.ui:344 +msgid "Automatically set the glasses as the primary display when plugged in." +msgstr "Автоматично встановлює окуляри як основний дисплей при підключенні." + +#: src/gtk/connected-device.ui:354 +msgid "Fast SBS mode switching" +msgstr "Швидке перемикання режиму SBS" + +#: src/gtk/connected-device.ui:355 +msgid "" +"Switches glasses to SBS mode immediately when plugged in, if widescreen mode " +"is on. May cause instability." +msgstr "Переключає окуляри в режим SBS відразу після підключення, якщо режим " +"широкого екрана увімкнено. Може викликати нестабільність." + +#: src/gtk/connected-device.ui:365 +msgid "Movement look-ahead" +msgstr "Прогнозування руху" + +#: src/gtk/connected-device.ui:366 +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:384 +msgid "Default" +msgstr "За замовчуванням" + +#: src/gtk/failed-verification.ui:13 +msgid "Breezy Desktop GNOME invalid setup" +msgstr "Невірна настройка Breezy Desktop GNOME" + +#: src/gtk/failed-verification.ui:14 +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.ui:5 src/gtk/window.ui:55 +msgid "License Details" +msgstr "Деталі ліцензії" + +#: src/gtk/license-dialog.ui:27 +msgid "Donate" +msgstr "Донатити" + +#: src/gtk/license-dialog.ui:44 +msgid "Request a token" +msgstr "Запитати токен" + +#: src/gtk/license-dialog.ui:52 +msgid "Verify token" +msgstr "Перевірити токен" + +#: src/gtk/no-device.ui:13 +msgid "No device connected" +msgstr "Жоден пристрій не підключено" + +#: src/gtk/no-device.ui:14 +msgid "Breezy Desktop was unable to detect any supported XR devices." +msgstr "Breezy Desktop не зміг виявити жодного підтримуваного XR пристрою." + +#: src/gtk/no-driver.ui:13 +msgid "No driver running" +msgstr "Жоден драйвер не запущений" + +#: src/gtk/no-driver.ui:14 +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:13 +msgid "Breezy Desktop GNOME extension not ready" +msgstr "Розширення Breezy Desktop GNOME не готове" + +#: src/gtk/no-extension.ui:14 +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:13 +msgid "No license file was found" +msgstr "Жоден файл ліцензії не знайдено" + +#: src/gtk/no-license.ui:14 +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:27 +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:35 +msgid "Some features expire soon" +msgstr "Деякі функції закінчуються незабаром" + +#: src/gtk/window.ui:36 src/gtk/window.ui:43 +msgid "View details" +msgstr "Переглянути деталі" + +#: src/gtk/window.ui:42 +msgid "Productivity features are disabled" +msgstr "Функції продуктивного режиму відключені" + +#: src/gtk/window.ui:59 +msgid "Force Reset" +msgstr "Скинути" + +#: src/gtk/window.ui:63 +msgid "About BreezyDesktop" +msgstr "Про BreezyDesktop" diff --git a/ui/po/uk_UA/LC_MESSAGES/breezydesktop.mo b/ui/po/uk_UA/LC_MESSAGES/breezydesktop.mo new file mode 100644 index 0000000..d795448 Binary files /dev/null and b/ui/po/uk_UA/LC_MESSAGES/breezydesktop.mo differ diff --git a/ui/src/licensetierrow.py b/ui/src/licensetierrow.py index b3d1958..0b0d1a1 100644 --- a/ui/src/licensetierrow.py +++ b/ui/src/licensetierrow.py @@ -24,7 +24,7 @@ class LicenseTierRow(Adw.ExpanderRow): status = _('Active') if active_period else _('Inactive') details = '' if active_period: - details += f" {self._period_description[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) diff --git a/ui/src/main.py b/ui/src/main.py index 668cd7b..dccac4f 100644 --- a/ui/src/main.py +++ b/ui/src/main.py @@ -83,6 +83,10 @@ class BreezydesktopApplication(Adw.Application): self.create_action('reset_driver', self.on_reset_driver_action) self._skip_verification = skip_verification + # 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({'refresh_device_license': True}) + def do_activate(self): """Called when the application is activated. @@ -102,7 +106,7 @@ class BreezydesktopApplication(Adw.Application): modal=True, program_name='Breezy Desktop', logo_icon_name='com.xronlinux.BreezyDesktop', - version='0.1.1', + version='0.11.0', authors=['Wayne Heaney'], copyright='© 2024 Wayne Heaney') about.present() diff --git a/vulkan/bin/breezy_vulkan_uninstall b/vulkan/bin/breezy_vulkan_uninstall index 2871771..adc84a7 100755 --- a/vulkan/bin/breezy_vulkan_uninstall +++ b/vulkan/bin/breezy_vulkan_uninstall @@ -24,47 +24,20 @@ USER_HOME=$(getent passwd $USER | cut -d: -f6) if [ -z "$XDG_DATA_HOME" ]; then XDG_DATA_HOME="$USER_HOME/.local/share" fi -DATA_DIR="$XDG_DATA_HOME/breezy_vulkan" -if [ ! -d "$DATA_DIR" ]; then - mkdir -p $DATA_DIR -fi VULKAN_DATA_DIR="$XDG_DATA_HOME/vulkan" -XR_DRIVER_DATA_DIR="$XDG_DATA_HOME/breezy_vulkan" if [ -z "$XDG_CONFIG_HOME" ]; then XDG_CONFIG_HOME="$USER_HOME/.config" fi -CONFIG_DIR="$XDG_CONFIG_HOME/breezy_vulkan" -if [ ! -d "$CONFIG_DIR" ]; then - mkdir -p $CONFIG_DIR -fi if [ -z "$XDG_BIN_HOME" ]; then XDG_BIN_HOME="$USER_HOME/.local/bin" fi OLD_BIN_DIR="$USER_HOME/bin" BIN_DIR="$XDG_BIN_HOME" -if [ ! -d "$BIN_DIR" ]; then - mkdir -p $BIN_DIR -fi - -if [ -z "$XDG_STATE_HOME" ]; then - XDG_STATE_HOME="$USER_HOME/.local/state" -fi -STATE_DIR="$XDG_STATE_HOME/breezy_vulkan" -if [ ! -d "$STATE_DIR" ]; then - mkdir -p $STATE_DIR -fi LIB_DIR="$USER_HOME/.local/lib" -if [ ! -d "$LIB_DIR" ]; then - mkdir -p "$LIB_DIR" -fi - LIB32_DIR="$USER_HOME/.local/lib32" -if [ ! -d "$LIB32_DIR" ]; then - mkdir -p "$LIB32_DIR" -fi if [ "$for_install" -eq 0 ]; then UA_EVENT_NAME="breezy_uninstall" @@ -81,8 +54,8 @@ rm $VULKAN_DATA_DIR/implicit_layer.d/vkBasalt.json rm $VULKAN_DATA_DIR/implicit_layer.d/vkBasalt.x86.json [ "$for_install" -eq 0 ] && echo "Removing vkBasalt and reshade directories at $CONFIG_DIR/" -rm -rf $CONFIG_DIR/vkBasalt -rm -rf $CONFIG_DIR/reshade +rm -rf $XDG_CONFIG_HOME/vkBasalt +rm -rf $XDG_CONFIG_HOME/reshade [ "$for_install" -eq 0 ] && echo "Removing scripts at $BIN_DIR" rm -f $BIN_DIR/breezy_vulkan_verify diff --git a/vulkan/bin/breezy_vulkan_verify b/vulkan/bin/breezy_vulkan_verify index be901e2..1f3f039 100755 --- a/vulkan/bin/breezy_vulkan_verify +++ b/vulkan/bin/breezy_vulkan_verify @@ -8,10 +8,9 @@ file_paths=( ["bin/breezy_vulkan_uninstall"]="{bin_dir}/breezy_vulkan_uninstall" ["vkBasalt.64/libvkbasalt.so"]="{lib_dir}/libvkbasalt.so" ["vkBasalt.32/libvkbasalt.so"]="{lib32_dir}/libvkbasalt.so" - ["IMUAdjust.fx"]="{reshade_config_dir}/Shaders/IMUAdjust.fx" + ["Sombrero.frag"]="{reshade_config_dir}/Shaders/Sombrero.frag" ["ReShade.fxh"]="{reshade_config_dir}/Shaders/ReShade.fxh" ["ReShadeUI.fxh"]="{reshade_config_dir}/Shaders/ReShadeUI.fxh" - ["Sideview.fx"]="{reshade_config_dir}/Shaders/Sideview.fx" ["calibrating.png"]="{reshade_config_dir}/Textures/calibrating.png" ["custom_banner.png"]="{reshade_config_dir}/Textures/custom_banner.png" ["xr_driver/manifest"]="{xr_driver_data_dir}/manifest" diff --git a/vulkan/bin/setup b/vulkan/bin/setup index ab5bac4..5d47841 100755 --- a/vulkan/bin/setup +++ b/vulkan/bin/setup @@ -99,6 +99,9 @@ cp bin/breezy_vulkan_verify $BIN_DIR cp manifest $DATA_DIR # keep putting this in the old location in case an older version of the script tries to find it +if [ ! -d "$OLD_BIN_DIR" ]; then + mkdir -p $OLD_BIN_DIR +fi cp bin/breezy_vulkan_uninstall $OLD_BIN_DIR echo "Installing vkBasalt; copying binaries, configs, and shader files" @@ -121,11 +124,11 @@ fi # copy the vkBasalt.conf file and make replacements sed -e "s|/path/to/reshade-shaders|${RESHADE_CONFIG_DIR}|" \ - -e "s|/path/to/virtual_display|${RESHADE_CONFIG_DIR}/Shaders/IMUAdjust.fx|" \ - -e "s|/path/to/sideview|${RESHADE_CONFIG_DIR}/Shaders/Sideview.fx|" \ + -e "s|/path/to/sombrero|${RESHADE_CONFIG_DIR}/Shaders/Sombrero.frag|" \ config/vkBasalt.conf > $VKBASALT_CONFIG_DIR/vkBasalt.conf echo "Installing the Sombrero shaders and texture files to ${RESHADE_CONFIG_DIR}/{Shaders,Textures}" +cp *.frag $RESHADE_CONFIG_DIR/Shaders cp *.fx* $RESHADE_CONFIG_DIR/Shaders cp *.png $RESHADE_CONFIG_DIR/Textures @@ -137,6 +140,7 @@ chown -R $USER:$GROUP $RESHADE_CONFIG_DIR chown -R $USER:$GROUP $VKBASALT_CONFIG_DIR chown -R $USER:$GROUP $STATE_DIR chown -R $USER:$GROUP $BIN_DIR/breezy_vulkan_* +chown -R $USER:$GROUP $OLD_BIN_DIR # clear bash's cache of executable locations, so it can find the newly installed scripts hash -r diff --git a/vulkan/config/vkBasalt.conf b/vulkan/config/vkBasalt.conf index 46756a0..1402899 100644 --- a/vulkan/config/vkBasalt.conf +++ b/vulkan/config/vkBasalt.conf @@ -1,7 +1,6 @@ -effects = sideview:virtual_display +effects = sombrero -virtual_display = /path/to/virtual_display -sideview = /path/to/sideview +sombrero = /path/to/sombrero reshadeTexturePath = "/path/to/reshade-shaders/Textures" reshadeIncludePath = "/path/to/reshade-shaders/Shaders" depthCapture = off