diff --git a/README.md b/README.md
index 447c712..053f592 100644
--- a/README.md
+++ b/README.md
@@ -20,14 +20,16 @@ Queue lets you:
- Group tasks into custom, color-coded lists
- Mark tasks as completed or important, and reorder them by dragging
-- Add an optional description to any task
+- Write rich task descriptions with headings, text styles, colors and lists
+- See the date when each task was completed
- Filter by status and search within a group
It is also built to keep your data yours:
- Back up and restore everything as a single JSON file
- Fully translated into English, Spanish, French, German, Italian, Portuguese,
- Simplified Chinese, and Japanese, with light and dark styles
+ Simplified Chinese, Japanese, Polish, Russian, Korean, Norwegian, Swedish,
+ Hindi, and Greek, with light and dark styles
## Made for GNOME
diff --git a/data/icons/hicolor/128x128/apps/io.github.dprietob.queue.png b/data/icons/hicolor/128x128/apps/io.github.dprietob.queue.png
index 9bcec08..7882d6a 100644
Binary files a/data/icons/hicolor/128x128/apps/io.github.dprietob.queue.png and b/data/icons/hicolor/128x128/apps/io.github.dprietob.queue.png differ
diff --git a/data/icons/hicolor/256x256/apps/io.github.dprietob.queue.png b/data/icons/hicolor/256x256/apps/io.github.dprietob.queue.png
index 8ac4821..41504ac 100644
Binary files a/data/icons/hicolor/256x256/apps/io.github.dprietob.queue.png and b/data/icons/hicolor/256x256/apps/io.github.dprietob.queue.png differ
diff --git a/data/icons/hicolor/512x512/apps/io.github.dprietob.queue.png b/data/icons/hicolor/512x512/apps/io.github.dprietob.queue.png
index 16acb2c..cee0ef9 100644
Binary files a/data/icons/hicolor/512x512/apps/io.github.dprietob.queue.png and b/data/icons/hicolor/512x512/apps/io.github.dprietob.queue.png differ
diff --git a/data/icons/hicolor/64x64/apps/io.github.dprietob.queue.png b/data/icons/hicolor/64x64/apps/io.github.dprietob.queue.png
index 4eea1e6..a015807 100644
Binary files a/data/icons/hicolor/64x64/apps/io.github.dprietob.queue.png and b/data/icons/hicolor/64x64/apps/io.github.dprietob.queue.png differ
diff --git a/data/io.github.dprietob.queue.metainfo.xml.in b/data/io.github.dprietob.queue.metainfo.xml.in
index f84308f..568be80 100644
--- a/data/io.github.dprietob.queue.metainfo.xml.in
+++ b/data/io.github.dprietob.queue.metainfo.xml.in
@@ -22,11 +22,13 @@
Features:
-
Organize tasks into custom, color-coded groups
-
Mark tasks as completed or important
-
Add optional descriptions and reorder by dragging
-
Export and restore all your data as JSON
-
Light and dark styles, available in several languages
+
Organize tasks into custom, color-coded groups.
+
Mark tasks as completed or important.
+
Write rich task descriptions with headings, text styles, colors and lists.
+
See the date when each task was completed.
+
Reorder groups and tasks with drag and drop.
+
Export and restore all your data as JSON.
+
Light and dark styles, available in several languages.
@@ -57,6 +59,19 @@
+
+
+
This release brings rich text descriptions and several refinements:
+
+
Format task descriptions with headings, bold, italic, underline, strikethrough, text color and lists.
+
See the completion date of finished tasks.
+
Edit and delete tasks and groups from a per-item menu.
+
The task list now uses the full width of the window.
+
Task descriptions can now hold much longer text.
+
Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek translations.
+
+
+
Initial release.
diff --git a/data/resources.gresource.xml b/data/resources.gresource.xml
index 2c3e778..8a0c6b8 100644
--- a/data/resources.gresource.xml
+++ b/data/resources.gresource.xml
@@ -6,6 +6,7 @@
src/modules/Groups/ui/group-row.uisrc/modules/Tasks/ui/task-list-panel.uisrc/modules/Tasks/ui/task-row.ui
+ src/modules/Tasks/ui/description-editor.uidata/icons/hicolor/scalable/apps/io.github.dprietob.queue.svg
diff --git a/meson.build b/meson.build
index 82dc74f..fa9f7d8 100644
--- a/meson.build
+++ b/meson.build
@@ -1,7 +1,7 @@
project(
'queue',
['vala', 'c'],
- version: '1.0.0',
+ version: '1.1.0',
meson_version: '>= 0.62.0',
default_options: ['warning_level=2'],
)
@@ -32,6 +32,7 @@ queue_sources = files(
'src/database/Database.vala',
'src/database/migrations/001_create_groups_table.vala',
'src/database/migrations/002_create_tasks_table.vala',
+ 'src/database/migrations/003_add_completed_at_to_tasks.vala',
'src/modules/Groups/models/Group.vala',
'src/modules/Groups/validators/GroupStoreValidator.vala',
'src/modules/Groups/actions/ListGroupsAction.vala',
@@ -51,6 +52,8 @@ queue_sources = files(
'src/modules/Tasks/actions/DeleteTaskAction.vala',
'src/modules/Tasks/actions/ReorderTasksAction.vala',
'src/modules/Tasks/controllers/TaskListController.vala',
+ 'src/modules/Tasks/ui/TaskDescriptionMarkup.vala',
+ 'src/modules/Tasks/ui/DescriptionEditor.vala',
'src/modules/Tasks/ui/TaskRow.vala',
'src/modules/Tasks/ui/TaskListPanel.vala',
'src/modules/Backup/services/BackupSerializer.vala',
diff --git a/po/LINGUAS b/po/LINGUAS
index 2ee58f7..0313e54 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -1,7 +1,14 @@
de
+el
es
fr
+hi
it
ja
+ko
+nb
+pl
pt
+ru
+sv
zh_CN
diff --git a/po/POTFILES b/po/POTFILES
index a419d9b..258a657 100644
--- a/po/POTFILES
+++ b/po/POTFILES
@@ -7,5 +7,6 @@ src/modules/Tasks/ui/TaskListPanel.vala
src/modules/Tasks/ui/task-list-panel.ui
src/modules/Backup/services/BackupSerializer.vala
src/modules/Tasks/ui/task-row.ui
+src/modules/Tasks/ui/description-editor.ui
data/io.github.dprietob.queue.desktop.in
data/io.github.dprietob.queue.metainfo.xml.in
diff --git a/po/de.po b/po/de.po
index 45c1d6e..1342fd0 100644
--- a/po/de.po
+++ b/po/de.po
@@ -4,9 +4,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: queue 1.0.0\n"
+"Project-Id-Version: queue 1.1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-06-27 02:58+0200\n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
"PO-Revision-Date: 2026-06-27 00:00+0000\n"
"Last-Translator: Daniel Prieto\n"
"Language-Team: German\n"
@@ -16,257 +16,462 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
msgid "Restart Queue to apply the new language."
msgstr "Starten Sie Queue neu, um die neue Sprache anzuwenden."
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
msgid "New Group"
msgstr "Neue Gruppe"
+#: src/Window.vala:101
msgid "Edit Group"
msgstr "Gruppe bearbeiten"
+#: src/Window.vala:108
#, c-format
msgid "\"%s\" and all of its tasks will be permanently deleted."
msgstr "„%s“ und alle zugehörigen Aufgaben werden dauerhaft gelöscht."
+#: src/Window.vala:110
msgid "Delete Group?"
msgstr "Gruppe löschen?"
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
msgid "New Task"
msgstr "Neue Aufgabe"
+#: src/Window.vala:128
msgid "Edit Task"
msgstr "Aufgabe bearbeiten"
+#: src/Window.vala:136
#, c-format
msgid "\"%s\" will be permanently deleted."
msgstr "„%s“ wird dauerhaft gelöscht."
+#: src/Window.vala:137
msgid "Delete Task?"
msgstr "Aufgabe löschen?"
+#: src/Window.vala:168
msgid "Group name"
msgstr "Gruppenname"
+#: src/Window.vala:187
msgid "Color"
msgstr "Farbe"
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
msgid "Cancel"
msgstr "Abbrechen"
+#: src/Window.vala:193 src/Window.vala:266
msgid "Save"
msgstr "Speichern"
+#: src/Window.vala:245
msgid "Title"
msgstr "Titel"
-msgid "Description (optional)"
-msgstr "Beschreibung (optional)"
-
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
msgid "Important"
msgstr "Wichtig"
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
msgid "Delete"
msgstr "Löschen"
+#: src/Window.vala:320
msgid "Export Backup"
msgstr "Sicherung exportieren"
+#: src/Window.vala:332
msgid "Exporting Backup…"
msgstr "Sicherung wird exportiert…"
+#: src/Window.vala:339
msgid "Backup exported."
msgstr "Sicherung exportiert."
+#: src/Window.vala:347
msgid "Restore Backup"
msgstr "Sicherung wiederherstellen"
+#: src/Window.vala:364
msgid "Restore Backup?"
msgstr "Sicherung wiederherstellen?"
-msgid "All current groups and tasks will be permanently deleted and replaced with the contents of the backup file."
-msgstr "Alle aktuellen Gruppen und Aufgaben werden dauerhaft gelöscht und durch den Inhalt der Sicherungsdatei ersetzt."
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
+msgstr ""
+"Alle aktuellen Gruppen und Aufgaben werden dauerhaft gelöscht und durch den "
+"Inhalt der Sicherungsdatei ersetzt."
+#: src/Window.vala:368
msgid "Delete and Restore"
msgstr "Löschen und wiederherstellen"
+#: src/Window.vala:379
msgid "Restoring Backup…"
msgstr "Sicherung wird wiederhergestellt…"
+#: src/Window.vala:390
msgid "Backup restored."
msgstr "Sicherung wiederhergestellt."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
msgid "The group name cannot be empty."
msgstr "Der Gruppenname darf nicht leer sein."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
#, c-format
msgid "The group name must be at most %d characters."
msgstr "Der Gruppenname darf höchstens %d Zeichen lang sein."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
msgid "A group with this name already exists."
msgstr "Eine Gruppe mit diesem Namen existiert bereits."
+#: src/modules/Groups/ui/group-sidebar.ui:8
msgid "Theme"
msgstr "Erscheinungsbild"
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
msgid "Follow System"
msgstr "Systemeinstellung folgen"
+#: src/modules/Groups/ui/group-sidebar.ui:15
msgid "Light"
msgstr "Hell"
+#: src/modules/Groups/ui/group-sidebar.ui:20
msgid "Dark"
msgstr "Dunkel"
+#: src/modules/Groups/ui/group-sidebar.ui:26
msgid "Language"
msgstr "Sprache"
+#: src/modules/Groups/ui/group-sidebar.ui:109
msgid "Backup"
msgstr "Sicherung"
+#: src/modules/Groups/ui/group-sidebar.ui:111
msgid "Export Backup…"
msgstr "Sicherung exportieren…"
+#: src/modules/Groups/ui/group-sidebar.ui:115
msgid "Restore Backup…"
msgstr "Sicherung wiederherstellen…"
+#: src/modules/Groups/ui/group-sidebar.ui:122
msgid "About Queue"
msgstr "Info zu Queue"
+#: src/modules/Groups/ui/group-sidebar.ui:128
msgid "Groups"
msgstr "Gruppen"
+#: src/modules/Groups/ui/group-sidebar.ui:137
msgid "Main Menu"
msgstr "Hauptmenü"
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
msgid "Drag to reorder"
msgstr "Zum Umsortieren ziehen"
-msgid "Rename Group"
-msgstr "Gruppe umbenennen"
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "Gruppenoptionen"
-msgid "Delete Group"
-msgstr "Gruppe löschen"
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "Bearbeiten"
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
msgid "The task title cannot be empty."
msgstr "Der Aufgabentitel darf nicht leer sein."
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
#, c-format
msgid "The task title must be at most %d characters."
msgstr "Der Aufgabentitel darf höchstens %d Zeichen lang sein."
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
#, c-format
msgid "The description must be at most %d characters."
msgstr "Die Beschreibung darf höchstens %d Zeichen lang sein."
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
msgid "Tasks"
msgstr "Aufgaben"
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
#, c-format
msgid "Total: %u"
msgstr "Gesamt: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
#, c-format
msgid "Pending: %u"
msgstr "Ausstehend: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
#, c-format
msgid "Completed: %u"
msgstr "Erledigt: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
#, c-format
msgid "Important: %u"
msgstr "Wichtig: %u"
+#: src/modules/Tasks/ui/task-list-panel.ui:14
msgid "Search Tasks"
msgstr "Aufgaben suchen"
+#: src/modules/Tasks/ui/task-list-panel.ui:20
msgid "Filter by status"
msgstr "Nach Status filtern"
+#: src/modules/Tasks/ui/task-list-panel.ui:25
msgid "All"
msgstr "Alle"
+#: src/modules/Tasks/ui/task-list-panel.ui:26
msgid "Pending"
msgstr "Ausstehend"
+#: src/modules/Tasks/ui/task-list-panel.ui:27
msgid "Completed"
msgstr "Erledigt"
+#: src/modules/Tasks/ui/task-list-panel.ui:50
msgid "Filter tasks by name…"
msgstr "Aufgaben nach Namen filtern…"
+#: src/modules/Tasks/ui/task-list-panel.ui:64
msgid "No Group Selected"
msgstr "Keine Gruppe ausgewählt"
+#: src/modules/Tasks/ui/task-list-panel.ui:65
msgid "Select a group to see its tasks."
msgstr "Wählen Sie eine Gruppe aus, um ihre Aufgaben zu sehen."
+#: src/modules/Tasks/ui/task-list-panel.ui:76
msgid "No Tasks Yet"
msgstr "Noch keine Aufgaben"
+#: src/modules/Tasks/ui/task-list-panel.ui:77
msgid "Add your first task to this group."
msgstr "Fügen Sie dieser Gruppe Ihre erste Aufgabe hinzu."
+#: src/modules/Backup/services/BackupSerializer.vala:57
msgid "The backup file is not valid."
msgstr "Die Sicherungsdatei ist ungültig."
+#: src/modules/Tasks/ui/task-row.ui:28
msgid "Toggle Completed"
msgstr "Erledigt umschalten"
+#: src/modules/Tasks/ui/task-row.ui:44
msgid "Show Description"
msgstr "Beschreibung anzeigen"
-msgid "Delete Task"
-msgstr "Aufgabe löschen"
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "Aufgabenoptionen"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "Überschrift"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "Überschrift 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "Überschrift 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "Überschrift 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "Normaler Text"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "Fett"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "Kursiv"
+
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "Unterstrichen"
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "Durchgestrichen"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "Textfarbe"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "Aufzählungsliste"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "Nummerierte Liste"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
msgid "Queue"
msgstr "Queue"
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
msgid "Task manager"
msgstr "Aufgabenverwaltung"
+#: data/io.github.dprietob.queue.desktop.in:4
msgid "Manage and organize tasks"
msgstr "Aufgaben verwalten und organisieren"
+#: data/io.github.dprietob.queue.desktop.in:10
msgid "task;manager;organize;"
msgstr "Aufgabe;Aufgaben;Verwaltung;organisieren;"
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
msgid "Queue is a simple, fast task manager."
msgstr "Queue ist eine einfache, schnelle Aufgabenverwaltung."
-msgid "Organize your tasks into groups, mark them as done or important, reorder them with drag and drop, and keep your data safe with built-in backups."
-msgstr "Organisieren Sie Ihre Aufgaben in Gruppen, markieren Sie sie als erledigt oder wichtig, ordnen Sie sie per Ziehen und Ablegen neu an und sichern Sie Ihre Daten mit den integrierten Sicherungen."
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr ""
+"Organisieren Sie Ihre Aufgaben in Gruppen, markieren Sie sie als erledigt "
+"oder wichtig, ordnen Sie sie per Ziehen und Ablegen neu an und sichern Sie "
+"Ihre Daten mit den integrierten Sicherungen."
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
msgid "Features:"
msgstr "Funktionen:"
-msgid "Organize tasks into custom, color-coded groups"
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
msgstr "Aufgaben in benutzerdefinierten, farbigen Gruppen organisieren"
-msgid "Mark tasks as completed or important"
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
msgstr "Aufgaben als erledigt oder wichtig markieren"
-msgid "Add optional descriptions and reorder by dragging"
-msgstr "Optionale Beschreibungen hinzufügen und per Ziehen neu anordnen"
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr ""
+"Aufgabenbeschreibungen mit Überschriften, Textstilen, Farben und Listen "
+"formatieren."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "Sehen Sie, wann jede Aufgabe abgeschlossen wurde."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "Gruppen und Aufgaben per Ziehen und Ablegen neu anordnen."
-msgid "Export and restore all your data as JSON"
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
msgstr "Alle Daten als JSON exportieren und wiederherstellen"
-msgid "Light and dark styles, available in several languages"
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
msgstr "Helles und dunkles Erscheinungsbild, in mehreren Sprachen verfügbar"
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
msgid "Tasks organized by group"
msgstr "Nach Gruppe geordnete Aufgaben"
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
msgid "Dark style"
msgstr "Dunkles Erscheinungsbild"
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
msgid "Create and edit tasks with details"
msgstr "Aufgaben mit Details erstellen und bearbeiten"
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr ""
+"Diese Version bringt formatierte Beschreibungen und mehrere Verbesserungen:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr ""
+"Aufgabenbeschreibungen mit Überschriften, Fett, Kursiv, Unterstrichen, "
+"Durchgestrichen, Textfarbe und Listen formatieren."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "Das Abschlussdatum erledigter Aufgaben anzeigen."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "Aufgaben und Gruppen über ein Menü pro Element bearbeiten und löschen."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "Die Aufgabenliste nutzt jetzt die volle Fensterbreite."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr "Aufgabenbeschreibungen können jetzt deutlich längeren Text enthalten."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "Übersetzungen für Polnisch, Russisch, Koreanisch, Norwegisch, Schwedisch, Hindi und Griechisch hinzugefügt."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
msgid "Initial release."
msgstr "Erste Veröffentlichung."
-msgid "Daniel Prieto"
-msgstr "Daniel Prieto"
+#~ msgid "Description (optional)"
+#~ msgstr "Beschreibung (optional)"
+
+#~ msgid "Rename Group"
+#~ msgstr "Gruppe umbenennen"
+
+#~ msgid "Delete Group"
+#~ msgstr "Gruppe löschen"
+
+#~ msgid "Delete Task"
+#~ msgstr "Aufgabe löschen"
+
+#~ msgid "Add optional descriptions and reorder by dragging"
+#~ msgstr "Optionale Beschreibungen hinzufügen und per Ziehen neu anordnen"
diff --git a/po/el.po b/po/el.po
new file mode 100644
index 0000000..4472fd4
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,453 @@
+# Greek translations for queue package.
+# Copyright (C) 2026 THE queue'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the queue package.
+# Automatically generated, 2026.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: queue\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
+"PO-Revision-Date: 2026-06-29 19:34+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: el\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"
+
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
+msgid "Restart Queue to apply the new language."
+msgstr "Επανεκκινήστε το Queue για να εφαρμοστεί η νέα γλώσσα."
+
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
+msgid "New Group"
+msgstr "Νέα ομάδα"
+
+#: src/Window.vala:101
+msgid "Edit Group"
+msgstr "Επεξεργασία ομάδας"
+
+#: src/Window.vala:108
+#, c-format
+msgid "\"%s\" and all of its tasks will be permanently deleted."
+msgstr "Η ομάδα \"%s\" και όλες οι εργασίες της θα διαγραφούν οριστικά."
+
+#: src/Window.vala:110
+msgid "Delete Group?"
+msgstr "Διαγραφή ομάδας;"
+
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
+msgid "New Task"
+msgstr "Νέα εργασία"
+
+#: src/Window.vala:128
+msgid "Edit Task"
+msgstr "Επεξεργασία εργασίας"
+
+#: src/Window.vala:136
+#, c-format
+msgid "\"%s\" will be permanently deleted."
+msgstr "Η εργασία \"%s\" θα διαγραφεί οριστικά."
+
+#: src/Window.vala:137
+msgid "Delete Task?"
+msgstr "Διαγραφή εργασίας;"
+
+#: src/Window.vala:168
+msgid "Group name"
+msgstr "Όνομα ομάδας"
+
+#: src/Window.vala:187
+msgid "Color"
+msgstr "Χρώμα"
+
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
+msgid "Cancel"
+msgstr "Άκυρο"
+
+#: src/Window.vala:193 src/Window.vala:266
+msgid "Save"
+msgstr "Αποθήκευση"
+
+#: src/Window.vala:245
+msgid "Title"
+msgstr "Τίτλος"
+
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
+msgid "Important"
+msgstr "Σημαντικό"
+
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
+msgid "Delete"
+msgstr "Διαγραφή"
+
+#: src/Window.vala:320
+msgid "Export Backup"
+msgstr "Εξαγωγή αντιγράφου ασφαλείας"
+
+#: src/Window.vala:332
+msgid "Exporting Backup…"
+msgstr "Εξαγωγή αντιγράφου ασφαλείας…"
+
+#: src/Window.vala:339
+msgid "Backup exported."
+msgstr "Το αντίγραφο ασφαλείας εξήχθη."
+
+#: src/Window.vala:347
+msgid "Restore Backup"
+msgstr "Επαναφορά αντιγράφου ασφαλείας"
+
+#: src/Window.vala:364
+msgid "Restore Backup?"
+msgstr "Επαναφορά αντιγράφου ασφαλείας;"
+
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
+msgstr "Όλες οι τρέχουσες ομάδες και εργασίες θα διαγραφούν οριστικά και θα αντικατασταθούν με το περιεχόμενο του αρχείου αντιγράφου ασφαλείας."
+
+#: src/Window.vala:368
+msgid "Delete and Restore"
+msgstr "Διαγραφή και επαναφορά"
+
+#: src/Window.vala:379
+msgid "Restoring Backup…"
+msgstr "Επαναφορά αντιγράφου ασφαλείας…"
+
+#: src/Window.vala:390
+msgid "Backup restored."
+msgstr "Το αντίγραφο ασφαλείας επαναφέρθηκε."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
+msgid "The group name cannot be empty."
+msgstr "Το όνομα της ομάδας δεν μπορεί να είναι κενό."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
+#, c-format
+msgid "The group name must be at most %d characters."
+msgstr "Το όνομα της ομάδας πρέπει να έχει το πολύ %d χαρακτήρες."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
+msgid "A group with this name already exists."
+msgstr "Υπάρχει ήδη ομάδα με αυτό το όνομα."
+
+#: src/modules/Groups/ui/group-sidebar.ui:8
+msgid "Theme"
+msgstr "Θέμα"
+
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
+msgid "Follow System"
+msgstr "Ακολούθηση συστήματος"
+
+#: src/modules/Groups/ui/group-sidebar.ui:15
+msgid "Light"
+msgstr "Φωτεινό"
+
+#: src/modules/Groups/ui/group-sidebar.ui:20
+msgid "Dark"
+msgstr "Σκούρο"
+
+#: src/modules/Groups/ui/group-sidebar.ui:26
+msgid "Language"
+msgstr "Γλώσσα"
+
+#: src/modules/Groups/ui/group-sidebar.ui:109
+msgid "Backup"
+msgstr "Αντίγραφο ασφαλείας"
+
+#: src/modules/Groups/ui/group-sidebar.ui:111
+msgid "Export Backup…"
+msgstr "Εξαγωγή αντιγράφου ασφαλείας…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:115
+msgid "Restore Backup…"
+msgstr "Επαναφορά αντιγράφου ασφαλείας…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:122
+msgid "About Queue"
+msgstr "Σχετικά με το Queue"
+
+#: src/modules/Groups/ui/group-sidebar.ui:128
+msgid "Groups"
+msgstr "Ομάδες"
+
+#: src/modules/Groups/ui/group-sidebar.ui:137
+msgid "Main Menu"
+msgstr "Κύριο μενού"
+
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
+msgid "Drag to reorder"
+msgstr "Σύρετε για αναδιάταξη"
+
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "Επιλογές ομάδας"
+
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "Επεξεργασία"
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
+msgid "The task title cannot be empty."
+msgstr "Ο τίτλος της εργασίας δεν μπορεί να είναι κενός."
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
+#, c-format
+msgid "The task title must be at most %d characters."
+msgstr "Ο τίτλος της εργασίας πρέπει να έχει το πολύ %d χαρακτήρες."
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
+#, c-format
+msgid "The description must be at most %d characters."
+msgstr "Η περιγραφή πρέπει να έχει το πολύ %d χαρακτήρες."
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
+msgid "Tasks"
+msgstr "Εργασίες"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
+#, c-format
+msgid "Total: %u"
+msgstr "Σύνολο: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
+#, c-format
+msgid "Pending: %u"
+msgstr "Σε εκκρεμότητα: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
+#, c-format
+msgid "Completed: %u"
+msgstr "Ολοκληρωμένες: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
+#, c-format
+msgid "Important: %u"
+msgstr "Σημαντικές: %u"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:14
+msgid "Search Tasks"
+msgstr "Αναζήτηση εργασιών"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:20
+msgid "Filter by status"
+msgstr "Φιλτράρισμα κατά κατάσταση"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:25
+msgid "All"
+msgstr "Όλες"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:26
+msgid "Pending"
+msgstr "Σε εκκρεμότητα"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:27
+msgid "Completed"
+msgstr "Ολοκληρωμένες"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:50
+msgid "Filter tasks by name…"
+msgstr "Φιλτράρισμα εργασιών κατά όνομα…"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:64
+msgid "No Group Selected"
+msgstr "Δεν επιλέχθηκε ομάδα"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:65
+msgid "Select a group to see its tasks."
+msgstr "Επιλέξτε μια ομάδα για να δείτε τις εργασίες της."
+
+#: src/modules/Tasks/ui/task-list-panel.ui:76
+msgid "No Tasks Yet"
+msgstr "Δεν υπάρχουν εργασίες ακόμη"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:77
+msgid "Add your first task to this group."
+msgstr "Προσθέστε την πρώτη σας εργασία σε αυτή την ομάδα."
+
+#: src/modules/Backup/services/BackupSerializer.vala:57
+msgid "The backup file is not valid."
+msgstr "Το αρχείο αντιγράφου ασφαλείας δεν είναι έγκυρο."
+
+#: src/modules/Tasks/ui/task-row.ui:28
+msgid "Toggle Completed"
+msgstr "Εναλλαγή ολοκλήρωσης"
+
+#: src/modules/Tasks/ui/task-row.ui:44
+msgid "Show Description"
+msgstr "Εμφάνιση περιγραφής"
+
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "Επιλογές εργασίας"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "Επικεφαλίδα"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "Επικεφαλίδα 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "Επικεφαλίδα 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "Επικεφαλίδα 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "Κανονικό κείμενο"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "Έντονα"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "Πλάγια"
+
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "Υπογράμμιση"
+
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "Διακριτή διαγραφή"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "Χρώμα κειμένου"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "Λίστα με κουκκίδες"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "Αριθμημένη λίστα"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
+msgid "Queue"
+msgstr "Queue"
+
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
+msgid "Task manager"
+msgstr "Διαχείριση εργασιών"
+
+#: data/io.github.dprietob.queue.desktop.in:4
+msgid "Manage and organize tasks"
+msgstr "Διαχειριστείτε και οργανώστε εργασίες"
+
+#: data/io.github.dprietob.queue.desktop.in:10
+msgid "task;manager;organize;"
+msgstr "εργασία;διαχείριση;οργάνωση;task;manager;"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
+msgid "Queue is a simple, fast task manager."
+msgstr "Το Queue είναι ένας απλός και γρήγορος διαχειριστής εργασιών."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr "Οργανώστε τις εργασίες σας σε ομάδες, σημειώστε τις ως ολοκληρωμένες ή σημαντικές, αλλάξτε τη σειρά τους με μεταφορά και απόθεση και διατηρήστε τα δεδομένα σας ασφαλή με τα ενσωματωμένα αντίγραφα ασφαλείας."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
+msgid "Features:"
+msgstr "Χαρακτηριστικά:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
+msgstr "Οργανώστε εργασίες σε προσαρμοσμένες, χρωματικά κωδικοποιημένες ομάδες."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
+msgstr "Σημειώστε εργασίες ως ολοκληρωμένες ή σημαντικές."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr "Γράψτε εμπλουτισμένες περιγραφές εργασιών με επικεφαλίδες, στυλ κειμένου, χρώματα και λίστες."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "Δείτε την ημερομηνία ολοκλήρωσης κάθε εργασίας."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "Αλλάξτε τη σειρά ομάδων και εργασιών με μεταφορά και απόθεση."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
+msgstr "Εξάγετε και επαναφέρετε όλα τα δεδομένα σας σε μορφή JSON."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
+msgstr "Φωτεινό και σκούρο στυλ, διαθέσιμο σε πολλές γλώσσες."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
+msgid "Tasks organized by group"
+msgstr "Εργασίες οργανωμένες ανά ομάδα"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
+msgid "Dark style"
+msgstr "Σκούρο στυλ"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
+msgid "Create and edit tasks with details"
+msgstr "Δημιουργία και επεξεργασία εργασιών με λεπτομέρειες"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr "Αυτή η έκδοση προσθέτει εμπλουτισμένες περιγραφές και αρκετές βελτιώσεις:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr "Μορφοποιήστε τις περιγραφές εργασιών με επικεφαλίδες, έντονα, πλάγια, υπογράμμιση, διακριτή διαγραφή, χρώμα κειμένου και λίστες."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "Δείτε την ημερομηνία ολοκλήρωσης των τελειωμένων εργασιών."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "Επεξεργαστείτε και διαγράψτε εργασίες και ομάδες από μενού ανά στοιχείο."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "Η λίστα εργασιών χρησιμοποιεί τώρα όλο το πλάτος του παραθύρου."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr "Οι περιγραφές εργασιών μπορούν τώρα να περιέχουν πολύ μεγαλύτερο κείμενο."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "Προστέθηκαν μεταφράσεις στα πολωνικά, ρωσικά, κορεατικά, νορβηγικά, σουηδικά, χίντι και ελληνικά."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
+msgid "Initial release."
+msgstr "Αρχική έκδοση."
diff --git a/po/es.po b/po/es.po
index 4787520..32d8b20 100644
--- a/po/es.po
+++ b/po/es.po
@@ -4,9 +4,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: queue 1.0.0\n"
+"Project-Id-Version: queue 1.1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-06-27 02:58+0200\n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
"PO-Revision-Date: 2026-06-27 00:00+0000\n"
"Last-Translator: Daniel Prieto\n"
"Language-Team: Spanish\n"
@@ -16,257 +16,462 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
msgid "Restart Queue to apply the new language."
msgstr "Reinicia Queue para aplicar el nuevo idioma."
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
msgid "New Group"
msgstr "Nuevo grupo"
+#: src/Window.vala:101
msgid "Edit Group"
msgstr "Editar grupo"
+#: src/Window.vala:108
#, c-format
msgid "\"%s\" and all of its tasks will be permanently deleted."
msgstr "«%s» y todas sus tareas se eliminarán de forma permanente."
+#: src/Window.vala:110
msgid "Delete Group?"
msgstr "¿Eliminar grupo?"
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
msgid "New Task"
msgstr "Nueva tarea"
+#: src/Window.vala:128
msgid "Edit Task"
msgstr "Editar tarea"
+#: src/Window.vala:136
#, c-format
msgid "\"%s\" will be permanently deleted."
msgstr "«%s» se eliminará de forma permanente."
+#: src/Window.vala:137
msgid "Delete Task?"
msgstr "¿Eliminar tarea?"
+#: src/Window.vala:168
msgid "Group name"
msgstr "Nombre del grupo"
+#: src/Window.vala:187
msgid "Color"
msgstr "Color"
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
msgid "Cancel"
msgstr "Cancelar"
+#: src/Window.vala:193 src/Window.vala:266
msgid "Save"
msgstr "Guardar"
+#: src/Window.vala:245
msgid "Title"
msgstr "Título"
-msgid "Description (optional)"
-msgstr "Descripción (opcional)"
-
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
msgid "Important"
msgstr "Importante"
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
msgid "Delete"
msgstr "Eliminar"
+#: src/Window.vala:320
msgid "Export Backup"
msgstr "Exportar copia de seguridad"
+#: src/Window.vala:332
msgid "Exporting Backup…"
msgstr "Exportando copia de seguridad…"
+#: src/Window.vala:339
msgid "Backup exported."
msgstr "Copia de seguridad exportada."
+#: src/Window.vala:347
msgid "Restore Backup"
msgstr "Restaurar copia de seguridad"
+#: src/Window.vala:364
msgid "Restore Backup?"
msgstr "¿Restaurar copia de seguridad?"
-msgid "All current groups and tasks will be permanently deleted and replaced with the contents of the backup file."
-msgstr "Todos los grupos y tareas actuales se eliminarán de forma permanente y se reemplazarán por el contenido del archivo de copia de seguridad."
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
+msgstr ""
+"Todos los grupos y tareas actuales se eliminarán de forma permanente y se "
+"reemplazarán por el contenido del archivo de copia de seguridad."
+#: src/Window.vala:368
msgid "Delete and Restore"
msgstr "Eliminar y restaurar"
+#: src/Window.vala:379
msgid "Restoring Backup…"
msgstr "Restaurando copia de seguridad…"
+#: src/Window.vala:390
msgid "Backup restored."
msgstr "Copia de seguridad restaurada."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
msgid "The group name cannot be empty."
msgstr "El nombre del grupo no puede estar vacío."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
#, c-format
msgid "The group name must be at most %d characters."
msgstr "El nombre del grupo debe tener como máximo %d caracteres."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
msgid "A group with this name already exists."
msgstr "Ya existe un grupo con este nombre."
+#: src/modules/Groups/ui/group-sidebar.ui:8
msgid "Theme"
msgstr "Tema"
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
msgid "Follow System"
msgstr "Seguir al sistema"
+#: src/modules/Groups/ui/group-sidebar.ui:15
msgid "Light"
msgstr "Claro"
+#: src/modules/Groups/ui/group-sidebar.ui:20
msgid "Dark"
msgstr "Oscuro"
+#: src/modules/Groups/ui/group-sidebar.ui:26
msgid "Language"
msgstr "Idioma"
+#: src/modules/Groups/ui/group-sidebar.ui:109
msgid "Backup"
msgstr "Copia de seguridad"
+#: src/modules/Groups/ui/group-sidebar.ui:111
msgid "Export Backup…"
msgstr "Exportar copia de seguridad…"
+#: src/modules/Groups/ui/group-sidebar.ui:115
msgid "Restore Backup…"
msgstr "Restaurar copia de seguridad…"
+#: src/modules/Groups/ui/group-sidebar.ui:122
msgid "About Queue"
msgstr "Acerca de Queue"
+#: src/modules/Groups/ui/group-sidebar.ui:128
msgid "Groups"
msgstr "Grupos"
+#: src/modules/Groups/ui/group-sidebar.ui:137
msgid "Main Menu"
msgstr "Menú principal"
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
msgid "Drag to reorder"
msgstr "Arrastra para reordenar"
-msgid "Rename Group"
-msgstr "Renombrar grupo"
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "Opciones del grupo"
-msgid "Delete Group"
-msgstr "Eliminar grupo"
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "Editar"
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
msgid "The task title cannot be empty."
msgstr "El título de la tarea no puede estar vacío."
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
#, c-format
msgid "The task title must be at most %d characters."
msgstr "El título de la tarea debe tener como máximo %d caracteres."
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
#, c-format
msgid "The description must be at most %d characters."
msgstr "La descripción debe tener como máximo %d caracteres."
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
msgid "Tasks"
msgstr "Tareas"
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
#, c-format
msgid "Total: %u"
msgstr "Total: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
#, c-format
msgid "Pending: %u"
msgstr "Pendientes: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
#, c-format
msgid "Completed: %u"
msgstr "Completadas: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
#, c-format
msgid "Important: %u"
msgstr "Importantes: %u"
+#: src/modules/Tasks/ui/task-list-panel.ui:14
msgid "Search Tasks"
msgstr "Buscar tareas"
+#: src/modules/Tasks/ui/task-list-panel.ui:20
msgid "Filter by status"
msgstr "Filtrar por estado"
+#: src/modules/Tasks/ui/task-list-panel.ui:25
msgid "All"
msgstr "Todas"
+#: src/modules/Tasks/ui/task-list-panel.ui:26
msgid "Pending"
msgstr "Pendientes"
+#: src/modules/Tasks/ui/task-list-panel.ui:27
msgid "Completed"
msgstr "Completadas"
+#: src/modules/Tasks/ui/task-list-panel.ui:50
msgid "Filter tasks by name…"
msgstr "Filtrar tareas por nombre…"
+#: src/modules/Tasks/ui/task-list-panel.ui:64
msgid "No Group Selected"
msgstr "Ningún grupo seleccionado"
+#: src/modules/Tasks/ui/task-list-panel.ui:65
msgid "Select a group to see its tasks."
msgstr "Selecciona un grupo para ver sus tareas."
+#: src/modules/Tasks/ui/task-list-panel.ui:76
msgid "No Tasks Yet"
msgstr "Aún no hay tareas"
+#: src/modules/Tasks/ui/task-list-panel.ui:77
msgid "Add your first task to this group."
msgstr "Añade tu primera tarea a este grupo."
+#: src/modules/Backup/services/BackupSerializer.vala:57
msgid "The backup file is not valid."
msgstr "El archivo de copia de seguridad no es válido."
+#: src/modules/Tasks/ui/task-row.ui:28
msgid "Toggle Completed"
msgstr "Alternar completada"
+#: src/modules/Tasks/ui/task-row.ui:44
msgid "Show Description"
msgstr "Mostrar descripción"
-msgid "Delete Task"
-msgstr "Eliminar tarea"
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "Opciones de la tarea"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "Encabezado"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "Encabezado 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "Encabezado 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "Encabezado 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "Texto normal"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "Negrita"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "Cursiva"
+
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "Subrayado"
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "Tachado"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "Color del texto"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "Lista con viñetas"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "Lista numerada"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
msgid "Queue"
msgstr "Queue"
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
msgid "Task manager"
msgstr "Gestor de tareas"
+#: data/io.github.dprietob.queue.desktop.in:4
msgid "Manage and organize tasks"
msgstr "Gestiona y organiza tareas"
+#: data/io.github.dprietob.queue.desktop.in:10
msgid "task;manager;organize;"
msgstr "tarea;tareas;gestor;organizar;"
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
msgid "Queue is a simple, fast task manager."
msgstr "Queue es un gestor de tareas sencillo y rápido."
-msgid "Organize your tasks into groups, mark them as done or important, reorder them with drag and drop, and keep your data safe with built-in backups."
-msgstr "Organiza tus tareas en grupos, márcalas como completadas o importantes, reordénalas arrastrando y mantén tus datos a salvo con copias de seguridad integradas."
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr ""
+"Organiza tus tareas en grupos, márcalas como completadas o importantes, "
+"reordénalas arrastrando y mantén tus datos a salvo con copias de seguridad "
+"integradas."
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
msgid "Features:"
msgstr "Características:"
-msgid "Organize tasks into custom, color-coded groups"
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
msgstr "Organiza las tareas en grupos personalizados con colores"
-msgid "Mark tasks as completed or important"
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
msgstr "Marca las tareas como completadas o importantes"
-msgid "Add optional descriptions and reorder by dragging"
-msgstr "Añade descripciones opcionales y reordena arrastrando"
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr ""
+"Escribe descripciones enriquecidas con encabezados, estilos de texto, "
+"colores y listas."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "Consulta la fecha en que se completó cada tarea."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "Reordena grupos y tareas arrastrando y soltando."
-msgid "Export and restore all your data as JSON"
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
msgstr "Exporta y restaura todos tus datos en JSON"
-msgid "Light and dark styles, available in several languages"
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
msgstr "Estilos claro y oscuro, disponible en varios idiomas"
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
msgid "Tasks organized by group"
msgstr "Tareas organizadas por grupo"
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
msgid "Dark style"
msgstr "Estilo oscuro"
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
msgid "Create and edit tasks with details"
msgstr "Crea y edita tareas con detalles"
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr ""
+"Esta versión incorpora descripciones con texto enriquecido y varias mejoras:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr ""
+"Da formato a las descripciones con encabezados, negrita, cursiva, subrayado, "
+"tachado, color de texto y listas."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "Consulta la fecha de finalización de las tareas completadas."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "Edita y elimina tareas y grupos desde un menú en cada elemento."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "La lista de tareas ahora ocupa todo el ancho de la ventana."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr "Las descripciones de tareas ahora admiten textos mucho más largos."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "Se han añadido las traducciones al polaco, ruso, coreano, noruego, sueco, hindi y griego."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
msgid "Initial release."
msgstr "Versión inicial."
-msgid "Daniel Prieto"
-msgstr "Daniel Prieto"
+#~ msgid "Description (optional)"
+#~ msgstr "Descripción (opcional)"
+
+#~ msgid "Rename Group"
+#~ msgstr "Renombrar grupo"
+
+#~ msgid "Delete Group"
+#~ msgstr "Eliminar grupo"
+
+#~ msgid "Delete Task"
+#~ msgstr "Eliminar tarea"
+
+#~ msgid "Add optional descriptions and reorder by dragging"
+#~ msgstr "Añade descripciones opcionales y reordena arrastrando"
diff --git a/po/fr.po b/po/fr.po
index bba6447..98ab203 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -4,9 +4,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: queue 1.0.0\n"
+"Project-Id-Version: queue 1.1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-06-27 02:58+0200\n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
"PO-Revision-Date: 2026-06-27 00:00+0000\n"
"Last-Translator: Daniel Prieto\n"
"Language-Team: French\n"
@@ -16,257 +16,466 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
msgid "Restart Queue to apply the new language."
msgstr "Redémarrez Queue pour appliquer la nouvelle langue."
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
msgid "New Group"
msgstr "Nouveau groupe"
+#: src/Window.vala:101
msgid "Edit Group"
msgstr "Modifier le groupe"
+#: src/Window.vala:108
#, c-format
msgid "\"%s\" and all of its tasks will be permanently deleted."
msgstr "« %s » et toutes ses tâches seront définitivement supprimés."
+#: src/Window.vala:110
msgid "Delete Group?"
msgstr "Supprimer le groupe ?"
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
msgid "New Task"
msgstr "Nouvelle tâche"
+#: src/Window.vala:128
msgid "Edit Task"
msgstr "Modifier la tâche"
+#: src/Window.vala:136
#, c-format
msgid "\"%s\" will be permanently deleted."
msgstr "« %s » sera définitivement supprimée."
+#: src/Window.vala:137
msgid "Delete Task?"
msgstr "Supprimer la tâche ?"
+#: src/Window.vala:168
msgid "Group name"
msgstr "Nom du groupe"
+#: src/Window.vala:187
msgid "Color"
msgstr "Couleur"
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
msgid "Cancel"
msgstr "Annuler"
+#: src/Window.vala:193 src/Window.vala:266
msgid "Save"
msgstr "Enregistrer"
+#: src/Window.vala:245
msgid "Title"
msgstr "Titre"
-msgid "Description (optional)"
-msgstr "Description (facultative)"
-
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
msgid "Important"
msgstr "Importante"
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
msgid "Delete"
msgstr "Supprimer"
+#: src/Window.vala:320
msgid "Export Backup"
msgstr "Exporter la sauvegarde"
+#: src/Window.vala:332
msgid "Exporting Backup…"
msgstr "Exportation de la sauvegarde…"
+#: src/Window.vala:339
msgid "Backup exported."
msgstr "Sauvegarde exportée."
+#: src/Window.vala:347
msgid "Restore Backup"
msgstr "Restaurer la sauvegarde"
+#: src/Window.vala:364
msgid "Restore Backup?"
msgstr "Restaurer la sauvegarde ?"
-msgid "All current groups and tasks will be permanently deleted and replaced with the contents of the backup file."
-msgstr "Tous les groupes et toutes les tâches actuels seront définitivement supprimés et remplacés par le contenu du fichier de sauvegarde."
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
+msgstr ""
+"Tous les groupes et toutes les tâches actuels seront définitivement "
+"supprimés et remplacés par le contenu du fichier de sauvegarde."
+#: src/Window.vala:368
msgid "Delete and Restore"
msgstr "Supprimer et restaurer"
+#: src/Window.vala:379
msgid "Restoring Backup…"
msgstr "Restauration de la sauvegarde…"
+#: src/Window.vala:390
msgid "Backup restored."
msgstr "Sauvegarde restaurée."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
msgid "The group name cannot be empty."
msgstr "Le nom du groupe ne peut pas être vide."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
#, c-format
msgid "The group name must be at most %d characters."
msgstr "Le nom du groupe doit comporter au maximum %d caractères."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
msgid "A group with this name already exists."
msgstr "Un groupe portant ce nom existe déjà."
+#: src/modules/Groups/ui/group-sidebar.ui:8
msgid "Theme"
msgstr "Thème"
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
msgid "Follow System"
msgstr "Suivre le système"
+#: src/modules/Groups/ui/group-sidebar.ui:15
msgid "Light"
msgstr "Clair"
+#: src/modules/Groups/ui/group-sidebar.ui:20
msgid "Dark"
msgstr "Sombre"
+#: src/modules/Groups/ui/group-sidebar.ui:26
msgid "Language"
msgstr "Langue"
+#: src/modules/Groups/ui/group-sidebar.ui:109
msgid "Backup"
msgstr "Sauvegarde"
+#: src/modules/Groups/ui/group-sidebar.ui:111
msgid "Export Backup…"
msgstr "Exporter la sauvegarde…"
+#: src/modules/Groups/ui/group-sidebar.ui:115
msgid "Restore Backup…"
msgstr "Restaurer la sauvegarde…"
+#: src/modules/Groups/ui/group-sidebar.ui:122
msgid "About Queue"
msgstr "À propos de Queue"
+#: src/modules/Groups/ui/group-sidebar.ui:128
msgid "Groups"
msgstr "Groupes"
+#: src/modules/Groups/ui/group-sidebar.ui:137
msgid "Main Menu"
msgstr "Menu principal"
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
msgid "Drag to reorder"
msgstr "Glisser pour réorganiser"
-msgid "Rename Group"
-msgstr "Renommer le groupe"
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "Options du groupe"
-msgid "Delete Group"
-msgstr "Supprimer le groupe"
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "Modifier"
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
msgid "The task title cannot be empty."
msgstr "Le titre de la tâche ne peut pas être vide."
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
#, c-format
msgid "The task title must be at most %d characters."
msgstr "Le titre de la tâche doit comporter au maximum %d caractères."
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
#, c-format
msgid "The description must be at most %d characters."
msgstr "La description doit comporter au maximum %d caractères."
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
msgid "Tasks"
msgstr "Tâches"
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
#, c-format
msgid "Total: %u"
msgstr "Total : %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
#, c-format
msgid "Pending: %u"
msgstr "En attente : %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
#, c-format
msgid "Completed: %u"
msgstr "Terminées : %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
#, c-format
msgid "Important: %u"
msgstr "Importantes : %u"
+#: src/modules/Tasks/ui/task-list-panel.ui:14
msgid "Search Tasks"
msgstr "Rechercher des tâches"
+#: src/modules/Tasks/ui/task-list-panel.ui:20
msgid "Filter by status"
msgstr "Filtrer par état"
+#: src/modules/Tasks/ui/task-list-panel.ui:25
msgid "All"
msgstr "Toutes"
+#: src/modules/Tasks/ui/task-list-panel.ui:26
msgid "Pending"
msgstr "En attente"
+#: src/modules/Tasks/ui/task-list-panel.ui:27
msgid "Completed"
msgstr "Terminées"
+#: src/modules/Tasks/ui/task-list-panel.ui:50
msgid "Filter tasks by name…"
msgstr "Filtrer les tâches par nom…"
+#: src/modules/Tasks/ui/task-list-panel.ui:64
msgid "No Group Selected"
msgstr "Aucun groupe sélectionné"
+#: src/modules/Tasks/ui/task-list-panel.ui:65
msgid "Select a group to see its tasks."
msgstr "Sélectionnez un groupe pour voir ses tâches."
+#: src/modules/Tasks/ui/task-list-panel.ui:76
msgid "No Tasks Yet"
msgstr "Aucune tâche pour le moment"
+#: src/modules/Tasks/ui/task-list-panel.ui:77
msgid "Add your first task to this group."
msgstr "Ajoutez votre première tâche à ce groupe."
+#: src/modules/Backup/services/BackupSerializer.vala:57
msgid "The backup file is not valid."
msgstr "Le fichier de sauvegarde n’est pas valide."
+#: src/modules/Tasks/ui/task-row.ui:28
msgid "Toggle Completed"
msgstr "Basculer l’état terminé"
+#: src/modules/Tasks/ui/task-row.ui:44
msgid "Show Description"
msgstr "Afficher la description"
-msgid "Delete Task"
-msgstr "Supprimer la tâche"
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "Options de la tâche"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "Titre"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "Titre 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "Titre 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "Titre 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "Texte normal"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "Gras"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "Italique"
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "Souligné"
+
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "Barré"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "Couleur du texte"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "Liste à puces"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "Liste numérotée"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
msgid "Queue"
msgstr "Queue"
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
msgid "Task manager"
msgstr "Gestionnaire de tâches"
+#: data/io.github.dprietob.queue.desktop.in:4
msgid "Manage and organize tasks"
msgstr "Gérer et organiser des tâches"
+#: data/io.github.dprietob.queue.desktop.in:10
msgid "task;manager;organize;"
msgstr "tâche;tâches;gestionnaire;organiser;"
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
msgid "Queue is a simple, fast task manager."
msgstr "Queue est un gestionnaire de tâches simple et rapide."
-msgid "Organize your tasks into groups, mark them as done or important, reorder them with drag and drop, and keep your data safe with built-in backups."
-msgstr "Organisez vos tâches en groupes, marquez-les comme terminées ou importantes, réorganisez-les par glisser-déposer et protégez vos données grâce aux sauvegardes intégrées."
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr ""
+"Organisez vos tâches en groupes, marquez-les comme terminées ou importantes, "
+"réorganisez-les par glisser-déposer et protégez vos données grâce aux "
+"sauvegardes intégrées."
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
msgid "Features:"
msgstr "Fonctionnalités :"
-msgid "Organize tasks into custom, color-coded groups"
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
msgstr "Organisez les tâches en groupes personnalisés et colorés"
-msgid "Mark tasks as completed or important"
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
msgstr "Marquez les tâches comme terminées ou importantes"
-msgid "Add optional descriptions and reorder by dragging"
-msgstr "Ajoutez des descriptions facultatives et réorganisez par glisser-déposer"
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr ""
+"Rédigez des descriptions enrichies avec titres, styles de texte, couleurs et "
+"listes."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "Consultez la date à laquelle chaque tâche a été terminée."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "Réorganisez groupes et tâches par glisser-déposer."
-msgid "Export and restore all your data as JSON"
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
msgstr "Exportez et restaurez toutes vos données au format JSON"
-msgid "Light and dark styles, available in several languages"
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
msgstr "Styles clair et sombre, disponible en plusieurs langues"
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
msgid "Tasks organized by group"
msgstr "Tâches organisées par groupe"
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
msgid "Dark style"
msgstr "Style sombre"
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
msgid "Create and edit tasks with details"
msgstr "Créer et modifier des tâches avec des détails"
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr ""
+"Cette version apporte des descriptions en texte enrichi et plusieurs "
+"améliorations :"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr ""
+"Mettez en forme les descriptions avec titres, gras, italique, souligné, "
+"barré, couleur du texte et listes."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "Consultez la date d’achèvement des tâches terminées."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "Modifiez et supprimez tâches et groupes depuis un menu par élément."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "La liste des tâches occupe désormais toute la largeur de la fenêtre."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr ""
+"Les descriptions de tâches peuvent désormais contenir des textes bien plus "
+"longs."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "Ajout des traductions en polonais, russe, coréen, norvégien, suédois, hindi et grec."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
msgid "Initial release."
msgstr "Version initiale."
-msgid "Daniel Prieto"
-msgstr "Daniel Prieto"
+#~ msgid "Description (optional)"
+#~ msgstr "Description (facultative)"
+
+#~ msgid "Rename Group"
+#~ msgstr "Renommer le groupe"
+
+#~ msgid "Delete Group"
+#~ msgstr "Supprimer le groupe"
+
+#~ msgid "Delete Task"
+#~ msgstr "Supprimer la tâche"
+
+#~ msgid "Add optional descriptions and reorder by dragging"
+#~ msgstr ""
+#~ "Ajoutez des descriptions facultatives et réorganisez par glisser-déposer"
diff --git a/po/hi.po b/po/hi.po
new file mode 100644
index 0000000..867484e
--- /dev/null
+++ b/po/hi.po
@@ -0,0 +1,452 @@
+# Hindi translations for queue package.
+# Copyright (C) 2026 THE queue'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the queue package.
+# Automatically generated, 2026.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: queue\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
+"PO-Revision-Date: 2026-06-29 19:34+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: hi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
+msgid "Restart Queue to apply the new language."
+msgstr "नई भाषा लागू करने के लिए Queue पुनः आरंभ करें।"
+
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
+msgid "New Group"
+msgstr "नया समूह"
+
+#: src/Window.vala:101
+msgid "Edit Group"
+msgstr "समूह संपादित करें"
+
+#: src/Window.vala:108
+#, c-format
+msgid "\"%s\" and all of its tasks will be permanently deleted."
+msgstr "\"%s\" और इसके सभी कार्य स्थायी रूप से हटा दिए जाएँगे।"
+
+#: src/Window.vala:110
+msgid "Delete Group?"
+msgstr "समूह हटाएँ?"
+
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
+msgid "New Task"
+msgstr "नया कार्य"
+
+#: src/Window.vala:128
+msgid "Edit Task"
+msgstr "कार्य संपादित करें"
+
+#: src/Window.vala:136
+#, c-format
+msgid "\"%s\" will be permanently deleted."
+msgstr "\"%s\" स्थायी रूप से हटा दिया जाएगा।"
+
+#: src/Window.vala:137
+msgid "Delete Task?"
+msgstr "कार्य हटाएँ?"
+
+#: src/Window.vala:168
+msgid "Group name"
+msgstr "समूह का नाम"
+
+#: src/Window.vala:187
+msgid "Color"
+msgstr "रंग"
+
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
+msgid "Cancel"
+msgstr "रद्द करें"
+
+#: src/Window.vala:193 src/Window.vala:266
+msgid "Save"
+msgstr "सहेजें"
+
+#: src/Window.vala:245
+msgid "Title"
+msgstr "शीर्षक"
+
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
+msgid "Important"
+msgstr "महत्वपूर्ण"
+
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
+msgid "Delete"
+msgstr "हटाएँ"
+
+#: src/Window.vala:320
+msgid "Export Backup"
+msgstr "बैकअप निर्यात करें"
+
+#: src/Window.vala:332
+msgid "Exporting Backup…"
+msgstr "बैकअप निर्यात हो रहा है…"
+
+#: src/Window.vala:339
+msgid "Backup exported."
+msgstr "बैकअप निर्यात किया गया।"
+
+#: src/Window.vala:347
+msgid "Restore Backup"
+msgstr "बैकअप पुनर्स्थापित करें"
+
+#: src/Window.vala:364
+msgid "Restore Backup?"
+msgstr "बैकअप पुनर्स्थापित करें?"
+
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
+msgstr "सभी मौजूदा समूह और कार्य स्थायी रूप से हटा दिए जाएँगे और बैकअप फ़ाइल की सामग्री से बदल दिए जाएँगे।"
+
+#: src/Window.vala:368
+msgid "Delete and Restore"
+msgstr "हटाएँ और पुनर्स्थापित करें"
+
+#: src/Window.vala:379
+msgid "Restoring Backup…"
+msgstr "बैकअप पुनर्स्थापित हो रहा है…"
+
+#: src/Window.vala:390
+msgid "Backup restored."
+msgstr "बैकअप पुनर्स्थापित किया गया।"
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
+msgid "The group name cannot be empty."
+msgstr "समूह का नाम खाली नहीं हो सकता।"
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
+#, c-format
+msgid "The group name must be at most %d characters."
+msgstr "समूह का नाम अधिकतम %d वर्णों का हो सकता है।"
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
+msgid "A group with this name already exists."
+msgstr "इस नाम का समूह पहले से मौजूद है।"
+
+#: src/modules/Groups/ui/group-sidebar.ui:8
+msgid "Theme"
+msgstr "थीम"
+
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
+msgid "Follow System"
+msgstr "सिस्टम का अनुसरण करें"
+
+#: src/modules/Groups/ui/group-sidebar.ui:15
+msgid "Light"
+msgstr "हल्का"
+
+#: src/modules/Groups/ui/group-sidebar.ui:20
+msgid "Dark"
+msgstr "गहरा"
+
+#: src/modules/Groups/ui/group-sidebar.ui:26
+msgid "Language"
+msgstr "भाषा"
+
+#: src/modules/Groups/ui/group-sidebar.ui:109
+msgid "Backup"
+msgstr "बैकअप"
+
+#: src/modules/Groups/ui/group-sidebar.ui:111
+msgid "Export Backup…"
+msgstr "बैकअप निर्यात करें…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:115
+msgid "Restore Backup…"
+msgstr "बैकअप पुनर्स्थापित करें…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:122
+msgid "About Queue"
+msgstr "Queue के बारे में"
+
+#: src/modules/Groups/ui/group-sidebar.ui:128
+msgid "Groups"
+msgstr "समूह"
+
+#: src/modules/Groups/ui/group-sidebar.ui:137
+msgid "Main Menu"
+msgstr "मुख्य मेनू"
+
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
+msgid "Drag to reorder"
+msgstr "क्रम बदलने के लिए खींचें"
+
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "समूह विकल्प"
+
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "संपादित करें"
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
+msgid "The task title cannot be empty."
+msgstr "कार्य का शीर्षक खाली नहीं हो सकता।"
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
+#, c-format
+msgid "The task title must be at most %d characters."
+msgstr "कार्य का शीर्षक अधिकतम %d वर्णों का हो सकता है।"
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
+#, c-format
+msgid "The description must be at most %d characters."
+msgstr "विवरण अधिकतम %d वर्णों का हो सकता है।"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
+msgid "Tasks"
+msgstr "कार्य"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
+#, c-format
+msgid "Total: %u"
+msgstr "कुल: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
+#, c-format
+msgid "Pending: %u"
+msgstr "लंबित: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
+#, c-format
+msgid "Completed: %u"
+msgstr "पूर्ण: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
+#, c-format
+msgid "Important: %u"
+msgstr "महत्वपूर्ण: %u"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:14
+msgid "Search Tasks"
+msgstr "कार्य खोजें"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:20
+msgid "Filter by status"
+msgstr "स्थिति के अनुसार फ़िल्टर करें"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:25
+msgid "All"
+msgstr "सभी"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:26
+msgid "Pending"
+msgstr "लंबित"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:27
+msgid "Completed"
+msgstr "पूर्ण"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:50
+msgid "Filter tasks by name…"
+msgstr "नाम से कार्य फ़िल्टर करें…"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:64
+msgid "No Group Selected"
+msgstr "कोई समूह चयनित नहीं"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:65
+msgid "Select a group to see its tasks."
+msgstr "इसके कार्य देखने के लिए कोई समूह चुनें।"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:76
+msgid "No Tasks Yet"
+msgstr "अभी कोई कार्य नहीं"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:77
+msgid "Add your first task to this group."
+msgstr "इस समूह में अपना पहला कार्य जोड़ें।"
+
+#: src/modules/Backup/services/BackupSerializer.vala:57
+msgid "The backup file is not valid."
+msgstr "बैकअप फ़ाइल मान्य नहीं है।"
+
+#: src/modules/Tasks/ui/task-row.ui:28
+msgid "Toggle Completed"
+msgstr "पूर्ण टॉगल करें"
+
+#: src/modules/Tasks/ui/task-row.ui:44
+msgid "Show Description"
+msgstr "विवरण दिखाएँ"
+
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "कार्य विकल्प"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "शीर्षक"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "शीर्षक 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "शीर्षक 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "शीर्षक 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "सामान्य पाठ"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "मोटा"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "तिरछा"
+
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "रेखांकित"
+
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "आर-पार रेखा"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "पाठ रंग"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "बुलेट सूची"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "क्रमांकित सूची"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
+msgid "Queue"
+msgstr "Queue"
+
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
+msgid "Task manager"
+msgstr "कार्य प्रबंधक"
+
+#: data/io.github.dprietob.queue.desktop.in:4
+msgid "Manage and organize tasks"
+msgstr "कार्यों को प्रबंधित और व्यवस्थित करें"
+
+#: data/io.github.dprietob.queue.desktop.in:10
+msgid "task;manager;organize;"
+msgstr "कार्य;प्रबंधक;व्यवस्थित;task;manager;"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
+msgid "Queue is a simple, fast task manager."
+msgstr "Queue एक सरल, तेज़ कार्य प्रबंधक है।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr "अपने कार्यों को समूहों में व्यवस्थित करें, उन्हें पूर्ण या महत्वपूर्ण के रूप में चिह्नित करें, खींचकर क्रम बदलें, और अंतर्निहित बैकअप के साथ अपना डेटा सुरक्षित रखें।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
+msgid "Features:"
+msgstr "विशेषताएँ:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
+msgstr "कार्यों को कस्टम, रंग-कोडित समूहों में व्यवस्थित करें।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
+msgstr "कार्यों को पूर्ण या महत्वपूर्ण के रूप में चिह्नित करें।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr "शीर्षक, पाठ शैलियों, रंगों और सूचियों के साथ समृद्ध कार्य विवरण लिखें।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "देखें कि प्रत्येक कार्य कब पूर्ण हुआ।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "खींचकर समूहों और कार्यों का क्रम बदलें।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
+msgstr "अपना सारा डेटा JSON के रूप में निर्यात और पुनर्स्थापित करें।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
+msgstr "हल्की और गहरी शैलियाँ, कई भाषाओं में उपलब्ध।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
+msgid "Tasks organized by group"
+msgstr "समूह के अनुसार व्यवस्थित कार्य"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
+msgid "Dark style"
+msgstr "गहरी शैली"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
+msgid "Create and edit tasks with details"
+msgstr "विवरण के साथ कार्य बनाएँ और संपादित करें"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr "इस रिलीज़ में समृद्ध-पाठ विवरण और कई सुधार शामिल हैं:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr "शीर्षक, मोटा, तिरछा, रेखांकित, आर-पार रेखा, पाठ रंग और सूचियों के साथ कार्य विवरण को प्रारूपित करें।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "पूर्ण किए गए कार्यों की समाप्ति तिथि देखें।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "प्रत्येक आइटम के मेनू से कार्य और समूह संपादित और हटाएँ।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "कार्य सूची अब विंडो की पूरी चौड़ाई का उपयोग करती है।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr "कार्य विवरण अब बहुत लंबा पाठ रख सकते हैं।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "पोलिश, रूसी, कोरियाई, नॉर्वेजियन, स्वीडिश, हिन्दी और ग्रीक अनुवाद जोड़े गए।"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
+msgid "Initial release."
+msgstr "प्रारंभिक रिलीज़।"
diff --git a/po/it.po b/po/it.po
index 73e000e..2f8aa50 100644
--- a/po/it.po
+++ b/po/it.po
@@ -4,9 +4,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: queue 1.0.0\n"
+"Project-Id-Version: queue 1.1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-06-27 02:58+0200\n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
"PO-Revision-Date: 2026-06-27 00:00+0000\n"
"Last-Translator: Daniel Prieto\n"
"Language-Team: Italian\n"
@@ -16,257 +16,464 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
msgid "Restart Queue to apply the new language."
msgstr "Riavvia Queue per applicare la nuova lingua."
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
msgid "New Group"
msgstr "Nuovo gruppo"
+#: src/Window.vala:101
msgid "Edit Group"
msgstr "Modifica gruppo"
+#: src/Window.vala:108
#, c-format
msgid "\"%s\" and all of its tasks will be permanently deleted."
msgstr "«%s» e tutte le sue attività verranno eliminati definitivamente."
+#: src/Window.vala:110
msgid "Delete Group?"
msgstr "Eliminare il gruppo?"
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
msgid "New Task"
msgstr "Nuova attività"
+#: src/Window.vala:128
msgid "Edit Task"
msgstr "Modifica attività"
+#: src/Window.vala:136
#, c-format
msgid "\"%s\" will be permanently deleted."
msgstr "«%s» verrà eliminata definitivamente."
+#: src/Window.vala:137
msgid "Delete Task?"
msgstr "Eliminare l’attività?"
+#: src/Window.vala:168
msgid "Group name"
msgstr "Nome del gruppo"
+#: src/Window.vala:187
msgid "Color"
msgstr "Colore"
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
msgid "Cancel"
msgstr "Annulla"
+#: src/Window.vala:193 src/Window.vala:266
msgid "Save"
msgstr "Salva"
+#: src/Window.vala:245
msgid "Title"
msgstr "Titolo"
-msgid "Description (optional)"
-msgstr "Descrizione (facoltativa)"
-
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
msgid "Important"
msgstr "Importante"
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
msgid "Delete"
msgstr "Elimina"
+#: src/Window.vala:320
msgid "Export Backup"
msgstr "Esporta backup"
+#: src/Window.vala:332
msgid "Exporting Backup…"
msgstr "Esportazione del backup…"
+#: src/Window.vala:339
msgid "Backup exported."
msgstr "Backup esportato."
+#: src/Window.vala:347
msgid "Restore Backup"
msgstr "Ripristina backup"
+#: src/Window.vala:364
msgid "Restore Backup?"
msgstr "Ripristinare il backup?"
-msgid "All current groups and tasks will be permanently deleted and replaced with the contents of the backup file."
-msgstr "Tutti i gruppi e le attività attuali verranno eliminati definitivamente e sostituiti con il contenuto del file di backup."
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
+msgstr ""
+"Tutti i gruppi e le attività attuali verranno eliminati definitivamente e "
+"sostituiti con il contenuto del file di backup."
+#: src/Window.vala:368
msgid "Delete and Restore"
msgstr "Elimina e ripristina"
+#: src/Window.vala:379
msgid "Restoring Backup…"
msgstr "Ripristino del backup…"
+#: src/Window.vala:390
msgid "Backup restored."
msgstr "Backup ripristinato."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
msgid "The group name cannot be empty."
msgstr "Il nome del gruppo non può essere vuoto."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
#, c-format
msgid "The group name must be at most %d characters."
msgstr "Il nome del gruppo deve contenere al massimo %d caratteri."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
msgid "A group with this name already exists."
msgstr "Esiste già un gruppo con questo nome."
+#: src/modules/Groups/ui/group-sidebar.ui:8
msgid "Theme"
msgstr "Tema"
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
msgid "Follow System"
msgstr "Segui il sistema"
+#: src/modules/Groups/ui/group-sidebar.ui:15
msgid "Light"
msgstr "Chiaro"
+#: src/modules/Groups/ui/group-sidebar.ui:20
msgid "Dark"
msgstr "Scuro"
+#: src/modules/Groups/ui/group-sidebar.ui:26
msgid "Language"
msgstr "Lingua"
+#: src/modules/Groups/ui/group-sidebar.ui:109
msgid "Backup"
msgstr "Backup"
+#: src/modules/Groups/ui/group-sidebar.ui:111
msgid "Export Backup…"
msgstr "Esporta backup…"
+#: src/modules/Groups/ui/group-sidebar.ui:115
msgid "Restore Backup…"
msgstr "Ripristina backup…"
+#: src/modules/Groups/ui/group-sidebar.ui:122
msgid "About Queue"
msgstr "Informazioni su Queue"
+#: src/modules/Groups/ui/group-sidebar.ui:128
msgid "Groups"
msgstr "Gruppi"
+#: src/modules/Groups/ui/group-sidebar.ui:137
msgid "Main Menu"
msgstr "Menu principale"
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
msgid "Drag to reorder"
msgstr "Trascina per riordinare"
-msgid "Rename Group"
-msgstr "Rinomina gruppo"
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "Opzioni gruppo"
-msgid "Delete Group"
-msgstr "Elimina gruppo"
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "Modifica"
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
msgid "The task title cannot be empty."
msgstr "Il titolo dell’attività non può essere vuoto."
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
#, c-format
msgid "The task title must be at most %d characters."
msgstr "Il titolo dell’attività deve contenere al massimo %d caratteri."
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
#, c-format
msgid "The description must be at most %d characters."
msgstr "La descrizione deve contenere al massimo %d caratteri."
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
msgid "Tasks"
msgstr "Attività"
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
#, c-format
msgid "Total: %u"
msgstr "Totale: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
#, c-format
msgid "Pending: %u"
msgstr "In sospeso: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
#, c-format
msgid "Completed: %u"
msgstr "Completate: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
#, c-format
msgid "Important: %u"
msgstr "Importanti: %u"
+#: src/modules/Tasks/ui/task-list-panel.ui:14
msgid "Search Tasks"
msgstr "Cerca attività"
+#: src/modules/Tasks/ui/task-list-panel.ui:20
msgid "Filter by status"
msgstr "Filtra per stato"
+#: src/modules/Tasks/ui/task-list-panel.ui:25
msgid "All"
msgstr "Tutte"
+#: src/modules/Tasks/ui/task-list-panel.ui:26
msgid "Pending"
msgstr "In sospeso"
+#: src/modules/Tasks/ui/task-list-panel.ui:27
msgid "Completed"
msgstr "Completate"
+#: src/modules/Tasks/ui/task-list-panel.ui:50
msgid "Filter tasks by name…"
msgstr "Filtra le attività per nome…"
+#: src/modules/Tasks/ui/task-list-panel.ui:64
msgid "No Group Selected"
msgstr "Nessun gruppo selezionato"
+#: src/modules/Tasks/ui/task-list-panel.ui:65
msgid "Select a group to see its tasks."
msgstr "Seleziona un gruppo per vedere le sue attività."
+#: src/modules/Tasks/ui/task-list-panel.ui:76
msgid "No Tasks Yet"
msgstr "Ancora nessuna attività"
+#: src/modules/Tasks/ui/task-list-panel.ui:77
msgid "Add your first task to this group."
msgstr "Aggiungi la tua prima attività a questo gruppo."
+#: src/modules/Backup/services/BackupSerializer.vala:57
msgid "The backup file is not valid."
msgstr "Il file di backup non è valido."
+#: src/modules/Tasks/ui/task-row.ui:28
msgid "Toggle Completed"
msgstr "Attiva/disattiva completata"
+#: src/modules/Tasks/ui/task-row.ui:44
msgid "Show Description"
msgstr "Mostra descrizione"
-msgid "Delete Task"
-msgstr "Elimina attività"
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "Opzioni attività"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "Intestazione"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "Intestazione 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "Intestazione 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "Intestazione 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "Testo normale"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "Grassetto"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "Corsivo"
+
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "Sottolineato"
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "Barrato"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "Colore del testo"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "Elenco puntato"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "Elenco numerato"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
msgid "Queue"
msgstr "Queue"
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
msgid "Task manager"
msgstr "Gestore di attività"
+#: data/io.github.dprietob.queue.desktop.in:4
msgid "Manage and organize tasks"
msgstr "Gestisci e organizza le attività"
+#: data/io.github.dprietob.queue.desktop.in:10
msgid "task;manager;organize;"
msgstr "attività;gestore;organizzare;"
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
msgid "Queue is a simple, fast task manager."
msgstr "Queue è un gestore di attività semplice e veloce."
-msgid "Organize your tasks into groups, mark them as done or important, reorder them with drag and drop, and keep your data safe with built-in backups."
-msgstr "Organizza le tue attività in gruppi, contrassegnale come completate o importanti, riordinale trascinandole e mantieni i tuoi dati al sicuro con i backup integrati."
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr ""
+"Organizza le tue attività in gruppi, contrassegnale come completate o "
+"importanti, riordinale trascinandole e mantieni i tuoi dati al sicuro con i "
+"backup integrati."
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
msgid "Features:"
msgstr "Funzionalità:"
-msgid "Organize tasks into custom, color-coded groups"
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
msgstr "Organizza le attività in gruppi personalizzati e colorati"
-msgid "Mark tasks as completed or important"
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
msgstr "Contrassegna le attività come completate o importanti"
-msgid "Add optional descriptions and reorder by dragging"
-msgstr "Aggiungi descrizioni facoltative e riordina trascinando"
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr ""
+"Scrivi descrizioni formattate con intestazioni, stili di testo, colori ed "
+"elenchi."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "Visualizza la data in cui ogni attività è stata completata."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "Riordina gruppi e attività con il trascinamento."
-msgid "Export and restore all your data as JSON"
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
msgstr "Esporta e ripristina tutti i tuoi dati in formato JSON"
-msgid "Light and dark styles, available in several languages"
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
msgstr "Stili chiaro e scuro, disponibile in diverse lingue"
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
msgid "Tasks organized by group"
msgstr "Attività organizzate per gruppo"
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
msgid "Dark style"
msgstr "Stile scuro"
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
msgid "Create and edit tasks with details"
msgstr "Crea e modifica attività con dettagli"
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr ""
+"Questa versione introduce descrizioni con testo formattato e diversi "
+"miglioramenti:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr ""
+"Formatta le descrizioni con intestazioni, grassetto, corsivo, sottolineato, "
+"barrato, colore del testo ed elenchi."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "Visualizza la data di completamento delle attività concluse."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "Modifica ed elimina attività e gruppi da un menu per ogni elemento."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "L’elenco delle attività ora occupa tutta la larghezza della finestra."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr ""
+"Le descrizioni delle attività ora possono contenere testi molto più lunghi."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "Aggiunte le traduzioni in polacco, russo, coreano, norvegese, svedese, hindi e greco."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
msgid "Initial release."
msgstr "Versione iniziale."
-msgid "Daniel Prieto"
-msgstr "Daniel Prieto"
+#~ msgid "Description (optional)"
+#~ msgstr "Descrizione (facoltativa)"
+
+#~ msgid "Rename Group"
+#~ msgstr "Rinomina gruppo"
+
+#~ msgid "Delete Group"
+#~ msgstr "Elimina gruppo"
+
+#~ msgid "Delete Task"
+#~ msgstr "Elimina attività"
+
+#~ msgid "Add optional descriptions and reorder by dragging"
+#~ msgstr "Aggiungi descrizioni facoltative e riordina trascinando"
diff --git a/po/ja.po b/po/ja.po
index b7402d3..e2082c2 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -4,9 +4,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: queue 1.0.0\n"
+"Project-Id-Version: queue 1.1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-06-27 02:58+0200\n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
"PO-Revision-Date: 2026-06-27 00:00+0000\n"
"Last-Translator: Daniel Prieto\n"
"Language-Team: Japanese\n"
@@ -16,257 +16,458 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
msgid "Restart Queue to apply the new language."
msgstr "新しい言語を適用するには Queue を再起動してください。"
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
msgid "New Group"
msgstr "新しいグループ"
+#: src/Window.vala:101
msgid "Edit Group"
msgstr "グループを編集"
+#: src/Window.vala:108
#, c-format
msgid "\"%s\" and all of its tasks will be permanently deleted."
msgstr "「%s」とそのすべてのタスクが完全に削除されます。"
+#: src/Window.vala:110
msgid "Delete Group?"
msgstr "グループを削除しますか?"
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
msgid "New Task"
msgstr "新しいタスク"
+#: src/Window.vala:128
msgid "Edit Task"
msgstr "タスクを編集"
+#: src/Window.vala:136
#, c-format
msgid "\"%s\" will be permanently deleted."
msgstr "「%s」が完全に削除されます。"
+#: src/Window.vala:137
msgid "Delete Task?"
msgstr "タスクを削除しますか?"
+#: src/Window.vala:168
msgid "Group name"
msgstr "グループ名"
+#: src/Window.vala:187
msgid "Color"
msgstr "色"
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
msgid "Cancel"
msgstr "キャンセル"
+#: src/Window.vala:193 src/Window.vala:266
msgid "Save"
msgstr "保存"
+#: src/Window.vala:245
msgid "Title"
msgstr "タイトル"
-msgid "Description (optional)"
-msgstr "説明(任意)"
-
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
msgid "Important"
msgstr "重要"
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
msgid "Delete"
msgstr "削除"
+#: src/Window.vala:320
msgid "Export Backup"
msgstr "バックアップをエクスポート"
+#: src/Window.vala:332
msgid "Exporting Backup…"
msgstr "バックアップをエクスポートしています…"
+#: src/Window.vala:339
msgid "Backup exported."
msgstr "バックアップをエクスポートしました。"
+#: src/Window.vala:347
msgid "Restore Backup"
msgstr "バックアップを復元"
+#: src/Window.vala:364
msgid "Restore Backup?"
msgstr "バックアップを復元しますか?"
-msgid "All current groups and tasks will be permanently deleted and replaced with the contents of the backup file."
-msgstr "現在のすべてのグループとタスクは完全に削除され、バックアップファイルの内容に置き換えられます。"
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
+msgstr ""
+"現在のすべてのグループとタスクは完全に削除され、バックアップファイルの内容に"
+"置き換えられます。"
+#: src/Window.vala:368
msgid "Delete and Restore"
msgstr "削除して復元"
+#: src/Window.vala:379
msgid "Restoring Backup…"
msgstr "バックアップを復元しています…"
+#: src/Window.vala:390
msgid "Backup restored."
msgstr "バックアップを復元しました。"
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
msgid "The group name cannot be empty."
msgstr "グループ名を空にすることはできません。"
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
#, c-format
msgid "The group name must be at most %d characters."
msgstr "グループ名は最大 %d 文字までです。"
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
msgid "A group with this name already exists."
msgstr "この名前のグループはすでに存在します。"
+#: src/modules/Groups/ui/group-sidebar.ui:8
msgid "Theme"
msgstr "テーマ"
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
msgid "Follow System"
msgstr "システムに従う"
+#: src/modules/Groups/ui/group-sidebar.ui:15
msgid "Light"
msgstr "ライト"
+#: src/modules/Groups/ui/group-sidebar.ui:20
msgid "Dark"
msgstr "ダーク"
+#: src/modules/Groups/ui/group-sidebar.ui:26
msgid "Language"
msgstr "言語"
+#: src/modules/Groups/ui/group-sidebar.ui:109
msgid "Backup"
msgstr "バックアップ"
+#: src/modules/Groups/ui/group-sidebar.ui:111
msgid "Export Backup…"
msgstr "バックアップをエクスポート…"
+#: src/modules/Groups/ui/group-sidebar.ui:115
msgid "Restore Backup…"
msgstr "バックアップを復元…"
+#: src/modules/Groups/ui/group-sidebar.ui:122
msgid "About Queue"
msgstr "Queue について"
+#: src/modules/Groups/ui/group-sidebar.ui:128
msgid "Groups"
msgstr "グループ"
+#: src/modules/Groups/ui/group-sidebar.ui:137
msgid "Main Menu"
msgstr "メインメニュー"
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
msgid "Drag to reorder"
msgstr "ドラッグして並べ替え"
-msgid "Rename Group"
-msgstr "グループ名を変更"
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "グループのオプション"
-msgid "Delete Group"
-msgstr "グループを削除"
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "編集"
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
msgid "The task title cannot be empty."
msgstr "タスクのタイトルを空にすることはできません。"
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
#, c-format
msgid "The task title must be at most %d characters."
msgstr "タスクのタイトルは最大 %d 文字までです。"
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
#, c-format
msgid "The description must be at most %d characters."
msgstr "説明は最大 %d 文字までです。"
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
msgid "Tasks"
msgstr "タスク"
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
#, c-format
msgid "Total: %u"
msgstr "合計: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
#, c-format
msgid "Pending: %u"
msgstr "未完了: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
#, c-format
msgid "Completed: %u"
msgstr "完了: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
#, c-format
msgid "Important: %u"
msgstr "重要: %u"
+#: src/modules/Tasks/ui/task-list-panel.ui:14
msgid "Search Tasks"
msgstr "タスクを検索"
+#: src/modules/Tasks/ui/task-list-panel.ui:20
msgid "Filter by status"
msgstr "状態で絞り込み"
+#: src/modules/Tasks/ui/task-list-panel.ui:25
msgid "All"
msgstr "すべて"
+#: src/modules/Tasks/ui/task-list-panel.ui:26
msgid "Pending"
msgstr "未完了"
+#: src/modules/Tasks/ui/task-list-panel.ui:27
msgid "Completed"
msgstr "完了"
+#: src/modules/Tasks/ui/task-list-panel.ui:50
msgid "Filter tasks by name…"
msgstr "名前でタスクを絞り込み…"
+#: src/modules/Tasks/ui/task-list-panel.ui:64
msgid "No Group Selected"
msgstr "グループが選択されていません"
+#: src/modules/Tasks/ui/task-list-panel.ui:65
msgid "Select a group to see its tasks."
msgstr "グループを選択するとタスクが表示されます。"
+#: src/modules/Tasks/ui/task-list-panel.ui:76
msgid "No Tasks Yet"
msgstr "タスクがまだありません"
+#: src/modules/Tasks/ui/task-list-panel.ui:77
msgid "Add your first task to this group."
msgstr "このグループに最初のタスクを追加しましょう。"
+#: src/modules/Backup/services/BackupSerializer.vala:57
msgid "The backup file is not valid."
msgstr "バックアップファイルが無効です。"
+#: src/modules/Tasks/ui/task-row.ui:28
msgid "Toggle Completed"
msgstr "完了を切り替え"
+#: src/modules/Tasks/ui/task-row.ui:44
msgid "Show Description"
msgstr "説明を表示"
-msgid "Delete Task"
-msgstr "タスクを削除"
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "タスクのオプション"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "見出し"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "見出し 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "見出し 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "見出し 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "標準テキスト"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "太字"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "斜体"
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "下線"
+
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "取り消し線"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "文字色"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "箇条書き"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "番号付きリスト"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
msgid "Queue"
msgstr "Queue"
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
msgid "Task manager"
msgstr "タスク管理"
+#: data/io.github.dprietob.queue.desktop.in:4
msgid "Manage and organize tasks"
msgstr "タスクの管理と整理"
+#: data/io.github.dprietob.queue.desktop.in:10
msgid "task;manager;organize;"
msgstr "タスク;管理;整理;task;manager;organize;"
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
msgid "Queue is a simple, fast task manager."
msgstr "Queue はシンプルで高速なタスク管理アプリです。"
-msgid "Organize your tasks into groups, mark them as done or important, reorder them with drag and drop, and keep your data safe with built-in backups."
-msgstr "タスクをグループに整理し、完了や重要としてマークし、ドラッグ&ドロップで並べ替え、内蔵のバックアップでデータを安全に保ちます。"
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr ""
+"タスクをグループに整理し、完了や重要としてマークし、ドラッグ&ドロップで並べ"
+"替え、内蔵のバックアップでデータを安全に保ちます。"
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
msgid "Features:"
msgstr "機能:"
-msgid "Organize tasks into custom, color-coded groups"
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
msgstr "タスクを色分けしたカスタムグループに整理"
-msgid "Mark tasks as completed or important"
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
msgstr "タスクを完了または重要としてマーク"
-msgid "Add optional descriptions and reorder by dragging"
-msgstr "任意の説明を追加し、ドラッグで並べ替え"
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr "見出し、文字スタイル、色、リストを使ってリッチな説明を作成できます。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "各タスクが完了した日付を確認できます。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "ドラッグ&ドロップでグループとタスクを並べ替えできます。"
-msgid "Export and restore all your data as JSON"
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
msgstr "すべてのデータを JSON 形式でエクスポート・復元"
-msgid "Light and dark styles, available in several languages"
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
msgstr "ライトとダークのスタイル、複数の言語に対応"
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
msgid "Tasks organized by group"
msgstr "グループごとに整理されたタスク"
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
msgid "Dark style"
msgstr "ダークスタイル"
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
msgid "Create and edit tasks with details"
msgstr "詳細を付けてタスクを作成・編集"
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr "このリリースではリッチテキストの説明といくつかの改善が加わりました:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr ""
+"見出し、太字、斜体、下線、取り消し線、文字色、リストで説明を書式設定できま"
+"す。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "完了したタスクの完了日を確認できます。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "各項目のメニューからタスクやグループを編集・削除できます。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "タスク一覧がウィンドウの全幅を使うようになりました。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr "タスクの説明にこれまでよりずっと長い文章を入力できます。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "ポーランド語、ロシア語、韓国語、ノルウェー語、スウェーデン語、ヒンディー語、ギリシャ語の翻訳を追加しました。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
msgid "Initial release."
msgstr "初回リリース。"
-msgid "Daniel Prieto"
-msgstr "Daniel Prieto"
+#~ msgid "Description (optional)"
+#~ msgstr "説明(任意)"
+
+#~ msgid "Rename Group"
+#~ msgstr "グループ名を変更"
+
+#~ msgid "Delete Group"
+#~ msgstr "グループを削除"
+
+#~ msgid "Delete Task"
+#~ msgstr "タスクを削除"
+
+#~ msgid "Add optional descriptions and reorder by dragging"
+#~ msgstr "任意の説明を追加し、ドラッグで並べ替え"
diff --git a/po/ko.po b/po/ko.po
new file mode 100644
index 0000000..b7d8637
--- /dev/null
+++ b/po/ko.po
@@ -0,0 +1,453 @@
+# Korean translations for queue package.
+# Copyright (C) 2026 THE queue'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the queue package.
+# Automatically generated, 2026.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: queue\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
+"PO-Revision-Date: 2026-06-29 19:34+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
+msgid "Restart Queue to apply the new language."
+msgstr "새 언어를 적용하려면 Queue를 다시 시작하세요."
+
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
+msgid "New Group"
+msgstr "새 그룹"
+
+#: src/Window.vala:101
+msgid "Edit Group"
+msgstr "그룹 편집"
+
+#: src/Window.vala:108
+#, c-format
+msgid "\"%s\" and all of its tasks will be permanently deleted."
+msgstr "\"%s\" 및 해당 작업이 모두 영구적으로 삭제됩니다."
+
+#: src/Window.vala:110
+msgid "Delete Group?"
+msgstr "그룹을 삭제할까요?"
+
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
+msgid "New Task"
+msgstr "새 작업"
+
+#: src/Window.vala:128
+msgid "Edit Task"
+msgstr "작업 편집"
+
+#: src/Window.vala:136
+#, c-format
+msgid "\"%s\" will be permanently deleted."
+msgstr "\"%s\"이(가) 영구적으로 삭제됩니다."
+
+#: src/Window.vala:137
+msgid "Delete Task?"
+msgstr "작업을 삭제할까요?"
+
+#: src/Window.vala:168
+msgid "Group name"
+msgstr "그룹 이름"
+
+#: src/Window.vala:187
+msgid "Color"
+msgstr "색상"
+
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
+msgid "Cancel"
+msgstr "취소"
+
+#: src/Window.vala:193 src/Window.vala:266
+msgid "Save"
+msgstr "저장"
+
+#: src/Window.vala:245
+msgid "Title"
+msgstr "제목"
+
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
+msgid "Important"
+msgstr "중요"
+
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
+msgid "Delete"
+msgstr "삭제"
+
+#: src/Window.vala:320
+msgid "Export Backup"
+msgstr "백업 내보내기"
+
+#: src/Window.vala:332
+msgid "Exporting Backup…"
+msgstr "백업 내보내는 중…"
+
+#: src/Window.vala:339
+msgid "Backup exported."
+msgstr "백업을 내보냈습니다."
+
+#: src/Window.vala:347
+msgid "Restore Backup"
+msgstr "백업 복원"
+
+#: src/Window.vala:364
+msgid "Restore Backup?"
+msgstr "백업을 복원할까요?"
+
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
+msgstr "현재의 모든 그룹과 작업이 영구적으로 삭제되고 백업 파일의 내용으로 대체됩니다."
+
+#: src/Window.vala:368
+msgid "Delete and Restore"
+msgstr "삭제 후 복원"
+
+#: src/Window.vala:379
+msgid "Restoring Backup…"
+msgstr "백업 복원하는 중…"
+
+#: src/Window.vala:390
+msgid "Backup restored."
+msgstr "백업을 복원했습니다."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
+msgid "The group name cannot be empty."
+msgstr "그룹 이름은 비워 둘 수 없습니다."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
+#, c-format
+msgid "The group name must be at most %d characters."
+msgstr "그룹 이름은 최대 %d자까지 가능합니다."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
+msgid "A group with this name already exists."
+msgstr "이 이름의 그룹이 이미 있습니다."
+
+#: src/modules/Groups/ui/group-sidebar.ui:8
+msgid "Theme"
+msgstr "테마"
+
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
+msgid "Follow System"
+msgstr "시스템 설정 따름"
+
+#: src/modules/Groups/ui/group-sidebar.ui:15
+msgid "Light"
+msgstr "밝게"
+
+#: src/modules/Groups/ui/group-sidebar.ui:20
+msgid "Dark"
+msgstr "어둡게"
+
+#: src/modules/Groups/ui/group-sidebar.ui:26
+msgid "Language"
+msgstr "언어"
+
+#: src/modules/Groups/ui/group-sidebar.ui:109
+msgid "Backup"
+msgstr "백업"
+
+#: src/modules/Groups/ui/group-sidebar.ui:111
+msgid "Export Backup…"
+msgstr "백업 내보내기…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:115
+msgid "Restore Backup…"
+msgstr "백업 복원…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:122
+msgid "About Queue"
+msgstr "Queue 정보"
+
+#: src/modules/Groups/ui/group-sidebar.ui:128
+msgid "Groups"
+msgstr "그룹"
+
+#: src/modules/Groups/ui/group-sidebar.ui:137
+msgid "Main Menu"
+msgstr "주 메뉴"
+
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
+msgid "Drag to reorder"
+msgstr "끌어서 순서 변경"
+
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "그룹 옵션"
+
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "편집"
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
+msgid "The task title cannot be empty."
+msgstr "작업 제목은 비워 둘 수 없습니다."
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
+#, c-format
+msgid "The task title must be at most %d characters."
+msgstr "작업 제목은 최대 %d자까지 가능합니다."
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
+#, c-format
+msgid "The description must be at most %d characters."
+msgstr "설명은 최대 %d자까지 가능합니다."
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
+msgid "Tasks"
+msgstr "작업"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
+#, c-format
+msgid "Total: %u"
+msgstr "전체: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
+#, c-format
+msgid "Pending: %u"
+msgstr "대기 중: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
+#, c-format
+msgid "Completed: %u"
+msgstr "완료: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
+#, c-format
+msgid "Important: %u"
+msgstr "중요: %u"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:14
+msgid "Search Tasks"
+msgstr "작업 검색"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:20
+msgid "Filter by status"
+msgstr "상태별 필터"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:25
+msgid "All"
+msgstr "전체"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:26
+msgid "Pending"
+msgstr "대기 중"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:27
+msgid "Completed"
+msgstr "완료"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:50
+msgid "Filter tasks by name…"
+msgstr "이름으로 작업 필터…"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:64
+msgid "No Group Selected"
+msgstr "선택된 그룹 없음"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:65
+msgid "Select a group to see its tasks."
+msgstr "그룹을 선택하면 작업이 표시됩니다."
+
+#: src/modules/Tasks/ui/task-list-panel.ui:76
+msgid "No Tasks Yet"
+msgstr "아직 작업이 없습니다"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:77
+msgid "Add your first task to this group."
+msgstr "이 그룹에 첫 작업을 추가하세요."
+
+#: src/modules/Backup/services/BackupSerializer.vala:57
+msgid "The backup file is not valid."
+msgstr "백업 파일이 올바르지 않습니다."
+
+#: src/modules/Tasks/ui/task-row.ui:28
+msgid "Toggle Completed"
+msgstr "완료 전환"
+
+#: src/modules/Tasks/ui/task-row.ui:44
+msgid "Show Description"
+msgstr "설명 표시"
+
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "작업 옵션"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "머리글"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "머리글 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "머리글 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "머리글 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "일반 텍스트"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "굵게"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "기울임"
+
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "밑줄"
+
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "취소선"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "글자 색"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "글머리 기호 목록"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "번호 매기기 목록"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
+msgid "Queue"
+msgstr "Queue"
+
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
+msgid "Task manager"
+msgstr "작업 관리자"
+
+#: data/io.github.dprietob.queue.desktop.in:4
+msgid "Manage and organize tasks"
+msgstr "작업을 관리하고 정리하세요"
+
+#: data/io.github.dprietob.queue.desktop.in:10
+msgid "task;manager;organize;"
+msgstr "작업;관리자;정리;task;manager;"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
+msgid "Queue is a simple, fast task manager."
+msgstr "Queue는 간단하고 빠른 작업 관리자입니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr "작업을 그룹으로 정리하고, 완료 또는 중요로 표시하고, 끌어서 놓기로 순서를 바꾸고, 내장 백업으로 데이터를 안전하게 보관하세요."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
+msgid "Features:"
+msgstr "기능:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
+msgstr "작업을 색상으로 구분된 사용자 지정 그룹으로 정리합니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
+msgstr "작업을 완료 또는 중요로 표시합니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr "제목, 텍스트 스타일, 색상, 목록으로 풍부한 작업 설명을 작성합니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "각 작업이 완료된 날짜를 확인합니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "끌어서 놓기로 그룹과 작업의 순서를 바꿉니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
+msgstr "모든 데이터를 JSON으로 내보내고 복원합니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
+msgstr "밝은 스타일과 어두운 스타일, 여러 언어로 제공됩니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
+msgid "Tasks organized by group"
+msgstr "그룹별로 정리된 작업"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
+msgid "Dark style"
+msgstr "어두운 스타일"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
+msgid "Create and edit tasks with details"
+msgstr "세부 정보와 함께 작업을 만들고 편집"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr "이번 릴리스에서는 서식 있는 설명과 여러 개선 사항이 추가되었습니다:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr "제목, 굵게, 기울임, 밑줄, 취소선, 글자 색, 목록으로 작업 설명의 서식을 지정합니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "완료된 작업의 완료 날짜를 확인합니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "각 항목의 메뉴에서 작업과 그룹을 편집하고 삭제합니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "이제 작업 목록이 창의 전체 너비를 사용합니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr "이제 작업 설명에 훨씬 긴 텍스트를 담을 수 있습니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "폴란드어, 러시아어, 한국어, 노르웨이어, 스웨덴어, 힌디어, 그리스어 번역이 추가되었습니다."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
+msgid "Initial release."
+msgstr "최초 릴리스."
diff --git a/po/nb.po b/po/nb.po
new file mode 100644
index 0000000..911e986
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,453 @@
+# Norwegian Bokmal translations for queue package.
+# Copyright (C) 2026 THE queue'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the queue package.
+# Automatically generated, 2026.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: queue\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
+"PO-Revision-Date: 2026-06-29 19:34+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: nb\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"
+
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
+msgid "Restart Queue to apply the new language."
+msgstr "Start Queue på nytt for å bruke det nye språket."
+
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
+msgid "New Group"
+msgstr "Ny gruppe"
+
+#: src/Window.vala:101
+msgid "Edit Group"
+msgstr "Rediger gruppe"
+
+#: src/Window.vala:108
+#, c-format
+msgid "\"%s\" and all of its tasks will be permanently deleted."
+msgstr "\"%s\" og alle oppgavene blir slettet for godt."
+
+#: src/Window.vala:110
+msgid "Delete Group?"
+msgstr "Slette gruppen?"
+
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
+msgid "New Task"
+msgstr "Ny oppgave"
+
+#: src/Window.vala:128
+msgid "Edit Task"
+msgstr "Rediger oppgave"
+
+#: src/Window.vala:136
+#, c-format
+msgid "\"%s\" will be permanently deleted."
+msgstr "\"%s\" blir slettet for godt."
+
+#: src/Window.vala:137
+msgid "Delete Task?"
+msgstr "Slette oppgaven?"
+
+#: src/Window.vala:168
+msgid "Group name"
+msgstr "Gruppenavn"
+
+#: src/Window.vala:187
+msgid "Color"
+msgstr "Farge"
+
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: src/Window.vala:193 src/Window.vala:266
+msgid "Save"
+msgstr "Lagre"
+
+#: src/Window.vala:245
+msgid "Title"
+msgstr "Tittel"
+
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
+msgid "Important"
+msgstr "Viktig"
+
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
+msgid "Delete"
+msgstr "Slett"
+
+#: src/Window.vala:320
+msgid "Export Backup"
+msgstr "Eksporter sikkerhetskopi"
+
+#: src/Window.vala:332
+msgid "Exporting Backup…"
+msgstr "Eksporterer sikkerhetskopi…"
+
+#: src/Window.vala:339
+msgid "Backup exported."
+msgstr "Sikkerhetskopi eksportert."
+
+#: src/Window.vala:347
+msgid "Restore Backup"
+msgstr "Gjenopprett sikkerhetskopi"
+
+#: src/Window.vala:364
+msgid "Restore Backup?"
+msgstr "Gjenopprette sikkerhetskopi?"
+
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
+msgstr "Alle nåværende grupper og oppgaver blir slettet for godt og erstattet med innholdet i sikkerhetskopifilen."
+
+#: src/Window.vala:368
+msgid "Delete and Restore"
+msgstr "Slett og gjenopprett"
+
+#: src/Window.vala:379
+msgid "Restoring Backup…"
+msgstr "Gjenoppretter sikkerhetskopi…"
+
+#: src/Window.vala:390
+msgid "Backup restored."
+msgstr "Sikkerhetskopi gjenopprettet."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
+msgid "The group name cannot be empty."
+msgstr "Gruppenavnet kan ikke være tomt."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
+#, c-format
+msgid "The group name must be at most %d characters."
+msgstr "Gruppenavnet kan ha høyst %d tegn."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
+msgid "A group with this name already exists."
+msgstr "En gruppe med dette navnet finnes allerede."
+
+#: src/modules/Groups/ui/group-sidebar.ui:8
+msgid "Theme"
+msgstr "Tema"
+
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
+msgid "Follow System"
+msgstr "Følg systemet"
+
+#: src/modules/Groups/ui/group-sidebar.ui:15
+msgid "Light"
+msgstr "Lyst"
+
+#: src/modules/Groups/ui/group-sidebar.ui:20
+msgid "Dark"
+msgstr "Mørkt"
+
+#: src/modules/Groups/ui/group-sidebar.ui:26
+msgid "Language"
+msgstr "Språk"
+
+#: src/modules/Groups/ui/group-sidebar.ui:109
+msgid "Backup"
+msgstr "Sikkerhetskopi"
+
+#: src/modules/Groups/ui/group-sidebar.ui:111
+msgid "Export Backup…"
+msgstr "Eksporter sikkerhetskopi…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:115
+msgid "Restore Backup…"
+msgstr "Gjenopprett sikkerhetskopi…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:122
+msgid "About Queue"
+msgstr "Om Queue"
+
+#: src/modules/Groups/ui/group-sidebar.ui:128
+msgid "Groups"
+msgstr "Grupper"
+
+#: src/modules/Groups/ui/group-sidebar.ui:137
+msgid "Main Menu"
+msgstr "Hovedmeny"
+
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
+msgid "Drag to reorder"
+msgstr "Dra for å endre rekkefølge"
+
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "Gruppealternativer"
+
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "Rediger"
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
+msgid "The task title cannot be empty."
+msgstr "Oppgavetittelen kan ikke være tom."
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
+#, c-format
+msgid "The task title must be at most %d characters."
+msgstr "Oppgavetittelen kan ha høyst %d tegn."
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
+#, c-format
+msgid "The description must be at most %d characters."
+msgstr "Beskrivelsen kan ha høyst %d tegn."
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
+msgid "Tasks"
+msgstr "Oppgaver"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
+#, c-format
+msgid "Total: %u"
+msgstr "Totalt: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
+#, c-format
+msgid "Pending: %u"
+msgstr "Venter: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
+#, c-format
+msgid "Completed: %u"
+msgstr "Fullført: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
+#, c-format
+msgid "Important: %u"
+msgstr "Viktig: %u"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:14
+msgid "Search Tasks"
+msgstr "Søk i oppgaver"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:20
+msgid "Filter by status"
+msgstr "Filtrer etter status"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:25
+msgid "All"
+msgstr "Alle"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:26
+msgid "Pending"
+msgstr "Venter"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:27
+msgid "Completed"
+msgstr "Fullført"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:50
+msgid "Filter tasks by name…"
+msgstr "Filtrer oppgaver etter navn…"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:64
+msgid "No Group Selected"
+msgstr "Ingen gruppe valgt"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:65
+msgid "Select a group to see its tasks."
+msgstr "Velg en gruppe for å se oppgavene."
+
+#: src/modules/Tasks/ui/task-list-panel.ui:76
+msgid "No Tasks Yet"
+msgstr "Ingen oppgaver ennå"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:77
+msgid "Add your first task to this group."
+msgstr "Legg til den første oppgaven i denne gruppen."
+
+#: src/modules/Backup/services/BackupSerializer.vala:57
+msgid "The backup file is not valid."
+msgstr "Sikkerhetskopifilen er ugyldig."
+
+#: src/modules/Tasks/ui/task-row.ui:28
+msgid "Toggle Completed"
+msgstr "Veksle fullført"
+
+#: src/modules/Tasks/ui/task-row.ui:44
+msgid "Show Description"
+msgstr "Vis beskrivelse"
+
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "Oppgavealternativer"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "Overskrift"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "Overskrift 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "Overskrift 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "Overskrift 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "Normal tekst"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "Fet"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "Kursiv"
+
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "Understreking"
+
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "Gjennomstreking"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "Tekstfarge"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "Punktliste"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "Nummerert liste"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
+msgid "Queue"
+msgstr "Queue"
+
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
+msgid "Task manager"
+msgstr "Oppgavebehandler"
+
+#: data/io.github.dprietob.queue.desktop.in:4
+msgid "Manage and organize tasks"
+msgstr "Administrer og organiser oppgaver"
+
+#: data/io.github.dprietob.queue.desktop.in:10
+msgid "task;manager;organize;"
+msgstr "oppgave;behandler;organiser;task;manager;"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
+msgid "Queue is a simple, fast task manager."
+msgstr "Queue er en enkel og rask oppgavebehandler."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr "Organiser oppgavene i grupper, merk dem som fullført eller viktige, endre rekkefølgen med dra og slipp, og hold dataene trygge med innebygde sikkerhetskopier."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
+msgid "Features:"
+msgstr "Funksjoner:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
+msgstr "Organiser oppgaver i egendefinerte, fargekodede grupper."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
+msgstr "Merk oppgaver som fullført eller viktige."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr "Skriv rike oppgavebeskrivelser med overskrifter, tekststiler, farger og lister."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "Se datoen da hver oppgave ble fullført."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "Endre rekkefølgen på grupper og oppgaver med dra og slipp."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
+msgstr "Eksporter og gjenopprett alle dataene dine som JSON."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
+msgstr "Lyst og mørkt utseende, tilgjengelig på flere språk."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
+msgid "Tasks organized by group"
+msgstr "Oppgaver organisert etter gruppe"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
+msgid "Dark style"
+msgstr "Mørkt utseende"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
+msgid "Create and edit tasks with details"
+msgstr "Opprett og rediger oppgaver med detaljer"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr "Denne versjonen gir formaterte beskrivelser og flere forbedringer:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr "Formater oppgavebeskrivelser med overskrifter, fet, kursiv, understreking, gjennomstreking, tekstfarge og lister."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "Se fullføringsdatoen for ferdige oppgaver."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "Rediger og slett oppgaver og grupper fra en meny per element."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "Oppgavelisten bruker nå hele bredden av vinduet."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr "Oppgavebeskrivelser kan nå inneholde mye lengre tekst."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "La til oversettelser til polsk, russisk, koreansk, norsk, svensk, hindi og gresk."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
+msgid "Initial release."
+msgstr "Første utgivelse."
diff --git a/po/pl.po b/po/pl.po
new file mode 100644
index 0000000..f6b577a
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,454 @@
+# Polish translations for queue package.
+# Copyright (C) 2026 THE queue'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the queue package.
+# Automatically generated, 2026.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: queue\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
+"PO-Revision-Date: 2026-06-29 19:34+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
+msgid "Restart Queue to apply the new language."
+msgstr "Uruchom ponownie Queue, aby zastosować nowy język."
+
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
+msgid "New Group"
+msgstr "Nowa grupa"
+
+#: src/Window.vala:101
+msgid "Edit Group"
+msgstr "Edytuj grupę"
+
+#: src/Window.vala:108
+#, c-format
+msgid "\"%s\" and all of its tasks will be permanently deleted."
+msgstr "\"%s\" i wszystkie jej zadania zostaną trwale usunięte."
+
+#: src/Window.vala:110
+msgid "Delete Group?"
+msgstr "Usunąć grupę?"
+
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
+msgid "New Task"
+msgstr "Nowe zadanie"
+
+#: src/Window.vala:128
+msgid "Edit Task"
+msgstr "Edytuj zadanie"
+
+#: src/Window.vala:136
+#, c-format
+msgid "\"%s\" will be permanently deleted."
+msgstr "\"%s\" zostanie trwale usunięte."
+
+#: src/Window.vala:137
+msgid "Delete Task?"
+msgstr "Usunąć zadanie?"
+
+#: src/Window.vala:168
+msgid "Group name"
+msgstr "Nazwa grupy"
+
+#: src/Window.vala:187
+msgid "Color"
+msgstr "Kolor"
+
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
+msgid "Cancel"
+msgstr "Anuluj"
+
+#: src/Window.vala:193 src/Window.vala:266
+msgid "Save"
+msgstr "Zapisz"
+
+#: src/Window.vala:245
+msgid "Title"
+msgstr "Tytuł"
+
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
+msgid "Important"
+msgstr "Ważne"
+
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
+msgid "Delete"
+msgstr "Usuń"
+
+#: src/Window.vala:320
+msgid "Export Backup"
+msgstr "Eksportuj kopię zapasową"
+
+#: src/Window.vala:332
+msgid "Exporting Backup…"
+msgstr "Eksportowanie kopii zapasowej…"
+
+#: src/Window.vala:339
+msgid "Backup exported."
+msgstr "Kopia zapasowa wyeksportowana."
+
+#: src/Window.vala:347
+msgid "Restore Backup"
+msgstr "Przywróć kopię zapasową"
+
+#: src/Window.vala:364
+msgid "Restore Backup?"
+msgstr "Przywrócić kopię zapasową?"
+
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
+msgstr "Wszystkie obecne grupy i zadania zostaną trwale usunięte i zastąpione zawartością pliku kopii zapasowej."
+
+#: src/Window.vala:368
+msgid "Delete and Restore"
+msgstr "Usuń i przywróć"
+
+#: src/Window.vala:379
+msgid "Restoring Backup…"
+msgstr "Przywracanie kopii zapasowej…"
+
+#: src/Window.vala:390
+msgid "Backup restored."
+msgstr "Kopia zapasowa przywrócona."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
+msgid "The group name cannot be empty."
+msgstr "Nazwa grupy nie może być pusta."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
+#, c-format
+msgid "The group name must be at most %d characters."
+msgstr "Nazwa grupy może mieć najwyżej %d znaków."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
+msgid "A group with this name already exists."
+msgstr "Grupa o tej nazwie już istnieje."
+
+#: src/modules/Groups/ui/group-sidebar.ui:8
+msgid "Theme"
+msgstr "Motyw"
+
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
+msgid "Follow System"
+msgstr "Zgodnie z systemem"
+
+#: src/modules/Groups/ui/group-sidebar.ui:15
+msgid "Light"
+msgstr "Jasny"
+
+#: src/modules/Groups/ui/group-sidebar.ui:20
+msgid "Dark"
+msgstr "Ciemny"
+
+#: src/modules/Groups/ui/group-sidebar.ui:26
+msgid "Language"
+msgstr "Język"
+
+#: src/modules/Groups/ui/group-sidebar.ui:109
+msgid "Backup"
+msgstr "Kopia zapasowa"
+
+#: src/modules/Groups/ui/group-sidebar.ui:111
+msgid "Export Backup…"
+msgstr "Eksportuj kopię zapasową…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:115
+msgid "Restore Backup…"
+msgstr "Przywróć kopię zapasową…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:122
+msgid "About Queue"
+msgstr "O programie Queue"
+
+#: src/modules/Groups/ui/group-sidebar.ui:128
+msgid "Groups"
+msgstr "Grupy"
+
+#: src/modules/Groups/ui/group-sidebar.ui:137
+msgid "Main Menu"
+msgstr "Menu główne"
+
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
+msgid "Drag to reorder"
+msgstr "Przeciągnij, aby zmienić kolejność"
+
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "Opcje grupy"
+
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "Edytuj"
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
+msgid "The task title cannot be empty."
+msgstr "Tytuł zadania nie może być pusty."
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
+#, c-format
+msgid "The task title must be at most %d characters."
+msgstr "Tytuł zadania może mieć najwyżej %d znaków."
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
+#, c-format
+msgid "The description must be at most %d characters."
+msgstr "Opis może mieć najwyżej %d znaków."
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
+msgid "Tasks"
+msgstr "Zadania"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
+#, c-format
+msgid "Total: %u"
+msgstr "Razem: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
+#, c-format
+msgid "Pending: %u"
+msgstr "Oczekujące: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
+#, c-format
+msgid "Completed: %u"
+msgstr "Ukończone: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
+#, c-format
+msgid "Important: %u"
+msgstr "Ważne: %u"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:14
+msgid "Search Tasks"
+msgstr "Szukaj zadań"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:20
+msgid "Filter by status"
+msgstr "Filtruj według stanu"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:25
+msgid "All"
+msgstr "Wszystkie"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:26
+msgid "Pending"
+msgstr "Oczekujące"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:27
+msgid "Completed"
+msgstr "Ukończone"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:50
+msgid "Filter tasks by name…"
+msgstr "Filtruj zadania według nazwy…"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:64
+msgid "No Group Selected"
+msgstr "Nie wybrano grupy"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:65
+msgid "Select a group to see its tasks."
+msgstr "Wybierz grupę, aby zobaczyć jej zadania."
+
+#: src/modules/Tasks/ui/task-list-panel.ui:76
+msgid "No Tasks Yet"
+msgstr "Brak zadań"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:77
+msgid "Add your first task to this group."
+msgstr "Dodaj pierwsze zadanie do tej grupy."
+
+#: src/modules/Backup/services/BackupSerializer.vala:57
+msgid "The backup file is not valid."
+msgstr "Plik kopii zapasowej jest nieprawidłowy."
+
+#: src/modules/Tasks/ui/task-row.ui:28
+msgid "Toggle Completed"
+msgstr "Przełącz ukończenie"
+
+#: src/modules/Tasks/ui/task-row.ui:44
+msgid "Show Description"
+msgstr "Pokaż opis"
+
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "Opcje zadania"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "Nagłówek"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "Nagłówek 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "Nagłówek 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "Nagłówek 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "Tekst zwykły"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "Pogrubienie"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "Kursywa"
+
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "Podkreślenie"
+
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "Przekreślenie"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "Kolor tekstu"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "Lista wypunktowana"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "Lista numerowana"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
+msgid "Queue"
+msgstr "Queue"
+
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
+msgid "Task manager"
+msgstr "Menedżer zadań"
+
+#: data/io.github.dprietob.queue.desktop.in:4
+msgid "Manage and organize tasks"
+msgstr "Zarządzaj i organizuj zadania"
+
+#: data/io.github.dprietob.queue.desktop.in:10
+msgid "task;manager;organize;"
+msgstr "zadanie;menedżer;organizuj;task;manager;"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
+msgid "Queue is a simple, fast task manager."
+msgstr "Queue to prosty i szybki menedżer zadań."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr "Organizuj zadania w grupy, oznaczaj je jako ukończone lub ważne, zmieniaj ich kolejność przeciąganiem i chroń dane dzięki wbudowanym kopiom zapasowym."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
+msgid "Features:"
+msgstr "Funkcje:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
+msgstr "Organizuj zadania w niestandardowe, kolorowe grupy."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
+msgstr "Oznaczaj zadania jako ukończone lub ważne."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr "Twórz rozbudowane opisy zadań z nagłówkami, stylami tekstu, kolorami i listami."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "Sprawdzaj datę ukończenia każdego zadania."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "Zmieniaj kolejność grup i zadań przeciąganiem."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
+msgstr "Eksportuj i przywracaj wszystkie dane w formacie JSON."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
+msgstr "Jasny i ciemny styl, dostępne w wielu językach."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
+msgid "Tasks organized by group"
+msgstr "Zadania uporządkowane według grup"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
+msgid "Dark style"
+msgstr "Ciemny styl"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
+msgid "Create and edit tasks with details"
+msgstr "Twórz i edytuj zadania ze szczegółami"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr "Ta wersja wprowadza sformatowane opisy i kilka usprawnień:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr "Formatuj opisy zadań za pomocą nagłówków, pogrubienia, kursywy, podkreślenia, przekreślenia, koloru tekstu i list."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "Sprawdzaj datę ukończenia zakończonych zadań."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "Edytuj i usuwaj zadania oraz grupy z menu przy każdym elemencie."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "Lista zadań korzysta teraz z pełnej szerokości okna."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr "Opisy zadań mogą teraz zawierać znacznie dłuższy tekst."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "Dodano tłumaczenia na polski, rosyjski, koreański, norweski, szwedzki, hindi i grecki."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
+msgid "Initial release."
+msgstr "Pierwsze wydanie."
diff --git a/po/pt.po b/po/pt.po
index b6d20b9..12591bd 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -4,9 +4,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: queue 1.0.0\n"
+"Project-Id-Version: queue 1.1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-06-27 02:58+0200\n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
"PO-Revision-Date: 2026-06-27 00:00+0000\n"
"Last-Translator: Daniel Prieto\n"
"Language-Team: Portuguese\n"
@@ -16,257 +16,461 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
msgid "Restart Queue to apply the new language."
msgstr "Reinicie o Queue para aplicar o novo idioma."
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
msgid "New Group"
msgstr "Novo grupo"
+#: src/Window.vala:101
msgid "Edit Group"
msgstr "Editar grupo"
+#: src/Window.vala:108
#, c-format
msgid "\"%s\" and all of its tasks will be permanently deleted."
msgstr "«%s» e todas as suas tarefas serão eliminados permanentemente."
+#: src/Window.vala:110
msgid "Delete Group?"
msgstr "Eliminar grupo?"
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
msgid "New Task"
msgstr "Nova tarefa"
+#: src/Window.vala:128
msgid "Edit Task"
msgstr "Editar tarefa"
+#: src/Window.vala:136
#, c-format
msgid "\"%s\" will be permanently deleted."
msgstr "«%s» será eliminada permanentemente."
+#: src/Window.vala:137
msgid "Delete Task?"
msgstr "Eliminar tarefa?"
+#: src/Window.vala:168
msgid "Group name"
msgstr "Nome do grupo"
+#: src/Window.vala:187
msgid "Color"
msgstr "Cor"
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
msgid "Cancel"
msgstr "Cancelar"
+#: src/Window.vala:193 src/Window.vala:266
msgid "Save"
msgstr "Guardar"
+#: src/Window.vala:245
msgid "Title"
msgstr "Título"
-msgid "Description (optional)"
-msgstr "Descrição (opcional)"
-
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
msgid "Important"
msgstr "Importante"
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
msgid "Delete"
msgstr "Eliminar"
+#: src/Window.vala:320
msgid "Export Backup"
msgstr "Exportar cópia de segurança"
+#: src/Window.vala:332
msgid "Exporting Backup…"
msgstr "A exportar cópia de segurança…"
+#: src/Window.vala:339
msgid "Backup exported."
msgstr "Cópia de segurança exportada."
+#: src/Window.vala:347
msgid "Restore Backup"
msgstr "Restaurar cópia de segurança"
+#: src/Window.vala:364
msgid "Restore Backup?"
msgstr "Restaurar cópia de segurança?"
-msgid "All current groups and tasks will be permanently deleted and replaced with the contents of the backup file."
-msgstr "Todos os grupos e tarefas atuais serão eliminados permanentemente e substituídos pelo conteúdo do ficheiro de cópia de segurança."
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
+msgstr ""
+"Todos os grupos e tarefas atuais serão eliminados permanentemente e "
+"substituídos pelo conteúdo do ficheiro de cópia de segurança."
+#: src/Window.vala:368
msgid "Delete and Restore"
msgstr "Eliminar e restaurar"
+#: src/Window.vala:379
msgid "Restoring Backup…"
msgstr "A restaurar cópia de segurança…"
+#: src/Window.vala:390
msgid "Backup restored."
msgstr "Cópia de segurança restaurada."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
msgid "The group name cannot be empty."
msgstr "O nome do grupo não pode estar vazio."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
#, c-format
msgid "The group name must be at most %d characters."
msgstr "O nome do grupo deve ter no máximo %d caracteres."
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
msgid "A group with this name already exists."
msgstr "Já existe um grupo com este nome."
+#: src/modules/Groups/ui/group-sidebar.ui:8
msgid "Theme"
msgstr "Tema"
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
msgid "Follow System"
msgstr "Seguir o sistema"
+#: src/modules/Groups/ui/group-sidebar.ui:15
msgid "Light"
msgstr "Claro"
+#: src/modules/Groups/ui/group-sidebar.ui:20
msgid "Dark"
msgstr "Escuro"
+#: src/modules/Groups/ui/group-sidebar.ui:26
msgid "Language"
msgstr "Idioma"
+#: src/modules/Groups/ui/group-sidebar.ui:109
msgid "Backup"
msgstr "Cópia de segurança"
+#: src/modules/Groups/ui/group-sidebar.ui:111
msgid "Export Backup…"
msgstr "Exportar cópia de segurança…"
+#: src/modules/Groups/ui/group-sidebar.ui:115
msgid "Restore Backup…"
msgstr "Restaurar cópia de segurança…"
+#: src/modules/Groups/ui/group-sidebar.ui:122
msgid "About Queue"
msgstr "Acerca do Queue"
+#: src/modules/Groups/ui/group-sidebar.ui:128
msgid "Groups"
msgstr "Grupos"
+#: src/modules/Groups/ui/group-sidebar.ui:137
msgid "Main Menu"
msgstr "Menu principal"
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
msgid "Drag to reorder"
msgstr "Arraste para reordenar"
-msgid "Rename Group"
-msgstr "Renomear grupo"
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "Opções do grupo"
-msgid "Delete Group"
-msgstr "Eliminar grupo"
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "Editar"
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
msgid "The task title cannot be empty."
msgstr "O título da tarefa não pode estar vazio."
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
#, c-format
msgid "The task title must be at most %d characters."
msgstr "O título da tarefa deve ter no máximo %d caracteres."
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
#, c-format
msgid "The description must be at most %d characters."
msgstr "A descrição deve ter no máximo %d caracteres."
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
msgid "Tasks"
msgstr "Tarefas"
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
#, c-format
msgid "Total: %u"
msgstr "Total: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
#, c-format
msgid "Pending: %u"
msgstr "Pendentes: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
#, c-format
msgid "Completed: %u"
msgstr "Concluídas: %u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
#, c-format
msgid "Important: %u"
msgstr "Importantes: %u"
+#: src/modules/Tasks/ui/task-list-panel.ui:14
msgid "Search Tasks"
msgstr "Procurar tarefas"
+#: src/modules/Tasks/ui/task-list-panel.ui:20
msgid "Filter by status"
msgstr "Filtrar por estado"
+#: src/modules/Tasks/ui/task-list-panel.ui:25
msgid "All"
msgstr "Todas"
+#: src/modules/Tasks/ui/task-list-panel.ui:26
msgid "Pending"
msgstr "Pendentes"
+#: src/modules/Tasks/ui/task-list-panel.ui:27
msgid "Completed"
msgstr "Concluídas"
+#: src/modules/Tasks/ui/task-list-panel.ui:50
msgid "Filter tasks by name…"
msgstr "Filtrar tarefas por nome…"
+#: src/modules/Tasks/ui/task-list-panel.ui:64
msgid "No Group Selected"
msgstr "Nenhum grupo selecionado"
+#: src/modules/Tasks/ui/task-list-panel.ui:65
msgid "Select a group to see its tasks."
msgstr "Selecione um grupo para ver as suas tarefas."
+#: src/modules/Tasks/ui/task-list-panel.ui:76
msgid "No Tasks Yet"
msgstr "Ainda sem tarefas"
+#: src/modules/Tasks/ui/task-list-panel.ui:77
msgid "Add your first task to this group."
msgstr "Adicione a sua primeira tarefa a este grupo."
+#: src/modules/Backup/services/BackupSerializer.vala:57
msgid "The backup file is not valid."
msgstr "O ficheiro de cópia de segurança não é válido."
+#: src/modules/Tasks/ui/task-row.ui:28
msgid "Toggle Completed"
msgstr "Alternar concluída"
+#: src/modules/Tasks/ui/task-row.ui:44
msgid "Show Description"
msgstr "Mostrar descrição"
-msgid "Delete Task"
-msgstr "Eliminar tarefa"
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "Opções da tarefa"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "Cabeçalho"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "Cabeçalho 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "Cabeçalho 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "Cabeçalho 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "Texto normal"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "Negrito"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "Itálico"
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "Sublinhado"
+
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "Riscado"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "Cor do texto"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "Lista com marcadores"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "Lista numerada"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
msgid "Queue"
msgstr "Queue"
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
msgid "Task manager"
msgstr "Gestor de tarefas"
+#: data/io.github.dprietob.queue.desktop.in:4
msgid "Manage and organize tasks"
msgstr "Gerir e organizar tarefas"
+#: data/io.github.dprietob.queue.desktop.in:10
msgid "task;manager;organize;"
msgstr "tarefa;tarefas;gestor;organizar;"
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
msgid "Queue is a simple, fast task manager."
msgstr "O Queue é um gestor de tarefas simples e rápido."
-msgid "Organize your tasks into groups, mark them as done or important, reorder them with drag and drop, and keep your data safe with built-in backups."
-msgstr "Organize as suas tarefas em grupos, marque-as como concluídas ou importantes, reordene-as arrastando e mantenha os seus dados seguros com cópias de segurança integradas."
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr ""
+"Organize as suas tarefas em grupos, marque-as como concluídas ou "
+"importantes, reordene-as arrastando e mantenha os seus dados seguros com "
+"cópias de segurança integradas."
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
msgid "Features:"
msgstr "Funcionalidades:"
-msgid "Organize tasks into custom, color-coded groups"
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
msgstr "Organize as tarefas em grupos personalizados e coloridos"
-msgid "Mark tasks as completed or important"
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
msgstr "Marque as tarefas como concluídas ou importantes"
-msgid "Add optional descriptions and reorder by dragging"
-msgstr "Adicione descrições opcionais e reordene arrastando"
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr ""
+"Escreva descrições formatadas com cabeçalhos, estilos de texto, cores e "
+"listas."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "Veja a data em que cada tarefa foi concluída."
-msgid "Export and restore all your data as JSON"
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "Reordene grupos e tarefas arrastando e soltando."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
msgstr "Exporte e restaure todos os seus dados em JSON"
-msgid "Light and dark styles, available in several languages"
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
msgstr "Estilos claro e escuro, disponível em vários idiomas"
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
msgid "Tasks organized by group"
msgstr "Tarefas organizadas por grupo"
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
msgid "Dark style"
msgstr "Estilo escuro"
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
msgid "Create and edit tasks with details"
msgstr "Criar e editar tarefas com detalhes"
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr "Esta versão traz descrições com texto formatado e várias melhorias:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr ""
+"Formate as descrições com cabeçalhos, negrito, itálico, sublinhado, riscado, "
+"cor do texto e listas."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "Veja a data de conclusão das tarefas concluídas."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "Edite e elimine tarefas e grupos a partir de um menu em cada item."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "A lista de tarefas agora ocupa toda a largura da janela."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr "As descrições de tarefas agora podem conter textos muito mais longos."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "Adicionadas as traduções para polaco, russo, coreano, norueguês, sueco, hindi e grego."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
msgid "Initial release."
msgstr "Versão inicial."
-msgid "Daniel Prieto"
-msgstr "Daniel Prieto"
+#~ msgid "Description (optional)"
+#~ msgstr "Descrição (opcional)"
+
+#~ msgid "Rename Group"
+#~ msgstr "Renomear grupo"
+
+#~ msgid "Delete Group"
+#~ msgstr "Eliminar grupo"
+
+#~ msgid "Delete Task"
+#~ msgstr "Eliminar tarefa"
+
+#~ msgid "Add optional descriptions and reorder by dragging"
+#~ msgstr "Adicione descrições opcionais e reordene arrastando"
diff --git a/po/queue.pot b/po/queue.pot
index 7b4d1df..2b00ae5 100644
--- a/po/queue.pot
+++ b/po/queue.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: queue\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-06-27 03:18+0200\n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -23,7 +23,7 @@ msgstr ""
msgid "Restart Queue to apply the new language."
msgstr ""
-#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:110
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
msgid "New Group"
msgstr ""
@@ -40,12 +40,12 @@ msgstr ""
msgid "Delete Group?"
msgstr ""
-#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:21
-#: src/modules/Tasks/ui/task-list-panel.ui:76
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
msgid "New Task"
msgstr ""
-#: src/Window.vala:128 src/modules/Tasks/ui/task-row.ui:65
+#: src/Window.vala:128
msgid "Edit Task"
msgstr ""
@@ -58,74 +58,71 @@ msgstr ""
msgid "Delete Task?"
msgstr ""
-#: src/Window.vala:159
+#: src/Window.vala:168
msgid "Group name"
msgstr ""
-#: src/Window.vala:176
+#: src/Window.vala:187
msgid "Color"
msgstr ""
-#: src/Window.vala:186 src/Window.vala:260 src/Window.vala:313
-#: src/Window.vala:378
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
msgid "Cancel"
msgstr ""
-#: src/Window.vala:187 src/Window.vala:261
+#: src/Window.vala:193 src/Window.vala:266
msgid "Save"
msgstr ""
-#: src/Window.vala:220
-msgid "Title"
-msgstr ""
-
#: src/Window.vala:245
-msgid "Description (optional)"
+msgid "Title"
msgstr ""
-#: src/Window.vala:255 src/modules/Tasks/ui/task-row.ui:55
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
msgid "Important"
msgstr ""
-#: src/Window.vala:314
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
msgid "Delete"
msgstr ""
-#: src/Window.vala:330
+#: src/Window.vala:320
msgid "Export Backup"
msgstr ""
-#: src/Window.vala:342
+#: src/Window.vala:332
msgid "Exporting Backup…"
msgstr ""
-#: src/Window.vala:349
+#: src/Window.vala:339
msgid "Backup exported."
msgstr ""
-#: src/Window.vala:357
+#: src/Window.vala:347
msgid "Restore Backup"
msgstr ""
-#: src/Window.vala:374
+#: src/Window.vala:364
msgid "Restore Backup?"
msgstr ""
-#: src/Window.vala:376
+#: src/Window.vala:365
msgid ""
"All current groups and tasks will be permanently deleted and replaced with "
"the contents of the backup file."
msgstr ""
-#: src/Window.vala:379
+#: src/Window.vala:368
msgid "Delete and Restore"
msgstr ""
-#: src/Window.vala:390
+#: src/Window.vala:379
msgid "Restoring Backup…"
msgstr ""
-#: src/Window.vala:401
+#: src/Window.vala:390
msgid "Backup restored."
msgstr ""
@@ -163,27 +160,27 @@ msgstr ""
msgid "Language"
msgstr ""
-#: src/modules/Groups/ui/group-sidebar.ui:74
+#: src/modules/Groups/ui/group-sidebar.ui:109
msgid "Backup"
msgstr ""
-#: src/modules/Groups/ui/group-sidebar.ui:76
+#: src/modules/Groups/ui/group-sidebar.ui:111
msgid "Export Backup…"
msgstr ""
-#: src/modules/Groups/ui/group-sidebar.ui:80
+#: src/modules/Groups/ui/group-sidebar.ui:115
msgid "Restore Backup…"
msgstr ""
-#: src/modules/Groups/ui/group-sidebar.ui:87
+#: src/modules/Groups/ui/group-sidebar.ui:122
msgid "About Queue"
msgstr ""
-#: src/modules/Groups/ui/group-sidebar.ui:93
+#: src/modules/Groups/ui/group-sidebar.ui:128
msgid "Groups"
msgstr ""
-#: src/modules/Groups/ui/group-sidebar.ui:102
+#: src/modules/Groups/ui/group-sidebar.ui:137
msgid "Main Menu"
msgstr ""
@@ -192,11 +189,11 @@ msgid "Drag to reorder"
msgstr ""
#: src/modules/Groups/ui/group-row.ui:33
-msgid "Rename Group"
+msgid "Group Options"
msgstr ""
-#: src/modules/Groups/ui/group-row.ui:43
-msgid "Delete Group"
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
msgstr ""
#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
@@ -242,43 +239,43 @@ msgstr ""
msgid "Search Tasks"
msgstr ""
-#: src/modules/Tasks/ui/task-list-panel.ui:27
+#: src/modules/Tasks/ui/task-list-panel.ui:20
msgid "Filter by status"
msgstr ""
-#: src/modules/Tasks/ui/task-list-panel.ui:32
+#: src/modules/Tasks/ui/task-list-panel.ui:25
msgid "All"
msgstr ""
-#: src/modules/Tasks/ui/task-list-panel.ui:33
+#: src/modules/Tasks/ui/task-list-panel.ui:26
msgid "Pending"
msgstr ""
-#: src/modules/Tasks/ui/task-list-panel.ui:34
+#: src/modules/Tasks/ui/task-list-panel.ui:27
msgid "Completed"
msgstr ""
-#: src/modules/Tasks/ui/task-list-panel.ui:46
+#: src/modules/Tasks/ui/task-list-panel.ui:50
msgid "Filter tasks by name…"
msgstr ""
-#: src/modules/Tasks/ui/task-list-panel.ui:60
+#: src/modules/Tasks/ui/task-list-panel.ui:64
msgid "No Group Selected"
msgstr ""
-#: src/modules/Tasks/ui/task-list-panel.ui:61
+#: src/modules/Tasks/ui/task-list-panel.ui:65
msgid "Select a group to see its tasks."
msgstr ""
-#: src/modules/Tasks/ui/task-list-panel.ui:72
+#: src/modules/Tasks/ui/task-list-panel.ui:76
msgid "No Tasks Yet"
msgstr ""
-#: src/modules/Tasks/ui/task-list-panel.ui:73
+#: src/modules/Tasks/ui/task-list-panel.ui:77
msgid "Add your first task to this group."
msgstr ""
-#: src/modules/Backup/services/BackupSerializer.vala:56
+#: src/modules/Backup/services/BackupSerializer.vala:57
msgid "The backup file is not valid."
msgstr ""
@@ -291,77 +288,166 @@ msgid "Show Description"
msgstr ""
#: src/modules/Tasks/ui/task-row.ui:75
-msgid "Delete Task"
+msgid "Task Options"
msgstr ""
-#: data/com.dprietob.queue.desktop.in:2
-#: data/com.dprietob.queue.metainfo.xml.in:5
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr ""
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr ""
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr ""
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr ""
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr ""
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr ""
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr ""
+
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr ""
+
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr ""
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr ""
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr ""
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr ""
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
msgid "Queue"
msgstr ""
-#: data/com.dprietob.queue.desktop.in:3
-#: data/com.dprietob.queue.metainfo.xml.in:6
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
msgid "Task manager"
msgstr ""
-#: data/com.dprietob.queue.desktop.in:4
+#: data/io.github.dprietob.queue.desktop.in:4
msgid "Manage and organize tasks"
msgstr ""
-#: data/com.dprietob.queue.desktop.in:10
+#: data/io.github.dprietob.queue.desktop.in:10
msgid "task;manager;organize;"
msgstr ""
-#: data/com.dprietob.queue.metainfo.xml.in:12
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
msgid "Daniel Prieto"
msgstr ""
-#: data/com.dprietob.queue.metainfo.xml.in:16
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
msgid "Queue is a simple, fast task manager."
msgstr ""
-#: data/com.dprietob.queue.metainfo.xml.in:19
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
msgid ""
"Organize your tasks into groups, mark them as done or important, reorder "
"them with drag and drop, and keep your data safe with built-in backups."
msgstr ""
-#: data/com.dprietob.queue.metainfo.xml.in:23
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
msgid "Features:"
msgstr ""
-#: data/com.dprietob.queue.metainfo.xml.in:25
-msgid "Organize tasks into custom, color-coded groups"
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
msgstr ""
-#: data/com.dprietob.queue.metainfo.xml.in:26
-msgid "Mark tasks as completed or important"
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
msgstr ""
-#: data/com.dprietob.queue.metainfo.xml.in:27
-msgid "Add optional descriptions and reorder by dragging"
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr ""
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
msgstr ""
-#: data/com.dprietob.queue.metainfo.xml.in:28
-msgid "Export and restore all your data as JSON"
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
msgstr ""
-#: data/com.dprietob.queue.metainfo.xml.in:29
-msgid "Light and dark styles, available in several languages"
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
msgstr ""
-#: data/com.dprietob.queue.metainfo.xml.in:41
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
+msgstr ""
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
msgid "Tasks organized by group"
msgstr ""
-#: data/com.dprietob.queue.metainfo.xml.in:45
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
msgid "Dark style"
msgstr ""
-#: data/com.dprietob.queue.metainfo.xml.in:49
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
msgid "Create and edit tasks with details"
msgstr ""
-#: data/com.dprietob.queue.metainfo.xml.in:62
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr ""
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr ""
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr ""
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr ""
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr ""
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr ""
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr ""
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
msgid "Initial release."
msgstr ""
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..e3a5b18
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,454 @@
+# Russian translations for queue package.
+# Copyright (C) 2026 THE queue'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the queue package.
+# Automatically generated, 2026.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: queue\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
+"PO-Revision-Date: 2026-06-29 19:34+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
+msgid "Restart Queue to apply the new language."
+msgstr "Перезапустите Queue, чтобы применить новый язык."
+
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
+msgid "New Group"
+msgstr "Новая группа"
+
+#: src/Window.vala:101
+msgid "Edit Group"
+msgstr "Изменить группу"
+
+#: src/Window.vala:108
+#, c-format
+msgid "\"%s\" and all of its tasks will be permanently deleted."
+msgstr "\"%s\" и все её задачи будут безвозвратно удалены."
+
+#: src/Window.vala:110
+msgid "Delete Group?"
+msgstr "Удалить группу?"
+
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
+msgid "New Task"
+msgstr "Новая задача"
+
+#: src/Window.vala:128
+msgid "Edit Task"
+msgstr "Изменить задачу"
+
+#: src/Window.vala:136
+#, c-format
+msgid "\"%s\" will be permanently deleted."
+msgstr "\"%s\" будет безвозвратно удалена."
+
+#: src/Window.vala:137
+msgid "Delete Task?"
+msgstr "Удалить задачу?"
+
+#: src/Window.vala:168
+msgid "Group name"
+msgstr "Название группы"
+
+#: src/Window.vala:187
+msgid "Color"
+msgstr "Цвет"
+
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
+msgid "Cancel"
+msgstr "Отмена"
+
+#: src/Window.vala:193 src/Window.vala:266
+msgid "Save"
+msgstr "Сохранить"
+
+#: src/Window.vala:245
+msgid "Title"
+msgstr "Название"
+
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
+msgid "Important"
+msgstr "Важно"
+
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
+msgid "Delete"
+msgstr "Удалить"
+
+#: src/Window.vala:320
+msgid "Export Backup"
+msgstr "Экспорт резервной копии"
+
+#: src/Window.vala:332
+msgid "Exporting Backup…"
+msgstr "Экспорт резервной копии…"
+
+#: src/Window.vala:339
+msgid "Backup exported."
+msgstr "Резервная копия экспортирована."
+
+#: src/Window.vala:347
+msgid "Restore Backup"
+msgstr "Восстановить из копии"
+
+#: src/Window.vala:364
+msgid "Restore Backup?"
+msgstr "Восстановить из копии?"
+
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
+msgstr "Все текущие группы и задачи будут безвозвратно удалены и заменены содержимым файла резервной копии."
+
+#: src/Window.vala:368
+msgid "Delete and Restore"
+msgstr "Удалить и восстановить"
+
+#: src/Window.vala:379
+msgid "Restoring Backup…"
+msgstr "Восстановление из копии…"
+
+#: src/Window.vala:390
+msgid "Backup restored."
+msgstr "Резервная копия восстановлена."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
+msgid "The group name cannot be empty."
+msgstr "Название группы не может быть пустым."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
+#, c-format
+msgid "The group name must be at most %d characters."
+msgstr "Название группы не должно превышать %d символов."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
+msgid "A group with this name already exists."
+msgstr "Группа с таким названием уже существует."
+
+#: src/modules/Groups/ui/group-sidebar.ui:8
+msgid "Theme"
+msgstr "Тема"
+
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
+msgid "Follow System"
+msgstr "Как в системе"
+
+#: src/modules/Groups/ui/group-sidebar.ui:15
+msgid "Light"
+msgstr "Светлая"
+
+#: src/modules/Groups/ui/group-sidebar.ui:20
+msgid "Dark"
+msgstr "Тёмная"
+
+#: src/modules/Groups/ui/group-sidebar.ui:26
+msgid "Language"
+msgstr "Язык"
+
+#: src/modules/Groups/ui/group-sidebar.ui:109
+msgid "Backup"
+msgstr "Резервная копия"
+
+#: src/modules/Groups/ui/group-sidebar.ui:111
+msgid "Export Backup…"
+msgstr "Экспортировать резервную копию…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:115
+msgid "Restore Backup…"
+msgstr "Восстановить из копии…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:122
+msgid "About Queue"
+msgstr "О приложении Queue"
+
+#: src/modules/Groups/ui/group-sidebar.ui:128
+msgid "Groups"
+msgstr "Группы"
+
+#: src/modules/Groups/ui/group-sidebar.ui:137
+msgid "Main Menu"
+msgstr "Главное меню"
+
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
+msgid "Drag to reorder"
+msgstr "Перетащите для изменения порядка"
+
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "Параметры группы"
+
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "Изменить"
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
+msgid "The task title cannot be empty."
+msgstr "Заголовок задачи не может быть пустым."
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
+#, c-format
+msgid "The task title must be at most %d characters."
+msgstr "Заголовок задачи не должен превышать %d символов."
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
+#, c-format
+msgid "The description must be at most %d characters."
+msgstr "Описание не должно превышать %d символов."
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
+msgid "Tasks"
+msgstr "Задачи"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
+#, c-format
+msgid "Total: %u"
+msgstr "Всего: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
+#, c-format
+msgid "Pending: %u"
+msgstr "Ожидают: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
+#, c-format
+msgid "Completed: %u"
+msgstr "Завершено: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
+#, c-format
+msgid "Important: %u"
+msgstr "Важные: %u"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:14
+msgid "Search Tasks"
+msgstr "Поиск задач"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:20
+msgid "Filter by status"
+msgstr "Фильтр по статусу"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:25
+msgid "All"
+msgstr "Все"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:26
+msgid "Pending"
+msgstr "Ожидающие"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:27
+msgid "Completed"
+msgstr "Завершённые"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:50
+msgid "Filter tasks by name…"
+msgstr "Фильтровать задачи по имени…"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:64
+msgid "No Group Selected"
+msgstr "Группа не выбрана"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:65
+msgid "Select a group to see its tasks."
+msgstr "Выберите группу, чтобы увидеть её задачи."
+
+#: src/modules/Tasks/ui/task-list-panel.ui:76
+msgid "No Tasks Yet"
+msgstr "Пока нет задач"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:77
+msgid "Add your first task to this group."
+msgstr "Добавьте первую задачу в эту группу."
+
+#: src/modules/Backup/services/BackupSerializer.vala:57
+msgid "The backup file is not valid."
+msgstr "Файл резервной копии недействителен."
+
+#: src/modules/Tasks/ui/task-row.ui:28
+msgid "Toggle Completed"
+msgstr "Отметить выполнение"
+
+#: src/modules/Tasks/ui/task-row.ui:44
+msgid "Show Description"
+msgstr "Показать описание"
+
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "Параметры задачи"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "Заголовок"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "Заголовок 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "Заголовок 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "Заголовок 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "Обычный текст"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "Полужирный"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "Курсив"
+
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "Подчёркнутый"
+
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "Зачёркнутый"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "Цвет текста"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "Маркированный список"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "Нумерованный список"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
+msgid "Queue"
+msgstr "Queue"
+
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
+msgid "Task manager"
+msgstr "Менеджер задач"
+
+#: data/io.github.dprietob.queue.desktop.in:4
+msgid "Manage and organize tasks"
+msgstr "Управляйте задачами и организуйте их"
+
+#: data/io.github.dprietob.queue.desktop.in:10
+msgid "task;manager;organize;"
+msgstr "задача;менеджер;органайзер;task;manager;"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
+msgid "Queue is a simple, fast task manager."
+msgstr "Queue — простой и быстрый менеджер задач."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr "Организуйте задачи по группам, отмечайте их как выполненные или важные, меняйте порядок перетаскиванием и храните данные в безопасности благодаря встроенным резервным копиям."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
+msgid "Features:"
+msgstr "Возможности:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
+msgstr "Организуйте задачи в настраиваемые цветные группы."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
+msgstr "Отмечайте задачи как выполненные или важные."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr "Создавайте насыщенные описания задач с заголовками, стилями текста, цветами и списками."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "Смотрите дату выполнения каждой задачи."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "Меняйте порядок групп и задач перетаскиванием."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
+msgstr "Экспортируйте и восстанавливайте все данные в формате JSON."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
+msgstr "Светлая и тёмная темы, доступно на нескольких языках."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
+msgid "Tasks organized by group"
+msgstr "Задачи, упорядоченные по группам"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
+msgid "Dark style"
+msgstr "Тёмная тема"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
+msgid "Create and edit tasks with details"
+msgstr "Создавайте и редактируйте задачи с подробностями"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr "В этом выпуске появились форматированные описания и ряд улучшений:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr "Форматируйте описания задач с помощью заголовков, полужирного, курсива, подчёркивания, зачёркивания, цвета текста и списков."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "Смотрите дату завершения выполненных задач."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "Изменяйте и удаляйте задачи и группы из меню у каждого элемента."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "Список задач теперь использует всю ширину окна."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr "Описания задач теперь могут содержать гораздо более длинный текст."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "Добавлены переводы на польский, русский, корейский, норвежский, шведский, хинди и греческий."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
+msgid "Initial release."
+msgstr "Первый выпуск."
diff --git a/po/sv.po b/po/sv.po
new file mode 100644
index 0000000..72eaf75
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,453 @@
+# Swedish translations for queue package.
+# Copyright (C) 2026 THE queue'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the queue package.
+# Automatically generated, 2026.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: queue\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
+"PO-Revision-Date: 2026-06-29 19:34+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: sv\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"
+
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
+msgid "Restart Queue to apply the new language."
+msgstr "Starta om Queue för att tillämpa det nya språket."
+
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
+msgid "New Group"
+msgstr "Ny grupp"
+
+#: src/Window.vala:101
+msgid "Edit Group"
+msgstr "Redigera grupp"
+
+#: src/Window.vala:108
+#, c-format
+msgid "\"%s\" and all of its tasks will be permanently deleted."
+msgstr "\"%s\" och alla dess uppgifter raderas permanent."
+
+#: src/Window.vala:110
+msgid "Delete Group?"
+msgstr "Ta bort grupp?"
+
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
+msgid "New Task"
+msgstr "Ny uppgift"
+
+#: src/Window.vala:128
+msgid "Edit Task"
+msgstr "Redigera uppgift"
+
+#: src/Window.vala:136
+#, c-format
+msgid "\"%s\" will be permanently deleted."
+msgstr "\"%s\" raderas permanent."
+
+#: src/Window.vala:137
+msgid "Delete Task?"
+msgstr "Ta bort uppgift?"
+
+#: src/Window.vala:168
+msgid "Group name"
+msgstr "Gruppnamn"
+
+#: src/Window.vala:187
+msgid "Color"
+msgstr "Färg"
+
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: src/Window.vala:193 src/Window.vala:266
+msgid "Save"
+msgstr "Spara"
+
+#: src/Window.vala:245
+msgid "Title"
+msgstr "Titel"
+
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
+msgid "Important"
+msgstr "Viktig"
+
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
+msgid "Delete"
+msgstr "Ta bort"
+
+#: src/Window.vala:320
+msgid "Export Backup"
+msgstr "Exportera säkerhetskopia"
+
+#: src/Window.vala:332
+msgid "Exporting Backup…"
+msgstr "Exporterar säkerhetskopia…"
+
+#: src/Window.vala:339
+msgid "Backup exported."
+msgstr "Säkerhetskopia exporterad."
+
+#: src/Window.vala:347
+msgid "Restore Backup"
+msgstr "Återställ säkerhetskopia"
+
+#: src/Window.vala:364
+msgid "Restore Backup?"
+msgstr "Återställa säkerhetskopia?"
+
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
+msgstr "Alla nuvarande grupper och uppgifter raderas permanent och ersätts med innehållet i säkerhetskopian."
+
+#: src/Window.vala:368
+msgid "Delete and Restore"
+msgstr "Ta bort och återställ"
+
+#: src/Window.vala:379
+msgid "Restoring Backup…"
+msgstr "Återställer säkerhetskopia…"
+
+#: src/Window.vala:390
+msgid "Backup restored."
+msgstr "Säkerhetskopia återställd."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
+msgid "The group name cannot be empty."
+msgstr "Gruppnamnet kan inte vara tomt."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
+#, c-format
+msgid "The group name must be at most %d characters."
+msgstr "Gruppnamnet får vara högst %d tecken."
+
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
+msgid "A group with this name already exists."
+msgstr "En grupp med detta namn finns redan."
+
+#: src/modules/Groups/ui/group-sidebar.ui:8
+msgid "Theme"
+msgstr "Tema"
+
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
+msgid "Follow System"
+msgstr "Följ systemet"
+
+#: src/modules/Groups/ui/group-sidebar.ui:15
+msgid "Light"
+msgstr "Ljust"
+
+#: src/modules/Groups/ui/group-sidebar.ui:20
+msgid "Dark"
+msgstr "Mörkt"
+
+#: src/modules/Groups/ui/group-sidebar.ui:26
+msgid "Language"
+msgstr "Språk"
+
+#: src/modules/Groups/ui/group-sidebar.ui:109
+msgid "Backup"
+msgstr "Säkerhetskopia"
+
+#: src/modules/Groups/ui/group-sidebar.ui:111
+msgid "Export Backup…"
+msgstr "Exportera säkerhetskopia…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:115
+msgid "Restore Backup…"
+msgstr "Återställ säkerhetskopia…"
+
+#: src/modules/Groups/ui/group-sidebar.ui:122
+msgid "About Queue"
+msgstr "Om Queue"
+
+#: src/modules/Groups/ui/group-sidebar.ui:128
+msgid "Groups"
+msgstr "Grupper"
+
+#: src/modules/Groups/ui/group-sidebar.ui:137
+msgid "Main Menu"
+msgstr "Huvudmeny"
+
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
+msgid "Drag to reorder"
+msgstr "Dra för att ändra ordning"
+
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "Gruppalternativ"
+
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "Redigera"
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
+msgid "The task title cannot be empty."
+msgstr "Uppgiftens titel kan inte vara tom."
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
+#, c-format
+msgid "The task title must be at most %d characters."
+msgstr "Uppgiftens titel får vara högst %d tecken."
+
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
+#, c-format
+msgid "The description must be at most %d characters."
+msgstr "Beskrivningen får vara högst %d tecken."
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
+msgid "Tasks"
+msgstr "Uppgifter"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
+#, c-format
+msgid "Total: %u"
+msgstr "Totalt: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
+#, c-format
+msgid "Pending: %u"
+msgstr "Väntande: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
+#, c-format
+msgid "Completed: %u"
+msgstr "Slutförda: %u"
+
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
+#, c-format
+msgid "Important: %u"
+msgstr "Viktiga: %u"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:14
+msgid "Search Tasks"
+msgstr "Sök uppgifter"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:20
+msgid "Filter by status"
+msgstr "Filtrera efter status"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:25
+msgid "All"
+msgstr "Alla"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:26
+msgid "Pending"
+msgstr "Väntande"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:27
+msgid "Completed"
+msgstr "Slutförda"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:50
+msgid "Filter tasks by name…"
+msgstr "Filtrera uppgifter efter namn…"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:64
+msgid "No Group Selected"
+msgstr "Ingen grupp vald"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:65
+msgid "Select a group to see its tasks."
+msgstr "Välj en grupp för att se dess uppgifter."
+
+#: src/modules/Tasks/ui/task-list-panel.ui:76
+msgid "No Tasks Yet"
+msgstr "Inga uppgifter än"
+
+#: src/modules/Tasks/ui/task-list-panel.ui:77
+msgid "Add your first task to this group."
+msgstr "Lägg till din första uppgift i den här gruppen."
+
+#: src/modules/Backup/services/BackupSerializer.vala:57
+msgid "The backup file is not valid."
+msgstr "Säkerhetskopian är ogiltig."
+
+#: src/modules/Tasks/ui/task-row.ui:28
+msgid "Toggle Completed"
+msgstr "Växla slutförd"
+
+#: src/modules/Tasks/ui/task-row.ui:44
+msgid "Show Description"
+msgstr "Visa beskrivning"
+
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "Uppgiftsalternativ"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "Rubrik"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "Rubrik 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "Rubrik 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "Rubrik 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "Normal text"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "Fet"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "Kursiv"
+
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "Understruken"
+
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "Genomstruken"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "Textfärg"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "Punktlista"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "Numrerad lista"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
+msgid "Queue"
+msgstr "Queue"
+
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
+msgid "Task manager"
+msgstr "Uppgiftshanterare"
+
+#: data/io.github.dprietob.queue.desktop.in:4
+msgid "Manage and organize tasks"
+msgstr "Hantera och organisera uppgifter"
+
+#: data/io.github.dprietob.queue.desktop.in:10
+msgid "task;manager;organize;"
+msgstr "uppgift;hanterare;organisera;task;manager;"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
+msgid "Queue is a simple, fast task manager."
+msgstr "Queue är en enkel och snabb uppgiftshanterare."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr "Organisera dina uppgifter i grupper, markera dem som klara eller viktiga, ändra ordning med dra och släpp och håll dina data säkra med inbyggda säkerhetskopior."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
+msgid "Features:"
+msgstr "Funktioner:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
+msgstr "Organisera uppgifter i anpassade, färgkodade grupper."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
+msgstr "Markera uppgifter som slutförda eller viktiga."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr "Skriv rika uppgiftsbeskrivningar med rubriker, textstilar, färger och listor."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "Se datumet då varje uppgift slutfördes."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "Ändra ordning på grupper och uppgifter med dra och släpp."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
+msgstr "Exportera och återställ alla dina data som JSON."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
+msgstr "Ljust och mörkt utseende, tillgängligt på flera språk."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
+msgid "Tasks organized by group"
+msgstr "Uppgifter ordnade efter grupp"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
+msgid "Dark style"
+msgstr "Mörkt utseende"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
+msgid "Create and edit tasks with details"
+msgstr "Skapa och redigera uppgifter med detaljer"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr "Den här versionen ger formaterade beskrivningar och flera förbättringar:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr "Formatera uppgiftsbeskrivningar med rubriker, fet, kursiv, understruken, genomstruken, textfärg och listor."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "Se slutförandedatum för färdiga uppgifter."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "Redigera och ta bort uppgifter och grupper från en meny per objekt."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "Uppgiftslistan använder nu hela fönstrets bredd."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr "Uppgiftsbeskrivningar kan nu innehålla mycket längre text."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "Lade till översättningar till polska, ryska, koreanska, norska, svenska, hindi och grekiska."
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
+msgid "Initial release."
+msgstr "Första utgåvan."
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 625625b..a38dfe9 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -4,9 +4,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: queue 1.0.0\n"
+"Project-Id-Version: queue 1.1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-06-27 02:58+0200\n"
+"POT-Creation-Date: 2026-06-29 19:34+0200\n"
"PO-Revision-Date: 2026-06-27 00:00+0000\n"
"Last-Translator: Daniel Prieto\n"
"Language-Team: Simplified Chinese\n"
@@ -16,257 +16,454 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+#. The language is applied at startup, so a change only takes effect
+#. on the next launch.
+#: src/Window.vala:41
msgid "Restart Queue to apply the new language."
msgstr "重启 Queue 以应用新语言。"
+#: src/Window.vala:90 src/modules/Groups/ui/group-sidebar.ui:145
msgid "New Group"
msgstr "新建分组"
+#: src/Window.vala:101
msgid "Edit Group"
msgstr "编辑分组"
+#: src/Window.vala:108
#, c-format
msgid "\"%s\" and all of its tasks will be permanently deleted."
msgstr "“%s”及其所有任务将被永久删除。"
+#: src/Window.vala:110
msgid "Delete Group?"
msgstr "删除分组?"
+#: src/Window.vala:121 src/modules/Tasks/ui/task-list-panel.ui:36
+#: src/modules/Tasks/ui/task-list-panel.ui:80
msgid "New Task"
msgstr "新建任务"
+#: src/Window.vala:128
msgid "Edit Task"
msgstr "编辑任务"
+#: src/Window.vala:136
#, c-format
msgid "\"%s\" will be permanently deleted."
msgstr "“%s”将被永久删除。"
+#: src/Window.vala:137
msgid "Delete Task?"
msgstr "删除任务?"
+#: src/Window.vala:168
msgid "Group name"
msgstr "分组名称"
+#: src/Window.vala:187
msgid "Color"
msgstr "颜色"
+#: src/Window.vala:192 src/Window.vala:265 src/Window.vala:303
+#: src/Window.vala:367
msgid "Cancel"
msgstr "取消"
+#: src/Window.vala:193 src/Window.vala:266
msgid "Save"
msgstr "保存"
+#: src/Window.vala:245
msgid "Title"
msgstr "标题"
-msgid "Description (optional)"
-msgstr "描述(可选)"
-
+#: src/Window.vala:260 src/modules/Tasks/ui/task-row.ui:55
msgid "Important"
msgstr "重要"
+#: src/Window.vala:304 src/modules/Groups/ui/group-row.ui:59
+#: src/modules/Tasks/ui/task-row.ui:101
msgid "Delete"
msgstr "删除"
+#: src/Window.vala:320
msgid "Export Backup"
msgstr "导出备份"
+#: src/Window.vala:332
msgid "Exporting Backup…"
msgstr "正在导出备份…"
+#: src/Window.vala:339
msgid "Backup exported."
msgstr "备份已导出。"
+#: src/Window.vala:347
msgid "Restore Backup"
msgstr "恢复备份"
+#: src/Window.vala:364
msgid "Restore Backup?"
msgstr "恢复备份?"
-msgid "All current groups and tasks will be permanently deleted and replaced with the contents of the backup file."
+#: src/Window.vala:365
+msgid ""
+"All current groups and tasks will be permanently deleted and replaced with "
+"the contents of the backup file."
msgstr "当前所有分组和任务都将被永久删除,并替换为备份文件中的内容。"
+#: src/Window.vala:368
msgid "Delete and Restore"
msgstr "删除并恢复"
+#: src/Window.vala:379
msgid "Restoring Backup…"
msgstr "正在恢复备份…"
+#: src/Window.vala:390
msgid "Backup restored."
msgstr "备份已恢复。"
+#: src/modules/Groups/validators/GroupStoreValidator.vala:29
msgid "The group name cannot be empty."
msgstr "分组名称不能为空。"
+#: src/modules/Groups/validators/GroupStoreValidator.vala:31
#, c-format
msgid "The group name must be at most %d characters."
msgstr "分组名称最多只能包含 %d 个字符。"
+#: src/modules/Groups/validators/GroupStoreValidator.vala:32
msgid "A group with this name already exists."
msgstr "已存在同名分组。"
+#: src/modules/Groups/ui/group-sidebar.ui:8
msgid "Theme"
msgstr "主题"
+#: src/modules/Groups/ui/group-sidebar.ui:10
+#: src/modules/Groups/ui/group-sidebar.ui:28
msgid "Follow System"
msgstr "跟随系统"
+#: src/modules/Groups/ui/group-sidebar.ui:15
msgid "Light"
msgstr "浅色"
+#: src/modules/Groups/ui/group-sidebar.ui:20
msgid "Dark"
msgstr "深色"
+#: src/modules/Groups/ui/group-sidebar.ui:26
msgid "Language"
msgstr "语言"
+#: src/modules/Groups/ui/group-sidebar.ui:109
msgid "Backup"
msgstr "备份"
+#: src/modules/Groups/ui/group-sidebar.ui:111
msgid "Export Backup…"
msgstr "导出备份…"
+#: src/modules/Groups/ui/group-sidebar.ui:115
msgid "Restore Backup…"
msgstr "恢复备份…"
+#: src/modules/Groups/ui/group-sidebar.ui:122
msgid "About Queue"
msgstr "关于 Queue"
+#: src/modules/Groups/ui/group-sidebar.ui:128
msgid "Groups"
msgstr "分组"
+#: src/modules/Groups/ui/group-sidebar.ui:137
msgid "Main Menu"
msgstr "主菜单"
+#: src/modules/Groups/ui/group-row.ui:16 src/modules/Tasks/ui/task-row.ui:19
msgid "Drag to reorder"
msgstr "拖动以重新排序"
-msgid "Rename Group"
-msgstr "重命名分组"
+#: src/modules/Groups/ui/group-row.ui:33
+msgid "Group Options"
+msgstr "分组选项"
-msgid "Delete Group"
-msgstr "删除分组"
+#: src/modules/Groups/ui/group-row.ui:50 src/modules/Tasks/ui/task-row.ui:92
+msgid "Edit"
+msgstr "编辑"
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:30
msgid "The task title cannot be empty."
msgstr "任务标题不能为空。"
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:32
#, c-format
msgid "The task title must be at most %d characters."
msgstr "任务标题最多只能包含 %d 个字符。"
+#: src/modules/Tasks/validators/TaskStoreValidator.vala:34
#, c-format
msgid "The description must be at most %d characters."
msgstr "描述最多只能包含 %d 个字符。"
+#: src/modules/Tasks/ui/TaskListPanel.vala:83
+#: src/modules/Tasks/ui/task-list-panel.ui:6
msgid "Tasks"
msgstr "任务"
+#: src/modules/Tasks/ui/TaskListPanel.vala:158
#, c-format
msgid "Total: %u"
msgstr "总计:%u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:159
#, c-format
msgid "Pending: %u"
msgstr "待办:%u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:160
#, c-format
msgid "Completed: %u"
msgstr "已完成:%u"
+#: src/modules/Tasks/ui/TaskListPanel.vala:161
#, c-format
msgid "Important: %u"
msgstr "重要:%u"
+#: src/modules/Tasks/ui/task-list-panel.ui:14
msgid "Search Tasks"
msgstr "搜索任务"
+#: src/modules/Tasks/ui/task-list-panel.ui:20
msgid "Filter by status"
msgstr "按状态筛选"
+#: src/modules/Tasks/ui/task-list-panel.ui:25
msgid "All"
msgstr "全部"
+#: src/modules/Tasks/ui/task-list-panel.ui:26
msgid "Pending"
msgstr "待办"
+#: src/modules/Tasks/ui/task-list-panel.ui:27
msgid "Completed"
msgstr "已完成"
+#: src/modules/Tasks/ui/task-list-panel.ui:50
msgid "Filter tasks by name…"
msgstr "按名称筛选任务…"
+#: src/modules/Tasks/ui/task-list-panel.ui:64
msgid "No Group Selected"
msgstr "未选择分组"
+#: src/modules/Tasks/ui/task-list-panel.ui:65
msgid "Select a group to see its tasks."
msgstr "选择一个分组以查看其任务。"
+#: src/modules/Tasks/ui/task-list-panel.ui:76
msgid "No Tasks Yet"
msgstr "暂无任务"
+#: src/modules/Tasks/ui/task-list-panel.ui:77
msgid "Add your first task to this group."
msgstr "为该分组添加第一个任务。"
+#: src/modules/Backup/services/BackupSerializer.vala:57
msgid "The backup file is not valid."
msgstr "备份文件无效。"
+#: src/modules/Tasks/ui/task-row.ui:28
msgid "Toggle Completed"
msgstr "切换完成状态"
+#: src/modules/Tasks/ui/task-row.ui:44
msgid "Show Description"
msgstr "显示描述"
-msgid "Delete Task"
-msgstr "删除任务"
+#: src/modules/Tasks/ui/task-row.ui:75
+msgid "Task Options"
+msgstr "任务选项"
+
+#: src/modules/Tasks/ui/description-editor.ui:16
+msgid "Heading"
+msgstr "标题"
+
+#: src/modules/Tasks/ui/description-editor.ui:28
+msgid "Heading 1"
+msgstr "标题 1"
+
+#: src/modules/Tasks/ui/description-editor.ui:36
+msgid "Heading 2"
+msgstr "标题 2"
+
+#: src/modules/Tasks/ui/description-editor.ui:44
+msgid "Heading 3"
+msgstr "标题 3"
+
+#: src/modules/Tasks/ui/description-editor.ui:52
+msgid "Normal text"
+msgstr "正文"
+
+#: src/modules/Tasks/ui/description-editor.ui:74
+msgid "Bold"
+msgstr "粗体"
+
+#: src/modules/Tasks/ui/description-editor.ui:83
+msgid "Italic"
+msgstr "斜体"
+#: src/modules/Tasks/ui/description-editor.ui:92
+msgid "Underline"
+msgstr "下划线"
+
+#: src/modules/Tasks/ui/description-editor.ui:101
+msgid "Strikethrough"
+msgstr "删除线"
+
+#: src/modules/Tasks/ui/description-editor.ui:110
+msgid "Text color"
+msgstr "文字颜色"
+
+#: src/modules/Tasks/ui/description-editor.ui:126
+msgid "Bulleted list"
+msgstr "项目符号列表"
+
+#: src/modules/Tasks/ui/description-editor.ui:135
+msgid "Numbered list"
+msgstr "编号列表"
+
+#: data/io.github.dprietob.queue.desktop.in:2
+#: data/io.github.dprietob.queue.metainfo.xml.in:5
msgid "Queue"
msgstr "Queue"
+#: data/io.github.dprietob.queue.desktop.in:3
+#: data/io.github.dprietob.queue.metainfo.xml.in:6
msgid "Task manager"
msgstr "任务管理器"
+#: data/io.github.dprietob.queue.desktop.in:4
msgid "Manage and organize tasks"
msgstr "管理和组织任务"
+#: data/io.github.dprietob.queue.desktop.in:10
msgid "task;manager;organize;"
msgstr "任务;管理器;组织;task;manager;organize;"
+#: data/io.github.dprietob.queue.metainfo.xml.in:12
+msgid "Daniel Prieto"
+msgstr "Daniel Prieto"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:16
msgid "Queue is a simple, fast task manager."
msgstr "Queue 是一款简单、快速的任务管理器。"
-msgid "Organize your tasks into groups, mark them as done or important, reorder them with drag and drop, and keep your data safe with built-in backups."
-msgstr "将任务整理到分组中,将其标记为已完成或重要,通过拖放重新排序,并使用内置备份保护您的数据。"
+#: data/io.github.dprietob.queue.metainfo.xml.in:19
+msgid ""
+"Organize your tasks into groups, mark them as done or important, reorder "
+"them with drag and drop, and keep your data safe with built-in backups."
+msgstr ""
+"将任务整理到分组中,将其标记为已完成或重要,通过拖放重新排序,并使用内置备份"
+"保护您的数据。"
+#: data/io.github.dprietob.queue.metainfo.xml.in:23
msgid "Features:"
msgstr "功能:"
-msgid "Organize tasks into custom, color-coded groups"
+#: data/io.github.dprietob.queue.metainfo.xml.in:25
+msgid "Organize tasks into custom, color-coded groups."
msgstr "将任务整理到自定义的彩色分组中"
-msgid "Mark tasks as completed or important"
+#: data/io.github.dprietob.queue.metainfo.xml.in:26
+msgid "Mark tasks as completed or important."
msgstr "将任务标记为已完成或重要"
-msgid "Add optional descriptions and reorder by dragging"
-msgstr "添加可选描述并通过拖动重新排序"
+#: data/io.github.dprietob.queue.metainfo.xml.in:27
+msgid ""
+"Write rich task descriptions with headings, text styles, colors and lists."
+msgstr "使用标题、文字样式、颜色和列表编写富文本描述。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:28
+msgid "See the date when each task was completed."
+msgstr "查看每个任务的完成日期。"
-msgid "Export and restore all your data as JSON"
+#: data/io.github.dprietob.queue.metainfo.xml.in:29
+msgid "Reorder groups and tasks with drag and drop."
+msgstr "通过拖放重新排序分组和任务。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:30
+msgid "Export and restore all your data as JSON."
msgstr "以 JSON 格式导出和恢复所有数据"
-msgid "Light and dark styles, available in several languages"
+#: data/io.github.dprietob.queue.metainfo.xml.in:31
+msgid "Light and dark styles, available in several languages."
msgstr "支持浅色和深色样式,并提供多种语言"
+#: data/io.github.dprietob.queue.metainfo.xml.in:43
msgid "Tasks organized by group"
msgstr "按分组整理的任务"
+#: data/io.github.dprietob.queue.metainfo.xml.in:47
msgid "Dark style"
msgstr "深色样式"
+#: data/io.github.dprietob.queue.metainfo.xml.in:51
msgid "Create and edit tasks with details"
msgstr "创建和编辑带有详细信息的任务"
+#: data/io.github.dprietob.queue.metainfo.xml.in:64
+msgid "This release brings rich text descriptions and several refinements:"
+msgstr "此版本带来了富文本描述和多项改进:"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:66
+msgid ""
+"Format task descriptions with headings, bold, italic, underline, "
+"strikethrough, text color and lists."
+msgstr "使用标题、粗体、斜体、下划线、删除线、文字颜色和列表设置描述格式。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:67
+msgid "See the completion date of finished tasks."
+msgstr "查看已完成任务的完成日期。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:68
+msgid "Edit and delete tasks and groups from a per-item menu."
+msgstr "通过每个条目的菜单编辑和删除任务与分组。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:69
+msgid "The task list now uses the full width of the window."
+msgstr "任务列表现在占据窗口的整个宽度。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:70
+msgid "Task descriptions can now hold much longer text."
+msgstr "任务描述现在可以容纳更长的文本。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:71
+msgid ""
+"Added Polish, Russian, Korean, Norwegian, Swedish, Hindi and Greek "
+"translations."
+msgstr "新增波兰语、俄语、韩语、挪威语、瑞典语、印地语和希腊语翻译。"
+
+#: data/io.github.dprietob.queue.metainfo.xml.in:77
msgid "Initial release."
msgstr "首次发布。"
-msgid "Daniel Prieto"
-msgstr "Daniel Prieto"
+#~ msgid "Description (optional)"
+#~ msgstr "描述(可选)"
+
+#~ msgid "Rename Group"
+#~ msgstr "重命名分组"
+
+#~ msgid "Delete Group"
+#~ msgstr "删除分组"
+
+#~ msgid "Delete Task"
+#~ msgstr "删除任务"
+
+#~ msgid "Add optional descriptions and reorder by dragging"
+#~ msgstr "添加可选描述并通过拖动重新排序"
diff --git a/screenshots/main.png b/screenshots/main.png
index 94b4a26..50bd281 100644
Binary files a/screenshots/main.png and b/screenshots/main.png differ
diff --git a/screenshots/main_dark.png b/screenshots/main_dark.png
index 0e59e51..d632230 100644
Binary files a/screenshots/main_dark.png and b/screenshots/main_dark.png differ
diff --git a/screenshots/task.png b/screenshots/task.png
index 7cd2a6b..b7d0a05 100644
Binary files a/screenshots/task.png and b/screenshots/task.png differ
diff --git a/src/Window.vala b/src/Window.vala
index 4ec0f13..9233c09 100644
--- a/src/Window.vala
+++ b/src/Window.vala
@@ -1,5 +1,6 @@
using Queue.Groups;
using Queue.Tasks;
+using Queue.Backup;
namespace Queue {
@@ -8,7 +9,6 @@ namespace Queue {
[GtkTemplate(ui = "/io/github/dprietob/queue/ui/window.ui")]
public class Window : Adw.ApplicationWindow
{
-
private delegate void GroupEnteredCallback(string name, string color);
private delegate void TaskEnteredCallback(string title, string description, bool important);
private delegate void ConfirmedCallback();
@@ -22,7 +22,7 @@ namespace Queue {
private Database database;
private GroupSidebarController group_controller;
private TaskListController task_controller;
- private Queue.Backup.BackupController backup_controller;
+ private BackupController backup_controller;
private GroupSidebar sidebar;
private TaskListPanel panel;
@@ -44,7 +44,7 @@ namespace Queue {
this.database = database;
group_controller = new GroupSidebarController(database);
task_controller = new TaskListController(database);
- backup_controller = new Queue.Backup.BackupController(database);
+ backup_controller = new BackupController(database);
sidebar = new GroupSidebar(group_controller);
panel = new TaskListPanel(task_controller);
@@ -153,12 +153,23 @@ namespace Queue {
private void prompt_group(string heading, string name, string color,
owned GroupEnteredCallback callback)
{
- var dialog = new Adw.AlertDialog(heading, null);
+ var dialog = new Adw.Dialog() {
+ title = heading,
+ content_width = 360
+ };
+
+ var title_label = new Gtk.Label(heading) {
+ halign = Gtk.Align.START,
+ wrap = true
+ };
+ title_label.add_css_class("title-2");
var entry = new Gtk.Entry() {
placeholder_text = _("Group name"),
text = name,
- activates_default = true
+ activates_default = true,
+ max_length = Groups.GroupStoreValidator.MAXIMUM_LENGTH,
+ hexpand = true
};
var color_button = new Gtk.ColorDialogButton(new Gtk.ColorDialog() {
@@ -178,23 +189,37 @@ namespace Queue {
});
color_row.append(color_button);
- var content = new Gtk.Box(Gtk.Orientation.VERTICAL, 12);
+ var cancel_button = new Gtk.Button.with_label(_("Cancel"));
+ var save_button = new Gtk.Button.with_label(_("Save"));
+ save_button.add_css_class("suggested-action");
+
+ var buttons = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 6) {
+ halign = Gtk.Align.END
+ };
+ buttons.append(cancel_button);
+ buttons.append(save_button);
+
+ var content = new Gtk.Box(Gtk.Orientation.VERTICAL, 12) {
+ margin_top = 24,
+ margin_bottom = 24,
+ margin_start = 24,
+ margin_end = 24
+ };
+ content.append(title_label);
content.append(entry);
content.append(color_row);
- dialog.set_extra_child(content);
+ content.append(buttons);
+ dialog.child = content;
- dialog.add_response("cancel", _("Cancel"));
- dialog.add_response("save", _("Save"));
- dialog.set_response_appearance("save", Adw.ResponseAppearance.SUGGESTED);
- dialog.default_response = "save";
- dialog.close_response = "cancel";
+ dialog.default_widget = save_button;
+ dialog.focus_widget = entry;
- dialog.response.connect((response) => {
- if (response == "save") {
- var chosen = color_button.get_rgba();
- var color_value = chosen.alpha == 0 ? "" : chosen.to_string();
- callback(entry.text, color_value);
- }
+ cancel_button.clicked.connect(() => dialog.close());
+ save_button.clicked.connect(() => {
+ var chosen = color_button.get_rgba();
+ var color_value = chosen.alpha == 0 ? "" : chosen.to_string();
+ callback(entry.text, color_value);
+ dialog.close();
});
dialog.present(this);
}
@@ -207,7 +232,7 @@ namespace Queue {
{
var dialog = new Adw.Dialog() {
title = heading,
- content_width = 500
+ content_width = 640
};
var title_label = new Gtk.Label(heading) {
@@ -224,28 +249,8 @@ namespace Queue {
hexpand = true
};
- var description_view = new Gtk.TextView() {
- wrap_mode = Gtk.WrapMode.WORD_CHAR,
- accepts_tab = false,
- top_margin = 6,
- bottom_margin = 6,
- left_margin = 6,
- right_margin = 6
- };
- description_view.buffer.text = initial_description;
- limit_length(description_view.buffer, Tasks.TaskStoreValidator.MAXIMUM_DESCRIPTION_LENGTH);
-
- var description_scroll = new Gtk.ScrolledWindow() {
- child = description_view,
- hscrollbar_policy = Gtk.PolicyType.NEVER,
- min_content_height = 100
- };
- description_scroll.add_css_class("card");
-
- var description_label = new Gtk.Label(_("Description (optional)")) {
- halign = Gtk.Align.START
- };
- description_label.add_css_class("dim-label");
+ var description_editor = new Tasks.DescriptionEditor();
+ description_editor.set_markdown(initial_description);
var important_switch = new Gtk.Switch() {
active = initial_important,
@@ -275,8 +280,7 @@ namespace Queue {
};
content.append(title_label);
content.append(entry);
- content.append(description_label);
- content.append(description_scroll);
+ content.append(description_editor);
content.append(important_row);
content.append(buttons);
dialog.child = content;
@@ -286,26 +290,12 @@ namespace Queue {
cancel_button.clicked.connect(() => dialog.close());
save_button.clicked.connect(() => {
- callback(entry.text, description_view.buffer.text, important_switch.active);
+ callback(entry.text, description_editor.get_markdown(), important_switch.active);
dialog.close();
});
dialog.present(this);
}
- // Keeps a text buffer within a maximum number of characters, trimming
- // any excess (e.g. from a paste) as soon as it is inserted.
- private void limit_length(Gtk.TextBuffer buffer, int maximum_length)
- {
- buffer.changed.connect(() => {
- if (buffer.get_char_count() > maximum_length) {
- Gtk.TextIter start, end;
- buffer.get_iter_at_offset(out start, maximum_length);
- buffer.get_end_iter(out end);
- buffer.delete(ref start, ref end);
- }
- });
- }
-
private void confirm_deletion(string heading, string body, owned ConfirmedCallback callback)
{
var dialog = new Adw.AlertDialog(heading, body);
diff --git a/src/database/Database.vala b/src/database/Database.vala
index 0e6b454..4ad5235 100644
--- a/src/database/Database.vala
+++ b/src/database/Database.vala
@@ -33,6 +33,7 @@ namespace Queue {
Migration[] migrations = {
new CreateGroupsTable(),
new CreateTasksTable(),
+ new AddCompletedAtToTasks(),
};
var applied_version = current_version();
diff --git a/src/database/migrations/003_add_completed_at_to_tasks.vala b/src/database/migrations/003_add_completed_at_to_tasks.vala
new file mode 100644
index 0000000..af1ca5d
--- /dev/null
+++ b/src/database/migrations/003_add_completed_at_to_tasks.vala
@@ -0,0 +1,18 @@
+namespace Queue {
+
+ public class AddCompletedAtToTasks : Object, Migration
+ {
+
+ public int version {
+ get { return 3; }
+ }
+
+ public string up()
+ {
+ return
+ """
+ ALTER TABLE tasks ADD COLUMN completed_at TEXT NOT NULL DEFAULT '';
+ """;
+ }
+ }
+}
diff --git a/src/modules/Backup/actions/ImportGroupAction.vala b/src/modules/Backup/actions/ImportGroupAction.vala
index 771e1b7..e2b28dd 100644
--- a/src/modules/Backup/actions/ImportGroupAction.vala
+++ b/src/modules/Backup/actions/ImportGroupAction.vala
@@ -20,7 +20,7 @@ namespace Queue.Backup {
var stored = Queue.Tasks.Task.create(database, created.id, task.title, task.description,
task.important);
if (task.done) {
- Queue.Tasks.Task.mark_done(database, stored.id, true);
+ Queue.Tasks.Task.restore_completion(database, stored.id, true, task.completed_at);
}
}
}
diff --git a/src/modules/Backup/controllers/BackupController.vala b/src/modules/Backup/controllers/BackupController.vala
index b6150e0..41b58a2 100644
--- a/src/modules/Backup/controllers/BackupController.vala
+++ b/src/modules/Backup/controllers/BackupController.vala
@@ -99,6 +99,7 @@ namespace Queue.Backup {
backup_task.description = task.description;
backup_task.done = task.done;
backup_task.important = task.important;
+ backup_task.completed_at = task.completed_at;
tasks += backup_task;
}
backup_group.tasks = tasks;
diff --git a/src/modules/Backup/services/BackupSerializer.vala b/src/modules/Backup/services/BackupSerializer.vala
index b921d25..2fed631 100644
--- a/src/modules/Backup/services/BackupSerializer.vala
+++ b/src/modules/Backup/services/BackupSerializer.vala
@@ -7,6 +7,7 @@ namespace Queue.Backup {
public string description { get; set; default = ""; }
public bool done { get; set; default = false; }
public bool important { get; set; default = false; }
+ public string completed_at { get; set; default = ""; }
}
// In-memory representation of a backed-up group with its tasks.
@@ -89,6 +90,8 @@ namespace Queue.Backup {
builder.add_boolean_value(task.done);
builder.set_member_name("important");
builder.add_boolean_value(task.important);
+ builder.set_member_name("completed_at");
+ builder.add_string_value(task.completed_at);
builder.end_object();
}
builder.end_array();
@@ -131,6 +134,9 @@ namespace Queue.Backup {
if (task_object.has_member("important")) {
task.important = task_object.get_boolean_member("important");
}
+ if (task_object.has_member("completed_at")) {
+ task.completed_at = task_object.get_string_member("completed_at");
+ }
return task;
}
}
diff --git a/src/modules/Groups/ui/GroupRow.vala b/src/modules/Groups/ui/GroupRow.vala
index b420ba0..fd398c7 100644
--- a/src/modules/Groups/ui/GroupRow.vala
+++ b/src/modules/Groups/ui/GroupRow.vala
@@ -7,9 +7,11 @@ namespace Queue.Groups {
[GtkChild]
private unowned Gtk.Label name_label;
[GtkChild]
- private unowned Gtk.Button edit_button;
+ private unowned Gtk.MenuButton menu_button;
[GtkChild]
- private unowned Gtk.Button delete_button;
+ private unowned Gtk.Button edit_item;
+ [GtkChild]
+ private unowned Gtk.Button delete_item;
public Group group { get; private set; }
@@ -23,8 +25,26 @@ namespace Queue.Groups {
// sidebar's display-wide CSS provider, refreshed when colors change.
add_css_class(GroupSidebar.color_class_for(group.id));
group.bind_property("name", name_label, "label", BindingFlags.SYNC_CREATE);
- edit_button.clicked.connect(() => edit_requested(group));
- delete_button.clicked.connect(() => delete_requested(group));
+ install_menu_actions();
+ }
+
+ private void install_menu_actions()
+ {
+ var actions = new SimpleActionGroup();
+
+ var edit_action = new SimpleAction("edit", null);
+ edit_action.activate.connect(() => edit_requested(group));
+ actions.add_action(edit_action);
+
+ var delete_action = new SimpleAction("delete", null);
+ delete_action.activate.connect(() => delete_requested(group));
+ actions.add_action(delete_action);
+
+ insert_action_group("row", actions);
+
+ // The custom popover does not dismiss itself on activation.
+ edit_item.clicked.connect(() => menu_button.popdown());
+ delete_item.clicked.connect(() => menu_button.popdown());
}
}
}
diff --git a/src/modules/Groups/ui/group-row.ui b/src/modules/Groups/ui/group-row.ui
index 3399229..333d6c5 100644
--- a/src/modules/Groups/ui/group-row.ui
+++ b/src/modules/Groups/ui/group-row.ui
@@ -27,23 +27,45 @@
-
-
-
- user-trash-symbolic
- center
- Delete Group
+ Group Options
+
+
+
+
+ vertical
+ 6
+ 6
+ 6
+ 6
+ 6
+
+
+ row.edit
+ Edit
+
+
+
+
+
+ row.delete
+ Delete
+
+
+
+
+
+
+
diff --git a/src/modules/Groups/ui/group-sidebar.ui b/src/modules/Groups/ui/group-sidebar.ui
index fe9f49c..520859a 100644
--- a/src/modules/Groups/ui/group-sidebar.ui
+++ b/src/modules/Groups/ui/group-sidebar.ui
@@ -69,6 +69,41 @@
app.languageja
+
+ Polski
+ app.language
+ pl
+
+
+ Русский
+ app.language
+ ru
+
+
+ 한국어
+ app.language
+ ko
+
+
+ Norsk bokmål
+ app.language
+ nb
+
+
+ Svenska
+ app.language
+ sv
+
+
+ हिन्दी
+ app.language
+ hi
+
+
+ Ελληνικά
+ app.language
+ el
+ Backup
diff --git a/src/modules/Tasks/actions/ToggleTaskAction.vala b/src/modules/Tasks/actions/ToggleTaskAction.vala
index 048158e..18b37f0 100644
--- a/src/modules/Tasks/actions/ToggleTaskAction.vala
+++ b/src/modules/Tasks/actions/ToggleTaskAction.vala
@@ -11,9 +11,9 @@ namespace Queue.Tasks {
this.database = database;
}
- public void execute(int id, bool done)
+ public string execute(int id, bool done)
{
- Task.mark_done(database, id, done);
+ return Task.mark_done(database, id, done);
}
}
}
diff --git a/src/modules/Tasks/controllers/TaskListController.vala b/src/modules/Tasks/controllers/TaskListController.vala
index 60a1001..1229b57 100644
--- a/src/modules/Tasks/controllers/TaskListController.vala
+++ b/src/modules/Tasks/controllers/TaskListController.vala
@@ -71,7 +71,7 @@ namespace Queue.Tasks {
public void toggle(Task task)
{
var done = !task.done;
- toggle_task_action.execute(task.id, done);
+ task.completed_at = toggle_task_action.execute(task.id, done);
task.done = done;
}
@@ -85,7 +85,6 @@ namespace Queue.Tasks {
}
}
- // Moves a task before or after a target task and persists the order.
public void move(Task dragged, Task target, bool after)
{
if (dragged == target) {
diff --git a/src/modules/Tasks/models/Task.vala b/src/modules/Tasks/models/Task.vala
index 1f8a38a..432f4cf 100644
--- a/src/modules/Tasks/models/Task.vala
+++ b/src/modules/Tasks/models/Task.vala
@@ -10,6 +10,7 @@ namespace Queue.Tasks {
public string description { get; set; default = ""; }
public bool done { get; set; }
public bool important { get; set; default = false; }
+ public string completed_at { get; set; default = ""; }
public static GLib.List for_group(Database database, int group_id)
{
@@ -17,7 +18,7 @@ namespace Queue.Tasks {
Sqlite.Statement statement;
database.connection.prepare_v2(
- "SELECT id, group_id, title, description, done, important FROM tasks WHERE group_id = ? ORDER BY position, id;",
+ "SELECT id, group_id, title, description, done, important, completed_at FROM tasks WHERE group_id = ? ORDER BY position, id;",
-1,
out statement);
statement.bind_int(1, group_id);
@@ -30,6 +31,7 @@ namespace Queue.Tasks {
task.description = statement.column_text(3);
task.done = statement.column_int(4) != 0;
task.important = statement.column_int(5) != 0;
+ task.completed_at = statement.column_text(6);
tasks.append(task);
}
@@ -75,13 +77,29 @@ namespace Queue.Tasks {
statement.step();
}
- public static void mark_done(Database database, int id, bool done)
+ public static string mark_done(Database database, int id, bool done)
+ {
+ var completed_at = done ? new DateTime.now_utc().format("%Y-%m-%d %H:%M:%S") : "";
+
+ Sqlite.Statement statement;
+ database.connection.prepare_v2(
+ "UPDATE tasks SET done = ?, completed_at = ? WHERE id = ?;", -1, out statement);
+ statement.bind_int(1, done ? 1 : 0);
+ statement.bind_text(2, completed_at);
+ statement.bind_int(3, id);
+ statement.step();
+
+ return completed_at;
+ }
+
+ public static void restore_completion(Database database, int id, bool done, string completed_at)
{
Sqlite.Statement statement;
database.connection.prepare_v2(
- "UPDATE tasks SET done = ? WHERE id = ?;", -1, out statement);
+ "UPDATE tasks SET done = ?, completed_at = ? WHERE id = ?;", -1, out statement);
statement.bind_int(1, done ? 1 : 0);
- statement.bind_int(2, id);
+ statement.bind_text(2, completed_at);
+ statement.bind_int(3, id);
statement.step();
}
@@ -94,7 +112,6 @@ namespace Queue.Tasks {
statement.step();
}
- // Stores the given identifiers as the new ordering (index = position).
public static void reorder(Database database, int[] ordered_ids)
{
database.connection.exec("BEGIN TRANSACTION;");
diff --git a/src/modules/Tasks/ui/DescriptionEditor.vala b/src/modules/Tasks/ui/DescriptionEditor.vala
new file mode 100644
index 0000000..18538ee
--- /dev/null
+++ b/src/modules/Tasks/ui/DescriptionEditor.vala
@@ -0,0 +1,367 @@
+namespace Queue.Tasks {
+
+ // A lightweight rich-text editor for task descriptions. It shows formatting
+ // live with GtkTextTags and serializes to and from Markdown, so the stored
+ // value stays plain text. Bold, italic, underline, strikethrough and color
+ // apply to the selection; headings and lists apply to whole lines.
+ [GtkTemplate(ui = "/io/github/dprietob/queue/ui/description-editor.ui")]
+ public class DescriptionEditor : Gtk.Box
+ {
+
+ [GtkChild]
+ private unowned Gtk.MenuButton heading_button;
+ [GtkChild]
+ private unowned Gtk.Button h1_button;
+ [GtkChild]
+ private unowned Gtk.Button h2_button;
+ [GtkChild]
+ private unowned Gtk.Button h3_button;
+ [GtkChild]
+ private unowned Gtk.Button normal_button;
+ [GtkChild]
+ private unowned Gtk.Button bold_button;
+ [GtkChild]
+ private unowned Gtk.Button italic_button;
+ [GtkChild]
+ private unowned Gtk.Button underline_button;
+ [GtkChild]
+ private unowned Gtk.Button strikethrough_button;
+ [GtkChild]
+ private unowned Gtk.Button color_button;
+ [GtkChild]
+ private unowned Gtk.Button bullet_button;
+ [GtkChild]
+ private unowned Gtk.Button numbered_button;
+ [GtkChild]
+ private unowned Gtk.TextView text_view;
+
+ private Gtk.TextTag bold_tag;
+ private Gtk.TextTag italic_tag;
+ private Gtk.TextTag underline_tag;
+ private Gtk.TextTag strikethrough_tag;
+ private Gtk.TextTag[] heading_tags;
+ private HashTable color_tags;
+
+ construct {
+ var buffer = text_view.buffer;
+ bold_tag = buffer.create_tag("bold", "weight", Pango.Weight.BOLD);
+ italic_tag = buffer.create_tag("italic", "style", Pango.Style.ITALIC);
+ underline_tag = buffer.create_tag("underline", "underline", Pango.Underline.SINGLE);
+ strikethrough_tag = buffer.create_tag("strikethrough", "strikethrough", true);
+ heading_tags = {
+ buffer.create_tag("heading1", "scale", 1.6, "weight", Pango.Weight.BOLD),
+ buffer.create_tag("heading2", "scale", 1.3, "weight", Pango.Weight.BOLD),
+ buffer.create_tag("heading3", "scale", 1.15, "weight", Pango.Weight.BOLD),
+ };
+ color_tags = new HashTable (str_hash, str_equal);
+
+ bold_button.clicked.connect(() => toggle_tag(bold_tag));
+ italic_button.clicked.connect(() => toggle_tag(italic_tag));
+ underline_button.clicked.connect(() => toggle_tag(underline_tag));
+ strikethrough_button.clicked.connect(() => toggle_tag(strikethrough_tag));
+ color_button.clicked.connect(() => choose_color());
+ bullet_button.clicked.connect(() => prefix_lines("• ", false));
+ numbered_button.clicked.connect(() => prefix_lines("", true));
+ h1_button.clicked.connect(() => set_heading(1));
+ h2_button.clicked.connect(() => set_heading(2));
+ h3_button.clicked.connect(() => set_heading(3));
+ normal_button.clicked.connect(() => set_heading(0));
+ }
+
+ // Loads a Markdown description, rendering its headings and inline styles
+ // as tags. Each line is parsed independently so heading prefixes apply
+ // to the whole line.
+ public void set_markdown(string markdown)
+ {
+ var buffer = text_view.buffer;
+ buffer.text = "";
+
+ var lines = markdown.split("\n");
+ for (int line = 0; line < lines.length; line++) {
+ if (line > 0) {
+ insert_text("\n");
+ }
+
+ var level = TaskDescriptionMarkup.heading_level(lines[line]);
+ var content = level > 0 ? lines[line].substring(level + 1) : lines[line];
+
+ Gtk.TextIter line_start;
+ buffer.get_end_iter(out line_start);
+ int line_offset = line_start.get_offset();
+
+ insert_runs(content);
+
+ if (level > 0) {
+ Gtk.TextIter start, end;
+ buffer.get_iter_at_offset(out start, line_offset);
+ buffer.get_end_iter(out end);
+ buffer.apply_tag(heading_tags[level - 1], start, end);
+ }
+ }
+ }
+
+ // Serializes the current content back to Markdown, line by line so that
+ // heading prefixes can be emitted per line.
+ public string get_markdown()
+ {
+ var buffer = text_view.buffer;
+ var builder = new StringBuilder();
+ int line_count = buffer.get_line_count();
+
+ for (int line = 0; line < line_count; line++) {
+ if (line > 0) {
+ builder.append("\n");
+ }
+ Gtk.TextIter start, end;
+ buffer.get_iter_at_line(out start, line);
+ end = start;
+ if (!end.ends_line()) {
+ end.forward_to_line_end();
+ }
+ builder.append(heading_prefix(start));
+ builder.append(serialize_segment(start, end));
+ }
+
+ return builder.str;
+ }
+
+ // Inserts the runs of an inline Markdown string with their tags.
+ private void insert_runs(string markdown)
+ {
+ var buffer = text_view.buffer;
+ var runs = TaskDescriptionMarkup.to_runs(markdown);
+ for (int index = 0; index < runs.length; index++) {
+ var run = runs.get(index);
+ int offset = insert_text(run.text);
+
+ Gtk.TextIter start, end;
+ buffer.get_iter_at_offset(out start, offset);
+ buffer.get_end_iter(out end);
+ if (run.bold) {
+ buffer.apply_tag(bold_tag, start, end);
+ }
+ if (run.italic) {
+ buffer.apply_tag(italic_tag, start, end);
+ }
+ if (run.underline) {
+ buffer.apply_tag(underline_tag, start, end);
+ }
+ if (run.strikethrough) {
+ buffer.apply_tag(strikethrough_tag, start, end);
+ }
+ if (run.color != "") {
+ buffer.apply_tag(color_tag_for(run.color), start, end);
+ }
+ }
+ }
+
+ // Appends text at the end of the buffer and returns its start offset.
+ private int insert_text(string text)
+ {
+ var buffer = text_view.buffer;
+ Gtk.TextIter end;
+ buffer.get_end_iter(out end);
+ int offset = end.get_offset();
+ buffer.insert(ref end, text, -1);
+ return offset;
+ }
+
+ // Returns the Markdown heading prefix of the line starting at the iter.
+ private string heading_prefix(Gtk.TextIter line_start)
+ {
+ for (int level = 1; level <= heading_tags.length; level++) {
+ if (line_start.has_tag(heading_tags[level - 1])) {
+ return string.nfill(level, '#') + " ";
+ }
+ }
+ return "";
+ }
+
+ // Serializes the inline content of a buffer range to Markdown.
+ private string serialize_segment(Gtk.TextIter from, Gtk.TextIter to)
+ {
+ var buffer = text_view.buffer;
+ var builder = new StringBuilder();
+
+ Gtk.TextIter position = from;
+ while (position.compare(to) < 0) {
+ Gtk.TextIter next = position;
+ if (!next.forward_to_tag_toggle(null) || next.compare(to) > 0) {
+ next = to;
+ }
+ builder.append(wrap(buffer.get_text(position, next, false), position));
+ position = next;
+ }
+
+ return builder.str;
+ }
+
+ // Wraps a constant-formatting segment with its Markdown markers.
+ private string wrap(string text, Gtk.TextIter at)
+ {
+ if (text == "") {
+ return "";
+ }
+
+ var open = new StringBuilder();
+ var close = new StringBuilder();
+ var color = color_at(at);
+ if (color != null) {
+ open.append("".printf(color));
+ close.prepend("");
+ }
+ if (at.has_tag(bold_tag)) {
+ open.append("**");
+ close.prepend("**");
+ }
+ if (at.has_tag(italic_tag)) {
+ open.append("*");
+ close.prepend("*");
+ }
+ if (at.has_tag(underline_tag)) {
+ open.append("");
+ close.prepend("");
+ }
+ if (at.has_tag(strikethrough_tag)) {
+ open.append("~~");
+ close.prepend("~~");
+ }
+ return open.str + text + close.str;
+ }
+
+ // Adds or removes a tag over the selection, toggling on its current state.
+ private void toggle_tag(Gtk.TextTag tag)
+ {
+ Gtk.TextIter start, end;
+ if (text_view.buffer.get_selection_bounds(out start, out end)) {
+ if (start.has_tag(tag)) {
+ text_view.buffer.remove_tag(tag, start, end);
+ } else {
+ text_view.buffer.apply_tag(tag, start, end);
+ }
+ }
+ text_view.grab_focus();
+ }
+
+ // Applies the given heading level to every line in the selection, or
+ // clears the heading when level is 0.
+ private void set_heading(int level)
+ {
+ var buffer = text_view.buffer;
+
+ Gtk.TextIter start, end;
+ if (!buffer.get_selection_bounds(out start, out end)) {
+ buffer.get_iter_at_mark(out start, buffer.get_insert());
+ end = start;
+ }
+
+ int first_line = start.get_line();
+ int last_line = end.get_line();
+ for (int line = first_line; line <= last_line; line++) {
+ Gtk.TextIter line_start, line_end;
+ buffer.get_iter_at_line(out line_start, line);
+ line_end = line_start;
+ if (!line_end.ends_line()) {
+ line_end.forward_to_line_end();
+ }
+ foreach (var tag in heading_tags) {
+ buffer.remove_tag(tag, line_start, line_end);
+ }
+ if (level > 0) {
+ buffer.apply_tag(heading_tags[level - 1], line_start, line_end);
+ }
+ }
+
+ heading_button.active = false;
+ text_view.grab_focus();
+ }
+
+ // Opens the system color chooser and applies the chosen color to the
+ // current selection.
+ private void choose_color()
+ {
+ var dialog = new Gtk.ColorDialog() {
+ with_alpha = false
+ };
+ dialog.choose_rgba.begin(get_root() as Gtk.Window, null, null, (object, result) => {
+ try {
+ apply_color(dialog.choose_rgba.end(result));
+ } catch (Error error) {
+ // The chooser was dismissed; nothing to apply.
+ }
+ });
+ }
+
+ // Replaces any existing text color over the selection with the given one.
+ private void apply_color(Gdk.RGBA rgba)
+ {
+ var buffer = text_view.buffer;
+ Gtk.TextIter start, end;
+ if (!buffer.get_selection_bounds(out start, out end)) {
+ text_view.grab_focus();
+ return;
+ }
+
+ foreach (var tag in color_tags.get_values()) {
+ buffer.remove_tag(tag, start, end);
+ }
+ buffer.apply_tag(color_tag_for(to_hex(rgba)), start, end);
+ text_view.grab_focus();
+ }
+
+ // Returns the reusable tag that paints text with the given "#rrggbb".
+ private Gtk.TextTag color_tag_for(string hex)
+ {
+ var tag = color_tags.get(hex);
+ if (tag == null) {
+ tag = text_view.buffer.create_tag(null, "foreground", hex);
+ color_tags.set(hex, tag);
+ }
+ return tag;
+ }
+
+ // Returns the "#rrggbb" color applied at the iter, or null when none is.
+ private string? color_at(Gtk.TextIter at)
+ {
+ foreach (var hex in color_tags.get_keys()) {
+ if (at.has_tag(color_tags.get(hex))) {
+ return hex;
+ }
+ }
+ return null;
+ }
+
+ // Prefixes every line in the selection (or the current line) with a
+ // fixed marker or an incrementing number.
+ private void prefix_lines(string fixed_prefix, bool numbered)
+ {
+ var buffer = text_view.buffer;
+
+ Gtk.TextIter start, end;
+ if (!buffer.get_selection_bounds(out start, out end)) {
+ buffer.get_iter_at_mark(out start, buffer.get_insert());
+ end = start;
+ }
+
+ int first_line = start.get_line();
+ int last_line = end.get_line();
+ for (int line = first_line; line <= last_line; line++) {
+ Gtk.TextIter line_start;
+ buffer.get_iter_at_line(out line_start, line);
+ var prefix = numbered ? "%d. ".printf(line - first_line + 1) : fixed_prefix;
+ buffer.insert(ref line_start, prefix, -1);
+ }
+
+ text_view.grab_focus();
+ }
+
+ // Formats an RGBA color as a "#rrggbb" string.
+ private static string to_hex(Gdk.RGBA rgba)
+ {
+ int red = (int) (rgba.red * 255 + 0.5);
+ int green = (int) (rgba.green * 255 + 0.5);
+ int blue = (int) (rgba.blue * 255 + 0.5);
+ return "#%02x%02x%02x".printf(red, green, blue);
+ }
+ }
+}
diff --git a/src/modules/Tasks/ui/TaskDescriptionMarkup.vala b/src/modules/Tasks/ui/TaskDescriptionMarkup.vala
new file mode 100644
index 0000000..0632774
--- /dev/null
+++ b/src/modules/Tasks/ui/TaskDescriptionMarkup.vala
@@ -0,0 +1,219 @@
+namespace Queue.Tasks {
+
+ // A run of text sharing the same inline formatting. A non-empty color holds
+ // the text color as a "#rrggbb" string.
+ public class TextRun : Object
+ {
+ public string text { get; set; default = ""; }
+ public bool bold { get; set; default = false; }
+ public bool italic { get; set; default = false; }
+ public bool underline { get; set; default = false; }
+ public bool strikethrough { get; set; default = false; }
+ public string color { get; set; default = ""; }
+ }
+
+ // Converts task descriptions between the stored Markdown form and the
+ // representations the UI needs: styled runs for the live editor and Pango
+ // markup for display. Lists are kept as plain "• "/"N. " line prefixes and
+ // headings as "# " line prefixes, so only inline styles are encoded inline:
+ // **bold**, *italic*, underline, ~~strikethrough~~ and
+ // colored.
+ public class TaskDescriptionMarkup : Object
+ {
+
+ // Returns the heading level (1-3) of a line, or 0 when it is not a heading.
+ public static int heading_level(string line)
+ {
+ int hashes = 0;
+ while (hashes < line.length && line[hashes] == '#') {
+ hashes++;
+ }
+ if (hashes >= 1 && hashes <= 3 && hashes < line.length && line[hashes] == ' ') {
+ return hashes;
+ }
+ return 0;
+ }
+
+ // Splits Markdown into a sequence of runs carrying their formatting.
+ public static GenericArray to_runs(string markdown)
+ {
+ var runs = new GenericArray ();
+ var current = new StringBuilder();
+ bool bold = false, italic = false, underline = false, strikethrough = false;
+ string color = "";
+ int length = markdown.length;
+
+ for (int index = 0; index < length;) {
+ if (index + 1 < length && markdown[index] == '*' && markdown[index + 1] == '*') {
+ flush(runs, current, bold, italic, underline, strikethrough, color);
+ bold = !bold;
+ index += 2;
+ continue;
+ }
+ if (markdown[index] == '*') {
+ flush(runs, current, bold, italic, underline, strikethrough, color);
+ italic = !italic;
+ index += 1;
+ continue;
+ }
+ if (index + 1 < length && markdown[index] == '~' && markdown[index + 1] == '~') {
+ flush(runs, current, bold, italic, underline, strikethrough, color);
+ strikethrough = !strikethrough;
+ index += 2;
+ continue;
+ }
+ if (index + 3 < length && markdown[index] == '<' && markdown[index + 1] == '/'
+ && markdown[index + 2] == 'u' && markdown[index + 3] == '>') {
+ flush(runs, current, bold, italic, underline, strikethrough, color);
+ underline = false;
+ index += 4;
+ continue;
+ }
+ if (index + 3 < length && markdown[index] == '<' && markdown[index + 1] == '/'
+ && markdown[index + 2] == 'c' && markdown[index + 3] == '>') {
+ flush(runs, current, bold, italic, underline, strikethrough, color);
+ color = "";
+ index += 4;
+ continue;
+ }
+ if (index + 2 < length && markdown[index] == '<' && markdown[index + 1] == 'u'
+ && markdown[index + 2] == '>') {
+ flush(runs, current, bold, italic, underline, strikethrough, color);
+ underline = true;
+ index += 3;
+ continue;
+ }
+ if (index + 9 < length && markdown[index] == '<' && markdown[index + 1] == 'c'
+ && markdown[index + 2] == '#' && markdown[index + 9] == '>'
+ && is_hex_sequence(markdown, index + 3, 6)) {
+ flush(runs, current, bold, italic, underline, strikethrough, color);
+ color = byte_range(markdown, index + 2, index + 9);
+ index += 10;
+ continue;
+ }
+
+ // Markers are ASCII, so any other byte is copied verbatim and
+ // multi-byte UTF-8 sequences are reassembled untouched.
+ current.append_c(markdown[index]);
+ index += 1;
+ }
+
+ flush(runs, current, bold, italic, underline, strikethrough, color);
+ return runs;
+ }
+
+ // Renders Markdown as Pango markup for display in a label, rendering
+ // each line's heading or list prefix and its inline styles.
+ public static string to_pango(string markdown)
+ {
+ var lines = markdown.split("\n");
+ var builder = new StringBuilder();
+
+ for (int index = 0; index < lines.length; index++) {
+ if (index > 0) {
+ builder.append("\n");
+ }
+ builder.append(render_line(lines[index]));
+ }
+
+ return builder.str;
+ }
+
+ // Renders a single Markdown line, turning a heading or list prefix into
+ // a presentational form and rendering the rest inline.
+ private static string render_line(string line)
+ {
+ int level = heading_level(line);
+ if (level > 0) {
+ var size = level == 1 ? "xx-large" : (level == 2 ? "x-large" : "large");
+ return "%s"
+ .printf(size, inline_to_pango(line.substring(level + 1)));
+ }
+ if (line.has_prefix("- ") || line.has_prefix("* ")) {
+ return "• " + inline_to_pango(line.substring(2));
+ }
+ return inline_to_pango(line);
+ }
+
+ // Renders the inline styles of a single line as Pango markup.
+ private static string inline_to_pango(string text)
+ {
+ var runs = to_runs(text);
+ var builder = new StringBuilder();
+
+ for (int index = 0; index < runs.length; index++) {
+ var run = runs.get(index);
+ var escaped = Markup.escape_text(run.text);
+
+ var open = new StringBuilder();
+ var close = new StringBuilder();
+ if (run.color != "") {
+ open.append("".printf(run.color));
+ close.prepend("");
+ }
+ if (run.bold) {
+ open.append("");
+ close.prepend("");
+ }
+ if (run.italic) {
+ open.append("");
+ close.prepend("");
+ }
+ if (run.underline) {
+ open.append("");
+ close.prepend("");
+ }
+ if (run.strikethrough) {
+ open.append("");
+ close.prepend("");
+ }
+ builder.append(open.str).append(escaped).append(close.str);
+ }
+
+ return builder.str;
+ }
+
+ // Appends the accumulated text as a run and resets the accumulator.
+ private static void flush(GenericArray runs, StringBuilder current,
+ bool bold, bool italic, bool underline, bool strikethrough, string color)
+ {
+ if (current.len == 0) {
+ return;
+ }
+ runs.add(new TextRun() {
+ text = current.str,
+ bold = bold,
+ italic = italic,
+ underline = underline,
+ strikethrough = strikethrough,
+ color = color
+ });
+ current.truncate(0);
+ }
+
+ // Returns whether count characters starting at offset are hex digits.
+ private static bool is_hex_sequence(string source, int offset, int count)
+ {
+ for (int index = offset; index < offset + count; index++) {
+ var character = source[index];
+ bool is_digit = character >= '0' && character <= '9';
+ bool is_lower = character >= 'a' && character <= 'f';
+ bool is_upper = character >= 'A' && character <= 'F';
+ if (!is_digit && !is_lower && !is_upper) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // Builds a string from the bytes in [start, end), reassembling UTF-8.
+ private static string byte_range(string source, int start, int end)
+ {
+ var builder = new StringBuilder();
+ for (int index = start; index < end; index++) {
+ builder.append_c(source[index]);
+ }
+ return builder.str;
+ }
+ }
+}
diff --git a/src/modules/Tasks/ui/TaskRow.vala b/src/modules/Tasks/ui/TaskRow.vala
index 38e8271..ebe5b99 100644
--- a/src/modules/Tasks/ui/TaskRow.vala
+++ b/src/modules/Tasks/ui/TaskRow.vala
@@ -9,17 +9,21 @@ namespace Queue.Tasks {
[GtkChild]
private unowned Gtk.Image important_icon;
[GtkChild]
+ private unowned Gtk.Image completed_icon;
+ [GtkChild]
private unowned Gtk.Label title_label;
[GtkChild]
private unowned Gtk.ToggleButton expand_button;
[GtkChild]
- private unowned Gtk.Button edit_button;
- [GtkChild]
- private unowned Gtk.Button delete_button;
- [GtkChild]
private unowned Gtk.Revealer description_revealer;
[GtkChild]
private unowned Gtk.Label description_label;
+ [GtkChild]
+ private unowned Gtk.MenuButton menu_button;
+ [GtkChild]
+ private unowned Gtk.Button edit_item;
+ [GtkChild]
+ private unowned Gtk.Button delete_item;
public Task task { get; private set; }
@@ -34,12 +38,15 @@ namespace Queue.Tasks {
check_button.active = task.done;
refresh_title();
refresh_description();
+ refresh_completed();
important_icon.visible = task.important;
task.notify["done"].connect(() => {
check_button.active = task.done;
refresh_title();
+ refresh_completed();
});
+ task.notify["completed_at"].connect(refresh_completed);
task.notify["title"].connect(refresh_title);
task.notify["description"].connect(refresh_description);
task.notify["important"].connect(() => {
@@ -56,24 +63,55 @@ namespace Queue.Tasks {
expand_button.icon_name = expand_button.active
? "pan-down-symbolic" : "pan-end-symbolic";
});
- edit_button.clicked.connect(() => edit_requested(task));
- delete_button.clicked.connect(() => delete_requested(task));
+ install_menu_actions();
+ }
+
+ private void install_menu_actions()
+ {
+ var actions = new SimpleActionGroup();
+
+ var edit_action = new SimpleAction("edit", null);
+ edit_action.activate.connect(() => edit_requested(task));
+ actions.add_action(edit_action);
+
+ var delete_action = new SimpleAction("delete", null);
+ delete_action.activate.connect(() => delete_requested(task));
+ actions.add_action(delete_action);
+
+ insert_action_group("row", actions);
+
+ // The custom popover does not dismiss itself on activation.
+ edit_item.clicked.connect(() => menu_button.popdown());
+ delete_item.clicked.connect(() => menu_button.popdown());
}
- // Shows the expand arrow and description only when the task has one.
private void refresh_description()
{
var description = task.description.strip();
var has_description = description != "";
- description_label.label = description;
+ description_label.set_markup(TaskDescriptionMarkup.to_pango(description));
expand_button.visible = has_description;
if (!has_description) {
expand_button.active = false;
}
}
- // Strikes through and dims the title when the task is completed.
+ private void refresh_completed()
+ {
+ completed_icon.visible = task.done;
+ completed_icon.tooltip_text = completion_tooltip();
+ }
+
+ private string completion_tooltip()
+ {
+ var utc = new DateTime.from_iso8601(task.completed_at.replace(" ", "T") + "Z", null);
+ if (utc == null) {
+ return _("Completed");
+ }
+ return _("Completed on %s").printf(utc.to_local().format("%x %X"));
+ }
+
private void refresh_title()
{
if (task.done) {
diff --git a/src/modules/Tasks/ui/description-editor.ui b/src/modules/Tasks/ui/description-editor.ui
new file mode 100644
index 0000000..913da0c
--- /dev/null
+++ b/src/modules/Tasks/ui/description-editor.ui
@@ -0,0 +1,164 @@
+
+
+
+
+ vertical
+
+
+ 2
+ 6
+
+
+
+ H
+ Heading
+
+
+
+
+
+ vertical
+ 2
+
+
+ Heading 1
+
+
+
+
+
+ Heading 2
+
+
+
+
+
+ Heading 3
+
+
+
+
+
+ Normal text
+
+
+
+
+
+
+
+
+
+
+
+ vertical
+ 4
+ 4
+
+
+
+
+ format-text-bold-symbolic
+ Bold
+
+
+
+
+
+ format-text-italic-symbolic
+ Italic
+
+
+
+
+
+ format-text-underline-symbolic
+ Underline
+
+
+
+
+
+ format-text-strikethrough-symbolic
+ Strikethrough
+
+
+
+
+
+ color-select-symbolic
+ Text color
+
+
+
+
+
+ vertical
+ 4
+ 4
+
+
+
+
+ view-list-bullet-symbolic
+ Bulleted list
+
+
+
+
+
+ view-list-ordered-symbolic
+ Numbered list
+
+
+
+
+
+
+
+ never
+ 280
+ true
+
+
+
+ word-char
+ false
+ 6
+ 6
+ 6
+ 6
+
+
+
+
+
+
diff --git a/src/modules/Tasks/ui/task-list-panel.ui b/src/modules/Tasks/ui/task-list-panel.ui
index 4603ff4..16093b9 100644
--- a/src/modules/Tasks/ui/task-list-panel.ui
+++ b/src/modules/Tasks/ui/task-list-panel.ui
@@ -14,14 +14,7 @@
Search Tasksfalse
-
-
-
- list-add-symbolic
- New Task
- false
-
-
+
Filter by status
@@ -37,6 +30,17 @@
+
+
+ list-add-symbolic
+ New Task
+ false
+
+
+
@@ -91,20 +95,16 @@
-
-
-
- start
- none
- 18
- 18
- 12
- 12
-
-
-
+
+ start
+ none
+ 18
+ 18
+ 12
+ 12
+
diff --git a/src/modules/Tasks/ui/task-row.ui b/src/modules/Tasks/ui/task-row.ui
index 06a4225..6aaccdb 100644
--- a/src/modules/Tasks/ui/task-row.ui
+++ b/src/modules/Tasks/ui/task-row.ui
@@ -59,23 +59,55 @@
-
- document-edit-symbolic
+
+ info-outline-symboliccenter
- Edit Task
+ false
-
- user-trash-symbolic
+
+ view-more-symboliccenter
- Delete Task
+ Task Options
+
+
+
+
+ vertical
+ 6
+ 6
+ 6
+ 6
+ 6
+
+
+ row.edit
+ Edit
+
+
+
+
+
+ row.delete
+ Delete
+
+
+
+
+
+
+
diff --git a/src/modules/Tasks/validators/TaskStoreValidator.vala b/src/modules/Tasks/validators/TaskStoreValidator.vala
index bda02d7..032309c 100644
--- a/src/modules/Tasks/validators/TaskStoreValidator.vala
+++ b/src/modules/Tasks/validators/TaskStoreValidator.vala
@@ -5,7 +5,7 @@ namespace Queue.Tasks {
{
public const int MAXIMUM_TITLE_LENGTH = 255;
- public const int MAXIMUM_DESCRIPTION_LENGTH = 500;
+ public const int MAXIMUM_DESCRIPTION_LENGTH = 10000;
private string title;
private string description;