From 1da82f21fc59c1f386f2aae018c756ab6fea7ad9 Mon Sep 17 00:00:00 2001 From: Felitendo Date: Sat, 26 Sep 2026 19:37:06 +0200 Subject: [PATCH] feat: ask which lock screen to use on hyprland and niri --- CMakeLists.txt | 11 +- README.md | 34 +- doc/face-unlock.1.scd | 19 +- po/de.po | 370 ++++++++++++------ po/es.po | 371 ++++++++++++------ po/face-unlock.pot | 352 +++++++++++------ po/fr.po | 375 ++++++++++++------ po/it.po | 369 ++++++++++++------ po/ja.po | 368 ++++++++++++------ po/ko.po | 365 ++++++++++++------ po/nl.po | 371 ++++++++++++------ po/pl.po | 364 ++++++++++++------ po/pt_BR.po | 371 ++++++++++++------ po/ru.po | 370 ++++++++++++------ po/tr.po | 373 ++++++++++++------ po/uk.po | 368 ++++++++++++------ po/zh_CN.po | 359 ++++++++++++------ res/screenshots/lock-choice.png | Bin 0 -> 148626 bytes src/agent/lockers.h | 3 +- src/agent/lockpreview.cpp | 647 ++++++++++++++++++++++++++++++++ src/agent/lockpreview.h | 37 ++ src/agent/locktext.cpp | 86 +++++ src/agent/locktext.h | 37 ++ src/agent/main.cpp | 71 +++- src/agent/qml/LockChoice.qml | 264 +++++++++++++ src/agent/qml/LockPreview.qml | 249 ++++++++++++ src/agent/qml/LockScreen.qml | 13 +- src/agent/userconfig.cpp | 1 + src/agent/userconfig.h | 9 + src/face-unlock | 8 +- src/lib/common.sh | 2 + src/lib/menu.sh | 35 +- src/lib/system.sh | 123 ++++++ tests/test_lockpreview.cpp | 133 +++++++ 34 files changed, 5319 insertions(+), 1609 deletions(-) create mode 100644 res/screenshots/lock-choice.png create mode 100644 src/agent/lockpreview.cpp create mode 100644 src/agent/lockpreview.h create mode 100644 src/agent/locktext.cpp create mode 100644 src/agent/locktext.h create mode 100644 src/agent/qml/LockChoice.qml create mode 100644 src/agent/qml/LockPreview.qml create mode 100644 tests/test_lockpreview.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 30c68c2..b4abead 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -160,6 +160,8 @@ if(FU_BUILD_AGENT) src/agent/sessionlock.cpp src/agent/lockscreencontroller.cpp src/agent/wallpaper.cpp + src/agent/locktext.cpp + src/agent/lockpreview.cpp src/agent/enrollcontroller.cpp ) target_include_directories(face-unlock-agent PRIVATE src/agent) @@ -176,7 +178,7 @@ if(FU_BUILD_AGENT) # see each other (and the Theme singleton) without importing anything. # Under /qt/qml, which the engine searches, or an installed agent finds no # types (the build directory only works by its FaceUnlock/qmldir). - set(FU_QML_FILES Theme FaceGlyph LockGlyph Checkmark Bubble TickRing Enroll PillButton LockScreen) + set(FU_QML_FILES Theme FaceGlyph LockGlyph Checkmark Bubble TickRing Enroll PillButton LockScreen LockChoice LockPreview) foreach(f ${FU_QML_FILES}) set_source_files_properties(src/agent/qml/${f}.qml PROPERTIES QT_RESOURCE_ALIAS ${f}.qml) endforeach() @@ -199,6 +201,8 @@ if(FU_BUILD_AGENT) src/agent/qml/Enroll.qml src/agent/qml/PillButton.qml src/agent/qml/LockScreen.qml + src/agent/qml/LockChoice.qml + src/agent/qml/LockPreview.qml ) target_link_libraries(face-unlock-agent PRIVATE @@ -242,6 +246,11 @@ if(FU_BUILD_TESTS) target_link_libraries(test_wallpaper PRIVATE Qt6::Core) add_test(NAME wallpaper COMMAND test_wallpaper) + add_executable(test_lockpreview tests/test_lockpreview.cpp src/agent/lockpreview.cpp) + target_include_directories(test_lockpreview PRIVATE src/agent) + target_link_libraries(test_lockpreview PRIVATE Qt6::Gui KF6::I18n) + add_test(NAME lockpreview COMMAND test_lockpreview) + add_executable(test_lockers tests/test_lockers.cpp src/agent/lockers.cpp) target_include_directories(test_lockers PRIVATE src/agent) target_link_libraries(test_lockers PRIVATE Qt6::Core) diff --git a/README.md b/README.md index 38a5948..95d0184 100644 --- a/README.md +++ b/README.md @@ -74,23 +74,33 @@ desktops, on Wayland: |---|---|---|---| | KDE Plasma 6 | ✅ | ✅ | ✅ above the lock screen too | | GNOME | ✅ | ✅ | ✅ above the lock screen too | -| Hyprland | ✅ hyprlock, swaylock, gtklock, waylock, or face-unlock's own | ✅ | ✅ on face-unlock's own lock screen too | -| Niri | ✅ swaylock, hyprlock, gtklock, waylock, or face-unlock's own | ✅ | ✅ on face-unlock's own lock screen too | +| Hyprland | ✅ hyprlock, swaylock, gtklock, waylock, or face-unlock's own | ✅ | ✅ on face-unlock's own lock screen too, as a line of text in hyprlock | +| Niri | ✅ swaylock, hyprlock, gtklock, waylock, or face-unlock's own | ✅ | ✅ on face-unlock's own lock screen too, as a line of text in hyprlock | On GNOME a small GNOME extension draws the bubble. Turning face unlock on switches it on; right after installing, log out and back in once. -On Hyprland and Niri the lock screen is a program of your choice, and only it -can open itself. So face-unlock goes into its password check, as with sudo: -press Enter on the empty password field to scan. hyprlock and swaylock also -scan by themselves when you come back, and so does gtklock after 4.0.0 (the -first to open from outside). Those lock screens cover the bubble, which shows -the tick once they are gone. gtklock shows face unlock's messages. +On Hyprland and Niri the lock screen is a program of your choice. When you +turn face unlock on, a window shows your screen both ways and asks which you +want: face-unlock's lock screen with your wallpaper, or yours, rebuilt from its +config. You can change it later under **Settings**. -For the bubble on the lock screen, use face-unlock's own: `face-unlock lock`. -It shows the wallpaper of your desktop (from swaybg, awww, hyprpaper or -wpaperd). Under **Settings** you can pick a picture instead, or a folder to take -one from at random, blurred if you like. +

+ The window that asks which lock screen to use: face-unlock's with the bubble on the left, the user's own hyprlock with a line of text at the top on the right +

+ +- **face-unlock's lock screen**, with the bubble, the time and the wallpaper of + your desktop (from swaybg, awww, hyprpaper or wpaperd). You lock with + `face-unlock lock`, and the menu shows where to put that. Under **Settings** + you can pick a picture instead, or a folder to take one from at random, + blurred if you like. +- **Keep your lock screen.** Only it can open itself, so face-unlock goes into + its password check, as with sudo: press Enter on the empty password field to + scan. hyprlock and swaylock also scan by themselves when you come back, and + so does gtklock after 4.0.0 (the first to open from outside). They cover the + bubble, but hyprlock shows what face unlock is doing as a line of text at the + top (face-unlock adds that line to your `hyprlock.conf`), and gtklock shows + its messages. swaylock and waylock have no way to show them. Admin prompts and setting up a face need a polkit agent there (for example hyprpolkitagent). Hyprland without uwsm does not start the part that watches diff --git a/doc/face-unlock.1.scd b/doc/face-unlock.1.scd index da015d3..facc74c 100644 --- a/doc/face-unlock.1.scd +++ b/doc/face-unlock.1.scd @@ -247,8 +247,16 @@ so does the bubble, above the lock screen too. sets *LockedHint*), scans when somebody comes back, and opens them with SIGUSR1. It only does so once the lock screen handles SIGUSR1: before it has locked, the signal would kill it. Those lock screens cover the - bubble, which shows the tick once they are gone. gtklock shows the - messages of the PAM module. + bubble. hyprlock shows it as a line of text instead: a label in + _~/.config/hypr/hyprlock.conf_ (a *source* line under a face-unlock + comment) reads what the agent writes, and SIGUSR2 makes hyprlock read + it again. gtklock shows the messages of the PAM module; swaylock and + waylock show none. + + *enable* asks once in a window which way to go: face-unlock's lock + screen, or the user's own with that line of text. The window shows the + screen both ways, the user's own rebuilt from the config of hyprlock or + swaylock. *Which lock screen* under *Settings* opens it again. For the bubble on the lock screen there is face-unlock's own: *lock*. It shows the time, a password field (PAM service _face-unlock-lock_ @@ -336,6 +344,13 @@ _$XDG_RUNTIME_DIR/face-unlock/agent.socket_ _$XDG_RUNTIME_DIR/face-unlock/locked_ There while face-unlock's own lock screen is up. +_$XDG_RUNTIME_DIR/face-unlock/lock-text_ + What hyprlock shows at the top when the user keeps their own lock + screen. + +_~/.config/face-unlock/hyprlock.conf_ + The label for that, which _~/.config/hypr/hyprlock.conf_ sources. + _/usr/share/gnome-shell/extensions/face-unlock@loonixtools.github.io/_ The GNOME Shell extension that draws the bubble on GNOME. diff --git a/po/de.po b/po/de.po index a4461b5..f52f476 100644 --- a/po/de.po +++ b/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.0\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: 2026-09-23 22:32+0200\n" "Last-Translator: Felitendo\n" "Language-Team: German\n" @@ -59,8 +59,9 @@ msgstr "Es wurde kein Gesicht hinzugefügt." msgid "First, set up your face." msgstr "Richte zuerst dein Gesicht ein." -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "Einstellung konnte nicht gespeichert werden." @@ -84,7 +85,16 @@ msgstr "" msgid "Log out and back in once: then GNOME shows the bubble too." msgstr "Melde dich einmal ab und wieder an: dann zeigt GNOME die Bubble auch." -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "Wähle deinen Sperrbildschirm im Fenster." + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "" +"Kein Sperrbildschirm gewählt. Das geht später auch unter Einstellungen." + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " @@ -93,102 +103,102 @@ msgstr "" "Der Sperrbildschirm (%s) nimmt dein Gesicht auch. Scannt er nicht, wenn du " "zurückkommst, drück Enter im leeren Passwortfeld." -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "" "Die Gesichtsentsperrung ist an. Sperre den Bildschirm und schau ihn an, um " "es auszuprobieren." -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "Sie kann auch sudo und Admin-Abfragen übernehmen. Siehe Einstellungen." -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "" "Die Gesichtsentsperrung ist aus. Deine Gesichter bleiben erhalten; löschen " "kannst du sie unter Gesichter." -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "Es ist noch kein Gesicht eingerichtet." -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "an" -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "aus" -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "%s Aufnahmen, %s dazugelernt" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "Welches Gesicht? Die IDs zeigt `%s faces`." -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "Gelöscht." -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "Aufruf: face-unlock [Befehl]" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "Befehle:" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "Gesichtsentsperrung einschalten" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "Ausschalten (Gesichter bleiben erhalten)" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "Gesicht hinzufügen" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "Gesichter auflisten" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "Ein Gesicht löschen" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "In die Kamera schauen und sehen, was sie sieht" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "Bildschirm sperren" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "Anzeigen, was eingeschaltet ist" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "Diese Hilfe anzeigen" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "Die Version anzeigen" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "Ohne Befehl wird ein interaktives Menü angezeigt." -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." @@ -196,42 +206,42 @@ msgstr "" "Starte das als dein eigener Benutzer, nicht als root. Wenn nötig, wird nach " "deinem Passwort gefragt." -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "Unbekannter Befehl: %s" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "nie" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "gerade eben" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "vor 1 Minute" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "vor %d Minuten" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "vor 1 Stunde" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "vor %d Stunden" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "vor 1 Tag" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "vor %d Tagen" @@ -271,7 +281,7 @@ msgstr "" msgid "The camera could not be used." msgstr "Die Kamera konnte nicht benutzt werden." -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "Die Erkennungsmodelle fehlen. Installiere das Paket neu." @@ -375,11 +385,11 @@ msgstr "" msgid "[y/N]" msgstr "[j/N]" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "AN" -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "AUS" @@ -420,85 +430,93 @@ msgstr "langsam" msgid "%s seconds" msgstr "%s Sekunden" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "automatisch" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "face-unlock" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "deiner" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "Gesichtsentsperrung" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "Dienst" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "läuft nicht" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "Die Gesichtsentsperrung erneut einzuschalten startet ihn." -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "Gesichter" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "noch keins eingerichtet" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "alle ausgeschaltet" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "keine gefunden" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "Kamera" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "Sperrbildschirm" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "sudo" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "Admin-Abfragen" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "Sperrbildschirme" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "Foto-Prüfung" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "Pausiert" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "noch %d Minuten, oder bis das Passwort benutzt wird" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "Letzte Entsperrung" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "Der Sperrbildschirm-Dienst läuft nicht." -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." @@ -506,7 +524,7 @@ msgstr "" "Unter GNOME zeigt eine kleine GNOME-Erweiterung die Bubble. Beim Einschalten " "der Gesichtsentsperrung wird sie mit eingeschaltet." -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " @@ -516,7 +534,7 @@ msgstr "" "unlock zurückkommst (`face-unlock lock`, mit der Bubble), und öffnet sie. " "Andere Sperrbildschirme scannen mit Enter." -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." @@ -524,7 +542,7 @@ msgstr "" "Entsperrt den Sperrbildschirm, wenn er dein Gesicht sieht. Aus: Dort geht " "nur dein Passwort." -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." @@ -532,7 +550,7 @@ msgstr "" "Scannt, wenn du auf dem Sperrbildschirm eine Taste drückst oder die Maus " "bewegst, und wenn der Computer aufwacht." -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." @@ -540,7 +558,7 @@ msgstr "" "Scannt, sobald der Bildschirm gesperrt wird. Normalerweise aus: Sperrst du " "selbst, würde er gleich wieder entsperren." -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." @@ -548,7 +566,17 @@ msgstr "" "sudo nimmt dein Gesicht statt des Passworts. Passt es nicht, tippst du wie " "gewohnt dein Passwort." -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" +"Der Sperrbildschirm von face-unlock zeigt die Bubble, und du sperrst mit " +"`face-unlock lock`. Oder behalte deinen: hyprlock zeigt dann oben eine " +"Textzeile. Enter öffnet die Auswahl." + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " @@ -558,11 +586,11 @@ msgstr "" "Leer: das von deinem Desktop. Oder eine Datei, ein Ordner, aus dem zufällig " "eins genommen wird, oder `none`. Enter zum Eintippen." -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "Zeichnet das Bild hinter dem Sperrbildschirm von face-unlock weich." -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " @@ -571,7 +599,7 @@ msgstr "" "Der Sperrbildschirm nimmt dein Gesicht in seiner Passwortprüfung. Drück " "Enter im leeren Feld für einen Scan. Hier gefunden: %s." -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." @@ -579,18 +607,18 @@ msgstr "" "Die Passwort-Fenster deines Desktops und von Apps, zum Beispiel beim " "Installieren. Passt das Gesicht nicht, tippst du dein Passwort." -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "" "Du musst blinzeln oder den Kopf leicht drehen. Das hält auch ausgedruckte " "Fotos auf." -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "Keine Prüfung. Nur zum Ausprobieren einer Kamera." -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." @@ -598,22 +626,22 @@ msgstr "" "Hält Fotos auf Handy, Tablet oder Hochglanzpapier auf. Blinzeln ist nicht " "nötig. Ein matter Ausdruck kann durchkommen." -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "" "Seltener Verwechslungen, aber mit Brille oder bei schlechtem Licht erkennt " "es dich vielleicht nicht." -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "Erkennt dich leichter, aber auch jemanden, der dir sehr ähnlich sieht." -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "Der Standard. Passt für die meisten." -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." @@ -621,7 +649,7 @@ msgstr "" "Deine Augen müssen offen sein und auf den Bildschirm schauen. So entsperrt " "es nicht, wenn du wegschaust oder schläfst." -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." @@ -630,11 +658,11 @@ msgstr "" "neu einrichten. Eine Infrarot-Kamera braucht ihr Licht (linux-enable-ir-" "emitter)." -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "Wie lange die Kamera nach deinem Gesicht sucht, bevor sie aufgibt." -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." @@ -642,7 +670,7 @@ msgstr "" "Nach einem sicheren Treffer merkt es sich, wie du gerade aussiehst. So musst " "du nach neuer Frisur oder Brille nichts neu einrichten." -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." @@ -650,99 +678,99 @@ msgstr "" "Kein Scan bei zugeklapptem Laptop, zum Beispiel am Schreibtisch mit externem " "Bildschirm." -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "Die Bubble oben am Bildschirm zeigt, was die Kamera gerade macht." -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "Eine kleine Pille mit einem Schloss, das aufgeht." -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "" "Eine Insel mit einem Gesicht, das sich umschaut, danach Ringe und ein Haken." -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "Wie schnell sich die Bubble bewegt." -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "" "Zeigt die Bubble auch, wenn sudo oder eine Admin-Abfrage dein Gesicht scannt." -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "automatisch (%s)" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "(Infrarot)" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "(nicht angeschlossen)" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "wie Desktop" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "keins" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "Bild oder Ordner:" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "Nicht gefunden: %s" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "Einstellungen" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "↑↓ auswählen ←→ oder Leertaste: ändern q: zurück" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "für alle Nutzer, fragt nach deinem Passwort" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "" "Hoch/Runter: wählen, Leertaste: an/aus, r: umbenennen, d: löschen, a: " "hinzufügen, q: zurück" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "Es ist noch kein Gesicht eingerichtet. Drück a, um eins hinzuzufügen." -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "Neuer Name:" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "„%s“ löschen?" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "Gesichtsentsperrung ein- oder ausschalten" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "Ausprobieren" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "Beenden" @@ -791,6 +819,53 @@ msgstr "" "Hyprland startet den Sperrbildschirm-Dienst nicht von selbst. Füge das in %s " "ein:" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "Um damit zu sperren, trag das in %s ein und setze %s in %s:" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "" +"Um damit zu sperren, trag das bei den binds in %s ein und nutze %s in " +"swayidle:" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "" +"Um damit zu sperren, starte %s dort, wo jetzt dein Sperrbildschirm startet." + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "Du sperrst jetzt mit dem Sperrbildschirm von face-unlock." + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "" +"hyprlock zeigt oben, was face unlock gerade tut, ab dem nächsten Sperren." + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "Konnte die Zeile nicht in %s eintragen." + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "" +"Dein Sperrbildschirm bleibt, wie er ist. Drück Enter im leeren Passwortfeld, " +"um zu scannen." + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "hyprlock hat keine %s, also kann es den Text nicht zeigen." + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "Mit dem Gesicht entsperren" @@ -803,6 +878,10 @@ msgstr "Scannen, wenn du zurückkommst" msgid "Scan right after locking" msgstr "Gleich nach dem Sperren scannen" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "Welcher Sperrbildschirm" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "Hintergrundbild" @@ -972,34 +1051,47 @@ msgstr "" msgid "The face could not be added (%1)." msgstr "Das Gesicht konnte nicht hinzugefügt werden (%1)." +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "Suche dein Gesicht…" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "Falsches Passwort" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "Gesicht erkannt" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "Gesichtsentsperrung für Sperrbildschirm, sudo und Admin-Abfragen" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "Ein Gesicht einrichten." -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "Wie das neue Gesicht heißen soll." -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "Den Bildschirm sperren." -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "Die Animationen der Bubble einmal abspielen." -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "Bubble-Stil für die Demo: full oder minimal." +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "Fragt, welcher Sperrbildschirm genutzt wird, und gibt die Antwort aus." + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "Schau zum Entsperren in die Kamera." @@ -1058,7 +1150,7 @@ msgstr "" msgid "Name (optional)" msgstr "Name (optional)" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "Abbrechen" @@ -1078,14 +1170,66 @@ msgstr "Los geht's" msgid "Done" msgstr "Fertig" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "Sperrbildschirm wählen" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "Dein Sperrbildschirm" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" +"Dein Desktop überlässt den Sperrbildschirm einem Programm deiner Wahl. " +"Wähle, wie face unlock dort auftaucht. Du kannst das später unter " +"Einstellungen ändern." + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "Sperrbildschirm von face-unlock" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" +"Die Bubble oben, die Uhrzeit und dein Hintergrundbild. Dein Tastenkürzel und " +"das Sperren bei Inaktivität rufen dann face-unlock lock auf." + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "Deinen Sperrbildschirm behalten" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" +"Er bleibt, wie er ist. hyprlock zeigt oben eine Textzeile statt der Bubble. " +"Enter im leeren Passwortfeld scannt." + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "" +"Er bleibt, wie er ist, ohne Bubble. Enter im leeren Passwortfeld scannt." + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "Weiter" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "Passwort" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "Schau in die Kamera oder tippe dein Passwort" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "Tippe dein Passwort" diff --git a/po/es.po b/po/es.po index a200849..87d6174 100644 --- a/po/es.po +++ b/po/es.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.1\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: 2026-09-24 12:00+0200\n" "Last-Translator: Felitendo\n" "Language-Team: Spanish\n" @@ -58,8 +58,9 @@ msgstr "No se añadió ninguna cara." msgid "First, set up your face." msgstr "Primero, configura tu cara." -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "No se pudo guardar el ajuste." @@ -83,7 +84,16 @@ msgstr "" "Cierra la sesión y vuelve a entrar una vez: entonces GNOME también muestra " "la burbuja." -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "Elige tu pantalla de bloqueo en la ventana." + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "" +"No se eligió ninguna pantalla de bloqueo. Puedes hacerlo luego en Ajustes." + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " @@ -92,104 +102,104 @@ msgstr "" "La pantalla de bloqueo (%s) también acepta tu cara. Si no escanea cuando " "vuelves, pulsa Intro en el campo de contraseña vacío." -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "" "El desbloqueo facial está activado. Bloquea la pantalla y mírala para " "probarlo." -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "" "También funciona con sudo y las solicitudes de administrador. Consulta " "Ajustes." -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "" "El desbloqueo facial está desactivado. Tus caras se conservan; bórralas en " "Caras." -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "Todavía no hay ninguna cara configurada." -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "activado" -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "desactivado" -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "%s muestras, %s aprendidas" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "¿Qué cara? Consulta `%s faces` para ver los ID." -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "Borrado." -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "Uso: face-unlock [comando]" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "Comandos:" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "Activar el desbloqueo facial" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "Desactivarlo (las caras se conservan)" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "Añadir una cara" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "Listar las caras" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "Borrar una cara" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "Mirar a la cámara y ver lo que ve" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "Bloquear la pantalla" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "Mostrar qué está activado" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "Mostrar esta ayuda" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "Mostrar la versión" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "Sin comando se muestra un menú interactivo." -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." @@ -197,42 +207,42 @@ msgstr "" "Ejecuta esto con tu propio usuario, no como root. Pide tu contraseña cuando " "la necesita." -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "Comando desconocido: %s" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "nunca" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "ahora mismo" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "hace 1 minuto" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "hace %d minutos" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "hace 1 hora" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "hace %d horas" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "hace 1 día" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "hace %d días" @@ -272,7 +282,7 @@ msgstr "" msgid "The camera could not be used." msgstr "No se pudo usar la cámara." -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "Faltan los modelos de reconocimiento. Reinstala el paquete." @@ -376,11 +386,11 @@ msgstr "" msgid "[y/N]" msgstr "[s/N]" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "ACTIVADO" -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "DESACTIVADO" @@ -421,85 +431,93 @@ msgstr "lenta" msgid "%s seconds" msgstr "%s segundos" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "automática" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "la de face-unlock" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "la tuya" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "Desbloqueo facial" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "Servicio" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "detenido" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "Al volver a activar el desbloqueo facial, se inicia." -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "Caras" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "ninguna configurada aún" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "todas desactivadas" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "ninguna encontrada" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "Cámara" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "Pantalla de bloqueo" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "sudo" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "Solicitudes de administrador" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "Pantallas de bloqueo" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "Detección de fotos" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "En pausa" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "%d minutos más, o hasta que se use la contraseña" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "Último desbloqueo" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "El agente de la pantalla de bloqueo no se está ejecutando." -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." @@ -507,7 +525,7 @@ msgstr "" "En GNOME, una pequeña extensión de GNOME muestra la burbuja. Al activar el " "desbloqueo facial se activa también." -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " @@ -517,7 +535,7 @@ msgstr "" "de face-unlock (`face-unlock lock`, con la burbuja) y los abre. Las demás " "pantallas de bloqueo escanean con Intro." -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." @@ -525,7 +543,7 @@ msgstr "" "Desbloquea la pantalla de bloqueo cuando ve tu cara. Desactivado: ahí solo " "sirve tu contraseña." -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." @@ -533,7 +551,7 @@ msgstr "" "Escanea cuando pulsas una tecla o mueves el ratón en la pantalla de bloqueo, " "y cuando el equipo se despierta." -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." @@ -541,7 +559,7 @@ msgstr "" "Escanea en cuanto se bloquea la pantalla. Desactivado por defecto: si la " "bloqueas tú, se desbloquearía enseguida." -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." @@ -549,7 +567,17 @@ msgstr "" "sudo usa tu cara en lugar de la contraseña. Si no coincide, escribes la " "contraseña como siempre." -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" +"La pantalla de bloqueo de face-unlock muestra la burbuja, y bloqueas con " +"`face-unlock lock`. O quédate con la tuya: hyprlock muestra entonces una " +"línea de texto arriba. Intro abre la elección." + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " @@ -559,11 +587,11 @@ msgstr "" "lock`). Vacío: la de tu escritorio. O un archivo, una carpeta de la que se " "elige una al azar, o `none`. Intro para escribirla." -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "Desenfoca la imagen detrás de la pantalla de bloqueo de face-unlock." -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " @@ -572,7 +600,7 @@ msgstr "" "La pantalla de bloqueo acepta tu cara en su comprobación de contraseña. " "Pulsa Intro en el campo vacío para escanear. Encontradas aquí: %s." -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." @@ -580,18 +608,18 @@ msgstr "" "Las ventanas de contraseña de tu escritorio y de las aplicaciones, por " "ejemplo al instalar software. Si no coincide, escribes la contraseña." -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "" "Tienes que parpadear o girar un poco la cabeza. Esto también frena las fotos " "impresas." -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "Sin comprobación. Solo para probar una cámara." -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." @@ -599,24 +627,24 @@ msgstr "" "Frena fotos en un móvil, una tableta o papel brillante. No hace falta " "parpadear. Una foto impresa en papel mate puede pasar." -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "" "Menos coincidencias erróneas, pero puede que no te reconozca con gafas o con " "poca luz." -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "" "Te reconoce con más facilidad, pero también a alguien que se parezca mucho a " "ti." -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "El valor por defecto. Adecuado para la mayoría." -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." @@ -624,7 +652,7 @@ msgstr "" "Tus ojos tienen que estar abiertos y mirando a la pantalla. Así no se " "desbloquea mientras miras a otro lado o duermes." -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." @@ -633,11 +661,11 @@ msgstr "" "tu cara. Una cámara infrarroja necesita su luz encendida (linux-enable-ir-" "emitter)." -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "Cuánto tiempo busca la cámara tu cara antes de rendirse." -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." @@ -645,7 +673,7 @@ msgstr "" "Tras una coincidencia segura, recuerda tu aspecto actual. Así, un corte de " "pelo nuevo o unas gafas no piden configurar de nuevo." -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." @@ -653,102 +681,102 @@ msgstr "" "Sin escaneo mientras el portátil está cerrado, por ejemplo en un escritorio " "con una pantalla externa." -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "" "La burbuja en la parte superior de la pantalla muestra lo que hace la cámara." -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "Una pequeña pastilla con un candado que se abre." -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "" "Una isla con una cara que mira alrededor, luego anillos y una marca de " "verificación." -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "La velocidad a la que se mueve la burbuja." -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "" "Muestra la burbuja también cuando sudo o una solicitud de administrador " "escanea tu cara." -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "automática (%s)" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "(infrarroja)" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "(no conectada)" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "como el escritorio" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "ninguna" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "Imagen o carpeta:" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "No encontrado: %s" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "Ajustes" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "↑↓ elegir ←→ o Espacio: cambiar q: volver" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "para todos los usuarios, pide tu contraseña" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "" "Arriba/Abajo: elegir, Espacio: activar/desactivar, r: renombrar, d: borrar, " "a: añadir, q: volver" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "Todavía no hay ninguna cara configurada. Pulsa a para añadir una." -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "Nuevo nombre:" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "¿Borrar «%s»?" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "Activar o desactivar el desbloqueo facial" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "Probarlo" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "Salir" @@ -796,6 +824,54 @@ msgstr "" "Hyprland no inicia por sí solo el agente de la pantalla de bloqueo. Añade " "esto a %s:" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "Para bloquear con ella, añade esto a %s y pon %s en %s:" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "" +"Para bloquear con ella, añade esto a los binds de %s y usa %s en swayidle:" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "" +"Para bloquear con ella, ejecuta %s donde ahora se inicia tu pantalla de " +"bloqueo." + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "Ahora bloqueas con la pantalla de bloqueo de face-unlock." + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "" +"hyprlock muestra arriba lo que hace face unlock, a partir del próximo " +"bloqueo." + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "No se pudo añadir la línea a %s." + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "" +"Tu pantalla de bloqueo se queda como está. Pulsa Intro en el campo de " +"contraseña vacío para escanear." + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "hyprlock no tiene %s, así que no puede mostrar el texto." + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "Desbloquear con tu cara" @@ -808,6 +884,10 @@ msgstr "Escanear cuando vuelvas" msgid "Scan right after locking" msgstr "Escanear justo después de bloquear" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "Qué pantalla de bloqueo" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "Fondo de pantalla" @@ -975,36 +1055,49 @@ msgstr "" msgid "The face could not be added (%1)." msgstr "No se pudo añadir la cara (%1)." +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "Buscando tu cara…" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "Contraseña incorrecta" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "Cara reconocida" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "" "Desbloqueo facial para la pantalla de bloqueo, sudo y las solicitudes de " "administrador" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "Configurar una cara." -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "Cómo llamar a la nueva cara." -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "Bloquear la pantalla." -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "Reproducir una vez las animaciones de la burbuja." -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "Estilo de burbuja para la demo: full o minimal." +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "Pregunta qué pantalla de bloqueo usar e imprime la respuesta." + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "Mira a la cámara para desbloquear." @@ -1063,7 +1156,7 @@ msgstr "" msgid "Name (optional)" msgstr "Nombre (opcional)" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "Cancelar" @@ -1083,14 +1176,66 @@ msgstr "Empezar" msgid "Done" msgstr "Hecho" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "Elige tu pantalla de bloqueo" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "Tu pantalla de bloqueo" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" +"Tu escritorio deja la pantalla de bloqueo a un programa que tú eliges. Elige " +"cómo aparece face unlock ahí. Puedes cambiarlo luego en Ajustes." + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "Pantalla de bloqueo de face-unlock" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" +"La burbuja arriba, la hora y tu fondo de pantalla. Tu atajo y el bloqueo por " +"inactividad ejecutan entonces face-unlock lock." + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "Mantener tu pantalla de bloqueo" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" +"Se queda como está. hyprlock muestra una línea de texto arriba en lugar de " +"la burbuja. Intro en el campo de contraseña vacío escanea." + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "" +"Se queda como está, sin la burbuja. Intro en el campo de contraseña vacío " +"escanea." + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "Continuar" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "Contraseña" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "Mira a la cámara o escribe tu contraseña" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "Escribe tu contraseña" diff --git a/po/face-unlock.pot b/po/face-unlock.pot index 14daa52..e08cce4 100644 --- a/po/face-unlock.pot +++ b/po/face-unlock.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.1\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -54,8 +54,9 @@ msgstr "" msgid "First, set up your face." msgstr "" -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "" @@ -75,146 +76,154 @@ msgstr "" msgid "Log out and back in once: then GNOME shows the bubble too." msgstr "" -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "" + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "" + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " "back, press Enter on the empty password field." msgstr "" -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "" -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "" -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "" -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "" -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "" -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "" -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "" -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "" -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "" -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." msgstr "" -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "" @@ -252,7 +261,7 @@ msgstr "" msgid "The camera could not be used." msgstr "" -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "" @@ -354,11 +363,11 @@ msgstr "" msgid "[y/N]" msgstr "" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "" -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "" @@ -399,290 +408,305 @@ msgstr "" msgid "%s seconds" msgstr "" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "" -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "" -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." msgstr "" -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " "screens scan on Enter." msgstr "" -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." msgstr "" -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." msgstr "" -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." msgstr "" -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." msgstr "" -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " "random, or `none`. Enter to type it." msgstr "" -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "" -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " "empty field to scan. Found here: %s." msgstr "" -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." msgstr "" -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "" -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "" -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." msgstr "" -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "" -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "" -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "" -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." msgstr "" -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." msgstr "" -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "" -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." msgstr "" -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." msgstr "" -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "" -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "" -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "" -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "" -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "" -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "" -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "" @@ -726,6 +750,47 @@ msgid "" "Hyprland does not start the lock screen agent by itself. Add this to %s:" msgstr "" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "" + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "" + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "" + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "" + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "" + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "" + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "" @@ -738,6 +803,10 @@ msgstr "" msgid "Scan right after locking" msgstr "" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "" @@ -902,34 +971,47 @@ msgstr "" msgid "The face could not be added (%1)." msgstr "" +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "" -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "" -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "" -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "" -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "" +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "" + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "" @@ -982,7 +1064,7 @@ msgstr "" msgid "Name (optional)" msgstr "" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "" @@ -1002,14 +1084,58 @@ msgstr "" msgid "Done" msgstr "" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "" + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "" diff --git a/po/fr.po b/po/fr.po index 402331f..fd67a11 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.1\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: 2026-09-24 12:00+0200\n" "Last-Translator: Felitendo\n" "Language-Team: French\n" @@ -60,8 +60,9 @@ msgstr "Aucun visage n'a été ajouté." msgid "First, set up your face." msgstr "Configurez d'abord votre visage." -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "Impossible d'enregistrer le réglage." @@ -85,7 +86,17 @@ msgstr "" "Déconnectez-vous puis reconnectez-vous une fois : GNOME affichera alors " "aussi la bulle." -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "Choisissez votre écran de verrouillage dans la fenêtre." + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "" +"Aucun écran de verrouillage choisi. Vous pouvez le faire plus tard dans " +"Réglages." + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " @@ -94,104 +105,104 @@ msgstr "" "L'écran de verrouillage (%s) accepte aussi votre visage. S'il ne scanne pas " "à votre retour, appuyez sur Entrée dans le champ du mot de passe vide." -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "" "Le déverrouillage facial est activé. Verrouillez l'écran et regardez-le pour " "essayer." -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "" "Il fonctionne aussi pour sudo et les demandes d'administration. Voir " "Réglages." -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "" "Le déverrouillage facial est désactivé. Vos visages sont conservés ; " "supprimez-les dans Visages." -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "Aucun visage n'est encore configuré." -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "activé" -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "désactivé" -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "%s échantillons, %s appris" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "Quel visage ? Voir `%s faces` pour les identifiants." -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "Supprimé." -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "Utilisation : face-unlock [commande]" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "Commandes :" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "Activer le déverrouillage facial" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "Le désactiver (les visages sont conservés)" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "Ajouter un visage" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "Lister les visages" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "Supprimer un visage" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "Regarder la caméra et voir ce qu'elle voit" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "Verrouiller l'écran" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "Afficher ce qui est activé" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "Afficher cette aide" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "Afficher la version" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "Sans commande, un menu interactif s'affiche." -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." @@ -199,42 +210,42 @@ msgstr "" "Lancez ceci avec votre propre utilisateur, pas en root. Le mot de passe est " "demandé quand il le faut." -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "Commande inconnue : %s" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "jamais" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "à l'instant" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "il y a 1 minute" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "il y a %d minutes" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "il y a 1 heure" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "il y a %d heures" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "il y a 1 jour" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "il y a %d jours" @@ -274,7 +285,7 @@ msgstr "" msgid "The camera could not be used." msgstr "La caméra n'a pas pu être utilisée." -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "Les modèles de reconnaissance sont absents. Réinstallez le paquet." @@ -380,11 +391,11 @@ msgstr "" msgid "[y/N]" msgstr "[o/N]" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "ACTIVÉ" -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "DÉSACTIVÉ" @@ -425,85 +436,93 @@ msgstr "lent" msgid "%s seconds" msgstr "%s secondes" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "automatique" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "celui de face-unlock" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "le vôtre" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "Déverrouillage facial" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "Service" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "arrêté" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "Réactiver le déverrouillage facial le démarre." -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "Visages" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "aucun configuré pour l'instant" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "tous désactivés" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "aucune trouvée" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "Caméra" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "Écran de verrouillage" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "sudo" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "Demandes d'administration" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "Écrans de verrouillage" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "Contrôle anti-photo" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "En pause" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "encore %d minutes, ou jusqu'à l'utilisation du mot de passe" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "Dernier déverrouillage" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "L'agent de l'écran de verrouillage ne tourne pas." -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." @@ -511,7 +530,7 @@ msgstr "" "Sous GNOME, une petite extension GNOME affiche la bulle. Activer le " "déverrouillage facial l'active aussi." -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " @@ -521,7 +540,7 @@ msgstr "" "de face-unlock (`face-unlock lock`, avec la bulle) et les ouvre. Les autres " "écrans de verrouillage scannent avec Entrée." -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." @@ -529,7 +548,7 @@ msgstr "" "Déverrouille l'écran de verrouillage quand il voit votre visage. Désactivé : " "seul votre mot de passe fonctionne." -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." @@ -537,7 +556,7 @@ msgstr "" "Scanne quand vous appuyez sur une touche ou bougez la souris sur l'écran de " "verrouillage, et au réveil de l'ordinateur." -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." @@ -545,7 +564,7 @@ msgstr "" "Scanne dès que l'écran se verrouille. Désactivé par défaut : si vous " "verrouillez vous-même, il se déverrouillerait aussitôt." -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." @@ -553,7 +572,17 @@ msgstr "" "sudo prend votre visage au lieu du mot de passe. Sinon, vous tapez le mot de " "passe comme d'habitude." -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" +"L'écran de verrouillage de face-unlock affiche la bulle, et vous verrouillez " +"avec `face-unlock lock`. Ou gardez le vôtre : hyprlock affiche alors une " +"ligne de texte en haut. Entrée ouvre le choix." + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " @@ -563,11 +592,11 @@ msgstr "" "lock`). Vide : celle de votre bureau. Ou un fichier, un dossier où en " "prendre une au hasard, ou `none`. Entrée pour la saisir." -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "Floute l'image derrière l'écran de verrouillage de face-unlock." -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " @@ -576,7 +605,7 @@ msgstr "" "L'écran de verrouillage accepte votre visage dans sa vérification du mot de " "passe. Appuyez sur Entrée dans le champ vide pour scanner. Trouvés ici : %s." -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." @@ -584,18 +613,18 @@ msgstr "" "Les fenêtres de mot de passe de votre bureau et des applications, par " "exemple pour installer un logiciel. Sinon, vous tapez le mot de passe." -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "" "Vous devez cligner des yeux ou tourner un peu la tête. Cela bloque aussi les " "photos imprimées." -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "Aucun contrôle. Seulement pour essayer une caméra." -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." @@ -603,24 +632,24 @@ msgstr "" "Bloque les photos sur un téléphone, une tablette ou du papier brillant. Pas " "besoin de cligner des yeux. Une photo imprimée mate peut passer." -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "" "Moins d'erreurs de correspondance, mais il peut ne pas vous reconnaître avec " "des lunettes ou sous une mauvaise lumière." -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "" "Vous reconnaît plus facilement, mais aussi quelqu'un qui vous ressemble " "beaucoup." -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "La valeur par défaut. Convient à la plupart des gens." -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." @@ -628,7 +657,7 @@ msgstr "" "Vos yeux doivent être ouverts et tournés vers l'écran. Ainsi, rien ne se " "déverrouille quand vous regardez ailleurs ou dormez." -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." @@ -637,11 +666,11 @@ msgstr "" "reconfigurez votre visage. Une caméra infrarouge doit avoir sa lumière " "allumée (linux-enable-ir-emitter)." -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "Combien de temps la caméra cherche votre visage avant d'abandonner." -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." @@ -650,7 +679,7 @@ msgstr "" "nouvelle coupe ou des lunettes ne demandent donc pas de nouvelle " "configuration." -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." @@ -658,101 +687,101 @@ msgstr "" "Pas de scan quand le portable est fermé, par exemple à un bureau avec un " "écran externe." -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "La bulle en haut de l'écran montre ce que fait la caméra." -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "Une petite pilule avec un cadenas qui s'ouvre." -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "" "Un îlot avec un visage qui regarde autour de lui, puis des anneaux et une " "coche." -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "La vitesse à laquelle la bulle bouge." -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "" "Affiche aussi la bulle quand sudo ou une demande d'administration scanne " "votre visage." -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "automatique (%s)" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "(infrarouge)" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "(non branchée)" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "comme le bureau" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "aucun" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "Image ou dossier :" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "Introuvable : %s" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "Réglages" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "↑↓ choisir ←→ ou Espace : changer q : retour" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "pour tous, demande votre mot de passe" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "" "Haut/Bas : choisir, Espace : activer/désactiver, r : renommer, d : " "supprimer, a : ajouter, q : retour" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "Aucun visage n'est encore configuré. Appuyez sur a pour en ajouter un." -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "Nouveau nom :" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "Supprimer « %s » ?" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "Activer ou désactiver le déverrouillage facial" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "Essayer" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "Quitter" @@ -801,6 +830,56 @@ msgstr "" "Hyprland ne démarre pas l'agent de l'écran de verrouillage tout seul. " "Ajoutez ceci à %s :" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "Pour verrouiller avec, ajoutez ceci à %s, et mettez %s dans %s :" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "" +"Pour verrouiller avec, ajoutez ceci aux binds de %s, et utilisez %s dans " +"swayidle :" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "" +"Pour verrouiller avec, lancez %s là où votre écran de verrouillage démarre " +"aujourd'hui." + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "" +"Vous verrouillez maintenant avec l'écran de verrouillage de face-unlock." + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "" +"hyprlock affiche en haut ce que fait face unlock, dès le prochain " +"verrouillage." + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "Impossible d'ajouter la ligne à %s." + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "" +"Votre écran de verrouillage reste tel quel. Appuyez sur Entrée dans le champ " +"de mot de passe vide pour scanner." + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "hyprlock n'a pas de %s, il ne peut donc pas afficher le texte." + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "Déverrouiller avec votre visage" @@ -813,6 +892,10 @@ msgstr "Scanner à votre retour" msgid "Scan right after locking" msgstr "Scanner juste après le verrouillage" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "Quel écran de verrouillage" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "Fond d'écran" @@ -980,36 +1063,49 @@ msgstr "La caméra est occupée par un autre scan. Réessayez dans un instant." msgid "The face could not be added (%1)." msgstr "Le visage n'a pas pu être ajouté (%1)." +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "Recherche de votre visage…" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "Mot de passe incorrect" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "Visage reconnu" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "" "Déverrouillage facial pour l'écran de verrouillage, sudo et les demandes " "d'administration" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "Configurer un visage." -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "Le nom du nouveau visage." -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "Verrouiller l'écran." -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "Jouer une fois les animations de la bulle." -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "Style de bulle pour la démo : full ou minimal." +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "Demande quel écran de verrouillage utiliser et affiche la réponse." + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "Regardez la caméra pour déverrouiller." @@ -1069,7 +1165,7 @@ msgstr "" msgid "Name (optional)" msgstr "Nom (facultatif)" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "Annuler" @@ -1089,14 +1185,67 @@ msgstr "Commencer" msgid "Done" msgstr "Terminé" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "Choisir votre écran de verrouillage" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "Votre écran de verrouillage" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" +"Votre bureau confie l'écran de verrouillage à un programme de votre choix. " +"Choisissez comment face unlock y apparaît. Vous pourrez le changer plus tard " +"dans Réglages." + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "Écran de verrouillage de face-unlock" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" +"La bulle en haut, l'heure et votre fond d'écran. Votre raccourci et le " +"verrouillage automatique lancent alors face-unlock lock." + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "Garder votre écran de verrouillage" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" +"Il reste tel quel. hyprlock affiche une ligne de texte en haut au lieu de la " +"bulle. Entrée dans le champ de mot de passe vide lance un scan." + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "" +"Il reste tel quel, sans la bulle. Entrée dans le champ de mot de passe vide " +"lance un scan." + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "Continuer" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "Mot de passe" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "Regardez la caméra ou tapez votre mot de passe" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "Tapez votre mot de passe" diff --git a/po/it.po b/po/it.po index ff1434e..50aabca 100644 --- a/po/it.po +++ b/po/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.1\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: 2026-09-24 12:00+0200\n" "Last-Translator: Felitendo\n" "Language-Team: Italian\n" @@ -58,8 +58,9 @@ msgstr "Nessun volto aggiunto." msgid "First, set up your face." msgstr "Per prima cosa, configura il tuo volto." -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "Impossibile salvare l'impostazione." @@ -81,7 +82,16 @@ msgstr "Impossibile attivare l'estensione di GNOME che mostra la bolla." msgid "Log out and back in once: then GNOME shows the bubble too." msgstr "Esci e rientra una volta: poi GNOME mostra anche la bolla." -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "Scegli la tua schermata di blocco nella finestra." + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "" +"Nessuna schermata di blocco scelta. Puoi farlo più tardi in Impostazioni." + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " @@ -90,102 +100,102 @@ msgstr "" "Anche la schermata di blocco (%s) accetta il tuo volto. Se non scansiona " "quando torni, premi Invio nel campo password vuoto." -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "" "Lo sblocco con il volto è attivo. Blocca lo schermo e guardalo per provarlo." -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "" "Funziona anche con sudo e le richieste di amministratore. Vedi Impostazioni." -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "" "Lo sblocco con il volto è disattivato. I tuoi volti restano salvati; " "eliminali in Volti." -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "Nessun volto ancora configurato." -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "attivo" -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "disattivo" -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "%s campioni, %s appresi" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "Quale volto? Vedi `%s faces` per gli ID." -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "Eliminato." -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "Uso: face-unlock [comando]" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "Comandi:" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "Attiva lo sblocco con il volto" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "Disattivalo (i volti restano salvati)" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "Aggiungi un volto" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "Elenca i volti" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "Elimina un volto" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "Guarda la fotocamera e vedi cosa vede" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "Blocca lo schermo" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "Mostra cosa è attivo" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "Mostra questo aiuto" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "Mostra la versione" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "Senza comando viene mostrato un menu interattivo." -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." @@ -193,42 +203,42 @@ msgstr "" "Esegui questo con il tuo utente, non come root. Chiede la password quando " "serve." -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "Comando sconosciuto: %s" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "mai" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "proprio ora" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "1 minuto fa" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "%d minuti fa" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "1 ora fa" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "%d ore fa" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "1 giorno fa" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "%d giorni fa" @@ -268,7 +278,7 @@ msgstr "" msgid "The camera could not be used." msgstr "Impossibile usare la fotocamera." -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "Mancano i modelli di riconoscimento. Reinstalla il pacchetto." @@ -373,11 +383,11 @@ msgstr "" msgid "[y/N]" msgstr "[s/N]" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "ATTIVO" -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "DISATTIVO" @@ -418,85 +428,93 @@ msgstr "lenta" msgid "%s seconds" msgstr "%s secondi" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "automatica" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "quella di face-unlock" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "la tua" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "Sblocco con il volto" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "Servizio" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "non in esecuzione" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "Riattivare lo sblocco con il volto lo avvia." -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "Volti" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "nessuno configurato" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "tutti disattivati" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "nessuna trovata" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "Fotocamera" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "Schermata di blocco" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "sudo" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "Richieste di amministratore" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "Schermate di blocco" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "Controllo foto" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "In pausa" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "ancora per %d minuti, o finché non si usa la password" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "Ultimo sblocco" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "L'agente della schermata di blocco non è in esecuzione." -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." @@ -504,7 +522,7 @@ msgstr "" "Su GNOME una piccola estensione di GNOME mostra la bolla. Attivando lo " "sblocco con il volto si attiva anche lei." -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " @@ -514,7 +532,7 @@ msgstr "" "face-unlock (`face-unlock lock`, con la bolla) e li apre. Le altre schermate " "di blocco scansionano con Invio." -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." @@ -522,7 +540,7 @@ msgstr "" "Sblocca la schermata di blocco quando vede il tuo volto. Disattivo: lì " "funziona solo la password." -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." @@ -530,7 +548,7 @@ msgstr "" "Esegue la scansione quando premi un tasto o muovi il mouse sulla schermata " "di blocco, e quando il computer si riattiva." -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." @@ -538,7 +556,7 @@ msgstr "" "Esegue la scansione appena lo schermo si blocca. Disattivo di norma: se lo " "blocchi tu, si sbloccherebbe subito." -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." @@ -546,7 +564,17 @@ msgstr "" "sudo usa il tuo volto al posto della password. Se non corrisponde, digiti la " "password come al solito." -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" +"La schermata di blocco di face-unlock mostra la bolla, e blocchi con `face-" +"unlock lock`. Oppure tieni la tua: hyprlock mostra allora una riga di testo " +"in alto. Invio apre la scelta." + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " @@ -556,11 +584,11 @@ msgstr "" "lock`). Vuoto: quella del tuo desktop. Oppure un file, una cartella da cui " "prenderne una a caso, o `none`. Invio per scriverla." -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "Sfoca l'immagine dietro la schermata di blocco di face-unlock." -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " @@ -569,7 +597,7 @@ msgstr "" "La schermata di blocco accetta il tuo volto nel controllo della password. " "Premi Invio nel campo vuoto per scansionare. Trovate qui: %s." -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." @@ -577,18 +605,18 @@ msgstr "" "Le finestre della password del tuo desktop e delle app, per esempio quando " "installi software. Se non corrisponde, digiti la password." -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "" "Devi sbattere le palpebre o girare un po' la testa. Questo ferma anche le " "foto stampate." -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "Nessun controllo. Solo per provare una fotocamera." -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." @@ -596,22 +624,22 @@ msgstr "" "Ferma le foto su un telefono, un tablet o carta lucida. Non serve sbattere " "le palpebre. Una foto stampata opaca può passare." -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "" "Meno scambi di persona, ma potrebbe non riconoscerti con gli occhiali o con " "poca luce." -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "Ti riconosce più facilmente, ma anche qualcuno che ti somiglia molto." -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "Il valore predefinito. Va bene per la maggior parte delle persone." -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." @@ -619,7 +647,7 @@ msgstr "" "I tuoi occhi devono essere aperti e rivolti allo schermo. Così non si " "sblocca mentre guardi altrove o dormi." -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." @@ -628,11 +656,11 @@ msgstr "" "nuovo il tuo volto. Una fotocamera a infrarossi ha bisogno della sua luce " "(linux-enable-ir-emitter)." -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "Per quanto tempo la fotocamera cerca il tuo volto prima di arrendersi." -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." @@ -641,7 +669,7 @@ msgstr "" "nuovo taglio di capelli o gli occhiali non richiedono una nuova " "configurazione." -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." @@ -649,99 +677,99 @@ msgstr "" "Nessuna scansione quando il portatile è chiuso, per esempio alla scrivania " "con uno schermo esterno." -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "La bolla in cima allo schermo mostra cosa sta facendo la fotocamera." -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "Una piccola pillola con un lucchetto che si apre." -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "Un'isola con un volto che si guarda intorno, poi anelli e una spunta." -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "Quanto velocemente si muove la bolla." -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "" "Mostra la bolla anche quando sudo o una richiesta di amministratore " "scansiona il tuo volto." -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "automatica (%s)" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "(infrarossi)" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "(non collegata)" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "come il desktop" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "nessuno" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "Immagine o cartella:" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "Non trovato: %s" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "Impostazioni" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "↑↓ scegli ←→ o Spazio: cambia q: indietro" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "per tutti gli utenti, chiede la tua password" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "" "Su/Giù: scegli, Spazio: attiva/disattiva, r: rinomina, d: elimina, a: " "aggiungi, q: indietro" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "Nessun volto ancora configurato. Premi a per aggiungerne uno." -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "Nuovo nome:" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "Eliminare «%s»?" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "Attiva o disattiva lo sblocco con il volto" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "Provalo" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "Esci" @@ -790,6 +818,52 @@ msgstr "" "Hyprland non avvia da solo l'agente della schermata di blocco. Aggiungi " "questo a %s:" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "Per bloccare con essa, aggiungi questo a %s e imposta %s in %s:" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "" +"Per bloccare con essa, aggiungi questo ai binds in %s e usa %s in swayidle:" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "" +"Per bloccare con essa, esegui %s dove ora parte la tua schermata di blocco." + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "Ora blocchi con la schermata di blocco di face-unlock." + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "" +"hyprlock mostra in alto cosa sta facendo face unlock, dal prossimo blocco." + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "Impossibile aggiungere la riga a %s." + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "" +"La tua schermata di blocco resta com'è. Premi Invio nel campo password vuoto " +"per la scansione." + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "hyprlock non ha %s, quindi non può mostrare il testo." + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "Sblocca con il volto" @@ -802,6 +876,10 @@ msgstr "Scansiona quando torni" msgid "Scan right after locking" msgstr "Scansiona subito dopo il blocco" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "Quale schermata di blocco" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "Sfondo" @@ -969,36 +1047,49 @@ msgstr "" msgid "The face could not be added (%1)." msgstr "Impossibile aggiungere il volto (%1)." +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "Cerco il tuo volto…" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "Password errata" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "Volto riconosciuto" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "" "Sblocco con il volto per la schermata di blocco, sudo e le richieste di " "amministratore" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "Configura un volto." -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "Come chiamare il nuovo volto." -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "Blocca lo schermo." -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "Riproduci una volta le animazioni della bolla." -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "Stile della bolla per la demo: full o minimal." +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "Chiede quale schermata di blocco usare e stampa la risposta." + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "Guarda la fotocamera per sbloccare." @@ -1058,7 +1149,7 @@ msgstr "" msgid "Name (optional)" msgstr "Nome (facoltativo)" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "Annulla" @@ -1078,14 +1169,66 @@ msgstr "Iniziamo" msgid "Done" msgstr "Fatto" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "Scegli la schermata di blocco" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "La tua schermata di blocco" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" +"Il tuo desktop lascia la schermata di blocco a un programma a tua scelta. " +"Scegli come appare face unlock lì. Puoi cambiarlo più tardi in Impostazioni." + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "Schermata di blocco di face-unlock" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" +"La bolla in alto, l'ora e il tuo sfondo. La tua scorciatoia e il blocco per " +"inattività eseguono poi face-unlock lock." + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "Tieni la tua schermata di blocco" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" +"Resta com'è. hyprlock mostra una riga di testo in alto al posto della bolla. " +"Invio nel campo password vuoto avvia la scansione." + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "" +"Resta com'è, senza la bolla. Invio nel campo password vuoto avvia la " +"scansione." + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "Continua" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "Password" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "Guarda la fotocamera o digita la password" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "Digita la password" diff --git a/po/ja.po b/po/ja.po index 14e9a40..c40cf7a 100644 --- a/po/ja.po +++ b/po/ja.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.1\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: 2026-09-24 12:00+0200\n" "Last-Translator: Felitendo\n" "Language-Team: Japanese\n" @@ -57,8 +57,9 @@ msgstr "顔は追加されませんでした。" msgid "First, set up your face." msgstr "まず顔を登録してください。" -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "設定を保存できませんでした。" @@ -81,7 +82,15 @@ msgid "Log out and back in once: then GNOME shows the bubble too." msgstr "" "一度ログアウトしてログインし直してください。GNOME でもバブルが表示されます。" -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "ウィンドウでロック画面を選んでください。" + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "ロック画面が選ばれていません。あとで設定から選べます。" + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " @@ -90,98 +99,98 @@ msgstr "" "ロック画面(%s)でも顔が使えます。戻ってきたときにスキャンしない場合は、空の" "パスワード欄で Enter を押してください。" -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "顔認証はオンです。画面をロックして、画面を見て試してください。" -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "sudo や管理者の認証にも使えます。「設定」を参照してください。" -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "顔認証はオフです。顔データは残っています。「顔」から削除できます。" -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "まだ顔が登録されていません。" -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "オン" -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "オフ" -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "サンプル %s 件、学習 %s 件" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "どの顔ですか? ID は `%s faces` で確認できます。" -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "削除しました。" -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "使い方: face-unlock [コマンド]" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "コマンド:" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "顔認証をオンにする" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "オフにする(顔データは残ります)" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "顔を追加" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "顔の一覧" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "顔を削除" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "カメラを見て、カメラに映るものを確認する" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "画面をロック" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "オンになっている機能を表示" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "このヘルプを表示" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "バージョンを表示" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "コマンドなしで起動すると、対話式メニューが表示されます。" -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." @@ -189,42 +198,42 @@ msgstr "" "root ではなく、自分のユーザーで実行してください。必要なときはパスワードを尋ね" "ます。" -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "不明なコマンド: %s" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "なし" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "たった今" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "1 分前" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "%d 分前" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "1 時間前" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "%d 時間前" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "1 日前" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "%d 日前" @@ -264,7 +273,7 @@ msgstr "" msgid "The camera could not be used." msgstr "カメラを使用できませんでした。" -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "認識モデルがありません。パッケージを再インストールしてください。" @@ -368,11 +377,11 @@ msgstr "" msgid "[y/N]" msgstr "[y/N]" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "オン" -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "オフ" @@ -413,85 +422,93 @@ msgstr "遅い" msgid "%s seconds" msgstr "%s 秒" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "自動" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "face-unlock" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "今のもの" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "顔認証" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "サービス" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "停止中" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "顔認証をもう一度オンにすると起動します。" -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "顔" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "まだ登録なし" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "すべてオフ" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "見つかりません" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "カメラ" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "ロック画面" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "sudo" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "管理者の認証" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "ロック画面" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "写真チェック" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "一時停止中" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "あと %d 分、またはパスワードが使われるまで" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "最後のロック解除" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "ロック画面エージェントが動いていません。" -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." @@ -499,7 +516,7 @@ msgstr "" "GNOME では小さな GNOME 拡張機能がバブルを表示します。顔認証をオンにすると一緒" "に有効になります。" -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " @@ -509,7 +526,7 @@ msgstr "" "き)に戻ってきたときにスキャンして開きます。ほかのロック画面は Enter でスキャ" "ンします。" -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." @@ -517,7 +534,7 @@ msgstr "" "顔を認識するとロック画面を解除します。オフ: ロック画面ではパスワードだけが使" "えます。" -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." @@ -525,7 +542,7 @@ msgstr "" "ロック画面でキーを押すかマウスを動かしたとき、そしてコンピューターがスリープ" "から復帰したときにスキャンします。" -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." @@ -533,7 +550,7 @@ msgstr "" "画面がロックされるとすぐにスキャンします。既定はオフ: 自分でロックすると、す" "ぐに解除されてしまうためです。" -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." @@ -541,7 +558,17 @@ msgstr "" "sudo でパスワードの代わりに顔を使います。一致しなければ、いつも通りパスワード" "を入力します。" -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" +"face-unlock のロック画面はバブルを表示し、`face-unlock lock` でロックします。" +"今のロック画面を使い続けることもできます: その場合 hyprlock が上部に一行のテ" +"キストを表示します。Enter で選択画面を開きます。" + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " @@ -550,11 +577,11 @@ msgstr "" "face-unlock のロック画面(`face-unlock lock`)の背景画像。空欄: デスクトップ" "と同じ画像。またはファイル、ランダムに選ぶフォルダー、`none`。Enter で入力。" -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "face-unlock のロック画面の背景画像をぼかします。" -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " @@ -563,7 +590,7 @@ msgstr "" "ロック画面のパスワード確認で顔が使えます。空の欄で Enter を押すとスキャンしま" "す。見つかったもの: %s。" -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." @@ -571,16 +598,16 @@ msgstr "" "デスクトップやアプリのパスワード画面です(ソフトウェアのインストール時な" "ど)。一致しなければパスワードを入力します。" -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "まばたきするか、少し顔を動かす必要があります。印刷した写真も防げます。" -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "チェックしません。カメラを試すときだけ使ってください。" -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." @@ -588,22 +615,22 @@ msgstr "" "スマホ、タブレット、光沢紙に映った写真を防ぎます。まばたきは不要です。つや消" "しの印刷写真は通ることがあります。" -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "" "誤認識は減りますが、眼鏡をかけているときや暗いときに認識されないことがありま" "す。" -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "認識されやすくなりますが、あなたによく似た人も認識されやすくなります。" -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "既定値です。ほとんどの人に適しています。" -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." @@ -611,7 +638,7 @@ msgstr "" "目を開けて画面を見ている必要があります。よそ見や居眠りの間にロック解除されま" "せん。" -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." @@ -619,11 +646,11 @@ msgstr "" "「自動」は最初の通常のカメラを使います。変更したら顔を登録し直してください。" "赤外線カメラはライトをオンにする必要があります(linux-enable-ir-emitter)。" -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "カメラが顔を探してからあきらめるまでの時間です。" -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." @@ -631,7 +658,7 @@ msgstr "" "確実に一致したとき、今の見た目を覚えます。髪型を変えたり眼鏡をかけたりして" "も、登録し直す必要はありません。" -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." @@ -639,96 +666,96 @@ msgstr "" "ノートパソコンを閉じているときはスキャンしません。外部モニターにつないで机で" "使う場合などです。" -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "画面上部のバブルに、カメラの状態が表示されます。" -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "鍵が開く小さなピルです。" -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "あたりを見回す顔のアイランド。そのあとリングとチェックマークが出ます。" -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "バブルが動く速さです。" -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "sudo や管理者の認証で顔をスキャンするときにもバブルを表示します。" -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "自動(%s)" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "(赤外線)" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "(未接続)" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "デスクトップと同じ" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "なし" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "画像またはフォルダー:" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "見つかりません: %s" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "設定" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "↑↓ 選択 ←→ またはスペース: 変更 q: 戻る" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "全ユーザー共通、パスワードが必要" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "" "上/下: 選択、スペース: オン/オフ、r: 名前を変更、d: 削除、a: 追加、q: 戻る" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "まだ顔が登録されていません。a を押して追加してください。" -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "新しい名前:" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "「%s」を削除しますか?" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "顔認証のオン/オフ" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "試す" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "終了" @@ -775,6 +802,52 @@ msgstr "" "Hyprland はロック画面エージェントを自動では起動しません。%s に次を追加してく" "ださい:" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "これでロックするには、%s にこれを追加し、%s を %s に書いてください:" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "" +"これでロックするには、%s の binds にこれを追加し、swayidle で %s を使ってくだ" +"さい:" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "" +"これでロックするには、今ロック画面を起動している場所で %s を実行してくださ" +"い。" + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "これから face-unlock のロック画面でロックします。" + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "次回のロックから、hyprlock が上部に face unlock の状態を表示します。" + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "%s に行を追加できませんでした。" + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "" +"ロック画面はそのままです。空のパスワード欄で Enter を押すとスキャンします。" + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "hyprlock に %s がないため、テキストを表示できません。" + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "顔でロック解除" @@ -787,6 +860,10 @@ msgstr "戻ってきたらスキャン" msgid "Scan right after locking" msgstr "ロック直後にスキャン" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "使うロック画面" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "壁紙" @@ -951,34 +1028,47 @@ msgstr "カメラは別のスキャン中です。少ししてからもう一度 msgid "The face could not be added (%1)." msgstr "顔を追加できませんでした(%1)。" +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "顔を探しています…" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "パスワードが違います" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "顔を認識しました" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "ロック画面、sudo、管理者の認証のための顔認証" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "顔を登録します。" -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "新しい顔の名前。" -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "画面をロックします。" -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "バブルのアニメーションを一度再生します。" -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "デモのバブルスタイル: full または minimal。" +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "使うロック画面を尋ね、答えを出力します。" + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "カメラを見てロックを解除してください。" @@ -1037,7 +1127,7 @@ msgstr "" msgid "Name (optional)" msgstr "名前(任意)" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "キャンセル" @@ -1057,14 +1147,66 @@ msgstr "はじめる" msgid "Done" msgstr "完了" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "ロック画面を選ぶ" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "ロック画面" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" +"このデスクトップでは、ロック画面は自分で選んだプログラムです。そこで face " +"unlock をどう表示するか選んでください。あとで設定から変更できます。" + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "face-unlock のロック画面" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" +"上部のバブル、時計、壁紙。ショートカットと自動ロックで face-unlock lock を実" +"行します。" + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "今のロック画面を使う" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" +"そのまま使えます。hyprlock はバブルの代わりに上部に一行のテキストを表示しま" +"す。空のパスワード欄で Enter を押すとスキャンします。" + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "" +"そのまま使えます。バブルはありません。空のパスワード欄で Enter を押すとスキャ" +"ンします。" + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "続ける" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "パスワード" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "カメラを見るか、パスワードを入力してください" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "パスワードを入力してください" diff --git a/po/ko.po b/po/ko.po index ea0a6b5..4f83d9c 100644 --- a/po/ko.po +++ b/po/ko.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.1\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: 2026-09-24 12:00+0200\n" "Last-Translator: Felitendo\n" "Language-Team: Korean\n" @@ -57,8 +57,9 @@ msgstr "얼굴이 추가되지 않았습니다." msgid "First, set up your face." msgstr "먼저 얼굴을 등록하세요." -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "설정을 저장하지 못했습니다." @@ -79,7 +80,15 @@ msgid "Log out and back in once: then GNOME shows the bubble too." msgstr "" "한 번 로그아웃했다가 다시 로그인하세요. 그러면 GNOME에서도 버블이 보입니다." -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "창에서 잠금 화면을 고르세요." + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "잠금 화면을 고르지 않았습니다. 나중에 설정에서 고를 수 있습니다." + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " @@ -88,142 +97,142 @@ msgstr "" "잠금 화면(%s)에서도 얼굴을 쓸 수 있습니다. 돌아왔을 때 스캔하지 않으면 빈 비" "밀번호 칸에서 Enter를 누르세요." -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "" "얼굴 잠금 해제가 켜졌습니다. 화면을 잠그고 화면을 바라보며 사용해 보세요." -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "sudo와 관리자 인증 창에서도 쓸 수 있습니다. 설정을 참고하세요." -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "" "얼굴 잠금 해제가 꺼졌습니다. 얼굴 데이터는 남아 있으며, 얼굴 메뉴에서 삭제할 " "수 있습니다." -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "아직 등록된 얼굴이 없습니다." -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "켜짐" -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "꺼짐" -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "샘플 %s개, 학습 %s개" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "어떤 얼굴인가요? ID는 `%s faces`에서 확인하세요." -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "삭제했습니다." -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "사용법: face-unlock [명령]" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "명령:" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "얼굴 잠금 해제 켜기" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "끄기 (얼굴 데이터는 유지)" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "얼굴 추가" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "얼굴 목록" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "얼굴 삭제" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "카메라를 보고 카메라에 보이는 것을 확인" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "화면 잠그기" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "켜져 있는 기능 보기" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "이 도움말 보기" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "버전 보기" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "명령 없이 실행하면 대화형 메뉴가 나옵니다." -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." msgstr "root가 아닌 본인 사용자로 실행하세요. 필요하면 비밀번호를 묻습니다." -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "알 수 없는 명령: %s" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "없음" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "방금" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "1분 전" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "%d분 전" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "1시간 전" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "%d시간 전" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "1일 전" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "%d일 전" @@ -263,7 +272,7 @@ msgstr "" msgid "The camera could not be used." msgstr "카메라를 사용할 수 없었습니다." -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "인식 모델이 없습니다. 패키지를 다시 설치하세요." @@ -367,11 +376,11 @@ msgstr "" msgid "[y/N]" msgstr "[y/N]" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "켜짐" -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "꺼짐" @@ -412,85 +421,93 @@ msgstr "느리게" msgid "%s seconds" msgstr "%s초" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "자동" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "face-unlock" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "지금 쓰는 것" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "얼굴 잠금 해제" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "서비스" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "실행 중 아님" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "얼굴 잠금 해제를 다시 켜면 시작됩니다." -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "얼굴" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "아직 없음" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "모두 꺼짐" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "찾을 수 없음" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "카메라" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "잠금 화면" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "sudo" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "관리자 인증 창" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "잠금 화면" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "사진 검사" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "일시 중지됨" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "%d분 더, 또는 비밀번호를 사용할 때까지" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "마지막 잠금 해제" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "잠금 화면 에이전트가 실행 중이 아닙니다." -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." @@ -498,7 +515,7 @@ msgstr "" "GNOME에서는 작은 GNOME 확장이 버블을 보여 줍니다. 얼굴 잠금 해제를 켜면 함께 " "켜집니다." -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " @@ -507,14 +524,14 @@ msgstr "" "hyprlock, swaylock 또는 face-unlock 자체 잠금 화면(`face-unlock lock`, 버블 " "포함)으로 돌아오면 스캔해서 엽니다. 다른 잠금 화면은 Enter로 스캔합니다." -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." msgstr "" "얼굴을 보면 잠금 화면을 해제합니다. 꺼짐: 잠금 화면에서는 비밀번호만 됩니다." -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." @@ -522,7 +539,7 @@ msgstr "" "잠금 화면에서 키를 누르거나 마우스를 움직일 때, 그리고 컴퓨터가 깨어날 때 스" "캔합니다." -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." @@ -530,7 +547,7 @@ msgstr "" "화면이 잠기자마자 스캔합니다. 기본값은 꺼짐: 직접 잠그면 곧바로 다시 풀려 버" "리기 때문입니다." -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." @@ -538,7 +555,17 @@ msgstr "" "sudo가 비밀번호 대신 얼굴을 사용합니다. 일치하지 않으면 평소처럼 비밀번호를 " "입력합니다." -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" +"face-unlock 잠금 화면은 버블을 보여 주며, `face-unlock lock`으로 잠급니다. 지" +"금 잠금 화면을 그대로 쓸 수도 있습니다: 그러면 hyprlock이 위쪽에 한 줄의 글" +"을 보여 줍니다. Enter로 선택 창을 엽니다." + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " @@ -547,11 +574,11 @@ msgstr "" "face-unlock 잠금 화면(`face-unlock lock`)의 배경 그림. 비워 두면 바탕 화면의 " "그림. 또는 파일, 무작위로 고를 폴더, `none`. Enter로 입력." -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "face-unlock 잠금 화면의 배경 그림을 흐리게 합니다." -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " @@ -560,7 +587,7 @@ msgstr "" "잠금 화면의 비밀번호 확인에서 얼굴을 받습니다. 빈 칸에서 Enter를 누르면 스캔" "합니다. 찾은 것: %s." -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." @@ -568,16 +595,16 @@ msgstr "" "데스크톱과 앱의 비밀번호 창입니다. 예를 들어 소프트웨어를 설치할 때입니다. 일" "치하지 않으면 비밀번호를 입력합니다." -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "눈을 깜빡이거나 고개를 살짝 돌려야 합니다. 인쇄한 사진도 막아 줍니다." -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "검사하지 않습니다. 카메라를 시험할 때만 쓰세요." -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." @@ -585,22 +612,22 @@ msgstr "" "휴대폰, 태블릿, 광택지에 있는 사진을 막습니다. 눈을 깜빡일 필요는 없습니다. " "무광 인쇄 사진은 통과할 수 있습니다." -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "" "잘못 일치하는 경우가 줄지만, 안경을 쓰거나 조명이 나쁘면 알아보지 못할 수 있" "습니다." -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "더 쉽게 알아보지만, 당신과 많이 닮은 사람도 알아볼 수 있습니다." -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "기본값입니다. 대부분의 사람에게 알맞습니다." -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." @@ -608,7 +635,7 @@ msgstr "" "눈을 뜨고 화면을 보고 있어야 합니다. 그래서 다른 곳을 보거나 자는 동안에는 풀" "리지 않습니다." -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." @@ -616,11 +643,11 @@ msgstr "" "자동은 첫 번째 일반 카메라를 사용합니다. 바꾼 뒤에는 얼굴을 다시 등록하세요. " "적외선 카메라는 조명을 켜야 합니다 (linux-enable-ir-emitter)." -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "카메라가 포기하기 전까지 얼굴을 찾는 시간입니다." -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." @@ -628,7 +655,7 @@ msgstr "" "확실히 일치하면 지금 모습을 기억합니다. 그래서 머리 모양이 바뀌거나 안경을 써" "도 다시 등록할 필요가 없습니다." -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." @@ -636,96 +663,96 @@ msgstr "" "노트북을 덮었을 때는 스캔하지 않습니다. 예를 들어 외부 모니터를 연결해 책상에" "서 쓸 때입니다." -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "화면 위쪽의 버블이 카메라가 하는 일을 보여 줍니다." -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "자물쇠가 열리는 작은 알약입니다." -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "주위를 둘러보는 얼굴이 있는 아일랜드, 그다음 링과 체크 표시입니다." -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "버블이 움직이는 속도입니다." -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "sudo나 관리자 인증 창이 얼굴을 스캔할 때도 버블을 보여 줍니다." -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "자동 (%s)" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "(적외선)" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "(연결 안 됨)" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "바탕 화면과 같음" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "없음" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "그림 또는 폴더:" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "찾을 수 없음: %s" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "설정" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "↑↓ 선택 ←→ 또는 스페이스: 변경 q: 뒤로" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "모든 사용자에게 적용, 비밀번호 필요" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "" "위/아래: 선택, 스페이스: 켜기/끄기, r: 이름 바꾸기, d: 삭제, a: 추가, q: 뒤로" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "아직 등록된 얼굴이 없습니다. a를 눌러 추가하세요." -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "새 이름:" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "\"%s\" 항목을 삭제할까요?" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "얼굴 잠금 해제 켜기/끄기" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "사용해 보기" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "끝내기" @@ -773,6 +800,50 @@ msgstr "" "Hyprland는 잠금 화면 에이전트를 스스로 시작하지 않습니다. %s에 다음을 추가하" "세요:" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "이것으로 잠그려면 %s에 이것을 추가하고, %s을(를) %s에 설정하세요:" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "" +"이것으로 잠그려면 %s의 binds에 이것을 추가하고, swayidle에서 %s을(를) 쓰세요:" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "" +"이것으로 잠그려면 지금 잠금 화면을 시작하는 곳에서 %s을(를) 실행하세요." + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "이제 face-unlock 잠금 화면으로 잠급니다." + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "다음 잠금부터 hyprlock이 위쪽에 face unlock이 하는 일을 보여 줍니다." + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "%s에 줄을 추가할 수 없습니다." + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "" +"잠금 화면은 그대로입니다. 빈 비밀번호 칸에서 Enter를 누르면 스캔합니다." + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "hyprlock에 %s이(가) 없어 글을 보여 줄 수 없습니다." + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "얼굴로 잠금 해제" @@ -785,6 +856,10 @@ msgstr "돌아오면 스캔" msgid "Scan right after locking" msgstr "잠근 직후 스캔" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "사용할 잠금 화면" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "배경 화면" @@ -950,34 +1025,47 @@ msgstr "카메라가 다른 스캔으로 사용 중입니다. 잠시 후 다시 msgid "The face could not be added (%1)." msgstr "얼굴을 추가하지 못했습니다 (%1)." +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "얼굴을 찾는 중…" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "비밀번호가 틀렸습니다" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "얼굴 인식됨" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "잠금 화면, sudo, 관리자 인증 창을 위한 얼굴 잠금 해제" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "얼굴을 등록합니다." -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "새 얼굴의 이름." -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "화면을 잠급니다." -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "버블 애니메이션을 한 번 재생합니다." -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "데모용 버블 스타일: full 또는 minimal." +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "사용할 잠금 화면을 묻고 답을 출력합니다." + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "잠금을 해제하려면 카메라를 보세요." @@ -1035,7 +1123,7 @@ msgstr "" msgid "Name (optional)" msgstr "이름 (선택)" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "취소" @@ -1055,14 +1143,65 @@ msgstr "시작하기" msgid "Done" msgstr "완료" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "잠금 화면 고르기" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "잠금 화면" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" +"이 데스크톱은 잠금 화면을 직접 고른 프로그램에 맡깁니다. 그곳에서 face unlock" +"이 어떻게 보일지 고르세요. 나중에 설정에서 바꿀 수 있습니다." + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "face-unlock 잠금 화면" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" +"위쪽의 버블, 시계, 배경 화면. 단축키와 자동 잠금이 face-unlock lock을 실행합" +"니다." + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "지금 잠금 화면 유지" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" +"그대로 둡니다. hyprlock이 버블 대신 위쪽에 한 줄의 글을 보여 줍니다. 빈 비밀" +"번호 칸에서 Enter를 누르면 스캔합니다." + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "" +"그대로 둡니다. 버블은 없습니다. 빈 비밀번호 칸에서 Enter를 누르면 스캔합니다." + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "계속" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "비밀번호" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "카메라를 보거나 비밀번호를 입력하세요" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "비밀번호를 입력하세요" diff --git a/po/nl.po b/po/nl.po index 01520cd..07a1bb3 100644 --- a/po/nl.po +++ b/po/nl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.1\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: 2026-09-24 12:00+0200\n" "Last-Translator: Felitendo\n" "Language-Team: Dutch\n" @@ -58,8 +58,9 @@ msgstr "Er is geen gezicht toegevoegd." msgid "First, set up your face." msgstr "Stel eerst je gezicht in." -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "Kon de instelling niet opslaan." @@ -81,7 +82,15 @@ msgstr "Kon de GNOME-extensie die de bubbel toont niet inschakelen." msgid "Log out and back in once: then GNOME shows the bubble too." msgstr "Meld je één keer af en weer aan: dan toont GNOME de bubbel ook." -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "Kies je vergrendelscherm in het venster." + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "Geen vergrendelscherm gekozen. Dat kan later ook onder Instellingen." + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " @@ -90,102 +99,102 @@ msgstr "" "Het vergrendelscherm (%s) neemt je gezicht ook. Scant het niet als je " "terugkomt, druk dan op Enter in het lege wachtwoordveld." -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "" "Gezichtsontgrendeling staat aan. Vergrendel het scherm en kijk ernaar om het " "te proberen." -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "Het werkt ook voor sudo en beheerdersvragen. Zie Instellingen." -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "" "Gezichtsontgrendeling staat uit. Je gezichten blijven bewaard; verwijder ze " "onder Gezichten." -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "Er is nog geen gezicht ingesteld." -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "aan" -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "uit" -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "%s opnames, %s bijgeleerd" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "Welk gezicht? Zie `%s faces` voor de ID's." -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "Verwijderd." -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "Gebruik: face-unlock [opdracht]" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "Opdrachten:" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "Gezichtsontgrendeling aanzetten" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "Uitzetten (gezichten blijven bewaard)" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "Een gezicht toevoegen" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "De gezichten tonen" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "Een gezicht verwijderen" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "In de camera kijken en zien wat hij ziet" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "Scherm vergrendelen" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "Tonen wat er aan staat" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "Deze hulp tonen" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "De versie tonen" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "Zonder opdracht verschijnt een interactief menu." -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." @@ -193,42 +202,42 @@ msgstr "" "Voer dit uit als je eigen gebruiker, niet als root. Het vraagt om je " "wachtwoord als dat nodig is." -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "Onbekende opdracht: %s" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "nooit" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "zojuist" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "1 minuut geleden" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "%d minuten geleden" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "1 uur geleden" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "%d uur geleden" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "1 dag geleden" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "%d dagen geleden" @@ -268,7 +277,7 @@ msgstr "" msgid "The camera could not be used." msgstr "De camera kon niet worden gebruikt." -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "De herkenningsmodellen ontbreken. Installeer het pakket opnieuw." @@ -372,11 +381,11 @@ msgstr "" msgid "[y/N]" msgstr "[j/N]" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "AAN" -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "UIT" @@ -417,85 +426,93 @@ msgstr "langzaam" msgid "%s seconds" msgstr "%s seconden" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "automatisch" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "die van face-unlock" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "de jouwe" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "Gezichtsontgrendeling" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "Dienst" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "draait niet" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "Gezichtsontgrendeling opnieuw aanzetten start hem." -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "Gezichten" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "nog geen ingesteld" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "allemaal uit" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "geen gevonden" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "Camera" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "Vergrendelscherm" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "sudo" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "Beheerdersvragen" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "Vergrendelschermen" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "Fotocontrole" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "Gepauzeerd" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "nog %d minuten, of tot het wachtwoord wordt gebruikt" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "Laatste ontgrendeling" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "De agent voor het vergrendelscherm draait niet." -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." @@ -503,7 +520,7 @@ msgstr "" "Op GNOME toont een kleine GNOME-extensie de bubbel. Als je " "gezichtsontgrendeling inschakelt, gaat die ook aan." -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " @@ -513,7 +530,7 @@ msgstr "" "van face-unlock (`face-unlock lock`, met de bubbel) en opent ze. Andere " "vergrendelschermen scannen met Enter." -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." @@ -521,7 +538,7 @@ msgstr "" "Ontgrendelt het vergrendelscherm als het je gezicht ziet. Uit: daar werkt " "alleen je wachtwoord." -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." @@ -529,7 +546,7 @@ msgstr "" "Scant als je op het vergrendelscherm een toets indrukt of de muis beweegt, " "en als de computer ontwaakt." -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." @@ -537,7 +554,7 @@ msgstr "" "Scant zodra het scherm vergrendelt. Standaard uit: vergrendel je zelf, dan " "zou het meteen weer ontgrendelen." -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." @@ -545,7 +562,17 @@ msgstr "" "sudo neemt je gezicht in plaats van het wachtwoord. Geen match: je typt " "zoals gewoonlijk je wachtwoord." -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" +"Het vergrendelscherm van face-unlock toont de bubbel, en je vergrendelt met " +"`face-unlock lock`. Of houd de jouwe: hyprlock toont dan bovenaan een regel " +"tekst. Enter opent de keuze." + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " @@ -555,11 +582,11 @@ msgstr "" "lock`). Leeg: die van je bureaublad. Of een bestand, een map waaruit er " "willekeurig een wordt gekozen, of `none`. Enter om te typen." -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "Vervaagt de afbeelding achter het vergrendelscherm van face-unlock." -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " @@ -568,7 +595,7 @@ msgstr "" "Het vergrendelscherm neemt je gezicht in zijn wachtwoordcontrole. Druk op " "Enter in het lege veld om te scannen. Hier gevonden: %s." -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." @@ -576,18 +603,18 @@ msgstr "" "De wachtwoordvensters van je bureaublad en apps, bijvoorbeeld bij het " "installeren van software. Geen match: je typt je wachtwoord." -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "" "Je moet knipperen of je hoofd een beetje draaien. Dat houdt ook geprinte " "foto's tegen." -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "Helemaal geen controle. Alleen om een camera uit te proberen." -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." @@ -595,22 +622,22 @@ msgstr "" "Houdt foto's op een telefoon, tablet of glanzend papier tegen. Knipperen is " "niet nodig. Een matte geprinte foto kan erdoor komen." -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "" "Minder verwisselingen, maar met een bril of bij slecht licht herkent het je " "misschien niet." -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "Herkent je makkelijker, maar ook iemand die veel op je lijkt." -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "De standaard. Goed voor de meeste mensen." -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." @@ -618,7 +645,7 @@ msgstr "" "Je ogen moeten open zijn en naar het scherm kijken. Zo ontgrendelt het niet " "als je wegkijkt of slaapt." -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." @@ -627,11 +654,11 @@ msgstr "" "opnieuw in. Een infraroodcamera heeft zijn lampje nodig (linux-enable-ir-" "emitter)." -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "Hoe lang de camera naar je gezicht zoekt voordat hij opgeeft." -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." @@ -639,7 +666,7 @@ msgstr "" "Na een zekere match onthoudt het hoe je er nu uitziet. Een nieuw kapsel of " "een bril vraagt dus niet om opnieuw instellen." -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." @@ -647,97 +674,97 @@ msgstr "" "Geen scan als de laptop dicht is, bijvoorbeeld aan een bureau met een extern " "scherm." -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "De bubbel boven aan het scherm laat zien wat de camera doet." -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "Een kleine pil met een slot dat opengaat." -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "Een eiland met een gezicht dat rondkijkt, daarna ringen en een vinkje." -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "Hoe snel de bubbel beweegt." -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "Toont de bubbel ook als sudo of een beheerdersvraag je gezicht scant." -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "automatisch (%s)" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "(infrarood)" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "(niet aangesloten)" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "zoals bureaublad" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "geen" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "Afbeelding of map:" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "Niet gevonden: %s" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "Instellingen" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "↑↓ kiezen ←→ of Spatie: wijzigen q: terug" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "voor alle gebruikers, vraagt om je wachtwoord" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "" "Omhoog/Omlaag: kiezen, Spatie: aan/uit, r: hernoemen, d: verwijderen, a: " "toevoegen, q: terug" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "Er is nog geen gezicht ingesteld. Druk op a om er een toe te voegen." -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "Nieuwe naam:" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "“%s” verwijderen?" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "Gezichtsontgrendeling aan- of uitzetten" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "Uitproberen" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "Afsluiten" @@ -787,6 +814,54 @@ msgstr "" "Hyprland start de agent voor het vergrendelscherm niet zelf. Voeg dit toe " "aan %s:" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "Om ermee te vergrendelen, voeg dit toe aan %s en zet %s in %s:" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "" +"Om ermee te vergrendelen, voeg dit toe aan de binds in %s en gebruik %s in " +"swayidle:" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "" +"Om ermee te vergrendelen, start %s waar je vergrendelscherm nu wordt gestart." + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "Je vergrendelt nu met het vergrendelscherm van face-unlock." + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "" +"hyprlock toont bovenaan wat face unlock doet, vanaf de volgende keer " +"vergrendelen." + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "Kon de regel niet aan %s toevoegen." + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "" +"Je vergrendelscherm blijft zoals het is. Druk op Enter in het lege " +"wachtwoordveld om te scannen." + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "hyprlock heeft geen %s, dus het kan de tekst niet tonen." + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "Ontgrendelen met je gezicht" @@ -799,6 +874,10 @@ msgstr "Scannen als je terugkomt" msgid "Scan right after locking" msgstr "Scannen direct na vergrendelen" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "Welk vergrendelscherm" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "Achtergrond" @@ -966,35 +1045,48 @@ msgstr "De camera is bezig met een andere scan. Probeer het zo opnieuw." msgid "The face could not be added (%1)." msgstr "Het gezicht kon niet worden toegevoegd (%1)." +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "Zoekt je gezicht…" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "Verkeerd wachtwoord" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "Gezicht herkend" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "" "Gezichtsontgrendeling voor het vergrendelscherm, sudo en beheerdersvragen" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "Een gezicht instellen." -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "Hoe het nieuwe gezicht moet heten." -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "Het scherm vergrendelen." -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "De animaties van de bubbel één keer afspelen." -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "Bubbelstijl voor de demo: full of minimal." +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "Vraagt welk vergrendelscherm te gebruiken en print het antwoord." + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "Kijk in de camera om te ontgrendelen." @@ -1053,7 +1145,7 @@ msgstr "" msgid "Name (optional)" msgstr "Naam (optioneel)" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "Annuleren" @@ -1073,14 +1165,67 @@ msgstr "Aan de slag" msgid "Done" msgstr "Klaar" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "Kies je vergrendelscherm" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "Je vergrendelscherm" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" +"Je bureaublad laat het vergrendelscherm over aan een programma naar keuze. " +"Kies hoe face unlock daar verschijnt. Je kunt dit later onder Instellingen " +"wijzigen." + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "Vergrendelscherm van face-unlock" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" +"De bubbel bovenaan, de tijd en je achtergrond. Je sneltoets en vergrendelen " +"bij inactiviteit starten dan face-unlock lock." + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "Je eigen vergrendelscherm houden" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" +"Het blijft zoals het is. hyprlock toont bovenaan een regel tekst in plaats " +"van de bubbel. Enter in het lege wachtwoordveld scant." + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "" +"Het blijft zoals het is, zonder bubbel. Enter in het lege wachtwoordveld " +"scant." + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "Doorgaan" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "Wachtwoord" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "Kijk naar de camera of typ je wachtwoord" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "Typ je wachtwoord" diff --git a/po/pl.po b/po/pl.po index e989cba..597ac45 100644 --- a/po/pl.po +++ b/po/pl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.1\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: 2026-09-24 12:00+0200\n" "Last-Translator: Felitendo\n" "Language-Team: Polish\n" @@ -59,8 +59,9 @@ msgstr "Nie dodano żadnej twarzy." msgid "First, set up your face." msgstr "Najpierw skonfiguruj swoją twarz." -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "Nie udało się zapisać ustawienia." @@ -82,7 +83,15 @@ msgstr "Nie udało się włączyć rozszerzenia GNOME, które pokazuje dymek." msgid "Log out and back in once: then GNOME shows the bubble too." msgstr "Wyloguj się i zaloguj ponownie raz: wtedy GNOME też pokaże dymek." -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "Wybierz ekran blokady w oknie." + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "Nie wybrano ekranu blokady. Możesz to zrobić później w Ustawieniach." + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " @@ -91,102 +100,102 @@ msgstr "" "Ekran blokady (%s) też przyjmuje twarz. Jeśli nie skanuje, gdy wracasz, " "naciśnij Enter w pustym polu hasła." -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "" "Odblokowywanie twarzą jest włączone. Zablokuj ekran i spójrz na niego, aby " "wypróbować." -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "Działa też dla sudo i okien administratora. Zobacz Ustawienia." -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "" "Odblokowywanie twarzą jest wyłączone. Twoje twarze zostają zachowane; " "usuniesz je w Twarzach." -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "Nie skonfigurowano jeszcze żadnej twarzy." -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "wł." -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "wył." -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "próbki: %s, wyuczone: %s" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "Która twarz? Identyfikatory pokazuje `%s faces`." -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "Usunięto." -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "Użycie: face-unlock [polecenie]" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "Polecenia:" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "Włącz odblokowywanie twarzą" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "Wyłącz je (twarze zostają zachowane)" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "Dodaj twarz" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "Pokaż listę twarzy" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "Usuń twarz" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "Spójrz w kamerę i zobacz, co widzi" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "Zablokuj ekran" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "Pokaż, co jest włączone" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "Pokaż tę pomoc" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "Pokaż wersję" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "Bez polecenia wyświetla się interaktywne menu." -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." @@ -194,42 +203,42 @@ msgstr "" "Uruchom to jako swój użytkownik, nie jako root. Hasło zostanie zapytane, gdy " "będzie potrzebne." -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "Nieznane polecenie: %s" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "nigdy" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "przed chwilą" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "1 minutę temu" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "%d min temu" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "1 godzinę temu" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "%d godz. temu" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "1 dzień temu" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "%d dni temu" @@ -269,7 +278,7 @@ msgstr "" msgid "The camera could not be used." msgstr "Nie udało się użyć kamery." -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "Brakuje modeli rozpoznawania. Zainstaluj pakiet ponownie." @@ -373,11 +382,11 @@ msgstr "" msgid "[y/N]" msgstr "[t/N]" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "WŁ." -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "WYŁ." @@ -418,85 +427,93 @@ msgstr "wolna" msgid "%s seconds" msgstr "%s s" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "automatyczna" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "face-unlock" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "twój" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "Odblokowywanie twarzą" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "Usługa" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "nie działa" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "Ponowne włączenie odblokowywania twarzą ją uruchomi." -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "Twarze" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "jeszcze żadnej" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "wszystkie wyłączone" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "nie znaleziono" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "Kamera" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "Ekran blokady" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "sudo" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "Okna administratora" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "Ekrany blokady" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "Wykrywanie zdjęć" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "Wstrzymane" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "jeszcze %d min lub do użycia hasła" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "Ostatnie odblokowanie" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "Agent ekranu blokady nie działa." -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." @@ -504,7 +521,7 @@ msgstr "" "W GNOME dymek pokazuje małe rozszerzenie GNOME. Włączenie odblokowywania " "twarzą włącza też je." -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " @@ -514,7 +531,7 @@ msgstr "" "unlock (`face-unlock lock`, z dymkiem), i je otwiera. Inne ekrany blokady " "skanują po Enter." -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." @@ -522,7 +539,7 @@ msgstr "" "Odblokowuje ekran blokady, gdy widzi twoją twarz. Wyłączone: działa tam " "tylko hasło." -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." @@ -530,7 +547,7 @@ msgstr "" "Skanuje, gdy naciśniesz klawisz lub poruszysz myszą na ekranie blokady, oraz " "gdy komputer się wybudzi." -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." @@ -538,7 +555,7 @@ msgstr "" "Skanuje od razu po zablokowaniu ekranu. Domyślnie wyłączone: gdy zablokujesz " "sam, od razu by się odblokował." -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." @@ -546,7 +563,17 @@ msgstr "" "sudo przyjmuje twarz zamiast hasła. Gdy nie pasuje, wpisujesz hasło jak " "zwykle." -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" +"Ekran blokady face-unlock pokazuje dymek, a blokujesz go przez `face-unlock " +"lock`. Albo zostaw swój: hyprlock pokaże wtedy u góry linię tekstu. Enter " +"otwiera wybór." + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " @@ -556,11 +583,11 @@ msgstr "" "pulpitu. Albo plik, folder, z którego losowany jest obraz, albo `none`. " "Enter, aby wpisać." -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "Rozmywa obraz za ekranem blokady face-unlock." -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " @@ -569,7 +596,7 @@ msgstr "" "Ekran blokady przyjmuje twarz przy sprawdzaniu hasła. Naciśnij Enter w " "pustym polu, aby skanować. Znalezione tutaj: %s." -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." @@ -577,18 +604,18 @@ msgstr "" "Okna haseł pulpitu i aplikacji, na przykład przy instalowaniu programów. Gdy " "twarz nie pasuje, wpisujesz hasło." -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "" "Musisz mrugnąć albo lekko obrócić głowę. To zatrzymuje też wydrukowane " "zdjęcia." -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "Bez żadnej kontroli. Tylko do wypróbowania kamery." -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." @@ -596,22 +623,22 @@ msgstr "" "Zatrzymuje zdjęcia na telefonie, tablecie lub błyszczącym papierze. Nie " "trzeba mrugać. Matowy wydruk może przejść." -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "" "Mniej pomyłek, ale może cię nie rozpoznać w okularach albo przy słabym " "świetle." -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "Łatwiej cię rozpoznaje, ale też kogoś bardzo do ciebie podobnego." -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "Domyślna. Pasuje większości osób." -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." @@ -619,7 +646,7 @@ msgstr "" "Twoje oczy muszą być otwarte i patrzeć na ekran. Dzięki temu nie odblokuje, " "gdy patrzysz w bok lub śpisz." -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." @@ -628,11 +655,11 @@ msgstr "" "nowa. Kamera na podczerwień potrzebuje włączonego światła (linux-enable-ir-" "emitter)." -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "Jak długo kamera szuka twojej twarzy, zanim się podda." -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." @@ -640,7 +667,7 @@ msgstr "" "Po pewnym dopasowaniu zapamiętuje, jak teraz wyglądasz. Nowa fryzura czy " "okulary nie wymagają więc ponownej konfiguracji." -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." @@ -648,98 +675,98 @@ msgstr "" "Bez skanowania, gdy laptop jest zamknięty, na przykład przy biurku z " "zewnętrznym ekranem." -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "Dymek u góry ekranu pokazuje, co robi kamera." -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "Mała pigułka z kłódką, która się otwiera." -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "Wyspa z twarzą, która się rozgląda, potem pierścienie i ptaszek." -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "Jak szybko porusza się dymek." -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "" "Pokazuje dymek także wtedy, gdy sudo lub okno administratora skanuje twarz." -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "automatyczna (%s)" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "(podczerwień)" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "(niepodłączona)" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "jak na pulpicie" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "brak" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "Obraz lub folder:" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "Nie znaleziono: %s" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "Ustawienia" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "↑↓ wybierz ←→ lub Spacja: zmień q: wstecz" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "dla wszystkich użytkowników, pyta o hasło" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "" "Góra/Dół: wybierz, Spacja: wł./wył., r: zmień nazwę, d: usuń, a: dodaj, q: " "wstecz" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "Nie skonfigurowano jeszcze żadnej twarzy. Naciśnij a, aby dodać." -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "Nowa nazwa:" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "Usunąć „%s”?" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "Włącz lub wyłącz odblokowywanie twarzą" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "Wypróbuj" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "Zakończ" @@ -784,6 +811,50 @@ msgid "" "Hyprland does not start the lock screen agent by itself. Add this to %s:" msgstr "Hyprland nie uruchamia sam agenta ekranu blokady. Dodaj to do %s:" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "Aby nim blokować, dodaj to do %s i ustaw %s w %s:" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "Aby nim blokować, dodaj to do binds w %s i użyj %s w swayidle:" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "" +"Aby nim blokować, uruchamiaj %s tam, gdzie teraz startuje twój ekran blokady." + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "Teraz blokujesz ekranem blokady face-unlock." + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "hyprlock pokaże u góry, co robi face unlock, od następnej blokady." + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "Nie udało się dodać linii do %s." + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "" +"Twój ekran blokady zostaje bez zmian. Naciśnij Enter w pustym polu hasła, " +"aby skanować." + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "hyprlock nie ma %s, więc nie może pokazać tekstu." + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "Odblokowuj twarzą" @@ -796,6 +867,10 @@ msgstr "Skanuj, gdy wracasz" msgid "Scan right after locking" msgstr "Skanuj zaraz po zablokowaniu" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "Który ekran blokady" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "Tapeta" @@ -962,34 +1037,47 @@ msgstr "Kamera jest zajęta innym skanowaniem. Spróbuj ponownie za chwilę." msgid "The face could not be added (%1)." msgstr "Nie udało się dodać twarzy (%1)." +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "Szukam twojej twarzy…" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "Złe hasło" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "Rozpoznano twarz" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "Odblokowywanie twarzą dla ekranu blokady, sudo i okien administratora" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "Skonfiguruj twarz." -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "Jak nazwać nową twarz." -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "Zablokuj ekran." -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "Odtwórz raz animacje dymka." -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "Styl dymka w demo: full lub minimal." +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "Pyta, którego ekranu blokady użyć, i wypisuje odpowiedź." + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "Spójrz w kamerę, aby odblokować." @@ -1048,7 +1136,7 @@ msgstr "" msgid "Name (optional)" msgstr "Nazwa (opcjonalnie)" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "Anuluj" @@ -1068,14 +1156,64 @@ msgstr "Zaczynamy" msgid "Done" msgstr "Gotowe" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "Wybierz ekran blokady" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "Twój ekran blokady" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" +"Twój pulpit zostawia ekran blokady programowi, który wybierasz. Wybierz, jak " +"face unlock ma się tam pokazywać. Możesz to zmienić później w Ustawieniach." + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "Ekran blokady face-unlock" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" +"Dymek u góry, godzina i twoja tapeta. Twój skrót i blokada po bezczynności " +"uruchamiają wtedy face-unlock lock." + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "Zostaw swój ekran blokady" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" +"Zostaje bez zmian. hyprlock pokazuje u góry linię tekstu zamiast dymka. " +"Enter w pustym polu hasła skanuje." + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "Zostaje bez zmian, bez dymka. Enter w pustym polu hasła skanuje." + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "Dalej" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "Hasło" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "Spójrz w kamerę albo wpisz hasło" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "Wpisz hasło" diff --git a/po/pt_BR.po b/po/pt_BR.po index a516b7e..a199f80 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.1\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: 2026-09-24 12:00+0200\n" "Last-Translator: Felitendo\n" "Language-Team: Brazilian Portuguese\n" @@ -58,8 +58,9 @@ msgstr "Nenhum rosto foi adicionado." msgid "First, set up your face." msgstr "Primeiro, configure o seu rosto." -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "Não foi possível salvar a configuração." @@ -81,7 +82,17 @@ msgstr "Não foi possível ativar a extensão do GNOME que mostra a bolha." msgid "Log out and back in once: then GNOME shows the bubble too." msgstr "Saia e entre de novo uma vez: aí o GNOME também mostra a bolha." -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "Escolha sua tela de bloqueio na janela." + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "" +"Nenhuma tela de bloqueio escolhida. Você pode fazer isso depois em " +"Configurações." + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " @@ -90,103 +101,103 @@ msgstr "" "A tela de bloqueio (%s) também aceita seu rosto. Se ela não escanear quando " "você voltar, pressione Enter no campo de senha vazio." -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "" "O desbloqueio facial está ativado. Bloqueie a tela e olhe para ela para " "testar." -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "" "Ele também funciona com sudo e pedidos de administrador. Veja Configurações." -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "" "O desbloqueio facial está desativado. Seus rostos são mantidos; apague-os em " "Rostos." -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "Nenhum rosto configurado ainda." -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "ativado" -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "desativado" -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "%s amostras, %s aprendidas" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "Qual rosto? Veja `%s faces` para os IDs." -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "Apagado." -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "Uso: face-unlock [comando]" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "Comandos:" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "Ativar o desbloqueio facial" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "Desativar (os rostos são mantidos)" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "Adicionar um rosto" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "Listar os rostos" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "Apagar um rosto" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "Olhar para a câmera e ver o que ela vê" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "Bloquear a tela" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "Mostrar o que está ativado" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "Mostrar esta ajuda" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "Mostrar a versão" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "Sem comando, um menu interativo é exibido." -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." @@ -194,42 +205,42 @@ msgstr "" "Execute isto com o seu próprio usuário, não como root. Ele pede a sua senha " "quando precisa." -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "Comando desconhecido: %s" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "nunca" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "agora mesmo" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "há 1 minuto" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "há %d minutos" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "há 1 hora" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "há %d horas" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "há 1 dia" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "há %d dias" @@ -269,7 +280,7 @@ msgstr "" msgid "The camera could not be used." msgstr "Não foi possível usar a câmera." -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "Os modelos de reconhecimento estão faltando. Reinstale o pacote." @@ -373,11 +384,11 @@ msgstr "" msgid "[y/N]" msgstr "[s/N]" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "ATIVADO" -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "DESATIVADO" @@ -418,85 +429,93 @@ msgstr "lenta" msgid "%s seconds" msgstr "%s segundos" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "automática" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "a do face-unlock" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "a sua" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "Desbloqueio facial" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "Serviço" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "parado" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "Ativar o desbloqueio facial de novo o inicia." -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "Rostos" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "nenhum configurado ainda" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "todos desativados" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "nenhuma encontrada" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "Câmera" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "Tela de bloqueio" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "sudo" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "Pedidos de administrador" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "Telas de bloqueio" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "Detecção de foto" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "Pausado" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "por mais %d minutos, ou até a senha ser usada" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "Último desbloqueio" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "O agente da tela de bloqueio não está em execução." -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." @@ -504,7 +523,7 @@ msgstr "" "No GNOME, uma pequena extensão do GNOME mostra a bolha. Ativar o desbloqueio " "facial também a ativa." -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " @@ -514,7 +533,7 @@ msgstr "" "face-unlock (`face-unlock lock`, com a bolha) e os abre. As outras telas de " "bloqueio escaneiam com Enter." -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." @@ -522,7 +541,7 @@ msgstr "" "Desbloqueia a tela de bloqueio quando vê o seu rosto. Desativado: lá só a " "sua senha funciona." -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." @@ -530,7 +549,7 @@ msgstr "" "Faz a leitura quando você aperta uma tecla ou mexe o mouse na tela de " "bloqueio, e quando o computador acorda." -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." @@ -538,7 +557,7 @@ msgstr "" "Faz a leitura assim que a tela é bloqueada. Desativado por padrão: se você " "mesmo bloquear, ela desbloquearia logo em seguida." -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." @@ -546,7 +565,17 @@ msgstr "" "O sudo usa o seu rosto em vez da senha. Se não corresponder, você digita a " "senha como sempre." -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" +"A tela de bloqueio do face-unlock mostra a bolha, e você bloqueia com `face-" +"unlock lock`. Ou mantenha a sua: o hyprlock então mostra uma linha de texto " +"no topo. Enter abre a escolha." + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " @@ -556,11 +585,11 @@ msgstr "" "Vazio: a da sua área de trabalho. Ou um arquivo, uma pasta da qual uma é " "escolhida ao acaso, ou `none`. Enter para digitar." -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "Desfoca a imagem atrás da tela de bloqueio do face-unlock." -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " @@ -569,7 +598,7 @@ msgstr "" "A tela de bloqueio aceita seu rosto na verificação de senha. Pressione Enter " "no campo vazio para escanear. Encontradas aqui: %s." -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." @@ -577,18 +606,18 @@ msgstr "" "As janelas de senha da sua área de trabalho e dos apps, por exemplo ao " "instalar programas. Se não corresponder, você digita a senha." -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "" "Você precisa piscar ou virar um pouco a cabeça. Isso também barra fotos " "impressas." -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "Nenhuma verificação. Só para testar uma câmera." -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." @@ -596,23 +625,23 @@ msgstr "" "Barra fotos em celular, tablet ou papel brilhante. Não é preciso piscar. Uma " "foto impressa em papel fosco pode passar." -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "" "Menos confusões, mas talvez não reconheça você de óculos ou com pouca luz." -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "" "Reconhece você com mais facilidade, mas também alguém muito parecido com " "você." -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "O padrão. Serve para a maioria das pessoas." -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." @@ -620,7 +649,7 @@ msgstr "" "Seus olhos precisam estar abertos e voltados para a tela. Assim não " "desbloqueia enquanto você olha para outro lado ou dorme." -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." @@ -629,11 +658,11 @@ msgstr "" "rosto de novo. Uma câmera infravermelha precisa da luz ligada (linux-enable-" "ir-emitter)." -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "Quanto tempo a câmera procura o seu rosto antes de desistir." -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." @@ -641,7 +670,7 @@ msgstr "" "Após uma correspondência segura, ele guarda a sua aparência atual. Assim, um " "corte de cabelo novo ou óculos não exigem nova configuração." -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." @@ -649,99 +678,99 @@ msgstr "" "Nenhuma leitura com o notebook fechado, por exemplo numa mesa com uma tela " "externa." -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "A bolha no topo da tela mostra o que a câmera está fazendo." -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "Uma pequena pílula com um cadeado que se abre." -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "Uma ilha com um rosto que olha em volta, depois anéis e um visto." -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "A velocidade com que a bolha se move." -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "" "Mostra a bolha também quando o sudo ou um pedido de administrador lê o seu " "rosto." -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "automática (%s)" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "(infravermelha)" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "(não conectada)" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "igual à área de trabalho" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "nenhum" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "Imagem ou pasta:" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "Não encontrado: %s" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "Configurações" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "↑↓ escolher ←→ ou Espaço: mudar q: voltar" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "para todos os usuários, pede a sua senha" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "" "Cima/Baixo: escolher, Espaço: ativar/desativar, r: renomear, d: apagar, a: " "adicionar, q: voltar" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "Nenhum rosto configurado ainda. Aperte a para adicionar um." -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "Novo nome:" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "Apagar \"%s\"?" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "Ativar ou desativar o desbloqueio facial" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "Testar" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "Sair" @@ -789,6 +818,53 @@ msgstr "" "O Hyprland não inicia o agente da tela de bloqueio sozinho. Adicione isto a " "%s:" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "Para bloquear com ela, adicione isto a %s e defina %s em %s:" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "" +"Para bloquear com ela, adicione isto aos binds em %s e use %s no swayidle:" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "" +"Para bloquear com ela, rode %s onde sua tela de bloqueio é iniciada hoje." + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "Agora você bloqueia com a tela de bloqueio do face-unlock." + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "" +"O hyprlock mostra no topo o que o face unlock está fazendo, a partir do " +"próximo bloqueio." + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "Não foi possível adicionar a linha a %s." + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "" +"Sua tela de bloqueio fica como está. Pressione Enter no campo de senha vazio " +"para escanear." + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "O hyprlock não tem %s, então não pode mostrar o texto." + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "Desbloquear com o rosto" @@ -801,6 +877,10 @@ msgstr "Ler quando você voltar" msgid "Scan right after locking" msgstr "Ler logo após bloquear" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "Qual tela de bloqueio" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "Papel de parede" @@ -968,36 +1048,49 @@ msgstr "A câmera está ocupada com outra leitura. Tente de novo em instantes." msgid "The face could not be added (%1)." msgstr "Não foi possível adicionar o rosto (%1)." +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "Procurando seu rosto…" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "Senha incorreta" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "Rosto reconhecido" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "" "Desbloqueio facial para a tela de bloqueio, o sudo e os pedidos de " "administrador" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "Configurar um rosto." -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "Como chamar o novo rosto." -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "Bloquear a tela." -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "Reproduzir as animações da bolha uma vez." -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "Estilo da bolha para a demonstração: full ou minimal." +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "Pergunta qual tela de bloqueio usar e imprime a resposta." + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "Olhe para a câmera para desbloquear." @@ -1055,7 +1148,7 @@ msgstr "" msgid "Name (optional)" msgstr "Nome (opcional)" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "Cancelar" @@ -1075,14 +1168,66 @@ msgstr "Começar" msgid "Done" msgstr "Concluído" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "Escolha sua tela de bloqueio" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "Sua tela de bloqueio" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" +"Sua área de trabalho deixa a tela de bloqueio para um programa da sua " +"escolha. Escolha como o face unlock aparece lá. Você pode mudar isso depois " +"em Configurações." + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "Tela de bloqueio do face-unlock" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" +"A bolha no topo, a hora e seu papel de parede. Seu atalho e o bloqueio por " +"inatividade passam a rodar face-unlock lock." + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "Manter sua tela de bloqueio" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" +"Ela fica como está. O hyprlock mostra uma linha de texto no topo em vez da " +"bolha. Enter no campo de senha vazio escaneia." + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "" +"Ela fica como está, sem a bolha. Enter no campo de senha vazio escaneia." + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "Continuar" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "Senha" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "Olhe para a câmera ou digite sua senha" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "Digite sua senha" diff --git a/po/ru.po b/po/ru.po index 1ed8936..940417d 100644 --- a/po/ru.po +++ b/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.1\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: 2026-09-24 12:00+0200\n" "Last-Translator: Felitendo\n" "Language-Team: Russian\n" @@ -59,8 +59,9 @@ msgstr "Лицо не добавлено." msgid "First, set up your face." msgstr "Сначала настройте своё лицо." -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "Не удалось сохранить настройку." @@ -82,7 +83,15 @@ msgstr "Не удалось включить расширение GNOME, кот msgid "Log out and back in once: then GNOME shows the bubble too." msgstr "Выйдите и войдите снова один раз: тогда GNOME тоже покажет пузырь." -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "Выберите экран блокировки в окне." + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "Экран блокировки не выбран. Это можно сделать позже в Настройках." + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " @@ -91,102 +100,102 @@ msgstr "" "Экран блокировки (%s) тоже принимает ваше лицо. Если он не сканирует, когда " "вы возвращаетесь, нажмите Enter в пустом поле пароля." -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "" "Разблокировка по лицу включена. Заблокируйте экран и посмотрите на него, " "чтобы попробовать." -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "Она работает и для sudo, и для запросов администратора. См. Настройки." -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "" "Разблокировка по лицу выключена. Ваши лица сохранены; удалить их можно в " "разделе Лица." -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "Ещё не настроено ни одного лица." -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "вкл." -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "выкл." -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "образцов: %s, выучено: %s" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "Какое лицо? Номера показывает `%s faces`." -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "Удалено." -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "Использование: face-unlock [команда]" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "Команды:" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "Включить разблокировку по лицу" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "Выключить её (лица сохраняются)" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "Добавить лицо" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "Показать список лиц" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "Удалить лицо" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "Посмотреть в камеру и увидеть, что она видит" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "Заблокировать экран" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "Показать, что включено" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "Показать эту справку" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "Показать версию" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "Без команды открывается интерактивное меню." -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." @@ -194,42 +203,42 @@ msgstr "" "Запускайте это от своего пользователя, не от root. Пароль будет запрошен, " "когда он понадобится." -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "Неизвестная команда: %s" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "никогда" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "только что" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "1 минуту назад" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "%d мин назад" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "1 час назад" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "%d ч назад" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "1 день назад" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "%d дн. назад" @@ -269,7 +278,7 @@ msgstr "" msgid "The camera could not be used." msgstr "Не удалось использовать камеру." -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "Нет моделей распознавания. Переустановите пакет." @@ -373,11 +382,11 @@ msgstr "" msgid "[y/N]" msgstr "[д/Н]" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "ВКЛ" -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "ВЫКЛ" @@ -418,85 +427,93 @@ msgstr "медленная" msgid "%s seconds" msgstr "%s с" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "автоматически" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "face-unlock" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "ваш" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "Разблокировка по лицу" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "Служба" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "не запущена" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "Повторное включение разблокировки по лицу запустит её." -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "Лица" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "пока не настроены" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "все выключены" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "не найдена" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "Камера" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "Экран блокировки" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "sudo" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "Запросы администратора" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "Экраны блокировки" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "Проверка на фото" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "Приостановлено" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "ещё %d мин или до ввода пароля" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "Последняя разблокировка" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "Агент экрана блокировки не запущен." -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." @@ -504,7 +521,7 @@ msgstr "" "В GNOME пузырь показывает небольшое расширение GNOME. Оно включается вместе " "с разблокировкой по лицу." -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " @@ -514,7 +531,7 @@ msgstr "" "блокировки face-unlock (`face-unlock lock`, с пузырём), и открывает их. " "Другие экраны блокировки сканируют по Enter." -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." @@ -522,7 +539,7 @@ msgstr "" "Снимает блокировку экрана, когда видит ваше лицо. Выкл.: там работает только " "пароль." -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." @@ -530,7 +547,7 @@ msgstr "" "Сканирует, когда вы нажимаете клавишу или двигаете мышь на экране " "блокировки, и когда компьютер просыпается." -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." @@ -538,7 +555,7 @@ msgstr "" "Сканирует сразу после блокировки экрана. По умолчанию выкл.: если вы " "блокируете сами, он тут же разблокировался бы." -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." @@ -546,7 +563,17 @@ msgstr "" "sudo принимает ваше лицо вместо пароля. Не совпало: вы вводите пароль как " "обычно." -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" +"Экран блокировки face-unlock показывает пузырь, а блокировать нужно командой " +"`face-unlock lock`. Или оставьте свой: тогда hyprlock покажет сверху строку " +"текста. Enter открывает выбор." + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " @@ -556,11 +583,11 @@ msgstr "" "что на рабочем столе. Или файл, папка, из которой берётся случайная, или " "`none`. Нажмите Enter, чтобы ввести." -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "Размывает картинку за экраном блокировки face-unlock." -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " @@ -569,7 +596,7 @@ msgstr "" "Экран блокировки принимает ваше лицо при проверке пароля. Нажмите Enter в " "пустом поле, чтобы сканировать. Найдено здесь: %s." -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." @@ -577,18 +604,18 @@ msgstr "" "Окна ввода пароля рабочего стола и приложений, например при установке " "программ. Не совпало: вы вводите пароль." -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "" "Нужно моргнуть или слегка повернуть голову. Это также останавливает " "распечатанные фото." -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "Никакой проверки. Только чтобы опробовать камеру." -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." @@ -596,22 +623,22 @@ msgstr "" "Останавливает фото на телефоне, планшете или глянцевой бумаге. Моргать не " "нужно. Матовое распечатанное фото может пройти." -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "" "Меньше ошибочных совпадений, но может не узнать вас в очках или при плохом " "свете." -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "Узнаёт вас легче, но и того, кто очень на вас похож." -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "По умолчанию. Подходит большинству." -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." @@ -619,7 +646,7 @@ msgstr "" "Ваши глаза должны быть открыты и смотреть на экран. Так он не " "разблокируется, пока вы смотрите в сторону или спите." -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." @@ -628,11 +655,11 @@ msgstr "" "заново. Инфракрасной камере нужна включённая подсветка (linux-enable-ir-" "emitter)." -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "Как долго камера ищет ваше лицо, прежде чем сдаться." -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." @@ -640,7 +667,7 @@ msgstr "" "После уверенного совпадения запоминает, как вы выглядите сейчас. Новая " "стрижка или очки не требуют новой настройки." -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." @@ -648,99 +675,99 @@ msgstr "" "Без сканирования, когда ноутбук закрыт, например за столом с внешним " "монитором." -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "Пузырь вверху экрана показывает, что делает камера." -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "Маленькая таблетка с замком, который открывается." -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "Остров с лицом, которое оглядывается, затем кольца и галочка." -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "Как быстро движется пузырь." -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "" "Показывает пузырь и тогда, когда sudo или запрос администратора сканирует " "ваше лицо." -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "автоматически (%s)" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "(инфракрасная)" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "(не подключена)" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "как на рабочем столе" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "нет" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "Картинка или папка:" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "Не найдено: %s" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "Настройки" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "↑↓ выбор ←→ или Пробел: изменить q: назад" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "для всех пользователей, запрашивает пароль" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "" "Вверх/Вниз: выбор, Пробел: вкл./выкл., r: переименовать, d: удалить, a: " "добавить, q: назад" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "Ещё не настроено ни одного лица. Нажмите a, чтобы добавить." -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "Новое имя:" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "Удалить «%s»?" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "Включить или выключить разблокировку по лицу" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "Попробовать" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "Выход" @@ -786,6 +813,53 @@ msgid "" "Hyprland does not start the lock screen agent by itself. Add this to %s:" msgstr "Hyprland сам не запускает агент экрана блокировки. Добавьте это в %s:" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "Чтобы блокировать им, добавьте это в %s и укажите %s в %s:" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "" +"Чтобы блокировать им, добавьте это в binds в %s и используйте %s в swayidle:" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "" +"Чтобы блокировать им, запускайте %s там, где сейчас запускается ваш экран " +"блокировки." + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "Теперь вы блокируете экраном блокировки face-unlock." + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "" +"hyprlock покажет сверху, что делает face unlock, со следующей блокировки." + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "Не удалось добавить строку в %s." + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "" +"Ваш экран блокировки остаётся как есть. Нажмите Enter в пустом поле пароля, " +"чтобы сканировать." + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "У hyprlock нет %s, поэтому он не может показать текст." + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "Разблокировать по лицу" @@ -798,6 +872,10 @@ msgstr "Сканировать при возвращении" msgid "Scan right after locking" msgstr "Сканировать сразу после блокировки" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "Какой экран блокировки" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "Обои" @@ -965,35 +1043,48 @@ msgstr "Камера занята другим сканированием. По msgid "The face could not be added (%1)." msgstr "Не удалось добавить лицо (%1)." +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "Ищу ваше лицо…" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "Неверный пароль" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "Лицо распознано" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "" "Разблокировка по лицу для экрана блокировки, sudo и запросов администратора" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "Настроить лицо." -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "Как назвать новое лицо." -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "Заблокировать экран." -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "Один раз проиграть анимации пузыря." -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "Стиль пузыря для демо: full или minimal." +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "Спрашивает, какой экран блокировки использовать, и выводит ответ." + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "Посмотрите в камеру, чтобы разблокировать." @@ -1053,7 +1144,7 @@ msgstr "" msgid "Name (optional)" msgstr "Имя (необязательно)" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "Отмена" @@ -1073,14 +1164,67 @@ msgstr "Начать" msgid "Done" msgstr "Готово" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "Выбор экрана блокировки" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "Ваш экран блокировки" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" +"Ваш рабочий стол оставляет экран блокировки программе на ваш выбор. " +"Выберите, как там будет выглядеть face unlock. Это можно изменить позже в " +"Настройках." + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "Экран блокировки face-unlock" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" +"Пузырь сверху, время и ваши обои. Ваше сочетание клавиш и блокировка по " +"бездействию тогда запускают face-unlock lock." + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "Оставить свой экран блокировки" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" +"Он остаётся как есть. hyprlock показывает сверху строку текста вместо " +"пузыря. Enter в пустом поле пароля запускает сканирование." + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "" +"Он остаётся как есть, без пузыря. Enter в пустом поле пароля запускает " +"сканирование." + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "Продолжить" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "Пароль" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "Посмотрите в камеру или введите пароль" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "Введите пароль" diff --git a/po/tr.po b/po/tr.po index 277df5d..cf9f39d 100644 --- a/po/tr.po +++ b/po/tr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.1\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: 2026-09-24 12:00+0200\n" "Last-Translator: Felitendo\n" "Language-Team: Turkish\n" @@ -57,8 +57,9 @@ msgstr "Hiç yüz eklenmedi." msgid "First, set up your face." msgstr "Önce yüzünüzü kurun." -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "Ayar kaydedilemedi." @@ -80,7 +81,15 @@ msgid "Log out and back in once: then GNOME shows the bubble too." msgstr "" "Bir kez oturumu kapatıp yeniden açın: o zaman GNOME de baloncuğu gösterir." -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "Pencerede kilit ekranınızı seçin." + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "Kilit ekranı seçilmedi. Bunu daha sonra Ayarlar'dan yapabilirsiniz." + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " @@ -89,100 +98,100 @@ msgstr "" "Kilit ekranı (%s) da yüzünüzü kabul eder. Döndüğünüzde taramazsa boş parola " "alanında Enter'a basın." -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "Yüzle kilit açma açık. Denemek için ekranı kilitleyin ve ona bakın." -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "sudo ve yönetici istemlerinde de çalışabilir. Ayarlar'a bakın." -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "" "Yüzle kilit açma kapalı. Yüzleriniz saklanıyor; Yüzler bölümünden " "silebilirsiniz." -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "Henüz hiç yüz kurulmadı." -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "açık" -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "kapalı" -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "%s örnek, %s öğrenilen" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "Hangi yüz? Kimlikler için `%s faces` komutuna bakın." -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "Silindi." -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "Kullanım: face-unlock [komut]" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "Komutlar:" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "Yüzle kilit açmayı aç" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "Kapat (yüzler saklanır)" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "Yüz ekle" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "Yüzleri listele" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "Bir yüzü sil" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "Kameraya bak ve onun ne gördüğünü gör" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "Ekranı kilitle" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "Neyin açık olduğunu göster" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "Bu yardımı göster" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "Sürümü göster" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "Komut verilmezse etkileşimli bir menü gösterilir." -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." @@ -190,42 +199,42 @@ msgstr "" "Bunu root olarak değil, kendi kullanıcınızla çalıştırın. Gerektiğinde " "parolanızı sorar." -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "Bilinmeyen komut: %s" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "hiçbir zaman" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "az önce" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "1 dakika önce" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "%d dakika önce" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "1 saat önce" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "%d saat önce" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "1 gün önce" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "%d gün önce" @@ -265,7 +274,7 @@ msgstr "" msgid "The camera could not be used." msgstr "Kamera kullanılamadı." -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "Tanıma modelleri eksik. Paketi yeniden kurun." @@ -369,11 +378,11 @@ msgstr "" msgid "[y/N]" msgstr "[e/H]" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "AÇIK" -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "KAPALI" @@ -414,85 +423,93 @@ msgstr "yavaş" msgid "%s seconds" msgstr "%s saniye" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "otomatik" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "face-unlock" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "sizinki" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "Yüzle kilit açma" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "Hizmet" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "çalışmıyor" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "Yüzle kilit açmayı yeniden açmak onu başlatır." -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "Yüzler" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "henüz kurulmadı" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "hepsi kapalı" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "bulunamadı" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "Kamera" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "Kilit ekranı" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "sudo" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "Yönetici istemleri" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "Kilit ekranları" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "Fotoğraf denetimi" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "Duraklatıldı" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "%d dakika daha ya da parola kullanılana kadar" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "Son kilit açma" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "Kilit ekranı aracısı çalışmıyor." -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." @@ -500,7 +517,7 @@ msgstr "" "GNOME'da baloncuğu küçük bir GNOME uzantısı gösterir. Yüzle kilit açmayı " "açınca o da açılır." -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " @@ -510,7 +527,7 @@ msgstr "" "unlock lock`, baloncukla) döndüğünüzde tarar ve onları açar. Diğer kilit " "ekranları Enter ile tarar." -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." @@ -518,7 +535,7 @@ msgstr "" "Yüzünüzü görünce kilit ekranını açar. Kapalı: orada yalnızca parolanız " "çalışır." -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." @@ -526,7 +543,7 @@ msgstr "" "Kilit ekranında bir tuşa bastığınızda ya da fareyi oynattığınızda ve " "bilgisayar uyandığında tarar." -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." @@ -534,7 +551,7 @@ msgstr "" "Ekran kilitlenir kilitlenmez tarar. Varsayılan olarak kapalı: kendiniz " "kilitlerseniz hemen yeniden açılırdı." -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." @@ -542,7 +559,17 @@ msgstr "" "sudo parola yerine yüzünüzü kullanır. Eşleşmezse parolayı her zamanki gibi " "yazarsınız." -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" +"face-unlock'un kilit ekranı baloncuğu gösterir ve `face-unlock lock` ile " +"kilitlersiniz. Ya da kendinizinkini koruyun: hyprlock o zaman üstte bir " +"satır metin gösterir. Enter seçimi açar." + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " @@ -552,11 +579,11 @@ msgstr "" "masaüstünüzdeki resim. Ya da bir dosya, rastgele seçilecek bir klasör veya " "`none`. Yazmak için Enter." -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "face-unlock kilit ekranının arkasındaki resmi bulanıklaştırır." -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " @@ -565,7 +592,7 @@ msgstr "" "Kilit ekranı parola denetiminde yüzünüzü kabul eder. Taramak için boş alanda " "Enter'a basın. Burada bulunanlar: %s." -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." @@ -573,18 +600,18 @@ msgstr "" "Masaüstünüzün ve uygulamaların parola pencereleri, örneğin yazılım kurarken. " "Eşleşmezse parolayı yazarsınız." -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "" "Göz kırpmanız ya da başınızı biraz çevirmeniz gerekir. Bu, basılı " "fotoğrafları da durdurur." -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "Hiç denetim yok. Yalnızca bir kamerayı denemek için." -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." @@ -592,21 +619,21 @@ msgstr "" "Telefon, tablet ya da parlak kâğıttaki fotoğrafları durdurur. Göz kırpmanız " "gerekmez. Mat basılı bir fotoğraf geçebilir." -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "" "Daha az yanlış eşleşme, ama gözlükle ya da kötü ışıkta sizi tanımayabilir." -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "Sizi daha kolay tanır, ama size çok benzeyen birini de." -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "Varsayılan. Çoğu kişi için uygun." -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." @@ -614,7 +641,7 @@ msgstr "" "Gözleriniz açık ve ekrana dönük olmalı. Böylece başka yere bakarken ya da " "uyurken kilit açılmaz." -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." @@ -623,11 +650,11 @@ msgstr "" "kurun. Kızılötesi kameranın ışığının açık olması gerekir (linux-enable-ir-" "emitter)." -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "Kameranın vazgeçmeden önce yüzünüzü ne kadar aradığı." -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." @@ -635,105 +662,105 @@ msgstr "" "Kesin bir eşleşmeden sonra şu anki görünüşünüzü hatırlar. Böylece yeni saç " "kesimi ya da gözlük yeniden kurulum gerektirmez." -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." msgstr "Dizüstü kapalıyken tarama yok, örneğin harici ekranlı bir masada." -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "Ekranın üstündeki baloncuk kameranın ne yaptığını gösterir." -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "Açılan bir kilidi olan küçük bir hap." -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "" "Etrafına bakan bir yüzü olan bir ada, ardından halkalar ve bir onay işareti." -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "Baloncuğun ne kadar hızlı hareket ettiği." -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "" "sudo ya da bir yönetici istemi yüzünüzü taradığında da baloncuğu gösterir." -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "otomatik (%s)" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "(kızılötesi)" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "(bağlı değil)" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "masaüstüyle aynı" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "yok" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "Resim ya da klasör:" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "Bulunamadı: %s" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "Ayarlar" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "↑↓ seç ←→ ya da Boşluk: değiştir q: geri" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "tüm kullanıcılar için, parolanızı sorar" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "" "Yukarı/Aşağı: seç, Boşluk: aç/kapat, r: yeniden adlandır, d: sil, a: ekle, " "q: geri" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "Henüz hiç yüz kurulmadı. Eklemek için a tuşuna basın." -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "Yeni ad:" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "\"%s\" silinsin mi?" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "Yüzle kilit açmayı aç ya da kapat" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "Dene" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "Çık" @@ -781,6 +808,57 @@ msgstr "" "Hyprland kilit ekranı aracısını kendiliğinden başlatmaz. Bunu %s dosyasına " "ekleyin:" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "" +"Onunla kilitlemek için bunu %s dosyasına ekleyin ve %s ayarını %s içine " +"yazın:" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "" +"Onunla kilitlemek için bunu %s içindeki binds'a ekleyin ve swayidle'da %s " +"kullanın:" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "" +"Onunla kilitlemek için kilit ekranınızın şu an başlatıldığı yerde %s " +"çalıştırın." + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "Artık face-unlock'un kilit ekranıyla kilitliyorsunuz." + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "" +"Bir sonraki kilitlemeden itibaren hyprlock, face unlock'un ne yaptığını " +"üstte gösterir." + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "Satır %s dosyasına eklenemedi." + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "" +"Kilit ekranınız olduğu gibi kalır. Taramak için boş parola alanında Enter'a " +"basın." + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "hyprlock'un %s dosyası yok, bu yüzden metni gösteremez." + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "Yüzünüzle kilidi açın" @@ -793,6 +871,10 @@ msgstr "Geri döndüğünüzde tara" msgid "Scan right after locking" msgstr "Kilitledikten hemen sonra tara" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "Hangi kilit ekranı" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "Duvar kâğıdı" @@ -957,34 +1039,47 @@ msgstr "Kamera başka bir taramayla meşgul. Birazdan yeniden deneyin." msgid "The face could not be added (%1)." msgstr "Yüz eklenemedi (%1)." +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "Yüzünüz aranıyor…" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "Yanlış parola" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "Yüz tanındı" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "Kilit ekranı, sudo ve yönetici istemleri için yüzle kilit açma" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "Bir yüz kur." -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "Yeni yüzün adı." -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "Ekranı kilitle." -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "Baloncuğun animasyonlarını bir kez oynat." -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "Demo için baloncuk stili: full ya da minimal." +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "Hangi kilit ekranının kullanılacağını sorar ve cevabı yazdırır." + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "Kilidi açmak için kameraya bakın." @@ -1043,7 +1138,7 @@ msgstr "" msgid "Name (optional)" msgstr "Ad (isteğe bağlı)" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "İptal" @@ -1063,14 +1158,66 @@ msgstr "Başlayalım" msgid "Done" msgstr "Bitti" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "Kilit ekranınızı seçin" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "Kilit ekranınız" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" +"Masaüstünüz kilit ekranını seçtiğiniz bir programa bırakır. face unlock'un " +"orada nasıl görüneceğini seçin. Bunu daha sonra Ayarlar'dan " +"değiştirebilirsiniz." + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "face-unlock'un kilit ekranı" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" +"Üstte baloncuk, saat ve duvar kağıdınız. Kısayolunuz ve boşta kilitleme o " +"zaman face-unlock lock çalıştırır." + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "Kilit ekranınızı koruyun" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" +"Olduğu gibi kalır. hyprlock baloncuk yerine üstte bir satır metin gösterir. " +"Boş parola alanında Enter tarama yapar." + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "" +"Olduğu gibi kalır, baloncuk olmadan. Boş parola alanında Enter tarama yapar." + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "Devam" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "Parola" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "Kameraya bakın ya da parolanızı yazın" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "Parolanızı yazın" diff --git a/po/uk.po b/po/uk.po index 507adab..41a1198 100644 --- a/po/uk.po +++ b/po/uk.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.1\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: 2026-09-24 12:00+0200\n" "Last-Translator: Felitendo\n" "Language-Team: Ukrainian\n" @@ -59,8 +59,9 @@ msgstr "Обличчя не додано." msgid "First, set up your face." msgstr "Спершу налаштуйте своє обличчя." -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "Не вдалося зберегти налаштування." @@ -82,7 +83,15 @@ msgstr "Не вдалося увімкнути розширення GNOME, як msgid "Log out and back in once: then GNOME shows the bubble too." msgstr "Вийдіть і увійдіть знову один раз: тоді GNOME теж покаже бульбашку." -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "Виберіть екран блокування у вікні." + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "Екран блокування не вибрано. Це можна зробити пізніше в Налаштуваннях." + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " @@ -91,103 +100,103 @@ msgstr "" "Екран блокування (%s) теж приймає ваше обличчя. Якщо він не сканує, коли ви " "повертаєтеся, натисніть Enter у порожньому полі пароля." -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "" "Розблокування обличчям увімкнено. Заблокуйте екран і подивіться на нього, " "щоб спробувати." -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "" "Воно працює і для sudo, і для запитів адміністратора. Див. Налаштування." -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "" "Розблокування обличчям вимкнено. Ваші обличчя збережено; видалити їх можна в " "розділі Обличчя." -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "Ще не налаштовано жодного обличчя." -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "увімк." -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "вимк." -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "зразків: %s, вивчено: %s" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "Яке обличчя? Номери показує `%s faces`." -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "Видалено." -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "Використання: face-unlock [команда]" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "Команди:" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "Увімкнути розблокування обличчям" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "Вимкнути його (обличчя зберігаються)" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "Додати обличчя" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "Показати список облич" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "Видалити обличчя" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "Подивитися в камеру і побачити, що вона бачить" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "Заблокувати екран" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "Показати, що увімкнено" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "Показати цю довідку" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "Показати версію" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "Без команди відкривається інтерактивне меню." -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." @@ -195,42 +204,42 @@ msgstr "" "Запускайте це від свого користувача, не від root. Пароль буде запитано, коли " "він знадобиться." -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "Невідома команда: %s" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "ніколи" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "щойно" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "1 хвилину тому" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "%d хв тому" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "1 годину тому" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "%d год тому" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "1 день тому" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "%d дн. тому" @@ -270,7 +279,7 @@ msgstr "" msgid "The camera could not be used." msgstr "Не вдалося використати камеру." -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "Немає моделей розпізнавання. Перевстановіть пакунок." @@ -374,11 +383,11 @@ msgstr "" msgid "[y/N]" msgstr "[т/Н]" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "УВІМК" -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "ВИМК" @@ -419,85 +428,93 @@ msgstr "повільна" msgid "%s seconds" msgstr "%s с" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "автоматично" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "face-unlock" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "ваш" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "Розблокування обличчям" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "Служба" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "не запущена" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "Повторне ввімкнення розблокування обличчям запустить її." -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "Обличчя" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "ще не налаштовано" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "усі вимкнено" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "не знайдено" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "Камера" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "Екран блокування" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "sudo" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "Запити адміністратора" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "Екрани блокування" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "Перевірка на фото" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "Призупинено" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "ще %d хв або до введення пароля" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "Останнє розблокування" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "Агент екрана блокування не запущено." -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." @@ -505,7 +522,7 @@ msgstr "" "У GNOME бульбашку показує невелике розширення GNOME. Воно вмикається разом " "із розблокуванням обличчям." -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " @@ -515,7 +532,7 @@ msgstr "" "блокування face-unlock (`face-unlock lock`, з бульбашкою), і відкриває їх. " "Інші екрани блокування сканують за Enter." -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." @@ -523,7 +540,7 @@ msgstr "" "Розблоковує екран блокування, коли бачить ваше обличчя. Вимк.: там працює " "лише пароль." -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." @@ -531,7 +548,7 @@ msgstr "" "Сканує, коли ви натискаєте клавішу або рухаєте мишею на екрані блокування, і " "коли комп'ютер прокидається." -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." @@ -539,7 +556,7 @@ msgstr "" "Сканує одразу після блокування екрана. Типово вимк.: якщо ви блокуєте самі, " "він одразу б розблокувався." -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." @@ -547,7 +564,17 @@ msgstr "" "sudo приймає ваше обличчя замість пароля. Не збіглося: ви вводите пароль як " "зазвичай." -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" +"Екран блокування face-unlock показує бульбашку, а блокувати потрібно " +"командою `face-unlock lock`. Або залиште свій: тоді hyprlock покаже вгорі " +"рядок тексту. Enter відкриває вибір." + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " @@ -557,11 +584,11 @@ msgstr "" "те, що на робочому столі. Або файл, тека, з якої береться випадкове, або " "`none`. Натисніть Enter, щоб ввести." -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "Розмиває зображення за екраном блокування face-unlock." -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " @@ -570,7 +597,7 @@ msgstr "" "Екран блокування приймає ваше обличчя під час перевірки пароля. Натисніть " "Enter у порожньому полі, щоб сканувати. Знайдено тут: %s." -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." @@ -578,17 +605,17 @@ msgstr "" "Вікна введення пароля робочого столу і програм, наприклад під час " "встановлення програм. Не збіглося: ви вводите пароль." -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "" "Треба кліпнути або трохи повернути голову. Це також зупиняє надруковані фото." -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "Жодної перевірки. Лише щоб випробувати камеру." -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." @@ -596,22 +623,22 @@ msgstr "" "Зупиняє фото на телефоні, планшеті чи глянцевому папері. Кліпати не треба. " "Матове надруковане фото може пройти." -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "" "Менше хибних збігів, але може не впізнати вас в окулярах або при поганому " "світлі." -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "Впізнає вас легше, але й того, хто дуже на вас схожий." -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "Типове значення. Підходить більшості." -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." @@ -619,7 +646,7 @@ msgstr "" "Ваші очі мають бути розплющені й дивитися на екран. Так він не " "розблокується, коли ви дивитеся вбік або спите." -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." @@ -628,11 +655,11 @@ msgstr "" "знову. Інфрачервоній камері потрібне ввімкнене підсвічування (linux-enable-" "ir-emitter)." -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "Як довго камера шукає ваше обличчя, перш ніж здатися." -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." @@ -640,7 +667,7 @@ msgstr "" "Після впевненого збігу запам'ятовує, як ви виглядаєте зараз. Нова зачіска чи " "окуляри не потребують нового налаштування." -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." @@ -648,99 +675,99 @@ msgstr "" "Без сканування, коли ноутбук закрито, наприклад за столом із зовнішнім " "монітором." -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "Бульбашка вгорі екрана показує, що робить камера." -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "Маленька пігулка із замком, що відкривається." -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "Острів з обличчям, яке озирається, потім кільця і галочка." -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "Як швидко рухається бульбашка." -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "" "Показує бульбашку й тоді, коли sudo або запит адміністратора сканує ваше " "обличчя." -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "автоматично (%s)" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "(інфрачервона)" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "(не під'єднана)" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "як на робочому столі" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "немає" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "Зображення або тека:" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "Не знайдено: %s" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "Налаштування" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "↑↓ вибір ←→ або Пробіл: змінити q: назад" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "для всіх користувачів, запитує пароль" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "" "Вгору/Вниз: вибір, Пробіл: увімк./вимк., r: перейменувати, d: видалити, a: " "додати, q: назад" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "Ще не налаштовано жодного обличчя. Натисніть a, щоб додати." -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "Нова назва:" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "Видалити «%s»?" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "Увімкнути або вимкнути розблокування обличчям" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "Спробувати" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "Вийти" @@ -786,6 +813,52 @@ msgid "" "Hyprland does not start the lock screen agent by itself. Add this to %s:" msgstr "Hyprland сам не запускає агент екрана блокування. Додайте це до %s:" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "Щоб блокувати ним, додайте це до %s і вкажіть %s у %s:" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "" +"Щоб блокувати ним, додайте це до binds у %s і використовуйте %s у swayidle:" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "" +"Щоб блокувати ним, запускайте %s там, де зараз запускається ваш екран " +"блокування." + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "Тепер ви блокуєте екраном блокування face-unlock." + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "hyprlock покаже вгорі, що робить face unlock, з наступного блокування." + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "Не вдалося додати рядок до %s." + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "" +"Ваш екран блокування залишається як є. Натисніть Enter у порожньому полі " +"пароля, щоб сканувати." + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "У hyprlock немає %s, тому він не може показати текст." + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "Розблоковувати обличчям" @@ -798,6 +871,10 @@ msgstr "Сканувати, коли ви повертаєтеся" msgid "Scan right after locking" msgstr "Сканувати одразу після блокування" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "Який екран блокування" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "Шпалери" @@ -964,35 +1041,48 @@ msgstr "Камера зайнята іншим скануванням. Спро msgid "The face could not be added (%1)." msgstr "Не вдалося додати обличчя (%1)." +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "Шукаю ваше обличчя…" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "Неправильний пароль" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "Обличчя розпізнано" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "" "Розблокування обличчям для екрана блокування, sudo і запитів адміністратора" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "Налаштувати обличчя." -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "Як назвати нове обличчя." -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "Заблокувати екран." -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "Один раз програти анімації бульбашки." -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "Стиль бульбашки для демо: full або minimal." +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "Питає, який екран блокування використовувати, і виводить відповідь." + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "Подивіться в камеру, щоб розблокувати." @@ -1052,7 +1142,7 @@ msgstr "" msgid "Name (optional)" msgstr "Назва (необов'язково)" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "Скасувати" @@ -1072,14 +1162,66 @@ msgstr "Почати" msgid "Done" msgstr "Готово" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "Вибір екрана блокування" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "Ваш екран блокування" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" +"Ваша стільниця залишає екран блокування програмі на ваш вибір. Виберіть, як " +"там виглядатиме face unlock. Це можна змінити пізніше в Налаштуваннях." + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "Екран блокування face-unlock" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" +"Бульбашка вгорі, час і ваші шпалери. Ваше сполучення клавіш і блокування " +"через бездіяльність тоді запускають face-unlock lock." + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "Залишити свій екран блокування" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" +"Він залишається як є. hyprlock показує вгорі рядок тексту замість бульбашки. " +"Enter у порожньому полі пароля запускає сканування." + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "" +"Він залишається як є, без бульбашки. Enter у порожньому полі пароля запускає " +"сканування." + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "Продовжити" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "Пароль" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "Подивіться в камеру або введіть пароль" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "Введіть пароль" diff --git a/po/zh_CN.po b/po/zh_CN.po index 92d677a..3b060f0 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: face-unlock 1.0.1\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/face-unlock/issues\n" -"POT-Creation-Date: 2026-09-26 19:35+0200\n" +"POT-Creation-Date: 2026-09-26 19:36+0200\n" "PO-Revision-Date: 2026-09-24 12:00+0200\n" "Last-Translator: Felitendo\n" "Language-Team: Chinese (simplified)\n" @@ -53,8 +53,9 @@ msgstr "没有添加人脸。" msgid "First, set up your face." msgstr "请先设置你的人脸。" -#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:500 -#: src/lib/menu.sh:504 src/lib/menu.sh:510 src/lib/menu.sh:512 +#: src/face-unlock:100 src/face-unlock:145 src/lib/menu.sh:517 +#: src/lib/menu.sh:521 src/lib/menu.sh:527 src/lib/menu.sh:529 +#: src/lib/system.sh:290 src/lib/system.sh:296 msgid "Could not save the setting." msgstr "无法保存设置。" @@ -74,7 +75,15 @@ msgstr "无法启用显示气泡的 GNOME 扩展。" msgid "Log out and back in once: then GNOME shows the bubble too." msgstr "请注销并重新登录一次:之后 GNOME 也会显示气泡。" -#: src/face-unlock:129 +#: src/face-unlock:131 +msgid "Pick your lock screen in the window." +msgstr "请在窗口中选择锁屏。" + +#: src/face-unlock:132 +msgid "No lock screen picked. You can do it later under Settings." +msgstr "未选择锁屏。之后可以在设置中选择。" + +#: src/face-unlock:135 #, sh-printf-format msgid "" "The lock screen (%s) takes your face too. If it does not scan when you come " @@ -82,139 +91,139 @@ msgid "" msgstr "" "锁屏(%s)也接受你的人脸。如果你回来时它没有扫描,请在空的密码框中按 Enter。" -#: src/face-unlock:132 +#: src/face-unlock:138 msgid "Face unlock is on. Lock the screen and look at it to try." msgstr "人脸解锁已开启。锁定屏幕并看着它来试试。" -#: src/face-unlock:134 +#: src/face-unlock:140 msgid "It can do sudo and admin prompts too. See Settings." msgstr "它也可以用于 sudo 和管理员授权。见“设置”。" -#: src/face-unlock:150 +#: src/face-unlock:156 msgid "Face unlock is off. Your faces are kept; delete them under Faces." msgstr "人脸解锁已关闭。你的人脸会保留;可在“人脸”中删除。" -#: src/face-unlock:164 src/lib/daemon.sh:109 +#: src/face-unlock:170 src/lib/daemon.sh:109 msgid "No face is set up yet." msgstr "尚未设置任何人脸。" -#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664 +#: src/face-unlock:174 src/lib/menu.sh:180 src/lib/menu.sh:685 msgid "on" msgstr "开" -#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192 -#: src/lib/menu.sh:665 +#: src/face-unlock:174 src/lib/menu.sh:182 src/lib/menu.sh:192 +#: src/lib/menu.sh:686 msgid "off" msgstr "关" -#: src/face-unlock:170 src/lib/menu.sh:682 +#: src/face-unlock:176 src/lib/menu.sh:703 #, sh-printf-format msgid "%s samples, %s learned" msgstr "%s 个样本,已学习 %s 个" -#: src/face-unlock:176 +#: src/face-unlock:182 #, sh-printf-format msgid "Which face? See `%s faces` for the ids." msgstr "哪张人脸?用 `%s faces` 查看 ID。" -#: src/face-unlock:180 +#: src/face-unlock:186 msgid "Deleted." msgstr "已删除。" -#: src/face-unlock:191 +#: src/face-unlock:197 msgid "Usage: face-unlock [command]" msgstr "用法:face-unlock [命令]" -#: src/face-unlock:193 +#: src/face-unlock:199 msgid "Commands:" msgstr "命令:" -#: src/face-unlock:194 +#: src/face-unlock:200 msgid "Turn face unlock on" msgstr "开启人脸解锁" -#: src/face-unlock:195 +#: src/face-unlock:201 msgid "Turn it off (faces are kept)" msgstr "关闭(保留人脸)" -#: src/face-unlock:196 src/lib/menu.sh:748 +#: src/face-unlock:202 src/lib/menu.sh:769 msgid "Add a face" msgstr "添加人脸" -#: src/face-unlock:197 +#: src/face-unlock:203 msgid "List the faces" msgstr "列出人脸" -#: src/face-unlock:198 +#: src/face-unlock:204 msgid "Delete a face" msgstr "删除人脸" -#: src/face-unlock:199 +#: src/face-unlock:205 msgid "Look at the camera and see what it sees" msgstr "看着摄像头,查看它看到的画面" -#: src/face-unlock:200 +#: src/face-unlock:206 msgid "Lock the screen" msgstr "锁定屏幕" -#: src/face-unlock:201 +#: src/face-unlock:207 msgid "Show what is on" msgstr "显示已开启的功能" -#: src/face-unlock:202 +#: src/face-unlock:208 msgid "Show this help" msgstr "显示此帮助" -#: src/face-unlock:203 +#: src/face-unlock:209 msgid "Show the version" msgstr "显示版本" -#: src/face-unlock:205 +#: src/face-unlock:211 msgid "Without a command an interactive menu is shown." msgstr "不带命令时显示交互式菜单。" -#: src/face-unlock:224 +#: src/face-unlock:230 msgid "" "Run this as your own user, not as root. It asks for your password when it " "needs to." msgstr "请以你自己的用户运行,不要用 root。需要时会询问你的密码。" -#: src/face-unlock:247 src/lib/system.sh:101 +#: src/face-unlock:253 src/lib/system.sh:101 #, sh-printf-format msgid "Unknown command: %s" msgstr "未知命令:%s" -#: src/lib/common.sh:171 +#: src/lib/common.sh:173 msgid "never" msgstr "从未" -#: src/lib/common.sh:181 +#: src/lib/common.sh:183 msgid "just now" msgstr "刚刚" -#: src/lib/common.sh:183 +#: src/lib/common.sh:185 msgid "1 minute ago" msgstr "1 分钟前" -#: src/lib/common.sh:186 +#: src/lib/common.sh:188 #, sh-printf-format msgid "%d minutes ago" msgstr "%d 分钟前" -#: src/lib/common.sh:188 +#: src/lib/common.sh:190 msgid "1 hour ago" msgstr "1 小时前" -#: src/lib/common.sh:191 +#: src/lib/common.sh:193 #, sh-printf-format msgid "%d hours ago" msgstr "%d 小时前" -#: src/lib/common.sh:193 +#: src/lib/common.sh:195 msgid "1 day ago" msgstr "1 天前" -#: src/lib/common.sh:196 +#: src/lib/common.sh:198 #, sh-printf-format msgid "%d days ago" msgstr "%d 天前" @@ -252,7 +261,7 @@ msgstr "尝试次数过多,人脸解锁已暂停。请用密码解锁一次。 msgid "The camera could not be used." msgstr "无法使用摄像头。" -#: src/lib/daemon.sh:111 src/lib/menu.sh:265 +#: src/lib/daemon.sh:111 src/lib/menu.sh:267 msgid "The recognition models are missing. Reinstall the package." msgstr "缺少识别模型。请重新安装软件包。" @@ -354,11 +363,11 @@ msgstr "尝试次数过多。人脸解锁已暂停,直到你用密码解锁。 msgid "[y/N]" msgstr "[y/N]" -#: src/lib/menu.sh:172 src/lib/menu.sh:566 +#: src/lib/menu.sh:172 src/lib/menu.sh:583 msgid "ON" msgstr "开启" -#: src/lib/menu.sh:174 src/lib/menu.sh:567 +#: src/lib/menu.sh:174 src/lib/menu.sh:584 msgid "OFF" msgstr "关闭" @@ -399,92 +408,100 @@ msgstr "慢" msgid "%s seconds" msgstr "%s 秒" -#: src/lib/menu.sh:202 src/lib/menu.sh:447 +#: src/lib/menu.sh:202 src/lib/menu.sh:452 msgid "automatic" msgstr "自动" -#: src/lib/menu.sh:219 +#: src/lib/menu.sh:203 +msgid "face-unlock's" +msgstr "face-unlock 的" + +#: src/lib/menu.sh:204 +msgid "yours" +msgstr "你自己的" + +#: src/lib/menu.sh:221 msgid "Face unlock" msgstr "人脸解锁" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "Service" msgstr "服务" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:225 msgid "not running" msgstr "未运行" -#: src/lib/menu.sh:225 +#: src/lib/menu.sh:227 msgid "Turning face unlock on again starts it." msgstr "重新开启人脸解锁即可启动它。" -#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660 -#: src/lib/menu.sh:749 +#: src/lib/menu.sh:238 src/lib/menu.sh:240 src/lib/menu.sh:681 +#: src/lib/menu.sh:770 msgid "Faces" msgstr "人脸" -#: src/lib/menu.sh:236 +#: src/lib/menu.sh:238 msgid "none set up yet" msgstr "尚未设置" -#: src/lib/menu.sh:238 +#: src/lib/menu.sh:240 msgid "all turned off" msgstr "全部关闭" -#: src/lib/menu.sh:244 +#: src/lib/menu.sh:246 msgid "none found" msgstr "未找到" -#: src/lib/menu.sh:246 src/lib/menu.sh +#: src/lib/menu.sh:248 src/lib/menu.sh msgid "Camera" msgstr "摄像头" -#: src/lib/menu.sh:248 src/lib/menu.sh +#: src/lib/menu.sh:250 src/lib/menu.sh msgid "Lock screen" msgstr "锁屏" -#: src/lib/menu.sh:252 +#: src/lib/menu.sh:254 msgid "sudo" msgstr "sudo" -#: src/lib/menu.sh:253 src/lib/menu.sh +#: src/lib/menu.sh:255 src/lib/menu.sh msgid "Admin prompts" msgstr "管理员授权" -#: src/lib/menu.sh:255 src/lib/menu.sh +#: src/lib/menu.sh:257 src/lib/menu.sh msgid "Lock screens" msgstr "锁屏" -#: src/lib/menu.sh:257 src/lib/menu.sh +#: src/lib/menu.sh:259 src/lib/menu.sh msgid "Photo check" msgstr "照片检测" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 msgid "Paused" msgstr "已暂停" -#: src/lib/menu.sh:260 +#: src/lib/menu.sh:262 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "还有 %d 分钟,或直到使用密码" -#: src/lib/menu.sh:262 +#: src/lib/menu.sh:264 msgid "Last unlock" msgstr "上次解锁" -#: src/lib/menu.sh:268 +#: src/lib/menu.sh:270 msgid "The lock screen agent is not running." msgstr "锁屏代理没有运行。" -#: src/lib/menu.sh:318 +#: src/lib/menu.sh:322 msgid "" "On GNOME a small GNOME extension shows the bubble. Turning face unlock on " "switches it on." msgstr "" "在 GNOME 上,由一个小的 GNOME 扩展显示气泡。开启人脸解锁时会一并开启它。" -#: src/lib/menu.sh:322 +#: src/lib/menu.sh:326 msgid "" "Scans when you come back to hyprlock, swaylock or face-unlock's own lock " "screen (`face-unlock lock`, with the bubble), and opens them. Other lock " @@ -493,31 +510,40 @@ msgstr "" "回到 hyprlock、swaylock 或 face-unlock 自带的锁屏(`face-unlock lock`,带气" "泡)时扫描并打开它们。其他锁屏按 Enter 扫描。" -#: src/lib/menu.sh:327 +#: src/lib/menu.sh:331 msgid "" "Unlocks the lock screen when it sees your face. Off: only your password " "works there." msgstr "看到你的脸时解锁锁屏。关闭:锁屏只能用密码。" -#: src/lib/menu.sh:328 +#: src/lib/menu.sh:332 msgid "" "Scans when you press a key or move the mouse on the lock screen, and when " "the computer wakes up." msgstr "在锁屏上按键或移动鼠标时,以及电脑唤醒时扫描。" -#: src/lib/menu.sh:329 +#: src/lib/menu.sh:333 msgid "" "Scans as soon as the screen locks. Off by default: if you lock it yourself, " "it would unlock again right away." msgstr "屏幕一锁定就扫描。默认关闭:如果是你自己锁的屏,它会马上又解锁。" -#: src/lib/menu.sh:330 +#: src/lib/menu.sh:334 msgid "" "sudo takes your face instead of the password. No match: you type the " "password as usual." msgstr "sudo 用你的脸代替密码。不匹配时,照常输入密码。" -#: src/lib/menu.sh:331 +#: src/lib/menu.sh:335 +msgid "" +"face-unlock's lock screen shows the bubble, and you lock with `face-unlock " +"lock`. Or keep yours: hyprlock then shows a line of text at the top. Enter " +"opens the choice." +msgstr "" +"face-unlock 的锁屏会显示气泡,用 `face-unlock lock` 锁屏。也可以保留你自己" +"的:hyprlock 会在顶部显示一行文字。按 Enter 打开选择。" + +#: src/lib/menu.sh:336 msgid "" "The picture behind face-unlock's own lock screen (`face-unlock lock`). " "Empty: the one on your desktop. Or a file, a folder to take one from at " @@ -526,11 +552,11 @@ msgstr "" "face-unlock 锁屏(`face-unlock lock`)背后的图片。留空:用桌面的图片。或者一" "个文件、从中随机挑选的文件夹,或 `none`。按 Enter 输入。" -#: src/lib/menu.sh:332 +#: src/lib/menu.sh:337 msgid "Blurs the picture behind face-unlock's own lock screen." msgstr "模糊 face-unlock 锁屏背后的图片。" -#: src/lib/menu.sh:333 +#: src/lib/menu.sh:338 #, sh-printf-format msgid "" "The lock screen takes your face in its password check. Press Enter on the " @@ -538,47 +564,47 @@ msgid "" msgstr "" "锁屏在检查密码时也接受你的人脸。在空白框中按 Enter 即可扫描。此处找到:%s。" -#: src/lib/menu.sh:334 +#: src/lib/menu.sh:339 msgid "" "The password windows of your desktop and apps, for example when you install " "software. No match: you type the password." msgstr "桌面和应用的密码窗口,例如安装软件时。不匹配时,输入密码即可。" -#: src/lib/menu.sh:335 +#: src/lib/menu.sh:340 msgid "" "You have to blink or turn your head a little. This also stops printed photos." msgstr "你需要眨眼或稍微转头。这也能挡住打印的照片。" -#: src/lib/menu.sh:336 +#: src/lib/menu.sh:341 msgid "No check at all. Only for trying out a camera." msgstr "完全不检测。仅用于试用摄像头。" -#: src/lib/menu.sh:337 +#: src/lib/menu.sh:342 msgid "" "Stops photos on a phone, a tablet or glossy paper. You do not have to blink. " "A matte printed photo can get through." msgstr "挡住手机、平板或光面纸上的照片。无需眨眼。哑光纸打印的照片可能会通过。" -#: src/lib/menu.sh:338 +#: src/lib/menu.sh:343 msgid "" "Fewer wrong matches, but it may not know you with glasses or in bad light." msgstr "误认更少,但戴眼镜或光线不好时可能认不出你。" -#: src/lib/menu.sh:339 +#: src/lib/menu.sh:344 msgid "Knows you more easily, but also somebody who looks a lot like you." msgstr "更容易认出你,但也更容易认出和你长得很像的人。" -#: src/lib/menu.sh:340 +#: src/lib/menu.sh:345 msgid "The default. Right for most people." msgstr "默认值。适合大多数人。" -#: src/lib/menu.sh:341 +#: src/lib/menu.sh:346 msgid "" "Your eyes have to be open and on the screen. So it does not unlock while you " "look away or sleep." msgstr "你的眼睛必须睁开并看着屏幕。这样你看向别处或睡着时不会解锁。" -#: src/lib/menu.sh:342 +#: src/lib/menu.sh:347 msgid "" "Automatic takes the first normal camera. After a change, set up your face " "again. An infrared camera needs its light on (linux-enable-ir-emitter)." @@ -586,111 +612,111 @@ msgstr "" "“自动”会使用第一个普通摄像头。更换后请重新设置人脸。红外摄像头需要打开它的补" "光灯(linux-enable-ir-emitter)。" -#: src/lib/menu.sh:343 +#: src/lib/menu.sh:348 msgid "How long the camera looks for your face before it gives up." msgstr "摄像头寻找你的脸多久后放弃。" -#: src/lib/menu.sh:344 +#: src/lib/menu.sh:349 msgid "" "After a sure match it keeps how you look now. So a new haircut or glasses " "need no new setup." msgstr "确定匹配后,会记住你现在的样子。所以换了发型或戴上眼镜也无需重新设置。" -#: src/lib/menu.sh:345 +#: src/lib/menu.sh:350 msgid "" "No scan while the laptop is closed, for example at a desk with an external " "screen." msgstr "笔记本合上时不扫描,例如在接了外接显示器的桌前。" -#: src/lib/menu.sh:346 +#: src/lib/menu.sh:351 msgid "The bubble at the top of the screen shows what the camera is doing." msgstr "屏幕顶部的气泡显示摄像头正在做什么。" -#: src/lib/menu.sh:347 +#: src/lib/menu.sh:352 msgid "A small pill with a lock that opens." msgstr "一个带锁的小药丸,锁会打开。" -#: src/lib/menu.sh:348 +#: src/lib/menu.sh:353 msgid "An island with a face that looks around, then rings and a tick." msgstr "一个岛,里面有一张四处张望的脸,然后是圆环和一个对勾。" -#: src/lib/menu.sh:349 +#: src/lib/menu.sh:354 msgid "How fast the bubble moves." msgstr "气泡移动的速度。" -#: src/lib/menu.sh:350 +#: src/lib/menu.sh:355 msgid "Shows the bubble when sudo or an admin prompt scans your face, too." msgstr "sudo 或管理员授权扫描你的脸时也显示气泡。" -#: src/lib/menu.sh:443 +#: src/lib/menu.sh:448 #, sh-printf-format msgid "automatic (%s)" msgstr "自动(%s)" -#: src/lib/menu.sh:453 +#: src/lib/menu.sh:458 msgid "(infrared)" msgstr "(红外)" -#: src/lib/menu.sh:457 +#: src/lib/menu.sh:462 msgid "(not connected)" msgstr "(未连接)" -#: src/lib/menu.sh:466 +#: src/lib/menu.sh:471 msgid "same as desktop" msgstr "与桌面相同" -#: src/lib/menu.sh:470 +#: src/lib/menu.sh:475 msgid "none" msgstr "无" -#: src/lib/menu.sh:487 +#: src/lib/menu.sh:504 msgid "Picture or folder:" msgstr "图片或文件夹:" -#: src/lib/menu.sh:492 +#: src/lib/menu.sh:509 #, sh-printf-format msgid "Not found: %s" msgstr "未找到:%s" -#: src/lib/menu.sh:563 src/lib/menu.sh:750 +#: src/lib/menu.sh:580 src/lib/menu.sh:771 msgid "Settings" msgstr "设置" -#: src/lib/menu.sh:564 +#: src/lib/menu.sh:581 msgid "↑↓ select ←→ or Space: change q: back" msgstr "↑↓ 选择 ←→ 或空格:更改 q:返回" -#: src/lib/menu.sh:565 +#: src/lib/menu.sh:582 msgid "for all users, asks for your password" msgstr "对所有用户生效,需要你的密码" #. TRANSLATORS: keep the letters, they are the keys. -#: src/lib/menu.sh:662 +#: src/lib/menu.sh:683 msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgstr "上/下:选择,空格:开/关,r:重命名,d:删除,a:添加,q:返回" -#: src/lib/menu.sh:663 +#: src/lib/menu.sh:684 msgid "No face is set up yet. Press a to add one." msgstr "尚未设置任何人脸。按 a 添加。" -#: src/lib/menu.sh:709 +#: src/lib/menu.sh:730 msgid "New name:" msgstr "新名称:" -#: src/lib/menu.sh:716 +#: src/lib/menu.sh:737 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "删除“%s”?" -#: src/lib/menu.sh:747 +#: src/lib/menu.sh:768 msgid "Turn face unlock on or off" msgstr "开启或关闭人脸解锁" -#: src/lib/menu.sh:751 +#: src/lib/menu.sh:772 msgid "Try it" msgstr "试一试" -#: src/lib/menu.sh:752 +#: src/lib/menu.sh:773 msgid "Quit" msgstr "退出" @@ -734,6 +760,47 @@ msgid "" "Hyprland does not start the lock screen agent by itself. Add this to %s:" msgstr "Hyprland 不会自动启动锁屏代理。请把以下内容加入 %s:" +#: src/lib/system.sh:267 src/lib/system.sh:270 +#, sh-printf-format +msgid "To lock with it, add this to %s, and set %s in %s:" +msgstr "要用它锁屏,请把这行加入 %s,并把 %s 写进 %s:" + +#: src/lib/system.sh:275 +#, sh-printf-format +msgid "To lock with it, add this to the binds in %s, and use %s in swayidle:" +msgstr "要用它锁屏,请把这行加入 %s 的 binds,并在 swayidle 中使用 %s:" + +#: src/lib/system.sh:279 +#, sh-printf-format +msgid "To lock with it, run %s where your lock screen is started now." +msgstr "要用它锁屏,请在现在启动锁屏的地方运行 %s。" + +#: src/lib/system.sh:292 +msgid "You lock with face-unlock's lock screen now." +msgstr "现在用 face-unlock 的锁屏锁定。" + +#: src/lib/system.sh:299 +msgid "" +"hyprlock shows what face unlock is doing at the top, from the next time it " +"locks." +msgstr "从下次锁屏起,hyprlock 会在顶部显示 face unlock 正在做什么。" + +#: src/lib/system.sh:300 +#, sh-printf-format +msgid "Could not add the line to %s." +msgstr "无法把这行加入 %s。" + +#: src/lib/system.sh:301 +msgid "" +"Your lock screen stays as it is. Press Enter on the empty password field to " +"scan." +msgstr "你的锁屏保持不变。在空密码框中按 Enter 即可扫描。" + +#: src/lib/system.sh:302 +#, sh-printf-format +msgid "hyprlock has no %s, so it cannot show the text." +msgstr "hyprlock 没有 %s,所以无法显示文字。" + #: src/lib/menu.sh msgid "Unlock with your face" msgstr "用人脸解锁" @@ -746,6 +813,10 @@ msgstr "你回来时扫描" msgid "Scan right after locking" msgstr "锁定后立即扫描" +#: src/lib/menu.sh +msgid "Which lock screen" +msgstr "使用哪个锁屏" + #: src/lib/menu.sh msgid "Wallpaper" msgstr "壁纸" @@ -910,34 +981,47 @@ msgstr "摄像头正忙于另一次扫描。请稍后重试。" msgid "The face could not be added (%1)." msgstr "无法添加人脸(%1)。" +#: src/agent/lockpreview.cpp:349 src/agent/lockpreview.cpp:559 +#: src/agent/locktext.cpp:45 +msgid "Looking for your face…" +msgstr "正在寻找你的脸…" + #: src/agent/lockscreencontroller.cpp:172 msgid "Wrong password" msgstr "密码错误" -#: src/agent/main.cpp:185 +#: src/agent/locktext.cpp:48 +msgid "Face recognized" +msgstr "已识别面容" + +#: src/agent/main.cpp:244 msgid "Face unlock for the lock screen, sudo and admin prompts" msgstr "用于锁屏、sudo 和管理员授权的人脸解锁" -#: src/agent/main.cpp:188 +#: src/agent/main.cpp:247 msgid "Set up a face." msgstr "设置一张人脸。" -#: src/agent/main.cpp:189 +#: src/agent/main.cpp:248 msgid "What to call the new face." msgstr "新人脸的名称。" -#: src/agent/main.cpp:190 +#: src/agent/main.cpp:249 msgid "Lock the screen." msgstr "锁定屏幕。" -#: src/agent/main.cpp:191 +#: src/agent/main.cpp:250 msgid "Play the bubble's animations once." msgstr "播放一次气泡动画。" -#: src/agent/main.cpp:193 +#: src/agent/main.cpp:252 msgid "Bubble style for the demo: full or minimal." msgstr "演示用的气泡样式:full 或 minimal。" +#: src/agent/main.cpp:253 +msgid "Ask which lock screen to use, and print the answer." +msgstr "询问使用哪个锁屏,并输出答案。" + #: src/pam/pam_face_unlock.c:356 msgid "Look at the camera to unlock." msgstr "看着摄像头来解锁。" @@ -993,7 +1077,7 @@ msgstr "" msgid "Name (optional)" msgstr "名称(可选)" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:177 src/agent/qml/LockChoice.qml:255 msgid "Cancel" msgstr "取消" @@ -1013,14 +1097,63 @@ msgstr "开始" msgid "Done" msgstr "完成" -#: src/agent/qml/LockScreen.qml:171 +#: src/agent/qml/LockChoice.qml:52 +msgid "Choose your lock screen" +msgstr "选择锁屏" + +#: src/agent/qml/LockChoice.qml:198 +msgid "Your lock screen" +msgstr "你的锁屏" + +#: src/agent/qml/LockChoice.qml:209 +msgid "" +"Your desktop leaves the lock screen to a program of your choice. Pick how " +"face unlock shows up there. You can change it later under Settings." +msgstr "" +"你的桌面把锁屏交给你选择的程序。请选择 face unlock 在那里如何显示。之后可以在" +"设置中更改。" + +#: src/agent/qml/LockChoice.qml:232 +msgid "face-unlock's lock screen" +msgstr "face-unlock 的锁屏" + +#: src/agent/qml/LockChoice.qml:233 +msgid "" +"The bubble at the top, the time and your wallpaper. Your shortcut and idle " +"lock then run face-unlock lock." +msgstr "" +"顶部的气泡、时间和你的壁纸。你的快捷键和空闲锁屏会运行 face-unlock lock。" + +#: src/agent/qml/LockChoice.qml:240 +msgid "Keep your lock screen" +msgstr "保留你的锁屏" + +#: src/agent/qml/LockChoice.qml:242 +msgid "" +"It stays as it is. hyprlock shows a line of text at the top instead of the " +"bubble. Enter on the empty password field scans." +msgstr "" +"保持不变。hyprlock 会在顶部显示一行文字,代替气泡。在空密码框中按 Enter 即可" +"扫描。" + +#: src/agent/qml/LockChoice.qml:243 +msgid "" +"It stays as it is, without the bubble. Enter on the empty password field " +"scans." +msgstr "保持不变,没有气泡。在空密码框中按 Enter 即可扫描。" + +#: src/agent/qml/LockChoice.qml:260 +msgid "Continue" +msgstr "继续" + +#: src/agent/qml/LockScreen.qml:180 msgid "Password" msgstr "密码" -#: src/agent/qml/LockScreen.qml:185 +#: src/agent/qml/LockScreen.qml:194 msgid "Look at the camera or type your password" msgstr "看向摄像头或输入密码" -#: src/agent/qml/LockScreen.qml:186 +#: src/agent/qml/LockScreen.qml:195 msgid "Type your password" msgstr "输入密码" diff --git a/res/screenshots/lock-choice.png b/res/screenshots/lock-choice.png new file mode 100644 index 0000000000000000000000000000000000000000..38cbb0a894c690c3f219bd28e3f9fd1869118bb4 GIT binary patch literal 148626 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
  • v}bPz1x~Y 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 Mtt?e1VH*0s0FKpbv;Y7A literal 0 HcmV?d00001 diff --git a/src/agent/lockers.h b/src/agent/lockers.h index 7e78668..f513915 100644 --- a/src/agent/lockers.h +++ b/src/agent/lockers.h @@ -1,7 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later // // The lock screens that are programs of their own and take signals from -// outside: hyprlock, swaylock and gtklock open on SIGUSR1. +// outside: hyprlock, swaylock and gtklock open on SIGUSR1, hyprlock reads +// its labels again on SIGUSR2. #pragma once diff --git a/src/agent/lockpreview.cpp b/src/agent/lockpreview.cpp new file mode 100644 index 0000000..7d64424 --- /dev/null +++ b/src/agent/lockpreview.cpp @@ -0,0 +1,647 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "lockpreview.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace +{ +QString readFile(const QString &path) +{ + QFile f(path); + return f.open(QIODevice::ReadOnly | QIODevice::Text) ? QString::fromUtf8(f.readAll()) : QString(); +} + +QString expandHome(const QString &path) +{ + return path == u"~" ? QDir::homePath() : path.startsWith(u"~/") ? QDir::homePath() + path.mid(1) : path; +} + +QString configHome() +{ + return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation); +} + +// The first file of name under the user's and then the system's config +// directories, as hyprlock and swaylock look for theirs. +QString findConfig(const QString &name) +{ + QStringList dirs{configHome()}; + dirs += QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation); + for (const QString &dir : std::as_const(dirs)) { + if (QFileInfo::exists(dir + u'/' + name)) { + return dir + u'/' + name; + } + } + return {}; +} + +bool truthy(const QString &value) +{ + return value == u"1" || value.compare(u"true", Qt::CaseInsensitive) == 0 || value.compare(u"yes", Qt::CaseInsensitive) == 0 + || value.compare(u"on", Qt::CaseInsensitive) == 0; +} + +// --------------------------------------------------------------------------- +// hyprlang, as far as a lock screen's config needs it + +struct Section { + QString name; + QHash values; +}; + +// Sections, $variables, source = (with ~ and wildcards, relative to the +// file), and # comments, where ## stands for a #. +class Hyprlang +{ +public: + void parse(const QString &path, int depth = 0); + + QList
    sections; + +private: + QString expand(const QString &value) const; + + QHash m_vars; + QList m_open; +}; + +QString stripComment(const QString &line) +{ + QString out; + for (qsizetype i = 0; i < line.size(); ++i) { + if (line.at(i) == u'#') { + if (i + 1 < line.size() && line.at(i + 1) == u'#') { + out += u'#'; + ++i; + continue; + } + break; + } + out += line.at(i); + } + return out.trimmed(); +} + +void Hyprlang::parse(const QString &path, int depth) +{ + if (depth > 8) { + return; + } + const QString dir = QFileInfo(path).absolutePath(); + const QStringList lines = readFile(path).split(u'\n'); + for (const QString &raw : lines) { + const QString line = stripComment(raw); + if (line.isEmpty()) { + continue; + } + if (line == u"}") { + if (!m_open.isEmpty()) { + m_open.removeLast(); + } + continue; + } + if (line.endsWith(u'{')) { + sections.append({line.chopped(1).trimmed(), {}}); + m_open.append(sections.size() - 1); + continue; + } + const qsizetype eq = line.indexOf(u'='); + if (eq < 0) { + continue; + } + const QString key = line.left(eq).trimmed(); + const QString value = expand(line.mid(eq + 1).trimmed()); + if (key.startsWith(u'$')) { + m_vars.insert(key.mid(1), value); + } else if (key == u"source" && m_open.isEmpty()) { + const QFileInfo pattern(QDir(dir).absoluteFilePath(expandHome(value))); + const QStringList matches = QDir(pattern.absolutePath()).entryList({pattern.fileName()}, QDir::Files, QDir::Name); + for (const QString &match : matches) { + parse(pattern.absolutePath() + u'/' + match, depth + 1); + } + } else if (!m_open.isEmpty()) { + sections[m_open.last()].values.insert(key, value); + } + } +} + +QString Hyprlang::expand(const QString &value) const +{ + if (!value.contains(u'$') || m_vars.isEmpty()) { + return value; + } + // Longest first, so $font does not eat the start of $fontsize. + QStringList names = m_vars.keys(); + std::sort(names.begin(), names.end(), [](const QString &a, const QString &b) { + return a.size() > b.size(); + }); + QString out = value; + for (const QString &name : std::as_const(names)) { + out.replace(u'$' + name, m_vars.value(name)); + } + return out; +} + +// --------------------------------------------------------------------------- +// Values + +// "rgba(a, b) rgba(c) 45deg": the colours and the angle. +QVariantMap gradient(const QString &value) +{ + QVariantList colors; + double angle = 0; + QString token; + int depth = 0; + const auto flush = [&] { + const QString t = token.trimmed(); + token.clear(); + if (t.endsWith(u"deg")) { + angle = t.chopped(3).toDouble(); + } else if (const QColor c = LockPreview::color(t); c.isValid()) { + colors.append(c); + } + }; + for (const QChar ch : value) { + if (ch == u'(') { + ++depth; + } else if (ch == u')') { + --depth; + } + if (ch.isSpace() && depth == 0) { + flush(); + } else { + token += ch; + } + } + flush(); + return {{QStringLiteral("colors"), colors}, {QStringLiteral("angle"), angle}}; +} + +// "x, y", each in pixels or percent of the screen. +QPointF layout(const QString &value, const QSizeF &screen) +{ + const QStringList parts = value.split(u','); + const auto one = [](const QString &part, qreal whole) { + const QString s = part.trimmed(); + return s.endsWith(u'%') ? s.chopped(1).toDouble() / 100.0 * whole : s.toDouble(); + }; + return {one(parts.value(0), screen.width()), one(parts.value(1), screen.height())}; +} + +// A Pango font description ("Noto Sans Light 12") as family, weight and +// slant. +void font(const QString &description, QVariantMap &into) +{ + static const QHash weights{ + {QStringLiteral("thin"), 100}, {QStringLiteral("ultra-light"), 200}, {QStringLiteral("extra-light"), 200}, + {QStringLiteral("ultralight"), 200}, {QStringLiteral("extralight"), 200}, {QStringLiteral("light"), 300}, + {QStringLiteral("semi-light"), 350}, {QStringLiteral("book"), 380}, {QStringLiteral("regular"), 400}, + {QStringLiteral("normal"), 400}, {QStringLiteral("medium"), 500}, {QStringLiteral("semi-bold"), 600}, + {QStringLiteral("semibold"), 600}, {QStringLiteral("demi-bold"), 600}, {QStringLiteral("demibold"), 600}, + {QStringLiteral("bold"), 700}, {QStringLiteral("ultra-bold"), 800}, {QStringLiteral("extra-bold"), 800}, + {QStringLiteral("extrabold"), 800}, {QStringLiteral("heavy"), 900}, {QStringLiteral("black"), 900}, + }; + QStringList words = description.section(u',', 0, 0).split(u' ', Qt::SkipEmptyParts); + int weight = 400; + bool italic = false; + while (words.size() > 1) { + const QString word = words.last().toLower(); + bool number = false; + word.toDouble(&number); + if (number) { + words.removeLast(); + } else if (word == u"italic" || word == u"oblique") { + italic = true; + words.removeLast(); + } else if (weights.contains(word)) { + weight = weights.value(word); + words.removeLast(); + } else { + break; + } + } + into.insert(QStringLiteral("family"), words.isEmpty() ? QStringLiteral("Sans") : words.join(u' ')); + into.insert(QStringLiteral("weight"), weight); + into.insert(QStringLiteral("italic"), italic); +} + +// Pango markup as Qt's StyledText: span becomes font, b and i, the rest of +// Pango's tags go and their text stays. +QString styled(const QString &markup) +{ + static const QRegularExpression tag(QStringLiteral("<(/?)([a-zA-Z]+)([^>]*)>")); + static const QRegularExpression attribute(QStringLiteral("([a-z_]+)\\s*=\\s*[\"']([^\"']*)[\"']")); + QString out; + QStringList closers; + qsizetype last = 0; + auto it = tag.globalMatch(markup); + while (it.hasNext()) { + const auto m = it.next(); + out += markup.mid(last, m.capturedStart() - last); + last = m.capturedEnd(); + const bool closing = !m.captured(1).isEmpty(); + const QString name = m.captured(2).toLower(); + if (name == u"span") { + if (closing) { + out += closers.isEmpty() ? QString() : closers.takeLast(); + continue; + } + QString open; + QString close; + QString fontAttrs; + auto attrs = attribute.globalMatch(m.captured(3)); + while (attrs.hasNext()) { + const auto a = attrs.next(); + const QString key = a.captured(1); + QString value = a.captured(2); + if (key == u"foreground" || key == u"fgcolor" || key == u"color") { + // Pango's #RRGGBBAA is Qt's #AARRGGBB. + if (value.startsWith(u'#') && value.size() == 9) { + value = u'#' + value.mid(7, 2) + value.mid(1, 6); + } + fontAttrs += QStringLiteral(" color=\"%1\"").arg(value); + } else if (key == u"font_family" || key == u"face") { + fontAttrs += QStringLiteral(" face=\"%1\"").arg(value); + } else if ((key == u"weight" || key == u"font_weight") && (value.contains(u"bold") || value.contains(u"heavy") || value.toInt() >= 600)) { + open += QStringLiteral(""); + close.prepend(QStringLiteral("")); + } else if ((key == u"style" || key == u"font_style") && value == u"italic") { + open += QStringLiteral(""); + close.prepend(QStringLiteral("")); + } + } + if (!fontAttrs.isEmpty()) { + open.prepend(QStringLiteral("").arg(fontAttrs)); + close += QStringLiteral(""); + } + out += open; + closers.append(close); + } else if (name == u"b" || name == u"i" || name == u"u") { + out += m.captured(0); + } + } + out += markup.mid(last); + out.replace(u'\n', QStringLiteral("
    ")); + return out; +} + +// What a command prints, or nothing when it takes too long. +QString run(const QString &command, QElapsedTimer &budget) +{ + // A config full of slow commands (weather, music) must not keep the + // window from opening. + if (budget.elapsed() > 2000) { + return {}; + } + QProcess process; + process.start(QStringLiteral("/bin/sh"), {QStringLiteral("-c"), command}); + if (!process.waitForFinished(700)) { + process.kill(); + process.waitForFinished(100); + return {}; + } + return QString::fromUtf8(process.readAllStandardOutput()); +} + +// A label's text as hyprlock would show it right after locking. +QString labelText(QString text, bool trim, QElapsedTimer &budget) +{ + const passwd *pw = getpwuid(getuid()); + text.replace(QStringLiteral("$DESC"), pw ? QString::fromLocal8Bit(pw->pw_gecos) : QString()); + text.replace(QStringLiteral("$USER"), pw ? QString::fromLocal8Bit(pw->pw_name) : QString()); + text.replace(QStringLiteral("
    "), QStringLiteral("\n")); + const QTime now = QTime::currentTime(); + text.replace(QStringLiteral("$TIME12"), now.toString(QStringLiteral("hh:mm AP"))); + text.replace(QStringLiteral("$TIME"), now.toString(QStringLiteral("HH:mm"))); + static const QRegularExpression layoutVar(QStringLiteral("\\$LAYOUT(\\[([^\\]]*)\\])?")); + auto layouts = layoutVar.globalMatch(text); + while (layouts.hasNext()) { + const auto m = layouts.next(); + const QString first = m.captured(2).section(u',', 0, 0).trimmed(); + text.replace(m.captured(0), first.isEmpty() ? QStringLiteral("en") : first); + } + // What only a lock screen that runs knows: nothing has failed yet. + static const QRegularExpression runtime(QStringLiteral("\\$(ATTEMPTS(\\[[^\\]]*\\])?|PAMFAIL|FPRINTFAIL|FPRINTPROMPT|FAIL)")); + text.remove(runtime); + text.replace(QStringLiteral("$PAMPROMPT"), QStringLiteral("Password:")); + + if (text.startsWith(u"cmd[") && text.contains(u']')) { + const QString command = text.mid(text.indexOf(u']') + 1); + // face-unlock's own line, as it reads during a scan. + text = command.contains(u"face-unlock/lock-text") ? i18n("Looking for your face…").toHtmlEscaped() : run(command, budget); + } + return trim ? text.trimmed() : text; +} + +void place(const Section &s, const QString &position, const QSizeF &screen, QVariantMap &into) +{ + const QPointF pos = layout(s.values.value(QStringLiteral("position"), position), screen); + into.insert(QStringLiteral("x"), pos.x()); + into.insert(QStringLiteral("y"), pos.y()); + into.insert(QStringLiteral("halign"), s.values.value(QStringLiteral("halign"), QStringLiteral("center"))); + into.insert(QStringLiteral("valign"), s.values.value(QStringLiteral("valign"), QStringLiteral("center"))); + into.insert(QStringLiteral("rotate"), s.values.value(QStringLiteral("rotate"), QStringLiteral("0")).toDouble()); +} + +QColor colorOr(const QString &value, const QColor &fallback) +{ + const QColor c = LockPreview::color(value); + return c.isValid() ? c : fallback; +} + +// swaylock's colours: RRGGBB or RRGGBBAA, without a #. +QColor hexColor(const QString &value, const QColor &fallback) +{ + QString v = value.trimmed(); + if (v.startsWith(u'#')) { + v = v.mid(1); + } + bool ok = false; + const uint n = v.toUInt(&ok, 16); + if (!ok || (v.size() != 6 && v.size() != 8)) { + return fallback; + } + return v.size() == 6 ? QColor((n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff) : QColor((n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff); +} + +QVariantMap wallpaperOnly(const QUrl &wallpaper) +{ + return {{QStringLiteral("type"), QStringLiteral("background")}, + {QStringLiteral("color"), QColor(0x11, 0x11, 0x11)}, + {QStringLiteral("source"), wallpaper}, + {QStringLiteral("fill"), QStringLiteral("fill")}, + {QStringLiteral("blur"), 0.0}, + {QStringLiteral("dim"), 0.0}}; +} +} // namespace + +QColor LockPreview::color(const QString &value) +{ + const QString v = value.trimmed(); + static const QRegularExpression call(QStringLiteral("^(rgba?)\\((.*)\\)$")); + const auto m = call.match(v); + if (m.hasMatch()) { + const QString inner = m.captured(2).trimmed(); + const QStringList parts = inner.split(u','); + if (parts.size() >= 3) { + QColor c(parts.at(0).trimmed().toInt(), parts.at(1).trimmed().toInt(), parts.at(2).trimmed().toInt()); + if (parts.size() >= 4) { + c.setAlphaF(std::clamp(parts.at(3).trimmed().toDouble(), 0.0, 1.0)); + } + return c; + } + return hexColor(inner, {}); + } + bool ok = false; + const qulonglong n = v.startsWith(u"0x", Qt::CaseInsensitive) ? v.mid(2).toULongLong(&ok, 16) : v.toULongLong(&ok, 10); + if (!ok) { + return {}; + } + return QColor(int((n >> 16) & 0xff), int((n >> 8) & 0xff), int(n & 0xff), int((n >> 24) & 0xff)); +} + +QString LockPreview::locker() +{ + static const QStringList names{QStringLiteral("hyprlock"), QStringLiteral("swaylock"), QStringLiteral("gtklock"), QStringLiteral("waylock")}; + // Where a lock screen is started from: the idle daemons first, then the + // keys. The first one named there, outside comments. + static const QStringList places{QStringLiteral("hypr/hypridle.conf"), QStringLiteral("swayidle/config"), QStringLiteral("niri/config.kdl"), + QStringLiteral("hypr/hyprland.lua"), QStringLiteral("hypr/hyprland.conf")}; + for (const QString &place : places) { + for (const QString &line : readFile(configHome() + u'/' + place).split(u'\n')) { + const QString code = line.trimmed(); + if (code.startsWith(u'#') || code.startsWith(u"//") || code.startsWith(u"--")) { + continue; + } + qsizetype first = -1; + QString found; + for (const QString &name : names) { + const qsizetype at = code.indexOf(name); + if (at >= 0 && (first < 0 || at < first)) { + first = at; + found = name; + } + } + if (!found.isEmpty()) { + return found; + } + } + } + // Started some other way (a script of its own): one that is set up. + if (!QStandardPaths::findExecutable(QStringLiteral("hyprlock")).isEmpty() && !findConfig(QStringLiteral("hypr/hyprlock.conf")).isEmpty()) { + return QStringLiteral("hyprlock"); + } + for (const QString &name : names) { + if (!QStandardPaths::findExecutable(name).isEmpty()) { + return name; + } + } + return {}; +} + +QVariantList LockPreview::hyprlock(const QString &configPath, const QSizeF &screen, const QString &output, const QUrl &wallpaper) +{ + Hyprlang config; + config.parse(configPath); + + bool trim = true; + for (const Section &s : std::as_const(config.sections)) { + if (s.name == u"general" && s.values.contains(QStringLiteral("text_trim"))) { + trim = truthy(s.values.value(QStringLiteral("text_trim"))); + } + } + + QElapsedTimer budget; + budget.start(); + QList> placed; + bool ourLine = false; + bool background = false; + for (const Section &s : std::as_const(config.sections)) { + const auto value = [&s](const char *key, const char *fallback) { + return s.values.value(QString::fromLatin1(key), QString::fromLatin1(fallback)); + }; + const QString monitor = value("monitor", ""); + if (!monitor.isEmpty() && monitor != output && !monitor.startsWith(u"desc:")) { + continue; + } + QVariantMap w; + int z = value("zindex", "0").toInt(); + if (s.name == u"background") { + background = true; + z = value("zindex", "-1").toInt(); + const QString path = value("path", ""); + const int passes = value("blur_passes", "0").toInt(); + w = wallpaperOnly(path == u"screenshot" ? wallpaper : path.isEmpty() ? QUrl() : QUrl::fromLocalFile(expandHome(path))); + w.insert(QStringLiteral("color"), colorOr(value("color", ""), QColor(0x11, 0x11, 0x11))); + w.insert(QStringLiteral("blur"), passes > 0 ? std::min(1.0, passes * value("blur_size", "8").toDouble() / 24.0) : 0.0); + // hyprlock's blur also darkens, by its brightness. + w.insert(QStringLiteral("dim"), passes > 0 ? std::clamp(1.0 - value("brightness", "0.8172").toDouble(), 0.0, 1.0) : 0.0); + } else if (s.name == u"label") { + const QString text = value("text", "Sample Text"); + ourLine = ourLine || text.contains(u"face-unlock/lock-text"); + w.insert(QStringLiteral("type"), QStringLiteral("label")); + w.insert(QStringLiteral("text"), styled(labelText(text, trim, budget))); + font(value("font_family", "Sans"), w); + w.insert(QStringLiteral("size"), value("font_size", "16").toDouble()); + w.insert(QStringLiteral("color"), colorOr(value("color", ""), Qt::white)); + w.insert(QStringLiteral("align"), value("text_align", "center")); + w.insert(QStringLiteral("shadow"), value("shadow_passes", "0").toInt() > 0); + w.insert(QStringLiteral("shadowSize"), value("shadow_size", "3").toDouble()); + w.insert(QStringLiteral("shadowColor"), colorOr(value("shadow_color", ""), Qt::black)); + place(s, QStringLiteral("0,0"), screen, w); + } else if (s.name == u"input-field") { + const QPointF size = layout(value("size", "400,90"), screen); + w.insert(QStringLiteral("type"), QStringLiteral("input")); + w.insert(QStringLiteral("width"), size.x()); + w.insert(QStringLiteral("height"), size.y()); + w.insert(QStringLiteral("thickness"), value("outline_thickness", "4").toDouble()); + w.insert(QStringLiteral("outer"), gradient(value("outer_color", "0xFF111111"))); + w.insert(QStringLiteral("inner"), colorOr(value("inner_color", ""), QColor(0xdd, 0xdd, 0xdd))); + w.insert(QStringLiteral("fontColor"), colorOr(value("font_color", ""), Qt::black)); + font(value("font_family", "Sans"), w); + w.insert(QStringLiteral("placeholder"), styled(labelText(value("placeholder_text", "Input Password"), trim, budget))); + w.insert(QStringLiteral("rounding"), value("rounding", "-1").toDouble()); + place(s, QStringLiteral("0,0"), screen, w); + } else if (s.name == u"shape") { + const QPointF size = layout(value("size", "100,100"), screen); + w.insert(QStringLiteral("type"), QStringLiteral("shape")); + w.insert(QStringLiteral("width"), size.x()); + w.insert(QStringLiteral("height"), size.y()); + w.insert(QStringLiteral("color"), colorOr(value("color", ""), QColor(0x11, 0x11, 0x11))); + w.insert(QStringLiteral("rounding"), value("rounding", "0").toDouble()); + w.insert(QStringLiteral("borderSize"), value("border_size", "0").toDouble()); + w.insert(QStringLiteral("border"), gradient(value("border_color", "0xFF00CFE6"))); + place(s, QStringLiteral("0,0"), screen, w); + } else if (s.name == u"image") { + const QString path = value("path", ""); + if (path.isEmpty()) { + continue; + } + w.insert(QStringLiteral("type"), QStringLiteral("image")); + w.insert(QStringLiteral("source"), QUrl::fromLocalFile(expandHome(path))); + w.insert(QStringLiteral("size"), value("size", "150").toDouble()); + w.insert(QStringLiteral("rounding"), value("rounding", "-1").toDouble()); + w.insert(QStringLiteral("borderSize"), value("border_size", "4").toDouble()); + w.insert(QStringLiteral("border"), gradient(value("border_color", "0xFFDDDDDD"))); + place(s, QStringLiteral("0,0"), screen, w); + } else { + continue; + } + placed.append({z, w}); + } + + if (!background) { + QVariantMap w = wallpaperOnly({}); + placed.append({-1, w}); + } + // face-unlock's line, as the menu puts it in (fu_hyprlock_text_on), + // for those who have not picked it yet. + if (!ourLine) { + QVariantMap w{{QStringLiteral("type"), QStringLiteral("label")}, + {QStringLiteral("text"), i18n("Looking for your face…").toHtmlEscaped()}, + {QStringLiteral("size"), 20.0}, + {QStringLiteral("color"), QColor(255, 255, 255, 242)}, + {QStringLiteral("align"), QStringLiteral("center")}, + {QStringLiteral("shadow"), true}, + {QStringLiteral("shadowSize"), 3.0}, + {QStringLiteral("shadowColor"), QColor(Qt::black)}, + {QStringLiteral("x"), 0.0}, + {QStringLiteral("y"), -48.0}, + {QStringLiteral("halign"), QStringLiteral("center")}, + {QStringLiteral("valign"), QStringLiteral("top")}, + {QStringLiteral("rotate"), 0.0}}; + font(QStringLiteral("Sans"), w); + placed.append({10, w}); + } + + std::stable_sort(placed.begin(), placed.end(), [](const auto &a, const auto &b) { + return a.first < b.first; + }); + QVariantList widgets; + for (const auto &p : std::as_const(placed)) { + widgets.append(p.second); + } + return widgets; +} + +QVariantList LockPreview::swaylock(const QString &configPath, const QUrl &wallpaper) +{ + // One option per line, as on the command line without the dashes. + QHash o; + for (const QString &raw : readFile(configPath).split(u'\n')) { + const QString line = raw.trimmed(); + if (line.isEmpty() || line.startsWith(u'#')) { + continue; + } + o.insert(line.section(u'=', 0, 0).trimmed(), line.contains(u'=') ? line.section(u'=', 1).trimmed() : QString()); + } + + // An image may name its output first: [[]:]. + QString image = o.value(QStringLiteral("image")); + if (image.contains(u':') && !image.startsWith(u'/') && !image.startsWith(u'~')) { + image = image.section(u':', 1); + } + QVariantMap bg = wallpaperOnly(o.contains(QStringLiteral("screenshots")) ? wallpaper + : image.isEmpty() ? QUrl() + : QUrl::fromLocalFile(expandHome(image))); + bg.insert(QStringLiteral("color"), hexColor(o.value(QStringLiteral("color")), Qt::white)); + bg.insert(QStringLiteral("fill"), o.value(QStringLiteral("scaling"), QStringLiteral("fill"))); + // swaylock-effects: effect-blur=x. + const QString blur = o.value(QStringLiteral("effect-blur")); + if (!blur.isEmpty()) { + bg.insert(QStringLiteral("blur"), std::min(1.0, blur.section(u'x', 0, 0).toDouble() * blur.section(u'x', 1, 1).toDouble() / 24.0)); + } + QVariantList widgets{bg}; + + // The ring shows only while typing, unless it is asked to stay. + const bool clock = o.contains(QStringLiteral("clock")); + if (o.contains(QStringLiteral("indicator")) || o.contains(QStringLiteral("indicator-idle-visible")) || clock) { + const QDateTime now = QDateTime::currentDateTime(); + widgets.append(QVariantMap{ + {QStringLiteral("type"), QStringLiteral("ring")}, + {QStringLiteral("radius"), o.value(QStringLiteral("indicator-radius"), QStringLiteral("50")).toDouble()}, + {QStringLiteral("thickness"), o.value(QStringLiteral("indicator-thickness"), QStringLiteral("10")).toDouble()}, + {QStringLiteral("inside"), hexColor(o.value(QStringLiteral("inside-color")), QColor(0, 0, 0, 0xc0))}, + {QStringLiteral("ring"), hexColor(o.value(QStringLiteral("ring-color")), QColor(0x33, 0x7d, 0x00))}, + {QStringLiteral("textColor"), hexColor(o.value(QStringLiteral("text-color")), QColor(0xe5, 0xa4, 0x45))}, + {QStringLiteral("text"), clock ? now.toString(QStringLiteral("HH:mm")) + u'\n' + now.toString(QStringLiteral("yyyy-MM-dd")) : QString()}, + }); + } + return widgets; +} + +QVariantList LockPreview::widgets(const QString &locker, const QSizeF &screen, const QString &output, const QUrl &wallpaper) +{ + if (locker == u"hyprlock") { + const QString path = findConfig(QStringLiteral("hypr/hyprlock.conf")); + if (!path.isEmpty()) { + return hyprlock(path, screen, output, wallpaper); + } + } else if (locker == u"swaylock") { + QString path = findConfig(QStringLiteral("swaylock/config")); + if (path.isEmpty() && QFileInfo::exists(QDir::homePath() + QStringLiteral("/.swaylock/config"))) { + path = QDir::homePath() + QStringLiteral("/.swaylock/config"); + } + return swaylock(path, wallpaper); + } + // Something this does not know how to draw: the desktop's picture. + return {wallpaperOnly(wallpaper)}; +} diff --git a/src/agent/lockpreview.h b/src/agent/lockpreview.h new file mode 100644 index 0000000..6fe457e --- /dev/null +++ b/src/agent/lockpreview.h @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// +// The user's own lock screen, rebuilt for its picture in the window that asks +// which lock screen to use (LockChoice.qml): what hyprlock draws from its +// config, with face-unlock's line at the top, or swaylock's background and +// ring. A screenshot would take locking the screen. LockPreview.qml draws +// what this returns. +// +// hyprlock places a widget from the corner or middle its halign and valign +// name, with y upwards, and takes font sizes as points. Colours and sizes +// here are hyprlang's: rgba(r, g, b, a), rgba(RRGGBBAA), 0xAARRGGBB, and +// "x, y" in pixels or percent of the screen. + +#pragma once + +#include +#include +#include +#include +#include + +namespace LockPreview +{ +// The lock screen the user starts: the one their idle daemon or key runs, +// else one that is installed. hyprlock, swaylock, another name, or empty. +QString locker(); + +// That lock screen's widgets, bottom first, as maps for LockPreview.qml. +// output names the screen, for widgets meant for one monitor; wallpaper is +// the desktop's picture, for a background that is a screenshot. +QVariantList widgets(const QString &locker, const QSizeF &screen, const QString &output, const QUrl &wallpaper); + +// The pieces, apart for the tests. +QVariantList hyprlock(const QString &configPath, const QSizeF &screen, const QString &output, const QUrl &wallpaper); +QVariantList swaylock(const QString &configPath, const QUrl &wallpaper); +QColor color(const QString &value); +} diff --git a/src/agent/locktext.cpp b/src/agent/locktext.cpp new file mode 100644 index 0000000..8f83e41 --- /dev/null +++ b/src/agent/locktext.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "locktext.h" + +#include "bubblecontroller.h" +#include "lockers.h" +#include "userconfig.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include + +LockText::LockText(BubbleController *bubble, UserConfig *config, QObject *parent) + : QObject(parent) + , m_bubble(bubble) + , m_config(config) +{ + connect(m_bubble, &BubbleController::phaseChanged, this, &LockText::update); + connect(m_bubble, &BubbleController::messageChanged, this, &LockText::update); + connect(m_config, &UserConfig::changed, this, &LockText::update); + // Nothing left over from an agent before this one. + write({}); +} + +LockText::~LockText() +{ + QFile::remove(path()); +} + +QString LockText::path() +{ + return QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation) + QStringLiteral("/face-unlock/lock-text"); +} + +QString LockText::text(const QString &phase, const QString &message) +{ + if (phase == u"scanning") { + return message.isEmpty() ? i18n("Looking for your face…") : message; + } + if (phase == u"success") { + return i18n("Face recognized"); + } + // failure and lockout say why; hidden says nothing. + return phase == u"hidden" ? QString() : message; +} + +void LockText::update() +{ + const bool on = m_config->lockScreenStyle() == u"yours"; + const QString now = on ? text(m_bubble->phase(), m_bubble->message()) : QString(); + if (now != m_text) { + write(now); + // Left alone by those who did not pick it: their hyprlock has no + // label to read it. + m_tries = 0; + refresh(); + } +} + +void LockText::refresh() +{ + // A hyprlock that is only starting reads the file once it is up, but + // may have read it just before this changed: asked again then. + if (Lockers::signal(SIGUSR2, "hyprlock") > 0 && ++m_tries < 20) { + QTimer::singleShot(250, this, &LockText::refresh); + } +} + +void LockText::write(const QString &text) +{ + m_text = text; + QDir().mkpath(QFileInfo(path()).absolutePath()); + QSaveFile file(path()); + // hyprlock reads labels as Pango markup. + if (file.open(QIODevice::WriteOnly)) { + file.write(text.toHtmlEscaped().toUtf8()); + file.commit(); + } +} diff --git a/src/agent/locktext.h b/src/agent/locktext.h new file mode 100644 index 0000000..a5004de --- /dev/null +++ b/src/agent/locktext.h @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// +// The bubble as a line of text, for a lock screen that covers it: hyprlock. +// When the user keeps their own lock screen (LockScreenStyle=yours), the +// menu puts a label into hyprlock's config that shows the file at path() +// (see src/lib/system.sh). This writes what the bubble shows into it, and +// SIGUSR2 makes hyprlock read it again. + +#pragma once + +#include +#include + +class BubbleController; +class UserConfig; + +class LockText : public QObject +{ + Q_OBJECT +public: + LockText(BubbleController *bubble, UserConfig *config, QObject *parent = nullptr); + ~LockText() override; + + static QString path(); + // The line for a phase and message of the bubble. + static QString text(const QString &phase, const QString &message); + +private: + void update(); + void refresh(); + void write(const QString &text); + + BubbleController *m_bubble; + UserConfig *m_config; + QString m_text; + int m_tries = 0; +}; diff --git a/src/agent/main.cpp b/src/agent/main.cpp index 46d3440..3bc7057 100644 --- a/src/agent/main.cpp +++ b/src/agent/main.cpp @@ -10,6 +10,9 @@ // Niri), else through logind with the desktop's // --demo play the bubble's animations once, for trying out a // style (--bubble-style minimal) and for screenshots +// --choose-lock-screen +// open the window that asks which lock screen to use +// where it is a program of its own, and print the answer #include "agentsocket.h" #include "bubblecontroller.h" @@ -17,9 +20,12 @@ #include "bubblewindow.h" #include "enrollcontroller.h" #include "lockcontroller.h" +#include "lockpreview.h" #include "lockscreencontroller.h" +#include "locktext.h" #include "sessionlock.h" #include "userconfig.h" +#include "wallpaper.h" #include "wayland.h" #include "buildconfig.h" @@ -34,8 +40,11 @@ #include #include #include +#include #include +#include +#include #include #include #include @@ -66,6 +75,56 @@ int runEnroll(QGuiApplication &app, const QString &name) return controller.state() == u"done" ? 0 : code; } +// The window of --choose-lock-screen. Prints "own" or "yours" for the menu, +// which carries it out. +int runChooseLockScreen(QGuiApplication &app) +{ + app.setQuitOnLastWindowClosed(true); + UserConfig config; + + // Both choices show this screen as it would look: face-unlock's lock + // screen as it is, with a scan going on, and the user's own rebuilt. + const QScreen *screen = QGuiApplication::primaryScreen(); + const QString output = screen ? screen->name() : QString(); + const QSize size = screen ? screen->size() : QSize(1920, 1080); + const QUrl desktop = Wallpaper::pick(Wallpaper::forLock({}), output); + const QUrl ownWallpaper = config.lockWallpaper().isEmpty() ? desktop : Wallpaper::pick(Wallpaper::forLock(config.lockWallpaper()), output); + const QString locker = LockPreview::locker(); + + LockScreenController lock; + lock.setBlur(config.lockBlur()); + BubbleController bubble(&config); + bubble.scanStarted(); + // A scan that goes on: the bubble closes by itself after a while. + QTimer rescan; + QObject::connect(&rescan, &QTimer::timeout, &bubble, &BubbleController::scanStarted); + rescan.start(20000); + + QQmlApplicationEngine engine; + KLocalization::setupLocalizedContext(&engine); + engine.setInitialProperties({{QStringLiteral("current"), config.lockScreenStyle()}, + {QStringLiteral("locker"), locker}, + {QStringLiteral("widgets"), LockPreview::widgets(locker, size, output, desktop)}, + {QStringLiteral("screenSize"), size}, + {QStringLiteral("ownWallpaper"), ownWallpaper}, + {QStringLiteral("lock"), QVariant::fromValue(&lock)}, + {QStringLiteral("bubble"), QVariant::fromValue(&bubble)}}); + engine.loadFromModule(QStringLiteral("FaceUnlock"), QStringLiteral("LockChoice")); + auto *window = engine.rootObjects().isEmpty() ? nullptr : qobject_cast(engine.rootObjects().constFirst()); + if (!window) { + return 2; + } + // Shown only now, at the size its texts need (see LockChoice.qml). + window->show(); + app.exec(); + const QString answer = window->property("answer").toString(); + if (answer.isEmpty()) { + return 1; + } + std::printf("%s\n", qPrintable(answer)); + return 0; +} + // Where --lock tells the command that ran it that the screen is locked, when // it forked to stay behind as the lock screen. -1: it did not. int readyFd = -1; @@ -191,9 +250,14 @@ int main(int argc, char **argv) const QCommandLineOption demoOpt(QStringLiteral("demo"), i18n("Play the bubble's animations once.")); // Not "--style": QGuiApplication takes that one for itself. const QCommandLineOption styleOpt(QStringLiteral("bubble-style"), i18n("Bubble style for the demo: full or minimal."), QStringLiteral("style")); - parser.addOptions({enrollOpt, nameOpt, lockOpt, demoOpt, styleOpt}); + const QCommandLineOption chooseOpt(QStringLiteral("choose-lock-screen"), i18n("Ask which lock screen to use, and print the answer.")); + parser.addOptions({enrollOpt, nameOpt, lockOpt, demoOpt, styleOpt, chooseOpt}); parser.process(app); + if (parser.isSet(chooseOpt)) { + return runChooseLockScreen(app); + } + if (parser.isSet(enrollOpt)) { QString name = parser.value(nameOpt); if (name.isEmpty()) { @@ -264,6 +328,11 @@ int main(int argc, char **argv) QObject::connect(lock, &SessionLock::confirmed, &socket, &AgentSocket::confirmLock); } LockController lock(&bubble, &config, sessionLock.get(), &screen); + // hyprlock covers the bubble: it can show it as a line of text instead. + std::unique_ptr text; + if (sessionLock && !lockNow) { + text = std::make_unique(&bubble, &config); + } if (lockNow) { // No agent was running, so this one is only here for the lock. It diff --git a/src/agent/qml/LockChoice.qml b/src/agent/qml/LockChoice.qml new file mode 100644 index 0000000..fa35424 --- /dev/null +++ b/src/agent/qml/LockChoice.qml @@ -0,0 +1,264 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// +// Where the lock screen is a program of the user's (Hyprland, Niri): lock +// with face-unlock's own, with the bubble, or keep that program, which then +// shows a line of text (hyprlock). Each choice shows the user's screen as it +// would look: face-unlock's lock screen live, and their own rebuilt from its +// config (see LockPreview). The pick goes back to the menu, which carries +// it out. + +import QtQuick +import QtQuick.Effects +import QtQuick.Window +import FaceUnlock + +Window { + id: window + + // "own", "yours", or empty when there is none yet. + required property string current + // The user's lock screen (see LockPreview::locker) and what it shows. + required property string locker + required property var widgets + // The screen the pictures show, and the parts of face-unlock's own. + required property size screenSize + required property url ownWallpaper + required property var lock + required property var bubble + // What was picked, empty when the window was closed. + property string answer: "" + property string selected: current + + function pick() { + if (selected.length > 0) { + answer = selected + close() + } + } + + // One fixed size, so tiling compositors float it (see Enroll). The + // height follows the texts, whose length depends on the language. It + // is taken from them rather than from the Row and Column, which only lay + // out once the window shows, and the agent shows it after that. + readonly property int fitHeight: Math.ceil(36 + heading.height + 10 + intro.height + 28 + Math.max(own.needed, yours.needed) + 94) + width: 800 + height: fitHeight + minimumWidth: 800 + maximumWidth: 800 + minimumHeight: fitHeight + maximumHeight: fitHeight + visible: false + color: Theme.panel + title: i18n("Choose your lock screen") + + Component { + id: ownScene + LockScreen { + lock: window.lock + bubble: window.bubble + primary: true + wallpaper: window.ownWallpaper + interactive: false + } + } + Component { + id: yoursScene + LockPreview { + widgets: window.widgets + } + } + + // One of the two: the screen, a radio button with the name, what it means. + component Choice: Rectangle { + id: card + + required property string style + required property Component scene + required property string name + required property string about + readonly property bool chosen: window.selected === style + // The height its text needs; both take the larger one. + readonly property real needed: body.y + body.height + 20 + + width: 364 + radius: 18 + color: area.containsMouse && !chosen ? Qt.lighter(Theme.surface, 1.25) : Theme.surface + border.width: 2 + border.color: chosen ? Theme.accent : "transparent" + Behavior on border.color { ColorAnimation { duration: 150 } } + Behavior on color { ColorAnimation { duration: 120 } } + + // The whole screen, made small: filling the picture, cut at the + // sides or at the top and bottom. + Item { + id: picture + x: 14 + y: 14 + width: parent.width - 28 + height: Math.round(width * 10 / 16) + clip: true + layer.enabled: true + layer.effect: MultiEffect { + maskEnabled: true + maskSource: mask + } + + Loader { + sourceComponent: card.scene + width: window.screenSize.width + height: window.screenSize.height + transformOrigin: Item.TopLeft + scale: Math.max(picture.width / width, picture.height / height) + x: (picture.width - width * scale) / 2 + y: (picture.height - height * scale) / 2 + } + } + Rectangle { + id: mask + width: picture.width + height: picture.height + radius: 10 + visible: false + layer.enabled: true + } + + // A radio button: a ring, filled when picked. + Rectangle { + id: radio + x: 18 + y: title.y + 3 + width: 18 + height: 18 + radius: 9 + color: "transparent" + border.width: 2 + border.color: card.chosen ? Theme.accent : Theme.textSecondary + Rectangle { + anchors.centerIn: parent + width: 8 + height: 8 + radius: 4 + color: Theme.accent + visible: card.chosen + } + } + Text { + id: title + anchors.top: picture.bottom + anchors.topMargin: 16 + x: radio.x + radio.width + 10 + width: parent.width - x - 18 + wrapMode: Text.WordWrap + color: Theme.textPrimary + font.pixelSize: 16 + font.weight: Font.DemiBold + text: card.name + } + Text { + id: body + anchors.top: title.bottom + anchors.topMargin: 8 + x: 18 + width: parent.width - 36 + wrapMode: Text.WordWrap + color: Theme.textDetail + font.pixelSize: 13 + lineHeight: 1.15 + text: card.about + } + + MouseArea { + id: area + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: window.selected = card.style + onDoubleClicked: { + window.selected = card.style + window.pick() + } + } + } + + Column { + id: head + anchors.top: parent.top + anchors.topMargin: 36 + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width - 96 + spacing: 10 + + Text { + id: heading + width: parent.width + horizontalAlignment: Text.AlignHCenter + color: Theme.textPrimary + font.pixelSize: 26 + font.weight: Font.Bold + text: i18n("Your lock screen") + } + Text { + id: intro + width: parent.width + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + color: Theme.textSecondary + font.pixelSize: 13 + font.weight: Font.Medium + lineHeight: 1.15 + text: i18n("Your desktop leaves the lock screen to a program of your choice. Pick how face unlock shows up there. You can change it later under Settings.") + } + } + + Row { + id: cards + anchors.top: head.bottom + anchors.topMargin: 28 + anchors.horizontalCenter: parent.horizontalCenter + spacing: 24 + focus: true + + Keys.onLeftPressed: window.selected = "own" + Keys.onRightPressed: window.selected = "yours" + Keys.onReturnPressed: window.pick() + Keys.onEnterPressed: window.pick() + Keys.onEscapePressed: window.close() + + Choice { + id: own + height: Math.max(own.needed, yours.needed) + style: "own" + scene: ownScene + name: i18n("face-unlock's lock screen") + about: i18n("The bubble at the top, the time and your wallpaper. Your shortcut and idle lock then run face-unlock lock.") + } + Choice { + id: yours + height: own.height + style: "yours" + scene: yoursScene + name: i18n("Keep your lock screen") + about: window.locker === "hyprlock" + ? i18n("It stays as it is. hyprlock shows a line of text at the top instead of the bubble. Enter on the empty password field scans.") + : i18n("It stays as it is, without the bubble. Enter on the empty password field scans.") + } + } + + Row { + anchors.bottom: parent.bottom + anchors.bottomMargin: 32 + anchors.horizontalCenter: parent.horizontalCenter + spacing: 12 + + PillButton { + primary: false + text: i18n("Cancel") + onClicked: window.close() + } + PillButton { + enabled: window.selected.length > 0 + text: i18n("Continue") + onClicked: window.pick() + } + } +} diff --git a/src/agent/qml/LockPreview.qml b/src/agent/qml/LockPreview.qml new file mode 100644 index 0000000..31424ae --- /dev/null +++ b/src/agent/qml/LockPreview.qml @@ -0,0 +1,249 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// +// The user's own lock screen, drawn from what LockPreview (C++) read out of +// its config, at the size of the screen. Whoever shows it scales it down. +// Placement as in hyprlock: from the side or middle halign and valign name, +// x to the right and y upwards. One Repeater per kind of widget, stacked in +// the order hyprlock draws them. + +import QtQuick +import QtQuick.Effects + +Item { + id: root + + required property var widgets + + readonly property var numbered: widgets.map((w, i) => Object.assign({order: i}, w)) + function only(type) { + return numbered.filter(w => w.type === type) + } + function alignX(halign, size, offset) { + return halign === "center" ? (width - size) / 2 + offset + : halign === "right" ? width - size + offset + : offset + } + function alignY(valign, size, offset) { + const up = valign === "center" ? (height - size) / 2 + offset + : valign === "top" ? height - size + offset + : offset + return height - up - size + } + + clip: true + + Repeater { + model: root.only("background") + + Item { + id: back + required property var modelData + readonly property var w: modelData + z: w.order + width: root.width + height: root.height + + Rectangle { + anchors.fill: parent + color: back.w.color + } + Image { + // Past the edges when blurred: the blur would pull in the + // nothing beyond them and darken the rim. + anchors.fill: parent + anchors.margins: back.w.blur > 0 ? -Math.round(64 * back.w.blur) : 0 + visible: back.w.fill !== "solid_color" + source: back.w.source + asynchronous: true + sourceSize: Qt.size(root.width, root.height) + fillMode: back.w.fill === "fit" ? Image.PreserveAspectFit + : back.w.fill === "stretch" ? Image.Stretch + : back.w.fill === "center" ? Image.Pad + : back.w.fill === "tile" ? Image.Tile + : Image.PreserveAspectCrop + layer.enabled: back.w.blur > 0 + layer.effect: MultiEffect { + blurEnabled: true + blur: 1 + blurMax: Math.round(64 * back.w.blur) + } + } + Rectangle { + anchors.fill: parent + color: "black" + opacity: back.w.dim + } + } + } + + Repeater { + model: root.only("label") + + Text { + id: line + required property var modelData + readonly property var w: modelData + z: w.order + x: root.alignX(w.halign, width, w.x) + y: root.alignY(w.valign, height, w.y) + rotation: w.rotate + text: w.text + textFormat: Text.StyledText + color: w.color + font.family: w.family + font.weight: w.weight + font.italic: w.italic + font.pointSize: w.size + horizontalAlignment: w.align === "left" ? Text.AlignLeft : w.align === "right" ? Text.AlignRight : Text.AlignHCenter + layer.enabled: w.shadow + layer.effect: MultiEffect { + shadowEnabled: true + shadowColor: line.w.shadowColor + shadowBlur: Math.min(1, line.w.shadowSize / 8) + shadowHorizontalOffset: 0 + shadowVerticalOffset: 0 + } + } + } + + Repeater { + model: root.only("input") + + // The outline is the outer colour around the inner one. A gradient + // outline needs an opaque inside, which leaves it showing only at + // the edge. + Rectangle { + id: field + required property var modelData + readonly property var w: modelData + readonly property var outer: w.outer.colors + readonly property bool blend: outer.length > 1 && w.inner.a >= 0.99 + z: w.order + x: root.alignX(w.halign, width, w.x) + y: root.alignY(w.valign, height, w.y) + rotation: w.rotate + width: w.width + height: w.height + radius: w.rounding < 0 ? height / 2 : Math.min(w.rounding, height / 2) + color: blend ? "transparent" : w.inner + border.width: blend ? 0 : w.thickness + border.color: outer.length > 0 ? outer[0] : "transparent" + gradient: blend ? outline : null + + Gradient { + id: outline + orientation: Math.abs(Math.cos(field.w.outer.angle * Math.PI / 180)) >= Math.abs(Math.sin(field.w.outer.angle * Math.PI / 180)) + ? Gradient.Horizontal : Gradient.Vertical + GradientStop { position: 0; color: field.outer.length > 0 ? field.outer[0] : "transparent" } + GradientStop { position: 1; color: field.outer.length > 0 ? field.outer[field.outer.length - 1] : "transparent" } + } + Rectangle { + visible: field.blend + anchors.fill: parent + anchors.margins: field.w.thickness + radius: Math.max(0, field.radius - field.w.thickness) + color: field.w.inner + } + Text { + anchors.centerIn: parent + text: field.w.placeholder + textFormat: Text.StyledText + color: field.w.fontColor + font.family: field.w.family + font.weight: field.w.weight + font.italic: field.w.italic + font.pointSize: Math.max(1, field.height / 4) + } + } + } + + Repeater { + model: root.only("shape") + + Rectangle { + required property var modelData + readonly property var w: modelData + z: w.order + x: root.alignX(w.halign, width, w.x) + y: root.alignY(w.valign, height, w.y) + rotation: w.rotate + width: w.width + height: w.height + radius: w.rounding < 0 ? Math.min(width, height) / 2 : Math.min(w.rounding, Math.min(width, height) / 2) + color: w.color + border.width: w.borderSize + border.color: w.border.colors.length > 0 ? w.border.colors[0] : "transparent" + } + } + + Repeater { + model: root.only("image") + + Item { + id: frame + required property var modelData + readonly property var w: modelData + readonly property real round: w.rounding < 0 ? width / 2 : Math.min(w.rounding, width / 2) + z: w.order + x: root.alignX(w.halign, width, w.x) + y: root.alignY(w.valign, height, w.y) + rotation: w.rotate + width: w.size + 2 * w.borderSize + height: width + + Rectangle { + anchors.fill: parent + radius: frame.round + color: frame.w.border.colors.length > 0 ? frame.w.border.colors[0] : "transparent" + } + Image { + id: photo + anchors.fill: parent + anchors.margins: frame.w.borderSize + source: frame.w.source + fillMode: Image.PreserveAspectCrop + asynchronous: true + layer.enabled: true + layer.effect: MultiEffect { + maskEnabled: true + maskSource: photoMask + } + } + Rectangle { + id: photoMask + width: photo.width + height: photo.height + radius: Math.max(0, frame.round - frame.w.borderSize) + visible: false + layer.enabled: true + } + } + } + + Repeater { + model: root.only("ring") + + // swaylock's indicator, in the middle. + Rectangle { + id: circle + required property var modelData + readonly property var w: modelData + z: w.order + anchors.centerIn: parent + width: 2 * w.radius + 2 * w.thickness + height: width + radius: width / 2 + color: w.inside + border.width: w.thickness + border.color: w.ring + + Text { + anchors.centerIn: parent + horizontalAlignment: Text.AlignHCenter + text: circle.w.text + color: circle.w.textColor + font.pixelSize: circle.w.radius / 3 + } + } + } +} diff --git a/src/agent/qml/LockScreen.qml b/src/agent/qml/LockScreen.qml index 19a0c86..96709d2 100644 --- a/src/agent/qml/LockScreen.qml +++ b/src/agent/qml/LockScreen.qml @@ -15,6 +15,9 @@ Item { required property var bubble required property bool primary required property url wallpaper + // Off for the picture in the window that asks which lock screen to use: + // nothing to type into, no keys taken. + property bool interactive: true property date now: new Date() Timer { @@ -71,6 +74,7 @@ Item { // keys into the password. MouseArea { anchors.fill: parent + enabled: root.interactive hoverEnabled: true acceptedButtons: Qt.AllButtons onPositionChanged: root.lock.activity() @@ -150,7 +154,8 @@ Item { selectionColor: Theme.accent font.pixelSize: 15 clip: true - focus: true + focus: root.interactive + enabled: root.interactive // The dots show how far it is; a blinking bar in the middle // of the empty field only cuts the word in it in two. cursorDelegate: Item {} @@ -162,7 +167,11 @@ Item { root.lock.activity() event.accepted = false } - Component.onCompleted: forceActiveFocus() + Component.onCompleted: { + if (root.interactive) { + forceActiveFocus() + } + } } Text { anchors.centerIn: parent diff --git a/src/agent/userconfig.cpp b/src/agent/userconfig.cpp index 5c3dc96..e575407 100644 --- a/src/agent/userconfig.cpp +++ b/src/agent/userconfig.cpp @@ -32,6 +32,7 @@ void UserConfig::load() m_enabled = kv.boolean(QStringLiteral("Enabled"), false); m_lockWallpaper = kv.value(QStringLiteral("LockWallpaper")); m_lockBlur = kv.boolean(QStringLiteral("LockBlur"), false); + m_lockScreenStyle = kv.value(QStringLiteral("LockScreenStyle")); m_lockScreen = kv.boolean(QStringLiteral("LockScreen"), true); m_scanOnWake = kv.boolean(QStringLiteral("ScanOnWake"), true); m_scanOnLock = kv.boolean(QStringLiteral("ScanOnLock"), false); diff --git a/src/agent/userconfig.h b/src/agent/userconfig.h index eb475b9..cb5b270 100644 --- a/src/agent/userconfig.h +++ b/src/agent/userconfig.h @@ -29,6 +29,14 @@ public: { return m_lockWallpaper; } + // Where the lock screen is a program of the user's (Hyprland, Niri): + // "own" to lock with face-unlock's, "yours" to keep that program, which + // then shows the bubble as a line of text (see LockText). Empty until + // the user picked one. + QString lockScreenStyle() const + { + return m_lockScreenStyle; + } bool lockBlur() const { return m_lockBlur; @@ -90,6 +98,7 @@ private: QFileSystemWatcher m_watcher; bool m_enabled = false; QString m_lockWallpaper; + QString m_lockScreenStyle; bool m_lockBlur = false; bool m_lockScreen = true; bool m_scanOnWake = true; diff --git a/src/face-unlock b/src/face-unlock index 704b89d..ce1c5e6 100644 --- a/src/face-unlock +++ b/src/face-unlock @@ -125,7 +125,13 @@ fu_do_enable() { esac ;; esac - if fu_pam_lockers_here && fu_pam_lockers_enabled; then + # Where the lock screen is a program of its own: face-unlock's, with the + # bubble, or that program with a line of text. Asked once. + if fu_own_lock_here && [[ -n ${WAYLAND_DISPLAY:-} && -z $(fu_config_get LockScreenStyle) ]]; then + fu_say " $(fu_msg "Pick your lock screen in the window.")" + fu_lock_choose || fu_note "$(fu_msg "No lock screen picked. You can do it later under Settings.")" + fi + if fu_pam_lockers_here && fu_pam_lockers_enabled && [[ $(fu_config_get LockScreenStyle) != own ]]; then fu_note "$(fu_msg "The lock screen (%s) takes your face too. If it does not scan when you come back, press Enter on the empty password field." "$(fu_pam_lockers_list)")" fi diff --git a/src/lib/common.sh b/src/lib/common.sh index ecce491..5a7b5aa 100644 --- a/src/lib/common.sh +++ b/src/lib/common.sh @@ -156,6 +156,8 @@ fu_head() { printf '\n%s%s%s\n\n' "$FU_C_BOLD$FU_C_BLUE" "$*" "$FU_C_RESET"; } fu_ok() { FU_UI_NOTICES+=("$FU_C_GREEN✔$FU_C_RESET $*"); printf '%s✔%s %s\n' "$FU_C_GREEN" "$FU_C_RESET" "$*"; } fu_bad() { FU_UI_NOTICES+=("$FU_C_RED✘$FU_C_RESET $*"); printf '%s✘%s %s\n' "$FU_C_RED" "$FU_C_RESET" "$*" >&2; } fu_note() { FU_UI_NOTICES+=("$FU_C_DIM•$FU_C_RESET $*"); printf '%s•%s %s\n' "$FU_C_DIM" "$FU_C_RESET" "$*"; } +# A line of config to copy, under a note. +fu_code() { FU_UI_NOTICES+=(" $*"); printf ' %s\n' "$*"; } fu_have() { command -v "$1" > /dev/null 2>&1; } diff --git a/src/lib/menu.sh b/src/lib/menu.sh index 16d3b8d..fcc034a 100644 --- a/src/lib/menu.sh +++ b/src/lib/menu.sh @@ -200,6 +200,8 @@ fu_value_label() { AnimationSpeed:slow) fu_msg "slow" ;; ScanSeconds:*) fu_msg "%s seconds" "$2" ;; Camera:auto) fu_msg "automatic" ;; + LockScreenStyle:own) fu_msg "face-unlock's" ;; + LockScreenStyle:*) fu_msg "yours" ;; *) printf '%s' "$2" ;; esac } @@ -277,10 +279,11 @@ fu_ui_status() { # scope user (this user's file), sys (the system file, through sudo), # pam (the service of that name, through sudo), or group for a # heading, with only the label after it -# type bool, choice (steps through the choices), camera, or path (typed -# in; empty for the desktop's picture) -# needs a bool setting this one does nothing without; it is dimmed while -# that is off +# type bool, choice (steps through the choices), camera, path (typed +# in; empty for the desktop's picture), or lockstyle (the window +# with the two lock screens, see fu_lock_choose) +# needs a bool setting this one does nothing without, or Key=value; it is +# dimmed while that is not so # only lockers: only where the lock screen is a program of its own with a # PAM file (Hyprland, Niri), see fu_pam_lockers_here; ownlock: only # where face-unlock's own lock screen can be used @@ -289,8 +292,9 @@ FU_SETTINGS=( "user|LockScreen|bool|yes|Unlock with your face" "user|ScanOnWake|bool|yes|Scan when you come back||LockScreen" "user|ScanOnLock|bool|no|Scan right after locking||LockScreen" - "user|LockWallpaper|path||Wallpaper|||ownlock" - "user|LockBlur|bool|no|Blur the wallpaper|||ownlock" + "user|LockScreenStyle|lockstyle|yours|Which lock screen|||ownlock" + "user|LockWallpaper|path||Wallpaper||LockScreenStyle=own|ownlock" + "user|LockBlur|bool|no|Blur the wallpaper||LockScreenStyle=own|ownlock" "group|Password prompts" "pam|sudo|bool|no|sudo in a terminal" "pam|polkit-1|bool|no|Admin prompts" @@ -328,6 +332,7 @@ fu_setting_help() { ScanOnWake:*) fu_msg "Scans when you press a key or move the mouse on the lock screen, and when the computer wakes up." ;; ScanOnLock:*) fu_msg "Scans as soon as the screen locks. Off by default: if you lock it yourself, it would unlock again right away." ;; sudo:*) fu_msg "sudo takes your face instead of the password. No match: you type the password as usual." ;; + LockScreenStyle:*) fu_msg "face-unlock's lock screen shows the bubble, and you lock with \`face-unlock lock\`. Or keep yours: hyprlock then shows a line of text at the top. Enter opens the choice." ;; LockWallpaper:*) fu_msg "The picture behind face-unlock's own lock screen (\`face-unlock lock\`). Empty: the one on your desktop. Or a file, a folder to take one from at random, or \`none\`. Enter to type it." ;; LockBlur:*) fu_msg "Blurs the picture behind face-unlock's own lock screen." ;; lockscreens:*) fu_msg "The lock screen takes your face in its password check. Press Enter on the empty field to scan. Found here: %s." "$(fu_pam_lockers_list)" ;; @@ -483,6 +488,18 @@ _fu_setting_change() { bool) if fu_is_true "$current"; then next=no; else next=yes; fi ;; choice) next="$(_fu_next_choice "$current" "$options" "$step")" ;; camera) next="$(_fu_next_camera "$current" "$step")" ;; + lockstyle) + # The window with the pictures where there is a screen for it, + # else the other one of the two. + if [[ -n ${WAYLAND_DISPLAY:-} ]]; then + fu_ui_cooked fu_lock_choose + elif [[ $current == own ]]; then + fu_lock_style_set yours + else + fu_lock_style_set own + fi + return 0 + ;; path) printf '\n %s ' "$(fu_msg "Picture or folder:")" fu_ui_read_line "$current" || return 0 @@ -612,7 +629,11 @@ fu_ui_settings() { before="${FU_C_BLUE}◂${FU_C_RESET} " after=" ${FU_C_BLUE}▸${FU_C_RESET}" fi dim='' - [[ -n ${needs[i]} ]] && ! fu_is_true "${current[${needs[i]}]}" && dim="$FU_C_DIM" + case "${needs[i]}" in + '') ;; + *=*) [[ ${current[${needs[i]%%=*}]} == "${needs[i]#*=}" ]] || dim="$FU_C_DIM" ;; + *) fu_is_true "${current[${needs[i]}]}" || dim="$FU_C_DIM" ;; + esac pad=$(( width + 2 - widths[i] )) if (( i == selected )); then marker="${FU_C_BLUE}▸${FU_C_RESET} "; else marker=' '; fi printf -v row ' %s%s%s%s%*s%s%s%s' "$marker" "$dim" "${labels[i]}" "$FU_C_RESET" "$pad" '' "$before" "$dim$shown$FU_C_RESET" "$after" diff --git a/src/lib/system.sh b/src/lib/system.sh index b352fdf..0d6e5aa 100644 --- a/src/lib/system.sh +++ b/src/lib/system.sh @@ -193,6 +193,129 @@ fu_gnome_extension_disable() { gsettings set org.gnome.shell enabled-extensions "$list" > /dev/null 2>&1 || true } +# --------------------------------------------------------------------------- +# The lock screen where it is a program of its own (Hyprland, Niri) +# --------------------------------------------------------------------------- +# Either face-unlock's (`face-unlock lock`, with the bubble), or the user's +# own program. hyprlock then shows what the bubble would as a line of text: a +# label in its config reads a file the agent writes (see +# src/agent/locktext.h). Asked once in a window, and under Settings. + +FU_HYPRLOCK_SNIPPET="$FU_XDG_CONFIG/$FU_NAME/hyprlock.conf" +FU_HYPRLOCK_MARK="# $FU_NAME: what face unlock is doing, at the top" + +fu_own_lock_here() { + [[ $FU_DESKTOP != plasma && $FU_DESKTOP != gnome ]] +} + +# fu_hyprlock_text_on +# 0 done, 1 could not write, 2 no hyprlock, 3 hyprlock has no config here. +fu_hyprlock_text_on() { + local conf="$FU_XDG_CONFIG/hypr/hyprlock.conf" + fu_have hyprlock || return 2 + [[ -f $conf ]] || return 3 + mkdir -p "${FU_HYPRLOCK_SNIPPET%/*}" || return 1 + cat > "$FU_HYPRLOCK_SNIPPET" <<- EOF || return 1 + # Written by $FU_NAME: what face unlock is doing, as a line at the top of + # hyprlock. Picking $FU_NAME's lock screen in its menu takes it out again. + label { + monitor = + text = cmd[update:0:1] cat "\$XDG_RUNTIME_DIR/$FU_NAME/lock-text" 2>/dev/null + color = rgba(255, 255, 255, 0.95) + font_size = 20 + shadow_passes = 2 + shadow_size = 3 + halign = center + valign = top + position = 0, -48 + zindex = 10 + } + EOF + grep -qxF "$FU_HYPRLOCK_MARK" "$conf" && return 0 + # With ~ where it can, like a hand-written config. hyprlock expands it. + local snippet="$FU_HYPRLOCK_SNIPPET" + # shellcheck disable=SC2088 # for hyprlock, not for the shell + [[ $snippet == "$HOME"/* ]] && snippet="~/${snippet#"$HOME"/}" + printf '\n%s\nsource = %s\n' "$FU_HYPRLOCK_MARK" "$snippet" >> "$conf" || return 1 +} + +# fu_hyprlock_text_off +# The mark, the source line under it, and the empty lines before it. Written +# back in place, so a hyprlock.conf that is a link to a dotfile stays one. +fu_hyprlock_text_off() { + local conf="$FU_XDG_CONFIG/hypr/hyprlock.conf" content + rm -f "$FU_HYPRLOCK_SNIPPET" + [[ -f $conf ]] && grep -qxF "$FU_HYPRLOCK_MARK" "$conf" || return 0 + content="$(awk -v mark="$FU_HYPRLOCK_MARK" ' + $0 == mark { held = ""; skip = 1; next } + skip && /^[[:space:]]*source[[:space:]]*=/ { skip = 0; next } + { skip = 0 } + /^[[:space:]]*$/ { held = held $0 "\n"; next } + { printf "%s", held; held = ""; print } + ' "$conf")" || return 1 + printf '%s\n' "$content" > "$conf" +} + +# fu_own_lock_hint +# Where face-unlock's lock screen has to be started from: the user's key and +# idle lock, which are theirs to change. +fu_own_lock_hint() { + # shellcheck disable=SC2088 # shown to the user, not a path to open + case "$FU_DESKTOP" in + hyprland) + if [[ -f $FU_XDG_CONFIG/hypr/hyprland.lua ]]; then + fu_note "$(fu_msg "To lock with it, add this to %s, and set %s in %s:" "~/.config/hypr/hyprland.lua" "lock_cmd = $FU_NAME lock" "hypridle.conf")" + fu_code "hl.bind(\"SUPER + L\", hl.dsp.exec_cmd(\"$FU_NAME lock\"))" + else + fu_note "$(fu_msg "To lock with it, add this to %s, and set %s in %s:" "~/.config/hypr/hyprland.conf" "lock_cmd = $FU_NAME lock" "hypridle.conf")" + fu_code "bind = SUPER, L, exec, $FU_NAME lock" + fi + ;; + niri) + fu_note "$(fu_msg "To lock with it, add this to the binds in %s, and use %s in swayidle:" "~/.config/niri/config.kdl" "$FU_NAME lock")" + fu_code "Mod+Alt+L { spawn \"$FU_NAME\" \"lock\"; }" + ;; + *) + fu_note "$(fu_msg "To lock with it, run %s where your lock screen is started now." "$FU_NAME lock")" + ;; + esac +} + +# fu_lock_style_set +fu_lock_style_set() { + # shellcheck disable=SC2088 # shown to the user, not a path to open + local conf="~/.config/hypr/hyprlock.conf" + case "$1" in + own) + fu_config_set LockScreenStyle own || { fu_bad "$(fu_msg "Could not save the setting.")"; return 1; } + fu_hyprlock_text_off + fu_ok "$(fu_msg "You lock with face-unlock's lock screen now.")" + fu_own_lock_hint + ;; + yours) + fu_config_set LockScreenStyle yours || { fu_bad "$(fu_msg "Could not save the setting.")"; return 1; } + fu_hyprlock_text_on + case $? in + 0) fu_ok "$(fu_msg "hyprlock shows what face unlock is doing at the top, from the next time it locks.")" ;; + 1) fu_bad "$(fu_msg "Could not add the line to %s." "$conf")" ;; + 2) fu_ok "$(fu_msg "Your lock screen stays as it is. Press Enter on the empty password field to scan.")" ;; + 3) fu_note "$(fu_msg "hyprlock has no %s, so it cannot show the text." "$conf")" ;; + esac + ;; + *) return 1 ;; + esac +} + +# fu_lock_choose +# Asks in a window which lock screen to use, and carries it out. 1 when the +# window was closed or cannot open. +fu_lock_choose() { + local choice + [[ -n ${WAYLAND_DISPLAY:-} ]] || return 1 + choice="$("$FU_AGENT" --choose-lock-screen 2> /dev/null)" || return 1 + fu_lock_style_set "$choice" +} + fu_agent_disable() { systemctl --user disable --now "$FU_UNIT_AGENT" > /dev/null 2>&1 || true } diff --git a/tests/test_lockpreview.cpp b/tests/test_lockpreview.cpp new file mode 100644 index 0000000..9edf32d --- /dev/null +++ b/tests/test_lockpreview.cpp @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// +// The user's own lock screen as the window that asks which one to use shows +// it: hyprlock's and swaylock's configs read the way they read them. + +#include "lockpreview.h" + +#include +#include +#include +#include + +#include + +namespace +{ +int failures = 0; + +void check(bool ok, const char *what) +{ + std::printf("%s %s\n", ok ? "ok " : "FAIL", what); + if (!ok) { + ++failures; + } +} + +void write(const QString &path, const QByteArray &text) +{ + QDir().mkpath(path.section(u'/', 0, -2)); + QFile f(path); + if (f.open(QIODevice::WriteOnly)) { + f.write(text); + } +} + +QList ofType(const QVariantList &widgets, const QString &type) +{ + QList found; + for (const QVariant &w : widgets) { + if (w.toMap().value(QStringLiteral("type")).toString() == type) { + found.append(w.toMap()); + } + } + return found; +} +} // namespace + +int main() +{ + using LockPreview::color; + check(color(QStringLiteral("rgba(255, 128, 0, 0.5)")).rgba() == QColor(255, 128, 0, 128).rgba(), "rgba() with numbers"); + check(color(QStringLiteral("rgba(33ccffee)")) == QColor(0x33, 0xcc, 0xff, 0xee), "rgba() in hex"); + check(color(QStringLiteral("rgb(10, 20, 30)")) == QColor(10, 20, 30), "rgb() with numbers"); + check(color(QStringLiteral("0x80112233")) == QColor(0x11, 0x22, 0x33, 0x80), "0xAARRGGBB"); + check(!color(QStringLiteral("blue-ish")).isValid(), "and nothing for a word"); + + QTemporaryDir dir; + const QString conf = dir.filePath(QStringLiteral("hyprlock.conf")); + write(conf, R"( +$font = Noto Sans Light +$white = rgba(255, 255, 255, 1.0) + +background { + monitor = + path = screenshot + blur_passes = 2 +} + +label { + monitor = + text = cmd[update:1000] echo "Hi ##1" # a comment + font_family = $font + font_size = 30 + color = $white + position = 0, 10% + halign = center + valign = top +} + +label { + monitor = HDMI-A-9 + text = only on another screen +} + +source = ./more/*.conf +)"); + write(dir.filePath(QStringLiteral("more/field.conf")), R"( +input-field { + size = 20%, 50 + outer_color = rgba(33ccffee) rgba(00ff99ee) 45deg + zindex = 5 +} +)"); + + const QUrl desktop = QUrl::fromLocalFile(QStringLiteral("/w/desktop.jpg")); + const QVariantList widgets = LockPreview::hyprlock(conf, QSizeF(1000, 500), QStringLiteral("eDP-1"), desktop); + const auto backgrounds = ofType(widgets, QStringLiteral("background")); + check(backgrounds.size() == 1 && backgrounds.first().value(QStringLiteral("source")).toUrl() == desktop, "a screenshot background shows the desktop's picture"); + check(backgrounds.first().value(QStringLiteral("blur")).toDouble() > 0, "and is blurred"); + + const auto labels = ofType(widgets, QStringLiteral("label")); + check(labels.size() == 2, "the label for another screen is left out, face-unlock's line is added"); + const QVariantMap hi = labels.value(0); + check(hi.value(QStringLiteral("text")).toString() == u"Hi #1", "a command's output, ## as #, the comment gone"); + check(hi.value(QStringLiteral("family")).toString() == u"Noto Sans" && hi.value(QStringLiteral("weight")).toInt() == 300, "a variable, and the font's style word as weight"); + check(hi.value(QStringLiteral("color")).value() == QColor(Qt::white), "a colour through a variable"); + check(qFuzzyCompare(hi.value(QStringLiteral("y")).toDouble(), 50.0), "a position in percent of the screen"); + check(labels.value(1).value(QStringLiteral("valign")).toString() == u"top", "face-unlock's line at the top"); + + const auto fields = ofType(widgets, QStringLiteral("input")); + check(fields.size() == 1, "a sourced file is read"); + check(qFuzzyCompare(fields.value(0).value(QStringLiteral("width")).toDouble(), 200.0), "a size in percent"); + const QVariantMap outer = fields.value(0).value(QStringLiteral("outer")).toMap(); + check(outer.value(QStringLiteral("colors")).toList().size() == 2 && qFuzzyCompare(outer.value(QStringLiteral("angle")).toDouble(), 45.0), "a gradient"); + check(widgets.last().toMap().value(QStringLiteral("type")).toString() == u"label", "drawn by zindex, the line on top"); + + // Once the menu has put the line in, it is not there twice. + write(conf, "label {\n text = cmd[update:0:1] cat \"$XDG_RUNTIME_DIR/face-unlock/lock-text\"\n}\n"); + const auto ours = ofType(LockPreview::hyprlock(conf, QSizeF(1000, 500), QString(), desktop), QStringLiteral("label")); + check(ours.size() == 1 && !ours.first().value(QStringLiteral("text")).toString().isEmpty(), "face-unlock's line once, saying what it would"); + + const QString sway = dir.filePath(QStringLiteral("swaylock")); + write(sway, "# comment\nimage=eDP-1:~/pic.png\ncolor=102030\nindicator-idle-visible\nindicator-radius=80\n"); + const QVariantList swaylock = LockPreview::swaylock(sway, desktop); + const QVariantMap back = swaylock.value(0).toMap(); + check(back.value(QStringLiteral("source")).toUrl() == QUrl::fromLocalFile(QDir::homePath() + QStringLiteral("/pic.png")), "swaylock: the image, without its output"); + check(back.value(QStringLiteral("color")).value() == QColor(0x10, 0x20, 0x30), "swaylock: the colour"); + check(ofType(swaylock, QStringLiteral("ring")).value(0).value(QStringLiteral("radius")).toDouble() == 80, "swaylock: the ring when it stays visible"); + check(LockPreview::swaylock(QString(), desktop).value(0).toMap().value(QStringLiteral("color")).value() == QColor(Qt::white), "swaylock without a config: white"); + + std::printf("\n%s\n", failures ? "SOME CHECKS FAILED" : "all checks passed"); + return failures ? 1 : 0; +}