1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-08-08 14:38:30 -04:00

i18n: cut down terms and sync

port 1.5
This commit is contained in:
bbedward
2026-07-15 11:05:07 -04:00
parent b169fe0d77
commit bf408f8d00
9 changed files with 390 additions and 699 deletions
+5 -6
View File
@@ -103,20 +103,19 @@ var authValidateCmd = &cobra.Command{
} }
var result sharedpam.LockscreenPamValidation var result sharedpam.LockscreenPamValidation
if path != "" { switch {
if !filepath.IsAbs(path) { case service != "":
result = sharedpam.ValidateLockscreenPamService(service)
case !filepath.IsAbs(path):
result = sharedpam.LockscreenPamValidation{ result = sharedpam.LockscreenPamValidation{
Path: path, Path: path,
MissingModules: []string{}, MissingModules: []string{},
Warnings: []string{}, Warnings: []string{},
Errors: []string{"--path must be an absolute file path"}, Errors: []string{"--path must be an absolute file path"},
} }
} else { default:
result = sharedpam.ValidateLockscreenPamPath(path) result = sharedpam.ValidateLockscreenPamPath(path)
} }
} else {
result = sharedpam.ValidateLockscreenPamService(service)
}
if asJSON { if asJSON {
data, err := json.MarshalIndent(result, "", " ") data, err := json.MarshalIndent(result, "", " ")
+1 -11
View File
@@ -592,8 +592,6 @@ func buildManagedLockscreenPamContent(baseDirs []string, readFile func(string) (
return b.String(), nil return b.String(), nil
} }
// lockscreenPamCandidateServices are the services surfaced by list-services:
// the standalone entry points plus the shared auth blocks users may pin.
var lockscreenPamCandidateServices = []string{ var lockscreenPamCandidateServices = []string{
"login", "login",
"system-auth", "system-auth",
@@ -603,7 +601,6 @@ var lockscreenPamCandidateServices = []string{
"base-auth", "base-auth",
} }
// LockscreenPamServiceInfo describes one candidate lock-screen PAM service.
type LockscreenPamServiceInfo struct { type LockscreenPamServiceInfo struct {
Name string `json:"name"` Name string `json:"name"`
Dir string `json:"dir"` Dir string `json:"dir"`
@@ -613,8 +610,6 @@ type LockscreenPamServiceInfo struct {
InlineU2f bool `json:"inlineU2f"` InlineU2f bool `json:"inlineU2f"`
} }
// LockscreenPamValidation is the result of validating a PAM service file for
// use as the DMS lock-screen password stack.
type LockscreenPamValidation struct { type LockscreenPamValidation struct {
Valid bool `json:"valid"` Valid bool `json:"valid"`
Path string `json:"path"` Path string `json:"path"`
@@ -743,8 +738,7 @@ func (r lockscreenPamResolver) analyzeInto(path string, filterType string, stack
return nil return nil
} }
// ListLockscreenPamServices enumerates the candidate lock-screen services that // Earlier base dir wins per name (libpam precedence).
// exist on this system, earlier base dir winning per name (libpam precedence).
func ListLockscreenPamServices() []LockscreenPamServiceInfo { func ListLockscreenPamServices() []LockscreenPamServiceInfo {
return listLockscreenPamServices(lockscreenPamBaseDirs, os.ReadFile) return listLockscreenPamServices(lockscreenPamBaseDirs, os.ReadFile)
} }
@@ -772,14 +766,10 @@ func listLockscreenPamServices(baseDirs []string, readFile func(string) ([]byte,
return out return out
} }
// ValidateLockscreenPamService validates a named service resolved across the
// system PAM base dirs.
func ValidateLockscreenPamService(name string) LockscreenPamValidation { func ValidateLockscreenPamService(name string) LockscreenPamValidation {
return validateLockscreenPam(name, "", defaultValidateDeps()) return validateLockscreenPam(name, "", defaultValidateDeps())
} }
// ValidateLockscreenPamPath validates an arbitrary absolute PAM file, which may
// live outside the standard base dirs.
func ValidateLockscreenPamPath(path string) LockscreenPamValidation { func ValidateLockscreenPamPath(path string) LockscreenPamValidation {
return validateLockscreenPam("", path, defaultValidateDeps()) return validateLockscreenPam("", path, defaultValidateDeps())
} }
+21 -44
View File
@@ -19,62 +19,39 @@ Item {
function greeterFingerprintDescription() { function greeterFingerprintDescription() {
if (SettingsData.greeterPamExternallyManaged) if (SettingsData.greeterPamExternallyManaged)
return I18n.tr("greetd PAM is externally managed. DMS will not change fingerprint auth; configure it yourself."); return "greetd PAM is externally managed";
if (SettingsData.greeterFingerprintSource === "pam")
return I18n.tr("PAM already provides fingerprint auth. Enable this to show it at login.", "greeter fingerprint login setting");
const source = SettingsData.greeterFingerprintSource; switch (SettingsData.greeterFingerprintReason) {
const reason = SettingsData.greeterFingerprintReason;
if (source === "pam") {
switch (reason) {
case "configured_externally":
return SettingsData.greeterEnableFprint ? I18n.tr("Enabled. PAM already provides fingerprint auth.") : I18n.tr("PAM already provides fingerprint auth. Enable this to show it at login.");
case "missing_enrollment":
return SettingsData.greeterEnableFprint ? I18n.tr("Enabled. PAM provides fingerprint auth, but no prints are enrolled yet.") : I18n.tr("PAM provides fingerprint auth, but no prints are enrolled yet.");
case "missing_reader":
return I18n.tr("PAM provides fingerprint auth, but no reader was detected.");
default:
return I18n.tr("PAM provides fingerprint auth, but availability could not be confirmed.");
}
}
switch (reason) {
case "ready": case "ready":
return SettingsData.greeterEnableFprint ? I18n.tr("Authentication changes apply automatically. Fingerprint-only login may not unlock Keyring.") : I18n.tr("Only affects DMS-managed PAM. If greetd already includes pam_fprintd, fingerprint stays enabled."); return I18n.tr("Authentication changes apply automatically.", "greeter auth setting description");
case "missing_enrollment": case "missing_enrollment":
if (SettingsData.greeterEnableFprint) return I18n.tr("Fingerprint reader detected, but no prints are enrolled yet. You can enable this now and run Sync later.", "greeter fingerprint login setting");
return I18n.tr("Enabled, but no prints are enrolled yet. Enroll fingerprints and run Sync.");
return I18n.tr("Fingerprint reader detected, but no prints are enrolled yet. You can enable this now and run Sync later.");
case "missing_reader": case "missing_reader":
return SettingsData.greeterEnableFprint ? I18n.tr("Enabled, but no fingerprint reader was detected.") : I18n.tr("No fingerprint reader detected."); return I18n.tr("No fingerprint reader detected.", "fingerprint setting status");
case "missing_pam_support": case "missing_pam_support":
return I18n.tr("Not available — install fprintd and pam_fprintd, or configure greetd PAM."); return I18n.tr("Not available — install fprintd and pam_fprintd, or configure greetd PAM.", "greeter fingerprint login setting");
default: default:
return SettingsData.greeterEnableFprint ? I18n.tr("Enabled, but fingerprint availability could not be confirmed.") : I18n.tr("Fingerprint availability could not be confirmed."); return I18n.tr("Fingerprint availability could not be confirmed.", "fingerprint setting status");
} }
} }
function greeterU2fDescription() { function greeterU2fDescription() {
if (SettingsData.greeterPamExternallyManaged) if (SettingsData.greeterPamExternallyManaged)
return I18n.tr("greetd PAM is externally managed. DMS will not change security-key auth; configure it yourself."); return "greetd PAM is externally managed";
if (SettingsData.greeterU2fSource === "pam")
return I18n.tr("PAM already provides security-key auth. Enable this to show it at login.", "greeter security key login setting");
const source = SettingsData.greeterU2fSource; switch (SettingsData.greeterU2fReason) {
const reason = SettingsData.greeterU2fReason;
if (source === "pam") {
return SettingsData.greeterEnableU2f ? I18n.tr("Enabled. PAM already provides security-key auth.") : I18n.tr("PAM already provides security-key auth. Enable this to show it at login.");
}
switch (reason) {
case "ready": case "ready":
return SettingsData.greeterEnableU2f ? I18n.tr("Authentication changes apply automatically.") : I18n.tr("Available."); return I18n.tr("Authentication changes apply automatically.", "greeter auth setting description");
case "missing_key_registration": case "missing_key_registration":
if (SettingsData.greeterEnableU2f) return I18n.tr("Security-key support was detected, but no registered key was found yet. You can enable this now and register one later.", "security key setting status");
return I18n.tr("Enabled, but no registered security key was found yet. Register a key and run Sync.");
return I18n.tr("Security-key support was detected, but no registered key was found yet. You can enable this now and register one later.");
case "missing_pam_support": case "missing_pam_support":
return I18n.tr("Not available — install or configure pam_u2f, or configure greetd PAM."); return I18n.tr("Not available — install or configure pam_u2f, or configure greetd PAM.", "greeter security key login setting");
default: default:
return SettingsData.greeterEnableU2f ? I18n.tr("Enabled, but security-key availability could not be confirmed.") : I18n.tr("Security-key availability could not be confirmed."); return I18n.tr("Security-key availability could not be confirmed.", "security key setting status");
} }
} }
@@ -508,10 +485,10 @@ Item {
SettingsToggleRow { SettingsToggleRow {
settingKey: "greeterPamExternallyManaged" settingKey: "greeterPamExternallyManaged"
tags: ["greeter", "pam", "managed", "external", "greetd", "auth"] tags: ["greeter", "pam", "managed", "external", "greetd", "auth"]
text: I18n.tr("Manage greetd PAM automatically") text: "greetd PAM is externally managed"
description: SettingsData.greeterPamExternallyManaged ? I18n.tr("DMS never touches /etc/pam.d/greetd; any existing DMS block is removed on next sync. Configure fingerprint and security-key auth yourself.") : I18n.tr("DMS writes its managed block into /etc/pam.d/greetd during sync.") description: "DMS removes its managed block from /etc/pam.d/greetd and stops writing to it"
checked: !SettingsData.greeterPamExternallyManaged checked: SettingsData.greeterPamExternallyManaged
onToggled: checked => SettingsData.set("greeterPamExternallyManaged", !checked) onToggled: checked => SettingsData.set("greeterPamExternallyManaged", checked)
} }
SettingsToggleRow { SettingsToggleRow {
+37 -85
View File
@@ -1,5 +1,4 @@
import QtQuick import QtQuick
import Quickshell
import Quickshell.Io import Quickshell.Io
import qs.Common import qs.Common
import qs.Modals.FileBrowser import qs.Modals.FileBrowser
@@ -21,30 +20,21 @@ Item {
property string authPendingApplyPath: "" property string authPendingApplyPath: ""
property bool authShowCustom: false property bool authShowCustom: false
readonly property string authAutoLabel: I18n.tr("Auto (recommended)") readonly property string authAutoLabel: I18n.tr("Auto", "automatic PAM authentication source option")
readonly property string authCustomLabel: I18n.tr("Custom") readonly property string authCustomLabel: I18n.tr("Custom...", "custom PAM authentication source option")
function authServiceLabel(service) { function authServiceLabel(service) {
const label = service.name.split("-").map(w => w.charAt(0).toUpperCase() + w.slice(1)).join("-"); const label = service.name.split("-").map(w => w.charAt(0).toUpperCase() + w.slice(1)).join("-");
return service.dir === "/etc/pam.d" ? label : label + " (" + service.dir + ")"; return service.dir === "/etc/pam.d" ? label : label + " (" + service.dir + ")";
} }
readonly property var authOptions: { readonly property var authOptions: [authAutoLabel, ...authServices.map(s => authServiceLabel(s)), authCustomLabel]
var opts = [authAutoLabel];
for (var i = 0; i < authServices.length; i++)
opts.push(authServiceLabel(authServices[i]));
opts.push(authCustomLabel);
return opts;
}
readonly property string authCurrentValue: { readonly property string authCurrentValue: {
if (SettingsData.lockPamPath === "") if (SettingsData.lockPamPath === "")
return authAutoLabel; return authAutoLabel;
for (var i = 0; i < authServices.length; i++) { const svc = authServices.find(s => s.path === SettingsData.lockPamPath);
if (authServices[i].path === SettingsData.lockPamPath) return svc ? authServiceLabel(svc) : authCustomLabel;
return authServiceLabel(authServices[i]);
}
return authCustomLabel;
} }
function refreshAuthServices() { function refreshAuthServices() {
@@ -61,14 +51,8 @@ Item {
} }
function validateAndApplyAuthSource(path) { function validateAndApplyAuthSource(path) {
if (!path || path === "") if (!path)
return; return;
if (!path.startsWith("/")) {
root.authValidateOk = false;
root.authValidateWarn = false;
root.authValidateMessage = I18n.tr("Not a valid path");
return;
}
root.authPendingApplyPath = path; root.authPendingApplyPath = path;
root.authValidateMessage = ""; root.authValidateMessage = "";
root.authValidateOk = false; root.authValidateOk = false;
@@ -81,32 +65,28 @@ Item {
function lockFingerprintDescription() { function lockFingerprintDescription() {
switch (SettingsData.lockFingerprintReason) { switch (SettingsData.lockFingerprintReason) {
case "ready": case "ready":
return SettingsData.enableFprint ? I18n.tr("Authentication changes apply automatically.") : I18n.tr("Use fingerprint authentication for the lock screen."); return I18n.tr("Use fingerprint authentication for the lock screen.", "lock screen fingerprint setting");
case "missing_enrollment": case "missing_enrollment":
if (SettingsData.enableFprint) return I18n.tr("Fingerprint reader detected, but no prints are enrolled yet. You can enable this now and enroll later.", "lock screen fingerprint setting");
return I18n.tr("Enabled, but no prints are enrolled yet. Authentication changes apply automatically once you enroll fingerprints.");
return I18n.tr("Fingerprint reader detected, but no prints are enrolled yet. You can enable this now and enroll later.");
case "missing_reader": case "missing_reader":
return SettingsData.enableFprint ? I18n.tr("Enabled, but no fingerprint reader was detected.") : I18n.tr("No fingerprint reader detected."); return I18n.tr("No fingerprint reader detected.", "fingerprint setting status");
case "missing_pam_support": case "missing_pam_support":
return I18n.tr("Not available — install fprintd and pam_fprintd."); return I18n.tr("Not available — install fprintd and pam_fprintd.", "lock screen fingerprint setting");
default: default:
return SettingsData.enableFprint ? I18n.tr("Enabled, but fingerprint availability could not be confirmed.") : I18n.tr("Fingerprint availability could not be confirmed."); return I18n.tr("Fingerprint availability could not be confirmed.", "fingerprint setting status");
} }
} }
function lockU2fDescription() { function lockU2fDescription() {
switch (SettingsData.lockU2fReason) { switch (SettingsData.lockU2fReason) {
case "ready": case "ready":
return SettingsData.enableU2f ? I18n.tr("Authentication changes apply automatically.") : I18n.tr("Use a security key for lock screen authentication.", "lock screen U2F security key setting"); return I18n.tr("Use a security key for lock screen authentication.", "lock screen U2F security key setting");
case "missing_key_registration": case "missing_key_registration":
if (SettingsData.enableU2f) return I18n.tr("Security-key support was detected, but no registered key was found yet. You can enable this now and register one later.", "security key setting status");
return I18n.tr("Enabled, but no registered security key was found yet. Authentication changes apply automatically once your key is registered or your U2F config is updated.");
return I18n.tr("Security-key support was detected, but no registered key was found yet. You can enable this now and register one later.");
case "missing_pam_support": case "missing_pam_support":
return I18n.tr("Not available — install or configure pam_u2f."); return I18n.tr("Not available — install or configure pam_u2f.", "lock screen security key setting");
default: default:
return SettingsData.enableU2f ? I18n.tr("Enabled, but security-key availability could not be confirmed.") : I18n.tr("Security-key availability could not be confirmed."); return I18n.tr("Security-key availability could not be confirmed.", "security key setting status");
} }
} }
@@ -172,38 +152,31 @@ Item {
onExited: exitCode => { onExited: exitCode => {
root.authValidateRunning = false; root.authValidateRunning = false;
var data = null;
try {
data = JSON.parse(authValidateProcess.collected);
} catch (e) {
data = null;
}
if (!data) {
root.authValidateOk = false; root.authValidateOk = false;
root.authValidateWarn = false; root.authValidateWarn = false;
root.authValidateMessage = I18n.tr("Could not run validation. Ensure DMS is installed and dms is in PATH.");
let data = null;
try {
data = JSON.parse(authValidateProcess.collected);
} catch (e) {}
if (!data) {
root.authValidateMessage = "validation failed — is dms in PATH?";
return; return;
} }
if (data.valid) { if (!data.valid) {
const errs = Array.isArray(data.errors) ? data.errors : [];
root.authValidateMessage = ["not applied:", ...errs].join("\n");
return;
}
SettingsData.set("lockPamPath", root.authPendingApplyPath); SettingsData.set("lockPamPath", root.authPendingApplyPath);
SettingsData.set("lockPamInlineFprint", data.inlineFingerprint === true); SettingsData.set("lockPamInlineFprint", data.inlineFingerprint === true);
SettingsData.set("lockPamInlineU2f", data.inlineU2f === true); SettingsData.set("lockPamInlineU2f", data.inlineU2f === true);
const warns = Array.isArray(data.warnings) ? data.warnings : []; const warns = Array.isArray(data.warnings) ? data.warnings : [];
root.authValidateOk = true; root.authValidateOk = true;
root.authValidateWarn = warns.length > 0; root.authValidateWarn = warns.length > 0;
root.authValidateMessage = warns.length > 0 ? (I18n.tr("Applied with warnings:") + "\n" + warns.join("\n")) : I18n.tr("Applied successfully."); root.authValidateMessage = warns.length > 0 ? ["applied with warnings:", ...warns].join("\n") : "applied";
} else {
root.authValidateOk = false;
root.authValidateWarn = false;
const errs = Array.isArray(data.errors) ? data.errors : [];
const missing = Array.isArray(data.missingModules) ? data.missingModules : [];
var msg = I18n.tr("Invalid — not applied.");
if (errs.length > 0)
msg = msg + "\n" + errs.join("\n");
if (missing.length > 0)
msg = msg + "\n" + I18n.tr("Missing modules: ") + missing.join(", ");
root.authValidateMessage = msg;
}
} }
} }
@@ -353,22 +326,14 @@ Item {
SettingsCard { SettingsCard {
width: parent.width width: parent.width
iconName: "key" iconName: "key"
title: I18n.tr("Authentication Source") title: "Authentication Source"
settingKey: "lockAuthSource" settingKey: "lockAuthSource"
StyledText {
text: I18n.tr("Auto resolves the system auth stack automatically. Picking a source pins the lock screen to that PAM file.")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
width: parent.width
wrapMode: Text.Wrap
}
SettingsDropdownRow { SettingsDropdownRow {
settingKey: "lockPamPath" settingKey: "lockPamPath"
tags: ["lock", "screen", "pam", "authentication", "source", "service"] tags: ["lock", "screen", "pam", "authentication", "source", "service"]
text: I18n.tr("Authentication Source") text: "Authentication Source"
description: SettingsData.lockPamPath !== "" ? I18n.tr("Pinned to ") + SettingsData.lockPamPath : I18n.tr("Which PAM service the lock screen uses to authenticate") description: SettingsData.lockPamPath !== "" ? SettingsData.lockPamPath : "Which PAM service the lock screen uses to authenticate"
options: root.authOptions options: root.authOptions
currentValue: root.authCurrentValue currentValue: root.authCurrentValue
onValueChanged: value => { onValueChanged: value => {
@@ -382,28 +347,16 @@ Item {
return; return;
} }
root.authShowCustom = false; root.authShowCustom = false;
var svc = root.authServices.find(s => root.authServiceLabel(s) === value); const svc = root.authServices.find(s => root.authServiceLabel(s) === value);
if (svc) if (svc)
root.validateAndApplyAuthSource(svc.path); root.validateAndApplyAuthSource(svc.path);
} }
} }
Column {
width: parent.width
spacing: Theme.spacingS
visible: root.authShowCustom || root.authCurrentValue === root.authCustomLabel
StyledText {
text: I18n.tr("Enter the absolute path to a PAM service file, then validate and apply.")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
width: parent.width
wrapMode: Text.Wrap
}
Row { Row {
width: parent.width width: parent.width
spacing: Theme.spacingS spacing: Theme.spacingS
visible: root.authShowCustom || root.authCurrentValue === root.authCustomLabel
DankTextField { DankTextField {
id: customPamField id: customPamField
@@ -415,12 +368,11 @@ Item {
DankButton { DankButton {
id: validatePamButton id: validatePamButton
text: I18n.tr("Validate & Apply") text: I18n.tr("Apply Changes", "validate and apply custom PAM authentication source")
enabled: !root.authValidateRunning && customPamField.text.trim() !== "" enabled: !root.authValidateRunning && customPamField.text.trim() !== ""
onClicked: root.validateAndApplyAuthSource(customPamField.text.trim()) onClicked: root.validateAndApplyAuthSource(customPamField.text.trim())
} }
} }
}
Rectangle { Rectangle {
width: parent.width width: parent.width
@@ -444,7 +396,7 @@ Item {
StyledText { StyledText {
visible: (SettingsData.lockPamInlineFprint && SettingsData.enableFprint) || (SettingsData.lockPamInlineU2f && SettingsData.enableU2f) visible: (SettingsData.lockPamInlineFprint && SettingsData.enableFprint) || (SettingsData.lockPamInlineU2f && SettingsData.enableU2f)
text: I18n.tr("The chosen PAM stack already prompts for fingerprint or security key, so DMS's separate prompts are suppressed to avoid a double prompt.") text: "The pinned PAM stack already prompts for fingerprint or security key, so DMS skips its own prompts"
font.pixelSize: Theme.fontSizeSmall font.pixelSize: Theme.fontSizeSmall
color: Theme.warning color: Theme.warning
width: parent.width width: parent.width
File diff suppressed because it is too large Load Diff
+25 -25
View File
@@ -777,7 +777,7 @@
"Authenticate": "صادِق" "Authenticate": "صادِق"
}, },
"Authenticated!": { "Authenticated!": {
"Authenticated!": "" "Authenticated!": "تم التحقق بنجاح!"
}, },
"Authenticating...": { "Authenticating...": {
"Authenticating...": "جاري المصادقة..." "Authenticating...": "جاري المصادقة..."
@@ -804,13 +804,13 @@
"Authentication error - try again": "خطأ في المصادقة - حاول مرة أخرى" "Authentication error - try again": "خطأ في المصادقة - حاول مرة أخرى"
}, },
"Authentication failed - attempt %1 of %2": { "Authentication failed - attempt %1 of %2": {
"Authentication failed - attempt %1 of %2": "" "Authentication failed - attempt %1 of %2": "فشل التحقق من الهوية - المحاولة %1 من %2"
}, },
"Authentication failed - lockout can occur": { "Authentication failed - lockout can occur": {
"Authentication failed - lockout can occur": "" "Authentication failed - lockout can occur": "فشل التحقق - قد يؤدي ذلك إلى قفل حسابك"
}, },
"Authentication failed - try again": { "Authentication failed - try again": {
"Authentication failed - try again": "" "Authentication failed - try again": "فشل التحقق - يرجى المحاولة مرة أخرى"
}, },
"Authentication failed, please try again": { "Authentication failed, please try again": {
"Authentication failed, please try again": "فشل التحقق، أعد المحاولة" "Authentication failed, please try again": "فشل التحقق، أعد المحاولة"
@@ -987,13 +987,13 @@
"Available.": "متاح." "Available.": "متاح."
}, },
"Awaiting fingerprint authentication": { "Awaiting fingerprint authentication": {
"Awaiting fingerprint authentication": "" "Awaiting fingerprint authentication": "بانتظار التحقق ببصمة الإصبع"
}, },
"Awaiting fingerprint or security key authentication": { "Awaiting fingerprint or security key authentication": {
"Awaiting fingerprint or security key authentication": "" "Awaiting fingerprint or security key authentication": "بانتظار التحقق ببصمة الإصبع أو مفتاح الأمان"
}, },
"Awaiting security key authentication": { "Awaiting security key authentication": {
"Awaiting security key authentication": "" "Awaiting security key authentication": "بانتظار التحقق بمفتاح الأمان"
}, },
"BSSID": { "BSSID": {
"BSSID": "BSSID" "BSSID": "BSSID"
@@ -2175,7 +2175,7 @@
"Custom command and terminal params are split on whitespace; paths with spaces will break.": "يتم فصل الأمر المخصص ومعلمات الجهاز على المسافات البيضاء؛ المسارات التي تحتوي على مسافات ستتسبب في خطأ." "Custom command and terminal params are split on whitespace; paths with spaces will break.": "يتم فصل الأمر المخصص ومعلمات الجهاز على المسافات البيضاء؛ المسارات التي تحتوي على مسافات ستتسبب في خطأ."
}, },
"Custom interval in minutes (minimum 5)": { "Custom interval in minutes (minimum 5)": {
"Custom interval in minutes (minimum 5)": "" "Custom interval in minutes (minimum 5)": "الفترة الزمنية المخصصة بالدقائق (الحد الأدنى 5)"
}, },
"Custom open-trash command": { "Custom open-trash command": {
"Custom open-trash command": "أمر مخصص لفتح المهملات" "Custom open-trash command": "أمر مخصص لفتح المهملات"
@@ -3435,7 +3435,7 @@
"Flags": "الأعلام" "Flags": "الأعلام"
}, },
"Flatpak": { "Flatpak": {
"Flatpak": "" "Flatpak": "Flatpak"
}, },
"Flipped": { "Flipped": {
"Flipped": "معكوس" "Flipped": "معكوس"
@@ -3852,7 +3852,7 @@
"Groups": "المجموعات" "Groups": "المجموعات"
}, },
"H": { "H": {
"H": "" "H": "H"
}, },
"HDR (EDID)": { "HDR (EDID)": {
"HDR (EDID)": "HDR (EDID)" "HDR (EDID)": "HDR (EDID)"
@@ -4149,22 +4149,22 @@
"Ignore Completely": "تجاهل تمامًا" "Ignore Completely": "تجاهل تمامًا"
}, },
"Ignore package": { "Ignore package": {
"Ignore package": "" "Ignore package": "تجاهل البرنامج"
}, },
"Ignore this package": { "Ignore this package": {
"Ignore this package": "" "Ignore this package": "تجاهل هذا التطبيق"
}, },
"Ignored (%1)": { "Ignored (%1)": {
"Ignored (%1)": "" "Ignored (%1)": "تم تجاهله (%1)"
}, },
"Ignored Packages": { "Ignored Packages": {
"Ignored Packages": "" "Ignored Packages": "التطبيقات المتجاهلة"
}, },
"Ignored packages are hidden from the updater and skipped by 'Update All'.": { "Ignored packages are hidden from the updater and skipped by 'Update All'.": {
"Ignored packages are hidden from the updater and skipped by 'Update All'.": "" "Ignored packages are hidden from the updater and skipped by 'Update All'.": "يتم إخفاء التطبيقات المتجاهلة من أداة التحديث ويتخطاها خيار \"تحديث الكل\"."
}, },
"Ignored packages only apply to the built-in updater. Your custom command controls its own exclusions.": { "Ignored packages only apply to the built-in updater. Your custom command controls its own exclusions.": {
"Ignored packages only apply to the built-in updater. Your custom command controls its own exclusions.": "" "Ignored packages only apply to the built-in updater. Your custom command controls its own exclusions.": "تنطبق التطبيقات المتجاهلة فقط على أداة التحديث المدمجة. يتحكم أمرك المخصص في الاستثناءات الخاصة به."
}, },
"Image": { "Image": {
"Image": "صورة" "Image": "صورة"
@@ -4347,7 +4347,7 @@
"Invalid configuration": "تكوين غير صالح" "Invalid configuration": "تكوين غير صالح"
}, },
"Invalid package name — letters, digits and @._+:- only.": { "Invalid package name — letters, digits and @._+:- only.": {
"Invalid package name — letters, digits and @._+:- only.": "" "Invalid package name — letters, digits and @._+:- only.": "اسم التطبيق غير صالح — يُسمح فقط بالأحرف، والأرقام، والرموز التالية: @._+:-"
}, },
"Invalid password for %1": { "Invalid password for %1": {
"Invalid password for %1": "كلمة مرور غير صالحة لـ %1" "Invalid password for %1": "كلمة مرور غير صالحة لـ %1"
@@ -5451,7 +5451,7 @@
"No output devices found": "لم يتم العثور على أجهزة إخراج" "No output devices found": "لم يتم العثور على أجهزة إخراج"
}, },
"No packages ignored. Add one here or hover an update in the popout and click the hide button.": { "No packages ignored. Add one here or hover an update in the popout and click the hide button.": {
"No packages ignored. Add one here or hover an update in the popout and click the hide button.": "" "No packages ignored. Add one here or hover an update in the popout and click the hide button.": "لا توجد تطبيقات متجاهلة. أضف تطبيقًا هنا، أو مرر مؤشر الفأرة فوق التحديث في النافذة المنبثقة وانقر على زر الإخفاء."
}, },
"No peers found": { "No peers found": {
"No peers found": "لم يتم العثور على أقران" "No peers found": "لم يتم العثور على أقران"
@@ -5937,7 +5937,7 @@
"PIN": "PIN" "PIN": "PIN"
}, },
"Package name (e.g., docker)": { "Package name (e.g., docker)": {
"Package name (e.g., docker)": "" "Package name (e.g., docker)": "اسم التطبيق (مثال: docker)"
}, },
"Pad": { "Pad": {
"Pad": "وسادة" "Pad": "وسادة"
@@ -7812,7 +7812,7 @@
"Status": "الحالة" "Status": "الحالة"
}, },
"Stop ignoring %1": { "Stop ignoring %1": {
"Stop ignoring %1": "" "Stop ignoring %1": "إلغاء تجاهل %1"
}, },
"Stopped": { "Stopped": {
"Stopped": "متوقف" "Stopped": "متوقف"
@@ -8910,7 +8910,7 @@
"Votes": "الأصوات" "Votes": "الأصوات"
}, },
"W": { "W": {
"W": "" "W": "W"
}, },
"WPA/WPA2": { "WPA/WPA2": {
"WPA/WPA2": "WPA/WPA2" "WPA/WPA2": "WPA/WPA2"
@@ -9213,16 +9213,16 @@
"by %1": "بواسطة %1" "by %1": "بواسطة %1"
}, },
"checked %1d ago": { "checked %1d ago": {
"checked %1d ago": "" "checked %1d ago": "تم الفحص قبل %1 من الأيام"
}, },
"checked %1h ago": { "checked %1h ago": {
"checked %1h ago": "" "checked %1h ago": "تم الفحص قبل %1 من الساعات"
}, },
"checked %1m ago": { "checked %1m ago": {
"checked %1m ago": "" "checked %1m ago": "تم الفحص قبل %1 من الدقائق"
}, },
"checked just now": { "checked just now": {
"checked just now": "" "checked just now": "تم الفحص الآن"
}, },
"days": { "days": {
"days": "أيام" "days": "أيام"
+25 -25
View File
@@ -777,7 +777,7 @@
"Authenticate": "Authentifizieren" "Authenticate": "Authentifizieren"
}, },
"Authenticated!": { "Authenticated!": {
"Authenticated!": "" "Authenticated!": "Authentifiziert!"
}, },
"Authenticating...": { "Authenticating...": {
"Authenticating...": "Authentifizierung..." "Authenticating...": "Authentifizierung..."
@@ -804,13 +804,13 @@
"Authentication error - try again": "Authentifizierungsfehler - erneut versuchen" "Authentication error - try again": "Authentifizierungsfehler - erneut versuchen"
}, },
"Authentication failed - attempt %1 of %2": { "Authentication failed - attempt %1 of %2": {
"Authentication failed - attempt %1 of %2": "" "Authentication failed - attempt %1 of %2": "Authentifizierung fehlgeschlagen - Versuch %1 von %2"
}, },
"Authentication failed - lockout can occur": { "Authentication failed - lockout can occur": {
"Authentication failed - lockout can occur": "" "Authentication failed - lockout can occur": "Authentifizierung fehlgeschlagen - Sperrung kann erfolgen"
}, },
"Authentication failed - try again": { "Authentication failed - try again": {
"Authentication failed - try again": "" "Authentication failed - try again": "Authentifizierung fehlgeschlagen - erneut versuchen"
}, },
"Authentication failed, please try again": { "Authentication failed, please try again": {
"Authentication failed, please try again": "Authentifizierung nicht erfolgreich, bitte nochmals probieren" "Authentication failed, please try again": "Authentifizierung nicht erfolgreich, bitte nochmals probieren"
@@ -987,13 +987,13 @@
"Available.": "Verfügbar." "Available.": "Verfügbar."
}, },
"Awaiting fingerprint authentication": { "Awaiting fingerprint authentication": {
"Awaiting fingerprint authentication": "" "Awaiting fingerprint authentication": "Warten auf Fingerabdruck-Authentifizierung"
}, },
"Awaiting fingerprint or security key authentication": { "Awaiting fingerprint or security key authentication": {
"Awaiting fingerprint or security key authentication": "" "Awaiting fingerprint or security key authentication": "Warten auf Fingerabdruck- oder Sicherheitsschlüssel-Authentifizierung"
}, },
"Awaiting security key authentication": { "Awaiting security key authentication": {
"Awaiting security key authentication": "" "Awaiting security key authentication": "Warten auf Sicherheitsschlüssel-Authentifizierung"
}, },
"BSSID": { "BSSID": {
"BSSID": "BSSID" "BSSID": "BSSID"
@@ -2175,7 +2175,7 @@
"Custom command and terminal params are split on whitespace; paths with spaces will break.": "Benutzerdefinierte Befehle und Terminalparameter werden an Leerzeichen getrennt; Pfade mit Leerzeichen funktionieren nicht." "Custom command and terminal params are split on whitespace; paths with spaces will break.": "Benutzerdefinierte Befehle und Terminalparameter werden an Leerzeichen getrennt; Pfade mit Leerzeichen funktionieren nicht."
}, },
"Custom interval in minutes (minimum 5)": { "Custom interval in minutes (minimum 5)": {
"Custom interval in minutes (minimum 5)": "" "Custom interval in minutes (minimum 5)": "Benutzerdefiniertes Intervall in Minuten (Minimum 5)"
}, },
"Custom open-trash command": { "Custom open-trash command": {
"Custom open-trash command": "Benutzerdefinierter Befehl zum Öffnen des Papierkorbs" "Custom open-trash command": "Benutzerdefinierter Befehl zum Öffnen des Papierkorbs"
@@ -3435,7 +3435,7 @@
"Flags": "Flags" "Flags": "Flags"
}, },
"Flatpak": { "Flatpak": {
"Flatpak": "" "Flatpak": "Flatpak"
}, },
"Flipped": { "Flipped": {
"Flipped": "Gespiegelt" "Flipped": "Gespiegelt"
@@ -3852,7 +3852,7 @@
"Groups": "Gruppen" "Groups": "Gruppen"
}, },
"H": { "H": {
"H": "" "H": "H"
}, },
"HDR (EDID)": { "HDR (EDID)": {
"HDR (EDID)": "HDR (EDID)" "HDR (EDID)": "HDR (EDID)"
@@ -4149,22 +4149,22 @@
"Ignore Completely": "Vollständig ignorieren" "Ignore Completely": "Vollständig ignorieren"
}, },
"Ignore package": { "Ignore package": {
"Ignore package": "" "Ignore package": "Paket ignorieren"
}, },
"Ignore this package": { "Ignore this package": {
"Ignore this package": "" "Ignore this package": "Dieses Paket ignorieren"
}, },
"Ignored (%1)": { "Ignored (%1)": {
"Ignored (%1)": "" "Ignored (%1)": "Ignoriert (%1)"
}, },
"Ignored Packages": { "Ignored Packages": {
"Ignored Packages": "" "Ignored Packages": "Ignorierte Pakete"
}, },
"Ignored packages are hidden from the updater and skipped by 'Update All'.": { "Ignored packages are hidden from the updater and skipped by 'Update All'.": {
"Ignored packages are hidden from the updater and skipped by 'Update All'.": "" "Ignored packages are hidden from the updater and skipped by 'Update All'.": "Ignorierte Pakete werden im Updater ausgeblendet und bei \"Alle aktualisieren\" übersprungen."
}, },
"Ignored packages only apply to the built-in updater. Your custom command controls its own exclusions.": { "Ignored packages only apply to the built-in updater. Your custom command controls its own exclusions.": {
"Ignored packages only apply to the built-in updater. Your custom command controls its own exclusions.": "" "Ignored packages only apply to the built-in updater. Your custom command controls its own exclusions.": "Ignorierte Pakete gelten nur für den integrierten Updater. Ihr benutzerdefinierter Befehl steuert seine eigenen Ausschlüsse."
}, },
"Image": { "Image": {
"Image": "Bild" "Image": "Bild"
@@ -4347,7 +4347,7 @@
"Invalid configuration": "Invalide Konfiguration" "Invalid configuration": "Invalide Konfiguration"
}, },
"Invalid package name — letters, digits and @._+:- only.": { "Invalid package name — letters, digits and @._+:- only.": {
"Invalid package name — letters, digits and @._+:- only.": "" "Invalid package name — letters, digits and @._+:- only.": "Ungültiger Paketname — nur Buchstaben, Ziffern und @._+:- zulässig."
}, },
"Invalid password for %1": { "Invalid password for %1": {
"Invalid password for %1": "Ungültiges Passwort für %1" "Invalid password for %1": "Ungültiges Passwort für %1"
@@ -5451,7 +5451,7 @@
"No output devices found": "Keine Ausgabegeräte gefunden" "No output devices found": "Keine Ausgabegeräte gefunden"
}, },
"No packages ignored. Add one here or hover an update in the popout and click the hide button.": { "No packages ignored. Add one here or hover an update in the popout and click the hide button.": {
"No packages ignored. Add one here or hover an update in the popout and click the hide button.": "" "No packages ignored. Add one here or hover an update in the popout and click the hide button.": "Keine Pakete ignoriert. Fügen Sie hier eines hinzu oder bewegen Sie den Mauszeiger über ein Update im Popout und klicken Sie auf die Schaltfläche Ausblenden."
}, },
"No peers found": { "No peers found": {
"No peers found": "Keine Peers gefunden" "No peers found": "Keine Peers gefunden"
@@ -5937,7 +5937,7 @@
"PIN": "PIN" "PIN": "PIN"
}, },
"Package name (e.g., docker)": { "Package name (e.g., docker)": {
"Package name (e.g., docker)": "" "Package name (e.g., docker)": "Paketname (z. B. docker)"
}, },
"Pad": { "Pad": {
"Pad": "Auffüllen" "Pad": "Auffüllen"
@@ -7812,7 +7812,7 @@
"Status": "Status" "Status": "Status"
}, },
"Stop ignoring %1": { "Stop ignoring %1": {
"Stop ignoring %1": "" "Stop ignoring %1": "Ignorieren von %1 beenden"
}, },
"Stopped": { "Stopped": {
"Stopped": "Gestoppt" "Stopped": "Gestoppt"
@@ -8910,7 +8910,7 @@
"Votes": "Stimmen" "Votes": "Stimmen"
}, },
"W": { "W": {
"W": "" "W": "W"
}, },
"WPA/WPA2": { "WPA/WPA2": {
"WPA/WPA2": "WPA/WPA2" "WPA/WPA2": "WPA/WPA2"
@@ -9213,16 +9213,16 @@
"by %1": "von %1" "by %1": "von %1"
}, },
"checked %1d ago": { "checked %1d ago": {
"checked %1d ago": "" "checked %1d ago": "vor %1 T geprüft"
}, },
"checked %1h ago": { "checked %1h ago": {
"checked %1h ago": "" "checked %1h ago": "vor %1 Std. geprüft"
}, },
"checked %1m ago": { "checked %1m ago": {
"checked %1m ago": "" "checked %1m ago": "vor %1 Min. geprüft"
}, },
"checked just now": { "checked just now": {
"checked just now": "" "checked just now": "gerade eben geprüft"
}, },
"days": { "days": {
"days": "Tage" "days": "Tage"
@@ -4645,14 +4645,12 @@
"login", "login",
"pam", "pam",
"password", "password",
"pinned",
"screen", "screen",
"security", "security",
"service", "service",
"source" "source"
], ],
"icon": "key", "icon": "key"
"description": "Pinned to "
}, },
{ {
"section": "lockPamPath", "section": "lockPamPath",
@@ -4665,13 +4663,11 @@
"login", "login",
"pam", "pam",
"password", "password",
"pinned",
"screen", "screen",
"security", "security",
"service", "service",
"source" "source"
], ]
"description": "Pinned to "
}, },
{ {
"section": "lockScreenVideoCycling", "section": "lockScreenVideoCycling",
@@ -7994,56 +7990,19 @@
"auth", "auth",
"authentication", "authentication",
"block", "block",
"configure",
"display manager", "display manager",
"existing",
"external", "external",
"fingerprint",
"greetd", "greetd",
"greeter", "greeter",
"login", "login",
"managed", "managed",
"never",
"next",
"pam", "pam",
"removed", "removes",
"security", "stops",
"sync", "writing"
"touches",
"yourself"
], ],
"icon": "fingerprint", "icon": "fingerprint",
"description": "DMS never touches /etc/pam.d/greetd; any existing DMS block is removed on next sync. Configure fingerprint and security-key auth yourself." "description": "DMS removes its managed block from /etc/pam.d/greetd and stops writing to it"
},
{
"section": "greeterPamExternallyManaged",
"label": "Manage greetd PAM automatically",
"tabIndex": 31,
"category": "Greeter",
"keywords": [
"auth",
"automatically",
"block",
"configure",
"display manager",
"existing",
"external",
"fingerprint",
"greetd",
"greeter",
"login",
"manage",
"managed",
"never",
"next",
"pam",
"removed",
"security",
"sync",
"touches",
"yourself"
],
"description": "DMS never touches /etc/pam.d/greetd; any existing DMS block is removed on next sync. Configure fingerprint and security-key auth yourself."
}, },
{ {
"section": "greeterRememberLastSession", "section": "greeterRememberLastSession",
@@ -8081,6 +8040,28 @@
], ],
"description": "Pre-fill the last successful username on the greeter" "description": "Pre-fill the last successful username on the greeter"
}, },
{
"section": "greeterPamExternallyManaged",
"label": "greetd PAM is externally managed",
"tabIndex": 31,
"category": "Greeter",
"keywords": [
"auth",
"block",
"display manager",
"external",
"externally",
"greetd",
"greeter",
"login",
"managed",
"pam",
"removes",
"stops",
"writing"
],
"description": "DMS removes its managed block from /etc/pam.d/greetd and stops writing to it"
},
{ {
"section": "muxType", "section": "muxType",
"label": "Multiplexer", "label": "Multiplexer",
+17 -129
View File
@@ -1528,7 +1528,7 @@
{ {
"term": "Apply Changes", "term": "Apply Changes",
"translation": "", "translation": "",
"context": "", "context": "validate and apply custom PAM authentication source",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
@@ -1836,14 +1836,7 @@
{ {
"term": "Authentication changes apply automatically.", "term": "Authentication changes apply automatically.",
"translation": "", "translation": "",
"context": "", "context": "greeter auth setting description",
"reference": "",
"comment": ""
},
{
"term": "Authentication changes apply automatically. Fingerprint-only login may not unlock Keyring.",
"translation": "",
"context": "",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
@@ -1913,7 +1906,7 @@
{ {
"term": "Auto", "term": "Auto",
"translation": "", "translation": "",
"context": "calendar backend option | theme category option", "context": "automatic PAM authentication source option | calendar backend option | theme category option",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
@@ -2281,13 +2274,6 @@
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
{
"term": "Available.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{ {
"term": "Awaiting fingerprint authentication", "term": "Awaiting fingerprint authentication",
"translation": "", "translation": "",
@@ -4993,7 +4979,7 @@
{ {
"term": "Custom...", "term": "Custom...",
"translation": "", "translation": "",
"context": "date format option", "context": "custom PAM authentication source option | date format option",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
@@ -6551,76 +6537,6 @@
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
{
"term": "Enabled, but fingerprint availability could not be confirmed.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Enabled, but no fingerprint reader was detected.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Enabled, but no prints are enrolled yet. Authentication changes apply automatically once you enroll fingerprints.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Enabled, but no prints are enrolled yet. Enroll fingerprints and run Sync.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Enabled, but no registered security key was found yet. Authentication changes apply automatically once your key is registered or your U2F config is updated.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Enabled, but no registered security key was found yet. Register a key and run Sync.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Enabled, but security-key availability could not be confirmed.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Enabled. PAM already provides fingerprint auth.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Enabled. PAM already provides security-key auth.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Enabled. PAM provides fingerprint auth, but no prints are enrolled yet.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{ {
"term": "Enabling WiFi...", "term": "Enabling WiFi...",
"translation": "", "translation": "",
@@ -7800,7 +7716,7 @@
{ {
"term": "Fingerprint availability could not be confirmed.", "term": "Fingerprint availability could not be confirmed.",
"translation": "", "translation": "",
"context": "", "context": "fingerprint setting status",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
@@ -7821,14 +7737,14 @@
{ {
"term": "Fingerprint reader detected, but no prints are enrolled yet. You can enable this now and enroll later.", "term": "Fingerprint reader detected, but no prints are enrolled yet. You can enable this now and enroll later.",
"translation": "", "translation": "",
"context": "", "context": "lock screen fingerprint setting",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
{ {
"term": "Fingerprint reader detected, but no prints are enrolled yet. You can enable this now and run Sync later.", "term": "Fingerprint reader detected, but no prints are enrolled yet. You can enable this now and run Sync later.",
"translation": "", "translation": "",
"context": "", "context": "greeter fingerprint login setting",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
@@ -12392,7 +12308,7 @@
{ {
"term": "No fingerprint reader detected.", "term": "No fingerprint reader detected.",
"translation": "", "translation": "",
"context": "", "context": "fingerprint setting status",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
@@ -12833,28 +12749,28 @@
{ {
"term": "Not available — install fprintd and pam_fprintd, or configure greetd PAM.", "term": "Not available — install fprintd and pam_fprintd, or configure greetd PAM.",
"translation": "", "translation": "",
"context": "", "context": "greeter fingerprint login setting",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
{ {
"term": "Not available — install fprintd and pam_fprintd.", "term": "Not available — install fprintd and pam_fprintd.",
"translation": "", "translation": "",
"context": "", "context": "lock screen fingerprint setting",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
{ {
"term": "Not available — install or configure pam_u2f, or configure greetd PAM.", "term": "Not available — install or configure pam_u2f, or configure greetd PAM.",
"translation": "", "translation": "",
"context": "", "context": "greeter security key login setting",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
{ {
"term": "Not available — install or configure pam_u2f.", "term": "Not available — install or configure pam_u2f.",
"translation": "", "translation": "",
"context": "", "context": "lock screen security key setting",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
@@ -13166,13 +13082,6 @@
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
{
"term": "Only affects DMS-managed PAM. If greetd already includes pam_fprintd, fingerprint stays enabled.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{ {
"term": "Only on Battery", "term": "Only on Battery",
"translation": "", "translation": "",
@@ -13603,35 +13512,14 @@
{ {
"term": "PAM already provides fingerprint auth. Enable this to show it at login.", "term": "PAM already provides fingerprint auth. Enable this to show it at login.",
"translation": "", "translation": "",
"context": "", "context": "greeter fingerprint login setting",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
{ {
"term": "PAM already provides security-key auth. Enable this to show it at login.", "term": "PAM already provides security-key auth. Enable this to show it at login.",
"translation": "", "translation": "",
"context": "", "context": "greeter security key login setting",
"reference": "",
"comment": ""
},
{
"term": "PAM provides fingerprint auth, but availability could not be confirmed.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "PAM provides fingerprint auth, but no prints are enrolled yet.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "PAM provides fingerprint auth, but no reader was detected.",
"translation": "",
"context": "",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
@@ -16228,14 +16116,14 @@
{ {
"term": "Security-key availability could not be confirmed.", "term": "Security-key availability could not be confirmed.",
"translation": "", "translation": "",
"context": "", "context": "security key setting status",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
{ {
"term": "Security-key support was detected, but no registered key was found yet. You can enable this now and register one later.", "term": "Security-key support was detected, but no registered key was found yet. You can enable this now and register one later.",
"translation": "", "translation": "",
"context": "", "context": "security key setting status",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },
@@ -19987,7 +19875,7 @@
{ {
"term": "Use fingerprint authentication for the lock screen.", "term": "Use fingerprint authentication for the lock screen.",
"translation": "", "translation": "",
"context": "", "context": "lock screen fingerprint setting",
"reference": "", "reference": "",
"comment": "" "comment": ""
}, },