diff --git a/RHEL.md b/RHEL.md new file mode 100644 index 00000000..10687b33 --- /dev/null +++ b/RHEL.md @@ -0,0 +1,175 @@ +# Solaar installation guide for RHEL, Rocky, AlmaLinux, and CentOS Stream + +This guide covers manual installation and an automated install example for +RHEL-family systems using `dnf`. + +## Supported distributions + +- Red Hat Enterprise Linux (RHEL) +- Rocky Linux +- AlmaLinux +- Oracle Linux +- CentOS Stream + +The commands assume a minimal CLI system with `sudo` access. + +## 1) Install dependencies + +```bash +sudo dnf makecache --refresh +sudo dnf install -y \ + git \ + gtk3 \ + python3 \ + python3-devel \ + python3-dbus \ + python3-gobject \ + python3-pip \ + python3-psutil \ + python3-pyudev \ + python3-setuptools \ + python3-xlib \ + python3-yaml +``` + +Optional troubleshooting helpers: + +```bash +sudo dnf install -y \ + evemu \ + libinput \ + usbutils +``` + +## 2) Clone Solaar + +```bash +git clone https://github.com/pwr-Solaar/Solaar.git +cd Solaar +``` + +## 3) Install Solaar + +Install for the current user: + +```bash +python3 -m pip install --user . +``` + +Or install system-wide: + +```bash +sudo python3 -m pip install . +``` + +## 4) Install udev rules + +Install the recommended `uinput` rule: + +```bash +sudo make install_udev_uinput +``` + +Verify rule installation: + +```bash +ls -l /etc/udev/rules.d/42-logitech-unify-permissions.rules +``` + +Rollback udev rule installation: + +```bash +sudo make uninstall_udev +``` + +## 5) Run Solaar + +```bash +solaar +``` + +or: + +```bash +python3 -m solaar +``` + +## 6) Automated install options + +Use the guided installer in this repository: + +```bash +./tools/install-rhel.sh +``` + +Minimal non-interactive example script: + +```bash +cat > install-rhel-solaar.sh <<'SCRIPT' +#!/usr/bin/env bash +set -euo pipefail + +if [[ "${EUID}" -eq 0 ]]; then + echo "Run as a regular user with sudo access, not as root." + exit 1 +fi + +sudo dnf makecache --refresh +sudo dnf install -y \ + git \ + gtk3 \ + python3 \ + python3-devel \ + python3-dbus \ + python3-gobject \ + python3-pip \ + python3-psutil \ + python3-pyudev \ + python3-setuptools \ + python3-xlib \ + python3-yaml + +if [[ ! -d Solaar/.git ]]; then + git clone https://github.com/pwr-Solaar/Solaar.git +fi + +cd Solaar +python3 -m pip install --user . +sudo make install_udev_uinput +~/.local/bin/solaar --version +SCRIPT + +chmod +x install-rhel-solaar.sh +./install-rhel-solaar.sh +``` + +## 7) Verification + +```bash +command -v solaar +solaar --version +python3 -m pip show solaar +``` + +If installed with `--user`, ensure `~/.local/bin` is on your `PATH`: + +```bash +echo "$PATH" | tr ':' '\n' | grep -Fx "$HOME/.local/bin" >/dev/null || \ + echo 'Add ~/.local/bin to PATH' +``` + +## 8) Troubleshooting + +Receiver not detected: + +```bash +lsusb | grep -Ei 'logitech|046d' +sudo udevadm trigger +``` + +Check access to hidraw devices: + +```bash +ls -l /dev/hidraw* +getfacl /dev/hidraw* 2>/dev/null | sed -n '1,80p' +``` diff --git a/docs/i18n.md b/docs/i18n.md index b114a0d3..3d2c00a3 100644 --- a/docs/i18n.md +++ b/docs/i18n.md @@ -49,7 +49,7 @@ Some of the languages Solaar has been translated to are listed below. A full lis - Danish: John Erling Blad - Dutch: Heimen Stoffels - Français: [Papoteur][papoteur], [David Geiger][david-geiger], [Damien Lallement][damsweb] -- Finnish: Tomi Leppänen +- Finnish: Tomi Leppänen, [Niko Savola][nikosavola] - German: Daniel Frost - Greek: Vangelis Skarmoutsos - Indonesia: [Ferdina Kusumah][feku] @@ -83,3 +83,4 @@ Some of the languages Solaar has been translated to are listed below. A full lis [jeblad]: https://github.com/jeblad [feku]: https://github.com/FerdinaKusumah [renatoka]: https://github.com/renatoka +[nikosavola]: https://github.com/nikosavola diff --git a/docs/installation.md b/docs/installation.md index 06b4d925..c9b58919 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -12,8 +12,6 @@ First install pip, and then run This will not install the Solaar udev rule, which you will need to install manually by copying `~/.local/lib/udev/rules.d/42-logitech-unify-permissions.rules` to `/etc/udev/rules.d` as root. -If you want Solaar rules to simulate input you will have to instead install Solaar's uinput udev rule -from the GitHub repository. ## Installing in macOS @@ -52,8 +50,6 @@ First, install the needed system packages by `make install_apt` or `make install_dnf` or `make install_brew`. These might not install all needed packages in older versions of your distribution. Next, install the Solaar rule via `make install_udev`. -If you are using Wayland instead of X11 you may want to instead `make install_udev_uinput` -so that Solaar rules can simulate input in Wayland. Finally, install Solaar via `make install_pip` or `make install_pipx`. Parts of the installation process require sudo privileges so you may be asked for your password. @@ -129,8 +125,6 @@ For more information see [the rules page](https://pwr-solaar.github.io/Solaar/ru You can install Solaar's udev rule manually by copying the file `rules.d/42-logitech-unify-permissions.rules` as root from the Solaar repository to `/etc/udev/rules.d`. -In Wayland you may want to instead copy -`rules.d-uinput/42-logitech-unify-permissions.rules`. Let udev reload its rules by running `sudo udevadm control --reload-rules`. # Solaar in other languages diff --git a/docs/issues.md b/docs/issues.md index 387ba810..46cc1102 100644 --- a/docs/issues.md +++ b/docs/issues.md @@ -45,7 +45,7 @@ layout: page in some system tray implementations. Changing to a different theme may help. The `--battery-icons=symbolic` option can be used to force symbolic icons. -- Solaar will try to use uinput to simulate input from rules under Wayland or if Xtest is not available +- Solaar uses uinput to simulate input but this needs write permission on /dev/uinput. For more information see [the rules page](https://pwr-solaar.github.io/Solaar/rules). diff --git a/docs/rules.md b/docs/rules.md index 459b6ddc..da19895d 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -15,9 +15,9 @@ although on GNOME desktop under Wayland, you can use those with the Solaar Gnome You can install it from `https://extensions.gnome.org/extension/6162/solaar-extension`. Under Wayland using keyboard groups may result in incorrect symbols being input for simulated input. Under Wayland simulating inputs when modifier keys are pressed may result in incorrect symbols being sent. -Simulated input uses Xtest if available under X11 or uinput if the user has write access to /dev/uinput. -The easiest way to maintain write access to /dev/uinput is to use Solaar's alternative udev rule by downloading -`https://raw.githubusercontent.com/pwr-Solaar/Solaar/master/rules.d-uinput/42-logitech-unify-permissions.rules` +Simulated input uses uinput to simulate input so the user has to have write access to /dev/uinput. +The easiest way to maintain write access to /dev/uinput is to use Solaar's udev rule by downloading +`https://raw.githubusercontent.com/pwr-Solaar/Solaar/master/rules.d/42-logitech-unify-permissions.rules` and copying it as root into the `/etc/udev/rules.d` directory. You may have to reboot your system for the write permission to be set up. Another way to get write access to /dev/uinput is to run `sudo setfacl -m u:${USER}:rw /dev/uinput` diff --git a/lib/hidapi/hidapi_impl.py b/lib/hidapi/hidapi_impl.py index 978d34fc..d9fc3047 100644 --- a/lib/hidapi/hidapi_impl.py +++ b/lib/hidapi/hidapi_impl.py @@ -38,6 +38,8 @@ from typing import Callable from hidapi.common import DeviceInfo +LOGITECH_VENDOR_ID = 0x046D + if typing.TYPE_CHECKING: import gi @@ -251,6 +253,12 @@ def _match( logger.info(f"Skipping unlikely device {device['path']} ({bus_id}/{vid:04X}/{pid:04X})") return None + # Skip Logitech webcams to prevent them from locking up during hidpp checks + # (product IDs range for webcams from docs/usb.ids.txt) + if vid == LOGITECH_VENDOR_ID and 0x0800 <= pid <= 0x09FF: + logger.info(f"Skipping Logitech webcam {device['path']} ({bus_id}/{vid:04X}/{pid:04X})") + return None + # Check for hidpp support device["hidpp_short"] = False device["hidpp_long"] = False diff --git a/lib/logitech_receiver/base.py b/lib/logitech_receiver/base.py index 51355dc0..69aee2ae 100644 --- a/lib/logitech_receiver/base.py +++ b/lib/logitech_receiver/base.py @@ -656,8 +656,8 @@ def ping(handle, devnumber, long_message: bool = False): return 1.0 if error in [Hidpp10ErrorCode.RESOURCE_ERROR, Hidpp10ErrorCode.CONNECTION_REQUEST_FAILED]: return # device unreachable - if error == Hidpp10ErrorCode.UNKNOWN_DEVICE: # no paired device with that number - logger.error("(%s) device %d error on ping request: unknown device", handle, devnumber) + if error == Hidpp10ErrorCode.UNKNOWN_DEVICE: # no device with that number currently accessible + logger.info("(%s) device %d error on ping request: unknown device", handle, devnumber) raise exceptions.NoSuchDevice(number=devnumber, request=request_id) if notifications_hook: diff --git a/lib/logitech_receiver/descriptors.py b/lib/logitech_receiver/descriptors.py index 2481a3e4..f9bfa079 100644 --- a/lib/logitech_receiver/descriptors.py +++ b/lib/logitech_receiver/descriptors.py @@ -425,6 +425,7 @@ _D("G903 Hero Gaming Mouse", codename="G903 Hero", usbid=0xC091) _D(None, kind=DEVICE_KIND.mouse, usbid=0xC092, interface=1) # two mice share this ID _D("M500S Mouse", codename="M500S", usbid=0xC093, interface=1) # _D('G600 Gaming Mouse', codename='G600 Gaming', usbid=0xc24a, interface=1) # not an HID++ device +_D("G500 Gaming Mouse", codename="G500 Gaming", usbid=0xC068, interface=1, protocol=1.0) _D("G500s Gaming Mouse", codename="G500s Gaming", usbid=0xC24E, interface=1, protocol=1.0) _D("G502 Proteus Spectrum Optical Mouse", codename="G502 Proteus Spectrum", usbid=0xC332, interface=1) _D("Logitech PRO Gaming Keyboard", codename="PRO Gaming Keyboard", usbid=0xC339, interface=1) diff --git a/lib/logitech_receiver/device.py b/lib/logitech_receiver/device.py index 7f4e0ad0..d241249e 100644 --- a/lib/logitech_receiver/device.py +++ b/lib/logitech_receiver/device.py @@ -183,13 +183,16 @@ class Device: self.descriptor = ( descriptors.get_btid(self.product_id) if self.bluetooth else descriptors.get_usbid(self.product_id) ) - if self.number is None: # for direct-connected devices get 'number' from descriptor protocol else use 0xFF - if self.descriptor and self.descriptor.protocol and self.descriptor.protocol < 2.0: - number = 0x00 + # for direct-connected devices get 'number' from descriptor protocol else use 0xFF + self.number = 0x00 if self.descriptor and self.descriptor.protocol and self.descriptor.protocol < 2.0 else 0xFF + try: # determine whether a direct-connected device is online + self.ping() + except exceptions.NoSuchDevice as e: + if self.number == 0xFF: # guessed wrong number? + self.number = 0x00 + self.ping() else: - number = 0xFF - self.number = number - self.ping() # determine whether a direct-connected device is online + raise e if self.descriptor: self._name = self.descriptor.name diff --git a/lib/logitech_receiver/diversion.py b/lib/logitech_receiver/diversion.py index 5974334f..e933f5ad 100644 --- a/lib/logitech_receiver/diversion.py +++ b/lib/logitech_receiver/diversion.py @@ -73,9 +73,10 @@ logger = logging.getLogger(__name__) # KeyPress action gets the current keyboard group using XkbGetState from libX11.so using ctypes definitions # under Wayland the keyboard group is None resulting in using the first keyboard group # KeyPress action translates keysyms to keycodes using the GDK keymap -# KeyPress, MouseScroll, and MouseClick actions use XTest (under X11) or uinput. +# KeyPress, MouseScroll, and MouseClick actions use uinput. # For uinput to work the user must have write access for /dev/uinput. -# To get this access run sudo setfacl -m u:${user}:rw /dev/uinput +# The Solaar udev rule should set this up +# Otherwise run sudo setfacl -m u:${user}:rw /dev/uinput # # Rule GUI keyname determination uses a local file generated # from http://cgit.freedesktop.org/xorg/proto/x11proto/plain/keysymdef.h @@ -85,8 +86,7 @@ logger = logging.getLogger(__name__) # Setting up is complex because there are several systems that each provide partial facilities: # GDK - always available (when running with a window system) but only provides access to keymap # X11 - provides access to active process and process with window under mouse and current modifier keys -# Xtest extension to X11 - provides input simulation, partly works under Wayland -# Wayland - provides input simulation +# uinput and evdev - provides input simulation XK_KEYS: Dict[str, int] = keysymdef.key_symbols @@ -111,14 +111,11 @@ if wayland: ) try: - import Xlib - _x11 = None # X11 might be available except Exception: _x11 = False # X11 is not available # Globals -xtest_available = True # Xtest might be available xdisplay = None @@ -170,7 +167,7 @@ class XkbStateRec(ctypes.Structure): def x11_setup(): - global _x11, xdisplay, modifier_keycodes, NET_ACTIVE_WINDOW, NET_WM_PID, WM_CLASS, xtest_available + global _x11, xdisplay, modifier_keycodes, NET_ACTIVE_WINDOW, NET_WM_PID, WM_CLASS if _x11 is not None: return _x11 try: @@ -187,7 +184,6 @@ def x11_setup(): except Exception: logger.warning("X11 not available - some rule capabilities inoperable", exc_info=sys.exc_info()) _x11 = False - xtest_available = False return _x11 @@ -272,10 +268,6 @@ def setup_uinput(): logger.warning("cannot create uinput device: %s", e) -if wayland: # Wayland can't use xtest so may as well set up uinput now - setup_uinput() - - def kbdgroup(): if xkb_setup(): state = XkbStateRec() @@ -324,31 +316,6 @@ def xy_direction(_x, _y): return "noop" -def simulate_xtest(code, event): - global xtest_available - if x11_setup() and xtest_available: - try: - event = ( - Xlib.X.KeyPress - if event == _KEY_PRESS - else Xlib.X.KeyRelease - if event == _KEY_RELEASE - else Xlib.X.ButtonPress - if event == _BUTTON_PRESS - else Xlib.X.ButtonRelease - if event == _BUTTON_RELEASE - else None - ) - Xlib.ext.xtest.fake_input(xdisplay, event, code) - xdisplay.sync() - if logger.isEnabledFor(logging.DEBUG): - logger.debug("xtest simulated input %s %s %s", xdisplay, event, code) - return True - except Exception as e: - xtest_available = False - logger.warning("xtest fake input failed: %s", e) - - def simulate_uinput(what, code, arg): global udevice if setup_uinput(): @@ -364,30 +331,11 @@ def simulate_uinput(what, code, arg): def simulate_key(code, event): # X11 keycode but Solaar event code - if not wayland and simulate_xtest(code, event): - return True if evdev and simulate_uinput(evdev.ecodes.EV_KEY, code - 8, event): return True logger.warning("no way to simulate key input") -def click_xtest(button, count): - if isinstance(count, int): - for _ in range(count): - if not simulate_xtest(button[0], _BUTTON_PRESS): - return False - if not simulate_xtest(button[0], _BUTTON_RELEASE): - return False - else: - if count != RELEASE: - if not simulate_xtest(button[0], _BUTTON_PRESS): - return False - if count != DEPRESS: - if not simulate_xtest(button[0], _BUTTON_RELEASE): - return False - return True - - def click_uinput(button, count): if isinstance(count, int): for _ in range(count): @@ -406,8 +354,6 @@ def click_uinput(button, count): def click(button, count): - if not wayland and click_xtest(button, count): - return True if click_uinput(button, count): return True logger.warning("no way to simulate mouse click") @@ -415,14 +361,6 @@ def click(button, count): def simulate_scroll(dx, dy): - if not wayland and xtest_available: - success = True - if dx: - success = click_xtest(buttons["scroll_right" if dx > 0 else "scroll_left"], count=abs(dx)) - if dy and success: - success = click_xtest(buttons["scroll_up" if dy > 0 else "scroll_down"], count=abs(dy)) - if success: - return True if setup_uinput(): success = True if dx: diff --git a/lib/logitech_receiver/settings_templates.py b/lib/logitech_receiver/settings_templates.py index 9b3b7fe6..2cf431b9 100644 --- a/lib/logitech_receiver/settings_templates.py +++ b/lib/logitech_receiver/settings_templates.py @@ -1972,7 +1972,7 @@ class SuperstrikeTuning_(settings.Setting): class HapticLevel(settings.Setting): name = "haptic-level" - label = _("Haptic Feeback Level") + label = _("Haptic Feedback Level") description = _("Change power of haptic feedback. (Zero to turn off.)") feature = _F.HAPTIC choices_universe = common.NamedInts(Off=0, Low=25, Medium=50, High=75, Maximum=100) diff --git a/lib/solaar/ui/about/model.py b/lib/solaar/ui/about/model.py index aca31e08..e2514b11 100644 --- a/lib/solaar/ui/about/model.py +++ b/lib/solaar/ui/about/model.py @@ -56,6 +56,7 @@ class AboutModel: "El Jinete Sin Cabeza (Español)", "Ferdina Kusumah (Indonesia)", "John Erling Blad (Norwegian Bokmål, Norwegian Nynorsk)", + "Oleksandr Afanasiev (Ukrainian)", ] def get_credit_sections(self) -> List[Tuple[str, List[str]]]: diff --git a/po/fi.po b/po/fi.po index 8642a8b8..85ac6308 100644 --- a/po/fi.po +++ b/po/fi.po @@ -3,1897 +3,2251 @@ # This file is distributed under the same license as the solaar package. # Automatically generated, 2013. # -msgid "" -msgstr "Project-Id-Version: solaar 0.9.2\n" - "Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2023-12-28 17:40+0100\n" - "PO-Revision-Date: 2013-08-05 18:49+0300\n" - "Last-Translator: Tomi Leppänen\n" - "Language-Team: none\n" - "Language: fi\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" +msgid "" +msgstr "" +"Project-Id-Version: solaar 0.9.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-03-05 13:08+0200\n" +"PO-Revision-Date: 2013-08-05 18:49+0300\n" +"Last-Translator: Niko Savola\n" +"Language-Team: none\n" +"Language: fi\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" -#: lib/logitech_receiver/base_usb.py:46 -msgid "Bolt Receiver" -msgstr "" +#: lib/logitech_receiver/base_usb.py:52 +msgid "Bolt Receiver" +msgstr "Bolt-vastaanotin" -#: lib/logitech_receiver/base_usb.py:57 -msgid "Unifying Receiver" -msgstr "" +#: lib/logitech_receiver/base_usb.py:64 +msgid "Unifying Receiver" +msgstr "Unifying-vastaanotin" -#: lib/logitech_receiver/base_usb.py:67 lib/logitech_receiver/base_usb.py:78 -#: lib/logitech_receiver/base_usb.py:90 lib/logitech_receiver/base_usb.py:102 -#: lib/logitech_receiver/base_usb.py:114 -msgid "Nano Receiver" -msgstr "" +#: lib/logitech_receiver/base_usb.py:75 lib/logitech_receiver/base_usb.py:87 +#: lib/logitech_receiver/base_usb.py:100 lib/logitech_receiver/base_usb.py:113 +msgid "Nano Receiver" +msgstr "Nano-vastaanotin" -#: lib/logitech_receiver/base_usb.py:124 -msgid "Lightspeed Receiver" -msgstr "" +#: lib/logitech_receiver/base_usb.py:125 +msgid "Lightspeed Receiver" +msgstr "Lightspeed-vastaanotin" -#: lib/logitech_receiver/base_usb.py:133 -msgid "EX100 Receiver 27 Mhz" -msgstr "" +#: lib/logitech_receiver/base_usb.py:136 +msgid "EX100 Receiver 27 Mhz" +msgstr "EX100 27 MHz -vastaanotin" + +#: lib/logitech_receiver/common.py:649 +#, python-format +msgid "Battery: %(level)s (%(status)s)" +msgstr "Akku: %(level)s (%(status)s)" + +#: lib/logitech_receiver/common.py:652 +#, python-format +msgid "Battery: %(percent)d%% (%(status)s)" +msgstr "Akku: %(percent)d%% (%(status)s)" + +#: lib/logitech_receiver/hidpp20.py:1048 +#: lib/logitech_receiver/settings_templates.py:299 +msgid "Disabled" +msgstr "Pois käytöstä" + +#: lib/logitech_receiver/hidpp20.py:1049 +msgid "Static" +msgstr "Muuttumaton" + +#: lib/logitech_receiver/hidpp20.py:1050 +msgid "Pulse" +msgstr "Pulssi" + +#: lib/logitech_receiver/hidpp20.py:1051 +msgid "Cycle" +msgstr "Jakso" + +#: lib/logitech_receiver/hidpp20.py:1052 +msgid "Boot" +msgstr "Käynnistys" + +#: lib/logitech_receiver/hidpp20.py:1053 +msgid "Demo" +msgstr "Esittely" + +#: lib/logitech_receiver/hidpp20.py:1055 +msgid "Breathe" +msgstr "Hengitys" + +#: lib/logitech_receiver/hidpp20.py:1058 +msgid "Ripple" +msgstr "Väreily" + +#: lib/logitech_receiver/hidpp20.py:1059 +msgid "Decomposition" +msgstr "Hajoaminen" + +#: lib/logitech_receiver/hidpp20.py:1060 +msgid "Signature1" +msgstr "Allekirjoitus1" + +#: lib/logitech_receiver/hidpp20.py:1061 +msgid "Signature2" +msgstr "Allekirjoitus2" + +#: lib/logitech_receiver/hidpp20.py:1062 +msgid "CycleS" +msgstr "SykliS" + +#: lib/logitech_receiver/hidpp20.py:1126 +msgid "Unknown Location" +msgstr "Tuntematon sijainti" + +#: lib/logitech_receiver/hidpp20.py:1127 +msgid "Primary" +msgstr "Ensisijainen" + +#: lib/logitech_receiver/hidpp20.py:1128 +msgid "Logo" +msgstr "Logo" + +#: lib/logitech_receiver/hidpp20.py:1129 +msgid "Left Side" +msgstr "Vasen puoli" + +#: lib/logitech_receiver/hidpp20.py:1130 +msgid "Right Side" +msgstr "Oikea puoli" + +#: lib/logitech_receiver/hidpp20.py:1131 +msgid "Combined" +msgstr "Yhdistetty" + +#: lib/logitech_receiver/hidpp20.py:1132 +msgid "Primary 1" +msgstr "Ensisijainen 1" + +#: lib/logitech_receiver/hidpp20.py:1133 +msgid "Primary 2" +msgstr "Ensisijainen 2" + +#: lib/logitech_receiver/hidpp20.py:1134 +msgid "Primary 3" +msgstr "Ensisijainen 3" + +#: lib/logitech_receiver/hidpp20.py:1135 +msgid "Primary 4" +msgstr "Ensisijainen 4" + +#: lib/logitech_receiver/hidpp20.py:1136 +msgid "Primary 5" +msgstr "Ensisijainen 5" + +#: lib/logitech_receiver/hidpp20.py:1137 +msgid "Primary 6" +msgstr "Ensisijainen 6" + +#: lib/logitech_receiver/i18n.py:28 +msgid "empty" +msgstr "tyhjä" + +#: lib/logitech_receiver/i18n.py:29 +msgid "critical" +msgstr "kriittinen" #: lib/logitech_receiver/i18n.py:30 -msgid "empty" -msgstr "tyhjä" +msgid "low" +msgstr "matala" #: lib/logitech_receiver/i18n.py:31 -msgid "critical" -msgstr "kriittinen" +msgid "average" +msgstr "keskiarvo" #: lib/logitech_receiver/i18n.py:32 -msgid "low" -msgstr "matala" +msgid "good" +msgstr "hyvä" #: lib/logitech_receiver/i18n.py:33 -msgid "average" -msgstr "" - -#: lib/logitech_receiver/i18n.py:34 -msgid "good" -msgstr "hyvä" +msgid "full" +msgstr "täysi" #: lib/logitech_receiver/i18n.py:35 -msgid "full" -msgstr "täysi" +msgid "discharging" +msgstr "tyhjenee" + +#: lib/logitech_receiver/i18n.py:36 +msgid "recharging" +msgstr "latautuu" + +#: lib/logitech_receiver/i18n.py:37 lib/solaar/ui/window.py:700 +msgid "charging" +msgstr "lataa" #: lib/logitech_receiver/i18n.py:38 -msgid "discharging" -msgstr "tyhjenee" +msgid "not charging" +msgstr "ei latauksessa" #: lib/logitech_receiver/i18n.py:39 -msgid "recharging" -msgstr "latautuu" +msgid "almost full" +msgstr "lähes täysi" -#: lib/logitech_receiver/i18n.py:40 lib/solaar/ui/window.py:711 -msgid "charging" -msgstr "lataa" +#: lib/logitech_receiver/i18n.py:40 +msgid "charged" +msgstr "ladattu" #: lib/logitech_receiver/i18n.py:41 -msgid "not charging" -msgstr "" +msgid "slow recharge" +msgstr "hidas lataus" #: lib/logitech_receiver/i18n.py:42 -msgid "almost full" -msgstr "lähes täysi" +#, fuzzy +msgid "invalid battery" +msgstr "virheellinen akku" #: lib/logitech_receiver/i18n.py:43 -msgid "charged" -msgstr "" +msgid "thermal error" +msgstr "lämpötilasta johtuva virhe" #: lib/logitech_receiver/i18n.py:44 -msgid "slow recharge" -msgstr "hidas lataus" +msgid "error" +msgstr "virhe" #: lib/logitech_receiver/i18n.py:45 -#, fuzzy -msgid "invalid battery" -msgstr "virheellinen akku" +msgid "standard" +msgstr "vakio" #: lib/logitech_receiver/i18n.py:46 -msgid "thermal error" -msgstr "lämpötilasta johtuva virhe" +msgid "fast" +msgstr "nopea" #: lib/logitech_receiver/i18n.py:47 -msgid "error" -msgstr "" - -#: lib/logitech_receiver/i18n.py:48 -msgid "standard" -msgstr "" +msgid "slow" +msgstr "hidas" #: lib/logitech_receiver/i18n.py:49 -msgid "fast" -msgstr "" +msgid "device timeout" +msgstr "laitteen aikakatkaisu" #: lib/logitech_receiver/i18n.py:50 -msgid "slow" -msgstr "" +msgid "device not supported" +msgstr "laite ei ole tuettu" -#: lib/logitech_receiver/i18n.py:53 -msgid "device timeout" -msgstr "laitteen aikakatkaisu" +#: lib/logitech_receiver/i18n.py:51 +msgid "too many devices" +msgstr "liian monta laitetta" -#: lib/logitech_receiver/i18n.py:54 -msgid "device not supported" -msgstr "laite ei ole tuettu" +#: lib/logitech_receiver/i18n.py:52 +msgid "sequence timeout" +msgstr "sarjan aikakatkaisu" + +#: lib/logitech_receiver/i18n.py:54 lib/solaar/ui/window.py:555 +msgid "Firmware" +msgstr "Laiteohjelmisto" #: lib/logitech_receiver/i18n.py:55 -msgid "too many devices" -msgstr "liian monta laitetta" +msgid "Bootloader" +msgstr "Alkulatausohjelma" #: lib/logitech_receiver/i18n.py:56 -msgid "sequence timeout" -msgstr "sarjan aikakatkaisu" +msgid "Hardware" +msgstr "Laitteisto" -#: lib/logitech_receiver/i18n.py:59 lib/solaar/ui/window.py:572 -msgid "Firmware" -msgstr "Laiteohjelmisto" +#: lib/logitech_receiver/i18n.py:57 +msgid "Other" +msgstr "Muu" + +#: lib/logitech_receiver/i18n.py:59 +msgid "Left Button" +msgstr "Vasen painike" #: lib/logitech_receiver/i18n.py:60 -msgid "Bootloader" -msgstr "Alkulatausohjelma" +msgid "Right Button" +msgstr "Oikea painike" #: lib/logitech_receiver/i18n.py:61 -msgid "Hardware" -msgstr "Laitteisto" +msgid "Middle Button" +msgstr "Keskipainike" #: lib/logitech_receiver/i18n.py:62 -msgid "Other" -msgstr "Muu" +msgid "Back Button" +msgstr "Edellinen-painike" + +#: lib/logitech_receiver/i18n.py:63 +msgid "Forward Button" +msgstr "Seuraava-painike" + +#: lib/logitech_receiver/i18n.py:64 +msgid "Mouse Gesture Button" +msgstr "Hiiren elepainike" #: lib/logitech_receiver/i18n.py:65 -msgid "Left Button" -msgstr "" +msgid "Smart Shift" +msgstr "Smart Shift" #: lib/logitech_receiver/i18n.py:66 -msgid "Right Button" -msgstr "" +msgid "DPI Switch" +msgstr "DPI-kytkin" #: lib/logitech_receiver/i18n.py:67 -msgid "Middle Button" -msgstr "" +msgid "Left Tilt" +msgstr "Kallistus vasemmalle" #: lib/logitech_receiver/i18n.py:68 -msgid "Back Button" -msgstr "" +msgid "Right Tilt" +msgstr "Kallistus oikealle" #: lib/logitech_receiver/i18n.py:69 -msgid "Forward Button" -msgstr "" +msgid "Left Click" +msgstr "Vasen napsautus" #: lib/logitech_receiver/i18n.py:70 -msgid "Mouse Gesture Button" -msgstr "" +msgid "Right Click" +msgstr "Oikea napsautus" #: lib/logitech_receiver/i18n.py:71 -msgid "Smart Shift" -msgstr "" +msgid "Mouse Middle Button" +msgstr "Hiiren keskipainike" #: lib/logitech_receiver/i18n.py:72 -msgid "DPI Switch" -msgstr "" +msgid "Mouse Back Button" +msgstr "Hiiren edellinen-painike" #: lib/logitech_receiver/i18n.py:73 -msgid "Left Tilt" -msgstr "" +msgid "Mouse Forward Button" +msgstr "Hiiren seuraava-painike" #: lib/logitech_receiver/i18n.py:74 -msgid "Right Tilt" -msgstr "" +msgid "Gesture Button Navigation" +msgstr "Elepainikkeen navigointi" #: lib/logitech_receiver/i18n.py:75 -msgid "Left Click" -msgstr "" +msgid "Mouse Scroll Left Button" +msgstr "Hiiren vieritys vasemmalle -painike" #: lib/logitech_receiver/i18n.py:76 -msgid "Right Click" -msgstr "" - -#: lib/logitech_receiver/i18n.py:77 -msgid "Mouse Middle Button" -msgstr "" +msgid "Mouse Scroll Right Button" +msgstr "Hiiren vieritys oikealle -painike" #: lib/logitech_receiver/i18n.py:78 -msgid "Mouse Back Button" -msgstr "" +msgid "pressed" +msgstr "painettu" #: lib/logitech_receiver/i18n.py:79 -msgid "Mouse Forward Button" -msgstr "" +msgid "released" +msgstr "vapautettu" -#: lib/logitech_receiver/i18n.py:80 -msgid "Gesture Button Navigation" -msgstr "" +#: lib/logitech_receiver/notifications.py:156 lib/solaar/listener.py:243 +msgid "connected" +msgstr "yhdistetty" -#: lib/logitech_receiver/i18n.py:81 -msgid "Mouse Scroll Left Button" -msgstr "" +#: lib/logitech_receiver/notifications.py:156 lib/solaar/listener.py:243 +msgid "disconnected" +msgstr "yhteys katkaistu" -#: lib/logitech_receiver/i18n.py:82 -msgid "Mouse Scroll Right Button" -msgstr "" +#: lib/logitech_receiver/notifications.py:182 +msgid "unpaired" +msgstr "parittamaton" -#: lib/logitech_receiver/i18n.py:85 -msgid "pressed" -msgstr "" +#: lib/logitech_receiver/notifications.py:231 +msgid "powered on" +msgstr "virta päällä" -#: lib/logitech_receiver/i18n.py:86 -msgid "released" -msgstr "" +#: lib/logitech_receiver/notifications.py:283 +msgid "ADC measurement notification" +msgstr "ADC-mittausilmoitus" -#: lib/logitech_receiver/notifications.py:75 -#: lib/logitech_receiver/notifications.py:126 -msgid "pairing lock is closed" -msgstr "" +#: lib/logitech_receiver/notifications.py:428 +#: lib/logitech_receiver/notifications.py:484 +msgid "pairing lock is closed" +msgstr "parituslukko on suljettu" -#: lib/logitech_receiver/notifications.py:75 -#: lib/logitech_receiver/notifications.py:126 -msgid "pairing lock is open" -msgstr "" +#: lib/logitech_receiver/notifications.py:428 +#: lib/logitech_receiver/notifications.py:484 +msgid "pairing lock is open" +msgstr "parituslukko on auki" -#: lib/logitech_receiver/notifications.py:92 -msgid "discovery lock is closed" -msgstr "" +#: lib/logitech_receiver/notifications.py:447 +msgid "discovery lock is closed" +msgstr "etsintälukko on suljettu" -#: lib/logitech_receiver/notifications.py:92 -msgid "discovery lock is open" -msgstr "" +#: lib/logitech_receiver/notifications.py:447 +msgid "discovery lock is open" +msgstr "etsintälukko on auki" -#: lib/logitech_receiver/notifications.py:224 lib/solaar/ui/notify.py:122 -msgid "connected" -msgstr "yhdistetty" +#: lib/logitech_receiver/receiver.py:437 +msgid "No paired devices." +msgstr "Ei paritettuja laitteita." -#: lib/logitech_receiver/notifications.py:224 -msgid "disconnected" -msgstr "" +#: lib/logitech_receiver/receiver.py:439 lib/solaar/ui/window.py:606 +#, python-format +msgid "%(count)s paired device." +msgid_plural "%(count)s paired devices." +msgstr[0] "%(count)s paritettu laite." +msgstr[1] "%(count)s paritettua laitetta." -#: lib/logitech_receiver/notifications.py:262 lib/solaar/ui/notify.py:120 -msgid "unpaired" -msgstr "parittamaton" +#: lib/logitech_receiver/settings.py:602 +msgid "register" +msgstr "rekisteri" -#: lib/logitech_receiver/notifications.py:304 -msgid "powered on" -msgstr "virta päällä" +#: lib/logitech_receiver/settings.py:616 lib/logitech_receiver/settings.py:654 +msgid "feature" +msgstr "ominaisuus" -#: lib/logitech_receiver/settings.py:750 -msgid "register" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:138 +msgid "Swap Fx function" +msgstr "Vaihda Fx" -#: lib/logitech_receiver/settings.py:764 lib/logitech_receiver/settings.py:791 -msgid "feature" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:141 +msgid "" +"When set, the F1..F12 keys will activate their special function,\n" +"and you must hold the FN key to activate their standard function." +msgstr "" +"Asetettu: F1..F12 näppäimet aktivoivat erityistoimintonsa ja \n" +"FN-näppäintä on painettava, jotta ne aktivoisivat normaalin\n" +"toimintonsa." -#: lib/logitech_receiver/settings_templates.py:139 -msgid "Swap Fx function" -msgstr "Vaihda Fx" +#: lib/logitech_receiver/settings_templates.py:146 +msgid "" +"When unset, the F1..F12 keys will activate their standard function,\n" +"and you must hold the FN key to activate their special function." +msgstr "" +"Ei asetettu: F1..F12 näppäimet aktivoivat tavallisen toimintonsa\n" +"ja FN-näppäintä on painettava, jotta ne aktivoisivat\n" +"erityistoimintonsa." -#: lib/logitech_receiver/settings_templates.py:140 -msgid "When set, the F1..F12 keys will activate their special function,\n" - "and you must hold the FN key to activate their standard function." -msgstr "Asetettu: F1..F12 näppäimet aktivoivat erityistoimintonsa ja \n" - "FN-näppäintä on painettava, jotta ne aktivoisivat normaalin\n" - "toimintonsa." +#: lib/logitech_receiver/settings_templates.py:154 +msgid "Hand Detection" +msgstr "Käsien tunnistus" -#: lib/logitech_receiver/settings_templates.py:142 -msgid "When unset, the F1..F12 keys will activate their standard function,\n" - "and you must hold the FN key to activate their special function." -msgstr "Ei asetettu: F1..F12 näppäimet aktivoivat tavallisen toimintonsa\n" - "ja FN-näppäintä on painettava, jotta ne aktivoisivat\n" - "erityistoimintonsa." +#: lib/logitech_receiver/settings_templates.py:155 +msgid "Turn on illumination when the hands hover over the keyboard." +msgstr "Käynnistä valaistus, kun kädet ovat näppämistön yläpuolella." -#: lib/logitech_receiver/settings_templates.py:149 -msgid "Hand Detection" -msgstr "Käsien tunnistus" +#: lib/logitech_receiver/settings_templates.py:162 +msgid "Scroll Wheel Smooth Scrolling" +msgstr "Vierityspyörän sulava vieritys" -#: lib/logitech_receiver/settings_templates.py:150 -msgid "Turn on illumination when the hands hover over the keyboard." -msgstr "Käynnistä valaistus, kun kädet ovat näppämistön yläpuolella." +#: lib/logitech_receiver/settings_templates.py:163 +#: lib/logitech_receiver/settings_templates.py:410 +#: lib/logitech_receiver/settings_templates.py:439 +msgid "High-sensitivity mode for vertical scroll with the wheel." +msgstr "Korkean herkkyyden tila pystyvieritykseen hiiren rullalla." -#: lib/logitech_receiver/settings_templates.py:157 -msgid "Scroll Wheel Smooth Scrolling" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:170 +msgid "Side Scrolling" +msgstr "Sivuttaisvieritys" -#: lib/logitech_receiver/settings_templates.py:158 -#: lib/logitech_receiver/settings_templates.py:239 -#: lib/logitech_receiver/settings_templates.py:267 -msgid "High-sensitivity mode for vertical scroll with the wheel." -msgstr "Korkean herkkyyden tila pystyvieritykseen hiiren rullalla." +#: lib/logitech_receiver/settings_templates.py:172 +msgid "" +"When disabled, pushing the wheel sideways sends custom button events\n" +"instead of the standard side-scrolling events." +msgstr "" +"Pois päältä ollessaan, rullan painaminen sivuttain lähettää muokattuja\n" +"toimintoja normaalien sivuttaisvieritystoimintojen sijaan." -#: lib/logitech_receiver/settings_templates.py:165 -msgid "Side Scrolling" -msgstr "Sivuttaisvieritys" +#: lib/logitech_receiver/settings_templates.py:182 +msgid "Sensitivity (DPI - older mice)" +msgstr "Herkkyys (DPI - vanhemmat hiiret)" -#: lib/logitech_receiver/settings_templates.py:167 -msgid "When disabled, pushing the wheel sideways sends custom button " - "events\n" - "instead of the standard side-scrolling events." -msgstr "Pois päältä ollessaan, rullan painaminen sivuttain lähettää " - "muokattuja\n" - "toimintoja normaalien sivuttaisvieritystoimintojen sijaan." - -#: lib/logitech_receiver/settings_templates.py:177 -msgid "Sensitivity (DPI - older mice)" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:178 -#: lib/logitech_receiver/settings_templates.py:712 -msgid "Mouse movement sensitivity" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:208 -#: lib/logitech_receiver/settings_templates.py:218 -#: lib/logitech_receiver/settings_templates.py:225 -msgid "Backlight" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:209 -#: lib/logitech_receiver/settings_templates.py:226 -msgid "Set illumination time for keyboard." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:219 -msgid "Turn illumination on or off on keyboard." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:237 -msgid "Scroll Wheel High Resolution" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:240 -#: lib/logitech_receiver/settings_templates.py:268 -msgid "Set to ignore if scrolling is abnormally fast or slow" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:247 -#: lib/logitech_receiver/settings_templates.py:277 -msgid "Scroll Wheel Diversion" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:249 -msgid "Make scroll wheel send LOWRES_WHEEL HID++ notifications (which " - "trigger Solaar rules but are otherwise ignored)." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:183 +#: lib/logitech_receiver/settings_templates.py:1019 +#: lib/logitech_receiver/settings_templates.py:1047 +msgid "Mouse movement sensitivity" +msgstr "Hiiren liikkeen herkkyys" #: lib/logitech_receiver/settings_templates.py:256 -msgid "Scroll Wheel Direction" -msgstr "" +msgid "Backlight Timed" +msgstr "Ajastettu taustavalo" #: lib/logitech_receiver/settings_templates.py:257 -msgid "Invert direction for vertical scroll with wheel." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:397 +msgid "Set illumination time for keyboard." +msgstr "Aseta näppäimistön valaistusaika." -#: lib/logitech_receiver/settings_templates.py:265 -msgid "Scroll Wheel Resolution" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:268 +msgid "Backlight" +msgstr "Taustavalo" -#: lib/logitech_receiver/settings_templates.py:279 -msgid "Make scroll wheel send HIRES_WHEEL HID++ notifications (which " - "trigger Solaar rules but are otherwise ignored)." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:288 -msgid "Sensitivity (Pointer Speed)" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:289 -msgid "Speed multiplier for mouse (256 is normal multiplier)." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:299 -msgid "Thumb Wheel Diversion" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:269 +msgid "" +"Illumination level on keyboard. Changes made are only applied in Manual " +"mode." +msgstr "" +"Näppäimistön valaistustaso. Tehdyt muutokset otetaan käyttöön vain " +"manuaalisessa tilassa." #: lib/logitech_receiver/settings_templates.py:301 -msgid "Make thumb wheel send THUMB_WHEEL HID++ notifications (which trigger " - "Solaar rules but are otherwise ignored)." -msgstr "" +msgid "Automatic" +msgstr "Automaattinen" -#: lib/logitech_receiver/settings_templates.py:310 -msgid "Thumb Wheel Direction" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:303 +msgid "Manual" +msgstr "Manuaalinen" + +#: lib/logitech_receiver/settings_templates.py:305 +msgid "Enabled" +msgstr "Käytössä" #: lib/logitech_receiver/settings_templates.py:311 -msgid "Invert thumb wheel scroll direction." -msgstr "" +msgid "Backlight Level" +msgstr "Taustavalon taso" -#: lib/logitech_receiver/settings_templates.py:319 -msgid "Onboard Profiles" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:312 +msgid "Illumination level on keyboard when in Manual mode." +msgstr "Näppäimistön valaistustaso manuaalisessa tilassa." -#: lib/logitech_receiver/settings_templates.py:320 -msgid "Enable onboard profiles, which often control report rate and " - "keyboard lighting" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:369 +msgid "Backlight Delay Hands Out" +msgstr "Taustavalon viive, kädet poissa" -#: lib/logitech_receiver/settings_templates.py:330 -msgid "Polling Rate (ms)" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:370 +msgid "" +"Delay in seconds until backlight fades out with hands away from keyboard." +msgstr "Taustavalon viive sekunneissa, kun kädet ovat poissa näppäimistöltä." -#: lib/logitech_receiver/settings_templates.py:332 -msgid "Frequency of device polling, in milliseconds" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:378 +msgid "Backlight Delay Hands In" +msgstr "Taustavalon viive, kädet lähellä" -#: lib/logitech_receiver/settings_templates.py:333 -#: lib/logitech_receiver/settings_templates.py:1046 -#: lib/logitech_receiver/settings_templates.py:1076 -msgid "May need Onboard Profiles set to Disable to be effective." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:379 +msgid "Delay in seconds until backlight fades out with hands near keyboard." +msgstr "Taustavalon viive sekunneissa, kun kädet ovat näppäimistön lähellä." -#: lib/logitech_receiver/settings_templates.py:365 -msgid "Divert crown events" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:387 +msgid "Backlight Delay Powered" +msgstr "Taustavalon viive kytkettynä" -#: lib/logitech_receiver/settings_templates.py:366 -msgid "Make crown send CROWN HID++ notifications (which trigger Solaar " - "rules but are otherwise ignored)." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:388 +msgid "Delay in seconds until backlight fades out with external power." +msgstr "Taustavalon viive sekunneissa ulkoiseen virtaan kytkettynä." -#: lib/logitech_receiver/settings_templates.py:374 -msgid "Crown smooth scroll" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:396 +msgid "Backlight (Seconds)" +msgstr "Taustavalo (sekuntia)" -#: lib/logitech_receiver/settings_templates.py:375 -msgid "Set crown smooth scroll" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:383 -msgid "Divert G Keys" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:385 -msgid "Make G keys send GKEY HID++ notifications (which trigger Solaar " - "rules but are otherwise ignored)." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:386 -msgid "May also make M keys and MR key send HID++ notifications" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:402 -msgid "Scroll Wheel Ratcheted" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:403 -msgid "Switch the mouse wheel between speed-controlled ratcheting and " - "always freespin." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:405 -msgid "Freespinning" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:405 -msgid "Ratcheted" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:408 +msgid "Scroll Wheel High Resolution" +msgstr "Vierityspyörän korkea resoluutio" #: lib/logitech_receiver/settings_templates.py:412 -msgid "Scroll Wheel Ratchet Speed" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:441 +msgid "Set to ignore if scrolling is abnormally fast or slow" +msgstr "Aseta sivuuttamaan, jos vieritys on epänormaalin nopeaa tai hidasta" -#: lib/logitech_receiver/settings_templates.py:414 -msgid "Use the mouse wheel speed to switch between ratcheted and " - "freespinning.\n" - "The mouse wheel is always ratcheted at 50." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:419 +#: lib/logitech_receiver/settings_templates.py:450 +msgid "Scroll Wheel Diversion" +msgstr "Vierityspyörän uudelleenohjaus" -#: lib/logitech_receiver/settings_templates.py:463 -msgid "Key/Button Actions" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:421 +msgid "" +"Make scroll wheel send LOWRES_WHEEL HID++ notifications (which trigger " +"Solaar rules but are otherwise ignored)." +msgstr "" +"Aseta vierityspyörä lähettämään LOWRES_WHEEL HID++ -ilmoituksia (jotka " +"laukaisevat Solaar-sääntöjä mutta muuten ohitetaan)." -#: lib/logitech_receiver/settings_templates.py:465 -msgid "Change the action for the key or button." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:428 +msgid "Scroll Wheel Direction" +msgstr "Vierityspyörän suunta" -#: lib/logitech_receiver/settings_templates.py:465 -msgid "Overridden by diversion." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:429 +msgid "Invert direction for vertical scroll with wheel." +msgstr "Käännä vierityspyörän pystysuuntainen vierityssuunta." -#: lib/logitech_receiver/settings_templates.py:466 -msgid "Changing important actions (such as for the left mouse button) can " - "result in an unusable system." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:437 +msgid "Scroll Wheel Resolution" +msgstr "Vierityspyörän resoluutio" -#: lib/logitech_receiver/settings_templates.py:639 -msgid "Key/Button Diversion" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:452 +msgid "" +"Make scroll wheel send HIRES_WHEEL HID++ notifications (which trigger Solaar" +" rules but are otherwise ignored)." +msgstr "" +"Aseta vierityspyörä lähettämään HIRES_WHEEL HID++ -ilmoituksia (jotka " +"laukaisevat Solaar-sääntöjä mutta muuten ohitetaan)." -#: lib/logitech_receiver/settings_templates.py:640 -msgid "Make the key or button send HID++ notifications (Diverted) or " - "initiate Mouse Gestures or Sliding DPI" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:461 +msgid "Sensitivity (Pointer Speed)" +msgstr "Herkkyys (osoittimen nopeus)" + +#: lib/logitech_receiver/settings_templates.py:462 +msgid "Speed multiplier for mouse (256 is normal multiplier)." +msgstr "Hiiren nopeuskerroin (256 on tavallinen kerroin)." + +#: lib/logitech_receiver/settings_templates.py:472 +msgid "Thumb Wheel Diversion" +msgstr "Peukalopyörän uudelleenohjaus" + +#: lib/logitech_receiver/settings_templates.py:474 +msgid "" +"Make thumb wheel send THUMB_WHEEL HID++ notifications (which trigger Solaar " +"rules but are otherwise ignored)." +msgstr "" +"Aseta peukalopyörä lähettämään THUMB_WHEEL HID++ -ilmoituksia (jotka " +"laukaisevat Solaar-sääntöjä mutta muuten ohitetaan)." + +#: lib/logitech_receiver/settings_templates.py:483 +msgid "Thumb Wheel Direction" +msgstr "Peukalopyörän suunta" + +#: lib/logitech_receiver/settings_templates.py:484 +msgid "Invert thumb wheel scroll direction." +msgstr "Käännä peukalopyörän vierityssuunta." + +#: lib/logitech_receiver/settings_templates.py:504 +msgid "Onboard Profiles" +msgstr "Laitteen omat profiilit" + +#: lib/logitech_receiver/settings_templates.py:505 +msgid "" +"Enable an onboard profile, which controls report rate, sensitivity, and " +"button actions" +msgstr "" +"Ota käyttöön laitteen oma profiili, joka hallitsee päivitysnopeutta, " +"herkkyyttä ja painiketoimintoja" + +#: lib/logitech_receiver/settings_templates.py:549 +#: lib/logitech_receiver/settings_templates.py:582 +msgid "Report Rate" +msgstr "Päivitysnopeus" + +#: lib/logitech_receiver/settings_templates.py:551 +#: lib/logitech_receiver/settings_templates.py:584 +msgid "Frequency of device movement reports" +msgstr "Laitteen liikeraporttien taajuus" + +#: lib/logitech_receiver/settings_templates.py:551 +#: lib/logitech_receiver/settings_templates.py:584 +#: lib/logitech_receiver/settings_templates.py:1019 +#: lib/logitech_receiver/settings_templates.py:1047 +#: lib/logitech_receiver/settings_templates.py:1421 +#: lib/logitech_receiver/settings_templates.py:1452 +msgid "May need Onboard Profiles set to Disable to be effective." +msgstr "" +"Voi edellyttää, että Laitteen omat profiilit -asetus on pois käytöstä " +"ollakseen voimassa." + +#: lib/logitech_receiver/settings_templates.py:612 +msgid "Divert crown events" +msgstr "Uudelleenohjaa kruunun tapahtumat" + +#: lib/logitech_receiver/settings_templates.py:613 +msgid "" +"Make crown send CROWN HID++ notifications (which trigger Solaar rules but " +"are otherwise ignored)." +msgstr "" +"Aseta kruunu lähettämään CROWN HID++ -ilmoituksia (jotka laukaisevat Solaar-" +"sääntöjä mutta muuten ohitetaan)." + +#: lib/logitech_receiver/settings_templates.py:621 +msgid "Crown smooth scroll" +msgstr "Kruunun sulava vieritys" + +#: lib/logitech_receiver/settings_templates.py:622 +msgid "Set crown smooth scroll" +msgstr "Aseta kruunun sulava vieritys" + +#: lib/logitech_receiver/settings_templates.py:630 +msgid "Divert G and M Keys" +msgstr "Uudelleenohjaa G- ja M-näppäimet" + +#: lib/logitech_receiver/settings_templates.py:631 +msgid "" +"Make G and M keys send HID++ notifications (which trigger Solaar rules but " +"are otherwise ignored)." +msgstr "" +"Aseta G- ja M-näppäimet lähettämään HID++ -ilmoituksia (jotka laukaisevat " +"Solaar-sääntöjä mutta muuten ohitetaan)." -#: lib/logitech_receiver/settings_templates.py:643 -#: lib/logitech_receiver/settings_templates.py:644 #: lib/logitech_receiver/settings_templates.py:645 -msgid "Diverted" -msgstr "" +msgid "Scroll Wheel Ratcheted" +msgstr "Vierityspyörän pykäläinen asetus" -#: lib/logitech_receiver/settings_templates.py:643 -#: lib/logitech_receiver/settings_templates.py:644 -msgid "Mouse Gestures" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:646 +msgid "" +"Switch the mouse wheel between speed-controlled ratcheting and always " +"freespin." +msgstr "" +"Vaihda hiiren pyörää nopeusohjatun pykäläisen ja aina vapaasti pyörivän " +"välillä." -#: lib/logitech_receiver/settings_templates.py:643 -#: lib/logitech_receiver/settings_templates.py:644 -#: lib/logitech_receiver/settings_templates.py:645 -msgid "Regular" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:648 +msgid "Freespinning" +msgstr "Vapaasti pyörivä" -#: lib/logitech_receiver/settings_templates.py:643 -msgid "Sliding DPI" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:648 +msgid "Ratcheted" +msgstr "Pykäläinen" -#: lib/logitech_receiver/settings_templates.py:711 -msgid "Sensitivity (DPI)" -msgstr "Herkkyys (DPI)" +#: lib/logitech_receiver/settings_templates.py:655 +msgid "Scroll Wheel Ratchet Speed" +msgstr "Vierityspyörän pykäläisen asetuksen nopeus" -#: lib/logitech_receiver/settings_templates.py:752 -msgid "Sensitivity Switching" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:657 +msgid "" +"Use the mouse wheel speed to switch between ratcheted and freespinning.\n" +"The mouse wheel is always ratcheted at 50." +msgstr "" +"Käytä hiiren pyörän nopeutta vaihtaaksesi pykäläisen ja vapaasti pyörivän välillä.\n" +"Hiiren pyörä on aina pykäläinen nopeudella 50." -#: lib/logitech_receiver/settings_templates.py:754 -msgid "Switch the current sensitivity and the remembered sensitivity when " - "the key or button is pressed.\n" - "If there is no remembered sensitivity, just remember the current " - "sensitivity" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:707 +msgid "Scroll Wheel Ratchet Torque" +msgstr "Vierityspyörän pykälän vääntömomentti" -#: lib/logitech_receiver/settings_templates.py:758 -msgid "Off" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:708 +msgid "Change the torque needed to overcome the ratchet." +msgstr "Muuta pykälän ylittämiseen tarvittavaa vääntömomenttia." -#: lib/logitech_receiver/settings_templates.py:791 -msgid "Disable keys" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:743 +msgid "Key/Button Actions" +msgstr "Näppäin-/painiketoiminnot" -#: lib/logitech_receiver/settings_templates.py:792 -msgid "Disable specific keyboard keys." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:745 +msgid "Change the action for the key or button." +msgstr "Muuta näppäimen tai painikkeen toimintoa." -#: lib/logitech_receiver/settings_templates.py:795 -#, python-format -msgid "Disables the %s key." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:747 +msgid "Overridden by diversion." +msgstr "Uudelleenohjauksen ohittama." -#: lib/logitech_receiver/settings_templates.py:809 -#: lib/logitech_receiver/settings_templates.py:860 -msgid "Set OS" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:810 -#: lib/logitech_receiver/settings_templates.py:861 -msgid "Change keys to match OS." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:873 -msgid "Change Host" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:874 -msgid "Switch connection to a different host" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:900 -msgid "Performs a left click." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:900 -msgid "Single tap" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:901 -msgid "Performs a right click." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:901 -msgid "Single tap with two fingers" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:902 -msgid "Single tap with three fingers" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:906 -msgid "Double tap" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:906 -msgid "Performs a double click." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:907 -msgid "Double tap with two fingers" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:908 -msgid "Double tap with three fingers" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:911 -msgid "Drags items by dragging the finger after double tapping." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:911 -msgid "Tap and drag" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:913 -msgid "Drags items by dragging the fingers after double tapping." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:913 -msgid "Tap and drag with two fingers" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:914 -msgid "Tap and drag with three fingers" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:917 -msgid "Disables tap and edge gestures (equivalent to pressing Fn+LeftClick)." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:917 -msgid "Suppress tap and edge gestures" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:918 -msgid "Scroll with one finger" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:918 -#: lib/logitech_receiver/settings_templates.py:919 -#: lib/logitech_receiver/settings_templates.py:922 -msgid "Scrolls." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:919 -#: lib/logitech_receiver/settings_templates.py:922 -msgid "Scroll with two fingers" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:920 -msgid "Scroll horizontally with two fingers" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:920 -msgid "Scrolls horizontally." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:921 -msgid "Scroll vertically with two fingers" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:921 -msgid "Scrolls vertically." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:923 -msgid "Inverts the scrolling direction." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:923 -msgid "Natural scrolling" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:749 +msgid "" +"Changing important actions (such as for the left mouse button) can result in" +" an unusable system." +msgstr "" +"Tärkeiden toimintojen (kuten hiiren vasemman painikkeen) muuttaminen voi " +"johtaa käyttökelvottomaan järjestelmään." #: lib/logitech_receiver/settings_templates.py:924 -msgid "Enables the thumbwheel." -msgstr "" +msgid "Key/Button Diversion" +msgstr "Näppäimen/painikkeen uudelleenohjaus" -#: lib/logitech_receiver/settings_templates.py:924 -msgid "Thumbwheel" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:925 +msgid "" +"Make the key or button send HID++ notifications (Diverted) or initiate Mouse" +" Gestures or Sliding DPI" +msgstr "" +"Aseta näppäin tai painike lähettämään HID++ -ilmoituksia (Uudelleenohjattu) " +"tai aloita hiirieleet tai liukuva DPI" -#: lib/logitech_receiver/settings_templates.py:935 -#: lib/logitech_receiver/settings_templates.py:939 -msgid "Swipe from the top edge" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:928 +#: lib/logitech_receiver/settings_templates.py:929 +#: lib/logitech_receiver/settings_templates.py:930 +msgid "Diverted" +msgstr "Uudelleenohjattu" -#: lib/logitech_receiver/settings_templates.py:936 -msgid "Swipe from the left edge" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:928 +#: lib/logitech_receiver/settings_templates.py:929 +msgid "Mouse Gestures" +msgstr "Hiirieleet" -#: lib/logitech_receiver/settings_templates.py:937 -msgid "Swipe from the right edge" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:928 +#: lib/logitech_receiver/settings_templates.py:929 +#: lib/logitech_receiver/settings_templates.py:930 +msgid "Regular" +msgstr "Säännöllinen" -#: lib/logitech_receiver/settings_templates.py:938 -msgid "Swipe from the bottom edge" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:940 -msgid "Swipe two fingers from the left edge" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:941 -msgid "Swipe two fingers from the right edge" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:942 -msgid "Swipe two fingers from the bottom edge" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:943 -msgid "Swipe two fingers from the top edge" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:944 -#: lib/logitech_receiver/settings_templates.py:948 -msgid "Pinch to zoom out; spread to zoom in." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:944 -msgid "Zoom with two fingers." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:945 -msgid "Pinch to zoom out." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:946 -msgid "Spread to zoom in." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:947 -msgid "Zoom with three fingers." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:948 -msgid "Zoom with two fingers" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:966 -msgid "Pixel zone" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:967 -msgid "Ratio zone" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:968 -msgid "Scale factor" -msgstr "Skaalauskerroin" - -#: lib/logitech_receiver/settings_templates.py:968 -msgid "Sets the cursor speed." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:972 -msgid "Left" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:972 -msgid "Left-most coordinate." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:973 -msgid "Bottom" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:973 -msgid "Bottom coordinate." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:974 -msgid "Width" -msgstr "Leveys" - -#: lib/logitech_receiver/settings_templates.py:974 -msgid "Width." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:975 -msgid "Height" -msgstr "Korkeus" - -#: lib/logitech_receiver/settings_templates.py:975 -msgid "Height." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:976 -msgid "Cursor speed." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:976 -msgid "Scale" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:982 -msgid "Gestures" -msgstr "Eleet" - -#: lib/logitech_receiver/settings_templates.py:983 -msgid "Tweak the mouse/touchpad behaviour." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:1000 -msgid "Gestures Diversion" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:1001 -msgid "Divert mouse/touchpad gestures." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:928 +msgid "Sliding DPI" +msgstr "Liukuva DPI" #: lib/logitech_receiver/settings_templates.py:1018 -msgid "Gesture params" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:1019 -msgid "Change numerical parameters of a mouse/touchpad." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:1044 -msgid "M-Key LEDs" -msgstr "" - #: lib/logitech_receiver/settings_templates.py:1046 -msgid "Control the M-Key LEDs." -msgstr "" +msgid "Sensitivity (DPI)" +msgstr "Herkkyys (DPI)" -#: lib/logitech_receiver/settings_templates.py:1047 -#: lib/logitech_receiver/settings_templates.py:1077 -msgid "May need G Keys diverted to be effective." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1123 +msgid "Sensitivity Switching" +msgstr "Herkkyyden vaihtaminen" -#: lib/logitech_receiver/settings_templates.py:1053 +#: lib/logitech_receiver/settings_templates.py:1125 +msgid "" +"Switch the current sensitivity and the remembered sensitivity when the key or button is pressed.\n" +"If there is no remembered sensitivity, just remember the current sensitivity" +msgstr "" +"Vaihda nykyinen herkkyys ja muistettu herkkyys, kun näppäintä tai painiketta painetaan.\n" +"Jos muistettua herkkyyttä ei ole, muista vain nykyinen herkkyys" + +#: lib/logitech_receiver/settings_templates.py:1129 +msgid "Off" +msgstr "Pois" + +#: lib/logitech_receiver/settings_templates.py:1160 +msgid "Disable keys" +msgstr "Poista näppäimiä käytöstä" + +#: lib/logitech_receiver/settings_templates.py:1161 +msgid "Disable specific keyboard keys." +msgstr "Poista tiettyjä näppäimistön näppäimiä käytöstä." + +#: lib/logitech_receiver/settings_templates.py:1164 #, python-format -msgid "Lights up the %s key." -msgstr "" +msgid "Disables the %s key." +msgstr "Poistaa %s-näppäimen käytöstä." -#: lib/logitech_receiver/settings_templates.py:1074 -msgid "MR-Key LED" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1177 +#: lib/logitech_receiver/settings_templates.py:1234 +msgid "Set OS" +msgstr "Aseta käyttöjärjestelmä" -#: lib/logitech_receiver/settings_templates.py:1076 -msgid "Control the MR-Key LED." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1178 +#: lib/logitech_receiver/settings_templates.py:1235 +msgid "Change keys to match OS." +msgstr "Muuta näppäimet vastaamaan käyttöjärjestelmää." -#: lib/logitech_receiver/settings_templates.py:1095 -msgid "Persistent Key/Button Mapping" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1247 +msgid "Change Host" +msgstr "Vaihda isäntälaitetta" -#: lib/logitech_receiver/settings_templates.py:1097 -msgid "Permanently change the mapping for the key or button." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1248 +msgid "Switch connection to a different host" +msgstr "Vaihda yhteys toiseen isäntälaitteeseen" -#: lib/logitech_receiver/settings_templates.py:1098 -msgid "Changing important keys or buttons (such as for the left mouse " - "button) can result in an unusable system." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1272 +msgid "Performs a left click." +msgstr "Suorittaa vasemman napsautuksen." -#: lib/logitech_receiver/settings_templates.py:1157 -msgid "Sidetone" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1272 +msgid "Single tap" +msgstr "Yksi napautus" -#: lib/logitech_receiver/settings_templates.py:1158 -msgid "Set sidetone level." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1273 +msgid "Performs a right click." +msgstr "Suorittaa oikean napsautuksen." -#: lib/logitech_receiver/settings_templates.py:1167 -msgid "Equalizer" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1273 +msgid "Single tap with two fingers" +msgstr "Yksi napautus kahdella sormella" -#: lib/logitech_receiver/settings_templates.py:1168 -msgid "Set equalizer levels." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1274 +msgid "Single tap with three fingers" +msgstr "Yksi napautus kolmella sormella" -#: lib/logitech_receiver/settings_templates.py:1191 -msgid "Hz" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1278 +msgid "Double tap" +msgstr "Kaksoisnapautus" -#: lib/logitech_receiver/settings_templates.py:1197 -msgid "Power Management" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1278 +msgid "Performs a double click." +msgstr "Suorittaa kaksoisnapsautuksen." -#: lib/logitech_receiver/settings_templates.py:1198 -msgid "Power off in minutes (0 for never)." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1279 +msgid "Double tap with two fingers" +msgstr "Kaksoisnapautus kahdella sormella" -#: lib/logitech_receiver/status.py:114 -msgid "No paired devices." -msgstr "Ei paritettuja laitteita." +#: lib/logitech_receiver/settings_templates.py:1280 +msgid "Double tap with three fingers" +msgstr "Kaksoisnapautus kolmella sormella" -#: lib/logitech_receiver/status.py:115 lib/solaar/ui/window.py:622 +#: lib/logitech_receiver/settings_templates.py:1283 +msgid "Drags items by dragging the finger after double tapping." +msgstr "Raahaa kohteita vetämällä sormea kaksoisnapautuksen jälkeen." + +#: lib/logitech_receiver/settings_templates.py:1283 +msgid "Tap and drag" +msgstr "Napauta ja raahaa" + +#: lib/logitech_receiver/settings_templates.py:1285 +msgid "Tap and drag with two fingers" +msgstr "Napauta ja raahaa kahdella sormella" + +#: lib/logitech_receiver/settings_templates.py:1286 +msgid "Drags items by dragging the fingers after double tapping." +msgstr "Raahaa kohteita vetämällä sormia kaksoisnapautuksen jälkeen." + +#: lib/logitech_receiver/settings_templates.py:1288 +msgid "Tap and drag with three fingers" +msgstr "Napauta ja raahaa kolmella sormella" + +#: lib/logitech_receiver/settings_templates.py:1291 +msgid "Suppress tap and edge gestures" +msgstr "Estä napautus- ja reunaeleet" + +#: lib/logitech_receiver/settings_templates.py:1292 +msgid "Disables tap and edge gestures (equivalent to pressing Fn+LeftClick)." +msgstr "Poistaa napautus- ja reunaeleet käytöstä (vastaa Fn+Vasen napsautus)." + +#: lib/logitech_receiver/settings_templates.py:1294 +msgid "Scroll with one finger" +msgstr "Vieritä yhdellä sormella" + +#: lib/logitech_receiver/settings_templates.py:1294 +#: lib/logitech_receiver/settings_templates.py:1295 +#: lib/logitech_receiver/settings_templates.py:1298 +msgid "Scrolls." +msgstr "Vierittää." + +#: lib/logitech_receiver/settings_templates.py:1295 +#: lib/logitech_receiver/settings_templates.py:1298 +msgid "Scroll with two fingers" +msgstr "Vieritä kahdella sormella" + +#: lib/logitech_receiver/settings_templates.py:1296 +msgid "Scroll horizontally with two fingers" +msgstr "Vieritä vaakasuunnassa kahdella sormella" + +#: lib/logitech_receiver/settings_templates.py:1296 +msgid "Scrolls horizontally." +msgstr "Vierittää vaakasuunnassa." + +#: lib/logitech_receiver/settings_templates.py:1297 +msgid "Scroll vertically with two fingers" +msgstr "Vieritä pystysuunnassa kahdella sormella" + +#: lib/logitech_receiver/settings_templates.py:1297 +msgid "Scrolls vertically." +msgstr "Vierittää pystysuunnassa." + +#: lib/logitech_receiver/settings_templates.py:1299 +msgid "Inverts the scrolling direction." +msgstr "Kääntää vierityssuunnan." + +#: lib/logitech_receiver/settings_templates.py:1299 +msgid "Natural scrolling" +msgstr "Luonnollinen vieritys" + +#: lib/logitech_receiver/settings_templates.py:1300 +msgid "Enables the thumbwheel." +msgstr "Ottaa peukalopyörän käyttöön." + +#: lib/logitech_receiver/settings_templates.py:1300 +msgid "Thumbwheel" +msgstr "Peukalopyörä" + +#: lib/logitech_receiver/settings_templates.py:1311 +#: lib/logitech_receiver/settings_templates.py:1315 +msgid "Swipe from the top edge" +msgstr "Pyyhkäise yläreunasta" + +#: lib/logitech_receiver/settings_templates.py:1312 +msgid "Swipe from the left edge" +msgstr "Pyyhkäise vasemmasta reunasta" + +#: lib/logitech_receiver/settings_templates.py:1313 +msgid "Swipe from the right edge" +msgstr "Pyyhkäise oikeasta reunasta" + +#: lib/logitech_receiver/settings_templates.py:1314 +msgid "Swipe from the bottom edge" +msgstr "Pyyhkäise alareunasta" + +#: lib/logitech_receiver/settings_templates.py:1316 +msgid "Swipe two fingers from the left edge" +msgstr "Pyyhkäise kahdella sormella vasemmasta reunasta" + +#: lib/logitech_receiver/settings_templates.py:1317 +msgid "Swipe two fingers from the right edge" +msgstr "Pyyhkäise kahdella sormella oikeasta reunasta" + +#: lib/logitech_receiver/settings_templates.py:1318 +msgid "Swipe two fingers from the bottom edge" +msgstr "Pyyhkäise kahdella sormella alareunasta" + +#: lib/logitech_receiver/settings_templates.py:1319 +msgid "Swipe two fingers from the top edge" +msgstr "Pyyhkäise kahdella sormella yläreunasta" + +#: lib/logitech_receiver/settings_templates.py:1320 +#: lib/logitech_receiver/settings_templates.py:1324 +msgid "Pinch to zoom out; spread to zoom in." +msgstr "Nipistä loitontaaksesi; levitä lähentääksesi." + +#: lib/logitech_receiver/settings_templates.py:1320 +msgid "Zoom with two fingers." +msgstr "Zoomaa kahdella sormella." + +#: lib/logitech_receiver/settings_templates.py:1321 +msgid "Pinch to zoom out." +msgstr "Nipistä loitontaaksesi." + +#: lib/logitech_receiver/settings_templates.py:1322 +msgid "Spread to zoom in." +msgstr "Levitä lähentääksesi." + +#: lib/logitech_receiver/settings_templates.py:1323 +msgid "Zoom with three fingers." +msgstr "Zoomaa kolmella sormella." + +#: lib/logitech_receiver/settings_templates.py:1324 +msgid "Zoom with two fingers" +msgstr "Zoomaa kahdella sormella" + +#: lib/logitech_receiver/settings_templates.py:1342 +msgid "Pixel zone" +msgstr "Pikselialue" + +#: lib/logitech_receiver/settings_templates.py:1343 +msgid "Ratio zone" +msgstr "Suhdealue" + +#: lib/logitech_receiver/settings_templates.py:1344 +msgid "Scale factor" +msgstr "Skaalauskerroin" + +#: lib/logitech_receiver/settings_templates.py:1344 +msgid "Sets the cursor speed." +msgstr "Asettaa osoittimen nopeuden." + +#: lib/logitech_receiver/settings_templates.py:1348 +msgid "Left" +msgstr "Vasen" + +#: lib/logitech_receiver/settings_templates.py:1348 +msgid "Left-most coordinate." +msgstr "Vasemmanpuoleisin koordinaatti." + +#: lib/logitech_receiver/settings_templates.py:1349 +msgid "Bottom" +msgstr "Alareuna" + +#: lib/logitech_receiver/settings_templates.py:1349 +msgid "Bottom coordinate." +msgstr "Alakoordinaatti." + +#: lib/logitech_receiver/settings_templates.py:1350 +msgid "Width" +msgstr "Leveys" + +#: lib/logitech_receiver/settings_templates.py:1350 +msgid "Width." +msgstr "Leveys." + +#: lib/logitech_receiver/settings_templates.py:1351 +msgid "Height" +msgstr "Korkeus" + +#: lib/logitech_receiver/settings_templates.py:1351 +msgid "Height." +msgstr "Korkeus." + +#: lib/logitech_receiver/settings_templates.py:1352 +msgid "Cursor speed." +msgstr "Osoittimen nopeus." + +#: lib/logitech_receiver/settings_templates.py:1352 +msgid "Scale" +msgstr "Skaala" + +#: lib/logitech_receiver/settings_templates.py:1358 +msgid "Gestures" +msgstr "Eleet" + +#: lib/logitech_receiver/settings_templates.py:1359 +msgid "Tweak the mouse/touchpad behaviour." +msgstr "Säädä hiiren/kosketuslevyn toimintaa." + +#: lib/logitech_receiver/settings_templates.py:1375 +msgid "Gestures Diversion" +msgstr "Eleiden uudelleenohjaus" + +#: lib/logitech_receiver/settings_templates.py:1376 +msgid "Divert mouse/touchpad gestures." +msgstr "Uudelleenohjaa hiiren/kosketuslevyn eleet." + +#: lib/logitech_receiver/settings_templates.py:1392 +msgid "Gesture params" +msgstr "Eleiden parametrit" + +#: lib/logitech_receiver/settings_templates.py:1393 +msgid "Change numerical parameters of a mouse/touchpad." +msgstr "Muuta hiiren/kosketuslevyn numeerisia parametreja." + +#: lib/logitech_receiver/settings_templates.py:1417 +msgid "M-Key LEDs" +msgstr "M-näppäinten LEDit" + +#: lib/logitech_receiver/settings_templates.py:1419 +msgid "Control the M-Key LEDs." +msgstr "Hallitse M-näppäinten LEDejä." + +#: lib/logitech_receiver/settings_templates.py:1423 +#: lib/logitech_receiver/settings_templates.py:1454 +msgid "May need G Keys diverted to be effective." +msgstr "Saattaa edellyttää G-näppäinten uudelleenohjausta toimiakseen." + +#: lib/logitech_receiver/settings_templates.py:1429 #, python-format -msgid "%(count)s paired device." -msgid_plural "%(count)s paired devices." -msgstr[0] "" -msgstr[1] "" +msgid "Lights up the %s key." +msgstr "Sytyttää %s-näppäimen." -#: lib/logitech_receiver/status.py:170 -#, python-format -msgid "Battery: %(level)s" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1448 +msgid "MR-Key LED" +msgstr "MR-näppäimen LED" -#: lib/logitech_receiver/status.py:172 -#, python-format -msgid "Battery: %(percent)d%%" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1450 +msgid "Control the MR-Key LED." +msgstr "Hallitse MR-näppäimen LEDiä." -#: lib/logitech_receiver/status.py:184 -#, python-format -msgid "Lighting: %(level)s lux" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1471 +msgid "Persistent Key/Button Mapping" +msgstr "Pysyvä näppäin-/painikemääritys" -#: lib/logitech_receiver/status.py:239 -#, python-format -msgid "Battery: %(level)s (%(status)s)" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1473 +msgid "Permanently change the mapping for the key or button." +msgstr "Muuta näppäimen tai painikkeen määritystä pysyvästi." -#: lib/logitech_receiver/status.py:241 -#, python-format -msgid "Battery: %(percent)d%% (%(status)s)" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1475 +msgid "" +"Changing important keys or buttons (such as for the left mouse button) can " +"result in an unusable system." +msgstr "" +"Tärkeiden näppäinten tai painikkeiden (kuten hiiren vasemman painikkeen) " +"muuttaminen voi johtaa käyttökelvottomaan järjestelmään." -#: lib/solaar/ui/__init__.py:52 -msgid "Permissions error" -msgstr "Virheelliset käyttöoikeudet" +#: lib/logitech_receiver/settings_templates.py:1532 +msgid "Sidetone" +msgstr "Sivuääni" -#: lib/solaar/ui/__init__.py:54 -#, python-format -msgid "Found a Logitech receiver or device (%s), but did not have " - "permission to open it." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1533 +msgid "Set sidetone level." +msgstr "Aseta sivuäänen taso." -#: lib/solaar/ui/__init__.py:55 -msgid "If you've just installed Solaar, try disconnecting the receiver or " - "device and then reconnecting it." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1542 +msgid "Equalizer" +msgstr "Taajuuskorjain" -#: lib/solaar/ui/__init__.py:58 -msgid "Cannot connect to device error" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1543 +msgid "Set equalizer levels." +msgstr "Aseta taajuuskorjaimen tasot." -#: lib/solaar/ui/__init__.py:60 -#, python-format -msgid "Found a Logitech receiver or device at %s, but encountered an error " - "connecting to it." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1565 +msgid "Hz" +msgstr "Hz" -#: lib/solaar/ui/__init__.py:61 -msgid "Try disconnecting the device and then reconnecting it or turning it " - "off and then on." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1571 +msgid "Power Management" +msgstr "Virranhallinta" -#: lib/solaar/ui/__init__.py:64 -msgid "Unpairing failed" -msgstr "Parituksen poisto epäonnistui" +#: lib/logitech_receiver/settings_templates.py:1572 +msgid "Power off in minutes (0 for never)." +msgstr "Virrankatkaisu minuuteissa (0 = ei koskaan)." -#: lib/solaar/ui/__init__.py:66 -#, python-brace-format -msgid "Failed to unpair %{device} from %{receiver}." -msgstr "%{device}n parituksen poisto epäonnistui %{receiver}sta." +#: lib/logitech_receiver/settings_templates.py:1584 +msgid "Brightness Control" +msgstr "Kirkkauden säätö" -#: lib/solaar/ui/__init__.py:67 -msgid "The receiver returned an error, with no further details." -msgstr "Vastaanotin palautti virheen ilman lisätietoja." +#: lib/logitech_receiver/settings_templates.py:1585 +msgid "Control overall brightness" +msgstr "Hallitse yleistä kirkkautta" -#: lib/solaar/ui/__init__.py:177 -msgid "Another Solaar process is already running so just expose its window" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1628 +#: lib/logitech_receiver/settings_templates.py:1681 +msgid "LED Control" +msgstr "LED-hallinta" -#: lib/solaar/ui/about.py:36 -msgid "Manages Logitech receivers,\n" - "keyboards, mice, and tablets." -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1629 +#: lib/logitech_receiver/settings_templates.py:1682 +msgid "Switch control of LED zones between device and Solaar" +msgstr "Vaihda LED-alueiden hallintaa laitteen ja Solaarin välillä" -#: lib/solaar/ui/about.py:44 -msgid "Additional Programming" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1644 +#: lib/logitech_receiver/settings_templates.py:1692 +msgid "LED Zone Effects" +msgstr "LED-alueiden efektit" -#: lib/solaar/ui/about.py:45 -msgid "GUI design" -msgstr "Käyttöliittymäsuunnittelu" +#: lib/logitech_receiver/settings_templates.py:1645 +#: lib/logitech_receiver/settings_templates.py:1693 +msgid "LED Control needs to be set to Solaar to be effective." +msgstr "LED-hallinta on asetettava Solaariin ollakseen voimassa." -#: lib/solaar/ui/about.py:47 -msgid "Testing" -msgstr "Testaus" +#: lib/logitech_receiver/settings_templates.py:1645 +#: lib/logitech_receiver/settings_templates.py:1693 +msgid "Set effect for LED Zone" +msgstr "Aseta efekti LED-alueelle" -#: lib/solaar/ui/about.py:54 +#: lib/logitech_receiver/settings_templates.py:1647 +msgid "Color" +msgstr "Väri" + +#: lib/logitech_receiver/settings_templates.py:1648 +msgid "Speed" +msgstr "Nopeus" + +#: lib/logitech_receiver/settings_templates.py:1649 +msgid "Period" +msgstr "Jakso" + +#: lib/logitech_receiver/settings_templates.py:1650 +msgid "Intensity" +msgstr "Voimakkuus" + +#: lib/logitech_receiver/settings_templates.py:1651 +msgid "Ramp" +msgstr "Nousu" + +#: lib/logitech_receiver/settings_templates.py:1666 +msgid "LEDs" +msgstr "LEDit" + +#: lib/logitech_receiver/settings_templates.py:1703 +msgid "Per-key Lighting" +msgstr "Näppäinkohtainen valaistus" + +#: lib/logitech_receiver/settings_templates.py:1704 +msgid "Control per-key lighting." +msgstr "Hallitse näppäinkohtaista valaistusta." + +#: lib/logitech_receiver/settings_templates.py:1786 +msgid "Force Sensing Buttons" +msgstr "Voimaa tunnistavat painikkeet" + +#: lib/logitech_receiver/settings_templates.py:1787 +msgid "Change the force required to activate button." +msgstr "Muuta painikkeen aktivointiin tarvittavaa voimaa." + +#: lib/logitech_receiver/settings_templates.py:1804 +msgid "Force Sensing Button" +msgstr "Voimaa tunnistava painike" + +#: lib/logitech_receiver/settings_templates.py:1814 +msgid "Haptic Feedback Level" +msgstr "Haptisen palautteen taso" + +#: lib/logitech_receiver/settings_templates.py:1815 +msgid "Change power of haptic feedback. (Zero to turn off.)" +msgstr "Muuta haptisen palautteen voimakkuutta. (Nolla poistaa käytöstä.)" + +#: lib/logitech_receiver/settings_templates.py:1857 +msgid "Play Haptic Waveform" +msgstr "Toista haptinen aaltomuoto" + +#: lib/logitech_receiver/settings_templates.py:1858 +msgid "Tell device to play a haptic waveform." +msgstr "Käske laitetta toistamaan haptinen aaltomuoto." + +#: lib/solaar/ui/__init__.py:120 +msgid "Another Solaar process is already running so just expose its window" +msgstr "" +"Toinen Solaar-prosessi on jo käynnissä, joten sen ikkuna tuodaan näkyviin" + +#: lib/solaar/ui/about/model.py:36 +msgid "" +"Manages Logitech receivers,\n" +"keyboards, mice, and tablets." +msgstr "" +"Hallitsee Logitech-vastaanottimia,\n" +"näppäimistöjä, hiiriä ja piirtopöytiä." + +#: lib/solaar/ui/about/model.py:64 +msgid "Additional Programming" +msgstr "Lisäohjelmointi" + +#: lib/solaar/ui/about/model.py:65 +msgid "GUI design" +msgstr "Käyttöliittymäsuunnittelu" + +#: lib/solaar/ui/about/model.py:67 +msgid "Testing" +msgstr "Testaus" + +#: lib/solaar/ui/about/model.py:75 #, fuzzy -msgid "Logitech documentation" -msgstr "Logitechin dokumentointi" +msgid "Logitech documentation" +msgstr "Logitechin dokumentointi" -#: lib/solaar/ui/action.py:85 lib/solaar/ui/action.py:89 -#: lib/solaar/ui/window.py:197 -msgid "Unpair" -msgstr "Poista paritus" +#: lib/solaar/ui/action.py:88 lib/solaar/ui/action.py:92 +#: lib/solaar/ui/window.py:208 +msgid "Unpair" +msgstr "Poista paritus" -#: lib/solaar/ui/action.py:88 lib/solaar/ui/diversion_rules.py:150 -msgid "Cancel" -msgstr "" +#: lib/solaar/ui/action.py:91 lib/solaar/ui/diversion_rules.py:141 +msgid "Cancel" +msgstr "Peruuta" -#: lib/solaar/ui/config_panel.py:212 -msgid "Complete - ENTER to change" -msgstr "" +#: lib/solaar/ui/common.py:42 +msgid "Permissions error" +msgstr "Virheelliset käyttöoikeudet" -#: lib/solaar/ui/config_panel.py:212 -msgid "Incomplete" -msgstr "" - -#: lib/solaar/ui/config_panel.py:455 lib/solaar/ui/config_panel.py:507 +#: lib/solaar/ui/common.py:44 #, python-format -msgid "%d value" -msgid_plural "%d values" -msgstr[0] "" -msgstr[1] "" +msgid "" +"Found a Logitech receiver or device (%s), but did not have permission to " +"open it." +msgstr "" +"Löydettiin Logitech-vastaanotin tai -laite (%s), mutta siihen ei ollut " +"avaamisoikeutta." -#: lib/solaar/ui/config_panel.py:518 -msgid "Changes allowed" -msgstr "" +#: lib/solaar/ui/common.py:46 +msgid "" +"If you've just installed Solaar, try disconnecting the receiver or device " +"and then reconnecting it." +msgstr "" +"Jos asensit Solaarin juuri, kokeile irrottaa vastaanotin tai laite ja " +"yhdistää se sitten uudelleen." -#: lib/solaar/ui/config_panel.py:519 -msgid "No changes allowed" -msgstr "" +#: lib/solaar/ui/common.py:49 +msgid "Cannot connect to device error" +msgstr "Virhe yhdistettäessä laitteeseen" -#: lib/solaar/ui/config_panel.py:520 -msgid "Ignore this setting" -msgstr "" +#: lib/solaar/ui/common.py:51 +#, python-format +msgid "" +"Found a Logitech receiver or device at %s, but encountered an error " +"connecting to it." +msgstr "" +"Löydettiin Logitech-vastaanotin tai -laite polusta %s, mutta ilmeni virhe " +"yhdistettäessä siihen." -#: lib/solaar/ui/config_panel.py:565 -msgid "Working" -msgstr "Työskentelee" +#: lib/solaar/ui/common.py:53 +msgid "" +"Try disconnecting the device and then reconnecting it or turning it off and " +"then on." +msgstr "" +"Kokeile laitteen irrottamista ja yhdistämistä uudelleen tai sen " +"sammuttamista ja käynnistämistä uudelleen." -#: lib/solaar/ui/config_panel.py:568 -msgid "Read/write operation failed." -msgstr "Luku/kirjoitus operaatio epäonnistui." +#: lib/solaar/ui/common.py:56 +msgid "Unpairing failed" +msgstr "Parituksen poisto epäonnistui" -#: lib/solaar/ui/diversion_rules.py:65 -msgid "Built-in rules" -msgstr "" +#: lib/solaar/ui/common.py:58 +#, python-brace-format +msgid "Failed to unpair %{device} from %{receiver}." +msgstr "%{device}n parituksen poisto epäonnistui %{receiver}sta." -#: lib/solaar/ui/diversion_rules.py:65 -msgid "User-defined rules" -msgstr "" +#: lib/solaar/ui/common.py:63 +msgid "The receiver returned an error, with no further details." +msgstr "Vastaanotin palautti virheen ilman lisätietoja." -#: lib/solaar/ui/diversion_rules.py:67 lib/solaar/ui/diversion_rules.py:1083 -msgid "Rule" -msgstr "" +#: lib/solaar/ui/config_panel.py:245 +msgid "Complete - ENTER to change" +msgstr "Valmis - paina ENTER muuttaaksesi" -#: lib/solaar/ui/diversion_rules.py:68 lib/solaar/ui/diversion_rules.py:509 -#: lib/solaar/ui/diversion_rules.py:636 -msgid "Sub-rule" -msgstr "" +#: lib/solaar/ui/config_panel.py:245 +msgid "Incomplete" +msgstr "Keskeneräinen" -#: lib/solaar/ui/diversion_rules.py:70 -msgid "[empty]" -msgstr "" +#: lib/solaar/ui/config_panel.py:491 lib/solaar/ui/config_panel.py:543 +#, python-format +msgid "%d value" +msgid_plural "%d values" +msgstr[0] "%d arvo" +msgstr[1] "%d arvoa" -#: lib/solaar/ui/diversion_rules.py:94 -msgid "Solaar Rule Editor" -msgstr "" +#: lib/solaar/ui/config_panel.py:642 +msgid "Changes allowed" +msgstr "Muutokset sallittu" -#: lib/solaar/ui/diversion_rules.py:141 -msgid "Make changes permanent?" -msgstr "" +#: lib/solaar/ui/config_panel.py:643 +msgid "No changes allowed" +msgstr "Ei muutoksia sallittu" -#: lib/solaar/ui/diversion_rules.py:146 -msgid "Yes" -msgstr "Kyllä" +#: lib/solaar/ui/config_panel.py:644 +msgid "Ignore this setting" +msgstr "Ohita tämä asetus" -#: lib/solaar/ui/diversion_rules.py:148 -msgid "No" -msgstr "" +#: lib/solaar/ui/config_panel.py:690 +msgid "Working" +msgstr "Työskentelee" -#: lib/solaar/ui/diversion_rules.py:153 -msgid "If you choose No, changes will be lost when Solaar is closed." -msgstr "" +#: lib/solaar/ui/config_panel.py:693 +msgid "Read/write operation failed." +msgstr "Luku/kirjoitus operaatio epäonnistui." -#: lib/solaar/ui/diversion_rules.py:201 -msgid "Save changes" -msgstr "" +#: lib/solaar/ui/desktop_notifications.py:112 +msgid "unspecified reason" +msgstr "määrittämätön syy" -#: lib/solaar/ui/diversion_rules.py:206 -msgid "Discard changes" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:103 +msgid "Built-in rules" +msgstr "Sisäänrakennetut säännöt" -#: lib/solaar/ui/diversion_rules.py:372 -msgid "Insert here" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:103 +msgid "User-defined rules" +msgstr "Käyttäjän määrittämät säännöt" -#: lib/solaar/ui/diversion_rules.py:374 -msgid "Insert above" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:105 lib/solaar/ui/diversion_rules.py:1126 +msgid "Rule" +msgstr "Sääntö" -#: lib/solaar/ui/diversion_rules.py:376 -msgid "Insert below" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:106 lib/solaar/ui/diversion_rules.py:382 +#: lib/solaar/ui/diversion_rules.py:509 +msgid "Sub-rule" +msgstr "Alisääntö" -#: lib/solaar/ui/diversion_rules.py:382 -msgid "Insert new rule here" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:108 +msgid "[empty]" +msgstr "[tyhjä]" -#: lib/solaar/ui/diversion_rules.py:384 -msgid "Insert new rule above" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:132 +msgid "Make changes permanent?" +msgstr "Tehdäänkö muutoksista pysyviä?" + +#: lib/solaar/ui/diversion_rules.py:137 +msgid "Yes" +msgstr "Kyllä" + +#: lib/solaar/ui/diversion_rules.py:139 +msgid "No" +msgstr "Ei" + +#: lib/solaar/ui/diversion_rules.py:144 +msgid "If you choose No, changes will be lost when Solaar is closed." +msgstr "Jos valitset Ei, muutokset menetetään, kun Solaar suljetaan." + +#: lib/solaar/ui/diversion_rules.py:273 +msgid "Paste here" +msgstr "Liitä tähän" + +#: lib/solaar/ui/diversion_rules.py:275 +msgid "Paste above" +msgstr "Liitä yläpuolelle" + +#: lib/solaar/ui/diversion_rules.py:277 +msgid "Paste below" +msgstr "Liitä alapuolelle" + +#: lib/solaar/ui/diversion_rules.py:283 +msgid "Paste rule here" +msgstr "Liitä sääntö tähän" + +#: lib/solaar/ui/diversion_rules.py:285 +msgid "Paste rule above" +msgstr "Liitä sääntö yläpuolelle" + +#: lib/solaar/ui/diversion_rules.py:287 +msgid "Paste rule below" +msgstr "Liitä sääntö alapuolelle" + +#: lib/solaar/ui/diversion_rules.py:291 +msgid "Paste rule" +msgstr "Liitä sääntö" + +#: lib/solaar/ui/diversion_rules.py:306 +msgid "Insert here" +msgstr "Lisää tähän" + +#: lib/solaar/ui/diversion_rules.py:308 +msgid "Insert above" +msgstr "Lisää yläpuolelle" + +#: lib/solaar/ui/diversion_rules.py:310 +msgid "Insert below" +msgstr "Lisää alapuolelle" + +#: lib/solaar/ui/diversion_rules.py:316 +msgid "Insert new rule here" +msgstr "Lisää uusi sääntö tähän" + +#: lib/solaar/ui/diversion_rules.py:318 +msgid "Insert new rule above" +msgstr "Lisää uusi sääntö yläpuolelle" + +#: lib/solaar/ui/diversion_rules.py:320 +msgid "Insert new rule below" +msgstr "Lisää uusi sääntö alapuolelle" + +#: lib/solaar/ui/diversion_rules.py:347 +msgid "Flatten" +msgstr "Litistä" + +#: lib/solaar/ui/diversion_rules.py:380 +msgid "Insert" +msgstr "Lisää" + +#: lib/solaar/ui/diversion_rules.py:383 lib/solaar/ui/diversion_rules.py:511 +#: lib/solaar/ui/diversion_rules.py:1158 +msgid "Or" +msgstr "Tai" + +#: lib/solaar/ui/diversion_rules.py:384 lib/solaar/ui/diversion_rules.py:510 +#: lib/solaar/ui/diversion_rules.py:1144 +msgid "And" +msgstr "Ja" #: lib/solaar/ui/diversion_rules.py:386 -msgid "Insert new rule below" -msgstr "" +msgid "Condition" +msgstr "Ehto" -#: lib/solaar/ui/diversion_rules.py:427 -msgid "Paste here" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:388 lib/solaar/ui/rule_conditions.py:154 +msgid "Feature" +msgstr "Ominaisuus" -#: lib/solaar/ui/diversion_rules.py:429 -msgid "Paste above" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:389 lib/solaar/ui/rule_conditions.py:188 +msgid "Report" +msgstr "Raportti" -#: lib/solaar/ui/diversion_rules.py:431 -msgid "Paste below" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:390 lib/solaar/ui/rule_conditions.py:69 +msgid "Process" +msgstr "Prosessi" -#: lib/solaar/ui/diversion_rules.py:437 -msgid "Paste rule here" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:391 +msgid "Mouse process" +msgstr "Hiiriprosessi" -#: lib/solaar/ui/diversion_rules.py:439 -msgid "Paste rule above" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:392 lib/solaar/ui/rule_conditions.py:225 +msgid "Modifiers" +msgstr "Muuntajat" + +#: lib/solaar/ui/diversion_rules.py:393 lib/solaar/ui/rule_conditions.py:277 +msgid "Key" +msgstr "Näppäin" + +#: lib/solaar/ui/diversion_rules.py:394 lib/solaar/ui/rule_conditions.py:318 +msgid "KeyIsDown" +msgstr "Näppäin on painettu" + +#: lib/solaar/ui/diversion_rules.py:395 lib/solaar/ui/diversion_rules.py:1432 +msgid "Active" +msgstr "Aktiivinen" + +#: lib/solaar/ui/diversion_rules.py:396 lib/solaar/ui/diversion_rules.py:1390 +#: lib/solaar/ui/diversion_rules.py:1441 lib/solaar/ui/diversion_rules.py:1487 +msgid "Device" +msgstr "Laite" + +#: lib/solaar/ui/diversion_rules.py:397 lib/solaar/ui/diversion_rules.py:1467 +msgid "Host" +msgstr "Isäntä" + +#: lib/solaar/ui/diversion_rules.py:398 lib/solaar/ui/diversion_rules.py:1506 +msgid "Setting" +msgstr "Asetus" + +#: lib/solaar/ui/diversion_rules.py:399 lib/solaar/ui/rule_conditions.py:333 +#: lib/solaar/ui/rule_conditions.py:382 +msgid "Test" +msgstr "Testi" + +#: lib/solaar/ui/diversion_rules.py:400 lib/solaar/ui/rule_conditions.py:507 +msgid "Test bytes" +msgstr "Testaa tavut" + +#: lib/solaar/ui/diversion_rules.py:401 lib/solaar/ui/rule_conditions.py:608 +msgid "Mouse Gesture" +msgstr "Hiiriele" + +#: lib/solaar/ui/diversion_rules.py:405 +msgid "Action" +msgstr "Toiminto" + +#: lib/solaar/ui/diversion_rules.py:407 lib/solaar/ui/rule_actions.py:138 +msgid "Key press" +msgstr "Näppäimen painallus" + +#: lib/solaar/ui/diversion_rules.py:408 lib/solaar/ui/rule_actions.py:191 +msgid "Mouse scroll" +msgstr "Hiiren vieritys" + +#: lib/solaar/ui/diversion_rules.py:409 lib/solaar/ui/rule_actions.py:256 +msgid "Mouse click" +msgstr "Hiiren napsautus" + +#: lib/solaar/ui/diversion_rules.py:410 +msgid "Set" +msgstr "Aseta" + +#: lib/solaar/ui/diversion_rules.py:411 lib/solaar/ui/rule_actions.py:328 +msgid "Execute" +msgstr "Suorita" + +#: lib/solaar/ui/diversion_rules.py:412 lib/solaar/ui/diversion_rules.py:1189 +msgid "Later" +msgstr "Myöhemmin" #: lib/solaar/ui/diversion_rules.py:441 -msgid "Paste rule below" -msgstr "" +msgid "Insert new rule" +msgstr "Lisää uusi sääntö" -#: lib/solaar/ui/diversion_rules.py:445 -msgid "Paste rule" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:461 lib/solaar/ui/rule_actions.py:82 +#: lib/solaar/ui/rule_actions.py:287 lib/solaar/ui/rule_conditions.py:556 +msgid "Delete" +msgstr "Poista" -#: lib/solaar/ui/diversion_rules.py:474 -msgid "Flatten" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:483 +msgid "Negate" +msgstr "Käännä" #: lib/solaar/ui/diversion_rules.py:507 -msgid "Insert" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:510 lib/solaar/ui/diversion_rules.py:638 -#: lib/solaar/ui/diversion_rules.py:1126 -msgid "Or" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:511 lib/solaar/ui/diversion_rules.py:637 -#: lib/solaar/ui/diversion_rules.py:1111 -msgid "And" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:513 -msgid "Condition" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:515 lib/solaar/ui/diversion_rules.py:1292 -msgid "Feature" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:516 lib/solaar/ui/diversion_rules.py:1328 -msgid "Report" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:517 lib/solaar/ui/diversion_rules.py:1204 -msgid "Process" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:518 -msgid "Mouse process" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:519 lib/solaar/ui/diversion_rules.py:1366 -msgid "Modifiers" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:520 lib/solaar/ui/diversion_rules.py:1419 -msgid "Key" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:521 lib/solaar/ui/diversion_rules.py:1461 -msgid "KeyIsDown" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:522 lib/solaar/ui/diversion_rules.py:2260 -msgid "Active" -msgstr "Aktiivinen" - -#: lib/solaar/ui/diversion_rules.py:523 lib/solaar/ui/diversion_rules.py:2218 -#: lib/solaar/ui/diversion_rules.py:2270 lib/solaar/ui/diversion_rules.py:2323 -msgid "Device" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:524 lib/solaar/ui/diversion_rules.py:2297 -msgid "Host" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:525 lib/solaar/ui/diversion_rules.py:2339 -msgid "Setting" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:526 lib/solaar/ui/diversion_rules.py:1477 -#: lib/solaar/ui/diversion_rules.py:1526 -msgid "Test" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:527 lib/solaar/ui/diversion_rules.py:1643 -msgid "Test bytes" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:528 lib/solaar/ui/diversion_rules.py:1736 -msgid "Mouse Gesture" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:532 -msgid "Action" -msgstr "Toiminto" - -#: lib/solaar/ui/diversion_rules.py:534 lib/solaar/ui/diversion_rules.py:1845 -msgid "Key press" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:535 lib/solaar/ui/diversion_rules.py:1897 -msgid "Mouse scroll" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:536 lib/solaar/ui/diversion_rules.py:1959 -msgid "Mouse click" -msgstr "" +msgid "Wrap with" +msgstr "Kääri" #: lib/solaar/ui/diversion_rules.py:537 -msgid "Set" -msgstr "" +msgid "Cut" +msgstr "Leikkaa" -#: lib/solaar/ui/diversion_rules.py:538 lib/solaar/ui/diversion_rules.py:2030 -msgid "Execute" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:553 +msgid "Paste" +msgstr "Liitä" -#: lib/solaar/ui/diversion_rules.py:539 lib/solaar/ui/diversion_rules.py:1158 -msgid "Later" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:559 +msgid "Copy" +msgstr "Kopioi" #: lib/solaar/ui/diversion_rules.py:568 -msgid "Insert new rule" -msgstr "" +msgid "Solaar Rule Editor" +msgstr "Solaarin sääntöeditori" -#: lib/solaar/ui/diversion_rules.py:588 lib/solaar/ui/diversion_rules.py:1686 -#: lib/solaar/ui/diversion_rules.py:1790 lib/solaar/ui/diversion_rules.py:1989 -msgid "Delete" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:668 +msgid "Save changes" +msgstr "Tallenna muutokset" -#: lib/solaar/ui/diversion_rules.py:610 -msgid "Negate" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:673 +msgid "Discard changes" +msgstr "Hylkää muutokset" -#: lib/solaar/ui/diversion_rules.py:634 -msgid "Wrap with" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:1104 +msgid "This editor does not support the selected rule component yet." +msgstr "Tämä editori ei vielä tue valittua sääntökomponenttia." -#: lib/solaar/ui/diversion_rules.py:656 -msgid "Cut" -msgstr "Leikkaa" +#: lib/solaar/ui/diversion_rules.py:1169 +msgid "" +"Number of seconds to delay. Delay between 0 and 1 is done with higher " +"precision." +msgstr "" +"Viive sekunteina. Viive 0:n ja 1:n välillä tehdään suuremmalla " +"tarkkuudella." -#: lib/solaar/ui/diversion_rules.py:671 -msgid "Paste" -msgstr "Liitä" +#: lib/solaar/ui/diversion_rules.py:1207 +msgid "Not" +msgstr "Ei" -#: lib/solaar/ui/diversion_rules.py:683 -msgid "Copy" -msgstr "Kopioi" +#: lib/solaar/ui/diversion_rules.py:1238 +msgid "Toggle" +msgstr "Vaihda" -#: lib/solaar/ui/diversion_rules.py:1063 -msgid "This editor does not support the selected rule component yet." -msgstr "" +#: lib/solaar/ui/diversion_rules.py:1239 +msgid "True" +msgstr "Tosi" -#: lib/solaar/ui/diversion_rules.py:1138 -msgid "Number of seconds to delay." -msgstr "" +#: lib/solaar/ui/diversion_rules.py:1240 +msgid "False" +msgstr "Epätosi" -#: lib/solaar/ui/diversion_rules.py:1177 -msgid "Not" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:1253 +msgid "Unsupported setting" +msgstr "Ei tuettu asetus" -#: lib/solaar/ui/diversion_rules.py:1187 -msgid "X11 active process. For use in X11 only." -msgstr "" +#: lib/solaar/ui/diversion_rules.py:1396 lib/solaar/ui/diversion_rules.py:1415 +#: lib/solaar/ui/diversion_rules.py:1493 lib/solaar/ui/diversion_rules.py:1748 +#: lib/solaar/ui/diversion_rules.py:1766 +msgid "Originating device" +msgstr "Alkuperäinen laite" -#: lib/solaar/ui/diversion_rules.py:1218 -msgid "X11 mouse process. For use in X11 only." -msgstr "" +#: lib/solaar/ui/diversion_rules.py:1428 +msgid "Device is active and its settings can be changed." +msgstr "Laite on aktiivinen ja sen asetuksia voidaan muuttaa." -#: lib/solaar/ui/diversion_rules.py:1235 -msgid "MouseProcess" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:1437 +msgid "Device that originated the current notification." +msgstr "Laite, josta nykyinen ilmoitus on peräisin." -#: lib/solaar/ui/diversion_rules.py:1260 -msgid "Feature name of notification triggering rule processing." -msgstr "" +#: lib/solaar/ui/diversion_rules.py:1450 +msgid "Name of host computer." +msgstr "Isäntätietokoneen nimi." -#: lib/solaar/ui/diversion_rules.py:1308 -msgid "Report number of notification triggering rule processing." -msgstr "" +#: lib/solaar/ui/diversion_rules.py:1520 +msgid "Value" +msgstr "Arvo" -#: lib/solaar/ui/diversion_rules.py:1342 -msgid "Active keyboard modifiers. Not always available in Wayland." -msgstr "" +#: lib/solaar/ui/diversion_rules.py:1529 +msgid "Item" +msgstr "Kohde" -#: lib/solaar/ui/diversion_rules.py:1383 -msgid "Diverted key or button depressed or released.\n" - "Use the Key/Button Diversion and Divert G Keys settings to divert " - "keys and buttons." -msgstr "" +#: lib/solaar/ui/diversion_rules.py:1808 +msgid "Change setting on device" +msgstr "Muuta asetusta laitteessa" -#: lib/solaar/ui/diversion_rules.py:1392 -msgid "Key down" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:1824 +msgid "Setting on device" +msgstr "Asetus laitteessa" -#: lib/solaar/ui/diversion_rules.py:1395 -msgid "Key up" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1436 -msgid "Diverted key or button is currently down.\n" - "Use the Key/Button Diversion and Divert G Keys settings to divert " - "keys and buttons." -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1475 -msgid "Test condition on notification triggering rule processing." -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1479 -msgid "Parameter" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1542 -msgid "begin (inclusive)" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1543 -msgid "end (exclusive)" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1552 -msgid "range" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1554 -msgid "minimum" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1555 -msgid "maximum" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1557 +#: lib/solaar/ui/pair_window.py:44 lib/solaar/ui/pair_window.py:167 #, python-format -msgid "bytes %(0)d to %(1)d, ranging from %(2)d to %(3)d" -msgstr "" +msgid "%(receiver_name)s: pair new device" +msgstr "%(receiver_name)s: parita uusi laite" -#: lib/solaar/ui/diversion_rules.py:1562 -msgid "mask" -msgstr "" +#: lib/solaar/ui/pair_window.py:46 +msgid "Bolt receivers are only compatible with Bolt devices." +msgstr "Bolt-vastaanottimet ovat yhteensopivia vain Bolt-laitteiden kanssa." -#: lib/solaar/ui/diversion_rules.py:1563 +#: lib/solaar/ui/pair_window.py:48 +msgid "Press a pairing button or key until the pairing light flashes quickly." +msgstr "" +"Paina parituspainiketta tai -näppäintä, kunnes paritusvalo vilkkuu nopeasti." + +#: lib/solaar/ui/pair_window.py:51 +msgid "Unifying receivers are only compatible with Unifying devices." +msgstr "" +"Unifying-vastaanottimet ovat yhteensopivia vain Unifying-laitteiden kanssa." + +#: lib/solaar/ui/pair_window.py:53 +msgid "Other receivers are only compatible with a few devices." +msgstr "" +"Muut vastaanottimet ovat yhteensopivia vain joidenkin laitteiden kanssa." + +#: lib/solaar/ui/pair_window.py:55 +msgid "For most devices, turn on the device you want to pair." +msgstr "Useimmissa laitteissa kytke päälle laite, jonka haluat parittaa." + +#: lib/solaar/ui/pair_window.py:56 +msgid "If the device is already turned on, turn it off and on again." +msgstr "Jos laite on jo päällä, sammuta se ja käynnistä uudelleen." + +#: lib/solaar/ui/pair_window.py:58 +msgid "The device must not be paired with a nearby powered-on receiver." +msgstr "" +"Laitetta ei saa olla paritettu lähellä olevaan päällä olevaan " +"vastaanottimeen." + +#: lib/solaar/ui/pair_window.py:61 +msgid "" +"For devices with multiple channels, press, hold, and release the button for the channel you wish to pair\n" +"or use the channel switch button to select a channel and then press, hold, and release the channel switch button." +msgstr "" +"Jos laitteessa on useita kanavia, paina, pidä painettuna ja vapauta sen kanavan painike, jonka haluat parittaa\n" +"tai käytä kanavanvaihtopainiketta valitaksesi kanavan ja paina, pidä painettuna ja vapauta sitten kanavanvaihtopainike." + +#: lib/solaar/ui/pair_window.py:68 +msgid "The channel indicator light should be blinking rapidly." +msgstr "Kanavan merkkivalon pitäisi vilkkua nopeasti." + +#: lib/solaar/ui/pair_window.py:72 #, python-format -msgid "bytes %(0)d to %(1)d, mask %(2)d" -msgstr "" +msgid "" +"\n" +"\n" +"This receiver has %d pairing remaining." +msgid_plural "" +"\n" +"\n" +"This receiver has %d pairings remaining." +msgstr[0] "" +"\n" +"\n" +"Tässä vastaanottimessa on %d paritus jäljellä." +msgstr[1] "" +"\n" +"\n" +"Tässä vastaanottimessa on %d paritusta jäljellä." -#: lib/solaar/ui/diversion_rules.py:1573 -msgid "Bit or range test on bytes in notification message triggering rule " - "processing." -msgstr "" +#: lib/solaar/ui/pair_window.py:78 +msgid "" +"\n" +"Cancelling at this point will not use up a pairing." +msgstr "" +"\n" +"Peruuttaminen tässä vaiheessa ei kuluta paritusta." -#: lib/solaar/ui/diversion_rules.py:1583 -msgid "type" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1666 -msgid "Mouse gesture with optional initiating button followed by zero or " - "more mouse movements." -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1671 -msgid "Add movement" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1764 -msgid "Simulate a chorded key click or depress or release.\n" - "On Wayland requires write access to /dev/uinput." -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1769 -msgid "Add key" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1772 -msgid "Click" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1775 -msgid "Depress" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1778 -msgid "Release" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1861 -msgid "Simulate a mouse scroll.\n" - "On Wayland requires write access to /dev/uinput." -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1918 -msgid "Simulate a mouse click.\n" - "On Wayland requires write access to /dev/uinput." -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1921 -msgid "Button" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1922 -msgid "Count and Action" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1972 -msgid "Execute a command with arguments." -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:1975 -msgid "Add argument" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:2050 -msgid "Toggle" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:2050 -msgid "True" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:2051 -msgid "False" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:2065 -msgid "Unsupported setting" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:2223 lib/solaar/ui/diversion_rules.py:2242 -#: lib/solaar/ui/diversion_rules.py:2328 lib/solaar/ui/diversion_rules.py:2570 -#: lib/solaar/ui/diversion_rules.py:2588 -msgid "Originating device" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:2256 -msgid "Device is active and its settings can be changed." -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:2266 -msgid "Device that originated the current notification." -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:2280 -msgid "Name of host computer." -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:2347 -msgid "Value" -msgstr "Arvo" - -#: lib/solaar/ui/diversion_rules.py:2355 -msgid "Item" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:2630 -msgid "Change setting on device" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:2647 -msgid "Setting on device" -msgstr "" - -#: lib/solaar/ui/notify.py:124 lib/solaar/ui/tray.py:318 -#: lib/solaar/ui/tray.py:323 lib/solaar/ui/window.py:739 -msgid "offline" -msgstr "ei yhdistetty" - -#: lib/solaar/ui/pair_window.py:122 lib/solaar/ui/pair_window.py:256 -#: lib/solaar/ui/pair_window.py:288 +#: lib/solaar/ui/pair_window.py:168 #, python-format -msgid "%(receiver_name)s: pair new device" -msgstr "" +msgid "Enter passcode on %(name)s." +msgstr "Anna pääsykoodi laitteella %(name)s." -#: lib/solaar/ui/pair_window.py:123 +#: lib/solaar/ui/pair_window.py:171 #, python-format -msgid "Enter passcode on %(name)s." -msgstr "" +msgid "Type %(passcode)s and then press the enter key." +msgstr "Kirjoita %(passcode)s ja paina sitten enter-näppäintä." -#: lib/solaar/ui/pair_window.py:126 +#: lib/solaar/ui/pair_window.py:176 +msgid "left" +msgstr "vasen" + +#: lib/solaar/ui/pair_window.py:176 +msgid "right" +msgstr "oikea" + +#: lib/solaar/ui/pair_window.py:178 #, python-format -msgid "Type %(passcode)s and then press the enter key." -msgstr "" +msgid "" +"Press %(code)s\n" +"and then press left and right buttons simultaneously." +msgstr "" +"Paina %(code)s\n" +"ja paina sitten vasenta ja oikeaa painiketta samanaikaisesti." -#: lib/solaar/ui/pair_window.py:129 -msgid "left" -msgstr "" +#: lib/solaar/ui/pair_window.py:221 +msgid "The wireless link is not encrypted" +msgstr "Langaton yhteys ei ole salattu" -#: lib/solaar/ui/pair_window.py:129 -msgid "right" -msgstr "" +#: lib/solaar/ui/pair_window.py:226 +msgid "Found a new device:" +msgstr "Löytyi uusi laite:" -#: lib/solaar/ui/pair_window.py:131 +#: lib/solaar/ui/pair_window.py:247 +msgid "Pairing failed" +msgstr "Paritus epäonnistui." + +#: lib/solaar/ui/pair_window.py:249 +msgid "" +"Make sure your device is within range, and has a decent battery charge." +msgstr "" +"Varmista, että laitteesi on kantaman sisällä ja siinä on riittävä lataus." + +#: lib/solaar/ui/pair_window.py:251 +msgid "" +"A new device was detected, but it is not compatible with this receiver." +msgstr "" +"Uusi laite tunnistettiin, mutta se ei ole yhteensopiva käytetyn " +"vastaanottimen kanssa." + +#: lib/solaar/ui/pair_window.py:253 +msgid "More paired devices than receiver can support." +msgstr "Enemmän paritettuja laitteita kuin vastaanotin tukee." + +#: lib/solaar/ui/pair_window.py:255 +msgid "No further details are available about the error." +msgstr "Virheestä ei ole saatavilla enempää tietoja." + +#: lib/solaar/ui/rule_actions.py:54 +msgid "" +"Simulate a chorded key click or depress or release.\n" +"On Wayland requires write access to /dev/uinput." +msgstr "" +"Simuloi sointunäppäimen napsautusta, painallusta tai vapautusta.\n" +"Waylandissa vaatii kirjoitusoikeuden laitteeseen /dev/uinput." + +#: lib/solaar/ui/rule_actions.py:60 +msgid "Add key" +msgstr "Lisää näppäin" + +#: lib/solaar/ui/rule_actions.py:63 +msgid "Click" +msgstr "Napsautus" + +#: lib/solaar/ui/rule_actions.py:66 +msgid "Depress" +msgstr "Paina" + +#: lib/solaar/ui/rule_actions.py:69 +msgid "Release" +msgstr "Vapauta" + +#: lib/solaar/ui/rule_actions.py:153 +msgid "" +"Simulate a mouse scroll.\n" +"On Wayland requires write access to /dev/uinput." +msgstr "" +"Simuloi hiiren vieritystä.\n" +"Waylandissa vaatii kirjoitusoikeuden laitteeseen /dev/uinput." + +#: lib/solaar/ui/rule_actions.py:211 +msgid "" +"Simulate a mouse click.\n" +"On Wayland requires write access to /dev/uinput." +msgstr "" +"Simuloi hiiren napsautusta.\n" +"Waylandissa vaatii kirjoitusoikeuden laitteeseen /dev/uinput." + +#: lib/solaar/ui/rule_actions.py:216 +msgid "Button" +msgstr "Painike" + +#: lib/solaar/ui/rule_actions.py:218 +msgid "Action (and Count, if click)" +msgstr "Toiminto (ja määrä, jos napsautus)" + +#: lib/solaar/ui/rule_actions.py:269 +msgid "Execute a command with arguments." +msgstr "Suorita komento argumenteilla." + +#: lib/solaar/ui/rule_actions.py:273 +msgid "Add argument" +msgstr "Lisää argumentti" + +#: lib/solaar/ui/rule_conditions.py:52 +msgid "X11 active process. For use in X11 only." +msgstr "X11 aktiivinen prosessi. Vain X11-käyttöön." + +#: lib/solaar/ui/rule_conditions.py:82 +msgid "X11 mouse process. For use in X11 only." +msgstr "X11 hiiriprosessi. Vain X11-käyttöön." + +#: lib/solaar/ui/rule_conditions.py:99 +msgid "MouseProcess" +msgstr "Hiiriprosessi" + +#: lib/solaar/ui/rule_conditions.py:123 +msgid "Feature name of notification triggering rule processing." +msgstr "Säännönkäsittelyn laukaisevan ilmoituksen ominaisuuden nimi." + +#: lib/solaar/ui/rule_conditions.py:169 +msgid "Report number of notification triggering rule processing." +msgstr "Säännönkäsittelyn laukaisevan ilmoituksen raporttinumero." + +#: lib/solaar/ui/rule_conditions.py:201 +msgid "Active keyboard modifiers. Not always available in Wayland." +msgstr "" +"Aktiiviset näppäimistön muuntajat. Eivät ole aina saatavilla Waylandissa." + +#: lib/solaar/ui/rule_conditions.py:241 +msgid "" +"Diverted key or button depressed or released.\n" +"Use the Key/Button Diversion and Divert G Keys settings to divert keys and buttons." +msgstr "" +"Uudelleenohjattu näppäin tai painike painettu tai vapautettu.\n" +"Käytä näppäimen/painikkeen uudelleenohjaus- ja uudelleenohjaa G-näppäimet -asetuksia ohjataksesi näppäimiä ja painikkeita." + +#: lib/solaar/ui/rule_conditions.py:250 +msgid "Key down" +msgstr "Näppäin painettuna" + +#: lib/solaar/ui/rule_conditions.py:253 +msgid "Key up" +msgstr "Näppäin vapautettuna" + +#: lib/solaar/ui/rule_conditions.py:293 +msgid "" +"Diverted key or button is currently down.\n" +"Use the Key/Button Diversion and Divert G Keys settings to divert keys and buttons." +msgstr "" +"Uudelleenohjattu näppäin tai painike on parhaillaan painettuna.\n" +"Käytä näppäimen/painikkeen uudelleenohjaus- ja uudelleenohjaa G-näppäimet -asetuksia ohjataksesi näppäimiä ja painikkeita." + +#: lib/solaar/ui/rule_conditions.py:331 +msgid "Test condition on notification triggering rule processing." +msgstr "Testaa ehto säännönkäsittelyn laukaisevassa ilmoituksessa." + +#: lib/solaar/ui/rule_conditions.py:335 +msgid "Parameter" +msgstr "Parametri" + +#: lib/solaar/ui/rule_conditions.py:408 +msgid "begin (inclusive)" +msgstr "alku (sisältyy)" + +#: lib/solaar/ui/rule_conditions.py:409 +msgid "end (exclusive)" +msgstr "loppu (ei sisälly)" + +#: lib/solaar/ui/rule_conditions.py:417 +msgid "range" +msgstr "alue" + +#: lib/solaar/ui/rule_conditions.py:420 +msgid "minimum" +msgstr "minimi" + +#: lib/solaar/ui/rule_conditions.py:421 +msgid "maximum" +msgstr "maksimi" + +#: lib/solaar/ui/rule_conditions.py:423 #, python-format -msgid "Press %(code)s\n" - "and then press left and right buttons simultaneously." -msgstr "" +msgid "bytes %(0)d to %(1)d, ranging from %(2)d to %(3)d" +msgstr "tavut %(0)d - %(1)d, väliltä %(2)d - %(3)d" -#: lib/solaar/ui/pair_window.py:188 -msgid "Pairing failed" -msgstr "Paritus epäonnistui." +#: lib/solaar/ui/rule_conditions.py:426 lib/solaar/ui/rule_conditions.py:427 +msgid "mask" +msgstr "maski" -#: lib/solaar/ui/pair_window.py:190 -msgid "Make sure your device is within range, and has a decent battery " - "charge." -msgstr "Varmista, että laitteesi on kantaman sisällä ja siinä on riittävä " - "lataus." - -#: lib/solaar/ui/pair_window.py:192 -msgid "A new device was detected, but it is not compatible with this " - "receiver." -msgstr "Uusi laite tunnistettiin, mutta se ei ole yhteensopiva käytetyn " - "vastaanottimen kanssa." - -#: lib/solaar/ui/pair_window.py:194 -msgid "More paired devices than receiver can support." -msgstr "" - -#: lib/solaar/ui/pair_window.py:196 -msgid "No further details are available about the error." -msgstr "Virheestä ei ole saatavilla enempää tietoja." - -#: lib/solaar/ui/pair_window.py:210 -msgid "Found a new device:" -msgstr "" - -#: lib/solaar/ui/pair_window.py:235 -msgid "The wireless link is not encrypted" -msgstr "Langaton yhteys ei ole salattu" - -#: lib/solaar/ui/pair_window.py:264 -msgid "Unifying receivers are only compatible with Unifying devices." -msgstr "" - -#: lib/solaar/ui/pair_window.py:266 -msgid "Bolt receivers are only compatible with Bolt devices." -msgstr "" - -#: lib/solaar/ui/pair_window.py:268 -msgid "Other receivers are only compatible with a few devices." -msgstr "" - -#: lib/solaar/ui/pair_window.py:270 -msgid "The device must not be paired with a nearby powered-on receiver." -msgstr "" - -#: lib/solaar/ui/pair_window.py:274 -msgid "Press a pairing button or key until the pairing light flashes " - "quickly." -msgstr "" - -#: lib/solaar/ui/pair_window.py:276 -msgid "You may have to first turn the device off and on again." -msgstr "" - -#: lib/solaar/ui/pair_window.py:278 -msgid "Turn on the device you want to pair." -msgstr "Käynnistä laite, jonka haluat parittaa." - -#: lib/solaar/ui/pair_window.py:280 -msgid "If the device is already turned on, turn it off and on again." -msgstr "" - -#: lib/solaar/ui/pair_window.py:283 +#: lib/solaar/ui/rule_conditions.py:428 #, python-format -msgid "\n" - "\n" - "This receiver has %d pairing remaining." -msgid_plural "\n" - "\n" - "This receiver has %d pairings remaining." -msgstr[0] "" -msgstr[1] "" +msgid "bytes %(0)d to %(1)d, mask %(2)d" +msgstr "tavut %(0)d - %(1)d, maski %(2)d" -#: lib/solaar/ui/pair_window.py:286 -msgid "\n" - "Cancelling at this point will not use up a pairing." -msgstr "" +#: lib/solaar/ui/rule_conditions.py:437 +msgid "" +"Bit or range test on bytes in notification message triggering rule " +"processing." +msgstr "" +"Bitti- tai aluetesti tavuille säännönkäsittelyn laukaisevassa " +"ilmoitusviestissä." -#: lib/solaar/ui/tray.py:58 -msgid "No supported device found" -msgstr "" +#: lib/solaar/ui/rule_conditions.py:447 +msgid "type" +msgstr "tyyppi" -#: lib/solaar/ui/tray.py:64 lib/solaar/ui/window.py:319 +#: lib/solaar/ui/rule_conditions.py:535 +msgid "" +"Mouse gesture with optional initiating button followed by zero or more mouse" +" movements." +msgstr "" +"Hiiriele valinnaisella aloituspainikkeella, jota seuraa nolla tai useampi " +"hiiriliike." + +#: lib/solaar/ui/rule_conditions.py:541 +msgid "Add movement" +msgstr "Lisää liike" + +#: lib/solaar/ui/tray.py:55 +msgid "No supported device found" +msgstr "Ei löydetty tuettua laitetta" + +#: lib/solaar/ui/tray.py:60 lib/solaar/ui/window.py:328 #, python-format -msgid "About %s" -msgstr "Tietoja %s" +msgid "About %s" +msgstr "Tietoja %s" -#: lib/solaar/ui/tray.py:65 lib/solaar/ui/window.py:317 +#: lib/solaar/ui/tray.py:61 lib/solaar/ui/window.py:326 #, python-format -msgid "Quit %s" -msgstr "Lopeta %s" +msgid "Quit %s" +msgstr "Lopeta %s" -#: lib/solaar/ui/tray.py:297 lib/solaar/ui/tray.py:305 -msgid "no receiver" -msgstr "ei vastaanotinta" +#: lib/solaar/ui/tray.py:273 lib/solaar/ui/tray.py:281 +msgid "no receiver" +msgstr "ei vastaanotinta" -#: lib/solaar/ui/tray.py:321 -msgid "no status" -msgstr "ei tietoja" +#: lib/solaar/ui/tray.py:294 lib/solaar/ui/tray.py:299 +#: lib/solaar/ui/window.py:728 +msgid "offline" +msgstr "ei yhdistetty" -#: lib/solaar/ui/window.py:96 -msgid "Scanning" -msgstr "Skannataan" +#: lib/solaar/ui/tray.py:297 +msgid "no status" +msgstr "ei tietoja" -#: lib/solaar/ui/window.py:129 -msgid "Battery" -msgstr "Akku" +#: lib/solaar/ui/window.py:110 +msgid "Scanning" +msgstr "Skannataan" -#: lib/solaar/ui/window.py:132 -msgid "Wireless Link" -msgstr "Langaton yhteys" +#: lib/solaar/ui/window.py:141 +msgid "Battery" +msgstr "Akku" -#: lib/solaar/ui/window.py:136 -msgid "Lighting" -msgstr "Valaistus" +#: lib/solaar/ui/window.py:144 +msgid "Wireless Link" +msgstr "Langaton yhteys" -#: lib/solaar/ui/window.py:170 -msgid "Show Technical Details" -msgstr "Näytä tekniset tiedot" +#: lib/solaar/ui/window.py:148 +msgid "Lighting" +msgstr "Valaistus" -#: lib/solaar/ui/window.py:186 -msgid "Pair new device" -msgstr "Parita uusi laite" +#: lib/solaar/ui/window.py:182 +msgid "Show Technical Details" +msgstr "Näytä tekniset tiedot" -#: lib/solaar/ui/window.py:205 -msgid "Select a device" -msgstr "Valitse laite" +#: lib/solaar/ui/window.py:198 +msgid "Pair new device" +msgstr "Parita uusi laite" -#: lib/solaar/ui/window.py:322 -msgid "Rule Editor" -msgstr "" +#: lib/solaar/ui/window.py:216 +msgid "Select a device" +msgstr "Valitse laite" + +#: lib/solaar/ui/window.py:331 +msgid "Rule Editor" +msgstr "Sääntöeditori" + +#: lib/solaar/ui/window.py:522 +msgid "Path" +msgstr "Polku" + +#: lib/solaar/ui/window.py:524 +msgid "USB ID" +msgstr "USB-tunnus" + +#: lib/solaar/ui/window.py:527 lib/solaar/ui/window.py:529 +#: lib/solaar/ui/window.py:544 lib/solaar/ui/window.py:546 +msgid "Serial" +msgstr "Sarjanumero" #: lib/solaar/ui/window.py:533 -msgid "Path" -msgstr "Polku" +msgid "Index" +msgstr "Järjestysnumero" -#: lib/solaar/ui/window.py:536 -msgid "USB ID" -msgstr "" +#: lib/solaar/ui/window.py:535 +msgid "Wireless PID" +msgstr "Langaton PID" -#: lib/solaar/ui/window.py:539 lib/solaar/ui/window.py:541 -#: lib/solaar/ui/window.py:561 lib/solaar/ui/window.py:563 -msgid "Serial" -msgstr "Sarjanumero" +#: lib/solaar/ui/window.py:537 +msgid "Product ID" +msgstr "Tuotteen tunnistekoodi" -#: lib/solaar/ui/window.py:545 -msgid "Index" -msgstr "Järjestysnumero" +#: lib/solaar/ui/window.py:539 +msgid "Protocol" +msgstr "Yhteyskäytäntö" -#: lib/solaar/ui/window.py:547 -msgid "Wireless PID" -msgstr "Langaton PID" +#: lib/solaar/ui/window.py:539 +msgid "Unknown" +msgstr "Tuntematon" -#: lib/solaar/ui/window.py:549 -msgid "Product ID" -msgstr "" +#: lib/solaar/ui/window.py:541 +msgid "Polling rate" +msgstr "Päivitysnopeus" -#: lib/solaar/ui/window.py:551 -msgid "Protocol" -msgstr "Yhteyskäytäntö" +#: lib/solaar/ui/window.py:548 +msgid "Unit ID" +msgstr "Yksikön tunnus" -#: lib/solaar/ui/window.py:551 -msgid "Unknown" -msgstr "Tuntematon" +#: lib/solaar/ui/window.py:559 +msgid "none" +msgstr "ei mitään" -#: lib/solaar/ui/window.py:554 +#: lib/solaar/ui/window.py:560 +msgid "Notifications" +msgstr "Ilmoitukset" + +#: lib/solaar/ui/window.py:604 +msgid "No device paired." +msgstr "Ei paritettua laitetta." + +#: lib/solaar/ui/window.py:613 #, python-format -msgid "%(rate)d ms (%(rate_hz)dHz)" -msgstr "" +msgid "Up to %(max_count)s device can be paired to this receiver." +msgid_plural "Up to %(max_count)s devices can be paired to this receiver." +msgstr[0] "" +"Enintään %(max_count)s laite voidaan parittaa tähän vastaanottimeen." +msgstr[1] "" +"Enintään %(max_count)s laitetta voidaan parittaa tähän vastaanottimeen." -#: lib/solaar/ui/window.py:554 -msgid "Polling rate" -msgstr "Päivitysnopeus" +#: lib/solaar/ui/window.py:620 +msgid "Only one device can be paired to this receiver." +msgstr "Vain yksi laite voidaan parittaa tähän vastaanottimeen." -#: lib/solaar/ui/window.py:565 -msgid "Unit ID" -msgstr "" - -#: lib/solaar/ui/window.py:576 -msgid "none" -msgstr "ei mitään" - -#: lib/solaar/ui/window.py:577 -msgid "Notifications" -msgstr "Ilmoitukset" - -#: lib/solaar/ui/window.py:621 -msgid "No device paired." -msgstr "" - -#: lib/solaar/ui/window.py:628 +#: lib/solaar/ui/window.py:624 #, python-format -msgid "Up to %(max_count)s device can be paired to this receiver." -msgid_plural "Up to %(max_count)s devices can be paired to this receiver." -msgstr[0] "" -msgstr[1] "" +msgid "This receiver has %d pairing remaining." +msgid_plural "This receiver has %d pairings remaining." +msgstr[0] "Tässä vastaanottimessa on %d paritus jäljellä." +msgstr[1] "Tässä vastaanottimessa on %d paritusta jäljellä." -#: lib/solaar/ui/window.py:634 -msgid "Only one device can be paired to this receiver." -msgstr "" +#: lib/solaar/ui/window.py:681 +msgid "Battery Voltage" +msgstr "Akun jännite" -#: lib/solaar/ui/window.py:638 -#, python-format -msgid "This receiver has %d pairing remaining." -msgid_plural "This receiver has %d pairings remaining." -msgstr[0] "" -msgstr[1] "" +#: lib/solaar/ui/window.py:683 +msgid "Voltage reported by battery" +msgstr "Akun ilmoittama jännite" -#: lib/solaar/ui/window.py:692 -msgid "Battery Voltage" -msgstr "" +#: lib/solaar/ui/window.py:685 +msgid "Battery Level" +msgstr "Akun taso" -#: lib/solaar/ui/window.py:694 -msgid "Voltage reported by battery" -msgstr "" +#: lib/solaar/ui/window.py:687 +msgid "Approximate level reported by battery" +msgstr "Akun ilmoittama arvioitu taso" -#: lib/solaar/ui/window.py:696 -msgid "Battery Level" -msgstr "" +#: lib/solaar/ui/window.py:694 lib/solaar/ui/window.py:696 +msgid "next reported " +msgstr "seuraavaksi ilmoitettu " -#: lib/solaar/ui/window.py:698 -msgid "Approximate level reported by battery" -msgstr "" +#: lib/solaar/ui/window.py:697 +msgid " and next level to be reported." +msgstr " ja seuraava ilmoitettava taso." -#: lib/solaar/ui/window.py:705 lib/solaar/ui/window.py:707 -msgid "next reported " -msgstr "" - -#: lib/solaar/ui/window.py:708 -msgid " and next level to be reported." -msgstr "" +#: lib/solaar/ui/window.py:702 +msgid "last known" +msgstr "viimeisin tunnettu" #: lib/solaar/ui/window.py:713 -msgid "last known" -msgstr "viimeisin tunnettu" +msgid "encrypted" +msgstr "salattu" -#: lib/solaar/ui/window.py:724 -msgid "encrypted" -msgstr "salattu" +#: lib/solaar/ui/window.py:715 +msgid "The wireless link between this device and its receiver is encrypted." +msgstr "Langaton yhteys laitteen ja vastaanottimen välillä on salattu." -#: lib/solaar/ui/window.py:726 -msgid "The wireless link between this device and its receiver is encrypted." -msgstr "Langaton yhteys laitteen ja vastaanottimen välillä on salattu." +#: lib/solaar/ui/window.py:717 +msgid "not encrypted" +msgstr "salaamaton" -#: lib/solaar/ui/window.py:728 -msgid "not encrypted" -msgstr "salaamaton" +#: lib/solaar/ui/window.py:721 +msgid "" +"The wireless link between this device and its receiver is not encrypted.\n" +"This is a security issue for pointing devices, and a major security issue for text-input devices." +msgstr "" +"Langaton yhteys tämän laitteen ja sen vastaanottimen välillä ei ole salattu.\n" +"Tämä on tietoturvaongelma osoitinlaitteille ja suuri tietoturvariski tekstinsyöttölaitteille." -#: lib/solaar/ui/window.py:732 -msgid "The wireless link between this device and its receiver is not " - "encrypted.\n" - "This is a security issue for pointing devices, and a major security " - "issue for text-input devices." -msgstr "" - -#: lib/solaar/ui/window.py:748 +#: lib/solaar/ui/window.py:737 #, python-format -msgid "%(light_level)d lux" -msgstr "" +msgid "%(light_level)d lux" +msgstr "%(light_level)d luksia" -#~ msgid " paired devices." -#~ msgstr " paritettua laitetta" +#~ msgid " paired devices." +#~ msgstr " paritettua laitetta" -#~ msgid "1 paired device." -#~ msgstr "Yksi paritettu laite." +#~ msgid "1 paired device." +#~ msgstr "Yksi paritettu laite." #, python-format -#~ msgid "Found a Logitech Receiver (%s), but did not have permission " -#~ "to open it." -#~ msgstr "Logitechin vastaanotin (%s) löydettiin, mutta sitä ei ollut " -#~ "oikeutta avata." +#~ msgid "" +#~ "Found a Logitech Receiver (%s), but did not have permission to open it." +#~ msgstr "" +#~ "Logitechin vastaanotin (%s) löydettiin, mutta sitä ei ollut oikeutta avata." -#~ msgid "Found a new device" -#~ msgstr "Löydetty uusi laite." +#~ msgid "Found a new device" +#~ msgstr "Löydetty uusi laite." -#~ msgid "If the device is already turned on,\n" -#~ "turn if off and on again." -#~ msgstr "Jos laite on jo päällä, sammuta se\n" -#~ "ja kytke virta uudelleen päälle." +#~ msgid "" +#~ "If the device is already turned on,\n" +#~ "turn if off and on again." +#~ msgstr "" +#~ "Jos laite on jo päällä, sammuta se\n" +#~ "ja kytke virta uudelleen päälle." -#~ msgid "If you've just installed Solaar, try removing the receiver " -#~ "and plugging it back in." -#~ msgstr "Jos olet juuri asentanut Solaarin, yritä vastaanottimen " -#~ "irroittamista ja liittämistä uudelleen." +#~ msgid "" +#~ "If you've just installed Solaar, try removing the receiver and plugging it " +#~ "back in." +#~ msgstr "" +#~ "Jos olet juuri asentanut Solaarin, yritä vastaanottimen irroittamista ja " +#~ "liittämistä uudelleen." -#~ msgid "No Logitech receiver found" -#~ msgstr "Ei löydetty Logitechin vastaanottimia." +#~ msgid "No Logitech receiver found" +#~ msgstr "Ei löydetty Logitechin vastaanottimia." -#~ msgid "No device paired" -#~ msgstr "Ei paritettuja laitteita" +#~ msgid "No device paired" +#~ msgstr "Ei paritettuja laitteita" -#~ msgid "Only one device can be paired to this receiver" -#~ msgstr "Vain yksi laite voidaan parittaa tähän vastaanottimeen" +#~ msgid "Only one device can be paired to this receiver" +#~ msgstr "Vain yksi laite voidaan parittaa tähän vastaanottimeen" -#~ msgid "Shows status of devices connected\n" -#~ "through wireless Logitech receivers." -#~ msgstr "Näyttää Logitechin langattoman \n" -#~ "vastaanottimen kautta liitettyjen\n" -#~ "laitteiden tilan." +#~ msgid "" +#~ "Shows status of devices connected\n" +#~ "through wireless Logitech receivers." +#~ msgstr "" +#~ "Näyttää Logitechin langattoman \n" +#~ "vastaanottimen kautta liitettyjen\n" +#~ "laitteiden tilan." -#~ msgid "Smooth Scrolling" -#~ msgstr "Pehmeä vieritys" +#~ msgid "Smooth Scrolling" +#~ msgstr "Sulava vieritys" #, python-format -#~ msgid "The receiver only supports %d paired device(s)." -#~ msgstr "Vastaanotin tukee vain %d liitettyä laitetta." +#~ msgid "The receiver only supports %d paired device(s)." +#~ msgstr "Vastaanotin tukee vain %d liitettyä laitetta." -#~ msgid "The receiver was unplugged." -#~ msgstr "Vastaanotin irroitettiin." +#~ msgid "The receiver was unplugged." +#~ msgstr "Vastaanotin irroitettiin." -#~ msgid "The wireless link between this device and its receiver is " -#~ "not encrypted.\n" -#~ "\n" -#~ "For pointing devices (mice, trackballs, trackpads), this is a minor " -#~ "security issue.\n" -#~ "\n" -#~ "It is, however, a major security issue for text-input devices " -#~ "(keyboards, numpads),\n" -#~ "because typed text can be sniffed inconspicuously by 3rd parties " -#~ "within range." -#~ msgstr "Langaton yhteys laitteen ja vastaanottimen välillä ei ole " -#~ "salattu.\n" -#~ "\n" -#~ "Osoitinlaitteita (hiiret, ohjainpallot, tasohiiret) käytettäessä se " -#~ "on pieni tietoturvallisuusriski.\n" -#~ "\n" -#~ "Kuitenkin, näppäimistöjen kanssa se on suuri tietoturvallisuusriski " -#~ "sillä kolmannet osapuolet\n" -#~ "voivat lukea huomaamattomasti kirjoitetun tekstin yhteyden kantaman " -#~ "sisällä." +#~ msgid "" +#~ "The wireless link between this device and its receiver is not encrypted.\n" +#~ "\n" +#~ "For pointing devices (mice, trackballs, trackpads), this is a minor security issue.\n" +#~ "\n" +#~ "It is, however, a major security issue for text-input devices (keyboards, numpads),\n" +#~ "because typed text can be sniffed inconspicuously by 3rd parties within range." +#~ msgstr "" +#~ "Langaton yhteys laitteen ja vastaanottimen välillä ei ole salattu.\n" +#~ "\n" +#~ "Osoitinlaitteita (hiiret, ohjainpallot, tasohiiret) käytettäessä se on pieni tietoturvallisuusriski.\n" +#~ "\n" +#~ "Kuitenkin, näppäimistöjen kanssa se on suuri tietoturvallisuusriski sillä kolmannet osapuolet\n" +#~ "voivat lukea huomaamattomasti kirjoitetun tekstin yhteyden kantaman sisällä." -#~ msgid "USB id" -#~ msgstr "USB id" +#~ msgid "Turn on the device you want to pair." +#~ msgstr "Käynnistä laite, jonka haluat parittaa." -#~ msgid "Up to %d devices can be paired to this receiver" -#~ msgstr "Korkeintaan %d laitetta voidaan parittaa tähän " -#~ "vastaanottimeen" +#~ msgid "USB id" +#~ msgstr "USB-tunnus" -#~ msgid "closed" -#~ msgstr "suljettu" +#~ msgid "Up to %d devices can be paired to this receiver" +#~ msgstr "Korkeintaan %d laitetta voidaan parittaa tähän vastaanottimeen" -#~ msgid "height" -#~ msgstr "korkeus" +#~ msgid "closed" +#~ msgstr "suljettu" -#~ msgid "lux" -#~ msgstr "luksia" +#~ msgid "height" +#~ msgstr "korkeus" -#~ msgid "open" -#~ msgstr "avoin" +#~ msgid "lux" +#~ msgstr "luksia" -#~ msgid "pair new device" -#~ msgstr "liitä uusi laite" +#~ msgid "open" +#~ msgstr "avoin" -#~ msgid "paired devices" -#~ msgstr "paritettua laitetta" +#~ msgid "pair new device" +#~ msgstr "liitä uusi laite" -#~ msgid "pairing lock is " -#~ msgstr "parituslukko on " +#~ msgid "paired devices" +#~ msgstr "paritettua laitetta" -#~ msgid "unknown" -#~ msgstr "tuntematon" +#~ msgid "pairing lock is " +#~ msgstr "parituslukko on " -#~ msgid "width" -#~ msgstr "leveys" +#~ msgid "unknown" +#~ msgstr "tuntematon" + +#~ msgid "width" +#~ msgstr "leveys" diff --git a/po/solaar.pot b/po/solaar.pot index a9a142d3..6b081ec7 100644 --- a/po/solaar.pot +++ b/po/solaar.pot @@ -7,7 +7,7 @@ msgid "" msgstr "Project-Id-Version: solaar 1.1.19\n" "Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2026-01-08 22:39-0300\n" + "POT-Creation-Date: 2026-03-05 14:00+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1151,7 +1151,7 @@ msgid "Force Sensing Button" msgstr "" #: lib/logitech_receiver/settings_templates.py:1814 -msgid "Haptic Feeback Level" +msgid "Haptic Feedback Level" msgstr "" #: lib/logitech_receiver/settings_templates.py:1815 @@ -1175,19 +1175,19 @@ msgid "Manages Logitech receivers,\n" "keyboards, mice, and tablets." msgstr "" -#: lib/solaar/ui/about/model.py:63 +#: lib/solaar/ui/about/model.py:64 msgid "Additional Programming" msgstr "" -#: lib/solaar/ui/about/model.py:64 +#: lib/solaar/ui/about/model.py:65 msgid "GUI design" msgstr "" -#: lib/solaar/ui/about/model.py:66 +#: lib/solaar/ui/about/model.py:67 msgid "Testing" msgstr "" -#: lib/solaar/ui/about/model.py:74 +#: lib/solaar/ui/about/model.py:75 msgid "Logitech documentation" msgstr "" diff --git a/rules.d/42-logitech-unify-permissions.rules b/rules.d/42-logitech-unify-permissions.rules index 5e5f5d66..52224947 100644 --- a/rules.d/42-logitech-unify-permissions.rules +++ b/rules.d/42-logitech-unify-permissions.rules @@ -3,6 +3,7 @@ # Allows non-root users to have raw access to Logitech devices. # Allowing users to write to the device is potentially dangerous # because they could perform firmware updates. +KERNEL=="uinput", SUBSYSTEM=="misc", TAG+="uaccess", OPTIONS+="static_node=uinput" ACTION == "remove", GOTO="solaar_end" SUBSYSTEM != "hidraw", GOTO="solaar_end" diff --git a/setup.py b/setup.py index 5e0ec196..4f0405e4 100755 --- a/setup.py +++ b/setup.py @@ -89,5 +89,9 @@ setup( packages=find_packages(where="lib"), data_files=list(_data_files()), include_package_data=True, - scripts=glob("bin/*"), + entry_points={ + "console_scripts": [ + "solaar = solaar.gtk:main", + ], + }, ) diff --git a/tools/install-rhel.sh b/tools/install-rhel.sh new file mode 100755 index 00000000..65798f82 --- /dev/null +++ b/tools/install-rhel.sh @@ -0,0 +1,164 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_NAME="$(basename "$0")" +LOG_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/solaar" +LOG_FILE="$LOG_DIR/rhel-install-$(date +%Y%m%d-%H%M%S).log" + +mkdir -p "$LOG_DIR" +exec > >(tee -a "$LOG_FILE") 2>&1 + +say() { + printf '\n[%s] %s\n' "$SCRIPT_NAME" "$*" +} + +warn() { + printf '\n[%s] WARNING: %s\n' "$SCRIPT_NAME" "$*" +} + +fail() { + printf '\n[%s] ERROR: %s\n' "$SCRIPT_NAME" "$*" + exit 1 +} + +ask_yes_no() { + local prompt="$1" + local default="${2:-y}" + local answer + + while true; do + if [[ "$default" == "y" ]]; then + read -r -p "$prompt [Y/n]: " answer || true + answer="${answer:-y}" + else + read -r -p "$prompt [y/N]: " answer || true + answer="${answer:-n}" + fi + + case "${answer,,}" in + y|yes) return 0 ;; + n|no) return 1 ;; + *) echo "Please answer y or n." ;; + esac + done +} + +ask_value() { + local prompt="$1" + local default="$2" + local answer + + read -r -p "$prompt [$default]: " answer || true + printf '%s\n' "${answer:-$default}" +} + +run_cmd() { + say "Running: $*" + "$@" +} + +run_sudo() { + say "Running with sudo: $*" + sudo "$@" +} + +if [[ "${EUID}" -eq 0 ]]; then + fail "Do not run as root. Run as your normal user; this script uses sudo when needed." +fi + +say "Log file: $LOG_FILE" +say "This installer follows RHEL.md for RHEL 10-like systems." + +if ask_yes_no "Update dnf metadata first?" y; then + run_sudo dnf makecache +fi + +if ask_yes_no "Check for Logitech USB receiver with lsusb now?" y; then + if lsusb | grep -i logitech; then + say "Logitech device detected." + else + warn "No Logitech USB receiver detected via lsusb right now. You can continue anyway." + ask_yes_no "Continue without receiver detection?" y || fail "Aborted by user." + fi +fi + +BASE_PACKAGES=(python3 python3-pip git libinput evemu) +DEV_PACKAGES=(python3-devel gcc pkgconf-pkg-config gtk3 python3-gobject) + +say "Base packages: ${BASE_PACKAGES[*]}" +say "Build/runtime packages: ${DEV_PACKAGES[*]}" + +if ask_yes_no "Install required packages with dnf?" y; then + run_sudo dnf install -y "${BASE_PACKAGES[@]}" "${DEV_PACKAGES[@]}" +fi + +REPO_PARENT_DEFAULT="$HOME/dev-repos" +REPO_PARENT="$(ask_value "Repository parent directory" "$REPO_PARENT_DEFAULT")" +REPO_URL_DEFAULT="https://github.com/pwr-Solaar/Solaar.git" +REPO_URL="$(ask_value "Git URL for Solaar" "$REPO_URL_DEFAULT")" +REPO_DIR_DEFAULT="$REPO_PARENT/Solaar" +REPO_DIR="$(ask_value "Local checkout directory" "$REPO_DIR_DEFAULT")" + +run_cmd mkdir -p "$REPO_PARENT" + +if [[ -d "$REPO_DIR/.git" ]]; then + say "Existing git checkout found at $REPO_DIR" + if ask_yes_no "Pull latest changes in this repository?" y; then + run_cmd git -C "$REPO_DIR" pull --ff-only + fi +else + run_cmd git clone "$REPO_URL" "$REPO_DIR" +fi + +say "Installing Solaar into user site-packages" +if ask_yes_no "Use upgrade mode for pip install?" n; then + run_cmd python3 -m pip install --user --upgrade "$REPO_DIR" +else + run_cmd python3 -m pip install --user "$REPO_DIR" +fi + +SOLAAR_BIN="$HOME/.local/bin/solaar" +if [[ ! -x "$SOLAAR_BIN" ]]; then + fail "Expected executable not found: $SOLAAR_BIN" +fi + +say "Installed binary: $SOLAAR_BIN" +run_cmd "$SOLAAR_BIN" --help >/dev/null + +if ask_yes_no "Add alias 'solaar=$SOLAAR_BIN' to ~/.bashrc if missing?" y; then + if grep -Fqx "alias solaar=\"$SOLAAR_BIN\"" "$HOME/.bashrc" 2>/dev/null; then + say "Alias already exists in ~/.bashrc" + else + printf '\n# Solaar user-local install\nalias solaar="%s"\n' "$SOLAAR_BIN" >> "$HOME/.bashrc" + say "Alias appended to ~/.bashrc" + fi +fi + +if ask_yes_no "Run 'solaar show' now for validation?" y; then + run_cmd "$SOLAAR_BIN" show || warn "'solaar show' returned a non-zero status." +fi + +if ask_yes_no "Run 'solaar config ' now?" n; then + DEVICE_NAME_DEFAULT="M720 Triathlon Multi-Device Mouse" + DEVICE_NAME="$(ask_value "Device name" "$DEVICE_NAME_DEFAULT")" + run_cmd "$SOLAAR_BIN" config "$DEVICE_NAME" || warn "'solaar config' returned a non-zero status." +fi + +if ask_yes_no "Run libinput debug-events for a specific /dev/input/eventX device?" n; then + EVENT_NODE="$(ask_value "Input event node" "/dev/input/eventX")" + warn "This is a live monitor and may run until interrupted (Ctrl+C)." + run_sudo libinput debug-events --device "$EVENT_NODE" +fi + +if ask_yes_no "Run keyd monitor (/usr/local/bin/keyd) if present?" n; then + if [[ -x /usr/local/bin/keyd ]]; then + warn "This is a live monitor and may run until interrupted (Ctrl+C)." + run_sudo /usr/local/bin/keyd monitor + else + warn "/usr/local/bin/keyd not found; skipping." + fi +fi + +say "Install workflow completed." +say "To use alias in current shell: source ~/.bashrc" +say "Evidence log saved at: $LOG_FILE"