feat: add an own lock screen with the bubble and your wallpaper
This commit is contained in:
1 parent
c693ca216c
commit
c228291520
44 files changed
+3891
-1033
No files matched your search
@@ -89,4 +89,7 @@ Never test against the real setup: enrolling and the PAM files belong to the use
|
||||
- A development daemon needs no root: `face-unlockd --socket $XDG_RUNTIME_DIR/fu/socket
|
||||
--state-dir DIR --config FILE --models DIR`. It skips polkit when it does not run as root. Point
|
||||
the other parts at it with `FU_SOCKET`.
|
||||
- face-unlock's own lock screen checks the password with PAM. `FU_PAM_CONFDIR=DIR` points it at a
|
||||
`face-unlock-lock` file of its own (pam_permit, pam_deny), so no test counts as a wrong password
|
||||
for the real account.
|
||||
- `make check` after every change. New strings: `po/update-pot.sh`, then translate them in every `po/*.po`.
|
||||
+23
-4
@@ -102,9 +102,11 @@ install(TARGETS face-unlock-ctl DESTINATION ${FU_LIBEXECDIR})
|
||||
# The PAM module
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# The PAM module, and the agent's own lock screen, which checks the password.
|
||||
find_path(PAM_INCLUDE_DIR security/pam_modules.h REQUIRED)
|
||||
find_library(PAM_LIBRARY pam REQUIRED)
|
||||
|
||||
if(FU_BUILD_PAM)
|
||||
find_path(PAM_INCLUDE_DIR security/pam_modules.h REQUIRED)
|
||||
find_library(PAM_LIBRARY pam REQUIRED)
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(SYSTEMD IMPORTED_TARGET libsystemd)
|
||||
|
||||
@@ -155,6 +157,9 @@ if(FU_BUILD_AGENT)
|
||||
src/agent/lockers.cpp
|
||||
src/agent/inputwatcher.cpp
|
||||
src/agent/wayland.cpp
|
||||
src/agent/sessionlock.cpp
|
||||
src/agent/lockscreencontroller.cpp
|
||||
src/agent/wallpaper.cpp
|
||||
src/agent/enrollcontroller.cpp
|
||||
)
|
||||
target_include_directories(face-unlock-agent PRIVATE src/agent)
|
||||
@@ -164,13 +169,14 @@ if(FU_BUILD_AGENT)
|
||||
|
||||
qt6_generate_wayland_protocol_client_sources(face-unlock-agent
|
||||
FILES ${CMAKE_CURRENT_SOURCE_DIR}/protocols/kde-lockscreen-overlay-v1.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/protocols/ext-idle-notify-v1.xml)
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/protocols/ext-idle-notify-v1.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/protocols/ext-session-lock-v1.xml)
|
||||
|
||||
# The QML files sit next to the module's qmldir in the resources, so they
|
||||
# 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)
|
||||
set(FU_QML_FILES Theme FaceGlyph LockGlyph Checkmark Bubble TickRing Enroll PillButton LockScreen)
|
||||
foreach(f ${FU_QML_FILES})
|
||||
set_source_files_properties(src/agent/qml/${f}.qml PROPERTIES QT_RESOURCE_ALIAS ${f}.qml)
|
||||
endforeach()
|
||||
@@ -192,6 +198,7 @@ if(FU_BUILD_AGENT)
|
||||
src/agent/qml/TickRing.qml
|
||||
src/agent/qml/Enroll.qml
|
||||
src/agent/qml/PillButton.qml
|
||||
src/agent/qml/LockScreen.qml
|
||||
)
|
||||
|
||||
target_link_libraries(face-unlock-agent PRIVATE
|
||||
@@ -200,7 +207,9 @@ if(FU_BUILD_AGENT)
|
||||
LayerShellQt::Interface
|
||||
KF6::I18n KF6::I18nQml
|
||||
fu_common
|
||||
${PAM_LIBRARY}
|
||||
)
|
||||
target_include_directories(face-unlock-agent PRIVATE ${PAM_INCLUDE_DIR})
|
||||
install(TARGETS face-unlock-agent DESTINATION ${FU_LIBEXECDIR})
|
||||
endif()
|
||||
|
||||
@@ -223,6 +232,16 @@ if(FU_BUILD_TESTS)
|
||||
target_link_libraries(test_images PRIVATE fu_core)
|
||||
|
||||
if(FU_BUILD_AGENT)
|
||||
add_executable(test_lockscreen tests/test_lockscreen.cpp src/agent/lockscreencontroller.cpp)
|
||||
target_include_directories(test_lockscreen PRIVATE src/agent ${PAM_INCLUDE_DIR})
|
||||
target_link_libraries(test_lockscreen PRIVATE Qt6::Core KF6::I18n ${PAM_LIBRARY})
|
||||
add_test(NAME lockscreen COMMAND test_lockscreen)
|
||||
|
||||
add_executable(test_wallpaper tests/test_wallpaper.cpp src/agent/wallpaper.cpp)
|
||||
target_include_directories(test_wallpaper PRIVATE src/agent)
|
||||
target_link_libraries(test_wallpaper PRIVATE Qt6::Core)
|
||||
add_test(NAME wallpaper COMMAND test_wallpaper)
|
||||
|
||||
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)
|
||||
|
||||
@@ -74,8 +74,8 @@ desktops, on Wayland:
|
||||
|---|---|---|---|
|
||||
| KDE Plasma 6 | ✅ | ✅ | ✅ above the lock screen too |
|
||||
| GNOME | ✅ | ✅ | ✅ above the lock screen too |
|
||||
| Hyprland | ✅ hyprlock, swaylock, gtklock or waylock | ✅ | ✅ once the lock screen is gone |
|
||||
| Niri | ✅ swaylock, hyprlock, gtklock or waylock | ✅ | ✅ once the lock screen is gone |
|
||||
| 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 |
|
||||
|
||||
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.
|
||||
@@ -86,10 +86,43 @@ press Enter on the empty password field to scan. hyprlock and swaylock also
|
||||
scan by themselves when you come back. Those lock screens cover the bubble,
|
||||
which shows the tick once they are gone.
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
the lock screen by itself: the menu shows what to add to its config.
|
||||
|
||||
<details>
|
||||
<summary>Hyprland and Niri: face-unlock's lock screen on a key</summary>
|
||||
|
||||
`~/.config/hypr/hyprland.conf`, and `lock_cmd` in `hypridle.conf`:
|
||||
|
||||
```ini
|
||||
bind = SUPER, L, exec, face-unlock lock
|
||||
```
|
||||
|
||||
`~/.config/hypr/hyprland.lua` (Hyprland 0.56 and newer):
|
||||
|
||||
```lua
|
||||
hl.bind("SUPER + L", hl.dsp.exec_cmd("face-unlock lock"))
|
||||
```
|
||||
|
||||
`~/.config/niri/config.kdl`, and `face-unlock lock` in swayidle:
|
||||
|
||||
```kdl
|
||||
binds {
|
||||
Mod+Alt+L { spawn "face-unlock" "lock"; }
|
||||
}
|
||||
```
|
||||
|
||||
`face-unlock lock` returns as soon as the screen is locked, so it also works
|
||||
for locking before sleep.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Coming from plasma-face-unlock?</summary>
|
||||
|
||||
|
||||
+27
-7
@@ -18,9 +18,8 @@ a printed one does not either.
|
||||
|
||||
A bubble at the top of the screen shows what is going on: it drops down when
|
||||
the camera starts looking, the face in it looks around, and when it recognises
|
||||
somebody two green rings spin and land around a tick. On Plasma and GNOME it
|
||||
shows above the lock screen too. *Animation speed* makes all of it faster or
|
||||
slower.
|
||||
somebody two green rings spin and land around a tick. It shows above the lock
|
||||
screen too. *Animation speed* makes all of it faster or slower.
|
||||
|
||||
Run without a command it shows an interactive menu. Everything it can be told
|
||||
is reachable from there; the settings files behind it do not need to be edited
|
||||
@@ -60,6 +59,12 @@ It is a convenience, not a security upgrade. See *HOW SAFE IS THIS*.
|
||||
*status*
|
||||
What is on, and when the last unlock was.
|
||||
|
||||
*lock*
|
||||
Lock the screen. On Hyprland, Niri and other compositors whose lock
|
||||
screen is a program of its own, with face-unlock's own lock screen,
|
||||
which shows the bubble (see *DESKTOPS*). Elsewhere with the desktop's
|
||||
lock screen. Returns once the screen is locked.
|
||||
|
||||
*-h*, *--help*
|
||||
Show a summary of the commands.
|
||||
|
||||
@@ -196,8 +201,8 @@ does not start a scan with every key.
|
||||
|
||||
When the face matches, the agent unlocks the session the way its lock screen
|
||||
wants it: through logind, as *loginctl unlock-session* does, on Plasma and
|
||||
GNOME, and with SIGUSR1 for hyprlock and swaylock. Any other lock screen
|
||||
opens itself, through PAM (see *DESKTOPS*).
|
||||
GNOME, by itself on its own lock screen, and with SIGUSR1 for hyprlock and
|
||||
swaylock. Any other lock screen opens itself, through PAM (see *DESKTOPS*).
|
||||
|
||||
Unlocked through logind, Plasma's lock screen cuts off its own password prompt
|
||||
and counts that as a wrong password. After a face unlock the daemon resets the
|
||||
@@ -212,7 +217,8 @@ is under *DESKTOPS*.
|
||||
|
||||
# DESKTOPS
|
||||
|
||||
All of them on Wayland. sudo and admin prompts work the same everywhere.
|
||||
All of them on Wayland. sudo and admin prompts work the same everywhere, and
|
||||
so does the bubble, above the lock screen too.
|
||||
|
||||
*KDE Plasma 6*
|
||||
The lock is seen through org.freedesktop.ScreenSaver and logind, and
|
||||
@@ -240,6 +246,17 @@ All of them on Wayland. sudo and admin prompts work the same everywhere.
|
||||
when somebody comes back, and opens them with SIGUSR1. Those lock
|
||||
screens cover the bubble, which shows the tick once they are gone.
|
||||
|
||||
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_
|
||||
when an administrator wrote one, else the distribution's password-auth,
|
||||
common-auth or login) and the bubble, and a face opens it straight
|
||||
away. Behind it is the picture on the desktop, as swaybg, awww (swww),
|
||||
hyprpaper or wpaperd show it. *Wallpaper* under *Settings* puts another
|
||||
picture there, one at random from a folder, or _none_; *Blur the
|
||||
wallpaper* blurs it. If the agent dies while this screen is locked, the
|
||||
compositor keeps it locked, and the agent takes the lock back when it
|
||||
starts again.
|
||||
|
||||
Hyprland only starts the agent's user service under uwsm. Without it,
|
||||
*enable* and *status* show what to add to its config.
|
||||
|
||||
@@ -310,7 +327,10 @@ _/run/face-unlock/socket_
|
||||
|
||||
_$XDG_RUNTIME_DIR/face-unlock/agent.socket_
|
||||
Where the daemon tells the agent about scans it did not start, for the
|
||||
bubble.
|
||||
bubble, and where *lock* asks it to lock.
|
||||
|
||||
_$XDG_RUNTIME_DIR/face-unlock/locked_
|
||||
There while face-unlock's own lock screen is up.
|
||||
|
||||
_/usr/share/gnome-shell/extensions/face-unlock@loonixtools.github.io/_
|
||||
The GNOME Shell extension that draws the bubble on GNOME.
|
||||
|
||||
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: 2026-09-23 22:32+0200\n"
|
||||
"Last-Translator: Felitendo\n"
|
||||
"Language-Team: German\n"
|
||||
@@ -59,8 +59,8 @@ 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:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr "Einstellung konnte nicht gespeichert werden."
|
||||
|
||||
@@ -113,16 +113,16 @@ msgstr ""
|
||||
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:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr "an"
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr "aus"
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr "%s Aufnahmen, %s dazugelernt"
|
||||
@@ -152,7 +152,7 @@ msgstr "Gesichtsentsperrung einschalten"
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr "Ausschalten (Gesichter bleiben erhalten)"
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr "Gesicht hinzufügen"
|
||||
|
||||
@@ -169,22 +169,26 @@ msgid "Look at the camera and see what it sees"
|
||||
msgstr "In die Kamera schauen und sehen, was sie sieht"
|
||||
|
||||
#: src/face-unlock:200
|
||||
msgid "Lock the screen"
|
||||
msgstr "Bildschirm sperren"
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show what is on"
|
||||
msgstr "Anzeigen, was eingeschaltet ist"
|
||||
|
||||
#: src/face-unlock:201
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr "Diese Hilfe anzeigen"
|
||||
|
||||
#: src/face-unlock:202
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr "Die Version anzeigen"
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr "Ohne Befehl wird ein interaktives Menü angezeigt."
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
@@ -192,42 +196,42 @@ msgstr ""
|
||||
"Starte das als dein eigener Benutzer, nicht als root. Wenn nötig, wird nach "
|
||||
"deinem Passwort gefragt."
|
||||
|
||||
#: src/face-unlock:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr "Unbekannter Befehl: %s"
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr "nie"
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr "gerade eben"
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr "vor 1 Minute"
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "vor %d Minuten"
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr "vor 1 Stunde"
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr "vor %d Stunden"
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr "vor 1 Tag"
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr "vor %d Tagen"
|
||||
@@ -371,11 +375,11 @@ msgstr ""
|
||||
msgid "[y/N]"
|
||||
msgstr "[j/N]"
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr "AN"
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr "AUS"
|
||||
|
||||
@@ -416,7 +420,7 @@ msgstr "langsam"
|
||||
msgid "%s seconds"
|
||||
msgstr "%s Sekunden"
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr "automatisch"
|
||||
|
||||
@@ -436,8 +440,8 @@ msgstr "läuft nicht"
|
||||
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:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr "Gesichter"
|
||||
|
||||
@@ -494,7 +498,7 @@ msgstr "Letzte Entsperrung"
|
||||
msgid "The lock screen agent is not running."
|
||||
msgstr "Der Sperrbildschirm-Dienst läuft nicht."
|
||||
|
||||
#: src/lib/menu.sh:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
@@ -502,16 +506,17 @@ msgstr ""
|
||||
"Unter GNOME zeigt eine kleine GNOME-Erweiterung die Bubble. Beim Einschalten "
|
||||
"der Gesichtsentsperrung wird sie mit eingeschaltet."
|
||||
|
||||
#: src/lib/menu.sh:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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 ""
|
||||
"Scannt, wenn du zu hyprlock oder swaylock zurückkommst, und öffnet sie. "
|
||||
"Jeder andere Sperrbildschirm scannt, wenn du Enter im leeren Passwortfeld "
|
||||
"drückst."
|
||||
"Scannt, wenn du zu hyprlock, swaylock oder zum Sperrbildschirm von face-"
|
||||
"unlock zurückkommst (`face-unlock lock`, mit der Bubble), und öffnet sie. "
|
||||
"Andere Sperrbildschirme scannen mit Enter."
|
||||
|
||||
#: src/lib/menu.sh:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
@@ -519,7 +524,7 @@ msgstr ""
|
||||
"Entsperrt den Sperrbildschirm, wenn er dein Gesicht sieht. Aus: Dort geht "
|
||||
"nur dein Passwort."
|
||||
|
||||
#: src/lib/menu.sh:324
|
||||
#: src/lib/menu.sh:328
|
||||
msgid ""
|
||||
"Scans when you press a key or move the mouse on the lock screen, and when "
|
||||
"the computer wakes up."
|
||||
@@ -527,7 +532,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:325
|
||||
#: src/lib/menu.sh:329
|
||||
msgid ""
|
||||
"Scans as soon as the screen locks. Off by default: if you lock it yourself, "
|
||||
"it would unlock again right away."
|
||||
@@ -535,7 +540,7 @@ msgstr ""
|
||||
"Scannt, sobald der Bildschirm gesperrt wird. Normalerweise aus: Sperrst du "
|
||||
"selbst, würde er gleich wieder entsperren."
|
||||
|
||||
#: src/lib/menu.sh:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
@@ -543,7 +548,21 @@ msgstr ""
|
||||
"sudo nimmt dein Gesicht statt des Passworts. Passt es nicht, tippst du wie "
|
||||
"gewohnt dein Passwort."
|
||||
|
||||
#: src/lib/menu.sh:327
|
||||
#: src/lib/menu.sh:331
|
||||
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 ""
|
||||
"Das Bild hinter dem Sperrbildschirm von face-unlock (`face-unlock lock`). "
|
||||
"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
|
||||
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
|
||||
#, sh-printf-format
|
||||
msgid ""
|
||||
"The lock screen takes your face in its password check. Press Enter on the "
|
||||
@@ -552,7 +571,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:328
|
||||
#: src/lib/menu.sh:334
|
||||
msgid ""
|
||||
"The password windows of your desktop and apps, for example when you install "
|
||||
"software. No match: you type the password."
|
||||
@@ -560,18 +579,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:329
|
||||
#: src/lib/menu.sh:335
|
||||
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:330
|
||||
#: src/lib/menu.sh:336
|
||||
msgid "No check at all. Only for trying out a camera."
|
||||
msgstr "Keine Prüfung. Nur zum Ausprobieren einer Kamera."
|
||||
|
||||
#: src/lib/menu.sh:331
|
||||
#: src/lib/menu.sh:337
|
||||
msgid ""
|
||||
"Stops photos on a phone, a tablet or glossy paper. You do not have to blink. "
|
||||
"A matte printed photo can get through."
|
||||
@@ -579,22 +598,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:332
|
||||
#: src/lib/menu.sh:338
|
||||
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:333
|
||||
#: src/lib/menu.sh:339
|
||||
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:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr "Der Standard. Passt für die meisten."
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
msgid ""
|
||||
"Your eyes have to be open and on the screen. So it does not unlock while you "
|
||||
"look away or sleep."
|
||||
@@ -602,7 +621,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:336
|
||||
#: src/lib/menu.sh:342
|
||||
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)."
|
||||
@@ -611,11 +630,11 @@ msgstr ""
|
||||
"neu einrichten. Eine Infrarot-Kamera braucht ihr Licht (linux-enable-ir-"
|
||||
"emitter)."
|
||||
|
||||
#: src/lib/menu.sh:337
|
||||
#: src/lib/menu.sh:343
|
||||
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:338
|
||||
#: src/lib/menu.sh:344
|
||||
msgid ""
|
||||
"After a sure match it keeps how you look now. So a new haircut or glasses "
|
||||
"need no new setup."
|
||||
@@ -623,7 +642,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:339
|
||||
#: src/lib/menu.sh:345
|
||||
msgid ""
|
||||
"No scan while the laptop is closed, for example at a desk with an external "
|
||||
"screen."
|
||||
@@ -631,82 +650,99 @@ msgstr ""
|
||||
"Kein Scan bei zugeklapptem Laptop, zum Beispiel am Schreibtisch mit externem "
|
||||
"Bildschirm."
|
||||
|
||||
#: src/lib/menu.sh:340
|
||||
#: src/lib/menu.sh:346
|
||||
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:341
|
||||
#: src/lib/menu.sh:347
|
||||
msgid "A small pill with a lock that opens."
|
||||
msgstr "Eine kleine Pille mit einem Schloss, das aufgeht."
|
||||
|
||||
#: src/lib/menu.sh:342
|
||||
#: src/lib/menu.sh:348
|
||||
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:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr "Wie schnell sich die Bubble bewegt."
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
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:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr "automatisch (%s)"
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr "(Infrarot)"
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr "(nicht angeschlossen)"
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr "wie Desktop"
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr "keins"
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr "Bild oder Ordner:"
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr "Nicht gefunden: %s"
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr "Einstellungen"
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr "↑↓ auswählen ←→ oder Leertaste: ändern q: zurück"
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
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:626
|
||||
#: src/lib/menu.sh:662
|
||||
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:627
|
||||
#: src/lib/menu.sh:663
|
||||
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:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr "Neuer Name:"
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr "„%s“ löschen?"
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr "Gesichtsentsperrung ein- oder ausschalten"
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr "Ausprobieren"
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr "Beenden"
|
||||
|
||||
@@ -767,6 +803,14 @@ msgstr "Scannen, wenn du zurückkommst"
|
||||
msgid "Scan right after locking"
|
||||
msgstr "Gleich nach dem Sperren scannen"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr "Hintergrundbild"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr "Hintergrundbild weichzeichnen"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr "Passwort-Abfragen"
|
||||
@@ -928,23 +972,31 @@ msgstr ""
|
||||
msgid "The face could not be added (%1)."
|
||||
msgstr "Das Gesicht konnte nicht hinzugefügt werden (%1)."
|
||||
|
||||
#: src/agent/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr "Falsches Passwort"
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
msgid "Face unlock for the lock screen, sudo and admin prompts"
|
||||
msgstr "Gesichtsentsperrung für Sperrbildschirm, sudo und Admin-Abfragen"
|
||||
|
||||
#: src/agent/main.cpp:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr "Ein Gesicht einrichten."
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr "Wie das neue Gesicht heißen soll."
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr "Den Bildschirm sperren."
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr "Die Animationen der Bubble einmal abspielen."
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr "Bubble-Stil für die Demo: full oder minimal."
|
||||
|
||||
@@ -1025,3 +1077,15 @@ msgstr "Los geht's"
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr "Fertig"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr "Passwort"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
msgid "Look at the camera or type your password"
|
||||
msgstr "Schau in die Kamera oder tippe dein Passwort"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:186
|
||||
msgid "Type your password"
|
||||
msgstr "Tippe dein Passwort"
|
||||
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: 2026-09-24 12:00+0200\n"
|
||||
"Last-Translator: Felitendo\n"
|
||||
"Language-Team: Spanish\n"
|
||||
@@ -58,8 +58,8 @@ 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:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr "No se pudo guardar el ajuste."
|
||||
|
||||
@@ -114,16 +114,16 @@ msgstr ""
|
||||
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:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr "activado"
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr "desactivado"
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr "%s muestras, %s aprendidas"
|
||||
@@ -153,7 +153,7 @@ msgstr "Activar el desbloqueo facial"
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr "Desactivarlo (las caras se conservan)"
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr "Añadir una cara"
|
||||
|
||||
@@ -170,22 +170,26 @@ 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
|
||||
msgid "Lock the screen"
|
||||
msgstr "Bloquear la pantalla"
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show what is on"
|
||||
msgstr "Mostrar qué está activado"
|
||||
|
||||
#: src/face-unlock:201
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr "Mostrar esta ayuda"
|
||||
|
||||
#: src/face-unlock:202
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr "Mostrar la versión"
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr "Sin comando se muestra un menú interactivo."
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
@@ -193,42 +197,42 @@ msgstr ""
|
||||
"Ejecuta esto con tu propio usuario, no como root. Pide tu contraseña cuando "
|
||||
"la necesita."
|
||||
|
||||
#: src/face-unlock:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr "Comando desconocido: %s"
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr "nunca"
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr "ahora mismo"
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr "hace 1 minuto"
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "hace %d minutos"
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr "hace 1 hora"
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr "hace %d horas"
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr "hace 1 día"
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr "hace %d días"
|
||||
@@ -372,11 +376,11 @@ msgstr ""
|
||||
msgid "[y/N]"
|
||||
msgstr "[s/N]"
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr "ACTIVADO"
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr "DESACTIVADO"
|
||||
|
||||
@@ -417,7 +421,7 @@ msgstr "lenta"
|
||||
msgid "%s seconds"
|
||||
msgstr "%s segundos"
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr "automática"
|
||||
|
||||
@@ -437,8 +441,8 @@ msgstr "detenido"
|
||||
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:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr "Caras"
|
||||
|
||||
@@ -495,7 +499,7 @@ msgstr "Último desbloqueo"
|
||||
msgid "The lock screen agent is not running."
|
||||
msgstr "El agente de la pantalla de bloqueo no se está ejecutando."
|
||||
|
||||
#: src/lib/menu.sh:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
@@ -503,15 +507,17 @@ 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:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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 ""
|
||||
"Escanea cuando vuelves a hyprlock o swaylock y los abre. Cualquier otra "
|
||||
"pantalla de bloqueo escanea al pulsar Intro en el campo de contraseña vacío."
|
||||
"Escanea cuando vuelves a hyprlock, swaylock o la pantalla de bloqueo propia "
|
||||
"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:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
@@ -519,7 +525,7 @@ msgstr ""
|
||||
"Desbloquea la pantalla de bloqueo cuando ve tu cara. Desactivado: ahí solo "
|
||||
"sirve tu contraseña."
|
||||
|
||||
#: src/lib/menu.sh:324
|
||||
#: src/lib/menu.sh:328
|
||||
msgid ""
|
||||
"Scans when you press a key or move the mouse on the lock screen, and when "
|
||||
"the computer wakes up."
|
||||
@@ -527,7 +533,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:325
|
||||
#: src/lib/menu.sh:329
|
||||
msgid ""
|
||||
"Scans as soon as the screen locks. Off by default: if you lock it yourself, "
|
||||
"it would unlock again right away."
|
||||
@@ -535,7 +541,7 @@ msgstr ""
|
||||
"Escanea en cuanto se bloquea la pantalla. Desactivado por defecto: si la "
|
||||
"bloqueas tú, se desbloquearía enseguida."
|
||||
|
||||
#: src/lib/menu.sh:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
@@ -543,7 +549,21 @@ msgstr ""
|
||||
"sudo usa tu cara en lugar de la contraseña. Si no coincide, escribes la "
|
||||
"contraseña como siempre."
|
||||
|
||||
#: src/lib/menu.sh:327
|
||||
#: src/lib/menu.sh:331
|
||||
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 ""
|
||||
"La imagen detrás de la pantalla de bloqueo de face-unlock (`face-unlock "
|
||||
"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
|
||||
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
|
||||
#, sh-printf-format
|
||||
msgid ""
|
||||
"The lock screen takes your face in its password check. Press Enter on the "
|
||||
@@ -552,7 +572,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:328
|
||||
#: src/lib/menu.sh:334
|
||||
msgid ""
|
||||
"The password windows of your desktop and apps, for example when you install "
|
||||
"software. No match: you type the password."
|
||||
@@ -560,18 +580,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:329
|
||||
#: src/lib/menu.sh:335
|
||||
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:330
|
||||
#: src/lib/menu.sh:336
|
||||
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:331
|
||||
#: src/lib/menu.sh:337
|
||||
msgid ""
|
||||
"Stops photos on a phone, a tablet or glossy paper. You do not have to blink. "
|
||||
"A matte printed photo can get through."
|
||||
@@ -579,24 +599,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:332
|
||||
#: src/lib/menu.sh:338
|
||||
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:333
|
||||
#: src/lib/menu.sh:339
|
||||
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:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr "El valor por defecto. Adecuado para la mayoría."
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
msgid ""
|
||||
"Your eyes have to be open and on the screen. So it does not unlock while you "
|
||||
"look away or sleep."
|
||||
@@ -604,7 +624,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:336
|
||||
#: src/lib/menu.sh:342
|
||||
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)."
|
||||
@@ -613,11 +633,11 @@ msgstr ""
|
||||
"tu cara. Una cámara infrarroja necesita su luz encendida (linux-enable-ir-"
|
||||
"emitter)."
|
||||
|
||||
#: src/lib/menu.sh:337
|
||||
#: src/lib/menu.sh:343
|
||||
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:338
|
||||
#: src/lib/menu.sh:344
|
||||
msgid ""
|
||||
"After a sure match it keeps how you look now. So a new haircut or glasses "
|
||||
"need no new setup."
|
||||
@@ -625,7 +645,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:339
|
||||
#: src/lib/menu.sh:345
|
||||
msgid ""
|
||||
"No scan while the laptop is closed, for example at a desk with an external "
|
||||
"screen."
|
||||
@@ -633,85 +653,102 @@ msgstr ""
|
||||
"Sin escaneo mientras el portátil está cerrado, por ejemplo en un escritorio "
|
||||
"con una pantalla externa."
|
||||
|
||||
#: src/lib/menu.sh:340
|
||||
#: src/lib/menu.sh:346
|
||||
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:341
|
||||
#: src/lib/menu.sh:347
|
||||
msgid "A small pill with a lock that opens."
|
||||
msgstr "Una pequeña pastilla con un candado que se abre."
|
||||
|
||||
#: src/lib/menu.sh:342
|
||||
#: src/lib/menu.sh:348
|
||||
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:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr "La velocidad a la que se mueve la burbuja."
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
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:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr "automática (%s)"
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr "(infrarroja)"
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr "(no conectada)"
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr "como el escritorio"
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr "ninguna"
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr "Imagen o carpeta:"
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr "No encontrado: %s"
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr "Ajustes"
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr "↑↓ elegir ←→ o Espacio: cambiar q: volver"
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
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:626
|
||||
#: src/lib/menu.sh:662
|
||||
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:627
|
||||
#: src/lib/menu.sh:663
|
||||
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:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr "Nuevo nombre:"
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr "¿Borrar «%s»?"
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr "Activar o desactivar el desbloqueo facial"
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr "Probarlo"
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr "Salir"
|
||||
|
||||
@@ -771,6 +808,14 @@ msgstr "Escanear cuando vuelvas"
|
||||
msgid "Scan right after locking"
|
||||
msgstr "Escanear justo después de bloquear"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr "Fondo de pantalla"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr "Desenfocar el fondo"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr "Solicitudes de contraseña"
|
||||
@@ -930,25 +975,33 @@ msgstr ""
|
||||
msgid "The face could not be added (%1)."
|
||||
msgstr "No se pudo añadir la cara (%1)."
|
||||
|
||||
#: src/agent/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr "Contraseña incorrecta"
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
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:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr "Configurar una cara."
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr "Cómo llamar a la nueva cara."
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr "Bloquear la pantalla."
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr "Reproducir una vez las animaciones de la burbuja."
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr "Estilo de burbuja para la demo: full o minimal."
|
||||
|
||||
@@ -1029,3 +1082,15 @@ msgstr "Empezar"
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr "Hecho"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr "Contraseña"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
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
|
||||
msgid "Type your password"
|
||||
msgstr "Escribe tu contraseña"
|
||||
+130
-69
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -54,8 +54,8 @@ msgstr ""
|
||||
msgid "First, set up your face."
|
||||
msgstr ""
|
||||
|
||||
#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr ""
|
||||
|
||||
@@ -98,16 +98,16 @@ msgstr ""
|
||||
msgid "No face is set up yet."
|
||||
msgstr ""
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr ""
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr ""
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr ""
|
||||
@@ -137,7 +137,7 @@ msgstr ""
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr ""
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr ""
|
||||
|
||||
@@ -154,63 +154,67 @@ msgid "Look at the camera and see what it sees"
|
||||
msgstr ""
|
||||
|
||||
#: src/face-unlock:200
|
||||
msgid "Show what is on"
|
||||
msgid "Lock the screen"
|
||||
msgstr ""
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show this help"
|
||||
msgid "Show what is on"
|
||||
msgstr ""
|
||||
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr ""
|
||||
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr ""
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr ""
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
msgstr ""
|
||||
|
||||
#: src/face-unlock:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr ""
|
||||
@@ -350,11 +354,11 @@ msgstr ""
|
||||
msgid "[y/N]"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr ""
|
||||
|
||||
@@ -395,7 +399,7 @@ msgstr ""
|
||||
msgid "%s seconds"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr ""
|
||||
|
||||
@@ -415,8 +419,8 @@ msgstr ""
|
||||
msgid "Turning face unlock on again starts it."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr ""
|
||||
|
||||
@@ -473,183 +477,212 @@ msgstr ""
|
||||
msgid "The lock screen agent is not running."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:324
|
||||
#: src/lib/menu.sh:328
|
||||
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:325
|
||||
#: src/lib/menu.sh:329
|
||||
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:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:327
|
||||
#: src/lib/menu.sh:331
|
||||
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
|
||||
msgid "Blurs the picture behind face-unlock's own lock screen."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:333
|
||||
#, 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:328
|
||||
#: src/lib/menu.sh:334
|
||||
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:329
|
||||
#: src/lib/menu.sh:335
|
||||
msgid ""
|
||||
"You have to blink or turn your head a little. This also stops printed photos."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:330
|
||||
#: src/lib/menu.sh:336
|
||||
msgid "No check at all. Only for trying out a camera."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:331
|
||||
#: src/lib/menu.sh:337
|
||||
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:332
|
||||
#: src/lib/menu.sh:338
|
||||
msgid ""
|
||||
"Fewer wrong matches, but it may not know you with glasses or in bad light."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:333
|
||||
#: src/lib/menu.sh:339
|
||||
msgid "Knows you more easily, but also somebody who looks a lot like you."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
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:336
|
||||
#: src/lib/menu.sh:342
|
||||
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:337
|
||||
#: src/lib/menu.sh:343
|
||||
msgid "How long the camera looks for your face before it gives up."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:338
|
||||
#: src/lib/menu.sh:344
|
||||
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:339
|
||||
#: src/lib/menu.sh:345
|
||||
msgid ""
|
||||
"No scan while the laptop is closed, for example at a desk with an external "
|
||||
"screen."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:340
|
||||
#: src/lib/menu.sh:346
|
||||
msgid "The bubble at the top of the screen shows what the camera is doing."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:341
|
||||
#: src/lib/menu.sh:347
|
||||
msgid "A small pill with a lock that opens."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:342
|
||||
#: src/lib/menu.sh:348
|
||||
msgid "An island with a face that looks around, then rings and a tick."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
msgid "Shows the bubble when sudo or an admin prompt scans your face, too."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
msgid "for all users, asks for your password"
|
||||
msgstr ""
|
||||
|
||||
#. TRANSLATORS: keep the letters, they are the keys.
|
||||
#: src/lib/menu.sh:626
|
||||
#: src/lib/menu.sh:662
|
||||
msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:627
|
||||
#: src/lib/menu.sh:663
|
||||
msgid "No face is set up yet. Press a to add one."
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr ""
|
||||
|
||||
@@ -705,6 +738,14 @@ msgstr ""
|
||||
msgid "Scan right after locking"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr ""
|
||||
@@ -861,23 +902,31 @@ msgstr ""
|
||||
msgid "The face could not be added (%1)."
|
||||
msgstr ""
|
||||
|
||||
#: src/agent/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr ""
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
msgid "Face unlock for the lock screen, sudo and admin prompts"
|
||||
msgstr ""
|
||||
|
||||
#: src/agent/main.cpp:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr ""
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr ""
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr ""
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr ""
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr ""
|
||||
|
||||
@@ -952,3 +1001,15 @@ msgstr ""
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr ""
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
msgid "Look at the camera or type your password"
|
||||
msgstr ""
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:186
|
||||
msgid "Type your password"
|
||||
msgstr ""
|
||||
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: 2026-09-24 12:00+0200\n"
|
||||
"Last-Translator: Felitendo\n"
|
||||
"Language-Team: French\n"
|
||||
@@ -60,8 +60,8 @@ 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:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr "Impossible d'enregistrer le réglage."
|
||||
|
||||
@@ -116,16 +116,16 @@ msgstr ""
|
||||
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:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr "activé"
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr "désactivé"
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr "%s échantillons, %s appris"
|
||||
@@ -155,7 +155,7 @@ msgstr "Activer le déverrouillage facial"
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr "Le désactiver (les visages sont conservés)"
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr "Ajouter un visage"
|
||||
|
||||
@@ -172,22 +172,26 @@ 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
|
||||
msgid "Lock the screen"
|
||||
msgstr "Verrouiller l'écran"
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show what is on"
|
||||
msgstr "Afficher ce qui est activé"
|
||||
|
||||
#: src/face-unlock:201
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr "Afficher cette aide"
|
||||
|
||||
#: src/face-unlock:202
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr "Afficher la version"
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr "Sans commande, un menu interactif s'affiche."
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
@@ -195,42 +199,42 @@ msgstr ""
|
||||
"Lancez ceci avec votre propre utilisateur, pas en root. Le mot de passe est "
|
||||
"demandé quand il le faut."
|
||||
|
||||
#: src/face-unlock:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr "Commande inconnue : %s"
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr "jamais"
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr "à l'instant"
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr "il y a 1 minute"
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "il y a %d minutes"
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr "il y a 1 heure"
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr "il y a %d heures"
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr "il y a 1 jour"
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr "il y a %d jours"
|
||||
@@ -376,11 +380,11 @@ msgstr ""
|
||||
msgid "[y/N]"
|
||||
msgstr "[o/N]"
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr "ACTIVÉ"
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr "DÉSACTIVÉ"
|
||||
|
||||
@@ -421,7 +425,7 @@ msgstr "lent"
|
||||
msgid "%s seconds"
|
||||
msgstr "%s secondes"
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr "automatique"
|
||||
|
||||
@@ -441,8 +445,8 @@ msgstr "arrêté"
|
||||
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:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr "Visages"
|
||||
|
||||
@@ -499,7 +503,7 @@ msgstr "Dernier déverrouillage"
|
||||
msgid "The lock screen agent is not running."
|
||||
msgstr "L'agent de l'écran de verrouillage ne tourne pas."
|
||||
|
||||
#: src/lib/menu.sh:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
@@ -507,16 +511,17 @@ msgstr ""
|
||||
"Sous GNOME, une petite extension GNOME affiche la bulle. Activer le "
|
||||
"déverrouillage facial l'active aussi."
|
||||
|
||||
#: src/lib/menu.sh:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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 ""
|
||||
"Scanne quand vous revenez à hyprlock ou swaylock et les ouvre. Tout autre "
|
||||
"écran de verrouillage scanne quand vous appuyez sur Entrée dans le champ du "
|
||||
"mot de passe vide."
|
||||
"Scanne quand vous revenez à hyprlock, swaylock ou à l'écran de verrouillage "
|
||||
"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:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
@@ -524,7 +529,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:324
|
||||
#: src/lib/menu.sh:328
|
||||
msgid ""
|
||||
"Scans when you press a key or move the mouse on the lock screen, and when "
|
||||
"the computer wakes up."
|
||||
@@ -532,7 +537,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:325
|
||||
#: src/lib/menu.sh:329
|
||||
msgid ""
|
||||
"Scans as soon as the screen locks. Off by default: if you lock it yourself, "
|
||||
"it would unlock again right away."
|
||||
@@ -540,7 +545,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:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
@@ -548,7 +553,21 @@ 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:327
|
||||
#: src/lib/menu.sh:331
|
||||
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 ""
|
||||
"L'image derrière l'écran de verrouillage de face-unlock (`face-unlock "
|
||||
"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
|
||||
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
|
||||
#, sh-printf-format
|
||||
msgid ""
|
||||
"The lock screen takes your face in its password check. Press Enter on the "
|
||||
@@ -557,7 +576,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:328
|
||||
#: src/lib/menu.sh:334
|
||||
msgid ""
|
||||
"The password windows of your desktop and apps, for example when you install "
|
||||
"software. No match: you type the password."
|
||||
@@ -565,18 +584,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:329
|
||||
#: src/lib/menu.sh:335
|
||||
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:330
|
||||
#: src/lib/menu.sh:336
|
||||
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:331
|
||||
#: src/lib/menu.sh:337
|
||||
msgid ""
|
||||
"Stops photos on a phone, a tablet or glossy paper. You do not have to blink. "
|
||||
"A matte printed photo can get through."
|
||||
@@ -584,24 +603,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:332
|
||||
#: src/lib/menu.sh:338
|
||||
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:333
|
||||
#: src/lib/menu.sh:339
|
||||
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:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr "La valeur par défaut. Convient à la plupart des gens."
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
msgid ""
|
||||
"Your eyes have to be open and on the screen. So it does not unlock while you "
|
||||
"look away or sleep."
|
||||
@@ -609,7 +628,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:336
|
||||
#: src/lib/menu.sh:342
|
||||
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)."
|
||||
@@ -618,11 +637,11 @@ msgstr ""
|
||||
"reconfigurez votre visage. Une caméra infrarouge doit avoir sa lumière "
|
||||
"allumée (linux-enable-ir-emitter)."
|
||||
|
||||
#: src/lib/menu.sh:337
|
||||
#: src/lib/menu.sh:343
|
||||
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:338
|
||||
#: src/lib/menu.sh:344
|
||||
msgid ""
|
||||
"After a sure match it keeps how you look now. So a new haircut or glasses "
|
||||
"need no new setup."
|
||||
@@ -631,7 +650,7 @@ msgstr ""
|
||||
"nouvelle coupe ou des lunettes ne demandent donc pas de nouvelle "
|
||||
"configuration."
|
||||
|
||||
#: src/lib/menu.sh:339
|
||||
#: src/lib/menu.sh:345
|
||||
msgid ""
|
||||
"No scan while the laptop is closed, for example at a desk with an external "
|
||||
"screen."
|
||||
@@ -639,84 +658,101 @@ msgstr ""
|
||||
"Pas de scan quand le portable est fermé, par exemple à un bureau avec un "
|
||||
"écran externe."
|
||||
|
||||
#: src/lib/menu.sh:340
|
||||
#: src/lib/menu.sh:346
|
||||
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:341
|
||||
#: src/lib/menu.sh:347
|
||||
msgid "A small pill with a lock that opens."
|
||||
msgstr "Une petite pilule avec un cadenas qui s'ouvre."
|
||||
|
||||
#: src/lib/menu.sh:342
|
||||
#: src/lib/menu.sh:348
|
||||
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:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr "La vitesse à laquelle la bulle bouge."
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
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:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr "automatique (%s)"
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr "(infrarouge)"
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr "(non branchée)"
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr "comme le bureau"
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr "aucun"
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr "Image ou dossier :"
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr "Introuvable : %s"
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr "Réglages"
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr "↑↓ choisir ←→ ou Espace : changer q : retour"
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
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:626
|
||||
#: src/lib/menu.sh:662
|
||||
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:627
|
||||
#: src/lib/menu.sh:663
|
||||
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:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr "Nouveau nom :"
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr "Supprimer « %s » ?"
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr "Activer ou désactiver le déverrouillage facial"
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr "Essayer"
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr "Quitter"
|
||||
|
||||
@@ -777,6 +813,14 @@ msgstr "Scanner à votre retour"
|
||||
msgid "Scan right after locking"
|
||||
msgstr "Scanner juste après le verrouillage"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr "Fond d'écran"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr "Flouter le fond d'écran"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr "Demandes de mot de passe"
|
||||
@@ -936,25 +980,33 @@ 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/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr "Mot de passe incorrect"
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
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:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr "Configurer un visage."
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr "Le nom du nouveau visage."
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr "Verrouiller l'écran."
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr "Jouer une fois les animations de la bulle."
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr "Style de bulle pour la démo : full ou minimal."
|
||||
|
||||
@@ -1036,3 +1088,15 @@ msgstr "Commencer"
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr "Terminé"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr "Mot de passe"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
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
|
||||
msgid "Type your password"
|
||||
msgstr "Tapez votre mot de passe"
|
||||
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: 2026-09-24 12:00+0200\n"
|
||||
"Last-Translator: Felitendo\n"
|
||||
"Language-Team: Italian\n"
|
||||
@@ -58,8 +58,8 @@ 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:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr "Impossibile salvare l'impostazione."
|
||||
|
||||
@@ -110,16 +110,16 @@ msgstr ""
|
||||
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:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr "attivo"
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr "disattivo"
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr "%s campioni, %s appresi"
|
||||
@@ -149,7 +149,7 @@ msgstr "Attiva lo sblocco con il volto"
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr "Disattivalo (i volti restano salvati)"
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr "Aggiungi un volto"
|
||||
|
||||
@@ -166,22 +166,26 @@ msgid "Look at the camera and see what it sees"
|
||||
msgstr "Guarda la fotocamera e vedi cosa vede"
|
||||
|
||||
#: src/face-unlock:200
|
||||
msgid "Lock the screen"
|
||||
msgstr "Blocca lo schermo"
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show what is on"
|
||||
msgstr "Mostra cosa è attivo"
|
||||
|
||||
#: src/face-unlock:201
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr "Mostra questo aiuto"
|
||||
|
||||
#: src/face-unlock:202
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr "Mostra la versione"
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr "Senza comando viene mostrato un menu interattivo."
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
@@ -189,42 +193,42 @@ msgstr ""
|
||||
"Esegui questo con il tuo utente, non come root. Chiede la password quando "
|
||||
"serve."
|
||||
|
||||
#: src/face-unlock:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr "Comando sconosciuto: %s"
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr "mai"
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr "proprio ora"
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr "1 minuto fa"
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "%d minuti fa"
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr "1 ora fa"
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr "%d ore fa"
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr "1 giorno fa"
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr "%d giorni fa"
|
||||
@@ -369,11 +373,11 @@ msgstr ""
|
||||
msgid "[y/N]"
|
||||
msgstr "[s/N]"
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr "ATTIVO"
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr "DISATTIVO"
|
||||
|
||||
@@ -414,7 +418,7 @@ msgstr "lenta"
|
||||
msgid "%s seconds"
|
||||
msgstr "%s secondi"
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr "automatica"
|
||||
|
||||
@@ -434,8 +438,8 @@ msgstr "non in esecuzione"
|
||||
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:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr "Volti"
|
||||
|
||||
@@ -492,7 +496,7 @@ msgstr "Ultimo sblocco"
|
||||
msgid "The lock screen agent is not running."
|
||||
msgstr "L'agente della schermata di blocco non è in esecuzione."
|
||||
|
||||
#: src/lib/menu.sh:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
@@ -500,15 +504,17 @@ 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:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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 ""
|
||||
"Scansiona quando torni a hyprlock o swaylock e li apre. Ogni altra schermata "
|
||||
"di blocco scansiona quando premi Invio nel campo password vuoto."
|
||||
"Scansiona quando torni a hyprlock, swaylock o alla schermata di blocco di "
|
||||
"face-unlock (`face-unlock lock`, con la bolla) e li apre. Le altre schermate "
|
||||
"di blocco scansionano con Invio."
|
||||
|
||||
#: src/lib/menu.sh:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
@@ -516,7 +522,7 @@ msgstr ""
|
||||
"Sblocca la schermata di blocco quando vede il tuo volto. Disattivo: lì "
|
||||
"funziona solo la password."
|
||||
|
||||
#: src/lib/menu.sh:324
|
||||
#: src/lib/menu.sh:328
|
||||
msgid ""
|
||||
"Scans when you press a key or move the mouse on the lock screen, and when "
|
||||
"the computer wakes up."
|
||||
@@ -524,7 +530,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:325
|
||||
#: src/lib/menu.sh:329
|
||||
msgid ""
|
||||
"Scans as soon as the screen locks. Off by default: if you lock it yourself, "
|
||||
"it would unlock again right away."
|
||||
@@ -532,7 +538,7 @@ msgstr ""
|
||||
"Esegue la scansione appena lo schermo si blocca. Disattivo di norma: se lo "
|
||||
"blocchi tu, si sbloccherebbe subito."
|
||||
|
||||
#: src/lib/menu.sh:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
@@ -540,7 +546,21 @@ msgstr ""
|
||||
"sudo usa il tuo volto al posto della password. Se non corrisponde, digiti la "
|
||||
"password come al solito."
|
||||
|
||||
#: src/lib/menu.sh:327
|
||||
#: src/lib/menu.sh:331
|
||||
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 ""
|
||||
"L'immagine dietro la schermata di blocco di face-unlock (`face-unlock "
|
||||
"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
|
||||
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
|
||||
#, sh-printf-format
|
||||
msgid ""
|
||||
"The lock screen takes your face in its password check. Press Enter on the "
|
||||
@@ -549,7 +569,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:328
|
||||
#: src/lib/menu.sh:334
|
||||
msgid ""
|
||||
"The password windows of your desktop and apps, for example when you install "
|
||||
"software. No match: you type the password."
|
||||
@@ -557,18 +577,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:329
|
||||
#: src/lib/menu.sh:335
|
||||
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:330
|
||||
#: src/lib/menu.sh:336
|
||||
msgid "No check at all. Only for trying out a camera."
|
||||
msgstr "Nessun controllo. Solo per provare una fotocamera."
|
||||
|
||||
#: src/lib/menu.sh:331
|
||||
#: src/lib/menu.sh:337
|
||||
msgid ""
|
||||
"Stops photos on a phone, a tablet or glossy paper. You do not have to blink. "
|
||||
"A matte printed photo can get through."
|
||||
@@ -576,22 +596,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:332
|
||||
#: src/lib/menu.sh:338
|
||||
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:333
|
||||
#: src/lib/menu.sh:339
|
||||
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:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr "Il valore predefinito. Va bene per la maggior parte delle persone."
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
msgid ""
|
||||
"Your eyes have to be open and on the screen. So it does not unlock while you "
|
||||
"look away or sleep."
|
||||
@@ -599,7 +619,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:336
|
||||
#: src/lib/menu.sh:342
|
||||
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)."
|
||||
@@ -608,11 +628,11 @@ msgstr ""
|
||||
"nuovo il tuo volto. Una fotocamera a infrarossi ha bisogno della sua luce "
|
||||
"(linux-enable-ir-emitter)."
|
||||
|
||||
#: src/lib/menu.sh:337
|
||||
#: src/lib/menu.sh:343
|
||||
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:338
|
||||
#: src/lib/menu.sh:344
|
||||
msgid ""
|
||||
"After a sure match it keeps how you look now. So a new haircut or glasses "
|
||||
"need no new setup."
|
||||
@@ -621,7 +641,7 @@ msgstr ""
|
||||
"nuovo taglio di capelli o gli occhiali non richiedono una nuova "
|
||||
"configurazione."
|
||||
|
||||
#: src/lib/menu.sh:339
|
||||
#: src/lib/menu.sh:345
|
||||
msgid ""
|
||||
"No scan while the laptop is closed, for example at a desk with an external "
|
||||
"screen."
|
||||
@@ -629,82 +649,99 @@ msgstr ""
|
||||
"Nessuna scansione quando il portatile è chiuso, per esempio alla scrivania "
|
||||
"con uno schermo esterno."
|
||||
|
||||
#: src/lib/menu.sh:340
|
||||
#: src/lib/menu.sh:346
|
||||
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:341
|
||||
#: src/lib/menu.sh:347
|
||||
msgid "A small pill with a lock that opens."
|
||||
msgstr "Una piccola pillola con un lucchetto che si apre."
|
||||
|
||||
#: src/lib/menu.sh:342
|
||||
#: src/lib/menu.sh:348
|
||||
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:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr "Quanto velocemente si muove la bolla."
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
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:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr "automatica (%s)"
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr "(infrarossi)"
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr "(non collegata)"
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr "come il desktop"
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr "nessuno"
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr "Immagine o cartella:"
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr "Non trovato: %s"
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr "Impostazioni"
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr "↑↓ scegli ←→ o Spazio: cambia q: indietro"
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
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:626
|
||||
#: src/lib/menu.sh:662
|
||||
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:627
|
||||
#: src/lib/menu.sh:663
|
||||
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:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr "Nuovo nome:"
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr "Eliminare «%s»?"
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr "Attiva o disattiva lo sblocco con il volto"
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr "Provalo"
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr "Esci"
|
||||
|
||||
@@ -765,6 +802,14 @@ msgstr "Scansiona quando torni"
|
||||
msgid "Scan right after locking"
|
||||
msgstr "Scansiona subito dopo il blocco"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr "Sfondo"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr "Sfoca lo sfondo"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr "Richieste di password"
|
||||
@@ -924,25 +969,33 @@ msgstr ""
|
||||
msgid "The face could not be added (%1)."
|
||||
msgstr "Impossibile aggiungere il volto (%1)."
|
||||
|
||||
#: src/agent/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr "Password errata"
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
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:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr "Configura un volto."
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr "Come chiamare il nuovo volto."
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr "Blocca lo schermo."
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr "Riproduci una volta le animazioni della bolla."
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr "Stile della bolla per la demo: full o minimal."
|
||||
|
||||
@@ -1024,3 +1077,15 @@ msgstr "Iniziamo"
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr "Fatto"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr "Password"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
msgid "Look at the camera or type your password"
|
||||
msgstr "Guarda la fotocamera o digita la password"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:186
|
||||
msgid "Type your password"
|
||||
msgstr "Digita la password"
|
||||
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: 2026-09-24 12:00+0200\n"
|
||||
"Last-Translator: Felitendo\n"
|
||||
"Language-Team: Japanese\n"
|
||||
@@ -57,8 +57,8 @@ msgstr "顔は追加されませんでした。"
|
||||
msgid "First, set up your face."
|
||||
msgstr "まず顔を登録してください。"
|
||||
|
||||
#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr "設定を保存できませんでした。"
|
||||
|
||||
@@ -106,16 +106,16 @@ msgstr "顔認証はオフです。顔データは残っています。「顔」
|
||||
msgid "No face is set up yet."
|
||||
msgstr "まだ顔が登録されていません。"
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr "オン"
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr "オフ"
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr "サンプル %s 件、学習 %s 件"
|
||||
@@ -145,7 +145,7 @@ msgstr "顔認証をオンにする"
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr "オフにする(顔データは残ります)"
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr "顔を追加"
|
||||
|
||||
@@ -162,22 +162,26 @@ msgid "Look at the camera and see what it sees"
|
||||
msgstr "カメラを見て、カメラに映るものを確認する"
|
||||
|
||||
#: src/face-unlock:200
|
||||
msgid "Lock the screen"
|
||||
msgstr "画面をロック"
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show what is on"
|
||||
msgstr "オンになっている機能を表示"
|
||||
|
||||
#: src/face-unlock:201
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr "このヘルプを表示"
|
||||
|
||||
#: src/face-unlock:202
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr "バージョンを表示"
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr "コマンドなしで起動すると、対話式メニューが表示されます。"
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
@@ -185,42 +189,42 @@ msgstr ""
|
||||
"root ではなく、自分のユーザーで実行してください。必要なときはパスワードを尋ね"
|
||||
"ます。"
|
||||
|
||||
#: src/face-unlock:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr "不明なコマンド: %s"
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr "なし"
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr "たった今"
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr "1 分前"
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "%d 分前"
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr "1 時間前"
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr "%d 時間前"
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr "1 日前"
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr "%d 日前"
|
||||
@@ -364,11 +368,11 @@ msgstr ""
|
||||
msgid "[y/N]"
|
||||
msgstr "[y/N]"
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr "オン"
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr "オフ"
|
||||
|
||||
@@ -409,7 +413,7 @@ msgstr "遅い"
|
||||
msgid "%s seconds"
|
||||
msgstr "%s 秒"
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr "自動"
|
||||
|
||||
@@ -429,8 +433,8 @@ msgstr "停止中"
|
||||
msgid "Turning face unlock on again starts it."
|
||||
msgstr "顔認証をもう一度オンにすると起動します。"
|
||||
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr "顔"
|
||||
|
||||
@@ -487,7 +491,7 @@ msgstr "最後のロック解除"
|
||||
msgid "The lock screen agent is not running."
|
||||
msgstr "ロック画面エージェントが動いていません。"
|
||||
|
||||
#: src/lib/menu.sh:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
@@ -495,15 +499,17 @@ msgstr ""
|
||||
"GNOME では小さな GNOME 拡張機能がバブルを表示します。顔認証をオンにすると一緒"
|
||||
"に有効になります。"
|
||||
|
||||
#: src/lib/menu.sh:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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 ""
|
||||
"hyprlock や swaylock に戻ってきたときにスキャンして開きます。それ以外のロック"
|
||||
"画面は、空のパスワード欄で Enter を押すとスキャンします。"
|
||||
"hyprlock、swaylock、face-unlock のロック画面(`face-unlock lock`、バブル付"
|
||||
"き)に戻ってきたときにスキャンして開きます。ほかのロック画面は Enter でスキャ"
|
||||
"ンします。"
|
||||
|
||||
#: src/lib/menu.sh:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
@@ -511,7 +517,7 @@ msgstr ""
|
||||
"顔を認識するとロック画面を解除します。オフ: ロック画面ではパスワードだけが使"
|
||||
"えます。"
|
||||
|
||||
#: src/lib/menu.sh:324
|
||||
#: src/lib/menu.sh:328
|
||||
msgid ""
|
||||
"Scans when you press a key or move the mouse on the lock screen, and when "
|
||||
"the computer wakes up."
|
||||
@@ -519,7 +525,7 @@ msgstr ""
|
||||
"ロック画面でキーを押すかマウスを動かしたとき、そしてコンピューターがスリープ"
|
||||
"から復帰したときにスキャンします。"
|
||||
|
||||
#: src/lib/menu.sh:325
|
||||
#: src/lib/menu.sh:329
|
||||
msgid ""
|
||||
"Scans as soon as the screen locks. Off by default: if you lock it yourself, "
|
||||
"it would unlock again right away."
|
||||
@@ -527,7 +533,7 @@ msgstr ""
|
||||
"画面がロックされるとすぐにスキャンします。既定はオフ: 自分でロックすると、す"
|
||||
"ぐに解除されてしまうためです。"
|
||||
|
||||
#: src/lib/menu.sh:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
@@ -535,7 +541,20 @@ msgstr ""
|
||||
"sudo でパスワードの代わりに顔を使います。一致しなければ、いつも通りパスワード"
|
||||
"を入力します。"
|
||||
|
||||
#: src/lib/menu.sh:327
|
||||
#: src/lib/menu.sh:331
|
||||
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 ""
|
||||
"face-unlock のロック画面(`face-unlock lock`)の背景画像。空欄: デスクトップ"
|
||||
"と同じ画像。またはファイル、ランダムに選ぶフォルダー、`none`。Enter で入力。"
|
||||
|
||||
#: src/lib/menu.sh:332
|
||||
msgid "Blurs the picture behind face-unlock's own lock screen."
|
||||
msgstr "face-unlock のロック画面の背景画像をぼかします。"
|
||||
|
||||
#: src/lib/menu.sh:333
|
||||
#, sh-printf-format
|
||||
msgid ""
|
||||
"The lock screen takes your face in its password check. Press Enter on the "
|
||||
@@ -544,7 +563,7 @@ msgstr ""
|
||||
"ロック画面のパスワード確認で顔が使えます。空の欄で Enter を押すとスキャンしま"
|
||||
"す。見つかったもの: %s。"
|
||||
|
||||
#: src/lib/menu.sh:328
|
||||
#: src/lib/menu.sh:334
|
||||
msgid ""
|
||||
"The password windows of your desktop and apps, for example when you install "
|
||||
"software. No match: you type the password."
|
||||
@@ -552,16 +571,16 @@ msgstr ""
|
||||
"デスクトップやアプリのパスワード画面です(ソフトウェアのインストール時な"
|
||||
"ど)。一致しなければパスワードを入力します。"
|
||||
|
||||
#: src/lib/menu.sh:329
|
||||
#: src/lib/menu.sh:335
|
||||
msgid ""
|
||||
"You have to blink or turn your head a little. This also stops printed photos."
|
||||
msgstr "まばたきするか、少し顔を動かす必要があります。印刷した写真も防げます。"
|
||||
|
||||
#: src/lib/menu.sh:330
|
||||
#: src/lib/menu.sh:336
|
||||
msgid "No check at all. Only for trying out a camera."
|
||||
msgstr "チェックしません。カメラを試すときだけ使ってください。"
|
||||
|
||||
#: src/lib/menu.sh:331
|
||||
#: src/lib/menu.sh:337
|
||||
msgid ""
|
||||
"Stops photos on a phone, a tablet or glossy paper. You do not have to blink. "
|
||||
"A matte printed photo can get through."
|
||||
@@ -569,22 +588,22 @@ msgstr ""
|
||||
"スマホ、タブレット、光沢紙に映った写真を防ぎます。まばたきは不要です。つや消"
|
||||
"しの印刷写真は通ることがあります。"
|
||||
|
||||
#: src/lib/menu.sh:332
|
||||
#: src/lib/menu.sh:338
|
||||
msgid ""
|
||||
"Fewer wrong matches, but it may not know you with glasses or in bad light."
|
||||
msgstr ""
|
||||
"誤認識は減りますが、眼鏡をかけているときや暗いときに認識されないことがありま"
|
||||
"す。"
|
||||
|
||||
#: src/lib/menu.sh:333
|
||||
#: src/lib/menu.sh:339
|
||||
msgid "Knows you more easily, but also somebody who looks a lot like you."
|
||||
msgstr "認識されやすくなりますが、あなたによく似た人も認識されやすくなります。"
|
||||
|
||||
#: src/lib/menu.sh:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr "既定値です。ほとんどの人に適しています。"
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
msgid ""
|
||||
"Your eyes have to be open and on the screen. So it does not unlock while you "
|
||||
"look away or sleep."
|
||||
@@ -592,7 +611,7 @@ msgstr ""
|
||||
"目を開けて画面を見ている必要があります。よそ見や居眠りの間にロック解除されま"
|
||||
"せん。"
|
||||
|
||||
#: src/lib/menu.sh:336
|
||||
#: src/lib/menu.sh:342
|
||||
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)."
|
||||
@@ -600,11 +619,11 @@ msgstr ""
|
||||
"「自動」は最初の通常のカメラを使います。変更したら顔を登録し直してください。"
|
||||
"赤外線カメラはライトをオンにする必要があります(linux-enable-ir-emitter)。"
|
||||
|
||||
#: src/lib/menu.sh:337
|
||||
#: src/lib/menu.sh:343
|
||||
msgid "How long the camera looks for your face before it gives up."
|
||||
msgstr "カメラが顔を探してからあきらめるまでの時間です。"
|
||||
|
||||
#: src/lib/menu.sh:338
|
||||
#: src/lib/menu.sh:344
|
||||
msgid ""
|
||||
"After a sure match it keeps how you look now. So a new haircut or glasses "
|
||||
"need no new setup."
|
||||
@@ -612,7 +631,7 @@ msgstr ""
|
||||
"確実に一致したとき、今の見た目を覚えます。髪型を変えたり眼鏡をかけたりして"
|
||||
"も、登録し直す必要はありません。"
|
||||
|
||||
#: src/lib/menu.sh:339
|
||||
#: src/lib/menu.sh:345
|
||||
msgid ""
|
||||
"No scan while the laptop is closed, for example at a desk with an external "
|
||||
"screen."
|
||||
@@ -620,79 +639,96 @@ msgstr ""
|
||||
"ノートパソコンを閉じているときはスキャンしません。外部モニターにつないで机で"
|
||||
"使う場合などです。"
|
||||
|
||||
#: src/lib/menu.sh:340
|
||||
#: src/lib/menu.sh:346
|
||||
msgid "The bubble at the top of the screen shows what the camera is doing."
|
||||
msgstr "画面上部のバブルに、カメラの状態が表示されます。"
|
||||
|
||||
#: src/lib/menu.sh:341
|
||||
#: src/lib/menu.sh:347
|
||||
msgid "A small pill with a lock that opens."
|
||||
msgstr "鍵が開く小さなピルです。"
|
||||
|
||||
#: src/lib/menu.sh:342
|
||||
#: src/lib/menu.sh:348
|
||||
msgid "An island with a face that looks around, then rings and a tick."
|
||||
msgstr "あたりを見回す顔のアイランド。そのあとリングとチェックマークが出ます。"
|
||||
|
||||
#: src/lib/menu.sh:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr "バブルが動く速さです。"
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
msgid "Shows the bubble when sudo or an admin prompt scans your face, too."
|
||||
msgstr "sudo や管理者の認証で顔をスキャンするときにもバブルを表示します。"
|
||||
|
||||
#: src/lib/menu.sh:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr "自動(%s)"
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr "(赤外線)"
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr "(未接続)"
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr "デスクトップと同じ"
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr "なし"
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr "画像またはフォルダー:"
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr "見つかりません: %s"
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr "設定"
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr "↑↓ 選択 ←→ またはスペース: 変更 q: 戻る"
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
msgid "for all users, asks for your password"
|
||||
msgstr "全ユーザー共通、パスワードが必要"
|
||||
|
||||
#. TRANSLATORS: keep the letters, they are the keys.
|
||||
#: src/lib/menu.sh:626
|
||||
#: src/lib/menu.sh:662
|
||||
msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back"
|
||||
msgstr ""
|
||||
"上/下: 選択、スペース: オン/オフ、r: 名前を変更、d: 削除、a: 追加、q: 戻る"
|
||||
|
||||
#: src/lib/menu.sh:627
|
||||
#: src/lib/menu.sh:663
|
||||
msgid "No face is set up yet. Press a to add one."
|
||||
msgstr "まだ顔が登録されていません。a を押して追加してください。"
|
||||
|
||||
#: src/lib/menu.sh:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr "新しい名前:"
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr "「%s」を削除しますか?"
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr "顔認証のオン/オフ"
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr "試す"
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr "終了"
|
||||
|
||||
@@ -751,6 +787,14 @@ msgstr "戻ってきたらスキャン"
|
||||
msgid "Scan right after locking"
|
||||
msgstr "ロック直後にスキャン"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr "壁紙"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr "壁紙をぼかす"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr "パスワードの入力画面"
|
||||
@@ -907,23 +951,31 @@ msgstr "カメラは別のスキャン中です。少ししてからもう一度
|
||||
msgid "The face could not be added (%1)."
|
||||
msgstr "顔を追加できませんでした(%1)。"
|
||||
|
||||
#: src/agent/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr "パスワードが違います"
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
msgid "Face unlock for the lock screen, sudo and admin prompts"
|
||||
msgstr "ロック画面、sudo、管理者の認証のための顔認証"
|
||||
|
||||
#: src/agent/main.cpp:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr "顔を登録します。"
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr "新しい顔の名前。"
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr "画面をロックします。"
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr "バブルのアニメーションを一度再生します。"
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr "デモのバブルスタイル: full または minimal。"
|
||||
|
||||
@@ -1004,3 +1056,15 @@ msgstr "はじめる"
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr "完了"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr "パスワード"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
msgid "Look at the camera or type your password"
|
||||
msgstr "カメラを見るか、パスワードを入力してください"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:186
|
||||
msgid "Type your password"
|
||||
msgstr "パスワードを入力してください"
|
||||
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: 2026-09-24 12:00+0200\n"
|
||||
"Last-Translator: Felitendo\n"
|
||||
"Language-Team: Korean\n"
|
||||
@@ -57,8 +57,8 @@ msgstr "얼굴이 추가되지 않았습니다."
|
||||
msgid "First, set up your face."
|
||||
msgstr "먼저 얼굴을 등록하세요."
|
||||
|
||||
#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr "설정을 저장하지 못했습니다."
|
||||
|
||||
@@ -107,16 +107,16 @@ msgstr ""
|
||||
msgid "No face is set up yet."
|
||||
msgstr "아직 등록된 얼굴이 없습니다."
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr "켜짐"
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr "꺼짐"
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr "샘플 %s개, 학습 %s개"
|
||||
@@ -146,7 +146,7 @@ msgstr "얼굴 잠금 해제 켜기"
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr "끄기 (얼굴 데이터는 유지)"
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr "얼굴 추가"
|
||||
|
||||
@@ -163,63 +163,67 @@ msgid "Look at the camera and see what it sees"
|
||||
msgstr "카메라를 보고 카메라에 보이는 것을 확인"
|
||||
|
||||
#: src/face-unlock:200
|
||||
msgid "Lock the screen"
|
||||
msgstr "화면 잠그기"
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show what is on"
|
||||
msgstr "켜져 있는 기능 보기"
|
||||
|
||||
#: src/face-unlock:201
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr "이 도움말 보기"
|
||||
|
||||
#: src/face-unlock:202
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr "버전 보기"
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr "명령 없이 실행하면 대화형 메뉴가 나옵니다."
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
msgstr "root가 아닌 본인 사용자로 실행하세요. 필요하면 비밀번호를 묻습니다."
|
||||
|
||||
#: src/face-unlock:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr "알 수 없는 명령: %s"
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr "없음"
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr "방금"
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr "1분 전"
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "%d분 전"
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr "1시간 전"
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr "%d시간 전"
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr "1일 전"
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr "%d일 전"
|
||||
@@ -363,11 +367,11 @@ msgstr ""
|
||||
msgid "[y/N]"
|
||||
msgstr "[y/N]"
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr "켜짐"
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr "꺼짐"
|
||||
|
||||
@@ -408,7 +412,7 @@ msgstr "느리게"
|
||||
msgid "%s seconds"
|
||||
msgstr "%s초"
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr "자동"
|
||||
|
||||
@@ -428,8 +432,8 @@ msgstr "실행 중 아님"
|
||||
msgid "Turning face unlock on again starts it."
|
||||
msgstr "얼굴 잠금 해제를 다시 켜면 시작됩니다."
|
||||
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr "얼굴"
|
||||
|
||||
@@ -486,7 +490,7 @@ msgstr "마지막 잠금 해제"
|
||||
msgid "The lock screen agent is not running."
|
||||
msgstr "잠금 화면 에이전트가 실행 중이 아닙니다."
|
||||
|
||||
#: src/lib/menu.sh:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
@@ -494,22 +498,23 @@ msgstr ""
|
||||
"GNOME에서는 작은 GNOME 확장이 버블을 보여 줍니다. 얼굴 잠금 해제를 켜면 함께 "
|
||||
"켜집니다."
|
||||
|
||||
#: src/lib/menu.sh:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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 ""
|
||||
"hyprlock이나 swaylock으로 돌아오면 스캔해서 엽니다. 다른 잠금 화면은 빈 비밀"
|
||||
"번호 칸에서 Enter를 누르면 스캔합니다."
|
||||
"hyprlock, swaylock 또는 face-unlock 자체 잠금 화면(`face-unlock lock`, 버블 "
|
||||
"포함)으로 돌아오면 스캔해서 엽니다. 다른 잠금 화면은 Enter로 스캔합니다."
|
||||
|
||||
#: src/lib/menu.sh:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
msgstr ""
|
||||
"얼굴을 보면 잠금 화면을 해제합니다. 꺼짐: 잠금 화면에서는 비밀번호만 됩니다."
|
||||
|
||||
#: src/lib/menu.sh:324
|
||||
#: src/lib/menu.sh:328
|
||||
msgid ""
|
||||
"Scans when you press a key or move the mouse on the lock screen, and when "
|
||||
"the computer wakes up."
|
||||
@@ -517,7 +522,7 @@ msgstr ""
|
||||
"잠금 화면에서 키를 누르거나 마우스를 움직일 때, 그리고 컴퓨터가 깨어날 때 스"
|
||||
"캔합니다."
|
||||
|
||||
#: src/lib/menu.sh:325
|
||||
#: src/lib/menu.sh:329
|
||||
msgid ""
|
||||
"Scans as soon as the screen locks. Off by default: if you lock it yourself, "
|
||||
"it would unlock again right away."
|
||||
@@ -525,7 +530,7 @@ msgstr ""
|
||||
"화면이 잠기자마자 스캔합니다. 기본값은 꺼짐: 직접 잠그면 곧바로 다시 풀려 버"
|
||||
"리기 때문입니다."
|
||||
|
||||
#: src/lib/menu.sh:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
@@ -533,7 +538,20 @@ msgstr ""
|
||||
"sudo가 비밀번호 대신 얼굴을 사용합니다. 일치하지 않으면 평소처럼 비밀번호를 "
|
||||
"입력합니다."
|
||||
|
||||
#: src/lib/menu.sh:327
|
||||
#: src/lib/menu.sh:331
|
||||
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 ""
|
||||
"face-unlock 잠금 화면(`face-unlock lock`)의 배경 그림. 비워 두면 바탕 화면의 "
|
||||
"그림. 또는 파일, 무작위로 고를 폴더, `none`. Enter로 입력."
|
||||
|
||||
#: src/lib/menu.sh:332
|
||||
msgid "Blurs the picture behind face-unlock's own lock screen."
|
||||
msgstr "face-unlock 잠금 화면의 배경 그림을 흐리게 합니다."
|
||||
|
||||
#: src/lib/menu.sh:333
|
||||
#, sh-printf-format
|
||||
msgid ""
|
||||
"The lock screen takes your face in its password check. Press Enter on the "
|
||||
@@ -542,7 +560,7 @@ msgstr ""
|
||||
"잠금 화면의 비밀번호 확인에서 얼굴을 받습니다. 빈 칸에서 Enter를 누르면 스캔"
|
||||
"합니다. 찾은 것: %s."
|
||||
|
||||
#: src/lib/menu.sh:328
|
||||
#: src/lib/menu.sh:334
|
||||
msgid ""
|
||||
"The password windows of your desktop and apps, for example when you install "
|
||||
"software. No match: you type the password."
|
||||
@@ -550,16 +568,16 @@ msgstr ""
|
||||
"데스크톱과 앱의 비밀번호 창입니다. 예를 들어 소프트웨어를 설치할 때입니다. 일"
|
||||
"치하지 않으면 비밀번호를 입력합니다."
|
||||
|
||||
#: src/lib/menu.sh:329
|
||||
#: src/lib/menu.sh:335
|
||||
msgid ""
|
||||
"You have to blink or turn your head a little. This also stops printed photos."
|
||||
msgstr "눈을 깜빡이거나 고개를 살짝 돌려야 합니다. 인쇄한 사진도 막아 줍니다."
|
||||
|
||||
#: src/lib/menu.sh:330
|
||||
#: src/lib/menu.sh:336
|
||||
msgid "No check at all. Only for trying out a camera."
|
||||
msgstr "검사하지 않습니다. 카메라를 시험할 때만 쓰세요."
|
||||
|
||||
#: src/lib/menu.sh:331
|
||||
#: src/lib/menu.sh:337
|
||||
msgid ""
|
||||
"Stops photos on a phone, a tablet or glossy paper. You do not have to blink. "
|
||||
"A matte printed photo can get through."
|
||||
@@ -567,22 +585,22 @@ msgstr ""
|
||||
"휴대폰, 태블릿, 광택지에 있는 사진을 막습니다. 눈을 깜빡일 필요는 없습니다. "
|
||||
"무광 인쇄 사진은 통과할 수 있습니다."
|
||||
|
||||
#: src/lib/menu.sh:332
|
||||
#: src/lib/menu.sh:338
|
||||
msgid ""
|
||||
"Fewer wrong matches, but it may not know you with glasses or in bad light."
|
||||
msgstr ""
|
||||
"잘못 일치하는 경우가 줄지만, 안경을 쓰거나 조명이 나쁘면 알아보지 못할 수 있"
|
||||
"습니다."
|
||||
|
||||
#: src/lib/menu.sh:333
|
||||
#: src/lib/menu.sh:339
|
||||
msgid "Knows you more easily, but also somebody who looks a lot like you."
|
||||
msgstr "더 쉽게 알아보지만, 당신과 많이 닮은 사람도 알아볼 수 있습니다."
|
||||
|
||||
#: src/lib/menu.sh:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr "기본값입니다. 대부분의 사람에게 알맞습니다."
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
msgid ""
|
||||
"Your eyes have to be open and on the screen. So it does not unlock while you "
|
||||
"look away or sleep."
|
||||
@@ -590,7 +608,7 @@ msgstr ""
|
||||
"눈을 뜨고 화면을 보고 있어야 합니다. 그래서 다른 곳을 보거나 자는 동안에는 풀"
|
||||
"리지 않습니다."
|
||||
|
||||
#: src/lib/menu.sh:336
|
||||
#: src/lib/menu.sh:342
|
||||
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)."
|
||||
@@ -598,11 +616,11 @@ msgstr ""
|
||||
"자동은 첫 번째 일반 카메라를 사용합니다. 바꾼 뒤에는 얼굴을 다시 등록하세요. "
|
||||
"적외선 카메라는 조명을 켜야 합니다 (linux-enable-ir-emitter)."
|
||||
|
||||
#: src/lib/menu.sh:337
|
||||
#: src/lib/menu.sh:343
|
||||
msgid "How long the camera looks for your face before it gives up."
|
||||
msgstr "카메라가 포기하기 전까지 얼굴을 찾는 시간입니다."
|
||||
|
||||
#: src/lib/menu.sh:338
|
||||
#: src/lib/menu.sh:344
|
||||
msgid ""
|
||||
"After a sure match it keeps how you look now. So a new haircut or glasses "
|
||||
"need no new setup."
|
||||
@@ -610,7 +628,7 @@ msgstr ""
|
||||
"확실히 일치하면 지금 모습을 기억합니다. 그래서 머리 모양이 바뀌거나 안경을 써"
|
||||
"도 다시 등록할 필요가 없습니다."
|
||||
|
||||
#: src/lib/menu.sh:339
|
||||
#: src/lib/menu.sh:345
|
||||
msgid ""
|
||||
"No scan while the laptop is closed, for example at a desk with an external "
|
||||
"screen."
|
||||
@@ -618,79 +636,96 @@ msgstr ""
|
||||
"노트북을 덮었을 때는 스캔하지 않습니다. 예를 들어 외부 모니터를 연결해 책상에"
|
||||
"서 쓸 때입니다."
|
||||
|
||||
#: src/lib/menu.sh:340
|
||||
#: src/lib/menu.sh:346
|
||||
msgid "The bubble at the top of the screen shows what the camera is doing."
|
||||
msgstr "화면 위쪽의 버블이 카메라가 하는 일을 보여 줍니다."
|
||||
|
||||
#: src/lib/menu.sh:341
|
||||
#: src/lib/menu.sh:347
|
||||
msgid "A small pill with a lock that opens."
|
||||
msgstr "자물쇠가 열리는 작은 알약입니다."
|
||||
|
||||
#: src/lib/menu.sh:342
|
||||
#: src/lib/menu.sh:348
|
||||
msgid "An island with a face that looks around, then rings and a tick."
|
||||
msgstr "주위를 둘러보는 얼굴이 있는 아일랜드, 그다음 링과 체크 표시입니다."
|
||||
|
||||
#: src/lib/menu.sh:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr "버블이 움직이는 속도입니다."
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
msgid "Shows the bubble when sudo or an admin prompt scans your face, too."
|
||||
msgstr "sudo나 관리자 인증 창이 얼굴을 스캔할 때도 버블을 보여 줍니다."
|
||||
|
||||
#: src/lib/menu.sh:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr "자동 (%s)"
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr "(적외선)"
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr "(연결 안 됨)"
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr "바탕 화면과 같음"
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr "없음"
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr "그림 또는 폴더:"
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr "찾을 수 없음: %s"
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr "설정"
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr "↑↓ 선택 ←→ 또는 스페이스: 변경 q: 뒤로"
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
msgid "for all users, asks for your password"
|
||||
msgstr "모든 사용자에게 적용, 비밀번호 필요"
|
||||
|
||||
#. TRANSLATORS: keep the letters, they are the keys.
|
||||
#: src/lib/menu.sh:626
|
||||
#: src/lib/menu.sh:662
|
||||
msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back"
|
||||
msgstr ""
|
||||
"위/아래: 선택, 스페이스: 켜기/끄기, r: 이름 바꾸기, d: 삭제, a: 추가, q: 뒤로"
|
||||
|
||||
#: src/lib/menu.sh:627
|
||||
#: src/lib/menu.sh:663
|
||||
msgid "No face is set up yet. Press a to add one."
|
||||
msgstr "아직 등록된 얼굴이 없습니다. a를 눌러 추가하세요."
|
||||
|
||||
#: src/lib/menu.sh:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr "새 이름:"
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr "\"%s\" 항목을 삭제할까요?"
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr "얼굴 잠금 해제 켜기/끄기"
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr "사용해 보기"
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr "끝내기"
|
||||
|
||||
@@ -750,6 +785,14 @@ msgstr "돌아오면 스캔"
|
||||
msgid "Scan right after locking"
|
||||
msgstr "잠근 직후 스캔"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr "배경 화면"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr "배경 화면 흐리게"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr "비밀번호 입력 창"
|
||||
@@ -907,23 +950,31 @@ msgstr "카메라가 다른 스캔으로 사용 중입니다. 잠시 후 다시
|
||||
msgid "The face could not be added (%1)."
|
||||
msgstr "얼굴을 추가하지 못했습니다 (%1)."
|
||||
|
||||
#: src/agent/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr "비밀번호가 틀렸습니다"
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
msgid "Face unlock for the lock screen, sudo and admin prompts"
|
||||
msgstr "잠금 화면, sudo, 관리자 인증 창을 위한 얼굴 잠금 해제"
|
||||
|
||||
#: src/agent/main.cpp:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr "얼굴을 등록합니다."
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr "새 얼굴의 이름."
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr "화면을 잠급니다."
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr "버블 애니메이션을 한 번 재생합니다."
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr "데모용 버블 스타일: full 또는 minimal."
|
||||
|
||||
@@ -1003,3 +1054,15 @@ msgstr "시작하기"
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr "완료"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr "비밀번호"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
msgid "Look at the camera or type your password"
|
||||
msgstr "카메라를 보거나 비밀번호를 입력하세요"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:186
|
||||
msgid "Type your password"
|
||||
msgstr "비밀번호를 입력하세요"
|
||||
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: 2026-09-24 12:00+0200\n"
|
||||
"Last-Translator: Felitendo\n"
|
||||
"Language-Team: Dutch\n"
|
||||
@@ -58,8 +58,8 @@ 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:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr "Kon de instelling niet opslaan."
|
||||
|
||||
@@ -110,16 +110,16 @@ msgstr ""
|
||||
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:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr "aan"
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr "uit"
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr "%s opnames, %s bijgeleerd"
|
||||
@@ -149,7 +149,7 @@ msgstr "Gezichtsontgrendeling aanzetten"
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr "Uitzetten (gezichten blijven bewaard)"
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr "Een gezicht toevoegen"
|
||||
|
||||
@@ -166,22 +166,26 @@ msgid "Look at the camera and see what it sees"
|
||||
msgstr "In de camera kijken en zien wat hij ziet"
|
||||
|
||||
#: src/face-unlock:200
|
||||
msgid "Lock the screen"
|
||||
msgstr "Scherm vergrendelen"
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show what is on"
|
||||
msgstr "Tonen wat er aan staat"
|
||||
|
||||
#: src/face-unlock:201
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr "Deze hulp tonen"
|
||||
|
||||
#: src/face-unlock:202
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr "De versie tonen"
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr "Zonder opdracht verschijnt een interactief menu."
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
@@ -189,42 +193,42 @@ msgstr ""
|
||||
"Voer dit uit als je eigen gebruiker, niet als root. Het vraagt om je "
|
||||
"wachtwoord als dat nodig is."
|
||||
|
||||
#: src/face-unlock:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr "Onbekende opdracht: %s"
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr "nooit"
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr "zojuist"
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr "1 minuut geleden"
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "%d minuten geleden"
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr "1 uur geleden"
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr "%d uur geleden"
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr "1 dag geleden"
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr "%d dagen geleden"
|
||||
@@ -368,11 +372,11 @@ msgstr ""
|
||||
msgid "[y/N]"
|
||||
msgstr "[j/N]"
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr "AAN"
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr "UIT"
|
||||
|
||||
@@ -413,7 +417,7 @@ msgstr "langzaam"
|
||||
msgid "%s seconds"
|
||||
msgstr "%s seconden"
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr "automatisch"
|
||||
|
||||
@@ -433,8 +437,8 @@ msgstr "draait niet"
|
||||
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:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr "Gezichten"
|
||||
|
||||
@@ -491,7 +495,7 @@ msgstr "Laatste ontgrendeling"
|
||||
msgid "The lock screen agent is not running."
|
||||
msgstr "De agent voor het vergrendelscherm draait niet."
|
||||
|
||||
#: src/lib/menu.sh:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
@@ -499,15 +503,17 @@ msgstr ""
|
||||
"Op GNOME toont een kleine GNOME-extensie de bubbel. Als je "
|
||||
"gezichtsontgrendeling inschakelt, gaat die ook aan."
|
||||
|
||||
#: src/lib/menu.sh:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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 ""
|
||||
"Scant als je terugkomt bij hyprlock of swaylock en opent ze. Elk ander "
|
||||
"vergrendelscherm scant als je op Enter drukt in het lege wachtwoordveld."
|
||||
"Scant als je terugkomt bij hyprlock, swaylock of het eigen vergrendelscherm "
|
||||
"van face-unlock (`face-unlock lock`, met de bubbel) en opent ze. Andere "
|
||||
"vergrendelschermen scannen met Enter."
|
||||
|
||||
#: src/lib/menu.sh:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
@@ -515,7 +521,7 @@ msgstr ""
|
||||
"Ontgrendelt het vergrendelscherm als het je gezicht ziet. Uit: daar werkt "
|
||||
"alleen je wachtwoord."
|
||||
|
||||
#: src/lib/menu.sh:324
|
||||
#: src/lib/menu.sh:328
|
||||
msgid ""
|
||||
"Scans when you press a key or move the mouse on the lock screen, and when "
|
||||
"the computer wakes up."
|
||||
@@ -523,7 +529,7 @@ msgstr ""
|
||||
"Scant als je op het vergrendelscherm een toets indrukt of de muis beweegt, "
|
||||
"en als de computer ontwaakt."
|
||||
|
||||
#: src/lib/menu.sh:325
|
||||
#: src/lib/menu.sh:329
|
||||
msgid ""
|
||||
"Scans as soon as the screen locks. Off by default: if you lock it yourself, "
|
||||
"it would unlock again right away."
|
||||
@@ -531,7 +537,7 @@ msgstr ""
|
||||
"Scant zodra het scherm vergrendelt. Standaard uit: vergrendel je zelf, dan "
|
||||
"zou het meteen weer ontgrendelen."
|
||||
|
||||
#: src/lib/menu.sh:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
@@ -539,7 +545,21 @@ msgstr ""
|
||||
"sudo neemt je gezicht in plaats van het wachtwoord. Geen match: je typt "
|
||||
"zoals gewoonlijk je wachtwoord."
|
||||
|
||||
#: src/lib/menu.sh:327
|
||||
#: src/lib/menu.sh:331
|
||||
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 ""
|
||||
"De afbeelding achter het vergrendelscherm van face-unlock (`face-unlock "
|
||||
"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
|
||||
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
|
||||
#, sh-printf-format
|
||||
msgid ""
|
||||
"The lock screen takes your face in its password check. Press Enter on the "
|
||||
@@ -548,7 +568,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:328
|
||||
#: src/lib/menu.sh:334
|
||||
msgid ""
|
||||
"The password windows of your desktop and apps, for example when you install "
|
||||
"software. No match: you type the password."
|
||||
@@ -556,18 +576,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:329
|
||||
#: src/lib/menu.sh:335
|
||||
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:330
|
||||
#: src/lib/menu.sh:336
|
||||
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:331
|
||||
#: src/lib/menu.sh:337
|
||||
msgid ""
|
||||
"Stops photos on a phone, a tablet or glossy paper. You do not have to blink. "
|
||||
"A matte printed photo can get through."
|
||||
@@ -575,22 +595,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:332
|
||||
#: src/lib/menu.sh:338
|
||||
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:333
|
||||
#: src/lib/menu.sh:339
|
||||
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:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr "De standaard. Goed voor de meeste mensen."
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
msgid ""
|
||||
"Your eyes have to be open and on the screen. So it does not unlock while you "
|
||||
"look away or sleep."
|
||||
@@ -598,7 +618,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:336
|
||||
#: src/lib/menu.sh:342
|
||||
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)."
|
||||
@@ -607,11 +627,11 @@ msgstr ""
|
||||
"opnieuw in. Een infraroodcamera heeft zijn lampje nodig (linux-enable-ir-"
|
||||
"emitter)."
|
||||
|
||||
#: src/lib/menu.sh:337
|
||||
#: src/lib/menu.sh:343
|
||||
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:338
|
||||
#: src/lib/menu.sh:344
|
||||
msgid ""
|
||||
"After a sure match it keeps how you look now. So a new haircut or glasses "
|
||||
"need no new setup."
|
||||
@@ -619,7 +639,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:339
|
||||
#: src/lib/menu.sh:345
|
||||
msgid ""
|
||||
"No scan while the laptop is closed, for example at a desk with an external "
|
||||
"screen."
|
||||
@@ -627,80 +647,97 @@ msgstr ""
|
||||
"Geen scan als de laptop dicht is, bijvoorbeeld aan een bureau met een extern "
|
||||
"scherm."
|
||||
|
||||
#: src/lib/menu.sh:340
|
||||
#: src/lib/menu.sh:346
|
||||
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:341
|
||||
#: src/lib/menu.sh:347
|
||||
msgid "A small pill with a lock that opens."
|
||||
msgstr "Een kleine pil met een slot dat opengaat."
|
||||
|
||||
#: src/lib/menu.sh:342
|
||||
#: src/lib/menu.sh:348
|
||||
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:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr "Hoe snel de bubbel beweegt."
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
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:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr "automatisch (%s)"
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr "(infrarood)"
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr "(niet aangesloten)"
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr "zoals bureaublad"
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr "geen"
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr "Afbeelding of map:"
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr "Niet gevonden: %s"
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr "Instellingen"
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr "↑↓ kiezen ←→ of Spatie: wijzigen q: terug"
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
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:626
|
||||
#: src/lib/menu.sh:662
|
||||
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:627
|
||||
#: src/lib/menu.sh:663
|
||||
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:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr "Nieuwe naam:"
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr "“%s” verwijderen?"
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr "Gezichtsontgrendeling aan- of uitzetten"
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr "Uitproberen"
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr "Afsluiten"
|
||||
|
||||
@@ -762,6 +799,14 @@ msgstr "Scannen als je terugkomt"
|
||||
msgid "Scan right after locking"
|
||||
msgstr "Scannen direct na vergrendelen"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr "Achtergrond"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr "Achtergrond vervagen"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr "Wachtwoordvragen"
|
||||
@@ -921,24 +966,32 @@ 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/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr "Verkeerd wachtwoord"
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
msgid "Face unlock for the lock screen, sudo and admin prompts"
|
||||
msgstr ""
|
||||
"Gezichtsontgrendeling voor het vergrendelscherm, sudo en beheerdersvragen"
|
||||
|
||||
#: src/agent/main.cpp:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr "Een gezicht instellen."
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr "Hoe het nieuwe gezicht moet heten."
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr "Het scherm vergrendelen."
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr "De animaties van de bubbel één keer afspelen."
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr "Bubbelstijl voor de demo: full of minimal."
|
||||
|
||||
@@ -1019,3 +1072,15 @@ msgstr "Aan de slag"
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr "Klaar"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr "Wachtwoord"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
msgid "Look at the camera or type your password"
|
||||
msgstr "Kijk naar de camera of typ je wachtwoord"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:186
|
||||
msgid "Type your password"
|
||||
msgstr "Typ je wachtwoord"
|
||||
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: 2026-09-24 12:00+0200\n"
|
||||
"Last-Translator: Felitendo\n"
|
||||
"Language-Team: Polish\n"
|
||||
@@ -59,8 +59,8 @@ 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:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr "Nie udało się zapisać ustawienia."
|
||||
|
||||
@@ -111,16 +111,16 @@ msgstr ""
|
||||
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:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr "wł."
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr "wył."
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr "próbki: %s, wyuczone: %s"
|
||||
@@ -150,7 +150,7 @@ msgstr "Włącz odblokowywanie twarzą"
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr "Wyłącz je (twarze zostają zachowane)"
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr "Dodaj twarz"
|
||||
|
||||
@@ -167,22 +167,26 @@ msgid "Look at the camera and see what it sees"
|
||||
msgstr "Spójrz w kamerę i zobacz, co widzi"
|
||||
|
||||
#: src/face-unlock:200
|
||||
msgid "Lock the screen"
|
||||
msgstr "Zablokuj ekran"
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show what is on"
|
||||
msgstr "Pokaż, co jest włączone"
|
||||
|
||||
#: src/face-unlock:201
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr "Pokaż tę pomoc"
|
||||
|
||||
#: src/face-unlock:202
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr "Pokaż wersję"
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr "Bez polecenia wyświetla się interaktywne menu."
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
@@ -190,42 +194,42 @@ msgstr ""
|
||||
"Uruchom to jako swój użytkownik, nie jako root. Hasło zostanie zapytane, gdy "
|
||||
"będzie potrzebne."
|
||||
|
||||
#: src/face-unlock:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr "Nieznane polecenie: %s"
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr "nigdy"
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr "przed chwilą"
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr "1 minutę temu"
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "%d min temu"
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr "1 godzinę temu"
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr "%d godz. temu"
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr "1 dzień temu"
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr "%d dni temu"
|
||||
@@ -369,11 +373,11 @@ msgstr ""
|
||||
msgid "[y/N]"
|
||||
msgstr "[t/N]"
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr "WŁ."
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr "WYŁ."
|
||||
|
||||
@@ -414,7 +418,7 @@ msgstr "wolna"
|
||||
msgid "%s seconds"
|
||||
msgstr "%s s"
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr "automatyczna"
|
||||
|
||||
@@ -434,8 +438,8 @@ msgstr "nie działa"
|
||||
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:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr "Twarze"
|
||||
|
||||
@@ -492,7 +496,7 @@ msgstr "Ostatnie odblokowanie"
|
||||
msgid "The lock screen agent is not running."
|
||||
msgstr "Agent ekranu blokady nie działa."
|
||||
|
||||
#: src/lib/menu.sh:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
@@ -500,15 +504,17 @@ msgstr ""
|
||||
"W GNOME dymek pokazuje małe rozszerzenie GNOME. Włączenie odblokowywania "
|
||||
"twarzą włącza też je."
|
||||
|
||||
#: src/lib/menu.sh:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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 ""
|
||||
"Skanuje, gdy wracasz do hyprlock lub swaylock, i je otwiera. Każdy inny "
|
||||
"ekran blokady skanuje po naciśnięciu Enter w pustym polu hasła."
|
||||
"Skanuje, gdy wracasz do hyprlock, swaylock lub własnego ekranu blokady face-"
|
||||
"unlock (`face-unlock lock`, z dymkiem), i je otwiera. Inne ekrany blokady "
|
||||
"skanują po Enter."
|
||||
|
||||
#: src/lib/menu.sh:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
@@ -516,7 +522,7 @@ msgstr ""
|
||||
"Odblokowuje ekran blokady, gdy widzi twoją twarz. Wyłączone: działa tam "
|
||||
"tylko hasło."
|
||||
|
||||
#: src/lib/menu.sh:324
|
||||
#: src/lib/menu.sh:328
|
||||
msgid ""
|
||||
"Scans when you press a key or move the mouse on the lock screen, and when "
|
||||
"the computer wakes up."
|
||||
@@ -524,7 +530,7 @@ msgstr ""
|
||||
"Skanuje, gdy naciśniesz klawisz lub poruszysz myszą na ekranie blokady, oraz "
|
||||
"gdy komputer się wybudzi."
|
||||
|
||||
#: src/lib/menu.sh:325
|
||||
#: src/lib/menu.sh:329
|
||||
msgid ""
|
||||
"Scans as soon as the screen locks. Off by default: if you lock it yourself, "
|
||||
"it would unlock again right away."
|
||||
@@ -532,7 +538,7 @@ msgstr ""
|
||||
"Skanuje od razu po zablokowaniu ekranu. Domyślnie wyłączone: gdy zablokujesz "
|
||||
"sam, od razu by się odblokował."
|
||||
|
||||
#: src/lib/menu.sh:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
@@ -540,7 +546,21 @@ msgstr ""
|
||||
"sudo przyjmuje twarz zamiast hasła. Gdy nie pasuje, wpisujesz hasło jak "
|
||||
"zwykle."
|
||||
|
||||
#: src/lib/menu.sh:327
|
||||
#: src/lib/menu.sh:331
|
||||
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 ""
|
||||
"Obraz za ekranem blokady face-unlock (`face-unlock lock`). Puste: ten z "
|
||||
"pulpitu. Albo plik, folder, z którego losowany jest obraz, albo `none`. "
|
||||
"Enter, aby wpisać."
|
||||
|
||||
#: src/lib/menu.sh:332
|
||||
msgid "Blurs the picture behind face-unlock's own lock screen."
|
||||
msgstr "Rozmywa obraz za ekranem blokady face-unlock."
|
||||
|
||||
#: src/lib/menu.sh:333
|
||||
#, sh-printf-format
|
||||
msgid ""
|
||||
"The lock screen takes your face in its password check. Press Enter on the "
|
||||
@@ -549,7 +569,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:328
|
||||
#: src/lib/menu.sh:334
|
||||
msgid ""
|
||||
"The password windows of your desktop and apps, for example when you install "
|
||||
"software. No match: you type the password."
|
||||
@@ -557,18 +577,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:329
|
||||
#: src/lib/menu.sh:335
|
||||
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:330
|
||||
#: src/lib/menu.sh:336
|
||||
msgid "No check at all. Only for trying out a camera."
|
||||
msgstr "Bez żadnej kontroli. Tylko do wypróbowania kamery."
|
||||
|
||||
#: src/lib/menu.sh:331
|
||||
#: src/lib/menu.sh:337
|
||||
msgid ""
|
||||
"Stops photos on a phone, a tablet or glossy paper. You do not have to blink. "
|
||||
"A matte printed photo can get through."
|
||||
@@ -576,22 +596,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:332
|
||||
#: src/lib/menu.sh:338
|
||||
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:333
|
||||
#: src/lib/menu.sh:339
|
||||
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:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr "Domyślna. Pasuje większości osób."
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
msgid ""
|
||||
"Your eyes have to be open and on the screen. So it does not unlock while you "
|
||||
"look away or sleep."
|
||||
@@ -599,7 +619,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:336
|
||||
#: src/lib/menu.sh:342
|
||||
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)."
|
||||
@@ -608,11 +628,11 @@ msgstr ""
|
||||
"nowa. Kamera na podczerwień potrzebuje włączonego światła (linux-enable-ir-"
|
||||
"emitter)."
|
||||
|
||||
#: src/lib/menu.sh:337
|
||||
#: src/lib/menu.sh:343
|
||||
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:338
|
||||
#: src/lib/menu.sh:344
|
||||
msgid ""
|
||||
"After a sure match it keeps how you look now. So a new haircut or glasses "
|
||||
"need no new setup."
|
||||
@@ -620,7 +640,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:339
|
||||
#: src/lib/menu.sh:345
|
||||
msgid ""
|
||||
"No scan while the laptop is closed, for example at a desk with an external "
|
||||
"screen."
|
||||
@@ -628,81 +648,98 @@ msgstr ""
|
||||
"Bez skanowania, gdy laptop jest zamknięty, na przykład przy biurku z "
|
||||
"zewnętrznym ekranem."
|
||||
|
||||
#: src/lib/menu.sh:340
|
||||
#: src/lib/menu.sh:346
|
||||
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:341
|
||||
#: src/lib/menu.sh:347
|
||||
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:342
|
||||
#: src/lib/menu.sh:348
|
||||
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:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr "Jak szybko porusza się dymek."
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
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:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr "automatyczna (%s)"
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr "(podczerwień)"
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr "(niepodłączona)"
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr "jak na pulpicie"
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr "brak"
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr "Obraz lub folder:"
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr "Nie znaleziono: %s"
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr "Ustawienia"
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr "↑↓ wybierz ←→ lub Spacja: zmień q: wstecz"
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
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:626
|
||||
#: src/lib/menu.sh:662
|
||||
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:627
|
||||
#: src/lib/menu.sh:663
|
||||
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:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr "Nowa nazwa:"
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr "Usunąć „%s”?"
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr "Włącz lub wyłącz odblokowywanie twarzą"
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr "Wypróbuj"
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr "Zakończ"
|
||||
|
||||
@@ -759,6 +796,14 @@ msgstr "Skanuj, gdy wracasz"
|
||||
msgid "Scan right after locking"
|
||||
msgstr "Skanuj zaraz po zablokowaniu"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr "Tapeta"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr "Rozmyj tapetę"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr "Okna haseł"
|
||||
@@ -917,23 +962,31 @@ 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/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr "Złe hasło"
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
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:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr "Skonfiguruj twarz."
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr "Jak nazwać nową twarz."
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr "Zablokuj ekran."
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr "Odtwórz raz animacje dymka."
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr "Styl dymka w demo: full lub minimal."
|
||||
|
||||
@@ -1014,3 +1067,15 @@ msgstr "Zaczynamy"
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr "Gotowe"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr "Hasło"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
msgid "Look at the camera or type your password"
|
||||
msgstr "Spójrz w kamerę albo wpisz hasło"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:186
|
||||
msgid "Type your password"
|
||||
msgstr "Wpisz hasło"
|
||||
+136
-72
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: 2026-09-24 12:00+0200\n"
|
||||
"Last-Translator: Felitendo\n"
|
||||
"Language-Team: Brazilian Portuguese\n"
|
||||
@@ -58,8 +58,8 @@ 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:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr "Não foi possível salvar a configuração."
|
||||
|
||||
@@ -111,16 +111,16 @@ msgstr ""
|
||||
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:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr "ativado"
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr "desativado"
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr "%s amostras, %s aprendidas"
|
||||
@@ -150,7 +150,7 @@ msgstr "Ativar o desbloqueio facial"
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr "Desativar (os rostos são mantidos)"
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr "Adicionar um rosto"
|
||||
|
||||
@@ -167,22 +167,26 @@ 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
|
||||
msgid "Lock the screen"
|
||||
msgstr "Bloquear a tela"
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show what is on"
|
||||
msgstr "Mostrar o que está ativado"
|
||||
|
||||
#: src/face-unlock:201
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr "Mostrar esta ajuda"
|
||||
|
||||
#: src/face-unlock:202
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr "Mostrar a versão"
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr "Sem comando, um menu interativo é exibido."
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
@@ -190,42 +194,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:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr "Comando desconhecido: %s"
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr "nunca"
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr "agora mesmo"
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr "há 1 minuto"
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "há %d minutos"
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr "há 1 hora"
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr "há %d horas"
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr "há 1 dia"
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr "há %d dias"
|
||||
@@ -369,11 +373,11 @@ msgstr ""
|
||||
msgid "[y/N]"
|
||||
msgstr "[s/N]"
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr "ATIVADO"
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr "DESATIVADO"
|
||||
|
||||
@@ -414,7 +418,7 @@ msgstr "lenta"
|
||||
msgid "%s seconds"
|
||||
msgstr "%s segundos"
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr "automática"
|
||||
|
||||
@@ -434,8 +438,8 @@ msgstr "parado"
|
||||
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:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr "Rostos"
|
||||
|
||||
@@ -492,7 +496,7 @@ msgstr "Último desbloqueio"
|
||||
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:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
@@ -500,16 +504,17 @@ msgstr ""
|
||||
"No GNOME, uma pequena extensão do GNOME mostra a bolha. Ativar o desbloqueio "
|
||||
"facial também a ativa."
|
||||
|
||||
#: src/lib/menu.sh:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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 ""
|
||||
"Escaneia quando você volta ao hyprlock ou swaylock e os abre. Qualquer outra "
|
||||
"tela de bloqueio escaneia quando você pressiona Enter no campo de senha "
|
||||
"vazio."
|
||||
"Escaneia quando você volta ao hyprlock, swaylock ou à tela de bloqueio do "
|
||||
"face-unlock (`face-unlock lock`, com a bolha) e os abre. As outras telas de "
|
||||
"bloqueio escaneiam com Enter."
|
||||
|
||||
#: src/lib/menu.sh:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
@@ -517,7 +522,7 @@ msgstr ""
|
||||
"Desbloqueia a tela de bloqueio quando vê o seu rosto. Desativado: lá só a "
|
||||
"sua senha funciona."
|
||||
|
||||
#: src/lib/menu.sh:324
|
||||
#: src/lib/menu.sh:328
|
||||
msgid ""
|
||||
"Scans when you press a key or move the mouse on the lock screen, and when "
|
||||
"the computer wakes up."
|
||||
@@ -525,7 +530,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:325
|
||||
#: src/lib/menu.sh:329
|
||||
msgid ""
|
||||
"Scans as soon as the screen locks. Off by default: if you lock it yourself, "
|
||||
"it would unlock again right away."
|
||||
@@ -533,7 +538,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:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
@@ -541,7 +546,21 @@ 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:327
|
||||
#: src/lib/menu.sh:331
|
||||
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 ""
|
||||
"A imagem atrás da tela de bloqueio do face-unlock (`face-unlock lock`). "
|
||||
"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
|
||||
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
|
||||
#, sh-printf-format
|
||||
msgid ""
|
||||
"The lock screen takes your face in its password check. Press Enter on the "
|
||||
@@ -550,7 +569,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:328
|
||||
#: src/lib/menu.sh:334
|
||||
msgid ""
|
||||
"The password windows of your desktop and apps, for example when you install "
|
||||
"software. No match: you type the password."
|
||||
@@ -558,18 +577,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:329
|
||||
#: src/lib/menu.sh:335
|
||||
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:330
|
||||
#: src/lib/menu.sh:336
|
||||
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:331
|
||||
#: src/lib/menu.sh:337
|
||||
msgid ""
|
||||
"Stops photos on a phone, a tablet or glossy paper. You do not have to blink. "
|
||||
"A matte printed photo can get through."
|
||||
@@ -577,23 +596,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:332
|
||||
#: src/lib/menu.sh:338
|
||||
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:333
|
||||
#: src/lib/menu.sh:339
|
||||
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:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr "O padrão. Serve para a maioria das pessoas."
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
msgid ""
|
||||
"Your eyes have to be open and on the screen. So it does not unlock while you "
|
||||
"look away or sleep."
|
||||
@@ -601,7 +620,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:336
|
||||
#: src/lib/menu.sh:342
|
||||
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)."
|
||||
@@ -610,11 +629,11 @@ msgstr ""
|
||||
"rosto de novo. Uma câmera infravermelha precisa da luz ligada (linux-enable-"
|
||||
"ir-emitter)."
|
||||
|
||||
#: src/lib/menu.sh:337
|
||||
#: src/lib/menu.sh:343
|
||||
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:338
|
||||
#: src/lib/menu.sh:344
|
||||
msgid ""
|
||||
"After a sure match it keeps how you look now. So a new haircut or glasses "
|
||||
"need no new setup."
|
||||
@@ -622,7 +641,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:339
|
||||
#: src/lib/menu.sh:345
|
||||
msgid ""
|
||||
"No scan while the laptop is closed, for example at a desk with an external "
|
||||
"screen."
|
||||
@@ -630,82 +649,99 @@ msgstr ""
|
||||
"Nenhuma leitura com o notebook fechado, por exemplo numa mesa com uma tela "
|
||||
"externa."
|
||||
|
||||
#: src/lib/menu.sh:340
|
||||
#: src/lib/menu.sh:346
|
||||
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:341
|
||||
#: src/lib/menu.sh:347
|
||||
msgid "A small pill with a lock that opens."
|
||||
msgstr "Uma pequena pílula com um cadeado que se abre."
|
||||
|
||||
#: src/lib/menu.sh:342
|
||||
#: src/lib/menu.sh:348
|
||||
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:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr "A velocidade com que a bolha se move."
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
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:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr "automática (%s)"
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr "(infravermelha)"
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr "(não conectada)"
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr "igual à área de trabalho"
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr "nenhum"
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr "Imagem ou pasta:"
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr "Não encontrado: %s"
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr "Configurações"
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr "↑↓ escolher ←→ ou Espaço: mudar q: voltar"
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
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:626
|
||||
#: src/lib/menu.sh:662
|
||||
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:627
|
||||
#: src/lib/menu.sh:663
|
||||
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:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr "Novo nome:"
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr "Apagar \"%s\"?"
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr "Ativar ou desativar o desbloqueio facial"
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr "Testar"
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr "Sair"
|
||||
|
||||
@@ -765,6 +801,14 @@ msgstr "Ler quando você voltar"
|
||||
msgid "Scan right after locking"
|
||||
msgstr "Ler logo após bloquear"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr "Papel de parede"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr "Desfocar o papel de parede"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr "Pedidos de senha"
|
||||
@@ -924,25 +968,33 @@ 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/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr "Senha incorreta"
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
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:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr "Configurar um rosto."
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr "Como chamar o novo rosto."
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr "Bloquear a tela."
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr "Reproduzir as animações da bolha uma vez."
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr "Estilo da bolha para a demonstração: full ou minimal."
|
||||
|
||||
@@ -1022,3 +1074,15 @@ msgstr "Começar"
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr "Concluído"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr "Senha"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
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
|
||||
msgid "Type your password"
|
||||
msgstr "Digite sua senha"
|
||||
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: 2026-09-24 12:00+0200\n"
|
||||
"Last-Translator: Felitendo\n"
|
||||
"Language-Team: Russian\n"
|
||||
@@ -59,8 +59,8 @@ msgstr "Лицо не добавлено."
|
||||
msgid "First, set up your face."
|
||||
msgstr "Сначала настройте своё лицо."
|
||||
|
||||
#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr "Не удалось сохранить настройку."
|
||||
|
||||
@@ -111,16 +111,16 @@ msgstr ""
|
||||
msgid "No face is set up yet."
|
||||
msgstr "Ещё не настроено ни одного лица."
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr "вкл."
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr "выкл."
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr "образцов: %s, выучено: %s"
|
||||
@@ -150,7 +150,7 @@ msgstr "Включить разблокировку по лицу"
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr "Выключить её (лица сохраняются)"
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr "Добавить лицо"
|
||||
|
||||
@@ -167,22 +167,26 @@ msgid "Look at the camera and see what it sees"
|
||||
msgstr "Посмотреть в камеру и увидеть, что она видит"
|
||||
|
||||
#: src/face-unlock:200
|
||||
msgid "Lock the screen"
|
||||
msgstr "Заблокировать экран"
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show what is on"
|
||||
msgstr "Показать, что включено"
|
||||
|
||||
#: src/face-unlock:201
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr "Показать эту справку"
|
||||
|
||||
#: src/face-unlock:202
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr "Показать версию"
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr "Без команды открывается интерактивное меню."
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
@@ -190,42 +194,42 @@ msgstr ""
|
||||
"Запускайте это от своего пользователя, не от root. Пароль будет запрошен, "
|
||||
"когда он понадобится."
|
||||
|
||||
#: src/face-unlock:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr "Неизвестная команда: %s"
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr "никогда"
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr "только что"
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr "1 минуту назад"
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "%d мин назад"
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr "1 час назад"
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr "%d ч назад"
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr "1 день назад"
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr "%d дн. назад"
|
||||
@@ -369,11 +373,11 @@ msgstr ""
|
||||
msgid "[y/N]"
|
||||
msgstr "[д/Н]"
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr "ВКЛ"
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr "ВЫКЛ"
|
||||
|
||||
@@ -414,7 +418,7 @@ msgstr "медленная"
|
||||
msgid "%s seconds"
|
||||
msgstr "%s с"
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr "автоматически"
|
||||
|
||||
@@ -434,8 +438,8 @@ msgstr "не запущена"
|
||||
msgid "Turning face unlock on again starts it."
|
||||
msgstr "Повторное включение разблокировки по лицу запустит её."
|
||||
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr "Лица"
|
||||
|
||||
@@ -492,7 +496,7 @@ msgstr "Последняя разблокировка"
|
||||
msgid "The lock screen agent is not running."
|
||||
msgstr "Агент экрана блокировки не запущен."
|
||||
|
||||
#: src/lib/menu.sh:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
@@ -500,16 +504,17 @@ msgstr ""
|
||||
"В GNOME пузырь показывает небольшое расширение GNOME. Оно включается вместе "
|
||||
"с разблокировкой по лицу."
|
||||
|
||||
#: src/lib/menu.sh:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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 ""
|
||||
"Сканирует, когда вы возвращаетесь к hyprlock или swaylock, и открывает их. "
|
||||
"Любой другой экран блокировки сканирует, когда вы нажимаете Enter в пустом "
|
||||
"поле пароля."
|
||||
"Сканирует, когда вы возвращаетесь к hyprlock, swaylock или к экрану "
|
||||
"блокировки face-unlock (`face-unlock lock`, с пузырём), и открывает их. "
|
||||
"Другие экраны блокировки сканируют по Enter."
|
||||
|
||||
#: src/lib/menu.sh:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
@@ -517,7 +522,7 @@ msgstr ""
|
||||
"Снимает блокировку экрана, когда видит ваше лицо. Выкл.: там работает только "
|
||||
"пароль."
|
||||
|
||||
#: src/lib/menu.sh:324
|
||||
#: src/lib/menu.sh:328
|
||||
msgid ""
|
||||
"Scans when you press a key or move the mouse on the lock screen, and when "
|
||||
"the computer wakes up."
|
||||
@@ -525,7 +530,7 @@ msgstr ""
|
||||
"Сканирует, когда вы нажимаете клавишу или двигаете мышь на экране "
|
||||
"блокировки, и когда компьютер просыпается."
|
||||
|
||||
#: src/lib/menu.sh:325
|
||||
#: src/lib/menu.sh:329
|
||||
msgid ""
|
||||
"Scans as soon as the screen locks. Off by default: if you lock it yourself, "
|
||||
"it would unlock again right away."
|
||||
@@ -533,7 +538,7 @@ msgstr ""
|
||||
"Сканирует сразу после блокировки экрана. По умолчанию выкл.: если вы "
|
||||
"блокируете сами, он тут же разблокировался бы."
|
||||
|
||||
#: src/lib/menu.sh:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
@@ -541,7 +546,21 @@ msgstr ""
|
||||
"sudo принимает ваше лицо вместо пароля. Не совпало: вы вводите пароль как "
|
||||
"обычно."
|
||||
|
||||
#: src/lib/menu.sh:327
|
||||
#: src/lib/menu.sh:331
|
||||
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 ""
|
||||
"Картинка за экраном блокировки face-unlock (`face-unlock lock`). Пусто: та, "
|
||||
"что на рабочем столе. Или файл, папка, из которой берётся случайная, или "
|
||||
"`none`. Нажмите Enter, чтобы ввести."
|
||||
|
||||
#: src/lib/menu.sh:332
|
||||
msgid "Blurs the picture behind face-unlock's own lock screen."
|
||||
msgstr "Размывает картинку за экраном блокировки face-unlock."
|
||||
|
||||
#: src/lib/menu.sh:333
|
||||
#, sh-printf-format
|
||||
msgid ""
|
||||
"The lock screen takes your face in its password check. Press Enter on the "
|
||||
@@ -550,7 +569,7 @@ msgstr ""
|
||||
"Экран блокировки принимает ваше лицо при проверке пароля. Нажмите Enter в "
|
||||
"пустом поле, чтобы сканировать. Найдено здесь: %s."
|
||||
|
||||
#: src/lib/menu.sh:328
|
||||
#: src/lib/menu.sh:334
|
||||
msgid ""
|
||||
"The password windows of your desktop and apps, for example when you install "
|
||||
"software. No match: you type the password."
|
||||
@@ -558,18 +577,18 @@ msgstr ""
|
||||
"Окна ввода пароля рабочего стола и приложений, например при установке "
|
||||
"программ. Не совпало: вы вводите пароль."
|
||||
|
||||
#: src/lib/menu.sh:329
|
||||
#: src/lib/menu.sh:335
|
||||
msgid ""
|
||||
"You have to blink or turn your head a little. This also stops printed photos."
|
||||
msgstr ""
|
||||
"Нужно моргнуть или слегка повернуть голову. Это также останавливает "
|
||||
"распечатанные фото."
|
||||
|
||||
#: src/lib/menu.sh:330
|
||||
#: src/lib/menu.sh:336
|
||||
msgid "No check at all. Only for trying out a camera."
|
||||
msgstr "Никакой проверки. Только чтобы опробовать камеру."
|
||||
|
||||
#: src/lib/menu.sh:331
|
||||
#: src/lib/menu.sh:337
|
||||
msgid ""
|
||||
"Stops photos on a phone, a tablet or glossy paper. You do not have to blink. "
|
||||
"A matte printed photo can get through."
|
||||
@@ -577,22 +596,22 @@ msgstr ""
|
||||
"Останавливает фото на телефоне, планшете или глянцевой бумаге. Моргать не "
|
||||
"нужно. Матовое распечатанное фото может пройти."
|
||||
|
||||
#: src/lib/menu.sh:332
|
||||
#: src/lib/menu.sh:338
|
||||
msgid ""
|
||||
"Fewer wrong matches, but it may not know you with glasses or in bad light."
|
||||
msgstr ""
|
||||
"Меньше ошибочных совпадений, но может не узнать вас в очках или при плохом "
|
||||
"свете."
|
||||
|
||||
#: src/lib/menu.sh:333
|
||||
#: src/lib/menu.sh:339
|
||||
msgid "Knows you more easily, but also somebody who looks a lot like you."
|
||||
msgstr "Узнаёт вас легче, но и того, кто очень на вас похож."
|
||||
|
||||
#: src/lib/menu.sh:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr "По умолчанию. Подходит большинству."
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
msgid ""
|
||||
"Your eyes have to be open and on the screen. So it does not unlock while you "
|
||||
"look away or sleep."
|
||||
@@ -600,7 +619,7 @@ msgstr ""
|
||||
"Ваши глаза должны быть открыты и смотреть на экран. Так он не "
|
||||
"разблокируется, пока вы смотрите в сторону или спите."
|
||||
|
||||
#: src/lib/menu.sh:336
|
||||
#: src/lib/menu.sh:342
|
||||
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)."
|
||||
@@ -609,11 +628,11 @@ msgstr ""
|
||||
"заново. Инфракрасной камере нужна включённая подсветка (linux-enable-ir-"
|
||||
"emitter)."
|
||||
|
||||
#: src/lib/menu.sh:337
|
||||
#: src/lib/menu.sh:343
|
||||
msgid "How long the camera looks for your face before it gives up."
|
||||
msgstr "Как долго камера ищет ваше лицо, прежде чем сдаться."
|
||||
|
||||
#: src/lib/menu.sh:338
|
||||
#: src/lib/menu.sh:344
|
||||
msgid ""
|
||||
"After a sure match it keeps how you look now. So a new haircut or glasses "
|
||||
"need no new setup."
|
||||
@@ -621,7 +640,7 @@ msgstr ""
|
||||
"После уверенного совпадения запоминает, как вы выглядите сейчас. Новая "
|
||||
"стрижка или очки не требуют новой настройки."
|
||||
|
||||
#: src/lib/menu.sh:339
|
||||
#: src/lib/menu.sh:345
|
||||
msgid ""
|
||||
"No scan while the laptop is closed, for example at a desk with an external "
|
||||
"screen."
|
||||
@@ -629,82 +648,99 @@ msgstr ""
|
||||
"Без сканирования, когда ноутбук закрыт, например за столом с внешним "
|
||||
"монитором."
|
||||
|
||||
#: src/lib/menu.sh:340
|
||||
#: src/lib/menu.sh:346
|
||||
msgid "The bubble at the top of the screen shows what the camera is doing."
|
||||
msgstr "Пузырь вверху экрана показывает, что делает камера."
|
||||
|
||||
#: src/lib/menu.sh:341
|
||||
#: src/lib/menu.sh:347
|
||||
msgid "A small pill with a lock that opens."
|
||||
msgstr "Маленькая таблетка с замком, который открывается."
|
||||
|
||||
#: src/lib/menu.sh:342
|
||||
#: src/lib/menu.sh:348
|
||||
msgid "An island with a face that looks around, then rings and a tick."
|
||||
msgstr "Остров с лицом, которое оглядывается, затем кольца и галочка."
|
||||
|
||||
#: src/lib/menu.sh:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr "Как быстро движется пузырь."
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
msgid "Shows the bubble when sudo or an admin prompt scans your face, too."
|
||||
msgstr ""
|
||||
"Показывает пузырь и тогда, когда sudo или запрос администратора сканирует "
|
||||
"ваше лицо."
|
||||
|
||||
#: src/lib/menu.sh:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr "автоматически (%s)"
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr "(инфракрасная)"
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr "(не подключена)"
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr "как на рабочем столе"
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr "нет"
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr "Картинка или папка:"
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr "Не найдено: %s"
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr "Настройки"
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr "↑↓ выбор ←→ или Пробел: изменить q: назад"
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
msgid "for all users, asks for your password"
|
||||
msgstr "для всех пользователей, запрашивает пароль"
|
||||
|
||||
#. TRANSLATORS: keep the letters, they are the keys.
|
||||
#: src/lib/menu.sh:626
|
||||
#: src/lib/menu.sh:662
|
||||
msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back"
|
||||
msgstr ""
|
||||
"Вверх/Вниз: выбор, Пробел: вкл./выкл., r: переименовать, d: удалить, a: "
|
||||
"добавить, q: назад"
|
||||
|
||||
#: src/lib/menu.sh:627
|
||||
#: src/lib/menu.sh:663
|
||||
msgid "No face is set up yet. Press a to add one."
|
||||
msgstr "Ещё не настроено ни одного лица. Нажмите a, чтобы добавить."
|
||||
|
||||
#: src/lib/menu.sh:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr "Новое имя:"
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr "Удалить «%s»?"
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr "Включить или выключить разблокировку по лицу"
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr "Попробовать"
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr "Выход"
|
||||
|
||||
@@ -762,6 +798,14 @@ msgstr "Сканировать при возвращении"
|
||||
msgid "Scan right after locking"
|
||||
msgstr "Сканировать сразу после блокировки"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr "Обои"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr "Размыть обои"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr "Запросы пароля"
|
||||
@@ -921,24 +965,32 @@ msgstr "Камера занята другим сканированием. По
|
||||
msgid "The face could not be added (%1)."
|
||||
msgstr "Не удалось добавить лицо (%1)."
|
||||
|
||||
#: src/agent/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr "Неверный пароль"
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
msgid "Face unlock for the lock screen, sudo and admin prompts"
|
||||
msgstr ""
|
||||
"Разблокировка по лицу для экрана блокировки, sudo и запросов администратора"
|
||||
|
||||
#: src/agent/main.cpp:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr "Настроить лицо."
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr "Как назвать новое лицо."
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr "Заблокировать экран."
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr "Один раз проиграть анимации пузыря."
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr "Стиль пузыря для демо: full или minimal."
|
||||
|
||||
@@ -1020,3 +1072,15 @@ msgstr "Начать"
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr "Готово"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr "Пароль"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
msgid "Look at the camera or type your password"
|
||||
msgstr "Посмотрите в камеру или введите пароль"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:186
|
||||
msgid "Type your password"
|
||||
msgstr "Введите пароль"
|
||||
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: 2026-09-24 12:00+0200\n"
|
||||
"Last-Translator: Felitendo\n"
|
||||
"Language-Team: Turkish\n"
|
||||
@@ -57,8 +57,8 @@ 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:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr "Ayar kaydedilemedi."
|
||||
|
||||
@@ -107,16 +107,16 @@ msgstr ""
|
||||
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:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr "açık"
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr "kapalı"
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr "%s örnek, %s öğrenilen"
|
||||
@@ -146,7 +146,7 @@ msgstr "Yüzle kilit açmayı aç"
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr "Kapat (yüzler saklanır)"
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr "Yüz ekle"
|
||||
|
||||
@@ -163,22 +163,26 @@ 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
|
||||
msgid "Lock the screen"
|
||||
msgstr "Ekranı kilitle"
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show what is on"
|
||||
msgstr "Neyin açık olduğunu göster"
|
||||
|
||||
#: src/face-unlock:201
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr "Bu yardımı göster"
|
||||
|
||||
#: src/face-unlock:202
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr "Sürümü göster"
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr "Komut verilmezse etkileşimli bir menü gösterilir."
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
@@ -186,42 +190,42 @@ msgstr ""
|
||||
"Bunu root olarak değil, kendi kullanıcınızla çalıştırın. Gerektiğinde "
|
||||
"parolanızı sorar."
|
||||
|
||||
#: src/face-unlock:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr "Bilinmeyen komut: %s"
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr "hiçbir zaman"
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr "az önce"
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr "1 dakika önce"
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "%d dakika önce"
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr "1 saat önce"
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr "%d saat önce"
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr "1 gün önce"
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr "%d gün önce"
|
||||
@@ -365,11 +369,11 @@ msgstr ""
|
||||
msgid "[y/N]"
|
||||
msgstr "[e/H]"
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr "AÇIK"
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr "KAPALI"
|
||||
|
||||
@@ -410,7 +414,7 @@ msgstr "yavaş"
|
||||
msgid "%s seconds"
|
||||
msgstr "%s saniye"
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr "otomatik"
|
||||
|
||||
@@ -430,8 +434,8 @@ msgstr "çalışmıyor"
|
||||
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:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr "Yüzler"
|
||||
|
||||
@@ -488,7 +492,7 @@ msgstr "Son kilit açma"
|
||||
msgid "The lock screen agent is not running."
|
||||
msgstr "Kilit ekranı aracısı çalışmıyor."
|
||||
|
||||
#: src/lib/menu.sh:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
@@ -496,15 +500,17 @@ 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:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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 ""
|
||||
"hyprlock'a ya da swaylock'a döndüğünüzde tarar ve onları açar. Diğer kilit "
|
||||
"ekranları boş parola alanında Enter'a bastığınızda tarar."
|
||||
"hyprlock'a, swaylock'a ya da face-unlock'un kendi kilit ekranına (`face-"
|
||||
"unlock lock`, baloncukla) döndüğünüzde tarar ve onları açar. Diğer kilit "
|
||||
"ekranları Enter ile tarar."
|
||||
|
||||
#: src/lib/menu.sh:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
@@ -512,7 +518,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:324
|
||||
#: src/lib/menu.sh:328
|
||||
msgid ""
|
||||
"Scans when you press a key or move the mouse on the lock screen, and when "
|
||||
"the computer wakes up."
|
||||
@@ -520,7 +526,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:325
|
||||
#: src/lib/menu.sh:329
|
||||
msgid ""
|
||||
"Scans as soon as the screen locks. Off by default: if you lock it yourself, "
|
||||
"it would unlock again right away."
|
||||
@@ -528,7 +534,7 @@ msgstr ""
|
||||
"Ekran kilitlenir kilitlenmez tarar. Varsayılan olarak kapalı: kendiniz "
|
||||
"kilitlerseniz hemen yeniden açılırdı."
|
||||
|
||||
#: src/lib/menu.sh:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
@@ -536,7 +542,21 @@ msgstr ""
|
||||
"sudo parola yerine yüzünüzü kullanır. Eşleşmezse parolayı her zamanki gibi "
|
||||
"yazarsınız."
|
||||
|
||||
#: src/lib/menu.sh:327
|
||||
#: src/lib/menu.sh:331
|
||||
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 ""
|
||||
"face-unlock kilit ekranının (`face-unlock lock`) arkasındaki resim. Boş: "
|
||||
"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
|
||||
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
|
||||
#, sh-printf-format
|
||||
msgid ""
|
||||
"The lock screen takes your face in its password check. Press Enter on the "
|
||||
@@ -545,7 +565,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:328
|
||||
#: src/lib/menu.sh:334
|
||||
msgid ""
|
||||
"The password windows of your desktop and apps, for example when you install "
|
||||
"software. No match: you type the password."
|
||||
@@ -553,18 +573,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:329
|
||||
#: src/lib/menu.sh:335
|
||||
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:330
|
||||
#: src/lib/menu.sh:336
|
||||
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:331
|
||||
#: src/lib/menu.sh:337
|
||||
msgid ""
|
||||
"Stops photos on a phone, a tablet or glossy paper. You do not have to blink. "
|
||||
"A matte printed photo can get through."
|
||||
@@ -572,21 +592,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:332
|
||||
#: src/lib/menu.sh:338
|
||||
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:333
|
||||
#: src/lib/menu.sh:339
|
||||
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:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr "Varsayılan. Çoğu kişi için uygun."
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
msgid ""
|
||||
"Your eyes have to be open and on the screen. So it does not unlock while you "
|
||||
"look away or sleep."
|
||||
@@ -594,7 +614,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:336
|
||||
#: src/lib/menu.sh:342
|
||||
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)."
|
||||
@@ -603,11 +623,11 @@ msgstr ""
|
||||
"kurun. Kızılötesi kameranın ışığının açık olması gerekir (linux-enable-ir-"
|
||||
"emitter)."
|
||||
|
||||
#: src/lib/menu.sh:337
|
||||
#: src/lib/menu.sh:343
|
||||
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:338
|
||||
#: src/lib/menu.sh:344
|
||||
msgid ""
|
||||
"After a sure match it keeps how you look now. So a new haircut or glasses "
|
||||
"need no new setup."
|
||||
@@ -615,88 +635,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:339
|
||||
#: src/lib/menu.sh:345
|
||||
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:340
|
||||
#: src/lib/menu.sh:346
|
||||
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:341
|
||||
#: src/lib/menu.sh:347
|
||||
msgid "A small pill with a lock that opens."
|
||||
msgstr "Açılan bir kilidi olan küçük bir hap."
|
||||
|
||||
#: src/lib/menu.sh:342
|
||||
#: src/lib/menu.sh:348
|
||||
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:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr "Baloncuğun ne kadar hızlı hareket ettiği."
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
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:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr "otomatik (%s)"
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr "(kızılötesi)"
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr "(bağlı değil)"
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr "masaüstüyle aynı"
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr "yok"
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr "Resim ya da klasör:"
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr "Bulunamadı: %s"
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr "Ayarlar"
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr "↑↓ seç ←→ ya da Boşluk: değiştir q: geri"
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
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:626
|
||||
#: src/lib/menu.sh:662
|
||||
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:627
|
||||
#: src/lib/menu.sh:663
|
||||
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:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr "Yeni ad:"
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr "\"%s\" silinsin mi?"
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr "Yüzle kilit açmayı aç ya da kapat"
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr "Dene"
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr "Çık"
|
||||
|
||||
@@ -756,6 +793,14 @@ msgstr "Geri döndüğünüzde tara"
|
||||
msgid "Scan right after locking"
|
||||
msgstr "Kilitledikten hemen sonra tara"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr "Duvar kâğıdı"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr "Duvar kâğıdını bulanıklaştır"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr "Parola istemleri"
|
||||
@@ -912,23 +957,31 @@ 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/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr "Yanlış parola"
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
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:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr "Bir yüz kur."
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr "Yeni yüzün adı."
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr "Ekranı kilitle."
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr "Baloncuğun animasyonlarını bir kez oynat."
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr "Demo için baloncuk stili: full ya da minimal."
|
||||
|
||||
@@ -1009,3 +1062,15 @@ msgstr "Başlayalım"
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr "Bitti"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr "Parola"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
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
|
||||
msgid "Type your password"
|
||||
msgstr "Parolanızı yazın"
|
||||
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: 2026-09-24 12:00+0200\n"
|
||||
"Last-Translator: Felitendo\n"
|
||||
"Language-Team: Ukrainian\n"
|
||||
@@ -59,8 +59,8 @@ msgstr "Обличчя не додано."
|
||||
msgid "First, set up your face."
|
||||
msgstr "Спершу налаштуйте своє обличчя."
|
||||
|
||||
#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr "Не вдалося зберегти налаштування."
|
||||
|
||||
@@ -112,16 +112,16 @@ msgstr ""
|
||||
msgid "No face is set up yet."
|
||||
msgstr "Ще не налаштовано жодного обличчя."
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr "увімк."
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr "вимк."
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr "зразків: %s, вивчено: %s"
|
||||
@@ -151,7 +151,7 @@ msgstr "Увімкнути розблокування обличчям"
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr "Вимкнути його (обличчя зберігаються)"
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr "Додати обличчя"
|
||||
|
||||
@@ -168,22 +168,26 @@ msgid "Look at the camera and see what it sees"
|
||||
msgstr "Подивитися в камеру і побачити, що вона бачить"
|
||||
|
||||
#: src/face-unlock:200
|
||||
msgid "Lock the screen"
|
||||
msgstr "Заблокувати екран"
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show what is on"
|
||||
msgstr "Показати, що увімкнено"
|
||||
|
||||
#: src/face-unlock:201
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr "Показати цю довідку"
|
||||
|
||||
#: src/face-unlock:202
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr "Показати версію"
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr "Без команди відкривається інтерактивне меню."
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
@@ -191,42 +195,42 @@ msgstr ""
|
||||
"Запускайте це від свого користувача, не від root. Пароль буде запитано, коли "
|
||||
"він знадобиться."
|
||||
|
||||
#: src/face-unlock:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr "Невідома команда: %s"
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr "ніколи"
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr "щойно"
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr "1 хвилину тому"
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "%d хв тому"
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr "1 годину тому"
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr "%d год тому"
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr "1 день тому"
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr "%d дн. тому"
|
||||
@@ -370,11 +374,11 @@ msgstr ""
|
||||
msgid "[y/N]"
|
||||
msgstr "[т/Н]"
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr "УВІМК"
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr "ВИМК"
|
||||
|
||||
@@ -415,7 +419,7 @@ msgstr "повільна"
|
||||
msgid "%s seconds"
|
||||
msgstr "%s с"
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr "автоматично"
|
||||
|
||||
@@ -435,8 +439,8 @@ msgstr "не запущена"
|
||||
msgid "Turning face unlock on again starts it."
|
||||
msgstr "Повторне ввімкнення розблокування обличчям запустить її."
|
||||
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr "Обличчя"
|
||||
|
||||
@@ -493,7 +497,7 @@ msgstr "Останнє розблокування"
|
||||
msgid "The lock screen agent is not running."
|
||||
msgstr "Агент екрана блокування не запущено."
|
||||
|
||||
#: src/lib/menu.sh:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
@@ -501,16 +505,17 @@ msgstr ""
|
||||
"У GNOME бульбашку показує невелике розширення GNOME. Воно вмикається разом "
|
||||
"із розблокуванням обличчям."
|
||||
|
||||
#: src/lib/menu.sh:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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 ""
|
||||
"Сканує, коли ви повертаєтеся до hyprlock чи swaylock, і відкриває їх. Будь-"
|
||||
"який інший екран блокування сканує, коли ви натискаєте Enter у порожньому "
|
||||
"полі пароля."
|
||||
"Сканує, коли ви повертаєтеся до hyprlock, swaylock або до власного екрана "
|
||||
"блокування face-unlock (`face-unlock lock`, з бульбашкою), і відкриває їх. "
|
||||
"Інші екрани блокування сканують за Enter."
|
||||
|
||||
#: src/lib/menu.sh:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
@@ -518,7 +523,7 @@ msgstr ""
|
||||
"Розблоковує екран блокування, коли бачить ваше обличчя. Вимк.: там працює "
|
||||
"лише пароль."
|
||||
|
||||
#: src/lib/menu.sh:324
|
||||
#: src/lib/menu.sh:328
|
||||
msgid ""
|
||||
"Scans when you press a key or move the mouse on the lock screen, and when "
|
||||
"the computer wakes up."
|
||||
@@ -526,7 +531,7 @@ msgstr ""
|
||||
"Сканує, коли ви натискаєте клавішу або рухаєте мишею на екрані блокування, і "
|
||||
"коли комп'ютер прокидається."
|
||||
|
||||
#: src/lib/menu.sh:325
|
||||
#: src/lib/menu.sh:329
|
||||
msgid ""
|
||||
"Scans as soon as the screen locks. Off by default: if you lock it yourself, "
|
||||
"it would unlock again right away."
|
||||
@@ -534,7 +539,7 @@ msgstr ""
|
||||
"Сканує одразу після блокування екрана. Типово вимк.: якщо ви блокуєте самі, "
|
||||
"він одразу б розблокувався."
|
||||
|
||||
#: src/lib/menu.sh:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
@@ -542,7 +547,21 @@ msgstr ""
|
||||
"sudo приймає ваше обличчя замість пароля. Не збіглося: ви вводите пароль як "
|
||||
"зазвичай."
|
||||
|
||||
#: src/lib/menu.sh:327
|
||||
#: src/lib/menu.sh:331
|
||||
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 ""
|
||||
"Зображення за екраном блокування face-unlock (`face-unlock lock`). Порожньо: "
|
||||
"те, що на робочому столі. Або файл, тека, з якої береться випадкове, або "
|
||||
"`none`. Натисніть Enter, щоб ввести."
|
||||
|
||||
#: src/lib/menu.sh:332
|
||||
msgid "Blurs the picture behind face-unlock's own lock screen."
|
||||
msgstr "Розмиває зображення за екраном блокування face-unlock."
|
||||
|
||||
#: src/lib/menu.sh:333
|
||||
#, sh-printf-format
|
||||
msgid ""
|
||||
"The lock screen takes your face in its password check. Press Enter on the "
|
||||
@@ -551,7 +570,7 @@ msgstr ""
|
||||
"Екран блокування приймає ваше обличчя під час перевірки пароля. Натисніть "
|
||||
"Enter у порожньому полі, щоб сканувати. Знайдено тут: %s."
|
||||
|
||||
#: src/lib/menu.sh:328
|
||||
#: src/lib/menu.sh:334
|
||||
msgid ""
|
||||
"The password windows of your desktop and apps, for example when you install "
|
||||
"software. No match: you type the password."
|
||||
@@ -559,17 +578,17 @@ msgstr ""
|
||||
"Вікна введення пароля робочого столу і програм, наприклад під час "
|
||||
"встановлення програм. Не збіглося: ви вводите пароль."
|
||||
|
||||
#: src/lib/menu.sh:329
|
||||
#: src/lib/menu.sh:335
|
||||
msgid ""
|
||||
"You have to blink or turn your head a little. This also stops printed photos."
|
||||
msgstr ""
|
||||
"Треба кліпнути або трохи повернути голову. Це також зупиняє надруковані фото."
|
||||
|
||||
#: src/lib/menu.sh:330
|
||||
#: src/lib/menu.sh:336
|
||||
msgid "No check at all. Only for trying out a camera."
|
||||
msgstr "Жодної перевірки. Лише щоб випробувати камеру."
|
||||
|
||||
#: src/lib/menu.sh:331
|
||||
#: src/lib/menu.sh:337
|
||||
msgid ""
|
||||
"Stops photos on a phone, a tablet or glossy paper. You do not have to blink. "
|
||||
"A matte printed photo can get through."
|
||||
@@ -577,22 +596,22 @@ msgstr ""
|
||||
"Зупиняє фото на телефоні, планшеті чи глянцевому папері. Кліпати не треба. "
|
||||
"Матове надруковане фото може пройти."
|
||||
|
||||
#: src/lib/menu.sh:332
|
||||
#: src/lib/menu.sh:338
|
||||
msgid ""
|
||||
"Fewer wrong matches, but it may not know you with glasses or in bad light."
|
||||
msgstr ""
|
||||
"Менше хибних збігів, але може не впізнати вас в окулярах або при поганому "
|
||||
"світлі."
|
||||
|
||||
#: src/lib/menu.sh:333
|
||||
#: src/lib/menu.sh:339
|
||||
msgid "Knows you more easily, but also somebody who looks a lot like you."
|
||||
msgstr "Впізнає вас легше, але й того, хто дуже на вас схожий."
|
||||
|
||||
#: src/lib/menu.sh:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr "Типове значення. Підходить більшості."
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
msgid ""
|
||||
"Your eyes have to be open and on the screen. So it does not unlock while you "
|
||||
"look away or sleep."
|
||||
@@ -600,7 +619,7 @@ msgstr ""
|
||||
"Ваші очі мають бути розплющені й дивитися на екран. Так він не "
|
||||
"розблокується, коли ви дивитеся вбік або спите."
|
||||
|
||||
#: src/lib/menu.sh:336
|
||||
#: src/lib/menu.sh:342
|
||||
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)."
|
||||
@@ -609,11 +628,11 @@ msgstr ""
|
||||
"знову. Інфрачервоній камері потрібне ввімкнене підсвічування (linux-enable-"
|
||||
"ir-emitter)."
|
||||
|
||||
#: src/lib/menu.sh:337
|
||||
#: src/lib/menu.sh:343
|
||||
msgid "How long the camera looks for your face before it gives up."
|
||||
msgstr "Як довго камера шукає ваше обличчя, перш ніж здатися."
|
||||
|
||||
#: src/lib/menu.sh:338
|
||||
#: src/lib/menu.sh:344
|
||||
msgid ""
|
||||
"After a sure match it keeps how you look now. So a new haircut or glasses "
|
||||
"need no new setup."
|
||||
@@ -621,7 +640,7 @@ msgstr ""
|
||||
"Після впевненого збігу запам'ятовує, як ви виглядаєте зараз. Нова зачіска чи "
|
||||
"окуляри не потребують нового налаштування."
|
||||
|
||||
#: src/lib/menu.sh:339
|
||||
#: src/lib/menu.sh:345
|
||||
msgid ""
|
||||
"No scan while the laptop is closed, for example at a desk with an external "
|
||||
"screen."
|
||||
@@ -629,82 +648,99 @@ msgstr ""
|
||||
"Без сканування, коли ноутбук закрито, наприклад за столом із зовнішнім "
|
||||
"монітором."
|
||||
|
||||
#: src/lib/menu.sh:340
|
||||
#: src/lib/menu.sh:346
|
||||
msgid "The bubble at the top of the screen shows what the camera is doing."
|
||||
msgstr "Бульбашка вгорі екрана показує, що робить камера."
|
||||
|
||||
#: src/lib/menu.sh:341
|
||||
#: src/lib/menu.sh:347
|
||||
msgid "A small pill with a lock that opens."
|
||||
msgstr "Маленька пігулка із замком, що відкривається."
|
||||
|
||||
#: src/lib/menu.sh:342
|
||||
#: src/lib/menu.sh:348
|
||||
msgid "An island with a face that looks around, then rings and a tick."
|
||||
msgstr "Острів з обличчям, яке озирається, потім кільця і галочка."
|
||||
|
||||
#: src/lib/menu.sh:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr "Як швидко рухається бульбашка."
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
msgid "Shows the bubble when sudo or an admin prompt scans your face, too."
|
||||
msgstr ""
|
||||
"Показує бульбашку й тоді, коли sudo або запит адміністратора сканує ваше "
|
||||
"обличчя."
|
||||
|
||||
#: src/lib/menu.sh:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr "автоматично (%s)"
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr "(інфрачервона)"
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr "(не під'єднана)"
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr "як на робочому столі"
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr "немає"
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr "Зображення або тека:"
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr "Не знайдено: %s"
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr "Налаштування"
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr "↑↓ вибір ←→ або Пробіл: змінити q: назад"
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
msgid "for all users, asks for your password"
|
||||
msgstr "для всіх користувачів, запитує пароль"
|
||||
|
||||
#. TRANSLATORS: keep the letters, they are the keys.
|
||||
#: src/lib/menu.sh:626
|
||||
#: src/lib/menu.sh:662
|
||||
msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back"
|
||||
msgstr ""
|
||||
"Вгору/Вниз: вибір, Пробіл: увімк./вимк., r: перейменувати, d: видалити, a: "
|
||||
"додати, q: назад"
|
||||
|
||||
#: src/lib/menu.sh:627
|
||||
#: src/lib/menu.sh:663
|
||||
msgid "No face is set up yet. Press a to add one."
|
||||
msgstr "Ще не налаштовано жодного обличчя. Натисніть a, щоб додати."
|
||||
|
||||
#: src/lib/menu.sh:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr "Нова назва:"
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr "Видалити «%s»?"
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr "Увімкнути або вимкнути розблокування обличчям"
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr "Спробувати"
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr "Вийти"
|
||||
|
||||
@@ -762,6 +798,14 @@ msgstr "Сканувати, коли ви повертаєтеся"
|
||||
msgid "Scan right after locking"
|
||||
msgstr "Сканувати одразу після блокування"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr "Шпалери"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr "Розмити шпалери"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr "Запити пароля"
|
||||
@@ -920,24 +964,32 @@ msgstr "Камера зайнята іншим скануванням. Спро
|
||||
msgid "The face could not be added (%1)."
|
||||
msgstr "Не вдалося додати обличчя (%1)."
|
||||
|
||||
#: src/agent/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr "Неправильний пароль"
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
msgid "Face unlock for the lock screen, sudo and admin prompts"
|
||||
msgstr ""
|
||||
"Розблокування обличчям для екрана блокування, sudo і запитів адміністратора"
|
||||
|
||||
#: src/agent/main.cpp:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr "Налаштувати обличчя."
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr "Як назвати нове обличчя."
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr "Заблокувати екран."
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr "Один раз програти анімації бульбашки."
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr "Стиль бульбашки для демо: full або minimal."
|
||||
|
||||
@@ -1019,3 +1071,15 @@ msgstr "Почати"
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr "Готово"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr "Пароль"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
msgid "Look at the camera or type your password"
|
||||
msgstr "Подивіться в камеру або введіть пароль"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:186
|
||||
msgid "Type your password"
|
||||
msgstr "Введіть пароль"
|
||||
+134
-71
@@ -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:34+0200\n"
|
||||
"POT-Creation-Date: 2026-09-26 19:35+0200\n"
|
||||
"PO-Revision-Date: 2026-09-24 12:00+0200\n"
|
||||
"Last-Translator: Felitendo\n"
|
||||
"Language-Team: Chinese (simplified)\n"
|
||||
@@ -53,8 +53,8 @@ msgstr "没有添加人脸。"
|
||||
msgid "First, set up your face."
|
||||
msgstr "请先设置你的人脸。"
|
||||
|
||||
#: src/face-unlock:100 src/face-unlock:139 src/lib/menu.sh:466
|
||||
#: src/lib/menu.sh:470 src/lib/menu.sh:476 src/lib/menu.sh:478
|
||||
#: 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
|
||||
msgid "Could not save the setting."
|
||||
msgstr "无法保存设置。"
|
||||
|
||||
@@ -98,16 +98,16 @@ msgstr "人脸解锁已关闭。你的人脸会保留;可在“人脸”中删
|
||||
msgid "No face is set up yet."
|
||||
msgstr "尚未设置任何人脸。"
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:628
|
||||
#: src/face-unlock:168 src/lib/menu.sh:180 src/lib/menu.sh:664
|
||||
msgid "on"
|
||||
msgstr "开"
|
||||
|
||||
#: src/face-unlock:168 src/lib/menu.sh:182 src/lib/menu.sh:192
|
||||
#: src/lib/menu.sh:629
|
||||
#: src/lib/menu.sh:665
|
||||
msgid "off"
|
||||
msgstr "关"
|
||||
|
||||
#: src/face-unlock:170 src/lib/menu.sh:646
|
||||
#: src/face-unlock:170 src/lib/menu.sh:682
|
||||
#, sh-printf-format
|
||||
msgid "%s samples, %s learned"
|
||||
msgstr "%s 个样本,已学习 %s 个"
|
||||
@@ -137,7 +137,7 @@ msgstr "开启人脸解锁"
|
||||
msgid "Turn it off (faces are kept)"
|
||||
msgstr "关闭(保留人脸)"
|
||||
|
||||
#: src/face-unlock:196 src/lib/menu.sh:712
|
||||
#: src/face-unlock:196 src/lib/menu.sh:748
|
||||
msgid "Add a face"
|
||||
msgstr "添加人脸"
|
||||
|
||||
@@ -154,63 +154,67 @@ msgid "Look at the camera and see what it sees"
|
||||
msgstr "看着摄像头,查看它看到的画面"
|
||||
|
||||
#: src/face-unlock:200
|
||||
msgid "Lock the screen"
|
||||
msgstr "锁定屏幕"
|
||||
|
||||
#: src/face-unlock:201
|
||||
msgid "Show what is on"
|
||||
msgstr "显示已开启的功能"
|
||||
|
||||
#: src/face-unlock:201
|
||||
#: src/face-unlock:202
|
||||
msgid "Show this help"
|
||||
msgstr "显示此帮助"
|
||||
|
||||
#: src/face-unlock:202
|
||||
#: src/face-unlock:203
|
||||
msgid "Show the version"
|
||||
msgstr "显示版本"
|
||||
|
||||
#: src/face-unlock:204
|
||||
#: src/face-unlock:205
|
||||
msgid "Without a command an interactive menu is shown."
|
||||
msgstr "不带命令时显示交互式菜单。"
|
||||
|
||||
#: src/face-unlock:223
|
||||
#: src/face-unlock:224
|
||||
msgid ""
|
||||
"Run this as your own user, not as root. It asks for your password when it "
|
||||
"needs to."
|
||||
msgstr "请以你自己的用户运行,不要用 root。需要时会询问你的密码。"
|
||||
|
||||
#: src/face-unlock:245 src/lib/system.sh:101
|
||||
#: src/face-unlock:247 src/lib/system.sh:101
|
||||
#, sh-printf-format
|
||||
msgid "Unknown command: %s"
|
||||
msgstr "未知命令:%s"
|
||||
|
||||
#: src/lib/common.sh:169
|
||||
#: src/lib/common.sh:171
|
||||
msgid "never"
|
||||
msgstr "从未"
|
||||
|
||||
#: src/lib/common.sh:179
|
||||
#: src/lib/common.sh:181
|
||||
msgid "just now"
|
||||
msgstr "刚刚"
|
||||
|
||||
#: src/lib/common.sh:181
|
||||
#: src/lib/common.sh:183
|
||||
msgid "1 minute ago"
|
||||
msgstr "1 分钟前"
|
||||
|
||||
#: src/lib/common.sh:184
|
||||
#: src/lib/common.sh:186
|
||||
#, sh-printf-format
|
||||
msgid "%d minutes ago"
|
||||
msgstr "%d 分钟前"
|
||||
|
||||
#: src/lib/common.sh:186
|
||||
#: src/lib/common.sh:188
|
||||
msgid "1 hour ago"
|
||||
msgstr "1 小时前"
|
||||
|
||||
#: src/lib/common.sh:189
|
||||
#: src/lib/common.sh:191
|
||||
#, sh-printf-format
|
||||
msgid "%d hours ago"
|
||||
msgstr "%d 小时前"
|
||||
|
||||
#: src/lib/common.sh:191
|
||||
#: src/lib/common.sh:193
|
||||
msgid "1 day ago"
|
||||
msgstr "1 天前"
|
||||
|
||||
#: src/lib/common.sh:194
|
||||
#: src/lib/common.sh:196
|
||||
#, sh-printf-format
|
||||
msgid "%d days ago"
|
||||
msgstr "%d 天前"
|
||||
@@ -350,11 +354,11 @@ msgstr "尝试次数过多。人脸解锁已暂停,直到你用密码解锁。
|
||||
msgid "[y/N]"
|
||||
msgstr "[y/N]"
|
||||
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:531
|
||||
#: src/lib/menu.sh:172 src/lib/menu.sh:566
|
||||
msgid "ON"
|
||||
msgstr "开启"
|
||||
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:532
|
||||
#: src/lib/menu.sh:174 src/lib/menu.sh:567
|
||||
msgid "OFF"
|
||||
msgstr "关闭"
|
||||
|
||||
@@ -395,7 +399,7 @@ msgstr "慢"
|
||||
msgid "%s seconds"
|
||||
msgstr "%s 秒"
|
||||
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:441
|
||||
#: src/lib/menu.sh:202 src/lib/menu.sh:447
|
||||
msgid "automatic"
|
||||
msgstr "自动"
|
||||
|
||||
@@ -415,8 +419,8 @@ msgstr "未运行"
|
||||
msgid "Turning face unlock on again starts it."
|
||||
msgstr "重新开启人脸解锁即可启动它。"
|
||||
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:624
|
||||
#: src/lib/menu.sh:713
|
||||
#: src/lib/menu.sh:236 src/lib/menu.sh:238 src/lib/menu.sh:660
|
||||
#: src/lib/menu.sh:749
|
||||
msgid "Faces"
|
||||
msgstr "人脸"
|
||||
|
||||
@@ -473,46 +477,60 @@ msgstr "上次解锁"
|
||||
msgid "The lock screen agent is not running."
|
||||
msgstr "锁屏代理没有运行。"
|
||||
|
||||
#: src/lib/menu.sh:314
|
||||
#: src/lib/menu.sh:318
|
||||
msgid ""
|
||||
"On GNOME a small GNOME extension shows the bubble. Turning face unlock on "
|
||||
"switches it on."
|
||||
msgstr ""
|
||||
"在 GNOME 上,由一个小的 GNOME 扩展显示气泡。开启人脸解锁时会一并开启它。"
|
||||
|
||||
#: src/lib/menu.sh:318
|
||||
#: src/lib/menu.sh:322
|
||||
msgid ""
|
||||
"Scans when you come back to hyprlock or swaylock and opens them. Any other "
|
||||
"lock screen scans when you press Enter on the empty password field."
|
||||
"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 ""
|
||||
"回到 hyprlock 或 swaylock 时会扫描并打开它们。其他锁屏在空的密码框中按 Enter "
|
||||
"时扫描。"
|
||||
"回到 hyprlock、swaylock 或 face-unlock 自带的锁屏(`face-unlock lock`,带气"
|
||||
"泡)时扫描并打开它们。其他锁屏按 Enter 扫描。"
|
||||
|
||||
#: src/lib/menu.sh:323
|
||||
#: src/lib/menu.sh:327
|
||||
msgid ""
|
||||
"Unlocks the lock screen when it sees your face. Off: only your password "
|
||||
"works there."
|
||||
msgstr "看到你的脸时解锁锁屏。关闭:锁屏只能用密码。"
|
||||
|
||||
#: src/lib/menu.sh:324
|
||||
#: src/lib/menu.sh:328
|
||||
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:325
|
||||
#: src/lib/menu.sh:329
|
||||
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:326
|
||||
#: src/lib/menu.sh:330
|
||||
msgid ""
|
||||
"sudo takes your face instead of the password. No match: you type the "
|
||||
"password as usual."
|
||||
msgstr "sudo 用你的脸代替密码。不匹配时,照常输入密码。"
|
||||
|
||||
#: src/lib/menu.sh:327
|
||||
#: src/lib/menu.sh:331
|
||||
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 ""
|
||||
"face-unlock 锁屏(`face-unlock lock`)背后的图片。留空:用桌面的图片。或者一"
|
||||
"个文件、从中随机挑选的文件夹,或 `none`。按 Enter 输入。"
|
||||
|
||||
#: src/lib/menu.sh:332
|
||||
msgid "Blurs the picture behind face-unlock's own lock screen."
|
||||
msgstr "模糊 face-unlock 锁屏背后的图片。"
|
||||
|
||||
#: src/lib/menu.sh:333
|
||||
#, sh-printf-format
|
||||
msgid ""
|
||||
"The lock screen takes your face in its password check. Press Enter on the "
|
||||
@@ -520,47 +538,47 @@ msgid ""
|
||||
msgstr ""
|
||||
"锁屏在检查密码时也接受你的人脸。在空白框中按 Enter 即可扫描。此处找到:%s。"
|
||||
|
||||
#: src/lib/menu.sh:328
|
||||
#: src/lib/menu.sh:334
|
||||
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:329
|
||||
#: src/lib/menu.sh:335
|
||||
msgid ""
|
||||
"You have to blink or turn your head a little. This also stops printed photos."
|
||||
msgstr "你需要眨眼或稍微转头。这也能挡住打印的照片。"
|
||||
|
||||
#: src/lib/menu.sh:330
|
||||
#: src/lib/menu.sh:336
|
||||
msgid "No check at all. Only for trying out a camera."
|
||||
msgstr "完全不检测。仅用于试用摄像头。"
|
||||
|
||||
#: src/lib/menu.sh:331
|
||||
#: src/lib/menu.sh:337
|
||||
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:332
|
||||
#: src/lib/menu.sh:338
|
||||
msgid ""
|
||||
"Fewer wrong matches, but it may not know you with glasses or in bad light."
|
||||
msgstr "误认更少,但戴眼镜或光线不好时可能认不出你。"
|
||||
|
||||
#: src/lib/menu.sh:333
|
||||
#: src/lib/menu.sh:339
|
||||
msgid "Knows you more easily, but also somebody who looks a lot like you."
|
||||
msgstr "更容易认出你,但也更容易认出和你长得很像的人。"
|
||||
|
||||
#: src/lib/menu.sh:334
|
||||
#: src/lib/menu.sh:340
|
||||
msgid "The default. Right for most people."
|
||||
msgstr "默认值。适合大多数人。"
|
||||
|
||||
#: src/lib/menu.sh:335
|
||||
#: src/lib/menu.sh:341
|
||||
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:336
|
||||
#: src/lib/menu.sh:342
|
||||
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)."
|
||||
@@ -568,94 +586,111 @@ msgstr ""
|
||||
"“自动”会使用第一个普通摄像头。更换后请重新设置人脸。红外摄像头需要打开它的补"
|
||||
"光灯(linux-enable-ir-emitter)。"
|
||||
|
||||
#: src/lib/menu.sh:337
|
||||
#: src/lib/menu.sh:343
|
||||
msgid "How long the camera looks for your face before it gives up."
|
||||
msgstr "摄像头寻找你的脸多久后放弃。"
|
||||
|
||||
#: src/lib/menu.sh:338
|
||||
#: src/lib/menu.sh:344
|
||||
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:339
|
||||
#: src/lib/menu.sh:345
|
||||
msgid ""
|
||||
"No scan while the laptop is closed, for example at a desk with an external "
|
||||
"screen."
|
||||
msgstr "笔记本合上时不扫描,例如在接了外接显示器的桌前。"
|
||||
|
||||
#: src/lib/menu.sh:340
|
||||
#: src/lib/menu.sh:346
|
||||
msgid "The bubble at the top of the screen shows what the camera is doing."
|
||||
msgstr "屏幕顶部的气泡显示摄像头正在做什么。"
|
||||
|
||||
#: src/lib/menu.sh:341
|
||||
#: src/lib/menu.sh:347
|
||||
msgid "A small pill with a lock that opens."
|
||||
msgstr "一个带锁的小药丸,锁会打开。"
|
||||
|
||||
#: src/lib/menu.sh:342
|
||||
#: src/lib/menu.sh:348
|
||||
msgid "An island with a face that looks around, then rings and a tick."
|
||||
msgstr "一个岛,里面有一张四处张望的脸,然后是圆环和一个对勾。"
|
||||
|
||||
#: src/lib/menu.sh:343
|
||||
#: src/lib/menu.sh:349
|
||||
msgid "How fast the bubble moves."
|
||||
msgstr "气泡移动的速度。"
|
||||
|
||||
#: src/lib/menu.sh:344
|
||||
#: src/lib/menu.sh:350
|
||||
msgid "Shows the bubble when sudo or an admin prompt scans your face, too."
|
||||
msgstr "sudo 或管理员授权扫描你的脸时也显示气泡。"
|
||||
|
||||
#: src/lib/menu.sh:437
|
||||
#: src/lib/menu.sh:443
|
||||
#, sh-printf-format
|
||||
msgid "automatic (%s)"
|
||||
msgstr "自动(%s)"
|
||||
|
||||
#: src/lib/menu.sh:447
|
||||
#: src/lib/menu.sh:453
|
||||
msgid "(infrared)"
|
||||
msgstr "(红外)"
|
||||
|
||||
#: src/lib/menu.sh:451
|
||||
#: src/lib/menu.sh:457
|
||||
msgid "(not connected)"
|
||||
msgstr "(未连接)"
|
||||
|
||||
#: src/lib/menu.sh:528 src/lib/menu.sh:714
|
||||
#: src/lib/menu.sh:466
|
||||
msgid "same as desktop"
|
||||
msgstr "与桌面相同"
|
||||
|
||||
#: src/lib/menu.sh:470
|
||||
msgid "none"
|
||||
msgstr "无"
|
||||
|
||||
#: src/lib/menu.sh:487
|
||||
msgid "Picture or folder:"
|
||||
msgstr "图片或文件夹:"
|
||||
|
||||
#: src/lib/menu.sh:492
|
||||
#, sh-printf-format
|
||||
msgid "Not found: %s"
|
||||
msgstr "未找到:%s"
|
||||
|
||||
#: src/lib/menu.sh:563 src/lib/menu.sh:750
|
||||
msgid "Settings"
|
||||
msgstr "设置"
|
||||
|
||||
#: src/lib/menu.sh:529
|
||||
#: src/lib/menu.sh:564
|
||||
msgid "↑↓ select ←→ or Space: change q: back"
|
||||
msgstr "↑↓ 选择 ←→ 或空格:更改 q:返回"
|
||||
|
||||
#: src/lib/menu.sh:530
|
||||
#: src/lib/menu.sh:565
|
||||
msgid "for all users, asks for your password"
|
||||
msgstr "对所有用户生效,需要你的密码"
|
||||
|
||||
#. TRANSLATORS: keep the letters, they are the keys.
|
||||
#: src/lib/menu.sh:626
|
||||
#: src/lib/menu.sh:662
|
||||
msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back"
|
||||
msgstr "上/下:选择,空格:开/关,r:重命名,d:删除,a:添加,q:返回"
|
||||
|
||||
#: src/lib/menu.sh:627
|
||||
#: src/lib/menu.sh:663
|
||||
msgid "No face is set up yet. Press a to add one."
|
||||
msgstr "尚未设置任何人脸。按 a 添加。"
|
||||
|
||||
#: src/lib/menu.sh:673
|
||||
#: src/lib/menu.sh:709
|
||||
msgid "New name:"
|
||||
msgstr "新名称:"
|
||||
|
||||
#: src/lib/menu.sh:680
|
||||
#: src/lib/menu.sh:716
|
||||
#, sh-printf-format
|
||||
msgid "Delete \"%s\"?"
|
||||
msgstr "删除“%s”?"
|
||||
|
||||
#: src/lib/menu.sh:711
|
||||
#: src/lib/menu.sh:747
|
||||
msgid "Turn face unlock on or off"
|
||||
msgstr "开启或关闭人脸解锁"
|
||||
|
||||
#: src/lib/menu.sh:715
|
||||
#: src/lib/menu.sh:751
|
||||
msgid "Try it"
|
||||
msgstr "试一试"
|
||||
|
||||
#: src/lib/menu.sh:716
|
||||
#: src/lib/menu.sh:752
|
||||
msgid "Quit"
|
||||
msgstr "退出"
|
||||
|
||||
@@ -711,6 +746,14 @@ msgstr "你回来时扫描"
|
||||
msgid "Scan right after locking"
|
||||
msgstr "锁定后立即扫描"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Wallpaper"
|
||||
msgstr "壁纸"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Blur the wallpaper"
|
||||
msgstr "模糊壁纸"
|
||||
|
||||
#: src/lib/menu.sh
|
||||
msgid "Password prompts"
|
||||
msgstr "密码提示"
|
||||
@@ -867,23 +910,31 @@ msgstr "摄像头正忙于另一次扫描。请稍后重试。"
|
||||
msgid "The face could not be added (%1)."
|
||||
msgstr "无法添加人脸(%1)。"
|
||||
|
||||
#: src/agent/main.cpp:87
|
||||
#: src/agent/lockscreencontroller.cpp:172
|
||||
msgid "Wrong password"
|
||||
msgstr "密码错误"
|
||||
|
||||
#: src/agent/main.cpp:185
|
||||
msgid "Face unlock for the lock screen, sudo and admin prompts"
|
||||
msgstr "用于锁屏、sudo 和管理员授权的人脸解锁"
|
||||
|
||||
#: src/agent/main.cpp:90
|
||||
#: src/agent/main.cpp:188
|
||||
msgid "Set up a face."
|
||||
msgstr "设置一张人脸。"
|
||||
|
||||
#: src/agent/main.cpp:91
|
||||
#: src/agent/main.cpp:189
|
||||
msgid "What to call the new face."
|
||||
msgstr "新人脸的名称。"
|
||||
|
||||
#: src/agent/main.cpp:92
|
||||
#: src/agent/main.cpp:190
|
||||
msgid "Lock the screen."
|
||||
msgstr "锁定屏幕。"
|
||||
|
||||
#: src/agent/main.cpp:191
|
||||
msgid "Play the bubble's animations once."
|
||||
msgstr "播放一次气泡动画。"
|
||||
|
||||
#: src/agent/main.cpp:94
|
||||
#: src/agent/main.cpp:193
|
||||
msgid "Bubble style for the demo: full or minimal."
|
||||
msgstr "演示用的气泡样式:full 或 minimal。"
|
||||
|
||||
@@ -961,3 +1012,15 @@ msgstr "开始"
|
||||
#: src/agent/qml/Enroll.qml:193
|
||||
msgid "Done"
|
||||
msgstr "完成"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:171
|
||||
msgid "Password"
|
||||
msgstr "密码"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:185
|
||||
msgid "Look at the camera or type your password"
|
||||
msgstr "看向摄像头或输入密码"
|
||||
|
||||
#: src/agent/qml/LockScreen.qml:186
|
||||
msgid "Type your password"
|
||||
msgstr "输入密码"
|
||||
@@ -0,0 +1,328 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="ext_session_lock_v1">
|
||||
<copyright>
|
||||
Copyright 2021 Isaac Freund
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<description summary="secure session locking with arbitrary graphics">
|
||||
This protocol allows for a privileged Wayland client to lock the session
|
||||
and display arbitrary graphics while the session is locked.
|
||||
|
||||
The compositor may choose to restrict this protocol to a special client
|
||||
launched by the compositor itself or expose it to all privileged clients,
|
||||
this is compositor policy.
|
||||
|
||||
The client is responsible for performing authentication and informing the
|
||||
compositor when the session should be unlocked. If the client dies while
|
||||
the session is locked the session remains locked, possibly permanently
|
||||
depending on compositor policy.
|
||||
|
||||
The key words "must", "must not", "required", "shall", "shall not",
|
||||
"should", "should not", "recommended", "may", and "optional" in this
|
||||
document are to be interpreted as described in IETF RFC 2119.
|
||||
|
||||
Warning! The protocol described in this file is currently in the
|
||||
testing phase. Backward compatible changes may be added together with
|
||||
the corresponding interface version bump. Backward incompatible changes
|
||||
can only be done by creating a new major version of the extension.
|
||||
</description>
|
||||
|
||||
<interface name="ext_session_lock_manager_v1" version="1">
|
||||
<description summary="used to lock the session">
|
||||
This interface is used to request that the session be locked.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the session lock manager object">
|
||||
This informs the compositor that the session lock manager object will
|
||||
no longer be used. Existing objects created through this interface
|
||||
remain valid.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="lock">
|
||||
<description summary="attempt to lock the session">
|
||||
This request creates a session lock and asks the compositor to lock the
|
||||
session. The compositor will send either the ext_session_lock_v1.locked
|
||||
or ext_session_lock_v1.finished event on the created object in
|
||||
response to this request.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="ext_session_lock_v1"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="ext_session_lock_v1" version="1">
|
||||
<description summary="manage lock state and create lock surfaces">
|
||||
In response to the creation of this object the compositor must send
|
||||
either the locked or finished event.
|
||||
|
||||
The locked event indicates that the session is locked. This means
|
||||
that the compositor must stop rendering and providing input to normal
|
||||
clients. Instead the compositor must blank all outputs with an opaque
|
||||
color such that their normal content is fully hidden.
|
||||
|
||||
The only surfaces that should be rendered while the session is locked
|
||||
are the lock surfaces created through this interface and optionally,
|
||||
at the compositor's discretion, special privileged surfaces such as
|
||||
input methods or portions of desktop shell UIs.
|
||||
|
||||
The locked event must not be sent until a new "locked" frame (either
|
||||
from a session lock surface or the compositor blanking the output) has
|
||||
been presented on all outputs and no security sensitive normal/unlocked
|
||||
content is possibly visible.
|
||||
|
||||
The finished event should be sent immediately on creation of this
|
||||
object if the compositor decides that the locked event will not be sent.
|
||||
|
||||
The compositor may wait for the client to create and render session lock
|
||||
surfaces before sending the locked event to avoid displaying intermediate
|
||||
blank frames. However, it must impose a reasonable time limit if
|
||||
waiting and send the locked event as soon as the hard requirements
|
||||
described above can be met if the time limit expires. Clients should
|
||||
immediately create lock surfaces for all outputs on creation of this
|
||||
object to make this possible.
|
||||
|
||||
This behavior of the locked event is required in order to prevent
|
||||
possible race conditions with clients that wish to suspend the system
|
||||
or similar after locking the session. Without these semantics, clients
|
||||
triggering a suspend after receiving the locked event would race with
|
||||
the first "locked" frame being presented and normal/unlocked frames
|
||||
might be briefly visible as the system is resumed if the suspend
|
||||
operation wins the race.
|
||||
|
||||
If the client dies while the session is locked, the compositor must not
|
||||
unlock the session in response. It is acceptable for the session to be
|
||||
permanently locked if this happens. The compositor may choose to continue
|
||||
to display the lock surfaces the client had mapped before it died or
|
||||
alternatively fall back to a solid color, this is compositor policy.
|
||||
|
||||
Compositors may also allow a secure way to recover the session, the
|
||||
details of this are compositor policy. Compositors may allow a new
|
||||
client to create a ext_session_lock_v1 object and take responsibility
|
||||
for unlocking the session, they may even start a new lock client
|
||||
instance automatically.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="invalid_destroy" value="0"
|
||||
summary="attempted to destroy session lock while locked"/>
|
||||
<entry name="invalid_unlock" value="1"
|
||||
summary="unlock requested but locked event was never sent"/>
|
||||
<entry name="role" value="2"
|
||||
summary="given wl_surface already has a role"/>
|
||||
<entry name="duplicate_output" value="3"
|
||||
summary="given output already has a lock surface"/>
|
||||
<entry name="already_constructed" value="4"
|
||||
summary="given wl_surface has a buffer attached or committed"/>
|
||||
</enum>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the session lock">
|
||||
This informs the compositor that the lock object will no longer be
|
||||
used. Existing objects created through this interface remain valid.
|
||||
|
||||
After this request is made, lock surfaces created through this object
|
||||
should be destroyed by the client as they will no longer be used by
|
||||
the compositor.
|
||||
|
||||
It is a protocol error to make this request if the locked event was
|
||||
sent, the unlock_and_destroy request must be used instead.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="locked">
|
||||
<description summary="session successfully locked">
|
||||
This client is now responsible for displaying graphics while the
|
||||
session is locked and deciding when to unlock the session.
|
||||
|
||||
The locked event must not be sent until a new "locked" frame has been
|
||||
presented on all outputs and no security sensitive normal/unlocked
|
||||
content is possibly visible.
|
||||
|
||||
If this event is sent, making the destroy request is a protocol error,
|
||||
the lock object must be destroyed using the unlock_and_destroy request.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<event name="finished">
|
||||
<description summary="the session lock object should be destroyed">
|
||||
The compositor has decided that the session lock should be destroyed
|
||||
as it will no longer be used by the compositor. Exactly when this
|
||||
event is sent is compositor policy, but it must never be sent more
|
||||
than once for a given session lock object.
|
||||
|
||||
This might be sent because there is already another ext_session_lock_v1
|
||||
object held by a client, or the compositor has decided to deny the
|
||||
request to lock the session for some other reason. This might also
|
||||
be sent because the compositor implements some alternative, secure
|
||||
way to authenticate and unlock the session.
|
||||
|
||||
The finished event should be sent immediately on creation of this
|
||||
object if the compositor decides that the locked event will not
|
||||
be sent.
|
||||
|
||||
If the locked event is sent on creation of this object the finished
|
||||
event may still be sent at some later time in this object's
|
||||
lifetime. This is compositor policy.
|
||||
|
||||
Upon receiving this event, the client should make either the destroy
|
||||
request or the unlock_and_destroy request, depending on whether or
|
||||
not the locked event was received on this object.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<request name="get_lock_surface">
|
||||
<description summary="create a lock surface for a given output">
|
||||
The client is expected to create lock surfaces for all outputs
|
||||
currently present and any new outputs as they are advertised. These
|
||||
won't be displayed by the compositor unless the lock is successful
|
||||
and the locked event is sent.
|
||||
|
||||
Providing a wl_surface which already has a role or already has a buffer
|
||||
attached or committed is a protocol error, as is attaching/committing
|
||||
a buffer before the first ext_session_lock_surface_v1.configure event.
|
||||
|
||||
Attempting to create more than one lock surface for a given output
|
||||
is a duplicate_output protocol error.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="ext_session_lock_surface_v1"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"/>
|
||||
<arg name="output" type="object" interface="wl_output"/>
|
||||
</request>
|
||||
|
||||
<request name="unlock_and_destroy" type="destructor">
|
||||
<description summary="unlock the session, destroying the object">
|
||||
This request indicates that the session should be unlocked, for
|
||||
example because the user has entered their password and it has been
|
||||
verified by the client.
|
||||
|
||||
This request also informs the compositor that the lock object will
|
||||
no longer be used and should be destroyed. Existing objects created
|
||||
through this interface remain valid.
|
||||
|
||||
After this request is made, lock surfaces created through this object
|
||||
should be destroyed by the client as they will no longer be used by
|
||||
the compositor.
|
||||
|
||||
It is a protocol error to make this request if the locked event has
|
||||
not been sent. In that case, the lock object must be destroyed using
|
||||
the destroy request.
|
||||
|
||||
Note that a correct client that wishes to exit directly after unlocking
|
||||
the session must use the wl_display.sync request to ensure the server
|
||||
receives and processes the unlock_and_destroy request. Otherwise
|
||||
there is no guarantee that the server has unlocked the session due
|
||||
to the asynchronous nature of the Wayland protocol. For example,
|
||||
the server might terminate the client with a protocol error before
|
||||
it processes the unlock_and_destroy request.
|
||||
</description>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="ext_session_lock_surface_v1" version="1">
|
||||
<description summary="a surface displayed while the session is locked">
|
||||
The client may use lock surfaces to display a screensaver, render a
|
||||
dialog to enter a password and unlock the session, or however else it
|
||||
sees fit.
|
||||
|
||||
On binding this interface the compositor will immediately send the
|
||||
first configure event. After making the ack_configure request in
|
||||
response to this event the client should attach and commit the first
|
||||
buffer. Committing the surface before acking the first configure is a
|
||||
protocol error. Committing the surface with a null buffer at any time
|
||||
is a protocol error.
|
||||
|
||||
The compositor is free to handle keyboard/pointer focus for lock
|
||||
surfaces however it chooses. A reasonable way to do this would be to
|
||||
give the first lock surface created keyboard focus and change keyboard
|
||||
focus if the user clicks on other surfaces.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="commit_before_first_ack" value="0"
|
||||
summary="surface committed before first ack_configure request"/>
|
||||
<entry name="null_buffer" value="1"
|
||||
summary="surface committed with a null buffer"/>
|
||||
<entry name="dimensions_mismatch" value="2"
|
||||
summary="failed to match ack'd width/height"/>
|
||||
<entry name="invalid_serial" value="3"
|
||||
summary="serial provided in ack_configure is invalid"/>
|
||||
</enum>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the lock surface object">
|
||||
This informs the compositor that the lock surface object will no
|
||||
longer be used.
|
||||
|
||||
It is recommended for a lock client to destroy lock surfaces if
|
||||
their corresponding wl_output global is removed.
|
||||
|
||||
If a lock surface on an active output is destroyed before the
|
||||
ext_session_lock_v1.unlock_and_destroy event is sent, the compositor
|
||||
must fall back to rendering a solid color.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="ack_configure">
|
||||
<description summary="ack a configure event">
|
||||
When a configure event is received, if a client commits the surface
|
||||
in response to the configure event, then the client must make an
|
||||
ack_configure request sometime before the commit request, passing
|
||||
along the serial of the configure event.
|
||||
|
||||
If the client receives multiple configure events before it can
|
||||
respond to one, it only has to ack the last configure event.
|
||||
|
||||
A client is not required to commit immediately after sending an
|
||||
ack_configure request - it may even ack_configure several times
|
||||
before its next surface commit.
|
||||
|
||||
A client may send multiple ack_configure requests before committing,
|
||||
but only the last request sent before a commit indicates which
|
||||
configure event the client really is responding to.
|
||||
|
||||
Sending an ack_configure request consumes the configure event
|
||||
referenced by the given serial, as well as all older configure events
|
||||
sent on this object.
|
||||
|
||||
It is a protocol error to issue multiple ack_configure requests
|
||||
referencing the same configure event or to issue an ack_configure
|
||||
request referencing a configure event older than the last configure
|
||||
event acked for a given lock surface.
|
||||
</description>
|
||||
<arg name="serial" type="uint" summary="serial from the configure event"/>
|
||||
</request>
|
||||
|
||||
<event name="configure">
|
||||
<description summary="the client should resize its surface">
|
||||
This event is sent once on binding the interface and may be sent again
|
||||
at the compositor's discretion, for example if output geometry changes.
|
||||
|
||||
The width and height are in surface-local coordinates and are exact
|
||||
requirements. Failing to match these surface dimensions in the next
|
||||
commit after acking a configure is a protocol error.
|
||||
</description>
|
||||
<arg name="serial" type="uint" summary="serial for use in ack_configure"/>
|
||||
<arg name="width" type="uint"/>
|
||||
<arg name="height" type="uint"/>
|
||||
</event>
|
||||
</interface>
|
||||
</protocol>
|
||||
@@ -26,7 +26,7 @@ AgentSocket::AgentSocket(QObject *parent)
|
||||
continue;
|
||||
}
|
||||
auto buffer = std::make_shared<QByteArray>();
|
||||
connect(socket, &QLocalSocket::readyRead, this, [this, socket, buffer] {
|
||||
connect(socket, &QLocalSocket::readyRead, this, [this, socket, buffer, cred] {
|
||||
*buffer += socket->readAll();
|
||||
if (buffer->size() > 64 * 1024) {
|
||||
socket->abort();
|
||||
@@ -36,8 +36,12 @@ AgentSocket::AgentSocket(QObject *parent)
|
||||
while ((nl = buffer->indexOf('\n')) >= 0) {
|
||||
const QJsonObject o = QJsonDocument::fromJson(buffer->left(nl)).object();
|
||||
buffer->remove(0, nl + 1);
|
||||
if (o.value(u"event").toString() == u"scan") {
|
||||
const QString what = o.value(u"event").toString();
|
||||
if (what == u"scan") {
|
||||
Q_EMIT scanEvent(o);
|
||||
} else if (what == u"lock" && cred.uid == ::getuid()) {
|
||||
m_waiting.append(socket);
|
||||
Q_EMIT lockRequested();
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -58,6 +62,37 @@ bool AgentSocket::running()
|
||||
return probe.waitForConnected(500);
|
||||
}
|
||||
|
||||
bool AgentSocket::requestLock()
|
||||
{
|
||||
QLocalSocket socket;
|
||||
socket.connectToServer(path());
|
||||
if (!socket.waitForConnected(500)) {
|
||||
return false;
|
||||
}
|
||||
socket.write(QJsonDocument(QJsonObject{{QStringLiteral("event"), QStringLiteral("lock")}}).toJson(QJsonDocument::Compact) + '\n');
|
||||
if (!socket.waitForBytesWritten(500)) {
|
||||
return false;
|
||||
}
|
||||
// The answer comes once the compositor has the lock, so that an idle
|
||||
// daemon that locks before sleep does not suspend an unlocked screen.
|
||||
QByteArray answer;
|
||||
while (!answer.contains('\n') && socket.waitForReadyRead(5000)) {
|
||||
answer += socket.readAll();
|
||||
}
|
||||
return QJsonDocument::fromJson(answer.left(answer.indexOf('\n'))).object().value(u"event").toString() == u"locked";
|
||||
}
|
||||
|
||||
void AgentSocket::confirmLock()
|
||||
{
|
||||
for (const QPointer<QLocalSocket> &socket : std::as_const(m_waiting)) {
|
||||
if (socket) {
|
||||
socket->write(QJsonDocument(QJsonObject{{QStringLiteral("event"), QStringLiteral("locked")}}).toJson(QJsonDocument::Compact) + '\n');
|
||||
socket->flush();
|
||||
}
|
||||
}
|
||||
m_waiting.clear();
|
||||
}
|
||||
|
||||
bool AgentSocket::listen()
|
||||
{
|
||||
const QString p = path();
|
||||
|
||||
+11
-1
@@ -7,13 +7,16 @@
|
||||
// it is idle).
|
||||
//
|
||||
// Only root and this user may talk here, and all they can do is make the
|
||||
// bubble move.
|
||||
// bubble move, or (this user) ask for face-unlock's own lock screen.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QJsonObject>
|
||||
#include <QList>
|
||||
#include <QLocalServer>
|
||||
#include <QLocalSocket>
|
||||
#include <QObject>
|
||||
#include <QPointer>
|
||||
|
||||
class AgentSocket : public QObject
|
||||
{
|
||||
@@ -26,11 +29,18 @@ public:
|
||||
// session starts the agent from its own config, and that must not make
|
||||
// two of them.
|
||||
static bool running();
|
||||
// Ask the running agent to lock the screen, and wait until it is. False
|
||||
// when there is no agent or the lock did not come.
|
||||
static bool requestLock();
|
||||
// Tell everybody waiting in requestLock() that the screen is locked.
|
||||
void confirmLock();
|
||||
static QString path();
|
||||
|
||||
Q_SIGNALS:
|
||||
void scanEvent(const QJsonObject &event);
|
||||
void lockRequested();
|
||||
|
||||
private:
|
||||
QLocalServer m_server;
|
||||
QList<QPointer<QLocalSocket>> m_waiting;
|
||||
};
|
||||
@@ -175,6 +175,9 @@ InputWatcher::~InputWatcher() = default;
|
||||
void InputWatcher::watch(int calmMs)
|
||||
{
|
||||
stop();
|
||||
m_watching = true;
|
||||
m_calmMs = calmMs;
|
||||
m_calm.start();
|
||||
auto *wayland = qGuiApp->nativeInterface<QNativeInterface::QWaylandApplication>();
|
||||
if (!m_notifier->isActive() || !wayland || !wayland->seat()) {
|
||||
if (!m_mutter && QDBusConnection::sessionBus().interface()->isServiceRegistered(MutterService)) {
|
||||
@@ -205,8 +208,18 @@ void InputWatcher::watch(int calmMs)
|
||||
});
|
||||
}
|
||||
|
||||
void InputWatcher::noteInput()
|
||||
{
|
||||
if (m_watching && m_calm.elapsed() >= m_calmMs) {
|
||||
m_watching = false;
|
||||
QMetaObject::invokeMethod(this, &InputWatcher::input, Qt::QueuedConnection);
|
||||
}
|
||||
m_calm.restart();
|
||||
}
|
||||
|
||||
void InputWatcher::stop()
|
||||
{
|
||||
m_watching = false;
|
||||
m_notification.reset();
|
||||
if (m_mutter) {
|
||||
m_mutter->stop();
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QElapsedTimer>
|
||||
#include <QObject>
|
||||
|
||||
#include <memory>
|
||||
@@ -29,6 +30,9 @@ public:
|
||||
// calmMs. 0: the next input. Replaces what was watched before.
|
||||
void watch(int calmMs);
|
||||
void stop();
|
||||
// A key or the pointer on face-unlock's own lock screen, which sees them
|
||||
// itself. Counts like input the compositor reports.
|
||||
void noteInput();
|
||||
|
||||
Q_SIGNALS:
|
||||
void input();
|
||||
@@ -37,4 +41,7 @@ private:
|
||||
std::unique_ptr<IdleNotifier> m_notifier;
|
||||
std::unique_ptr<IdleNotification> m_notification;
|
||||
MutterIdle *m_mutter = nullptr;
|
||||
bool m_watching = false;
|
||||
int m_calmMs = 0;
|
||||
QElapsedTimer m_calm;
|
||||
};
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
#include "bubblecontroller.h"
|
||||
#include "daemonclient.h"
|
||||
#include "lockscreencontroller.h"
|
||||
#include "userconfig.h"
|
||||
|
||||
#include <QDBusConnection>
|
||||
@@ -23,11 +24,18 @@ constexpr int CalmBeforeRetryMs = 2000;
|
||||
constexpr int ScanAfterWakeMs = 1000;
|
||||
} // namespace
|
||||
|
||||
LockController::LockController(BubbleController *bubble, UserConfig *config, QObject *parent)
|
||||
LockController::LockController(BubbleController *bubble, UserConfig *config, SessionLock *lock, LockScreenController *screen, QObject *parent)
|
||||
: QObject(parent)
|
||||
, m_bubble(bubble)
|
||||
, m_config(config)
|
||||
, m_screen(screen)
|
||||
{
|
||||
if (lock) {
|
||||
m_lock.setOwnLock(lock);
|
||||
}
|
||||
if (screen) {
|
||||
connect(screen, &LockScreenController::input, &m_input, &InputWatcher::noteInput);
|
||||
}
|
||||
m_armTimer.setSingleShot(true);
|
||||
connect(&m_armTimer, &QTimer::timeout, this, [this] {
|
||||
arm(0);
|
||||
@@ -68,7 +76,11 @@ void LockController::onLockedChanged(bool locked)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!m_config->lockScreen()) {
|
||||
const bool face = m_config->enabled() && m_config->lockScreen();
|
||||
if (m_screen) {
|
||||
m_screen->setFaceUnlock(face);
|
||||
}
|
||||
if (!face) {
|
||||
return;
|
||||
}
|
||||
m_locked = true;
|
||||
|
||||
@@ -26,13 +26,16 @@
|
||||
|
||||
class BubbleController;
|
||||
class DaemonRequest;
|
||||
class LockScreenController;
|
||||
class SessionLock;
|
||||
class UserConfig;
|
||||
|
||||
class LockController : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
LockController(BubbleController *bubble, UserConfig *config, QObject *parent = nullptr);
|
||||
// lock and screen are face-unlock's own lock screen, where there is one.
|
||||
LockController(BubbleController *bubble, UserConfig *config, SessionLock *lock, LockScreenController *screen, QObject *parent = nullptr);
|
||||
|
||||
bool locked() const
|
||||
{
|
||||
@@ -53,6 +56,7 @@ private:
|
||||
|
||||
BubbleController *m_bubble;
|
||||
UserConfig *m_config;
|
||||
LockScreenController *m_screen;
|
||||
bool m_locked = false;
|
||||
bool m_stopped = false;
|
||||
QElapsedTimer m_lockedFor;
|
||||
|
||||
@@ -0,0 +1,197 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "lockscreencontroller.h"
|
||||
|
||||
#include <KLocalizedString>
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QFile>
|
||||
#include <QPointer>
|
||||
|
||||
#include <security/pam_appl.h>
|
||||
|
||||
#include <cstring>
|
||||
#include <pwd.h>
|
||||
#include <thread>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace
|
||||
{
|
||||
struct Conversation {
|
||||
QByteArray password;
|
||||
};
|
||||
|
||||
// Answers every hidden question with the password and every other one with
|
||||
// nothing, as a lock screen that only asks for the password has to.
|
||||
int converse(int count, const pam_message **messages, pam_response **responses, void *data)
|
||||
{
|
||||
auto *conversation = static_cast<Conversation *>(data);
|
||||
auto *answers = static_cast<pam_response *>(calloc(size_t(count), sizeof(pam_response)));
|
||||
if (!answers) {
|
||||
return PAM_BUF_ERR;
|
||||
}
|
||||
for (int i = 0; i < count; ++i) {
|
||||
if (messages[i]->msg_style == PAM_PROMPT_ECHO_OFF) {
|
||||
answers[i].resp = strdup(conversation->password.constData());
|
||||
} else if (messages[i]->msg_style == PAM_PROMPT_ECHO_ON) {
|
||||
answers[i].resp = strdup("");
|
||||
}
|
||||
}
|
||||
*responses = answers;
|
||||
return PAM_SUCCESS;
|
||||
}
|
||||
|
||||
QByteArray serviceName()
|
||||
{
|
||||
static const char *const services[] = {"face-unlock-lock", "password-auth", "common-auth", "login"};
|
||||
static const char *const dirs[] = {"/etc/pam.d/", "/usr/lib/pam.d/", "/usr/share/pam.d/"};
|
||||
for (const char *service : services) {
|
||||
for (const char *dir : dirs) {
|
||||
if (QFile::exists(QString::fromLatin1(dir) + QString::fromLatin1(service))) {
|
||||
return service;
|
||||
}
|
||||
}
|
||||
}
|
||||
return "login";
|
||||
}
|
||||
|
||||
bool checkPassword(const QByteArray &user, const QByteArray &password)
|
||||
{
|
||||
Conversation conversation{password};
|
||||
const pam_conv conv{converse, &conversation};
|
||||
pam_handle_t *pamh = nullptr;
|
||||
// For development only, like the daemon's --socket: a directory of PAM
|
||||
// files of its own, so a test never counts as a wrong password for the
|
||||
// real account.
|
||||
const QByteArray confdir = qgetenv("FU_PAM_CONFDIR");
|
||||
int rc = confdir.isEmpty() ? pam_start(serviceName().constData(), user.constData(), &conv, &pamh)
|
||||
: pam_start_confdir("face-unlock-lock", user.constData(), &conv, confdir.constData(), &pamh);
|
||||
if (rc == PAM_SUCCESS) {
|
||||
rc = pam_authenticate(pamh, 0);
|
||||
if (rc == PAM_SUCCESS) {
|
||||
pam_setcred(pamh, PAM_REFRESH_CRED);
|
||||
}
|
||||
}
|
||||
pam_end(pamh, rc);
|
||||
std::memset(conversation.password.data(), 0, size_t(conversation.password.size()));
|
||||
return rc == PAM_SUCCESS;
|
||||
}
|
||||
|
||||
passwd *me()
|
||||
{
|
||||
return getpwuid(getuid());
|
||||
}
|
||||
} // namespace
|
||||
|
||||
LockScreenController::LockScreenController(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
}
|
||||
|
||||
LockScreenController::~LockScreenController()
|
||||
{
|
||||
clearPassword();
|
||||
}
|
||||
|
||||
void LockScreenController::setPassword(const QString &password)
|
||||
{
|
||||
if (m_password == password) {
|
||||
return;
|
||||
}
|
||||
m_password = password;
|
||||
Q_EMIT passwordChanged();
|
||||
if (!m_message.isEmpty()) {
|
||||
m_message.clear();
|
||||
Q_EMIT messageChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void LockScreenController::setFaceUnlock(bool on)
|
||||
{
|
||||
if (m_faceUnlock != on) {
|
||||
m_faceUnlock = on;
|
||||
Q_EMIT faceUnlockChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void LockScreenController::setBlur(bool blur)
|
||||
{
|
||||
if (m_blur != blur) {
|
||||
m_blur = blur;
|
||||
Q_EMIT blurChanged();
|
||||
}
|
||||
}
|
||||
|
||||
QString LockScreenController::userName() const
|
||||
{
|
||||
const passwd *pw = me();
|
||||
if (!pw) {
|
||||
return {};
|
||||
}
|
||||
// The full name from the comment field, else the login name.
|
||||
const QString full = QString::fromLocal8Bit(pw->pw_gecos).section(u',', 0, 0).trimmed();
|
||||
return full.isEmpty() ? QString::fromLocal8Bit(pw->pw_name) : full;
|
||||
}
|
||||
|
||||
void LockScreenController::submit()
|
||||
{
|
||||
if (m_busy || m_password.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
const passwd *pw = me();
|
||||
if (!pw) {
|
||||
return;
|
||||
}
|
||||
m_busy = true;
|
||||
Q_EMIT busyChanged();
|
||||
|
||||
const QByteArray user(pw->pw_name);
|
||||
QByteArray password = m_password.toUtf8();
|
||||
QPointer<LockScreenController> self(this);
|
||||
std::thread([self, user, password]() mutable {
|
||||
const bool ok = checkPassword(user, password);
|
||||
std::memset(password.data(), 0, size_t(password.size()));
|
||||
QMetaObject::invokeMethod(qApp, [self, ok] {
|
||||
if (self) {
|
||||
self->finish(ok);
|
||||
}
|
||||
});
|
||||
}).detach();
|
||||
}
|
||||
|
||||
void LockScreenController::finish(bool ok)
|
||||
{
|
||||
m_busy = false;
|
||||
Q_EMIT busyChanged();
|
||||
clearPassword();
|
||||
Q_EMIT passwordChanged();
|
||||
if (ok) {
|
||||
Q_EMIT authenticated();
|
||||
return;
|
||||
}
|
||||
m_message = i18n("Wrong password");
|
||||
Q_EMIT messageChanged();
|
||||
Q_EMIT rejected();
|
||||
}
|
||||
|
||||
void LockScreenController::activity()
|
||||
{
|
||||
Q_EMIT input();
|
||||
}
|
||||
|
||||
void LockScreenController::clearPassword()
|
||||
{
|
||||
// What is still in memory of it, as far as a QString lets that happen.
|
||||
m_password.fill(u' ');
|
||||
m_password.clear();
|
||||
}
|
||||
|
||||
void LockScreenController::reset()
|
||||
{
|
||||
clearPassword();
|
||||
Q_EMIT passwordChanged();
|
||||
if (!m_message.isEmpty()) {
|
||||
m_message.clear();
|
||||
Q_EMIT messageChanged();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
//
|
||||
// The own lock screen's side of things (see SessionLock): the password,
|
||||
// whether it is being checked, what to say under it.
|
||||
//
|
||||
// The password is checked with PAM in a thread of its own, the way swaylock
|
||||
// and hyprlock do it. The service is face-unlock-lock when an administrator
|
||||
// has written one, else the distribution's plain password stack:
|
||||
// password-auth (Fedora), common-auth (Debian, Ubuntu) or login. Not the face
|
||||
// module: the face has its own way in here, the agent.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
|
||||
class LockScreenController : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged)
|
||||
Q_PROPERTY(bool busy READ busy NOTIFY busyChanged)
|
||||
// After a wrong password, until the next key.
|
||||
Q_PROPERTY(QString message READ message NOTIFY messageChanged)
|
||||
// Whether the face is looked for, which changes what the screen says.
|
||||
Q_PROPERTY(bool faceUnlock READ faceUnlock NOTIFY faceUnlockChanged)
|
||||
Q_PROPERTY(QString userName READ userName CONSTANT)
|
||||
// Whether to blur the picture behind it.
|
||||
Q_PROPERTY(bool blur READ blur NOTIFY blurChanged)
|
||||
public:
|
||||
explicit LockScreenController(QObject *parent = nullptr);
|
||||
~LockScreenController() override;
|
||||
|
||||
QString password() const
|
||||
{
|
||||
return m_password;
|
||||
}
|
||||
void setPassword(const QString &password);
|
||||
bool busy() const
|
||||
{
|
||||
return m_busy;
|
||||
}
|
||||
QString message() const
|
||||
{
|
||||
return m_message;
|
||||
}
|
||||
bool faceUnlock() const
|
||||
{
|
||||
return m_faceUnlock;
|
||||
}
|
||||
void setFaceUnlock(bool on);
|
||||
QString userName() const;
|
||||
bool blur() const
|
||||
{
|
||||
return m_blur;
|
||||
}
|
||||
void setBlur(bool blur);
|
||||
|
||||
// Check the password typed so far.
|
||||
Q_INVOKABLE void submit();
|
||||
// A key or the pointer on the lock screen.
|
||||
Q_INVOKABLE void activity();
|
||||
|
||||
// A fresh lock: no password, nothing said.
|
||||
void reset();
|
||||
|
||||
Q_SIGNALS:
|
||||
void passwordChanged();
|
||||
void busyChanged();
|
||||
void messageChanged();
|
||||
void faceUnlockChanged();
|
||||
void blurChanged();
|
||||
void authenticated();
|
||||
// A wrong password, for the field to shake.
|
||||
void rejected();
|
||||
void input();
|
||||
|
||||
private:
|
||||
void finish(bool ok);
|
||||
void clearPassword();
|
||||
|
||||
QString m_password;
|
||||
QString m_message;
|
||||
bool m_busy = false;
|
||||
bool m_faceUnlock = true;
|
||||
bool m_blur = false;
|
||||
};
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "lockwatcher.h"
|
||||
|
||||
#include "lockers.h"
|
||||
#include "sessionlock.h"
|
||||
#include "wayland.h"
|
||||
|
||||
#include <QDBusConnection>
|
||||
@@ -162,14 +163,20 @@ void LockWatcher::pollLockers()
|
||||
update();
|
||||
}
|
||||
|
||||
void LockWatcher::setOwnLock(SessionLock *lock)
|
||||
{
|
||||
m_own = lock;
|
||||
connect(lock, &SessionLock::lockedChanged, this, &LockWatcher::update);
|
||||
}
|
||||
|
||||
bool LockWatcher::canUnlock() const
|
||||
{
|
||||
return !m_ownLockers || m_lockerRunning;
|
||||
return (m_own && m_own->isLocked()) || !m_ownLockers || m_lockerRunning;
|
||||
}
|
||||
|
||||
void LockWatcher::update()
|
||||
{
|
||||
const bool locked = m_screenSaver || m_lockedHint || m_lockerRunning;
|
||||
const bool locked = m_screenSaver || m_lockedHint || m_lockerRunning || (m_own && m_own->isLocked());
|
||||
if (locked != m_locked) {
|
||||
m_locked = locked;
|
||||
Q_EMIT lockedChanged(locked);
|
||||
@@ -178,6 +185,10 @@ void LockWatcher::update()
|
||||
|
||||
void LockWatcher::unlock()
|
||||
{
|
||||
if (m_own && m_own->isLocked()) {
|
||||
m_own->unlock();
|
||||
return;
|
||||
}
|
||||
// Looked up again rather than taken from the last poll: a second is
|
||||
// long enough for a pid to belong to something else.
|
||||
Lockers::signal(SIGUSR1);
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
// (ext-session-lock).
|
||||
//
|
||||
// hyprlock and swaylock do not listen to logind. They unlock on SIGUSR1.
|
||||
// Any other lock screen of that kind only opens itself: it gets the face
|
||||
// through the PAM module in its own stack (see src/lib/pam.sh), when Enter is
|
||||
// pressed.
|
||||
// face-unlock's own lock screen (SessionLock) is simply told to. Any other
|
||||
// lock screen of that kind only opens itself: it gets the face through the
|
||||
// PAM module in its own stack (see src/lib/pam.sh), when Enter is pressed.
|
||||
//
|
||||
// None of this lowers the bar: any program running as this user can already
|
||||
// ask logind to unlock the session, or send its own lock screen a signal. The
|
||||
@@ -28,6 +28,8 @@
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
class SessionLock;
|
||||
|
||||
class LockWatcher : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -42,6 +44,7 @@ public:
|
||||
// logind unlocks (Plasma, GNOME), only hyprlock and swaylock elsewhere.
|
||||
bool canUnlock() const;
|
||||
void unlock();
|
||||
void setOwnLock(SessionLock *lock);
|
||||
|
||||
Q_SIGNALS:
|
||||
void lockedChanged(bool locked);
|
||||
@@ -63,6 +66,7 @@ private:
|
||||
bool m_locked = false;
|
||||
// The compositor's lock screen is a program of its own.
|
||||
bool m_ownLockers = false;
|
||||
SessionLock *m_own = nullptr;
|
||||
QString m_session;
|
||||
QTimer m_poll;
|
||||
};
|
||||
+155
-2
@@ -5,6 +5,9 @@
|
||||
// (no arguments) stay in the background: unlock the lock screen by face,
|
||||
// and show the bubble for every scan
|
||||
// --enroll open the window that sets up a face
|
||||
// --lock lock the screen: with face-unlock's own lock screen
|
||||
// where the lock screen is a program of its own (Hyprland,
|
||||
// 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
|
||||
|
||||
@@ -14,6 +17,8 @@
|
||||
#include "bubblewindow.h"
|
||||
#include "enrollcontroller.h"
|
||||
#include "lockcontroller.h"
|
||||
#include "lockscreencontroller.h"
|
||||
#include "sessionlock.h"
|
||||
#include "userconfig.h"
|
||||
#include "wayland.h"
|
||||
|
||||
@@ -23,11 +28,17 @@
|
||||
#include <KLocalizedString>
|
||||
|
||||
#include <QCommandLineParser>
|
||||
#include <QDBusConnection>
|
||||
#include <QDBusMessage>
|
||||
#include <QFile>
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
#include <QQmlEngine>
|
||||
#include <QTimer>
|
||||
|
||||
#include <cstring>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace
|
||||
@@ -55,6 +66,92 @@ int runEnroll(QGuiApplication &app, const QString &name)
|
||||
return controller.state() == u"done" ? 0 : code;
|
||||
}
|
||||
|
||||
// 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;
|
||||
|
||||
void signalReady(bool ok)
|
||||
{
|
||||
if (readyFd >= 0) {
|
||||
if (ok) {
|
||||
[[maybe_unused]] const ssize_t n = write(readyFd, "1", 1);
|
||||
}
|
||||
close(readyFd);
|
||||
readyFd = -1;
|
||||
}
|
||||
}
|
||||
|
||||
// Whether an agent listens on its socket. Asked before Qt is up, to decide
|
||||
// whether to fork.
|
||||
bool agentListening()
|
||||
{
|
||||
const char *runtime = getenv("XDG_RUNTIME_DIR");
|
||||
if (!runtime) {
|
||||
return false;
|
||||
}
|
||||
sockaddr_un addr{};
|
||||
addr.sun_family = AF_UNIX;
|
||||
const int len = snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/face-unlock/agent.socket", runtime);
|
||||
if (len <= 0 || size_t(len) >= sizeof(addr.sun_path)) {
|
||||
return false;
|
||||
}
|
||||
const int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
|
||||
const bool ok = fd >= 0 && connect(fd, reinterpret_cast<sockaddr *>(&addr), sizeof(addr)) == 0;
|
||||
if (fd >= 0) {
|
||||
close(fd);
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
// With no agent running, --lock stays behind as the lock screen until it is
|
||||
// unlocked. The command that asked for it returns as soon as the screen is
|
||||
// locked, the way swaylock -f does: an idle daemon locking before sleep
|
||||
// waits for that, and not a moment longer.
|
||||
void forkForLock(int argc, char **argv)
|
||||
{
|
||||
bool lock = false;
|
||||
for (int i = 1; i < argc; ++i) {
|
||||
lock = lock || std::strcmp(argv[i], "--lock") == 0;
|
||||
}
|
||||
int fds[2];
|
||||
if (!lock || agentListening() || pipe(fds) != 0) {
|
||||
return;
|
||||
}
|
||||
const pid_t pid = fork();
|
||||
if (pid < 0) {
|
||||
close(fds[0]);
|
||||
close(fds[1]);
|
||||
return;
|
||||
}
|
||||
if (pid > 0) {
|
||||
close(fds[1]);
|
||||
char c = 0;
|
||||
const bool locked = read(fds[0], &c, 1) == 1;
|
||||
_exit(locked ? 0 : 1);
|
||||
}
|
||||
close(fds[0]);
|
||||
setsid();
|
||||
readyFd = fds[1];
|
||||
}
|
||||
|
||||
// Plasma and GNOME lock with their own lock screen when logind asks them to,
|
||||
// as `loginctl lock-session` does.
|
||||
int lockThroughLogind()
|
||||
{
|
||||
const QString id = qEnvironmentVariable("XDG_SESSION_ID");
|
||||
QDBusMessage call = QDBusMessage::createMethodCall(QStringLiteral("org.freedesktop.login1"),
|
||||
QStringLiteral("/org/freedesktop/login1"),
|
||||
QStringLiteral("org.freedesktop.login1.Manager"),
|
||||
QStringLiteral("LockSession"));
|
||||
call << (id.isEmpty() ? QStringLiteral("auto") : id);
|
||||
const QDBusMessage reply = QDBusConnection::systemBus().call(call);
|
||||
if (reply.type() == QDBusMessage::ErrorMessage) {
|
||||
qWarning("logind would not lock: %s", qPrintable(reply.errorMessage()));
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// The whole life of a bubble, twice: a face that is recognised after a blink,
|
||||
// then one that is not.
|
||||
void scheduleDemo(BubbleController *bubble)
|
||||
@@ -77,6 +174,7 @@ void scheduleDemo(BubbleController *bubble)
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
forkForLock(argc, argv);
|
||||
QGuiApplication app(argc, argv);
|
||||
app.setApplicationName(QStringLiteral("face-unlock-agent"));
|
||||
app.setApplicationVersion(QStringLiteral(FU_VERSION));
|
||||
@@ -89,10 +187,11 @@ int main(int argc, char **argv)
|
||||
parser.addVersionOption();
|
||||
const QCommandLineOption enrollOpt(QStringLiteral("enroll"), i18n("Set up a face."));
|
||||
const QCommandLineOption nameOpt(QStringLiteral("name"), i18n("What to call the new face."), QStringLiteral("name"));
|
||||
const QCommandLineOption lockOpt(QStringLiteral("lock"), i18n("Lock the screen."));
|
||||
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, demoOpt, styleOpt});
|
||||
parser.addOptions({enrollOpt, nameOpt, lockOpt, demoOpt, styleOpt});
|
||||
parser.process(app);
|
||||
|
||||
if (parser.isSet(enrollOpt)) {
|
||||
@@ -103,6 +202,13 @@ int main(int argc, char **argv)
|
||||
return runEnroll(app, name);
|
||||
}
|
||||
|
||||
const bool lockNow = parser.isSet(lockOpt);
|
||||
if (lockNow && !SessionLock::available()) {
|
||||
const int rc = lockThroughLogind();
|
||||
signalReady(rc == 0);
|
||||
return rc;
|
||||
}
|
||||
|
||||
app.setQuitOnLastWindowClosed(false);
|
||||
QQmlEngine engine;
|
||||
KLocalization::setupLocalizedContext(&engine);
|
||||
@@ -131,6 +237,9 @@ int main(int argc, char **argv)
|
||||
|
||||
AgentSocket socket;
|
||||
if (AgentSocket::running()) {
|
||||
if (lockNow) {
|
||||
return AgentSocket::requestLock() ? 0 : 1;
|
||||
}
|
||||
qInfo("an agent is already running in this session");
|
||||
return 0;
|
||||
}
|
||||
@@ -141,6 +250,50 @@ int main(int argc, char **argv)
|
||||
service = std::make_unique<BubbleService>(&bubble);
|
||||
}
|
||||
|
||||
LockController lock(&bubble, &config);
|
||||
LockScreenController screen;
|
||||
std::unique_ptr<SessionLock> sessionLock;
|
||||
if (SessionLock::available()) {
|
||||
sessionLock = std::make_unique<SessionLock>(&engine, &bubble, &screen, &config);
|
||||
SessionLock *lock = sessionLock.get();
|
||||
QObject::connect(&socket, &AgentSocket::lockRequested, lock, [lock, &socket] {
|
||||
lock->lock();
|
||||
if (lock->isConfirmed()) {
|
||||
socket.confirmLock();
|
||||
}
|
||||
});
|
||||
QObject::connect(lock, &SessionLock::confirmed, &socket, &AgentSocket::confirmLock);
|
||||
}
|
||||
LockController lock(&bubble, &config, sessionLock.get(), &screen);
|
||||
|
||||
if (lockNow) {
|
||||
// No agent was running, so this one is only here for the lock. It
|
||||
// goes once the lock is gone and the bubble has finished.
|
||||
QObject::connect(sessionLock.get(), &SessionLock::lockedChanged, &app, [&bubble](bool locked) {
|
||||
if (locked) {
|
||||
return;
|
||||
}
|
||||
if (!bubble.shown()) {
|
||||
QCoreApplication::quit();
|
||||
}
|
||||
QObject::connect(&bubble, &BubbleController::shownChanged, qApp, [&bubble] {
|
||||
if (!bubble.shown()) {
|
||||
QCoreApplication::quit();
|
||||
}
|
||||
});
|
||||
QTimer::singleShot(5000, qApp, &QCoreApplication::quit);
|
||||
});
|
||||
QObject::connect(sessionLock.get(), &SessionLock::confirmed, &app, [] {
|
||||
signalReady(true);
|
||||
});
|
||||
sessionLock->lock();
|
||||
if (!sessionLock->isLocked()) {
|
||||
signalReady(false);
|
||||
return 1;
|
||||
}
|
||||
} else if (sessionLock && QFile::exists(SessionLock::markerPath())) {
|
||||
// The last agent went away with the screen locked, and the compositor
|
||||
// kept it locked. Take the lock back, so it can be opened again.
|
||||
sessionLock->lock();
|
||||
}
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,204 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
//
|
||||
// face-unlock's own lock screen, one per screen (see SessionLock): the time,
|
||||
// the password, and on the main screen the bubble at the top, the same one
|
||||
// that shows over the desktop. Behind it the desktop's picture, or the one
|
||||
// the user set (see Wallpaper).
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Effects
|
||||
|
||||
Item {
|
||||
id: root
|
||||
|
||||
required property var lock
|
||||
required property var bubble
|
||||
required property bool primary
|
||||
required property url wallpaper
|
||||
|
||||
property date now: new Date()
|
||||
Timer {
|
||||
interval: 1000
|
||||
running: true
|
||||
repeat: true
|
||||
onTriggered: root.now = new Date()
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
gradient: Gradient {
|
||||
GradientStop { position: 0; color: "#11161D" }
|
||||
GradientStop { position: 0.6; color: "#000000" }
|
||||
}
|
||||
}
|
||||
|
||||
// Loaded aside, so a big picture does not hold up the lock, and faded in.
|
||||
Item {
|
||||
anchors.fill: parent
|
||||
opacity: picture.status === Image.Ready ? 1 : 0
|
||||
visible: opacity > 0
|
||||
Behavior on opacity {
|
||||
NumberAnimation { duration: 200 }
|
||||
}
|
||||
|
||||
Image {
|
||||
id: picture
|
||||
// Past the edges when blurred: the blur would pull in the nothing
|
||||
// beyond them and darken the rim.
|
||||
anchors.fill: parent
|
||||
anchors.margins: root.lock.blur ? -64 : 0
|
||||
source: root.wallpaper
|
||||
fillMode: Image.PreserveAspectCrop
|
||||
sourceSize: Qt.size(root.width, root.height)
|
||||
asynchronous: true
|
||||
cache: false
|
||||
layer.enabled: root.lock.blur
|
||||
layer.effect: MultiEffect {
|
||||
blurEnabled: true
|
||||
blur: 1
|
||||
blurMax: 64
|
||||
}
|
||||
}
|
||||
// Dimmed a little, so the time and the password read on any picture.
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color: "#000000"
|
||||
opacity: 0.35
|
||||
}
|
||||
}
|
||||
|
||||
// Any touch counts as somebody being back, and a click anywhere puts the
|
||||
// keys into the password.
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
acceptedButtons: Qt.AllButtons
|
||||
onPositionChanged: root.lock.activity()
|
||||
onPressed: {
|
||||
root.lock.activity()
|
||||
field.forceActiveFocus()
|
||||
}
|
||||
}
|
||||
|
||||
// Below the open bubble, which hangs from the top edge.
|
||||
Column {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
y: Math.max(Theme.topGap + Theme.openHeight + 24, Math.round(parent.height * 0.2))
|
||||
spacing: 2
|
||||
|
||||
Text {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
color: Theme.textPrimary
|
||||
font.pixelSize: Math.max(56, Math.min(120, Math.round(root.height * 0.11)))
|
||||
font.weight: Font.Light
|
||||
text: Qt.formatTime(root.now, Qt.locale().timeFormat(Locale.ShortFormat))
|
||||
}
|
||||
Text {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
color: Theme.textDetail
|
||||
font.pixelSize: 18
|
||||
font.weight: Font.Medium
|
||||
text: Qt.formatDate(root.now, Qt.locale().dateFormat(Locale.LongFormat))
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
y: Math.round(parent.height * 0.62)
|
||||
spacing: 12
|
||||
|
||||
Text {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
color: Theme.textPrimary
|
||||
font.pixelSize: 17
|
||||
font.weight: Font.DemiBold
|
||||
text: root.lock.userName
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: pill
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: 280
|
||||
height: 44
|
||||
radius: height / 2
|
||||
color: Theme.surfaceRaised
|
||||
opacity: root.lock.busy ? 0.6 : 1
|
||||
border.width: field.activeFocus ? 1 : 0
|
||||
border.color: Qt.rgba(1, 1, 1, 0.18)
|
||||
|
||||
property real shake: 0
|
||||
transform: Translate { x: pill.shake }
|
||||
SequentialAnimation {
|
||||
id: shakeAnimation
|
||||
NumberAnimation { target: pill; property: "shake"; to: -10; duration: 55; easing.type: Easing.OutQuad }
|
||||
NumberAnimation { target: pill; property: "shake"; to: 9; duration: 70 }
|
||||
NumberAnimation { target: pill; property: "shake"; to: -6; duration: 65 }
|
||||
NumberAnimation { target: pill; property: "shake"; to: 4; duration: 60 }
|
||||
NumberAnimation { target: pill; property: "shake"; to: 0; duration: 55; easing.type: Easing.OutQuad }
|
||||
}
|
||||
|
||||
TextInput {
|
||||
id: field
|
||||
anchors.fill: parent
|
||||
anchors.leftMargin: 20
|
||||
anchors.rightMargin: 20
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
echoMode: TextInput.Password
|
||||
passwordCharacter: "●"
|
||||
color: Theme.textPrimary
|
||||
selectionColor: Theme.accent
|
||||
font.pixelSize: 15
|
||||
clip: true
|
||||
focus: true
|
||||
// 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 {}
|
||||
readOnly: root.lock.busy
|
||||
text: root.lock.password
|
||||
onTextEdited: root.lock.password = text
|
||||
onAccepted: root.lock.submit()
|
||||
Keys.onPressed: event => {
|
||||
root.lock.activity()
|
||||
event.accepted = false
|
||||
}
|
||||
Component.onCompleted: forceActiveFocus()
|
||||
}
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
color: Theme.textSecondary
|
||||
font.pixelSize: 15
|
||||
text: i18n("Password")
|
||||
visible: field.text.length === 0
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: 360
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
wrapMode: Text.WordWrap
|
||||
color: root.lock.message.length > 0 ? Theme.failure : Theme.textDetail
|
||||
font.pixelSize: 13
|
||||
font.weight: Font.Medium
|
||||
text: root.lock.message.length > 0 ? root.lock.message
|
||||
: root.lock.faceUnlock ? i18n("Look at the camera or type your password")
|
||||
: i18n("Type your password")
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: root.lock
|
||||
function onRejected() {
|
||||
shakeAnimation.restart()
|
||||
}
|
||||
}
|
||||
|
||||
// The bubble, where it shows over the desktop too.
|
||||
Bubble {
|
||||
visible: root.primary
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
y: 0
|
||||
bubble: root.bubble
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,289 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "sessionlock.h"
|
||||
|
||||
#include "bubblecontroller.h"
|
||||
#include "lockscreencontroller.h"
|
||||
#include "userconfig.h"
|
||||
#include "wallpaper.h"
|
||||
#include "wayland.h"
|
||||
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QFileInfo>
|
||||
#include <QGuiApplication>
|
||||
#include <QQuickView>
|
||||
#include <QScreen>
|
||||
#include <QStandardPaths>
|
||||
#include <QUrl>
|
||||
#include <QtWaylandClient/private/qwaylanddisplay_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandintegration_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandscreen_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandshellintegration_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandshellsurface_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandsurface_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandwindow_p.h>
|
||||
|
||||
#include "qwayland-ext-session-lock-v1.h"
|
||||
|
||||
// The manager, and through it the role every lock window gets.
|
||||
class LockIntegration : public QtWaylandClient::QWaylandShellIntegrationTemplate<LockIntegration>, public QtWayland::ext_session_lock_manager_v1
|
||||
{
|
||||
public:
|
||||
LockIntegration()
|
||||
: QWaylandShellIntegrationTemplate<LockIntegration>(1)
|
||||
{
|
||||
}
|
||||
~LockIntegration() override
|
||||
{
|
||||
if (object()) {
|
||||
destroy();
|
||||
}
|
||||
}
|
||||
QtWaylandClient::QWaylandShellSurface *createShellSurface(QtWaylandClient::QWaylandWindow *window) override;
|
||||
|
||||
// The lock the surfaces belong to.
|
||||
::ext_session_lock_v1 *current = nullptr;
|
||||
};
|
||||
|
||||
// One screen's lock surface. Like LayerShellQt's layer surface: the size
|
||||
// comes from the compositor, and nothing is drawn before it has sent one.
|
||||
class LockSurface : public QtWaylandClient::QWaylandShellSurface, public QtWayland::ext_session_lock_surface_v1
|
||||
{
|
||||
public:
|
||||
LockSurface(::ext_session_lock_v1 *lock, QtWaylandClient::QWaylandWindow *window)
|
||||
: QWaylandShellSurface(window)
|
||||
{
|
||||
init(ext_session_lock_v1_get_lock_surface(lock, window->waylandSurface()->object(), window->waylandScreen()->output()));
|
||||
}
|
||||
~LockSurface() override
|
||||
{
|
||||
destroy();
|
||||
}
|
||||
bool isExposed() const override
|
||||
{
|
||||
return m_configured;
|
||||
}
|
||||
// Qt commits a new role at once, as xdg-shell wants. A lock surface must
|
||||
// not be committed before it has acknowledged its first size.
|
||||
bool commitSurfaceRole() const override
|
||||
{
|
||||
return false;
|
||||
}
|
||||
void applyConfigure() override
|
||||
{
|
||||
window()->resizeFromApplyConfigure(m_size);
|
||||
}
|
||||
|
||||
protected:
|
||||
void ext_session_lock_surface_v1_configure(uint32_t serial, uint32_t width, uint32_t height) override
|
||||
{
|
||||
ack_configure(serial);
|
||||
m_size = QSize(int(width), int(height));
|
||||
if (!m_configured) {
|
||||
m_configured = true;
|
||||
applyConfigure();
|
||||
window()->updateExposure();
|
||||
} else {
|
||||
window()->applyConfigureWhenPossible();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
QSize m_size;
|
||||
bool m_configured = false;
|
||||
};
|
||||
|
||||
QtWaylandClient::QWaylandShellSurface *LockIntegration::createShellSurface(QtWaylandClient::QWaylandWindow *window)
|
||||
{
|
||||
return new LockSurface(current, window);
|
||||
}
|
||||
|
||||
class Lock : public QtWayland::ext_session_lock_v1
|
||||
{
|
||||
public:
|
||||
Lock(::ext_session_lock_v1 *object, SessionLock *owner)
|
||||
: QtWayland::ext_session_lock_v1(object)
|
||||
, m_owner(owner)
|
||||
{
|
||||
}
|
||||
|
||||
protected:
|
||||
// Queued: not from inside the Wayland event, which the answer to it might
|
||||
// destroy.
|
||||
void ext_session_lock_v1_locked() override
|
||||
{
|
||||
QMetaObject::invokeMethod(m_owner, &SessionLock::onLocked, Qt::QueuedConnection);
|
||||
}
|
||||
void ext_session_lock_v1_finished() override
|
||||
{
|
||||
QMetaObject::invokeMethod(m_owner, &SessionLock::onFinished, Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
private:
|
||||
SessionLock *m_owner;
|
||||
};
|
||||
|
||||
SessionLock::SessionLock(QQmlEngine *engine, BubbleController *bubble, LockScreenController *screen, UserConfig *config, QObject *parent)
|
||||
: QObject(parent)
|
||||
, m_engine(engine)
|
||||
, m_bubble(bubble)
|
||||
, m_screen(screen)
|
||||
, m_config(config)
|
||||
{
|
||||
connect(qGuiApp, &QGuiApplication::screenAdded, this, [this](QScreen *s) {
|
||||
if (m_lock) {
|
||||
addScreen(s);
|
||||
}
|
||||
});
|
||||
connect(qGuiApp, &QGuiApplication::screenRemoved, this, &SessionLock::removeScreen);
|
||||
connect(m_screen, &LockScreenController::authenticated, this, &SessionLock::unlock);
|
||||
}
|
||||
|
||||
SessionLock::~SessionLock()
|
||||
{
|
||||
// Leaving with the lock held keeps the session locked, which is the
|
||||
// point. The windows go, the lock stays.
|
||||
qDeleteAll(m_views);
|
||||
delete m_lock;
|
||||
delete m_integration;
|
||||
}
|
||||
|
||||
bool SessionLock::available()
|
||||
{
|
||||
return Wayland::hasGlobal("ext_session_lock_manager_v1");
|
||||
}
|
||||
|
||||
QString SessionLock::markerPath()
|
||||
{
|
||||
return QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation) + QStringLiteral("/face-unlock/locked");
|
||||
}
|
||||
|
||||
void SessionLock::lock()
|
||||
{
|
||||
if (m_lock) {
|
||||
return;
|
||||
}
|
||||
auto *qpa = QtWaylandClient::QWaylandIntegration::instance();
|
||||
if (!m_integration && qpa) {
|
||||
m_integration = new LockIntegration;
|
||||
if (!m_integration->initialize(qpa->display())) {
|
||||
delete m_integration;
|
||||
m_integration = nullptr;
|
||||
}
|
||||
}
|
||||
if (!m_integration) {
|
||||
qWarning("the compositor has no ext_session_lock_manager_v1, so this cannot lock the screen");
|
||||
return;
|
||||
}
|
||||
|
||||
m_confirmed = false;
|
||||
m_unlockWanted = false;
|
||||
m_lock = new Lock(m_integration->lock(), this);
|
||||
m_integration->current = m_lock->object();
|
||||
m_screen->reset();
|
||||
m_pictures = Wallpaper::forLock(m_config->lockWallpaper());
|
||||
m_screen->setBlur(m_config->lockBlur());
|
||||
for (QScreen *s : QGuiApplication::screens()) {
|
||||
addScreen(s);
|
||||
}
|
||||
|
||||
QDir().mkpath(QFileInfo(markerPath()).absolutePath());
|
||||
QFile marker(markerPath());
|
||||
if (!marker.open(QIODevice::WriteOnly)) {
|
||||
qWarning("cannot write %s", qPrintable(markerPath()));
|
||||
}
|
||||
Q_EMIT lockedChanged(true);
|
||||
}
|
||||
|
||||
void SessionLock::addScreen(QScreen *screen)
|
||||
{
|
||||
if (m_views.contains(screen) || !dynamic_cast<QtWaylandClient::QWaylandScreen *>(screen->handle())) {
|
||||
return;
|
||||
}
|
||||
auto *view = new QQuickView(m_engine, nullptr);
|
||||
view->setColor(Qt::black);
|
||||
view->setScreen(screen);
|
||||
view->setResizeMode(QQuickView::SizeRootObjectToView);
|
||||
view->resize(screen->size());
|
||||
view->setInitialProperties({{QStringLiteral("lock"), QVariant::fromValue(m_screen)},
|
||||
{QStringLiteral("bubble"), QVariant::fromValue(m_bubble)},
|
||||
{QStringLiteral("wallpaper"), Wallpaper::pick(m_pictures, screen->name())},
|
||||
{QStringLiteral("primary"), screen == QGuiApplication::primaryScreen()}});
|
||||
view->loadFromModule(QStringLiteral("FaceUnlock"), QStringLiteral("LockScreen"));
|
||||
for (const QQmlError &e : view->errors()) {
|
||||
qWarning("%s", qPrintable(e.toString()));
|
||||
}
|
||||
view->create();
|
||||
if (auto *wayland = dynamic_cast<QtWaylandClient::QWaylandWindow *>(view->handle())) {
|
||||
wayland->setShellIntegration(m_integration);
|
||||
}
|
||||
view->show();
|
||||
view->requestActivate();
|
||||
m_views.insert(screen, view);
|
||||
}
|
||||
|
||||
void SessionLock::removeScreen(QScreen *screen)
|
||||
{
|
||||
if (auto view = m_views.take(screen)) {
|
||||
delete view;
|
||||
}
|
||||
}
|
||||
|
||||
void SessionLock::onLocked()
|
||||
{
|
||||
if (!m_lock) {
|
||||
return;
|
||||
}
|
||||
m_confirmed = true;
|
||||
Q_EMIT confirmed();
|
||||
if (m_unlockWanted) {
|
||||
unlock();
|
||||
}
|
||||
}
|
||||
|
||||
void SessionLock::onFinished()
|
||||
{
|
||||
if (!m_lock) {
|
||||
return;
|
||||
}
|
||||
// Refused (another lock screen is up) or ended by the compositor.
|
||||
if (m_confirmed) {
|
||||
m_lock->unlock_and_destroy();
|
||||
} else {
|
||||
qWarning("the compositor did not let this lock the screen; is another lock screen running?");
|
||||
m_lock->destroy();
|
||||
}
|
||||
release();
|
||||
}
|
||||
|
||||
void SessionLock::unlock()
|
||||
{
|
||||
if (!m_lock) {
|
||||
return;
|
||||
}
|
||||
// Unlocking before the compositor has confirmed the lock is a protocol
|
||||
// error. It follows as soon as it has.
|
||||
if (!m_confirmed) {
|
||||
m_unlockWanted = true;
|
||||
return;
|
||||
}
|
||||
m_lock->unlock_and_destroy();
|
||||
release();
|
||||
}
|
||||
|
||||
void SessionLock::release()
|
||||
{
|
||||
qDeleteAll(m_views);
|
||||
m_views.clear();
|
||||
delete m_lock;
|
||||
m_lock = nullptr;
|
||||
m_confirmed = false;
|
||||
m_integration->current = nullptr;
|
||||
QFile::remove(markerPath());
|
||||
// Out to the compositor now: an agent started only for this lock quits
|
||||
// straight after.
|
||||
Wayland::sync();
|
||||
m_screen->reset();
|
||||
Q_EMIT lockedChanged(false);
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
//
|
||||
// face-unlock's own lock screen, for whoever wants it on a compositor whose
|
||||
// lock screen is a program of its own (ext-session-lock: Hyprland, Niri,
|
||||
// Sway and others): `face-unlock lock`.
|
||||
//
|
||||
// Any other lock screen there covers the bubble, and only opens itself (it
|
||||
// gets the face through PAM, see src/lib/pam.sh). This one is the lock
|
||||
// screen, so the bubble shows on it and a face opens it straight away. The
|
||||
// picture behind it is the user's choice (LockWallpaper).
|
||||
//
|
||||
// Qt knows no ext-session-lock, so each screen's window gets the lock surface
|
||||
// role through Qt's shell integration, the way LayerShellQt gives windows the
|
||||
// layer-shell role. If this program goes away while locked, the compositor
|
||||
// keeps the session locked: that is the protocol's promise.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QHash>
|
||||
#include <QObject>
|
||||
#include <QPointer>
|
||||
#include <QUrl>
|
||||
|
||||
class BubbleController;
|
||||
class LockScreenController;
|
||||
class UserConfig;
|
||||
class QQmlEngine;
|
||||
class QQuickView;
|
||||
class QScreen;
|
||||
class LockIntegration;
|
||||
class Lock;
|
||||
|
||||
class SessionLock : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
SessionLock(QQmlEngine *engine, BubbleController *bubble, LockScreenController *screen, UserConfig *config, QObject *parent = nullptr);
|
||||
~SessionLock() override;
|
||||
|
||||
// Whether the compositor offers ext-session-lock.
|
||||
static bool available();
|
||||
|
||||
// From the lock request until the lock is gone again.
|
||||
bool isLocked() const
|
||||
{
|
||||
return m_lock != nullptr;
|
||||
}
|
||||
// The compositor has confirmed the lock: nothing unlocked is on screen.
|
||||
bool isConfirmed() const
|
||||
{
|
||||
return m_confirmed;
|
||||
}
|
||||
|
||||
// A file that says the screen is locked, so that an agent started again
|
||||
// after a crash locks again (see main.cpp).
|
||||
static QString markerPath();
|
||||
|
||||
public Q_SLOTS:
|
||||
void lock();
|
||||
void unlock();
|
||||
|
||||
Q_SIGNALS:
|
||||
void lockedChanged(bool locked);
|
||||
void confirmed();
|
||||
|
||||
private:
|
||||
friend class Lock;
|
||||
void onLocked();
|
||||
void onFinished();
|
||||
void addScreen(QScreen *screen);
|
||||
void removeScreen(QScreen *screen);
|
||||
void release();
|
||||
|
||||
QQmlEngine *m_engine;
|
||||
BubbleController *m_bubble;
|
||||
LockScreenController *m_screen;
|
||||
UserConfig *m_config;
|
||||
LockIntegration *m_integration = nullptr;
|
||||
Lock *m_lock = nullptr;
|
||||
bool m_confirmed = false;
|
||||
bool m_unlockWanted = false;
|
||||
QHash<QScreen *, QPointer<QQuickView>> m_views;
|
||||
// The pictures behind it, by output (see Wallpaper).
|
||||
QHash<QString, QUrl> m_pictures;
|
||||
};
|
||||
@@ -29,6 +29,9 @@ QString UserConfig::path()
|
||||
void UserConfig::load()
|
||||
{
|
||||
const KeyValueFile kv = KeyValueFile::load(path());
|
||||
m_enabled = kv.boolean(QStringLiteral("Enabled"), false);
|
||||
m_lockWallpaper = kv.value(QStringLiteral("LockWallpaper"));
|
||||
m_lockBlur = kv.boolean(QStringLiteral("LockBlur"), false);
|
||||
m_lockScreen = kv.boolean(QStringLiteral("LockScreen"), true);
|
||||
m_scanOnWake = kv.boolean(QStringLiteral("ScanOnWake"), true);
|
||||
m_scanOnLock = kv.boolean(QStringLiteral("ScanOnLock"), false);
|
||||
|
||||
@@ -17,6 +17,22 @@ class UserConfig : public QObject
|
||||
public:
|
||||
explicit UserConfig(QObject *parent = nullptr);
|
||||
|
||||
// Face unlock turned on at all. The agent's service only runs when it is,
|
||||
// but the own lock screen (--lock) runs either way.
|
||||
bool enabled() const
|
||||
{
|
||||
return m_enabled;
|
||||
}
|
||||
// The picture behind the own lock screen (see Wallpaper): empty for the
|
||||
// desktop's, "none", a file, or a folder to take one from at random.
|
||||
QString lockWallpaper() const
|
||||
{
|
||||
return m_lockWallpaper;
|
||||
}
|
||||
bool lockBlur() const
|
||||
{
|
||||
return m_lockBlur;
|
||||
}
|
||||
// Unlock the lock screen by face.
|
||||
bool lockScreen() const
|
||||
{
|
||||
@@ -72,6 +88,9 @@ private:
|
||||
void load();
|
||||
|
||||
QFileSystemWatcher m_watcher;
|
||||
bool m_enabled = false;
|
||||
QString m_lockWallpaper;
|
||||
bool m_lockBlur = false;
|
||||
bool m_lockScreen = true;
|
||||
bool m_scanOnWake = true;
|
||||
bool m_scanOnLock = false;
|
||||
|
||||
@@ -0,0 +1,180 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "wallpaper.h"
|
||||
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QFileInfo>
|
||||
#include <QProcess>
|
||||
#include <QRandomGenerator>
|
||||
#include <QRegularExpression>
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
namespace
|
||||
{
|
||||
// A picture, or one at random from a folder.
|
||||
QUrl picture(const QString &setting)
|
||||
{
|
||||
QString path = setting;
|
||||
if (path.startsWith(u"~/")) {
|
||||
path = QDir::homePath() + path.mid(1);
|
||||
}
|
||||
const QFileInfo info(path);
|
||||
if (setting.isEmpty() || !info.exists()) {
|
||||
return {};
|
||||
}
|
||||
if (info.isFile()) {
|
||||
return QUrl::fromLocalFile(info.absoluteFilePath());
|
||||
}
|
||||
const QStringList pictures = QDir(path).entryList({QStringLiteral("*.jpg"), QStringLiteral("*.jpeg"), QStringLiteral("*.png"), QStringLiteral("*.webp")},
|
||||
QDir::Files | QDir::Readable);
|
||||
if (pictures.isEmpty()) {
|
||||
return {};
|
||||
}
|
||||
return QUrl::fromLocalFile(QDir(path).absoluteFilePath(pictures.at(QRandomGenerator::global()->bounded(int(pictures.size())))));
|
||||
}
|
||||
|
||||
// What a command prints, or nothing when it is not there or hangs.
|
||||
QString run(const QString &program, const QStringList &args)
|
||||
{
|
||||
QProcess process;
|
||||
process.start(program, args);
|
||||
if (!process.waitForFinished(1000) || process.exitStatus() != QProcess::NormalExit || process.exitCode() != 0) {
|
||||
process.kill();
|
||||
process.waitForFinished(100);
|
||||
return {};
|
||||
}
|
||||
return QString::fromLocal8Bit(process.readAllStandardOutput());
|
||||
}
|
||||
|
||||
// The pictures the running wallpaper programs of this user show.
|
||||
QHash<QString, QString> desktop()
|
||||
{
|
||||
QHash<QString, QString> found;
|
||||
const uint me = getuid();
|
||||
const QStringList pids = QDir(QStringLiteral("/proc")).entryList({QStringLiteral("[0-9]*")}, QDir::Dirs);
|
||||
for (const QString &pid : pids) {
|
||||
const QString dir = QStringLiteral("/proc/") + pid;
|
||||
if (QFileInfo(dir).ownerId() != me) {
|
||||
continue;
|
||||
}
|
||||
QFile comm(dir + QStringLiteral("/comm"));
|
||||
if (!comm.open(QIODevice::ReadOnly)) {
|
||||
continue;
|
||||
}
|
||||
const QByteArray name = comm.readAll().trimmed();
|
||||
if (name == "swaybg") {
|
||||
QFile cmdline(dir + QStringLiteral("/cmdline"));
|
||||
if (cmdline.open(QIODevice::ReadOnly)) {
|
||||
QStringList args;
|
||||
for (const QByteArray &arg : cmdline.readAll().split('\0')) {
|
||||
args << QString::fromLocal8Bit(arg);
|
||||
}
|
||||
// Relative to where it was started.
|
||||
const QDir cwd(QFileInfo(dir + QStringLiteral("/cwd")).symLinkTarget());
|
||||
QHash<QString, QString> shown = Wallpaper::fromSwaybg(args.mid(1));
|
||||
for (QString &path : shown) {
|
||||
path = cwd.absoluteFilePath(path);
|
||||
}
|
||||
found.insert(shown);
|
||||
}
|
||||
} else if (name == "awww-daemon" || name == "swww-daemon") {
|
||||
found.insert(Wallpaper::fromAwww(run(QString::fromLatin1(name.left(4)), {QStringLiteral("query")})));
|
||||
} else if (name == "hyprpaper") {
|
||||
found.insert(Wallpaper::fromList(run(QStringLiteral("hyprctl"), {QStringLiteral("hyprpaper"), QStringLiteral("listactive")})));
|
||||
} else if (name == "wpaperd") {
|
||||
found.insert(Wallpaper::fromList(run(QStringLiteral("wpaperctl"), {QStringLiteral("all-wallpapers")})));
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
QHash<QString, QString> Wallpaper::fromSwaybg(const QStringList &args)
|
||||
{
|
||||
QHash<QString, QString> found;
|
||||
QString output;
|
||||
for (int i = 0; i < args.size(); ++i) {
|
||||
const QString &arg = args.at(i);
|
||||
const bool hasNext = i + 1 < args.size();
|
||||
if ((arg == u"-o" || arg == u"--output") && hasNext) {
|
||||
output = args.at(++i);
|
||||
} else if (arg.startsWith(u"--output=")) {
|
||||
output = arg.mid(9);
|
||||
} else if ((arg == u"-i" || arg == u"--image") && hasNext) {
|
||||
found.insert(output == u"*" ? QString() : output, args.at(++i));
|
||||
} else if (arg.startsWith(u"--image=")) {
|
||||
found.insert(output == u"*" ? QString() : output, arg.mid(8));
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
QHash<QString, QString> Wallpaper::fromAwww(const QString &text)
|
||||
{
|
||||
// "eDP-1: 1920x1080, scale: 1, currently displaying: image: /a/b.jpg",
|
||||
// with a namespace in front on awww. A plain colour is no picture.
|
||||
static const QRegularExpression line(QStringLiteral("([^\\s:]+): \\d+x\\d+,.*currently displaying: image: (.+)$"), QRegularExpression::MultilineOption);
|
||||
QHash<QString, QString> found;
|
||||
auto it = line.globalMatch(text);
|
||||
while (it.hasNext()) {
|
||||
const auto match = it.next();
|
||||
found.insert(match.captured(1), match.captured(2).trimmed());
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
QHash<QString, QString> Wallpaper::fromList(const QString &text)
|
||||
{
|
||||
// "eDP-1: /a/b.jpg", on older hyprpaper "eDP-1 = /a/b.jpg".
|
||||
static const QRegularExpression line(QStringLiteral("^([^\\s:=]+)(?:: | = )(/.+)$"), QRegularExpression::MultilineOption);
|
||||
QHash<QString, QString> found;
|
||||
auto it = line.globalMatch(text);
|
||||
while (it.hasNext()) {
|
||||
const auto match = it.next();
|
||||
found.insert(match.captured(1), match.captured(2).trimmed());
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
QHash<QString, QUrl> Wallpaper::forLock(const QString &setting)
|
||||
{
|
||||
QHash<QString, QUrl> pictures;
|
||||
if (setting.compare(u"none", Qt::CaseInsensitive) == 0) {
|
||||
return pictures;
|
||||
}
|
||||
if (!setting.isEmpty()) {
|
||||
const QUrl url = picture(setting);
|
||||
if (!url.isEmpty()) {
|
||||
pictures.insert(QString(), url);
|
||||
}
|
||||
return pictures;
|
||||
}
|
||||
const QHash<QString, QString> shown = desktop();
|
||||
for (auto it = shown.cbegin(); it != shown.cend(); ++it) {
|
||||
const QUrl url = picture(it.value());
|
||||
if (!url.isEmpty()) {
|
||||
pictures.insert(it.key(), url);
|
||||
}
|
||||
}
|
||||
return pictures;
|
||||
}
|
||||
|
||||
QUrl Wallpaper::pick(const QHash<QString, QUrl> &pictures, const QString &output)
|
||||
{
|
||||
if (pictures.isEmpty()) {
|
||||
return {};
|
||||
}
|
||||
if (pictures.contains(output)) {
|
||||
return pictures.value(output);
|
||||
}
|
||||
if (pictures.contains(QString())) {
|
||||
return pictures.value(QString());
|
||||
}
|
||||
// Named differently than here: some picture of the desktop is still
|
||||
// better than none.
|
||||
QStringList outputs = pictures.keys();
|
||||
outputs.sort();
|
||||
return pictures.value(outputs.first());
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
//
|
||||
// The picture behind face-unlock's own lock screen. By default the one on
|
||||
// the desktop. Hyprland, niri and the like leave the wallpaper to a program
|
||||
// of its own, so it comes from whichever of the common ones runs: swaybg,
|
||||
// awww (once swww), hyprpaper or wpaperd, each for every output.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QHash>
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
#include <QUrl>
|
||||
|
||||
namespace Wallpaper
|
||||
{
|
||||
// The pictures for a lock by output name, "" for every other output.
|
||||
// setting is LockWallpaper: empty for the desktop's, "none", a picture, or a
|
||||
// folder to take one from at random.
|
||||
QHash<QString, QUrl> forLock(const QString &setting);
|
||||
// The one for this output.
|
||||
QUrl pick(const QHash<QString, QUrl> &pictures, const QString &output);
|
||||
|
||||
// What the programs tell, by output name. Apart for the tests.
|
||||
QHash<QString, QString> fromSwaybg(const QStringList &args);
|
||||
// `awww query` and `swww query`.
|
||||
QHash<QString, QString> fromAwww(const QString &text);
|
||||
// `hyprctl hyprpaper listactive` and `wpaperctl all-wallpapers`.
|
||||
QHash<QString, QString> fromList(const QString &text);
|
||||
}
|
||||
+21
-6
@@ -21,6 +21,12 @@ void onGlobalRemove(void *, wl_registry *, uint32_t)
|
||||
|
||||
const wl_registry_listener listener = {onGlobal, onGlobalRemove};
|
||||
|
||||
wl_display *display()
|
||||
{
|
||||
auto *app = qGuiApp ? qGuiApp->nativeInterface<QNativeInterface::QWaylandApplication>() : nullptr;
|
||||
return app ? app->display() : nullptr;
|
||||
}
|
||||
|
||||
const QSet<QByteArray> &globals()
|
||||
{
|
||||
static QSet<QByteArray> names;
|
||||
@@ -30,17 +36,16 @@ const QSet<QByteArray> &globals()
|
||||
}
|
||||
asked = true;
|
||||
|
||||
auto *app = qGuiApp ? qGuiApp->nativeInterface<QNativeInterface::QWaylandApplication>() : nullptr;
|
||||
wl_display *display = app ? app->display() : nullptr;
|
||||
if (!display) {
|
||||
wl_display *d = display();
|
||||
if (!d) {
|
||||
return names;
|
||||
}
|
||||
wl_event_queue *queue = wl_display_create_queue(display);
|
||||
auto *wrapped = static_cast<wl_display *>(wl_proxy_create_wrapper(display));
|
||||
wl_event_queue *queue = wl_display_create_queue(d);
|
||||
auto *wrapped = static_cast<wl_display *>(wl_proxy_create_wrapper(d));
|
||||
wl_proxy_set_queue(reinterpret_cast<wl_proxy *>(wrapped), queue);
|
||||
wl_registry *registry = wl_display_get_registry(wrapped);
|
||||
wl_registry_add_listener(registry, &listener, &names);
|
||||
wl_display_roundtrip_queue(display, queue);
|
||||
wl_display_roundtrip_queue(d, queue);
|
||||
wl_registry_destroy(registry);
|
||||
wl_proxy_wrapper_destroy(wrapped);
|
||||
wl_event_queue_destroy(queue);
|
||||
@@ -52,3 +57,13 @@ bool Wayland::hasGlobal(const char *interface)
|
||||
{
|
||||
return globals().contains(QByteArray(interface));
|
||||
}
|
||||
|
||||
void Wayland::sync()
|
||||
{
|
||||
// On a queue of its own, like above: Qt reads the default one.
|
||||
if (wl_display *d = display()) {
|
||||
wl_event_queue *queue = wl_display_create_queue(d);
|
||||
wl_display_roundtrip_queue(d, queue);
|
||||
wl_event_queue_destroy(queue);
|
||||
}
|
||||
}
|
||||
@@ -12,4 +12,7 @@ namespace Wayland
|
||||
// "zwlr_layer_shell_v1". Asked once, on an event queue of its own, so Qt's
|
||||
// own handling of the connection is not disturbed.
|
||||
bool hasGlobal(const char *interface);
|
||||
|
||||
// Wait until the compositor has handled everything sent so far.
|
||||
void sync();
|
||||
} // namespace Wayland
|
||||
@@ -197,6 +197,7 @@ fu_do_help() {
|
||||
faces $(fu_msg "List the faces")
|
||||
remove ID $(fu_msg "Delete a face")
|
||||
test $(fu_msg "Look at the camera and see what it sees")
|
||||
lock $(fu_msg "Lock the screen")
|
||||
status $(fu_msg "Show what is on")
|
||||
-h, --help $(fu_msg "Show this help")
|
||||
-V, --version $(fu_msg "Show the version")
|
||||
@@ -236,6 +237,7 @@ main() {
|
||||
remove|delete) fu_do_remove "$@" ;;
|
||||
test|try) fu_ensure_service && fu_test ;;
|
||||
status) fu_do_status ;;
|
||||
lock) exec "$FU_AGENT" --lock ;;
|
||||
|
||||
-h|--help|help) fu_do_help ;;
|
||||
-V|--version) printf '%s %s\n' "$FU_NAME" "$FU_VERSION" ;;
|
||||
|
||||
+3
-1
@@ -31,7 +31,9 @@ FU_SYSCONFIG="${FU_SYSCONFIG:-/etc/${FU_NAME}/config}"
|
||||
FU_UNIT_SOCKET="face-unlockd.socket"
|
||||
FU_UNIT_AGENT="face-unlock-agent.service"
|
||||
|
||||
# The desktop this runs in: plasma, gnome, hyprland, niri or other.
|
||||
# The desktop this runs in: plasma, gnome, hyprland, niri or other. All but
|
||||
# the first two have a lock screen that is a program of its own, and there
|
||||
# face-unlock's own one (`face-unlock lock`) is on offer.
|
||||
case ":${XDG_CURRENT_DESKTOP:-}:" in
|
||||
*:KDE:*) FU_DESKTOP=plasma ;;
|
||||
*:GNOME:*) FU_DESKTOP=gnome ;;
|
||||
|
||||
+39
-3
@@ -277,16 +277,20 @@ 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) or camera
|
||||
# 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
|
||||
# only lockers: only where the lock screen is a program of its own with a
|
||||
# PAM file (Hyprland, Niri), see fu_pam_lockers_here
|
||||
# PAM file (Hyprland, Niri), see fu_pam_lockers_here; ownlock: only
|
||||
# where face-unlock's own lock screen can be used
|
||||
FU_SETTINGS=(
|
||||
"group|Lock screen"
|
||||
"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"
|
||||
"group|Password prompts"
|
||||
"pam|sudo|bool|no|sudo in a terminal"
|
||||
"pam|polkit-1|bool|no|Admin prompts"
|
||||
@@ -315,7 +319,7 @@ fu_setting_help() {
|
||||
return
|
||||
;;
|
||||
hyprland:LockScreen|niri:LockScreen)
|
||||
fu_msg "Scans when you come back to hyprlock or swaylock and opens them. Any other lock screen scans when you press Enter on the empty password field."
|
||||
fu_msg "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."
|
||||
return
|
||||
;;
|
||||
esac
|
||||
@@ -324,6 +328,8 @@ 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." ;;
|
||||
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)" ;;
|
||||
polkit-1:*) fu_msg "The password windows of your desktop and apps, for example when you install software. No match: you type the password." ;;
|
||||
Liveness:heavy) fu_msg "You have to blink or turn your head a little. This also stops printed photos." ;;
|
||||
@@ -451,6 +457,24 @@ _fu_camera_label() {
|
||||
printf '%s %s' "$value" "$(fu_msg "(not connected)")"
|
||||
}
|
||||
|
||||
# _fu_path_label <path>
|
||||
# A path as it fits in the list: with ~ for home, and cut from the left.
|
||||
# Empty is the desktop's picture.
|
||||
_fu_path_label() {
|
||||
local path="$1"
|
||||
if [[ -z $path ]]; then
|
||||
fu_msg "same as desktop"
|
||||
return
|
||||
fi
|
||||
if [[ ${path,,} == none ]]; then
|
||||
fu_msg "none"
|
||||
return
|
||||
fi
|
||||
[[ $path == "$HOME"/* ]] && path="~${path#"$HOME"}"
|
||||
(( ${#path} > 36 )) && path="…${path: -35}"
|
||||
printf '%s' "$path"
|
||||
}
|
||||
|
||||
# _fu_setting_change <scope> <Key> <type> <current> <choices> <step>
|
||||
_fu_setting_change() {
|
||||
local scope="$1" key="$2" type="$3" current="$4" options="$5" step="$6" next
|
||||
@@ -459,6 +483,16 @@ _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")" ;;
|
||||
path)
|
||||
printf '\n %s ' "$(fu_msg "Picture or folder:")"
|
||||
fu_ui_read_line "$current" || return 0
|
||||
next="$FU_LINE_RESULT"
|
||||
# shellcheck disable=SC2088 # typed by the user, expanded here
|
||||
if [[ -n $next && ${next,,} != none && ! -e ${next/#\~/$HOME} ]]; then
|
||||
fu_bad "$(fu_msg "Not found: %s" "$next")"
|
||||
return 0
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
case "$scope" in
|
||||
@@ -501,6 +535,7 @@ fu_ui_settings() {
|
||||
for spec in "${FU_SETTINGS[@]}"; do
|
||||
IFS='|' read -r scope key type default label choice need only <<< "$spec"
|
||||
[[ $only == lockers ]] && ! fu_pam_lockers_here && continue
|
||||
[[ $only == ownlock && ( $FU_DESKTOP == plasma || $FU_DESKTOP == gnome ) ]] && continue
|
||||
# A heading has its label where the key would be.
|
||||
[[ $scope == group ]] && label="$key" key=''
|
||||
scopes+=("$scope"); keys+=("$key"); types+=("$type"); defaults+=("$default")
|
||||
@@ -568,6 +603,7 @@ fu_ui_settings() {
|
||||
fi
|
||||
;;
|
||||
camera) shown="$(_fu_camera_label "${values[i]}")" ;;
|
||||
path) shown="$(_fu_path_label "${values[i]}")" ;;
|
||||
*) shown="$(fu_value_label "${keys[i]}" "${values[i]}")" ;;
|
||||
esac
|
||||
# Arrows on the selected choice: left and right step through it.
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
//
|
||||
// The password on face-unlock's own lock screen, through real PAM but with
|
||||
// PAM files of its own (FU_PAM_CONFDIR), so no test ever counts as a wrong
|
||||
// password for the real account.
|
||||
|
||||
#include "lockscreencontroller.h"
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QTemporaryDir>
|
||||
#include <QTimer>
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
namespace
|
||||
{
|
||||
int failures = 0;
|
||||
|
||||
void check(bool ok, const char *what)
|
||||
{
|
||||
std::printf("%s %s\n", ok ? "ok " : "FAIL", what);
|
||||
if (!ok) {
|
||||
++failures;
|
||||
}
|
||||
}
|
||||
|
||||
// Types the password into a fresh controller and waits for the verdict:
|
||||
// 1 let in, 0 refused, -1 no answer.
|
||||
int attempt(const QString &stack, const QString &password, QString *message = nullptr)
|
||||
{
|
||||
QTemporaryDir dir;
|
||||
QFile file(dir.filePath(QStringLiteral("face-unlock-lock")));
|
||||
if (!file.open(QIODevice::WriteOnly)) {
|
||||
return -1;
|
||||
}
|
||||
file.write(stack.toUtf8());
|
||||
file.close();
|
||||
qputenv("FU_PAM_CONFDIR", dir.path().toLocal8Bit());
|
||||
|
||||
LockScreenController lock;
|
||||
int verdict = -1;
|
||||
QObject::connect(&lock, &LockScreenController::authenticated, [&] {
|
||||
verdict = 1;
|
||||
QCoreApplication::quit();
|
||||
});
|
||||
QObject::connect(&lock, &LockScreenController::rejected, [&] {
|
||||
verdict = 0;
|
||||
QCoreApplication::quit();
|
||||
});
|
||||
QTimer::singleShot(5000, &QCoreApplication::quit);
|
||||
lock.setPassword(password);
|
||||
lock.submit();
|
||||
QCoreApplication::exec();
|
||||
if (message) {
|
||||
*message = lock.message();
|
||||
}
|
||||
check(lock.password().isEmpty(), "the password is gone once it was checked");
|
||||
return verdict;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
QCoreApplication app(argc, argv);
|
||||
|
||||
check(attempt(QStringLiteral("auth required pam_permit.so\n"), QStringLiteral("secret")) == 1, "a stack that says yes unlocks");
|
||||
|
||||
QString message;
|
||||
check(attempt(QStringLiteral("auth required pam_deny.so\n"), QStringLiteral("secret"), &message) == 0, "a stack that says no does not");
|
||||
check(!message.isEmpty(), "and the screen says so");
|
||||
|
||||
// Nothing typed: nothing to check, and nothing happens.
|
||||
LockScreenController empty;
|
||||
bool answered = false;
|
||||
QObject::connect(&empty, &LockScreenController::authenticated, [&] {
|
||||
answered = true;
|
||||
});
|
||||
empty.submit();
|
||||
check(!empty.busy() && !answered, "an empty password is not sent");
|
||||
|
||||
std::printf("\n%s\n", failures ? "SOME CHECKS FAILED" : "all checks passed");
|
||||
return failures ? 1 : 0;
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
//
|
||||
// The desktop's picture for face-unlock's own lock screen, from what the
|
||||
// wallpaper programs say (real output of swaybg 1.2, awww 0.12, swww 0.9,
|
||||
// hyprpaper 0.7 and 0.8, wpaperd 1.3), and what the setting picks.
|
||||
|
||||
#include "wallpaper.h"
|
||||
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QTemporaryDir>
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
namespace
|
||||
{
|
||||
int failures = 0;
|
||||
|
||||
void check(bool ok, const char *what)
|
||||
{
|
||||
std::printf("%s %s\n", ok ? "ok " : "FAIL", what);
|
||||
if (!ok) {
|
||||
++failures;
|
||||
}
|
||||
}
|
||||
|
||||
using Map = QHash<QString, QString>;
|
||||
} // namespace
|
||||
|
||||
int main()
|
||||
{
|
||||
check(Wallpaper::fromSwaybg({QStringLiteral("-i"), QStringLiteral("/w/a.jpg"), QStringLiteral("-m"), QStringLiteral("fill")})
|
||||
== Map{{QString(), QStringLiteral("/w/a.jpg")}},
|
||||
"swaybg: one picture everywhere");
|
||||
check(Wallpaper::fromSwaybg({QStringLiteral("-o"), QStringLiteral("eDP-1"), QStringLiteral("-i"), QStringLiteral("/w/a.jpg"), QStringLiteral("--output=DP-2"),
|
||||
QStringLiteral("--image=/w/b.png"), QStringLiteral("-o"), QStringLiteral("*"), QStringLiteral("-c"), QStringLiteral("000000")})
|
||||
== Map{{QStringLiteral("eDP-1"), QStringLiteral("/w/a.jpg")}, {QStringLiteral("DP-2"), QStringLiteral("/w/b.png")}},
|
||||
"swaybg: one per output, a colour is no picture");
|
||||
|
||||
check(Wallpaper::fromAwww(QStringLiteral(": winit: 1280x742, scale: 1, currently displaying: image: /w/my pic.jpg\n"))
|
||||
== Map{{QStringLiteral("winit"), QStringLiteral("/w/my pic.jpg")}},
|
||||
"awww: with the namespace in front, spaces in the path");
|
||||
check(Wallpaper::fromAwww(QStringLiteral("eDP-1: 1920x1080, scale: 1, currently displaying: image: /w/a.jpg\n"
|
||||
"DP-2: 2560x1440, scale: 1, currently displaying: color: 000000\n"))
|
||||
== Map{{QStringLiteral("eDP-1"), QStringLiteral("/w/a.jpg")}},
|
||||
"swww: a colour is no picture");
|
||||
|
||||
check(Wallpaper::fromList(QStringLiteral("WAYLAND-1: /w/a.jpg\nDP-2: /w/b.png\n"))
|
||||
== Map{{QStringLiteral("WAYLAND-1"), QStringLiteral("/w/a.jpg")}, {QStringLiteral("DP-2"), QStringLiteral("/w/b.png")}},
|
||||
"hyprpaper 0.8 and wpaperd");
|
||||
check(Wallpaper::fromList(QStringLiteral("eDP-1 = /w/a.jpg\n")) == Map{{QStringLiteral("eDP-1"), QStringLiteral("/w/a.jpg")}}, "hyprpaper 0.7");
|
||||
check(Wallpaper::fromList(QStringLiteral("no wallpapers active\n")).isEmpty(), "nothing shown, nothing found");
|
||||
|
||||
QTemporaryDir dir;
|
||||
QFile a(dir.filePath(QStringLiteral("a.jpg")));
|
||||
check(a.open(QIODevice::WriteOnly), "a picture to point at");
|
||||
a.close();
|
||||
const QUrl url = QUrl::fromLocalFile(a.fileName());
|
||||
|
||||
check(Wallpaper::forLock(QStringLiteral("none")).isEmpty(), "none is none");
|
||||
check(Wallpaper::forLock(a.fileName()) == QHash<QString, QUrl>{{QString(), url}}, "a picture set goes everywhere");
|
||||
check(Wallpaper::forLock(dir.path()) == QHash<QString, QUrl>{{QString(), url}}, "a folder set gives one from it");
|
||||
check(Wallpaper::forLock(dir.filePath(QStringLiteral("gone.jpg"))).isEmpty(), "a picture that is gone gives none");
|
||||
|
||||
const QUrl b = QUrl::fromLocalFile(QStringLiteral("/w/b.png"));
|
||||
const QHash<QString, QUrl> both{{QStringLiteral("eDP-1"), url}, {QString(), b}};
|
||||
check(Wallpaper::pick(both, QStringLiteral("eDP-1")) == url, "an output gets its own");
|
||||
check(Wallpaper::pick(both, QStringLiteral("DP-2")) == b, "else the one for all");
|
||||
check(Wallpaper::pick({{QStringLiteral("eDP-1"), url}}, QStringLiteral("winit")) == url, "else any of the desktop's");
|
||||
check(Wallpaper::pick({}, QStringLiteral("eDP-1")).isEmpty(), "and none when there is none");
|
||||
|
||||
std::printf("\n%s\n", failures ? "SOME CHECKS FAILED" : "all checks passed");
|
||||
return failures ? 1 : 0;
|
||||
}
|
||||
Reference in new issue
Block a user