diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index c91330520..323854695 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -9,8 +9,8 @@ assignees: '' **Information** - - + + - Solaar version (`solaar --version` or `git describe --tags` if cloned from this repository): - Distribution: - Kernel version (ex. `uname -srmo`): `KERNEL VERSION HERE` diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 2a2421bda..6d0d3e129 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -8,7 +8,7 @@ assignees: '' --- **Information** - + - Solaar version (`solaar --version` and `git describe --tags`): - Distribution: - Kernel version (ex. `uname -srmo`): diff --git a/ChangeLog.md b/ChangeLog.md index f8b0fa8ce..0ff1651aa 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,31 @@ +# 1.1.10 + +* Add information about NixOS flake package +* Permit bluetooth devices in hidconsole +* Add descriptor for Logitech MX Revolution Mouse M-RCL 124 +* Improve determination for short and long messages +* Add descriptor for G500s +* Fix bug in scan-registers +* Add single depress and release options for rule mouse click action +* Add rule condition for hostname +* Update keysym generation to current list of keysyms +* Allow device 0 in hidconsole +* Upgrade messages when no supported device found +* Documentation update for the gnome extension for better Solaar rule support +* Remove udev-acl tag from udev rules +* Add support for process condition in Wayland +* Update French, Chinese, and German translations +* Add G733 Headset +* Restore tools/clean.sh +* Add Bluetooth Keyboard C714 +* Update several device descriptions +* Update scan-registers.sh +* Remove assertion on last byte of ping responses +* Add symbolic version of solaar icon +* Fix bug when finding name or codename +* Update documentation +* Put version in initial INFO logging message + # 1.1.9 * Add descriptors for G535 wireless gaming headset and wireless keyboard EX110 diff --git a/Release_Notes.md b/Release_Notes.md index cf80befbc..0acabcb02 100644 --- a/Release_Notes.md +++ b/Release_Notes.md @@ -1,5 +1,11 @@ # Notes on Major Changes in Releases +## Version 1.1.10 + +* The mouse click rule action can now just simulate depressing or releasing the button. + +* There is a new rule condition to check the hostname. + ## Version 1.1.9 * Solaar now exits with at 0 exit code when killed. diff --git a/docs/capabilities.md b/docs/capabilities.md index 9cdc108ab..8c0436d4e 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -140,7 +140,6 @@ change the speed of some thumb wheels. These notifications are only sent for actions that are set in Solaar to their HID++ setting (also known as diverted). For more information on this capability of Solaar see [the rules page](https://pwr-solaar.github.io/Solaar/rules). -Some features of rules do not work under Wayland. Users can edit rules using a GUI by clicking on the `Rule Editor` button in the Solaar main window. diff --git a/docs/devices.md b/docs/devices.md index 19cb3a51a..a10c81a70 100644 --- a/docs/devices.md +++ b/docs/devices.md @@ -136,6 +136,9 @@ giving their product name, WPID product number, and HID++ protocol information. The tables concentrate on older devices that have explicit support information in Solaar and are not being updated for new devices that are supported by Solaar. +Note that Logitech has the annoying habit of reusing Device names (e.g., M185) +so what is important for support is the USB WPID or Bluetooth model ID. + ### Keyboards (Unifying) | Device | WPID | HID++ | @@ -202,6 +205,7 @@ and are not being updated for new devices that are supported by Solaar. | MX Master | 4041 | 2.0 | | MX Master 2S | 4069 | 2.0 | | Cube | | 2.0 | +| MX Vertical | 407B | 2.0 | ### Mice (Nano) diff --git a/docs/devices/G502 Proteus Spectrum Optical Mouse C332.txt b/docs/devices/G502 Proteus Spectrum Optical Mouse C332.txt new file mode 100644 index 000000000..c2b303106 --- /dev/null +++ b/docs/devices/G502 Proteus Spectrum Optical Mouse C332.txt @@ -0,0 +1,49 @@ +solaar version 1.1.9 + +2: G502 Proteus Spectrum Optical Mouse +Device path : /dev/hidraw4 +USB id : 046d:C332 +Codename : G502 Proteus Spectrum +Kind : mouse +Protocol : HID++ 4.2 +Polling rate : 1 ms (1000Hz) +Serial number: +Model ID: C33200000000 +Unit ID: 31374706 +Firmware: U1 03.02.B0012 +Bootloader: BOT 14.00.B0007 +Supports 20 HID++ 2.0 features: +0: ROOT {0000} V0 +1: FEATURE SET {0001} V0 +2: COLOR LED EFFECTS {8070} V3 +3: DEVICE FW VERSION {0003} V1 +Firmware: Firmware U1 03.02.B0012 C332 +Firmware: Bootloader BOT 14.00.B0007 AABF +Unit ID: 31374706 Model ID: C33200000000 Transport IDs: {'usbid': 'C332'} +4: DEVICE NAME {0005} V0 +Name: Tunable RGB Gaming Mouse G502 +Kind: mouse +5: LED CONTROL {1300} V0 +6: unknown:18A1 {18A1} V0 internal, hidden +7: unknown:1E00 {1E00} V0 hidden +8: unknown:1E20 {1E20} V0 +9: unknown:1EB0 {1EB0} V0 internal, hidden +10: ADJUSTABLE DPI {2201} V1 +Sensitivity (DPI) (saved): 7000 +Sensitivity (DPI) : 7000 +11: ANGLE SNAPPING {2230} V0 +12: SURFACE TUNING {2240} V0 +13: REPORT RATE {8060} V0 +Polling Rate (ms): 1 +Polling Rate (ms) (saved): 1 +Polling Rate (ms) : 1 +14: ONBOARD PROFILES {8100} V0 +Device Mode: On-Board +Onboard Profiles (saved): Enable +Onboard Profiles : Enable +15: MOUSE BUTTON SPY {8110} V0 +16: unknown:1850 {1850} V0 internal, hidden +17: DFUCONTROL UNSIGNED {00C1} V0 +18: unknown:1801 {1801} V0 internal, hidden +19: DEVICE RESET {1802} V0 internal, hidden +Battery status unavailable. diff --git a/docs/devices/G502 SE Hero Gaming Mouse C08B.txt b/docs/devices/G502 SE Hero Gaming Mouse C08B.txt new file mode 100644 index 000000000..37358b528 --- /dev/null +++ b/docs/devices/G502 SE Hero Gaming Mouse C08B.txt @@ -0,0 +1,44 @@ +1: G502 SE Hero Gaming Mouse + Device path : /dev/hidraw7 + USB id : 046d:C08B + Codename : G502 Hero + Kind : mouse + Protocol : HID++ 4.2 + Polling rate : 1 ms (1000Hz) + Serial number: + Model ID: C08B00000000 + Unit ID: 30324703 + Firmware: U1 27.03.B0010 + Bootloader: BOT 81.00.B0002 + Supports 19 HID++ 2.0 features: + 0: ROOT {0000} + 1: FEATURE SET {0001} + 2: COLOR LED EFFECTS {8070} + 3: DEVICE FW VERSION {0003} + Firmware: Firmware U1 27.03.B0010 C08B + Firmware: Bootloader BOT 81.00.B0002 AAE6 + Unit ID: 30324703 Model ID: C08B00000000 Transport IDs: {'usbid': 'C08B'} + 4: DEVICE NAME {0005} + Name: G502 HERO Gaming Mouse + Kind: mouse + 5: LED CONTROL {1300} + 6: unknown:18A1 {18A1} internal, hidden + 7: unknown:1E00 {1E00} hidden + 8: unknown:1E22 {1E22} internal, hidden + 9: unknown:1EB0 {1EB0} internal, hidden + 10: ADJUSTABLE DPI {2201} + Sensitivity (DPI) (saved): 2400 + Sensitivity (DPI) : 2400 + 11: REPORT RATE {8060} + Polling Rate (ms): 1 + Polling Rate (ms) (saved): 1 + Polling Rate (ms) : 1 + 12: ONBOARD PROFILES {8100} + Device Mode: Host + 13: MOUSE BUTTON SPY {8110} + 14: DFUCONTROL SIGNED {00C2} + 15: unknown:1801 {1801} internal, hidden + 16: DEVICE RESET {1802} internal, hidden + 17: CONFIG DEVICE PROPS {1806} internal, hidden + 18: unknown:18B1 {18B1} internal, hidden + Battery status unavailable. diff --git a/docs/devices/G815 Mechanical Keyboard C33F.txt b/docs/devices/G815 Mechanical Keyboard C33F.txt new file mode 100644 index 000000000..9994cbb43 --- /dev/null +++ b/docs/devices/G815 Mechanical Keyboard C33F.txt @@ -0,0 +1,63 @@ +solaar version 1.1.9 + +1: G815 Mechanical Keyboard +Device path : /dev/hidraw2 +USB id : 046d:C33F +Codename : G815 +Kind : keyboard +Protocol : HID++ 4.2 +Polling rate : 1 ms (1000Hz) +Serial number: +Model ID: C33F00000000 +Unit ID: 35304716 +Bootloader: BOT 84.00.B0003 +Firmware: U1 31.02.B0018 +Other: +Other: +Other: +Supports 24 HID++ 2.0 features: +0: ROOT {0000} V0 +1: FEATURE SET {0001} V0 +2: DEVICE FW VERSION {0003} V2 +Firmware: Bootloader BOT 84.00.B0003 AAEA +Firmware: Firmware U1 31.02.B0018 C33F +Firmware: Other +Firmware: Other +Firmware: Other +Unit ID: 35304716 Model ID: C33F00000000 Transport IDs: {'usbid': 'C33F'} +3: DEVICE NAME {0005} V0 +Name: G815 RGB MECHANICAL GAMING KEYBOARD +Kind: keyboard +4: CONFIG CHANGE {0020} V0 +5: DFUCONTROL SIGNED {00C2} V0 +6: DFU {00D0} V0 +7: REPORT HID USAGE {1BC0} V0 +8: KEYBOARD DISABLE BY USAGE {4522} V0 +9: KEYBOARD LAYOUT 2 {4540} V0 +10: GKEY {8010} V0 +Divert G Keys (saved): True +Divert G Keys : False +11: MKEYS {8020} V0 +M-Key LEDs (saved): {M1:False, M2:False, M3:False} +M-Key LEDs : {M1:False, M2:False, M3:False} +12: MR {8030} V0 +MR-Key LED (saved): False +MR-Key LED : False +13: BRIGHTNESS CONTROL {8040} V0 +14: REPORT RATE {8060} V0 +Polling Rate (ms): 1 +Polling Rate (ms) (saved): 1 +Polling Rate (ms) : 1 +15: RGB EFFECTS {8071} V0 +16: PER KEY LIGHTING V2 {8081} V2 +17: ONBOARD PROFILES {8100} V0 +Device Mode: Host +Onboard Profiles (saved): Disable +Onboard Profiles : Disable +18: unknown:1801 {1801} V0 internal, hidden +19: DEVICE RESET {1802} V0 internal, hidden +20: CONFIG DEVICE PROPS {1806} V5 internal, hidden +21: unknown:18B0 {18B0} V0 internal, hidden +22: unknown:1E00 {1E00} V0 hidden +23: unknown:1EB0 {1EB0} V0 internal, hidden +Battery status unavailable. diff --git a/docs/index.md b/docs/index.md index 7b4fb0730..999d0e126 100644 --- a/docs/index.md +++ b/docs/index.md @@ -84,7 +84,7 @@ and pair and unpair a Logitech device showing the Bolt logo with any Bolt receiver, and can pair and unpair Lightspeed devices with Lightspeed receivers for the same model. -Solaar can pair some Logitech devices with Logitech Nano receivers but not all Logitech +Solaar can pair some Logitech devices with Logitech Nano receivers, but not all Logitech devices can be paired with Nano receivers. Logitech devices without a Unifying or Bolt logo generally cannot be paired with Unifying or Bolt receivers. @@ -102,12 +102,13 @@ and their features, see [the devices page](https://pwr-solaar.github.io/Solaar/d Up-to-date prebuilt packages are available for some Linux distros (e.g., Fedora 33+) in their standard repositories. If a recent version of Solaar is not -available from the standard repositories for your distribution you can try +available from the standard repositories for your distribution, you can try one of these packages. -- Arch solaar package in the [community repository][arch] +- Arch solaar package in the [extra repository][arch] - Ubuntu/Kubuntu stable packages: use the [Solaar stable ppa][ppa2], courtesy of [gogo][ppa4] - Ubuntu/Kubuntu git build packages: use the [Solaar git ppa][ppa1], courtesy of [gogo][ppa4] +- NixOS Flake: see [Svenum/Solaar-Flake][nix flake] Solaar is available from some other repositories but they are several versions behind the current version. @@ -122,10 +123,11 @@ Solaar uses a standard system tray implementation; solaar-gnome3 is no longer re [ppa2]: https://launchpad.net/~solaar-unifying/+archive/ubuntu/stable [ppa1]: https://launchpad.net/~solaar-unifying/+archive/ubuntu/ppa [ppa]: http://launchpad.net/~daniel.pavel/+archive/solaar -[arch]: https://www.archlinux.org/packages/community/any/solaar/ +[arch]: https://www.archlinux.org/packages/extra/any/solaar/ [gentoo]: https://packages.gentoo.org/packages/app-misc/solaar [mageia]: http://mageia.madb.org/package/show/release/cauldron/application/0/name/solaar [universe repository]: http://packages.ubuntu.com/search?keywords=solaar&searchon=names&suite=all§ion=all +[nix flake]: https://github.com/Svenum/Solaar-Flake ## Manual installation @@ -139,7 +141,7 @@ for the step-by-step procedure for manual installation. will likely result in unexpected device behavior. - The Linux HID++ driver modifies the Scroll Wheel Resolution setting to - implement smooth scrolling. If Solaar later changes this setting scrolling + implement smooth scrolling. If Solaar later changes this setting, scrolling can be either very fast or very slow. To fix this problem click on the icon at the right edge of the setting to set it to "Ignore this setting", which is the default for new devices. @@ -150,16 +152,16 @@ for the step-by-step procedure for manual installation. to restore reversed scrolling. - The driver sends messages to devices that do not conform with the Logitech HID++ specification - resulting in reponses being sent back that look like other messages. For some devices this causes + resulting in responses being sent back that look like other messages. For some devices this causes Solaar to report incorrect battery levels. -- If the Python hid-parser package is not available Solaar will not recognize some devices. +- If the Python hid-parser package is not available, Solaar will not recognize some devices. Use pip to install hid-parser. -- Solaar normally uses icon names for its icons, which in some system tray implementatations +- Solaar normally uses icon names for its icons, which in some system tray implementations results in missing or wrong-sized icons. The `--tray-icon-size` option forces Solaar to use icon files of appropriate size - for tray icons instead, which produces better results in some system tray implementatations. + for tray icons instead, which produces better results in some system tray implementations. To use icon files close to 32 pixels in size use `--tray-icon-size=32`. - The icon in the system tray can show up as 'black on black' in dark @@ -169,17 +171,17 @@ for the step-by-step procedure for manual installation. - Many gaming mice and keyboards have the ONBOARD PROFILES feature. This feature can override other features, including polling rate and key lighting. - To make the Polling Rate and M-Key LEDs settings effective the Onboard Profiles setting has to be disabled. + To make the Polling Rate and M-Key LEDs settings effective, the Onboard Profiles setting has to be disabled. This may have other effects, such as turning off backlighting. - Solaar will try to use uinput to simulate input from rules under Wayland or if Xtest is not available but this needs write permission on /dev/uinput. For more information see [the rules page](https://pwr-solaar.github.io/Solaar/rules). -- Diverted keys remain diverted and so do not have their normal behaviour when Solaar terminates - or a device disconnects from a host that is running Solaar. If necessary, their normal behaviour +- Diverted keys remain diverted and so do not have their normal behavior when Solaar terminates + or a device disconnects from a host that is running Solaar. If necessary, their normal behavior can be reestablished by turning the device off and on again. This is most important to restore - the host switching behaviour of a host switch key that was diverted, for example to switch away + the host switching behavior of a host switch key that was diverted, for example to switch away from a host that crashed or was turned off. - When a receiver-connected device changes hosts Solaar remembers which diverted keys were down on it. @@ -189,7 +191,7 @@ for the step-by-step procedure for manual installation. ## Contributing to Solaar -Conributions to Solaaar are very welcome. +Contributions to Solaar are very welcome. Solaar has complete or partial translations of its GUI strings in several languages. If you want to update a translation or add a new one see [the translation page](https://pwr-solaar.github.io/Solaar/i18n) for more information. diff --git a/docs/installation.md b/docs/installation.md index 3f2014c47..569822d66 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -7,7 +7,8 @@ layout: page An easy way to install the most recent release version of Solaar is from the PyPI repository. First install pip, and then run -`pip install --user 'solaar[report-descriptor,git-commit]'`. +`pip install --user solaar`. +If you are using pipx add the `--system-site-packages` flag. This will not install the Solaar udev rule, which you will need to install manually by copying `~/.local/share/solaar/udev-rules.d/42-logitech-unify-permissions.rules` @@ -47,7 +48,7 @@ The `udev` package must be installed and its daemon running. Solaar requires Python 3.7+ and requires several packages to be installed. If you are running the system version of Python you should have the -`python3-pyudev`, `python3-psutil`, `python3-xlib`, `python3-evdev`, `python3-typing-extensions`, +`python3-pyudev`, `python3-psutil`, `python3-xlib`, `python3-evdev`, `python3-typing-extensions`, `dbus-python`, and `python3-yaml` or `python3-pyyaml` packages installed. To run the GUI Solaar also requires Gtk3 and its GObject introspection bindings. @@ -57,6 +58,7 @@ in Debian/Ubuntu you should have the In Fedora you need `gtk3` and `python3-gobject`. You may have to install `gcc` and the Python development package (`python3-dev` or `python3-devel`, depending on your distribution). +Other system packages may be required depending on your distribution, such as `python-gobject-common-devel`. Although the Solaar CLI does not require Gtk3, `solaar config` does use Gtk3 capabilities to determine whether the Solaar GUI is running and thus should tell the Solaar GUI to update its information about settings @@ -148,6 +150,19 @@ If you want to have Solaar's user messages in some other language you need to ru `tools/po-compile.sh` to create the translation files before running or installing Solaar and set the LANGUAGE environment variable appropriately when running Solaar. +# Setting up Solaar's icons + +Solaar uses a number of custom icons, which have to be installed in a place where GTK can access them. + +If Solaar has never been installed, and only run from the download directory then Solaar will not be able to find the icons. +If Solaar has only been installed for a user (e.g., via pip) then Solaar will be able to find the icons, +but they may not show up in the system tray. + +One solution is to install a version of Solaar on a system-wide basis. +A more-recent version of Solaar can then be installed for a user or Solaar can be run out of the download directory. +Another solution is to copy the Solaar custom icons from share/solaar/icons to a place they can be found by GTK, +likely /usr/share/icons/hicolor/scalable/apps. + # Running Solaar at Startup Distributions can cause Solaar can be run automatically at user login by installing a desktop file at diff --git a/docs/rules.md b/docs/rules.md index 9b92884d9..014399209 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -11,7 +11,9 @@ Rule processing is an experimental feature. Significant changes might be made i Note that rule processing only fully works under X11. When running under Wayland with X11 libraries loaded some features will not be available. When running under Wayland without X11 libraries loaded even more features will not be available. -Rule features known not to work under Wayland include process and mouse process conditions. +Rule features known not to work under Wayland include process and mouse process conditions, +although on GNOME desktop under Wayland, you can use those with the Solaar Gnome extension installed, +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. @@ -114,8 +116,11 @@ or the window's Window manager class or instance name starts with their string a `Device` conditions are true if a particular device originated the notification. `Active` conditions are true if a particular device is active. -`Device` and `Active` conditions take one argument, which is the Serial number or Unit ID of a device, +`Device` and `Active` conditions take one argument, which is the serial number or unit ID of a device, as shown in Solaar's detail pane. +Some older devices do not have a useful serial number or unit ID and so cannot be tested for by these conditions. + +`Host' conditions are true if the computers hostname starts with the condition's argument. `Setting` conditions check the value of a Solaar setting on a device. `Setting` conditions take three or four arguments, depending on the setting: @@ -212,6 +217,8 @@ to go wrong under Wayland than under X11. A `MouseScroll` action takes a sequence of two numbers and simulates a horizontal and vertical mouse scroll of these amounts. If the previous condition in the parent rule returns a number the scroll amounts are multiplied by this number. +A `MouseClick` action takes a mouse button name (`left`, `middle` or `right`) and a positive number or 'click', 'depress', or 'release'. +The action simulates that number of clicks of the specified button or just one click, depress, or release of the button. A `MouseClick` action takes a mouse button name (`left`, `middle` or `right`) and a positive number, and simulates that number of clicks of the specified button. An `Execute` action takes a program and arguments and executes it asynchronously. diff --git a/lib/hidapi/hidconsole.py b/lib/hidapi/hidconsole.py index aaa96e8ab..bc7bf4c04 100644 --- a/lib/hidapi/hidconsole.py +++ b/lib/hidapi/hidconsole.py @@ -114,8 +114,8 @@ def _validate_input(line, hidpp=False): if data[:1] not in b'\x10\x11': _error('Invalid HID++ request: first byte must be 0x10 or 0x11') return None - if data[1:2] not in b'\xFF\x01\x02\x03\x04\x05\x06': - _error('Invalid HID++ request: second byte must be 0xFF or one of 0x01..0x06') + if data[1:2] not in b'\xFF\x00\x01\x02\x03\x04\x05\x06\x07': + _error('Invalid HID++ request: second byte must be 0xFF or one of 0x00..0x07') return None if data[:1] == b'\x10': if len(data) > 7: @@ -135,7 +135,7 @@ def _validate_input(line, hidpp=False): def _open(args): - def matchfn(bid, vid, pid): + def matchfn(bid, vid, pid, _a, _b): if vid == 0x046d: return {'vid': 0x046d} @@ -154,13 +154,12 @@ def matchfn(bid, vid, pid): handle = _hid.open_path(device) if not handle: sys.exit('!! Failed to open %s, aborting.' % device) - print( '.. Opened handle %r, vendor %r product %r serial %r.' % (handle, _hid.get_manufacturer(handle), _hid.get_product(handle), _hid.get_serial(handle)) ) if args.hidpp: - if _hid.get_manufacturer(handle) != b'Logitech': + if _hid.get_manufacturer(handle) is not None and _hid.get_manufacturer(handle) != b'Logitech': sys.exit('!! Only Logitech devices support the HID++ protocol.') print('.. HID++ validation enabled.') else: diff --git a/lib/hidapi/udev.py b/lib/hidapi/udev.py index afb69ac60..d94de66c3 100644 --- a/lib/hidapi/udev.py +++ b/lib/hidapi/udev.py @@ -322,7 +322,19 @@ def open_path(device_path): """ assert device_path assert device_path.startswith('/dev/hidraw') - return _os.open(device_path, _os.O_RDWR | _os.O_SYNC) + + _log.info('OPEN PATH %s', device_path) + retrycount = 0 + while (retrycount < 3): + retrycount += 1 + try: + return _os.open(device_path, _os.O_RDWR | _os.O_SYNC) + except OSError as e: + _log.info('OPEN PATH FAILED %s ERROR %s %s', device_path, e.errno, e) + if e.errno == _errno.EACCES: + sleep(0.1) + else: + raise def close(device_handle): diff --git a/lib/keysyms/generate.py b/lib/keysyms/generate.py index 757587bcb..5ad68298f 100755 --- a/lib/keysyms/generate.py +++ b/lib/keysyms/generate.py @@ -6,6 +6,8 @@ from tempfile import TemporaryDirectory repo = 'https://github.com/freedesktop/xorg-proto-x11proto.git' +xx = 'https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/tree/master/include/X11/' +repo = 'https://gitlab.freedesktop.org/xorg/proto/xorgproto.git' pattern = r'#define XK_(\w+)\s+0x(\w+)(?:\s+/\*\s+U\+(\w+))?' xf86pattern = r'#define XF86XK_(\w+)\s+0x(\w+)(?:\s+/\*\s+U\+(\w+))?' @@ -15,14 +17,16 @@ def main(): with TemporaryDirectory() as temp: run(['git', 'clone', repo, '.'], cwd=temp) - text = Path(temp, 'keysymdef.h').read_text() + # text = Path(temp, 'keysymdef.h').read_text() + text = Path(temp, 'include/X11/keysymdef.h').read_text() for name, sym, uni in findall(pattern, text): sym = int(sym, 16) uni = int(uni, 16) if uni else None if keysymdef.get(name, None): print('KEY DUP', name) keysymdef[name] = sym - text = Path(temp, 'XF86keysym.h').read_text() + # text = Path(temp, 'keysymdef.h').read_text() + text = Path(temp, 'include/X11/XF86keysym.h').read_text() for name, sym, uni in findall(xf86pattern, text): sym = int(sym, 16) uni = int(uni, 16) if uni else None diff --git a/lib/keysyms/keysymdef.py b/lib/keysyms/keysymdef.py index 89a1471b6..c3ff1771f 100644 --- a/lib/keysyms/keysymdef.py +++ b/lib/keysyms/keysymdef.py @@ -1,5 +1,4 @@ -# flake8: noqa E122 -# flake8: noqa E127 +# flake8: noqa keysymdef = \ {'0': 48, '1': 49, @@ -1198,6 +1197,7 @@ 'XF86_AudioNext': 269025047, 'XF86_AudioPause': 269025073, 'XF86_AudioPlay': 269025044, + 'XF86_AudioPreset': 269025206, 'XF86_AudioPrev': 269025046, 'XF86_AudioRaiseVolume': 269025043, 'XF86_AudioRandomPlay': 269025177, @@ -1236,6 +1236,7 @@ 'XF86_Forward': 269025063, 'XF86_FrameBack': 269025181, 'XF86_FrameForward': 269025182, + 'XF86_FullScreen': 269025208, 'XF86_Game': 269025118, 'XF86_Go': 269025119, 'XF86_Green': 269025188, @@ -1246,6 +1247,7 @@ 'XF86_KbdBrightnessDown': 269025030, 'XF86_KbdBrightnessUp': 269025029, 'XF86_KbdLightOnOff': 269025028, + 'XF86_Keyboard': 269025203, 'XF86_Launch0': 269025088, 'XF86_Launch1': 269025089, 'XF86_Launch2': 269025090, @@ -1266,6 +1268,7 @@ 'XF86_LogGrabInfo': 269024805, 'XF86_LogOff': 269025121, 'XF86_LogWindowTree': 269024804, + 'XF86_MacroRecordStart': 268964528, 'XF86_Mail': 269025049, 'XF86_MailForward': 269025168, 'XF86_Market': 269025122, @@ -1275,6 +1278,7 @@ 'XF86_MenuPB': 269025126, 'XF86_Messenger': 269025166, 'XF86_ModeLock': 269025025, + 'XF86_MonBrightnessCycle': 269025031, 'XF86_MonBrightnessDown': 269025027, 'XF86_MonBrightnessUp': 269025026, 'XF86_Music': 269025170, @@ -1294,6 +1298,7 @@ 'XF86_PowerOff': 269025066, 'XF86_Prev_VMode': 269024803, 'XF86_Q': 269025136, + 'XF86_RFKill': 269025205, 'XF86_Red': 269025187, 'XF86_Refresh': 269025065, 'XF86_Reload': 269025139, @@ -1303,6 +1308,7 @@ 'XF86_RockerUp': 269025059, 'XF86_RotateWindows': 269025140, 'XF86_RotationKB': 269025142, + 'XF86_RotationLockToggle': 269025207, 'XF86_RotationPB': 269025141, 'XF86_Save': 269025143, 'XF86_ScreenSaver': 269025069, @@ -1353,6 +1359,7 @@ 'XF86_Video': 269025159, 'XF86_View': 269025185, 'XF86_WLAN': 269025173, + 'XF86_WWAN': 269025204, 'XF86_WWW': 269025070, 'XF86_WakeUp': 269025067, 'XF86_WebCam': 269025167, @@ -1719,6 +1726,11 @@ 'circle': 3023, 'club': 2796, 'colon': 58, + 'combining_acute': 16777985, + 'combining_belowdot': 16778019, + 'combining_grave': 16777984, + 'combining_hook': 16777993, + 'combining_tilde': 16777987, 'comma': 44, 'containsas': 16785931, 'copyright': 169, @@ -1735,13 +1747,13 @@ 'dead_E': 65155, 'dead_I': 65157, 'dead_O': 65159, + 'dead_SCHWA': 65163, 'dead_U': 65161, 'dead_a': 65152, 'dead_abovecomma': 65124, 'dead_abovedot': 65110, 'dead_abovereversedcomma': 65125, 'dead_abovering': 65112, - 'dead_aboveverticalline': 65169, 'dead_acute': 65105, 'dead_belowbreve': 65131, 'dead_belowcircumflex': 65129, @@ -1751,7 +1763,6 @@ 'dead_belowmacron': 65128, 'dead_belowring': 65127, 'dead_belowtilde': 65130, - 'dead_belowverticalline': 65170, 'dead_breve': 65109, 'dead_capital_schwa': 65163, 'dead_caron': 65114, @@ -1765,18 +1776,18 @@ 'dead_e': 65154, 'dead_grave': 65104, 'dead_greek': 65164, + 'dead_hamza': 65165, 'dead_hook': 65121, 'dead_horn': 65122, 'dead_i': 65156, 'dead_invertedbreve': 65133, 'dead_iota': 65117, - 'dead_longsolidusoverlay': 65171, - 'dead_lowline': 65168, 'dead_macron': 65108, 'dead_o': 65158, 'dead_ogonek': 65116, 'dead_perispomeni': 65107, 'dead_psili': 65124, + 'dead_schwa': 65162, 'dead_semivoiced_sound': 65119, 'dead_small_schwa': 65162, 'dead_stroke': 65123, @@ -1871,6 +1882,8 @@ 'grave': 96, 'greater': 62, 'greaterthanequal': 2238, + 'guillemetleft': 171, + 'guillemetright': 187, 'guillemotleft': 171, 'guillemotright': 187, 'h': 104, @@ -2113,6 +2126,7 @@ 'opentribulletdown': 2788, 'opentribulletup': 2787, 'ordfeminine': 170, + 'ordmasculine': 186, 'oslash': 248, 'otilde': 245, 'overbar': 3008, diff --git a/lib/logitech_receiver/base.py b/lib/logitech_receiver/base.py index 0bdadda65..c9dd1c637 100644 --- a/lib/logitech_receiver/base.py +++ b/lib/logitech_receiver/base.py @@ -439,7 +439,7 @@ def request(handle, devnumber, request_id, *params, no_reply=False, return_error if reply: report_id, reply_devnumber, reply_data = reply - if reply_devnumber == devnumber: + if reply_devnumber == devnumber or reply_devnumber == devnumber ^ 0xff: # BT device returning 0x00 if report_id == HIDPP_SHORT_MESSAGE_ID and reply_data[:1] == b'\x8F' and reply_data[1:3] == request_data[:2 ]: error = ord(reply_data[3:4]) @@ -524,19 +524,18 @@ def ping(handle, devnumber, long_message=False): reply = _read(handle, _PING_TIMEOUT) if reply: report_id, reply_devnumber, reply_data = reply - if reply_devnumber == devnumber: + if reply_devnumber == devnumber or reply_devnumber == devnumber ^ 0xff: # BT device returning 0x00 if reply_data[:2] == request_data[:2] and reply_data[4:5] == request_data[-1:]: # HID++ 2.0+ device, currently connected return ord(reply_data[2:3]) + ord(reply_data[3:4]) / 10.0 if report_id == HIDPP_SHORT_MESSAGE_ID and reply_data[:1] == b'\x8F' and \ reply_data[1:3] == request_data[:2]: # error response - assert reply_data[-1:] == b'\x00' error = ord(reply_data[3:4]) if error == _hidpp10.ERROR.invalid_SubID__command: # a valid reply from a HID++ 1.0 device return 1.0 - if error == _hidpp10.ERROR.resource_error: # device unreachable - return + if error == _hidpp10.ERROR.resource_error or error == _hidpp10.ERROR.connection_request_failed: + return # device unreachable if error == _hidpp10.ERROR.unknown_device: # no paired device with that number _log.error('(%s) device %d error on ping request: unknown device', handle, devnumber) raise NoSuchDevice(number=devnumber, request=request_id) diff --git a/lib/logitech_receiver/common.py b/lib/logitech_receiver/common.py index b2d871faa..3be447b1b 100644 --- a/lib/logitech_receiver/common.py +++ b/lib/logitech_receiver/common.py @@ -44,6 +44,8 @@ def bytes(self, count=2): return int2bytes(self, count) def __eq__(self, other): + if other is None: + return False if isinstance(other, NamedInt): return int(self) == int(other) and self.name == other.name if isinstance(other, int): diff --git a/lib/logitech_receiver/descriptors.py b/lib/logitech_receiver/descriptors.py index 97a388494..3553b5a79 100644 --- a/lib/logitech_receiver/descriptors.py +++ b/lib/logitech_receiver/descriptors.py @@ -175,6 +175,8 @@ def get_btid(btid): _D('Wireless Keyboard EX110', codename='EX110', protocol=1.0, wpid='0055', registers=(_R.battery_status, )) _D('Wireless Keyboard S510', codename='S510', protocol=1.0, wpid='0056', registers=(_R.battery_status, )) +_D('Wireless Wave Keyboard K550', codename='K550', protocol=1.0, wpid='0060', registers=(_R.battery_status, ), + settings=[_ST.RegisterFnSwap]) _D('Wireless Keyboard EX100', codename='EX100', protocol=1.0, wpid='0065', registers=(_R.battery_status, )) _D('Wireless Keyboard MK300', codename='MK300', protocol=1.0, wpid='0068', registers=(_R.battery_status, )) _D('Number Pad N545', codename='N545', protocol=1.0, wpid='2006', registers=(_R.battery_status, )) @@ -206,11 +208,13 @@ def get_btid(btid): _D('G213 Prodigy Gaming Keyboard', codename='G213', usbid=0xc336, interface=1) _D('G512 RGB Mechanical Gaming Keyboard', codename='G512', usbid=0xc33c, interface=1) _D('G815 Mechanical Keyboard', codename='G815', usbid=0xc33f, interface=1) +_D('diNovo Edge Keyboard', codename='diNovo', protocol=1.0, wpid='C714', settings=[_ST.RegisterFnSwap]) # Mice _D('LX5 Cordless Mouse', codename='LX5', protocol=1.0, wpid='0036', registers=(_R.battery_status, )) _D('LX7 Cordless Laser Mouse', codename='LX7', protocol=1.0, wpid='0039', registers=(_R.battery_status, )) +_D('Wireless Wave Mouse M550', codename='M550', protocol=1.0, wpid='003C', registers=(_R.battery_status, )) _D('Wireless Mouse EX100', codename='EX100m', protocol=1.0, wpid='003F', registers=(_R.battery_status, )) _D('Wireless Mouse M30', codename='M30', protocol=1.0, wpid='0085', registers=(_R.battery_status, )) _D('MX610 Laser Cordless Mouse', codename='MX610', protocol=1.0, wpid='1001', registers=(_R.battery_status, )) @@ -302,9 +306,12 @@ class _PerformanceMXDpi(_ST.RegisterDpi): _D(None, kind=_DK.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('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) +_D('Logitech MX Revolution Mouse M-RCL 124', codename='M-RCL 124', btid=0xb007, interface=1) + # Trackballs _D('Wireless Trackball M570', codename='M570') @@ -320,4 +327,5 @@ class _PerformanceMXDpi(_ST.RegisterDpi): _D('G535 Gaming Headset', codename='G535 Headset', protocol=2.0, interface=3, kind=_DK.headset, usbid=0x0ac4) _D('G935 Gaming Headset', codename='G935 Headset', protocol=2.0, interface=3, kind=_DK.headset, usbid=0x0a87) _D('G733 Gaming Headset', codename='G733 Headset', protocol=2.0, interface=3, kind=_DK.headset, usbid=0x0ab5) +_D('G733 Gaming Headset', codename='G733 Headset New', protocol=2.0, interface=3, kind=_DK.headset, usbid=0x0afe) _D('PRO X Wireless Gaming Headset', codename='PRO Headset', protocol=2.0, interface=3, kind=_DK.headset, usbid=0x0aba) diff --git a/lib/logitech_receiver/device.py b/lib/logitech_receiver/device.py index 104bdd34a..dc21c1781 100644 --- a/lib/logitech_receiver/device.py +++ b/lib/logitech_receiver/device.py @@ -170,35 +170,35 @@ def find(self, serial): @property def protocol(self): - if not self._protocol and self.online: - self._protocol = _base.ping( - self.handle or self.receiver.handle, self.number, long_message=self.bluetooth or self.hidpp_short is False - ) - # if the ping failed, the peripheral is (almost) certainly offline - self.online = self._protocol is not None - - # if _log.isEnabledFor(_DEBUG): - # _log.debug("device %d protocol %s", self.number, self._protocol) + if not self._protocol: + self.ping() return self._protocol or 0 @property def codename(self): if not self._codename: + if not self.online: # be very defensive + self.ping() if self.online and self.protocol >= 2.0: self._codename = _hidpp20.get_friendly_name(self) if not self._codename: self._codename = self.name.split(' ', 1)[0] if self.name else None - elif self.receiver: + if not self._codename and self.receiver: codename = self.receiver.device_codename(self.number) if codename: self._codename = codename elif self.protocol < 2.0: self._codename = '? (%s)' % (self.wpid or self.product_id) - return self._codename if self._codename else '?? (%s)' % (self.wpid or self.product_id) + return self._codename or '?? (%s)' % (self.wpid or self.product_id) @property def name(self): if not self._name: + if not self.online: # be very defensive + try: + self.ping() + except _base.NoSuchDevice: + pass if self.online and self.protocol >= 2.0: self._name = _hidpp20.get_name(self) return self._name or self._codename or ('Unknown device %s' % (self.wpid or self.product_id)) @@ -432,13 +432,16 @@ def handle_notification(self, n) -> Optional[bool]: def request(self, request_id, *params, no_reply=False): if self: + long = self.hidpp_long is True or ( + self.hidpp_long is None and (self.bluetooth or self._protocol is not None and self._protocol >= 2.0) + ) return _base.request( self.handle or self.receiver.handle, self.number, request_id, *params, no_reply=no_reply, - long_message=self.bluetooth or self.hidpp_short is False or self.protocol >= 2.0, + long_message=long, protocol=self.protocol ) @@ -448,7 +451,10 @@ def feature_request(self, feature, function=0x00, *params, no_reply=False): def ping(self): """Checks if the device is online, returns True of False""" - long = self.bluetooth or self.hidpp_short is False or self._protocol is not None and self._protocol >= 2.0 + # long = self.bluetooth or self.hidpp_short is False or self._protocol is not None and self._protocol >= 2.0 + long = self.hidpp_long is True or ( + self.hidpp_long is None and (self.bluetooth or self._protocol is not None and self._protocol >= 2.0) + ) protocol = _base.ping(self.handle or self.receiver.handle, self.number, long_message=long) self.online = protocol is not None if protocol: @@ -475,9 +481,11 @@ def __bool__(self): __nonzero__ = __bool__ def __str__(self): - return '' % ( - self.number, self.wpid or self.product_id, self.name or self.codename or '?', self.serial - ) + try: + name = self.name or self.codename or '?' + except _base.NoSuchDevice: + name = 'name not available' + return '' % (self.number, self.wpid or self.product_id, name, self.serial) __repr__ = __str__ diff --git a/lib/logitech_receiver/diversion.py b/lib/logitech_receiver/diversion.py index c988b26f4..3d8895d78 100644 --- a/lib/logitech_receiver/diversion.py +++ b/lib/logitech_receiver/diversion.py @@ -36,6 +36,8 @@ else: import evdev +import dbus + import keysyms.keysymdef as _keysymdef import psutil @@ -94,6 +96,8 @@ _BUTTON_RELEASE = 2 _BUTTON_PRESS = 3 +CLICK, DEPRESS, RELEASE = 'click', 'depress', 'release' + gdisplay = Gdk.Display.get_default() # can be None if Solaar is run without a full window system gkeymap = Gdk.Keymap.get_for_display(gdisplay) if gdisplay else None if _log.isEnabledFor(_INFO): @@ -101,7 +105,10 @@ wayland = _os.getenv('WAYLAND_DISPLAY') # is this Wayland? if wayland: - _log.warn('rules cannot access active process or modifier keys in Wayland') + _log.warn( + 'rules cannot access modifier keys in Wayland, ' + 'accessing process only works on GNOME with Solaar Gnome extension installed' + ) try: import Xlib @@ -115,6 +122,8 @@ modifier_keycodes = [] XkbUseCoreKbd = 0x100 +_dbus_interface = None + class XkbDisplay(_ctypes.Structure): """ opaque struct """ @@ -150,6 +159,20 @@ def x11_setup(): return _x11 +def gnome_dbus_interface_setup(): + global _dbus_interface + if _dbus_interface is not None: + return _dbus_interface + try: + bus = dbus.SessionBus() + remote_object = bus.get_object('org.gnome.Shell', '/io/github/pwr_solaar/solaar') + _dbus_interface = dbus.Interface(remote_object, 'io.github.pwr_solaar.solaar') + except dbus.exceptions.DBusException: + _log.warn('Solaar Gnome extension not installed - some rule capabilities inoperable', exc_info=_sys.exc_info()) + _dbus_interface = False + return _dbus_interface + + def xkb_setup(): global X11Lib, Xkbdisplay if Xkbdisplay is not None: @@ -209,7 +232,7 @@ def setup_uinput(): _log.warn('cannot create uinput device: %s', e) -if wayland: # wayland can't use xtest so may as well set up uinput now +if wayland: # Wayland can't use xtest so may as well set up uinput now setup_uinput() @@ -306,20 +329,36 @@ def simulate_key(code, event): # X11 keycode but Solaar event code def click_xtest(button, count): - for _ in range(count): - if not simulate_xtest(button[0], _BUTTON_PRESS): - return False - if not simulate_xtest(button[0], _BUTTON_RELEASE): - return False + 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): - for _ in range(count): - if not simulate_uinput(evdev.ecodes.EV_KEY, button[1], 1): - return False - if not simulate_uinput(evdev.ecodes.EV_KEY, button[1], 0): - return False + if isinstance(count, int): + for _ in range(count): + if not simulate_uinput(evdev.ecodes.EV_KEY, button[1], 1): + return False + if not simulate_uinput(evdev.ecodes.EV_KEY, button[1], 0): + return False + else: + if count != RELEASE: + if not simulate_uinput(evdev.ecodes.EV_KEY, button[1], 1): + return False + if count != DEPRESS: + if not simulate_uinput(evdev.ecodes.EV_KEY, button[1], 0): + return False return True @@ -576,13 +615,30 @@ def x11_pointer_prog(): return (wm_class[0], wm_class[1], name) if wm_class else (name, ) +def gnome_dbus_focus_prog(): + if not gnome_dbus_interface_setup(): + return None + wm_class = _dbus_interface.ActiveWindow() + return (wm_class, ) if wm_class else None + + +def gnome_dbus_pointer_prog(): + if not gnome_dbus_interface_setup(): + return None + wm_class = _dbus_interface.PointerOverWindow() + return (wm_class, ) if wm_class else None + + class Process(Condition): def __init__(self, process, warn=True): self.process = process - if wayland or not x11_setup(): + if (not wayland and not x11_setup()) or (wayland and not gnome_dbus_interface_setup()): if warn: - _log.warn('rules can only access active process in X11 - %s', self) + _log.warn( + 'rules can only access active process in X11 or in Wayland under GNOME with Solaar Gnome extension - %s', + self + ) if not isinstance(process, str): if warn: _log.warn('rule Process argument not a string: %s', process) @@ -596,7 +652,7 @@ def evaluate(self, feature, notification, device, status, last_result): _log.debug('evaluate condition: %s', self) if not isinstance(self.process, str): return False - focus = x11_focus_prog() + focus = x11_focus_prog() if not wayland else gnome_dbus_focus_prog() result = any(bool(s and s.startswith(self.process)) for s in focus) if focus else None return result @@ -608,9 +664,12 @@ class MouseProcess(Condition): def __init__(self, process, warn=True): self.process = process - if wayland or not x11_setup(): + if (not wayland and not x11_setup()) or (wayland and not gnome_dbus_interface_setup()): if warn: - _log.warn('rules cannot access active mouse process in X11 - %s', self) + _log.warn( + 'rules cannot access active mouse process ' + 'in X11 or in Wayland under GNOME with Solaar Extension for GNOME - %s', self + ) if not isinstance(process, str): if warn: _log.warn('rule MouseProcess argument not a string: %s', process) @@ -624,7 +683,7 @@ def evaluate(self, feature, notification, device, status, last_result): _log.debug('evaluate condition: %s', self) if not isinstance(self.process, str): return False - pointer_focus = x11_pointer_prog() + pointer_focus = x11_pointer_prog() if not wayland else gnome_dbus_pointer_prog() result = any(bool(s and s.startswith(self.process)) for s in pointer_focus) if pointer_focus else None return result @@ -1007,13 +1066,35 @@ def __str__(self): def evaluate(self, feature, notification, device, status, last_result): if _log.isEnabledFor(_DEBUG): _log.debug('evaluate condition: %s', self) - dev = _Device.find(self.devID) - return device == dev + return device.unitId == self.devID or device.serial == self.devID def data(self): return {'Device': self.devID} +class Host(Condition): + + def __init__(self, host, warn=True): + if not (isinstance(host, str)): + if warn: + _log.warn('rule Host Name argument not a string: %s', host) + self.host = '' + self.host = host + + def __str__(self): + return 'Host: ' + str(self.host) + + def evaluate(self, feature, notification, device, status, last_result): + if _log.isEnabledFor(_DEBUG): + _log.debug('evaluate condition: %s', self) + import socket + hostname = socket.getfqdn() + return hostname.startswith(self.host) + + def data(self): + return {'Host': self.host} + + class Action(RuleComponent): def __init__(self, *args): @@ -1024,7 +1105,6 @@ def evaluate(self, feature, notification, device, status, last_result): class KeyPress(Action): - CLICK, DEPRESS, RELEASE = 'click', 'depress', 'release' def __init__(self, args, warn=True): self.key_names, self.action = self.regularize_args(args) @@ -1040,11 +1120,11 @@ def __init__(self, args, warn=True): self.key_symbols = [] def regularize_args(self, args): - action = self.CLICK + action = CLICK if not isinstance(args, list): args = [args] keys = args - if len(args) == 2 and args[1] in [self.CLICK, self.DEPRESS, self.RELEASE]: + if len(args) == 2 and args[1] in [CLICK, DEPRESS, RELEASE]: keys = [args[0]] if isinstance(args[0], str) else args[0] action = args[1] return keys, action @@ -1090,14 +1170,14 @@ def keyDown(self, keysyms, modifiers): (keycode, level) = self.keysym_to_keycode(k, modifiers) if keycode is None: _log.warn('rule KeyPress key symbol not currently available %s', self) - elif self.action != self.CLICK or self.needed(keycode, modifiers): # only check needed when clicking + elif self.action != CLICK or self.needed(keycode, modifiers): # only check needed when clicking self.mods(level, modifiers, _KEY_PRESS) simulate_key(keycode, _KEY_PRESS) def keyUp(self, keysyms, modifiers): for k in keysyms: (keycode, level) = self.keysym_to_keycode(k, modifiers) - if keycode and (self.action != self.CLICK or self.needed(keycode, modifiers)): # only check needed when clicking + if keycode and (self.action != CLICK or self.needed(keycode, modifiers)): # only check needed when clicking simulate_key(keycode, _KEY_RELEASE) self.mods(level, modifiers, _KEY_RELEASE) @@ -1106,9 +1186,9 @@ def evaluate(self, feature, notification, device, status, last_result): current = gkeymap.get_modifier_state() if _log.isEnabledFor(_INFO): _log.info('KeyPress action: %s %s, group %s, modifiers %s', self.key_names, self.action, kbdgroup(), current) - if self.action != self.RELEASE: + if self.action != RELEASE: self.keyDown(self.key_symbols, current) - if self.action != self.DEPRESS: + if self.action != DEPRESS: self.keyUp(reversed(self.key_symbols), current) _time.sleep(0.01) else: @@ -1176,9 +1256,11 @@ def __init__(self, args, warn=True): try: self.count = int(count) except (ValueError, TypeError): - if warn: - _log.warn('rule MouseClick action: count %s should be an integer', count) - self.count = 1 + if count in [CLICK, DEPRESS, RELEASE]: + self.count = count + elif warn: + _log.warn('rule MouseClick action: argument %s should be an integer or CLICK, PRESS, or RELEASE', count) + self.count = 1 def __str__(self): return 'MouseClick: %s (%d)' % (self.button, self.count) @@ -1312,6 +1394,7 @@ def data(self): 'MouseGesture': MouseGesture, 'Active': Active, 'Device': Device, + 'Host': Host, 'KeyPress': KeyPress, 'MouseScroll': MouseScroll, 'MouseClick': MouseClick, diff --git a/lib/logitech_receiver/receiver.py b/lib/logitech_receiver/receiver.py index 9fde2e577..c0ea3857f 100644 --- a/lib/logitech_receiver/receiver.py +++ b/lib/logitech_receiver/receiver.py @@ -180,6 +180,10 @@ def device_pairing_information(self, n): if device_info: wpid = _strhex(device_info[3:5]) kind = _hidpp10.DEVICE_KIND[0x00] # unknown kind + else: + raise _base.NoSuchDevice(number=n, receiver=self, error='read pairing information - non-unifying') + else: + raise _base.NoSuchDevice(number=n, receiver=self, error='read pairing information') return wpid, kind, polling_rate def device_extended_pairing_information(self, n): @@ -238,8 +242,8 @@ def register_new_device(self, number, notification=None): _log.info('%s: found new device %d (%s)', self, number, dev.wpid) self._devices[number] = dev return dev - except _base.NoSuchDevice: - _log.exception('register_new_device') + except _base.NoSuchDevice as e: + _log.warn('register new device failed for %s device %d error %s', e.receiver, e.number, e.error) _log.warning('%s: looked for device %d, not found', self, number) self._devices[number] = None diff --git a/lib/solaar/cli/__init__.py b/lib/solaar/cli/__init__.py index 788b5adf3..ace57f900 100644 --- a/lib/solaar/cli/__init__.py +++ b/lib/solaar/cli/__init__.py @@ -203,7 +203,9 @@ def run(cli_args=None, hidraw_path=None): else: c = list(_receivers(hidraw_path)) if not c: - raise Exception('No devices found') + raise Exception( + 'No supported device found. Use "lsusb" and "bluetoothctl devices Connected" to list connected devices.' + ) from importlib import import_module m = import_module('.' + action, package=__name__) m.run(c, args, _find_receiver, _find_device) diff --git a/lib/solaar/cli/show.py b/lib/solaar/cli/show.py index 284bb39be..b7fcd0093 100644 --- a/lib/solaar/cli/show.py +++ b/lib/solaar/cli/show.py @@ -16,6 +16,7 @@ ## with this program; if not, write to the Free Software Foundation, Inc., ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +from logitech_receiver import base as _base from logitech_receiver import hidpp10 as _hidpp10 from logitech_receiver import hidpp20 as _hidpp20 from logitech_receiver import receiver as _receiver @@ -81,8 +82,12 @@ def _battery_line(dev): def _print_device(dev, num=None): assert dev is not None - # check if the device is online - dev.ping() + # try to ping the device to see if it actually exists and to wake it up + try: + dev.ping() + except _base.NoSuchDevice: + print(' %d: Device not found' % num or dev.number) + return print(' %d: %s' % (num or dev.number, dev.name)) print(' Device path :', dev.path) diff --git a/lib/solaar/listener.py b/lib/solaar/listener.py index ead74257d..93b71ee0d 100644 --- a/lib/solaar/listener.py +++ b/lib/solaar/listener.py @@ -156,12 +156,12 @@ def _status_changed(self, device, alert=_status.ALERT.NONE, reason=None): if _log.isEnabledFor(_INFO): if device.kind is None: _log.info( - 'status_changed %s: %s, %s (%X) %s', device, 'present' if bool(device) else 'removed', device.status, + 'status_changed %r: %s, %s (%X) %s', device, 'present' if bool(device) else 'removed', device.status, alert, reason or '' ) else: _log.info( - 'status_changed %s: %s %s, %s (%X) %s', device, 'paired' if bool(device) else 'unpaired', + 'status_changed %r: %s %s, %s (%X) %s', device, 'paired' if bool(device) else 'unpaired', 'online' if device.online else 'offline', device.status, alert, reason or '' ) @@ -253,7 +253,7 @@ def _notifications_handler(self, n): # Apply settings every time the device connects if n.sub_id == 0x41: if _log.isEnabledFor(_INFO): - _log.info('connection %s for %s (%s)', n, dev, dev.kind) + _log.info('connection %s for %r', n, dev) # If there are saved configs, bring the device's settings up-to-date. # They will be applied when the device is marked as online. configuration.attach_to(dev) diff --git a/lib/solaar/ui/about.py b/lib/solaar/ui/about.py index d72b3e9db..bd91adf0d 100644 --- a/lib/solaar/ui/about.py +++ b/lib/solaar/ui/about.py @@ -36,7 +36,7 @@ def _create(): about.set_comments(_('Manages Logitech receivers,\nkeyboards, mice, and tablets.')) about.set_logo_icon_name(NAME.lower()) - about.set_copyright('© 2012-2021 Daniel Pavel and contributors to the Solaar project') + about.set_copyright('© 2012-2023 Daniel Pavel and contributors to the Solaar project') about.set_license_type(Gtk.License.GPL_2_0) about.set_authors(('Daniel Pavel http://github.com/pwr', )) diff --git a/lib/solaar/ui/diversion_rules.py b/lib/solaar/ui/diversion_rules.py index 31d8fa14e..99450999f 100644 --- a/lib/solaar/ui/diversion_rules.py +++ b/lib/solaar/ui/diversion_rules.py @@ -29,9 +29,9 @@ from gi.repository import Gdk, GObject, Gtk from logitech_receiver import diversion as _DIV from logitech_receiver.common import NamedInt, NamedInts, UnsortedNamedInts +from logitech_receiver.diversion import CLICK, DEPRESS, RELEASE from logitech_receiver.diversion import XK_KEYS as _XK_KEYS from logitech_receiver.diversion import Key as _Key -from logitech_receiver.diversion import KeyPress as _KeyPress from logitech_receiver.diversion import buttons as _buttons from logitech_receiver.hidpp20 import FEATURE as _ALL_FEATURES from logitech_receiver.settings import KIND as _SKIND @@ -521,6 +521,7 @@ def _menu_insert(self, m, it, below=False): (_('KeyIsDown'), _DIV.KeyIsDown, ''), (_('Active'), _DIV.Active, ''), (_('Device'), _DIV.Device, ''), + (_('Host'), _DIV.Host, ''), (_('Setting'), _DIV.Setting, [None, '', None]), (_('Test'), _DIV.Test, next(iter(_DIV.TESTS))), (_('Test bytes'), _DIV.TestBytes, [0, 1, 0]), @@ -1769,13 +1770,13 @@ def create_widgets(self): self.add_btn.connect('clicked', self._clicked_add) self.widgets[self.add_btn] = (1, 1, 1, 1) self.action_clicked_radio = Gtk.RadioButton.new_with_label_from_widget(None, _('Click')) - self.action_clicked_radio.connect('toggled', self._on_update, _KeyPress.CLICK) + self.action_clicked_radio.connect('toggled', self._on_update, CLICK) self.widgets[self.action_clicked_radio] = (0, 3, 1, 1) self.action_pressed_radio = Gtk.RadioButton.new_with_label_from_widget(self.action_clicked_radio, _('Depress')) - self.action_pressed_radio.connect('toggled', self._on_update, _KeyPress.DEPRESS) + self.action_pressed_radio.connect('toggled', self._on_update, DEPRESS) self.widgets[self.action_pressed_radio] = (1, 3, 1, 1) self.action_released_radio = Gtk.RadioButton.new_with_label_from_widget(self.action_pressed_radio, _('Release')) - self.action_released_radio.connect('toggled', self._on_update, _KeyPress.RELEASE) + self.action_released_radio.connect('toggled', self._on_update, RELEASE) self.widgets[self.action_released_radio] = (2, 3, 1, 1) def _create_field(self): @@ -1835,8 +1836,8 @@ def show(self, component, editable=True): self.del_btns[i].hide() def collect_value(self): - action = _KeyPress.CLICK if self.action_clicked_radio.get_active() else \ - _KeyPress.DEPRESS if self.action_pressed_radio.get_active() else _KeyPress.RELEASE + action = CLICK if self.action_clicked_radio.get_active() else \ + DEPRESS if self.action_pressed_radio.get_active() else RELEASE return [[f.get_text().strip() for f in self.fields if f.get_visible()], action] @classmethod @@ -1845,8 +1846,7 @@ def left_label(cls, component): @classmethod def right_label(cls, component): - return ' + '.join(component.key_names - ) + (' (' + component.action + ')' if component.action != _KeyPress.CLICK else '') + return ' + '.join(component.key_names) + (' (' + component.action + ')' if component.action != CLICK else '') class MouseScrollUI(ActionUI): @@ -1910,6 +1910,7 @@ class MouseClickUI(ActionUI): MIN_VALUE = 1 MAX_VALUE = 9 BUTTONS = list(_buttons.keys()) + ACTIONS = [CLICK, DEPRESS, RELEASE] def create_widgets(self): self.widgets = {} @@ -1918,29 +1919,39 @@ def create_widgets(self): ) self.widgets[self.label] = (0, 0, 4, 1) self.label_b = Gtk.Label(label=_('Button'), halign=Gtk.Align.END, valign=Gtk.Align.CENTER, hexpand=True) - self.label_c = Gtk.Label(label=_('Count'), halign=Gtk.Align.END, valign=Gtk.Align.CENTER, hexpand=True) + self.label_c = Gtk.Label(label=_('Count and Action'), halign=Gtk.Align.END, valign=Gtk.Align.CENTER, hexpand=True) self.field_b = CompletionEntry(self.BUTTONS) self.field_c = Gtk.SpinButton.new_with_range(self.MIN_VALUE, self.MAX_VALUE, 1) + self.field_d = CompletionEntry(self.ACTIONS) for f in [self.field_b, self.field_c]: f.set_halign(Gtk.Align.CENTER) f.set_valign(Gtk.Align.START) self.field_b.connect('changed', self._on_update) self.field_c.connect('changed', self._on_update) + self.field_d.connect('changed', self._on_update) self.widgets[self.label_b] = (0, 1, 1, 1) self.widgets[self.field_b] = (1, 1, 1, 1) self.widgets[self.label_c] = (2, 1, 1, 1) self.widgets[self.field_c] = (3, 1, 1, 1) + self.widgets[self.field_d] = (4, 1, 1, 1) def show(self, component, editable): super().show(component, editable) with self.ignore_changes(): self.field_b.set_text(component.button) - self.field_c.set_value(component.count) + if isinstance(component.count, int): + self.field_c.set_value(component.count) + self.field_d.set_text(CLICK) + else: + self.field_c.set_value(1) + self.field_d.set_text(component.count) def collect_value(self): - b, c = self.field_b.get_text(), int(self.field_c.get_value()) + b, c, d = self.field_b.get_text(), int(self.field_c.get_value()), self.field_d.get_text() if b not in self.BUTTONS: b = 'unknown' + if d != CLICK: + c = d return [b, c] @classmethod @@ -1949,7 +1960,7 @@ def left_label(cls, component): @classmethod def right_label(cls, component): - return f'{component.button} (x{component.count})' + return f'{component.button} ({"x" if isinstance(component.count, int) else ""}{component.count})' class ExecuteUI(ActionUI): @@ -2252,13 +2263,44 @@ def left_label(cls, component): class DeviceUI(_DeviceUI, ConditionUI): CLASS = _DIV.Device - label_text = _('Device originated the current notification.') + label_text = _('Device that originated the current notification.') @classmethod def left_label(cls, component): return _('Device') +class HostUI(ConditionUI): + + CLASS = _DIV.Host + + def create_widgets(self): + self.widgets = {} + self.label = Gtk.Label(valign=Gtk.Align.CENTER, hexpand=True) + self.label.set_text(_('Name of host computer.')) + self.widgets[self.label] = (0, 0, 1, 1) + self.field = Gtk.Entry(halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER, hexpand=True) + self.field.set_size_request(600, 0) + self.field.connect('changed', self._on_update) + self.widgets[self.field] = (0, 1, 1, 1) + + def show(self, component, editable): + super().show(component, editable) + with self.ignore_changes(): + self.field.set_text(component.host) + + def collect_value(self): + return self.field.get_text() + + @classmethod + def left_label(cls, component): + return _('Host') + + @classmethod + def right_label(cls, component): + return str(component.host) + + class _SettingWithValueUI: ALL_SETTINGS = _all_settings() @@ -2624,6 +2666,7 @@ def _on_update(self, *_args): _DIV.MouseProcess: MouseProcessUI, _DIV.Active: ActiveUI, _DIV.Device: DeviceUI, + _DIV.Host: HostUI, _DIV.Feature: FeatureUI, _DIV.Report: ReportUI, _DIV.Modifiers: ModifiersUI, diff --git a/lib/solaar/ui/icons.py b/lib/solaar/ui/icons.py index 537b2fed2..aadf76ae1 100644 --- a/lib/solaar/ui/icons.py +++ b/lib/solaar/ui/icons.py @@ -33,48 +33,11 @@ _LARGE_SIZE = 64 Gtk.IconSize.LARGE = Gtk.icon_size_register('large', _LARGE_SIZE, _LARGE_SIZE) # Gtk.IconSize.XLARGE = Gtk.icon_size_register('x-large', _LARGE_SIZE * 2, _LARGE_SIZE * 2) -# print ("menu", int(Gtk.IconSize.MENU), Gtk.icon_size_lookup(Gtk.IconSize.MENU)) -# print ("small toolbar", int(Gtk.IconSize.SMALL_TOOLBAR), Gtk.icon_size_lookup(Gtk.IconSize.SMALL_TOOLBAR)) -# print ("button", int(Gtk.IconSize.BUTTON), Gtk.icon_size_lookup(Gtk.IconSize.BUTTON)) -# print ("large toolbar", int(Gtk.IconSize.LARGE_TOOLBAR), Gtk.icon_size_lookup(Gtk.IconSize.LARGE_TOOLBAR)) -# print ("dnd", int(Gtk.IconSize.DND), Gtk.icon_size_lookup(Gtk.IconSize.DND)) -# print ("dialog", int(Gtk.IconSize.DIALOG), Gtk.icon_size_lookup(Gtk.IconSize.DIALOG)) TRAY_INIT = 'solaar-init' TRAY_OKAY = 'solaar' TRAY_ATTENTION = 'solaar-attention' - -def _look_for_application_icons(): - import os.path as _path - import sys as _sys - - from os import environ as _environ - if _log.isEnabledFor(_DEBUG): - _log.debug('sys.path[0] = %s', _sys.path[0]) - prefix_share = _path.normpath(_path.join(_path.realpath(_sys.path[0]), '..')) - src_share = _path.normpath(_path.join(_path.realpath(_sys.path[0]), '..', 'share')) - local_share = _environ.get('XDG_DATA_HOME', _path.expanduser(_path.join('~', '.local', 'share'))) - data_dirs = _environ.get('XDG_DATA_DIRS', '/usr/local/share:/usr/share') - repo_share = _path.normpath(_path.join(_path.dirname(__file__), '..', '..', '..', 'share')) - setuptools_share = _path.normpath(_path.join(_path.dirname(__file__), '..', '..', 'share')) - del _sys - - share_solaar = [prefix_share] + list( - _path.join(x, 'solaar') for x in [src_share, local_share, setuptools_share, repo_share] + data_dirs.split(':') - ) - for location in share_solaar: - location = _path.join(location, 'icons') - if _log.isEnabledFor(_DEBUG): - _log.debug('looking for icons in %s', location) - - if _path.exists(_path.join(location, TRAY_ATTENTION + '.svg')): - yield location - - del _environ - # del _path - - _default_theme = None @@ -84,9 +47,6 @@ def _init_icon_paths(): return _default_theme = Gtk.IconTheme.get_default() - for p in _look_for_application_icons(): - _default_theme.prepend_search_path(p) - break # only prepend one path - that's sufficient if _log.isEnabledFor(_DEBUG): _log.debug('icon theme paths: %s', _default_theme.get_search_path()) diff --git a/lib/solaar/ui/tray.py b/lib/solaar/ui/tray.py index 0e43baf8d..298ba28e5 100644 --- a/lib/solaar/ui/tray.py +++ b/lib/solaar/ui/tray.py @@ -55,7 +55,7 @@ def _create_menu(quit_handler): # per-device menu entries will be generated as-needed - no_receiver = Gtk.MenuItem.new_with_label(_('No Logitech device found')) + no_receiver = Gtk.MenuItem.new_with_label(_('No supported device found')) no_receiver.set_sensitive(False) menu.append(no_receiver) menu.append(Gtk.SeparatorMenuItem.new()) @@ -177,10 +177,8 @@ def _icon_file(icon_name): def _create(menu): _icons._init_icon_paths() - theme_paths = Gtk.IconTheme.get_default().get_search_path() - - ind = AppIndicator3.Indicator.new_with_path( - 'indicator-solaar', _icon_file(_icons.TRAY_INIT), AppIndicator3.IndicatorCategory.HARDWARE, theme_paths[0] + ind = AppIndicator3.Indicator.new( + 'indicator-solaar', _icon_file(_icons.TRAY_INIT), AppIndicator3.IndicatorCategory.HARDWARE ) ind.set_title(NAME) ind.set_status(AppIndicator3.IndicatorStatus.ACTIVE) diff --git a/lib/solaar/ui/window.py b/lib/solaar/ui/window.py index 368e3de2e..d7541640e 100644 --- a/lib/solaar/ui/window.py +++ b/lib/solaar/ui/window.py @@ -818,11 +818,6 @@ def _update_info_panel(device, full=False): def init(show_window, hide_on_close): Gtk.Window.set_default_icon_name(NAME.lower()) - # GTK installed on macOS via homebrew does not support SVG icons and won't - # be able to load them. - _icon = _icons.icon_file(NAME.lower()) - if _icon: - Gtk.Window.set_default_icon_from_file(_icon) global _model, _tree, _details, _info, _empty, _window _model = Gtk.TreeStore(*_COLUMN_TYPES) @@ -919,6 +914,8 @@ def update_device(device, item, selected_device_id, need_popup, full=False): icon_name = _icons.battery(battery_level, charging) _model.set_value(item, _COLUMN.STATUS_ICON, icon_name) + _model.set_value(item, _COLUMN.NAME, device.codename) + if selected_device_id is None or need_popup: select(device.receiver.path if device.receiver else device.path, device.number) elif selected_device_id == (device.receiver.path if device.receiver else device.path, device.number): diff --git a/lib/solaar/version b/lib/solaar/version index 512a1faa6..5ed5faa5f 100644 --- a/lib/solaar/version +++ b/lib/solaar/version @@ -1 +1 @@ -1.1.9 +1.1.10 diff --git a/po/de.po b/po/de.po index ecbf7eb10..92a7e56a2 100644 --- a/po/de.po +++ b/po/de.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: solaar 1.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-12-18 15:10+0100\n" -"PO-Revision-Date: 2022-12-18 21:16+0100\n" +"POT-Creation-Date: 2023-07-07 10:51+0200\n" +"PO-Revision-Date: 2023-07-07 11:06+0200\n" "Last-Translator: Daniel Frost \n" "Language-Team: none\n" "Language: de\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2021-04-17 16:52+0000\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.3.2\n" #: lib/logitech_receiver/base_usb.py:46 msgid "Bolt Receiver" @@ -73,7 +73,7 @@ msgstr "entlädt" msgid "recharging" msgstr "lädt wieder auf" -#: lib/logitech_receiver/i18n.py:40 lib/solaar/ui/window.py:718 +#: lib/logitech_receiver/i18n.py:40 lib/solaar/ui/window.py:711 msgid "charging" msgstr "lädt" @@ -133,7 +133,7 @@ msgstr "zu viele Geräte" msgid "sequence timeout" msgstr "Zeitüberschreitung im Ablauf" -#: lib/logitech_receiver/i18n.py:59 lib/solaar/ui/window.py:577 +#: lib/logitech_receiver/i18n.py:59 lib/solaar/ui/window.py:572 msgid "Firmware" msgstr "Firmware" @@ -265,11 +265,11 @@ msgstr "nicht gekoppelt" msgid "powered on" msgstr "eingeschaltet" -#: lib/logitech_receiver/settings.py:749 +#: lib/logitech_receiver/settings.py:750 msgid "register" msgstr "registrieren" -#: lib/logitech_receiver/settings.py:763 lib/logitech_receiver/settings.py:790 +#: lib/logitech_receiver/settings.py:764 lib/logitech_receiver/settings.py:791 msgid "feature" msgstr "Feature" @@ -941,11 +941,19 @@ msgstr "Setze Equalizerlautstärke." msgid "Hz" msgstr "Hz" +#: lib/logitech_receiver/settings_templates.py:1197 +msgid "Power Management" +msgstr "Energieverwaltung" + +#: lib/logitech_receiver/settings_templates.py:1198 +msgid "Power off in minutes (0 for never)." +msgstr "Ausschalten in Minuten (0 für nie)" + #: lib/logitech_receiver/status.py:114 msgid "No paired devices." msgstr "Keine gekoppelten Geräte." -#: lib/logitech_receiver/status.py:115 lib/solaar/ui/window.py:620 +#: lib/logitech_receiver/status.py:115 lib/solaar/ui/window.py:622 #, python-format msgid "%(count)s paired device." msgid_plural "%(count)s paired devices." @@ -1063,7 +1071,7 @@ msgid "Logitech documentation" msgstr "Logitech-Dokumentation" #: lib/solaar/ui/action.py:85 lib/solaar/ui/action.py:89 -#: lib/solaar/ui/window.py:202 +#: lib/solaar/ui/window.py:197 msgid "Unpair" msgstr "Entkoppeln" @@ -1114,12 +1122,12 @@ msgstr "Integrierte Regeln" msgid "User-defined rules" msgstr "Benutzerdefinierte Regeln" -#: lib/solaar/ui/diversion_rules.py:67 lib/solaar/ui/diversion_rules.py:1081 +#: lib/solaar/ui/diversion_rules.py:67 lib/solaar/ui/diversion_rules.py:1082 msgid "Rule" msgstr "Regel" #: lib/solaar/ui/diversion_rules.py:68 lib/solaar/ui/diversion_rules.py:509 -#: lib/solaar/ui/diversion_rules.py:634 +#: lib/solaar/ui/diversion_rules.py:635 msgid "Sub-rule" msgstr "Unterregel" @@ -1217,13 +1225,13 @@ msgstr "Einrückung aufheben" msgid "Insert" msgstr "Hinzufügen" -#: lib/solaar/ui/diversion_rules.py:510 lib/solaar/ui/diversion_rules.py:636 -#: lib/solaar/ui/diversion_rules.py:1124 +#: lib/solaar/ui/diversion_rules.py:510 lib/solaar/ui/diversion_rules.py:637 +#: lib/solaar/ui/diversion_rules.py:1125 msgid "Or" msgstr "Oder" -#: lib/solaar/ui/diversion_rules.py:511 lib/solaar/ui/diversion_rules.py:635 -#: lib/solaar/ui/diversion_rules.py:1109 +#: lib/solaar/ui/diversion_rules.py:511 lib/solaar/ui/diversion_rules.py:636 +#: lib/solaar/ui/diversion_rules.py:1110 msgid "And" msgstr "Und" @@ -1231,15 +1239,15 @@ msgstr "Und" msgid "Condition" msgstr "Bedingung" -#: lib/solaar/ui/diversion_rules.py:515 lib/solaar/ui/diversion_rules.py:1290 +#: lib/solaar/ui/diversion_rules.py:515 lib/solaar/ui/diversion_rules.py:1291 msgid "Feature" msgstr "Funktion" -#: lib/solaar/ui/diversion_rules.py:516 lib/solaar/ui/diversion_rules.py:1326 +#: lib/solaar/ui/diversion_rules.py:516 lib/solaar/ui/diversion_rules.py:1327 msgid "Report" msgstr "Rückgabewert" -#: lib/solaar/ui/diversion_rules.py:517 lib/solaar/ui/diversion_rules.py:1202 +#: lib/solaar/ui/diversion_rules.py:517 lib/solaar/ui/diversion_rules.py:1203 msgid "Process" msgstr "Prozessname (Anwendung)" @@ -1247,135 +1255,140 @@ msgstr "Prozessname (Anwendung)" msgid "Mouse process" msgstr "Maus Prozess" -#: lib/solaar/ui/diversion_rules.py:519 lib/solaar/ui/diversion_rules.py:1364 +#: lib/solaar/ui/diversion_rules.py:519 lib/solaar/ui/diversion_rules.py:1365 msgid "Modifiers" msgstr "Zusatztasten" -#: lib/solaar/ui/diversion_rules.py:520 lib/solaar/ui/diversion_rules.py:1417 +#: lib/solaar/ui/diversion_rules.py:520 lib/solaar/ui/diversion_rules.py:1418 msgid "Key" msgstr "Taste" -#: lib/solaar/ui/diversion_rules.py:521 lib/solaar/ui/diversion_rules.py:1459 +#: lib/solaar/ui/diversion_rules.py:521 lib/solaar/ui/diversion_rules.py:1460 msgid "KeyIsDown" msgstr "TasteIstGedrückt" -#: lib/solaar/ui/diversion_rules.py:522 lib/solaar/ui/diversion_rules.py:2243 +#: lib/solaar/ui/diversion_rules.py:522 lib/solaar/ui/diversion_rules.py:2249 msgid "Active" msgstr "Aktiv" -#: lib/solaar/ui/diversion_rules.py:523 lib/solaar/ui/diversion_rules.py:2286 +#: lib/solaar/ui/diversion_rules.py:523 lib/solaar/ui/diversion_rules.py:2207 +#: lib/solaar/ui/diversion_rules.py:2259 lib/solaar/ui/diversion_rules.py:2281 +msgid "Device" +msgstr "Gerät" + +#: lib/solaar/ui/diversion_rules.py:524 lib/solaar/ui/diversion_rules.py:2297 msgid "Setting" msgstr "Einstellung" -#: lib/solaar/ui/diversion_rules.py:524 lib/solaar/ui/diversion_rules.py:1475 -#: lib/solaar/ui/diversion_rules.py:1524 +#: lib/solaar/ui/diversion_rules.py:525 lib/solaar/ui/diversion_rules.py:1476 +#: lib/solaar/ui/diversion_rules.py:1525 msgid "Test" msgstr "Prüfwert/Ereignis" -#: lib/solaar/ui/diversion_rules.py:525 lib/solaar/ui/diversion_rules.py:1641 +#: lib/solaar/ui/diversion_rules.py:526 lib/solaar/ui/diversion_rules.py:1642 msgid "Test bytes" msgstr "Prüfwert Bytes" -#: lib/solaar/ui/diversion_rules.py:526 lib/solaar/ui/diversion_rules.py:1734 +#: lib/solaar/ui/diversion_rules.py:527 lib/solaar/ui/diversion_rules.py:1735 msgid "Mouse Gesture" msgstr "Mausgeste" -#: lib/solaar/ui/diversion_rules.py:530 +#: lib/solaar/ui/diversion_rules.py:531 msgid "Action" msgstr "Aktion" -#: lib/solaar/ui/diversion_rules.py:532 lib/solaar/ui/diversion_rules.py:1843 +#: lib/solaar/ui/diversion_rules.py:533 lib/solaar/ui/diversion_rules.py:1844 msgid "Key press" msgstr "Tastendruck" -#: lib/solaar/ui/diversion_rules.py:533 lib/solaar/ui/diversion_rules.py:1896 +#: lib/solaar/ui/diversion_rules.py:534 lib/solaar/ui/diversion_rules.py:1897 msgid "Mouse scroll" msgstr "Mausrad-Scrollen" -#: lib/solaar/ui/diversion_rules.py:534 lib/solaar/ui/diversion_rules.py:1947 +#: lib/solaar/ui/diversion_rules.py:535 lib/solaar/ui/diversion_rules.py:1948 msgid "Mouse click" msgstr "Mausklick" -#: lib/solaar/ui/diversion_rules.py:535 +#: lib/solaar/ui/diversion_rules.py:536 msgid "Set" msgstr "Aktivieren" -#: lib/solaar/ui/diversion_rules.py:536 lib/solaar/ui/diversion_rules.py:2018 +#: lib/solaar/ui/diversion_rules.py:537 lib/solaar/ui/diversion_rules.py:2019 msgid "Execute" msgstr "Ausführen" -#: lib/solaar/ui/diversion_rules.py:537 lib/solaar/ui/diversion_rules.py:1156 +#: lib/solaar/ui/diversion_rules.py:538 lib/solaar/ui/diversion_rules.py:1157 msgid "Later" msgstr "Später" -#: lib/solaar/ui/diversion_rules.py:566 +#: lib/solaar/ui/diversion_rules.py:567 msgid "Insert new rule" msgstr "Neue Regel hinzufügen" -#: lib/solaar/ui/diversion_rules.py:586 lib/solaar/ui/diversion_rules.py:1684 -#: lib/solaar/ui/diversion_rules.py:1788 lib/solaar/ui/diversion_rules.py:1977 +#: lib/solaar/ui/diversion_rules.py:587 lib/solaar/ui/diversion_rules.py:1685 +#: lib/solaar/ui/diversion_rules.py:1789 lib/solaar/ui/diversion_rules.py:1978 msgid "Delete" msgstr "Löschen" -#: lib/solaar/ui/diversion_rules.py:608 +#: lib/solaar/ui/diversion_rules.py:609 msgid "Negate" msgstr "Negieren" -#: lib/solaar/ui/diversion_rules.py:632 +#: lib/solaar/ui/diversion_rules.py:633 msgid "Wrap with" msgstr "Einrücken unter" -#: lib/solaar/ui/diversion_rules.py:654 +#: lib/solaar/ui/diversion_rules.py:655 msgid "Cut" msgstr "Ausschneiden" -#: lib/solaar/ui/diversion_rules.py:669 +#: lib/solaar/ui/diversion_rules.py:670 msgid "Paste" msgstr "Einfügen" -#: lib/solaar/ui/diversion_rules.py:681 +#: lib/solaar/ui/diversion_rules.py:682 msgid "Copy" msgstr "Kopieren" -#: lib/solaar/ui/diversion_rules.py:1061 +#: lib/solaar/ui/diversion_rules.py:1062 msgid "This editor does not support the selected rule component yet." msgstr "" "Diese Regelbearbeitung unterstützt die ausgewählte Regelkomponente noch " "nicht." -#: lib/solaar/ui/diversion_rules.py:1136 +#: lib/solaar/ui/diversion_rules.py:1137 msgid "Number of seconds to delay." msgstr "Angabe der Sekunden für die Verzögerung." -#: lib/solaar/ui/diversion_rules.py:1175 +#: lib/solaar/ui/diversion_rules.py:1176 msgid "Not" msgstr "Nicht" -#: lib/solaar/ui/diversion_rules.py:1185 +#: lib/solaar/ui/diversion_rules.py:1186 msgid "X11 active process. For use in X11 only." msgstr "Aktiver X11 Prozess. Nur zur Verwendung mit X11." -#: lib/solaar/ui/diversion_rules.py:1216 +#: lib/solaar/ui/diversion_rules.py:1217 msgid "X11 mouse process. For use in X11 only." msgstr "X11 Mausprozess. Nur zur Verwendung mit X11." -#: lib/solaar/ui/diversion_rules.py:1233 +#: lib/solaar/ui/diversion_rules.py:1234 msgid "MouseProcess" msgstr "Mausprozess" -#: lib/solaar/ui/diversion_rules.py:1258 +#: lib/solaar/ui/diversion_rules.py:1259 msgid "Feature name of notification triggering rule processing." -msgstr "" +msgstr "Funktionsname der Benachrichtigung, die die Regelverarbeitung auslöst." -#: lib/solaar/ui/diversion_rules.py:1306 +#: lib/solaar/ui/diversion_rules.py:1307 msgid "Report number of notification triggering rule processing." msgstr "" -#: lib/solaar/ui/diversion_rules.py:1340 +#: lib/solaar/ui/diversion_rules.py:1341 msgid "Active keyboard modifiers. Not always available in Wayland." msgstr "Aktive Keyboardanpassung. Unter Wayland nicht immer verfügbar." -#: lib/solaar/ui/diversion_rules.py:1381 +#: lib/solaar/ui/diversion_rules.py:1382 msgid "" "Diverted key or button depressed or released.\n" "Use the Key/Button Diversion and Divert G Keys settings to divert keys and " @@ -1385,15 +1398,15 @@ msgstr "" "Verwende die Tasten-/Maustastenumleitungs- und G " "Tastenumleitungseinstellungen um Tasten sowie Maustasten umzuleiten." -#: lib/solaar/ui/diversion_rules.py:1390 +#: lib/solaar/ui/diversion_rules.py:1391 msgid "Key down" msgstr "Taste gedrückt" -#: lib/solaar/ui/diversion_rules.py:1393 +#: lib/solaar/ui/diversion_rules.py:1394 msgid "Key up" msgstr "Taste losgelassen" -#: lib/solaar/ui/diversion_rules.py:1434 +#: lib/solaar/ui/diversion_rules.py:1435 msgid "" "Diverted key or button is currently down.\n" "Use the Key/Button Diversion and Divert G Keys settings to divert keys and " @@ -1403,59 +1416,59 @@ msgstr "" "Maustastenumleitungs- und G Tastenumleitungseinstellungen um Tasten sowie " "Maustasten umzuleiten." -#: lib/solaar/ui/diversion_rules.py:1473 +#: lib/solaar/ui/diversion_rules.py:1474 msgid "Test condition on notification triggering rule processing." msgstr "" -#: lib/solaar/ui/diversion_rules.py:1477 +#: lib/solaar/ui/diversion_rules.py:1478 msgid "Parameter" msgstr "Parameter" -#: lib/solaar/ui/diversion_rules.py:1540 +#: lib/solaar/ui/diversion_rules.py:1541 msgid "begin (inclusive)" msgstr "Anfang (inklusive)" -#: lib/solaar/ui/diversion_rules.py:1541 +#: lib/solaar/ui/diversion_rules.py:1542 msgid "end (exclusive)" msgstr "Ende (exklusive)" -#: lib/solaar/ui/diversion_rules.py:1550 +#: lib/solaar/ui/diversion_rules.py:1551 msgid "range" msgstr "Bereich" -#: lib/solaar/ui/diversion_rules.py:1552 +#: lib/solaar/ui/diversion_rules.py:1553 msgid "minimum" msgstr "Minimum" -#: lib/solaar/ui/diversion_rules.py:1553 +#: lib/solaar/ui/diversion_rules.py:1554 msgid "maximum" msgstr "Maximum" -#: lib/solaar/ui/diversion_rules.py:1555 +#: lib/solaar/ui/diversion_rules.py:1556 #, python-format msgid "bytes %(0)d to %(1)d, ranging from %(2)d to %(3)d" msgstr "Bytes %(0)d bis %(1)d, beginnend von %(2)d bis %(3)d" -#: lib/solaar/ui/diversion_rules.py:1560 +#: lib/solaar/ui/diversion_rules.py:1561 msgid "mask" msgstr "Maske" -#: lib/solaar/ui/diversion_rules.py:1561 +#: lib/solaar/ui/diversion_rules.py:1562 #, python-format msgid "bytes %(0)d to %(1)d, mask %(2)d" msgstr "Bytes %(0)d bis %(1)d, Maske %(2)d" -#: lib/solaar/ui/diversion_rules.py:1571 +#: lib/solaar/ui/diversion_rules.py:1572 msgid "" "Bit or range test on bytes in notification message triggering rule " "processing." msgstr "" -#: lib/solaar/ui/diversion_rules.py:1581 +#: lib/solaar/ui/diversion_rules.py:1582 msgid "type" msgstr "Typ" -#: lib/solaar/ui/diversion_rules.py:1664 +#: lib/solaar/ui/diversion_rules.py:1665 msgid "" "Mouse gesture with optional initiating button followed by zero or more mouse " "movements." @@ -1463,11 +1476,11 @@ msgstr "" "Mausgeste mit optionaler initiierender Maustaste gefolgt von keiner oder " "mehreren Bewegungen." -#: lib/solaar/ui/diversion_rules.py:1669 +#: lib/solaar/ui/diversion_rules.py:1670 msgid "Add movement" msgstr "Bewegung hinzufügen" -#: lib/solaar/ui/diversion_rules.py:1762 +#: lib/solaar/ui/diversion_rules.py:1763 msgid "" "Simulate a chorded key click or depress or release.\n" "On Wayland requires write access to /dev/uinput." @@ -1476,23 +1489,23 @@ msgstr "" "Taste.\n" "Benötigt unter Wayland Schreibzugriff auf /dev/uinput." -#: lib/solaar/ui/diversion_rules.py:1767 +#: lib/solaar/ui/diversion_rules.py:1768 msgid "Add key" msgstr "Weitere Taste hinzufügen" -#: lib/solaar/ui/diversion_rules.py:1770 +#: lib/solaar/ui/diversion_rules.py:1771 msgid "Click" msgstr "Linksklick" -#: lib/solaar/ui/diversion_rules.py:1773 +#: lib/solaar/ui/diversion_rules.py:1774 msgid "Depress" msgstr "Abgesenkt" -#: lib/solaar/ui/diversion_rules.py:1776 +#: lib/solaar/ui/diversion_rules.py:1777 msgid "Release" msgstr "Loslassen" -#: lib/solaar/ui/diversion_rules.py:1860 +#: lib/solaar/ui/diversion_rules.py:1861 msgid "" "Simulate a mouse scroll.\n" "On Wayland requires write access to /dev/uinput." @@ -1500,7 +1513,7 @@ msgstr "" "Simuliert eine Mausradbewegung. Benötigt unter Wayland Schreibzugriff auf /" "dev/uinput." -#: lib/solaar/ui/diversion_rules.py:1916 +#: lib/solaar/ui/diversion_rules.py:1917 msgid "" "Simulate a mouse click.\n" "On Wayland requires write access to /dev/uinput." @@ -1508,75 +1521,75 @@ msgstr "" "Simuliert einen Mausklick. Benötigt unter Wayland Schreibzugriff auf /dev/" "uinput." -#: lib/solaar/ui/diversion_rules.py:1919 +#: lib/solaar/ui/diversion_rules.py:1920 msgid "Button" msgstr "Maustaste" -#: lib/solaar/ui/diversion_rules.py:1920 +#: lib/solaar/ui/diversion_rules.py:1921 msgid "Count" msgstr "Klickanzahl" -#: lib/solaar/ui/diversion_rules.py:1960 +#: lib/solaar/ui/diversion_rules.py:1961 msgid "Execute a command with arguments." msgstr "Einen Befehl mit Parametern ausführen." -#: lib/solaar/ui/diversion_rules.py:1963 +#: lib/solaar/ui/diversion_rules.py:1964 msgid "Add argument" msgstr "Argument hinzufügen" -#: lib/solaar/ui/diversion_rules.py:2038 +#: lib/solaar/ui/diversion_rules.py:2039 msgid "Toggle" msgstr "Umschalten" -#: lib/solaar/ui/diversion_rules.py:2038 +#: lib/solaar/ui/diversion_rules.py:2039 msgid "True" msgstr "Wahr" -#: lib/solaar/ui/diversion_rules.py:2039 +#: lib/solaar/ui/diversion_rules.py:2040 msgid "False" msgstr "Falsch" -#: lib/solaar/ui/diversion_rules.py:2053 +#: lib/solaar/ui/diversion_rules.py:2054 msgid "Unsupported setting" msgstr "Nicht unterstützte Einstellung" -#: lib/solaar/ui/diversion_rules.py:2199 lib/solaar/ui/diversion_rules.py:2270 -msgid "Device" -msgstr "Gerät" - -#: lib/solaar/ui/diversion_rules.py:2204 lib/solaar/ui/diversion_rules.py:2236 -#: lib/solaar/ui/diversion_rules.py:2275 lib/solaar/ui/diversion_rules.py:2517 -#: lib/solaar/ui/diversion_rules.py:2535 +#: lib/solaar/ui/diversion_rules.py:2212 lib/solaar/ui/diversion_rules.py:2231 +#: lib/solaar/ui/diversion_rules.py:2286 lib/solaar/ui/diversion_rules.py:2528 +#: lib/solaar/ui/diversion_rules.py:2546 msgid "Originating device" msgstr "Quellgerät" -#: lib/solaar/ui/diversion_rules.py:2225 +#: lib/solaar/ui/diversion_rules.py:2245 msgid "Device is active and its settings can be changed." msgstr "Das Gerät ist aktiv und die Einstellungen können geändert werden." -#: lib/solaar/ui/diversion_rules.py:2294 +#: lib/solaar/ui/diversion_rules.py:2255 +msgid "Device originated the current notification." +msgstr "Die aktuelle Be­nach­rich­ti­gung entspringt dem Gerät." + +#: lib/solaar/ui/diversion_rules.py:2305 msgid "Value" msgstr "Wert" -#: lib/solaar/ui/diversion_rules.py:2302 +#: lib/solaar/ui/diversion_rules.py:2313 msgid "Item" -msgstr "" +msgstr "Item" -#: lib/solaar/ui/diversion_rules.py:2577 +#: lib/solaar/ui/diversion_rules.py:2588 msgid "Change setting on device" msgstr "Einstellung auf dem Gerät ändern" -#: lib/solaar/ui/diversion_rules.py:2594 +#: lib/solaar/ui/diversion_rules.py:2605 msgid "Setting on device" msgstr "Einstellung auf dem Gerät" -#: lib/solaar/ui/notify.py:124 lib/solaar/ui/tray.py:323 -#: lib/solaar/ui/tray.py:328 lib/solaar/ui/window.py:742 +#: lib/solaar/ui/notify.py:124 lib/solaar/ui/tray.py:320 +#: lib/solaar/ui/tray.py:325 lib/solaar/ui/window.py:739 msgid "offline" msgstr "offline" #: lib/solaar/ui/pair_window.py:122 lib/solaar/ui/pair_window.py:256 -#: lib/solaar/ui/pair_window.py:278 +#: lib/solaar/ui/pair_window.py:288 #, python-format msgid "%(receiver_name)s: pair new device" msgstr "%(receiver_name)s: neues Gerät koppeln" @@ -1641,22 +1654,40 @@ msgid "The wireless link is not encrypted" msgstr "Die drahtlose Verbindung ist nicht verschlüsselt" #: lib/solaar/ui/pair_window.py:264 +msgid "Unifying receivers are only compatible with Unifying devices." +msgstr "Unifying Empfänger sind nur mit Unifying Geräten kompatibel." + +#: lib/solaar/ui/pair_window.py:266 +msgid "Bolt receivers are only compatible with Bolt devices." +msgstr "Bolt Empfänger sind nur mit Bolt Geräten kompatibel." + +#: lib/solaar/ui/pair_window.py:268 +msgid "Other receivers are only compatible with a few devices." +msgstr "Andere Empfänger sind nur mit wenigen Geräten kompatibel." + +#: lib/solaar/ui/pair_window.py:270 +msgid "The device must not be paired with a nearby powered-on receiver." +msgstr "" +"Das Gerät darf nicht mit mit anderen, eingeschalteten Empfängern in der Nähe " +"gekoppelt sein." + +#: lib/solaar/ui/pair_window.py:274 msgid "Press a pairing button or key until the pairing light flashes quickly." msgstr "Drücke die Kopplungstaste bis das Kopplungslicht schnell blinkt." -#: lib/solaar/ui/pair_window.py:266 +#: lib/solaar/ui/pair_window.py:276 msgid "You may have to first turn the device off and on again." msgstr "Eventuell muss das Gerät dazu aus- und wieder eingeschaltet werden." -#: lib/solaar/ui/pair_window.py:268 +#: lib/solaar/ui/pair_window.py:278 msgid "Turn on the device you want to pair." msgstr "Schalten Sie das zu koppelnde Gerät ein." -#: lib/solaar/ui/pair_window.py:270 +#: lib/solaar/ui/pair_window.py:280 msgid "If the device is already turned on, turn it off and on again." msgstr "Falls das Gerät eingeschaltet ist, schalte es aus und wieder ein." -#: lib/solaar/ui/pair_window.py:273 +#: lib/solaar/ui/pair_window.py:283 #, python-format msgid "" "\n" @@ -1675,7 +1706,7 @@ msgstr[1] "" "\n" "Dieser Empfänger kann an %d weitere Geräte gekoppelt werden." -#: lib/solaar/ui/pair_window.py:276 +#: lib/solaar/ui/pair_window.py:286 msgid "" "\n" "Cancelling at this point will not use up a pairing." @@ -1687,115 +1718,115 @@ msgstr "" msgid "No Logitech device found" msgstr "Kein Logitechgerät gefunden" -#: lib/solaar/ui/tray.py:64 lib/solaar/ui/window.py:324 +#: lib/solaar/ui/tray.py:64 lib/solaar/ui/window.py:319 #, python-format msgid "About %s" msgstr "Info zu %s" -#: lib/solaar/ui/tray.py:65 lib/solaar/ui/window.py:322 +#: lib/solaar/ui/tray.py:65 lib/solaar/ui/window.py:317 #, python-format msgid "Quit %s" msgstr "%s beenden" -#: lib/solaar/ui/tray.py:302 lib/solaar/ui/tray.py:310 +#: lib/solaar/ui/tray.py:299 lib/solaar/ui/tray.py:307 msgid "no receiver" msgstr "kein Empfänger" -#: lib/solaar/ui/tray.py:326 +#: lib/solaar/ui/tray.py:323 msgid "no status" msgstr "kein Status" -#: lib/solaar/ui/window.py:101 +#: lib/solaar/ui/window.py:96 msgid "Scanning" msgstr "Scanne" -#: lib/solaar/ui/window.py:134 lib/solaar/ui/window.py:687 +#: lib/solaar/ui/window.py:129 msgid "Battery" msgstr "Akku" -#: lib/solaar/ui/window.py:137 +#: lib/solaar/ui/window.py:132 msgid "Wireless Link" msgstr "Drahtlose Verbindung" -#: lib/solaar/ui/window.py:141 +#: lib/solaar/ui/window.py:136 msgid "Lighting" msgstr "Beleuchtung" -#: lib/solaar/ui/window.py:175 +#: lib/solaar/ui/window.py:170 msgid "Show Technical Details" msgstr "Technische Details anzeigen" -#: lib/solaar/ui/window.py:191 +#: lib/solaar/ui/window.py:186 msgid "Pair new device" msgstr "Neues Gerät koppeln" -#: lib/solaar/ui/window.py:210 +#: lib/solaar/ui/window.py:205 msgid "Select a device" msgstr "Gerät auswählen" -#: lib/solaar/ui/window.py:327 +#: lib/solaar/ui/window.py:322 msgid "Rule Editor" msgstr "Regeln bearbeiten" -#: lib/solaar/ui/window.py:538 +#: lib/solaar/ui/window.py:533 msgid "Path" msgstr "Pfad" -#: lib/solaar/ui/window.py:541 +#: lib/solaar/ui/window.py:536 msgid "USB ID" msgstr "USB-ID" -#: lib/solaar/ui/window.py:544 lib/solaar/ui/window.py:546 -#: lib/solaar/ui/window.py:566 lib/solaar/ui/window.py:568 +#: 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 "Seriennummer" -#: lib/solaar/ui/window.py:550 +#: lib/solaar/ui/window.py:545 msgid "Index" msgstr "Index" -#: lib/solaar/ui/window.py:552 +#: lib/solaar/ui/window.py:547 msgid "Wireless PID" msgstr "Wireless PID" -#: lib/solaar/ui/window.py:554 +#: lib/solaar/ui/window.py:549 msgid "Product ID" msgstr "Produkt-ID" -#: lib/solaar/ui/window.py:556 +#: lib/solaar/ui/window.py:551 msgid "Protocol" msgstr "Protokoll" -#: lib/solaar/ui/window.py:556 +#: lib/solaar/ui/window.py:551 msgid "Unknown" msgstr "Unbekannt" -#: lib/solaar/ui/window.py:559 +#: lib/solaar/ui/window.py:554 #, python-format msgid "%(rate)d ms (%(rate_hz)dHz)" msgstr "%(rate)d ms (%(rate_hz)dHz)" -#: lib/solaar/ui/window.py:559 +#: lib/solaar/ui/window.py:554 msgid "Polling rate" msgstr "Abfragerate" -#: lib/solaar/ui/window.py:570 +#: lib/solaar/ui/window.py:565 msgid "Unit ID" msgstr "Geräte ID" -#: lib/solaar/ui/window.py:581 +#: lib/solaar/ui/window.py:576 msgid "none" msgstr "keine" -#: lib/solaar/ui/window.py:582 +#: lib/solaar/ui/window.py:577 msgid "Notifications" msgstr "Mitteilungen" -#: lib/solaar/ui/window.py:619 +#: lib/solaar/ui/window.py:621 msgid "No device paired." msgstr "Kein Gerät gekoppelt." -#: lib/solaar/ui/window.py:626 +#: lib/solaar/ui/window.py:628 #, 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." @@ -1803,53 +1834,55 @@ msgstr[0] "Nur %(max_count)s Gerät kann an diesen Empfänger gekoppelt werden." msgstr[1] "" "Bis zu %(max_count)s Geräte können an diesen Empfänger gekoppelt werden." -#: lib/solaar/ui/window.py:632 +#: lib/solaar/ui/window.py:634 msgid "Only one device can be paired to this receiver." msgstr "An diesen Empfänger kann nur ein Gerät gekoppelt werden." -#: lib/solaar/ui/window.py:636 +#: 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] "Dieser Empfänger kann an %d weiteres Gerät gekoppelt werden." msgstr[1] "Dieser Empfänger kann an %d weitere Geräte gekoppelt werden." -#: lib/solaar/ui/window.py:688 -msgid "unknown" -msgstr "unbekannt" - -#: lib/solaar/ui/window.py:689 -msgid "Battery information unknown." -msgstr "Akkuzustand unbekannt." - -#: lib/solaar/ui/window.py:699 +#: lib/solaar/ui/window.py:692 msgid "Battery Voltage" msgstr "Akkuspannung" -#: lib/solaar/ui/window.py:701 +#: lib/solaar/ui/window.py:694 msgid "Voltage reported by battery" msgstr "Spannung, die vom Akku gemeldet wird" -#: lib/solaar/ui/window.py:703 +#: lib/solaar/ui/window.py:696 msgid "Battery Level" msgstr "Akkuladung" -#: lib/solaar/ui/window.py:705 +#: lib/solaar/ui/window.py:698 msgid "Approximate level reported by battery" msgstr "Ungefährer Ladezustand des Akkus, den das Gerät meldet" -#: lib/solaar/ui/window.py:712 lib/solaar/ui/window.py:714 +#: lib/solaar/ui/window.py:705 lib/solaar/ui/window.py:707 msgid "next reported " msgstr "nächste Meldung bei " -#: lib/solaar/ui/window.py:715 +#: lib/solaar/ui/window.py:708 msgid " and next level to be reported." msgstr " und der nächste, der vom Gerät mitgeteilt werden wird." -#: lib/solaar/ui/window.py:720 +#: lib/solaar/ui/window.py:713 msgid "last known" msgstr "letzte bekannte" +#: lib/solaar/ui/window.py:724 +msgid "encrypted" +msgstr "verschlüsselt" + +#: lib/solaar/ui/window.py:726 +msgid "The wireless link between this device and its receiver is encrypted." +msgstr "" +"Die drahtlose Verbindung zwischen diesem Gerät und dem Empfänger ist " +"verschlüsselt." + #: lib/solaar/ui/window.py:728 msgid "not encrypted" msgstr "nicht verschlüsselt" @@ -1865,17 +1898,7 @@ msgstr "" "Dies ist ein Sicherheitsproblem für Zeigegeräte, aber ein großes " "Sicherheitsrisiko für Texteingabegeräte." -#: lib/solaar/ui/window.py:737 -msgid "encrypted" -msgstr "verschlüsselt" - -#: lib/solaar/ui/window.py:739 -msgid "The wireless link between this device and its receiver is encrypted." -msgstr "" -"Die drahtlose Verbindung zwischen diesem Gerät und dem Empfänger ist " -"verschlüsselt." - -#: lib/solaar/ui/window.py:752 +#: lib/solaar/ui/window.py:748 #, python-format msgid "%(light_level)d lux" msgstr "%(light_level)d Lux" @@ -1900,6 +1923,9 @@ msgstr "%(light_level)d Lux" #~ "Passe die DPI an durch horizontale Mausbewegung bei gleichzeitig " #~ "gedrückter Taste." +#~ msgid "Battery information unknown." +#~ msgstr "Akkuzustand unbekannt." + #~ msgid "Click to allow changes." #~ msgstr "Anklicken, um Änderungen zuzulassen." @@ -2000,5 +2026,8 @@ msgstr "%(light_level)d Lux" #~ msgid "top" #~ msgstr "oben" +#~ msgid "unknown" +#~ msgstr "unbekannt" + #~ msgid "width" #~ msgstr "Breite" diff --git a/po/fr.po b/po/fr.po index caf5f9f8d..a16a9a108 100644 --- a/po/fr.po +++ b/po/fr.po @@ -3,1439 +3,1916 @@ # This file is distributed under the same license as the solaar package. # Automatically generated, 2013. # -msgid "" -msgstr "Project-Id-Version: solaar 1.1.8\n" - "Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2021-09-25 13:56-0400\n" - "PO-Revision-Date: 2022-12-18 07:19+0100\n" - "Last-Translator: David Geiger \n" - "Language-Team: Language: fr\n" - "Language: fr\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" - "Plural-Forms: nplurals=2; plural=(n > 1);\n" - "X-Generator: Poedit 3.2.2\n" - -#: lib/logitech_receiver/base_usb.py:50 -msgid "Unifying Receiver" -msgstr "Récepteur Unifying" - -#: lib/logitech_receiver/base_usb.py:58 lib/logitech_receiver/base_usb.py:68 -#: lib/logitech_receiver/base_usb.py:79 lib/logitech_receiver/base_usb.py:90 -#: lib/logitech_receiver/base_usb.py:101 -msgid "Nano Receiver" -msgstr "Récepteur Nano" - -#: lib/logitech_receiver/base_usb.py:109 -msgid "Lightspeed Receiver" -msgstr "Récepteur Lightspeed" - -#: lib/logitech_receiver/base_usb.py:117 -msgid "EX100 Receiver 27 Mhz" -msgstr "Récepteur EX100 27 Mhz" - -#: lib/logitech_receiver/device.py:133 lib/solaar/ui/window.py:693 -msgid "unknown" -msgstr "inconnu" +msgid "" +msgstr "" +"Project-Id-Version: solaar 1.1.10\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-25 06:09+0200\n" +"PO-Revision-Date: 2023-09-25 18:51+0200\n" +"Last-Translator: David Geiger \n" +"Language-Team: Language: fr\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.3.2\n" + +#: lib/logitech_receiver/base_usb.py:46 +msgid "Bolt Receiver" +msgstr "Récepteur Bolt" + +#: lib/logitech_receiver/base_usb.py:57 +msgid "Unifying Receiver" +msgstr "Récepteur Unifying" + +#: 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 "Récepteur Nano" + +#: lib/logitech_receiver/base_usb.py:124 +msgid "Lightspeed Receiver" +msgstr "Récepteur Lightspeed" + +#: lib/logitech_receiver/base_usb.py:133 +msgid "EX100 Receiver 27 Mhz" +msgstr "Récepteur EX100 27 Mhz" + +#: lib/logitech_receiver/i18n.py:30 +msgid "empty" +msgstr "vide" + +#: lib/logitech_receiver/i18n.py:31 +msgid "critical" +msgstr "critique" + +#: lib/logitech_receiver/i18n.py:32 +msgid "low" +msgstr "faible" + +#: lib/logitech_receiver/i18n.py:33 +msgid "average" +msgstr "moyenne" + +#: lib/logitech_receiver/i18n.py:34 +msgid "good" +msgstr "bonne" + +#: lib/logitech_receiver/i18n.py:35 +msgid "full" +msgstr "pleine" #: lib/logitech_receiver/i18n.py:38 -msgid "empty" -msgstr "vide" +msgid "discharging" +msgstr "En décharge" #: lib/logitech_receiver/i18n.py:39 -msgid "critical" -msgstr "critique" +msgid "recharging" +msgstr "En charge" -#: lib/logitech_receiver/i18n.py:40 -msgid "low" -msgstr "faible" +#: lib/logitech_receiver/i18n.py:40 lib/solaar/ui/window.py:711 +msgid "charging" +msgstr "en charge" #: lib/logitech_receiver/i18n.py:41 -msgid "average" -msgstr "moyenne" +msgid "not charging" +msgstr "pas en charge" #: lib/logitech_receiver/i18n.py:42 -msgid "good" -msgstr "bonne" +msgid "almost full" +msgstr "presque pleine" #: lib/logitech_receiver/i18n.py:43 -msgid "full" -msgstr "pleine" +msgid "charged" +msgstr "chargée" + +#: lib/logitech_receiver/i18n.py:44 +msgid "slow recharge" +msgstr "recharge lente" + +#: lib/logitech_receiver/i18n.py:45 +msgid "invalid battery" +msgstr "batterie invalide" #: lib/logitech_receiver/i18n.py:46 -msgid "discharging" -msgstr "En décharge" +msgid "thermal error" +msgstr "erreur thermique" #: lib/logitech_receiver/i18n.py:47 -msgid "recharging" -msgstr "En charge" +msgid "error" +msgstr "erreur" -#: lib/logitech_receiver/i18n.py:48 lib/solaar/ui/window.py:721 -msgid "charging" -msgstr "en charge" +#: lib/logitech_receiver/i18n.py:48 +msgid "standard" +msgstr "standard" #: lib/logitech_receiver/i18n.py:49 -msgid "not charging" -msgstr "pas en charge" +msgid "fast" +msgstr "rapide" #: lib/logitech_receiver/i18n.py:50 -msgid "almost full" -msgstr "presque pleine" - -#: lib/logitech_receiver/i18n.py:51 -msgid "charged" -msgstr "chargée" - -#: lib/logitech_receiver/i18n.py:52 -msgid "slow recharge" -msgstr "recharge lente" +msgid "slow" +msgstr "lente" #: lib/logitech_receiver/i18n.py:53 -msgid "invalid battery" -msgstr "batterie invalide" +msgid "device timeout" +msgstr "le périphérique ne répond pas" #: lib/logitech_receiver/i18n.py:54 -msgid "thermal error" -msgstr "erreur thermique" +msgid "device not supported" +msgstr "périphérique non pris en charge" #: lib/logitech_receiver/i18n.py:55 -msgid "error" -msgstr "erreur" +msgid "too many devices" +msgstr "trop de périphériques" #: lib/logitech_receiver/i18n.py:56 -msgid "standard" -msgstr "standard" +msgid "sequence timeout" +msgstr "délai dépassé" -#: lib/logitech_receiver/i18n.py:57 -msgid "fast" -msgstr "rapide" +#: lib/logitech_receiver/i18n.py:59 lib/solaar/ui/window.py:572 +msgid "Firmware" +msgstr "Micrologiciel" -#: lib/logitech_receiver/i18n.py:58 -msgid "slow" -msgstr "lente" +#: lib/logitech_receiver/i18n.py:60 +msgid "Bootloader" +msgstr "Chargeur d'amorçage" #: lib/logitech_receiver/i18n.py:61 -msgid "device timeout" -msgstr "le périphérique ne répond pas" +msgid "Hardware" +msgstr "Matériel" #: lib/logitech_receiver/i18n.py:62 -msgid "device not supported" -msgstr "périphérique non pris en charge" +msgid "Other" +msgstr "Autre" -#: lib/logitech_receiver/i18n.py:63 -msgid "too many devices" -msgstr "trop de périphériques" +#: lib/logitech_receiver/i18n.py:65 +msgid "Left Button" +msgstr "Bouton gauche" -#: lib/logitech_receiver/i18n.py:64 -msgid "sequence timeout" -msgstr "délai dépassé" +#: lib/logitech_receiver/i18n.py:66 +msgid "Right Button" +msgstr "Bouton droit" -#: lib/logitech_receiver/i18n.py:67 lib/solaar/ui/window.py:580 -msgid "Firmware" -msgstr "Micrologiciel" +#: lib/logitech_receiver/i18n.py:67 +msgid "Middle Button" +msgstr "Bouton central" #: lib/logitech_receiver/i18n.py:68 -msgid "Bootloader" -msgstr "Chargeur d'amorçage" +msgid "Back Button" +msgstr "Bouton retour" #: lib/logitech_receiver/i18n.py:69 -msgid "Hardware" -msgstr "Matériel" +msgid "Forward Button" +msgstr "Bouton avant" #: lib/logitech_receiver/i18n.py:70 -msgid "Other" -msgstr "Autre" +msgid "Mouse Gesture Button" +msgstr "Bouton gestuel de la souris" + +#: lib/logitech_receiver/i18n.py:71 +msgid "Smart Shift" +msgstr "Changement intelligent" + +#: lib/logitech_receiver/i18n.py:72 +msgid "DPI Switch" +msgstr "Commutateur DPI" #: lib/logitech_receiver/i18n.py:73 -msgid "Left Button" -msgstr "Bouton gauche" +msgid "Left Tilt" +msgstr "Inclinaison à gauche" #: lib/logitech_receiver/i18n.py:74 -msgid "Right Button" -msgstr "Bouton droit" +msgid "Right Tilt" +msgstr "Inclinaison à droite" #: lib/logitech_receiver/i18n.py:75 -msgid "Middle Button" -msgstr "Bouton central" +msgid "Left Click" +msgstr "Clic gauche" #: lib/logitech_receiver/i18n.py:76 -msgid "Back Button" -msgstr "Bouton retour" +msgid "Right Click" +msgstr "Clic droit" #: lib/logitech_receiver/i18n.py:77 -msgid "Forward Button" -msgstr "Bouton avant" +msgid "Mouse Middle Button" +msgstr "Bouton central de la souris" #: lib/logitech_receiver/i18n.py:78 -msgid "Mouse Gesture Button" -msgstr "Bouton gestuel de la souris" +msgid "Mouse Back Button" +msgstr "Bouton de retour de la souris" #: lib/logitech_receiver/i18n.py:79 -msgid "Smart Shift" -msgstr "Changement intelligent" +msgid "Mouse Forward Button" +msgstr "Bouton avant de la souris" #: lib/logitech_receiver/i18n.py:80 -msgid "DPI Switch" -msgstr "Commutateur DPI" +msgid "Gesture Button Navigation" +msgstr "Navigation par bouton de gestuelle" #: lib/logitech_receiver/i18n.py:81 -msgid "Left Tilt" -msgstr "Inclinaison à gauche" +msgid "Mouse Scroll Left Button" +msgstr "Bouton de défilement vers la gauche de la souris" #: lib/logitech_receiver/i18n.py:82 -msgid "Right Tilt" -msgstr "Inclinaison à droite" - -#: lib/logitech_receiver/i18n.py:83 -msgid "Left Click" -msgstr "Clic gauche" - -#: lib/logitech_receiver/i18n.py:84 -msgid "Right Click" -msgstr "Clic droit" +msgid "Mouse Scroll Right Button" +msgstr "Bouton de défilement vers la droite de la souris" #: lib/logitech_receiver/i18n.py:85 -msgid "Mouse Middle Button" -msgstr "Bouton central de la souris" +msgid "pressed" +msgstr "pressé" #: lib/logitech_receiver/i18n.py:86 -msgid "Mouse Back Button" -msgstr "Bouton de retour de la souris" - -#: lib/logitech_receiver/i18n.py:87 -msgid "Mouse Forward Button" -msgstr "Bouton avant de la souris" - -#: lib/logitech_receiver/i18n.py:88 -msgid "Gesture Button Navigation" -msgstr "Navigation par bouton de gestuelle" - -#: lib/logitech_receiver/i18n.py:89 -msgid "Mouse Scroll Left Button" -msgstr "Bouton de défilement vers la gauche de la souris" - -#: lib/logitech_receiver/i18n.py:90 -msgid "Mouse Scroll Right Button" -msgstr "Bouton de défilement vers la droite de la souris" - -#: lib/logitech_receiver/i18n.py:93 -msgid "pressed" -msgstr "pressé" - -#: lib/logitech_receiver/i18n.py:94 -msgid "released" -msgstr "relâché" - -#: lib/logitech_receiver/notifications.py:76 -msgid "pairing lock is closed" -msgstr "le verrou de jumelage est fermé" - -#: lib/logitech_receiver/notifications.py:76 -msgid "pairing lock is open" -msgstr "le verrou de jumelage est ouvert" - -#: lib/logitech_receiver/notifications.py:160 lib/solaar/ui/notify.py:123 -msgid "connected" -msgstr "connecté" - -#: lib/logitech_receiver/notifications.py:160 -msgid "disconnected" -msgstr "déconnecté" - -#: lib/logitech_receiver/notifications.py:198 lib/solaar/ui/notify.py:121 -msgid "unpaired" -msgstr "non jumelé" - -#: lib/logitech_receiver/notifications.py:248 -msgid "powered on" -msgstr "sous tension" - -#: lib/logitech_receiver/settings.py:526 -msgid "register" -msgstr "registre" - -#: lib/logitech_receiver/settings.py:542 lib/logitech_receiver/settings.py:568 -msgid "feature" -msgstr "fonctionnalité" - -#: lib/logitech_receiver/settings_templates.py:71 -msgid "Hand Detection" -msgstr "Détection manuelle" - -#: lib/logitech_receiver/settings_templates.py:71 -msgid "Turn on illumination when the hands hover over the keyboard." -msgstr "Allume l'éclairage lorsque les mains passent au-dessus du clavier." - -#: lib/logitech_receiver/settings_templates.py:72 -msgid "Scroll Wheel Smooth Scrolling" -msgstr "Défilement fluide à la mollette" - -#: lib/logitech_receiver/settings_templates.py:73 -#: lib/logitech_receiver/settings_templates.py:78 -#: lib/logitech_receiver/settings_templates.py:85 -msgid "High-sensitivity mode for vertical scroll with the wheel." -msgstr "Mode haute sensibilité pour défilement vertical avec la roulette." - -#: lib/logitech_receiver/settings_templates.py:74 -msgid "Side Scrolling" -msgstr "Défilement latéral" - -#: lib/logitech_receiver/settings_templates.py:75 -msgid "When disabled, pushing the wheel sideways sends custom button " - "events\n" - "instead of the standard side-scrolling events." -msgstr "Lorsque désactivé, l'appui sur les côtés de la roulette envoie des " - "évènements\n" - " de bouton personnalisés à la place des évènements standards de " - "défilement latéral." - -#: lib/logitech_receiver/settings_templates.py:77 -msgid "Scroll Wheel High Resolution" -msgstr "Mollette haute résolution" - -#: lib/logitech_receiver/settings_templates.py:79 -msgid "Scroll Wheel Diversion" -msgstr "Affectation de la molette" - -#: lib/logitech_receiver/settings_templates.py:80 -msgid "HID++ mode for vertical scroll with the wheel." -msgstr "Mode HID++ pour défilement vertical avec la roulette." - -#: lib/logitech_receiver/settings_templates.py:81 -msgid "Effectively turns off wheel scrolling in Linux." -msgstr "Désactive efficacement le défilement de la roulette sous Linux." - -#: lib/logitech_receiver/settings_templates.py:82 -msgid "Scroll Wheel Direction" -msgstr "Direction de la mollette" - -#: lib/logitech_receiver/settings_templates.py:83 -msgid "Invert direction for vertical scroll with wheel." -msgstr "Direction inversée pour le défilement vertical avec la mollette." - -#: lib/logitech_receiver/settings_templates.py:84 -msgid "Scroll Wheel Resolution" -msgstr "Résolution de la mollette" - -#: lib/logitech_receiver/settings_templates.py:86 -msgid "Frequency of device polling, in milliseconds" -msgstr "Fréquence de scrutation du périphérique, en millisecondes" - -#: lib/logitech_receiver/settings_templates.py:86 -msgid "Polling Rate (ms)" -msgstr "Taux de scrutation (ms)" - -#: lib/logitech_receiver/settings_templates.py:87 -msgid "Swap Fx function" -msgstr "Fonction Swap Fx" - -#: lib/logitech_receiver/settings_templates.py:88 -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 "Lorsque défini, les touches F1..F12 activeront leurs fonctions " - "spéciales,\n" - "et vous devez maintenir la touche FN pour activer leurs fonctions " - "standards." - -#: lib/logitech_receiver/settings_templates.py:90 -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 "Lorsque non défini, les touches F1..F12 activeront leurs fonctions " - "standards,\n" - "et vous devez maintenir la touche FN pour activer leurs fonctions " - "spéciales." - -#: lib/logitech_receiver/settings_templates.py:92 -msgid "Mouse movement sensitivity" -msgstr "Sensibilité du mouvement de la souris" - -#: lib/logitech_receiver/settings_templates.py:92 -msgid "Sensitivity (DPI)" -msgstr "Sensibilité (DPI)" - -#: lib/logitech_receiver/settings_templates.py:93 -msgid "Sensitivity (Pointer Speed)" -msgstr "Sensibilité (vitesse du pointeur)" - -#: lib/logitech_receiver/settings_templates.py:94 -msgid "Speed multiplier for mouse (256 is normal multiplier)." -msgstr "Multiplicateur de vitesse pour la souris (256 est le multiplicateur " - "normal)." - -#: lib/logitech_receiver/settings_templates.py:95 -msgid "Scroll Wheel Rachet" -msgstr "Molette mode cliquet" - -#: lib/logitech_receiver/settings_templates.py:96 -msgid "Automatically switch the mouse wheel between ratchet and freespin " - "mode.\n" - "The mouse wheel is always free at 0, and always ratcheted at 50" -msgstr "Commutation automatique entre les modes cliquet et roue libre de la " - "mollette.\n" - "La mollette est toujours en roue libre à 0, et toujours en mode " - "cliquet à 50" - -#: lib/logitech_receiver/settings_templates.py:98 -msgid "Backlight" -msgstr "Rétroéclairage" - -#: lib/logitech_receiver/settings_templates.py:98 -msgid "Turn illumination on or off on keyboard." -msgstr "Activez ou désactivez l'éclairage sur le clavier." - -#: lib/logitech_receiver/settings_templates.py:99 -msgid "Key/Button Actions" -msgstr "Actions des boutons" - -#: lib/logitech_receiver/settings_templates.py:100 -msgid "Change the action for the key or button." -msgstr "Modifiez l'action pour la touche ou pour le bouton." - -#: lib/logitech_receiver/settings_templates.py:101 -msgid "Changing important actions (such as for the left mouse button) can " - "result in an unusable system." -msgstr "La modification d'importantes actions (comme le bouton gauche de la " - "souris) pourrait rendre le système inutilisable." - -#: lib/logitech_receiver/settings_templates.py:102 -msgid "Key/Button Diversion" -msgstr "Affectation des boutons" - -#: lib/logitech_receiver/settings_templates.py:103 -msgid "Make the key or button send HID++ notifications (which trigger " - "Solaar rules but are otherwise ignored)." -msgstr "Le bouton envoie des notifications HID++ (qui déclenchent des règles " - "Solaar mais qui sont ignorées autrement)." - -#: lib/logitech_receiver/settings_templates.py:104 -msgid "Disable keys" -msgstr "Désactiver les touches" - -#: lib/logitech_receiver/settings_templates.py:104 -msgid "Disable specific keyboard keys." -msgstr "Désactiver des touches spécifiques du clavier." - -#: lib/logitech_receiver/settings_templates.py:105 -msgid "Change keys to match OS." -msgstr "Modifier les touches pour correspondre au système d'exploitation." - -#: lib/logitech_receiver/settings_templates.py:105 -msgid "Set OS" -msgstr "Définir le système d'exploitation" - -#: lib/logitech_receiver/settings_templates.py:106 -msgid "Change Host" -msgstr "Changer d'hôte" - -#: lib/logitech_receiver/settings_templates.py:106 -msgid "Switch connection to a different host" -msgstr "Commuter la connexion vers un autre hôte" - -#: lib/logitech_receiver/settings_templates.py:107 -msgid "Thumb Wheel Diversion" -msgstr "Affectation de la molette de pouce" - -#: lib/logitech_receiver/settings_templates.py:108 -msgid "HID++ mode for horizontal scroll with the thumb wheel." -msgstr "Mode HID++ pour le défilement horizontal avec la molette de pouce." - -#: lib/logitech_receiver/settings_templates.py:109 -msgid "Effectively turns off thumb scrolling in Linux." -msgstr "Désactive efficacement le défilement de la molette de pouce sous " - "Linux." - -#: lib/logitech_receiver/settings_templates.py:110 -msgid "Invert thumb wheel scroll direction." -msgstr "Inverser la direction du défilement de la molette de pouce." - -#: lib/logitech_receiver/settings_templates.py:110 -msgid "Thumb Wheel Direction" -msgstr "Direction de la molette de pouce" - -#: lib/logitech_receiver/settings_templates.py:111 -msgid "Gestures" -msgstr "Gestes" - -#: lib/logitech_receiver/settings_templates.py:111 -msgid "Tweak the mouse/touchpad behaviour." -msgstr "Personnaliser le comportement de la souris ou du pavé tactile." - -#: lib/logitech_receiver/settings_templates.py:112 -msgid "Change numerical parameters of a mouse/touchpad." -msgstr "Changer les paramètres numérique de la souris/du pavé tactile." - -#: lib/logitech_receiver/settings_templates.py:112 -msgid "Gesture params" -msgstr "Paramètres des Gestes" - -#: lib/logitech_receiver/settings_templates.py:113 -msgid "DPI Sliding Adjustment" -msgstr "Curseur de réglage du DPI" - -#: lib/logitech_receiver/settings_templates.py:114 -msgid "Adjust the DPI by sliding the mouse horizontally while holding the " - "button down." -msgstr "Régler le DPI en faisant glisser la souris horizontalement tout en " - "maintenant le bouton enfoncé." - -#: lib/logitech_receiver/settings_templates.py:115 -msgid "Mouse Gestures" -msgstr "Gestes à la souris" - -#: lib/logitech_receiver/settings_templates.py:116 -msgid "Send a gesture by sliding the mouse while holding the button down." -msgstr "Faire un geste en faisant glisser la souris tout en maintenant le bouton enfoncé." - -#: lib/logitech_receiver/settings_templates.py:117 -msgid "Divert crown events" -msgstr "Définir les évènements de la couronne" - -#: lib/logitech_receiver/settings_templates.py:118 -msgid "Make crown send CROWN HID++ notifications (which trigger Solaar " - "rules but are otherwise ignored)." -msgstr "La couronne envoie des notifications CROWN HID++ (qui déclenchent " - "des règles Solaar mais qui sont ignorées autrement)." - -#: lib/logitech_receiver/settings_templates.py:119 -msgid "Divert G Keys" -msgstr "Définir les touches G" - -#: lib/logitech_receiver/settings_templates.py:120 -msgid "Make G keys send GKEY HID++ notifications (which trigger Solaar " - "rules but are otherwise ignored)." -msgstr "Les touches G envoyent des notifications GKEY HID++ (qui " - "déclenchent des règles Solaar mais qui sont ignorées autrement)." - -#: lib/logitech_receiver/settings_templates.py:123 -msgid "Performs a left click." -msgstr "Réalise un clic gauche." - -#: lib/logitech_receiver/settings_templates.py:123 -msgid "Single tap" -msgstr "Une tape simple" - -#: lib/logitech_receiver/settings_templates.py:124 -msgid "Performs a right click." -msgstr "Réalise un clic droit." - -#: lib/logitech_receiver/settings_templates.py:124 -msgid "Single tap with two fingers" -msgstr "Une tape simple avec deux doigts" - -#: lib/logitech_receiver/settings_templates.py:125 -msgid "Single tap with three fingers" -msgstr "Une tape simple avec trois doigts" - -#: lib/logitech_receiver/settings_templates.py:129 -msgid "Double tap" -msgstr "Une double tape" - -#: lib/logitech_receiver/settings_templates.py:129 -msgid "Performs a double click." -msgstr "Réalise un double clic." - -#: lib/logitech_receiver/settings_templates.py:130 -msgid "Double tap with two fingers" -msgstr "Une double tape avec deux doigts" - -#: lib/logitech_receiver/settings_templates.py:131 -msgid "Double tap with three fingers" -msgstr "Une double tape avec trois doigts" - -#: lib/logitech_receiver/settings_templates.py:134 -msgid "Drags items by dragging the finger after double tapping." -msgstr "Déplace des items en faisant glisser le doigt après la double tape." - -#: lib/logitech_receiver/settings_templates.py:134 -msgid "Tap and drag" -msgstr "Taper-glisser" - -#: lib/logitech_receiver/settings_templates.py:135 -msgid "Tap and drag with two fingers" -msgstr "Taper-glisser avec deux doigts" - -#: lib/logitech_receiver/settings_templates.py:136 -msgid "Drags items by dragging the fingers after double tapping." -msgstr "Déplace des items en faisant glisser les doigts après la double tape." - -#: lib/logitech_receiver/settings_templates.py:137 -msgid "Tap and drag with three fingers" -msgstr "Taper-glisser avec trois doigts" +msgid "released" +msgstr "relâché" -#: lib/logitech_receiver/settings_templates.py:139 -msgid "Suppress tap and edge gestures" -msgstr "Supprimer les tapes et les gestes" +#: lib/logitech_receiver/notifications.py:75 +#: lib/logitech_receiver/notifications.py:126 +msgid "pairing lock is closed" +msgstr "le verrou de jumelage est fermé" -#: lib/logitech_receiver/settings_templates.py:140 -msgid "Disables tap and edge gestures (equivalent to pressing Fn+LeftClick)." -msgstr "Désactive les tapes et les gestes de bords (équivaut à presser Fn" - "+ClicGauche)." +#: lib/logitech_receiver/notifications.py:75 +#: lib/logitech_receiver/notifications.py:126 +msgid "pairing lock is open" +msgstr "le verrou de jumelage est ouvert" -#: lib/logitech_receiver/settings_templates.py:141 -msgid "Scroll with one finger" -msgstr "Défilement à un doigt" +#: lib/logitech_receiver/notifications.py:92 +msgid "discovery lock is closed" +msgstr "le verrou de détection est fermé" -#: lib/logitech_receiver/settings_templates.py:141 -#: lib/logitech_receiver/settings_templates.py:142 -#: lib/logitech_receiver/settings_templates.py:145 -msgid "Scrolls." -msgstr "Défilements." +#: lib/logitech_receiver/notifications.py:92 +msgid "discovery lock is open" +msgstr "le verrou de détection est ouvert" -#: lib/logitech_receiver/settings_templates.py:142 -#: lib/logitech_receiver/settings_templates.py:145 -msgid "Scroll with two fingers" -msgstr "Défilement à deux doigts" +#: lib/logitech_receiver/notifications.py:224 lib/solaar/ui/notify.py:122 +msgid "connected" +msgstr "connecté" -#: lib/logitech_receiver/settings_templates.py:143 -msgid "Scroll horizontally with two fingers" -msgstr "Défilement horizontal à deux doigts" +#: lib/logitech_receiver/notifications.py:224 +msgid "disconnected" +msgstr "déconnecté" -#: lib/logitech_receiver/settings_templates.py:143 -msgid "Scrolls horizontally." -msgstr "Défile horizontalement." +#: lib/logitech_receiver/notifications.py:262 lib/solaar/ui/notify.py:120 +msgid "unpaired" +msgstr "non jumelé" -#: lib/logitech_receiver/settings_templates.py:144 -msgid "Scroll vertically with two fingers" -msgstr "Défilement vertical à deux doigts" +#: lib/logitech_receiver/notifications.py:304 +msgid "powered on" +msgstr "sous tension" -#: lib/logitech_receiver/settings_templates.py:144 -msgid "Scrolls vertically." -msgstr "Défile verticalement." +#: lib/logitech_receiver/settings.py:750 +msgid "register" +msgstr "registre" -#: lib/logitech_receiver/settings_templates.py:146 -msgid "Inverts the scrolling direction." -msgstr "Inverse la direction de défilement." +#: lib/logitech_receiver/settings.py:764 lib/logitech_receiver/settings.py:791 +msgid "feature" +msgstr "fonctionnalité" -#: lib/logitech_receiver/settings_templates.py:146 -msgid "Natural scrolling" -msgstr "Défilement naturel" +#: lib/logitech_receiver/settings_templates.py:139 +msgid "Swap Fx function" +msgstr "Fonction Swap Fx" -#: lib/logitech_receiver/settings_templates.py:147 -msgid "Enables the thumbwheel." -msgstr "Active la molette de pouce." +#: 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 "" +"Lorsque défini, les touches F1..F12 activeront leurs fonctions spéciales,\n" +"et vous devez maintenir la touche FN pour activer leurs fonctions standards." -#: lib/logitech_receiver/settings_templates.py:147 -msgid "Thumbwheel" -msgstr "Molette de pouce" +#: 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 "" +"Lorsque non défini, les touches F1..F12 activeront leurs fonctions " +"standards,\n" +"et vous devez maintenir la touche FN pour activer leurs fonctions spéciales." + +#: lib/logitech_receiver/settings_templates.py:149 +msgid "Hand Detection" +msgstr "Détection manuelle" + +#: lib/logitech_receiver/settings_templates.py:150 +msgid "Turn on illumination when the hands hover over the keyboard." +msgstr "Allume l'éclairage lorsque les mains passent au-dessus du clavier." + +#: lib/logitech_receiver/settings_templates.py:157 +msgid "Scroll Wheel Smooth Scrolling" +msgstr "Défilement fluide à la molette" #: lib/logitech_receiver/settings_templates.py:158 -#: lib/logitech_receiver/settings_templates.py:162 -msgid "Swipe from the top edge" -msgstr "Glissement depuis le bord supérieur" - -#: lib/logitech_receiver/settings_templates.py:159 -msgid "Swipe from the left edge" -msgstr "Glissement depuis le bord gauche" - -#: lib/logitech_receiver/settings_templates.py:160 -msgid "Swipe from the right edge" -msgstr "Glissement depuis le bord droit" - -#: lib/logitech_receiver/settings_templates.py:161 -msgid "Swipe from the bottom edge" -msgstr "Glissement depuis le bord inférieur" - -#: lib/logitech_receiver/settings_templates.py:163 -msgid "Swipe two fingers from the left edge" -msgstr "Glissement à deux doigts depuis le bord gauche" - -#: lib/logitech_receiver/settings_templates.py:164 -msgid "Swipe two fingers from the right edge" -msgstr "Glissement à deux doigts depuis le bord droit" +#: 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 "Mode haute sensibilité pour défilement vertical avec la roulette." #: lib/logitech_receiver/settings_templates.py:165 -msgid "Swipe two fingers from the bottom edge" -msgstr "Glissement à deux doigts depuis le bord inférieur" - -#: lib/logitech_receiver/settings_templates.py:166 -msgid "Swipe two fingers from the top edge" -msgstr "Glissement à deux doigts depuis le bord supérieur" +msgid "Side Scrolling" +msgstr "Défilement latéral" #: lib/logitech_receiver/settings_templates.py:167 -#: lib/logitech_receiver/settings_templates.py:171 -msgid "Pinch to zoom out; spread to zoom in." -msgstr "Pincer pour réduire le zoom; écarter pour agrandir le zoom." - -#: lib/logitech_receiver/settings_templates.py:167 -msgid "Zoom with two fingers." -msgstr "Zoom à deux doigts." - -#: lib/logitech_receiver/settings_templates.py:168 -msgid "Pinch to zoom out." -msgstr "Pincer pour réduire le zoom." - -#: lib/logitech_receiver/settings_templates.py:169 -msgid "Spread to zoom in." -msgstr "Écarter pour agrandir le zoom." - -#: lib/logitech_receiver/settings_templates.py:170 -msgid "Zoom with three fingers." -msgstr "Zoom à trois doigts." - -#: lib/logitech_receiver/settings_templates.py:171 -msgid "Zoom with two fingers" -msgstr "Zoom à deux doigts" - -#: lib/logitech_receiver/settings_templates.py:189 -msgid "Pixel zone" -msgstr "Zone de pixels" - -#: lib/logitech_receiver/settings_templates.py:190 -msgid "Ratio zone" -msgstr "Zone de rapport" - -#: lib/logitech_receiver/settings_templates.py:191 -msgid "Scale factor" -msgstr "Facteur d’échelle" - -#: lib/logitech_receiver/settings_templates.py:191 -msgid "Sets the cursor speed." -msgstr "Définit la vitesse du curseur." - -#: lib/logitech_receiver/settings_templates.py:195 -msgid "Left" -msgstr "Gauche" - -#: lib/logitech_receiver/settings_templates.py:195 -msgid "Left-most coordinate." -msgstr "Coordonnée la plus à gauche." - -#: lib/logitech_receiver/settings_templates.py:196 -msgid "Top-most coordinate." -msgstr "Coordonnée la plus haute." - -#: lib/logitech_receiver/settings_templates.py:196 -msgid "top" -msgstr "haut" - -#: lib/logitech_receiver/settings_templates.py:197 -msgid "Width." -msgstr "Largeur." - -#: lib/logitech_receiver/settings_templates.py:197 -msgid "width" -msgstr "largeur" - -#: lib/logitech_receiver/settings_templates.py:198 -msgid "Height." -msgstr "Hauteur." - -#: lib/logitech_receiver/settings_templates.py:198 -msgid "height" -msgstr "hauteur" - -#: lib/logitech_receiver/settings_templates.py:199 -msgid "Cursor speed." -msgstr "Vitesse du curseur." - -#: lib/logitech_receiver/settings_templates.py:199 -msgid "Scale" -msgstr "Échelle" - -#: lib/logitech_receiver/settings_templates.py:202 +msgid "" +"When disabled, pushing the wheel sideways sends custom button events\n" +"instead of the standard side-scrolling events." +msgstr "" +"Lorsque désactivé, l'appui sur les côtés de la roulette envoie des " +"évènements\n" +" de bouton personnalisés à la place des évènements standards de défilement " +"latéral." + +#: lib/logitech_receiver/settings_templates.py:177 +msgid "Sensitivity (DPI - older mice)" +msgstr "Sensibilité (DPI - souris plus anciennne)" + +#: lib/logitech_receiver/settings_templates.py:178 +#: lib/logitech_receiver/settings_templates.py:712 +msgid "Mouse movement sensitivity" +msgstr "Sensibilité du mouvement de la souris" + +#: lib/logitech_receiver/settings_templates.py:208 +#: lib/logitech_receiver/settings_templates.py:218 +#: lib/logitech_receiver/settings_templates.py:225 +msgid "Backlight" +msgstr "Rétroéclairage" + +#: lib/logitech_receiver/settings_templates.py:209 +#: lib/logitech_receiver/settings_templates.py:226 +msgid "Set illumination time for keyboard." +msgstr "Définir le temps d'éclairage du clavier." + +#: lib/logitech_receiver/settings_templates.py:219 +msgid "Turn illumination on or off on keyboard." +msgstr "Activez ou désactivez l'éclairage sur le clavier." + +#: lib/logitech_receiver/settings_templates.py:237 +msgid "Scroll Wheel High Resolution" +msgstr "Molette haute résolution" + +#: 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 "Définir pour ignorer si le défilement est anormalement rapide ou lent" + +#: lib/logitech_receiver/settings_templates.py:247 +#: lib/logitech_receiver/settings_templates.py:277 +msgid "Scroll Wheel Diversion" +msgstr "Interception de la molette" + +#: 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 "" +"Active l'envoi par la molette de notifications LOWRES_WHEEL HID++ (ce qui " +"déclenche les règles Solaar qui sont ignorées sinon)." + +#: lib/logitech_receiver/settings_templates.py:256 +msgid "Scroll Wheel Direction" +msgstr "Direction de la molette" + +#: lib/logitech_receiver/settings_templates.py:257 +msgid "Invert direction for vertical scroll with wheel." +msgstr "Direction inversée pour le défilement vertical avec la molette." + +#: lib/logitech_receiver/settings_templates.py:265 +msgid "Scroll Wheel Resolution" +msgstr "Résolution de la molette" + +#: 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 "" +"Active l'envoi par la molette de notifications HIRES_WHEEL HID++ (ce qui " +"déclenche les règles Solaar qui sont ignorées sinon)." + +#: lib/logitech_receiver/settings_templates.py:288 +msgid "Sensitivity (Pointer Speed)" +msgstr "Sensibilité (vitesse du pointeur)" + +#: lib/logitech_receiver/settings_templates.py:289 +msgid "Speed multiplier for mouse (256 is normal multiplier)." +msgstr "" +"Multiplicateur de vitesse pour la souris (256 est le multiplicateur normal)." + +#: lib/logitech_receiver/settings_templates.py:299 +msgid "Thumb Wheel Diversion" +msgstr "Interception de la molette de pouce" + +#: 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 "" +"Active l'envoi par la molette de pouce de notifications THUMB_WHEEL HID++ " +"(ce qui déclenche les règles Solaar qui sont ignorées sinon)." + +#: lib/logitech_receiver/settings_templates.py:310 +msgid "Thumb Wheel Direction" +msgstr "Direction de la molette de pouce" + +#: lib/logitech_receiver/settings_templates.py:311 +msgid "Invert thumb wheel scroll direction." +msgstr "Inverser la direction du défilement de la molette de pouce." + +#: lib/logitech_receiver/settings_templates.py:319 +msgid "Onboard Profiles" +msgstr "Profils embarqués" + +#: lib/logitech_receiver/settings_templates.py:320 +msgid "" +"Enable onboard profiles, which often control report rate and keyboard " +"lighting" +msgstr "" +"Active les profils embarqués, qui contrôlent souvent le taux de rapport et " +"l'éclairage du clavier" + +#: lib/logitech_receiver/settings_templates.py:330 +msgid "Polling Rate (ms)" +msgstr "Taux de scrutation (ms)" + +#: lib/logitech_receiver/settings_templates.py:332 +msgid "Frequency of device polling, in milliseconds" +msgstr "Fréquence de scrutation du périphérique, en millisecondes" + +#: 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 "" +"Peut nécessiter de désactiver les profils embarqués pour être effectif." + +#: lib/logitech_receiver/settings_templates.py:365 +msgid "Divert crown events" +msgstr "Définir les évènements de la couronne" + +#: lib/logitech_receiver/settings_templates.py:366 +msgid "" +"Make crown send CROWN HID++ notifications (which trigger Solaar rules but " +"are otherwise ignored)." +msgstr "" +"Active l'envoi par la couronne de notifications CROWN HID++ (ce qui " +"déclenche les règles Solaar qui sont ignorées sinon)." + +#: lib/logitech_receiver/settings_templates.py:374 +msgid "Crown smooth scroll" +msgstr "Défilement fluide de la couronne" + +#: lib/logitech_receiver/settings_templates.py:375 +msgid "Set crown smooth scroll" +msgstr "Définir le défilement fluide de la couronne" + +#: lib/logitech_receiver/settings_templates.py:383 +msgid "Divert G Keys" +msgstr "Définir les touches G" + +#: lib/logitech_receiver/settings_templates.py:385 +msgid "" +"Make G keys send GKEY HID++ notifications (which trigger Solaar rules but " +"are otherwise ignored)." +msgstr "" +"Active l'envoi par les touches G de notifications GKEY HID++ (ce qui " +"déclenche les règles Solaar qui sont ignorées sinon)." + +#: lib/logitech_receiver/settings_templates.py:386 +msgid "May also make M keys and MR key send HID++ notifications" +msgstr "" +"Peut aussi permettre que les touches M et la touche MR envoient des " +"notifications HID++" + +#: lib/logitech_receiver/settings_templates.py:402 +msgid "Scroll Wheel Ratcheted" +msgstr "Molette mode cliquet" + +#: lib/logitech_receiver/settings_templates.py:403 +msgid "" +"Switch the mouse wheel between speed-controlled ratcheting and always " +"freespin." +msgstr "" +"Basculez la molette de la souris entre le mode cliquet à vitesse contrôlée " +"et toujours en roue libre." + +#: lib/logitech_receiver/settings_templates.py:405 +msgid "Freespinning" +msgstr "Roue libre" + +#: lib/logitech_receiver/settings_templates.py:405 +msgid "Ratcheted" +msgstr "Cliquet" + +#: lib/logitech_receiver/settings_templates.py:412 +msgid "Scroll Wheel Ratchet Speed" +msgstr "Vitesse de la molette mode cliquet" + +#: 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 "" +"Utilisez la vitesse de la molette de la souris pour basculer entre le mode " +"cliquet et le mode roue libre.\n" +"La molette est toujours en mode cliquet à 50." + +#: lib/logitech_receiver/settings_templates.py:463 +msgid "Key/Button Actions" +msgstr "Actions des boutons" + +#: lib/logitech_receiver/settings_templates.py:465 +msgid "Change the action for the key or button." +msgstr "Modifiez l'action pour la touche ou pour le bouton." + +#: lib/logitech_receiver/settings_templates.py:465 +msgid "Overridden by diversion." +msgstr "Remplacé par interception." + +#: 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 "" +"La modification d'importantes actions (comme le bouton gauche de la souris) " +"pourrait rendre le système inutilisable." + +#: lib/logitech_receiver/settings_templates.py:639 +msgid "Key/Button Diversion" +msgstr "Interception des boutons/touches" + +#: 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 "" +"Active l'envoi par la touche ou le bouton de notifications HID++ " +"(interception), ou une gestuelle de souris ou l'échelle de déplacement" + +#: lib/logitech_receiver/settings_templates.py:643 +#: lib/logitech_receiver/settings_templates.py:644 +#: lib/logitech_receiver/settings_templates.py:645 +msgid "Diverted" +msgstr "Interception" + +#: lib/logitech_receiver/settings_templates.py:643 +#: lib/logitech_receiver/settings_templates.py:644 +msgid "Mouse Gestures" +msgstr "Gestuelle à la souris" + +#: lib/logitech_receiver/settings_templates.py:643 +#: lib/logitech_receiver/settings_templates.py:644 +#: lib/logitech_receiver/settings_templates.py:645 +msgid "Regular" +msgstr "Normal" + +#: lib/logitech_receiver/settings_templates.py:643 +msgid "Sliding DPI" +msgstr "Amplification du déplacement" + +#: lib/logitech_receiver/settings_templates.py:711 +msgid "Sensitivity (DPI)" +msgstr "Sensibilité (DPI)" + +#: lib/logitech_receiver/settings_templates.py:752 +msgid "Sensitivity Switching" +msgstr "Basculement de la sensibilité" + +#: 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 "" +"Bascule la sensibilité actuelle et la sensibilité enregistrée quand la " +"touche ou le bouton sont appuyés.\n" +"S'il n'y aucune sensibilité enregistrée, rappelle uniquement la sensibilité " +"courante" + +#: lib/logitech_receiver/settings_templates.py:758 +msgid "Off" +msgstr "Eteint" + +#: lib/logitech_receiver/settings_templates.py:791 +msgid "Disable keys" +msgstr "Désactiver les touches" + +#: lib/logitech_receiver/settings_templates.py:792 +msgid "Disable specific keyboard keys." +msgstr "Désactiver des touches spécifiques du clavier." + +#: lib/logitech_receiver/settings_templates.py:795 #, python-format -msgid "Disables the %s key." -msgstr "Désactive la touche %s." +msgid "Disables the %s key." +msgstr "Désactive la touche %s." + +#: lib/logitech_receiver/settings_templates.py:809 +#: lib/logitech_receiver/settings_templates.py:860 +msgid "Set OS" +msgstr "Définir le système d'exploitation" + +#: lib/logitech_receiver/settings_templates.py:810 +#: lib/logitech_receiver/settings_templates.py:861 +msgid "Change keys to match OS." +msgstr "Modifier les touches pour correspondre au système d'exploitation." + +#: lib/logitech_receiver/settings_templates.py:873 +msgid "Change Host" +msgstr "Changer d'hôte" + +#: lib/logitech_receiver/settings_templates.py:874 +msgid "Switch connection to a different host" +msgstr "Commuter la connexion vers un autre hôte" + +#: lib/logitech_receiver/settings_templates.py:900 +msgid "Performs a left click." +msgstr "Réalise un clic gauche." + +#: lib/logitech_receiver/settings_templates.py:900 +msgid "Single tap" +msgstr "Une tape simple" + +#: lib/logitech_receiver/settings_templates.py:901 +msgid "Performs a right click." +msgstr "Réalise un clic droit." + +#: lib/logitech_receiver/settings_templates.py:901 +msgid "Single tap with two fingers" +msgstr "Une tape simple avec deux doigts" + +#: lib/logitech_receiver/settings_templates.py:902 +msgid "Single tap with three fingers" +msgstr "Une tape simple avec trois doigts" + +#: lib/logitech_receiver/settings_templates.py:906 +msgid "Double tap" +msgstr "Une double tape" + +#: lib/logitech_receiver/settings_templates.py:906 +msgid "Performs a double click." +msgstr "Réalise un double clic." + +#: lib/logitech_receiver/settings_templates.py:907 +msgid "Double tap with two fingers" +msgstr "Une double tape avec deux doigts" + +#: lib/logitech_receiver/settings_templates.py:908 +msgid "Double tap with three fingers" +msgstr "Une double tape avec trois doigts" + +#: lib/logitech_receiver/settings_templates.py:911 +msgid "Drags items by dragging the finger after double tapping." +msgstr "Déplace des items en faisant glisser le doigt après la double tape." + +#: lib/logitech_receiver/settings_templates.py:911 +msgid "Tap and drag" +msgstr "Taper-glisser" + +#: lib/logitech_receiver/settings_templates.py:913 +msgid "Drags items by dragging the fingers after double tapping." +msgstr "Déplace des items en faisant glisser les doigts après la double tape." + +#: lib/logitech_receiver/settings_templates.py:913 +msgid "Tap and drag with two fingers" +msgstr "Taper-glisser avec deux doigts" + +#: lib/logitech_receiver/settings_templates.py:914 +msgid "Tap and drag with three fingers" +msgstr "Taper-glisser avec trois doigts" + +#: lib/logitech_receiver/settings_templates.py:917 +msgid "Disables tap and edge gestures (equivalent to pressing Fn+LeftClick)." +msgstr "" +"Désactive les tapes et les gestes de bords (équivaut à presser " +"Fn+ClicGauche)." + +#: lib/logitech_receiver/settings_templates.py:917 +msgid "Suppress tap and edge gestures" +msgstr "Supprimer les tapes et les gestes" + +#: lib/logitech_receiver/settings_templates.py:918 +msgid "Scroll with one finger" +msgstr "Défilement à un doigt" + +#: lib/logitech_receiver/settings_templates.py:918 +#: lib/logitech_receiver/settings_templates.py:919 +#: lib/logitech_receiver/settings_templates.py:922 +msgid "Scrolls." +msgstr "Défilements." + +#: lib/logitech_receiver/settings_templates.py:919 +#: lib/logitech_receiver/settings_templates.py:922 +msgid "Scroll with two fingers" +msgstr "Défilement à deux doigts" + +#: lib/logitech_receiver/settings_templates.py:920 +msgid "Scroll horizontally with two fingers" +msgstr "Défilement horizontal à deux doigts" + +#: lib/logitech_receiver/settings_templates.py:920 +msgid "Scrolls horizontally." +msgstr "Défile horizontalement." + +#: lib/logitech_receiver/settings_templates.py:921 +msgid "Scroll vertically with two fingers" +msgstr "Défilement vertical à deux doigts" + +#: lib/logitech_receiver/settings_templates.py:921 +msgid "Scrolls vertically." +msgstr "Défile verticalement." + +#: lib/logitech_receiver/settings_templates.py:923 +msgid "Inverts the scrolling direction." +msgstr "Inverse la direction de défilement." + +#: lib/logitech_receiver/settings_templates.py:923 +msgid "Natural scrolling" +msgstr "Défilement naturel" + +#: lib/logitech_receiver/settings_templates.py:924 +msgid "Enables the thumbwheel." +msgstr "Active la molette de pouce." + +#: lib/logitech_receiver/settings_templates.py:924 +msgid "Thumbwheel" +msgstr "Molette de pouce" + +#: lib/logitech_receiver/settings_templates.py:935 +#: lib/logitech_receiver/settings_templates.py:939 +msgid "Swipe from the top edge" +msgstr "Glissement depuis le bord supérieur" + +#: lib/logitech_receiver/settings_templates.py:936 +msgid "Swipe from the left edge" +msgstr "Glissement depuis le bord gauche" + +#: lib/logitech_receiver/settings_templates.py:937 +msgid "Swipe from the right edge" +msgstr "Glissement depuis le bord droit" + +#: lib/logitech_receiver/settings_templates.py:938 +msgid "Swipe from the bottom edge" +msgstr "Glissement depuis le bord inférieur" + +#: lib/logitech_receiver/settings_templates.py:940 +msgid "Swipe two fingers from the left edge" +msgstr "Glissement à deux doigts depuis le bord gauche" + +#: lib/logitech_receiver/settings_templates.py:941 +msgid "Swipe two fingers from the right edge" +msgstr "Glissement à deux doigts depuis le bord droit" + +#: lib/logitech_receiver/settings_templates.py:942 +msgid "Swipe two fingers from the bottom edge" +msgstr "Glissement à deux doigts depuis le bord inférieur" + +#: lib/logitech_receiver/settings_templates.py:943 +msgid "Swipe two fingers from the top edge" +msgstr "Glissement à deux doigts depuis le bord supérieur" + +#: lib/logitech_receiver/settings_templates.py:944 +#: lib/logitech_receiver/settings_templates.py:948 +msgid "Pinch to zoom out; spread to zoom in." +msgstr "Pincer pour réduire le zoom; écarter pour agrandir le zoom." + +#: lib/logitech_receiver/settings_templates.py:944 +msgid "Zoom with two fingers." +msgstr "Zoom à deux doigts." + +#: lib/logitech_receiver/settings_templates.py:945 +msgid "Pinch to zoom out." +msgstr "Pincer pour réduire le zoom." + +#: lib/logitech_receiver/settings_templates.py:946 +msgid "Spread to zoom in." +msgstr "Écarter pour agrandir le zoom." + +#: lib/logitech_receiver/settings_templates.py:947 +msgid "Zoom with three fingers." +msgstr "Zoom à trois doigts." + +#: lib/logitech_receiver/settings_templates.py:948 +msgid "Zoom with two fingers" +msgstr "Zoom à deux doigts" + +#: lib/logitech_receiver/settings_templates.py:966 +msgid "Pixel zone" +msgstr "Zone de pixels" + +#: lib/logitech_receiver/settings_templates.py:967 +msgid "Ratio zone" +msgstr "Zone de rapport" + +#: lib/logitech_receiver/settings_templates.py:968 +msgid "Scale factor" +msgstr "Facteur d’échelle" + +#: lib/logitech_receiver/settings_templates.py:968 +msgid "Sets the cursor speed." +msgstr "Définit la vitesse du curseur." + +#: lib/logitech_receiver/settings_templates.py:972 +msgid "Left" +msgstr "Gauche" + +#: lib/logitech_receiver/settings_templates.py:972 +msgid "Left-most coordinate." +msgstr "Coordonnée la plus à gauche." + +#: lib/logitech_receiver/settings_templates.py:973 +msgid "Bottom" +msgstr "Bas" + +#: lib/logitech_receiver/settings_templates.py:973 +msgid "Bottom coordinate." +msgstr "Coordonnée du bas." + +#: lib/logitech_receiver/settings_templates.py:974 +msgid "Width" +msgstr "Largeur" + +#: lib/logitech_receiver/settings_templates.py:974 +msgid "Width." +msgstr "Largeur." + +#: lib/logitech_receiver/settings_templates.py:975 +msgid "Height" +msgstr "Hauteur" + +#: lib/logitech_receiver/settings_templates.py:975 +msgid "Height." +msgstr "Hauteur." + +#: lib/logitech_receiver/settings_templates.py:976 +msgid "Cursor speed." +msgstr "Vitesse du curseur." + +#: lib/logitech_receiver/settings_templates.py:976 +msgid "Scale" +msgstr "Échelle" + +#: lib/logitech_receiver/settings_templates.py:982 +msgid "Gestures" +msgstr "Gestes" + +#: lib/logitech_receiver/settings_templates.py:983 +msgid "Tweak the mouse/touchpad behaviour." +msgstr "Personnaliser le comportement de la souris ou du pavé tactile." + +#: lib/logitech_receiver/settings_templates.py:1000 +msgid "Gestures Diversion" +msgstr "Interception de la gestuelle" + +#: lib/logitech_receiver/settings_templates.py:1001 +msgid "Divert mouse/touchpad gestures." +msgstr "Interception de la gestuelle de la souris ou du pavé tactile." + +#: lib/logitech_receiver/settings_templates.py:1018 +msgid "Gesture params" +msgstr "Paramètres de la gestuelle" + +#: lib/logitech_receiver/settings_templates.py:1019 +msgid "Change numerical parameters of a mouse/touchpad." +msgstr "Modifier les paramètres numérique de la souris ou du pavé tactile." -#: lib/logitech_receiver/settings_templates.py:521 -#: lib/logitech_receiver/settings_templates.py:573 -msgid "Off" -msgstr "Eteint" +#: lib/logitech_receiver/settings_templates.py:1044 +msgid "M-Key LEDs" +msgstr "LEDs de touche M" -#: lib/logitech_receiver/settings_templates.py:667 -msgid "Diverted" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1046 +msgid "Control the M-Key LEDs." +msgstr "Contrôler les LEDs de touche M." -#: lib/logitech_receiver/settings_templates.py:667 -msgid "Regular" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:1047 +#: lib/logitech_receiver/settings_templates.py:1077 +msgid "May need G Keys diverted to be effective." +msgstr "" +"Peut nécessiter que les touches G soient interceptées pour être effectif." -#: lib/logitech_receiver/status.py:109 -msgid "No paired devices." -msgstr "Aucun périphérique jumelé." - -#: lib/logitech_receiver/status.py:110 lib/solaar/ui/window.py:623 +#: lib/logitech_receiver/settings_templates.py:1053 +#, python-format +msgid "Lights up the %s key." +msgstr "Allume la touche %s." + +#: lib/logitech_receiver/settings_templates.py:1074 +msgid "MR-Key LED" +msgstr "LED de touche MR" + +#: lib/logitech_receiver/settings_templates.py:1076 +msgid "Control the MR-Key LED." +msgstr "Contrôler la LED de touche MR." + +#: lib/logitech_receiver/settings_templates.py:1095 +msgid "Persistent Key/Button Mapping" +msgstr "Mappage touche/bouton persistant" + +#: lib/logitech_receiver/settings_templates.py:1097 +msgid "Permanently change the mapping for the key or button." +msgstr "Modifiez de manière permanente le mappage de la touche ou du bouton." + +#: 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 "" +"La modification de touches ou de boutons importants (comme le bouton gauche " +"de la souris) pourrait rendre le système inutilisable." + +#: lib/logitech_receiver/settings_templates.py:1157 +msgid "Sidetone" +msgstr "Tonalité latérale" + +#: lib/logitech_receiver/settings_templates.py:1158 +msgid "Set sidetone level." +msgstr "Régler le niveau de tonalité latérale." + +#: lib/logitech_receiver/settings_templates.py:1167 +msgid "Equalizer" +msgstr "Égaliseur" + +#: lib/logitech_receiver/settings_templates.py:1168 +msgid "Set equalizer levels." +msgstr "Définir les niveaux de l'égaliseur." + +#: lib/logitech_receiver/settings_templates.py:1191 +msgid "Hz" +msgstr "Hz" + +#: lib/logitech_receiver/settings_templates.py:1197 +msgid "Power Management" +msgstr "Gestion de l'alimentation" + +#: lib/logitech_receiver/settings_templates.py:1198 +msgid "Power off in minutes (0 for never)." +msgstr "Éteindre en quelques minutes (0 pour jamais)." + +#: lib/logitech_receiver/status.py:114 +msgid "No paired devices." +msgstr "Aucun périphérique jumelé." + +#: lib/logitech_receiver/status.py:115 lib/solaar/ui/window.py:622 #, python-format -msgid "%(count)s paired device." -msgid_plural "%(count)s paired devices." -msgstr[0] "%(count)s périphérique jumelé." -msgstr[1] "%(count)s périphériques jumelés." +msgid "%(count)s paired device." +msgid_plural "%(count)s paired devices." +msgstr[0] "%(count)s périphérique jumelé." +msgstr[1] "%(count)s périphériques jumelés." -#: lib/logitech_receiver/status.py:165 +#: lib/logitech_receiver/status.py:170 #, python-format -msgid "Battery: %(level)s" -msgstr "Batterie : %(level)s" +msgid "Battery: %(level)s" +msgstr "Batterie : %(level)s" -#: lib/logitech_receiver/status.py:167 +#: lib/logitech_receiver/status.py:172 #, python-format -msgid "Battery: %(percent)d%%" -msgstr "Batterie : %(percent)d%%" +msgid "Battery: %(percent)d%%" +msgstr "Batterie : %(percent)d%%" -#: lib/logitech_receiver/status.py:179 +#: lib/logitech_receiver/status.py:184 #, python-format -msgid "Lighting: %(level)s lux" -msgstr "Éclairage : %(level)s lux" +msgid "Lighting: %(level)s lux" +msgstr "Éclairage : %(level)s lux" -#: lib/logitech_receiver/status.py:234 +#: lib/logitech_receiver/status.py:239 #, python-format -msgid "Battery: %(level)s (%(status)s)" -msgstr "Batterie : %(level)s (%(status)s)" +msgid "Battery: %(level)s (%(status)s)" +msgstr "Batterie : %(level)s (%(status)s)" -#: lib/logitech_receiver/status.py:236 +#: lib/logitech_receiver/status.py:241 #, python-format -msgid "Battery: %(percent)d%% (%(status)s)" -msgstr "Batterie : %(percent)d%% (%(status)s)" +msgid "Battery: %(percent)d%% (%(status)s)" +msgstr "Batterie : %(percent)d%% (%(status)s)" #: lib/solaar/ui/__init__.py:52 -msgid "Permissions error" -msgstr "Erreur de permissions" +msgid "Permissions error" +msgstr "Erreur de permissions" #: lib/solaar/ui/__init__.py:54 #, python-format -msgid "Found a Logitech Receiver (%s), but did not have permission to open " - "it." -msgstr "Trouvé un récepteur Logitech (%s), mais n'a pas eu l'autorisation de " - "l'ouvrir." +msgid "" +"Found a Logitech receiver or device (%s), but did not have permission to " +"open it." +msgstr "" +"Un récepteur ou un périphérique Logitech (%s) a été trouvé, mais sans " +"l'autorisation de l'ouvrir." #: lib/solaar/ui/__init__.py:55 -msgid "If you've just installed Solaar, try removing the receiver and " - "plugging it back in." -msgstr "Si vous venez juste d'installer Solaar, essayez de retirer le " - "récepteur et de le rebrancher." +msgid "" +"If you've just installed Solaar, try disconnecting the receiver or device " +"and then reconnecting it." +msgstr "" +"Si vous venez d'installer Solaar, essayez de déconnecter le récepteur ou le " +"périphérique, puis de le reconnecter." #: lib/solaar/ui/__init__.py:58 -msgid "Cannot connect to device error" -msgstr "Impossible de se connecter au périphérique" +msgid "Cannot connect to device error" +msgstr "Impossible de se connecter au périphérique" #: 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 "Un récepteur ou un périphérique Logitech a été trouvé à %s, mais une erreur s'est produite " - "lors de la connexion" +msgid "" +"Found a Logitech receiver or device at %s, but encountered an error " +"connecting to it." +msgstr "" +"Un récepteur ou un périphérique Logitech a été trouvé à %s, mais une erreur " +"s'est produite lors de la connexion." #: lib/solaar/ui/__init__.py:61 -msgid "Try removing the device and plugging it back in or turning it off " - "and then on." -msgstr "Essayez de retirer le périphérique et de le rebrancher ou de l'éteindre " - "puis de le rallumer." +msgid "" +"Try disconnecting the device and then reconnecting it or turning it off and " +"then on." +msgstr "" +"Essayez de déconnecter le périphérique, puis de le reconnecter ou de " +"l'éteindre puis de le rallumer." #: lib/solaar/ui/__init__.py:64 -msgid "Unpairing failed" -msgstr "La déconnexion a échouée" +msgid "Unpairing failed" +msgstr "La déconnexion a échouée" #: lib/solaar/ui/__init__.py:66 #, python-brace-format -msgid "Failed to unpair %{device} from %{receiver}." -msgstr "Impossible de dissocier %{device} de %{receiver}." +msgid "Failed to unpair %{device} from %{receiver}." +msgstr "Impossible de dissocier %{device} de %{receiver}." #: lib/solaar/ui/__init__.py:67 -msgid "The receiver returned an error, with no further details." -msgstr "Le récepteur a retourné une erreur, sans plus de détails." - -#: lib/solaar/ui/about.py:39 -msgid "Manages Logitech receivers,\n" - "keyboards, mice, and tablets." -msgstr "Gère les récepteurs, claviers,\n" - "souris et tablettes Logitech." +msgid "The receiver returned an error, with no further details." +msgstr "Le récepteur a retourné une erreur, sans plus de détails." + +#: lib/solaar/ui/__init__.py:177 +msgid "Another Solaar process is already running so just expose its window" +msgstr "" +"Un autre processus Solaar est déjà en cours d'exécution, il suffit donc " +"d'afficher sa fenêtre" + +#: lib/solaar/ui/about.py:36 +msgid "" +"Manages Logitech receivers,\n" +"keyboards, mice, and tablets." +msgstr "" +"Gère les récepteurs, claviers,\n" +"souris et tablettes Logitech." + +#: lib/solaar/ui/about.py:44 +msgid "Additional Programming" +msgstr "Programmation supplémentaire" + +#: lib/solaar/ui/about.py:45 +msgid "GUI design" +msgstr "Interface graphique" #: lib/solaar/ui/about.py:47 -msgid "Additional Programming" -msgstr "Programmation supplémentaire" +msgid "Testing" +msgstr "Testeur" -#: lib/solaar/ui/about.py:48 -msgid "GUI design" -msgstr "Interface graphique" +#: lib/solaar/ui/about.py:54 +msgid "Logitech documentation" +msgstr "Documentațion Logitech" -#: lib/solaar/ui/about.py:50 -msgid "Testing" -msgstr "Testeur" +#: lib/solaar/ui/action.py:85 lib/solaar/ui/action.py:89 +#: lib/solaar/ui/window.py:197 +msgid "Unpair" +msgstr "Déconnecter" -#: lib/solaar/ui/about.py:57 -msgid "Logitech documentation" -msgstr "Documentațion Logitech" - -#: lib/solaar/ui/action.py:70 lib/solaar/ui/window.py:328 -msgid "About %s" -msgstr "À propos de %s" - -#: lib/solaar/ui/action.py:96 lib/solaar/ui/action.py:100 -#: lib/solaar/ui/window.py:205 -msgid "Unpair" -msgstr "Déconnecter" +#: lib/solaar/ui/action.py:88 lib/solaar/ui/diversion_rules.py:150 +msgid "Cancel" +msgstr "Annuler" -#: lib/solaar/ui/action.py:99 lib/solaar/ui/diversion_rules.py:144 -msgid "Cancel" -msgstr "Annuler" +#: lib/solaar/ui/config_panel.py:212 +msgid "Complete - ENTER to change" +msgstr "Complet - ENTRER pour modifier" -#: lib/solaar/ui/config_panel.py:358 -msgid "Changes allowed" -msgstr "Modifications autorisées" +#: lib/solaar/ui/config_panel.py:212 +msgid "Incomplete" +msgstr "Incomplet" -#: lib/solaar/ui/config_panel.py:359 -msgid "No changes allowed" -msgstr "Aucune modification autorisée" - -#: lib/solaar/ui/config_panel.py:360 -msgid "Ignore this setting" -msgstr "Ignorer ce réglage" - -#: lib/solaar/ui/config_panel.py:401 -msgid "Working" -msgstr "En fonctionnement" - -#: lib/solaar/ui/config_panel.py:404 -msgid "Read/write operation failed." -msgstr "Les opérations de lecture/écriture ont échouée." - -#: lib/solaar/ui/config_panel.py:522 +#: lib/solaar/ui/config_panel.py:455 lib/solaar/ui/config_panel.py:507 #, python-format -msgid "%d value" -msgid_plural "%d values" -msgstr[0] "valeur %d" -msgstr[1] "valeurs %d" +msgid "%d value" +msgid_plural "%d values" +msgstr[0] "valeur %d" +msgstr[1] "valeurs %d" + +#: lib/solaar/ui/config_panel.py:518 +msgid "Changes allowed" +msgstr "Modifications autorisées" + +#: lib/solaar/ui/config_panel.py:519 +msgid "No changes allowed" +msgstr "Aucune modification autorisée" + +#: lib/solaar/ui/config_panel.py:520 +msgid "Ignore this setting" +msgstr "Ignorer ce réglage" + +#: lib/solaar/ui/config_panel.py:565 +msgid "Working" +msgstr "En fonctionnement" + +#: lib/solaar/ui/config_panel.py:568 +msgid "Read/write operation failed." +msgstr "Les opérations de lecture/écriture ont échouée." + +#: lib/solaar/ui/diversion_rules.py:65 +msgid "Built-in rules" +msgstr "Règles pré-définies" + +#: lib/solaar/ui/diversion_rules.py:65 +msgid "User-defined rules" +msgstr "Règles définies par l'utilisateur" + +#: lib/solaar/ui/diversion_rules.py:67 lib/solaar/ui/diversion_rules.py:1083 +msgid "Rule" +msgstr "Règle" + +#: 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 "Sous-règle" + +#: lib/solaar/ui/diversion_rules.py:70 +msgid "[empty]" +msgstr "[vide]" + +#: lib/solaar/ui/diversion_rules.py:94 +msgid "Solaar Rule Editor" +msgstr "Éditeur de règle Solaar" + +#: lib/solaar/ui/diversion_rules.py:141 +msgid "Make changes permanent?" +msgstr "Rendre les modifications permanentes ?" + +#: lib/solaar/ui/diversion_rules.py:146 +msgid "Yes" +msgstr "Oui" + +#: lib/solaar/ui/diversion_rules.py:148 +msgid "No" +msgstr "Non" + +#: lib/solaar/ui/diversion_rules.py:153 +msgid "If you choose No, changes will be lost when Solaar is closed." +msgstr "" +"Si vous choisissez Non, les changements seront perdus à la fermeture de " +"Solaar." + +#: lib/solaar/ui/diversion_rules.py:201 +msgid "Save changes" +msgstr "Sauvegarder les modifications" + +#: lib/solaar/ui/diversion_rules.py:206 +msgid "Discard changes" +msgstr "Annuler les modifications" + +#: lib/solaar/ui/diversion_rules.py:372 +msgid "Insert here" +msgstr "Insérer ici" + +#: lib/solaar/ui/diversion_rules.py:374 +msgid "Insert above" +msgstr "Insérer ci-dessus" -#: lib/solaar/ui/diversion_rules.py:57 -msgid "Built-in rules" -msgstr "Règles pré-définies" +#: lib/solaar/ui/diversion_rules.py:376 +msgid "Insert below" +msgstr "Insérer ci-dessous" -#: lib/solaar/ui/diversion_rules.py:57 -msgid "User-defined rules" -msgstr "Règles définies par l'utilisateur" +#: lib/solaar/ui/diversion_rules.py:382 +msgid "Insert new rule here" +msgstr "Insérer une nouvelle règle ici" -#: lib/solaar/ui/diversion_rules.py:59 lib/solaar/ui/diversion_rules.py:792 -msgid "Rule" -msgstr "Règle" +#: lib/solaar/ui/diversion_rules.py:384 +msgid "Insert new rule above" +msgstr "Insérer une nouvelle règle ci-dessus" -#: lib/solaar/ui/diversion_rules.py:60 lib/solaar/ui/diversion_rules.py:503 -#: lib/solaar/ui/diversion_rules.py:622 -msgid "Sub-rule" -msgstr "Sous-règle" +#: lib/solaar/ui/diversion_rules.py:386 +msgid "Insert new rule below" +msgstr "Insérer une nouvelle règle ci-dessous" -#: lib/solaar/ui/diversion_rules.py:62 -msgid "[empty]" -msgstr "[vide]" +#: lib/solaar/ui/diversion_rules.py:427 +msgid "Paste here" +msgstr "Coller ici" -#: lib/solaar/ui/diversion_rules.py:85 -msgid "Solaar Rule Editor" -msgstr "Éditeur de règle Solaar" +#: lib/solaar/ui/diversion_rules.py:429 +msgid "Paste above" +msgstr "Coller ci-dessus" -#: lib/solaar/ui/diversion_rules.py:135 -msgid "Make changes permanent?" -msgstr "Rendre les modifications permanentes ?" +#: lib/solaar/ui/diversion_rules.py:431 +msgid "Paste below" +msgstr "Coller ci-dessous" -#: lib/solaar/ui/diversion_rules.py:140 -msgid "Yes" -msgstr "Oui" +#: lib/solaar/ui/diversion_rules.py:437 +msgid "Paste rule here" +msgstr "Coller la règle ici" -#: lib/solaar/ui/diversion_rules.py:142 -msgid "No" -msgstr "Non" +#: lib/solaar/ui/diversion_rules.py:439 +msgid "Paste rule above" +msgstr "Coller la règle ci-dessus" -#: lib/solaar/ui/diversion_rules.py:147 -msgid "If you choose No, changes will be lost when Solaar is closed." -msgstr "Si vous choisissez Non, les changements seront perdus à la fermeture " - "de Solaar." +#: lib/solaar/ui/diversion_rules.py:441 +msgid "Paste rule below" +msgstr "Coller la règle ci-dessous" -#: lib/solaar/ui/diversion_rules.py:195 -msgid "Save changes" -msgstr "Sauvegarder les modifications" +#: lib/solaar/ui/diversion_rules.py:445 +msgid "Paste rule" +msgstr "Coller la règle" -#: lib/solaar/ui/diversion_rules.py:200 -msgid "Discard changes" -msgstr "Annuler les modifications" +#: lib/solaar/ui/diversion_rules.py:474 +msgid "Flatten" +msgstr "Aplanir" -#: lib/solaar/ui/diversion_rules.py:366 -msgid "Insert here" -msgstr "Insérer ici" +#: lib/solaar/ui/diversion_rules.py:507 +msgid "Insert" +msgstr "Insérer" -#: lib/solaar/ui/diversion_rules.py:368 -msgid "Insert above" -msgstr "Insérer ci-dessus" +#: lib/solaar/ui/diversion_rules.py:510 lib/solaar/ui/diversion_rules.py:638 +#: lib/solaar/ui/diversion_rules.py:1126 +msgid "Or" +msgstr "Ou" + +#: lib/solaar/ui/diversion_rules.py:511 lib/solaar/ui/diversion_rules.py:637 +#: lib/solaar/ui/diversion_rules.py:1111 +msgid "And" +msgstr "Et" + +#: lib/solaar/ui/diversion_rules.py:513 +msgid "Condition" +msgstr "Condition" + +#: lib/solaar/ui/diversion_rules.py:515 lib/solaar/ui/diversion_rules.py:1292 +msgid "Feature" +msgstr "Fonctionnalité" + +#: lib/solaar/ui/diversion_rules.py:516 lib/solaar/ui/diversion_rules.py:1328 +msgid "Report" +msgstr "Rapport" + +#: lib/solaar/ui/diversion_rules.py:517 lib/solaar/ui/diversion_rules.py:1204 +msgid "Process" +msgstr "Processus" + +#: lib/solaar/ui/diversion_rules.py:518 +msgid "Mouse process" +msgstr "Processus de la souris" + +#: lib/solaar/ui/diversion_rules.py:519 lib/solaar/ui/diversion_rules.py:1366 +msgid "Modifiers" +msgstr "Modificateurs" + +#: lib/solaar/ui/diversion_rules.py:520 lib/solaar/ui/diversion_rules.py:1419 +msgid "Key" +msgstr "Touche" + +#: 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 "Actif" + +#: 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 "Périphérique" + +#: lib/solaar/ui/diversion_rules.py:524 lib/solaar/ui/diversion_rules.py:2297 +msgid "Host" +msgstr "Hôte" + +#: lib/solaar/ui/diversion_rules.py:525 lib/solaar/ui/diversion_rules.py:2339 +msgid "Setting" +msgstr "Réglage" + +#: lib/solaar/ui/diversion_rules.py:526 lib/solaar/ui/diversion_rules.py:1477 +#: lib/solaar/ui/diversion_rules.py:1526 +msgid "Test" +msgstr "Test" + +#: lib/solaar/ui/diversion_rules.py:527 lib/solaar/ui/diversion_rules.py:1643 +msgid "Test bytes" +msgstr "Octets de test" + +#: lib/solaar/ui/diversion_rules.py:528 lib/solaar/ui/diversion_rules.py:1736 +msgid "Mouse Gesture" +msgstr "Geste à la souris" + +#: lib/solaar/ui/diversion_rules.py:532 +msgid "Action" +msgstr "Action" + +#: lib/solaar/ui/diversion_rules.py:534 lib/solaar/ui/diversion_rules.py:1845 +msgid "Key press" +msgstr "Appui de touche" + +#: lib/solaar/ui/diversion_rules.py:535 lib/solaar/ui/diversion_rules.py:1897 +msgid "Mouse scroll" +msgstr "Défilement de la souris" + +#: lib/solaar/ui/diversion_rules.py:536 lib/solaar/ui/diversion_rules.py:1959 +msgid "Mouse click" +msgstr "Clic de la souris" + +#: lib/solaar/ui/diversion_rules.py:537 +msgid "Set" +msgstr "Définir" + +#: lib/solaar/ui/diversion_rules.py:538 lib/solaar/ui/diversion_rules.py:2030 +msgid "Execute" +msgstr "Exécuter" + +#: lib/solaar/ui/diversion_rules.py:539 lib/solaar/ui/diversion_rules.py:1158 +msgid "Later" +msgstr "Plus tard" + +#: lib/solaar/ui/diversion_rules.py:568 +msgid "Insert new rule" +msgstr "Insérer nouvelle règle" + +#: 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 "Effacer" + +#: lib/solaar/ui/diversion_rules.py:610 +msgid "Negate" +msgstr "Nier" + +#: lib/solaar/ui/diversion_rules.py:634 +msgid "Wrap with" +msgstr "Entoure" + +#: lib/solaar/ui/diversion_rules.py:656 +msgid "Cut" +msgstr "Couper" + +#: lib/solaar/ui/diversion_rules.py:671 +msgid "Paste" +msgstr "Coller" + +#: lib/solaar/ui/diversion_rules.py:683 +msgid "Copy" +msgstr "Copier" + +#: lib/solaar/ui/diversion_rules.py:1063 +msgid "This editor does not support the selected rule component yet." +msgstr "Cet éditeur ne gère pas encore le composant de règle sélectionné." + +#: lib/solaar/ui/diversion_rules.py:1138 +msgid "Number of seconds to delay." +msgstr "Nombre de secondes de report." + +#: lib/solaar/ui/diversion_rules.py:1177 +msgid "Not" +msgstr "Non" + +#: lib/solaar/ui/diversion_rules.py:1187 +msgid "X11 active process. For use in X11 only." +msgstr "Processus actif X11. Pour une utilisation dans X11 uniquement." + +#: lib/solaar/ui/diversion_rules.py:1218 +msgid "X11 mouse process. For use in X11 only." +msgstr "Processus de la souris X11. Pour une utilisation dans X11 uniquement." + +#: lib/solaar/ui/diversion_rules.py:1235 +msgid "MouseProcess" +msgstr "Processus de la souris" + +#: lib/solaar/ui/diversion_rules.py:1260 +msgid "Feature name of notification triggering rule processing." +msgstr "" +"Nom de la fonction de notification déclenchant le traitement de la règle." + +#: lib/solaar/ui/diversion_rules.py:1308 +msgid "Report number of notification triggering rule processing." +msgstr "" +"Indique le nombre de notifications déclenchant le traitement de la règle." + +#: lib/solaar/ui/diversion_rules.py:1342 +msgid "Active keyboard modifiers. Not always available in Wayland." +msgstr "Modificateurs de clavier actifs. Pas toujours disponible sous Wayland." + +#: 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 "" +"Interception de touche ou bouton appuyé ou relâché.\n" +"Utiliser l'interception de touche/bouton et les paramètres Interception des " +"touches G pour intercepter les touches et les boutons." + +#: lib/solaar/ui/diversion_rules.py:1392 +msgid "Key down" +msgstr "Enfoncement de touche" + +#: lib/solaar/ui/diversion_rules.py:1395 +msgid "Key up" +msgstr "Relâchement de touche" + +#: 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 "" +"La touche/le bouton intercepté est actuellement enfoncé.\n" +"Utiliser l'interception de touche/bouton et les paramètres Interception des " +"touches G pour intercepter les touches et les boutons." + +#: lib/solaar/ui/diversion_rules.py:1475 +msgid "Test condition on notification triggering rule processing." +msgstr "" +"Condition de test déclenchant le traitement de la règle en cas de " +"notification." + +#: lib/solaar/ui/diversion_rules.py:1479 +msgid "Parameter" +msgstr "Paramètre" + +#: lib/solaar/ui/diversion_rules.py:1542 +msgid "begin (inclusive)" +msgstr "début (inclusif)" + +#: lib/solaar/ui/diversion_rules.py:1543 +msgid "end (exclusive)" +msgstr "fin (exclusif)" + +#: lib/solaar/ui/diversion_rules.py:1552 +msgid "range" +msgstr "plage" + +#: lib/solaar/ui/diversion_rules.py:1554 +msgid "minimum" +msgstr "minimum" + +#: lib/solaar/ui/diversion_rules.py:1555 +msgid "maximum" +msgstr "maximum" + +#: lib/solaar/ui/diversion_rules.py:1557 +#, python-format +msgid "bytes %(0)d to %(1)d, ranging from %(2)d to %(3)d" +msgstr "octets %(0)d à %(1)d, allant de %(2)d à %(3)d" -#: lib/solaar/ui/diversion_rules.py:370 -msgid "Insert below" -msgstr "Insérer ci-dessous" +#: lib/solaar/ui/diversion_rules.py:1562 +msgid "mask" +msgstr "masque" -#: lib/solaar/ui/diversion_rules.py:376 -msgid "Insert new rule here" -msgstr "Insérer une nouvelle règle ici" +#: lib/solaar/ui/diversion_rules.py:1563 +#, python-format +msgid "bytes %(0)d to %(1)d, mask %(2)d" +msgstr "octets %(0)d à %(1)d, masque %(2)d" + +#: lib/solaar/ui/diversion_rules.py:1573 +msgid "" +"Bit or range test on bytes in notification message triggering rule " +"processing." +msgstr "" +"Bit ou plage d'octets dans un message de notification déclenchant le " +"traitement d'une règle." + +#: lib/solaar/ui/diversion_rules.py:1583 +msgid "type" +msgstr "type" + +#: lib/solaar/ui/diversion_rules.py:1666 +msgid "" +"Mouse gesture with optional initiating button followed by zero or more mouse " +"movements." +msgstr "" +"Geste de la souris avec bouton d'initialisation optionnel suivi ou non par " +"des déplacements de souris." + +#: lib/solaar/ui/diversion_rules.py:1671 +msgid "Add movement" +msgstr "Ajouter un mouvement" + +#: 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 "" +"Simule un clic combiné ou une pression ou un relâchement.\n" +"Sous Wayland cela nécessite un accès en écriture au périphérique /dev/uinput." + +#: lib/solaar/ui/diversion_rules.py:1769 +msgid "Add key" +msgstr "Ajouter une touche" + +#: lib/solaar/ui/diversion_rules.py:1772 +msgid "Click" +msgstr "Clic" + +#: lib/solaar/ui/diversion_rules.py:1775 +msgid "Depress" +msgstr "Appuyer" + +#: lib/solaar/ui/diversion_rules.py:1778 +msgid "Release" +msgstr "Relâcher" + +#: lib/solaar/ui/diversion_rules.py:1861 +msgid "" +"Simulate a mouse scroll.\n" +"On Wayland requires write access to /dev/uinput." +msgstr "" +"Simule un défilement de souris.\n" +"Sous Wayland cela nécessite un accès en écriture au périphérique /dev/uinput." + +#: lib/solaar/ui/diversion_rules.py:1918 +msgid "" +"Simulate a mouse click.\n" +"On Wayland requires write access to /dev/uinput." +msgstr "" +"Simule un clic de souris.\n" +"Sous Wayland cela nécessite un accès en écriture au périphérique /dev/uinput." + +#: lib/solaar/ui/diversion_rules.py:1921 +msgid "Button" +msgstr "Bouton" + +#: lib/solaar/ui/diversion_rules.py:1922 +msgid "Count and Action" +msgstr "Nombre et action" + +#: lib/solaar/ui/diversion_rules.py:1972 +msgid "Execute a command with arguments." +msgstr "Exécuter une commande avec paramètres." + +#: lib/solaar/ui/diversion_rules.py:1975 +msgid "Add argument" +msgstr "Ajouter un paramètre" + +#: lib/solaar/ui/diversion_rules.py:2050 +msgid "Toggle" +msgstr "Basculer" + +#: lib/solaar/ui/diversion_rules.py:2050 +msgid "True" +msgstr "Vrai" + +#: lib/solaar/ui/diversion_rules.py:2051 +msgid "False" +msgstr "Faux" + +#: lib/solaar/ui/diversion_rules.py:2065 +msgid "Unsupported setting" +msgstr "Réglage non pris en charge" + +#: 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 "Périphérique d'origine" + +#: lib/solaar/ui/diversion_rules.py:2256 +msgid "Device is active and its settings can be changed." +msgstr "Le périphérique est actif et ses paramètres peuvent être modifiés." + +#: lib/solaar/ui/diversion_rules.py:2266 +msgid "Device that originated the current notification." +msgstr "Périphérique à l’origine de la notification actuelle." + +#: lib/solaar/ui/diversion_rules.py:2280 +msgid "Name of host computer." +msgstr "Nom de l'ordinateur hôte." + +#: lib/solaar/ui/diversion_rules.py:2347 +msgid "Value" +msgstr "Valeur" + +#: lib/solaar/ui/diversion_rules.py:2355 +msgid "Item" +msgstr "Item" + +#: lib/solaar/ui/diversion_rules.py:2630 +msgid "Change setting on device" +msgstr "Modifier le réglage sur le périphérique" + +#: lib/solaar/ui/diversion_rules.py:2647 +msgid "Setting on device" +msgstr "Réglage sur le périphérique" + +#: lib/solaar/ui/notify.py:124 lib/solaar/ui/tray.py:320 +#: lib/solaar/ui/tray.py:325 lib/solaar/ui/window.py:739 +msgid "offline" +msgstr "non connecté" + +#: lib/solaar/ui/pair_window.py:122 lib/solaar/ui/pair_window.py:256 +#: lib/solaar/ui/pair_window.py:288 +#, python-format +msgid "%(receiver_name)s: pair new device" +msgstr "%(receiver_name)s : jumele le nouveau périphérique" -#: lib/solaar/ui/diversion_rules.py:378 -msgid "Insert new rule above" -msgstr "Insérer une nouvelle règle ci-dessus" +#: lib/solaar/ui/pair_window.py:123 +#, python-format +msgid "Enter passcode on %(name)s." +msgstr "Entrer le mot de passe sur %(name)s." -#: lib/solaar/ui/diversion_rules.py:380 -msgid "Insert new rule below" -msgstr "Insérer une nouvelle règle ci-dessous" +#: lib/solaar/ui/pair_window.py:126 +#, python-format +msgid "Type %(passcode)s and then press the enter key." +msgstr "Taper %(passcode)s puis appuyez sur la touche Entrée." -#: lib/solaar/ui/diversion_rules.py:421 -msgid "Paste here" -msgstr "Coller ici" +#: lib/solaar/ui/pair_window.py:129 +msgid "left" +msgstr "gauche" -#: lib/solaar/ui/diversion_rules.py:423 -msgid "Paste above" -msgstr "Coller ci-dessus" +#: lib/solaar/ui/pair_window.py:129 +msgid "right" +msgstr "droit" -#: lib/solaar/ui/diversion_rules.py:425 -msgid "Paste below" -msgstr "Coller ci-dessous" +#: lib/solaar/ui/pair_window.py:131 +#, python-format +msgid "" +"Press %(code)s\n" +"and then press left and right buttons simultaneously." +msgstr "" +"Appuyez %(code)s\n" +"puis appuyez simultanément sur les boutons gauche et droit." + +#: lib/solaar/ui/pair_window.py:188 +msgid "Pairing failed" +msgstr "Le jumelage a échoué" + +#: lib/solaar/ui/pair_window.py:190 +msgid "Make sure your device is within range, and has a decent battery charge." +msgstr "" +"Assurez-vous que votre périphérique soit à portée, et que sa batterie soit " +"suffisamment chargée." + +#: lib/solaar/ui/pair_window.py:192 +msgid "A new device was detected, but it is not compatible with this receiver." +msgstr "" +"Un nouveau périphérique a été détecté, mais il n'est pas compatible avec ce " +"récepteur." + +#: lib/solaar/ui/pair_window.py:194 +msgid "More paired devices than receiver can support." +msgstr "" +"Il y a plus de périphériques jumelés que le récepteur ne peut en supporter." + +#: lib/solaar/ui/pair_window.py:196 +msgid "No further details are available about the error." +msgstr "Aucun autre détail n'est disponible à propos de l'erreur." + +#: lib/solaar/ui/pair_window.py:210 +msgid "Found a new device:" +msgstr "Nouveau périphérique disponible :" + +#: lib/solaar/ui/pair_window.py:235 +msgid "The wireless link is not encrypted" +msgstr "La connexion sans fil n'est pas chiffrée" + +#: lib/solaar/ui/pair_window.py:264 +msgid "Unifying receivers are only compatible with Unifying devices." +msgstr "" +"Les récepteurs Unifying ne sont compatibles qu'avec des périphériques " +"Unifying." + +#: lib/solaar/ui/pair_window.py:266 +msgid "Bolt receivers are only compatible with Bolt devices." +msgstr "" +"Les récepteurs Bolt ne sont compatibles qu'avec des périphériques Bolt." + +#: lib/solaar/ui/pair_window.py:268 +msgid "Other receivers are only compatible with a few devices." +msgstr "" +"Les autres récepteurs sont uniquement compatibles avec quelques " +"périphériques." + +#: lib/solaar/ui/pair_window.py:270 +msgid "The device must not be paired with a nearby powered-on receiver." +msgstr "" +"Le périphérique doit être jumelé avec un récepteur de proximité allumé." + +#: lib/solaar/ui/pair_window.py:274 +msgid "Press a pairing button or key until the pairing light flashes quickly." +msgstr "" +"Appuyez sur un bouton ou une touche d'appairage jusqu'à ce que le voyant " +"clignote rapidement." + +#: lib/solaar/ui/pair_window.py:276 +msgid "You may have to first turn the device off and on again." +msgstr "Vous devriez tout d' abord éteindre le périphérique et le rallumer." + +#: lib/solaar/ui/pair_window.py:278 +msgid "Turn on the device you want to pair." +msgstr "Allumez le périphérique que vous souhaitez jumeler." + +#: lib/solaar/ui/pair_window.py:280 +msgid "If the device is already turned on, turn it off and on again." +msgstr "" +"Si le périphérique est déjà allumé, éteignez-le et rallumez-le à nouveau." + +#: lib/solaar/ui/pair_window.py:283 +#, python-format +msgid "" +"\n" +"\n" +"This receiver has %d pairing remaining." +msgid_plural "" +"\n" +"\n" +"This receiver has %d pairings remaining." +msgstr[0] "" +"\n" +"\n" +"Ce récepteur a %d jumelage restant." +msgstr[1] "" +"\n" +"\n" +"Ce récepteur a %d jumelages restants." + +#: lib/solaar/ui/pair_window.py:286 +msgid "" +"\n" +"Cancelling at this point will not use up a pairing." +msgstr "" +"\n" +"L'annulation à ce stade n'utilisera pas de jumelage." + +#: lib/solaar/ui/tray.py:58 +msgid "No supported device found" +msgstr "Aucun périphérique pris en charge trouvé" + +#: lib/solaar/ui/tray.py:64 lib/solaar/ui/window.py:319 +#, python-format +msgid "About %s" +msgstr "À propos de %s" -#: lib/solaar/ui/diversion_rules.py:431 -msgid "Paste rule here" -msgstr "Coller la règle ici" +#: lib/solaar/ui/tray.py:65 lib/solaar/ui/window.py:317 +#, python-format +msgid "Quit %s" +msgstr "Quitter %s" -#: lib/solaar/ui/diversion_rules.py:433 -msgid "Paste rule above" -msgstr "Coller la règle ci-dessus" +#: lib/solaar/ui/tray.py:299 lib/solaar/ui/tray.py:307 +msgid "no receiver" +msgstr "aucun récepteur" -#: lib/solaar/ui/diversion_rules.py:435 -msgid "Paste rule below" -msgstr "Coller la règle ci-dessous" +#: lib/solaar/ui/tray.py:323 +msgid "no status" +msgstr "aucun statut" -#: lib/solaar/ui/diversion_rules.py:439 -msgid "Paste rule" -msgstr "Coller la règle" +#: lib/solaar/ui/window.py:96 +msgid "Scanning" +msgstr "Balayage" -#: lib/solaar/ui/diversion_rules.py:468 -msgid "Flatten" -msgstr "Aplanir" +#: lib/solaar/ui/window.py:129 +msgid "Battery" +msgstr "Batterie" -#: lib/solaar/ui/diversion_rules.py:501 -msgid "Insert" -msgstr "Insérer" +#: lib/solaar/ui/window.py:132 +msgid "Wireless Link" +msgstr "Connexion sans fil" -#: lib/solaar/ui/diversion_rules.py:504 lib/solaar/ui/diversion_rules.py:624 -#: lib/solaar/ui/diversion_rules.py:835 -msgid "Or" -msgstr "Ou" +#: lib/solaar/ui/window.py:136 +msgid "Lighting" +msgstr "Éclairage" -#: lib/solaar/ui/diversion_rules.py:505 lib/solaar/ui/diversion_rules.py:623 -#: lib/solaar/ui/diversion_rules.py:820 -msgid "And" -msgstr "Et" +#: lib/solaar/ui/window.py:170 +msgid "Show Technical Details" +msgstr "Afficher les détails techniques" -#: lib/solaar/ui/diversion_rules.py:507 -msgid "Condition" -msgstr "Condition" +#: lib/solaar/ui/window.py:186 +msgid "Pair new device" +msgstr "Jumeler un nouveau périphérique" -#: lib/solaar/ui/diversion_rules.py:509 lib/solaar/ui/diversion_rules.py:951 -msgid "Feature" -msgstr "Fonctionnalité" +#: lib/solaar/ui/window.py:205 +msgid "Select a device" +msgstr "Sélectionner un périphérique" -#: lib/solaar/ui/diversion_rules.py:510 lib/solaar/ui/diversion_rules.py:874 -msgid "Process" -msgstr "Processus" +#: lib/solaar/ui/window.py:322 +msgid "Rule Editor" +msgstr "Éditeur de règles" -#: lib/solaar/ui/diversion_rules.py:511 lib/solaar/ui/diversion_rules.py:902 -msgid "MouseProcess" -msgstr "Processus de la souris" +#: lib/solaar/ui/window.py:533 +msgid "Path" +msgstr "Chemin" -#: lib/solaar/ui/diversion_rules.py:512 lib/solaar/ui/diversion_rules.py:984 -msgid "Report" -msgstr "Rapport" +#: lib/solaar/ui/window.py:536 +msgid "USB ID" +msgstr "ID USB" -#: lib/solaar/ui/diversion_rules.py:513 lib/solaar/ui/diversion_rules.py:1019 -msgid "Modifiers" -msgstr "Modificateurs" +#: 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 "Numéro de série" -#: lib/solaar/ui/diversion_rules.py:514 lib/solaar/ui/diversion_rules.py:1066 -msgid "Key" -msgstr "Touche" +#: lib/solaar/ui/window.py:545 +msgid "Index" +msgstr "Index" -#: lib/solaar/ui/diversion_rules.py:515 lib/solaar/ui/diversion_rules.py:1111 -msgid "Test" -msgstr "Test" +#: lib/solaar/ui/window.py:547 +msgid "Wireless PID" +msgstr "PID sans fil" -#: lib/solaar/ui/diversion_rules.py:516 lib/solaar/ui/diversion_rules.py:1196 -msgid "Mouse Gesture" -msgstr "Geste à la souris" +#: lib/solaar/ui/window.py:549 +msgid "Product ID" +msgstr "Identifiant produit" -#: lib/solaar/ui/diversion_rules.py:520 -msgid "Action" -msgstr "Action" - -#: lib/solaar/ui/diversion_rules.py:522 lib/solaar/ui/diversion_rules.py:1286 -msgid "Key press" -msgstr "Appui de touche" - -#: lib/solaar/ui/diversion_rules.py:523 lib/solaar/ui/diversion_rules.py:1335 -msgid "Mouse scroll" -msgstr "Défilement de la souris" - -#: lib/solaar/ui/diversion_rules.py:524 lib/solaar/ui/diversion_rules.py:1383 -msgid "Mouse click" -msgstr "Clic de la souris" - -#: lib/solaar/ui/diversion_rules.py:525 lib/solaar/ui/diversion_rules.py:1452 -msgid "Execute" -msgstr "Exécuter" - -#: lib/solaar/ui/diversion_rules.py:554 -msgid "Insert new rule" -msgstr "Insérer nouvelle règle" - -#: lib/solaar/ui/diversion_rules.py:574 lib/solaar/ui/diversion_rules.py:1146 -#: lib/solaar/ui/diversion_rules.py:1236 lib/solaar/ui/diversion_rules.py:1411 -msgid "Delete" -msgstr "Effacer" - -#: lib/solaar/ui/diversion_rules.py:596 -msgid "Negate" -msgstr "Nier" - -#: lib/solaar/ui/diversion_rules.py:620 -msgid "Wrap with" -msgstr "Entoure" - -#: lib/solaar/ui/diversion_rules.py:642 -msgid "Cut" -msgstr "Couper" - -#: lib/solaar/ui/diversion_rules.py:657 -msgid "Paste" -msgstr "Coller" - -#: lib/solaar/ui/diversion_rules.py:669 -msgid "Copy" -msgstr "Copier" - -#: lib/solaar/ui/diversion_rules.py:772 -msgid "This editor does not support the selected rule component yet." -msgstr "Cet éditeur ne gère pas encore le composant de règle sélectionné." - -#: lib/solaar/ui/diversion_rules.py:850 -msgid "Not" -msgstr "Non" - -#: lib/solaar/ui/diversion_rules.py:1039 -msgid "Key down" -msgstr "Touche du bas" - -#: lib/solaar/ui/diversion_rules.py:1042 -msgid "Key up" -msgstr "Touche du haut" - -#: lib/solaar/ui/diversion_rules.py:1131 -msgid "Add action" -msgstr "Ajouter une action" - -#: lib/solaar/ui/diversion_rules.py:1224 -msgid "Add key" -msgstr "Ajouter une touche" - -#: lib/solaar/ui/diversion_rules.py:1354 -msgid "Button" -msgstr "Bouton" - -#: lib/solaar/ui/diversion_rules.py:1355 -msgid "Count" -msgstr "Nombre" - -#: lib/solaar/ui/diversion_rules.py:1397 -msgid "Add argument" -msgstr "Ajouter un paramètre" - -#: lib/solaar/ui/notify.py:125 lib/solaar/ui/tray.py:319 -#: lib/solaar/ui/tray.py:324 lib/solaar/ui/window.py:749 -msgid "offline" -msgstr "non connecté" - -#: lib/solaar/ui/pair_window.py:134 -msgid "Pairing failed" -msgstr "Le jumelage a échoué" - -#: lib/solaar/ui/pair_window.py:136 -msgid "Make sure your device is within range, and has a decent battery " - "charge." -msgstr "Assurez-vous que votre périphérique soit à portée, et que sa " - "batterie soit suffisamment chargée." - -#: lib/solaar/ui/pair_window.py:138 -msgid "A new device was detected, but it is not compatible with this " - "receiver." -msgstr "Un nouveau périphérique a été détecté, mais il n'est pas compatible " - "avec ce récepteur." - -#: lib/solaar/ui/pair_window.py:140 -msgid "More paired devices than receiver can support." -msgstr "Il y a plus de périphériques jumelés que le récepteur ne peut en " - "supporter." - -#: lib/solaar/ui/pair_window.py:142 -msgid "No further details are available about the error." -msgstr "Aucun autre détail n'est disponible à propos de l'erreur." - -#: lib/solaar/ui/pair_window.py:156 -msgid "Found a new device:" -msgstr "Nouveau périphérique disponible :" - -#: lib/solaar/ui/pair_window.py:181 -msgid "The wireless link is not encrypted" -msgstr "La connexion sans fil n'est pas chiffrée" - -#: lib/solaar/ui/pair_window.py:199 -#, python-format -msgid "%(receiver_name)s: pair new device" -msgstr "%(receiver_name)s : jumele le nouveau périphérique" +#: lib/solaar/ui/window.py:551 +msgid "Protocol" +msgstr "Protocole" -#: lib/solaar/ui/pair_window.py:206 -msgid "If the device is already turned on, turn it off and on again." -msgstr "Si le périphérique est déjà allumé, éteignez-le et rallumez-le à " - "nouveau." +#: lib/solaar/ui/window.py:551 +msgid "Unknown" +msgstr "Inconnu" -#: lib/solaar/ui/pair_window.py:209 +#: lib/solaar/ui/window.py:554 #, python-format -msgid "\n" - "\n" - "This receiver has %d pairing remaining." -msgid_plural "\n" - "\n" - "This receiver has %d pairings remaining." -msgstr[0] "\n" - "\n" - "Ce récepteur a %d jumelage restant." -msgstr[1] "\n" - "\n" - "Ce récepteur a %d jumelages restants." - -#: lib/solaar/ui/pair_window.py:212 -msgid "\n" - "Cancelling at this point will not use up a pairing." -msgstr "\n" - "L'annulation à ce stade n'utilisera pas de jumelage." - -#: lib/solaar/ui/pair_window.py:215 -msgid "Turn on the device you want to pair." -msgstr "Allumez le périphérique que vous souhaitez jumeler." - -#: lib/solaar/ui/tray.py:61 -msgid "No Logitech receiver found" -msgstr "Aucun récepteur Logitech trouvé" - -#: lib/solaar/ui/tray.py:68 lib/solaar/ui/window.py:325 -msgid "Quit %s" -msgstr "Quitter %s" - -#: lib/solaar/ui/tray.py:298 lib/solaar/ui/tray.py:306 -msgid "no receiver" -msgstr "aucun récepteur" - -#: lib/solaar/ui/tray.py:322 -msgid "no status" -msgstr "aucun statut" - -#: lib/solaar/ui/window.py:104 -msgid "Scanning" -msgstr "Balayage" - -#: lib/solaar/ui/window.py:137 lib/solaar/ui/window.py:692 -msgid "Battery" -msgstr "Batterie" - -#: lib/solaar/ui/window.py:140 -msgid "Wireless Link" -msgstr "Connexion sans fil" - -#: lib/solaar/ui/window.py:144 -msgid "Lighting" -msgstr "Éclairage" - -#: lib/solaar/ui/window.py:178 -msgid "Show Technical Details" -msgstr "Voir les détails techniques" - -#: lib/solaar/ui/window.py:194 -msgid "Pair new device" -msgstr "Jumeler un nouveau périphérique" - -#: lib/solaar/ui/window.py:213 -msgid "Select a device" -msgstr "Sélectionner un périphérique" - -#: lib/solaar/ui/window.py:331 -msgid "Rule Editor" -msgstr "Éditeur de règles" - -#: lib/solaar/ui/window.py:541 -msgid "Path" -msgstr "Chemin" - -#: lib/solaar/ui/window.py:544 -msgid "USB ID" -msgstr "ID USB" - -#: lib/solaar/ui/window.py:547 lib/solaar/ui/window.py:549 -#: lib/solaar/ui/window.py:569 lib/solaar/ui/window.py:571 -msgid "Serial" -msgstr "Numéro de série" - -#: lib/solaar/ui/window.py:553 -msgid "Index" -msgstr "Index" - -#: lib/solaar/ui/window.py:555 -msgid "Wireless PID" -msgstr "PID sans fil" - -#: lib/solaar/ui/window.py:557 -msgid "Product ID" -msgstr "Identifiant produit" - -#: lib/solaar/ui/window.py:559 -msgid "Protocol" -msgstr "Protocole" - -#: lib/solaar/ui/window.py:559 -msgid "Unknown" -msgstr "Inconnu" - -#: lib/solaar/ui/window.py:562 -#, python-format -msgid "%(rate)d ms (%(rate_hz)dHz)" -msgstr "%(rate)d ms (%(rate_hz)dHz)" - -#: lib/solaar/ui/window.py:562 -msgid "Polling rate" -msgstr "Taux de scrutation" +msgid "%(rate)d ms (%(rate_hz)dHz)" +msgstr "%(rate)d ms (%(rate_hz)dHz)" -#: lib/solaar/ui/window.py:573 -msgid "Unit ID" -msgstr "ID d'unité" +#: lib/solaar/ui/window.py:554 +msgid "Polling rate" +msgstr "Taux de scrutation" -#: lib/solaar/ui/window.py:584 -msgid "none" -msgstr "aucun" +#: lib/solaar/ui/window.py:565 +msgid "Unit ID" +msgstr "ID d'unité" -#: lib/solaar/ui/window.py:585 -msgid "Notifications" -msgstr "Notifications" +#: lib/solaar/ui/window.py:576 +msgid "none" +msgstr "aucun" -#: lib/solaar/ui/window.py:622 -msgid "No device paired." -msgstr "Aucun périphérique jumelé." +#: lib/solaar/ui/window.py:577 +msgid "Notifications" +msgstr "Notifications" -#: lib/solaar/ui/window.py:629 -#, 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] "Jusqu'à %(max_count)s périphérique peut être jumelé à ce " - "récepteur." -msgstr[1] "Jusqu'à %(max_count)s périphériques peuvent être jumelés à " - "ce récepteur." - -#: lib/solaar/ui/window.py:635 -msgid "Only one device can be paired to this receiver." -msgstr "Un seul périphérique peut être jumelé à ce récepteur." - -#: lib/solaar/ui/window.py:639 -#, python-format -msgid "This receiver has %d pairing remaining." -msgid_plural "This receiver has %d pairings remaining." -msgstr[0] "Ce récepteur a %d jumelage restant." -msgstr[1] "Ce récepteur a %d jumelages restants." +#: lib/solaar/ui/window.py:621 +msgid "No device paired." +msgstr "Aucun périphérique jumelé." -#: lib/solaar/ui/window.py:694 -msgid "Battery information unknown." -msgstr "Aucune information concernant la batterie." - -#: lib/solaar/ui/window.py:702 -msgid "Battery Voltage" -msgstr "Tension de la batterie" - -#: lib/solaar/ui/window.py:704 -msgid "Voltage reported by battery" -msgstr "Tension indiquée par la batterie" - -#: lib/solaar/ui/window.py:706 lib/solaar/ui/window.py:710 -msgid "Battery Level" -msgstr "Niveau de la batterie" - -#: lib/solaar/ui/window.py:708 lib/solaar/ui/window.py:712 -msgid "Approximate level reported by battery" -msgstr "Niveau approximatif indiqué par la batterie" - -#: lib/solaar/ui/window.py:715 lib/solaar/ui/window.py:717 -msgid "next reported " -msgstr "prochain rapport " - -#: lib/solaar/ui/window.py:718 -msgid " and next level to be reported." -msgstr " et prochain niveau à rapporter." - -#: lib/solaar/ui/window.py:723 -msgid "last known" -msgstr "dernière valeur connue" - -#: lib/solaar/ui/window.py:731 -msgid "not encrypted" -msgstr "non chiffrée" - -#: lib/solaar/ui/window.py:735 -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 "La connexion sans fil entre cet appareil et son récepteur n'est pas " - "chiffrée.\n" - "\n" - "Pour des dispositifs de pointage (souris, trackball, trackpad), " - "c'est une faille mineure de sécurité\n" - "\n" - "Par contre, c'est une faille majeure pour les dispositifs d'entrée " - "de texte (clavier, pavé numérique)\n" - "car les données saisies peuvent être volées à votre insu par des " - "tiers à proximité." - -#: lib/solaar/ui/window.py:744 -msgid "encrypted" -msgstr "chiffrée" - -#: lib/solaar/ui/window.py:746 -msgid "The wireless link between this device and its receiver is encrypted." -msgstr "La connexion sans fil entre cet appareil et son récepteur est " - "chiffrée." - -#: lib/solaar/ui/window.py:759 +#: lib/solaar/ui/window.py:628 #, python-format -msgid "%(light_level)d lux" -msgstr "%(light_level)d lux" - -#~ msgid "Adjust the DPI by sliding the mouse horizontally while " -#~ "holding the DPI button." -#~ msgstr "Règle le DPI en glissant la souris à l'horizontale en " -#~ "maintenant la touche DPI." - -#~ msgid "Click to allow changes." -#~ msgstr "Cliquez pour autoriser les modifications." +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] "Jusqu'à %(max_count)s périphérique peut être jumelé à ce récepteur." +msgstr[1] "" +"Jusqu'à %(max_count)s périphériques peuvent être jumelés à ce récepteur." -#~ msgid "Click to prevent changes." -#~ msgstr "Cliquez pour empêcher les modifications." +#: lib/solaar/ui/window.py:634 +msgid "Only one device can be paired to this receiver." +msgstr "Un seul périphérique peut être jumelé à ce récepteur." -#~ msgid "For more information see the Solaar installation directions\n" -#~ "at https://pwr-solaar.github.io/Solaar/installation" -#~ msgstr "Pour plus d'informations, consultez les instructions " -#~ "d'installation\n" -#~ "de Solaar à l'adresse https://pwr-solaar.github.io/Solaar/" -#~ "installation" - -#~ msgid "Scroll Wheel HID++ Scrolling" -#~ msgstr "Déroulement HID++ à la mollette" - -#~ msgid "Shows status of devices connected\n" -#~ "through wireless Logitech receivers." -#~ msgstr "Affiche l'état des périphériques connectés\n" -#~ "à travers les récepteurs sans fil Logitech." +#: 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] "Ce récepteur a %d jumelage restant." +msgstr[1] "Ce récepteur a %d jumelages restants." -#~ msgid "Solaar depends on a udev file that is not present" -#~ msgstr "Solaar dépend d'un fichier udev qui n'est pas présent" +#: lib/solaar/ui/window.py:692 +msgid "Battery Voltage" +msgstr "Tension de la batterie" -#~ msgid "Thumb Wheel HID++ Scrolling" -#~ msgstr "Défilement de la molette de pouce HID++" +#: lib/solaar/ui/window.py:694 +msgid "Voltage reported by battery" +msgstr "Tension indiquée par la batterie" + +#: lib/solaar/ui/window.py:696 +msgid "Battery Level" +msgstr "Niveau de la batterie" + +#: lib/solaar/ui/window.py:698 +msgid "Approximate level reported by battery" +msgstr "Niveau approximatif indiqué par la batterie" + +#: lib/solaar/ui/window.py:705 lib/solaar/ui/window.py:707 +msgid "next reported " +msgstr "prochain rapport " + +#: lib/solaar/ui/window.py:708 +msgid " and next level to be reported." +msgstr " et prochain niveau à rapporter." + +#: lib/solaar/ui/window.py:713 +msgid "last known" +msgstr "dernière valeur connue" + +#: lib/solaar/ui/window.py:724 +msgid "encrypted" +msgstr "chiffrée" + +#: lib/solaar/ui/window.py:726 +msgid "The wireless link between this device and its receiver is encrypted." +msgstr "" +"La connexion sans fil entre ce périphérique et son récepteur est chiffrée." + +#: lib/solaar/ui/window.py:728 +msgid "not encrypted" +msgstr "non chiffrée" + +#: 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 "" +"La connexion sans fil entre ce périphérique et son récepteur n'est pas " +"chiffrée.\n" +"Ceci est un problème de sécurité pour les dispositifs de pointage, et un " +"problème majeur pour les périphériques de saisie de texte." + +#: lib/solaar/ui/window.py:748 +#, python-format +msgid "%(light_level)d lux" +msgstr "%(light_level)d lux" diff --git a/po/solaar.pot b/po/solaar.pot index a860de633..be900d8f7 100644 --- a/po/solaar.pot +++ b/po/solaar.pot @@ -5,9 +5,9 @@ # #, fuzzy msgid "" -msgstr "Project-Id-Version: solaar 1.1.7rc1\n" +msgstr "Project-Id-Version: solaar 1.1.10\n" "Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2022-10-28 10:28+0200\n" + "POT-Creation-Date: 2023-09-25 06:09+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -71,7 +71,7 @@ msgstr "" msgid "recharging" msgstr "" -#: lib/logitech_receiver/i18n.py:40 lib/solaar/ui/window.py:718 +#: lib/logitech_receiver/i18n.py:40 lib/solaar/ui/window.py:711 msgid "charging" msgstr "" @@ -131,7 +131,7 @@ msgstr "" msgid "sequence timeout" msgstr "" -#: lib/logitech_receiver/i18n.py:59 lib/solaar/ui/window.py:577 +#: lib/logitech_receiver/i18n.py:59 lib/solaar/ui/window.py:572 msgid "Firmware" msgstr "" @@ -245,7 +245,7 @@ msgstr "" msgid "discovery lock is open" msgstr "" -#: lib/logitech_receiver/notifications.py:224 lib/solaar/ui/notify.py:120 +#: lib/logitech_receiver/notifications.py:224 lib/solaar/ui/notify.py:122 msgid "connected" msgstr "" @@ -253,7 +253,7 @@ msgstr "" msgid "disconnected" msgstr "" -#: lib/logitech_receiver/notifications.py:262 lib/solaar/ui/notify.py:118 +#: lib/logitech_receiver/notifications.py:262 lib/solaar/ui/notify.py:120 msgid "unpaired" msgstr "" @@ -261,11 +261,11 @@ msgstr "" msgid "powered on" msgstr "" -#: lib/logitech_receiver/settings.py:735 +#: lib/logitech_receiver/settings.py:750 msgid "register" msgstr "" -#: lib/logitech_receiver/settings.py:749 lib/logitech_receiver/settings.py:776 +#: lib/logitech_receiver/settings.py:764 lib/logitech_receiver/settings.py:791 msgid "feature" msgstr "" @@ -316,7 +316,7 @@ msgid "Sensitivity (DPI - older mice)" msgstr "" #: lib/logitech_receiver/settings_templates.py:178 -#: lib/logitech_receiver/settings_templates.py:703 +#: lib/logitech_receiver/settings_templates.py:712 msgid "Mouse movement sensitivity" msgstr "" @@ -414,553 +414,561 @@ msgid "Frequency of device polling, in milliseconds" msgstr "" #: lib/logitech_receiver/settings_templates.py:333 -#: lib/logitech_receiver/settings_templates.py:1026 -#: lib/logitech_receiver/settings_templates.py:1054 +#: 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:363 +#: lib/logitech_receiver/settings_templates.py:365 msgid "Divert crown events" msgstr "" -#: lib/logitech_receiver/settings_templates.py:364 +#: 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:372 +#: lib/logitech_receiver/settings_templates.py:374 msgid "Crown smooth scroll" msgstr "" -#: lib/logitech_receiver/settings_templates.py:373 +#: lib/logitech_receiver/settings_templates.py:375 msgid "Set crown smooth scroll" msgstr "" -#: lib/logitech_receiver/settings_templates.py:381 +#: lib/logitech_receiver/settings_templates.py:383 msgid "Divert G Keys" msgstr "" -#: lib/logitech_receiver/settings_templates.py:383 +#: 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:384 +#: 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:399 +#: lib/logitech_receiver/settings_templates.py:402 msgid "Scroll Wheel Ratcheted" msgstr "" -#: lib/logitech_receiver/settings_templates.py:400 +#: 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:402 +#: lib/logitech_receiver/settings_templates.py:405 msgid "Freespinning" msgstr "" -#: lib/logitech_receiver/settings_templates.py:402 +#: lib/logitech_receiver/settings_templates.py:405 msgid "Ratcheted" msgstr "" -#: lib/logitech_receiver/settings_templates.py:409 +#: lib/logitech_receiver/settings_templates.py:412 msgid "Scroll Wheel Ratchet Speed" msgstr "" -#: lib/logitech_receiver/settings_templates.py:411 +#: 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:460 +#: lib/logitech_receiver/settings_templates.py:463 msgid "Key/Button Actions" msgstr "" -#: lib/logitech_receiver/settings_templates.py:462 +#: lib/logitech_receiver/settings_templates.py:465 msgid "Change the action for the key or button." msgstr "" -#: lib/logitech_receiver/settings_templates.py:462 +#: lib/logitech_receiver/settings_templates.py:465 msgid "Overridden by diversion." msgstr "" -#: lib/logitech_receiver/settings_templates.py:463 +#: 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:632 +#: lib/logitech_receiver/settings_templates.py:639 msgid "Key/Button Diversion" msgstr "" -#: lib/logitech_receiver/settings_templates.py:633 +#: 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:636 -#: lib/logitech_receiver/settings_templates.py:637 -#: lib/logitech_receiver/settings_templates.py:638 +#: lib/logitech_receiver/settings_templates.py:643 +#: lib/logitech_receiver/settings_templates.py:644 +#: lib/logitech_receiver/settings_templates.py:645 msgid "Diverted" msgstr "" -#: lib/logitech_receiver/settings_templates.py:636 -#: lib/logitech_receiver/settings_templates.py:637 +#: lib/logitech_receiver/settings_templates.py:643 +#: lib/logitech_receiver/settings_templates.py:644 msgid "Mouse Gestures" msgstr "" -#: lib/logitech_receiver/settings_templates.py:636 -#: lib/logitech_receiver/settings_templates.py:637 -#: lib/logitech_receiver/settings_templates.py:638 +#: 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:636 +#: lib/logitech_receiver/settings_templates.py:643 msgid "Sliding DPI" msgstr "" -#: lib/logitech_receiver/settings_templates.py:702 +#: lib/logitech_receiver/settings_templates.py:711 msgid "Sensitivity (DPI)" msgstr "" -#: lib/logitech_receiver/settings_templates.py:742 +#: lib/logitech_receiver/settings_templates.py:752 msgid "Sensitivity Switching" msgstr "" -#: lib/logitech_receiver/settings_templates.py:744 +#: 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:748 +#: lib/logitech_receiver/settings_templates.py:758 msgid "Off" msgstr "" -#: lib/logitech_receiver/settings_templates.py:779 +#: lib/logitech_receiver/settings_templates.py:791 msgid "Disable keys" msgstr "" -#: lib/logitech_receiver/settings_templates.py:780 +#: lib/logitech_receiver/settings_templates.py:792 msgid "Disable specific keyboard keys." msgstr "" -#: lib/logitech_receiver/settings_templates.py:783 +#: lib/logitech_receiver/settings_templates.py:795 #, python-format msgid "Disables the %s key." msgstr "" -#: lib/logitech_receiver/settings_templates.py:796 -#: lib/logitech_receiver/settings_templates.py:844 +#: lib/logitech_receiver/settings_templates.py:809 +#: lib/logitech_receiver/settings_templates.py:860 msgid "Set OS" msgstr "" -#: lib/logitech_receiver/settings_templates.py:797 -#: lib/logitech_receiver/settings_templates.py:845 +#: 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:857 +#: lib/logitech_receiver/settings_templates.py:873 msgid "Change Host" msgstr "" -#: lib/logitech_receiver/settings_templates.py:858 +#: lib/logitech_receiver/settings_templates.py:874 msgid "Switch connection to a different host" msgstr "" -#: lib/logitech_receiver/settings_templates.py:883 +#: lib/logitech_receiver/settings_templates.py:900 msgid "Performs a left click." msgstr "" -#: lib/logitech_receiver/settings_templates.py:883 +#: lib/logitech_receiver/settings_templates.py:900 msgid "Single tap" msgstr "" -#: lib/logitech_receiver/settings_templates.py:884 +#: lib/logitech_receiver/settings_templates.py:901 msgid "Performs a right click." msgstr "" -#: lib/logitech_receiver/settings_templates.py:884 +#: lib/logitech_receiver/settings_templates.py:901 msgid "Single tap with two fingers" msgstr "" -#: lib/logitech_receiver/settings_templates.py:885 +#: lib/logitech_receiver/settings_templates.py:902 msgid "Single tap with three fingers" msgstr "" -#: lib/logitech_receiver/settings_templates.py:889 +#: lib/logitech_receiver/settings_templates.py:906 msgid "Double tap" msgstr "" -#: lib/logitech_receiver/settings_templates.py:889 +#: lib/logitech_receiver/settings_templates.py:906 msgid "Performs a double click." msgstr "" -#: lib/logitech_receiver/settings_templates.py:890 +#: lib/logitech_receiver/settings_templates.py:907 msgid "Double tap with two fingers" msgstr "" -#: lib/logitech_receiver/settings_templates.py:891 +#: lib/logitech_receiver/settings_templates.py:908 msgid "Double tap with three fingers" msgstr "" -#: lib/logitech_receiver/settings_templates.py:894 +#: lib/logitech_receiver/settings_templates.py:911 msgid "Drags items by dragging the finger after double tapping." msgstr "" -#: lib/logitech_receiver/settings_templates.py:894 +#: lib/logitech_receiver/settings_templates.py:911 msgid "Tap and drag" msgstr "" -#: lib/logitech_receiver/settings_templates.py:896 +#: lib/logitech_receiver/settings_templates.py:913 msgid "Drags items by dragging the fingers after double tapping." msgstr "" -#: lib/logitech_receiver/settings_templates.py:896 +#: lib/logitech_receiver/settings_templates.py:913 msgid "Tap and drag with two fingers" msgstr "" -#: lib/logitech_receiver/settings_templates.py:897 +#: lib/logitech_receiver/settings_templates.py:914 msgid "Tap and drag with three fingers" msgstr "" -#: lib/logitech_receiver/settings_templates.py:900 +#: 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:900 +#: lib/logitech_receiver/settings_templates.py:917 msgid "Suppress tap and edge gestures" msgstr "" -#: lib/logitech_receiver/settings_templates.py:901 +#: lib/logitech_receiver/settings_templates.py:918 msgid "Scroll with one finger" msgstr "" -#: lib/logitech_receiver/settings_templates.py:901 -#: lib/logitech_receiver/settings_templates.py:902 -#: lib/logitech_receiver/settings_templates.py:905 +#: 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:902 -#: lib/logitech_receiver/settings_templates.py:905 +#: 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:903 +#: lib/logitech_receiver/settings_templates.py:920 msgid "Scroll horizontally with two fingers" msgstr "" -#: lib/logitech_receiver/settings_templates.py:903 +#: lib/logitech_receiver/settings_templates.py:920 msgid "Scrolls horizontally." msgstr "" -#: lib/logitech_receiver/settings_templates.py:904 +#: lib/logitech_receiver/settings_templates.py:921 msgid "Scroll vertically with two fingers" msgstr "" -#: lib/logitech_receiver/settings_templates.py:904 +#: lib/logitech_receiver/settings_templates.py:921 msgid "Scrolls vertically." msgstr "" -#: lib/logitech_receiver/settings_templates.py:906 +#: lib/logitech_receiver/settings_templates.py:923 msgid "Inverts the scrolling direction." msgstr "" -#: lib/logitech_receiver/settings_templates.py:906 +#: lib/logitech_receiver/settings_templates.py:923 msgid "Natural scrolling" msgstr "" -#: lib/logitech_receiver/settings_templates.py:907 +#: lib/logitech_receiver/settings_templates.py:924 msgid "Enables the thumbwheel." msgstr "" -#: lib/logitech_receiver/settings_templates.py:907 +#: lib/logitech_receiver/settings_templates.py:924 msgid "Thumbwheel" msgstr "" -#: lib/logitech_receiver/settings_templates.py:918 -#: lib/logitech_receiver/settings_templates.py:922 +#: 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:919 +#: lib/logitech_receiver/settings_templates.py:936 msgid "Swipe from the left edge" msgstr "" -#: lib/logitech_receiver/settings_templates.py:920 +#: lib/logitech_receiver/settings_templates.py:937 msgid "Swipe from the right edge" msgstr "" -#: lib/logitech_receiver/settings_templates.py:921 +#: lib/logitech_receiver/settings_templates.py:938 msgid "Swipe from the bottom edge" msgstr "" -#: lib/logitech_receiver/settings_templates.py:923 +#: lib/logitech_receiver/settings_templates.py:940 msgid "Swipe two fingers from the left edge" msgstr "" -#: lib/logitech_receiver/settings_templates.py:924 +#: lib/logitech_receiver/settings_templates.py:941 msgid "Swipe two fingers from the right edge" msgstr "" -#: lib/logitech_receiver/settings_templates.py:925 +#: lib/logitech_receiver/settings_templates.py:942 msgid "Swipe two fingers from the bottom edge" msgstr "" -#: lib/logitech_receiver/settings_templates.py:926 +#: lib/logitech_receiver/settings_templates.py:943 msgid "Swipe two fingers from the top edge" msgstr "" -#: lib/logitech_receiver/settings_templates.py:927 -#: lib/logitech_receiver/settings_templates.py:931 +#: 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:927 +#: lib/logitech_receiver/settings_templates.py:944 msgid "Zoom with two fingers." msgstr "" -#: lib/logitech_receiver/settings_templates.py:928 +#: lib/logitech_receiver/settings_templates.py:945 msgid "Pinch to zoom out." msgstr "" -#: lib/logitech_receiver/settings_templates.py:929 +#: lib/logitech_receiver/settings_templates.py:946 msgid "Spread to zoom in." msgstr "" -#: lib/logitech_receiver/settings_templates.py:930 +#: lib/logitech_receiver/settings_templates.py:947 msgid "Zoom with three fingers." msgstr "" -#: lib/logitech_receiver/settings_templates.py:931 +#: lib/logitech_receiver/settings_templates.py:948 msgid "Zoom with two fingers" msgstr "" -#: lib/logitech_receiver/settings_templates.py:949 +#: lib/logitech_receiver/settings_templates.py:966 msgid "Pixel zone" msgstr "" -#: lib/logitech_receiver/settings_templates.py:950 +#: lib/logitech_receiver/settings_templates.py:967 msgid "Ratio zone" msgstr "" -#: lib/logitech_receiver/settings_templates.py:951 +#: lib/logitech_receiver/settings_templates.py:968 msgid "Scale factor" msgstr "" -#: lib/logitech_receiver/settings_templates.py:951 +#: lib/logitech_receiver/settings_templates.py:968 msgid "Sets the cursor speed." msgstr "" -#: lib/logitech_receiver/settings_templates.py:955 +#: lib/logitech_receiver/settings_templates.py:972 msgid "Left" msgstr "" -#: lib/logitech_receiver/settings_templates.py:955 +#: lib/logitech_receiver/settings_templates.py:972 msgid "Left-most coordinate." msgstr "" -#: lib/logitech_receiver/settings_templates.py:956 +#: lib/logitech_receiver/settings_templates.py:973 msgid "Bottom" msgstr "" -#: lib/logitech_receiver/settings_templates.py:956 +#: lib/logitech_receiver/settings_templates.py:973 msgid "Bottom coordinate." msgstr "" -#: lib/logitech_receiver/settings_templates.py:957 +#: lib/logitech_receiver/settings_templates.py:974 msgid "Width" msgstr "" -#: lib/logitech_receiver/settings_templates.py:957 +#: lib/logitech_receiver/settings_templates.py:974 msgid "Width." msgstr "" -#: lib/logitech_receiver/settings_templates.py:958 +#: lib/logitech_receiver/settings_templates.py:975 msgid "Height" msgstr "" -#: lib/logitech_receiver/settings_templates.py:958 +#: lib/logitech_receiver/settings_templates.py:975 msgid "Height." msgstr "" -#: lib/logitech_receiver/settings_templates.py:959 +#: lib/logitech_receiver/settings_templates.py:976 msgid "Cursor speed." msgstr "" -#: lib/logitech_receiver/settings_templates.py:959 +#: lib/logitech_receiver/settings_templates.py:976 msgid "Scale" msgstr "" -#: lib/logitech_receiver/settings_templates.py:965 +#: lib/logitech_receiver/settings_templates.py:982 msgid "Gestures" msgstr "" -#: lib/logitech_receiver/settings_templates.py:966 +#: lib/logitech_receiver/settings_templates.py:983 msgid "Tweak the mouse/touchpad behaviour." msgstr "" -#: lib/logitech_receiver/settings_templates.py:982 +#: lib/logitech_receiver/settings_templates.py:1000 msgid "Gestures Diversion" msgstr "" -#: lib/logitech_receiver/settings_templates.py:983 +#: lib/logitech_receiver/settings_templates.py:1001 msgid "Divert mouse/touchpad gestures." msgstr "" -#: lib/logitech_receiver/settings_templates.py:999 +#: lib/logitech_receiver/settings_templates.py:1018 msgid "Gesture params" msgstr "" -#: lib/logitech_receiver/settings_templates.py:1000 +#: lib/logitech_receiver/settings_templates.py:1019 msgid "Change numerical parameters of a mouse/touchpad." msgstr "" -#: lib/logitech_receiver/settings_templates.py:1024 +#: lib/logitech_receiver/settings_templates.py:1044 msgid "M-Key LEDs" msgstr "" -#: lib/logitech_receiver/settings_templates.py:1026 +#: lib/logitech_receiver/settings_templates.py:1046 msgid "Control the M-Key LEDs." msgstr "" -#: lib/logitech_receiver/settings_templates.py:1027 -#: lib/logitech_receiver/settings_templates.py:1055 +#: 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:1033 +#: lib/logitech_receiver/settings_templates.py:1053 #, python-format msgid "Lights up the %s key." msgstr "" -#: lib/logitech_receiver/settings_templates.py:1052 +#: lib/logitech_receiver/settings_templates.py:1074 msgid "MR-Key LED" msgstr "" -#: lib/logitech_receiver/settings_templates.py:1054 +#: lib/logitech_receiver/settings_templates.py:1076 msgid "Control the MR-Key LED." msgstr "" -#: lib/logitech_receiver/settings_templates.py:1072 +#: lib/logitech_receiver/settings_templates.py:1095 msgid "Persistent Key/Button Mapping" msgstr "" -#: lib/logitech_receiver/settings_templates.py:1074 +#: lib/logitech_receiver/settings_templates.py:1097 msgid "Permanently change the mapping for the key or button." msgstr "" -#: lib/logitech_receiver/settings_templates.py:1075 +#: 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:1132 +#: lib/logitech_receiver/settings_templates.py:1157 msgid "Sidetone" msgstr "" -#: lib/logitech_receiver/settings_templates.py:1133 +#: lib/logitech_receiver/settings_templates.py:1158 msgid "Set sidetone level." msgstr "" -#: lib/logitech_receiver/settings_templates.py:1142 +#: lib/logitech_receiver/settings_templates.py:1167 msgid "Equalizer" msgstr "" -#: lib/logitech_receiver/settings_templates.py:1143 +#: lib/logitech_receiver/settings_templates.py:1168 msgid "Set equalizer levels." msgstr "" -#: lib/logitech_receiver/settings_templates.py:1165 +#: lib/logitech_receiver/settings_templates.py:1191 msgid "Hz" msgstr "" -#: lib/logitech_receiver/status.py:113 +#: lib/logitech_receiver/settings_templates.py:1197 +msgid "Power Management" +msgstr "" + +#: lib/logitech_receiver/settings_templates.py:1198 +msgid "Power off in minutes (0 for never)." +msgstr "" + +#: lib/logitech_receiver/status.py:114 msgid "No paired devices." msgstr "" -#: lib/logitech_receiver/status.py:114 lib/solaar/ui/window.py:620 +#: lib/logitech_receiver/status.py:115 lib/solaar/ui/window.py:622 #, python-format msgid "%(count)s paired device." msgid_plural "%(count)s paired devices." msgstr[0] "" msgstr[1] "" -#: lib/logitech_receiver/status.py:167 +#: lib/logitech_receiver/status.py:170 #, python-format msgid "Battery: %(level)s" msgstr "" -#: lib/logitech_receiver/status.py:169 +#: lib/logitech_receiver/status.py:172 #, python-format msgid "Battery: %(percent)d%%" msgstr "" -#: lib/logitech_receiver/status.py:181 +#: lib/logitech_receiver/status.py:184 #, python-format msgid "Lighting: %(level)s lux" msgstr "" -#: lib/logitech_receiver/status.py:236 +#: lib/logitech_receiver/status.py:239 #, python-format msgid "Battery: %(level)s (%(status)s)" msgstr "" -#: lib/logitech_receiver/status.py:238 +#: lib/logitech_receiver/status.py:241 #, python-format msgid "Battery: %(percent)d%% (%(status)s)" msgstr "" -#: lib/solaar/ui/__init__.py:51 +#: lib/solaar/ui/__init__.py:52 msgid "Permissions error" msgstr "" -#: lib/solaar/ui/__init__.py:53 +#: lib/solaar/ui/__init__.py:54 #, python-format -msgid "Found a Logitech Receiver (%s), but did not have permission to open " - "it." +msgid "Found a Logitech receiver or device (%s), but did not have " + "permission to open it." msgstr "" -#: lib/solaar/ui/__init__.py:54 -msgid "If you've just installed Solaar, try removing the receiver and " - "plugging it back in." +#: 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/solaar/ui/__init__.py:57 +#: lib/solaar/ui/__init__.py:58 msgid "Cannot connect to device error" msgstr "" -#: lib/solaar/ui/__init__.py:59 +#: 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/solaar/ui/__init__.py:60 -msgid "Try removing the device and plugging it back in or turning it off " - "and then on." +#: lib/solaar/ui/__init__.py:61 +msgid "Try disconnecting the device and then reconnecting it or turning it " + "off and then on." msgstr "" -#: lib/solaar/ui/__init__.py:63 +#: lib/solaar/ui/__init__.py:64 msgid "Unpairing failed" msgstr "" -#: lib/solaar/ui/__init__.py:65 +#: lib/solaar/ui/__init__.py:66 #, python-brace-format msgid "Failed to unpair %{device} from %{receiver}." msgstr "" -#: lib/solaar/ui/__init__.py:66 +#: lib/solaar/ui/__init__.py:67 msgid "The receiver returned an error, with no further details." msgstr "" -#: lib/solaar/ui/__init__.py:176 +#: lib/solaar/ui/__init__.py:177 msgid "Another Solaar process is already running so just expose its window" msgstr "" @@ -986,478 +994,507 @@ msgid "Logitech documentation" msgstr "" #: lib/solaar/ui/action.py:85 lib/solaar/ui/action.py:89 -#: lib/solaar/ui/window.py:202 +#: lib/solaar/ui/window.py:197 msgid "Unpair" msgstr "" -#: lib/solaar/ui/action.py:88 lib/solaar/ui/diversion_rules.py:148 +#: lib/solaar/ui/action.py:88 lib/solaar/ui/diversion_rules.py:150 msgid "Cancel" msgstr "" -#: lib/solaar/ui/config_panel.py:205 +#: lib/solaar/ui/config_panel.py:212 msgid "Complete - ENTER to change" msgstr "" -#: lib/solaar/ui/config_panel.py:205 +#: lib/solaar/ui/config_panel.py:212 msgid "Incomplete" msgstr "" -#: lib/solaar/ui/config_panel.py:444 lib/solaar/ui/config_panel.py:495 +#: lib/solaar/ui/config_panel.py:455 lib/solaar/ui/config_panel.py:507 #, python-format msgid "%d value" msgid_plural "%d values" msgstr[0] "" msgstr[1] "" -#: lib/solaar/ui/config_panel.py:506 +#: lib/solaar/ui/config_panel.py:518 msgid "Changes allowed" msgstr "" -#: lib/solaar/ui/config_panel.py:507 +#: lib/solaar/ui/config_panel.py:519 msgid "No changes allowed" msgstr "" -#: lib/solaar/ui/config_panel.py:508 +#: lib/solaar/ui/config_panel.py:520 msgid "Ignore this setting" msgstr "" -#: lib/solaar/ui/config_panel.py:553 +#: lib/solaar/ui/config_panel.py:565 msgid "Working" msgstr "" -#: lib/solaar/ui/config_panel.py:556 +#: lib/solaar/ui/config_panel.py:568 msgid "Read/write operation failed." msgstr "" -#: lib/solaar/ui/diversion_rules.py:64 +#: lib/solaar/ui/diversion_rules.py:65 msgid "Built-in rules" msgstr "" -#: lib/solaar/ui/diversion_rules.py:64 +#: lib/solaar/ui/diversion_rules.py:65 msgid "User-defined rules" msgstr "" -#: lib/solaar/ui/diversion_rules.py:66 lib/solaar/ui/diversion_rules.py:1075 +#: lib/solaar/ui/diversion_rules.py:67 lib/solaar/ui/diversion_rules.py:1083 msgid "Rule" msgstr "" -#: lib/solaar/ui/diversion_rules.py:67 lib/solaar/ui/diversion_rules.py:507 -#: lib/solaar/ui/diversion_rules.py:631 +#: 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/diversion_rules.py:69 +#: lib/solaar/ui/diversion_rules.py:70 msgid "[empty]" msgstr "" -#: lib/solaar/ui/diversion_rules.py:92 +#: lib/solaar/ui/diversion_rules.py:94 msgid "Solaar Rule Editor" msgstr "" -#: lib/solaar/ui/diversion_rules.py:139 +#: lib/solaar/ui/diversion_rules.py:141 msgid "Make changes permanent?" msgstr "" -#: lib/solaar/ui/diversion_rules.py:144 +#: lib/solaar/ui/diversion_rules.py:146 msgid "Yes" msgstr "" -#: lib/solaar/ui/diversion_rules.py:146 +#: lib/solaar/ui/diversion_rules.py:148 msgid "No" msgstr "" -#: lib/solaar/ui/diversion_rules.py:151 +#: lib/solaar/ui/diversion_rules.py:153 msgid "If you choose No, changes will be lost when Solaar is closed." msgstr "" -#: lib/solaar/ui/diversion_rules.py:199 +#: lib/solaar/ui/diversion_rules.py:201 msgid "Save changes" msgstr "" -#: lib/solaar/ui/diversion_rules.py:204 +#: lib/solaar/ui/diversion_rules.py:206 msgid "Discard changes" msgstr "" -#: lib/solaar/ui/diversion_rules.py:370 +#: lib/solaar/ui/diversion_rules.py:372 msgid "Insert here" msgstr "" -#: lib/solaar/ui/diversion_rules.py:372 +#: lib/solaar/ui/diversion_rules.py:374 msgid "Insert above" msgstr "" -#: lib/solaar/ui/diversion_rules.py:374 +#: lib/solaar/ui/diversion_rules.py:376 msgid "Insert below" msgstr "" -#: lib/solaar/ui/diversion_rules.py:380 +#: lib/solaar/ui/diversion_rules.py:382 msgid "Insert new rule here" msgstr "" -#: lib/solaar/ui/diversion_rules.py:382 +#: lib/solaar/ui/diversion_rules.py:384 msgid "Insert new rule above" msgstr "" -#: lib/solaar/ui/diversion_rules.py:384 +#: lib/solaar/ui/diversion_rules.py:386 msgid "Insert new rule below" msgstr "" -#: lib/solaar/ui/diversion_rules.py:425 +#: lib/solaar/ui/diversion_rules.py:427 msgid "Paste here" msgstr "" -#: lib/solaar/ui/diversion_rules.py:427 +#: lib/solaar/ui/diversion_rules.py:429 msgid "Paste above" msgstr "" -#: lib/solaar/ui/diversion_rules.py:429 +#: lib/solaar/ui/diversion_rules.py:431 msgid "Paste below" msgstr "" -#: lib/solaar/ui/diversion_rules.py:435 +#: lib/solaar/ui/diversion_rules.py:437 msgid "Paste rule here" msgstr "" -#: lib/solaar/ui/diversion_rules.py:437 +#: lib/solaar/ui/diversion_rules.py:439 msgid "Paste rule above" msgstr "" -#: lib/solaar/ui/diversion_rules.py:439 +#: lib/solaar/ui/diversion_rules.py:441 msgid "Paste rule below" msgstr "" -#: lib/solaar/ui/diversion_rules.py:443 +#: lib/solaar/ui/diversion_rules.py:445 msgid "Paste rule" msgstr "" -#: lib/solaar/ui/diversion_rules.py:472 +#: lib/solaar/ui/diversion_rules.py:474 msgid "Flatten" msgstr "" -#: lib/solaar/ui/diversion_rules.py:505 +#: lib/solaar/ui/diversion_rules.py:507 msgid "Insert" msgstr "" -#: lib/solaar/ui/diversion_rules.py:508 lib/solaar/ui/diversion_rules.py:633 -#: lib/solaar/ui/diversion_rules.py:1118 +#: 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:509 lib/solaar/ui/diversion_rules.py:632 -#: lib/solaar/ui/diversion_rules.py:1103 +#: 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:511 +#: lib/solaar/ui/diversion_rules.py:513 msgid "Condition" msgstr "" -#: lib/solaar/ui/diversion_rules.py:513 lib/solaar/ui/diversion_rules.py:1284 +#: lib/solaar/ui/diversion_rules.py:515 lib/solaar/ui/diversion_rules.py:1292 msgid "Feature" msgstr "" -#: lib/solaar/ui/diversion_rules.py:514 lib/solaar/ui/diversion_rules.py:1320 +#: lib/solaar/ui/diversion_rules.py:516 lib/solaar/ui/diversion_rules.py:1328 msgid "Report" msgstr "" -#: lib/solaar/ui/diversion_rules.py:515 lib/solaar/ui/diversion_rules.py:1196 +#: lib/solaar/ui/diversion_rules.py:517 lib/solaar/ui/diversion_rules.py:1204 msgid "Process" msgstr "" -#: lib/solaar/ui/diversion_rules.py:516 +#: lib/solaar/ui/diversion_rules.py:518 msgid "Mouse process" msgstr "" -#: lib/solaar/ui/diversion_rules.py:517 lib/solaar/ui/diversion_rules.py:1358 +#: lib/solaar/ui/diversion_rules.py:519 lib/solaar/ui/diversion_rules.py:1366 msgid "Modifiers" msgstr "" -#: lib/solaar/ui/diversion_rules.py:518 lib/solaar/ui/diversion_rules.py:1411 +#: lib/solaar/ui/diversion_rules.py:520 lib/solaar/ui/diversion_rules.py:1419 msgid "Key" msgstr "" -#: lib/solaar/ui/diversion_rules.py:519 lib/solaar/ui/diversion_rules.py:2177 +#: 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 "" -#: lib/solaar/ui/diversion_rules.py:520 lib/solaar/ui/diversion_rules.py:2220 +#: 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:521 lib/solaar/ui/diversion_rules.py:1459 +#: 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:522 lib/solaar/ui/diversion_rules.py:1576 +#: lib/solaar/ui/diversion_rules.py:527 lib/solaar/ui/diversion_rules.py:1643 msgid "Test bytes" msgstr "" -#: lib/solaar/ui/diversion_rules.py:523 lib/solaar/ui/diversion_rules.py:1669 +#: lib/solaar/ui/diversion_rules.py:528 lib/solaar/ui/diversion_rules.py:1736 msgid "Mouse Gesture" msgstr "" -#: lib/solaar/ui/diversion_rules.py:527 +#: lib/solaar/ui/diversion_rules.py:532 msgid "Action" msgstr "" -#: lib/solaar/ui/diversion_rules.py:529 lib/solaar/ui/diversion_rules.py:1778 +#: lib/solaar/ui/diversion_rules.py:534 lib/solaar/ui/diversion_rules.py:1845 msgid "Key press" msgstr "" -#: lib/solaar/ui/diversion_rules.py:530 lib/solaar/ui/diversion_rules.py:1831 +#: lib/solaar/ui/diversion_rules.py:535 lib/solaar/ui/diversion_rules.py:1897 msgid "Mouse scroll" msgstr "" -#: lib/solaar/ui/diversion_rules.py:531 lib/solaar/ui/diversion_rules.py:1882 +#: lib/solaar/ui/diversion_rules.py:536 lib/solaar/ui/diversion_rules.py:1959 msgid "Mouse click" msgstr "" -#: lib/solaar/ui/diversion_rules.py:532 +#: lib/solaar/ui/diversion_rules.py:537 msgid "Set" msgstr "" -#: lib/solaar/ui/diversion_rules.py:533 lib/solaar/ui/diversion_rules.py:1953 +#: lib/solaar/ui/diversion_rules.py:538 lib/solaar/ui/diversion_rules.py:2030 msgid "Execute" msgstr "" -#: lib/solaar/ui/diversion_rules.py:534 lib/solaar/ui/diversion_rules.py:1150 +#: lib/solaar/ui/diversion_rules.py:539 lib/solaar/ui/diversion_rules.py:1158 msgid "Later" msgstr "" -#: lib/solaar/ui/diversion_rules.py:563 +#: lib/solaar/ui/diversion_rules.py:568 msgid "Insert new rule" msgstr "" -#: lib/solaar/ui/diversion_rules.py:583 lib/solaar/ui/diversion_rules.py:1619 -#: lib/solaar/ui/diversion_rules.py:1723 lib/solaar/ui/diversion_rules.py:1912 +#: 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:605 +#: lib/solaar/ui/diversion_rules.py:610 msgid "Negate" msgstr "" -#: lib/solaar/ui/diversion_rules.py:629 +#: lib/solaar/ui/diversion_rules.py:634 msgid "Wrap with" msgstr "" -#: lib/solaar/ui/diversion_rules.py:651 +#: lib/solaar/ui/diversion_rules.py:656 msgid "Cut" msgstr "" -#: lib/solaar/ui/diversion_rules.py:666 +#: lib/solaar/ui/diversion_rules.py:671 msgid "Paste" msgstr "" -#: lib/solaar/ui/diversion_rules.py:678 +#: lib/solaar/ui/diversion_rules.py:683 msgid "Copy" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1055 +#: 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:1130 +#: lib/solaar/ui/diversion_rules.py:1138 msgid "Number of seconds to delay." msgstr "" -#: lib/solaar/ui/diversion_rules.py:1169 +#: lib/solaar/ui/diversion_rules.py:1177 msgid "Not" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1179 +#: lib/solaar/ui/diversion_rules.py:1187 msgid "X11 active process. For use in X11 only." msgstr "" -#: lib/solaar/ui/diversion_rules.py:1210 +#: lib/solaar/ui/diversion_rules.py:1218 msgid "X11 mouse process. For use in X11 only." msgstr "" -#: lib/solaar/ui/diversion_rules.py:1227 +#: lib/solaar/ui/diversion_rules.py:1235 msgid "MouseProcess" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1252 +#: lib/solaar/ui/diversion_rules.py:1260 msgid "Feature name of notification triggering rule processing." msgstr "" -#: lib/solaar/ui/diversion_rules.py:1300 +#: lib/solaar/ui/diversion_rules.py:1308 msgid "Report number of notification triggering rule processing." msgstr "" -#: lib/solaar/ui/diversion_rules.py:1334 +#: lib/solaar/ui/diversion_rules.py:1342 msgid "Active keyboard modifiers. Not always available in Wayland." msgstr "" -#: lib/solaar/ui/diversion_rules.py:1375 +#: lib/solaar/ui/diversion_rules.py:1383 msgid "Diverted key or button depressed or released.\n" - "Use the Key/Button Diversion setting to divert keys and buttons." + "Use the Key/Button Diversion and Divert G Keys settings to divert " + "keys and buttons." msgstr "" -#: lib/solaar/ui/diversion_rules.py:1384 +#: lib/solaar/ui/diversion_rules.py:1392 msgid "Key down" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1387 +#: lib/solaar/ui/diversion_rules.py:1395 msgid "Key up" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1425 -msgid "Test condition on notification triggering rule processing." +#: 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:1476 +#: lib/solaar/ui/diversion_rules.py:1543 msgid "end (exclusive)" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1485 +#: lib/solaar/ui/diversion_rules.py:1552 msgid "range" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1487 +#: lib/solaar/ui/diversion_rules.py:1554 msgid "minimum" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1488 +#: lib/solaar/ui/diversion_rules.py:1555 msgid "maximum" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1490 +#: lib/solaar/ui/diversion_rules.py:1557 #, python-format msgid "bytes %(0)d to %(1)d, ranging from %(2)d to %(3)d" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1495 +#: lib/solaar/ui/diversion_rules.py:1562 msgid "mask" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1496 +#: lib/solaar/ui/diversion_rules.py:1563 #, python-format msgid "bytes %(0)d to %(1)d, mask %(2)d" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1506 +#: lib/solaar/ui/diversion_rules.py:1573 msgid "Bit or range test on bytes in notification message triggering rule " "processing." msgstr "" -#: lib/solaar/ui/diversion_rules.py:1516 +#: lib/solaar/ui/diversion_rules.py:1583 msgid "type" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1599 +#: 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:1604 +#: lib/solaar/ui/diversion_rules.py:1671 msgid "Add movement" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1697 +#: 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:1702 +#: lib/solaar/ui/diversion_rules.py:1769 msgid "Add key" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1705 +#: lib/solaar/ui/diversion_rules.py:1772 msgid "Click" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1708 +#: lib/solaar/ui/diversion_rules.py:1775 msgid "Depress" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1711 +#: lib/solaar/ui/diversion_rules.py:1778 msgid "Release" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1795 +#: 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:1851 +#: 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:1854 +#: lib/solaar/ui/diversion_rules.py:1921 msgid "Button" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1855 -msgid "Count" +#: lib/solaar/ui/diversion_rules.py:1922 +msgid "Count and Action" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1895 +#: lib/solaar/ui/diversion_rules.py:1972 msgid "Execute a command with arguments." msgstr "" -#: lib/solaar/ui/diversion_rules.py:1898 +#: lib/solaar/ui/diversion_rules.py:1975 msgid "Add argument" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1972 +#: lib/solaar/ui/diversion_rules.py:2050 msgid "Toggle" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1972 +#: lib/solaar/ui/diversion_rules.py:2050 msgid "True" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1973 +#: lib/solaar/ui/diversion_rules.py:2051 msgid "False" msgstr "" -#: lib/solaar/ui/diversion_rules.py:1987 +#: lib/solaar/ui/diversion_rules.py:2065 msgid "Unsupported setting" msgstr "" -#: lib/solaar/ui/diversion_rules.py:2133 lib/solaar/ui/diversion_rules.py:2204 -msgid "Device" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:2138 lib/solaar/ui/diversion_rules.py:2170 -#: lib/solaar/ui/diversion_rules.py:2209 lib/solaar/ui/diversion_rules.py:2451 -#: lib/solaar/ui/diversion_rules.py:2469 +#: 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:2159 +#: lib/solaar/ui/diversion_rules.py:2256 msgid "Device is active and its settings can be changed." msgstr "" -#: lib/solaar/ui/diversion_rules.py:2228 +#: 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 "" -#: lib/solaar/ui/diversion_rules.py:2236 +#: lib/solaar/ui/diversion_rules.py:2355 msgid "Item" msgstr "" -#: lib/solaar/ui/diversion_rules.py:2511 +#: lib/solaar/ui/diversion_rules.py:2630 msgid "Change setting on device" msgstr "" -#: lib/solaar/ui/diversion_rules.py:2528 +#: lib/solaar/ui/diversion_rules.py:2647 msgid "Setting on device" msgstr "" -#: lib/solaar/ui/notify.py:122 lib/solaar/ui/tray.py:323 -#: lib/solaar/ui/tray.py:328 lib/solaar/ui/window.py:742 +#: lib/solaar/ui/notify.py:124 lib/solaar/ui/tray.py:320 +#: lib/solaar/ui/tray.py:325 lib/solaar/ui/window.py:739 msgid "offline" msgstr "" #: lib/solaar/ui/pair_window.py:122 lib/solaar/ui/pair_window.py:256 -#: lib/solaar/ui/pair_window.py:278 +#: lib/solaar/ui/pair_window.py:288 #, python-format msgid "%(receiver_name)s: pair new device" msgstr "" @@ -1517,23 +1554,39 @@ msgid "The wireless link is not encrypted" msgstr "" #: 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:266 +#: 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:268 +#: lib/solaar/ui/pair_window.py:278 msgid "Turn on the device you want to pair." msgstr "" -#: lib/solaar/ui/pair_window.py:270 +#: 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:273 +#: lib/solaar/ui/pair_window.py:283 #, python-format msgid "\n" "\n" @@ -1544,177 +1597,177 @@ msgid_plural "\n" msgstr[0] "" msgstr[1] "" -#: lib/solaar/ui/pair_window.py:276 +#: lib/solaar/ui/pair_window.py:286 msgid "\n" "Cancelling at this point will not use up a pairing." msgstr "" #: lib/solaar/ui/tray.py:58 -msgid "No Logitech device found" +msgid "No supported device found" msgstr "" -#: lib/solaar/ui/tray.py:64 lib/solaar/ui/window.py:324 +#: lib/solaar/ui/tray.py:64 lib/solaar/ui/window.py:319 #, python-format msgid "About %s" msgstr "" -#: lib/solaar/ui/tray.py:65 lib/solaar/ui/window.py:322 +#: lib/solaar/ui/tray.py:65 lib/solaar/ui/window.py:317 #, python-format msgid "Quit %s" msgstr "" -#: lib/solaar/ui/tray.py:302 lib/solaar/ui/tray.py:310 +#: lib/solaar/ui/tray.py:299 lib/solaar/ui/tray.py:307 msgid "no receiver" msgstr "" -#: lib/solaar/ui/tray.py:326 +#: lib/solaar/ui/tray.py:323 msgid "no status" msgstr "" -#: lib/solaar/ui/window.py:101 +#: lib/solaar/ui/window.py:96 msgid "Scanning" msgstr "" -#: lib/solaar/ui/window.py:134 lib/solaar/ui/window.py:687 +#: lib/solaar/ui/window.py:129 msgid "Battery" msgstr "" -#: lib/solaar/ui/window.py:137 +#: lib/solaar/ui/window.py:132 msgid "Wireless Link" msgstr "" -#: lib/solaar/ui/window.py:141 +#: lib/solaar/ui/window.py:136 msgid "Lighting" msgstr "" -#: lib/solaar/ui/window.py:175 +#: lib/solaar/ui/window.py:170 msgid "Show Technical Details" msgstr "" -#: lib/solaar/ui/window.py:191 +#: lib/solaar/ui/window.py:186 msgid "Pair new device" msgstr "" -#: lib/solaar/ui/window.py:210 +#: lib/solaar/ui/window.py:205 msgid "Select a device" msgstr "" -#: lib/solaar/ui/window.py:327 +#: lib/solaar/ui/window.py:322 msgid "Rule Editor" msgstr "" -#: lib/solaar/ui/window.py:538 +#: lib/solaar/ui/window.py:533 msgid "Path" msgstr "" -#: lib/solaar/ui/window.py:541 +#: lib/solaar/ui/window.py:536 msgid "USB ID" msgstr "" -#: lib/solaar/ui/window.py:544 lib/solaar/ui/window.py:546 -#: lib/solaar/ui/window.py:566 lib/solaar/ui/window.py:568 +#: 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 "" -#: lib/solaar/ui/window.py:550 +#: lib/solaar/ui/window.py:545 msgid "Index" msgstr "" -#: lib/solaar/ui/window.py:552 +#: lib/solaar/ui/window.py:547 msgid "Wireless PID" msgstr "" -#: lib/solaar/ui/window.py:554 +#: lib/solaar/ui/window.py:549 msgid "Product ID" msgstr "" -#: lib/solaar/ui/window.py:556 +#: lib/solaar/ui/window.py:551 msgid "Protocol" msgstr "" -#: lib/solaar/ui/window.py:556 +#: lib/solaar/ui/window.py:551 msgid "Unknown" msgstr "" -#: lib/solaar/ui/window.py:559 +#: lib/solaar/ui/window.py:554 #, python-format msgid "%(rate)d ms (%(rate_hz)dHz)" msgstr "" -#: lib/solaar/ui/window.py:559 +#: lib/solaar/ui/window.py:554 msgid "Polling rate" msgstr "" -#: lib/solaar/ui/window.py:570 +#: lib/solaar/ui/window.py:565 msgid "Unit ID" msgstr "" -#: lib/solaar/ui/window.py:581 +#: lib/solaar/ui/window.py:576 msgid "none" msgstr "" -#: lib/solaar/ui/window.py:582 +#: lib/solaar/ui/window.py:577 msgid "Notifications" msgstr "" -#: lib/solaar/ui/window.py:619 +#: lib/solaar/ui/window.py:621 msgid "No device paired." msgstr "" -#: lib/solaar/ui/window.py:626 +#: lib/solaar/ui/window.py:628 #, 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] "" -#: lib/solaar/ui/window.py:632 +#: lib/solaar/ui/window.py:634 msgid "Only one device can be paired to this receiver." msgstr "" -#: lib/solaar/ui/window.py:636 +#: 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:688 -msgid "unknown" -msgstr "" - -#: lib/solaar/ui/window.py:689 -msgid "Battery information unknown." -msgstr "" - -#: lib/solaar/ui/window.py:699 +#: lib/solaar/ui/window.py:692 msgid "Battery Voltage" msgstr "" -#: lib/solaar/ui/window.py:701 +#: lib/solaar/ui/window.py:694 msgid "Voltage reported by battery" msgstr "" -#: lib/solaar/ui/window.py:703 +#: lib/solaar/ui/window.py:696 msgid "Battery Level" msgstr "" -#: lib/solaar/ui/window.py:705 +#: lib/solaar/ui/window.py:698 msgid "Approximate level reported by battery" msgstr "" -#: lib/solaar/ui/window.py:712 lib/solaar/ui/window.py:714 +#: lib/solaar/ui/window.py:705 lib/solaar/ui/window.py:707 msgid "next reported " msgstr "" -#: lib/solaar/ui/window.py:715 +#: lib/solaar/ui/window.py:708 msgid " and next level to be reported." msgstr "" -#: lib/solaar/ui/window.py:720 +#: lib/solaar/ui/window.py:713 msgid "last known" msgstr "" +#: lib/solaar/ui/window.py:724 +msgid "encrypted" +msgstr "" + +#: lib/solaar/ui/window.py:726 +msgid "The wireless link between this device and its receiver is encrypted." +msgstr "" + #: lib/solaar/ui/window.py:728 msgid "not encrypted" msgstr "" @@ -1726,15 +1779,7 @@ msgid "The wireless link between this device and its receiver is not " "issue for text-input devices." msgstr "" -#: lib/solaar/ui/window.py:737 -msgid "encrypted" -msgstr "" - -#: lib/solaar/ui/window.py:739 -msgid "The wireless link between this device and its receiver is encrypted." -msgstr "" - -#: lib/solaar/ui/window.py:752 +#: lib/solaar/ui/window.py:748 #, python-format msgid "%(light_level)d lux" msgstr "" diff --git a/po/zh_TW.po b/po/zh_TW.po index 1d678392b..3e78eff0e 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -6,8 +6,8 @@ msgid "" msgstr "Project-Id-Version: solaar 0.9.2\n" "Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2022-07-28 20:50+0800\n" - "PO-Revision-Date: 2021-08-22 17:09+0800\n" + "POT-Creation-Date: 2023-06-22 01:47+0800\n" + "PO-Revision-Date: 2023-06-22 01:47+0800\n" "Last-Translator: Peter Dave Hello \n" "Language-Team: Peter Dave Hello \n" "Language: zh_TW\n" @@ -19,11 +19,11 @@ msgstr "Project-Id-Version: solaar 0.9.2\n" "X-Source-Language: C\n" "X-Generator: Poedit 3.0\n" -#: lib/logitech_receiver/base_usb.py:47 +#: lib/logitech_receiver/base_usb.py:46 msgid "Bolt Receiver" msgstr "Bolt 接收器" -#: lib/logitech_receiver/base_usb.py:58 +#: lib/logitech_receiver/base_usb.py:57 msgid "Unifying Receiver" msgstr "Unifying 接收器" @@ -33,17 +33,17 @@ msgstr "Unifying 接收器" msgid "Nano Receiver" msgstr "Nano 接收器" -#: lib/logitech_receiver/base_usb.py:123 +#: lib/logitech_receiver/base_usb.py:124 msgid "Lightspeed Receiver" msgstr "Lightspeed 接收器" -#: lib/logitech_receiver/base_usb.py:131 +#: lib/logitech_receiver/base_usb.py:133 msgid "EX100 Receiver 27 Mhz" -msgstr "" +msgstr "EX100 27 Mhz 接收器" #: lib/logitech_receiver/i18n.py:30 msgid "empty" -msgstr "電池已用盡" +msgstr "電池已耗盡" #: lib/logitech_receiver/i18n.py:31 msgid "critical" @@ -63,7 +63,7 @@ msgstr "良好" #: lib/logitech_receiver/i18n.py:35 msgid "full" -msgstr "全滿" +msgstr "滿格" #: lib/logitech_receiver/i18n.py:38 msgid "discharging" @@ -73,13 +73,13 @@ msgstr "放電中" msgid "recharging" msgstr "充電中" -#: lib/logitech_receiver/i18n.py:40 lib/solaar/ui/window.py:718 +#: lib/logitech_receiver/i18n.py:40 lib/solaar/ui/window.py:711 msgid "charging" msgstr "充電中" #: lib/logitech_receiver/i18n.py:41 msgid "not charging" -msgstr "非充電中" +msgstr "未充電" #: lib/logitech_receiver/i18n.py:42 msgid "almost full" @@ -119,7 +119,7 @@ msgstr "慢" #: lib/logitech_receiver/i18n.py:53 msgid "device timeout" -msgstr "裝置超時" +msgstr "裝置逾時" #: lib/logitech_receiver/i18n.py:54 msgid "device not supported" @@ -133,7 +133,7 @@ msgstr "裝置數量太多" msgid "sequence timeout" msgstr "序列超時" -#: lib/logitech_receiver/i18n.py:59 lib/solaar/ui/window.py:577 +#: lib/logitech_receiver/i18n.py:59 lib/solaar/ui/window.py:572 msgid "Firmware" msgstr "韌體" @@ -163,15 +163,15 @@ msgstr "中鍵" #: lib/logitech_receiver/i18n.py:68 msgid "Back Button" -msgstr "" +msgstr "返回鍵" #: lib/logitech_receiver/i18n.py:69 msgid "Forward Button" -msgstr "" +msgstr "前進鍵" #: lib/logitech_receiver/i18n.py:70 msgid "Mouse Gesture Button" -msgstr "" +msgstr "滑鼠手勢鍵" #: lib/logitech_receiver/i18n.py:71 msgid "Smart Shift" @@ -183,11 +183,11 @@ msgstr "DPI 切換" #: lib/logitech_receiver/i18n.py:73 msgid "Left Tilt" -msgstr "" +msgstr "向左傾斜" #: lib/logitech_receiver/i18n.py:74 msgid "Right Tilt" -msgstr "" +msgstr "向右傾斜" #: lib/logitech_receiver/i18n.py:75 msgid "Left Click" @@ -203,73 +203,73 @@ msgstr "滑鼠中鍵" #: lib/logitech_receiver/i18n.py:78 msgid "Mouse Back Button" -msgstr "" +msgstr "滑鼠返回鍵" #: lib/logitech_receiver/i18n.py:79 msgid "Mouse Forward Button" -msgstr "" +msgstr "滑鼠前進鍵" #: lib/logitech_receiver/i18n.py:80 msgid "Gesture Button Navigation" -msgstr "" +msgstr "手勢按鈕導航" #: lib/logitech_receiver/i18n.py:81 msgid "Mouse Scroll Left Button" -msgstr "" +msgstr "滑鼠滾輪向左按鈕" #: lib/logitech_receiver/i18n.py:82 msgid "Mouse Scroll Right Button" -msgstr "" +msgstr "滑鼠滾輪向右按鈕" #: lib/logitech_receiver/i18n.py:85 msgid "pressed" -msgstr "" +msgstr "按下" #: lib/logitech_receiver/i18n.py:86 msgid "released" -msgstr "" +msgstr "放開" -#: lib/logitech_receiver/notifications.py:74 -#: lib/logitech_receiver/notifications.py:125 +#: lib/logitech_receiver/notifications.py:75 +#: lib/logitech_receiver/notifications.py:126 msgid "pairing lock is closed" msgstr "配對鎖已關閉" -#: lib/logitech_receiver/notifications.py:74 -#: lib/logitech_receiver/notifications.py:125 +#: lib/logitech_receiver/notifications.py:75 +#: lib/logitech_receiver/notifications.py:126 msgid "pairing lock is open" msgstr "配對鎖開啟" -#: lib/logitech_receiver/notifications.py:91 +#: lib/logitech_receiver/notifications.py:92 msgid "discovery lock is closed" -msgstr "" +msgstr "發現鎖已關閉" -#: lib/logitech_receiver/notifications.py:91 +#: lib/logitech_receiver/notifications.py:92 msgid "discovery lock is open" -msgstr "" +msgstr "發現鎖已開啟" -#: lib/logitech_receiver/notifications.py:223 lib/solaar/ui/notify.py:120 +#: lib/logitech_receiver/notifications.py:224 lib/solaar/ui/notify.py:122 msgid "connected" msgstr "已連線" -#: lib/logitech_receiver/notifications.py:223 +#: lib/logitech_receiver/notifications.py:224 msgid "disconnected" msgstr "斷線" -#: lib/logitech_receiver/notifications.py:261 lib/solaar/ui/notify.py:118 +#: lib/logitech_receiver/notifications.py:262 lib/solaar/ui/notify.py:120 msgid "unpaired" msgstr "未配對" -#: lib/logitech_receiver/notifications.py:303 +#: lib/logitech_receiver/notifications.py:304 msgid "powered on" msgstr "已啟動" -#: lib/logitech_receiver/settings.py:734 +#: lib/logitech_receiver/settings.py:750 msgid "register" -msgstr "" +msgstr "註冊" -#: lib/logitech_receiver/settings.py:748 lib/logitech_receiver/settings.py:775 +#: lib/logitech_receiver/settings.py:764 lib/logitech_receiver/settings.py:791 msgid "feature" -msgstr "" +msgstr "功能" #: lib/logitech_receiver/settings_templates.py:139 msgid "Swap Fx function" @@ -278,13 +278,13 @@ msgstr "互換 Fx 鍵功能" #: 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 "若開啟,F1 到 F12 鍵會啟用特殊功能,\n" +msgstr "若開啟,F1 到 F12 鍵將啟用特殊功能,\n" "使用標準功能請同時按住 FN 鍵。" #: 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 "若關閉,F1 到 F12 鍵會啟用標準功能,\n" +msgstr "若關閉,F1 到 F12 鍵將啟用標準功能,\n" "使用特殊功能請同時按住 FN 鍵。" #: lib/logitech_receiver/settings_templates.py:149 @@ -297,7 +297,7 @@ msgstr "手掌置於鍵盤上方時開啟照明。" #: lib/logitech_receiver/settings_templates.py:157 msgid "Scroll Wheel Smooth Scrolling" -msgstr "" +msgstr "滾輪平滑捲動" #: lib/logitech_receiver/settings_templates.py:158 #: lib/logitech_receiver/settings_templates.py:239 @@ -307,7 +307,7 @@ msgstr "滾輪高解析度滾動模式。" #: lib/logitech_receiver/settings_templates.py:165 msgid "Side Scrolling" -msgstr "側邊滾輪" +msgstr "側邊滾動" #: lib/logitech_receiver/settings_templates.py:167 msgid "When disabled, pushing the wheel sideways sends custom button " @@ -318,12 +318,12 @@ msgstr "若停用,按下滾輪側邊將傳送自定義按鈕事件\n" #: lib/logitech_receiver/settings_templates.py:177 msgid "Sensitivity (DPI - older mice)" -msgstr "" +msgstr "靈敏度(DPI - 較舊的滑鼠)" #: lib/logitech_receiver/settings_templates.py:178 -#: lib/logitech_receiver/settings_templates.py:687 +#: lib/logitech_receiver/settings_templates.py:712 msgid "Mouse movement sensitivity" -msgstr "" +msgstr "滑鼠移動靈敏度" #: lib/logitech_receiver/settings_templates.py:208 #: lib/logitech_receiver/settings_templates.py:218 @@ -334,647 +334,663 @@ msgstr "背光" #: lib/logitech_receiver/settings_templates.py:209 #: lib/logitech_receiver/settings_templates.py:226 msgid "Set illumination time for keyboard." -msgstr "" +msgstr "設定鍵盤的照明時間。" #: lib/logitech_receiver/settings_templates.py:219 msgid "Turn illumination on or off on keyboard." -msgstr "" +msgstr "開啟或關閉鍵盤照明。" #: lib/logitech_receiver/settings_templates.py:237 msgid "Scroll Wheel High Resolution" -msgstr "" +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 "" +msgstr "如果滾動速度異常快或慢,設定為忽略" #: lib/logitech_receiver/settings_templates.py:247 #: lib/logitech_receiver/settings_templates.py:277 msgid "Scroll Wheel Diversion" -msgstr "" +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 "" +msgstr "使滾輪發送 LOWRES_WHEEL HID++ 通知(觸發 Solaar 規則,但其他情況下將" + "被忽略)。" #: lib/logitech_receiver/settings_templates.py:256 msgid "Scroll Wheel Direction" -msgstr "" +msgstr "滾輪方向" #: lib/logitech_receiver/settings_templates.py:257 msgid "Invert direction for vertical scroll with wheel." -msgstr "" +msgstr "反轉滾輪的垂直滾動方向。" #: lib/logitech_receiver/settings_templates.py:265 msgid "Scroll Wheel Resolution" -msgstr "" +msgstr "滾輪解析度" #: 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 "" +msgstr "使滾輪發送 HIRES_WHEEL HID++ 通知(觸發 Solaar 規則,但其他情況下將被" + "忽略)。" #: lib/logitech_receiver/settings_templates.py:288 msgid "Sensitivity (Pointer Speed)" -msgstr "靈敏度 (游標速度)" +msgstr "靈敏度(指標速度)" #: lib/logitech_receiver/settings_templates.py:289 msgid "Speed multiplier for mouse (256 is normal multiplier)." -msgstr "" +msgstr "滑鼠速度乘數(256 為正常乘數)。" #: lib/logitech_receiver/settings_templates.py:299 msgid "Thumb Wheel Diversion" -msgstr "" +msgstr "拇指滾輪轉向" #: 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 "" +msgstr "使拇指滾輪發送 THUMB_WHEEL HID++ 通知(觸發 Solaar 規則,但其他情況下" + "將被忽略)。" #: lib/logitech_receiver/settings_templates.py:310 msgid "Thumb Wheel Direction" -msgstr "" +msgstr "拇指滾輪方向" #: lib/logitech_receiver/settings_templates.py:311 msgid "Invert thumb wheel scroll direction." -msgstr "" +msgstr "反轉拇指滾輪滾動方向。" #: lib/logitech_receiver/settings_templates.py:319 msgid "Onboard Profiles" -msgstr "" +msgstr "內建設定檔" #: lib/logitech_receiver/settings_templates.py:320 msgid "Enable onboard profiles, which often control report rate and " "keyboard lighting" -msgstr "" +msgstr "啟用內建設定檔,通常用於控制報告速率和鍵盤亮度" #: lib/logitech_receiver/settings_templates.py:330 msgid "Polling Rate (ms)" -msgstr "" +msgstr "輪詢速率(毫秒)" #: lib/logitech_receiver/settings_templates.py:332 msgid "Frequency of device polling, in milliseconds" -msgstr "" +msgstr "裝置輪詢的頻率,以毫秒為單位" #: lib/logitech_receiver/settings_templates.py:333 -#: lib/logitech_receiver/settings_templates.py:1216 -#: lib/logitech_receiver/settings_templates.py:1244 +#: 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 "" +msgstr "可能需要將內建設定檔設定為停用才能生效。" -#: lib/logitech_receiver/settings_templates.py:363 +#: lib/logitech_receiver/settings_templates.py:365 msgid "Divert crown events" -msgstr "" +msgstr "轉移多功能轉鈕事件" -#: lib/logitech_receiver/settings_templates.py:364 +#: lib/logitech_receiver/settings_templates.py:366 msgid "Make crown send CROWN HID++ notifications (which trigger Solaar " "rules but are otherwise ignored)." -msgstr "" +msgstr "使多功能轉鈕發送 CROWN HID++ 通知(觸發 Solaar 規則,但其他情況下將被" + "忽略)。" -#: lib/logitech_receiver/settings_templates.py:372 +#: lib/logitech_receiver/settings_templates.py:374 msgid "Crown smooth scroll" -msgstr "" +msgstr "Crown 平滑滾動" -#: lib/logitech_receiver/settings_templates.py:373 +#: lib/logitech_receiver/settings_templates.py:375 msgid "Set crown smooth scroll" -msgstr "" +msgstr "設定 Crown 平滑滾動" -#: lib/logitech_receiver/settings_templates.py:381 +#: lib/logitech_receiver/settings_templates.py:383 msgid "Divert G Keys" -msgstr "" +msgstr "轉換 G 鍵" -#: lib/logitech_receiver/settings_templates.py:383 +#: lib/logitech_receiver/settings_templates.py:385 msgid "Make G keys send GKEY HID++ notifications (which trigger Solaar " "rules but are otherwise ignored)." -msgstr "" +msgstr "讓 G 鍵發送 GKEY HID++ 通知(將觸發 Solaar 規則,但其他情況下會被忽" + "略)。" -#: lib/logitech_receiver/settings_templates.py:384 +#: lib/logitech_receiver/settings_templates.py:386 msgid "May also make M keys and MR key send HID++ notifications" -msgstr "" +msgstr "也可能讓 M 鍵和 MR 鍵發送 HID++ 通知" + +#: 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:399 -msgid "Scroll Wheel Rachet" -msgstr "" +#: lib/logitech_receiver/settings_templates.py:412 +msgid "Scroll Wheel Ratchet Speed" +msgstr "滾輪棘輪速度" -#: lib/logitech_receiver/settings_templates.py:401 -msgid "Automatically switch the mouse wheel between ratchet and freespin " - "mode.\n" - "The mouse wheel is always free at 0, and always ratcheted at 50" -msgstr "" +#: 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 "使用滑鼠滾輪速度在滾輪棘輪和自由滾動之間切換。\n" + "滾輪在 50 時始終處於棘輪狀態。" -#: lib/logitech_receiver/settings_templates.py:450 +#: lib/logitech_receiver/settings_templates.py:463 msgid "Key/Button Actions" -msgstr "" +msgstr "鍵/按鈕動作" -#: lib/logitech_receiver/settings_templates.py:452 +#: lib/logitech_receiver/settings_templates.py:465 msgid "Change the action for the key or button." -msgstr "" +msgstr "更改鍵或按鈕的動作。" -#: lib/logitech_receiver/settings_templates.py:452 +#: lib/logitech_receiver/settings_templates.py:465 msgid "Overridden by diversion." -msgstr "" +msgstr "由轉換覆蓋。" -#: lib/logitech_receiver/settings_templates.py:453 +#: 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 "" +msgstr "更改重要動作(例如左鍵)可能導致系統無法使用。" -#: lib/logitech_receiver/settings_templates.py:614 +#: lib/logitech_receiver/settings_templates.py:639 msgid "Key/Button Diversion" -msgstr "" +msgstr "鍵/按鈕轉換" -#: lib/logitech_receiver/settings_templates.py:615 +#: 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 "" +msgstr "讓鍵或按鈕發送 HID++ 通知(已轉換)或啟動滑鼠手勢或滑動 DPI" -#: lib/logitech_receiver/settings_templates.py:618 -#: lib/logitech_receiver/settings_templates.py:619 -#: lib/logitech_receiver/settings_templates.py:620 +#: lib/logitech_receiver/settings_templates.py:643 +#: lib/logitech_receiver/settings_templates.py:644 +#: lib/logitech_receiver/settings_templates.py:645 msgid "Diverted" -msgstr "" +msgstr "已轉換" -#: lib/logitech_receiver/settings_templates.py:618 -#: lib/logitech_receiver/settings_templates.py:619 -#: lib/logitech_receiver/settings_templates.py:887 +#: lib/logitech_receiver/settings_templates.py:643 +#: lib/logitech_receiver/settings_templates.py:644 msgid "Mouse Gestures" msgstr "滑鼠手勢" -#: lib/logitech_receiver/settings_templates.py:618 -#: lib/logitech_receiver/settings_templates.py:619 -#: lib/logitech_receiver/settings_templates.py:620 +#: lib/logitech_receiver/settings_templates.py:643 +#: lib/logitech_receiver/settings_templates.py:644 +#: lib/logitech_receiver/settings_templates.py:645 msgid "Regular" -msgstr "" +msgstr "常規" -#: lib/logitech_receiver/settings_templates.py:618 +#: lib/logitech_receiver/settings_templates.py:643 msgid "Sliding DPI" -msgstr "" +msgstr "滑動 DPI" -#: lib/logitech_receiver/settings_templates.py:686 +#: lib/logitech_receiver/settings_templates.py:711 msgid "Sensitivity (DPI)" msgstr "靈敏度 (DPI)" -#: lib/logitech_receiver/settings_templates.py:726 +#: lib/logitech_receiver/settings_templates.py:752 msgid "Sensitivity Switching" -msgstr "" +msgstr "靈敏度切換" -#: lib/logitech_receiver/settings_templates.py:728 +#: 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 "" +msgstr "在按下鍵或按鈕時切換目前靈敏度和已記憶的靈敏度。\n" + "如果沒有已記憶的靈敏度,只需記住目前的靈敏度" -#: lib/logitech_receiver/settings_templates.py:732 -#: lib/logitech_receiver/settings_templates.py:773 -#: lib/logitech_receiver/settings_templates.py:892 +#: lib/logitech_receiver/settings_templates.py:758 msgid "Off" msgstr "關" -#: lib/logitech_receiver/settings_templates.py:770 -msgid "DPI Sliding Adjustment" -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:771 -msgid "Adjust the DPI by sliding the mouse horizontally while holding the " - "button down." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:868 +#: lib/logitech_receiver/settings_templates.py:791 msgid "Disable keys" -msgstr "" +msgstr "停用鍵" -#: lib/logitech_receiver/settings_templates.py:869 +#: lib/logitech_receiver/settings_templates.py:792 msgid "Disable specific keyboard keys." -msgstr "" +msgstr "停用特定鍵盤按鍵。" -#: lib/logitech_receiver/settings_templates.py:872 +#: lib/logitech_receiver/settings_templates.py:795 #, python-format msgid "Disables the %s key." -msgstr "" - -#: lib/logitech_receiver/settings_templates.py:888 -msgid "Send a gesture by sliding the mouse while holding the button down." -msgstr "" +msgstr "停用 %s 鍵。" -#: lib/logitech_receiver/settings_templates.py:986 -#: lib/logitech_receiver/settings_templates.py:1034 +#: lib/logitech_receiver/settings_templates.py:809 +#: lib/logitech_receiver/settings_templates.py:860 msgid "Set OS" -msgstr "" +msgstr "設定作業系統" -#: lib/logitech_receiver/settings_templates.py:987 -#: lib/logitech_receiver/settings_templates.py:1035 +#: lib/logitech_receiver/settings_templates.py:810 +#: lib/logitech_receiver/settings_templates.py:861 msgid "Change keys to match OS." -msgstr "" +msgstr "更改按鍵以符合作業系統。" -#: lib/logitech_receiver/settings_templates.py:1047 +#: lib/logitech_receiver/settings_templates.py:873 msgid "Change Host" msgstr "更改主機號碼" -#: lib/logitech_receiver/settings_templates.py:1048 +#: lib/logitech_receiver/settings_templates.py:874 msgid "Switch connection to a different host" msgstr "切換到其他主機" -#: lib/logitech_receiver/settings_templates.py:1073 +#: lib/logitech_receiver/settings_templates.py:900 msgid "Performs a left click." -msgstr "" +msgstr "執行左鍵點選。" -#: lib/logitech_receiver/settings_templates.py:1073 +#: lib/logitech_receiver/settings_templates.py:900 msgid "Single tap" -msgstr "單次點擊" +msgstr "點選" -#: lib/logitech_receiver/settings_templates.py:1074 +#: lib/logitech_receiver/settings_templates.py:901 msgid "Performs a right click." -msgstr "" +msgstr "執行右鍵點選。" -#: lib/logitech_receiver/settings_templates.py:1074 +#: lib/logitech_receiver/settings_templates.py:901 msgid "Single tap with two fingers" -msgstr "用兩根手指點擊" +msgstr "用兩根手指點選" -#: lib/logitech_receiver/settings_templates.py:1075 +#: lib/logitech_receiver/settings_templates.py:902 msgid "Single tap with three fingers" -msgstr "用三根手指點擊" +msgstr "用三根手指點選" -#: lib/logitech_receiver/settings_templates.py:1079 +#: lib/logitech_receiver/settings_templates.py:906 msgid "Double tap" -msgstr "兩次點擊" +msgstr "點兩下" -#: lib/logitech_receiver/settings_templates.py:1079 +#: lib/logitech_receiver/settings_templates.py:906 msgid "Performs a double click." -msgstr "" +msgstr "執行點兩下。" -#: lib/logitech_receiver/settings_templates.py:1080 +#: lib/logitech_receiver/settings_templates.py:907 msgid "Double tap with two fingers" -msgstr "" +msgstr "用兩根手指點兩下" -#: lib/logitech_receiver/settings_templates.py:1081 +#: lib/logitech_receiver/settings_templates.py:908 msgid "Double tap with three fingers" -msgstr "" +msgstr "用三根手指點兩下" -#: lib/logitech_receiver/settings_templates.py:1084 +#: lib/logitech_receiver/settings_templates.py:911 msgid "Drags items by dragging the finger after double tapping." -msgstr "" +msgstr "點兩下後拖動手指來拖動物件。" -#: lib/logitech_receiver/settings_templates.py:1084 +#: lib/logitech_receiver/settings_templates.py:911 msgid "Tap and drag" -msgstr "點擊並拖動" +msgstr "點選並拖曳" -#: lib/logitech_receiver/settings_templates.py:1086 +#: lib/logitech_receiver/settings_templates.py:913 msgid "Drags items by dragging the fingers after double tapping." -msgstr "" +msgstr "點兩下後拖動手指來拖動物件。" -#: lib/logitech_receiver/settings_templates.py:1086 +#: lib/logitech_receiver/settings_templates.py:913 msgid "Tap and drag with two fingers" -msgstr "用兩根手指點擊並拖動" +msgstr "用兩根手指點兩下並拖曳" -#: lib/logitech_receiver/settings_templates.py:1087 +#: lib/logitech_receiver/settings_templates.py:914 msgid "Tap and drag with three fingers" -msgstr "" +msgstr "用三根手指點選並拖曳" -#: lib/logitech_receiver/settings_templates.py:1090 +#: lib/logitech_receiver/settings_templates.py:917 msgid "Disables tap and edge gestures (equivalent to pressing Fn+LeftClick)." -msgstr "" +msgstr "停用輕觸和邊緣手勢(相當於按 Fn+左鍵點選)。" -#: lib/logitech_receiver/settings_templates.py:1090 +#: lib/logitech_receiver/settings_templates.py:917 msgid "Suppress tap and edge gestures" -msgstr "" +msgstr "停用輕觸和邊緣手勢" -#: lib/logitech_receiver/settings_templates.py:1091 +#: lib/logitech_receiver/settings_templates.py:918 msgid "Scroll with one finger" -msgstr "" +msgstr "用一根手指滾動" -#: lib/logitech_receiver/settings_templates.py:1091 -#: lib/logitech_receiver/settings_templates.py:1092 -#: lib/logitech_receiver/settings_templates.py:1095 +#: lib/logitech_receiver/settings_templates.py:918 +#: lib/logitech_receiver/settings_templates.py:919 +#: lib/logitech_receiver/settings_templates.py:922 msgid "Scrolls." -msgstr "滑動" +msgstr "滾動。" -#: lib/logitech_receiver/settings_templates.py:1092 -#: lib/logitech_receiver/settings_templates.py:1095 +#: lib/logitech_receiver/settings_templates.py:919 +#: lib/logitech_receiver/settings_templates.py:922 msgid "Scroll with two fingers" -msgstr "用兩根手指滑動" +msgstr "用兩根手指滾動" -#: lib/logitech_receiver/settings_templates.py:1093 +#: lib/logitech_receiver/settings_templates.py:920 msgid "Scroll horizontally with two fingers" -msgstr "" +msgstr "用兩根手指水平滾動" -#: lib/logitech_receiver/settings_templates.py:1093 +#: lib/logitech_receiver/settings_templates.py:920 msgid "Scrolls horizontally." -msgstr "" +msgstr "水平滾動。" -#: lib/logitech_receiver/settings_templates.py:1094 +#: lib/logitech_receiver/settings_templates.py:921 msgid "Scroll vertically with two fingers" -msgstr "" +msgstr "用兩根手指垂直滾動" -#: lib/logitech_receiver/settings_templates.py:1094 +#: lib/logitech_receiver/settings_templates.py:921 msgid "Scrolls vertically." -msgstr "" +msgstr "垂直滾動。" -#: lib/logitech_receiver/settings_templates.py:1096 +#: lib/logitech_receiver/settings_templates.py:923 msgid "Inverts the scrolling direction." -msgstr "" +msgstr "反轉滾動方向。" -#: lib/logitech_receiver/settings_templates.py:1096 +#: lib/logitech_receiver/settings_templates.py:923 msgid "Natural scrolling" -msgstr "" +msgstr "自然滾動" -#: lib/logitech_receiver/settings_templates.py:1097 +#: lib/logitech_receiver/settings_templates.py:924 msgid "Enables the thumbwheel." -msgstr "" +msgstr "啟用拇指滾輪。" -#: lib/logitech_receiver/settings_templates.py:1097 +#: lib/logitech_receiver/settings_templates.py:924 msgid "Thumbwheel" -msgstr "" +msgstr "拇指滾輪" -#: lib/logitech_receiver/settings_templates.py:1108 -#: lib/logitech_receiver/settings_templates.py:1112 +#: lib/logitech_receiver/settings_templates.py:935 +#: lib/logitech_receiver/settings_templates.py:939 msgid "Swipe from the top edge" -msgstr "" +msgstr "從上緣滑動" -#: lib/logitech_receiver/settings_templates.py:1109 +#: lib/logitech_receiver/settings_templates.py:936 msgid "Swipe from the left edge" -msgstr "" +msgstr "從左緣滑動" -#: lib/logitech_receiver/settings_templates.py:1110 +#: lib/logitech_receiver/settings_templates.py:937 msgid "Swipe from the right edge" -msgstr "" +msgstr "從右緣滑動" -#: lib/logitech_receiver/settings_templates.py:1111 +#: lib/logitech_receiver/settings_templates.py:938 msgid "Swipe from the bottom edge" -msgstr "" +msgstr "從下緣滑動" -#: lib/logitech_receiver/settings_templates.py:1113 +#: lib/logitech_receiver/settings_templates.py:940 msgid "Swipe two fingers from the left edge" -msgstr "" +msgstr "從左緣滑動兩根手指" -#: lib/logitech_receiver/settings_templates.py:1114 +#: lib/logitech_receiver/settings_templates.py:941 msgid "Swipe two fingers from the right edge" -msgstr "" +msgstr "從右緣滑動兩根手指" -#: lib/logitech_receiver/settings_templates.py:1115 +#: lib/logitech_receiver/settings_templates.py:942 msgid "Swipe two fingers from the bottom edge" -msgstr "" +msgstr "從下緣滑動兩根手指" -#: lib/logitech_receiver/settings_templates.py:1116 +#: lib/logitech_receiver/settings_templates.py:943 msgid "Swipe two fingers from the top edge" -msgstr "" +msgstr "從上緣滑動兩根手指" -#: lib/logitech_receiver/settings_templates.py:1117 -#: lib/logitech_receiver/settings_templates.py:1121 +#: lib/logitech_receiver/settings_templates.py:944 +#: lib/logitech_receiver/settings_templates.py:948 msgid "Pinch to zoom out; spread to zoom in." -msgstr "" +msgstr "捏合以縮小;張開以放大。" -#: lib/logitech_receiver/settings_templates.py:1117 +#: lib/logitech_receiver/settings_templates.py:944 msgid "Zoom with two fingers." -msgstr "" +msgstr "用兩根手指縮放。" -#: lib/logitech_receiver/settings_templates.py:1118 +#: lib/logitech_receiver/settings_templates.py:945 msgid "Pinch to zoom out." -msgstr "" +msgstr "捏合以縮小。" -#: lib/logitech_receiver/settings_templates.py:1119 +#: lib/logitech_receiver/settings_templates.py:946 msgid "Spread to zoom in." -msgstr "" +msgstr "張開以放大。" -#: lib/logitech_receiver/settings_templates.py:1120 +#: lib/logitech_receiver/settings_templates.py:947 msgid "Zoom with three fingers." -msgstr "" +msgstr "用三根手指縮放。" -#: lib/logitech_receiver/settings_templates.py:1121 +#: lib/logitech_receiver/settings_templates.py:948 msgid "Zoom with two fingers" -msgstr "" +msgstr "用兩根手指縮放" -#: lib/logitech_receiver/settings_templates.py:1139 +#: lib/logitech_receiver/settings_templates.py:966 msgid "Pixel zone" -msgstr "" +msgstr "像素區域" -#: lib/logitech_receiver/settings_templates.py:1140 +#: lib/logitech_receiver/settings_templates.py:967 msgid "Ratio zone" -msgstr "" +msgstr "比例區域" -#: lib/logitech_receiver/settings_templates.py:1141 +#: lib/logitech_receiver/settings_templates.py:968 msgid "Scale factor" -msgstr "伸縮係數" +msgstr "縮放係數" -#: lib/logitech_receiver/settings_templates.py:1141 +#: lib/logitech_receiver/settings_templates.py:968 msgid "Sets the cursor speed." -msgstr "" +msgstr "設定游標速度。" -#: lib/logitech_receiver/settings_templates.py:1145 +#: lib/logitech_receiver/settings_templates.py:972 msgid "Left" msgstr "左" -#: lib/logitech_receiver/settings_templates.py:1145 +#: lib/logitech_receiver/settings_templates.py:972 msgid "Left-most coordinate." -msgstr "" +msgstr "最左邊的座標。" -#: lib/logitech_receiver/settings_templates.py:1146 +#: lib/logitech_receiver/settings_templates.py:973 msgid "Bottom" -msgstr "" +msgstr "底部" -#: lib/logitech_receiver/settings_templates.py:1146 +#: lib/logitech_receiver/settings_templates.py:973 msgid "Bottom coordinate." -msgstr "" +msgstr "底部座標。" -#: lib/logitech_receiver/settings_templates.py:1147 +#: lib/logitech_receiver/settings_templates.py:974 msgid "Width" msgstr "寬度" -#: lib/logitech_receiver/settings_templates.py:1147 +#: lib/logitech_receiver/settings_templates.py:974 msgid "Width." -msgstr "" +msgstr "寬度。" -#: lib/logitech_receiver/settings_templates.py:1148 +#: lib/logitech_receiver/settings_templates.py:975 msgid "Height" msgstr "高度" -#: lib/logitech_receiver/settings_templates.py:1148 +#: lib/logitech_receiver/settings_templates.py:975 msgid "Height." -msgstr "" +msgstr "高度。" -#: lib/logitech_receiver/settings_templates.py:1149 +#: lib/logitech_receiver/settings_templates.py:976 msgid "Cursor speed." -msgstr "" +msgstr "游標速度。" -#: lib/logitech_receiver/settings_templates.py:1149 +#: lib/logitech_receiver/settings_templates.py:976 msgid "Scale" -msgstr "" +msgstr "縮放" -#: lib/logitech_receiver/settings_templates.py:1155 +#: lib/logitech_receiver/settings_templates.py:982 msgid "Gestures" msgstr "手勢" -#: lib/logitech_receiver/settings_templates.py:1156 +#: lib/logitech_receiver/settings_templates.py:983 msgid "Tweak the mouse/touchpad behaviour." -msgstr "" +msgstr "調整滑鼠/觸控板行為。" -#: lib/logitech_receiver/settings_templates.py:1172 +#: lib/logitech_receiver/settings_templates.py:1000 msgid "Gestures Diversion" -msgstr "" +msgstr "手勢轉換" -#: lib/logitech_receiver/settings_templates.py:1173 +#: lib/logitech_receiver/settings_templates.py:1001 msgid "Divert mouse/touchpad gestures." -msgstr "" +msgstr "轉換滑鼠/觸控板手勢。" -#: lib/logitech_receiver/settings_templates.py:1189 +#: lib/logitech_receiver/settings_templates.py:1018 msgid "Gesture params" msgstr "手勢參數" -#: lib/logitech_receiver/settings_templates.py:1190 +#: lib/logitech_receiver/settings_templates.py:1019 msgid "Change numerical parameters of a mouse/touchpad." -msgstr "" +msgstr "更改滑鼠/觸控板的數值參數。" -#: lib/logitech_receiver/settings_templates.py:1214 +#: lib/logitech_receiver/settings_templates.py:1044 msgid "M-Key LEDs" -msgstr "" +msgstr "M 鍵 LED" -#: lib/logitech_receiver/settings_templates.py:1216 +#: lib/logitech_receiver/settings_templates.py:1046 msgid "Control the M-Key LEDs." -msgstr "" +msgstr "控制 M 鍵 LED。" -#: lib/logitech_receiver/settings_templates.py:1217 -#: lib/logitech_receiver/settings_templates.py:1245 +#: lib/logitech_receiver/settings_templates.py:1047 +#: lib/logitech_receiver/settings_templates.py:1077 msgid "May need G Keys diverted to be effective." -msgstr "" +msgstr "可能需要轉換 G 鍵才能生效。" -#: lib/logitech_receiver/settings_templates.py:1223 +#: lib/logitech_receiver/settings_templates.py:1053 #, python-format msgid "Lights up the %s key." -msgstr "" +msgstr "點亮 %s 鍵。" -#: lib/logitech_receiver/settings_templates.py:1242 +#: lib/logitech_receiver/settings_templates.py:1074 msgid "MR-Key LED" -msgstr "" +msgstr "MR 鍵 LED" -#: lib/logitech_receiver/settings_templates.py:1244 +#: lib/logitech_receiver/settings_templates.py:1076 msgid "Control the MR-Key LED." -msgstr "" +msgstr "控制 MR 鍵 LED。" -#: lib/logitech_receiver/settings_templates.py:1262 +#: lib/logitech_receiver/settings_templates.py:1095 msgid "Persistent Key/Button Mapping" -msgstr "" +msgstr "持久按鍵/按鈕對應" -#: lib/logitech_receiver/settings_templates.py:1264 +#: lib/logitech_receiver/settings_templates.py:1097 msgid "Permanently change the mapping for the key or button." -msgstr "" +msgstr "永久更改按鍵或按鈕的對應。" -#: lib/logitech_receiver/settings_templates.py:1265 +#: 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 "" +msgstr "更改重要的按鍵或按鈕(例如左鍵)可能導致系統無法使用。" -#: lib/logitech_receiver/settings_templates.py:1322 +#: lib/logitech_receiver/settings_templates.py:1157 msgid "Sidetone" -msgstr "" +msgstr "側音" -#: lib/logitech_receiver/settings_templates.py:1323 +#: lib/logitech_receiver/settings_templates.py:1158 msgid "Set sidetone level." -msgstr "" +msgstr "設定側音等級。" -#: lib/logitech_receiver/settings_templates.py:1332 +#: lib/logitech_receiver/settings_templates.py:1167 msgid "Equalizer" -msgstr "" +msgstr "均衡器" -#: lib/logitech_receiver/settings_templates.py:1333 +#: lib/logitech_receiver/settings_templates.py:1168 msgid "Set equalizer levels." -msgstr "" +msgstr "設定均衡器等級。" -#: lib/logitech_receiver/settings_templates.py:1355 +#: lib/logitech_receiver/settings_templates.py:1191 msgid "Hz" -msgstr "赫兹" +msgstr "赫茲" + +#: lib/logitech_receiver/settings_templates.py:1197 +msgid "Power Management" +msgstr "電源管理" -#: lib/logitech_receiver/status.py:113 +#: lib/logitech_receiver/settings_templates.py:1198 +msgid "Power off in minutes (0 for never)." +msgstr "幾分鐘後關機(0 表示永不)。" + +#: lib/logitech_receiver/status.py:114 msgid "No paired devices." msgstr "沒有已配對的裝置。" -#: lib/logitech_receiver/status.py:114 lib/solaar/ui/window.py:620 +#: lib/logitech_receiver/status.py:115 lib/solaar/ui/window.py:622 #, fuzzy, python-format msgid "%(count)s paired device." msgid_plural "%(count)s paired devices." msgstr[0] "%(count)s 個已配對裝置" -#: lib/logitech_receiver/status.py:167 +#: lib/logitech_receiver/status.py:170 #, python-format msgid "Battery: %(level)s" msgstr "電量:%(level)s " -#: lib/logitech_receiver/status.py:169 +#: lib/logitech_receiver/status.py:172 #, python-format msgid "Battery: %(percent)d%%" msgstr "電量:%(percent)d%%" -#: lib/logitech_receiver/status.py:181 +#: lib/logitech_receiver/status.py:184 #, python-format msgid "Lighting: %(level)s lux" msgstr "亮度: %(level)s lux" -#: lib/logitech_receiver/status.py:236 +#: lib/logitech_receiver/status.py:239 #, python-format msgid "Battery: %(level)s (%(status)s)" msgstr "電量: %(level)s (%(status)s)" -#: lib/logitech_receiver/status.py:238 +#: lib/logitech_receiver/status.py:241 #, python-format msgid "Battery: %(percent)d%% (%(status)s)" msgstr "電量: %(percent)d%% (%(status)s)" -#: lib/solaar/ui/__init__.py:51 +#: lib/solaar/ui/__init__.py:52 msgid "Permissions error" msgstr "權限錯誤" -#: lib/solaar/ui/__init__.py:53 +#: lib/solaar/ui/__init__.py:54 #, python-format -msgid "Found a Logitech Receiver (%s), but did not have permission to open " - "it." -msgstr "已發現 1 個羅技接收器 (%s),但您沒有權限存取。" +msgid "Found a Logitech receiver or device (%s), but did not have " + "permission to open it." +msgstr "找到了羅技接收器或裝置(%s),但沒有權限開啟。" -#: lib/solaar/ui/__init__.py:54 -msgid "If you've just installed Solaar, try removing the receiver and " - "plugging it back in." -msgstr "若您剛剛安裝 Solaar,請嘗試將接收器拔下再重新插上。" +#: lib/solaar/ui/__init__.py:55 +msgid "If you've just installed Solaar, try disconnecting the receiver or " + "device and then reconnecting it." +msgstr "如果您剛剛安裝了 Solaar,請嘗試斷開接收器或裝置,然後重新連接。" -#: lib/solaar/ui/__init__.py:57 +#: lib/solaar/ui/__init__.py:58 msgid "Cannot connect to device error" msgstr "無法連接到裝置錯誤" -#: lib/solaar/ui/__init__.py:59 +#: 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 "" +msgstr "在 %s 找到了一個羅技接收器或裝置,但連接時遇到錯誤。" -#: lib/solaar/ui/__init__.py:60 -msgid "Try removing the device and plugging it back in or turning it off " - "and then on." -msgstr "嘗試移除裝置並將其插回,或是關閉然後打開。" +#: lib/solaar/ui/__init__.py:61 +msgid "Try disconnecting the device and then reconnecting it or turning it " + "off and then on." +msgstr "嘗試斷開裝置然後重新連接,或者關閉裝置然後再開啟。" -#: lib/solaar/ui/__init__.py:63 +#: lib/solaar/ui/__init__.py:64 msgid "Unpairing failed" msgstr "取消配對失敗" -#: lib/solaar/ui/__init__.py:65 +#: lib/solaar/ui/__init__.py:66 #, python-brace-format msgid "Failed to unpair %{device} from %{receiver}." msgstr "取消 %{device} 到 %{receiver} 的配對失敗。" -#: lib/solaar/ui/__init__.py:66 +#: lib/solaar/ui/__init__.py:67 msgid "The receiver returned an error, with no further details." msgstr "接收器出現錯誤,未提供詳細資訊。" -#: lib/solaar/ui/__init__.py:176 +#: lib/solaar/ui/__init__.py:177 msgid "Another Solaar process is already running so just expose its window" msgstr "其他的Solaar執行序已經運行了,所以顯示她的視窗。" #: lib/solaar/ui/about.py:36 msgid "Manages Logitech receivers,\n" "keyboards, mice, and tablets." -msgstr "" +msgstr "管理羅技接收器、鍵盤、滑鼠和平板。" #: lib/solaar/ui/about.py:44 msgid "Additional Programming" -msgstr "" +msgstr "額外程式化" #: lib/solaar/ui/about.py:45 msgid "GUI design" @@ -989,470 +1005,596 @@ msgid "Logitech documentation" msgstr "羅技文件" #: lib/solaar/ui/action.py:85 lib/solaar/ui/action.py:89 -#: lib/solaar/ui/window.py:202 +#: lib/solaar/ui/window.py:197 msgid "Unpair" msgstr "取消配對" -#: lib/solaar/ui/action.py:88 lib/solaar/ui/diversion_rules.py:151 +#: lib/solaar/ui/action.py:88 lib/solaar/ui/diversion_rules.py:150 msgid "Cancel" msgstr "取消" -#: lib/solaar/ui/config_panel.py:205 +#: lib/solaar/ui/config_panel.py:212 msgid "Complete - ENTER to change" -msgstr "" +msgstr "完成 - 按 ENTER 來修改" -#: lib/solaar/ui/config_panel.py:205 +#: lib/solaar/ui/config_panel.py:212 msgid "Incomplete" -msgstr "" +msgstr "未完成" -#: lib/solaar/ui/config_panel.py:444 lib/solaar/ui/config_panel.py:495 +#: lib/solaar/ui/config_panel.py:455 lib/solaar/ui/config_panel.py:507 #, python-format msgid "%d value" msgid_plural "%d values" -msgstr[0] "" +msgstr[0] "%d 值" -#: lib/solaar/ui/config_panel.py:506 +#: lib/solaar/ui/config_panel.py:518 msgid "Changes allowed" -msgstr "" +msgstr "允許更改" -#: lib/solaar/ui/config_panel.py:507 +#: lib/solaar/ui/config_panel.py:519 msgid "No changes allowed" -msgstr "" +msgstr "不允許更改" -#: lib/solaar/ui/config_panel.py:508 +#: lib/solaar/ui/config_panel.py:520 msgid "Ignore this setting" -msgstr "" +msgstr "忽略此設定" -#: lib/solaar/ui/config_panel.py:553 +#: lib/solaar/ui/config_panel.py:565 msgid "Working" msgstr "工作中" -#: lib/solaar/ui/config_panel.py:556 +#: lib/solaar/ui/config_panel.py:568 msgid "Read/write operation failed." -msgstr "讀寫操作失敗。" +msgstr "讀/寫操作失敗。" -#: lib/solaar/ui/diversion_rules.py:64 +#: lib/solaar/ui/diversion_rules.py:65 msgid "Built-in rules" -msgstr "" +msgstr "內建規則" -#: lib/solaar/ui/diversion_rules.py:64 +#: lib/solaar/ui/diversion_rules.py:65 msgid "User-defined rules" -msgstr "" +msgstr "使用者自定義規則" -#: lib/solaar/ui/diversion_rules.py:66 lib/solaar/ui/diversion_rules.py:1074 +#: lib/solaar/ui/diversion_rules.py:67 lib/solaar/ui/diversion_rules.py:1082 msgid "Rule" -msgstr "" +msgstr "規則" -#: lib/solaar/ui/diversion_rules.py:67 lib/solaar/ui/diversion_rules.py:508 -#: lib/solaar/ui/diversion_rules.py:630 +#: lib/solaar/ui/diversion_rules.py:68 lib/solaar/ui/diversion_rules.py:509 +#: lib/solaar/ui/diversion_rules.py:635 msgid "Sub-rule" -msgstr "" +msgstr "子規則" -#: lib/solaar/ui/diversion_rules.py:69 +#: lib/solaar/ui/diversion_rules.py:70 msgid "[empty]" -msgstr "" +msgstr "[空]" -#: lib/solaar/ui/diversion_rules.py:92 +#: lib/solaar/ui/diversion_rules.py:94 msgid "Solaar Rule Editor" -msgstr "" +msgstr "Solaar 規則編輯器" -#: lib/solaar/ui/diversion_rules.py:142 +#: lib/solaar/ui/diversion_rules.py:141 msgid "Make changes permanent?" -msgstr "" +msgstr "使更改永久生效?" -#: lib/solaar/ui/diversion_rules.py:147 +#: lib/solaar/ui/diversion_rules.py:146 msgid "Yes" msgstr "是" -#: lib/solaar/ui/diversion_rules.py:149 +#: lib/solaar/ui/diversion_rules.py:148 msgid "No" msgstr "否" -#: lib/solaar/ui/diversion_rules.py:154 +#: lib/solaar/ui/diversion_rules.py:153 msgid "If you choose No, changes will be lost when Solaar is closed." -msgstr "" +msgstr "如果您選擇否,當 Solaar 關閉時,更改將會遺失。" -#: lib/solaar/ui/diversion_rules.py:202 +#: lib/solaar/ui/diversion_rules.py:201 msgid "Save changes" msgstr "儲存修改" -#: lib/solaar/ui/diversion_rules.py:207 +#: lib/solaar/ui/diversion_rules.py:206 msgid "Discard changes" msgstr "不儲存修改" -#: lib/solaar/ui/diversion_rules.py:371 +#: lib/solaar/ui/diversion_rules.py:372 msgid "Insert here" -msgstr "" +msgstr "在此插入" -#: lib/solaar/ui/diversion_rules.py:373 +#: lib/solaar/ui/diversion_rules.py:374 msgid "Insert above" -msgstr "" +msgstr "在上方插入" -#: lib/solaar/ui/diversion_rules.py:375 +#: lib/solaar/ui/diversion_rules.py:376 msgid "Insert below" -msgstr "" +msgstr "在下方插入" -#: lib/solaar/ui/diversion_rules.py:381 +#: lib/solaar/ui/diversion_rules.py:382 msgid "Insert new rule here" -msgstr "" +msgstr "在此插入新規則" -#: lib/solaar/ui/diversion_rules.py:383 +#: lib/solaar/ui/diversion_rules.py:384 msgid "Insert new rule above" -msgstr "" +msgstr "在上方插入新規則" -#: lib/solaar/ui/diversion_rules.py:385 +#: lib/solaar/ui/diversion_rules.py:386 msgid "Insert new rule below" -msgstr "" +msgstr "在下方插入新規則" -#: lib/solaar/ui/diversion_rules.py:426 +#: lib/solaar/ui/diversion_rules.py:427 msgid "Paste here" -msgstr "" +msgstr "在此貼上" -#: lib/solaar/ui/diversion_rules.py:428 +#: lib/solaar/ui/diversion_rules.py:429 msgid "Paste above" -msgstr "" +msgstr "在上方貼上" -#: lib/solaar/ui/diversion_rules.py:430 +#: lib/solaar/ui/diversion_rules.py:431 msgid "Paste below" -msgstr "" +msgstr "在下方貼上" -#: lib/solaar/ui/diversion_rules.py:436 +#: lib/solaar/ui/diversion_rules.py:437 msgid "Paste rule here" -msgstr "" +msgstr "在此貼上規則" -#: lib/solaar/ui/diversion_rules.py:438 +#: lib/solaar/ui/diversion_rules.py:439 msgid "Paste rule above" -msgstr "" +msgstr "在上方貼上規則" -#: lib/solaar/ui/diversion_rules.py:440 +#: lib/solaar/ui/diversion_rules.py:441 msgid "Paste rule below" -msgstr "" +msgstr "在下方貼上規則" -#: lib/solaar/ui/diversion_rules.py:444 +#: lib/solaar/ui/diversion_rules.py:445 msgid "Paste rule" -msgstr "" +msgstr "貼上規則" -#: lib/solaar/ui/diversion_rules.py:473 +#: lib/solaar/ui/diversion_rules.py:474 msgid "Flatten" -msgstr "" +msgstr "平坦化" -#: lib/solaar/ui/diversion_rules.py:506 +#: lib/solaar/ui/diversion_rules.py:507 msgid "Insert" -msgstr "" +msgstr "插入" -#: lib/solaar/ui/diversion_rules.py:509 lib/solaar/ui/diversion_rules.py:632 -#: lib/solaar/ui/diversion_rules.py:1117 +#: lib/solaar/ui/diversion_rules.py:510 lib/solaar/ui/diversion_rules.py:637 +#: lib/solaar/ui/diversion_rules.py:1125 msgid "Or" -msgstr "" +msgstr "或" -#: lib/solaar/ui/diversion_rules.py:510 lib/solaar/ui/diversion_rules.py:631 -#: lib/solaar/ui/diversion_rules.py:1102 +#: lib/solaar/ui/diversion_rules.py:511 lib/solaar/ui/diversion_rules.py:636 +#: lib/solaar/ui/diversion_rules.py:1110 msgid "And" -msgstr "" +msgstr "和" -#: lib/solaar/ui/diversion_rules.py:512 +#: lib/solaar/ui/diversion_rules.py:513 msgid "Condition" -msgstr "" +msgstr "條件" -#: lib/solaar/ui/diversion_rules.py:514 lib/solaar/ui/diversion_rules.py:1238 +#: lib/solaar/ui/diversion_rules.py:515 lib/solaar/ui/diversion_rules.py:1291 msgid "Feature" -msgstr "" +msgstr "功能" -#: lib/solaar/ui/diversion_rules.py:515 lib/solaar/ui/diversion_rules.py:1156 +#: lib/solaar/ui/diversion_rules.py:516 lib/solaar/ui/diversion_rules.py:1327 +msgid "Report" +msgstr "報告" + +#: lib/solaar/ui/diversion_rules.py:517 lib/solaar/ui/diversion_rules.py:1203 msgid "Process" -msgstr "" +msgstr "處理" -#: lib/solaar/ui/diversion_rules.py:516 +#: lib/solaar/ui/diversion_rules.py:518 msgid "Mouse process" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:517 lib/solaar/ui/diversion_rules.py:1271 -msgid "Report" -msgstr "" +msgstr "滑鼠處理" -#: lib/solaar/ui/diversion_rules.py:518 lib/solaar/ui/diversion_rules.py:1306 +#: lib/solaar/ui/diversion_rules.py:519 lib/solaar/ui/diversion_rules.py:1365 msgid "Modifiers" -msgstr "" +msgstr "修飾鍵" -#: lib/solaar/ui/diversion_rules.py:519 lib/solaar/ui/diversion_rules.py:1353 +#: lib/solaar/ui/diversion_rules.py:520 lib/solaar/ui/diversion_rules.py:1418 msgid "Key" -msgstr "" +msgstr "鍵" -#: lib/solaar/ui/diversion_rules.py:520 lib/solaar/ui/diversion_rules.py:1398 -msgid "Test" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:521 lib/solaar/ui/diversion_rules.py:1460 +msgid "KeyIsDown" +msgstr "按鍵處於按下狀態" -#: lib/solaar/ui/diversion_rules.py:521 lib/solaar/ui/diversion_rules.py:1512 -msgid "Test bytes" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:522 lib/solaar/ui/diversion_rules.py:2249 +msgid "Active" +msgstr "使用中" -#: lib/solaar/ui/diversion_rules.py:522 lib/solaar/ui/diversion_rules.py:2072 +#: lib/solaar/ui/diversion_rules.py:523 lib/solaar/ui/diversion_rules.py:2207 +#: lib/solaar/ui/diversion_rules.py:2259 lib/solaar/ui/diversion_rules.py:2281 +msgid "Device" +msgstr "裝置" + +#: lib/solaar/ui/diversion_rules.py:524 lib/solaar/ui/diversion_rules.py:2297 msgid "Setting" -msgstr "" +msgstr "設定" + +#: lib/solaar/ui/diversion_rules.py:525 lib/solaar/ui/diversion_rules.py:1476 +#: lib/solaar/ui/diversion_rules.py:1525 +msgid "Test" +msgstr "測試" + +#: lib/solaar/ui/diversion_rules.py:526 lib/solaar/ui/diversion_rules.py:1642 +msgid "Test bytes" +msgstr "測試位元組" -#: lib/solaar/ui/diversion_rules.py:523 lib/solaar/ui/diversion_rules.py:1600 +#: lib/solaar/ui/diversion_rules.py:527 lib/solaar/ui/diversion_rules.py:1735 msgid "Mouse Gesture" msgstr "滑鼠手勢" -#: lib/solaar/ui/diversion_rules.py:527 +#: lib/solaar/ui/diversion_rules.py:531 msgid "Action" msgstr "動作" -#: lib/solaar/ui/diversion_rules.py:529 lib/solaar/ui/diversion_rules.py:1702 +#: lib/solaar/ui/diversion_rules.py:533 lib/solaar/ui/diversion_rules.py:1844 msgid "Key press" -msgstr "" +msgstr "按鍵按下" -#: lib/solaar/ui/diversion_rules.py:530 lib/solaar/ui/diversion_rules.py:1752 +#: lib/solaar/ui/diversion_rules.py:534 lib/solaar/ui/diversion_rules.py:1897 msgid "Mouse scroll" -msgstr "" +msgstr "滑鼠滾動" -#: lib/solaar/ui/diversion_rules.py:531 lib/solaar/ui/diversion_rules.py:1800 +#: lib/solaar/ui/diversion_rules.py:535 lib/solaar/ui/diversion_rules.py:1948 msgid "Mouse click" -msgstr "" +msgstr "滑鼠點選" -#: lib/solaar/ui/diversion_rules.py:532 lib/solaar/ui/diversion_rules.py:1869 +#: lib/solaar/ui/diversion_rules.py:536 +msgid "Set" +msgstr "設定" + +#: lib/solaar/ui/diversion_rules.py:537 lib/solaar/ui/diversion_rules.py:2019 msgid "Execute" -msgstr "" +msgstr "執行" -#: lib/solaar/ui/diversion_rules.py:533 -msgid "Set" -msgstr "" +#: lib/solaar/ui/diversion_rules.py:538 lib/solaar/ui/diversion_rules.py:1157 +msgid "Later" +msgstr "稍後" -#: lib/solaar/ui/diversion_rules.py:562 +#: lib/solaar/ui/diversion_rules.py:567 msgid "Insert new rule" -msgstr "" +msgstr "插入新規則" -#: lib/solaar/ui/diversion_rules.py:582 lib/solaar/ui/diversion_rules.py:1550 -#: lib/solaar/ui/diversion_rules.py:1649 lib/solaar/ui/diversion_rules.py:1828 +#: lib/solaar/ui/diversion_rules.py:587 lib/solaar/ui/diversion_rules.py:1685 +#: lib/solaar/ui/diversion_rules.py:1789 lib/solaar/ui/diversion_rules.py:1978 msgid "Delete" -msgstr "" +msgstr "刪除" -#: lib/solaar/ui/diversion_rules.py:604 +#: lib/solaar/ui/diversion_rules.py:609 msgid "Negate" -msgstr "" +msgstr "否" -#: lib/solaar/ui/diversion_rules.py:628 +#: lib/solaar/ui/diversion_rules.py:633 msgid "Wrap with" -msgstr "" +msgstr "包在一起" -#: lib/solaar/ui/diversion_rules.py:650 +#: lib/solaar/ui/diversion_rules.py:655 msgid "Cut" msgstr "剪下" -#: lib/solaar/ui/diversion_rules.py:665 +#: lib/solaar/ui/diversion_rules.py:670 msgid "Paste" msgstr "貼上" -#: lib/solaar/ui/diversion_rules.py:677 +#: lib/solaar/ui/diversion_rules.py:682 msgid "Copy" msgstr "複製" -#: lib/solaar/ui/diversion_rules.py:1054 +#: lib/solaar/ui/diversion_rules.py:1062 msgid "This editor does not support the selected rule component yet." -msgstr "" +msgstr "此編輯器尚不支援所選規則元件。" + +#: lib/solaar/ui/diversion_rules.py:1137 +msgid "Number of seconds to delay." +msgstr "延遲的秒數。" -#: lib/solaar/ui/diversion_rules.py:1132 +#: lib/solaar/ui/diversion_rules.py:1176 msgid "Not" -msgstr "" +msgstr "非" -#: lib/solaar/ui/diversion_rules.py:1184 +#: lib/solaar/ui/diversion_rules.py:1186 +msgid "X11 active process. For use in X11 only." +msgstr "X11 活躍程序。僅適用於 X11。" + +#: lib/solaar/ui/diversion_rules.py:1217 +msgid "X11 mouse process. For use in X11 only." +msgstr "X11 滑鼠程序。僅適用於 X11。" + +#: lib/solaar/ui/diversion_rules.py:1234 msgid "MouseProcess" -msgstr "" +msgstr "滑鼠程序" + +#: lib/solaar/ui/diversion_rules.py:1259 +msgid "Feature name of notification triggering rule processing." +msgstr "觸發規則處理的通知功能名稱。" + +#: lib/solaar/ui/diversion_rules.py:1307 +msgid "Report number of notification triggering rule processing." +msgstr "報告觸發規則處理的通知數量。" + +#: lib/solaar/ui/diversion_rules.py:1341 +msgid "Active keyboard modifiers. Not always available in Wayland." +msgstr "活躍的鍵盤修飾鍵。在 Wayland 中並非總是可用。" + +#: lib/solaar/ui/diversion_rules.py:1382 +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 "轉向鍵或按鈕被按下或放開。\n" + "使用按鍵 / 按鈕轉向和轉向 G 鍵設定來轉向鍵和按鈕。" -#: lib/solaar/ui/diversion_rules.py:1326 +#: lib/solaar/ui/diversion_rules.py:1391 msgid "Key down" -msgstr "" +msgstr "按鍵按下" -#: lib/solaar/ui/diversion_rules.py:1329 +#: lib/solaar/ui/diversion_rules.py:1394 msgid "Key up" -msgstr "" +msgstr "按鍵鬆開" -#: lib/solaar/ui/diversion_rules.py:1414 +#: lib/solaar/ui/diversion_rules.py:1435 +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 "轉向鍵或按鈕目前處於按下狀態。\n" + "使用鍵 / 按鈕轉向和轉向 G 鍵設定來轉向鍵和按鈕。" + +#: lib/solaar/ui/diversion_rules.py:1474 +msgid "Test condition on notification triggering rule processing." +msgstr "在通知觸發規則處理上測試條件。" + +#: lib/solaar/ui/diversion_rules.py:1478 +msgid "Parameter" +msgstr "參數" + +#: lib/solaar/ui/diversion_rules.py:1541 msgid "begin (inclusive)" -msgstr "" +msgstr "開始(包含)" -#: lib/solaar/ui/diversion_rules.py:1415 +#: lib/solaar/ui/diversion_rules.py:1542 msgid "end (exclusive)" -msgstr "" +msgstr "結束(不包含)" -#: lib/solaar/ui/diversion_rules.py:1424 +#: lib/solaar/ui/diversion_rules.py:1551 msgid "range" -msgstr "" +msgstr "範圍" -#: lib/solaar/ui/diversion_rules.py:1426 +#: lib/solaar/ui/diversion_rules.py:1553 msgid "minimum" -msgstr "" +msgstr "最小值" -#: lib/solaar/ui/diversion_rules.py:1427 +#: lib/solaar/ui/diversion_rules.py:1554 msgid "maximum" -msgstr "" +msgstr "最大值" -#: lib/solaar/ui/diversion_rules.py:1429 +#: lib/solaar/ui/diversion_rules.py:1556 #, python-format msgid "bytes %(0)d to %(1)d, ranging from %(2)d to %(3)d" -msgstr "" +msgstr "位元組 %(0)d 到 %(1)d,範圍從 %(2)d 到 %(3)d" -#: lib/solaar/ui/diversion_rules.py:1434 +#: lib/solaar/ui/diversion_rules.py:1561 msgid "mask" -msgstr "" +msgstr "遮罩" -#: lib/solaar/ui/diversion_rules.py:1435 +#: lib/solaar/ui/diversion_rules.py:1562 #, python-format msgid "bytes %(0)d to %(1)d, mask %(2)d" -msgstr "" +msgstr "位元組 %(0)d 到 %(1)d,遮罩 %(2)d" -#: lib/solaar/ui/diversion_rules.py:1452 +#: lib/solaar/ui/diversion_rules.py:1572 +msgid "Bit or range test on bytes in notification message triggering rule " + "processing." +msgstr "在通知訊息觸發規則處理中對位元組進行位元或範圍測試。" + +#: lib/solaar/ui/diversion_rules.py:1582 msgid "type" -msgstr "" +msgstr "類型" + +#: lib/solaar/ui/diversion_rules.py:1665 +msgid "Mouse gesture with optional initiating button followed by zero or " + "more mouse movements." +msgstr "滑鼠手勢,可選擇帶有初始按鈕,後跟零個或多個滑鼠移動。" + +#: lib/solaar/ui/diversion_rules.py:1670 +msgid "Add movement" +msgstr "新增移動" -#: lib/solaar/ui/diversion_rules.py:1535 -msgid "Add action" -msgstr "增加動作" +#: lib/solaar/ui/diversion_rules.py:1763 +msgid "Simulate a chorded key click or depress or release.\n" + "On Wayland requires write access to /dev/uinput." +msgstr "模擬成組按鍵點選或按下或放開。\n" + "在 Wayland 上需要對 /dev/uinput 進行寫入。" -#: lib/solaar/ui/diversion_rules.py:1628 +#: lib/solaar/ui/diversion_rules.py:1768 msgid "Add key" -msgstr "" +msgstr "新增按鍵" -#: lib/solaar/ui/diversion_rules.py:1631 +#: lib/solaar/ui/diversion_rules.py:1771 msgid "Click" -msgstr "" +msgstr "點選" -#: lib/solaar/ui/diversion_rules.py:1634 +#: lib/solaar/ui/diversion_rules.py:1774 msgid "Depress" -msgstr "" +msgstr "按下" -#: lib/solaar/ui/diversion_rules.py:1637 +#: lib/solaar/ui/diversion_rules.py:1777 msgid "Release" -msgstr "" +msgstr "放開" -#: lib/solaar/ui/diversion_rules.py:1771 +#: lib/solaar/ui/diversion_rules.py:1861 +msgid "Simulate a mouse scroll.\n" + "On Wayland requires write access to /dev/uinput." +msgstr "模擬滑鼠滾動。\n" + "在 Wayland 上需要對 /dev/uinput 進行寫入。" + +#: lib/solaar/ui/diversion_rules.py:1917 +msgid "Simulate a mouse click.\n" + "On Wayland requires write access to /dev/uinput." +msgstr "模擬滑鼠點選。\n" + "在 Wayland 上需要對 /dev/uinput 進行寫入。" + +#: lib/solaar/ui/diversion_rules.py:1920 msgid "Button" -msgstr "" +msgstr "按鈕" -#: lib/solaar/ui/diversion_rules.py:1772 +#: lib/solaar/ui/diversion_rules.py:1921 msgid "Count" msgstr "計數" -#: lib/solaar/ui/diversion_rules.py:1814 +#: lib/solaar/ui/diversion_rules.py:1961 +msgid "Execute a command with arguments." +msgstr "執行帶有參數的命令。" + +#: lib/solaar/ui/diversion_rules.py:1964 msgid "Add argument" -msgstr "" +msgstr "新增參數" -#: lib/solaar/ui/diversion_rules.py:1888 +#: lib/solaar/ui/diversion_rules.py:2039 msgid "Toggle" -msgstr "" +msgstr "切換" -#: lib/solaar/ui/diversion_rules.py:1888 +#: lib/solaar/ui/diversion_rules.py:2039 msgid "True" -msgstr "" +msgstr "真" -#: lib/solaar/ui/diversion_rules.py:1889 +#: lib/solaar/ui/diversion_rules.py:2040 msgid "False" -msgstr "" +msgstr "假" -#: lib/solaar/ui/diversion_rules.py:1903 +#: lib/solaar/ui/diversion_rules.py:2054 msgid "Unsupported setting" -msgstr "" +msgstr "不支援的設定" -#: lib/solaar/ui/diversion_rules.py:2055 -msgid "Device" -msgstr "" - -#: lib/solaar/ui/diversion_rules.py:2061 lib/solaar/ui/diversion_rules.py:2303 -#: lib/solaar/ui/diversion_rules.py:2321 +#: lib/solaar/ui/diversion_rules.py:2212 lib/solaar/ui/diversion_rules.py:2231 +#: lib/solaar/ui/diversion_rules.py:2286 lib/solaar/ui/diversion_rules.py:2528 +#: lib/solaar/ui/diversion_rules.py:2546 msgid "Originating device" -msgstr "" +msgstr "發起裝置" + +#: lib/solaar/ui/diversion_rules.py:2245 +msgid "Device is active and its settings can be changed." +msgstr "裝置處於活躍狀態,其設定可以更改。" -#: lib/solaar/ui/diversion_rules.py:2080 +#: lib/solaar/ui/diversion_rules.py:2255 +msgid "Device originated the current notification." +msgstr "裝置發起了當前通知。" + +#: lib/solaar/ui/diversion_rules.py:2305 msgid "Value" msgstr "數值" -#: lib/solaar/ui/diversion_rules.py:2088 +#: lib/solaar/ui/diversion_rules.py:2313 msgid "Item" -msgstr "" +msgstr "項目" + +#: lib/solaar/ui/diversion_rules.py:2588 +msgid "Change setting on device" +msgstr "更改裝置上的設定" + +#: lib/solaar/ui/diversion_rules.py:2605 +msgid "Setting on device" +msgstr "裝置上的設定" -#: lib/solaar/ui/notify.py:122 lib/solaar/ui/tray.py:323 -#: lib/solaar/ui/tray.py:328 lib/solaar/ui/window.py:746 +#: lib/solaar/ui/notify.py:124 lib/solaar/ui/tray.py:320 +#: lib/solaar/ui/tray.py:325 lib/solaar/ui/window.py:739 msgid "offline" msgstr "離線" -#: lib/solaar/ui/pair_window.py:121 lib/solaar/ui/pair_window.py:255 -#: lib/solaar/ui/pair_window.py:277 +#: lib/solaar/ui/pair_window.py:122 lib/solaar/ui/pair_window.py:256 +#: lib/solaar/ui/pair_window.py:288 #, python-format msgid "%(receiver_name)s: pair new device" msgstr "%(receiver_name)s:配對新的裝置" -#: lib/solaar/ui/pair_window.py:122 +#: lib/solaar/ui/pair_window.py:123 #, python-format msgid "Enter passcode on %(name)s." -msgstr "" +msgstr "在 %(name)s 上輸入密碼。" -#: lib/solaar/ui/pair_window.py:125 +#: lib/solaar/ui/pair_window.py:126 #, python-format msgid "Type %(passcode)s and then press the enter key." -msgstr "" +msgstr "輸入 %(passcode)s,然後按 Enter 鍵。" -#: lib/solaar/ui/pair_window.py:128 +#: lib/solaar/ui/pair_window.py:129 msgid "left" -msgstr "" +msgstr "左" -#: lib/solaar/ui/pair_window.py:128 +#: lib/solaar/ui/pair_window.py:129 msgid "right" -msgstr "" +msgstr "右" -#: lib/solaar/ui/pair_window.py:130 +#: lib/solaar/ui/pair_window.py:131 #, python-format msgid "Press %(code)s\n" "and then press left and right buttons simultaneously." -msgstr "" +msgstr "按下 %(code)s\n" + "然後同時按下左鍵和右鍵。" -#: lib/solaar/ui/pair_window.py:187 +#: lib/solaar/ui/pair_window.py:188 msgid "Pairing failed" msgstr "配對失敗" -#: lib/solaar/ui/pair_window.py:189 +#: lib/solaar/ui/pair_window.py:190 msgid "Make sure your device is within range, and has a decent battery " "charge." msgstr "請確認您的裝置已在範圍內,並保證其電量充足。" -#: lib/solaar/ui/pair_window.py:191 +#: lib/solaar/ui/pair_window.py:192 msgid "A new device was detected, but it is not compatible with this " "receiver." msgstr "偵測到 1 個新裝置,但與此接收器不相容。" -#: lib/solaar/ui/pair_window.py:193 +#: lib/solaar/ui/pair_window.py:194 msgid "More paired devices than receiver can support." -msgstr "" +msgstr "配對的裝置數量超過接收器的支援範圍。" -#: lib/solaar/ui/pair_window.py:195 +#: lib/solaar/ui/pair_window.py:196 msgid "No further details are available about the error." msgstr "無此錯誤的詳細資訊。" -#: lib/solaar/ui/pair_window.py:209 +#: lib/solaar/ui/pair_window.py:210 msgid "Found a new device:" msgstr "發現一個新裝置:" -#: lib/solaar/ui/pair_window.py:234 +#: lib/solaar/ui/pair_window.py:235 msgid "The wireless link is not encrypted" msgstr "無線連線未加密" -#: lib/solaar/ui/pair_window.py:263 +#: lib/solaar/ui/pair_window.py:264 +msgid "Unifying receivers are only compatible with Unifying devices." +msgstr "Unifying 接收器只支援 Unifying 裝置。" + +#: lib/solaar/ui/pair_window.py:266 +msgid "Bolt receivers are only compatible with Bolt devices." +msgstr "Bolt 接收器只支援 Bolt 裝置。" + +#: 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 "" +msgstr "按下配對按鈕或按鍵,直到配對燈快速閃爍。" -#: lib/solaar/ui/pair_window.py:265 +#: lib/solaar/ui/pair_window.py:276 msgid "You may have to first turn the device off and on again." -msgstr "" +msgstr "您可能需要先關閉裝置,然後再開啟。" -#: lib/solaar/ui/pair_window.py:267 +#: lib/solaar/ui/pair_window.py:278 msgid "Turn on the device you want to pair." -msgstr "開啟需配對裝置的電源。" +msgstr "開啟您要配對的裝置。" -#: lib/solaar/ui/pair_window.py:269 +#: lib/solaar/ui/pair_window.py:280 msgid "If the device is already turned on, turn it off and on again." -msgstr "" +msgstr "如果裝置已開啟,請將其關閉並重新開啟。" -#: lib/solaar/ui/pair_window.py:272 +#: lib/solaar/ui/pair_window.py:283 #, python-format msgid "\n" "\n" @@ -1460,177 +1602,180 @@ msgid "\n" msgid_plural "\n" "\n" "This receiver has %d pairings remaining." -msgstr[0] "" +msgstr[0] "\n" + "\n" + "此接收器剩餘 %d 次配對。" -#: lib/solaar/ui/pair_window.py:275 +#: lib/solaar/ui/pair_window.py:286 msgid "\n" "Cancelling at this point will not use up a pairing." -msgstr "" +msgstr "\n" + "在此階段取消不會消耗配對次數。" #: lib/solaar/ui/tray.py:58 msgid "No Logitech device found" msgstr "沒有找到羅技的裝置" -#: lib/solaar/ui/tray.py:64 lib/solaar/ui/window.py:324 +#: lib/solaar/ui/tray.py:64 lib/solaar/ui/window.py:319 #, python-format msgid "About %s" msgstr "關於 %s" -#: lib/solaar/ui/tray.py:65 lib/solaar/ui/window.py:322 +#: lib/solaar/ui/tray.py:65 lib/solaar/ui/window.py:317 #, python-format msgid "Quit %s" msgstr "結束 %s" -#: lib/solaar/ui/tray.py:302 lib/solaar/ui/tray.py:310 +#: lib/solaar/ui/tray.py:299 lib/solaar/ui/tray.py:307 msgid "no receiver" msgstr "無接收器" -#: lib/solaar/ui/tray.py:326 +#: lib/solaar/ui/tray.py:323 msgid "no status" msgstr "無狀態" -#: lib/solaar/ui/window.py:101 +#: lib/solaar/ui/window.py:96 msgid "Scanning" msgstr "掃描中" -#: lib/solaar/ui/window.py:134 lib/solaar/ui/window.py:687 +#: lib/solaar/ui/window.py:129 msgid "Battery" msgstr "電池" -#: lib/solaar/ui/window.py:137 +#: lib/solaar/ui/window.py:132 msgid "Wireless Link" msgstr "無線連線" -#: lib/solaar/ui/window.py:141 +#: lib/solaar/ui/window.py:136 msgid "Lighting" msgstr "亮度" -#: lib/solaar/ui/window.py:175 +#: lib/solaar/ui/window.py:170 msgid "Show Technical Details" msgstr "顯示細節" -#: lib/solaar/ui/window.py:191 +#: lib/solaar/ui/window.py:186 msgid "Pair new device" msgstr "配對新裝置" -#: lib/solaar/ui/window.py:210 +#: lib/solaar/ui/window.py:205 msgid "Select a device" msgstr "選擇 1 個裝置" -#: lib/solaar/ui/window.py:327 +#: lib/solaar/ui/window.py:322 msgid "Rule Editor" -msgstr "" +msgstr "規則編輯器" -#: lib/solaar/ui/window.py:538 +#: lib/solaar/ui/window.py:533 msgid "Path" msgstr "路徑" -#: lib/solaar/ui/window.py:541 +#: lib/solaar/ui/window.py:536 msgid "USB ID" -msgstr "" +msgstr "USB ID" -#: lib/solaar/ui/window.py:544 lib/solaar/ui/window.py:546 -#: lib/solaar/ui/window.py:566 lib/solaar/ui/window.py:568 +#: 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 "序號" -#: lib/solaar/ui/window.py:550 +#: lib/solaar/ui/window.py:545 msgid "Index" msgstr "索引" -#: lib/solaar/ui/window.py:552 +#: lib/solaar/ui/window.py:547 msgid "Wireless PID" msgstr "無線 PID" -#: lib/solaar/ui/window.py:554 +#: lib/solaar/ui/window.py:549 msgid "Product ID" msgstr "產品 ID" -#: lib/solaar/ui/window.py:556 +#: lib/solaar/ui/window.py:551 msgid "Protocol" msgstr "通訊協定" -#: lib/solaar/ui/window.py:556 +#: lib/solaar/ui/window.py:551 msgid "Unknown" msgstr "不明" -#: lib/solaar/ui/window.py:559 +#: lib/solaar/ui/window.py:554 #, python-format msgid "%(rate)d ms (%(rate_hz)dHz)" msgstr "%(rate)d ms (%(rate_hz)dHz)" -#: lib/solaar/ui/window.py:559 +#: lib/solaar/ui/window.py:554 msgid "Polling rate" msgstr "查詢速率" -#: lib/solaar/ui/window.py:570 +#: lib/solaar/ui/window.py:565 msgid "Unit ID" -msgstr "" +msgstr "單位 ID" -#: lib/solaar/ui/window.py:581 +#: lib/solaar/ui/window.py:576 msgid "none" msgstr "無" -#: lib/solaar/ui/window.py:582 +#: lib/solaar/ui/window.py:577 msgid "Notifications" msgstr "通知" -#: lib/solaar/ui/window.py:619 +#: lib/solaar/ui/window.py:621 msgid "No device paired." msgstr "沒有已經配對的裝置" -#: lib/solaar/ui/window.py:626 +#: lib/solaar/ui/window.py:628 #, fuzzy, 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] "此接收器最多可以配對到 %(max_count)s 個裝置" -#: lib/solaar/ui/window.py:632 +#: lib/solaar/ui/window.py:634 msgid "Only one device can be paired to this receiver." msgstr "此接收器只能配對一個裝置" -#: lib/solaar/ui/window.py:636 +#: 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] "" - -#: lib/solaar/ui/window.py:688 -msgid "unknown" -msgstr "未知的" - -#: lib/solaar/ui/window.py:689 -msgid "Battery information unknown." -msgstr "電池狀態是未知的" +msgstr[0] "此接收器剩餘 %d 次配對。" -#: lib/solaar/ui/window.py:699 +#: lib/solaar/ui/window.py:692 msgid "Battery Voltage" -msgstr "" +msgstr "電池電壓" -#: lib/solaar/ui/window.py:701 +#: lib/solaar/ui/window.py:694 msgid "Voltage reported by battery" -msgstr "" +msgstr "電池報告的電壓" -#: lib/solaar/ui/window.py:703 +#: lib/solaar/ui/window.py:696 msgid "Battery Level" -msgstr "電量" +msgstr "電池電量" -#: lib/solaar/ui/window.py:705 +#: lib/solaar/ui/window.py:698 msgid "Approximate level reported by battery" -msgstr "" +msgstr "電池報告的大約電量" -#: lib/solaar/ui/window.py:712 lib/solaar/ui/window.py:714 +#: lib/solaar/ui/window.py:705 lib/solaar/ui/window.py:707 msgid "next reported " -msgstr "" +msgstr "下一次報告的 " -#: lib/solaar/ui/window.py:715 +#: lib/solaar/ui/window.py:708 msgid " and next level to be reported." -msgstr "" +msgstr " 以及下一個將被報告的等級。" -#: lib/solaar/ui/window.py:720 +#: lib/solaar/ui/window.py:713 msgid "last known" msgstr "最後已知" +#: lib/solaar/ui/window.py:724 +msgid "encrypted" +msgstr "已加密" + +#: lib/solaar/ui/window.py:726 +msgid "The wireless link between this device and its receiver is encrypted." +msgstr "裝置與接收器間的無線連線已加密。" + #: lib/solaar/ui/window.py:728 msgid "not encrypted" msgstr "未加密" @@ -1638,90 +1783,130 @@ msgstr "未加密" #: lib/solaar/ui/window.py:732 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 "裝置與接收器間的無線連線未加密。\n" - "\n" - "對定位裝置(如滑鼠、軌跡球、觸控板)來說這不是什麼問題。\n" - "\n" - "然而這對於內容輸入裝置(如鍵盤、數字鍵盤)卻是一個重大的安全問題,\n" - "您輸入的內容有可能被第三方偷偷監聽到。" - -#: lib/solaar/ui/window.py:741 -msgid "encrypted" -msgstr "已加密" - -#: lib/solaar/ui/window.py:743 -msgid "The wireless link between this device and its receiver is encrypted." -msgstr "裝置與接收器間的無線連線已加密。" + "This is a security issue for pointing devices, and a major security " + "issue for text-input devices." +msgstr "此裝置與其接收器之間的無線連接未加密。\n" + "這對指向性裝置是一個安全問題,對文字輸入裝置則是一個重大的安全問題。" -#: lib/solaar/ui/window.py:756 +#: lib/solaar/ui/window.py:748 #, python-format msgid "%(light_level)d lux" msgstr "%(light_level)d lux" -#~ msgid "%(battery_level)s" -#~ msgstr "%(battery_level)s" +#~ msgid "top" +#~ msgstr "上" -#~ msgid "%(battery_percent)d%%" -#~ msgstr "%(battery_percent)d%%" +#~ msgid "width" +#~ msgstr "寬度" -#~ msgid "USB id" -#~ msgstr "USB ID" +#~ msgid "height" +#~ msgstr "高度" -#~ msgid "If the device is already turned on,\n" -#~ "turn if off and on again." -#~ msgstr "若裝置的電源已經開啟,\n" -#~ "請先關閉再開啟。" +#~ msgid "About" +#~ msgstr "關於" -#~ msgid "The receiver only supports %d paired device(s)." -#~ msgstr "此接收器僅支援 %d 個配對裝置。" +#~ msgid "No Logitech receiver found" +#~ msgstr "未發現羅技接收器" -#~ msgid "Shows status of devices connected\n" -#~ "through wireless Logitech receivers." -#~ msgstr "顯示羅技接收器\n" -#~ "已連線的裝置狀態。" +#~ msgid "Quit" +#~ msgstr "退出" -#~ msgid "The receiver was unplugged." -#~ msgstr "接收器已移除。" +#~ msgid "Smooth Scrolling" +#~ msgstr "平滑滾動" + +#~ msgid "High Resolution Wheel Invert" +#~ msgstr "高解析度滾輪反轉" + +#~ msgid "High-sensitivity wheel invert mode for vertical scroll." +#~ msgstr "垂直捲動的高解析度反轉模式" + +#~ msgid "Wheel Resolution" +#~ msgstr "滾輪解析度" #~ msgid "Automatically switch the mouse wheel between ratchet and " #~ "freespin mode.\n" #~ "The mouse wheel is always free at 0, and always locked at 50" #~ msgstr "自動切換滑鼠滾輪的段落模式" -#~ msgid "Wheel Resolution" -#~ msgstr "滾輪解析度" +#~ msgid "The receiver was unplugged." +#~ msgstr "接收器已移除。" -#~ msgid "High-sensitivity wheel invert mode for vertical scroll." -#~ msgstr "垂直捲動的高解析度反轉模式" +#~ msgid "Shows status of devices connected\n" +#~ "through wireless Logitech receivers." +#~ msgstr "顯示羅技接收器\n" +#~ "已連線的裝置狀態。" -#~ msgid "High Resolution Wheel Invert" -#~ msgstr "高解析度滾輪反轉" +#~ msgid "The receiver only supports %d paired device(s)." +#~ msgstr "此接收器僅支援 %d 個配對裝置。" -#~ msgid "Smooth Scrolling" -#~ msgstr "平滑滾動" +#~ msgid "If the device is already turned on,\n" +#~ "turn if off and on again." +#~ msgstr "若裝置的電源已經開啟,\n" +#~ "請先關閉再開啟。" -#~ msgid "Quit" -#~ msgstr "退出" +#~ msgid "USB id" +#~ msgstr "USB ID" -#~ msgid "No Logitech receiver found" -#~ msgstr "未發現羅技接收器" +#~ msgid "%(battery_percent)d%%" +#~ msgstr "%(battery_percent)d%%" -#~ msgid "About" -#~ msgstr "關於" +#~ msgid "%(battery_level)s" +#~ msgstr "%(battery_level)s" -#~ msgid "height" -#~ msgstr "高度" +#~ 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 "裝置與接收器間的無線連線未加密。\n" +#~ "\n" +#~ "對定位裝置(如滑鼠、軌跡球、觸控板)來說這不是什麼問題。\n" +#~ "\n" +#~ "然而這對於內容輸入裝置(如鍵盤、數字鍵盤)卻是一個重大的安全問題,\n" +#~ "您輸入的內容有可能被第三方偷偷監聽到。" + +#~ msgid "Battery information unknown." +#~ msgstr "電池狀態是未知的" + +#~ msgid "unknown" +#~ msgstr "未知的" + +#~ msgid "Add action" +#~ msgstr "增加動作" + +#~ msgid "Try removing the device and plugging it back in or turning " +#~ "it off and then on." +#~ msgstr "嘗試移除裝置並將其插回,或是關閉然後開啟。" + +#~ msgid "If you've just installed Solaar, try removing the receiver " +#~ "and plugging it back in." +#~ msgstr "若您剛剛安裝 Solaar,請嘗試將接收器拔下再重新插上。" + +#~ msgid "Found a Logitech Receiver (%s), but did not have permission " +#~ "to open it." +#~ msgstr "已發現 1 個羅技接收器 (%s),但您沒有權限存取。" + +#~ msgid "Send a gesture by sliding the mouse while holding the button " +#~ "down." +#~ msgstr "按住按鈕時,透過滑動滑鼠來發送手勢。" + +#~ msgid "Adjust the DPI by sliding the mouse horizontally while " +#~ "holding the button down." +#~ msgstr "按住按鈕時,透過水平滑動滑鼠來調整 DPI。" + +#~ msgid "DPI Sliding Adjustment" +#~ msgstr "DPI 滑動調整" -#~ msgid "width" -#~ msgstr "寬度" +#~ msgid "Automatically switch the mouse wheel between ratchet and " +#~ "freespin mode.\n" +#~ "The mouse wheel is always free at 0, and always ratcheted at 50" +#~ msgstr "自動在滾輪棘輪模式和自由滾動模式之間切換滑鼠滾輪。\n" +#~ "滾輪在 0 時始終處於自由狀態,而在 50 時始終處於棘輪狀態" -#~ msgid "top" -#~ msgstr "上" +#~ msgid "Scroll Wheel Rachet" +#~ msgstr "滾輪棘輪" diff --git a/rules.d-uinput/42-logitech-unify-permissions.rules b/rules.d-uinput/42-logitech-unify-permissions.rules index d5c801102..b30dbc99d 100644 --- a/rules.d-uinput/42-logitech-unify-permissions.rules +++ b/rules.d-uinput/42-logitech-unify-permissions.rules @@ -23,8 +23,7 @@ LABEL="solaar_apply" # Allow any seated user to access the receiver. # uaccess: modern ACL-enabled udev -# udev-acl: for Ubuntu 12.10 and older -TAG+="uaccess", TAG+="udev-acl" +TAG+="uaccess" # Grant members of the "plugdev" group access to receiver (useful for SSH users) #MODE="0660", GROUP="plugdev" diff --git a/rules.d/42-logitech-unify-permissions.rules b/rules.d/42-logitech-unify-permissions.rules index 27a65ccb2..e52c9b0b6 100644 --- a/rules.d/42-logitech-unify-permissions.rules +++ b/rules.d/42-logitech-unify-permissions.rules @@ -22,8 +22,7 @@ LABEL="solaar_apply" # Allow any seated user to access the receiver. # uaccess: modern ACL-enabled udev -# udev-acl: for Ubuntu 12.10 and older -TAG+="uaccess", TAG+="udev-acl" +TAG+="uaccess" # Grant members of the "plugdev" group access to receiver (useful for SSH users) #MODE="0660", GROUP="plugdev" diff --git a/setup.py b/setup.py index af3b265b0..d10a2cdd0 100755 --- a/setup.py +++ b/setup.py @@ -31,15 +31,14 @@ def _data_files(): from os.path import dirname as _dirname - yield 'share/solaar/icons', _glob('share/solaar/icons/solaar*.svg') - yield 'share/solaar/icons', _glob('share/solaar/icons/light_*.png') - yield 'share/icons/hicolor/scalable/apps', ['share/solaar/icons/solaar.svg'] + yield 'share/icons/hicolor/scalable/apps', _glob('share/solaar/icons/solaar*.svg') + yield 'share/icons/hicolor/scalable/apps', _glob('share/solaar/icons/light_*.png') for mo in _glob('share/locale/*/LC_MESSAGES/solaar.mo'): yield _dirname(mo), [mo] yield 'share/applications', ['share/applications/solaar.desktop'] - yield 'share/solaar/udev-rules.d', ['rules.d/42-logitech-unify-permissions.rules'] + yield 'lib/udev/rules.d', ['rules.d/42-logitech-unify-permissions.rules'] yield 'share/metainfo', ['share/solaar/io.github.pwr_solaar.solaar.metainfo.xml'] del _dirname @@ -82,6 +81,7 @@ def _data_files(): 'PyYAML (>= 3.12)', 'python-xlib (>= 0.27)', 'psutil (>= 5.4.3)', + 'dbus-python (>=1.3.2)', ], extras_require={ 'report-descriptor': ['hid-parser'], diff --git a/share/solaar/icons/solaar-symbolic.svg b/share/solaar/icons/solaar-symbolic.svg new file mode 100644 index 000000000..e6523b7ce --- /dev/null +++ b/share/solaar/icons/solaar-symbolic.svg @@ -0,0 +1,42 @@ + + + + Solaar + + + + + + + + + + + + image/svg+xml + + Solaar + + + Daniel Pavel + + + + 2013-06-25 + solaar + + + + + + + + + + + + + + + + diff --git a/share/solaar/io.github.pwr_solaar.solaar.metainfo.xml b/share/solaar/io.github.pwr_solaar.solaar.metainfo.xml index 374bbf544..843439474 100644 --- a/share/solaar/io.github.pwr_solaar.solaar.metainfo.xml +++ b/share/solaar/io.github.pwr_solaar.solaar.metainfo.xml @@ -44,6 +44,7 @@ + diff --git a/tools/clean.sh b/tools/clean.sh new file mode 100755 index 000000000..4a1a07322 --- /dev/null +++ b/tools/clean.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +cd "$(dirname "$0")/.." + +find . -type f -name '*.py[co]' -delete +find . -type d -name '__pycache__' -delete + +/bin/rm --force po/*~ +/bin/rm --force --recursive share/locale/ diff --git a/tools/scan-registers.sh b/tools/scan-registers.sh index 6c7b8b5aa..d981a07b0 100755 --- a/tools/scan-registers.sh +++ b/tools/scan-registers.sh @@ -14,7 +14,7 @@ fi HIDRAW=$2 do_req() { - "$HC" --hidpp $HIDRAW | grep -v "\[1. ${DEVNUMBER} 8F.. ..0[12]" | grep -B 1 "^>> " + "$HC" --hidpp $HIDRAW | grep "^>> " | grep -v "\[1. .. 8F.. " } req00="$(mktemp --tmpdir req00-XXXXXX)" @@ -36,12 +36,19 @@ else fi rm --force "$req00" "$req00-flags" & +echo SHORT REGISTERS # read all short registers, skipping 00 for n in $(seq 1 255); do printf "10 ${DEVNUMBER} 81%02x 000000\n" $n done | do_req +echo LONG REGISTERS # read all long registers for n in $(seq 0 255); do printf "10 ${DEVNUMBER} 83%02x 000000\n" $n done | do_req + +echo PAIRING INFORMAITON # read all pairing information +for n in $(seq 0 255); do + printf "10 ${DEVNUMBER} 83B5 %02x0000\n" $n +done | do_req