Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package wcm for openSUSE:Factory checked in 
at 2026-08-18 16:38:00
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/wcm (Old)
 and      /work/SRC/openSUSE:Factory/.wcm.new.1258 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "wcm"

Tue Aug 18 16:38:00 2026 rev:5 rq:1371737 version:0.11.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/wcm/wcm.changes  2026-04-10 18:02:54.382345930 
+0200
+++ /work/SRC/openSUSE:Factory/.wcm.new.1258/wcm.changes        2026-08-18 
16:38:47.320881020 +0200
@@ -1,0 +2,13 @@
+Tue Aug 18 08:34:11 UTC 2026 - Dead Mozay <[email protected]>
+
+- Update to version 0.11.0:
+  * Fix typo in desktop file.
+  * Patch to add cli option for launching wcm directly to plugins.
+  * Use default app-id for .desktop file name.
+  * Make wcm single instance.
+  * Do not bundle wdisplays by default for packaging reasons.
+  * Get rid of redundant wdisplays subproject.
+  * Don't show 'not found' icon for plugins without an icon.
+  * add internationalisation.
+
+-------------------------------------------------------------------

Old:
----
  wcm-0.10.0.tar.xz
  wcm-0.10.0.tar.xz.sha256sum

New:
----
  wcm-0.11.0.tar.xz
  wcm-0.11.0.tar.xz.sha256sum

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ wcm.spec ++++++
--- /var/tmp/diff_new_pack.geRyh2/_old  2026-08-18 16:38:48.447921350 +0200
+++ /var/tmp/diff_new_pack.geRyh2/_new  2026-08-18 16:38:48.451921493 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package wcm
 #
-# Copyright (c) 2025 SUSE LLC and contributors
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -16,7 +16,7 @@
 #
 
 
-%define major_ver 0.10
+%define major_ver 0.11
 %define minor_ver 0
 Name:           wcm
 Version:        %{major_ver}.%{minor_ver}
@@ -29,7 +29,7 @@
 BuildRequires:  fdupes
 BuildRequires:  gcc-c++
 BuildRequires:  meson
-BuildRequires:  pkgconfig(wlroots-0.19) 
+BuildRequires:  pkgconfig(fmt)
 BuildRequires:  pkgconfig(gtk+-3.0)
 BuildRequires:  pkgconfig(gtkmm-3.0)
 BuildRequires:  pkgconfig(libevdev)
@@ -39,6 +39,7 @@
 BuildRequires:  pkgconfig(wayland-protocols)
 BuildRequires:  pkgconfig(wf-config) >= %{major_ver}
 BuildRequires:  pkgconfig(wf-shell) >= %{major_ver}
+BuildRequires:  pkgconfig(wlroots-0.20)
 BuildRequires:  pkgconfig(xkbregistry)
 Requires:       wayfire >= %{major_ver}
 Requires:       wdisplays >= %{major_ver}
@@ -46,6 +47,8 @@
 %description
 Wayfire Config Manager https://wayfire.org/.
 
+%lang_package
+
 %prep
 echo "`grep %{name}-%{version}.tar.xz %{SOURCE1} | grep -Eo '^[0-9a-f]+'`  
%{SOURCE0}" | sha256sum -c
 %autosetup -p1
@@ -57,6 +60,7 @@
 %install
 %meson_install
 %fdupes %{buildroot}/%{_datadir}
+%find_lang %{name}
 
 %check
 %meson_test
@@ -64,8 +68,8 @@
 %files
 %license LICENSE
 %{_bindir}/%{name}
-%dir %{_datadir}/wcm/
-%{_datadir}/wcm/icons
-%{_datadir}/icons/wcm.svg
 %{_datadir}/applications/*.desktop
+%{_datadir}/icons/*/*/*/*.svg
+
+%files lang -f %{name}.lang
 

++++++ wcm-0.10.0.tar.xz -> wcm-0.11.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wcm-0.10.0/.github/workflows/ci.yaml 
new/wcm-0.11.0/.github/workflows/ci.yaml
--- old/wcm-0.10.0/.github/workflows/ci.yaml    2025-08-27 17:26:23.000000000 
+0200
+++ new/wcm-0.11.0/.github/workflows/ci.yaml    2026-07-28 07:20:28.000000000 
+0200
@@ -7,7 +7,7 @@
     runs-on: ubuntu-latest
     container: alpine:edge
     steps:
-    - run: apk --no-cache add git gcc g++ binutils pkgconf meson ninja cmake 
musl-dev wayland-dev wayland-protocols libinput-dev libevdev-dev 
libxkbcommon-dev pixman-dev glm-dev libdrm-dev mesa-dev cairo-dev pango-dev 
eudev-dev libxml2-dev glibmm-dev libseat-dev libdisplay-info-dev hwdata-dev 
nlohmann-json gtk+3.0-dev gtkmm3-dev
+    - run: apk --no-cache add git gcc g++ binutils pkgconf meson ninja cmake 
musl-dev wayland-dev wayland-protocols libinput-dev libevdev-dev 
libxkbcommon-dev pixman-dev glm-dev libdrm-dev mesa-dev cairo-dev pango-dev 
eudev-dev libxml2-dev glibmm-dev libseat-dev libdisplay-info-dev hwdata-dev 
nlohmann-json gtk+3.0-dev gtkmm3-dev gettext-dev fmt-dev
     - name: Wayfire
       uses: actions/checkout@v2
       with:
@@ -31,7 +31,7 @@
       with:
         repository: ammen99/uncrustify
         path: uncrustify
-    - run: cd uncrustify && mkdir build && cd build && cmake .. && make && cd 
../..
+    - run: cd uncrustify && mkdir build && cd build && cmake 
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 .. && make && cd ../..
     - name: Run Uncrustify Check
       uses: actions/checkout@v2
       with:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wcm-0.10.0/icons/desktop/meson.build 
new/wcm-0.11.0/icons/desktop/meson.build
--- old/wcm-0.10.0/icons/desktop/meson.build    2025-08-27 17:26:23.000000000 
+0200
+++ new/wcm-0.11.0/icons/desktop/meson.build    2026-07-28 07:20:28.000000000 
+0200
@@ -1,2 +1 @@
-install_data('wcm.svg', install_dir: join_paths(share_dir, 'icons'))
-install_data('wcm.svg', install_dir: join_paths(share_dir, 'wcm', 'icons'))
+install_data('wcm.svg', install_dir: join_paths(share_dir, 'icons', 'hicolor', 
'scalable', 'apps'))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wcm-0.10.0/icons/plugins/meson.build 
new/wcm-0.11.0/icons/plugins/meson.build
--- old/wcm-0.10.0/icons/plugins/meson.build    2025-08-27 17:26:23.000000000 
+0200
+++ new/wcm-0.11.0/icons/plugins/meson.build    2026-07-28 07:20:28.000000000 
+0200
@@ -1,60 +1,60 @@
-install_data('plugin-alpha.svg', install_dir: icon_dir)
-install_data('plugin-animate.svg', install_dir: icon_dir)
-install_data('plugin-annotate.svg', install_dir: icon_dir)
-install_data('plugin-autorotate-iio.svg', install_dir: icon_dir)
-install_data('plugin-autostart.svg', install_dir: icon_dir)
-install_data('plugin-background-view.svg', install_dir: icon_dir)
-install_data('plugin-bench.svg', install_dir: icon_dir)
-install_data('plugin-blur.svg', install_dir: icon_dir)
-install_data('plugin-command.svg', install_dir: icon_dir)
-install_data('plugin-core.svg', install_dir: icon_dir)
-install_data('plugin-crosshair.svg', install_dir: icon_dir)
-install_data('plugin-cube.svg', install_dir: icon_dir)
-install_data('plugin-dbus_interface.svg', install_dir: icon_dir)
-install_data('plugin-decoration.svg', install_dir: icon_dir)
-install_data('plugin-expo.svg', install_dir: icon_dir)
-install_data('plugin-extra-gestures.svg', install_dir: icon_dir)
-install_data('plugin-extra-protos.svg', install_dir: icon_dir)
-install_data('plugin-fast-switcher.svg', install_dir: icon_dir)
-install_data('plugin-fisheye.svg', install_dir: icon_dir)
-install_data('plugin-follow-focus.svg', install_dir: icon_dir)
-install_data('plugin-force-fullscreen.svg', install_dir: icon_dir)
-install_data('plugin-grid.svg', install_dir: icon_dir)
-install_data('plugin-hinge.svg', install_dir: icon_dir)
-install_data('plugin-idle.svg', install_dir: icon_dir)
-install_data('plugin-input.svg', install_dir: icon_dir)
-install_data('plugin-invert.svg', install_dir: icon_dir)
-install_data('plugin-join-views.svg', install_dir: icon_dir)
-install_data('plugin-keycolor.svg', install_dir: icon_dir)
-install_data('plugin-lxqt-shell.svg', install_dir: icon_dir)
-install_data('plugin-mag.svg', install_dir: icon_dir)
-install_data('plugin-move.svg', install_dir: icon_dir)
-install_data('plugin-obs.svg', install_dir: icon_dir)
-install_data('plugin-oswitch.svg', install_dir: icon_dir)
-install_data('plugin-place.svg', install_dir: icon_dir)
-install_data('plugin-preserve-output.svg', install_dir: icon_dir)
-install_data('plugin-resize.svg', install_dir: icon_dir)
-install_data('plugin-scale.svg', install_dir: icon_dir)
-install_data('plugin-scale-title-filter.svg', install_dir: icon_dir)
-install_data('plugin-showrepaint.svg', install_dir: icon_dir)
-install_data('plugin-simple-tile.svg', install_dir: icon_dir)
-install_data('plugin-switcher.svg', install_dir: icon_dir)
-install_data('plugin-view-shot.svg', install_dir: icon_dir)
-install_data('plugin-vswipe.svg', install_dir: icon_dir)
-install_data('plugin-vswitch.svg', install_dir: icon_dir)
-install_data('plugin-water.svg', install_dir: icon_dir)
-install_data('plugin-window-rules.svg', install_dir: icon_dir)
-install_data('plugin-winzoom.svg', install_dir: icon_dir)
-install_data('plugin-wm-actions.svg', install_dir: icon_dir)
-install_data('plugin-wobbly.svg', install_dir: icon_dir)
-install_data('plugin-workarounds.svg', install_dir: icon_dir)
-install_data('plugin-workspace-names.svg', install_dir: icon_dir)
-install_data('plugin-wrot.svg', install_dir: icon_dir)
-install_data('plugin-zoom.svg', install_dir: icon_dir)
+install_data('plugin-alpha.svg', install_dir: wcm_icon_dir)
+install_data('plugin-animate.svg', install_dir: wcm_icon_dir)
+install_data('plugin-annotate.svg', install_dir: wcm_icon_dir)
+install_data('plugin-autorotate-iio.svg', install_dir: wcm_icon_dir)
+install_data('plugin-autostart.svg', install_dir: wcm_icon_dir)
+install_data('plugin-background-view.svg', install_dir: wcm_icon_dir)
+install_data('plugin-bench.svg', install_dir: wcm_icon_dir)
+install_data('plugin-blur.svg', install_dir: wcm_icon_dir)
+install_data('plugin-command.svg', install_dir: wcm_icon_dir)
+install_data('plugin-core.svg', install_dir: wcm_icon_dir)
+install_data('plugin-crosshair.svg', install_dir: wcm_icon_dir)
+install_data('plugin-cube.svg', install_dir: wcm_icon_dir)
+install_data('plugin-dbus_interface.svg', install_dir: wcm_icon_dir)
+install_data('plugin-decoration.svg', install_dir: wcm_icon_dir)
+install_data('plugin-expo.svg', install_dir: wcm_icon_dir)
+install_data('plugin-extra-gestures.svg', install_dir: wcm_icon_dir)
+install_data('plugin-extra-protos.svg', install_dir: wcm_icon_dir)
+install_data('plugin-fast-switcher.svg', install_dir: wcm_icon_dir)
+install_data('plugin-fisheye.svg', install_dir: wcm_icon_dir)
+install_data('plugin-follow-focus.svg', install_dir: wcm_icon_dir)
+install_data('plugin-force-fullscreen.svg', install_dir: wcm_icon_dir)
+install_data('plugin-grid.svg', install_dir: wcm_icon_dir)
+install_data('plugin-hinge.svg', install_dir: wcm_icon_dir)
+install_data('plugin-idle.svg', install_dir: wcm_icon_dir)
+install_data('plugin-input.svg', install_dir: wcm_icon_dir)
+install_data('plugin-invert.svg', install_dir: wcm_icon_dir)
+install_data('plugin-join-views.svg', install_dir: wcm_icon_dir)
+install_data('plugin-keycolor.svg', install_dir: wcm_icon_dir)
+install_data('plugin-lxqt-shell.svg', install_dir: wcm_icon_dir)
+install_data('plugin-mag.svg', install_dir: wcm_icon_dir)
+install_data('plugin-move.svg', install_dir: wcm_icon_dir)
+install_data('plugin-obs.svg', install_dir: wcm_icon_dir)
+install_data('plugin-oswitch.svg', install_dir: wcm_icon_dir)
+install_data('plugin-place.svg', install_dir: wcm_icon_dir)
+install_data('plugin-preserve-output.svg', install_dir: wcm_icon_dir)
+install_data('plugin-resize.svg', install_dir: wcm_icon_dir)
+install_data('plugin-scale.svg', install_dir: wcm_icon_dir)
+install_data('plugin-scale-title-filter.svg', install_dir: wcm_icon_dir)
+install_data('plugin-showrepaint.svg', install_dir: wcm_icon_dir)
+install_data('plugin-simple-tile.svg', install_dir: wcm_icon_dir)
+install_data('plugin-switcher.svg', install_dir: wcm_icon_dir)
+install_data('plugin-view-shot.svg', install_dir: wcm_icon_dir)
+install_data('plugin-vswipe.svg', install_dir: wcm_icon_dir)
+install_data('plugin-vswitch.svg', install_dir: wcm_icon_dir)
+install_data('plugin-water.svg', install_dir: wcm_icon_dir)
+install_data('plugin-window-rules.svg', install_dir: wcm_icon_dir)
+install_data('plugin-winzoom.svg', install_dir: wcm_icon_dir)
+install_data('plugin-wm-actions.svg', install_dir: wcm_icon_dir)
+install_data('plugin-wobbly.svg', install_dir: wcm_icon_dir)
+install_data('plugin-workarounds.svg', install_dir: wcm_icon_dir)
+install_data('plugin-workspace-names.svg', install_dir: wcm_icon_dir)
+install_data('plugin-wrot.svg', install_dir: wcm_icon_dir)
+install_data('plugin-zoom.svg', install_dir: wcm_icon_dir)
 
 
 if wf_shell.found()
-  install_data('plugin-background.svg', install_dir: icon_dir)
-  install_data('plugin-dock.svg', install_dir: icon_dir)
-  install_data('plugin-panel.svg', install_dir: icon_dir)
+  install_data('plugin-background.svg', install_dir: wcm_icon_dir)
+  install_data('plugin-dock.svg', install_dir: wcm_icon_dir)
+  install_data('plugin-panel.svg', install_dir: wcm_icon_dir)
 endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wcm-0.10.0/locale/es_ES/LC_MESSAGES/wcm.po 
new/wcm-0.11.0/locale/es_ES/LC_MESSAGES/wcm.po
--- old/wcm-0.10.0/locale/es_ES/LC_MESSAGES/wcm.po      1970-01-01 
01:00:00.000000000 +0100
+++ new/wcm-0.11.0/locale/es_ES/LC_MESSAGES/wcm.po      2026-07-28 
07:20:28.000000000 +0200
@@ -0,0 +1,179 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2025-09-17 07:55-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator:\n"
+"Language-Team:\n"
+"Language: es_ES\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Uncategorized"
+msgstr "Sin categorizar"
+
+msgid "General"
+msgstr "General"
+
+msgid ""
+"Attempting to bind <tt><b>\"{key_str}\"</b></tt> without modifier. You will "
+"be unable to use this key/button for anything else! Are you sure?"
+msgstr ""
+"Intentando asignar <tt><b>\"{key_str}\"</b></tt> sin modificador. ¡No podrá "
+"usar esta tecla o botón para nada más! ¿Está seguro?"
+
+msgid "Waiting for Binding"
+msgstr "Esperando asignación"
+
+msgid "none"
+msgstr "ninguno"
+
+msgid "(No modifiers pressed)"
+msgstr "(No hay modificadores pulsados)"
+
+msgid "Edit binding"
+msgstr "Editar asignación"
+
+msgid "Save binding"
+msgstr "Guardar asignación"
+
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgid "Open context menu to choose layout"
+msgstr "Abrir menú contextual para elegir la disposición"
+
+msgid "Open context menu to choose model"
+msgstr "Abrir menú contextual para elegir el modelo"
+
+msgid "Reset to default"
+msgstr "Restablecer a valores predeterminados"
+
+msgid "Open"
+msgstr "Abrir"
+
+msgid "Choose Directory"
+msgstr "Seleccionar directorio"
+
+msgid "Select Folder"
+msgstr "Seleccionar carpeta"
+
+msgid "Choose File"
+msgstr "Seleccionar archivo"
+
+msgid "Select File"
+msgstr "Seleccionar archivo"
+
+msgid "Choose Executable"
+msgstr "Seleccionar ejecutable"
+
+msgid "Run command"
+msgstr "Ejecutar comando"
+
+msgid "Remove from autostart list"
+msgstr "Eliminar de la lista de inicio automático"
+
+msgid "Regular"
+msgstr "Normal"
+
+msgid "Repeat"
+msgstr "Repetir"
+
+msgid "Always"
+msgstr "Siempre"
+
+msgid "Command {name}"
+msgstr "Comando {name}"
+
+msgid "Command {name}: {command}"
+msgstr "Comando {name}: {command}"
+
+msgid "Workspace Index"
+msgstr "Índice de espacio de trabajo"
+
+msgid "Add new command"
+msgstr "Añadir nuevo comando"
+
+msgid "Go To Workspace"
+msgstr "Ir al espacio de trabajo"
+
+msgid "Go To Workspace With Window"
+msgstr "Ir al espacio de trabajo con ventana"
+
+msgid "Send Window To Workspace"
+msgstr "Enviar ventana al espacio de trabajo"
+
+msgid "Wayfire config file to use"
+msgstr "Archivo de configuración de Wayfire a usar"
+
+msgid "wf-shell config file to use"
+msgstr "Archivo de configuración de wf-shell a usar"
+
+msgid "plugin to open at launch, or none for default"
+msgstr "complemento a abrir al iniciar, o ninguno por defecto"
+
+msgid "Wayfire Config Manager"
+msgstr "Gestor de configuración de Wayfire"
+
+msgid "To use input binding capture, enable shortcuts-inhibit plugin."
+msgstr "Para usar la captura de asignación de entradas, active el complemento 
shortcuts-inhibit."
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Cannot find program <tt>wdisplays</tt>"
+msgstr "No se encuentra el programa <tt>wdisplays</tt>"
+
+msgid "Accessibility"
+msgstr "Accesibilidad"
+
+msgid "Desktop"
+msgstr "Escritorio"
+
+msgid "Shell"
+msgstr "Shell"
+
+msgid "Effects"
+msgstr "Efectos"
+
+msgid "Window Management"
+msgstr "Gestión de ventanas"
+
+msgid "Utility"
+msgstr "Utilidad"
+
+msgid "Other"
+msgstr "Otro"
+
+msgid "(none)"
+msgstr "(ninguno)"
+
+msgid "Command:"
+msgstr "Comando:"
+
+msgid "Type"
+msgstr "Tipo"
+
+msgid "Binding"
+msgstr "Asignación"
+
+msgid "Command"
+msgstr "Comando"
+
+msgid "Workspace"
+msgstr "Espacio de trabajo"
+
+msgid "Close"
+msgstr "Cerrar"
+
+msgid "Configure Outputs"
+msgstr "Configurar salidas"
+
+msgid "Use This Plugin"
+msgstr "Usar este complemento"
+
+msgid "Back"
+msgstr "Atrás"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wcm-0.10.0/locale/meson.build 
new/wcm-0.11.0/locale/meson.build
--- old/wcm-0.10.0/locale/meson.build   1970-01-01 01:00:00.000000000 +0100
+++ new/wcm-0.11.0/locale/meson.build   2026-07-28 07:20:28.000000000 +0200
@@ -0,0 +1,18 @@
+share_dir = join_paths(get_option('prefix'), 'share')
+wayfire_locale_dir = join_paths(share_dir, 'locale')
+
+fs = import('fs')
+
+po_files_raw = run_command('find', '.', '-name', '*.po', check : 
true).stdout().strip().split('\n')
+po_files = files(po_files_raw)
+
+foreach po_file : po_files
+    language = fs.name(fs.parent(fs.parent(po_file)))
+    install_path = join_paths(wayfire_locale_dir, language, 'LC_MESSAGES')
+    mo_dir = join_paths(meson.project_build_root(), 'locale', language, 
'LC_MESSAGES')
+    mo_file = fs.stem(po_file) + '.mo'
+    mo_path = join_paths(mo_dir, mo_file)
+    run_command('mkdir', '-p', mo_dir, check : true)
+    run_command('msgfmt', po_file, '-o', mo_path, check : true)
+    install_data(mo_path, install_dir : install_path)
+endforeach
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wcm-0.10.0/locale/ro/LC_MESSAGES/wcm.po 
new/wcm-0.11.0/locale/ro/LC_MESSAGES/wcm.po
--- old/wcm-0.10.0/locale/ro/LC_MESSAGES/wcm.po 1970-01-01 01:00:00.000000000 
+0100
+++ new/wcm-0.11.0/locale/ro/LC_MESSAGES/wcm.po 2026-07-28 07:20:28.000000000 
+0200
@@ -0,0 +1,247 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2025-09-15 14:54+0300\n"
+"PO-Revision-Date: 2025-09-15 15:00+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.7\n"
+
+#: src/metadata.cpp:382
+msgid "Uncategorized"
+msgstr "Necategorizat"
+
+#: src/metadata.cpp:411 src/wcm.hpp:83
+msgid "General"
+msgstr "Generale"
+
+#: src/wcm.cpp:26
+msgid ""
+"Attempting to bind <tt><b>\"{key_str}\"</b></tt> without modifier. You will "
+"be unable to use this key/button for anything else! Are you sure?"
+msgstr ""
+"Ați încercat să asociați «<tt><b>{key_str}</b></tt>» fără taste "
+"modificatoare; nu veți putea folosi această tastă/buton pentru nimic "
+"altceva. Sigur doriți să continuați?"
+
+#: src/wcm.cpp:66
+msgid "Waiting for Binding"
+msgstr "Se așteaptă asocierea"
+
+#: src/wcm.cpp:67
+msgid "none"
+msgstr "nimic"
+
+#: src/wcm.cpp:103
+msgid "(No modifiers pressed)"
+msgstr "(Fără taste modificatoare apăsate)"
+
+#: src/wcm.cpp:200
+msgid "Edit binding"
+msgstr "Editează asocierea"
+
+#: src/wcm.cpp:211
+msgid "Save binding"
+msgstr "Salvează asocierea"
+
+#: src/wcm.cpp:222 src/wcm.cpp:576 src/wcm.cpp:698
+msgid "Cancel"
+msgstr "Anulează"
+
+#: src/wcm.cpp:258
+msgid "Open context menu to choose layout"
+msgstr "Deschideți meniul contextual pentru a alege aranjamentul"
+
+#: src/wcm.cpp:283
+msgid "Open context menu to choose model"
+msgstr "Deschideți meniul contextual pentru a alege modelul"
+
+#: src/wcm.cpp:370
+msgid "Reset to default"
+msgstr "Resetează la opțiunile implicite"
+
+#: src/wcm.cpp:577 src/wcm.cpp:699
+msgid "Open"
+msgstr "Deschide"
+
+#: src/wcm.cpp:587
+msgid "Choose Directory"
+msgstr "Alegeți directorul"
+
+#: src/wcm.cpp:591
+msgid "Select Folder"
+msgstr "Alegeți director"
+
+#: src/wcm.cpp:601
+msgid "Choose File"
+msgstr "Alegeți fișierul"
+
+#: src/wcm.cpp:605
+msgid "Select File"
+msgstr "Alegeți fișier"
+
+#: src/wcm.cpp:694 src/wcm.cpp:697
+msgid "Choose Executable"
+msgstr "Alegeți executabilul"
+
+#: src/wcm.cpp:706
+msgid "Run command"
+msgstr "Execută comanda"
+
+#: src/wcm.cpp:712
+msgid "Remove from autostart list"
+msgstr "Elimină din lista de pornire automată"
+
+#: src/wcm.cpp:774
+msgid "Regular"
+msgstr "Obișnuită"
+
+#: src/wcm.cpp:775
+msgid "Repeat"
+msgstr "Repetată"
+
+#: src/wcm.cpp:776
+msgid "Always"
+msgstr "Mereu disponibilă"
+
+#: src/wcm.cpp:801
+msgid "Command {name}"
+msgstr "Comanda {name}"
+
+#: src/wcm.cpp:804
+msgid "Command {name}: {command}"
+msgstr "Comanda {name}: {command}"
+
+#: src/wcm.cpp:852
+msgid "Workspace Index"
+msgstr "Indicele biroului"
+
+#: src/wcm.cpp:905
+msgid "Add new command"
+msgstr "Adaugă o nouă comandă"
+
+#: src/wcm.cpp:979
+msgid "Go To Workspace"
+msgstr "Treci la birou"
+
+#: src/wcm.cpp:982
+msgid "Go To Workspace With Window"
+msgstr "Treci la birou cu fereastra"
+
+#: src/wcm.cpp:985
+msgid "Send Window To Workspace"
+msgstr "Trimite fereastra pe birou"
+
+#: src/wcm.cpp:1011 src/wcm.cpp:1019
+msgid "{workspace_option_prefix} {workspace_index}"
+msgstr "{workspace_option_prefix} {workspace_index}"
+
+#: src/wcm.cpp:1328
+msgid "Wayfire config file to use"
+msgstr "fișierul de configurare Wayfire de folosit"
+
+#: src/wcm.cpp:1333
+msgid "wf-shell config file to use"
+msgstr "fișierul de configurare wf-shell de folosit"
+
+#: src/wcm.cpp:1338
+msgid "plugin to open at launch, or none for default"
+msgstr ""
+"modul care să se deschidă la lansare, sau none pentru valoarea standard"
+
+#: src/wcm.cpp:1365
+msgid "Wayfire Config Manager"
+msgstr "Administratorul configurărilor Wayfire"
+
+#: src/wcm.cpp:1438
+msgid "To use input binding capture, enable shortcuts-inhibit plugin."
+msgstr ""
+"Pentru a folosi captarea asocierilor de intrare, activați modulul shortcuts-"
+"inhibit."
+
+#: src/wcm.cpp:1531
+msgid "Filter"
+msgstr "Filtru"
+
+#: src/wcm.cpp:1565
+msgid "Cannot find program <tt>wdisplays</tt>"
+msgstr "Nu se poate găsi programul <tt>wdisplays</tt>"
+
+#: src/wcm.hpp:84
+msgid "Accessibility"
+msgstr "Accesibilitate"
+
+#: src/wcm.hpp:85
+msgid "Desktop"
+msgstr "Birou"
+
+#: src/wcm.hpp:85
+msgid "Shell"
+msgstr "Interfața biroului"
+
+#: src/wcm.hpp:86
+msgid "Effects"
+msgstr "Efecte"
+
+#: src/wcm.hpp:87
+msgid "Window Management"
+msgstr "Gestionarea ferestrelor"
+
+#: src/wcm.hpp:88
+msgid "Utility"
+msgstr "Utilitare"
+
+#: src/wcm.hpp:88
+msgid "Other"
+msgstr "Altele"
+
+#: src/wcm.hpp:94
+msgid "(none)"
+msgstr "(nimic)"
+
+#: src/wcm.hpp:215
+msgid "Command:"
+msgstr "Comandă:"
+
+#: src/wcm.hpp:221
+msgid "Type"
+msgstr "Tip"
+
+#: src/wcm.hpp:222
+msgid "Binding"
+msgstr "Asociere"
+
+#: src/wcm.hpp:223
+msgid "Command"
+msgstr "Comandă"
+
+#: src/wcm.hpp:254
+msgid "Workspace"
+msgstr "Birou"
+
+#: src/wcm.hpp:338
+msgid "Close"
+msgstr "Închide"
+
+#: src/wcm.hpp:340
+msgid "Configure Outputs"
+msgstr "Configurează ieșiri"
+
+#: src/wcm.hpp:347
+msgid "Use This Plugin"
+msgstr "Folosește acest modul"
+
+#: src/wcm.hpp:348
+msgid "Back"
+msgstr "Înapoi"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wcm-0.10.0/locale/zh_CN/LC_MESSAGES/wcm.po 
new/wcm-0.11.0/locale/zh_CN/LC_MESSAGES/wcm.po
--- old/wcm-0.10.0/locale/zh_CN/LC_MESSAGES/wcm.po      1970-01-01 
01:00:00.000000000 +0100
+++ new/wcm-0.11.0/locale/zh_CN/LC_MESSAGES/wcm.po      2026-07-28 
07:20:28.000000000 +0200
@@ -0,0 +1,179 @@
+#, fuzzy
+
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2025-09-17 07:55-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+
+msgid "Uncategorized"
+msgstr "未分类"
+
+msgid "General"
+msgstr "常规"
+
+msgid ""
+"Attempting to bind <tt><b>\"{key_str}\"</b></tt> without modifier. You will "
+"be unable to use this key/button for anything else! Are you sure?"
+msgstr "正在尝试绑定无修饰符的<tt><b>\"{key_str}\"</b></tt>。您将无法将此键/按钮用于其他任何用途!您确定吗?"
+
+msgid "Waiting for Binding"
+msgstr "正在等待绑定"
+
+msgid "none"
+msgstr "无"
+
+msgid "(No modifiers pressed)"
+msgstr "(未按下修饰符)"
+
+msgid "Edit binding"
+msgstr "编辑绑定"
+
+msgid "Save binding"
+msgstr "保存绑定"
+
+msgid "Cancel"
+msgstr "取消"
+
+msgid "Open context menu to choose layout"
+msgstr "打开上下文菜单以选择布局"
+
+msgid "Open context menu to choose model"
+msgstr "打开上下文菜单以选择模型"
+
+msgid "Reset to default"
+msgstr "重置为默认值"
+
+msgid "Open"
+msgstr "打开"
+
+msgid "Choose Directory"
+msgstr "选择目录"
+
+msgid "Select Folder"
+msgstr "选择文件夹"
+
+msgid "Choose File"
+msgstr "选择文件"
+
+msgid "Select File"
+msgstr "选择文件"
+
+msgid "Choose Executable"
+msgstr "选择可执行文件"
+
+msgid "Run command"
+msgstr "运行命令"
+
+msgid "Remove from autostart list"
+msgstr "从自启动列表中移除"
+
+msgid "Regular"
+msgstr "常规"
+
+msgid "Repeat"
+msgstr "重复"
+
+msgid "Always"
+msgstr "总是"
+
+msgid "Command {name}"
+msgstr "命令 {name}"
+
+msgid "Command {name}: {command}"
+msgstr "命令 {name}:{command}"
+
+msgid "Workspace Index"
+msgstr "工作区索引"
+
+msgid "Add new command"
+msgstr "添加新命令"
+
+msgid "Go To Workspace"
+msgstr "转到工作区"
+
+msgid "Go To Workspace With Window"
+msgstr "将窗口移至工作区"
+
+msgid "Send Window To Workspace"
+msgstr "发送窗口至工作区"
+
+msgid "Wayfire config file to use"
+msgstr "要使用的 Wayfire 配置文件"
+
+msgid "wf-shell config file to use"
+msgstr "要使用的 wf-shell 配置文件"
+
+msgid "plugin to open at launch, or none for default"
+msgstr "启动时打开的插件,或无(默认)"
+
+msgid "Wayfire Config Manager"
+msgstr "Wayfire 配置管理器"
+
+msgid "To use input binding capture, enable shortcuts-inhibit plugin."
+msgstr "要使用输入绑定捕获,请启用 shortcuts-inhibit 插件。"
+
+msgid "Filter"
+msgstr "筛选"
+
+msgid "Cannot find program wdisplays"
+msgstr "找不到程序 wdisplays"
+
+msgid "Accessibility"
+msgstr "辅助功能"
+
+msgid "Desktop"
+msgstr "桌面"
+
+msgid "Shell"
+msgstr "Shell"
+
+msgid "Effects"
+msgstr "效果"
+
+msgid "Window Management"
+msgstr "窗口管理"
+
+msgid "Utility"
+msgstr "实用工具"
+
+msgid "Other"
+msgstr "其他"
+
+msgid "(none)"
+msgstr "(无)"
+
+msgid "Command:"
+msgstr "命令:"
+
+msgid "Type"
+msgstr "类型"
+
+msgid "Binding"
+msgstr "绑定"
+
+msgid "Command"
+msgstr "命令"
+
+msgid "Workspace"
+msgstr "工作区"
+
+msgid "Close"
+msgstr "关闭"
+
+msgid "Configure Outputs"
+msgstr "配置输出"
+
+msgid "Use This Plugin"
+msgstr "使用此插件"
+
+msgid "Back"
+msgstr "返回"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wcm-0.10.0/meson.build new/wcm-0.11.0/meson.build
--- old/wcm-0.10.0/meson.build  2025-08-27 17:26:23.000000000 +0200
+++ new/wcm-0.11.0/meson.build  2026-07-28 07:20:28.000000000 +0200
@@ -1,35 +1,40 @@
-project('wcm', 'c', 'cpp', version : '0.10.0', default_options : 
'cpp_std=c++17')
+project('wcm', 'c', 'cpp', version : '0.11.0', default_options : 
'cpp_std=c++17')
+
+fs = import('fs')
 
 add_global_arguments('-DWAYFIRE_CONFIG_FILE="' + 
get_option('wayfire_config_file_path') + '"', language : 'cpp')
 add_global_arguments('-DWF_SHELL_CONFIG_FILE="' + 
get_option('wf_shell_config_file_path') + '"', language : 'cpp')
 
-wayfire = dependency('wayfire', version: '>=0.10.0')
+dependency('pkg-config', required : true)
+evdev = dependency('libevdev')
+wayfire = dependency('wayfire', version: '>=0.11.0')
 wf_shell = dependency('wf-shell', required : get_option('wf_shell'))
 
 wayfire_metadata_dir = wayfire.get_variable(pkgconfig: 'metadatadir')
 wayfire_sysconf_dir = wayfire.get_variable(pkgconfig: 'sysconfdir')
 
 share_dir = join_paths(get_option('prefix'), 'share')
-icon_dir = join_paths(share_dir, 'wcm', 'icons')
+wayfire_locale_dir = join_paths(share_dir, 'locale')
+wcm_icon_dir = join_paths(share_dir, 'icons', 'hicolor', 'scalable', 'apps')
+wayfire_icon_dir = wayfire.get_variable(pkgconfig: 'icondir')
 
 add_global_arguments('-DWAYFIRE_METADATADIR="' + wayfire_metadata_dir + '"', 
language : 'cpp')
+add_global_arguments('-DWAYFIRE_LOCALEDIR="' + wayfire_locale_dir + '"', 
language : 'cpp')
 add_global_arguments('-DWAYFIRE_SYSCONFDIR="' + wayfire_sysconf_dir + '"', 
language : 'cpp')
 if wf_shell.found()
-  wf_shell_metadata_dir = wf_shell.get_variable(pkgconfig: 'metadatadir')
-  wf_shell_sysconf_dir = wf_shell.get_variable(pkgconfig: 'sysconfdir')
-  add_project_arguments('-DHAVE_WFSHELL=1', language : 'cpp')
-  add_global_arguments('-DWFSHELL_METADATADIR="' + wf_shell_metadata_dir + 
'"', language : 'cpp')
-  add_global_arguments('-DWFSHELL_SYSCONFDIR="' + wf_shell_sysconf_dir + '"', 
language : 'cpp')
+    wf_shell_metadata_dir = wf_shell.get_variable(pkgconfig: 'metadatadir')
+    wf_shell_sysconf_dir = wf_shell.get_variable(pkgconfig: 'sysconfdir')
+    add_global_arguments('-DHAVE_WFSHELL=1', language : 'cpp')
+    add_global_arguments('-DWFSHELL_METADATADIR="' + wf_shell_metadata_dir + 
'"', language : 'cpp')
+    add_global_arguments('-DWFSHELL_SYSCONFDIR="' + wf_shell_sysconf_dir + 
'"', language : 'cpp')
 endif
-add_global_arguments('-DICONDIR="' + icon_dir + '"', language : 'cpp')
-
-dependency('pkg-config', required : true)
-evdev = dependency('libevdev')
 
-add_project_arguments('-DICONDIR="' + icon_dir + '"', language : 'cpp')
+add_global_arguments('-DWAYFIRE_ICONDIR="' + wayfire_icon_dir + '"', language 
: 'cpp')
+add_global_arguments('-DWCM_ICONDIR="' + wcm_icon_dir + '"', language : 'cpp')
 
 subdir('icons')
 subdir('proto')
 subdir('src')
+subdir('locale')
 
 install_data('wcm.desktop', install_dir: join_paths(share_dir, 'applications'))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wcm-0.10.0/src/main.cpp new/wcm-0.11.0/src/main.cpp
--- old/wcm-0.10.0/src/main.cpp 2025-08-27 17:26:23.000000000 +0200
+++ new/wcm-0.11.0/src/main.cpp 2026-07-28 07:20:28.000000000 +0200
@@ -1,7 +1,12 @@
+#include <libintl.h>
+#include <locale.h>
 #include <wcm.hpp>
 
 int main(int argc, char **argv)
 {
+    setlocale(LC_ALL, "");
+    bindtextdomain("wcm", WAYFIRE_LOCALEDIR);
+    textdomain("wcm");
     auto app = Gtk::Application::create("org.gtk.wcm");
     std::unique_ptr<WCM> wcm = std::make_unique<WCM>(app);
     return app->run(argc, argv);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wcm-0.10.0/src/meson.build 
new/wcm-0.11.0/src/meson.build
--- old/wcm-0.10.0/src/meson.build      2025-08-27 17:26:23.000000000 +0200
+++ new/wcm-0.11.0/src/meson.build      2026-07-28 07:20:28.000000000 +0200
@@ -2,8 +2,10 @@
 gtkmm     = dependency('gtkmm-3.0', required: true)
 wf_config = dependency('wf-config', version: '>=0.6.0', required: true)
 xkbregistry = dependency('xkbregistry', required: true)
+libintl = dependency('intl', required: true)
+libfmt = dependency('fmt', required: true)
 
-dep_list = [xml, gtkmm, wf_config, wf_protos, evdev, xkbregistry]
+dep_list = [xml, gtkmm, wf_config, wf_protos, evdev, xkbregistry, libintl, 
libfmt]
 
 sources = files('main.cpp', 'metadata.cpp', 'wcm.cpp', 'utils.cpp')
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wcm-0.10.0/src/metadata.cpp 
new/wcm-0.11.0/src/metadata.cpp
--- old/wcm-0.10.0/src/metadata.cpp     2025-08-27 17:26:23.000000000 +0200
+++ new/wcm-0.11.0/src/metadata.cpp     2026-07-28 07:20:28.000000000 +0200
@@ -25,8 +25,11 @@
  */
 
 #include "wcm.hpp"
+#include <libintl.h>
+#include <locale.h>
 #include <stdio.h>
 #include <wayfire/config/xml.hpp>
+#include <glibmm/i18n.h>
 
 Option::Option(xmlNode *cur_node, Plugin *plugin)
 {
@@ -111,6 +114,7 @@
     }
 
     free(prop);
+    std::string gettext_domain_name = "wf-plugin-" + plugin->name;
     for (node = cur_node->children; node; node = node->next)
     {
         if (node->type != XML_ELEMENT_NODE)
@@ -121,10 +125,10 @@
         std::string node_name = (char*)node->name;
         if (node_name == "_short")
         {
-            this->disp_name = (char*)node->children->content;
+            this->disp_name = dgettext(gettext_domain_name.c_str(), 
(char*)node->children->content);
         } else if (node_name == "_long")
         {
-            this->tooltip = (char*)node->children->content;
+            this->tooltip = dgettext(gettext_domain_name.c_str(), 
(char*)node->children->content);
         } else if (node_name == "default")
         {
             if (!node->children)
@@ -284,7 +288,8 @@
 
                         if (is_name)
                         {
-                            li->name = strdup((char*)n->children->content);
+                            li->name =
+                                dgettext(gettext_domain_name.c_str(), 
strdup((char*)n->children->content));
                         }
                     } else if (this->type == OPTION_TYPE_STRING)
                     {
@@ -307,7 +312,8 @@
 
                         if (is_name)
                         {
-                            ls->name = (char*)n->children->content;
+                            ls->name =
+                                dgettext(gettext_domain_name.c_str(), 
strdup((char*)n->children->content));
                         }
                     }
                 }
@@ -374,11 +380,13 @@
         if (cur_node_name == "plugin")
         {
             plugin = new Plugin();
-            plugin->category = "Uncategorized";
+            plugin->category = _("Uncategorized");
             prop = xmlGetProp(cur_node, (xmlChar*)"name");
             if (prop)
             {
                 plugin->name = (char*)prop;
+                // Initialise translations
+                bindtextdomain(("wf-plugin-" + plugin->name).c_str(), 
WAYFIRE_LOCALEDIR);
             }
 
             free(prop);
@@ -401,7 +409,7 @@
             if (!main_group)
             {
                 main_group = new Option(OPTION_TYPE_GROUP, plugin);
-                main_group->name = "General";
+                main_group->name = _("General");
                 plugin->option_groups.push_back(main_group);
             }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wcm-0.10.0/src/wcm.cpp new/wcm-0.11.0/src/wcm.cpp
--- old/wcm-0.10.0/src/wcm.cpp  2025-08-27 17:26:23.000000000 +0200
+++ new/wcm-0.11.0/src/wcm.cpp  2026-07-28 07:20:28.000000000 +0200
@@ -2,12 +2,15 @@
 #include "utils.hpp"
 
 #include <filesystem>
+#include <fmt/format.h>
 #include <libevdev/libevdev.h>
+#include <libintl.h>
 #include <wayfire/config/compound-option.hpp>
 #include <wayfire/config/types.hpp>
 #include <wayfire/config/xml.hpp>
 #include <wayfire/util/duration.hpp>
 #include <wordexp.h>
+#include <glibmm/i18n.h>
 
 #define OUTPUT_CONFIG_PROGRAM "wdisplays"
 
@@ -19,9 +22,10 @@
         ((key_str.find("BTN") != std::string::npos) ||
          (key_str.find("KEY") != std::string::npos)))
     {
-        auto dialog = Gtk::MessageDialog("Attempting to bind <tt><b>\"" + 
key_str + '"' +
-            "</b></tt> without modifier. You will be unable to use this 
key/button "
-            "for anything else! Are you sure?",
+        auto dialog = Gtk::MessageDialog(
+            fmt::format(_("Attempting to bind <tt><b>\"{key_str}\"</b></tt> 
without modifier."
+                          " You will be unable to use this key/button for 
anything else!"
+                          " Are you sure?"), fmt::arg("key_str", key_str)),
             true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO);
         return dialog.run() == Gtk::RESPONSE_YES;
     }
@@ -59,8 +63,8 @@
 {
     static const auto HW_OFFSET = 8;
 
-    auto grab_dialog = Gtk::Dialog("Waiting for Binding", true);
-    auto label = Gtk::Label("none");
+    auto grab_dialog = Gtk::Dialog(_("Waiting for Binding"), true);
+    auto label = Gtk::Label(_("none"));
     grab_dialog.get_content_area()->pack_start(label);
     label.show();
 
@@ -96,7 +100,7 @@
     auto update_label = [=, &label]
     {
         const auto text = cur_state_string();
-        label.set_text(text.empty() ? "(No modifiers pressed)" : text);
+        label.set_text(text.empty() ? _("(No modifiers pressed)") : text);
     };
     update_label();
 
@@ -193,7 +197,7 @@
         }
     });
     edit_button.set_image_from_icon_name("gtk-edit");
-    edit_button.set_tooltip_text("Edit binding");
+    edit_button.set_tooltip_text(_("Edit binding"));
     edit_button.signal_clicked().connect([=]
     {
         entry.set_text(get_value());
@@ -204,7 +208,7 @@
 
     edit_layout.pack_start(entry, true, true);
     ok_button.set_image_from_icon_name("gtk-ok");
-    ok_button.set_tooltip_text("Save binding");
+    ok_button.set_tooltip_text(_("Save binding"));
     ok_button.signal_clicked().connect([=]
     {
         const std::string value = entry.get_text();
@@ -215,7 +219,7 @@
         }
     });
     cancel_button.set_image_from_icon_name("gtk-cancel");
-    cancel_button.set_tooltip_text("Cancel");
+    cancel_button.set_tooltip_text(_("Cancel"));
     cancel_button.signal_clicked().connect([=] { 
set_visible_child(grab_layout); });
     edit_layout.pack_start(cancel_button, false, false);
     edit_layout.pack_start(ok_button, false, false);
@@ -251,7 +255,7 @@
         });
     }
 
-    set_tooltip_text("Open context menu to choose layout");
+    set_tooltip_text(_("Open context menu to choose layout"));
 
     signal_populate_popup().connect([&] (Gtk::Menu *menu)
     {
@@ -276,7 +280,7 @@
         });
     }
 
-    set_tooltip_text("Open context menu to choose model");
+    set_tooltip_text(_("Open context menu to choose model"));
 
     signal_populate_popup().connect([&] (Gtk::Menu *menu)
     {
@@ -363,7 +367,7 @@
     name_label.set_alignment(Gtk::ALIGN_START);
 
     reset_button.set_image_from_icon_name("edit-clear");
-    reset_button.set_tooltip_text("Reset to default");
+    reset_button.set_tooltip_text(_("Reset to default"));
 
     pack_start(name_label, false, false);
     Gtk::Box::pack_end(reset_button, false, false);
@@ -569,8 +573,8 @@
                                            Gtk::FileChooserAction action)
                 {
                     auto dialog = Gtk::FileChooserDialog(label, action);
-                    dialog.add_button("Cancel", Gtk::RESPONSE_CANCEL);
-                    dialog.add_button("Open", Gtk::RESPONSE_ACCEPT);
+                    dialog.add_button(_("Cancel"), Gtk::RESPONSE_CANCEL);
+                    dialog.add_button(_("Open"), Gtk::RESPONSE_ACCEPT);
                     if (dialog.run() == Gtk::RESPONSE_ACCEPT)
                     {
                         widget->set_text(dialog.get_filename());
@@ -580,11 +584,11 @@
             {
                 auto dir_choose_button = std::make_unique<Gtk::Button>();
                 dir_choose_button->set_image_from_icon_name("folder-open");
-                dir_choose_button->set_tooltip_text("Choose Directory");
+                dir_choose_button->set_tooltip_text(_("Choose Directory"));
                 dir_choose_button->signal_clicked().connect(
                     [=]
                     {
-                        run_dialog("Select Folder",
+                        run_dialog(_("Select Folder"),
                             Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
                     });
                 pack_end(std::move(dir_choose_button));
@@ -594,11 +598,11 @@
             {
                 auto file_choose_button = std::make_unique<Gtk::Button>();
                 file_choose_button->set_image_from_icon_name("text-x-generic");
-                file_choose_button->set_tooltip_text("Choose File");
+                file_choose_button->set_tooltip_text(_("Choose File"));
                 file_choose_button->signal_clicked().connect(
                     [=]
                     {
-                        run_dialog("Select File", 
Gtk::FILE_CHOOSER_ACTION_OPEN);
+                        run_dialog(_("Select File"), 
Gtk::FILE_CHOOSER_ACTION_OPEN);
                     });
                 pack_end(std::move(file_choose_button));
             }
@@ -687,25 +691,25 @@
         option->set_save<std::string>(command_entry.get_text());
     });
     choose_button.set_image_from_icon_name("application-x-executable");
-    choose_button.set_tooltip_text("Choose Executable");
+    choose_button.set_tooltip_text(_("Choose Executable"));
     choose_button.signal_clicked().connect([&]
     {
-        auto dialog = Gtk::FileChooserDialog("Choose Executable");
-        dialog.add_button("Cancel", Gtk::RESPONSE_CANCEL);
-        dialog.add_button("Open", Gtk::RESPONSE_ACCEPT);
+        auto dialog = Gtk::FileChooserDialog(_("Choose Executable"));
+        dialog.add_button(_("Cancel"), Gtk::RESPONSE_CANCEL);
+        dialog.add_button(_("Open"), Gtk::RESPONSE_ACCEPT);
         if (dialog.run() == Gtk::RESPONSE_ACCEPT)
         {
             command_entry.set_text(dialog.get_filename());
         }
     });
     run_button.set_image_from_icon_name("media-playback-start");
-    run_button.set_tooltip_text("Run command");
+    run_button.set_tooltip_text(_("Run command"));
     run_button.signal_clicked().connect([=]
     {
         Glib::spawn_command_line_async(command_entry.get_text());
     });
     remove_button.set_image_from_icon_name("list-remove");
-    remove_button.set_tooltip_text("Remove from autostart list");
+    remove_button.set_tooltip_text(_("Remove from autostart list"));
     remove_button.signal_clicked().connect([=]
     {
         auto section = WCM::get_instance()->get_config_section(option->plugin);
@@ -767,9 +771,9 @@
     type_label.set_size_request(OPTION_LABEL_SIZE);
     type_label.set_alignment(Gtk::ALIGN_START);
     type_box.pack_start(type_label, false, false);
-    type_combo_box.append("Regular");
-    type_combo_box.append("Repeat");
-    type_combo_box.append("Always");
+    type_combo_box.append(_("Regular"));
+    type_combo_box.append(_("Repeat"));
+    type_combo_box.append(_("Always"));
     type_combo_box.set_active(always_opt ? 2 : repeatable_opt ? 1 : 0);
     type_combo_box.signal_changed().connect([=]
     {
@@ -794,10 +798,12 @@
     command_label.set_size_request(OPTION_LABEL_SIZE);
     command_label.set_alignment(Gtk::ALIGN_START);
     command_box.pack_start(command_label, false, false);
-    expander.set_label("Command " + cmd_name);
+    expander.set_label(fmt::format(_("Command {name}"), fmt::arg("name", 
cmd_name)));
     command_entry.signal_changed().connect([=]
     {
-        expander.set_label("Command " + cmd_name + ": " + 
command_entry.get_text());
+        expander.set_label(fmt::format(_("Command {name}: {command}"),
+            fmt::arg("name", cmd_name),
+            fmt::arg("command", command_entry.get_text().c_str())));
         auto *label = (Gtk::Label*)expander.get_label_widget();
         label->set_ellipsize(Pango::ELLIPSIZE_END);
         label->set_tooltip_text(command_entry.get_text());
@@ -843,7 +849,7 @@
         WCM::get_instance()->save_config(option->plugin);
     });
 
-    workspace_spin_button.set_tooltip_text("Workspace Index");
+    workspace_spin_button.set_tooltip_text(_("Workspace Index"));
     workspace_spin_button.set_value(workspace_index);
     workspace_spin_button.signal_value_changed().connect([=]
     {
@@ -896,7 +902,7 @@
         pack_widget(std::make_unique<AutostartWidget>(dyn_opt));
     }
 
-    add_button.set_tooltip_text("Add new command");
+    add_button.set_tooltip_text(_("Add new command"));
     add_button.signal_clicked().connect([=]
     {
         static const std::string prefix = "autostart";
@@ -970,13 +976,14 @@
 template<>
 const std::string 
VswitchBindingsDynamicList<VswitchBindingKind::SEND_WINDOW>::OPTION_PREFIX = 
"send_win_";
 template<>
-const Glib::ustring 
VswitchBindingsWidget<VswitchBindingKind::WITHOUT_WINDOW>::LABEL_TEXT = "Go To 
Workspace";
+const Glib::ustring 
VswitchBindingsWidget<VswitchBindingKind::WITHOUT_WINDOW>::LABEL_TEXT =
+    _("Go To Workspace");
 template<>
 const Glib::ustring 
VswitchBindingsWidget<VswitchBindingKind::WITH_WINDOW>::LABEL_TEXT =
-    "Go To Workspace With Window";
+    _("Go To Workspace With Window");
 template<>
 const Glib::ustring 
VswitchBindingsWidget<VswitchBindingKind::SEND_WINDOW>::LABEL_TEXT =
-    "Send Window To Workspace";
+    _("Send Window To Workspace");
 
 template<enum VswitchBindingKind kind>
 VswitchBindingsDynamicList<kind>::VswitchBindingsDynamicList(Option *option)
@@ -1009,8 +1016,8 @@
 
         Option *binding_option =
             option->create_child_option(OPTION_PREFIX + 
std::to_string(workspace_index), OPTION_TYPE_STRING);
-        
section->register_new_option(std::make_shared<wf::config::option_t<std::string>>(binding_option->name,
-            ""));
+        
section->register_new_option(std::make_shared<wf::config::option_t<std::string>>(
+            binding_option->name, ""));
         pack_widget(std::make_unique<BindingWidget>(section, binding_option, 
workspace_index));
         show_all();
         WCM::get_instance()->save_config(option->plugin);
@@ -1020,7 +1027,7 @@
 template<enum VswitchBindingKind kind>
 VswitchBindingsWidget<kind>::VswitchBindingsWidget(Option *option) : 
dynamic_list(option)
 {
-    set_label(LABEL_TEXT + " Bindings");
+    set_label(fmt::format("{option_name} Bindings", fmt::arg("option_name", 
LABEL_TEXT.c_str())));
     dynamic_list.property_margin().set_value(5);
     add(dynamic_list);
 }
@@ -1096,6 +1103,7 @@
 
 PluginPage::PluginPage(Plugin *plugin)
 {
+    std::string gettext_domain_name = "wf-plugin-" + plugin->name;
     set_scrollable();
     for (auto *group : plugin->option_groups)
     {
@@ -1105,7 +1113,7 @@
         }
 
         groups.emplace_back(group);
-        append_page(groups.back(), group->name);
+        append_page(groups.back(), dgettext(gettext_domain_name.c_str(), 
group->name.c_str()));
     }
 }
 
@@ -1138,11 +1146,12 @@
     }
 
     button_layout.pack_start(icon);
-    label.set_text(disp_name);
+    std::string gettext_domain_name = "wf-plugin-" + name;
+    label.set_text(dgettext(gettext_domain_name.c_str(), disp_name.c_str()));
     label.set_ellipsize(Pango::ELLIPSIZE_END);
     button_layout.pack_start(label);
     button_layout.set_halign(Gtk::ALIGN_START);
-    button.set_tooltip_markup(tooltip);
+    button.set_tooltip_markup(dgettext(gettext_domain_name.c_str(), 
tooltip.c_str()));
     button.set_relief(Gtk::RELIEF_NONE);
     button.add(button_layout);
     enabled_check.set_active(enabled);
@@ -1180,7 +1189,7 @@
         std::find_if(categories.begin(), categories.end() - 1,
             [=] (const Category & cat)
         {
-            return cat.name == plugin->category;
+            return cat.name == Glib::ustring(_(plugin->category.c_str()));
         })->add_plugin(plugin);
         size_group->add_widget(plugin->widget);
     }
@@ -1211,7 +1220,7 @@
             find_string(plug->tooltip, filter);
         // the parent of `plug->widget` is `Gtk::FlowBoxItem`
         plug->widget.get_parent()->set_visible(plug_visible);
-        category_visible[plug->category] |= plug_visible;
+        category_visible[_(plug->category.c_str())] |= plug_visible;
     }
 
     categories[0].vbox.set_visible(category_visible[categories[0].name]);
@@ -1311,17 +1320,17 @@
     {
         wf_config_file = value;
         return true;
-    }, "config", 'c', "Wayfire config file to use", "file");
+    }, "config", 'c', _("Wayfire config file to use"), "file");
     app->add_main_option_entry([this] (const Glib::ustring &, const 
Glib::ustring & value, bool)
     {
         wf_shell_config_file = value;
         return true;
-    }, "shell-config", 's', "wf-shell config file to use", "file");
+    }, "shell-config", 's', _("wf-shell config file to use"), "file");
     app->add_main_option_entry([this] (const Glib::ustring &, const 
Glib::ustring & value, bool)
     {
         start_plugin = value;
         return true;
-    }, "plugin", 'p', "plugin to open at launch, or none for default", "name");
+    }, "plugin", 'p', _("plugin to open at launch, or none for default"), 
"name");
 
     app->signal_startup().connect([this, app] ()
     {
@@ -1348,7 +1357,7 @@
         window->set_icon(icon);
         window->set_size_request(750, 550);
         window->set_default_size(1000, 580);
-        window->set_title("Wayfire Config Manager");
+        window->set_title(_("Wayfire Config Manager"));
         create_main_layout();
         window->show_all();
     });
@@ -1421,7 +1430,7 @@
         auto error_dialog = Gtk::Dialog(
             "Compositor does not advertise 
zwp_keyboard_shortcuts_inhibit_manager_v1!", *window,
             Gtk::DIALOG_DESTROY_WITH_PARENT);
-        auto label = Gtk::Label("To use input binding capture, enable 
shortcuts-inhibit plugin.");
+        auto label = Gtk::Label(_("To use input binding capture, enable 
shortcuts-inhibit plugin."));
         error_dialog.get_content_area()->pack_start(label, true, true, 50);
         error_dialog.add_button("Ok", 0);
         label.show();
@@ -1514,7 +1523,7 @@
     main_page = std::make_unique<MainPage>(plugins);
 
     filter_label.property_margin().set_value(10);
-    filter_label.set_markup("<span size=\"large\"><b>Filter</b></span>");
+    filter_label.set_markup("<span size=\"large\"><b>" + 
std::string(_("Filter")) + "</b></span>");
     main_left_panel_layout.pack_start(filter_label, false, false);
 
     search_entry.property_margin().set_value(10);
@@ -1548,7 +1557,7 @@
     {
         output_config_button.set_sensitive(false);
         output_config_button.set_tooltip_markup(
-            "Cannot find program <tt>wdisplays</tt>");
+            _("Cannot find program <tt>wdisplays</tt>"));
     }
 
     plugin_left_panel_layout.pack_start(plugin_name_label, false, false);
@@ -1602,13 +1611,16 @@
 {
     if (plugin)
     {
+        std::string gettext_domain_name = "wf-plugin-" + plugin->name;
         plugin_enabled_box.set_visible(
             !plugin->is_core_plugin() && plugin->type != PLUGIN_TYPE_WF_SHELL);
         plugin_enabled_check.set_active(plugin->enabled);
         plugin_name_label.set_markup(
-            "<span size=\"12000\"><b>" + plugin->disp_name + "</b></span>");
+            "<span size=\"12000\"><b>" +
+            std::string(dgettext(gettext_domain_name.c_str(), 
plugin->disp_name.c_str())) + "</b></span>");
         plugin_description_label.set_markup(
-            "<span size=\"10000\"><b>" + plugin->tooltip + "</b></span>");
+            "<span size=\"10000\"><b>" +
+            std::string(dgettext(gettext_domain_name.c_str(), 
plugin->tooltip.c_str())) + "</b></span>");
         plugin_page = std::make_unique<PluginPage>(plugin);
         main_stack.add(*plugin_page);
         plugin_page->show_all();
@@ -1858,5 +1870,10 @@
         }
     }
 
-    return ICONDIR "/" + name;
+    if (std::filesystem::exists(WAYFIRE_ICONDIR "/" + name))
+    {
+        return WAYFIRE_ICONDIR "/" + name;
+    }
+
+    return WCM_ICONDIR "/" + name;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wcm-0.10.0/src/wcm.hpp new/wcm-0.11.0/src/wcm.hpp
--- old/wcm-0.10.0/src/wcm.hpp  2025-08-27 17:26:23.000000000 +0200
+++ new/wcm-0.11.0/src/wcm.hpp  2026-07-28 07:20:28.000000000 +0200
@@ -31,11 +31,13 @@
 #include <gdk/gdkwayland.h>
 #include <gtkmm.h>
 #include <iostream>
+#include <libintl.h>
 #include <variant>
 #include <vector>
 #include <wayfire/config/file.hpp>
 #include <wayfire/config/xml.hpp>
 #include <keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h>
+#include <glibmm/i18n.h>
 
 #include "metadata.hpp"
 
@@ -76,18 +78,18 @@
         Gtk::SIZE_GROUP_BOTH);
     std::array<Gtk::Separator, NUM_CATEGORIES - 1> separators;
     std::array<Category, NUM_CATEGORIES> categories = {
-        Category{"General", "preferences-system"},
-        {"Accessibility", "preferences-desktop-accessibility"},
-        {"Desktop", "preferences-desktop"}, {"Shell", "user-desktop"},
-        {"Effects", "applications-graphics"},
-        {"Window Management", "applications-accessories"},
-        {"Utility", "applications-other"}, {"Other", "applications-other"}};
+        Category{_("General"), "preferences-system"},
+        {_("Accessibility"), "preferences-desktop-accessibility"},
+        {_("Desktop"), "preferences-desktop"}, {_("Shell"), "user-desktop"},
+        {_("Effects"), "applications-graphics"},
+        {_("Window Management"), "applications-accessories"},
+        {_("Utility"), "applications-other"}, {_("Other"), 
"applications-other"}};
 };
 
 class KeyEntry : public Gtk::Stack
 {
     Gtk::Box grab_layout  = Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 10);
-    Gtk::Label grab_label = Gtk::Label("(none)");
+    Gtk::Label grab_label = Gtk::Label(_("(none)"));
     Gtk::Button grab_button;
     Gtk::Button edit_button;
 
@@ -208,15 +210,15 @@
 {
     struct BindingWidget : public Gtk::Frame
     {
-        Gtk::Expander expander = Gtk::Expander("Command:");
+        Gtk::Expander expander = Gtk::Expander(_("Command:"));
         Gtk::Box vbox     = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 10);
         Gtk::Box type_box = Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 10);
         Gtk::Box binding_box = Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 10);
         Gtk::Box command_box = Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 10);
 
-        Gtk::Label type_label    = Gtk::Label("Type");
-        Gtk::Label binding_label = Gtk::Label("Binding");
-        Gtk::Label command_label = Gtk::Label("Command");
+        Gtk::Label type_label    = Gtk::Label(_("Type"));
+        Gtk::Label binding_label = Gtk::Label(_("Binding"));
+        Gtk::Label command_label = Gtk::Label(_("Command"));
 
         Gtk::ComboBoxText type_combo_box;
         std::unique_ptr<KeyEntry> key_entry;
@@ -247,7 +249,7 @@
 
     struct BindingWidget : public Gtk::Box
     {
-        Gtk::Label label = Gtk::Label("Workspace");
+        Gtk::Label label = Gtk::Label(_("Workspace"));
         Gtk::SpinButton workspace_spin_button = 
Gtk::SpinButton(Gtk::Adjustment::create(1, 1, 30));
         KeyEntry key_entry;
         Gtk::Button remove_button;
@@ -331,17 +333,17 @@
     Gtk::Box main_left_panel_layout = Gtk::Box(Gtk::ORIENTATION_VERTICAL);
     Gtk::Label filter_label;
     Gtk::SearchEntry search_entry;
-    PrettyButton close_button = PrettyButton("Close", "window-close");
+    PrettyButton close_button = PrettyButton(_("Close"), "window-close");
     PrettyButton output_config_button =
-        PrettyButton("Configure Outputs", "computer");
+        PrettyButton(_("Configure Outputs"), "computer");
 
     Gtk::Box plugin_left_panel_layout = Gtk::Box(Gtk::ORIENTATION_VERTICAL);
     Gtk::Label plugin_name_label;
     Gtk::Label plugin_description_label;
     Gtk::Box plugin_enabled_box = Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 10);
     Gtk::CheckButton plugin_enabled_check;
-    Gtk::Label plugin_enabled_label = Gtk::Label("Use This Plugin");
-    PrettyButton back_button = PrettyButton("Back", "go-previous");
+    Gtk::Label plugin_enabled_label = Gtk::Label(_("Use This Plugin"));
+    PrettyButton back_button = PrettyButton(_("Back"), "go-previous");
 
     cairo_surface_t *grab_window_surface = nullptr;
     zwp_keyboard_shortcuts_inhibitor_v1 *shortcuts_inhibitor     = nullptr;

++++++ wcm-0.10.0.tar.xz.sha256sum -> wcm-0.11.0.tar.xz.sha256sum ++++++
--- /work/SRC/openSUSE:Factory/wcm/wcm-0.10.0.tar.xz.sha256sum  2025-09-04 
18:01:41.856561037 +0200
+++ /work/SRC/openSUSE:Factory/.wcm.new.1258/wcm-0.11.0.tar.xz.sha256sum        
2026-08-18 16:38:47.271879267 +0200
@@ -1 +1 @@
-38b912dcaaf52f7585414b5b40a694b0706ed5570e17703bc3d07654646ba707 
*wcm-0.10.0.tar.xz
+ce827a2ee52a75980761f0ea7984ee6d6aa42899e24116a2ad851c3121233b4a 
*wcm-0.11.0.tar.xz

Reply via email to