From 79e432e031fb4b362387ea93ff0b029ee0e0ac28 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Tue, 8 Feb 2022 11:00:10 +0100 Subject: [PATCH] Improve i18n (#288) * Add Slovak translation for polkit message. * More strings can be translated now. --- bin/input-remapper-gtk | 14 +- inputremapper/gui/editor/editor.py | 31 ++- inputremapper/gui/gettext.py | 34 +++ inputremapper/gui/user_interface.py | 64 ++--- po/input-remapper.pot | 369 +++++++++++++--------------- 5 files changed, 258 insertions(+), 254 deletions(-) create mode 100644 inputremapper/gui/gettext.py diff --git a/bin/input-remapper-gtk b/bin/input-remapper-gtk index c311bb3d..f48adb60 100755 --- a/bin/input-remapper-gtk +++ b/bin/input-remapper-gtk @@ -24,11 +24,8 @@ import sys import atexit -import gettext -import locale -from inputremapper.configs.data import get_data_path -import os.path from argparse import ArgumentParser +from inputremapper.gui.gettext import _, LOCALE_DIR import gi gi.require_version('Gtk', '3.0') @@ -36,15 +33,6 @@ gi.require_version('GLib', '2.0') gi.require_version('GtkSource', '4') from gi.repository import Gtk -APP_NAME = 'input-remapper' -LOCALE_DIR = os.path.join(get_data_path(), 'lang') - -locale.bindtextdomain(APP_NAME, LOCALE_DIR) -locale.textdomain(APP_NAME) - -translate = gettext.translation(APP_NAME, LOCALE_DIR, fallback=True) -_ = translate.gettext - # https://github.com/Nuitka/Nuitka/issues/607#issuecomment-650217096 Gtk.init() diff --git a/inputremapper/gui/editor/editor.py b/inputremapper/gui/editor/editor.py index bb06124d..c1954148 100644 --- a/inputremapper/gui/editor/editor.py +++ b/inputremapper/gui/editor/editor.py @@ -23,6 +23,11 @@ import re +import locale +import gettext +import os +from inputremapper.configs.data import get_data_path +from inputremapper.gui.gettext import _ from gi.repository import Gtk, GLib, Gdk @@ -73,7 +78,7 @@ class SelectionLabel(Gtk.ListBoxRow): if combination: self.label.set_label(combination.beautify()) else: - self.label.set_label("new entry") + self.label.set_label(_("new entry")) def get_combination(self) -> EventCombination: return self.combination @@ -103,7 +108,7 @@ def ensure_everything_saved(func): return wrapped -SET_KEY_FIRST = "Set the key first" +SET_KEY_FIRST = _("Set the key first") class Editor: @@ -374,7 +379,7 @@ class Editor: """Add one empty row for a single mapped key.""" selection_label_listbox = self.get("selection_label_listbox") mapping_selection = SelectionLabel() - mapping_selection.set_label("new entry") + mapping_selection.set_label(_("new entry")) mapping_selection.show_all() selection_label_listbox.insert(mapping_selection, -1) @@ -463,10 +468,11 @@ class Editor: """Get a widget from the window""" return self.user_interface.builder.get_object(name) - def _on_recording_toggle_toggle(self, *_): + def _on_recording_toggle_toggle(self, *args): """Refresh useful usage information.""" if not self.get_recording_toggle().get_active(): return + self._reset_keycode_consumption() reader.clear() if not self.user_interface.can_modify_preset(): @@ -474,7 +480,7 @@ class Editor: # therefore the original keycode inaccessible logger.info("Cannot change keycodes while injecting") self.user_interface.show_status( - CTX_ERROR, 'Use "Stop Injection" to stop before editing' + CTX_ERROR, _('Use "Stop Injection" to stop before editing') ) self.get_recording_toggle().set_active(False) @@ -500,7 +506,7 @@ class Editor: """Blocks until the user decided about an action.""" confirm_delete = self.get("confirm-delete") - text = f"Are you sure to delete this mapping?" + text = _("Are you sure to delete this mapping?") self.get("confirm-delete-label").set_text(text) confirm_delete.show() @@ -557,7 +563,10 @@ class Editor: if existing is not None: existing = list(existing) existing[0] = re.sub(r"\s", "", existing[0]) - msg = f'"{combination.beautify()}" already mapped to "{tuple(existing)}"' + msg = _('"%s" already mapped to "%s"') % ( + combination.beautify(), + tuple(existing), + ) logger.info("%s %s", combination, msg) self.user_interface.show_status(CTX_KEYCODE, msg) return True @@ -565,10 +574,10 @@ class Editor: if combination.is_problematic(): self.user_interface.show_status( CTX_WARNING, - "ctrl, alt and shift may not combine properly", - "Your system might reinterpret combinations " - + "with those after they are injected, and by doing so " - + "break them.", + _("ctrl, alt and shift may not combine properly"), + _("Your system might reinterpret combinations ") + + _("with those after they are injected, and by doing so ") + + _("break them."), ) # the newest_keycode is populated since the ui regularly polls it diff --git a/inputremapper/gui/gettext.py b/inputremapper/gui/gettext.py new file mode 100644 index 00000000..922f2bc9 --- /dev/null +++ b/inputremapper/gui/gettext.py @@ -0,0 +1,34 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +# input-remapper - GUI for device specific keyboard mappings +# Copyright (C) 2022 sezanzeb +# +# This file is part of input-remapper. +# +# input-remapper is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# input-remapper is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with input-remapper. If not, see . + +import os.path +import gettext +import locale +from inputremapper.configs.data import get_data_path +from argparse import ArgumentParser + +APP_NAME = "input-remapper" +LOCALE_DIR = os.path.join(get_data_path(), "lang") + +locale.bindtextdomain(APP_NAME, LOCALE_DIR) +locale.textdomain(APP_NAME) + +translate = gettext.translation(APP_NAME, LOCALE_DIR, fallback=True) +_ = translate.gettext diff --git a/inputremapper/gui/user_interface.py b/inputremapper/gui/user_interface.py index 32bfd756..99afe370 100644 --- a/inputremapper/gui/user_interface.py +++ b/inputremapper/gui/user_interface.py @@ -26,6 +26,10 @@ import math import os import re import sys +import locale +import gettext +from inputremapper.configs.data import get_data_path +from inputremapper.gui.gettext import _ from evdev._ecodes import EV_KEY from gi.repository import Gtk, GtkSource, Gdk, GLib, GObject @@ -118,7 +122,7 @@ def if_preset_selected(func): return wrapped -def on_close_about(about, _): +def on_close_about(about, arg): """Hide the about dialog without destroying it.""" about.hide() return True @@ -222,7 +226,7 @@ class UserInterface: self.button_left_warn = False if not is_helper_running(): - self.show_status(CTX_ERROR, "The helper did not start") + self.show_status(CTX_ERROR, _("The helper did not start")) def setup_timeouts(self): """Setup all GLib timeouts.""" @@ -247,7 +251,7 @@ class UserInterface: def show_confirm_delete(self): """Blocks until the user decided about an action.""" - text = f'Are you sure to delete preset "{self.preset_name}"?' + text = _("Are you sure to delete preset %s?") % self.preset_name self.get("confirm-delete-label").set_text(text) self.confirm_delete.show() @@ -255,7 +259,7 @@ class UserInterface: self.confirm_delete.hide() return response - def on_key_press(self, _, event): + def on_key_press(self, arg, event): """To execute shortcuts. This has nothing to do with the keycode reader. @@ -280,7 +284,7 @@ class UserInterface: if gdk_keycode == Gdk.KEY_Delete: self.on_restore_defaults_clicked() - def on_key_release(self, _, event): + def on_key_release(self, arg, event): """To execute shortcuts. This has nothing to do with the keycode reader. @@ -322,7 +326,7 @@ class UserInterface: return self.builder.get_object(name) @ensure_everything_saved - def on_close(self, *_): + def on_close(self, *args): """Safely close the application.""" logger.debug("Closing window") self.window.hide() @@ -390,7 +394,7 @@ class UserInterface: # and select the newest one (on the top). triggers on_select_preset preset_selection.set_active(0) - def can_modify_preset(self, *_) -> bool: + def can_modify_preset(self, *args) -> bool: """if changing the preset is possible.""" return self.dbus.get_state(self.group.key) != RUNNING @@ -413,10 +417,10 @@ class UserInterface: return True @if_group_selected - def on_restore_defaults_clicked(self, *_): + def on_restore_defaults_clicked(self, *args): """Stop injecting the preset.""" self.dbus.stop_injecting(self.group.key) - self.show_status(CTX_APPLY, "Applied the system default") + self.show_status(CTX_APPLY, _("Applied the system default")) GLib.timeout_add(100, self.show_device_mapping_status) def show_status(self, context_id, message, tooltip=None): @@ -470,11 +474,11 @@ class UserInterface: continue position = key.beautify() - msg = f"Syntax error at {position}, hover for info" + msg = _("Syntax error at %s, hover for info") % position self.show_status(CTX_MAPPING, msg, error) @ensure_everything_saved - def on_rename_button_clicked(self, _): + def on_rename_button_clicked(self, arg): """Rename the preset based on the contents of the name input.""" new_name = self.get("preset_name_input").get_text() @@ -493,7 +497,7 @@ class UserInterface: self.populate_presets() @if_preset_selected - def on_delete_preset_clicked(self, *_): + def on_delete_preset_clicked(self, *args): """Delete a preset from the file system.""" accept = Gtk.ResponseType.ACCEPT if len(active_preset) > 0 and self.show_confirm_delete() != accept: @@ -508,14 +512,14 @@ class UserInterface: self.populate_presets() @if_preset_selected - def on_apply_preset_clicked(self, _): + def on_apply_preset_clicked(self, arg): """Apply a preset without saving changes.""" self.save_preset() if active_preset.num_saved_keys == 0: - logger.error("Cannot apply empty preset file") + logger.error(_("Cannot apply empty preset file")) # also helpful for first time use - self.show_status(CTX_ERROR, "You need to add keys and save first") + self.show_status(CTX_ERROR, _("You need to add keys and save first")) return preset = self.preset_name @@ -556,11 +560,11 @@ class UserInterface: self.dbus.set_config_dir(get_config_path()) self.dbus.start_injecting(self.group.key, preset) - self.show_status(CTX_APPLY, "Starting injection...") + self.show_status(CTX_APPLY, _("Starting injection...")) GLib.timeout_add(100, self.show_injection_result) - def on_autoload_switch(self, _, active): + def on_autoload_switch(self, arg, active): """Load the preset automatically next time the user logs in.""" key = self.group.key preset = self.preset_name @@ -595,10 +599,10 @@ class UserInterface: state = self.dbus.get_state(self.group.key) if state == RUNNING: - msg = f'Applied preset "{self.preset_name}"' + msg = _("Applied preset %s") % self.preset_name if active_preset.get_mapping(EventCombination(InputEvent.btn_left())): - msg += ", CTRL + DEL to stop" + msg += _(", CTRL + DEL to stop") self.show_status(CTX_APPLY, msg) @@ -606,7 +610,9 @@ class UserInterface: return False if state == FAILED: - self.show_status(CTX_ERROR, f'Failed to apply preset "{self.preset_name}"') + self.show_status( + CTX_ERROR, _("Failed to apply preset %s") % self.preset_name + ) return False if state == NO_GRAB: @@ -633,12 +639,12 @@ class UserInterface: self.get("apply_system_layout").set_opacity(0.4) @if_preset_selected - def on_copy_preset_clicked(self, *_): + def on_copy_preset_clicked(self, *args): """Copy the current preset and select it.""" self.create_preset(copy=True) @if_group_selected - def on_create_preset_clicked(self, *_): + def on_create_preset_clicked(self, *args): """Create a new empty preset and select it.""" self.create_preset() @@ -667,7 +673,7 @@ class UserInterface: self.get("preset_selection").set_active_id(new_preset) except PermissionError as error: error = str(error) - self.show_status(CTX_ERROR, "Permission denied!", error) + self.show_status(CTX_ERROR, _("Permission denied!"), error) logger.error(error) @ensure_everything_saved @@ -721,7 +727,7 @@ class UserInterface: speed = 2 ** gtk_range.get_value() active_preset.set("gamepad.joystick.pointer_speed", speed) - def save_preset(self, *_): + def save_preset(self, *args): """Write changes in the active_preset to disk.""" if not active_preset.has_unsaved_changes(): # optimization, and also avoids tons of redundant logs @@ -739,10 +745,10 @@ class UserInterface: self.populate_presets() except PermissionError as error: error = str(error) - self.show_status(CTX_ERROR, "Permission denied!", error) + self.show_status(CTX_ERROR, _("Permission denied!"), error) logger.error(error) - for _, mapping in active_preset: + for _x, mapping in active_preset: if not mapping: continue @@ -757,7 +763,7 @@ class UserInterface: or code not in global_uinputs.get_uinput(target).capabilities()[EV_KEY] ): trimmed = re.sub(r"\s+", " ", symbol).strip() - self.show_status(CTX_MAPPING, f'Unknown mapping "{trimmed}"') + self.show_status(CTX_MAPPING, _("Unknown mapping %s") % trimmed) break else: # no broken mappings found @@ -767,11 +773,11 @@ class UserInterface: # the regular mappings are allright self.check_macro_syntax() - def on_about_clicked(self, _): + def on_about_clicked(self, arg): """Show the about/help dialog.""" self.about.show() - def on_about_key_press(self, _, event): + def on_about_key_press(self, arg, event): """Hide the about/help dialog.""" gdk_keycode = event.get_keyval()[1] if gdk_keycode == Gdk.KEY_Escape: diff --git a/po/input-remapper.pot b/po/input-remapper.pot index 0ae8964c..dcb57002 100644 --- a/po/input-remapper.pot +++ b/po/input-remapper.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-03 22:39+0200\n" +"POT-Creation-Date: 2022-02-08 08:52+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,323 +17,290 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: data/input-remapper.glade:1128 -msgid "." +#: inputremapper/gui/editor/editor.py:565 +#, python-format +msgid "\"%s\" already mapped to \"%s\"" msgstr "" -#: data/input-remapper.glade:1348 -msgid "1, 2" +#: inputremapper/gui/user_interface.py:605 +msgid ", CTRL + DEL to stop" msgstr "" -#: data/input-remapper.glade:926 -msgid "" -"A \"key + key + ... + key\" syntax can be used to trigger key combinations. " -"For example \"control_l + a\".\n" -"\n" -"\"disable\" disables a key." -msgstr "" - -#: data/input-remapper.glade:898 +#: data/input-remapper.glade:1070 msgid "About" msgstr "" -#: data/input-remapper.glade:209 +#: inputremapper/gui/user_interface.py:602 +#, python-format +msgid "Applied preset %s" +msgstr "" + +#: inputremapper/gui/user_interface.py:423 +msgid "Applied the system default" +msgstr "" + +#: data/input-remapper.glade:307 msgid "Apply" msgstr "" -#: data/input-remapper.glade:403 +#: inputremapper/gui/user_interface.py:254 +#, python-format +msgid "Are you sure to delete preset %s?" +msgstr "" + +#: inputremapper/gui/editor/editor.py:508 +msgid "Are you sure to delete this mapping?" +msgstr "" + +#: data/input-remapper.glade:504 msgid "Autoload" msgstr "" -#: data/input-remapper.glade:1420 -msgid "" -"Between calls to k, key down and key up events, macros will sleep for 10ms " -"by default, which can be configured in ~/.config/input-remapper/config" -msgstr "" - -#: data/input-remapper.glade:482 data/input-remapper.glade:526 +#: data/input-remapper.glade:583 data/input-remapper.glade:627 msgid "Buttons" msgstr "" -#: data/input-remapper.glade:1286 -msgid "CTRL + a, CTRL + x" +#: data/input-remapper.glade:65 +msgid "Cancel" msgstr "" -#: data/input-remapper.glade:706 -msgid "" -"Click on a cell below and hit a key on your device. Click the \"Restore " -"Defaults\" button beforehand." +#: inputremapper/gui/user_interface.py:520 +msgid "Cannot apply empty preset file" msgstr "" -#: data/input-remapper.glade:228 +#: data/input-remapper.glade:860 +msgid "Change Key" +msgstr "" + +#: data/input-remapper.glade:326 msgid "Copy" msgstr "" -#: data/input-remapper.glade:265 +#: data/input-remapper.glade:350 +msgid "Create a new preset" +msgstr "" + +#: data/input-remapper.glade:365 data/input-remapper.glade:889 msgid "Delete" msgstr "" -#: data/input-remapper.glade:96 +#: data/input-remapper.glade:894 +msgid "Delete this entry" +msgstr "" + +#: data/input-remapper.glade:370 +msgid "Delete this preset" +msgstr "" + +#: data/input-remapper.glade:193 msgid "Device" msgstr "" -#: bin/input-remapper-gtk:58 -msgid "Displays additional debug information" +#: data/input-remapper.glade:331 +msgid "Duplicate this preset" msgstr "" -#: data/input-remapper.glade:214 -msgid "Don't hold down any keys while the injection starts." +#: inputremapper/gui/user_interface.py:614 +#, python-format +msgid "Failed to apply preset %s" msgstr "" -#: data/input-remapper.glade:1213 -msgid "Examples" +#: data/input-remapper.glade:239 +msgid "Help" msgstr "" -#: data/input-remapper.glade:1604 -msgid "Go Back" -msgstr "" - -#: data/input-remapper.glade:483 data/input-remapper.glade:527 -msgid "Joystick" -msgstr "" - -#: data/input-remapper.glade:709 -msgid "Key" -msgstr "" - -#: data/input-remapper.glade:54 data/input-remapper.glade:1583 -#: data/input-remapper.glade:1695 +#: data/input-remapper.glade:149 msgid "Input Remapper" msgstr "" -#: data/input-remapper.glade:465 +#: data/input-remapper.glade:584 data/input-remapper.glade:628 +msgid "Joystick" +msgstr "" + +#: data/input-remapper.glade:566 msgid "Left joystick" msgstr "" -#: data/input-remapper.glade:948 -msgid "Macros" -msgstr "" - -#: data/input-remapper.glade:964 -msgid "Macros allow multiple characters to be written with a single key-press." -msgstr "" - -#: data/input-remapper.glade:723 -msgid "Mapping" -msgstr "" - -#: data/input-remapper.glade:480 data/input-remapper.glade:524 +#: data/input-remapper.glade:581 data/input-remapper.glade:625 msgid "Mouse" msgstr "" -#: data/input-remapper.glade:553 +#: data/input-remapper.glade:654 msgid "Mouse speed" msgstr "" -#: data/input-remapper.glade:246 +#: data/input-remapper.glade:345 msgid "New" msgstr "" -#: data/input-remapper.glade:298 +#: inputremapper/gui/user_interface.py:676 +#: inputremapper/gui/user_interface.py:748 +msgid "Permission denied!" +msgstr "" + +#: data/input-remapper.glade:399 msgid "Preset" msgstr "" -#: data/input-remapper.glade:337 +#: data/input-remapper.glade:864 +msgid "Record a button of your device that should be remapped" +msgstr "" + +#: data/input-remapper.glade:438 msgid "Rename" msgstr "" -#: data/input-remapper.glade:120 -msgid "Stop Injection" -msgstr "" - -#: data/input-remapper.glade:509 +#: data/input-remapper.glade:610 msgid "Right joystick" msgstr "" -#: data/input-remapper.glade:368 +#: data/input-remapper.glade:469 msgid "Save the entered name" msgstr "" -#: data/input-remapper.glade:124 +#: data/input-remapper.glade:1098 msgid "" -"Shortcut: ctrl + del\n" -"To give your keys back their original mapping." +"See usage.md online on github for comprehensive information.\n" +"\n" +"A \"key + key + ... + key\" syntax can be used to trigger key combinations. " +"For example \"Control_L + a\".\n" +"\n" +"Writing \"disable\" as a mapping disables a key.\n" +"\n" +"Macros allow multiple characters to be written with a single key-press. " +"Information about programming them is available online on github. See macros.md and examples.md" msgstr "" -#: data/input-remapper.glade:1556 +#: inputremapper/gui/editor/editor.py:111 +msgid "Set the key first" +msgstr "" + +#: data/input-remapper.glade:221 +msgid "" +"Shortcut: ctrl + del\n" +"Gives your keys back their original function" +msgstr "" + +#: data/input-remapper.glade:1239 msgid "Shortcuts" msgstr "" -#: data/input-remapper.glade:1458 +#: data/input-remapper.glade:1141 msgid "" "Shortcuts only work while keys are not being recorded and the gui is in " "focus." msgstr "" -#: data/input-remapper.glade:402 +#: data/input-remapper.glade:312 +msgid "Start injecting. Don't hold down any keys while the injection starts" +msgstr "" + +#: inputremapper/gui/user_interface.py:563 +msgid "Starting injection..." +msgstr "" + +#: data/input-remapper.glade:217 +msgid "Stop Injection" +msgstr "" + +#: inputremapper/gui/user_interface.py:477 +#, python-format +msgid "Syntax error at %s, hover for info" +msgstr "" + +#: inputremapper/gui/user_interface.py:229 +msgid "The helper did not start" +msgstr "" + +#: data/input-remapper.glade:879 +msgid "The type of device this mapping is emulating." +msgstr "" + +#: data/input-remapper.glade:499 msgid "To automatically apply the preset after your login or when it connects." msgstr "" -#: data/input-remapper.glade:1439 +#: inputremapper/gui/user_interface.py:766 +#, python-format +msgid "Unknown mapping %s" +msgstr "" + +#: data/input-remapper.glade:1122 msgid "Usage" msgstr "" -#: data/input-remapper.glade:843 +#: inputremapper/gui/editor/editor.py:482 +msgid "Use \"Stop Injection\" to stop before editing" +msgstr "" + +#: data/input-remapper.glade:1015 msgid "Version unknown" msgstr "" -#: data/input-remapper.glade:481 data/input-remapper.glade:525 +#: data/input-remapper.glade:582 data/input-remapper.glade:626 msgid "Wheel" msgstr "" -#: data/input-remapper.glade:860 +#: data/input-remapper.glade:1032 msgid "" "You can find more information and report bugs at\n" "https://github.com/" "sezanzeb/input-remapper" msgstr "" -#: data/input-remapper.glade:1248 -msgid "a, a, a with 500ms pause" +#: inputremapper/gui/user_interface.py:522 +msgid "You need to add keys and save first" msgstr "" -#: data/input-remapper.glade:1490 +#: inputremapper/gui/editor/editor.py:574 +msgid "Your system might reinterpret combinations " +msgstr "" + +#: inputremapper/gui/editor/editor.py:576 +msgid "break them." +msgstr "" + +#: data/input-remapper.glade:1173 msgid "closes the application" msgstr "" -#: data/input-remapper.glade:1478 +#: data/input-remapper.glade:1161 msgid "ctrl + del" msgstr "" -#: data/input-remapper.glade:1502 +#: data/input-remapper.glade:1185 msgid "ctrl + q" msgstr "" -#: data/input-remapper.glade:1514 +#: data/input-remapper.glade:1197 msgid "ctrl + r" msgstr "" -#: data/input-remapper.glade:1044 -msgid "e" +#: inputremapper/gui/editor/editor.py:573 +msgid "ctrl, alt and shift may not combine properly" msgstr "" -#: data/input-remapper.glade:1335 -msgid "e(EV_REL, REL_X, 10)" +#: inputremapper/gui/editor/editor.py:81 inputremapper/gui/editor/editor.py:382 +msgid "new entry" msgstr "" -#: data/input-remapper.glade:1104 -msgid "executes the parameter as long as the key is pressed down" -msgstr "" - -#: data/input-remapper.glade:1140 -msgid "executes two actions behind each other" -msgstr "" - -#: data/input-remapper.glade:1116 -msgid "h" -msgstr "" - -#: data/input-remapper.glade:1056 -msgid "holds a modifier while executing the second parameter" -msgstr "" - -#: data/input-remapper.glade:1020 -msgid "k" -msgstr "" - -#: data/input-remapper.glade:1298 -msgid "k(1).h(k(2)).k(3)" -msgstr "" - -#: data/input-remapper.glade:1235 -msgid "k(1).k(2)" -msgstr "" - -#: data/input-remapper.glade:1398 -msgid "keeps scrolling down while held" -msgstr "" - -#: data/input-remapper.glade:1080 -msgid "m" -msgstr "" - -#: data/input-remapper.glade:1273 -msgid "m(Control_L, k(a).k(x))" -msgstr "" - -#: data/input-remapper.glade:1152 -msgid "mouse" -msgstr "" - -#: data/input-remapper.glade:1372 -msgid "mouse(right, 4)" -msgstr "" - -#: data/input-remapper.glade:1311 -msgid "moves the mouse cursor 10px to the right" -msgstr "" - -#: data/input-remapper.glade:984 -msgid "r" -msgstr "" - -#: data/input-remapper.glade:1260 -msgid "r(3, k(a).w(500))" -msgstr "" - -#: data/input-remapper.glade:1526 +#: data/input-remapper.glade:1209 msgid "refreshes the device list" msgstr "" -#: data/input-remapper.glade:1092 -msgid "repeats the execution of the second parameter" -msgstr "" - -#: data/input-remapper.glade:1188 -msgid "same as mouse" -msgstr "" - -#: data/input-remapper.glade:1538 +#: data/input-remapper.glade:1221 msgid "stops the injection" msgstr "" -#: data/input-remapper.glade:1176 -msgid "takes direction (up, left, ...) and speed as parameters" +#: inputremapper/gui/editor/editor.py:575 +msgid "with those after they are injected, and by doing so " msgstr "" -#: data/input-remapper.glade:1008 -msgid "w" -msgstr "" - -#: data/input-remapper.glade:996 -msgid "waits in milliseconds" -msgstr "" - -#: data/input-remapper.glade:1164 -msgid "wheel" -msgstr "" - -#: data/input-remapper.glade:1385 -msgid "wheel(down, 1)" -msgstr "" - -#: data/input-remapper.glade:1360 -msgid "which keeps moving the mouse while pressed" -msgstr "" - -#: data/input-remapper.glade:1323 -msgid "writes 1 2 2 ... 2 2 3 while the key is pressed" -msgstr "" - -#: data/input-remapper.glade:1032 -msgid "writes a single keystroke" -msgstr "" - -#: data/input-remapper.glade:1068 -msgid "writes an event" -msgstr "" - -#: data/input-remapper.glade:880 +#: data/input-remapper.glade:1052 msgid "" "© 2021 Sezanzeb proxima@sezanzeb.de\n" "This program comes with absolutely no warranty.\n"