1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-06-17 00:25:21 -04:00

Compare commits

..

18 Commits

Author SHA1 Message Date
purian23 68410e882d feat(dbar): add workspace & widget color customization options 2026-06-17 00:02:51 -04:00
bbedward f26c0af39a keybinds: add toggle to switch to FloatingWindow and back 2026-06-16 23:03:19 -04:00
Rocho 0ca451483f fix(shell): don't treat DPMS off/on as a screen-reconnect recovery storm (#2654)
A DPMS off/on cycle removes an output from Quickshell.screens and re-adds
it, which DMSShell's onScreensChanged cannot distinguish from a hotplug. It
fired triggerSurfaceRecovery() on every such event; on hardware where
recreating layer-shell surfaces re-wakes the just-powered-down output, this
drives an endless recovery storm that visibly power-cycles the monitor.

Route the screen-reconnect path through a 450 ms debounce (collapsing the
output-remove + re-add pair into a single pass) followed by a 4 s cooldown,
so repeated flaps trigger at most one recovery per window. Recovery still
runs once per resume, so the partial-DPMS-resume recovery added for #2579 is
preserved. The session-resume path runs its own recovery directly and now
clears any queued screen-reconnect recovery to avoid a redundant follow-up.

Fixes #2642
2026-06-16 22:58:21 -04:00
purian23 2849dd0ba2 feat(distros): Add Ubuntu 26.10 Stingray Support 2026-06-16 22:50:58 -04:00
bbedward df41ae4acb running apps: fix blurred tooltips 2026-06-16 18:26:29 -04:00
lingdianshiren 2692777707 fix(weather): robust location resolution with parallel fetch and multi-tier fallback (#2638)
Decouple weather data fetching from reverse geocoding so that
weather loads as soon as coordinates are available, even when
Nominatim is unreachable (e.g. mainland China).

- Fetch Open-Meteo weather immediately once lat/lon are known.
- Resolve city name in parallel via Nominatim -> Photon -> BigDataCloud.
- If all reverse geocoding fails, keep displaying weather with a
  placeholder city name.
- Skip reverse geocoding entirely when the user has configured a
  city name.
- Fall back to ip-api.com when GeoClue2 is unavailable or returns
  zero coordinates.
- Add request-generation tracking to discard stale geocoding
  responses after location changes.
- Hold explicit WeatherService refs in bar widget and dashboard tab.

Co-authored-by: lingdiansr <2077258365@qq.com>
2026-06-16 14:42:01 -04:00
Rocho ca1a45ccf8 fix(lock): dismiss fade-to-lock overlay when using a custom lock command (#2653)
When a custom lock command is configured, Lock.lock() runs the command and
returns early without engaging WlSessionLock, so IdleService.isShellLocked
never transitions true->false. That transition is the only trigger that
dismisses a completed FadeToLockWindow, so the fully-faded black overlay stays
on screen and the desktop is unusable after re-login (regression from b8f4c35,
which added the _completed guard and tied dismissal solely to isShellLocked).

Add a dedicated dismissFadeToLock signal that the custom-lock branch emits
after launching the external locker, mirroring the existing fade signal wiring,
so the overlay is handed off and torn down. The built-in WlSessionLock path is
unchanged and still dismisses on unlock.

Fixes #2595
2026-06-16 13:45:28 -04:00
jbwfu 2f39f248fc fix(network): keep Wi-Fi when password prompt is canceled (#2651) 2026-06-16 12:52:25 -04:00
Rocho 90f8ce5035 feat(sounds): make muting sounds during media playback configurable (#2652)
Commit e3dbaed started skipping all system sounds (notifications, volume,
power, login) whenever an MPRIS player is playing, with no way to opt out.
Users who rely on notification sounds while listening to music lost them
entirely.

Add a 'Mute During Playback' toggle (SettingsData.muteSoundsWhenMediaPlaying,
default true) so the current behaviour is preserved, but users can disable
it to restore audible sounds while media is playing. The media check is
wrapped in shouldMuteForMedia(), which gates on the new setting before
querying the active player.

Closes #2616
2026-06-16 12:49:51 -04:00
Adwait Adhikari cb29125580 add lexical-binding (#2649) 2026-06-16 09:19:38 -04:00
Rocho 988b54515e feat(tailscale): add connect/disconnect, exit-node and LAN-access controls (#2644)
* feat(tailscale): add connect/disconnect/exit-node/LAN-access backend

The Tailscale backend previously exposed only read-only status
(tailscale.getStatus, tailscale.refresh). This adds write actions through the
existing tailscale.com/client/local integration:

- tailscale.connect / tailscale.disconnect (EditPrefs WantRunning)
- tailscale.setExitNode (EditPrefs ExitNodeID; empty id clears it and any
  legacy ExitNodeIP, mirroring `tailscale set --exit-node`)
- tailscale.setAllowLanAccess (EditPrefs ExitNodeAllowLANAccess)

The manager's client interface gains GetPrefs/EditPrefs; fetchState merges
ExitNodeAllowLANAccess from prefs, and Peer exposes ExitNodeOption so the UI
can list exit-node-capable peers.

* feat(tailscale): expose the new actions in TailscaleService

Adds connectTailscale/disconnectTailscale, setExitNode/clearExitNode and
setAllowLanAccess wrappers, plus derived exitNodeOptions/currentExitNode and the
exitNodeAllowLanAccess state. Write-action errors surface via ToastService.

* feat(tailscale): add connection, exit-node and LAN-access controls to the widget

The control-center widget toggle was a no-op. It now connects/disconnects, and
the detail panel gains a connection status row with a connect/disconnect button,
an exit-node picker and a LAN-access toggle.
2026-06-16 09:08:22 -04:00
Rocho 2fd9de5062 fix(keybinds): record numpad keys as KP_* keysyms (#2645)
* fix(keybinds): record numpad keys as KP_* keysyms

The shortcut recorder passed only the Qt key code to xkbKeyFromQtKey and
dropped Qt.KeypadModifier. Since Qt reuses the same Qt::Key_* values for the
numpad and the main row / nav cluster, numpad presses collapsed onto their
twins: numpad-7 became "7" (NumLock on) or "Home" (NumLock off) instead of
"KP_7"/"KP_Home", numpad-+ became "Equal", numpad-* became "8", numpad Enter
became "Return". numpad-5 with NumLock off (Qt.Key_Clear) was missing from the
map entirely, so the capture was silently dropped.

niri and the other providers bind against the xkb KP_* keysym names, so these
tokens never matched the physical key.

Pass the keypad flag through to xkbKeyFromQtKey and map keypad presses to the
KP_* keysyms: KP_0..KP_9 for the NumLock-on digit codes, the navigation names
(KP_Home, KP_End, KP_Up, ...) for the NumLock-off codes, plus the operators
and KP_Enter. Main-row keys are unaffected because they never carry the keypad
modifier.

* fix(keybinds): ignore lock keys while capturing a shortcut

NumLock/CapsLock/ScrollLock are toggles, not useful bind targets. Pressing
NumLock to switch the numpad between its digit and navigation keysyms
(KP_7 vs KP_Home) was captured as the bind itself (e.g. "Super+Num_Lock").
Skip them in the recorder like the other pure modifier keys already are.
2026-06-16 09:07:48 -04:00
Rocho fd5aabcb17 fix(keybinds): parse niri configs with leading-underscore identifiers (#2646)
DMS reads the niri config with kdl-go, which rejects '_' as the first
character of a bare identifier ("unexpected character _") even though niri's
own parser and the KDL spec accept it. The common trigger is the
`_JAVA_AWT_WM_NONREPARENTING "1"` environment node (the standard Java /
tiling-WM fix). When the parse aborts, `dms keybinds show` returns nothing and
the Keyboard Shortcuts UI shows no binds at all.

Extend the existing preprocessor approach (the brace fix from #2230) with
quoteLeadingUnderscoreIdents, which double-quotes bare identifiers that begin
with '_' before the text reaches kdl-go. The scan is string/comment aware and
only touches a leading '_' at a token boundary, so mid-identifier underscores
(XDG_CURRENT_DESKTOP) and underscores inside strings/comments are left alone.
Token boundaries include the ends of block comments and KDL slashdash (/-), so
a node abutting a comment with no whitespace is handled too. This is safe
because the niri parser only dispatches on fixed node/section names that never
start with '_', so re-quoting such a name cannot change what DMS reads.

Refs #2230
2026-06-16 09:06:55 -04:00
jbwfu 85b63219b9 feat(network): add saved WiFi state to settings (#2648) 2026-06-16 09:06:29 -04:00
bbedward ddf943846f i18n: add Vietnamese 2026-06-15 23:47:12 -04:00
purian23 e7221ec623 fix(powermodal): use overlay layer in standalone mode 2026-06-15 21:41:00 -04:00
bbedward 78daaf0cb4 calendar: remove launch button from settings 2026-06-15 19:02:22 -04:00
jbwfu a6ab3bab4c fix(settings): dedupe search index tab entries (#2643) 2026-06-15 16:50:41 -04:00
91 changed files with 17881 additions and 2045 deletions
@@ -51,7 +51,7 @@ type NiriParser struct {
}
func parseKDL(data []byte) (*document.Document, error) {
return kdl.Parse(strings.NewReader(normalizeKDLBraces(string(data))))
return kdl.Parse(strings.NewReader(normalizeKDLBraces(quoteLeadingUnderscoreIdents(string(data)))))
}
func normalizeKDLBraces(input string) string {
@@ -94,6 +94,93 @@ func normalizeKDLBraces(input string) string {
return sb.String()
}
// quoteLeadingUnderscoreIdents wraps bare KDL identifiers that begin with '_'
// in double quotes. kdl-go rejects '_' as the first character of a bare
// identifier (e.g. the common `_JAVA_AWT_WM_NONREPARENTING "1"` environment
// node), even though niri's own parser and the KDL spec accept it — so without
// this the whole config fails to parse and no keybinds load. Quoting lets
// kdl-go parse it; this is safe because the niri parser only dispatches on
// fixed node/section names (binds, recent-windows, include, ...) that never
// start with '_', so re-quoting such a name cannot change what DMS reads.
// Underscores elsewhere in an identifier (XDG_CURRENT_DESKTOP) are left
// untouched, and underscores inside strings or comments are skipped. Only a
// leading '_' is handled; other start characters kdl-go over-rejects (e.g. '.'
// or '?') do not occur in niri configs.
func quoteLeadingUnderscoreIdents(input string) string {
var sb strings.Builder
sb.Grow(len(input))
var prev byte
n := len(input)
for i := 0; i < n; {
c := input[i]
switch {
case c == '"':
end := findStringEnd(input, i)
sb.WriteString(input[i:end])
prev = '"'
i = end
case c == '/' && i+1 < n && input[i+1] == '/':
end := findLineCommentEnd(input, i)
sb.WriteString(input[i:end])
prev = '\n'
i = end
case c == '/' && i+1 < n && input[i+1] == '*':
end := findBlockCommentEnd(input, i)
sb.WriteString(input[i:end])
prev = ' '
i = end
case c == '/' && i+1 < n && input[i+1] == '-':
// KDL slashdash: /- comments out the next node/value. Keep the
// marker but treat what follows as a fresh token start, so a
// slashdashed leading-underscore node (e.g. `/-_FOO "1"`) still
// gets quoted instead of crashing kdl-go.
sb.WriteByte('/')
sb.WriteByte('-')
prev = ' '
i += 2
case c == '_' && isIdentBoundary(prev):
end := scanBareIdent(input, i)
sb.WriteByte('"')
sb.WriteString(input[i:end])
sb.WriteByte('"')
prev = '"'
i = end
default:
sb.WriteByte(c)
prev = c
i++
}
}
return sb.String()
}
// isIdentBoundary reports whether the previously emitted byte ends a token, so
// that a following '_' starts a fresh bare identifier rather than sitting in
// the middle of one.
func isIdentBoundary(prev byte) bool {
switch prev {
case 0, ' ', '\t', '\n', '\r', '{', '}', ';', '=', '(', ')', ',':
return true
}
return false
}
// scanBareIdent returns the index just past the bare identifier starting at
// start, stopping at whitespace or any KDL delimiter.
func scanBareIdent(s string, start int) int {
n := len(s)
for i := start; i < n; i++ {
switch s[i] {
case ' ', '\t', '\n', '\r', '"', '{', '}', '(', ')', ';', '=', ',', '/', '\\', '<', '>', '[', ']':
return i
}
}
return n
}
func findStringEnd(s string, start int) int {
n := len(s)
for i := start + 1; i < n; {
@@ -71,6 +71,101 @@ func TestNormalizeKDLBraces(t *testing.T) {
}
}
func TestQuoteLeadingUnderscoreIdents(t *testing.T) {
tests := []struct {
name string
in string
out string
}{
{"leading underscore node", `_JAVA_AWT_WM_NONREPARENTING "1"`, `"_JAVA_AWT_WM_NONREPARENTING" "1"`},
{"mid underscore untouched", `XDG_CURRENT_DESKTOP "niri"`, `XDG_CURRENT_DESKTOP "niri"`},
{"indented node", "environment {\n _FOO \"1\"\n}", "environment {\n \"_FOO\" \"1\"\n}"},
{"underscore in string", `spawn "_not_a_node"`, `spawn "_not_a_node"`},
{"underscore in line comment", "// _comment\n_FOO \"1\"", "// _comment\n\"_FOO\" \"1\""},
{"underscore in block comment", "/* _x */ _FOO \"1\"", "/* _x */ \"_FOO\" \"1\""},
{"block comment abuts node", `/* x */_FOO "1"`, `/* x */"_FOO" "1"`},
{"slashdash before node", `/-_FOO "1"`, `/-"_FOO" "1"`},
{"node after closing paren", "node (u8)_v", `node (u8)"_v"`},
{"node before brace without space", "_FOO{ }", `"_FOO"{ }`},
{"lone underscore", `_ "x"`, `"_" "x"`},
{"property value", "node key=_val", `node key="_val"`},
{"no underscores", "node child", "node child"},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
got := quoteLeadingUnderscoreIdents(tc.in)
if got != tc.out {
t.Errorf("quoteLeadingUnderscoreIdents(%q) = %q, want %q", tc.in, got, tc.out)
}
})
}
}
func TestNiriParseLeadingUnderscoreEnvironment(t *testing.T) {
tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "config.kdl")
// A leading-underscore environment node (a common Java/tiling-WM fix) must
// not abort parsing of the rest of the config — keybinds still have to load.
content := `environment {
XDG_CURRENT_DESKTOP "niri"
_JAVA_AWT_WM_NONREPARENTING "1"
}
binds {
Mod+Q { close-window; }
Mod+KP_Home { focus-workspace 1; }
}
`
if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil {
t.Fatalf("Failed to write test config: %v", err)
}
result, err := ParseNiriKeys(tmpDir)
if err != nil {
t.Fatalf("ParseNiriKeys failed on config with leading-underscore env node: %v", err)
}
if len(result.Section.Keybinds) != 2 {
t.Errorf("Expected 2 keybinds, got %d", len(result.Section.Keybinds))
}
foundClose := false
for _, kb := range result.Section.Keybinds {
if kb.Action == "close-window" {
foundClose = true
}
}
if !foundClose {
t.Error("close-window keybind not found — leading-underscore env node broke parsing")
}
}
func TestNiriParseSlashdashLeadingUnderscore(t *testing.T) {
tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "config.kdl")
// A slashdashed leading-underscore node must not abort parsing either.
content := `environment {
/-_JAVA_AWT_WM_NONREPARENTING "1"
}
binds {
Mod+Q { close-window; }
}
`
if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil {
t.Fatalf("Failed to write test config: %v", err)
}
result, err := ParseNiriKeys(tmpDir)
if err != nil {
t.Fatalf("ParseNiriKeys failed on config with slashdashed leading-underscore node: %v", err)
}
if len(result.Section.Keybinds) != 1 {
t.Errorf("Expected 1 keybind, got %d", len(result.Section.Keybinds))
}
}
func TestNiriParseKeyCombo(t *testing.T) {
tests := []struct {
combo string
+2
View File
@@ -125,6 +125,8 @@ State updates are sent whenever network configuration changes:
- `wifiConnected`: Whether associated with an access point
- `wifiSSID`: Currently connected network name
- `wifiIP`: Assigned IP address (empty until DHCP completes)
- `savedWifiNetworks` (API v26+): Saved WiFi profiles exposed at SSID granularity. If a backend has multiple profiles for the same SSID, DMS merges them into one SSID-level entry. Clients talking to older servers should derive saved visible networks from `wifiNetworks` entries where `saved` is true.
- `savedWifiNetworks[].outOfRange` (API v26+): Whether the saved profile is not currently visible in scan results. Fallback entries derived from `wifiNetworks` should be treated as visible (`outOfRange: false`).
- `lastError`: Error message from last failed connection attempt
### network.credentials Service Events
+1
View File
@@ -67,6 +67,7 @@ type BackendState struct {
WiFiBSSID string
WiFiSignal uint8
WiFiNetworks []WiFiNetwork
SavedWiFiNetworks []WiFiNetwork
WiFiDevices []WiFiDevice
WiredConnections []WiredConnection
VPNProfiles []VPNProfile
@@ -27,6 +27,19 @@ func TestHybridIwdNetworkdBackend_GetCurrentState_MergesState(t *testing.T) {
wifi.state.WiFiBSSID = "00:11:22:33:44:55"
wifi.state.WiFiSignal = 75
wifi.state.WiFiDevice = "wlan0"
wifi.state.SavedWiFiNetworks = []WiFiNetwork{
{
SSID: "TestNetwork",
Saved: true,
Autoconnect: true,
Connected: true,
},
{
SSID: "AwayNetwork",
Saved: true,
OutOfRange: true,
},
}
l3.state.WiFiIP = "192.168.1.100"
l3.state.EthernetConnected = false
@@ -42,6 +55,9 @@ func TestHybridIwdNetworkdBackend_GetCurrentState_MergesState(t *testing.T) {
assert.True(t, state.WiFiConnected)
assert.False(t, state.EthernetConnected)
assert.Equal(t, StatusWiFi, state.NetworkStatus)
assert.Len(t, state.SavedWiFiNetworks, 2)
assert.Equal(t, "TestNetwork", state.SavedWiFiNetworks[0].SSID)
assert.True(t, state.SavedWiFiNetworks[1].OutOfRange)
}
func TestHybridIwdNetworkdBackend_GetCurrentState_EthernetPriority(t *testing.T) {
@@ -80,6 +80,10 @@ func (b *IWDBackend) Initialize() error {
return fmt.Errorf("failed to discover iwd devices: %w", err)
}
if err := b.updateSavedWiFiNetworks(); err != nil {
log.Warnf("Failed to get initial saved WiFi networks: %v", err)
}
if err := b.updateState(); err != nil {
conn.Close()
return fmt.Errorf("failed to get initial state: %w", err)
@@ -145,6 +149,7 @@ func (b *IWDBackend) GetCurrentState() (*BackendState, error) {
state := *b.state
state.WiFiNetworks = append([]WiFiNetwork(nil), b.state.WiFiNetworks...)
state.SavedWiFiNetworks = append([]WiFiNetwork(nil), b.state.SavedWiFiNetworks...)
state.WiredConnections = append([]WiredConnection(nil), b.state.WiredConnections...)
state.WiFiDevices = b.getWiFiDevicesLocked()
@@ -45,12 +45,42 @@ func (b *IWDBackend) StartMonitoring(onStateChange func()) error {
}
}
if err := b.conn.AddMatchSignal(
dbus.WithMatchInterface(dbusPropertiesInterface),
dbus.WithMatchMember("PropertiesChanged"),
dbus.WithMatchArg(0, iwdKnownNetworkInterface),
); err != nil {
return fmt.Errorf("failed to add known network signal match: %w", err)
}
if err := b.conn.AddMatchSignal(
dbus.WithMatchInterface(dbusObjectManager),
dbus.WithMatchMember("InterfacesAdded"),
); err != nil {
return fmt.Errorf("failed to add iwd interfaces-added signal match: %w", err)
}
if err := b.conn.AddMatchSignal(
dbus.WithMatchInterface(dbusObjectManager),
dbus.WithMatchMember("InterfacesRemoved"),
); err != nil {
return fmt.Errorf("failed to add iwd interfaces-removed signal match: %w", err)
}
b.sigWG.Add(1)
go b.signalHandler(sigChan)
return nil
}
func (b *IWDBackend) refreshWiFiNetworkState() bool {
_, err := b.updateWiFiNetworks()
if err == nil {
return true
}
return b.updateSavedWiFiNetworks() == nil
}
func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
defer b.sigWG.Done()
@@ -66,11 +96,36 @@ func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
return
}
if sig.Name != dbusPropertiesInterface+".PropertiesChanged" {
if sig.Name == dbusObjectManager+".InterfacesAdded" {
if len(sig.Body) >= 2 {
if interfaces, ok := sig.Body[1].(map[string]map[string]dbus.Variant); ok {
if _, ok := interfaces[iwdKnownNetworkInterface]; ok {
if b.refreshWiFiNetworkState() && b.onStateChange != nil {
b.onStateChange()
}
}
}
}
continue
}
if len(sig.Body) < 2 {
if sig.Name == dbusObjectManager+".InterfacesRemoved" {
if len(sig.Body) >= 2 {
if interfaces, ok := sig.Body[1].([]string); ok {
for _, iface := range interfaces {
if iface == iwdKnownNetworkInterface {
if b.refreshWiFiNetworkState() && b.onStateChange != nil {
b.onStateChange()
}
break
}
}
}
}
continue
}
if sig.Name != dbusPropertiesInterface+".PropertiesChanged" || len(sig.Body) < 2 {
continue
}
@@ -87,6 +142,9 @@ func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
stateChanged := false
switch iface {
case iwdKnownNetworkInterface:
stateChanged = b.refreshWiFiNetworkState()
case iwdDeviceInterface:
if sig.Path == b.devicePath {
if poweredVar, ok := changed["Powered"]; ok {
@@ -105,13 +163,7 @@ func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
if sig.Path == b.stationPath {
if scanningVar, ok := changed["Scanning"]; ok {
if scanning, ok := scanningVar.Value().(bool); ok && !scanning {
networks, err := b.updateWiFiNetworks()
if err == nil {
b.stateMutex.Lock()
b.state.WiFiNetworks = networks
b.stateMutex.Unlock()
stateChanged = true
}
stateChanged = b.refreshWiFiNetworkState() || stateChanged
b.stateMutex.RLock()
wifiConnected := b.state.WiFiConnected
@@ -236,6 +288,7 @@ func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
}
}
b.refreshWiFiNetworkState()
stateChanged = true
if att != nil && isTarget {
@@ -282,6 +335,7 @@ func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
b.state.NetworkStatus = StatusDisconnected
}
b.stateMutex.Unlock()
b.refreshWiFiNetworkState()
stateChanged = true
}
}
@@ -342,6 +396,7 @@ func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
stateChanged = true
}
b.stateMutex.Unlock()
b.refreshWiFiNetworkState()
}
}
}
@@ -4,6 +4,7 @@ import (
"testing"
"time"
"github.com/godbus/dbus/v5"
"github.com/stretchr/testify/assert"
)
@@ -168,6 +169,92 @@ func TestIWDBackend_MapIwdDBusError(t *testing.T) {
}
}
func TestIWDSavedWiFiProfilesFromManagedObjects(t *testing.T) {
objects := map[dbus.ObjectPath]map[string]map[string]dbus.Variant{
"/net/connman/iwd/known_network/1": {
iwdKnownNetworkInterface: {
"Name": dbus.MakeVariant("Home"),
"AutoConnect": dbus.MakeVariant(false),
"Hidden": dbus.MakeVariant(true),
"Type": dbus.MakeVariant("psk"),
},
},
"/net/connman/iwd/known_network/2": {
iwdKnownNetworkInterface: {
"Name": dbus.MakeVariant("Office"),
"Type": dbus.MakeVariant("8021x"),
},
},
"/net/connman/iwd/known_network/3": {
iwdKnownNetworkInterface: {
"Name": dbus.MakeVariant("Cafe"),
"Type": dbus.MakeVariant("open"),
},
},
"/net/connman/iwd/network/1": {
iwdNetworkInterface: {
"Name": dbus.MakeVariant("VisibleOnly"),
},
},
}
profiles := iwdSavedWiFiProfilesFromManagedObjects(objects)
assert.Len(t, profiles, 3)
assert.False(t, profiles["Home"].Autoconnect)
assert.True(t, profiles["Home"].Hidden)
assert.True(t, profiles["Home"].Secured)
assert.False(t, profiles["Home"].Enterprise)
assert.True(t, profiles["Office"].Autoconnect)
assert.True(t, profiles["Office"].Secured)
assert.True(t, profiles["Office"].Enterprise)
assert.True(t, profiles["Cafe"].Autoconnect)
assert.False(t, profiles["Cafe"].Secured)
assert.False(t, profiles["Cafe"].Enterprise)
}
func TestIWDWiFiNetworksFromVisibleIncludesConnectedHiddenFallback(t *testing.T) {
profiles := map[string]savedWiFiProfile{
"Home": {
Autoconnect: true,
Secured: true,
Hidden: true,
Mode: "infrastructure",
},
}
visible := []WiFiNetwork{
{
SSID: "Cafe",
Signal: 42,
Secured: false,
},
}
networks := iwdWiFiNetworksFromVisible(visible, profiles, "Home", true, 68)
savedNetworks := savedWiFiNetworksFromProfiles(profiles, map[string]WiFiNetwork{
networks[0].SSID: networks[0],
networks[1].SSID: networks[1],
}, "Home", true)
assert.Len(t, networks, 2)
assert.Equal(t, "Cafe", networks[0].SSID)
assert.False(t, networks[0].Connected)
assert.Equal(t, "Home", networks[1].SSID)
assert.True(t, networks[1].Connected)
assert.True(t, networks[1].Hidden)
assert.True(t, networks[1].Saved)
assert.True(t, networks[1].Autoconnect)
assert.Equal(t, uint8(68), networks[1].Signal)
assert.Len(t, savedNetworks, 1)
assert.Equal(t, "Home", savedNetworks[0].SSID)
assert.True(t, savedNetworks[0].Connected)
assert.False(t, savedNetworks[0].OutOfRange)
}
func TestConnectAttempt_Finalization(t *testing.T) {
backend, _ := NewIWDBackend()
backend.state = &BackendState{}
+132 -49
View File
@@ -164,22 +164,18 @@ func (b *IWDBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
return nil, fmt.Errorf("failed to get networks: %w", err)
}
knownNetworks, err := b.getKnownNetworks()
savedProfiles, err := b.getIWDSavedWiFiProfiles()
if err != nil {
knownNetworks = make(map[string]bool)
}
autoconnectMap, err := b.getAutoconnectSettings()
if err != nil {
autoconnectMap = make(map[string]bool)
savedProfiles = make(map[string]savedWiFiProfile)
}
b.stateMutex.RLock()
currentSSID := b.state.WiFiSSID
wifiConnected := b.state.WiFiConnected
wifiSignal := b.state.WiFiSignal
b.stateMutex.RUnlock()
networks := make([]WiFiNetwork, 0, len(orderedNetworks))
visibleNetworks := make([]WiFiNetwork, 0, len(orderedNetworks))
for _, netData := range orderedNetworks {
if len(netData) < 2 {
continue
@@ -225,23 +221,26 @@ func (b *IWDBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
secured := netType != "open"
network := WiFiNetwork{
visibleNetworks = append(visibleNetworks, WiFiNetwork{
SSID: name,
Signal: signal,
Secured: secured,
Connected: wifiConnected && name == currentSSID,
Saved: knownNetworks[name],
Autoconnect: autoconnectMap[name],
Enterprise: netType == "8021x",
})
}
networks = append(networks, network)
networks := iwdWiFiNetworksFromVisible(visibleNetworks, savedProfiles, currentSSID, wifiConnected, wifiSignal)
visibleNetworkMap := make(map[string]WiFiNetwork, len(networks))
for _, network := range networks {
visibleNetworkMap[network.SSID] = network
}
savedNetworks := savedWiFiNetworksFromProfiles(savedProfiles, visibleNetworkMap, currentSSID, wifiConnected)
sortWiFiNetworks(networks)
b.stateMutex.Lock()
b.state.WiFiNetworks = networks
b.state.SavedWiFiNetworks = savedNetworks
b.stateMutex.Unlock()
now := time.Now()
@@ -254,30 +253,129 @@ func (b *IWDBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
return networks, nil
}
func (b *IWDBackend) getKnownNetworks() (map[string]bool, error) {
obj := b.conn.Object(iwdBusName, iwdObjectPath)
var objects map[dbus.ObjectPath]map[string]map[string]dbus.Variant
err := obj.Call(dbusObjectManager+".GetManagedObjects", 0).Store(&objects)
func (b *IWDBackend) updateSavedWiFiNetworks() error {
savedProfiles, err := b.getIWDSavedWiFiProfiles()
if err != nil {
return nil, err
return err
}
known := make(map[string]bool)
for _, interfaces := range objects {
if knownProps, ok := interfaces[iwdKnownNetworkInterface]; ok {
if nameVar, ok := knownProps["Name"]; ok {
if name, ok := nameVar.Value().(string); ok {
known[name] = true
}
}
}
}
b.stateMutex.RLock()
currentSSID := b.state.WiFiSSID
wifiConnected := b.state.WiFiConnected
wifiNetworks := append([]WiFiNetwork(nil), b.state.WiFiNetworks...)
b.stateMutex.RUnlock()
return known, nil
wifiNetworks, savedNetworks := refreshSavedWiFiState(wifiNetworks, savedProfiles, currentSSID, wifiConnected)
b.stateMutex.Lock()
b.state.WiFiNetworks = wifiNetworks
b.state.SavedWiFiNetworks = savedNetworks
b.stateMutex.Unlock()
return nil
}
func (b *IWDBackend) getAutoconnectSettings() (map[string]bool, error) {
func iwdWiFiNetworksFromVisible(visibleNetworks []WiFiNetwork, savedProfiles map[string]savedWiFiProfile, currentSSID string, wifiConnected bool, wifiSignal uint8) []WiFiNetwork {
networks := make([]WiFiNetwork, 0, len(visibleNetworks)+1)
seenSSIDs := make(map[string]struct{}, len(visibleNetworks)+1)
for _, network := range visibleNetworks {
profile, saved := savedProfiles[network.SSID]
network.Connected = wifiConnected && network.SSID == currentSSID
network.Saved = saved
network.Autoconnect = profile.Autoconnect
network.Hidden = network.Hidden || profile.Hidden
network.Secured = network.Secured || profile.Secured
network.Enterprise = network.Enterprise || profile.Enterprise
if network.Mode == "" {
network.Mode = profile.Mode
}
networks = append(networks, network)
seenSSIDs[network.SSID] = struct{}{}
}
if wifiConnected && currentSSID != "" {
if _, exists := seenSSIDs[currentSSID]; !exists {
profile, saved := savedProfiles[currentSSID]
secured := profile.Secured
if !saved {
secured = true
}
mode := profile.Mode
if mode == "" {
mode = "infrastructure"
}
networks = append(networks, WiFiNetwork{
SSID: currentSSID,
Signal: wifiSignal,
Secured: secured,
Enterprise: profile.Enterprise,
Connected: true,
Saved: saved,
Autoconnect: profile.Autoconnect,
Hidden: true,
Mode: mode,
})
}
}
return networks
}
func iwdSavedWiFiProfilesFromManagedObjects(objects map[dbus.ObjectPath]map[string]map[string]dbus.Variant) map[string]savedWiFiProfile {
profiles := make(map[string]savedWiFiProfile)
for _, interfaces := range objects {
knownProps, ok := interfaces[iwdKnownNetworkInterface]
if !ok {
continue
}
nameVar, ok := knownProps["Name"]
if !ok {
continue
}
name, ok := nameVar.Value().(string)
if !ok || name == "" {
continue
}
profile := savedWiFiProfile{
Autoconnect: true,
Mode: "infrastructure",
}
if acVar, ok := knownProps["AutoConnect"]; ok {
if autoconnect, ok := acVar.Value().(bool); ok {
profile.Autoconnect = autoconnect
}
}
if hiddenVar, ok := knownProps["Hidden"]; ok {
if hidden, ok := hiddenVar.Value().(bool); ok {
profile.Hidden = hidden
}
}
if typeVar, ok := knownProps["Type"]; ok {
if networkType, ok := typeVar.Value().(string); ok {
profile.Secured = networkType != "" && networkType != "open"
profile.Enterprise = networkType == "8021x"
}
}
if existing, ok := profiles[name]; ok {
profile.Autoconnect = profile.Autoconnect || existing.Autoconnect
profile.Hidden = profile.Hidden || existing.Hidden
profile.Secured = profile.Secured || existing.Secured
profile.Enterprise = profile.Enterprise || existing.Enterprise
}
profiles[name] = profile
}
return profiles
}
func (b *IWDBackend) getIWDSavedWiFiProfiles() (map[string]savedWiFiProfile, error) {
obj := b.conn.Object(iwdBusName, iwdObjectPath)
var objects map[dbus.ObjectPath]map[string]map[string]dbus.Variant
@@ -286,24 +384,7 @@ func (b *IWDBackend) getAutoconnectSettings() (map[string]bool, error) {
return nil, err
}
autoconnectMap := make(map[string]bool)
for _, interfaces := range objects {
if knownProps, ok := interfaces[iwdKnownNetworkInterface]; ok {
if nameVar, ok := knownProps["Name"]; ok {
if name, ok := nameVar.Value().(string); ok {
autoconnect := true
if acVar, ok := knownProps["AutoConnect"]; ok {
if ac, ok := acVar.Value().(bool); ok {
autoconnect = ac
}
}
autoconnectMap[name] = autoconnect
}
}
}
}
return autoconnectMap, nil
return iwdSavedWiFiProfilesFromManagedObjects(objects), nil
}
func (b *IWDBackend) GetWiFiNetworkDetails(ssid string) (*NetworkInfoResponse, error) {
@@ -614,6 +695,8 @@ func (b *IWDBackend) ForgetWiFiNetwork(ssid string) error {
b.stateMutex.Unlock()
}
_, _ = b.updateWiFiNetworks()
if b.onStateChange != nil {
b.onStateChange()
}
@@ -222,6 +222,10 @@ func (b *NetworkManagerBackend) Initialize() error {
log.Warnf("Failed to update WiFi state: %v", err)
}
if err := b.updateSavedWiFiNetworks(); err != nil {
log.Warnf("Failed to get initial saved WiFi networks: %v", err)
}
if wifiEnabled {
if _, err := b.updateWiFiNetworks(); err != nil {
log.Warnf("Failed to get initial networks: %v", err)
@@ -261,6 +265,7 @@ func (b *NetworkManagerBackend) GetCurrentState() (*BackendState, error) {
state := *b.state
state.WiFiNetworks = append([]WiFiNetwork(nil), b.state.WiFiNetworks...)
state.SavedWiFiNetworks = append([]WiFiNetwork(nil), b.state.SavedWiFiNetworks...)
state.WiFiDevices = append([]WiFiDevice(nil), b.state.WiFiDevices...)
state.WiredConnections = append([]WiredConnection(nil), b.state.WiredConnections...)
state.EthernetDevices = append([]EthernetDevice(nil), b.state.EthernetDevices...)
@@ -5,6 +5,12 @@ import (
"github.com/godbus/dbus/v5"
)
const (
dbusNMSettingsPath = "/org/freedesktop/NetworkManager/Settings"
dbusNMSettingsInterface = "org.freedesktop.NetworkManager.Settings"
dbusNMSettingsConnectionInterface = "org.freedesktop.NetworkManager.Settings.Connection"
)
func (b *NetworkManagerBackend) startSignalPump() error {
conn, err := dbus.ConnectSystemBus()
if err != nil {
@@ -27,8 +33,8 @@ func (b *NetworkManagerBackend) startSignalPump() error {
}
if err := conn.AddMatchSignal(
dbus.WithMatchObjectPath(dbus.ObjectPath("/org/freedesktop/NetworkManager/Settings")),
dbus.WithMatchInterface("org.freedesktop.NetworkManager.Settings"),
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
dbus.WithMatchInterface(dbusNMSettingsInterface),
dbus.WithMatchMember("NewConnection"),
); err != nil {
conn.RemoveMatchSignal(
@@ -42,8 +48,8 @@ func (b *NetworkManagerBackend) startSignalPump() error {
}
if err := conn.AddMatchSignal(
dbus.WithMatchObjectPath(dbus.ObjectPath("/org/freedesktop/NetworkManager/Settings")),
dbus.WithMatchInterface("org.freedesktop.NetworkManager.Settings"),
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
dbus.WithMatchInterface(dbusNMSettingsInterface),
dbus.WithMatchMember("ConnectionRemoved"),
); err != nil {
conn.RemoveMatchSignal(
@@ -52,8 +58,8 @@ func (b *NetworkManagerBackend) startSignalPump() error {
dbus.WithMatchMember("PropertiesChanged"),
)
conn.RemoveMatchSignal(
dbus.WithMatchObjectPath(dbus.ObjectPath("/org/freedesktop/NetworkManager/Settings")),
dbus.WithMatchInterface("org.freedesktop.NetworkManager.Settings"),
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
dbus.WithMatchInterface(dbusNMSettingsInterface),
dbus.WithMatchMember("NewConnection"),
)
conn.RemoveSignal(signals)
@@ -61,6 +67,31 @@ func (b *NetworkManagerBackend) startSignalPump() error {
return err
}
if err := conn.AddMatchSignal(
dbus.WithMatchPathNamespace(dbus.ObjectPath(dbusNMSettingsPath)),
dbus.WithMatchInterface(dbusNMSettingsConnectionInterface),
dbus.WithMatchMember("Updated"),
); err != nil {
conn.RemoveMatchSignal(
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMPath)),
dbus.WithMatchInterface(dbusPropsInterface),
dbus.WithMatchMember("PropertiesChanged"),
)
conn.RemoveMatchSignal(
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
dbus.WithMatchInterface(dbusNMSettingsInterface),
dbus.WithMatchMember("NewConnection"),
)
conn.RemoveMatchSignal(
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
dbus.WithMatchInterface(dbusNMSettingsInterface),
dbus.WithMatchMember("ConnectionRemoved"),
)
conn.RemoveSignal(signals)
conn.Close()
return err
}
if err := conn.AddMatchSignal(
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMPath)),
dbus.WithMatchInterface(dbusNMInterface),
@@ -137,6 +168,32 @@ func (b *NetworkManagerBackend) stopSignalPump() {
dbus.WithMatchMember("PropertiesChanged"),
)
b.dbusConn.RemoveMatchSignal(
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
dbus.WithMatchInterface(dbusNMSettingsInterface),
dbus.WithMatchMember("NewConnection"),
)
b.dbusConn.RemoveMatchSignal(
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
dbus.WithMatchInterface(dbusNMSettingsInterface),
dbus.WithMatchMember("ConnectionRemoved"),
)
b.dbusConn.RemoveMatchSignal(
dbus.WithMatchPathNamespace(dbus.ObjectPath(dbusNMSettingsPath)),
dbus.WithMatchInterface(dbusNMSettingsConnectionInterface),
dbus.WithMatchMember("Updated"),
)
b.dbusConn.RemoveMatchSignal(
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMPath)),
dbus.WithMatchInterface(dbusNMInterface),
dbus.WithMatchMember("DeviceAdded"),
)
b.dbusConn.RemoveMatchSignal(
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMPath)),
dbus.WithMatchInterface(dbusNMInterface),
dbus.WithMatchMember("DeviceRemoved"),
)
for _, info := range b.wifiDevices {
b.dbusConn.RemoveMatchSignal(
dbus.WithMatchObjectPath(dbus.ObjectPath(info.device.GetPath())),
@@ -164,9 +221,13 @@ func (b *NetworkManagerBackend) stopSignalPump() {
}
func (b *NetworkManagerBackend) handleDBusSignal(sig *dbus.Signal) {
if sig.Name == "org.freedesktop.NetworkManager.Settings.NewConnection" ||
sig.Name == "org.freedesktop.NetworkManager.Settings.ConnectionRemoved" {
if sig.Name == dbusNMSettingsInterface+".NewConnection" ||
sig.Name == dbusNMSettingsInterface+".ConnectionRemoved" ||
sig.Name == dbusNMSettingsConnectionInterface+".Updated" {
b.ListVPNProfiles()
if err := b.updateSavedWiFiNetworks(); err != nil {
b.updateWiFiNetworks()
}
if b.onStateChange != nil {
b.onStateChange()
}
@@ -225,24 +225,14 @@ func (b *NetworkManagerBackend) GetWiFiQRCodeContent(ssid string) (string, error
return "", fmt.Errorf("failed to identify security type of network `%s`", ssid)
}
var securityType string
switch keyMgmt {
case "none":
authAlg, _ := secSettings["auth-alg"].(string)
switch authAlg {
case "open":
securityType = "nopass"
default:
securityType = "WEP"
}
return "", fmt.Errorf("QR code generation only supports WPA-PSK connections, `%s` is open or WEP", ssid)
case "ieee8021x":
securityType = "WEP"
return "", fmt.Errorf("QR code generation only supports WPA-PSK connections, `%s` is enterprise", ssid)
case "wpa-psk", "sae", "wpa-psk-sae":
default:
securityType = "WPA"
}
if securityType != "WPA" {
return "", fmt.Errorf("QR code generation only supports WPA connections, `%s` uses %s", ssid, securityType)
return "", fmt.Errorf("QR code generation only supports WPA-PSK connections, `%s` uses %s", ssid, keyMgmt)
}
var psk string
@@ -276,7 +266,7 @@ func (b *NetworkManagerBackend) GetWiFiQRCodeContent(ssid string) (string, error
return "", fmt.Errorf("failed to retrieve password for `%s`", ssid)
}
return FormatWiFiQRString(securityType, ssid, psk), nil
return FormatWiFiQRString("WPA", ssid, psk), nil
}
func (b *NetworkManagerBackend) ConnectWiFi(req ConnectionRequest) error {
@@ -405,6 +395,74 @@ func (b *NetworkManagerBackend) ForgetWiFiNetwork(ssid string) error {
return nil
}
func getSavedWiFiProfiles(connections []gonetworkmanager.Connection) map[string]savedWiFiProfile {
profiles := make(map[string]savedWiFiProfile)
for _, conn := range connections {
connSettings, err := conn.GetSettings()
if err != nil {
continue
}
connMeta, ok := connSettings["connection"]
if !ok {
continue
}
connType, ok := connMeta["type"].(string)
if !ok || connType != "802-11-wireless" {
continue
}
wifiSettings, ok := connSettings["802-11-wireless"]
if !ok {
continue
}
ssidBytes, ok := wifiSettings["ssid"].([]byte)
if !ok || len(ssidBytes) == 0 {
continue
}
ssid := string(ssidBytes)
profile := savedWiFiProfile{
Autoconnect: true,
Mode: "infrastructure",
}
if ac, ok := connMeta["autoconnect"].(bool); ok {
profile.Autoconnect = ac
}
if hidden, ok := wifiSettings["hidden"].(bool); ok {
profile.Hidden = hidden
}
if mode, ok := wifiSettings["mode"].(string); ok && mode != "" {
profile.Mode = mode
}
if _, ok := connSettings["802-11-wireless-security"]; ok {
profile.Secured = true
}
if _, ok := connSettings["802-1x"]; ok {
profile.Enterprise = true
profile.Secured = true
}
if existing, ok := profiles[ssid]; ok {
profile.Autoconnect = profile.Autoconnect || existing.Autoconnect
profile.Hidden = profile.Hidden || existing.Hidden
profile.Secured = profile.Secured || existing.Secured
profile.Enterprise = profile.Enterprise || existing.Enterprise
if profile.Mode == "" {
profile.Mode = existing.Mode
}
}
profiles[ssid] = profile
}
return profiles
}
func (b *NetworkManagerBackend) IsConnectingTo(ssid string) bool {
b.stateMutex.RLock()
defer b.stateMutex.RUnlock()
@@ -442,47 +500,7 @@ func (b *NetworkManagerBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
return nil, fmt.Errorf("failed to get connections: %w", err)
}
savedSSIDs := make(map[string]bool)
autoconnectMap := make(map[string]bool)
hiddenSSIDs := make(map[string]bool)
for _, conn := range connections {
connSettings, err := conn.GetSettings()
if err != nil {
continue
}
connMeta, ok := connSettings["connection"]
if !ok {
continue
}
connType, ok := connMeta["type"].(string)
if !ok || connType != "802-11-wireless" {
continue
}
wifiSettings, ok := connSettings["802-11-wireless"]
if !ok {
continue
}
ssidBytes, ok := wifiSettings["ssid"].([]byte)
if !ok {
continue
}
ssid := string(ssidBytes)
savedSSIDs[ssid] = true
autoconnect := true
if ac, ok := connMeta["autoconnect"].(bool); ok {
autoconnect = ac
}
autoconnectMap[ssid] = autoconnect
if hidden, ok := wifiSettings["hidden"].(bool); ok && hidden {
hiddenSSIDs[ssid] = true
}
}
savedProfiles := getSavedWiFiProfiles(connections)
b.stateMutex.RLock()
currentSSID := b.state.WiFiSSID
@@ -491,8 +509,8 @@ func (b *NetworkManagerBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
wifiBSSID := b.state.WiFiBSSID
b.stateMutex.RUnlock()
seenSSIDs := make(map[string]*WiFiNetwork)
networks := []WiFiNetwork{}
seenSSIDs := make(map[string]int)
networks := make([]WiFiNetwork, 0, len(apPaths)+1)
for _, ap := range apPaths {
ssid, err := ap.GetPropertySSID()
@@ -500,7 +518,8 @@ func (b *NetworkManagerBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
continue
}
if existing, exists := seenSSIDs[ssid]; exists {
if existingIndex, exists := seenSSIDs[ssid]; exists {
existing := &networks[existingIndex]
strength, _ := ap.GetPropertyStrength()
if strength > existing.Signal {
existing.Signal = strength
@@ -550,6 +569,7 @@ func (b *NetworkManagerBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
}
}
profile, saved := savedProfiles[ssid]
network := WiFiNetwork{
SSID: ssid,
BSSID: bssid,
@@ -557,45 +577,86 @@ func (b *NetworkManagerBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
Secured: secured,
Enterprise: enterprise,
Connected: isConnected,
Saved: savedSSIDs[ssid],
Autoconnect: autoconnectMap[ssid],
Hidden: hiddenSSIDs[ssid],
Saved: saved,
Autoconnect: profile.Autoconnect,
Hidden: profile.Hidden,
Frequency: freq,
Mode: modeStr,
Rate: rate,
Channel: channel,
}
seenSSIDs[ssid] = &network
networks = append(networks, network)
seenSSIDs[ssid] = len(networks) - 1
}
if wifiConnected && currentSSID != "" {
if _, exists := seenSSIDs[currentSSID]; !exists {
profile, saved := savedProfiles[currentSSID]
hiddenNetwork := WiFiNetwork{
SSID: currentSSID,
BSSID: wifiBSSID,
Signal: wifiSignal,
Secured: true,
Connected: true,
Saved: savedSSIDs[currentSSID],
Autoconnect: autoconnectMap[currentSSID],
Saved: saved,
Autoconnect: profile.Autoconnect,
Hidden: true,
Mode: "infrastructure",
}
networks = append(networks, hiddenNetwork)
seenSSIDs[currentSSID] = len(networks) - 1
}
}
visibleNetworks := wiFiNetworksBySSID(networks, true)
savedNetworks := savedWiFiNetworksFromProfiles(savedProfiles, visibleNetworks, currentSSID, wifiConnected)
sortWiFiNetworks(networks)
b.stateMutex.Lock()
b.state.WiFiNetworks = networks
b.state.SavedWiFiNetworks = savedNetworks
b.stateMutex.Unlock()
return networks, nil
}
func (b *NetworkManagerBackend) updateSavedWiFiNetworks() error {
s := b.settings
if s == nil {
var err error
s, err = gonetworkmanager.NewSettings()
if err != nil {
return fmt.Errorf("failed to get settings: %w", err)
}
b.settings = s
}
settingsMgr := s.(gonetworkmanager.Settings)
connections, err := settingsMgr.ListConnections()
if err != nil {
return fmt.Errorf("failed to get connections: %w", err)
}
savedProfiles := getSavedWiFiProfiles(connections)
b.stateMutex.RLock()
currentSSID := b.state.WiFiSSID
wifiConnected := b.state.WiFiConnected
wifiNetworks := append([]WiFiNetwork(nil), b.state.WiFiNetworks...)
b.stateMutex.RUnlock()
wifiNetworks, savedNetworks := refreshSavedWiFiState(wifiNetworks, savedProfiles, currentSSID, wifiConnected)
b.stateMutex.Lock()
b.state.WiFiNetworks = wifiNetworks
b.state.SavedWiFiNetworks = savedNetworks
b.stateMutex.Unlock()
return nil
}
func (b *NetworkManagerBackend) findConnection(ssid string) (gonetworkmanager.Connection, error) {
s := b.settings
if s == nil {
@@ -975,49 +1036,14 @@ func (b *NetworkManagerBackend) updateAllWiFiDevices() {
return
}
savedSSIDs := make(map[string]bool)
autoconnectMap := make(map[string]bool)
hiddenSSIDs := make(map[string]bool)
for _, conn := range connections {
connSettings, err := conn.GetSettings()
if err != nil {
continue
}
connMeta, ok := connSettings["connection"]
if !ok {
continue
}
connType, ok := connMeta["type"].(string)
if !ok || connType != "802-11-wireless" {
continue
}
wifiSettings, ok := connSettings["802-11-wireless"]
if !ok {
continue
}
ssidBytes, ok := wifiSettings["ssid"].([]byte)
if !ok {
continue
}
ssid := string(ssidBytes)
savedSSIDs[ssid] = true
autoconnect := true
if ac, ok := connMeta["autoconnect"].(bool); ok {
autoconnect = ac
}
autoconnectMap[ssid] = autoconnect
if hidden, ok := wifiSettings["hidden"].(bool); ok && hidden {
hiddenSSIDs[ssid] = true
}
}
savedProfiles := getSavedWiFiProfiles(connections)
var devices []WiFiDevice
visibleNetworks := make(map[string]WiFiNetwork)
b.stateMutex.RLock()
currentSSID := b.state.WiFiSSID
wifiConnected := b.state.WiFiConnected
b.stateMutex.RUnlock()
for name, devInfo := range b.wifiDevices {
state, _ := devInfo.device.GetPropertyState()
@@ -1050,14 +1076,16 @@ func (b *NetworkManagerBackend) updateAllWiFiDevices() {
apPaths, err := devInfo.wireless.GetAccessPoints()
var networks []WiFiNetwork
if err == nil {
seenSSIDs := make(map[string]*WiFiNetwork)
seenSSIDs := make(map[string]int)
networks = make([]WiFiNetwork, 0, len(apPaths)+1)
for _, ap := range apPaths {
apSSID, err := ap.GetPropertySSID()
if err != nil || apSSID == "" {
continue
}
if existing, exists := seenSSIDs[apSSID]; exists {
if existingIndex, exists := seenSSIDs[apSSID]; exists {
existing := &networks[existingIndex]
strength, _ := ap.GetPropertyStrength()
if strength > existing.Signal {
existing.Signal = strength
@@ -1107,6 +1135,7 @@ func (b *NetworkManagerBackend) updateAllWiFiDevices() {
}
}
profile, saved := savedProfiles[apSSID]
network := WiFiNetwork{
SSID: apSSID,
BSSID: apBSSID,
@@ -1114,9 +1143,9 @@ func (b *NetworkManagerBackend) updateAllWiFiDevices() {
Secured: secured,
Enterprise: enterprise,
Connected: isConnected,
Saved: savedSSIDs[apSSID],
Autoconnect: autoconnectMap[apSSID],
Hidden: hiddenSSIDs[apSSID],
Saved: saved,
Autoconnect: profile.Autoconnect,
Hidden: profile.Hidden,
Frequency: freq,
Mode: modeStr,
Rate: rate,
@@ -1124,25 +1153,31 @@ func (b *NetworkManagerBackend) updateAllWiFiDevices() {
Device: name,
}
seenSSIDs[apSSID] = &network
networks = append(networks, network)
seenSSIDs[apSSID] = len(networks) - 1
if existing, ok := visibleNetworks[apSSID]; !ok || network.Signal > existing.Signal {
visibleNetworks[apSSID] = network
}
}
if connected && ssid != "" {
if _, exists := seenSSIDs[ssid]; !exists {
profile, saved := savedProfiles[ssid]
hiddenNetwork := WiFiNetwork{
SSID: ssid,
BSSID: bssid,
Signal: signal,
Secured: true,
Connected: true,
Saved: savedSSIDs[ssid],
Autoconnect: autoconnectMap[ssid],
Saved: saved,
Autoconnect: profile.Autoconnect,
Hidden: true,
Mode: "infrastructure",
Device: name,
}
networks = append(networks, hiddenNetwork)
seenSSIDs[ssid] = len(networks) - 1
visibleNetworks[ssid] = hiddenNetwork
}
}
@@ -1168,6 +1203,7 @@ func (b *NetworkManagerBackend) updateAllWiFiDevices() {
b.stateMutex.Lock()
b.state.WiFiDevices = devices
b.state.SavedWiFiNetworks = savedWiFiNetworksFromProfiles(savedProfiles, visibleNetworks, currentSSID, wifiConnected)
b.stateMutex.Unlock()
}
@@ -4,6 +4,7 @@ import (
"testing"
mock_gonetworkmanager "github.com/AvengeMedia/DankMaterialShell/core/internal/mocks/github.com/Wifx/gonetworkmanager/v2"
"github.com/Wifx/gonetworkmanager/v2"
"github.com/stretchr/testify/assert"
)
@@ -176,6 +177,54 @@ func TestNetworkManagerBackend_UpdateWiFiNetworks_NoDevice(t *testing.T) {
assert.Contains(t, err.Error(), "no WiFi device available")
}
func TestNetworkManagerBackend_UpdateSavedWiFiNetworksPreservesVisibleSavedNetworks(t *testing.T) {
mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
mockSettings := mock_gonetworkmanager.NewMockSettings(t)
mockConn := mock_gonetworkmanager.NewMockConnection(t)
backend, err := NewNetworkManagerBackend(mockNM)
assert.NoError(t, err)
backend.settings = mockSettings
backend.stateMutex.Lock()
backend.state.WiFiNetworks = []WiFiNetwork{
{
SSID: "Home",
Signal: 76,
},
}
backend.stateMutex.Unlock()
settings := gonetworkmanager.ConnectionSettings{
"connection": {
"type": "802-11-wireless",
"autoconnect": true,
},
"802-11-wireless": {
"ssid": []byte("Home"),
},
"802-11-wireless-security": {},
}
mockSettings.EXPECT().ListConnections().Return([]gonetworkmanager.Connection{mockConn}, nil)
mockConn.EXPECT().GetSettings().Return(settings, nil)
err = backend.updateSavedWiFiNetworks()
assert.NoError(t, err)
backend.stateMutex.RLock()
savedNetworks := append([]WiFiNetwork(nil), backend.state.SavedWiFiNetworks...)
wifiNetworks := append([]WiFiNetwork(nil), backend.state.WiFiNetworks...)
backend.stateMutex.RUnlock()
assert.Len(t, wifiNetworks, 1)
assert.True(t, wifiNetworks[0].Saved)
assert.Len(t, savedNetworks, 1)
assert.Equal(t, "Home", savedNetworks[0].SSID)
assert.True(t, savedNetworks[0].Saved)
assert.False(t, savedNetworks[0].OutOfRange)
assert.Equal(t, uint8(76), savedNetworks[0].Signal)
}
func TestNetworkManagerBackend_FindConnection_NoSettings(t *testing.T) {
mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
+23
View File
@@ -67,6 +67,7 @@ func NewManager() (*Manager, error) {
NetworkStatus: StatusDisconnected,
Preference: PreferenceAuto,
WiFiNetworks: []WiFiNetwork{},
SavedWiFiNetworks: []WiFiNetwork{},
},
stateMutex: sync.RWMutex{},
@@ -120,6 +121,7 @@ func (m *Manager) syncStateFromBackend() error {
m.state.WiFiBSSID = backendState.WiFiBSSID
m.state.WiFiSignal = backendState.WiFiSignal
m.state.WiFiNetworks = backendState.WiFiNetworks
m.state.SavedWiFiNetworks = backendState.SavedWiFiNetworks
m.state.WiFiDevices = backendState.WiFiDevices
m.state.WiredConnections = backendState.WiredConnections
m.state.VPNProfiles = backendState.VPNProfiles
@@ -156,6 +158,7 @@ func (m *Manager) snapshotState() NetworkState {
defer m.stateMutex.RUnlock()
s := *m.state
s.WiFiNetworks = append([]WiFiNetwork(nil), m.state.WiFiNetworks...)
s.SavedWiFiNetworks = append([]WiFiNetwork(nil), m.state.SavedWiFiNetworks...)
s.WiFiDevices = append([]WiFiDevice(nil), m.state.WiFiDevices...)
s.WiredConnections = append([]WiredConnection(nil), m.state.WiredConnections...)
s.EthernetDevices = append([]EthernetDevice(nil), m.state.EthernetDevices...)
@@ -211,6 +214,9 @@ func stateChangedMeaningfully(old, new *NetworkState) bool {
if len(old.WiFiNetworks) != len(new.WiFiNetworks) {
return true
}
if len(old.SavedWiFiNetworks) != len(new.SavedWiFiNetworks) {
return true
}
if len(old.WiFiDevices) != len(new.WiFiDevices) {
return true
}
@@ -238,6 +244,23 @@ func stateChangedMeaningfully(old, new *NetworkState) bool {
}
}
for i := range old.SavedWiFiNetworks {
oldNet := &old.SavedWiFiNetworks[i]
newNet := &new.SavedWiFiNetworks[i]
if oldNet.SSID != newNet.SSID {
return true
}
if oldNet.Connected != newNet.Connected {
return true
}
if oldNet.Autoconnect != newNet.Autoconnect {
return true
}
if oldNet.OutOfRange != newNet.OutOfRange {
return true
}
}
for i := range old.WiredConnections {
oldNet := &old.WiredConnections[i]
newNet := &new.WiredConnections[i]
+2
View File
@@ -34,6 +34,7 @@ type WiFiNetwork struct {
Saved bool `json:"saved"`
Autoconnect bool `json:"autoconnect"`
Hidden bool `json:"hidden"`
OutOfRange bool `json:"outOfRange"`
Frequency uint32 `json:"frequency"`
Mode string `json:"mode"`
Rate uint32 `json:"rate"`
@@ -111,6 +112,7 @@ type NetworkState struct {
WiFiBSSID string `json:"wifiBSSID"`
WiFiSignal uint8 `json:"wifiSignal"`
WiFiNetworks []WiFiNetwork `json:"wifiNetworks"`
SavedWiFiNetworks []WiFiNetwork `json:"savedWifiNetworks"`
WiFiDevices []WiFiDevice `json:"wifiDevices"`
WiredConnections []WiredConnection `json:"wiredConnections"`
VPNProfiles []VPNProfile `json:"vpnProfiles"`
+103
View File
@@ -0,0 +1,103 @@
package network
import "sort"
type savedWiFiProfile struct {
Autoconnect bool
Hidden bool
Secured bool
Enterprise bool
Mode string
}
// Saved WiFi state is keyed by SSID because the UI/API accepts SSID actions.
// Multiple backend profiles for the same SSID are intentionally collapsed here.
func mergeSavedProfilesIntoWiFiNetworks(networks []WiFiNetwork, profiles map[string]savedWiFiProfile, currentSSID string, wifiConnected bool) []WiFiNetwork {
merged := make([]WiFiNetwork, len(networks))
for i, network := range networks {
profile, saved := profiles[network.SSID]
network.Connected = wifiConnected && network.SSID == currentSSID
network.Saved = saved
if saved {
network.Autoconnect = profile.Autoconnect
network.Hidden = network.Hidden || profile.Hidden
network.Secured = network.Secured || profile.Secured
network.Enterprise = network.Enterprise || profile.Enterprise
if network.Mode == "" {
network.Mode = profile.Mode
}
} else {
network.Autoconnect = false
}
merged[i] = network
}
return merged
}
func wiFiNetworksBySSID(networks []WiFiNetwork, visibleOnly bool) map[string]WiFiNetwork {
visible := make(map[string]WiFiNetwork, len(networks))
for _, network := range networks {
if visibleOnly && network.OutOfRange {
continue
}
visible[network.SSID] = network
}
return visible
}
func refreshSavedWiFiState(networks []WiFiNetwork, profiles map[string]savedWiFiProfile, currentSSID string, wifiConnected bool) ([]WiFiNetwork, []WiFiNetwork) {
mergedNetworks := mergeSavedProfilesIntoWiFiNetworks(networks, profiles, currentSSID, wifiConnected)
visibleNetworks := wiFiNetworksBySSID(mergedNetworks, true)
savedNetworks := savedWiFiNetworksFromProfiles(profiles, visibleNetworks, currentSSID, wifiConnected)
return mergedNetworks, savedNetworks
}
func savedWiFiNetworksFromProfiles(profiles map[string]savedWiFiProfile, visible map[string]WiFiNetwork, currentSSID string, wifiConnected bool) []WiFiNetwork {
networks := make([]WiFiNetwork, 0, len(profiles))
for ssid, profile := range profiles {
if network, ok := visible[ssid]; ok {
network.Saved = true
network.Autoconnect = profile.Autoconnect
network.Hidden = network.Hidden || profile.Hidden
network.Secured = network.Secured || profile.Secured
network.Enterprise = network.Enterprise || profile.Enterprise
network.OutOfRange = false
if network.Mode == "" {
network.Mode = profile.Mode
}
networks = append(networks, network)
continue
}
isConnected := wifiConnected && ssid == currentSSID
networks = append(networks, WiFiNetwork{
SSID: ssid,
Secured: profile.Secured,
Enterprise: profile.Enterprise,
Connected: isConnected,
Saved: true,
Autoconnect: profile.Autoconnect,
Hidden: profile.Hidden,
OutOfRange: !isConnected,
Mode: profile.Mode,
})
}
sort.Slice(networks, func(i, j int) bool {
if networks[i].Connected && !networks[j].Connected {
return true
}
if !networks[i].Connected && networks[j].Connected {
return false
}
if networks[i].OutOfRange != networks[j].OutOfRange {
return !networks[i].OutOfRange
}
if networks[i].Signal != networks[j].Signal {
return networks[i].Signal > networks[j].Signal
}
return networks[i].SSID < networks[j].SSID
})
return networks
}
@@ -0,0 +1,170 @@
package network
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestMergeSavedProfilesIntoWiFiNetworks(t *testing.T) {
networks := []WiFiNetwork{
{
SSID: "Home",
Signal: 80,
Secured: false,
Autoconnect: false,
},
{
SSID: "Cafe",
Signal: 50,
Secured: false,
Autoconnect: true,
},
}
profiles := map[string]savedWiFiProfile{
"Home": {
Autoconnect: true,
Hidden: true,
Secured: true,
Mode: "infrastructure",
},
}
merged := mergeSavedProfilesIntoWiFiNetworks(networks, profiles, "Home", true)
assert.Len(t, merged, 2)
assert.Equal(t, "Home", merged[0].SSID)
assert.True(t, merged[0].Connected)
assert.True(t, merged[0].Saved)
assert.True(t, merged[0].Autoconnect)
assert.True(t, merged[0].Hidden)
assert.True(t, merged[0].Secured)
assert.Equal(t, "infrastructure", merged[0].Mode)
assert.Equal(t, "Cafe", merged[1].SSID)
assert.False(t, merged[1].Saved)
assert.False(t, merged[1].Autoconnect)
}
func TestSavedWiFiNetworksFromProfilesOutOfRangeWithoutVisibleNetworks(t *testing.T) {
profiles := map[string]savedWiFiProfile{
"Home": {
Autoconnect: true,
Secured: true,
Mode: "infrastructure",
},
}
networks := savedWiFiNetworksFromProfiles(profiles, nil, "", false)
assert.Len(t, networks, 1)
assert.Equal(t, "Home", networks[0].SSID)
assert.True(t, networks[0].Saved)
assert.True(t, networks[0].OutOfRange)
assert.Equal(t, uint8(0), networks[0].Signal)
}
func TestSavedWiFiNetworksFromProfilesKeepsConnectedCurrentNetworkInRange(t *testing.T) {
profiles := map[string]savedWiFiProfile{
"Home": {
Autoconnect: true,
Secured: true,
},
}
networks := savedWiFiNetworksFromProfiles(profiles, nil, "Home", true)
assert.Len(t, networks, 1)
assert.Equal(t, "Home", networks[0].SSID)
assert.True(t, networks[0].Connected)
assert.False(t, networks[0].OutOfRange)
}
func TestSavedWiFiNetworksFromProfilesIncludesOutOfRange(t *testing.T) {
profiles := map[string]savedWiFiProfile{
"Home": {
Autoconnect: true,
Hidden: true,
Secured: true,
Mode: "infrastructure",
},
"Office": {
Autoconnect: false,
Secured: true,
Enterprise: true,
Mode: "infrastructure",
},
}
visible := map[string]WiFiNetwork{
"Home": {
SSID: "Home",
Signal: 72,
Secured: true,
Connected: true,
},
}
networks := savedWiFiNetworksFromProfiles(profiles, visible, "Home", true)
assert.Len(t, networks, 2)
assert.Equal(t, "Home", networks[0].SSID)
assert.True(t, networks[0].Saved)
assert.True(t, networks[0].Connected)
assert.False(t, networks[0].OutOfRange)
assert.True(t, networks[0].Hidden)
assert.Equal(t, uint8(72), networks[0].Signal)
assert.Equal(t, "Office", networks[1].SSID)
assert.True(t, networks[1].Saved)
assert.False(t, networks[1].Autoconnect)
assert.True(t, networks[1].Enterprise)
assert.True(t, networks[1].OutOfRange)
}
func TestWiFiNetworksBySSIDVisibleOnlySkipsOutOfRange(t *testing.T) {
visible := wiFiNetworksBySSID([]WiFiNetwork{
{SSID: "Home", Signal: 70},
{SSID: "Office", Signal: 0, OutOfRange: true},
}, true)
assert.Contains(t, visible, "Home")
assert.NotContains(t, visible, "Office")
}
func TestRefreshSavedWiFiStatePreservesVisibleSavedNetworks(t *testing.T) {
networks := []WiFiNetwork{
{
SSID: "Home",
Signal: 82,
},
}
profiles := map[string]savedWiFiProfile{
"Home": {
Autoconnect: true,
Secured: true,
Mode: "infrastructure",
},
"Office": {
Autoconnect: false,
Secured: true,
Mode: "infrastructure",
},
}
mergedNetworks, savedNetworks := refreshSavedWiFiState(networks, profiles, "", false)
assert.Len(t, mergedNetworks, 1)
assert.Equal(t, "Home", mergedNetworks[0].SSID)
assert.True(t, mergedNetworks[0].Saved)
assert.True(t, mergedNetworks[0].Autoconnect)
assert.Len(t, savedNetworks, 2)
assert.Equal(t, "Home", savedNetworks[0].SSID)
assert.True(t, savedNetworks[0].Saved)
assert.False(t, savedNetworks[0].OutOfRange)
assert.Equal(t, uint8(82), savedNetworks[0].Signal)
assert.Equal(t, "Office", savedNetworks[1].SSID)
assert.True(t, savedNetworks[1].Saved)
assert.True(t, savedNetworks[1].OutOfRange)
}
+1 -1
View File
@@ -38,7 +38,7 @@ import (
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
)
const APIVersion = 25
const APIVersion = 26
var CLIVersion = "dev"
+1
View File
@@ -73,6 +73,7 @@ func convertPeerStatus(ps *ipnstate.PeerStatus, users map[tailcfg.UserID]tailcfg
Online: ps.Online,
Active: ps.Active,
ExitNode: ps.ExitNode,
ExitNodeOption: ps.ExitNodeOption,
Relay: ps.Relay,
RxBytes: ps.RxBytes,
TxBytes: ps.TxBytes,
@@ -14,6 +14,14 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
handleGetStatus(conn, req, manager)
case "tailscale.refresh":
handleRefresh(conn, req, manager)
case "tailscale.connect":
handleConnect(conn, req, manager)
case "tailscale.disconnect":
handleDisconnect(conn, req, manager)
case "tailscale.setExitNode":
handleSetExitNode(conn, req, manager)
case "tailscale.setAllowLanAccess":
handleSetAllowLanAccess(conn, req, manager)
default:
models.RespondError(conn, req.ID, fmt.Sprintf("unknown method: %s", req.Method))
}
@@ -28,3 +36,37 @@ func handleRefresh(conn net.Conn, req models.Request, manager *Manager) {
manager.RefreshState()
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "refreshed"})
}
func handleConnect(conn net.Conn, req models.Request, manager *Manager) {
if err := manager.Connect(); err != nil {
models.RespondError(conn, req.ID, err.Error())
return
}
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "connected"})
}
func handleDisconnect(conn net.Conn, req models.Request, manager *Manager) {
if err := manager.Disconnect(); err != nil {
models.RespondError(conn, req.ID, err.Error())
return
}
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "disconnected"})
}
func handleSetExitNode(conn net.Conn, req models.Request, manager *Manager) {
id := models.GetOr(req, "id", "")
if err := manager.SetExitNode(id); err != nil {
models.RespondError(conn, req.ID, err.Error())
return
}
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "exit node updated"})
}
func handleSetAllowLanAccess(conn net.Conn, req models.Request, manager *Manager) {
enabled := models.GetOr(req, "enabled", false)
if err := manager.SetAllowLANAccess(enabled); err != nil {
models.RespondError(conn, req.ID, err.Error())
return
}
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "lan access updated"})
}
@@ -4,6 +4,7 @@ import (
"bytes"
"context"
"encoding/json"
"fmt"
"net"
"testing"
"time"
@@ -78,6 +79,63 @@ func TestHandleRefresh(t *testing.T) {
assert.True(t, resp.Result.Success)
}
func TestHandleActions(t *testing.T) {
cases := []struct {
name string
method string
params map[string]any
}{
{"connect", "tailscale.connect", nil},
{"disconnect", "tailscale.disconnect", nil},
{"setExitNode", "tailscale.setExitNode", map[string]any{"id": "nABC123"}},
{"clearExitNode", "tailscale.setExitNode", map[string]any{"id": ""}},
{"setAllowLanAccess", "tailscale.setAllowLanAccess", map[string]any{"enabled": true}},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
m := handlerTestManager()
defer m.Close()
buf := &bytes.Buffer{}
conn := &mockConn{Buffer: buf}
req := models.Request{ID: 1, Method: tc.method, Params: tc.params}
HandleRequest(conn, req, m)
var resp models.Response[models.SuccessResult]
require.NoError(t, json.NewDecoder(buf).Decode(&resp))
assert.Equal(t, 1, resp.ID)
assert.Empty(t, resp.Error)
require.NotNil(t, resp.Result)
assert.True(t, resp.Result.Success)
})
}
}
func TestHandleAction_BackendError(t *testing.T) {
client := &mockClient{
watchFn: blockingWatch,
statusFn: func(ctx context.Context) (*ipnstate.Status, error) { return runningStatus(), nil },
editPrefsFn: func(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error) {
return nil, fmt.Errorf("backend rejected edit")
},
}
m := newManager(client)
defer m.Close()
buf := &bytes.Buffer{}
conn := &mockConn{Buffer: buf}
req := models.Request{ID: 1, Method: "tailscale.connect"}
HandleRequest(conn, req, m)
var resp models.Response[models.SuccessResult]
require.NoError(t, json.NewDecoder(buf).Decode(&resp))
assert.Nil(t, resp.Result)
assert.Contains(t, resp.Error, "backend rejected edit")
}
func TestHandleRequest_UnknownMethod(t *testing.T) {
m := handlerTestManager()
defer m.Close()
+85 -4
View File
@@ -11,6 +11,7 @@ import (
"tailscale.com/client/local"
"tailscale.com/ipn"
"tailscale.com/ipn/ipnstate"
"tailscale.com/tailcfg"
)
const (
@@ -22,6 +23,8 @@ const (
type tailscaleClient interface {
WatchIPNBus(ctx context.Context, mask ipn.NotifyWatchOpt) (ipnBusWatcher, error)
Status(ctx context.Context) (*ipnstate.Status, error)
GetPrefs(ctx context.Context) (*ipn.Prefs, error)
EditPrefs(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error)
}
// ipnBusWatcher abstracts the IPN bus watcher for testing.
@@ -43,6 +46,14 @@ func (w *localClientWrapper) Status(ctx context.Context) (*ipnstate.Status, erro
return w.client.Status(ctx)
}
func (w *localClientWrapper) GetPrefs(ctx context.Context) (*ipn.Prefs, error) {
return w.client.GetPrefs(ctx)
}
func (w *localClientWrapper) EditPrefs(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error) {
return w.client.EditPrefs(ctx, mp)
}
// Manager manages Tailscale state via IPN bus events and subscriber notifications.
type Manager struct {
state *TailscaleState
@@ -169,16 +180,36 @@ func (m *Manager) fetchAndBroadcast(ctx context.Context) {
statusCtx, cancel := context.WithTimeout(ctx, statusTimeout)
defer cancel()
status, err := m.client.Status(statusCtx)
state, err := m.fetchState(statusCtx)
if err != nil {
log.Warnf("[Tailscale] Failed to fetch status: %v", err)
return
}
state := convertStatus(status)
m.updateState(state)
}
// fetchState fetches the current status and merges in pref-derived fields
// (e.g. exit-node LAN access) that are not present in the IPN status itself.
func (m *Manager) fetchState(ctx context.Context) (*TailscaleState, error) {
status, err := m.client.Status(ctx)
if err != nil {
return nil, err
}
state := convertStatus(status)
// Prefs carry the exit-node LAN-access toggle, which the status does not
// expose. Treat a prefs failure as non-fatal so status still updates.
if prefs, err := m.client.GetPrefs(ctx); err != nil {
log.Warnf("[Tailscale] Failed to fetch prefs: %v", err)
} else if prefs != nil {
state.ExitNodeAllowLANAccess = prefs.ExitNodeAllowLANAccess
}
return state, nil
}
func (m *Manager) updateState(state *TailscaleState) {
m.stateMutex.Lock()
m.state = state
@@ -266,12 +297,62 @@ func (m *Manager) RefreshState() {
ctx, cancel := context.WithTimeout(m.ctx, statusTimeout)
defer cancel()
status, err := m.client.Status(ctx)
state, err := m.fetchState(ctx)
if err != nil {
log.Warnf("[Tailscale] Failed to refresh state: %v", err)
return
}
state := convertStatus(status)
m.updateState(state)
}
// Connect brings the Tailscale backend up (WantRunning = true).
func (m *Manager) Connect() error {
return m.editPrefs(&ipn.MaskedPrefs{
Prefs: ipn.Prefs{WantRunning: true},
WantRunningSet: true,
})
}
// Disconnect brings the Tailscale backend down (WantRunning = false).
func (m *Manager) Disconnect() error {
return m.editPrefs(&ipn.MaskedPrefs{
Prefs: ipn.Prefs{WantRunning: false},
WantRunningSet: true,
})
}
// SetExitNode selects the exit node identified by its stable node ID. An empty
// id clears the current exit node. Mirrors `tailscale set --exit-node=<id>`,
// which also clears any legacy IP-based exit node so a stale ExitNodeIP cannot
// silently take precedence over the now-empty ID.
func (m *Manager) SetExitNode(id string) error {
return m.editPrefs(&ipn.MaskedPrefs{
Prefs: ipn.Prefs{ExitNodeID: tailcfg.StableNodeID(id)},
ExitNodeIDSet: true,
ExitNodeIPSet: true,
})
}
// SetAllowLANAccess toggles whether locally accessible subnets remain
// reachable while an exit node is in use.
func (m *Manager) SetAllowLANAccess(enabled bool) error {
return m.editPrefs(&ipn.MaskedPrefs{
Prefs: ipn.Prefs{ExitNodeAllowLANAccess: enabled},
ExitNodeAllowLANAccessSet: true,
})
}
// editPrefs applies a masked prefs edit and refreshes state so subscribers see
// the result immediately, in addition to the IPN bus notification it triggers.
func (m *Manager) editPrefs(mp *ipn.MaskedPrefs) error {
ctx, cancel := context.WithTimeout(m.ctx, statusTimeout)
defer cancel()
if _, err := m.client.EditPrefs(ctx, mp); err != nil {
return err
}
m.RefreshState()
return nil
}
@@ -12,8 +12,16 @@ import (
"github.com/stretchr/testify/require"
"tailscale.com/ipn"
"tailscale.com/ipn/ipnstate"
"tailscale.com/tailcfg"
)
// blockingWatch is a watchFn that blocks until the context is cancelled, used
// by tests that exercise direct manager calls rather than the watch loop.
func blockingWatch(ctx context.Context, mask ipn.NotifyWatchOpt) (ipnBusWatcher, error) {
<-ctx.Done()
return nil, ctx.Err()
}
// mockWatcher yields canned Notify events, then returns err or blocks until Close/context cancel.
type mockWatcher struct {
events []ipn.Notify
@@ -70,6 +78,8 @@ func (w *mockWatcher) Close() error {
type mockClient struct {
watchFn func(ctx context.Context, mask ipn.NotifyWatchOpt) (ipnBusWatcher, error)
statusFn func(ctx context.Context) (*ipnstate.Status, error)
getPrefsFn func(ctx context.Context) (*ipn.Prefs, error)
editPrefsFn func(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error)
}
func (c *mockClient) WatchIPNBus(ctx context.Context, mask ipn.NotifyWatchOpt) (ipnBusWatcher, error) {
@@ -80,6 +90,20 @@ func (c *mockClient) Status(ctx context.Context) (*ipnstate.Status, error) {
return c.statusFn(ctx)
}
func (c *mockClient) GetPrefs(ctx context.Context) (*ipn.Prefs, error) {
if c.getPrefsFn != nil {
return c.getPrefsFn(ctx)
}
return &ipn.Prefs{}, nil
}
func (c *mockClient) EditPrefs(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error) {
if c.editPrefsFn != nil {
return c.editPrefsFn(ctx, mp)
}
return &ipn.Prefs{}, nil
}
func runningStatus() *ipnstate.Status {
return &ipnstate.Status{
Version: "1.94.2",
@@ -296,3 +320,78 @@ func TestManager_RefreshState(t *testing.T) {
assert.True(t, state.Connected)
assert.Equal(t, "cachyos", state.Self.Hostname)
}
func TestManager_RefreshState_MergesPrefs(t *testing.T) {
client := &mockClient{
watchFn: blockingWatch,
statusFn: func(ctx context.Context) (*ipnstate.Status, error) { return runningStatus(), nil },
getPrefsFn: func(ctx context.Context) (*ipn.Prefs, error) {
return &ipn.Prefs{ExitNodeAllowLANAccess: true}, nil
},
}
m := newManager(client)
defer m.Close()
m.RefreshState()
assert.True(t, m.GetState().ExitNodeAllowLANAccess)
}
func TestManager_Actions_EditPrefs(t *testing.T) {
var captured *ipn.MaskedPrefs
client := &mockClient{
watchFn: blockingWatch,
statusFn: func(ctx context.Context) (*ipnstate.Status, error) { return runningStatus(), nil },
editPrefsFn: func(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error) {
captured = mp
return &ipn.Prefs{}, nil
},
}
m := newManager(client)
defer m.Close()
require.NoError(t, m.Connect())
require.NotNil(t, captured)
assert.True(t, captured.WantRunningSet)
assert.True(t, captured.WantRunning)
require.NoError(t, m.Disconnect())
assert.True(t, captured.WantRunningSet)
assert.False(t, captured.WantRunning)
require.NoError(t, m.SetExitNode("nABC123"))
assert.True(t, captured.ExitNodeIDSet)
assert.Equal(t, tailcfg.StableNodeID("nABC123"), captured.ExitNodeID)
// ExitNodeIPSet must also be set so a stale legacy ExitNodeIP cannot
// override the ID-based selection (mirrors `tailscale set --exit-node`).
assert.True(t, captured.ExitNodeIPSet)
require.NoError(t, m.SetExitNode(""))
assert.True(t, captured.ExitNodeIDSet)
assert.Equal(t, tailcfg.StableNodeID(""), captured.ExitNodeID)
// Clearing must zero both the ID and any legacy IP-based exit node.
assert.True(t, captured.ExitNodeIPSet)
require.NoError(t, m.SetAllowLANAccess(true))
assert.True(t, captured.ExitNodeAllowLANAccessSet)
assert.True(t, captured.ExitNodeAllowLANAccess)
}
func TestManager_Actions_PropagateError(t *testing.T) {
client := &mockClient{
watchFn: blockingWatch,
statusFn: func(ctx context.Context) (*ipnstate.Status, error) { return runningStatus(), nil },
editPrefsFn: func(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error) {
return nil, fmt.Errorf("backend rejected edit")
},
}
m := newManager(client)
defer m.Close()
assert.Error(t, m.Connect())
assert.Error(t, m.SetExitNode("nABC123"))
assert.Error(t, m.SetAllowLANAccess(true))
}
+2
View File
@@ -7,6 +7,7 @@ type TailscaleState struct {
BackendState string `json:"backendState"`
MagicDNSSuffix string `json:"magicDnsSuffix"`
TailnetName string `json:"tailnetName"`
ExitNodeAllowLANAccess bool `json:"exitNodeAllowLanAccess"`
Self Peer `json:"self"`
Peers []Peer `json:"peers"`
}
@@ -22,6 +23,7 @@ type Peer struct {
Online bool `json:"online"`
LastSeen string `json:"lastSeen,omitempty"`
ExitNode bool `json:"exitNode"`
ExitNodeOption bool `json:"exitNodeOption"`
Tags []string `json:"tags,omitempty"`
Owner string `json:"owner"`
Relay string `json:"relay,omitempty"`
+7 -7
View File
@@ -3,10 +3,10 @@
# Usage: ./create-source.sh <package-dir> [ubuntu-series]
#
# Example:
# ./create-source.sh ../dms questing # Ubuntu 25.10 (default series in ppa-upload)
# ./create-source.sh ../dms resolute # Ubuntu 26.04 LTS
# ./create-source.sh ../dms-git questing
# ./create-source.sh ../dms resolute # Ubuntu 26.04 LTS (default series in ppa-upload)
# ./create-source.sh ../dms stonking # Ubuntu 26.10
# ./create-source.sh ../dms-git resolute
# ./create-source.sh ../dms-git stonking
set -e
@@ -27,13 +27,13 @@ if [ $# -lt 1 ]; then
echo "Arguments:"
echo " package-dir : Path to package directory (e.g., ../dms)"
echo " ubuntu-series : Ubuntu series (optional, default: noble)"
echo " Options: noble, jammy, oracular, mantic, questing, resolute"
echo " Options: noble, jammy, oracular, mantic, resolute, stonking"
echo
echo "Examples:"
echo " $0 ../dms questing"
echo " $0 ../dms resolute"
echo " $0 ../dms-git questing"
echo " $0 ../dms stonking"
echo " $0 ../dms-git resolute"
echo " $0 ../dms-git stonking"
exit 1
fi
@@ -135,7 +135,7 @@ check_ppa_version_exists() {
local CHECK_MODE="${4:-commit}"
local DISTRO_SERIES="${5:-}"
# Query Launchpad API (optionally scoped to one Ubuntu series so the same version can ship to questing and resolute)
# Query Launchpad API (optionally scoped to one Ubuntu series so the same version can ship to resolute and stonking)
local API_URL="https://api.launchpad.net/1.0/~avengemedia/+archive/ubuntu/$PPA_NAME?ws.op=getPublishedSources&source_name=$SOURCE_NAME&status=Published"
if [[ -n "$DISTRO_SERIES" ]]; then
API_URL+="&distro_series=https://api.launchpad.net/1.0/ubuntu/${DISTRO_SERIES}"
+2 -2
View File
@@ -10,8 +10,8 @@
PPA_OWNER="avengemedia"
LAUNCHPAD_API="https://api.launchpad.net/1.0"
# Supported Ubuntu series for PPA builds (25.10 questing + 26.04 LTS resolute)
DISTRO_SERIES_LIST=(questing resolute)
# Supported Ubuntu series for PPA builds (26.04 LTS resolute + 26.10 stonking)
DISTRO_SERIES_LIST=(resolute stonking)
# Define packages (sync with ppa-upload.sh)
ALL_PACKAGES=(dms dms-git dms-greeter)
+3 -3
View File
@@ -5,7 +5,7 @@ set -euo pipefail
PPA_OWNER="avengemedia"
LAUNCHPAD_API="https://api.launchpad.net/1.0"
SERIES_LIST=(questing resolute)
SERIES_LIST=(resolute stonking)
PACKAGE_FILTER="dms-git"
REBUILD_RELEASE=""
JSON=false
@@ -72,12 +72,12 @@ embedded_commit() {
target_ppa() {
local series="$1"
if [[ -n "$REBUILD_RELEASE" ]]; then
if [[ "$series" == "resolute" ]]; then
if [[ "$series" == "stonking" ]]; then
echo $((REBUILD_RELEASE + 1))
else
echo "$REBUILD_RELEASE"
fi
elif [[ "$series" == "resolute" ]]; then
elif [[ "$series" == "stonking" ]]; then
echo "2"
else
echo "1"
+8 -8
View File
@@ -3,13 +3,13 @@
# Usage: ./ppa-upload.sh [package-name] [ppa-name] [ubuntu-series] [rebuild-number] [--keep-builds] [--rebuild=N]
#
# Examples:
# ./ppa-upload.sh dms # Upload to questing + resolute (default)
# ./ppa-upload.sh dms 2 # Native: questing ppa2, resolute ppa3 (auto +1 on second series)
# ./ppa-upload.sh dms # Upload to resolute + stonking (default)
# ./ppa-upload.sh dms 2 # Native: resolute ppa2, stonking ppa3 (auto +1 on second series)
# ./ppa-upload.sh dms --rebuild=2 # Rebuild with ppa2 (flag syntax)
# ./ppa-upload.sh dms-git # Single package (both series)
# ./ppa-upload.sh all # All packages (each to both series)
# ./ppa-upload.sh dms resolute # 26.04 LTS only (same as "dms dms resolute")
# ./ppa-upload.sh dms questing # 25.10 only
# ./ppa-upload.sh dms stonking # 26.10 only
# ./ppa-upload.sh dms dms resolute # Explicit PPA name + one series (optional form)
# ./ppa-upload.sh dms dms resolute 2 # One series + rebuild number
# ./ppa-upload.sh distro/ubuntu/dms dms # Path-style (backward compatible)
@@ -70,8 +70,8 @@ if [[ ${#POSITIONAL_ARGS[@]} -gt 0 ]]; then
fi
fi
# Shorthand: "dms resolute" / "dms questing" (package + series; PPA inferred — no need for "dms dms resolute")
if [[ ${#POSITIONAL_ARGS[@]} -eq 2 ]] && [[ "${POSITIONAL_ARGS[1]}" == "questing" || "${POSITIONAL_ARGS[1]}" == "resolute" ]]; then
# Shorthand: "dms resolute" / "dms stonking" (package + series; PPA inferred — no need for "dms dms resolute")
if [[ ${#POSITIONAL_ARGS[@]} -eq 2 ]] && [[ "${POSITIONAL_ARGS[1]}" == "resolute" || "${POSITIONAL_ARGS[1]}" == "stonking" ]]; then
PACKAGE_INPUT="${POSITIONAL_ARGS[0]}"
PPA_NAME_INPUT=""
UBUNTU_SERIES_RAW="${POSITIONAL_ARGS[1]}"
@@ -79,11 +79,11 @@ fi
SERIES_LIST=()
if [[ -z "$UBUNTU_SERIES_RAW" ]]; then
SERIES_LIST=(questing resolute)
elif [[ "$UBUNTU_SERIES_RAW" == "questing" || "$UBUNTU_SERIES_RAW" == "resolute" ]]; then
SERIES_LIST=(resolute stonking)
elif [[ "$UBUNTU_SERIES_RAW" == "resolute" || "$UBUNTU_SERIES_RAW" == "stonking" ]]; then
SERIES_LIST=("$UBUNTU_SERIES_RAW")
else
error "Invalid Ubuntu series: $UBUNTU_SERIES_RAW (use questing, resolute, or omit for both)"
error "Invalid Ubuntu series: $UBUNTU_SERIES_RAW (use resolute, stonking, or omit for both)"
exit 1
fi
+9 -2
View File
@@ -40,10 +40,17 @@ override_dh_auto_install:
install -Dm644 DankMaterialShell-$(BASE_VERSION)/LICENSE \
debian/dms-greeter/usr/share/doc/dms-greeter/LICENSE
# Install systemd tmpfiles/sysusers fragments only when present in the fetched source.
# sysusers-dms-greeter.conf landed upstream after v1.4.6; guarding both lets older
# release tarballs build, while future tags that ship the files install them automatically.
if [ -f DankMaterialShell-$(BASE_VERSION)/quickshell/systemd/tmpfiles-dms-greeter.conf ]; then \
install -Dpm0644 DankMaterialShell-$(BASE_VERSION)/quickshell/systemd/tmpfiles-dms-greeter.conf \
debian/dms-greeter/usr/lib/tmpfiles.d/dms-greeter.conf
debian/dms-greeter/usr/lib/tmpfiles.d/dms-greeter.conf; \
fi
if [ -f DankMaterialShell-$(BASE_VERSION)/quickshell/systemd/sysusers-dms-greeter.conf ]; then \
install -Dm644 DankMaterialShell-$(BASE_VERSION)/quickshell/systemd/sysusers-dms-greeter.conf \
debian/dms-greeter/usr/lib/sysusers.d/dms-greeter.conf
debian/dms-greeter/usr/lib/sysusers.d/dms-greeter.conf; \
fi
# Create cache directory structure (will be created by postinst)
mkdir -p debian/dms-greeter/var/cache/dms-greeter
+34 -1
View File
@@ -126,7 +126,40 @@ const KEY_MAP = {
161: "exclamdown"
};
function xkbKeyFromQtKey(qk) {
// Numpad (keypad) keys. Qt reuses the same Qt::Key_* values for the numpad and
// the main rows/nav cluster; only Qt.KeypadModifier distinguishes them. niri and
// the other compositors bind against the xkb KP_* keysym names, so we must emit
// those instead of the collapsed twin. With NumLock off the numpad sends the
// navigation keysyms (KP_Home, KP_End, ...); with NumLock on it sends KP_0..KP_9
// (handled by the digit range in xkbKeyFromQtKey). Operators/Enter are the same
// in both states.
const KP_MAP = {
16777232: "KP_Home",
16777235: "KP_Up",
16777238: "KP_Prior",
16777234: "KP_Left",
16777227: "KP_Begin",
16777236: "KP_Right",
16777233: "KP_End",
16777237: "KP_Down",
16777239: "KP_Next",
16777222: "KP_Insert",
16777223: "KP_Delete",
16777221: "KP_Enter",
43: "KP_Add",
45: "KP_Subtract",
42: "KP_Multiply",
47: "KP_Divide",
46: "KP_Decimal"
};
function xkbKeyFromQtKey(qk, isKeypad) {
if (isKeypad) {
if (qk >= 48 && qk <= 57)
return "KP_" + (qk - 48);
if (KP_MAP[qk])
return KP_MAP[qk];
}
if (qk >= 65 && qk <= 90)
return String.fromCharCode(qk);
if (qk >= 97 && qk <= 122)
+10
View File
@@ -164,6 +164,8 @@ Singleton {
property real popupTransparency: 1.0
property real dockTransparency: 1
property string widgetBackgroundColor: "sch"
property string widgetBackgroundCustomColor: "#6750A4"
property real widgetBackgroundCustomStrength: 0.50
property string widgetColorMode: "default"
property string controlCenterTileColorMode: "primary"
property string buttonColorMode: "primary"
@@ -385,11 +387,16 @@ Singleton {
property bool dwlShowAllTags: false
property bool workspaceActiveAppHighlightEnabled: false
property string workspaceColorMode: "default"
property string workspaceFocusedCustomColor: "#6750A4"
property string workspaceOccupiedColorMode: "none"
property string workspaceOccupiedCustomColor: "#625B71"
property string workspaceUnfocusedColorMode: "default"
property string workspaceUnfocusedCustomColor: "#49454E"
property string workspaceUrgentColorMode: "default"
property string workspaceUrgentCustomColor: "#B3261E"
property bool workspaceFocusedBorderEnabled: false
property string workspaceFocusedBorderColor: "primary"
property string workspaceFocusedBorderCustomColor: "#6750A4"
property int workspaceFocusedBorderThickness: 2
property var workspaceNameIcons: ({})
property bool waveProgressEnabled: true
@@ -465,6 +472,8 @@ Singleton {
property bool launcherUseOverlayLayer: false
property string launcherStyle: "full"
property bool spotlightBarShowModeChips: false
property bool keybindsFloatingWindow: false
onKeybindsFloatingWindowChanged: saveSettings()
property string _legacyWeatherLocation: "New York, NY"
property string _legacyWeatherCoordinates: "40.7128,-74.0060"
@@ -572,6 +581,7 @@ Singleton {
property bool soundVolumeChanged: true
property bool soundPluggedIn: true
property bool soundLogin: false
property bool muteSoundsWhenMediaPlaying: true
property int acMonitorTimeout: 0
property int acLockTimeout: 0
+27 -2
View File
@@ -450,7 +450,9 @@ Singleton {
"primaryText": getMatugenColor("on_primary", "#ffffff"),
"primaryContainer": getMatugenColor("primary_container", "#1976d2"),
"secondary": getMatugenColor("secondary", "#8ab4f8"),
"secondaryContainer": getMatugenColor("secondary_container", getMatugenColor("surface_container_high", "#292b2f")),
"tertiary": getMatugenColor("tertiary", "#efb8c8"),
"tertiaryContainer": getMatugenColor("tertiary_container", getMatugenColor("surface_container_high", "#292b2f")),
"surface": getMatugenColor("surface", "#1a1c1e"),
"surfaceText": getMatugenColor("on_background", "#e3e8ef"),
"surfaceVariant": getMatugenColor("surface_variant", "#44464f"),
@@ -521,7 +523,6 @@ Singleton {
property color primary: currentThemeData.primary
property color primaryText: currentThemeData.primaryText
property color primaryContainer: currentThemeData.primaryContainer
property color secondary: currentThemeData.secondary
property color tertiary: currentThemeData.tertiary || currentThemeData.secondary
property color surface: currentThemeData.surface
@@ -536,6 +537,9 @@ Singleton {
property color surfaceContainer: currentThemeData.surfaceContainer
property color surfaceContainerHigh: currentThemeData.surfaceContainerHigh
property color surfaceContainerHighest: currentThemeData.surfaceContainerHighest || surfaceContainerHigh
property color primaryContainer: currentThemeData.primaryContainer || blend(surfaceContainerHigh, primary, 0.45)
property color secondaryContainer: currentThemeData.secondaryContainer || blend(surfaceContainerHigh, secondary, 0.35)
property color tertiaryContainer: currentThemeData.tertiaryContainer || blend(surfaceContainerHigh, tertiary, 0.35)
property color onSurface: surfaceText
property color onSurfaceVariant: surfaceVariantText
@@ -1430,9 +1434,22 @@ Singleton {
property bool widgetBackgroundHasAlpha: {
const colorMode = typeof SettingsData !== "undefined" ? SettingsData.widgetBackgroundColor : "sch";
return colorMode === "sth";
return colorMode === "sth" || colorMode === "custom";
}
function safeColor(value, fallback) {
try {
if (value === undefined || value === null || value === "")
return fallback;
return Qt.color(value);
} catch (e) {
return fallback;
}
}
readonly property color widgetBackgroundCustomBaseColor: safeColor(typeof SettingsData !== "undefined" ? SettingsData.widgetBackgroundCustomColor : "#6750A4", primaryContainer)
readonly property real widgetBackgroundCustomStrength: Math.max(0, Math.min(1, typeof SettingsData !== "undefined" ? (SettingsData.widgetBackgroundCustomStrength ?? 0.4) : 0.4))
property var widgetBaseBackgroundColor: {
const colorMode = typeof SettingsData !== "undefined" ? SettingsData.widgetBackgroundColor : "sch";
switch (colorMode) {
@@ -1442,6 +1459,14 @@ Singleton {
return surfaceContainer;
case "sch":
return surfaceContainerHigh;
case "primaryContainer":
return primaryContainer;
case "secondaryContainer":
return secondaryContainer;
case "tertiaryContainer":
return tertiaryContainer;
case "custom":
return blend(surfaceContainerHigh, widgetBackgroundCustomBaseColor, widgetBackgroundCustomStrength);
case "sth":
default:
return surfaceTextHover;
@@ -19,6 +19,8 @@ var SPEC = {
dockTransparency: { def: 1.0, coerce: percentToUnit },
widgetBackgroundColor: { def: "sch" },
widgetBackgroundCustomColor: { def: "#6750A4" },
widgetBackgroundCustomStrength: { def: 0.50, coerce: percentToUnit },
widgetColorMode: { def: "default" },
controlCenterTileColorMode: { def: "primary" },
buttonColorMode: { def: "primary" },
@@ -144,11 +146,16 @@ var SPEC = {
dwlShowAllTags: { def: false },
workspaceActiveAppHighlightEnabled: { def: false },
workspaceColorMode: { def: "default" },
workspaceFocusedCustomColor: { def: "#6750A4" },
workspaceOccupiedColorMode: { def: "none" },
workspaceOccupiedCustomColor: { def: "#625B71" },
workspaceUnfocusedColorMode: { def: "default" },
workspaceUnfocusedCustomColor: { def: "#49454E" },
workspaceUrgentColorMode: { def: "default" },
workspaceUrgentCustomColor: { def: "#B3261E" },
workspaceFocusedBorderEnabled: { def: false },
workspaceFocusedBorderColor: { def: "primary" },
workspaceFocusedBorderCustomColor: { def: "#6750A4" },
workspaceFocusedBorderThickness: { def: 2 },
workspaceNameIcons: { def: {} },
waveProgressEnabled: { def: true },
@@ -230,6 +237,7 @@ var SPEC = {
launcherUseOverlayLayer: { def: false },
launcherStyle: { def: "full" },
spotlightBarShowModeChips: { def: false },
keybindsFloatingWindow: { def: false },
useAutoLocation: { def: false },
weatherEnabled: { def: true },
@@ -282,6 +290,7 @@ var SPEC = {
soundNewNotification: { def: true },
soundVolumeChanged: { def: true },
soundPluggedIn: { def: true },
muteSoundsWhenMediaPlaying: { def: true },
acMonitorTimeout: { def: 0 },
acLockTimeout: { def: 0 },
+65 -3
View File
@@ -116,6 +116,12 @@ Item {
fadeWindowLoader.item.cancelFade();
}
}
function onDismissFadeToLock() {
if (fadeWindowLoader.item) {
fadeWindowLoader.item.dismiss();
}
}
}
}
}
@@ -317,6 +323,9 @@ Item {
property bool hadRealScreen: true
property var previousRealScreenNames: []
// Guards for the screen-reconnect recovery path (see scheduleScreenReconnectRecovery).
property bool _screenRecoveryCooldown: false
property bool _screenRecoveryPending: false
function _getRealScreenNames() {
const names = [];
@@ -359,15 +368,60 @@ Item {
const partialReconnect = root.previousRealScreenNames.length > 0
&& currentNames.some(name => !root.previousRealScreenNames.includes(name));
if (fullReconnect || partialReconnect) {
log.info("Screen reconnect detected, triggering surface recovery",
log.info("Screen reconnect detected, scheduling surface recovery",
"full:", fullReconnect, "partial:", partialReconnect);
root.triggerSurfaceRecovery("screen-reconnect");
root.scheduleScreenReconnectRecovery();
}
root.hadRealScreen = hasReal;
root.previousRealScreenNames = currentNames;
}
}
// A DPMS off/on cycle removes an output from the screen list and re-adds it,
// which is indistinguishable here from a hotplug. Recovering immediately on
// every such event lets a flapping monitor (or a recovery that itself perturbs
// the output) drive an endless recovery storm that power-cycles the display
// (#2642). Debounce a burst of changes into a single pass, then hold a cooldown
// so repeated flaps trigger at most one recovery per window. Recovery still runs
// once per resume, so a partial DPMS resume keeps redrawing its surfaces (#2579).
function scheduleScreenReconnectRecovery() {
if (root._screenRecoveryCooldown) {
root._screenRecoveryPending = true;
return;
}
screenReconnectDebounce.restart();
}
Timer {
id: screenReconnectDebounce
// Wide enough to collapse the output-remove + output-re-add pair that one
// DPMS off/on cycle emits as two near-simultaneous events into one recovery.
interval: 450
repeat: false
onTriggered: {
root._screenRecoveryCooldown = true;
root._screenRecoveryPending = false;
screenReconnectCooldown.restart();
root.triggerSurfaceRecovery("screen-reconnect");
}
}
Timer {
id: screenReconnectCooldown
// Must exceed the full two-pass surfaceResumeRecoveryTimer sequence
// (800 + 2000 ms) so the cooldown still covers an in-flight recovery;
// raise this if those passes are lengthened.
interval: 4000
repeat: false
onTriggered: {
root._screenRecoveryCooldown = false;
if (root._screenRecoveryPending) {
root._screenRecoveryPending = false;
screenReconnectDebounce.restart();
}
}
}
Timer {
id: surfaceResumeRecoveryTimer
interval: 800
@@ -653,7 +707,7 @@ Item {
if (!wifiPasswordModalLoader.item)
return;
if (wifiPasswordModalLoader.item.visible && timeSinceLastPrompt < 1000) {
if (wifiPasswordModalLoader.item.shouldBeVisible && timeSinceLastPrompt < 1000) {
NetworkService.cancelCredentials(lastCredentialsToken);
lastCredentialsToken = token;
lastCredentialsTime = now;
@@ -997,6 +1051,14 @@ Item {
osdResumeRecreateTimer.interval = 400;
osdResumeRecreateTimer.restart();
// This path runs its own recovery directly, so drop any queued or
// in-flight screen-reconnect recovery to avoid a redundant pass once
// its cooldown expires.
screenReconnectDebounce.stop();
screenReconnectCooldown.stop();
root._screenRecoveryCooldown = false;
root._screenRecoveryPending = false;
root.triggerSurfaceRecovery("sessionResumed");
}
}
+336
View File
@@ -0,0 +1,336 @@
import QtQml
import QtQuick
import QtQuick.Layouts
import qs.Common
import qs.Services
import qs.Widgets
FocusScope {
id: content
property real scrollStep: 60
property var activeFlickable: mainFlickable
property bool showFloatingToggle: true
property bool floating: false
property alias searchField: searchField
signal closeRequested
signal floatingToggleRequested
function scrollDown() {
if (!activeFlickable)
return;
let newY = activeFlickable.contentY + scrollStep;
newY = Math.min(newY, activeFlickable.contentHeight - activeFlickable.height);
activeFlickable.contentY = newY;
}
function scrollUp() {
if (!activeFlickable)
return;
let newY = activeFlickable.contentY - scrollStep;
newY = Math.max(0, newY);
activeFlickable.contentY = newY;
}
Keys.onPressed: event => {
switch (event.key) {
case Qt.Key_J:
if (event.modifiers & Qt.ControlModifier) {
scrollDown();
event.accepted = true;
}
return;
case Qt.Key_K:
if (event.modifiers & Qt.ControlModifier) {
scrollUp();
event.accepted = true;
}
return;
case Qt.Key_Down:
scrollDown();
event.accepted = true;
return;
case Qt.Key_Up:
scrollUp();
event.accepted = true;
return;
}
}
Column {
anchors.fill: parent
anchors.margins: Theme.spacingL
spacing: Theme.spacingL
RowLayout {
width: parent.width
spacing: Theme.spacingM
StyledText {
Layout.alignment: Qt.AlignLeft
text: KeybindsService.cheatsheet.title || I18n.tr("Keybinds")
font.pixelSize: Theme.fontSizeLarge
font.weight: Font.Bold
color: Theme.primary
}
Item {
Layout.fillWidth: true
}
DankActionButton {
visible: content.showFloatingToggle
iconName: content.floating ? "close_fullscreen" : "open_in_new"
tooltipText: content.floating ? I18n.tr("Dock window") : I18n.tr("Open as window")
onClicked: content.floatingToggleRequested()
}
DankTextField {
id: searchField
Layout.alignment: Qt.AlignRight
leftIconName: "search"
keyForwardTargets: [content]
onTextEdited: searchDebounce.restart()
Keys.onEscapePressed: event => {
content.closeRequested();
event.accepted = true;
}
}
}
Timer {
id: searchDebounce
interval: 50
repeat: false
onTriggered: {
mainFlickable.categories = mainFlickable.generateCategories(searchField.text);
}
}
DankFlickable {
id: mainFlickable
width: parent.width
height: parent.height - parent.spacing - 40
contentWidth: rowLayout.implicitWidth
contentHeight: rowLayout.implicitHeight
clip: true
property var rawBinds: KeybindsService.cheatsheet.binds || {}
function generateCategories(query) {
const lowerQuery = query ? query.toLowerCase().trim() : "";
const lowerQueryWords = query.split(/\s+/);
const processed = {};
for (const cat in rawBinds) {
const binds = rawBinds[cat];
const catLower = cat.toLowerCase();
const subcats = {};
let hasSubcats = false;
for (let i = 0; i < binds.length; i++) {
const bind = binds[i];
const keyLower = (bind.key || "").toLowerCase();
const descLower = (bind.desc || "").toLowerCase();
const actionLower = (bind.action || "").toLowerCase();
if (bind.hideOnOverlay)
continue;
let shouldContinue = false;
for (let j = 0; j < lowerQueryWords.length; j++) {
const word = lowerQueryWords[j];
if (!(word.length === 0 || keyLower.includes(word) || descLower.includes(word) || catLower.includes(word) || actionLower.includes(word))) {
shouldContinue = true;
break;
}
}
if (shouldContinue)
continue;
if (bind.subcat) {
hasSubcats = true;
if (!subcats[bind.subcat])
subcats[bind.subcat] = [];
subcats[bind.subcat].push(bind);
} else {
if (!subcats["_root"])
subcats["_root"] = [];
subcats["_root"].push(bind);
}
}
if (Object.keys(subcats).length === 0)
continue;
processed[cat] = {
hasSubcats: hasSubcats,
subcats: subcats,
subcatKeys: Object.keys(subcats)
};
}
return processed;
}
property var categories: generateCategories("")
function estimateCategoryHeight(catName) {
const catData = categories[catName];
if (!catData)
return 0;
let bindCount = 0;
for (const key of catData.subcatKeys) {
bindCount += catData.subcats[key]?.length || 0;
if (key !== "_root")
bindCount += 1;
}
return 40 + bindCount * 28;
}
property var categoryKeys: Object.keys(categories)
function distributeCategories(cols) {
const columns = [];
const heights = [];
for (let i = 0; i < cols; i++) {
columns.push([]);
heights.push(0);
}
const sorted = [...categoryKeys].sort((a, b) => estimateCategoryHeight(b) - estimateCategoryHeight(a));
for (const cat of sorted) {
let minIdx = 0;
for (let i = 1; i < cols; i++) {
if (heights[i] < heights[minIdx])
minIdx = i;
}
columns[minIdx].push(cat);
heights[minIdx] += estimateCategoryHeight(cat);
}
return columns;
}
Row {
id: rowLayout
width: mainFlickable.width
spacing: Theme.spacingM
property int numColumns: Math.max(1, Math.min(3, Math.floor(width / 350)))
property var columnCategories: mainFlickable.distributeCategories(numColumns)
Repeater {
model: rowLayout.numColumns
Column {
id: masonryColumn
width: (rowLayout.width - rowLayout.spacing * (rowLayout.numColumns - 1)) / rowLayout.numColumns
spacing: Theme.spacingXL
Repeater {
model: rowLayout.columnCategories[index] || []
Column {
id: categoryColumn
width: parent.width
spacing: Theme.spacingXS
property string catName: modelData
property var catData: mainFlickable.categories[catName]
StyledText {
text: categoryColumn.catName
font.pixelSize: Theme.fontSizeMedium
font.weight: Font.Bold
color: Theme.primary
}
Rectangle {
width: parent.width
height: 1
color: Theme.primary
opacity: 0.3
}
Item {
width: 1
height: Theme.spacingXS
}
Column {
width: parent.width
spacing: Theme.spacingM
Repeater {
model: categoryColumn.catData?.subcatKeys || []
Column {
width: parent.width
spacing: Theme.spacingXS
property string subcatName: modelData
property var subcatBinds: categoryColumn.catData?.subcats?.[subcatName] || []
StyledText {
visible: parent.subcatName !== "_root"
text: parent.subcatName
font.pixelSize: Theme.fontSizeSmall
font.weight: Font.DemiBold
color: Theme.primary
opacity: 0.7
}
Column {
width: parent.width
spacing: Theme.spacingXS
Repeater {
model: parent.parent.subcatBinds
Item {
width: parent.width
height: 24
StyledRect {
id: keyBadge
width: Math.min(keyText.implicitWidth + 12, 160)
height: 22
radius: 4
anchors.verticalCenter: parent.verticalCenter
StyledText {
id: keyText
anchors.centerIn: parent
color: Theme.secondary
text: (modelData.key || "").replace(/\+/g, " + ")
font.pixelSize: Theme.fontSizeSmall
font.weight: Font.Medium
isMonospace: true
elide: Text.ElideRight
width: Math.min(implicitWidth, 148)
}
}
StyledText {
anchors.left: parent.left
anchors.leftMargin: 170
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
text: modelData.desc || modelData.action || ""
font.pixelSize: Theme.fontSizeSmall
opacity: 0.9
elide: Text.ElideRight
wrapMode: Text.NoWrap
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
+58 -314
View File
@@ -1,334 +1,78 @@
import QtQml
import QtQuick
import QtQuick.Layouts
import qs.Common
import qs.Modals.Common
import qs.Modals
import qs.Services
import qs.Widgets
DankModal {
Item {
id: root
layerNamespace: "dms:keybinds"
useOverlayLayer: true
property real scrollStep: 60
property var activeFlickable: null
property real _maxW: Math.min(root.screenWidth * 0.92, 1200)
property real _maxH: Math.min(root.screenHeight * 0.92, 900)
modalWidth: _maxW
modalHeight: _maxH
onBackgroundClicked: close()
onOpened: {
Qt.callLater(() => {
modalFocusScope.forceActiveFocus();
if (contentLoader.item?.searchField)
contentLoader.item.searchField.forceActiveFocus();
});
if (!Object.keys(KeybindsService.cheatsheet).length && KeybindsService.cheatsheetAvailable)
KeybindsService.loadCheatsheet();
}
readonly property bool floating: SettingsData.keybindsFloatingWindow
readonly property bool shouldBeVisible: floating ? (windowLoader.item ? windowLoader.item.visible : false) : (overlayLoader.item ? overlayLoader.item.shouldBeVisible : false)
function scrollDown() {
if (!root.activeFlickable)
function open() {
if (floating) {
windowLoader.active = true;
windowLoader.item.show();
return;
let newY = root.activeFlickable.contentY + scrollStep;
newY = Math.min(newY, root.activeFlickable.contentHeight - root.activeFlickable.height);
root.activeFlickable.contentY = newY;
}
overlayLoader.active = true;
overlayLoader.item.open();
}
function scrollUp() {
if (!root.activeFlickable)
function close() {
if (windowLoader.item)
windowLoader.item.hide();
if (overlayLoader.item)
overlayLoader.item.close();
}
function toggle() {
if (shouldBeVisible)
close();
else
open();
}
function _switchFloating(toFloating) {
if (toFloating) {
if (overlayLoader.item)
overlayLoader.item.close();
SettingsData.keybindsFloatingWindow = true;
windowLoader.active = true;
windowLoader.item.show();
return;
let newY = root.activeFlickable.contentY - root.scrollStep;
newY = Math.max(0, newY);
root.activeFlickable.contentY = newY;
}
if (windowLoader.item)
windowLoader.item.hide();
SettingsData.keybindsFloatingWindow = false;
overlayLoader.active = true;
overlayLoader.item.open();
}
modalFocusScope.Keys.onPressed: event => {
if (event.key === Qt.Key_J && event.modifiers & Qt.ControlModifier) {
scrollDown();
event.accepted = true;
} else if (event.key === Qt.Key_K && event.modifiers & Qt.ControlModifier) {
scrollUp();
event.accepted = true;
} else if (event.key === Qt.Key_Down) {
scrollDown();
event.accepted = true;
} else if (event.key === Qt.Key_Up) {
scrollUp();
event.accepted = true;
Loader {
id: overlayLoader
active: false
asynchronous: false
sourceComponent: KeybindsModalOverlay {
onFloatingToggleRequested: root._switchFloating(true)
onDialogClosed: Qt.callLater(() => {
if (!shouldBeVisible)
overlayLoader.active = false;
})
}
}
content: Component {
Item {
anchors.fill: parent
property alias searchField: searchField
Loader {
id: windowLoader
active: false
asynchronous: false
Column {
anchors.fill: parent
anchors.margins: Theme.spacingL
spacing: Theme.spacingL
RowLayout {
width: parent.width
StyledText {
Layout.alignment: Qt.AlignLeft
text: KeybindsService.cheatsheet.title || I18n.tr("Keybinds")
font.pixelSize: Theme.fontSizeLarge
font.weight: Font.Bold
color: Theme.primary
}
DankTextField {
id: searchField
Layout.alignment: Qt.AlignRight
leftIconName: "search"
keyForwardTargets: [root.modalFocusScope]
onTextEdited: searchDebounce.restart()
Keys.onEscapePressed: event => {
root.close();
event.accepted = true;
}
}
}
Timer {
id: searchDebounce
interval: 50
repeat: false
onTriggered: {
mainFlickable.categories = mainFlickable.generateCategories(searchField.text);
}
}
DankFlickable {
id: mainFlickable
width: parent.width
height: parent.height - parent.spacing - 40
contentWidth: rowLayout.implicitWidth
contentHeight: rowLayout.implicitHeight
clip: true
Component.onCompleted: root.activeFlickable = mainFlickable
property var rawBinds: KeybindsService.cheatsheet.binds || {}
function generateCategories(query) {
const lowerQuery = query ? query.toLowerCase().trim() : "";
const lowerQueryWords = query.split(/\s+/);
const processed = {};
for (const cat in rawBinds) {
const binds = rawBinds[cat];
const catLower = cat.toLowerCase();
const subcats = {};
let hasSubcats = false;
for (let i = 0; i < binds.length; i++) {
const bind = binds[i];
const keyLower = (bind.key || "").toLowerCase();
const descLower = (bind.desc || "").toLowerCase();
const actionLower = (bind.action || "").toLowerCase();
if (bind.hideOnOverlay)
continue;
let shouldContinue = false;
for (let j = 0; j < lowerQueryWords.length; j++) {
const word = lowerQueryWords[j];
if (!(word.length === 0 || keyLower.includes(word) || descLower.includes(word) || catLower.includes(word) || actionLower.includes(word))) {
shouldContinue = true;
break;
}
}
if (shouldContinue)
continue;
if (bind.subcat) {
hasSubcats = true;
if (!subcats[bind.subcat])
subcats[bind.subcat] = [];
subcats[bind.subcat].push(bind);
} else {
if (!subcats["_root"])
subcats["_root"] = [];
subcats["_root"].push(bind);
}
}
if (Object.keys(subcats).length === 0)
continue;
processed[cat] = {
hasSubcats: hasSubcats,
subcats: subcats,
subcatKeys: Object.keys(subcats)
};
}
return processed;
}
property var categories: generateCategories("")
function estimateCategoryHeight(catName) {
const catData = categories[catName];
if (!catData)
return 0;
let bindCount = 0;
for (const key of catData.subcatKeys) {
bindCount += catData.subcats[key]?.length || 0;
if (key !== "_root")
bindCount += 1;
}
return 40 + bindCount * 28;
}
property var categoryKeys: Object.keys(categories)
function distributeCategories(cols) {
const columns = [];
const heights = [];
for (let i = 0; i < cols; i++) {
columns.push([]);
heights.push(0);
}
const sorted = [...categoryKeys].sort((a, b) => estimateCategoryHeight(b) - estimateCategoryHeight(a));
for (const cat of sorted) {
let minIdx = 0;
for (let i = 1; i < cols; i++) {
if (heights[i] < heights[minIdx])
minIdx = i;
}
columns[minIdx].push(cat);
heights[minIdx] += estimateCategoryHeight(cat);
}
return columns;
}
Row {
id: rowLayout
width: mainFlickable.width
spacing: Theme.spacingM
property int numColumns: Math.max(1, Math.min(3, Math.floor(width / 350)))
property var columnCategories: mainFlickable.distributeCategories(numColumns)
Repeater {
model: rowLayout.numColumns
Column {
id: masonryColumn
width: (rowLayout.width - rowLayout.spacing * (rowLayout.numColumns - 1)) / rowLayout.numColumns
spacing: Theme.spacingXL
Repeater {
model: rowLayout.columnCategories[index] || []
Column {
id: categoryColumn
width: parent.width
spacing: Theme.spacingXS
property string catName: modelData
property var catData: mainFlickable.categories[catName]
StyledText {
text: categoryColumn.catName
font.pixelSize: Theme.fontSizeMedium
font.weight: Font.Bold
color: Theme.primary
}
Rectangle {
width: parent.width
height: 1
color: Theme.primary
opacity: 0.3
}
Item {
width: 1
height: Theme.spacingXS
}
Column {
width: parent.width
spacing: Theme.spacingM
Repeater {
model: categoryColumn.catData?.subcatKeys || []
Column {
width: parent.width
spacing: Theme.spacingXS
property string subcatName: modelData
property var subcatBinds: categoryColumn.catData?.subcats?.[subcatName] || []
StyledText {
visible: parent.subcatName !== "_root"
text: parent.subcatName
font.pixelSize: Theme.fontSizeSmall
font.weight: Font.DemiBold
color: Theme.primary
opacity: 0.7
}
Column {
width: parent.width
spacing: Theme.spacingXS
Repeater {
model: parent.parent.subcatBinds
Item {
width: parent.width
height: 24
StyledRect {
id: keyBadge
width: Math.min(keyText.implicitWidth + 12, 160)
height: 22
radius: 4
anchors.verticalCenter: parent.verticalCenter
StyledText {
id: keyText
anchors.centerIn: parent
color: Theme.secondary
text: (modelData.key || "").replace(/\+/g, " + ")
font.pixelSize: Theme.fontSizeSmall
font.weight: Font.Medium
isMonospace: true
elide: Text.ElideRight
width: Math.min(implicitWidth, 148)
}
}
StyledText {
anchors.left: parent.left
anchors.leftMargin: 170
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
text: modelData.desc || modelData.action || ""
font.pixelSize: Theme.fontSizeSmall
opacity: 0.9
elide: Text.ElideRight
wrapMode: Text.NoWrap
}
}
}
}
}
}
}
}
}
}
}
}
}
sourceComponent: KeybindsModalWindow {
onFloatingToggleRequested: root._switchFloating(false)
onVisibleChanged: {
if (!visible)
Qt.callLater(() => windowLoader.active = false);
}
}
}
@@ -0,0 +1,38 @@
import QtQml
import QtQuick
import qs.Common
import qs.Modals
import qs.Modals.Common
import qs.Services
DankModal {
id: overlay
signal floatingToggleRequested
layerNamespace: "dms:keybinds"
useOverlayLayer: true
property real _maxW: Math.min(overlay.screenWidth * 0.92, 1200)
property real _maxH: Math.min(overlay.screenHeight * 0.92, 900)
modalWidth: _maxW
modalHeight: _maxH
onBackgroundClicked: close()
onOpened: {
Qt.callLater(() => {
modalFocusScope.forceActiveFocus();
if (contentLoader.item?.searchField)
contentLoader.item.searchField.forceActiveFocus();
});
if (!Object.keys(KeybindsService.cheatsheet).length && KeybindsService.cheatsheetAvailable)
KeybindsService.loadCheatsheet();
}
content: Component {
KeybindsContent {
showFloatingToggle: true
floating: false
onCloseRequested: overlay.close()
onFloatingToggleRequested: overlay.floatingToggleRequested()
}
}
}
+140
View File
@@ -0,0 +1,140 @@
import QtQuick
import Quickshell
import qs.Common
import qs.Modals
import qs.Services
import qs.Widgets
FloatingWindow {
id: win
property bool disablePopupTransparency: true
property alias shouldBeVisible: win.visible
signal floatingToggleRequested
function show() {
visible = true;
}
function hide() {
visible = false;
}
function toggle() {
visible = !visible;
}
objectName: "keybindsModalWindow"
title: I18n.tr("Keybinds")
minimumSize: Qt.size(Math.min(560, Screen.width), Math.min(400, Screen.height))
implicitWidth: 1000
implicitHeight: screen ? Math.min(820, screen.height - 100) : 820
color: Theme.surfaceContainer
visible: false
onVisibleChanged: {
if (!visible)
return;
if (!Object.keys(KeybindsService.cheatsheet).length && KeybindsService.cheatsheetAvailable)
KeybindsService.loadCheatsheet();
Qt.callLater(() => {
keybindsContent.forceActiveFocus();
keybindsContent.searchField.forceActiveFocus();
});
}
onClosed: win.visible = false
Column {
anchors.fill: parent
spacing: 0
Item {
width: parent.width
height: 48
z: 10
MouseArea {
anchors.fill: parent
onPressed: windowControls.tryStartMove()
onDoubleClicked: windowControls.tryToggleMaximize()
}
Rectangle {
anchors.fill: parent
color: Theme.surfaceContainer
opacity: 0.5
}
Row {
anchors.left: parent.left
anchors.leftMargin: Theme.spacingL
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingM
DankIcon {
name: "keyboard"
size: Theme.iconSize
color: Theme.primary
anchors.verticalCenter: parent.verticalCenter
}
StyledText {
text: KeybindsService.cheatsheet.title || I18n.tr("Keybinds")
font.pixelSize: Theme.fontSizeXLarge
color: Theme.surfaceText
font.weight: Font.Medium
anchors.verticalCenter: parent.verticalCenter
}
}
Row {
anchors.right: parent.right
anchors.rightMargin: Theme.spacingM
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingXS
DankActionButton {
circular: false
iconName: "close_fullscreen"
iconSize: Theme.iconSize - 4
iconColor: Theme.surfaceText
tooltipText: I18n.tr("Dock window")
onClicked: win.floatingToggleRequested()
}
DankActionButton {
visible: windowControls.canMaximize
circular: false
iconName: win.maximized ? "fullscreen_exit" : "fullscreen"
iconSize: Theme.iconSize - 4
iconColor: Theme.surfaceText
onClicked: windowControls.tryToggleMaximize()
}
DankActionButton {
circular: false
iconName: "close"
iconSize: Theme.iconSize - 4
iconColor: Theme.surfaceText
onClicked: win.hide()
}
}
}
KeybindsContent {
id: keybindsContent
width: parent.width
height: parent.height - 48
showFloatingToggle: false
floating: true
onCloseRequested: win.hide()
}
}
FloatingWindowControls {
id: windowControls
targetWindow: win
}
}
+1
View File
@@ -11,6 +11,7 @@ DankModal {
layerNamespace: "dms:power-menu"
keepPopoutsOpen: true
useOverlayLayer: true
property int selectedIndex: 0
property int selectedRow: 0
+28 -45
View File
@@ -1,12 +1,22 @@
import QtQuick
import Quickshell
import qs.Common
import qs.Modals.Common
import qs.Services
import qs.Widgets
FloatingWindow {
DankModal {
id: root
layerNamespace: "dms:wifi-password"
keepPopoutsOpen: true
allowStacking: true
shouldBeVisible: false
modalWidth: 420
modalHeight: calculatedHeight
enableShadow: true
onBackgroundClicked: clearAndClose()
directContent: contentFocusScope
property bool disablePopupTransparency: true
property string wifiPasswordSSID: ""
property string wifiPasswordInput: ""
@@ -102,7 +112,7 @@ FloatingWindow {
const network = NetworkService.wifiNetworks.find(n => n.ssid === ssid);
requiresEnterprise = network?.enterprise || false;
visible = true;
open();
Qt.callLater(focusFirstField);
}
@@ -126,7 +136,7 @@ FloatingWindow {
secretValues = {};
requiresEnterprise = false;
visible = true;
open();
Qt.callLater(focusFirstField);
}
@@ -144,6 +154,7 @@ FloatingWindow {
isVpnPrompt = (connectionType === "vpn" || connectionType === "wireguard");
wifiPasswordSSID = isVpnPrompt ? connectionName : ssid;
savePasswordCheckbox.checked = !isVpnPrompt;
requiresEnterprise = setting === "802-1x";
@@ -152,7 +163,7 @@ FloatingWindow {
wifiAnonymousIdentityInput = "";
wifiDomainInput = "";
visible = true;
open();
Qt.callLater(() => {
if (reason === "wrong-password" && fieldsInfo.length === 0) {
passwordInput.text = "";
@@ -162,7 +173,7 @@ FloatingWindow {
}
function hide() {
visible = false;
close();
}
function getFieldLabel(fieldName) {
@@ -242,23 +253,8 @@ FloatingWindow {
secretValues = {};
}
objectName: "wifiPasswordModal"
title: {
if (promptReason === "pkcs11")
return I18n.tr("Smartcard PIN");
if (isVpnPrompt)
return I18n.tr("VPN Password");
if (isHiddenNetwork)
return I18n.tr("Hidden Network");
return I18n.tr("Wi-Fi Password");
}
minimumSize: Qt.size(420, calculatedHeight)
maximumSize: Qt.size(420, calculatedHeight)
color: Theme.surfaceContainer
visible: false
onVisibleChanged: {
if (visible) {
onShouldBeVisibleChanged: {
if (shouldBeVisible) {
Qt.callLater(focusFirstField);
return;
}
@@ -287,7 +283,7 @@ FloatingWindow {
return;
wifiPasswordSSID = NetworkService.connectingSSID;
wifiPasswordInput = "";
visible = true;
open();
NetworkService.passwordDialogShouldReopen = false;
}
}
@@ -296,7 +292,7 @@ FloatingWindow {
id: contentFocusScope
anchors.fill: parent
focus: true
focus: root.shouldBeVisible
Keys.onEscapePressed: event => {
clearAndClose();
@@ -318,8 +314,6 @@ FloatingWindow {
anchors.right: buttonRow.left
anchors.rightMargin: Theme.spacingM
height: headerCol.height
onPressed: windowControls.tryStartMove()
onDoubleClicked: windowControls.tryToggleMaximize()
Column {
id: headerCol
@@ -380,14 +374,6 @@ FloatingWindow {
anchors.right: parent.right
spacing: Theme.spacingXS
DankActionButton {
visible: windowControls.canMaximize
iconName: root.maximized ? "fullscreen_exit" : "fullscreen"
iconSize: Theme.iconSize - 4
iconColor: Theme.surfaceText
onClicked: windowControls.tryToggleMaximize()
}
DankActionButton {
iconName: "close"
iconSize: Theme.iconSize - 4
@@ -419,7 +405,7 @@ FloatingWindow {
textColor: Theme.surfaceText
placeholderText: I18n.tr("Network Name (SSID)")
backgroundColor: "transparent"
enabled: root.visible
enabled: root.shouldBeVisible
keyNavigationTab: passwordInput
onAccepted: passwordInput.forceActiveFocus()
}
@@ -449,7 +435,7 @@ FloatingWindow {
echoMode: modelData.isSecret && !passwordVisible ? TextInput.Password : TextInput.Normal
placeholderText: getFieldLabel(modelData.name)
backgroundColor: "transparent"
enabled: root.visible
enabled: root.shouldBeVisible
Keys.onTabPressed: event => {
if (index < fieldsInfo.length - 1) {
@@ -519,7 +505,7 @@ FloatingWindow {
text: wifiUsernameInput
placeholderText: I18n.tr("Username")
backgroundColor: "transparent"
enabled: root.visible
enabled: root.shouldBeVisible
keyNavigationTab: passwordInput
keyNavigationBacktab: domainMatchInput
onTextEdited: wifiUsernameInput = text
@@ -552,7 +538,7 @@ FloatingWindow {
echoMode: passwordVisible ? TextInput.Normal : TextInput.Password
placeholderText: (requiresEnterprise && !isVpnPrompt) ? I18n.tr("Password") : ""
backgroundColor: "transparent"
enabled: root.visible
enabled: root.shouldBeVisible
keyNavigationTab: (requiresEnterprise && !isVpnPrompt) ? anonInput : null
keyNavigationBacktab: (requiresEnterprise && !isVpnPrompt) ? usernameInput : null
onTextEdited: wifiPasswordInput = text
@@ -589,7 +575,7 @@ FloatingWindow {
text: wifiAnonymousIdentityInput
placeholderText: I18n.tr("Anonymous Identity (optional)")
backgroundColor: "transparent"
enabled: root.visible
enabled: root.shouldBeVisible
keyNavigationTab: domainMatchInput
keyNavigationBacktab: passwordInput
onTextEdited: wifiAnonymousIdentityInput = text
@@ -620,7 +606,7 @@ FloatingWindow {
text: wifiDomainInput
placeholderText: I18n.tr("Domain (optional)")
backgroundColor: "transparent"
enabled: root.visible
enabled: root.shouldBeVisible
keyNavigationTab: usernameInput
keyNavigationBacktab: anonInput
onTextEdited: wifiDomainInput = text
@@ -757,8 +743,5 @@ FloatingWindow {
}
}
FloatingWindowControls {
id: windowControls
targetWindow: root
}
onOpened: Qt.callLater(() => contentFocusScope.forceActiveFocus())
}
@@ -25,7 +25,14 @@ PluginComponent {
}
ccWidgetIsActive: TailscaleService.connected
onCcWidgetToggled: {}
onCcWidgetToggled: {
if (!TailscaleService.available)
return;
if (TailscaleService.connected)
TailscaleService.disconnectTailscale(null);
else
TailscaleService.connectTailscale(null);
}
ccDetailContent: Component {
Rectangle {
@@ -88,6 +95,122 @@ PluginComponent {
width: parent.width
spacing: Theme.spacingS
// Connection status + connect/disconnect. Always shown
// (when available) so the connection can be toggled from
// the detail, including while disconnected.
RowLayout {
width: parent.width
spacing: Theme.spacingS
Column {
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
spacing: 1
StyledText {
text: TailscaleService.connected ? I18n.tr("Connected", "Tailscale connection status: connected") : I18n.tr("Disconnected", "Tailscale connection status: disconnected")
font.pixelSize: Theme.fontSizeMedium
font.weight: Font.Medium
color: Theme.surfaceText
}
StyledText {
visible: TailscaleService.connected && TailscaleService.tailnetName.length > 0
text: TailscaleService.tailnetName
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
width: parent.width
elide: Text.ElideRight
}
}
Rectangle {
id: connButton
Layout.alignment: Qt.AlignVCenter
height: 28
radius: 14
width: connButtonRow.implicitWidth + Theme.spacingM * 2
readonly property bool isConnected: TailscaleService.connected
color: isConnected ? (connButtonArea.containsMouse ? Theme.errorHover : Theme.surfaceLight) : (connButtonArea.containsMouse ? Theme.primaryHoverLight : Theme.surfaceLight)
Row {
id: connButtonRow
anchors.centerIn: parent
spacing: Theme.spacingXS
DankIcon {
name: connButton.isConnected ? "link_off" : "link"
size: Theme.fontSizeSmall
color: connButton.isConnected ? Theme.surfaceText : Theme.primary
anchors.verticalCenter: parent.verticalCenter
}
StyledText {
text: connButton.isConnected ? I18n.tr("Disconnect", "Tailscale disconnect button") : I18n.tr("Connect", "Tailscale connect button")
font.pixelSize: Theme.fontSizeSmall
font.weight: Font.Medium
color: connButton.isConnected ? Theme.surfaceText : Theme.primary
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea {
id: connButtonArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
if (TailscaleService.connected)
TailscaleService.disconnectTailscale(null);
else
TailscaleService.connectTailscale(null);
}
}
}
}
// Connection controls: exit node picker + LAN access.
// Only meaningful while the backend is connected.
Column {
id: controlsColumn
width: parent.width
spacing: Theme.spacingS
visible: TailscaleService.connected
readonly property string noneLabel: I18n.tr("None", "Tailscale exit node: none selected")
DankDropdown {
width: parent.width
text: I18n.tr("Exit node", "Tailscale exit node selector label")
currentValue: TailscaleService.currentExitNode ? TailscaleService.currentExitNode.hostname : controlsColumn.noneLabel
options: {
const opts = [controlsColumn.noneLabel];
for (const p of TailscaleService.exitNodeOptions)
opts.push(p.hostname);
return opts;
}
onValueChanged: value => {
if (value === controlsColumn.noneLabel) {
TailscaleService.clearExitNode(null);
return;
}
const peer = TailscaleService.exitNodeOptions.find(p => p.hostname === value);
if (peer)
TailscaleService.setExitNode(peer.id, null);
}
}
DankToggle {
width: parent.width
text: I18n.tr("Allow LAN access", "Tailscale allow LAN access toggle")
description: I18n.tr("Reach local network devices while using an exit node", "Tailscale allow LAN access description")
visible: TailscaleService.currentExitNode !== null
checked: TailscaleService.exitNodeAllowLanAccess
onToggled: value => TailscaleService.setAllowLanAccess(value, null)
}
}
// Search bar + refresh button
RowLayout {
width: parent.width
@@ -93,7 +93,7 @@ DankPopout {
shouldBeVisible: false
property bool credentialsPromptOpen: NetworkService.credentialsRequested
property bool wifiPasswordModalOpen: PopoutService.wifiPasswordModal?.visible ?? false
property bool wifiPasswordModalOpen: PopoutService.wifiPasswordModal?.shouldBeVisible ?? false
property bool polkitModalOpen: PopoutService.polkitAuthModal?.visible ?? false
property bool anyModalOpen: credentialsPromptOpen || wifiPasswordModalOpen || polkitModalOpen || powerMenuOpen
@@ -2,6 +2,7 @@ import QtQuick
import QtQuick.Controls
import Quickshell
import qs.Common
import qs.Modules.Network
import qs.Services
import qs.Widgets
import qs.Modals
@@ -721,7 +722,7 @@ Rectangle {
DankActionButton {
id: qrCodeButton
visible: modelData.secured && modelData.saved
visible: modelData.secured && modelData.saved && !(modelData.enterprise || false)
anchors.right: parent.right
anchors.rightMargin: optionsButton.width + pinWifiRow.width + 3 * Theme.spacingM + Theme.spacingS
anchors.verticalCenter: parent.verticalCenter
@@ -749,11 +750,9 @@ Rectangle {
event.accepted = true;
return;
}
if (modelData.secured && !modelData.saved && (DMSService.apiVersion < 7 || modelData.enterprise)) {
PopoutService.showWifiPasswordModal(modelData.ssid);
} else {
NetworkService.connectToWifi(modelData.ssid);
}
WifiConnectionActions.connectToNetwork(modelData, {
connected: wifiDelegate.isConnected
});
event.accepted = true;
}
}
@@ -804,15 +803,9 @@ Rectangle {
}
onTriggered: {
if (networkContextMenu.currentConnected) {
NetworkService.disconnectWifi();
return;
}
if (networkContextMenu.currentSecured && !networkContextMenu.currentSaved && (DMSService.apiVersion < 7 || networkContextMenu.currentEnterprise)) {
PopoutService.showWifiPasswordModal(networkContextMenu.currentSSID);
return;
}
NetworkService.connectToWifi(networkContextMenu.currentSSID);
WifiConnectionActions.connectToNetworkFromDetails(networkContextMenu.currentSSID, networkContextMenu.currentSecured, networkContextMenu.currentSaved, networkContextMenu.currentEnterprise, networkContextMenu.currentConnected, {
disconnectWhenConnected: true
});
}
}
@@ -18,6 +18,14 @@ BasePill {
property var widgetData: null
property var hoveredItem: null
onHoveredItemChanged: {
if (hoveredItem)
return;
if (tooltipLoader.item)
tooltipLoader.item.hide();
tooltipLoader.active = false;
}
property var topBar: null
property bool isAutoHideBar: false
property Item windowRoot: (Window.window ? Window.window.contentItem : null)
@@ -236,6 +244,11 @@ BasePill {
delegate: Item {
id: delegateItem
Component.onDestruction: {
if (root.hoveredItem === delegateItem)
root.hoveredItem = null;
}
property bool isGrouped: root._groupByApp
property var groupData: isGrouped ? modelData : null
property var toplevelData: isGrouped ? (modelData.windows.length > 0 ? modelData.windows[0].toplevel : null) : modelData
@@ -461,14 +474,8 @@ BasePill {
}
}
onExited: {
if (root.hoveredItem === delegateItem) {
if (root.hoveredItem === delegateItem)
root.hoveredItem = null;
if (tooltipLoader.item) {
tooltipLoader.item.hide();
}
tooltipLoader.active = false;
}
}
}
}
@@ -491,6 +498,11 @@ BasePill {
delegate: Item {
id: delegateItem
Component.onDestruction: {
if (root.hoveredItem === delegateItem)
root.hoveredItem = null;
}
property bool isGrouped: root._groupByApp
property var groupData: isGrouped ? modelData : null
property var toplevelData: isGrouped ? (modelData.windows.length > 0 ? modelData.windows[0].toplevel : null) : modelData
@@ -715,14 +727,8 @@ BasePill {
}
}
onExited: {
if (root.hoveredItem === delegateItem) {
if (root.hoveredItem === delegateItem)
root.hoveredItem = null;
if (tooltipLoader.item) {
tooltipLoader.item.hide();
}
tooltipLoader.active = false;
}
}
}
}
@@ -9,9 +9,8 @@ BasePill {
visible: SettingsData.weatherEnabled
Ref {
service: WeatherService
}
Component.onCompleted: WeatherService.addRef()
Component.onDestruction: WeatherService.removeRef()
content: Component {
Item {
@@ -1192,38 +1192,25 @@ Item {
return Math.max(baseHeight + iconsExtraHeight, contentImplicitHeight + padding);
}
readonly property color unfocusedColor: {
switch (SettingsData.workspaceUnfocusedColorMode) {
case "s":
return Theme.surface;
case "sc":
return Theme.surfaceContainer;
case "sch":
return Theme.surfaceContainerHigh;
default:
return Theme.surfaceTextAlpha;
}
}
readonly property color activeColor: {
switch (SettingsData.workspaceColorMode) {
case "s":
return Theme.surface;
case "sc":
return Theme.surfaceContainer;
case "sch":
return Theme.surfaceContainerHigh;
case "none":
return unfocusedColor;
default:
function colorFromMode(mode, fallbackColor, customColor, customFallbackColor) {
switch (mode) {
case "primary":
case "pri":
return Theme.primary;
}
}
readonly property color occupiedColor: {
switch (SettingsData.workspaceOccupiedColorMode) {
case "primaryContainer":
return Theme.primaryContainer;
case "secondary":
case "sec":
return Theme.secondary;
case "secondaryContainer":
return Theme.secondaryContainer;
case "tertiary":
case "ter":
return Theme.tertiary;
case "tertiaryContainer":
return Theme.tertiaryContainer;
case "surfaceText":
return Theme.surfaceText;
case "s":
return Theme.surface;
case "sc":
@@ -1232,37 +1219,34 @@ Item {
return Theme.surfaceContainerHigh;
case "schh":
return Theme.surfaceContainerHighest;
default:
return unfocusedColor;
}
}
readonly property color urgentColor: {
switch (SettingsData.workspaceUrgentColorMode) {
case "primary":
return Theme.primary;
case "secondary":
return Theme.secondary;
case "s":
return Theme.surface;
case "sc":
return Theme.surfaceContainer;
default:
case "error":
case "err":
return Theme.error;
case "custom":
return Theme.safeColor(customColor, customFallbackColor);
default:
return fallbackColor;
}
}
readonly property color focusedBorderColor: {
switch (SettingsData.workspaceFocusedBorderColor) {
case "surfaceText":
return Theme.surfaceText;
case "secondary":
return Theme.secondary;
default:
return Theme.primary;
readonly property color unfocusedColor: colorFromMode(SettingsData.workspaceUnfocusedColorMode, Theme.surfaceTextAlpha, SettingsData.workspaceUnfocusedCustomColor, Theme.surfaceTextAlpha)
readonly property color activeColor: {
if (SettingsData.workspaceColorMode === "none")
return unfocusedColor;
return colorFromMode(SettingsData.workspaceColorMode, Theme.primary, SettingsData.workspaceFocusedCustomColor, Theme.primary);
}
readonly property color occupiedColor: {
if (SettingsData.workspaceOccupiedColorMode === "none")
return unfocusedColor;
return colorFromMode(SettingsData.workspaceOccupiedColorMode, unfocusedColor, SettingsData.workspaceOccupiedCustomColor, Theme.secondary);
}
readonly property color urgentColor: colorFromMode(SettingsData.workspaceUrgentColorMode, Theme.error, SettingsData.workspaceUrgentCustomColor, Theme.error)
readonly property color focusedBorderColor: colorFromMode(SettingsData.workspaceFocusedBorderColor, Theme.primary, SettingsData.workspaceFocusedBorderCustomColor, Theme.primary)
function getContrastingIconColor(bgColor) {
const luminance = 0.299 * bgColor.r + 0.587 * bgColor.g + 0.114 * bgColor.b;
return luminance > 0.4 ? Qt.rgba(0.15, 0.15, 0.15, 1) : Qt.rgba(0.8, 0.8, 0.8, 1);
@@ -18,6 +18,9 @@ Item {
property bool showHourly: false
property bool available: WeatherService.weather.available
Component.onCompleted: WeatherService.addRef()
Component.onDestruction: WeatherService.removeRef()
function syncFrom(type) {
if (!dailyLoader.item || !hourlyLoader.item)
return;
+4
View File
@@ -60,6 +60,10 @@ Scope {
function lock() {
if (SettingsData.customPowerActionLock?.length > 0) {
Quickshell.execDetached(["sh", "-c", SettingsData.customPowerActionLock]);
// The custom locker manages its own surface; DMS never engages
// WlSessionLock here, so isShellLocked stays false and the fade
// overlay would never be dismissed. Hand off by dismissing it now.
IdleService.dismissFadeToLock();
return;
}
if (shouldLock || pendingLock)
@@ -0,0 +1,47 @@
pragma Singleton
pragma ComponentBehavior: Bound
import Quickshell
import qs.Services
Singleton {
id: root
function connectToNetwork(network, options) {
if (!network)
return;
const actionOptions = options || {};
const ssid = network.ssid || "";
if (!ssid)
return;
const connected = actionOptions.connected ?? network.connected ?? (ssid === NetworkService.currentWifiSSID);
if (connected) {
if (actionOptions.disconnectWhenConnected ?? false)
NetworkService.disconnectWifi();
return;
}
if (shouldPromptForCredentials(network)) {
PopoutService.showWifiPasswordModal(ssid);
return;
}
NetworkService.connectToWifi(ssid);
}
function connectToNetworkFromDetails(ssid, secured, saved, enterprise, connected, options) {
connectToNetwork({
ssid: ssid,
secured: secured,
saved: saved,
enterprise: enterprise,
connected: connected
}, options);
}
function shouldPromptForCredentials(network) {
return (network.secured ?? false) && !(network.saved ?? false);
}
}
+497 -17
View File
@@ -1,8 +1,10 @@
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import qs.Common
import qs.Modules.Network
import qs.Modules.Settings.Widgets
import qs.Modals.Common
import qs.Services
@@ -16,6 +18,7 @@ Item {
Component.onCompleted: {
NetworkService.addRef();
Qt.callLater(() => NetworkService.refreshSavedWifiNetworks());
}
Component.onDestruction: {
@@ -40,6 +43,7 @@ Item {
id: root
property string expandedWifiSsid: ""
property string expandedSavedWifiSsid: ""
property int maxPinnedWifiNetworks: 3
function normalizePinList(value) {
@@ -84,6 +88,79 @@ Item {
settingKey: "networkWifi"
tags: ["wifi", "wi-fi", "wireless", "network", "ssid", "adapter", "radio"]
function visibleWifiBySsid(ssid) {
const networks = NetworkService.wifiNetworks || [];
return networks.find(network => network.ssid === ssid) || null;
}
function mergedSavedWifiNetworks() {
const saved = NetworkService.savedWifiNetworks || [];
const supportsSavedWifiState = DMSService.apiVersion >= NetworkService.savedWifiStateApiVersion;
const result = [];
const seen = new Set();
for (const network of saved) {
if (!network?.ssid || seen.has(network.ssid))
continue;
const isOutOfRange = supportsSavedWifiState ? network.outOfRange === true : false;
const visibleNetwork = !isOutOfRange ? visibleWifiBySsid(network.ssid) : null;
if (visibleNetwork) {
result.push(Object.assign({}, network, visibleNetwork, {
saved: true,
autoconnect: network.autoconnect ?? visibleNetwork.autoconnect,
hidden: (network.hidden || false) || (visibleNetwork.hidden || false),
outOfRange: false
}));
} else {
result.push(Object.assign({}, network, {
saved: true,
outOfRange: isOutOfRange
}));
}
seen.add(network.ssid);
}
return result;
}
function sortedSavedWifiNetworks() {
const ssid = NetworkService.currentWifiSSID;
const pinnedList = root.getPinnedWifiNetworks();
let sorted = root.mergedSavedWifiNetworks();
sorted.sort((a, b) => {
const aPinnedIndex = pinnedList.indexOf(a.ssid);
const bPinnedIndex = pinnedList.indexOf(b.ssid);
if (aPinnedIndex !== -1 || bPinnedIndex !== -1) {
if (aPinnedIndex === -1)
return 1;
if (bPinnedIndex === -1)
return -1;
return aPinnedIndex - bPinnedIndex;
}
if (a.ssid === ssid)
return -1;
if (b.ssid === ssid)
return 1;
if ((a.outOfRange || false) !== (b.outOfRange || false))
return (a.outOfRange || false) ? 1 : -1;
if ((a.signal || 0) !== (b.signal || 0))
return (b.signal || 0) - (a.signal || 0);
return (a.ssid || "").localeCompare(b.ssid || "");
});
return sorted;
}
function showForgetNetworkConfirm(ssid) {
forgetNetworkConfirm.showWithOptions({
title: I18n.tr("Forget Network"),
message: I18n.tr("Forget \"%1\"?").arg(ssid),
confirmText: I18n.tr("Forget"),
confirmColor: Theme.error,
onConfirm: () => NetworkService.forgetWifiNetwork(ssid)
});
}
Column {
id: wifiSection
@@ -563,7 +640,7 @@ Item {
DankActionButton {
iconName: "qr_code"
buttonSize: 28
visible: modelData.secured && modelData.saved
visible: modelData.secured && modelData.saved && !(modelData.enterprise || false)
onClicked: {
PopoutService.showWifiQRCodeModal(modelData.ssid);
}
@@ -584,13 +661,7 @@ Item {
iconColor: Theme.error
visible: modelData.saved || isConnected
onClicked: {
forgetNetworkConfirm.showWithOptions({
title: I18n.tr("Forget Network"),
message: I18n.tr("Forget \"%1\"?").arg(modelData.ssid),
confirmText: I18n.tr("Forget"),
confirmColor: Theme.error,
onConfirm: () => NetworkService.forgetWifiNetwork(modelData.ssid)
});
root.showForgetNetworkConfirm(modelData.ssid);
}
}
}
@@ -603,15 +674,10 @@ Item {
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
if (isConnected) {
NetworkService.disconnectWifi();
return;
}
if (modelData.secured && !modelData.saved && (DMSService.apiVersion < 7 || modelData.enterprise)) {
PopoutService.showWifiPasswordModal(modelData.ssid);
return;
}
NetworkService.connectToWifi(modelData.ssid);
WifiConnectionActions.connectToNetwork(modelData, {
connected: isConnected,
disconnectWhenConnected: true
});
}
}
}
@@ -756,6 +822,420 @@ Item {
}
}
}
SettingsCard {
id: savedWifiCard
readonly property var savedNetworks: root.sortedSavedWifiNetworks()
width: parent.width
title: I18n.tr("Saved Networks")
iconName: "bookmark"
settingKey: "networkSavedWifi"
tags: ["wifi", "wi-fi", "wireless", "network", "saved", "known", "ssid", "autoconnect", "forget"]
collapsible: true
expanded: false
visible: savedNetworks.length > 0
headerActions: [
StyledText {
text: savedWifiCard.savedNetworks.length
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
verticalAlignment: Text.AlignVCenter
}
]
Column {
width: parent.width
spacing: 4
Repeater {
model: savedWifiCard.expanded ? savedWifiCard.savedNetworks : []
delegate: Rectangle {
id: savedWifiDelegate
required property var modelData
required property int index
readonly property bool isConnected: modelData.ssid === NetworkService.currentWifiSSID
readonly property bool isPinned: root.getPinnedWifiNetworks().includes(modelData.ssid)
readonly property bool isOutOfRange: modelData.outOfRange || false
readonly property bool isExpanded: !isOutOfRange && root.expandedSavedWifiSsid === modelData.ssid
width: parent.width
height: isExpanded ? 56 + savedWifiExpandedContent.height : 56
radius: Theme.cornerRadius
color: savedWifiMouseArea.containsMouse ? Theme.primaryHoverLight : Theme.surfaceLight
border.width: isConnected ? 2 : 0
border.color: Theme.primary
clip: true
Behavior on height {
NumberAnimation {
duration: 150
easing.type: Easing.OutQuad
}
}
Column {
anchors.fill: parent
spacing: 0
Item {
width: parent.width
height: 56
Row {
anchors.left: parent.left
anchors.leftMargin: Theme.spacingM
anchors.verticalCenter: parent.verticalCenter
anchors.right: savedWifiActions.left
anchors.rightMargin: Theme.spacingS
spacing: Theme.spacingS
DankIcon {
name: {
if (isOutOfRange)
return "wifi_off";
const s = modelData.signal || 0;
if (s >= 50)
return "wifi";
if (s >= 25)
return "wifi_2_bar";
return "wifi_1_bar";
}
size: 20
color: isConnected ? Theme.primary : Theme.surfaceText
anchors.verticalCenter: parent.verticalCenter
}
Column {
anchors.verticalCenter: parent.verticalCenter
spacing: 2
width: parent.width - 20 - Theme.spacingS
Row {
anchors.left: parent.left
spacing: Theme.spacingXS
width: parent.width
StyledText {
text: modelData.ssid || I18n.tr("Unknown")
font.pixelSize: Theme.fontSizeMedium
color: isConnected ? Theme.primary : Theme.surfaceText
font.weight: isConnected ? Font.Medium : Font.Normal
elide: Text.ElideRight
width: Math.max(0, parent.width - (savedWifiHiddenIcon.visible ? savedWifiHiddenIcon.width + Theme.spacingXS : 0))
}
DankIcon {
id: savedWifiHiddenIcon
name: "visibility_off"
size: 14
color: Theme.surfaceVariantText
visible: modelData.hidden || false
anchors.verticalCenter: parent.verticalCenter
}
}
StyledText {
text: {
const parts = [isConnected ? I18n.tr("Connected") : (modelData.secured ? I18n.tr("Secured") : I18n.tr("Open"))];
parts.push(isOutOfRange ? I18n.tr("Unavailable") : (modelData.signal || 0) + "%");
if (modelData.hidden || false)
parts.push(I18n.tr("Hidden"));
return parts.join(" • ");
}
font.pixelSize: Theme.fontSizeSmall
color: isConnected ? Theme.primary : Theme.surfaceVariantText
width: parent.width
elide: Text.ElideRight
}
}
}
Row {
id: savedWifiActions
anchors.right: parent.right
anchors.rightMargin: Theme.spacingS
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingXS
Rectangle {
width: 28
height: 28
radius: 14
color: savedWifiExpandBtn.containsMouse ? Theme.surfacePressed : "transparent"
visible: !isOutOfRange
DankIcon {
anchors.centerIn: parent
name: isExpanded ? "expand_less" : "expand_more"
size: 18
color: Theme.surfaceText
}
MouseArea {
id: savedWifiExpandBtn
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
if (isExpanded) {
root.expandedSavedWifiSsid = "";
} else {
root.expandedSavedWifiSsid = modelData.ssid;
}
}
}
}
DankActionButton {
iconName: "qr_code"
buttonSize: 28
visible: modelData.secured && !(modelData.enterprise || false)
onClicked: {
PopoutService.showWifiQRCodeModal(modelData.ssid);
}
}
DankActionButton {
iconName: "push_pin"
buttonSize: 28
iconColor: isPinned ? Theme.primary : Theme.surfaceVariantText
onClicked: {
root.toggleWifiPin(modelData.ssid);
}
}
DankActionButton {
id: savedWifiMoreButton
iconName: "more_horiz"
buttonSize: 28
onClicked: {
if (savedWifiMenu.visible) {
savedWifiMenu.close();
return;
}
savedWifiMenu.popup(savedWifiMoreButton, -savedWifiMenu.width + savedWifiMoreButton.width, savedWifiMoreButton.height + Theme.spacingXS);
}
}
}
MouseArea {
id: savedWifiMouseArea
anchors.fill: parent
anchors.rightMargin: savedWifiActions.width + Theme.spacingM
hoverEnabled: true
cursorShape: isOutOfRange ? Qt.ArrowCursor : Qt.PointingHandCursor
onClicked: {
if (isOutOfRange)
return;
if (isExpanded) {
root.expandedSavedWifiSsid = "";
} else {
root.expandedSavedWifiSsid = modelData.ssid;
}
}
}
}
Column {
id: savedWifiExpandedContent
width: parent.width
visible: isExpanded
Rectangle {
width: parent.width - Theme.spacingM * 2
height: 1
x: Theme.spacingM
color: Theme.outlineLight
}
Item {
width: parent.width
height: savedWifiDetailsColumn.implicitHeight + Theme.spacingM * 2
Column {
id: savedWifiDetailsColumn
anchors.fill: parent
anchors.margins: Theme.spacingM
spacing: Theme.spacingS
Flow {
width: parent.width
spacing: Theme.spacingXS
Repeater {
model: {
const fields = [];
const net = modelData;
if (!net)
return fields;
fields.push({
label: I18n.tr("Signal"),
value: (net.signal || 0) + "%"
});
if (net.frequency)
fields.push({
label: I18n.tr("Frequency"),
value: (net.frequency / 1000).toFixed(1) + " GHz"
});
if (net.channel)
fields.push({
label: I18n.tr("Channel"),
value: String(net.channel)
});
if (net.rate)
fields.push({
label: I18n.tr("Rate"),
value: net.rate + " Mbps"
});
if (net.mode)
fields.push({
label: I18n.tr("Mode"),
value: net.mode
});
if (net.bssid)
fields.push({
label: I18n.tr("BSSID"),
value: net.bssid
});
fields.push({
label: I18n.tr("Security"),
value: net.secured ? (net.enterprise ? I18n.tr("Enterprise") : I18n.tr("WPA/WPA2")) : I18n.tr("Open")
});
return fields;
}
delegate: Rectangle {
required property var modelData
required property int index
width: savedWifiFieldContent.width + Theme.spacingM * 2
height: 32
radius: Theme.cornerRadius - 2
color: Theme.surfaceContainerHigh
border.width: 1
border.color: Theme.outlineLight
Row {
id: savedWifiFieldContent
anchors.centerIn: parent
spacing: Theme.spacingXS
StyledText {
text: modelData.label + ":"
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
anchors.verticalCenter: parent.verticalCenter
}
StyledText {
text: modelData.value
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
anchors.verticalCenter: parent.verticalCenter
}
}
}
}
}
}
}
}
}
Menu {
id: savedWifiMenu
width: 170
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent
background: Rectangle {
color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency)
radius: Theme.cornerRadius
border.width: 0
}
MenuItem {
text: isConnected ? I18n.tr("Disconnect") : I18n.tr("Connect")
height: isOutOfRange ? 0 : 32
visible: !isOutOfRange
contentItem: StyledText {
text: parent.text
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
leftPadding: Theme.spacingS
verticalAlignment: Text.AlignVCenter
}
background: Rectangle {
color: parent.hovered ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.08) : "transparent"
radius: Theme.cornerRadius / 2
}
onTriggered: {
WifiConnectionActions.connectToNetwork(modelData, {
connected: isConnected,
disconnectWhenConnected: true
});
}
}
MenuItem {
text: modelData.autoconnect ? I18n.tr("Disable Autoconnect") : I18n.tr("Enable Autoconnect")
height: DMSService.apiVersion > 13 ? 32 : 0
visible: DMSService.apiVersion > 13
contentItem: StyledText {
text: parent.text
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
leftPadding: Theme.spacingS
verticalAlignment: Text.AlignVCenter
}
background: Rectangle {
color: parent.hovered ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.08) : "transparent"
radius: Theme.cornerRadius / 2
}
onTriggered: {
NetworkService.setWifiAutoconnect(modelData.ssid, !(modelData.autoconnect || false));
}
}
MenuItem {
text: I18n.tr("Forget Network")
height: 32
contentItem: StyledText {
text: parent.text
font.pixelSize: Theme.fontSizeSmall
color: Theme.error
leftPadding: Theme.spacingS
verticalAlignment: Text.AlignVCenter
}
background: Rectangle {
color: parent.hovered ? Qt.rgba(Theme.error.r, Theme.error.g, Theme.error.b, 0.08) : "transparent"
radius: Theme.cornerRadius / 2
}
onTriggered: {
root.showForgetNetworkConfirm(modelData.ssid);
}
}
}
}
}
}
}
}
}
}
+17
View File
@@ -131,6 +131,23 @@ Item {
checked: SettingsData.soundPluggedIn
onToggled: checked => SettingsData.set("soundPluggedIn", checked)
}
Rectangle {
width: parent.width
height: 1
color: Theme.outline
opacity: 0.2
}
SettingsToggleRow {
tab: "sounds"
tags: ["sound", "media", "playback", "mute", "mpris", "music"]
settingKey: "muteSoundsWhenMediaPlaying"
text: I18n.tr("Mute During Playback")
description: I18n.tr("Silence system sounds while media is playing")
checked: SettingsData.muteSoundsWhenMediaPlaying
onToggled: checked => SettingsData.set("muteSoundsWhenMediaPlaying", checked)
}
}
}
+58 -30
View File
@@ -20,6 +20,31 @@ Item {
property var cachedMatugenSchemes: Theme.availableMatugenSchemes.map(option => option.label)
property var installedRegistryThemes: []
property var templateDetection: []
readonly property var widgetBackgroundOptions: [({
"value": "sth",
"label": I18n.tr("Subtle Overlay", "widget background color option")
}), ({
"value": "s",
"label": I18n.tr("Surface", "widget background color option")
}), ({
"value": "sc",
"label": I18n.tr("Surface Container", "widget background color option")
}), ({
"value": "sch",
"label": I18n.tr("Surface High", "widget background color option")
}), ({
"value": "primaryContainer",
"label": I18n.tr("Primary Container", "widget background color option")
}), ({
"value": "secondaryContainer",
"label": I18n.tr("Secondary Container", "widget background color option")
}), ({
"value": "tertiaryContainer",
"label": I18n.tr("Tertiary Container", "widget background color option")
}), ({
"value": "custom",
"label": I18n.tr("Custom", "widget background color option")
})]
property var cursorIncludeStatus: ({
"exists": false,
@@ -1524,10 +1549,10 @@ Item {
SettingsButtonGroupRow {
tab: "theme"
tags: ["widget", "style", "colorful", "default"]
tags: ["widget", "text", "style", "colorful", "default"]
settingKey: "widgetColorMode"
text: I18n.tr("Widget Style")
description: I18n.tr("Change bar appearance")
text: I18n.tr("Widget Text Style")
description: I18n.tr("Choose neutral or accent-colored widget text")
model: [I18n.tr("Default", "widget style option"), I18n.tr("Colorful", "widget style option")]
currentIndex: SettingsData.widgetColorMode === "colorful" ? 1 : 0
onSelectionChanged: (index, selected) => {
@@ -1537,38 +1562,41 @@ Item {
}
}
SettingsButtonGroupRow {
WorkspaceColorRow {
tab: "theme"
tags: ["widget", "background", "color"]
tags: ["widget", "background", "color", "surface", "material"]
settingKey: "widgetBackgroundColor"
text: I18n.tr("Widget Background Color")
description: I18n.tr("Choose the background color for widgets")
model: ["sth", "s", "sc", "sch"]
buttonHeight: 20
minButtonWidth: 32
buttonPadding: Theme.spacingS
checkIconSize: Theme.iconSizeSmall - 2
textSize: Theme.fontSizeSmall - 2
spacing: 1
currentIndex: {
switch (SettingsData.widgetBackgroundColor) {
case "sth":
return 0;
case "s":
return 1;
case "sc":
return 2;
case "sch":
return 3;
default:
return 0;
dropdownWidth: 220
options: themeColorsTab.widgetBackgroundOptions
currentMode: SettingsData.widgetBackgroundColor
customColor: SettingsData.widgetBackgroundCustomColor || "#6750A4"
pickerTitle: I18n.tr("Widget Background Color")
onModeSelected: mode => SettingsData.set("widgetBackgroundColor", mode)
onCustomColorSelected: selectedColor => SettingsData.set("widgetBackgroundCustomColor", selectedColor.toString())
}
}
onSelectionChanged: (index, selected) => {
if (!selected)
return;
const colorOptions = ["sth", "s", "sc", "sch"];
SettingsData.set("widgetBackgroundColor", colorOptions[index]);
SettingsSliderRow {
id: widgetBackgroundCustomStrengthSlider
visible: SettingsData.widgetBackgroundColor === "custom"
tab: "theme"
tags: ["widget", "background", "color", "custom", "blend"]
settingKey: "widgetBackgroundCustomStrength"
text: I18n.tr("Custom Blend")
description: I18n.tr("Blend between Surface High and the selected custom color")
value: Math.round(SettingsData.widgetBackgroundCustomStrength * 100)
minimum: 0
maximum: 100
unit: "%"
defaultValue: 40
onSliderValueChanged: newValue => SettingsData.set("widgetBackgroundCustomStrength", newValue / 100)
Binding {
target: widgetBackgroundCustomStrengthSlider
property: "value"
value: Math.round(SettingsData.widgetBackgroundCustomStrength * 100)
restoreMode: Binding.RestoreBinding
}
}
@@ -143,15 +143,6 @@ Item {
}
}
DankButton {
text: I18n.tr("Launch DankCalendar")
iconName: "calendar_month"
backgroundColor: Theme.primary
textColor: Theme.primaryText
visible: CalendarService.dankNeedsLaunch && CalendarService.dankBinaryExists
onClicked: CalendarService.launchDankCalendar()
}
Rectangle {
width: parent.width
height: 1
@@ -4,41 +4,195 @@ import qs.Services
import qs.Modules.Settings.Widgets
SettingsCard {
id: root
iconName: "palette"
title: I18n.tr("Workspace Appearance")
settingKey: "workspaceAppearance"
collapsible: true
expanded: false
SettingsButtonGroupRow {
readonly property var focusedColorOptions: [({
"value": "default",
"label": I18n.tr("Primary", "workspace color option")
}), ({
"value": "primaryContainer",
"label": I18n.tr("Primary Container", "workspace color option")
}), ({
"value": "secondary",
"label": I18n.tr("Secondary", "workspace color option")
}), ({
"value": "secondaryContainer",
"label": I18n.tr("Secondary Container", "workspace color option")
}), ({
"value": "tertiary",
"label": I18n.tr("Tertiary", "workspace color option")
}), ({
"value": "tertiaryContainer",
"label": I18n.tr("Tertiary Container", "workspace color option")
}), ({
"value": "s",
"label": I18n.tr("Surface", "workspace color option")
}), ({
"value": "sc",
"label": I18n.tr("Surface Container", "workspace color option")
}), ({
"value": "sch",
"label": I18n.tr("Surface High", "workspace color option")
}), ({
"value": "schh",
"label": I18n.tr("Surface Highest", "workspace color option")
}), ({
"value": "none",
"label": I18n.tr("None", "workspace color option")
}), ({
"value": "custom",
"label": I18n.tr("Custom", "workspace color option")
})]
readonly property var occupiedColorOptions: [({
"value": "none",
"label": I18n.tr("None", "workspace color option")
}), ({
"value": "primary",
"label": I18n.tr("Primary", "workspace color option")
}), ({
"value": "primaryContainer",
"label": I18n.tr("Primary Container", "workspace color option")
}), ({
"value": "sec",
"label": I18n.tr("Secondary", "workspace color option")
}), ({
"value": "secondaryContainer",
"label": I18n.tr("Secondary Container", "workspace color option")
}), ({
"value": "tertiary",
"label": I18n.tr("Tertiary", "workspace color option")
}), ({
"value": "tertiaryContainer",
"label": I18n.tr("Tertiary Container", "workspace color option")
}), ({
"value": "s",
"label": I18n.tr("Surface", "workspace color option")
}), ({
"value": "sc",
"label": I18n.tr("Surface Container", "workspace color option")
}), ({
"value": "sch",
"label": I18n.tr("Surface High", "workspace color option")
}), ({
"value": "schh",
"label": I18n.tr("Surface Highest", "workspace color option")
}), ({
"value": "custom",
"label": I18n.tr("Custom", "workspace color option")
})]
readonly property var unfocusedColorOptions: [({
"value": "default",
"label": I18n.tr("Default", "workspace color option")
}), ({
"value": "surfaceText",
"label": I18n.tr("Surface Text", "workspace color option")
}), ({
"value": "primary",
"label": I18n.tr("Primary", "workspace color option")
}), ({
"value": "secondary",
"label": I18n.tr("Secondary", "workspace color option")
}), ({
"value": "tertiary",
"label": I18n.tr("Tertiary", "workspace color option")
}), ({
"value": "s",
"label": I18n.tr("Surface", "workspace color option")
}), ({
"value": "sc",
"label": I18n.tr("Surface Container", "workspace color option")
}), ({
"value": "sch",
"label": I18n.tr("Surface High", "workspace color option")
}), ({
"value": "schh",
"label": I18n.tr("Surface Highest", "workspace color option")
}), ({
"value": "custom",
"label": I18n.tr("Custom", "workspace color option")
})]
readonly property var urgentColorOptions: [({
"value": "default",
"label": I18n.tr("Error", "workspace color option")
}), ({
"value": "primary",
"label": I18n.tr("Primary", "workspace color option")
}), ({
"value": "primaryContainer",
"label": I18n.tr("Primary Container", "workspace color option")
}), ({
"value": "secondary",
"label": I18n.tr("Secondary", "workspace color option")
}), ({
"value": "secondaryContainer",
"label": I18n.tr("Secondary Container", "workspace color option")
}), ({
"value": "tertiary",
"label": I18n.tr("Tertiary", "workspace color option")
}), ({
"value": "tertiaryContainer",
"label": I18n.tr("Tertiary Container", "workspace color option")
}), ({
"value": "s",
"label": I18n.tr("Surface", "workspace color option")
}), ({
"value": "sc",
"label": I18n.tr("Surface Container", "workspace color option")
}), ({
"value": "sch",
"label": I18n.tr("Surface High", "workspace color option")
}), ({
"value": "custom",
"label": I18n.tr("Custom", "workspace color option")
})]
readonly property var borderColorOptions: [({
"value": "surfaceText",
"label": I18n.tr("Surface Text", "workspace color option")
}), ({
"value": "primary",
"label": I18n.tr("Primary", "workspace color option")
}), ({
"value": "primaryContainer",
"label": I18n.tr("Primary Container", "workspace color option")
}), ({
"value": "secondary",
"label": I18n.tr("Secondary", "workspace color option")
}), ({
"value": "secondaryContainer",
"label": I18n.tr("Secondary Container", "workspace color option")
}), ({
"value": "tertiary",
"label": I18n.tr("Tertiary", "workspace color option")
}), ({
"value": "tertiaryContainer",
"label": I18n.tr("Tertiary Container", "workspace color option")
}), ({
"value": "custom",
"label": I18n.tr("Custom", "workspace color option")
})]
readonly property bool workspaceStateColorsVisible: CompositorService.isNiri || CompositorService.isHyprland || CompositorService.isMango
readonly property bool urgentWorkspaceColorsVisible: workspaceStateColorsVisible || CompositorService.isSway || CompositorService.isScroll || CompositorService.isMiracle
WorkspaceColorRow {
text: I18n.tr("Focused Color")
model: ["pri", "s", "sc", "sch", "none"]
buttonHeight: 22
minButtonWidth: 36
buttonPadding: Theme.spacingS
checkIconSize: Theme.iconSizeSmall - 2
textSize: Theme.fontSizeSmall - 1
spacing: 1
currentIndex: {
switch (SettingsData.workspaceColorMode) {
case "s":
return 1;
case "sc":
return 2;
case "sch":
return 3;
case "none":
return 4;
default:
return 0;
}
}
onSelectionChanged: (index, selected) => {
if (!selected)
return;
const modes = ["default", "s", "sc", "sch", "none"];
SettingsData.set("workspaceColorMode", modes[index]);
}
settingKey: "workspaceColorMode"
tags: ["workspace", "focused", "color", "custom"]
options: root.focusedColorOptions
currentMode: SettingsData.workspaceColorMode
customColor: SettingsData.workspaceFocusedCustomColor || "#6750A4"
onModeSelected: mode => SettingsData.set("workspaceColorMode", mode)
onCustomColorSelected: selectedColor => SettingsData.set("workspaceFocusedCustomColor", selectedColor.toString())
}
Rectangle {
@@ -48,38 +202,16 @@ SettingsCard {
opacity: 0.15
}
SettingsButtonGroupRow {
WorkspaceColorRow {
text: I18n.tr("Occupied Color")
model: ["none", "sec", "s", "sc", "sch", "schh"]
visible: CompositorService.isNiri || CompositorService.isHyprland || CompositorService.isMango
buttonHeight: 22
minButtonWidth: 36
buttonPadding: Theme.spacingS
checkIconSize: Theme.iconSizeSmall - 2
textSize: Theme.fontSizeSmall - 1
spacing: 1
currentIndex: {
switch (SettingsData.workspaceOccupiedColorMode) {
case "sec":
return 1;
case "s":
return 2;
case "sc":
return 3;
case "sch":
return 4;
case "schh":
return 5;
default:
return 0;
}
}
onSelectionChanged: (index, selected) => {
if (!selected)
return;
const modes = ["none", "sec", "s", "sc", "sch", "schh"];
SettingsData.set("workspaceOccupiedColorMode", modes[index]);
}
settingKey: "workspaceOccupiedColorMode"
tags: ["workspace", "occupied", "color", "custom"]
visible: root.workspaceStateColorsVisible
options: root.occupiedColorOptions
currentMode: SettingsData.workspaceOccupiedColorMode
customColor: SettingsData.workspaceOccupiedCustomColor || "#625B71"
onModeSelected: mode => SettingsData.set("workspaceOccupiedColorMode", mode)
onCustomColorSelected: selectedColor => SettingsData.set("workspaceOccupiedCustomColor", selectedColor.toString())
}
Rectangle {
@@ -90,33 +222,16 @@ SettingsCard {
visible: CompositorService.isNiri || CompositorService.isHyprland || CompositorService.isMango
}
SettingsButtonGroupRow {
WorkspaceColorRow {
text: I18n.tr("Unfocused Color")
model: ["def", "s", "sc", "sch"]
buttonHeight: 22
minButtonWidth: 36
buttonPadding: Theme.spacingS
checkIconSize: Theme.iconSizeSmall - 2
textSize: Theme.fontSizeSmall - 1
spacing: 1
currentIndex: {
switch (SettingsData.workspaceUnfocusedColorMode) {
case "s":
return 1;
case "sc":
return 2;
case "sch":
return 3;
default:
return 0;
}
}
onSelectionChanged: (index, selected) => {
if (!selected)
return;
const modes = ["default", "s", "sc", "sch"];
SettingsData.set("workspaceUnfocusedColorMode", modes[index]);
}
settingKey: "workspaceUnfocusedColorMode"
tags: ["workspace", "unfocused", "color", "custom"]
options: root.unfocusedColorOptions
defaultColor: Theme.surfaceText
currentMode: SettingsData.workspaceUnfocusedColorMode
customColor: SettingsData.workspaceUnfocusedCustomColor || "#49454E"
onModeSelected: mode => SettingsData.set("workspaceUnfocusedColorMode", mode)
onCustomColorSelected: selectedColor => SettingsData.set("workspaceUnfocusedCustomColor", selectedColor.toString())
}
Rectangle {
@@ -127,36 +242,17 @@ SettingsCard {
visible: CompositorService.isNiri || CompositorService.isHyprland || CompositorService.isMango || CompositorService.isSway || CompositorService.isScroll || CompositorService.isMiracle
}
SettingsButtonGroupRow {
WorkspaceColorRow {
text: I18n.tr("Urgent Color")
visible: CompositorService.isNiri || CompositorService.isHyprland || CompositorService.isMango || CompositorService.isSway || CompositorService.isScroll || CompositorService.isMiracle
model: ["err", "pri", "sec", "s", "sc"]
buttonHeight: 22
minButtonWidth: 36
buttonPadding: Theme.spacingS
checkIconSize: Theme.iconSizeSmall - 2
textSize: Theme.fontSizeSmall - 1
spacing: 1
currentIndex: {
switch (SettingsData.workspaceUrgentColorMode) {
case "primary":
return 1;
case "secondary":
return 2;
case "s":
return 3;
case "sc":
return 4;
default:
return 0;
}
}
onSelectionChanged: (index, selected) => {
if (!selected)
return;
const modes = ["default", "primary", "secondary", "s", "sc"];
SettingsData.set("workspaceUrgentColorMode", modes[index]);
}
settingKey: "workspaceUrgentColorMode"
tags: ["workspace", "urgent", "color", "custom"]
visible: root.urgentWorkspaceColorsVisible
options: root.urgentColorOptions
defaultColor: Theme.error
currentMode: SettingsData.workspaceUrgentColorMode
customColor: SettingsData.workspaceUrgentCustomColor || "#B3261E"
onModeSelected: mode => SettingsData.set("workspaceUrgentColorMode", mode)
onCustomColorSelected: selectedColor => SettingsData.set("workspaceUrgentCustomColor", selectedColor.toString())
}
Rectangle {
@@ -181,39 +277,16 @@ SettingsCard {
visible: SettingsData.workspaceFocusedBorderEnabled
leftPadding: Theme.spacingM
SettingsButtonGroupRow {
WorkspaceColorRow {
width: parent.width - parent.leftPadding
text: I18n.tr("Border Color")
model: [I18n.tr("Surface"), I18n.tr("Secondary"), I18n.tr("Primary")]
currentIndex: {
switch (SettingsData.workspaceFocusedBorderColor) {
case "surfaceText":
return 0;
case "secondary":
return 1;
case "primary":
return 2;
default:
return 2;
}
}
onSelectionChanged: (index, selected) => {
if (!selected)
return;
let newColor = "primary";
switch (index) {
case 0:
newColor = "surfaceText";
break;
case 1:
newColor = "secondary";
break;
case 2:
newColor = "primary";
break;
}
SettingsData.set("workspaceFocusedBorderColor", newColor);
}
settingKey: "workspaceFocusedBorderColor"
tags: ["workspace", "focused", "border", "color", "custom"]
options: root.borderColorOptions
currentMode: SettingsData.workspaceFocusedBorderColor
customColor: SettingsData.workspaceFocusedBorderCustomColor || "#6750A4"
onModeSelected: mode => SettingsData.set("workspaceFocusedBorderColor", mode)
onCustomColorSelected: selectedColor => SettingsData.set("workspaceFocusedBorderCustomColor", selectedColor.toString())
}
SettingsSliderRow {
@@ -0,0 +1,211 @@
pragma ComponentBehavior: Bound
import QtQuick
import qs.Common
import qs.Services
import qs.Widgets
import qs.Modules.Settings.Widgets
Column {
id: root
property string text: ""
property string description: ""
property string settingKey: ""
property string tab: ""
property var tags: []
property var options: []
property string currentMode: "default"
property color customColor: "#6750A4"
property string pickerTitle: text
property int dropdownWidth: 230
property color defaultColor: Theme.primary
readonly property var optionColorMap: {
var map = {};
for (var i = 0; i < options.length; i++)
map[options[i].label] = root.colorForValue(options[i].value);
return map;
}
function colorForValue(value) {
switch (value) {
case "primary":
case "pri":
return Theme.primary;
case "primaryContainer":
return Theme.primaryContainer;
case "secondary":
case "sec":
return Theme.secondary;
case "secondaryContainer":
return Theme.secondaryContainer;
case "tertiary":
case "ter":
return Theme.tertiary;
case "tertiaryContainer":
return Theme.tertiaryContainer;
case "surfaceText":
return Theme.surfaceText;
case "s":
return Theme.surface;
case "sc":
return Theme.surfaceContainer;
case "sch":
return Theme.surfaceContainerHigh;
case "schh":
return Theme.surfaceContainerHighest;
case "sth":
return Theme.surfaceTextHover;
case "error":
case "err":
return Theme.error;
case "custom":
return root.customColor;
case "none":
return "transparent";
default:
return root.defaultColor;
}
}
signal modeSelected(string mode)
signal customColorSelected(color selectedColor)
width: parent?.width ?? 0
spacing: Theme.spacingS
function optionLabels() {
return options.map(option => option.label);
}
function optionLabel(value) {
for (var i = 0; i < options.length; i++) {
if (options[i].value === value)
return options[i].label;
}
return options.length > 0 ? options[0].label : "";
}
function optionValue(label) {
for (var i = 0; i < options.length; i++) {
if (options[i].label === label)
return options[i].value;
}
return options.length > 0 ? options[0].value : "default";
}
function openCustomColorPicker() {
PopoutService.colorPickerModal.selectedColor = root.customColor;
PopoutService.colorPickerModal.pickerTitle = root.pickerTitle;
PopoutService.colorPickerModal.onColorSelectedCallback = function (selectedColor) {
root.customColorSelected(selectedColor);
root.modeSelected("custom");
};
PopoutService.colorPickerModal.show();
}
SettingsDropdownRow {
text: root.text
description: root.description
tab: root.tab
settingKey: root.settingKey
tags: root.tags
options: root.optionLabels()
optionColorMap: root.optionColorMap
currentValue: root.optionLabel(root.currentMode)
dropdownWidth: root.dropdownWidth
onValueChanged: value => root.modeSelected(root.optionValue(value))
}
Item {
width: parent.width
height: root.currentMode === "custom" ? customChip.height : 0
opacity: root.currentMode === "custom" ? 1 : 0
clip: true
Behavior on height {
NumberAnimation {
duration: Theme.mediumDuration
easing.type: Theme.emphasizedEasing
}
}
Behavior on opacity {
NumberAnimation {
duration: Theme.mediumDuration
easing.type: Theme.emphasizedEasing
}
}
Rectangle {
id: customChip
width: parent.width
height: 56
radius: Theme.cornerRadius
color: Theme.surfaceContainerHigh
Row {
anchors.fill: parent
anchors.leftMargin: Theme.spacingM
anchors.rightMargin: Theme.spacingM
spacing: Theme.spacingM
Rectangle {
width: 36
height: 36
radius: 18
color: root.customColor
border.color: Theme.outline
border.width: 1
anchors.verticalCenter: parent.verticalCenter
DankIcon {
anchors.centerIn: parent
name: "colorize"
size: 16
color: (root.customColor.r * 0.299 + root.customColor.g * 0.587 + root.customColor.b * 0.114) > 0.5 ? "#000000" : "#ffffff"
}
}
Column {
width: parent.width - 36 - editIcon.width - Theme.spacingM * 2
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingXS
StyledText {
text: I18n.tr("Custom Color")
font.pixelSize: Theme.fontSizeMedium
font.weight: Font.Medium
color: Theme.surfaceText
width: parent.width
horizontalAlignment: Text.AlignLeft
}
StyledText {
text: root.customColor.toString()
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
width: parent.width
elide: Text.ElideRight
horizontalAlignment: Text.AlignLeft
}
}
DankIcon {
id: editIcon
name: "edit"
size: Theme.iconSizeSmall
color: Theme.surfaceVariantText
anchors.verticalCenter: parent.verticalCenter
}
}
StateLayer {
stateColor: Theme.surfaceText
onClicked: root.openCustomColorPicker()
}
}
}
}
+10 -6
View File
@@ -589,38 +589,42 @@ EOFCONFIG
return MprisController.activePlayer?.isPlaying ?? false;
}
function shouldMuteForMedia() {
return SettingsData.muteSoundsWhenMediaPlaying && isMediaPlaying();
}
function playVolumeChangeSound() {
if (!soundsAvailable || !volumeChangeSound || notificationsAudioMuted || isMediaPlaying())
if (!soundsAvailable || !volumeChangeSound || notificationsAudioMuted || shouldMuteForMedia())
return;
volumeChangeSound.play();
}
function playPowerPlugSound() {
if (!soundsAvailable || !powerPlugSound || notificationsAudioMuted || isMediaPlaying())
if (!soundsAvailable || !powerPlugSound || notificationsAudioMuted || shouldMuteForMedia())
return;
powerPlugSound.play();
}
function playPowerUnplugSound() {
if (!soundsAvailable || !powerUnplugSound || notificationsAudioMuted || isMediaPlaying())
if (!soundsAvailable || !powerUnplugSound || notificationsAudioMuted || shouldMuteForMedia())
return;
powerUnplugSound.play();
}
function playNormalNotificationSound() {
if (!soundsAvailable || !normalNotificationSound || SessionData.doNotDisturb || notificationsAudioMuted || isMediaPlaying())
if (!soundsAvailable || !normalNotificationSound || SessionData.doNotDisturb || notificationsAudioMuted || shouldMuteForMedia())
return;
normalNotificationSound.play();
}
function playCriticalNotificationSound() {
if (!soundsAvailable || !criticalNotificationSound || SessionData.doNotDisturb || notificationsAudioMuted || isMediaPlaying())
if (!soundsAvailable || !criticalNotificationSound || SessionData.doNotDisturb || notificationsAudioMuted || shouldMuteForMedia())
return;
criticalNotificationSound.play();
}
function playLoginSound() {
if (!soundsAvailable || !loginSound || notificationsAudioMuted || isMediaPlaying()) {
if (!soundsAvailable || !loginSound || notificationsAudioMuted || shouldMuteForMedia()) {
return;
}
loginSound.play();
+9 -6
View File
@@ -103,15 +103,18 @@ Item {
}
function _applySocketPath(path) {
if (path === socketPath) {
if (socketFound && !connected)
requestSocket.connected = true;
return;
}
const changed = path !== socketPath;
if (changed)
log.info("dankcal socket discovered:", path);
if (!changed && connected)
return;
socketPath = path;
_reconnect();
}
function _reconnect() {
requestSocket.connected = false;
subscribeSocket.connected = false;
socketPath = path;
Qt.callLater(() => requestSocket.connected = true);
}
+1 -1
View File
@@ -34,7 +34,7 @@ Singleton {
readonly property bool dankConnected: dankBackend.connected
readonly property bool dankBinaryExists: dankBackend.binaryExists
readonly property bool dankNeedsLaunch: backendPref === "dankcal" && !dankBackend.connected
readonly property bool dankNeedsLaunch: backendPref === "dankcal" && !dankBackend.connected && !dankBackend.socketFound
property var calendars: dankBackend.calendars
property var eventsByDate: ({})
+19 -6
View File
@@ -69,6 +69,7 @@ Singleton {
property bool changingPreference: false
property string targetPreference: ""
property var savedWifiNetworks: []
readonly property int savedWifiStateApiVersion: 26
property string connectionStatus: ""
property string lastConnectionError: ""
property bool passwordDialogShouldReopen: false
@@ -309,18 +310,22 @@ Singleton {
if (state.wifiNetworks) {
wifiNetworks = state.wifiNetworks;
}
if (state.wifiNetworks || state.savedWifiNetworks) {
const hasSavedWifiState = DMSService.apiVersion >= savedWifiStateApiVersion && Array.isArray(state.savedWifiNetworks);
const sourceSavedNetworks = hasSavedWifiState ? state.savedWifiNetworks : (state.wifiNetworks || []).filter(network => network.saved);
const saved = [];
const mapping = {};
for (const network of state.wifiNetworks) {
if (network.saved) {
saved.push({
ssid: network.ssid,
saved: true
for (const network of sourceSavedNetworks) {
const normalized = Object.assign({}, network, {
saved: true,
outOfRange: hasSavedWifiState ? network.outOfRange === true : false
});
saved.push(normalized);
if (network?.ssid)
mapping[network.ssid] = network.ssid;
}
}
savedConnections = saved;
savedWifiNetworks = saved;
ssidToConnectionName = mapping;
@@ -596,6 +601,7 @@ Singleton {
}
wifiNetworks = updated;
networksUpdated();
Qt.callLater(() => refreshSavedWifiNetworks());
}
forgetSSID = "";
});
@@ -985,4 +991,11 @@ Singleton {
}
});
}
function refreshSavedWifiNetworks() {
if (!networkAvailable)
return;
getState();
}
}
+1
View File
@@ -53,6 +53,7 @@ Singleton {
signal lockRequested
signal fadeToLockRequested
signal cancelFadeToLock
signal dismissFadeToLock
signal fadeToDpmsRequested
signal cancelFadeToDpms
signal requestMonitorOff
+3 -1
View File
@@ -142,9 +142,11 @@ Singleton {
readonly property var savedConnections: wifiNetworks.filter(n => n.saved).map(n => ({
"ssid": n.ssid,
"saved": true
"saved": true,
"outOfRange": false
}))
readonly property var savedWifiNetworks: savedConnections
readonly property int savedWifiStateApiVersion: 26
readonly property var ssidToConnectionName: {
const map = {};
for (const n of wifiNetworks) {
+7
View File
@@ -54,6 +54,7 @@ Singleton {
property bool changingPreference: activeService?.changingPreference ?? false
property string targetPreference: activeService?.targetPreference ?? ""
property var savedWifiNetworks: activeService?.savedWifiNetworks ?? []
readonly property int savedWifiStateApiVersion: activeService?.savedWifiStateApiVersion ?? 26
property string connectionStatus: activeService?.connectionStatus ?? ""
property string lastConnectionError: activeService?.lastConnectionError ?? ""
property bool passwordDialogShouldReopen: activeService?.passwordDialogShouldReopen ?? false
@@ -180,6 +181,12 @@ Singleton {
}
}
function refreshSavedWifiNetworks() {
if (activeService && activeService.refreshSavedWifiNetworks) {
activeService.refreshSavedWifiNetworks();
}
}
function connectToWifi(ssid, password = "", username = "", anonymousIdentity = "", domainSuffixMatch = "") {
if (activeService && activeService.connectToWifi) {
activeService.connectToWifi(ssid, password, username, anonymousIdentity, domainSuffixMatch);
+8 -2
View File
@@ -756,8 +756,11 @@ Singleton {
function showWifiPasswordModal(ssid) {
if (wifiPasswordModalLoader)
wifiPasswordModalLoader.active = true;
if (wifiPasswordModal)
if (wifiPasswordModal) {
wifiPasswordModal.show(ssid);
} else {
Qt.callLater(() => wifiPasswordModal?.show(ssid));
}
}
function showWifiQRCodeModal(ssid) {
@@ -770,8 +773,11 @@ Singleton {
function showHiddenNetworkModal() {
if (wifiPasswordModalLoader)
wifiPasswordModalLoader.active = true;
if (wifiPasswordModal)
if (wifiPasswordModal) {
wifiPasswordModal.showHidden();
} else {
Qt.callLater(() => wifiPasswordModal?.showHidden());
}
}
function hideWifiPasswordModal() {
+54
View File
@@ -41,6 +41,7 @@ Singleton {
property string tailnetName: ""
property var selfNode: null
property var peers: []
property bool exitNodeAllowLanAccess: false
property bool available: false
property bool stateInitialized: false
@@ -56,6 +57,19 @@ Singleton {
readonly property var onlinePeers: allPeersList.filter(p => p.online)
// Peers that may be used as an exit node (offered && approved). Self is
// excluded: a node can never route through itself, and tailscaled rejects it.
readonly property var exitNodeOptions: allPeersList.filter(p => p && p.exitNodeOption && p !== selfNode)
// The currently selected exit node, or null if none is in use.
readonly property var currentExitNode: {
for (const p of allPeersList) {
if (p && p.exitNode)
return p;
}
return null;
}
readonly property var myPeers: {
if (!selfNode)
return allPeersList;
@@ -141,6 +155,7 @@ Singleton {
tailnetName = data.tailnetName || "";
selfNode = data.self || null;
peers = data.peers || [];
exitNodeAllowLanAccess = data.exitNodeAllowLanAccess || false;
}
function refresh(callback) {
@@ -152,6 +167,45 @@ Singleton {
});
}
// sendAction issues a state-changing request. The backend refreshes and
// broadcasts on success, so subscribers update without an extra getStatus.
function sendAction(method, params, callback) {
if (!available)
return;
DMSService.sendRequest(method, params, response => {
if (response.error) {
root.log.warn(method + " failed: " + response.error);
ToastService.showError(I18n.tr("Tailscale action failed", "Toast shown when a Tailscale write action is rejected"), response.error);
}
if (callback)
callback(response);
});
}
function connectTailscale(callback) {
sendAction("tailscale.connect", null, callback);
}
function disconnectTailscale(callback) {
sendAction("tailscale.disconnect", null, callback);
}
function setExitNode(id, callback) {
sendAction("tailscale.setExitNode", {
"id": id || ""
}, callback);
}
function clearExitNode(callback) {
setExitNode("", callback);
}
function setAllowLanAccess(enabled, callback) {
sendAction("tailscale.setAllowLanAccess", {
"enabled": enabled
}, callback);
}
function isMine(peer) {
const myOwner = selfNode ? (selfNode.owner || "") : "";
if (peer.owner === myOwner && myOwner !== "")
+252 -22
View File
@@ -43,6 +43,8 @@ Singleton {
property int lastFetchTime: 0
property int minFetchInterval: 30000
property int persistentRetryCount: 0
property int _geocodeReqId: 0
property var _pendingCoords: null
readonly property var lowPriorityCmd: ["nice", "-n", "19", "ionice", "-c3"]
readonly property var curlBaseCmd: ["curl", "-sS", "--fail", "--connect-timeout", "3", "--max-time", "6", "--limit-rate", "100k", "--compressed"]
@@ -452,16 +454,54 @@ Singleton {
if (!location) {
return null;
}
const params = ["latitude=" + location.latitude, "longitude=" + location.longitude, "current=temperature_2m,relative_humidity_2m,apparent_temperature,is_day,precipitation,weather_code,surface_pressure,wind_speed_10m", "daily=sunrise,sunset,temperature_2m_max,temperature_2m_min,weather_code,precipitation_probability_max", "hourly=temperature_2m,weather_code,precipitation_probability,wind_speed_10m,apparent_temperature,relative_humidity_2m,surface_pressure,visibility,cloud_cover", "timezone=auto", "forecast_days=7"];
return "https://api.open-meteo.com/v1/forecast?" + params.join('&');
return getWeatherApiUrlForCoords(location.latitude, location.longitude);
}
function getGeocodingUrl(query) {
return "https://geocoding-api.open-meteo.com/v1/search?name=" + encodeURIComponent(query) + "&count=1&language=en&format=json";
}
function getConfiguredLocationName() {
return SessionData.isGreeterMode ? GreetdSettings.weatherLocation : SettingsData.weatherLocation;
}
function setLocation(lat, lon, city, country) {
root.location = {
city: city || I18n.tr("Local Weather"),
country: country || "",
latitude: lat,
longitude: lon
};
}
function updateLocationCity(city, country) {
if (!root.location)
return;
root.location = {
latitude: root.location.latitude,
longitude: root.location.longitude,
city: city || root.location.city,
country: country || root.location.country
};
if (root.weather.available) {
root.weather = Object.assign({}, root.weather, {
city: city || root.weather.city,
country: country || root.weather.country
});
}
}
function getWeatherApiUrlForCoords(lat, lon) {
if (lat == null || lon == null)
return null;
const params = ["latitude=" + lat, "longitude=" + lon, "current=temperature_2m,relative_humidity_2m,apparent_temperature,is_day,precipitation,weather_code,surface_pressure,wind_speed_10m", "daily=sunrise,sunset,temperature_2m_max,temperature_2m_min,weather_code,precipitation_probability_max", "hourly=temperature_2m,weather_code,precipitation_probability,wind_speed_10m,apparent_temperature,relative_humidity_2m,surface_pressure,visibility,cloud_cover", "timezone=auto", "forecast_days=7"];
return "https://api.open-meteo.com/v1/forecast?" + params.join('&');
}
function addRef() {
refCount++;
@@ -490,20 +530,30 @@ Singleton {
const lat = parseFloat(parts[0]);
const lon = parseFloat(parts[1]);
if (!isNaN(lat) && !isNaN(lon)) {
if (cityName) {
// User provided both: trust the configured name and coordinates, skip geocoding
setLocation(lat, lon, cityName, "");
fetchWeather(lat, lon);
} else {
getLocationFromCoords(lat, lon);
}
return;
}
}
}
if (cityName)
if (cityName) {
getLocationFromCity(cityName);
} else {
root.handleWeatherFailure();
}
}
function getLocationFromCoords(lat, lon) {
const url = "https://nominatim.openstreetmap.org/reverse?lat=" + lat + "&lon=" + lon + "&format=json&addressdetails=1&accept-language=en";
reverseGeocodeFetcher.command = lowPriorityCmd.concat(curlBaseCmd).concat(["-H", "User-Agent: DankMaterialShell Weather Widget", url]);
reverseGeocodeFetcher.running = true;
// Use coordinates immediately for weather; resolve city name in parallel with fallbacks
setLocation(lat, lon, I18n.tr("Local Weather"), "");
fetchWeather(lat, lon);
resolveCityName(lat, lon);
}
function getLocationFromCity(city) {
@@ -512,20 +562,79 @@ Singleton {
}
function getLocationFromService() {
if (!LocationService.valid)
if (!LocationService.valid) {
getLocationFromIP();
return;
getLocationFromCoords(LocationService.latitude, LocationService.longitude);
}
function fetchWeather() {
const lat = LocationService.latitude;
const lon = LocationService.longitude;
if (lat === 0 && lon === 0) {
getLocationFromIP();
return;
}
getLocationFromCoords(lat, lon);
}
function getLocationFromIP() {
ipLocationFetcher.running = true;
}
function resolveCityName(lat, lon) {
// Cancel any in-flight city resolution to avoid stale updates
if (nominatimFetcher.running)
nominatimFetcher.running = false;
if (photonFetcher.running)
photonFetcher.running = false;
if (bigDataCloudFetcher.running)
bigDataCloudFetcher.running = false;
root._geocodeReqId++;
root._pendingCoords = {
latitude: lat,
longitude: lon,
reqId: root._geocodeReqId
};
tryNominatim(lat, lon, root._geocodeReqId);
}
function tryNominatim(lat, lon, reqId) {
const url = "https://nominatim.openstreetmap.org/reverse?lat=" + lat + "&lon=" + lon + "&format=json&addressdetails=1&accept-language=en";
nominatimFetcher.command = lowPriorityCmd.concat(curlBaseCmd).concat(["-H", "User-Agent: DankMaterialShell Weather Widget", url]);
nominatimFetcher.reqId = reqId;
nominatimFetcher.running = true;
}
function tryPhoton(lat, lon, reqId) {
const url = "https://photon.komoot.io/reverse?lat=" + lat + "&lon=" + lon + "&lang=en";
photonFetcher.command = lowPriorityCmd.concat(curlBaseCmd).concat([url]);
photonFetcher.reqId = reqId;
photonFetcher.running = true;
}
function tryBigDataCloud(lat, lon, reqId) {
const url = "https://api.bigdatacloud.net/data/reverse-geocode-client?latitude=" + lat + "&longitude=" + lon + "&localityLanguage=zh";
bigDataCloudFetcher.command = lowPriorityCmd.concat(curlBaseCmd).concat([url]);
bigDataCloudFetcher.reqId = reqId;
bigDataCloudFetcher.running = true;
}
function fetchWeather(lat, lon) {
if (root.refCount === 0 || !SettingsData.weatherEnabled) {
return;
}
if (lat == null || lon == null) {
if (!location) {
updateLocation();
return;
}
lat = location.latitude;
lon = location.longitude;
}
if (weatherFetcher.running) {
return;
@@ -536,7 +645,7 @@ Singleton {
return;
}
const apiUrl = getWeatherApiUrl();
const apiUrl = getWeatherApiUrlForCoords(lat, lon);
if (!apiUrl) {
return;
}
@@ -586,9 +695,123 @@ Singleton {
}
Process {
id: reverseGeocodeFetcher
id: nominatimFetcher
property int reqId: 0
running: false
stdout: StdioCollector {
onStreamFinished: {
if (nominatimFetcher.reqId !== root._geocodeReqId)
return;
const raw = text.trim();
if (!raw || raw[0] !== "{") {
root.tryPhoton(root._pendingCoords.latitude, root._pendingCoords.longitude, root._geocodeReqId);
return;
}
try {
const data = JSON.parse(raw);
const address = data.address || {};
const city = address.hamlet || address.city || address.town || address.village || I18n.tr("Unknown");
const country = address.country || I18n.tr("Unknown");
root.updateLocationCity(city, country);
} catch (e) {
root.tryPhoton(root._pendingCoords.latitude, root._pendingCoords.longitude, root._geocodeReqId);
}
}
}
onExited: exitCode => {
if (nominatimFetcher.reqId !== root._geocodeReqId)
return;
if (exitCode !== 0) {
root.tryPhoton(root._pendingCoords.latitude, root._pendingCoords.longitude, root._geocodeReqId);
}
}
}
Process {
id: photonFetcher
property int reqId: 0
running: false
stdout: StdioCollector {
onStreamFinished: {
if (photonFetcher.reqId !== root._geocodeReqId)
return;
const raw = text.trim();
if (!raw || raw[0] !== "{") {
root.tryBigDataCloud(root._pendingCoords.latitude, root._pendingCoords.longitude, root._geocodeReqId);
return;
}
try {
const data = JSON.parse(raw);
const features = data.features;
if (!features || features.length === 0) {
throw new Error("No Photon results");
}
const props = features[0].properties || {};
const city = props.city || props.town || props.village || props.locality || props.name || I18n.tr("Unknown");
const country = props.country || I18n.tr("Unknown");
root.updateLocationCity(city, country);
} catch (e) {
root.tryBigDataCloud(root._pendingCoords.latitude, root._pendingCoords.longitude, root._geocodeReqId);
}
}
}
onExited: exitCode => {
if (photonFetcher.reqId !== root._geocodeReqId)
return;
if (exitCode !== 0) {
root.tryBigDataCloud(root._pendingCoords.latitude, root._pendingCoords.longitude, root._geocodeReqId);
}
}
}
Process {
id: bigDataCloudFetcher
property int reqId: 0
running: false
stdout: StdioCollector {
onStreamFinished: {
if (bigDataCloudFetcher.reqId !== root._geocodeReqId)
return;
const raw = text.trim();
if (!raw || raw[0] !== "{") {
// All city resolution fallbacks failed; weather is already displayed
return;
}
try {
const data = JSON.parse(raw);
const city = data.city || data.locality || I18n.tr("Unknown");
const country = data.countryName || I18n.tr("Unknown");
root.updateLocationCity(city, country);
} catch (e) {
// All fallbacks failed; keep placeholder city name
}
}
}
onExited: exitCode => {
if (bigDataCloudFetcher.reqId !== root._geocodeReqId)
return;
// Final fallback; no further action needed
}
}
Process {
id: ipLocationFetcher
running: false
command: lowPriorityCmd.concat(curlBaseCmd).concat(["http://ip-api.com/json/"])
stdout: StdioCollector {
onStreamFinished: {
const raw = text.trim();
@@ -599,16 +822,21 @@ Singleton {
try {
const data = JSON.parse(raw);
const address = data.address || {};
root.location = {
city: address.hamlet || address.city || address.town || address.village || I18n.tr("Unknown"),
country: address.country || I18n.tr("Unknown"),
latitude: parseFloat(data.lat),
longitude: parseFloat(data.lon)
};
if (data.status === "fail") {
throw new Error("IP location lookup failed");
}
fetchWeather();
const lat = parseFloat(data.lat);
const lon = parseFloat(data.lon);
const city = data.city;
if (!city || isNaN(lat) || isNaN(lon)) {
throw new Error("Missing or invalid location data");
}
setLocation(lat, lon, city, data.countryName || "");
fetchWeather(lat, lon);
} catch (e) {
root.handleWeatherFailure();
}
@@ -833,8 +1061,10 @@ Singleton {
function onLocationChanged(data) {
if (!SettingsData.useAutoLocation)
return;
if (data.latitude === 0 && data.longitude === 0)
if (data.latitude === 0 && data.longitude === 0) {
root.getLocationFromIP();
return;
}
root.getLocationFromCoords(data.latitude, data.longitude);
}
}
+34 -2
View File
@@ -28,6 +28,7 @@ Item {
property var optionIcons: []
property bool enableFuzzySearch: false
property var optionIconMap: ({})
property var optionColorMap: ({})
function rebuildIconMap() {
const map = {};
@@ -160,7 +161,24 @@ Item {
anchors.rightMargin: Theme.spacingS
spacing: Theme.spacingS
Rectangle {
id: triggerSwatch
property var swatchColor: root.optionColorMap[root.currentValue]
width: 16
height: 16
radius: 8
color: swatchColor !== undefined ? swatchColor : "transparent"
border.color: Theme.outline
border.width: 1
anchors.verticalCenter: parent.verticalCenter
visible: swatchColor !== undefined
}
DankIcon {
id: triggerIcon
name: root.optionIconMap[root.currentValue] ?? ""
size: 18
color: Theme.surfaceText
@@ -173,7 +191,7 @@ Item {
text: root.currentValue !== "" ? root.currentValue : root.emptyText
font.pixelSize: Theme.fontSizeMedium
color: root.currentValue !== "" ? Theme.surfaceText : Theme.outline
width: contentRow.width - (contentRow.children[0].visible ? contentRow.children[0].width + contentRow.spacing : 0)
width: contentRow.width - (triggerSwatch.visible ? triggerSwatch.width + contentRow.spacing : 0) - (triggerIcon.visible ? triggerIcon.width + contentRow.spacing : 0)
elide: Text.ElideRight
wrapMode: Text.NoWrap
horizontalAlignment: Text.AlignLeft
@@ -406,6 +424,7 @@ Item {
property bool isSelected: dropdownMenu.selectedIndex === index
property bool isCurrentValue: root.currentValue === modelData
property string iconName: root.optionIconMap[modelData] ?? ""
property var swatchColor: root.optionColorMap[modelData]
width: ListView.view.width
height: 32
@@ -420,6 +439,19 @@ Item {
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingS
Rectangle {
id: optionSwatch
width: 16
height: 16
radius: 8
color: delegateRoot.swatchColor !== undefined ? delegateRoot.swatchColor : "transparent"
border.color: delegateRoot.isCurrentValue ? Theme.primary : Theme.outline
border.width: 1
anchors.verticalCenter: parent.verticalCenter
visible: delegateRoot.swatchColor !== undefined
}
DankIcon {
name: delegateRoot.iconName
size: 18
@@ -433,7 +465,7 @@ Item {
font.pixelSize: Theme.fontSizeMedium
color: delegateRoot.isCurrentValue ? Theme.primary : Theme.surfaceText
font.weight: delegateRoot.isCurrentValue ? Font.Medium : Font.Normal
width: root.popupWidth > 0 ? undefined : (delegateRoot.width - parent.x - Theme.spacingS * 2)
width: root.popupWidth > 0 ? undefined : (delegateRoot.width - parent.x - Theme.spacingS * 2 - (optionSwatch.visible ? optionSwatch.width + parent.spacing : 0))
elide: root.popupWidth > 0 ? Text.ElideNone : Text.ElideRight
wrapMode: Text.NoWrap
horizontalAlignment: Text.AlignLeft
+13 -2
View File
@@ -2,6 +2,8 @@ import QtQuick
import Quickshell
import Quickshell.Wayland
import qs.Common
import qs.Services
import qs.Widgets
PanelWindow {
id: root
@@ -69,12 +71,21 @@ PanelWindow {
}
}
WindowBlur {
targetWindow: root
blurX: 0
blurY: 0
blurWidth: root.visible ? root.width : 0
blurHeight: root.visible ? root.height : 0
blurRadius: Theme.cornerRadius
}
Rectangle {
anchors.fill: parent
color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency)
radius: Theme.cornerRadius
border.width: 1
border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08)
border.width: BlurService.enabled ? BlurService.borderWidth : 1
border.color: BlurService.enabled ? BlurService.borderColor : Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08)
StyledText {
id: textContent
+7 -1
View File
@@ -698,6 +698,12 @@ Item {
case Qt.Key_Shift:
case Qt.Key_Alt:
case Qt.Key_Meta:
// Lock keys are toggles, not useful bind targets; ignore
// them so toggling NumLock to pick the numpad keysym
// (KP_7 vs KP_Home) doesn't get captured as the bind.
case Qt.Key_NumLock:
case Qt.Key_CapsLock:
case Qt.Key_ScrollLock:
return;
}
@@ -720,7 +726,7 @@ Item {
mods.push("Shift");
}
const key = KeyUtils.xkbKeyFromQtKey(qtKey);
const key = KeyUtils.xkbKeyFromQtKey(qtKey, !!(event.modifiers & Qt.KeypadModifier));
if (!key) {
log.warn("Unknown key:", event.key, "mods:", event.modifiers);
return;
+1 -1
View File
@@ -1,4 +1,4 @@
;;; dank-emacs-theme.el --- Enhanced theme using Matugen SCSS variables with dank16 colors
;;; dank-emacs-theme.el --- Enhanced theme using Matugen SCSS variables with dank16 colors -*- lexical-binding: t; -*-
;; Copyright (C) 2025
+2 -1
View File
@@ -29,7 +29,8 @@ LANGUAGES = {
"nl": "nl.json",
"ru": "ru.json",
"de": "de.json",
"sv": "sv.json"
"sv": "sv.json",
"vi": "vi.json"
}
def error(msg):
File diff suppressed because it is too large Load Diff
@@ -452,8 +452,14 @@ def parse_tabs_from_sidebar(sidebar_file):
return tabs
def generate_tab_entries(sidebar_file):
def generate_tab_entries(sidebar_file, settings_entries=None):
tabs = parse_tabs_from_sidebar(sidebar_file)
settings_entries = settings_entries or []
highlightable_labels = {
(entry["tabIndex"], entry["label"])
for entry in settings_entries
if not str(entry["section"]).startswith("_tab_")
}
label_counts = Counter([t["label"] for t in tabs])
@@ -466,6 +472,9 @@ def generate_tab_entries(sidebar_file):
)
category = TAB_CATEGORY_MAP.get(tab["tabIndex"], "Settings")
if (tab["tabIndex"], label) in highlightable_labels:
continue
keywords = enrich_keywords(tab["label"], None, category, [])
if tab["parent"]:
@@ -543,7 +552,7 @@ def main():
print("Extracting settings search index...")
settings_entries = extract_settings_index(root_dir)
tab_entries = generate_tab_entries(sidebar_file)
tab_entries = generate_tab_entries(sidebar_file, settings_entries)
all_entries = tab_entries + settings_entries
+257 -41
View File
@@ -81,7 +81,7 @@
"%1 online": "%1 online"
},
"%1 tasks": {
"%1 tasks": ""
"%1 tasks": "%1 Aufgaben"
},
"%1 update": {
"%1 update": "%1 Update"
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1 Tag"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "1 Gerät verbunden"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": "1 Stunde 30 Minuten"
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1 Minute"
},
@@ -153,7 +159,10 @@
"1 second": "1 Sekunde"
},
"1 task": {
"1 task": ""
"1 task": "1 Aufgabe"
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 Minuten"
@@ -173,6 +182,9 @@
"15 min": {
"15 min": "15 Min."
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": "15 Minuten"
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": "30 Min."
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": "30 Minuten"
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": "45 Sekunden"
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 Minuten"
},
@@ -441,7 +459,7 @@
"Add a custom prefix to all application launches. This can be used for things like 'uwsm-app', 'systemd-run', or other command wrappers.": "Fügen Sie allen Anwendungsstarts ein benutzerdefiniertes Präfix hinzu. Dies kann für Dinge wie 'uwsm-app', 'systemd-run' oder andere Befehls-Wrapper verwendet werden."
},
"Add a task...": {
"Add a task...": ""
"Add a task...": "Aufgabe hinzufügen..."
},
"Add and configure widgets that appear on your desktop": {
"Add and configure widgets that appear on your desktop": "Widgets hinzufügen und konfigurieren, die auf Ihrem Desktop erscheinen"
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": "Über Adresse hinzufügen"
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": "Übereinstimmung hinzufügen"
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": "Den neuen Benutzer zur Gruppe „%1“ hinzufügen, damit er „dms greeter sync --profile“ ausführen kann."
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": "Zulassen"
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": "Klicks durch das Widget zulassen"
},
@@ -513,7 +540,7 @@
"Already on that session": "Bereits in dieser Sitzung"
},
"Also group repeated application icons on the active workspace": {
"Also group repeated application icons on the active workspace": ""
"Also group repeated application icons on the active workspace": "Wiederholte Anwendungssymbole auch auf dem aktiven Arbeitsbereich gruppieren"
},
"Alt+←/Backspace: Back • F1/I: File Info • F10: Help • Esc: Close": {
"Alt+←/Backspace: Back • F1/I: File Info • F10: Help • Esc: Close": "Alt+←/Zurück: Zurück • F1/I: Datei Info • F10: Hilfe • Esc: Schließen"
@@ -558,7 +585,7 @@
"Analyzing configuration...": "Konfiguration wird analysiert..."
},
"Anchor": {
"Anchor": ""
"Anchor": "Anker"
},
"Animation Duration": {
"Animation Duration": "Animationsdauer"
@@ -585,7 +612,7 @@
"App ID": "App-ID"
},
"App ID (e.g. firefox)": {
"App ID (e.g. firefox)": ""
"App ID (e.g. firefox)": "App-ID (z. B. firefox)"
},
"App ID Substitutions": {
"App ID Substitutions": "App-ID-Ersetzungen"
@@ -642,10 +669,10 @@
"Apply warm color temperature to reduce eye strain. Use automation settings below to control when it activates.": "Warmes Farbschema für weniger Augenbelastung. Automatisierungseinstellungen unten zur Aktivierung."
},
"Applying authentication changes...": {
"Applying authentication changes...": ""
"Applying authentication changes...": "Authentifizierungsänderungen werden angewendet..."
},
"Applying auto-login on startup...": {
"Applying auto-login on startup...": ""
"Applying auto-login on startup...": "Automatische Anmeldung beim Start wird angewendet..."
},
"Apps": {
"Apps": "Apps"
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": "Mindestens ein Ausgang muss aktiviert bleiben"
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": "Verbinden"
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "Auto (Breit)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "Automatischer Standort"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "Automatische Popup-Abstände"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": "Automatischer Modus ist aktiviert. Die manuelle Profilauswahl ist deaktiviert."
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "Automatisch löschen nach"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": "Automatische Anmeldung beim Start"
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "Auto-Speichern..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "Bilschirmsperrung aktivieren wenn das System in den Ruhemodus wechselt"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": "Automatisierung"
},
@@ -942,14 +987,17 @@
"Balanced palette with focused accents (default).": "Ausgewählte Farbpalette mit Akzenten (Standard)."
},
"Bar": {
"Bar": ""
"Bar": "Leiste"
},
"Bar %1": {
"Bar %1": ""
"Bar %1": "Leiste %1"
},
"Bar Configurations": {
"Bar Configurations": "Leistenkonfiguration"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": "Leistenschatten"
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": "Den Hintergrund hinter Leisten, Pop-outs, Modalen und Benachrichtigungen weichzeichnen. Erfordert Compositor-Unterstützung und Konfiguration."
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "Hintergrundbild weichzeichnen, wenn Niri-Übersicht geöffnet ist"
},
"Body": {
"Body": "Textkörper"
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": "Fett"
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": "Kalender"
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "Kamera"
},
@@ -1281,7 +1338,7 @@
"Checking for updates...": "Suche nach Updates..."
},
"Checking whether sudo authentication is needed...": {
"Checking whether sudo authentication is needed...": ""
"Checking whether sudo authentication is needed...": "Überprüfung, ob sudo-Authentifizierung erforderlich ist..."
},
"Checking...": {
"Checking...": "Prüfung..."
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": "Wählen Sie, ob eine Desktop-App oder ein Befehl gestartet werden soll"
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "Wählen Sie aus, welche Anzeigen dieses Widget anzeigen"
},
@@ -1650,7 +1710,7 @@
"Connecting to Device": "Verbinde Gerät"
},
"Connecting to clipboard service...": {
"Connecting to clipboard service...": ""
"Connecting to clipboard service...": "Verbindung zum Zwischenablagedienst wird hergestellt..."
},
"Connecting...": {
"Connecting...": "Verbinden..."
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "Steuert die Deckkraft aller Popouts, Modals und deren Inhaltsebenen"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": "Steuert Umrisse um weichgezeichnete Vordergrundkarten, Pillen und Benachrichtigungskarten"
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": "Steuert den Basis-Unschärferadius und den Versatz von Schatten"
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": "Steuert den äußeren Rand von protokoll-weichgezeichneten Fenstern"
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "Kritische Priorität"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": "Strg+Tab: Tab wechseln • Strg+S: Anpinnen/Lösen • Umschalt+Entf: Alles löschen • Esc: Schließen"
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "DankBar"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "DankMaterialShell ist einsatzbereit"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": "Standard-Launcher-Kurzbefehl"
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": "Standardmäßig wird geöffnet"
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "Geräteverbindungen"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": "Gerätenamen aktualisiert"
},
@@ -2238,7 +2340,7 @@
"Disabling WiFi...": "deaktiviere WLAN..."
},
"Disabling auto-login on startup...": {
"Disabling auto-login on startup...": ""
"Disabling auto-login on startup...": "Automatische Anmeldung beim Start wird deaktiviert..."
},
"Disc": {
"Disc": "Scheibe"
@@ -2304,7 +2406,7 @@
"Display all priorities over fullscreen apps": "Zeige alle Prioritäten über Fullscreen-Anwendungen"
},
"Display and switch MangoWC layouts": {
"Display and switch MangoWC layouts": ""
"Display and switch MangoWC layouts": "MangoWC-Layouts anzeigen und wechseln"
},
"Display application icons in workspace indicators": {
"Display application icons in workspace indicators": "Anwendungssymbole in Arbeitsbereichs-Indikatoren anzeigen"
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "Dock & Launcher"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "Dock Transparenz"
},
"Dock Visibility": {
"Dock Visibility": "Dock-Sichtbarkeit"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": "Dock-Rand, Transparenz und Rahmen"
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": "Kante, von der der Launcher hereingleitet"
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "App bearbeiten"
},
@@ -2480,8 +2591,11 @@
"Edit clipboard text": {
"Edit clipboard text": "Text der Zwischenablage bearbeiten"
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
"Editing changes on %1": "Bearbeite Änderungen an %1"
},
"Education": {
"Education": "Bildung"
@@ -2597,6 +2711,9 @@
"End": {
"End": "Ende"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": "Vergrößern beim Drüberfahren"
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "Ethernet"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": "Alle 15 Minuten"
},
@@ -2991,7 +3111,7 @@
"Failed to write autostart entry": "Autostart-Eintrag konnte nicht geschrieben werden"
},
"Failed to write outputs config.": {
"Failed to write outputs config.": ""
"Failed to write outputs config.": "Fehler beim Schreiben der Ausgabekonfiguration."
},
"Failed to write temp file for validation": {
"Failed to write temp file for validation": "Temporäre Datei zur Validierung konnte nicht geschrieben werden"
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": "Dateimanager"
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": "Dateimanager zum Öffnen des Papierkorbs. Wählen Sie „Benutzerdefiniert“, um einen eigenen Befehl einzugeben."
},
@@ -3114,19 +3237,19 @@
"Float": "Schwebend"
},
"Float Anchor": {
"Float Anchor": ""
"Float Anchor": "Schwebender Anker"
},
"Float X": {
"Float X": ""
"Float X": "Schwebend X"
},
"Float Y": {
"Float Y": ""
"Float Y": "Schwebend Y"
},
"Floating": {
"Floating": "Schwebend"
},
"Floating Position": {
"Floating Position": ""
"Floating Position": "Schwebende Position"
},
"Fluent": {
"Fluent": "Fließend"
@@ -3459,7 +3582,7 @@
"Group": "Gruppe"
},
"Group Active Workspace": {
"Group Active Workspace": ""
"Group Active Workspace": "Aktiven Arbeitsbereich gruppieren"
},
"Group Workspace Apps": {
"Group Workspace Apps": "Arbeitsbereich-Apps gruppieren"
@@ -3822,7 +3945,7 @@
"Inhibitable": "Unterdrückbar"
},
"Initial position for floating windows. Set both X and Y; anchor controls which corner/edge they're relative to.": {
"Initial position for floating windows. Set both X and Y; anchor controls which corner/edge they're relative to.": ""
"Initial position for floating windows. Set both X and Y; anchor controls which corner/edge they're relative to.": "Ursprüngliche Position für schwebende Fenster. Geben Sie sowohl X als auch Y an; der Anker steuert, auf welche Ecke/Kante sie sich beziehen."
},
"Initialised": {
"Initialised": "Initialisiert"
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": "Setzen Sie Ihren Sicherheitsschlüssel ein..."
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "Installieren"
},
@@ -3927,7 +4053,7 @@
"Invert on mode change": "Invertieren bei Moduswechsel"
},
"Invert touchpad scroll direction": {
"Invert touchpad scroll direction": ""
"Invert touchpad scroll direction": "Scrollrichtung des Touchpads umkehren"
},
"Iris Bloom": {
"Iris Bloom": "Iris-Blüte"
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "Änderungen beibehalten"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": "Tippen Sie weiter"
},
@@ -4254,10 +4386,10 @@
"Manages files and directories": "Verwaltet Dateien und Verzeichnisse"
},
"Mango Options": {
"Mango Options": ""
"Mango Options": "Mango-Optionen"
},
"Mango service not available": {
"Mango service not available": ""
"Mango service not available": "Mango-Dienst nicht verfügbar"
},
"MangoWC Layout Overrides": {
"MangoWC Layout Overrides": "MangoWC-Layout-Überschreibungen"
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "Manuelle Abstandsgröße"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "Manuelles Anzeigen/Verstecken"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": "Max. laufende Apps (0 = unbegrenzt)"
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": "Maximale Lautstärke"
},
@@ -4641,7 +4779,7 @@
"Native: platform renderer (FreeType).": "Nativ: Plattform-Renderer (FreeType)."
},
"Natural Touchpad Scrolling": {
"Natural Touchpad Scrolling": ""
"Natural Touchpad Scrolling": "Natürliches Scrollen (Touchpad)"
},
"Navigate": {
"Navigate": "Navigieren"
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "New York, NY"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "Neuer Gruppenname..."
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "Keine Helligkeitsgeräte verfügbar"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "Keine Änderungen"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": "Keine aktuellen Einträge in der Zwischenablage gefunden"
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": "Keine Ergebnisse"
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": "Keine Fensterregeln eingerichtet"
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": "Rauschen"
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "Notizblock Schriftart-Einstellungen"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "Notizen Ausklappmenü"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": "Nichts"
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": "Offener Rahmen"
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": "Öffnen Sie KDE Connect auf Ihrem Telefon"
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": "Einfügen"
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": "Pfad zu einer Videodatei oder einem Ordner mit Videos"
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": "Polkit-Integration ist deaktiviert. Die Benutzerverwaltung erfordert Polkit zur Rechteausweitung."
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": "Popout-Schatten"
},
@@ -5949,7 +6114,7 @@
"Refresh Weather": "Wetter aktualisieren"
},
"Refreshing...": {
"Refreshing...": ""
"Refreshing...": "Aktualisierung..."
},
"Regex": {
"Regex": "Regex"
@@ -5966,6 +6131,9 @@
"Release": {
"Release": "Loslassen"
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "Plugin neu laden"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": "Letzten Benutzer merken"
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "Entfernen"
},
@@ -6075,7 +6246,7 @@
"Requires DMS server with sysupdate capability": "Erfordert DMS-Server mit sysupdate-Funktion"
},
"Requires MangoWC compositor": {
"Requires MangoWC compositor": ""
"Requires MangoWC compositor": "Erfordert MangoWC-Compositor"
},
"Requires a newer version of Quickshell": {
"Requires a newer version of Quickshell": "Erfordert eine neuere Version von Quickshell"
@@ -6108,10 +6279,10 @@
"Resize Widget": "Widget-Größe ändern"
},
"Resize on Border": {
"Resize on Border": ""
"Resize on Border": "Größenänderung am Rand"
},
"Resize windows by dragging their edges with the mouse": {
"Resize windows by dragging their edges with the mouse": ""
"Resize windows by dragging their edges with the mouse": "Fenstergröße durch Ziehen der Ränder mit der Maus ändern"
},
"Resolution & Refresh": {
"Resolution & Refresh": "Auflösung & Bildwiederholrate"
@@ -6222,7 +6393,7 @@
"Running Apps Settings": "Einstellungen für laufende Applikationen"
},
"Running greeter sync...": {
"Running greeter sync...": ""
"Running greeter sync...": "Greeter-Synchronisierung wird ausgeführt..."
},
"Running in terminal": {
"Running in terminal": "Läuft im Terminal"
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": "Speichert..."
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "Skalierung"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": "Benachrichtigungsregeln festlegen"
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": "Einstellung"
},
@@ -6833,8 +7013,11 @@
"Show Workspace Apps": {
"Show Workspace Apps": "Zeige Applikationen von Arbeitsbereich"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
"Show all 9 tags instead of only occupied tags": "Alle 9 Tags anzeigen anstatt nur belegte Tags"
},
"Show an outline ring around the focused workspace indicator": {
"Show an outline ring around the focused workspace indicator": "Einen Umrissring um die Anzeige des fokussierten Arbeitsbereichs anzeigen"
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": "Benachrichtigungen stummschalten"
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "Größe"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": "Überspringen Sie das Greeter-Passwort nach dem Booten, bis Sie sich abmelden. Die Entsperrung des Sperrbildschirms bleibt unverändert. Tritt nach der Synchronisierung beim nächsten Neustart in Kraft."
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": "Klein"
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": "Zusammenfassung"
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "Sonnenaufgang"
},
@@ -7263,7 +7455,7 @@
"Tab/Shift+Tab: Nav • ←→↑↓: Grid Nav • Enter/Space: Select": "Tab/Shift+Tab: Navigation • ←→↑↓: Grid Nav • Enter/Leertaste: Auswählen"
},
"Tags": {
"Tags": ""
"Tags": "Tags"
},
"Tags: %1": {
"Tags: %1": "Tags: %1"
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "Zeit abgelaufen"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "Zeitüberschreitung für Benachrichtigungen mit kritischer Priorität"
},
@@ -7491,7 +7686,10 @@
"Title": "Titel"
},
"Title (optional)": {
"Title (optional)": ""
"Title (optional)": "Titel (optional)"
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": "Titel-Regex (optional)"
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "Nutze Raster Layout"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "Positionserkennung durch IP"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": "Verwendet die spotlight-bar IPC-Aktion und öffnet immer die minimale Leiste."
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": "Verwendet globale Monospace-Schriftart aus Einstellungen → Personalisierung"
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": "Verwendet geteilte Einstellungen von Gamma Control"
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "Sichtbarkeit"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": "Visuelle Effekte"
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "Widget Verwaltung"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "Widget-Umriss"
},
@@ -8205,7 +8418,7 @@
"Widgets": "Widgets"
},
"Widgets & Notifications": {
"Widgets & Notifications": ""
"Widgets & Notifications": "Widgets & Benachrichtigungen"
},
"Widgets, layout, style": {
"Widgets, layout, style": "Widgets, Layout, Stil"
@@ -8220,7 +8433,7 @@
"Width of the widget outline in pixels": "Breite des Widget-Umrisses in Pixeln"
},
"Width of window border": {
"Width of window border": ""
"Width of window border": "Breite des Fensterrahmens"
},
"Width of window border and focus ring": {
"Width of window border and focus ring": "Breite von Fensterrahmen und Fokusring"
@@ -8262,7 +8475,7 @@
"Wipe": "Wischen"
},
"Working...": {
"Working...": ""
"Working...": "Wird ausgeführt..."
},
"Workspace": {
"Workspace": "Arbeitsbereich"
@@ -8298,7 +8511,7 @@
"Write:": "Schreiben:"
},
"X": {
"X": ""
"X": "X"
},
"X Axis": {
"X Axis": "X-Achse"
@@ -8313,7 +8526,7 @@
"Xray blurs only the wallpaper (efficient) and is the default when Blur is on. Set Xray to Off for regular full blur of everything beneath the window (more expensive).": "X-Ray lässt nur das Hintergrundbild verschwimmen (effizient) und ist die Standardeinstellung, wenn Weichzeichnen aktiviert ist. Deaktivieren Sie X-Ray für ein normales, vollständiges Weichzeichnen von allem unter dem Fenster (ressourcenintensiver)."
},
"Y": {
"Y": ""
"Y": "Y"
},
"Y Axis": {
"Y Axis": "Y-Achse"
@@ -8426,6 +8639,9 @@
"featured": {
"featured": "Hervorgehoben"
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": "zuletzt gesehen %1"
},
@@ -8439,10 +8655,10 @@
"loginctl not available - lock integration requires DMS socket connection": "loginctl nicht verfügbar Sperrintegration erfordert DMS-Socket-Verbindung"
},
"mango: config reloaded": {
"mango: config reloaded": ""
"mango: config reloaded": "mango: Konfiguration neu geladen"
},
"mango: failed to reload config": {
"mango: failed to reload config": ""
"mango: failed to reload config": "mango: Fehler beim Neuladen der Konfiguration"
},
"mangowc Discord Server": {
"mangowc Discord Server": "mangowc Discord-Server"
+216
View File
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1 dia"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "1 dispositivo conectado"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": ""
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1 minuto"
},
@@ -155,6 +161,9 @@
"1 task": {
"1 task": ""
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 minutos"
},
@@ -173,6 +182,9 @@
"15 min": {
"15 min": ""
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": ""
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": ""
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": ""
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": ""
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 minutos"
},
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": ""
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": ""
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": ""
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": ""
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": ""
},
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": ""
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": ""
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "Auto (Ancho)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "Localización automática"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "Márgenes automáticos en popups"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": ""
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "Limpiar automáticamente despues"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": ""
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "Guardando automáticamente..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "Bloquear pantalla cuando el sistema se vaya a suspender"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": ""
},
@@ -950,6 +995,9 @@
"Bar Configurations": {
"Bar Configurations": "Configuración de barras"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": ""
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": ""
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "Aplicar desenfoque en la vista general de niri"
},
"Body": {
"Body": ""
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": ""
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": ""
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "Cámara"
},
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": ""
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "Elija qué pantallas muestran este widget"
},
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "Controla la opacidad de todas las ventanas emergentes, modales y sus capas de contenido."
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": ""
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": ""
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": ""
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "Prioridad Crítica"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": ""
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "DankBar"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "DankMaterialShell está listo para utilizarse"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": ""
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": ""
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "Conexiones de dispositivos"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": ""
},
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "Dock y Lanzador"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "Transparencia del dock"
},
"Dock Visibility": {
"Dock Visibility": "Visibilidad del dock"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": ""
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": ""
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": ""
},
@@ -2480,6 +2591,9 @@
"Edit clipboard text": {
"Edit clipboard text": ""
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
},
@@ -2597,6 +2711,9 @@
"End": {
"End": "Final"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": ""
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "Ethernet"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": ""
},
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": ""
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": ""
},
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": ""
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "Instalar"
},
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "Mantener cambios"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": ""
},
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "Tamaño de separación manual"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "Mostrar/Ocultar manualmente"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": ""
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": ""
},
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "New York, NY"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": ""
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "No hay dispositivos de brillo disponibles"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "Sin cambios"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": ""
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": ""
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": ""
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "Ajustes del bloc de notas"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "Bloc de notas"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": ""
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": ""
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": ""
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": ""
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": ""
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": ""
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": ""
},
@@ -5966,6 +6131,9 @@
"Release": {
"Release": ""
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "Reiniciar complemento"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": ""
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "Remover"
},
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": ""
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "Escala"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": ""
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": ""
},
@@ -6833,6 +7013,9 @@
"Show Workspace Apps": {
"Show Workspace Apps": "Mostrar aplicaciones en el espacio de trabajo"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
},
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": ""
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "Tamaño"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": ""
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": ""
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": ""
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "Amanecer"
},
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "Tiempo agotado"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "Tiempo de espera para notificaciones de prioridad crítica"
},
@@ -7493,6 +7688,9 @@
"Title (optional)": {
"Title (optional)": ""
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": ""
},
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "Usar diseño en cuadrícula"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "Usar la localización de la IP"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": ""
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": ""
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": ""
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "Visibilidad"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": ""
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "Gestión de widgets"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "Contorno en widgets"
},
@@ -8426,6 +8639,9 @@
"featured": {
"featured": ""
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": ""
},
+216
View File
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "۱ روز"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "1 دستگاه متصل"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": "۱ ساعت و نیم"
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "۱ دقیقه"
},
@@ -155,6 +161,9 @@
"1 task": {
"1 task": ""
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "۱۰ دقیقه"
},
@@ -173,6 +182,9 @@
"15 min": {
"15 min": "۱۵ دقیقه"
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": "۱۵ دقیقه"
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": "۳۰ دقیقه"
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": "۳۰ دقیقه"
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": "۴۵ ثانیه"
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "‍۵ دقیقه"
},
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": "افزودن با آدرس"
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": ""
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": "کاربر جدید را به گروه %1 اضافه کنید تا بتواند dms greeter sync --profile را اجرا کند."
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": "مجاز"
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": "اجازه بده کلیک ها از ابزارک عبور کنند"
},
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": "حداقل یک خروجی باید فعال بماند"
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": "پیوست"
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "خودکار (عریض)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "موقعیت مکانی خودکار"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "فاصله پاپ‌آپ خودکار"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": "حالت خودکار فعال است. انتخاب پروفایل دستی غیرفعال می‌باشد."
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "پاک‌کردن خودکار پس از"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": ""
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "درحال ذخیره خودکار..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "صفحه را هنگام آماده‌شدن سیستم برای تعلیق به صورت خودکار قفل کن"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": "خودکار‌سازی"
},
@@ -950,6 +995,9 @@
"Bar Configurations": {
"Bar Configurations": "پیکربندی نوار"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": "سایه نوارها"
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": "پس‌زمینه پشت نوار‌ها، پاپ‌آپ‌ها، مودال‌ها و اعلان‌ها را تار کن. به پشتیبانی و پیکربندی کامپازیتور نیاز دارد."
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "هنگامی که نمای کلی niri باز است تصویر پس‌زمینه را تار کن"
},
"Body": {
"Body": "بدنه"
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": "پررنگ"
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": "گاه‌شمار"
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "دوربین"
},
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": ""
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "انتخاب کنید که کدام نمایشگر‌ها این ابزارک را نشان دهند"
},
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "میزان شفافیت همه پاپ‌آپ‌ها، مودال‌ها و لایه‌های محتوای آنها را کنترل می‌کند"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": "خط بیرونی دور کارت‌های پیش‌زمینه، برچسب‌های گرد و کارت‌های اعلان تار را کنترل می‌کند"
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": "شعاع تاری پایه و آفست سایه را کنترل می‌کند"
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": "لبه بیرونی پنجره‌های تار شده با پروتکل را کنترل می‌کند"
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "اولویت حیاتی"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": "Ctrl+Tab: جابجایی بین تب‌ها • Ctrl+S: سنجاق/برداشتن سنجاق • Shift+Del: پاک کردن همه • Esc: بستن"
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "نوار دَنک"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "دَنک متریال شل آماده استفاده می‌باشد"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": "میانبر پیش‌فرض لانچر"
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": ""
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "اتصال‌های دستگاه"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": "نام دستگاه‌ها بروز شدند"
},
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "داک و لانچر"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "شفافیت داک"
},
"Dock Visibility": {
"Dock Visibility": "وضعیت نمایش داک"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": "فاصله داخلی، شفافیت و حاشیه داک"
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": "لبه‌ای که لانچر از آن بیرون می‌لغزد"
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "ویرایش برنامه"
},
@@ -2480,6 +2591,9 @@
"Edit clipboard text": {
"Edit clipboard text": "ویرایش متن کلیپ‌بورد"
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
},
@@ -2597,6 +2711,9 @@
"End": {
"End": "پایان"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": "بزرگنمایی با اشاره"
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "اترنت"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": "هر ۱۵ دقیقه"
},
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": "برنامه مدیریت فایل"
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": "مدیر فایل استفاده شده برای زباله‌دان. «سفارشی» را انتخاب کرده تا دستور خود را وارد کنید."
},
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": "کلید امنیتی خود را وارد کنید..."
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "نصب"
},
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "حفظ تغییرات"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": "به تایپ کردن ادامه دهید"
},
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "اندازه فاصله دستی"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "نمایش/پنهان دستی"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": "بیشینه برنامه‌های درحال اجرا (۰ = نامحدود)"
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": "حجم صدای بیشینه"
},
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "New York, NY"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "نام جدید گروه..."
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "هیچ دستگاه روشنایی موجود نیست"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "بدون تغییرات"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": "هیچ مدخل کلیپ‌بورد اخیری یافت نشد"
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": "بدون نتیجه"
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": "هیچ قاعده پنجره‌ای پیکربندی نشده"
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": ""
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "تنظیمات دفترچه یادداشت"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "دفترچه یادداشت کشویی"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": "هیچ"
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": "باز کردن قاب"
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": "برنامه KDE Connect را در گوشی خود باز کنید"
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": "الصاق"
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": "مسیر به فایل ویدئو یا پوشه‌ای که دارای ویدئوها است"
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": "یکپارچه‌سازی polkit غیرفعال است. مدیریت کاربر برای بالابردن دسترسی‌ها نیاز به polkit دارد."
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": "سایه پاپ‌آپ‌ها"
},
@@ -5966,6 +6131,9 @@
"Release": {
"Release": "رها کردن"
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "بارگذاری مجدد افزونه"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": "آخرین کاربر را به خاطر بسپار"
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "حذف"
},
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": "درحال ذخیره..."
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "بزرگنمایی"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": "تنظیم قوانین اعلان‌ها"
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": ""
},
@@ -6833,6 +7013,9 @@
"Show Workspace Apps": {
"Show Workspace Apps": "نمایش برنامه‌های محیط‌کار"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
},
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": "بی‌صدا کردن اعلان‌ها"
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "اندازه"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": ""
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": "کوچک"
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": "خلاصه"
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "طلوع"
},
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "زمان تمام شد"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "وقفه اعلان‌ها با اولویت حیاتی"
},
@@ -7493,6 +7688,9 @@
"Title (optional)": {
"Title (optional)": ""
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": "رجکس عنوان (اختیاری)"
},
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "استفاده از چیدمان جدولی"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "استفاده از موقعیت مکانی IP"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": "از IPC اقدام نوار اسپات‌لایت استفاده می‌کند و همیشه نوار کمینه را باز می‌کند."
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": "استفاده از قلم monospace سراسری از تنظیمات ← شخصی‌سازی"
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": "با استفاده از تنظیمات مشترک کنترل گاما"
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "دید"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": "افکت‌های بصری"
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "مدیریت ابزارک‌ها"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "خط بیرونی ابزارک"
},
@@ -8426,6 +8639,9 @@
"featured": {
"featured": "پیشنهادی"
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": "آخرین بازدید: %1"
},
+216
View File
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1 jour"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "1 appareil connecté"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": "1 heure et 30 minutes"
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1 minute"
},
@@ -155,6 +161,9 @@
"1 task": {
"1 task": ""
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 minutes"
},
@@ -173,6 +182,9 @@
"15 min": {
"15 min": ""
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": "15 minutes"
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": ""
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": "30 minutes"
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": "45 secondes"
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 minutes"
},
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": "Ajouter par adresse"
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": ""
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": ""
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": ""
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": "Autoriser les clics à travers le widget"
},
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": ""
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": "Attacher"
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "Auto (large)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "Localisation automatique"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "Espacements automatiques des fenêtres contextuelles"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": ""
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "Nettoyage automatique après"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": ""
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "Sauvegarde automatique..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "Verrouiller automatiquement l’écran lorsque le système se prépare à se mettre en veille"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": "Automatisation"
},
@@ -950,6 +995,9 @@
"Bar Configurations": {
"Bar Configurations": "Configurations de la barre"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": "Ombres de barre"
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": ""
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "Flouter le fond d’écran lorsque la vue densemble de Niri est ouverte"
},
"Body": {
"Body": "Corps"
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": ""
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": ""
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "Caméra"
},
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": ""
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "Choisir les écrans sur lesquels afficher ce widget"
},
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "Contrôle lopacité de toutes les fenêtres contextuelles, modales et de leurs couches de contenu"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": ""
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": ""
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": ""
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "Priorité critique"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": ""
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "DankBar"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "DankMaterialShell est prêt à lemploi"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": ""
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": ""
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "Connexions des périphériques"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": "Noms des appareils mis à jour"
},
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "Dock et lanceur"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "Transparence du dock"
},
"Dock Visibility": {
"Dock Visibility": "Visibilité du dock"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": ""
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": ""
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "Editer appli"
},
@@ -2480,6 +2591,9 @@
"Edit clipboard text": {
"Edit clipboard text": ""
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
},
@@ -2597,6 +2711,9 @@
"End": {
"End": "Fin"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": "Élargir lors du survol"
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "Ethernet"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": ""
},
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": ""
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": ""
},
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": ""
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "Installer"
},
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "Conserver les modifications"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": ""
},
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "Taille de lespacement manuel"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "Afficher / masquer manuellement"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": "Nombre maximum d'applis lancées (0 = illimité)"
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": "Volume max"
},
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "New York, NY"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "Nom du nouveau groupe..."
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "Aucun périphérique de réglage de la luminosité disponible"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "Aucune modification"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": "Aucune entrée récente trouvée dans le presse-papier"
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": ""
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": "Aucune règle de fenêtre configurée"
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": ""
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "Paramètres de police du bloc-notes"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "Panneau du bloc-notes"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": "Rien"
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": ""
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": "Ouvrir KDE Connect sur votre téléphone"
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": "Coller"
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": "Chemin vers un fichier vidéo ou dossier contenant des vidéos"
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": ""
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": ""
},
@@ -5966,6 +6131,9 @@
"Release": {
"Release": "Version"
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "Recharger le module"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": "Se souvenir du dernier utilisateur"
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "Supprimer"
},
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": "Sauvegarde..."
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "Échelle"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": "Définir les règles de notification"
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": ""
},
@@ -6833,6 +7013,9 @@
"Show Workspace Apps": {
"Show Workspace Apps": "Afficher les applications de lespace de travail"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
},
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": ""
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "Taille"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": ""
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": "Petit"
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": "Résumé"
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "Lever du soleil"
},
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "Temps écoulé"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "Durée daffichage des notifications critiques"
},
@@ -7493,6 +7688,9 @@
"Title (optional)": {
"Title (optional)": ""
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": "Regex du titre (optionnelle)"
},
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "Utiliser une disposition en grille"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "Utiliser la localisation IP"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": ""
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": ""
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": "Utiliser les réglages partagés de contrôle Gamma"
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "Visibilité"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": "Effets visuels"
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "Gestion des widgets"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "Contour du widget"
},
@@ -8426,6 +8639,9 @@
"featured": {
"featured": "À la une"
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": ""
},
+257 -41
View File
@@ -81,7 +81,7 @@
"%1 online": "%1 מקוונים"
},
"%1 tasks": {
"%1 tasks": ""
"%1 tasks": "%1 משימות"
},
"%1 update": {
"%1 update": "%1 עדכון"
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "יום אחד"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "התקן אחד מחובר"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": "שעה וחצי (ו30 דקות)"
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "דקה אחת"
},
@@ -153,7 +159,10 @@
"1 second": "שנייה אחת"
},
"1 task": {
"1 task": ""
"1 task": "משימה אחת"
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 דקות"
@@ -173,6 +182,9 @@
"15 min": {
"15 min": "15 דקות"
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": "15 דקות"
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": "30 דקות"
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": "30 דקות"
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": "45 שניות"
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 דקות"
},
@@ -441,7 +459,7 @@
"Add a custom prefix to all application launches. This can be used for things like 'uwsm-app', 'systemd-run', or other command wrappers.": "הוסף/י קידומת מותאמת אישית לכל הפעלות האפליקציות. ניתן להשתמש בזה עבור דברים כמו 'uwsm-app', 'systemd-run', או עוטפי פקודות אחרים."
},
"Add a task...": {
"Add a task...": ""
"Add a task...": "הוסף/י משימה..."
},
"Add and configure widgets that appear on your desktop": {
"Add and configure widgets that appear on your desktop": "הוסף/י והגדר/י ווידג׳טים שמופיעים על שולחן העבודה שלך"
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": "הוספה לפי כתובת"
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": "הוסף/י התאמה"
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": "הוסף/י את המשתמש/ת החדש/ה לקבוצה %1 כדי שיוכלו להריץ את הפקודה dms greeter sync --profile."
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": "אפשר/י"
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": "אפשר/י ללחיצות לעבור מבעד לווידג׳ט"
},
@@ -513,7 +540,7 @@
"Already on that session": "כבר בהפעלה זו"
},
"Also group repeated application icons on the active workspace": {
"Also group repeated application icons on the active workspace": ""
"Also group repeated application icons on the active workspace": "קבץ/י גם סמלי אפליקציות שחוזרים על עצמם בסביבת העבודה הפעילה"
},
"Alt+←/Backspace: Back • F1/I: File Info • F10: Help • Esc: Close": {
"Alt+←/Backspace: Back • F1/I: File Info • F10: Help • Esc: Close": "Alt+←/Backspace: חזרה • F1/I: מידע על הקובץ • F10: עזרה • Esc: סגירה"
@@ -558,7 +585,7 @@
"Analyzing configuration...": "מנתח תצורה..."
},
"Anchor": {
"Anchor": ""
"Anchor": "עוגן"
},
"Animation Duration": {
"Animation Duration": "משך זמן לאנימציה"
@@ -585,7 +612,7 @@
"App ID": "App ID"
},
"App ID (e.g. firefox)": {
"App ID (e.g. firefox)": ""
"App ID (e.g. firefox)": "App ID (לדוגמה firefox)"
},
"App ID Substitutions": {
"App ID Substitutions": "החלפת ID לאפליקציות"
@@ -642,10 +669,10 @@
"Apply warm color temperature to reduce eye strain. Use automation settings below to control when it activates.": "הגדרת טמפרטורת צבע חמה כדי להפחית מאמץ בעיניים. השתמש/י בהגדרות האוטומציה למטה כדי לשלוט מתי ההגדרה מופעלת."
},
"Applying authentication changes...": {
"Applying authentication changes...": ""
"Applying authentication changes...": "מחיל שינויי אימות..."
},
"Applying auto-login on startup...": {
"Applying auto-login on startup...": ""
"Applying auto-login on startup...": "מחיל התחברות אוטומטית בהפעלה..."
},
"Apps": {
"Apps": "אפליקציות"
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": "לפחות פלט אחד חייב להישאר מופעל"
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": "חבר/י"
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "אוטומטי (רחב)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "מיקום אוטומטי"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "מרווחי חלוניות קופצות אוטומטיים"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": "מצב אוטומטי מופעל. בחירת פרופיל ידנית מושבתת."
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "ניקוי אוטומטי אחרי"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": "התחברות אוטומטית בהפעלה"
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "שומר אוטומטית..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "נעילה אוטומטית של המסך כשהמערכת מתכוננת למצב השהיה"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": "אוטומציה"
},
@@ -942,14 +987,17 @@
"Balanced palette with focused accents (default).": "פלטה מאוזנת עם דגשים ממוקדים (ברירת מחדל)."
},
"Bar": {
"Bar": ""
"Bar": "סרגל"
},
"Bar %1": {
"Bar %1": ""
"Bar %1": "סרגל %1"
},
"Bar Configurations": {
"Bar Configurations": "תצורות סרגלים"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": "הצללות סרגל"
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": "טשטש/י את הרקע מאחורי סרגלים, חלונות קופצים, מודלים והתראות. דורש תמיכה והגדרה של הקומפוזיטור."
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "טשטש/י את הרקע כאשר הסקירה של Niri פתוחה"
},
"Body": {
"Body": "גוף"
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": "מודגש"
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": "יומן"
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "מצלמה"
},
@@ -1281,7 +1338,7 @@
"Checking for updates...": "בודק עדכונים..."
},
"Checking whether sudo authentication is needed...": {
"Checking whether sudo authentication is needed...": ""
"Checking whether sudo authentication is needed...": "בודק אם נדרש אימות עם sudo..."
},
"Checking...": {
"Checking...": "בודק..."
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": "בחר/י האם להפעיל אפליקציית שולחן עבודה או פקודה"
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "בחר/י באילו מסכים יוצג ווידג׳ט זה"
},
@@ -1650,7 +1710,7 @@
"Connecting to Device": "מתחבר להתקן"
},
"Connecting to clipboard service...": {
"Connecting to clipboard service...": ""
"Connecting to clipboard service...": "מתחבר לשירות לוח ההעתקה..."
},
"Connecting...": {
"Connecting...": "מתחבר..."
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "שולט בשקיפות של כל החלונות הקופצים, המודלים ושכבות התוכן שלהם"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": "שולט בקווי המתאר מסביב לכרטיסי רקע קדמי מטושטשים, כפתורים וכרטיסי התראות"
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": "שולט ברדיוס הטשטוש הבסיסי ובהיסט של הצללים"
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": "שולט בקצה החיצוני של חלונות המטושטשים על ידי הפרוטוקול"
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "עדיפות קריטית"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": "Ctrl+Tab: החלפת כרטיסיה • Ctrl+S: הצמדה/ביטול הצמדה • Shift+Del: ניקוי הכל • Esc: סגירה"
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "Dank Bar"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "DankMaterialShell מוכן לשימוש"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": "קיצור מקלדת למשגר ברירת המחדל"
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": "פתיחה כברירת מחדל"
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "חיבורי התקנים"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": "שמות ההתקנים עודכנו"
},
@@ -2238,7 +2340,7 @@
"Disabling WiFi...": "משבית WiFi..."
},
"Disabling auto-login on startup...": {
"Disabling auto-login on startup...": ""
"Disabling auto-login on startup...": "משבית התחברות אוטומטית בהפעלה..."
},
"Disc": {
"Disc": "דיסק"
@@ -2304,7 +2406,7 @@
"Display all priorities over fullscreen apps": "הצג/י את כל ההתראות מעל אפליקציות במסך מלא"
},
"Display and switch MangoWC layouts": {
"Display and switch MangoWC layouts": ""
"Display and switch MangoWC layouts": "הצג/י והחלף/י פריסות של MangoWC"
},
"Display application icons in workspace indicators": {
"Display application icons in workspace indicators": "הצג/י סמלי אפליקציות במצייני סביבת העבודה"
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "משגר וDock"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "שקיפות הDock"
},
"Dock Visibility": {
"Dock Visibility": "נראות הDock"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": "שוליים, שקיפות ומסגרת הDock"
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": "הקצה שממנו המשגר מחליק"
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "ערוך/ערכי אפליקציה"
},
@@ -2480,8 +2591,11 @@
"Edit clipboard text": {
"Edit clipboard text": "ערוך/ערכי טקסט מלוח ההעתקה"
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
"Editing changes on %1": "עורך שינויים ב-%1"
},
"Education": {
"Education": "חינוך"
@@ -2597,6 +2711,9 @@
"End": {
"End": "סוף"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": "הגדל/י בריחוף"
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "Ethernet"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": "כל 15 דקות"
},
@@ -2991,7 +3111,7 @@
"Failed to write autostart entry": "כתיבת רשומת ההפעלה האוטומטית נכשלה"
},
"Failed to write outputs config.": {
"Failed to write outputs config.": ""
"Failed to write outputs config.": "כתיבת קובץ ההגדרה לפלט התצוגה נכשלה."
},
"Failed to write temp file for validation": {
"Failed to write temp file for validation": "כתיבת קובץ זמני לאימות נכשלה"
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": "מנהל קבצים"
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": "מנהל הקבצים שבו נעשה שימוש כדי לפתוח את האשפה. בחר/י \"מותאם אישית\" כדי להזין פקודה משלך."
},
@@ -3114,19 +3237,19 @@
"Float": "צף"
},
"Float Anchor": {
"Float Anchor": ""
"Float Anchor": "עוגן צף"
},
"Float X": {
"Float X": ""
"Float X": "X צף"
},
"Float Y": {
"Float Y": ""
"Float Y": "Y צף"
},
"Floating": {
"Floating": "צף"
},
"Floating Position": {
"Floating Position": ""
"Floating Position": "מיקום צף"
},
"Fluent": {
"Fluent": "Fluent"
@@ -3459,7 +3582,7 @@
"Group": "קבוצה"
},
"Group Active Workspace": {
"Group Active Workspace": ""
"Group Active Workspace": "קיבוץ בסביבת העבודה הפעילה"
},
"Group Workspace Apps": {
"Group Workspace Apps": "קיבוץ האפליקציות של סביבת העבודה"
@@ -3822,7 +3945,7 @@
"Inhibitable": "ניתן לעיכוב"
},
"Initial position for floating windows. Set both X and Y; anchor controls which corner/edge they're relative to.": {
"Initial position for floating windows. Set both X and Y; anchor controls which corner/edge they're relative to.": ""
"Initial position for floating windows. Set both X and Y; anchor controls which corner/edge they're relative to.": "מיקום התחלתי לחלונות צפים. הגדר/י גם את X וגם את Y; העוגן שולט לאיזו פינה/קצה הם מתייחסים."
},
"Initialised": {
"Initialised": "אותחל"
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": "הכנס/י את מפתח האבטחה שלך..."
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "התקן/י"
},
@@ -3927,7 +4053,7 @@
"Invert on mode change": "היפוך בעת שינוי מצב"
},
"Invert touchpad scroll direction": {
"Invert touchpad scroll direction": ""
"Invert touchpad scroll direction": "הפוך/הפכי את כיוון הגלילה של משטח המגע"
},
"Iris Bloom": {
"Iris Bloom": "פריחת האיריס"
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "שמור/י שינויים"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": "המשך/המשיכי להקליד"
},
@@ -4254,10 +4386,10 @@
"Manages files and directories": "מנהל קבצים ותיקיות"
},
"Mango Options": {
"Mango Options": ""
"Mango Options": "אפשרויות Mango"
},
"Mango service not available": {
"Mango service not available": ""
"Mango service not available": "שירות Mango אינו זמין"
},
"MangoWC Layout Overrides": {
"MangoWC Layout Overrides": "דריסות פריסה של MangoWC"
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "גודל מרווח ידני"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "הצגה/הסתרה ידנית"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": "מקסימום אפליקציות פועלות (0 = ללא הגבלה)"
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": "עוצמה מקסימלית"
},
@@ -4641,7 +4779,7 @@
"Native: platform renderer (FreeType).": "מובנה: מעבד הפלטפורמה המובנה (FreeType)."
},
"Natural Touchpad Scrolling": {
"Natural Touchpad Scrolling": ""
"Natural Touchpad Scrolling": "גלילה טבעית במשטח המגע"
},
"Navigate": {
"Navigate": "ניווט"
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "ניו יורק, ניו יורק"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "שם לקבוצה החדשה..."
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "אין התקני בהירות זמינים"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "אין שינויים"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": "לא נמצאו רשומות לוח ההעתקה אחרונות"
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": "אין תוצאות"
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": "לא הוגדרו חוקי חלון"
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": "רעש"
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "הגדרות גופן של הפנקס"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "החלקה של הפנקס"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": "כלום"
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": "פתח/י מסגרת"
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": "פתח/י את KDE Connect בטלפון שלך"
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": "הדבק/י"
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": "נתיב לקובץ וידאו או תיקייה המכילה סרטוני וידאו"
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": "האינטגרציה עם Polkit מושבתת. ניהול משתמשים דורש את Polkit לצורך עדכון ההרשאות."
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": "הצללות של חלונות קופצים"
},
@@ -5949,7 +6114,7 @@
"Refresh Weather": "רענן/י מזג אוויר"
},
"Refreshing...": {
"Refreshing...": ""
"Refreshing...": "מרענן..."
},
"Regex": {
"Regex": "Regex"
@@ -5966,6 +6131,9 @@
"Release": {
"Release": "שחרור"
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "טען/י תוסף מחדש"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": "זכירת המשתמש האחרון"
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "הסרה"
},
@@ -6075,7 +6246,7 @@
"Requires DMS server with sysupdate capability": "נדרש שרת DMS עם יכולת עדכון מערכת (sysupdate)"
},
"Requires MangoWC compositor": {
"Requires MangoWC compositor": ""
"Requires MangoWC compositor": "קומפוזיטור MangoWC נדרש"
},
"Requires a newer version of Quickshell": {
"Requires a newer version of Quickshell": "נדרשת גרסה חדשה יותר של Quickshell"
@@ -6108,10 +6279,10 @@
"Resize Widget": "שינוי גודל הווידג׳ט"
},
"Resize on Border": {
"Resize on Border": ""
"Resize on Border": "שינוי גודל במסגרת"
},
"Resize windows by dragging their edges with the mouse": {
"Resize windows by dragging their edges with the mouse": ""
"Resize windows by dragging their edges with the mouse": "שנה/י גודל חלונות על ידי גרירת הקצוות שלהם עם העכבר"
},
"Resolution & Refresh": {
"Resolution & Refresh": "רזולוציה ורענון"
@@ -6222,7 +6393,7 @@
"Running Apps Settings": "הגדרות אפליקציות פעילות"
},
"Running greeter sync...": {
"Running greeter sync...": ""
"Running greeter sync...": "מריץ סנכרון greeter..."
},
"Running in terminal": {
"Running in terminal": "פועל במסוף"
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": "שומר/ת..."
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "קנה מידה"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": "הגדר/י חוקים להתראות"
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": "הגדרה"
},
@@ -6833,8 +7013,11 @@
"Show Workspace Apps": {
"Show Workspace Apps": "הצגת אפליקציות בסביבת העבודה"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
"Show all 9 tags instead of only occupied tags": "הצג/י את כל 9 התגיות במקום רק תגיות בשימוש"
},
"Show an outline ring around the focused workspace indicator": {
"Show an outline ring around the focused workspace indicator": "הצג/י טבעת מתאר סביב המחוון של סביבת העבודה הממוקדת"
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": "השתק/י התראות"
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "גודל"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": "דלג/י על סיסמת מסך ההתחברות לאחר ההפעלה עד להתנתקות. פתיחת מסך הנעילה נשארת ללא שינוי. ייכנס לתוקף בהפעלה מחדש הבאה לאחר סנכרון."
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": "קטן"
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": "סיכום"
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "זריחה"
},
@@ -7263,7 +7455,7 @@
"Tab/Shift+Tab: Nav • ←→↑↓: Grid Nav • Enter/Space: Select": "Tab/Shift+Tab: ניווט • ←→↑↓: ניווט ברשת • Enter/Space: בחירה"
},
"Tags": {
"Tags": ""
"Tags": "תגיות"
},
"Tags: %1": {
"Tags: %1": "תגיות: %1"
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "הזמן אזל"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "הזמן שמוקצב להתראות בעדיפות קריטית"
},
@@ -7491,7 +7686,10 @@
"Title": "כותרת"
},
"Title (optional)": {
"Title (optional)": ""
"Title (optional)": "כותרת (אופציונלי)"
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": "Title regex (אופציונלי)"
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "שימוש בפריסת רשת"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "שימוש במיקום לפי כתובת IP"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": "משתמש בפעולת הIPC של spotlight-bar ותמיד פותח את הסרגל המינימלי."
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": "משתמש בגופן ברוחב קבוע גלובלי מהגדרות ← התאמה אישית"
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": "ההגדרות משותפות עם בקרת גאמה"
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "נראות"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": "אפקטים ויזואליים"
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "ניהול ווידג׳טים"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "מתאר לווידג׳טים"
},
@@ -8205,7 +8418,7 @@
"Widgets": "ווידג׳טים"
},
"Widgets & Notifications": {
"Widgets & Notifications": ""
"Widgets & Notifications": "ווידג׳טים והתראות"
},
"Widgets, layout, style": {
"Widgets, layout, style": "ווידג׳טים, פריסה, סגנון"
@@ -8220,7 +8433,7 @@
"Width of the widget outline in pixels": "רוחב של קו המתאר של הווידג׳ט בפיקסלים"
},
"Width of window border": {
"Width of window border": ""
"Width of window border": "רוחב מסגרת החלון"
},
"Width of window border and focus ring": {
"Width of window border and focus ring": "רוחב מסגרת חלון וטבעת מיקוד"
@@ -8262,7 +8475,7 @@
"Wipe": "ניגוב"
},
"Working...": {
"Working...": ""
"Working...": "עובד..."
},
"Workspace": {
"Workspace": "סביבת עבודה"
@@ -8298,7 +8511,7 @@
"Write:": "כתיבה:"
},
"X": {
"X": ""
"X": "X"
},
"X Axis": {
"X Axis": "ציר X"
@@ -8313,7 +8526,7 @@
"Xray blurs only the wallpaper (efficient) and is the default when Blur is on. Set Xray to Off for regular full blur of everything beneath the window (more expensive).": "רנטגן (xray) מטשטש רק את תמונת הרקע (חסכוני) וזוהי ברירת המחדל כאשר הטשטוש פועל. הגדר/י את ״רנטגן״ ככבוי לקבלת טשטוש מלא רגיל של כל מה שנמצא מתחת לחלון (זולל יותר משאבים)."
},
"Y": {
"Y": ""
"Y": "Y"
},
"Y Axis": {
"Y Axis": "ציר Y"
@@ -8426,6 +8639,9 @@
"featured": {
"featured": "מומלץ"
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": "נראה/תה לאחרונה %1"
},
@@ -8439,10 +8655,10 @@
"loginctl not available - lock integration requires DMS socket connection": "loginctl אינו זמין, אינטגרציה של הנעילה דורשת חיבור socket לDMS"
},
"mango: config reloaded": {
"mango: config reloaded": ""
"mango: config reloaded": "mango: ההגדרות נטענו מחדש"
},
"mango: failed to reload config": {
"mango: failed to reload config": ""
"mango: failed to reload config": "mango: טעינת ההגדרות מחדש נכשלה"
},
"mangowc Discord Server": {
"mangowc Discord Server": "שרת הDiscord של mangowc"
+257 -41
View File
@@ -81,7 +81,7 @@
"%1 online": "%1 online"
},
"%1 tasks": {
"%1 tasks": ""
"%1 tasks": "%1 feladat"
},
"%1 update": {
"%1 update": "%1 frissítés"
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1 nap"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "1 eszköz csatlakoztatva"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": "1 óra 30 perc"
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1 perc"
},
@@ -153,7 +159,10 @@
"1 second": "1 másodperc"
},
"1 task": {
"1 task": ""
"1 task": "1 feladat"
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 perc"
@@ -173,6 +182,9 @@
"15 min": {
"15 min": "15 perc"
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": "15 perc"
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": "30 perc"
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": "30 perc"
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": "45 másodperc"
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 perc"
},
@@ -441,7 +459,7 @@
"Add a custom prefix to all application launches. This can be used for things like 'uwsm-app', 'systemd-run', or other command wrappers.": "Adj meg egy egyéni előtagot minden alkalmazás indításához. Ez használható például „uwsm-app”, „systemd-run” vagy más parancscsomagolókhoz."
},
"Add a task...": {
"Add a task...": ""
"Add a task...": "Feladat hozzáadása…"
},
"Add and configure widgets that appear on your desktop": {
"Add and configure widgets that appear on your desktop": "Asztali widgetek hozzáadása és beállítása"
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": "Hozzáadás cím alapján"
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": "Egyezés hozzáadása"
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": "Az új felhasználó hozzáadása a(z) %1 csoporthoz, hogy futtathassa a dms greeter sync --profile parancsot."
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": "Engedélyezés"
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": "Kattintások átengedése a widgeten"
},
@@ -513,7 +540,7 @@
"Already on that session": "Már ebben a munkamenetben vagy"
},
"Also group repeated application icons on the active workspace": {
"Also group repeated application icons on the active workspace": ""
"Also group repeated application icons on the active workspace": "Az ismétlődő alkalmazásikonok csoportosítása az aktív munkaterületen is"
},
"Alt+←/Backspace: Back • F1/I: File Info • F10: Help • Esc: Close": {
"Alt+←/Backspace: Back • F1/I: File Info • F10: Help • Esc: Close": "Alt+←/Backspace: Vissza • F1/I: Fájlinformáció • F10: Súgó • Esc: Bezárás"
@@ -558,7 +585,7 @@
"Analyzing configuration...": "Konfiguráció elemzése…"
},
"Anchor": {
"Anchor": ""
"Anchor": "Horgony"
},
"Animation Duration": {
"Animation Duration": "Animáció időtartama"
@@ -585,7 +612,7 @@
"App ID": "Alkalmazásazonosító"
},
"App ID (e.g. firefox)": {
"App ID (e.g. firefox)": ""
"App ID (e.g. firefox)": "Alkalmazás-azonosító (pl. firefox)"
},
"App ID Substitutions": {
"App ID Substitutions": "Alkalmazásazonosító-helyettesítések"
@@ -642,10 +669,10 @@
"Apply warm color temperature to reduce eye strain. Use automation settings below to control when it activates.": "Meleg színhőmérséklet alkalmazása a szem megerőltetésének csökkentése érdekében. Az alábbi automatizálási beállítások segítségével szabályozhatod, hogy mikor aktiválódjon."
},
"Applying authentication changes...": {
"Applying authentication changes...": ""
"Applying authentication changes...": "Hitelesítési módosítások alkalmazása..."
},
"Applying auto-login on startup...": {
"Applying auto-login on startup...": ""
"Applying auto-login on startup...": "Automatikus bejelentkezés alkalmazása indításkor..."
},
"Apps": {
"Apps": "Alkalmazások"
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": "Legalább egy kimenetnek engedélyezve kell maradnia"
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": "Csatlakozás"
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "Automatikus (széles)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "Automatikus helymeghatározás"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "Automatikus felugró ablak rések"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": "Az automatikus mód be van kapcsolva. A kézi profilválasztás le van tiltva."
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "Automatikus törlés"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": "Automatikus bejelentkezés indításkor"
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "Automatikus mentés…"
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "A képernyő automatikus zárolása, amikor a rendszer felfüggesztésre készül"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": "Automatizálás"
},
@@ -942,14 +987,17 @@
"Balanced palette with focused accents (default).": "Kiegyensúlyozott paletta fókuszált kiemelésekkel (alapértelmezett)."
},
"Bar": {
"Bar": ""
"Bar": "Sáv"
},
"Bar %1": {
"Bar %1": ""
"Bar %1": "%1. sáv"
},
"Bar Configurations": {
"Bar Configurations": "Sáv konfiguráció"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": "Sáv árnyékai"
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": "A sávok, felugró ablakok, modális ablakok és értesítések mögötti háttér elmosása. Kompozitor támogatást és beállítást igényel."
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "Háttérkép elmosása, ha a niri-áttekintés nyitva van"
},
"Body": {
"Body": "Szövegtörzs"
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": "Félkövér"
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": "Naptár"
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "Kamera"
},
@@ -1281,7 +1338,7 @@
"Checking for updates...": "Frissítések keresése…"
},
"Checking whether sudo authentication is needed...": {
"Checking whether sudo authentication is needed...": ""
"Checking whether sudo authentication is needed...": "Sudo-hitelesítés szükségességének ellenőrzése..."
},
"Checking...": {
"Checking...": "Ellenőrzés…"
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": "Válaszd ki, hogy asztali alkalmazást vagy parancsot indítasz"
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "Mely kijelzők mutassák ezt a widgetet"
},
@@ -1650,7 +1710,7 @@
"Connecting to Device": "Csatlakozás az eszközhöz"
},
"Connecting to clipboard service...": {
"Connecting to clipboard service...": ""
"Connecting to clipboard service...": "Kapcsolódás a vágólap-szolgáltatáshoz..."
},
"Connecting...": {
"Connecting...": "Csatlakozás…"
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "Az összes felugró ablak, kizárólagos párbeszédablak és tartalomréteg átlátszósága"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": "Szabályozza az elmosódott előtér-kártyák, tabletták és értesítési kártyák körüli körvonalakat"
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": "Az árnyékok alap elmosási sugara és eltolása"
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": "Szabályozza a protokoll-elmosott ablakok külső szélét"
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "Kritikus prioritás"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": "Ctrl+Tab: Lapváltás • Ctrl+S: Rögzítés/Feloldás • Shift+Del: Összes törlése • Esc: Bezárás"
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "DankBar"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "A DankMaterialShell használatra kész"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": "Alapértelmezett indító gyorsbillentyű"
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": "Alapértelmezetten megnyitja"
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "Eszköz csatlakozások"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": "Eszköznevek frissítve"
},
@@ -2238,7 +2340,7 @@
"Disabling WiFi...": "Wi-Fi kikapcsolása…"
},
"Disabling auto-login on startup...": {
"Disabling auto-login on startup...": ""
"Disabling auto-login on startup...": "Automatikus bejelentkezés letiltása indításkor..."
},
"Disc": {
"Disc": "Lemez"
@@ -2304,7 +2406,7 @@
"Display all priorities over fullscreen apps": "Minden prioritás megjelenítése a teljes képernyős alkalmazások felett"
},
"Display and switch MangoWC layouts": {
"Display and switch MangoWC layouts": ""
"Display and switch MangoWC layouts": "MangoWC elrendezések megjelenítése és váltása"
},
"Display application icons in workspace indicators": {
"Display application icons in workspace indicators": "Alkalmazás ikonok megjelenítése a munkaterület-jelzőkben"
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "Dokk és indító"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "Dokk átlátszóság"
},
"Dock Visibility": {
"Dock Visibility": "Dokk láthatósága"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": "Dokk margója, átlátszósága és szegélye"
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": "A szél, ahonnan az indító beúszik"
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "Alkalmazás szerkesztése"
},
@@ -2480,8 +2591,11 @@
"Edit clipboard text": {
"Edit clipboard text": "Vágólap szövegének szerkesztése"
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
"Editing changes on %1": "Módosítások szerkesztése ezen: %1"
},
"Education": {
"Education": "Oktatás"
@@ -2597,6 +2711,9 @@
"End": {
"End": "Vége"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": "Nagyítás rámutatáskor"
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "Ethernet"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": "15 percenként"
},
@@ -2991,7 +3111,7 @@
"Failed to write autostart entry": "Nem sikerült írni az automatikus indítási bejegyzést"
},
"Failed to write outputs config.": {
"Failed to write outputs config.": ""
"Failed to write outputs config.": "Nem sikerült a kimeneti konfiguráció írása."
},
"Failed to write temp file for validation": {
"Failed to write temp file for validation": "Nem sikerült írni az ideiglenes fájlt az ellenőrzéshez"
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": "Fájlkezelő"
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": "A kuka megnyitásához használt fájlkezelő. Válaszd az „egyéni” lehetőséget saját parancs megadásához."
},
@@ -3114,19 +3237,19 @@
"Float": "Lebegő"
},
"Float Anchor": {
"Float Anchor": ""
"Float Anchor": "Lebegő horgony"
},
"Float X": {
"Float X": ""
"Float X": "Lebegő X"
},
"Float Y": {
"Float Y": ""
"Float Y": "Lebegő Y"
},
"Floating": {
"Floating": "Lebegő"
},
"Floating Position": {
"Floating Position": ""
"Floating Position": "Lebegő pozíció"
},
"Fluent": {
"Fluent": "Fluent"
@@ -3459,7 +3582,7 @@
"Group": "Csoport"
},
"Group Active Workspace": {
"Group Active Workspace": ""
"Group Active Workspace": "Aktív munkaterület csoportosítása"
},
"Group Workspace Apps": {
"Group Workspace Apps": "Munkaterület-alkalmazások csoportosítása"
@@ -3822,7 +3945,7 @@
"Inhibitable": "Gátolható"
},
"Initial position for floating windows. Set both X and Y; anchor controls which corner/edge they're relative to.": {
"Initial position for floating windows. Set both X and Y; anchor controls which corner/edge they're relative to.": ""
"Initial position for floating windows. Set both X and Y; anchor controls which corner/edge they're relative to.": "Lebegő ablakok kezdeti pozíciója. Állítsa be az X és Y értéket is; a horgony határozza meg, hogy melyik sarokhoz/élhez képest jelenjenek meg."
},
"Initialised": {
"Initialised": "Inicializálva"
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": "Helyezd be a biztonsági kulcsodat…"
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "Telepítés"
},
@@ -3927,7 +4053,7 @@
"Invert on mode change": "Invertálás módváltáskor"
},
"Invert touchpad scroll direction": {
"Invert touchpad scroll direction": ""
"Invert touchpad scroll direction": "Érintőtábla görgetési irányának megfordítása"
},
"Iris Bloom": {
"Iris Bloom": "Íriszvirágzás"
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "Változtatások megtartása"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": "Gépelj tovább"
},
@@ -4254,10 +4386,10 @@
"Manages files and directories": "Fájlok és könyvtárak kezelése"
},
"Mango Options": {
"Mango Options": ""
"Mango Options": "Mango beállítások"
},
"Mango service not available": {
"Mango service not available": ""
"Mango service not available": "A Mango szolgáltatás nem érhető el"
},
"MangoWC Layout Overrides": {
"MangoWC Layout Overrides": "MangoWC elrendezés felülbírálások"
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "Manuális rés mérete"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "Manuális megjelenítés/elrejtés"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": "Max. futó alk. (0 = korlátlan)"
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": "Maximális hangerő"
},
@@ -4641,7 +4779,7 @@
"Native: platform renderer (FreeType).": "Natív: platformmegjelenítő (FreeType)."
},
"Natural Touchpad Scrolling": {
"Natural Touchpad Scrolling": ""
"Natural Touchpad Scrolling": "Természetes érintőtábla-görgetés"
},
"Navigate": {
"Navigate": "Navigáció"
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "New York, NY"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "Új csoportnév…"
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "Nincs elérhető fényerő eszköz"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "Nincs változás"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": "Nem találhatók legutóbbi vágólapbejegyzések"
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": "Nincs találat"
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": "Nincsenek ablakszabályok beállítva"
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": "Zaj"
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "Jegyzettömb-betűbeállítások"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "Jegyzettömb oldalsáv"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": "Semmi"
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": "Nyitott keret"
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": "Nyisd meg a KDE Connectet a telefonodon"
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": "Beillesztés"
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": "Egy videófájl vagy videókat tartalmazó mappa elérési útja"
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": "A Polkit-integráció ki van kapcsolva. A felhasználókezeléshez a Polkit szükséges a jogosultságok emeléséhez."
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": "Felugró ablak árnyékok"
},
@@ -5949,7 +6114,7 @@
"Refresh Weather": "Időjárás frissítése"
},
"Refreshing...": {
"Refreshing...": ""
"Refreshing...": "Frissítés…"
},
"Regex": {
"Regex": "Regex"
@@ -5966,6 +6131,9 @@
"Release": {
"Release": "Felengedés"
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "Bővítmény újratöltése"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": "Utolsó felhasználó megjegyzése"
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "Eltávolítás"
},
@@ -6075,7 +6246,7 @@
"Requires DMS server with sysupdate capability": "DMS-szerver szükséges sysupdate-képességgel"
},
"Requires MangoWC compositor": {
"Requires MangoWC compositor": ""
"Requires MangoWC compositor": "MangoWC kompozitor szükséges"
},
"Requires a newer version of Quickshell": {
"Requires a newer version of Quickshell": "A Quickshell újabb verziója szükséges"
@@ -6108,10 +6279,10 @@
"Resize Widget": "Widget méretezése"
},
"Resize on Border": {
"Resize on Border": ""
"Resize on Border": "Átméretezés a szegélynél"
},
"Resize windows by dragging their edges with the mouse": {
"Resize windows by dragging their edges with the mouse": ""
"Resize windows by dragging their edges with the mouse": "Ablakok átméretezése a szegélyük egérrel történő húzásával"
},
"Resolution & Refresh": {
"Resolution & Refresh": "Felbontás és frissítés"
@@ -6222,7 +6393,7 @@
"Running Apps Settings": "Futó alkalmazások beállításai"
},
"Running greeter sync...": {
"Running greeter sync...": ""
"Running greeter sync...": "Üdvözlőképernyő-szinkronizáció futtatása..."
},
"Running in terminal": {
"Running in terminal": "Futtatás terminálban"
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": "Mentés…"
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "Skála"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": "Értesítési szabályok beállítása"
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": "Beállítás"
},
@@ -6833,8 +7013,11 @@
"Show Workspace Apps": {
"Show Workspace Apps": "Munkaterület-alkalmazások megjelenítése"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
"Show all 9 tags instead of only occupied tags": "Mind a 9 címke megjelenítése a csak foglalt címkék helyett"
},
"Show an outline ring around the focused workspace indicator": {
"Show an outline ring around the focused workspace indicator": "Körvonal megjelenítése a fókuszált munkaterület-jelző körül"
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": "Értesítések némítása"
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "Méret"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": "Kihagyja a rendszerindítás után az üdvözlőképernyő jelszavát a kijelentkezésig. A zárolási képernyő feloldása változatlan marad. A szinkronizálás utáni következő újraindításkor lép életbe."
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": "Kicsi"
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": "Összegzés"
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "Napkelte"
},
@@ -7263,7 +7455,7 @@
"Tab/Shift+Tab: Nav • ←→↑↓: Grid Nav • Enter/Space: Select": "Tab/Shift+Tab: Nav • ←→↑↓: Rács Nav • Enter/Szóköz: Kiválasztás"
},
"Tags": {
"Tags": ""
"Tags": "Címkék"
},
"Tags: %1": {
"Tags: %1": "Címkék: %1"
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "Időtúllépés"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "Időtúllépés a kritikus prioritású értesítésekhez"
},
@@ -7491,7 +7686,10 @@
"Title": "Cím"
},
"Title (optional)": {
"Title (optional)": ""
"Title (optional)": "Cím (nem kötelező)"
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": "Cím reguláris kifejezése (opcionális)"
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "Rács elrendezés használata"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "IP-cím használata"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": "A „spotlight-bar” IPC-műveletet használja, és mindig a minimális sávot nyitja meg."
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": "A Beállítások → Személyre szabás menüpontban megadott globális rögzített szélességű betűtípus használata"
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": "A Gammavezérlés megosztott beállításainak használata"
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "Láthatóság"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": "Vizuális effektusok"
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "Widgetkezelés"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "Widget körvonal"
},
@@ -8205,7 +8418,7 @@
"Widgets": "Widgetek"
},
"Widgets & Notifications": {
"Widgets & Notifications": ""
"Widgets & Notifications": "Widgetek és értesítések"
},
"Widgets, layout, style": {
"Widgets, layout, style": "Widgetek, elrendezés, stílus"
@@ -8220,7 +8433,7 @@
"Width of the widget outline in pixels": "A widget körvonalának szélessége képpontban"
},
"Width of window border": {
"Width of window border": ""
"Width of window border": "Ablakszegély szélessége"
},
"Width of window border and focus ring": {
"Width of window border and focus ring": "Ablakszegély és fókuszgyűrű szélessége"
@@ -8262,7 +8475,7 @@
"Wipe": "Törlés"
},
"Working...": {
"Working...": ""
"Working...": "Dolgozom..."
},
"Workspace": {
"Workspace": "Munkaterület"
@@ -8298,7 +8511,7 @@
"Write:": "Írás:"
},
"X": {
"X": ""
"X": "X"
},
"X Axis": {
"X Axis": "X tengely"
@@ -8313,7 +8526,7 @@
"Xray blurs only the wallpaper (efficient) and is the default when Blur is on. Set Xray to Off for regular full blur of everything beneath the window (more expensive).": "Az X-Ray csak a háttérképet mossa el (hatékony), és ez az alapértelmezett, ha az Elmosás be van kapcsolva. Állítsd az X-Ray-t Ki állásba az ablak alatti összes elem normál, teljes elmosásához (erőforrás-igényesebb)."
},
"Y": {
"Y": ""
"Y": "Y"
},
"Y Axis": {
"Y Axis": "Y tengely"
@@ -8426,6 +8639,9 @@
"featured": {
"featured": "kiemelt"
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": "utoljára látva: %1"
},
@@ -8439,10 +8655,10 @@
"loginctl not available - lock integration requires DMS socket connection": "A loginctl nem érhető el a zárolás integrációhoz DMS-socketkapcsolat szükséges"
},
"mango: config reloaded": {
"mango: config reloaded": ""
"mango: config reloaded": "mango: konfiguráció újratöltve"
},
"mango: failed to reload config": {
"mango: failed to reload config": ""
"mango: failed to reload config": "mango: nem sikerült újratölteni a konfigurációt"
},
"mangowc Discord Server": {
"mangowc Discord Server": "mangowc Discord szerver"
+262 -46
View File
@@ -81,7 +81,7 @@
"%1 online": "%1 online"
},
"%1 tasks": {
"%1 tasks": ""
"%1 tasks": "%1 attività"
},
"%1 update": {
"%1 update": "%1 aggiornamento"
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1 giorno"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "1 dispositivo connesso"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": "1 ora 30 minuti"
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1 minuto"
},
@@ -153,7 +159,10 @@
"1 second": "1 secondo"
},
"1 task": {
"1 task": ""
"1 task": "1 attività"
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 minuti"
@@ -173,6 +182,9 @@
"15 min": {
"15 min": "15 minuti"
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": "15 minuti"
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": "30 minuti"
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": "30 minuti"
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": "45 secondi"
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 minuti"
},
@@ -441,7 +459,7 @@
"Add a custom prefix to all application launches. This can be used for things like 'uwsm-app', 'systemd-run', or other command wrappers.": "Aggiungi un prefisso personalizzato all'avvio di tutte le applicazioni. Può essere utilizzato per strumenti come \"uwsm-app\", \"systemd-run\" o altri wrapper di comandi."
},
"Add a task...": {
"Add a task...": ""
"Add a task...": "Aggiungi un'attività..."
},
"Add and configure widgets that appear on your desktop": {
"Add and configure widgets that appear on your desktop": "Aggiungi e configura widget che compaiono sul tuo desktop"
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": "Aggiungi tramite Indirizzo"
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": "Aggiungi Corrispondenza"
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": "Aggiungi il nuovo utente al gruppo %1 in modo che possa eseguire il comando dms greeter sync --profile."
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": "Consenti"
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": "Consenti clic attraverso il widget"
},
@@ -513,7 +540,7 @@
"Already on that session": "Già in quella sessione"
},
"Also group repeated application icons on the active workspace": {
"Also group repeated application icons on the active workspace": ""
"Also group repeated application icons on the active workspace": "Raggruppa anche le icone ripetute delle applicazioni nello spazio di lavoro attivo"
},
"Alt+←/Backspace: Back • F1/I: File Info • F10: Help • Esc: Close": {
"Alt+←/Backspace: Back • F1/I: File Info • F10: Help • Esc: Close": "Alt+←/Backspace: Indietro • F1/I: Info File • F10: Aiuto • Esc: Chiudi"
@@ -558,7 +585,7 @@
"Analyzing configuration...": "Analisi configurazione in corso..."
},
"Anchor": {
"Anchor": ""
"Anchor": "Ancora"
},
"Animation Duration": {
"Animation Duration": "Durata Animazione"
@@ -585,7 +612,7 @@
"App ID": "ID Applicazione"
},
"App ID (e.g. firefox)": {
"App ID (e.g. firefox)": ""
"App ID (e.g. firefox)": "ID App (es. firefox)"
},
"App ID Substitutions": {
"App ID Substitutions": "Sostituzioni App ID"
@@ -642,10 +669,10 @@
"Apply warm color temperature to reduce eye strain. Use automation settings below to control when it activates.": "Applica una temperatura colore più calda per ridurre l'affaticamento visivo. Usa le impostazioni di automazione qui sotto per controllare quando attivarla."
},
"Applying authentication changes...": {
"Applying authentication changes...": ""
"Applying authentication changes...": "Applicazione modifiche di autenticazione..."
},
"Applying auto-login on startup...": {
"Applying auto-login on startup...": ""
"Applying auto-login on startup...": "Applicazione accesso automatico all'avvio..."
},
"Apps": {
"Apps": "App"
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": "Almeno un output deve rimanere abilitato"
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": "Aggancia"
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "Automatico (Ampio)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "Posizione Automatica"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "Spaziature Popup Automatiche"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": "Modalità automatica attiva. Selezione dei profili manuale disabilitata."
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "Cancellazione Automatica Dopo"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": "Accesso Automatico all'Avvio"
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "Salvataggio in corso..."
},
@@ -866,11 +908,14 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "Blocca automaticamente lo schermo quando il sistema si prepara alla sospensione"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": "Automazione"
},
"Autostart Apps": {
"Autostart Apps": "Applicazioni in Avvio Automatico"
"Autostart Apps": "App in Avvio Automatico"
},
"Autostart Entries": {
"Autostart Entries": "Voci in Avvio Automatico"
@@ -942,14 +987,17 @@
"Balanced palette with focused accents (default).": "Tavolozza bilanciata con accenti focalizzati (predefinito)."
},
"Bar": {
"Bar": ""
"Bar": "Barra"
},
"Bar %1": {
"Bar %1": ""
"Bar %1": "Barra %1"
},
"Bar Configurations": {
"Bar Configurations": "Configurazioni Barra"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": "Ombre della Barra"
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": "Sfoca lo sfondo dietro barre, popup, finestre modali e notifiche. Richiede supporto e configurazione del compositore."
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "Sfoca lo sfondo quando la panoramica di niri è aperta"
},
"Body": {
"Body": "Corpo"
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": "Grassetto"
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": "Calendario"
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "Fotocamera"
},
@@ -1281,7 +1338,7 @@
"Checking for updates...": "Controllo aggiornamenti..."
},
"Checking whether sudo authentication is needed...": {
"Checking whether sudo authentication is needed...": ""
"Checking whether sudo authentication is needed...": "Verifica della necessità di autenticazione sudo..."
},
"Checking...": {
"Checking...": "Verifica in corso..."
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": "Scegli se avviare un'applicazione desktop o un comando"
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "Scegli su quali schermi mostrare questo widget"
},
@@ -1650,7 +1710,7 @@
"Connecting to Device": "Connessione al Dispositivo"
},
"Connecting to clipboard service...": {
"Connecting to clipboard service...": ""
"Connecting to clipboard service...": "Connessione al servizio degli appunti..."
},
"Connecting...": {
"Connecting...": "Connessione in corso..."
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "Controlla l'opacità di tutti i popup, le finestre modali e i loro livelli di contenuto"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": "Determina i contorni attorno alle schede in primo piano sfocate, alle pillole e alle schede di notifica"
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": "Controlla il raggio di sfocatura base e l'offset delle ombre"
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": "Determina il bordo esterno delle finestre con sfocatura da protocollo"
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "Priorità Critica"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": "Ctrl+Tab: Cambia Tab • Ctrl+S: Aggiungi/Rimuovi • Shift+Del: Cancella Tutto • Esc: Chiudi"
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "DankBar"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "DankMaterialShell è pronta per l'uso"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": "Collegamento Predefinito del Launcher"
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": "Aperture Predefinite"
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "Connessioni del dispositivo"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": "Nomi dei dispositivi aggiornati"
},
@@ -2238,7 +2340,7 @@
"Disabling WiFi...": "Disattivazione Wi-Fi..."
},
"Disabling auto-login on startup...": {
"Disabling auto-login on startup...": ""
"Disabling auto-login on startup...": "Disabilitazione accesso automatico all'avvio..."
},
"Disc": {
"Disc": "Disco"
@@ -2304,7 +2406,7 @@
"Display all priorities over fullscreen apps": "Mostra priorità sopra app a schermo intero"
},
"Display and switch MangoWC layouts": {
"Display and switch MangoWC layouts": ""
"Display and switch MangoWC layouts": "Mostra e cambia i layout di MangoWC"
},
"Display application icons in workspace indicators": {
"Display application icons in workspace indicators": "Mostra icone applicazioni negli indicatori degli spazi di lavoro"
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "Dock e Launcher"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "Trasparenza Dock"
},
"Dock Visibility": {
"Dock Visibility": "Visibilità Dock"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": "Margine, trasparenza e bordo del dock"
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": "Lato da cui scorre il launcher"
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "Modifica App"
},
@@ -2480,8 +2591,11 @@
"Edit clipboard text": {
"Edit clipboard text": "Modifica il testo degli appunti"
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
"Editing changes on %1": "Modifiche in corso su %1"
},
"Education": {
"Education": "Istruzione"
@@ -2597,6 +2711,9 @@
"End": {
"End": "Fine"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": "Ingrandisci al passaggio del mouse"
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "Ethernet"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": "Ogni 15 minuti"
},
@@ -2991,7 +3111,7 @@
"Failed to write autostart entry": "Impossibile scrivere la voce di avvio automatico"
},
"Failed to write outputs config.": {
"Failed to write outputs config.": ""
"Failed to write outputs config.": "Impossibile scrivere la configurazione degli output."
},
"Failed to write temp file for validation": {
"Failed to write temp file for validation": "Impossibile scrivere il file temporaneo per la validazione"
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": "Gestore File"
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": "Il gestore dei file utilizzato per aprire il cestino. Seleziona \"personalizzato\" per inserire il tuo comando."
},
@@ -3114,19 +3237,19 @@
"Float": "Fluttuante"
},
"Float Anchor": {
"Float Anchor": ""
"Float Anchor": "Ancora Fluttuante"
},
"Float X": {
"Float X": ""
"Float X": "X Fluttuante"
},
"Float Y": {
"Float Y": ""
"Float Y": "Y Fluttuante"
},
"Floating": {
"Floating": "Fluttuante"
},
"Floating Position": {
"Floating Position": ""
"Floating Position": "Posizione Fluttuante"
},
"Fluent": {
"Fluent": "Fluente"
@@ -3459,7 +3582,7 @@
"Group": "Gruppo"
},
"Group Active Workspace": {
"Group Active Workspace": ""
"Group Active Workspace": "Raggruppa Spazio di Lavoro Attivo"
},
"Group Workspace Apps": {
"Group Workspace Apps": "Raggruppa App per Spazio di Lavoro"
@@ -3594,7 +3717,7 @@
"Hide the bar when the pointer leaves even if a popout is still open": "Nascondi la barra quando il puntatore esce, anche se una finestra a comparsa è ancora aperta."
},
"High": {
"High": "Alto"
"High": "Alta"
},
"High-fidelity palette that preserves source hues.": {
"High-fidelity palette that preserves source hues.": "Tavolozza ad alta fedeltà che preserva le tonalità della sorgente."
@@ -3822,7 +3945,7 @@
"Inhibitable": "Inibibile"
},
"Initial position for floating windows. Set both X and Y; anchor controls which corner/edge they're relative to.": {
"Initial position for floating windows. Set both X and Y; anchor controls which corner/edge they're relative to.": ""
"Initial position for floating windows. Set both X and Y; anchor controls which corner/edge they're relative to.": "Posizione iniziale per le finestre fluttuanti. Imposta sia X che Y; l'ancora controlla a quale angolo/bordo sono relative."
},
"Initialised": {
"Initialised": "Inizializzato"
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": "Inserisci la tua chiave di sicurezza..."
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "Installa"
},
@@ -3927,7 +4053,7 @@
"Invert on mode change": "Inverti al cambio di modalità"
},
"Invert touchpad scroll direction": {
"Invert touchpad scroll direction": ""
"Invert touchpad scroll direction": "Inverti direzione di scorrimento del touchpad"
},
"Iris Bloom": {
"Iris Bloom": "Effetto Iride"
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "Conserva Modifiche"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": "Continua a digitare"
},
@@ -4209,7 +4341,7 @@
"Longitude": "Longitudine"
},
"Low": {
"Low": "Basso"
"Low": "Bassa"
},
"Low Priority": {
"Low Priority": "Bassa Priorità"
@@ -4254,10 +4386,10 @@
"Manages files and directories": "Gestisce file e directory"
},
"Mango Options": {
"Mango Options": ""
"Mango Options": "Opzioni Mango"
},
"Mango service not available": {
"Mango service not available": ""
"Mango service not available": "Servizio Mango non disponibile"
},
"MangoWC Layout Overrides": {
"MangoWC Layout Overrides": "Sovrascritture Layout MangoWC"
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "Dimensione Manuale Spaziatura"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "Mostra/Nascondi Manuale"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": "App in Esecuzione Massime (0 = Illimitate)"
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": "Volume Massimo"
},
@@ -4641,7 +4779,7 @@
"Native: platform renderer (FreeType).": "Native: renderer di piattaforma (FreeType)."
},
"Natural Touchpad Scrolling": {
"Natural Touchpad Scrolling": ""
"Natural Touchpad Scrolling": "Scorrimento Naturale del Touchpad"
},
"Navigate": {
"Navigate": "Naviga"
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "New York, NY"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "Nome del nuovo gruppo..."
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "Nessun dispositivo di luminosità disponibile"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "Nessun cambiamento"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": "Nessuna voce recente negli appunti"
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": "Nessun risultato"
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": "Nessuna regola finestra configurata"
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": "Rumore"
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "Impostazioni Font Blocco Note"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "Blocco Note a Comparsa"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": "Niente"
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": "Apri Cornice"
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": "Apri KDE Connect sul tuo telefono"
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": "Incolla"
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": "Percorso di un file video o di una cartella contenente video"
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": "L'integrazione con Polkit è disabilitata. La gestione degli utenti richiede che Polkit elevi i privilegi."
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": "Ombre dei Popup"
},
@@ -5949,7 +6114,7 @@
"Refresh Weather": "Aggiorna Meteo"
},
"Refreshing...": {
"Refreshing...": ""
"Refreshing...": "Aggiornamento..."
},
"Regex": {
"Regex": "Regex"
@@ -5966,6 +6131,9 @@
"Release": {
"Release": "Rilascio"
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "Ricarica Plugin"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": "Ricorda l'ultimo utente"
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "Rimuovi"
},
@@ -6075,7 +6246,7 @@
"Requires DMS server with sysupdate capability": "È necessario un server DMS dotato della funzionalità sysupdate"
},
"Requires MangoWC compositor": {
"Requires MangoWC compositor": ""
"Requires MangoWC compositor": "Richiede il compositor MangoWC"
},
"Requires a newer version of Quickshell": {
"Requires a newer version of Quickshell": "Richiede una versione più recente di Quickshell"
@@ -6108,10 +6279,10 @@
"Resize Widget": "Ridimensiona Widget"
},
"Resize on Border": {
"Resize on Border": ""
"Resize on Border": "Ridimensiona dal Bordo"
},
"Resize windows by dragging their edges with the mouse": {
"Resize windows by dragging their edges with the mouse": ""
"Resize windows by dragging their edges with the mouse": "Ridimensiona le finestre trascinando i bordi con il mouse"
},
"Resolution & Refresh": {
"Resolution & Refresh": "Risoluzione e Frequenza di Aggiornamento"
@@ -6222,7 +6393,7 @@
"Running Apps Settings": "Impostazioni App in Esecuzione"
},
"Running greeter sync...": {
"Running greeter sync...": ""
"Running greeter sync...": "Esecuzione sincronizzazione greeter..."
},
"Running in terminal": {
"Running in terminal": "In esecuzione nel terminale"
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": "Salvataggio..."
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "Scala"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": "Imposta regole di notifica"
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": "Impostazione"
},
@@ -6833,8 +7013,11 @@
"Show Workspace Apps": {
"Show Workspace Apps": "Mostra App negli Spazi di Lavoro"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
"Show all 9 tags instead of only occupied tags": "Mostra tutti e 9 i tag invece dei soli tag occupati"
},
"Show an outline ring around the focused workspace indicator": {
"Show an outline ring around the focused workspace indicator": "Mostra un bordo attorno allindicatore dello spazio di lavoro attivo"
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": "Disattiva le notifiche"
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "Dimensione"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": "Salta la password del greeter dopo l'avvio fino alla disconnessione. Lo sblocco della schermata di blocco rimane invariato. Ha effetto al prossimo riavvio dopo la sincronizzazione."
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": "Piccolo"
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": "Riassunto"
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "Alba"
},
@@ -7263,7 +7455,7 @@
"Tab/Shift+Tab: Nav • ←→↑↓: Grid Nav • Enter/Space: Select": "Tab/Shift+Tab: Nav • ←→↑↓: Nav Griglia • Invio/Spazio: Seleziona"
},
"Tags": {
"Tags": ""
"Tags": "Tag"
},
"Tags: %1": {
"Tags: %1": "Tag: %1"
@@ -7365,7 +7557,7 @@
"Theme color used for the widget outline": "Colore del tema utilizzato per il contorno del widget"
},
"Theme worker failed (%1)": {
"Theme worker failed (%1)": "Lavoratore a tema non riuscito (%1)"
"Theme worker failed (%1)": "Lavoratore tema non riuscito (%1)"
},
"Themes": {
"Themes": "Temi"
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "Scaduto"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "Timeout per le notifiche di priorità critica"
},
@@ -7491,7 +7686,10 @@
"Title": "Titolo"
},
"Title (optional)": {
"Title (optional)": ""
"Title (optional)": "Titolo (opzionale)"
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": "Regex titolo (opzionale)"
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "Usa Layout a Griglia"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "Usa Posizione IP"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": "Utilizza l'azione IPC spotlight-bar e apre sempre la barra minima."
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": "Utilizzo del font monospace globale da Impostazioni → Personalizzazione"
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": "Utilizzo delle impostazioni condivise di Gamma Control"
},
@@ -8034,7 +8241,7 @@
"Vertical Tiling": "Tiling Verticale"
},
"Very High": {
"Very High": "Molto Alto"
"Very High": "Molto Alta"
},
"Vibrant": {
"Vibrant": "Vivace"
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "Visibilità"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": "Effetti Visivi"
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "Gestione Widget"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "Contorno Widget"
},
@@ -8205,7 +8418,7 @@
"Widgets": "Widget"
},
"Widgets & Notifications": {
"Widgets & Notifications": ""
"Widgets & Notifications": "Widget e Notifiche"
},
"Widgets, layout, style": {
"Widgets, layout, style": "Widget, layout, stile"
@@ -8220,7 +8433,7 @@
"Width of the widget outline in pixels": "Larghezza del contorno del widget in pixel"
},
"Width of window border": {
"Width of window border": ""
"Width of window border": "Larghezza del bordo della finestra"
},
"Width of window border and focus ring": {
"Width of window border and focus ring": "Larghezza del bordo e dell'anello di focus"
@@ -8262,7 +8475,7 @@
"Wipe": "Tendina"
},
"Working...": {
"Working...": ""
"Working...": "Elaborazione..."
},
"Workspace": {
"Workspace": "Spazio di Lavoro"
@@ -8298,7 +8511,7 @@
"Write:": "Scrittura:"
},
"X": {
"X": ""
"X": "X"
},
"X Axis": {
"X Axis": "Asse X"
@@ -8313,7 +8526,7 @@
"Xray blurs only the wallpaper (efficient) and is the default when Blur is on. Set Xray to Off for regular full blur of everything beneath the window (more expensive).": "I Raggi X sfocano solo lo sfondo (efficiente) ed è l'impostazione predefinita quando la Sfocatura è attiva. Imposta Raggi X su Spento per una normale sfocatura completa di tutto ciò che si trova sotto la finestra (più costoso)."
},
"Y": {
"Y": ""
"Y": "Y"
},
"Y Axis": {
"Y Axis": "Asse Y"
@@ -8426,6 +8639,9 @@
"featured": {
"featured": "in primo piano"
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": "visto l'ultima volta %1"
},
@@ -8439,10 +8655,10 @@
"loginctl not available - lock integration requires DMS socket connection": "loginctl non disponibile - integrazione blocco richiede connessione socket DMS"
},
"mango: config reloaded": {
"mango: config reloaded": ""
"mango: config reloaded": "mango: configurazione ricaricata"
},
"mango: failed to reload config": {
"mango: failed to reload config": ""
"mango: failed to reload config": "mango: impossibile ricaricare la configurazione"
},
"mangowc Discord Server": {
"mangowc Discord Server": "Server Discord di mangowc"
+216
View File
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1日"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "1台接続済み"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": "1時間30分"
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1分"
},
@@ -155,6 +161,9 @@
"1 task": {
"1 task": ""
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10分"
},
@@ -173,6 +182,9 @@
"15 min": {
"15 min": "15 分"
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": "15分"
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": "30 分"
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": "30分"
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": "45秒"
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5分"
},
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": "アドレスで追加"
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": ""
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": ""
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": ""
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": "クリックをウィジェットに透過させる"
},
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": "少なくとも1つの出力は有効のままにしておく必要がある"
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": "添付"
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "自動(ワイド)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "自動位置検出"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "自動ポップアップギャップ"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": "自動モードがオンになっています。手動プロファイル選択は無効になっています。"
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "自動消去まで"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": ""
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "自動保存中..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "システムが一時停止の準備中に自動的に画面をロック"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": "自動化"
},
@@ -950,6 +995,9 @@
"Bar Configurations": {
"Bar Configurations": "バーの設定"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": "バーの影"
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": "バー、ポップアウト、モーダル、通知の背後の背景をぼかす。コンポジターのサポートと設定が必要。"
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "Niri 概要が開いているときに壁紙をぼかす"
},
"Body": {
"Body": "本文"
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": "ボールド"
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": "カレンダー"
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "カメラ"
},
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": ""
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "このウィジェットを表示するディスプレイを選ぶ"
},
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "すべてのポップアウト、モーダル、およびそのコンテンツレイヤーの透明度を制御"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": "ぼかした前景カード、ピル型要素、通知カードのアウトラインを調整"
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": "影の基本ぼかし半径とオフセットを制御"
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": "プロトコルによるぼかしが適用されたウィンドウの外縁を調整"
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "最優先事項"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": "Ctrl+Tab: タブ切替 • Ctrl+S: ピン留め/解除 • Shift+Del: すべてクリア • Esc: 閉じる"
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "DankBar"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "DankMaterialShell は使用可能です"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": ""
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": ""
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "デバイス接続"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": "デバイス名を更新しました"
},
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "ドックとランチャー"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "ドックの透明度"
},
"Dock Visibility": {
"Dock Visibility": "ドックの表示"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": "ドックの余白、透明度、境界線"
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": "ランチャーのスライドを端から"
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "アプリを編集"
},
@@ -2480,6 +2591,9 @@
"Edit clipboard text": {
"Edit clipboard text": ""
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
},
@@ -2597,6 +2711,9 @@
"End": {
"End": "終わり"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": "ホバー時に拡大"
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "Ethernet"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": "15分ごと"
},
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": "ファイルマネージャー"
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": "ゴミ箱を開くために使用するファイルマネージャーです。独自のコマンドを入力するには「カスタム」を選択してください。"
},
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": "セキュリティキーを挿入してください..."
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "インストール"
},
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "変更を保持"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": "入力し続けてください"
},
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "手動ギャップサイズ"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "手動で表示/非表示"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": "最大実行中アプリ数(0 = 無制限)"
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": "最大音量"
},
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "New York, NY"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "新しいグループ名..."
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "利用可能な明るさデバイスがありません"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "変更なし"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": "最近のクリップボードエントリは見つかりませんでした"
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": "検索結果なし"
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": "ウィンドウルールは設定されていません"
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": ""
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "メモ帳のフォント設定"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "メモ帳スライドアウト"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": "なし"
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": "オープンフレーム"
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": "スマートフォンで KDE Connect を開く"
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": "貼り付け"
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": "動画ファイル、または動画を含むフォルダーへのパス"
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": ""
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": "ポップアウトの影"
},
@@ -5966,6 +6131,9 @@
"Release": {
"Release": "離す"
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "プラグインをリロード"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": "最後のユーザーを記憶"
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "削除"
},
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": "保存しています..."
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "スケール"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": "通知ルールを設定"
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": "設定"
},
@@ -6833,6 +7013,9 @@
"Show Workspace Apps": {
"Show Workspace Apps": "ワークスペースアプリを表示"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
},
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": "通知をミュート"
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "サイズ"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": ""
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": "小"
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": "概要"
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "日の出"
},
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "タイムアウト"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "最優先通知のタイムアウト"
},
@@ -7493,6 +7688,9 @@
"Title (optional)": {
"Title (optional)": ""
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": "タイトルの正規表現(任意)"
},
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "グリッドレイアウトを使用"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "IP ロケーションの使用"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": ""
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": "設定 → パーソナライズからグローバル等幅フォントを使用する"
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": "Gamma Control の共有設定を使用中"
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "視界"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": "視覚効果"
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "ウィジェット管理"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "ウィジェットのアウトライン"
},
@@ -8426,6 +8639,9 @@
"featured": {
"featured": "おすすめ"
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": "最後に確認されたのは 1%"
},
+216
View File
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1 dag"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "1 apparaat verbonden"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": "1 uur 30 minuten"
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1 minuut"
},
@@ -155,6 +161,9 @@
"1 task": {
"1 task": ""
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 minuten"
},
@@ -173,6 +182,9 @@
"15 min": {
"15 min": "15 min"
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": "15 minuten"
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": "30 min"
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": "30 minuten"
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": "45 seconden"
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 minuten"
},
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": "Toevoegen op adres"
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": ""
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": ""
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": ""
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": "Klikken door de widget heen laten gaan"
},
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": "Er moet ten minste één beeldscherm ingeschakeld blijven"
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": "Koppelen"
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "Auto (Breed)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "Automatische locatie"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "Automatische tussenruimte popups"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": "Automatische modus staat aan. Handmatige profielselectie is uitgeschakeld."
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "Automatisch wissen na"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": ""
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "Automatisch opslaan..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "Het scherm automatisch vergrendelen wanneer het systeem in slaapstand gaat"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": "Automatisering"
},
@@ -950,6 +995,9 @@
"Bar Configurations": {
"Bar Configurations": "Balkconfiguraties"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": "Balkschaduwen"
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": "Vervaag de achtergrond achter balken, pop-ups, modale vensters en meldingen. Vereist ondersteuning van de compositor en configuratie."
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "Achtergrond vervagen wanneer niri-overzicht open is"
},
"Body": {
"Body": "Inhoud"
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": "Vet"
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": "Agenda"
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "Camera"
},
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": ""
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "Kies welke beeldschermen deze widget tonen"
},
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "Regelt dekking van alle pop-outs, modale vensters en hun inhoudslagen"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": "Bepaalt omlijningen rond vervaagde voorgrondkaarten, pillen en meldingskaarten"
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": "Bepaalt de basisvervagingsstraal en verschuiving van schaduwen"
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": "Bepaalt de buitenrand van door het protocol vervaagde vensters"
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "Kritieke prioriteit"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": "Ctrl+Tab: Wissel tabblad • Ctrl+S: Vastzetten/losmaken • Shift+Del: Alles wissen • Esc: Sluiten"
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "DankBar"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "DankMaterialShell is klaar voor gebruik"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": ""
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": ""
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "Apparaatverbindingen"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": "Apparaatnamen bijgewerkt"
},
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "Dock & Starter"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "Dock-transparantie"
},
"Dock Visibility": {
"Dock Visibility": "Zichtbaarheid dock"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": "Marge, transparantie en rand van het dock"
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": "Rand waaruit de launcher schuift"
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "App bewerken"
},
@@ -2480,6 +2591,9 @@
"Edit clipboard text": {
"Edit clipboard text": ""
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
},
@@ -2597,6 +2711,9 @@
"End": {
"End": "Einde"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": "Vergroten bij aanwijzen"
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "Ethernet"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": "Elke 15 minuten"
},
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": "Bestandsbeheer"
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": "Bestandsbeheerder die wordt gebruikt om de prullenbak te openen. Kies \"aangepast\" om je eigen opdracht in te voeren."
},
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": "Plaats uw beveiligingssleutel..."
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "Installeren"
},
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "Wijzigingen behouden"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": "Blijf typen"
},
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "Handmatige grootte tussenruimte"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "Handmatig tonen/verbergen"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": "Max. actieve apps (0 = onbeperkt)"
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": "Max. volume"
},
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "New York, NY"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "Nieuwe groepsnaam..."
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "Geen helderheidsapparaten beschikbaar"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "Geen wijzigingen"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": "Geen recente klemborditems gevonden"
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": "Geen resultaten"
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": "Geen vensterregels geconfigureerd"
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": ""
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "Lettertype-instellingen Kladblok"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "Kladblok-uittrekpaneel"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": "Niets"
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": "Frame openen"
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": "Open KDE Connect op uw telefoon"
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": "Plakken"
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": "Pad naar een videobestand of map met video's"
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": ""
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": "Schaduwen pop-outs"
},
@@ -5966,6 +6131,9 @@
"Release": {
"Release": "Loslaten"
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "Plug-in herladen"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": "Onthoud laatste gebruiker"
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "Verwijderen"
},
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": "Opslaan..."
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "Schaal"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": "Meldingsregels instellen"
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": "Instelling"
},
@@ -6833,6 +7013,9 @@
"Show Workspace Apps": {
"Show Workspace Apps": "Werkblad-apps tonen"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
},
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": "Meldingen dempen"
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "Grootte"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": ""
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": "Klein"
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": "Samenvatting"
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "Zonsopgang"
},
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "Time-out"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "Time-out voor meldingen met kritieke prioriteit"
},
@@ -7493,6 +7688,9 @@
"Title (optional)": {
"Title (optional)": ""
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": "Titel-regex (optioneel)"
},
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "Rasterindeling gebruiken"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "IP-locatie gebruiken"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": ""
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": "Gebruikt globaal monospace-lettertype uit Instellingen → Personalisatie"
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": "Gebruikt gedeelde instellingen van Gammaregeling"
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "Zichtbaarheid"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": "Visuele effecten"
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "Widgetbeheer"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "Widget-omtrek"
},
@@ -8426,6 +8639,9 @@
"featured": {
"featured": "uitgelicht"
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": "laatst gezien %1"
},
+216
View File
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1 dzień"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "1 połączone urządzenie"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": ""
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1 minuta"
},
@@ -155,6 +161,9 @@
"1 task": {
"1 task": ""
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 minut"
},
@@ -173,6 +182,9 @@
"15 min": {
"15 min": ""
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": ""
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": ""
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": ""
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": ""
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 minut"
},
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": ""
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": ""
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": ""
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": ""
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": ""
},
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": ""
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": ""
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "Auto (Szeroki)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "Automatyczna lokalizacja"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "Automatyczne odstępy wyskakujących okienek"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": ""
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "Automatycznie czyść po"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": ""
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "Automatyczny zapis..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "Automatycznie blokuj ekran, gdy system przygotowuje się do wstrzymania"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": ""
},
@@ -950,6 +995,9 @@
"Bar Configurations": {
"Bar Configurations": "Konfiguracje pasków"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": ""
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": ""
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "Rozmyj tapetę, gdy podgląd niri jest otwarty"
},
"Body": {
"Body": ""
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": ""
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": ""
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "Kamera"
},
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": ""
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "Wybierz wyświetlacze na których pokaże się ten widżet"
},
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "Steruje kryciem wszystkich okien pop-up, modów i ich warstw zawartości"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": ""
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": ""
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": ""
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "Priorytet krytyczny"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": ""
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "DankBar"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "DankMaterialShell jest gotowy do użycia"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": ""
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": ""
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "Połączone urządzenia"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": ""
},
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "Dok i launcher"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "Przezroczystość Doka"
},
"Dock Visibility": {
"Dock Visibility": "Widoczność doku"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": ""
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": ""
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "Edytuj aplikację"
},
@@ -2480,6 +2591,9 @@
"Edit clipboard text": {
"Edit clipboard text": ""
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
},
@@ -2597,6 +2711,9 @@
"End": {
"End": "Koniec"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": ""
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "Ethernet"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": ""
},
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": ""
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": ""
},
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": ""
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "Instaluj"
},
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "Zachowaj zmiany"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": ""
},
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "Ręczny rozmiar odstępu"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "Ręczne pokazywanie/ukrywanie"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": ""
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": ""
},
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "Nowy Jork, NY"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "Nowa nazwa grupy..."
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "Brak dostępnych urządzeń jasności"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "Bez zmian"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": ""
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": ""
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": ""
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "Ustawienia czcionki notatnika"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "Wysuwany notatnik"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": ""
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": ""
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": ""
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": ""
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": ""
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": ""
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": ""
},
@@ -5966,6 +6131,9 @@
"Release": {
"Release": ""
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "Wczytaj ponownie wtyczkę"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": ""
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "Usuń"
},
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": ""
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "Skala"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": ""
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": ""
},
@@ -6833,6 +7013,9 @@
"Show Workspace Apps": {
"Show Workspace Apps": "Pokaż aplikacje z obszaru roboczego"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
},
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": ""
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "Rozmiar"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": ""
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": ""
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": ""
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "Wschód słońca"
},
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "Przekroczono limit czasu"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "Przekroczenie limitu czasu powiadomień o krytycznym priorytecie"
},
@@ -7493,6 +7688,9 @@
"Title (optional)": {
"Title (optional)": ""
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": ""
},
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "Użyj układu siatki"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "Użyj lokalizacji IP"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": ""
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": ""
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": ""
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "Widoczność"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": ""
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "Zarządzanie widżetami"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "Zarys widżetu"
},
@@ -8426,6 +8639,9 @@
"featured": {
"featured": ""
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": ""
},
+216
View File
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1 dia"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "1 dispositivo conectado"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": "1 hora e 30 minutos"
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1 minuto"
},
@@ -155,6 +161,9 @@
"1 task": {
"1 task": ""
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 minutos"
},
@@ -173,6 +182,9 @@
"15 min": {
"15 min": ""
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": "15 minutos"
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": ""
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": "30 minutos"
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": "45 segundos"
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 minutos"
},
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": "Adicionar por Endereço"
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": ""
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": ""
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": ""
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": "Permitir cliques passarem pelo widget"
},
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": ""
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": ""
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "Automático (Largo)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "Localização Automática"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "Espaçamento Automático de Popup"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": ""
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "Auto-Limpeza Depois"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": ""
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "Salvando automáticamente..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "Bloquear tela automaticamente quando o sistema é preparado para suspensão"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": "Automação"
},
@@ -950,6 +995,9 @@
"Bar Configurations": {
"Bar Configurations": "Configurações da Barra"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": "Sombras da Barra"
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": ""
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "Desfoque de papel de parede quando a visão geral do niri estiver aberta"
},
"Body": {
"Body": "Corpo"
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": ""
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": ""
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "Câmera"
},
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": ""
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "Escolha quais monitores mostrarão este widget"
},
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "Controla a opacidade de todos os popouts, modais e suas camadas de conteúdo"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": ""
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": ""
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": ""
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "Prioridade Crítica"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": ""
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "DankBar"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "DankMaterialShell está pronto para uso"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": ""
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": ""
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "Conexões de dispositivo"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": "Nomes de dispositivos atualizados"
},
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "Dock & Lançador"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "Transparência da Dock"
},
"Dock Visibility": {
"Dock Visibility": "Visibilidade do Dock"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": ""
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": ""
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "Editar Aplicativo"
},
@@ -2480,6 +2591,9 @@
"Edit clipboard text": {
"Edit clipboard text": ""
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
},
@@ -2597,6 +2711,9 @@
"End": {
"End": "Fim"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": "Aumentar ao Passar o Mouse"
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "Ethernet"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": ""
},
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": ""
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": ""
},
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": ""
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "Instalar"
},
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "Manter Alterações"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": ""
},
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "Espaçamento Manual"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "Mostrar/Esconder Manualmente"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": "Máximo de Aplicativos em Execução (0 = Ilimitado)"
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": "Volume Máximo"
},
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "Nova York, NY"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "Novo nome de grupo..."
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "Nenhum dispositivo de brilho disponível"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "Nenhuma alteração"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": "Nenhuma entrada recente de área de transferência encontrada"
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": ""
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": "Nenhuma regra de janela configurada"
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": ""
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "Configurações da Fonte do Bloco de Notas"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "Blocos de Notas Deslizante"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": "Nada"
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": ""
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": "Abra o KDE Connect em seu telefone"
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": "Colar"
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": "Caminho para um arquivo de vídeo ou pasta de vídeos"
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": ""
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": ""
},
@@ -5966,6 +6131,9 @@
"Release": {
"Release": "Soltar"
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "Reiniciar Plugin"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": "Lembrar último usuário"
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "Remover"
},
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": "Salvando..."
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "Escala"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": "Definir regras de notificação"
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": ""
},
@@ -6833,6 +7013,9 @@
"Show Workspace Apps": {
"Show Workspace Apps": "Mostrar Aplicativos da Área de Trabalho Virtual"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
},
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": ""
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "Tamanho"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": ""
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": "Pequeno"
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": "Resumo"
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "Nascer do Sol"
},
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "Tempo Limite Esgotado"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "Tempo limite para notificações de prioridade crítica"
},
@@ -7493,6 +7688,9 @@
"Title (optional)": {
"Title (optional)": ""
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": "Regex de Título (opcional)"
},
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "Usar Layout em Grade"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "Usar Localização do Endereço IP"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": ""
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": ""
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": "Usando configurações compartilhadas do Gamma Control"
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "Visibilidade"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": "Efeitos Visuais"
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "Gerenciamento de Widgets"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "Borda de Widgets"
},
@@ -8426,6 +8639,9 @@
"featured": {
"featured": "em destaque"
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": ""
},
+216
View File
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1 день"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "1 устройство подключено"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": "1 час 30 минут"
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1 минута"
},
@@ -155,6 +161,9 @@
"1 task": {
"1 task": ""
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 минут"
},
@@ -173,6 +182,9 @@
"15 min": {
"15 min": "15 мин"
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": "15 минут"
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": "30 мин"
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": "30 минут"
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": "45 секунд"
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 минут"
},
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": "Добавить по адресу"
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": ""
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": "Добавить нового пользователя в группу %1, чтобы он мог запустить dms greeter sync --profile."
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": "Разрешить"
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": "Разрешить клики проходить сквозь виджет"
},
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": "Как минимум один выход должен оставаться включённым"
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": "Подключить"
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "Авто (широкий)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "Автоматическое Определение Местоположения"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "Авто Всплывающее Отступы"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": "Включён автоматический режим. Ручной выбор профиля отключён."
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "Автоочистка через"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": ""
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "Автосохранение..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "Автоматически блокировать экран при подготовке системы к приостановке"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": "Автоматизация"
},
@@ -950,6 +995,9 @@
"Bar Configurations": {
"Bar Configurations": "Конфигурации бара"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": "Тени панели"
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": "Размывать фон за барами, всплывающими окнами, модальными окнами и уведомлениями. Требуется поддержка и настройка композитора."
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "Размытие обоев при открытом обзоре Niri"
},
"Body": {
"Body": "Заголовок"
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": "Полужирный"
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": "Календарь"
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "Камера"
},
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": ""
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "Выбрать, на каких дисплеях показывать этот виджет"
},
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "Контролирует непрозрачность всех всплывающих окон, модальных окон и их слоев контента"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": "Управляет контурами вокруг размытых карточек переднего плана, плашек и карточек уведомлений"
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": "Управляет базовым радиусом размытия и смещением теней"
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": "Управляет внешним краем окон с размытием по протоколу"
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "Критический Приоритет"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": "Ctrl+Tab: переключить вкладку • Ctrl+S: закрепить/открепить • Shift+Del: очистить всё • Esc: закрыть"
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "DankBar"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "DankMaterialShell готов к использованию"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": "Сочетание клавиш лаунчера по умолчанию"
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": "Открытие по умолчанию"
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "Подключения устройств"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": "Имена устройств обновлены"
},
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "Док & Лаунчер"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "Прозрачность Дока"
},
"Dock Visibility": {
"Dock Visibility": "Видимость дока"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": "Поля, прозрачность и рамка дока"
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": "Край, с которого выдвигается лаунчер"
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "Изменить приложение"
},
@@ -2480,6 +2591,9 @@
"Edit clipboard text": {
"Edit clipboard text": "Редактировать текст буфера обмена"
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
},
@@ -2597,6 +2711,9 @@
"End": {
"End": "Конец"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": "Увеличивать при наведении"
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "Ethernet"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": "Каждые 15 минут"
},
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": "Файловый менеджер"
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": "Файловый менеджер, используемый для открытия корзины. Выберите «custom», чтобы ввести собственную команду."
},
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": "Вставьте ключ безопасности..."
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "Установить"
},
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "Сохранить изменения"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": "Продолжайте ввод"
},
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "Ручной размер отступа"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "Ручное Отображение/Скрытие"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": "Макс запущенных приложений (0 = безлимитно)"
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": "Максимальная громкость"
},
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "Нью-Йорк, NY"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "Новое название группы..."
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "Устройства яркости недоступны"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "Нет изменений"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": "Недавние записи буфера обмена не найдены"
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": "Нет результатов"
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": "Правила окон не настроены"
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": ""
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "Настройки Шрифта Блокнота"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "Выезжающий блокнот"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": "Ничего"
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": "Разомкнутая рамка"
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": "Откройте KDE Connect на телефоне"
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": "Вставить"
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": "Путь к видеофайлу или папке с видео"
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": "Интеграция с Polkit отключена. Управление пользователями требует Polkit для повышения привилегий."
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": "Тени всплывающих окон"
},
@@ -5966,6 +6131,9 @@
"Release": {
"Release": "Релиз"
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "Перезагрузить плагин"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": "Запомнить последнего пользователя"
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "Удалить"
},
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": "Сохранение..."
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "Масштаб"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": "Установить правила уведомлений"
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": "Параметр"
},
@@ -6833,6 +7013,9 @@
"Show Workspace Apps": {
"Show Workspace Apps": "Показать приложения рабочего пространства"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
},
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": "Приглушить уведомления"
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "Размер"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": ""
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": "Маленький"
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": "Заголовок"
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "Восход"
},
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "Тайм-аут"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "Тайм-аут для уведомлений критического приоритета"
},
@@ -7493,6 +7688,9 @@
"Title (optional)": {
"Title (optional)": ""
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": "Regex заголовка (необязательно)"
},
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "Использовать макет сетки"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "Используемый IP"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": "Использует IPC-действие spotlight-bar и всегда открывает минималистичную панель."
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": "Используется глобальный моноширинный шрифт из Настройки → Персонализация"
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": "Использование общих настроек из Gamma Control"
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "Видимость"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": "Визуальные эффекты"
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "Управление виджетами"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "Контур виджета"
},
@@ -8426,6 +8639,9 @@
"featured": {
"featured": "избранное"
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": "был в сети %1"
},
+216
View File
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1 dag"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "1 enhet ansluten"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": "1 timme 30 minuter"
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1 minut"
},
@@ -155,6 +161,9 @@
"1 task": {
"1 task": ""
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 minuter"
},
@@ -173,6 +182,9 @@
"15 min": {
"15 min": ""
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": "15 minuter"
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": ""
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": "30 minuter"
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": "45 sekunder"
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 minuter"
},
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": "Lägg till med adress"
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": ""
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": ""
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": ""
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": "Tillåt klick att passera genom widgeten"
},
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": ""
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": "Anslut"
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "Automatisk (bred)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "Automatisk plats"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "Automatiska mellanrum för popupfönster"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": ""
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "Rensa automatiskt efter"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": ""
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "Sparar automatiskt..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "Lås skärmen automatiskt när systemet förbereder sig för strömsparläge"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": "Automatisering"
},
@@ -950,6 +995,9 @@
"Bar Configurations": {
"Bar Configurations": "Menyradskonfigurationer"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": "Menyradsskuggor"
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": ""
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "Oskärpa bakgrundsbild när niri-översikten är öppen"
},
"Body": {
"Body": "Brödtext"
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": ""
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": ""
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "Kamera"
},
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": ""
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "Välj vilka bildskärmar som visar denna widget"
},
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "Styr opaciteten för alla popupfönster, dialogrutor och deras innehållslager"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": ""
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": "Styr grundoskärperadien och förskjutningen av skuggor"
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": ""
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "Kritisk prioritet"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": ""
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "DankBar"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "DankMaterialShell är redo att användas"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": ""
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": ""
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "Enhetsanslutningar"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": "Enhetsnamn uppdaterade"
},
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "Dock & Appstartare"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "Genomskinlighet på Dock"
},
"Dock Visibility": {
"Dock Visibility": "Docksynlighet"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": ""
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": ""
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "Redigera app"
},
@@ -2480,6 +2591,9 @@
"Edit clipboard text": {
"Edit clipboard text": ""
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
},
@@ -2597,6 +2711,9 @@
"End": {
"End": "Slut"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": "Förstora vid hovring"
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "Ethernet"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": ""
},
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": ""
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": ""
},
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": ""
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "Installera"
},
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "Behåll ändringar"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": ""
},
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "Manuell storlek på mellanrum"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "Göm och visa manuellt"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": "Max aktiva appar (0 = obegränsat)"
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": "Maxvolym"
},
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "New York, NY"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "Nytt gruppnamn..."
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "Inga ljusstyrkeenheter tillgängliga"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "Inga ändringar"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": "Inga nyliga urklippsposter hittades"
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": ""
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": "Inga fönsterregler konfigurerade"
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": ""
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "Teckensnittsinställningar för Anteckningar"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "Anteckningspanel"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": "Inget"
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": ""
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": "Öppna KDE Connect på din telefon"
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": "Klistra in"
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": "Sökväg till en videofil eller mapp med videor"
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": ""
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": "Popupfönsterskuggor"
},
@@ -5966,6 +6131,9 @@
"Release": {
"Release": "Släpp"
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "Ladda om tillägg"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": "Kom ihåg senaste användare"
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "Ta bort"
},
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": "Sparar..."
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "Skala"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": "Ange notisregler"
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": ""
},
@@ -6833,6 +7013,9 @@
"Show Workspace Apps": {
"Show Workspace Apps": "Visa appar i en arbetsyta"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
},
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": ""
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "Storlek"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": ""
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": "Liten"
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": "Sammanfattning"
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "Soluppgång"
},
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "Tidsgräns överskriden"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "Tidsgräns för aviseringar med kritisk prioritet"
},
@@ -7493,6 +7688,9 @@
"Title (optional)": {
"Title (optional)": ""
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": "Titelregex (valfritt)"
},
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "Använd rutnätslayout"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "Använd IP-plats"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": ""
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": ""
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": "Använder delade inställningar från Gammakontroll"
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "Synlighet"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": "Visuella effekter"
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "Widgethantering"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "Widgetkantlinje"
},
@@ -8426,6 +8639,9 @@
"featured": {
"featured": "utvald"
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": ""
},
+216
View File
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1 gün"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": ""
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": ""
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1 dakika"
},
@@ -155,6 +161,9 @@
"1 task": {
"1 task": ""
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 dakika"
},
@@ -173,6 +182,9 @@
"15 min": {
"15 min": ""
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": ""
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": ""
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": ""
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": ""
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 dakika"
},
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": ""
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": ""
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": ""
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": ""
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": ""
},
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": ""
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": ""
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "Oto (Geniş)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "Otomatik Konum"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "Otomatik Açılır Pencere Boşlukları"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": ""
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "Sonra Otomatik Sil"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": ""
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "Otomatik kaydetme..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "Sistem askıya alınmaya hazırlanırken ekranı otomatik olarak kilitle"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": ""
},
@@ -950,6 +995,9 @@
"Bar Configurations": {
"Bar Configurations": "Bar Ayarları"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": ""
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": ""
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "Niri genel görünümü açıkken duvar kağıdını bulanıklaştır"
},
"Body": {
"Body": ""
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": ""
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": ""
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "Kamera"
},
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": ""
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "Bu widget'ı hangi ekranlarda göstereceğinizi seçin"
},
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "Tüm açılır pencerelerin, modal pencerelerin ve bunların içerik katmanlarının opaklığını kontrol eder."
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": ""
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": ""
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": ""
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "Kritik Öncelik"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": ""
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": ""
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": ""
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": ""
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": ""
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "Cihaz bağlantıları"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": ""
},
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "Dock & Başlatıcı"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "Dock Şeffaflığı"
},
"Dock Visibility": {
"Dock Visibility": "Dock Görünürlüğü"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": ""
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": ""
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": ""
},
@@ -2480,6 +2591,9 @@
"Edit clipboard text": {
"Edit clipboard text": ""
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
},
@@ -2597,6 +2711,9 @@
"End": {
"End": "Son"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": ""
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "Ethernet"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": ""
},
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": ""
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": ""
},
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": ""
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "Yükle"
},
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "Değişiklikleri Tut"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": ""
},
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "Manuel Boşluk Boyutu"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "Manuel Göster/Gizle"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": ""
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": ""
},
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "New York, NY"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": ""
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "Parlaklık cihazı yok"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "Değişiklik yok"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": ""
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": ""
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": ""
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "Not Defteri Yazı Tipi Ayarları"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "Not Defteri Kaydırma"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": ""
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": ""
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": ""
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": ""
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": ""
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": ""
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": ""
},
@@ -5966,6 +6131,9 @@
"Release": {
"Release": ""
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "Eklentiyi Yeniden Yükle"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": ""
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "Kaldır"
},
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": ""
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "Ölçek"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": ""
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": ""
},
@@ -6833,6 +7013,9 @@
"Show Workspace Apps": {
"Show Workspace Apps": "Çalışma Alanı Uygulamalarını Göster"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
},
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": ""
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "Boyut"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": ""
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": ""
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": ""
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "Gündoğumu"
},
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "Zaman Aşımı"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "Kritik öncelikli bildirimler için zaman aşımı"
},
@@ -7493,6 +7688,9 @@
"Title (optional)": {
"Title (optional)": ""
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": ""
},
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "Izgara Düzeni Kullan"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "IP Konumunu Kullan"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": ""
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": ""
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": ""
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "Görüş"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": ""
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "Widget Yönetimi"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "Widget Çerçevesi"
},
@@ -8426,6 +8639,9 @@
"featured": {
"featured": ""
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": ""
},
File diff suppressed because it is too large Load Diff
+218 -2
View File
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1 天"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "已连接 1 个设备"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": "1 小时 30 分钟"
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1 分钟"
},
@@ -155,6 +161,9 @@
"1 task": {
"1 task": ""
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 分钟"
},
@@ -173,6 +182,9 @@
"15 min": {
"15 min": "15 分钟"
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": "15 分钟"
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": "30 分钟"
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": "30 分钟"
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": "45 秒钟"
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 分钟"
},
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": "通过地址添加"
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": "添加匹配条件"
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": "将新用户添加到 %1 组,使其能够运行 dms greeter sync --profile。"
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": "允许"
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": "允许鼠标穿透部件"
},
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": "至少应有一个输出保持启用"
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": "附加"
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "自动(宽角)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "自动定位"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "自动弹窗间隙"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": "自动模式已开启。手动选择配置已禁用。"
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "自动清除"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": "启动时自动登录"
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "正在自动保存..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "当系统准备挂起时自动锁定屏幕"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": "自动化"
},
@@ -950,6 +995,9 @@
"Bar Configurations": {
"Bar Configurations": "状态栏设置"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": "状态栏阴影"
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": "模糊状态栏、弹窗、模态框以及通知的背景。需要合成器支持与配置。"
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "打开 Niri 概览时模糊壁纸"
},
"Body": {
"Body": "主体"
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": "粗体"
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": "日历"
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "摄像头"
},
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": "选择需要启动的桌面应用程序或命令"
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "选择要在哪个显示器显示该小部件"
},
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "控制所有弹窗、模态框及其内容层的透明度"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": "控制已模糊处理的前景卡片、按钮和通知卡片的轮廓"
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": "控制阴影的基础模糊半径和偏移量"
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": "控制协议模糊窗口的边缘"
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "紧急优先级"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": "Ctrl+Tab:切换标签 • Ctrl+S:固定/取消固定 • Shift+Del:全部清除 • Esc:关闭"
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "Dank 状态栏"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "DankMaterialShell 现已可用"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": "默认启动器快捷键"
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": "默认打开"
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "设备连接"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": "设备名已更新"
},
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "程序坞和启动器"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "程序坞透明度"
},
"Dock Visibility": {
"Dock Visibility": "程序坞可见性"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": "程序坞边距、透明度和边框"
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": "启动器滑入侧"
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "编辑应用"
},
@@ -2480,6 +2591,9 @@
"Edit clipboard text": {
"Edit clipboard text": "编辑剪贴板文本"
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
},
@@ -2597,6 +2711,9 @@
"End": {
"End": "结束"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": "悬停放大"
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "以太网"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": "每 15 分钟"
},
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": "文件管理器"
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": "打开回收站的文件管理器。点击“自定义”以输入自定义命令。"
},
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": "请输入安全密钥..."
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "安装"
},
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "保持更改"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": "继续输入"
},
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "手动设置间隙大小"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "手动显示/隐藏"
},
@@ -4314,7 +4449,7 @@
"Material Colors": "Material 配色"
},
"Material Design inspired color themes": {
"Material Design inspired color themes": "受 Material 设计启发的颜色主题"
"Material Design inspired color themes": "受 Material Design 启发的颜色主题"
},
"Material colors generated from wallpaper": {
"Material colors generated from wallpaper": "从壁纸生成的 Material 色彩"
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": "最大运行应用数 (0 = 无限制)"
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": "最大音量"
},
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "纽约,美国纽约州"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "新分组名称..."
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "无可用亮度设备"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "无更改"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": "未找到近期剪切板项目"
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": "无结果"
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": "未配置窗口规则"
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": "噪点"
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "便签字体设置"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "便签侧边栏"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": "无"
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": "打开框架"
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": "在你的手机上打开 KDE Connect"
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": "粘贴"
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": "视频文件路径或包含视频的文件夹"
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": "Polkit 集成已禁用。用户管理需要 Polkit 提升权限。"
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": "弹窗阴影"
},
@@ -5966,6 +6131,9 @@
"Release": {
"Release": "松开"
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "重载插件"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": "记住上次的用户"
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "移除"
},
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": "正在保存..."
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "缩放"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": "设置通知规则"
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": "设置项"
},
@@ -6732,7 +6912,7 @@
"Show Log Out": "显示注销"
},
"Show Material Design ripple animations on interactive elements": {
"Show Material Design ripple animations on interactive elements": "在交互元素上显示 Material 设计的波纹动画"
"Show Material Design ripple animations on interactive elements": "在交互元素上显示 Material Design 的波纹动画"
},
"Show Media Player": {
"Show Media Player": "显示媒体播放器"
@@ -6833,6 +7013,9 @@
"Show Workspace Apps": {
"Show Workspace Apps": "显示工作区内应用"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
},
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": "静默通知"
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "尺寸"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": "系统启动后直到你退出登录前,都会跳过登录界面的密码验证。锁屏解锁方式不变。同步后在下次重启时生效。"
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": "较小"
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": "概要"
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "日出"
},
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "超时"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "关键优先级通知的超时时间"
},
@@ -7493,6 +7688,9 @@
"Title (optional)": {
"Title (optional)": ""
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": "标题正则(可选)"
},
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "使用网格布局"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "使用 IP 定位"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": "使用 spotlight-bar IPC 动作,并始终打开聚焦搜索栏。"
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": "正在使用“设置” → “个性化”中的全局等宽字体"
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": "使用伽马控制的已共享设置"
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "可见性"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": "视觉效果"
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "部件管理"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "部件轮廓"
},
@@ -8426,6 +8639,9 @@
"featured": {
"featured": "精选"
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": "上次在线:%1"
},
@@ -134,6 +134,9 @@
"1 day": {
"1 day": "1 天"
},
"1 day before": {
"1 day before": ""
},
"1 device connected": {
"1 device connected": "已連接 1 個裝置"
},
@@ -143,6 +146,9 @@
"1 hour 30 minutes": {
"1 hour 30 minutes": "1 小時 30 分鐘"
},
"1 hour before": {
"1 hour before": ""
},
"1 minute": {
"1 minute": "1 分鐘"
},
@@ -155,6 +161,9 @@
"1 task": {
"1 task": ""
},
"10 min before": {
"10 min before": ""
},
"10 minutes": {
"10 minutes": "10 分鐘"
},
@@ -173,6 +182,9 @@
"15 min": {
"15 min": "15 分鐘"
},
"15 min before": {
"15 min before": ""
},
"15 minutes": {
"15 minutes": "15 分鐘"
},
@@ -230,6 +242,9 @@
"30 min": {
"30 min": "30 分鐘"
},
"30 min before": {
"30 min before": ""
},
"30 minutes": {
"30 minutes": "30 分鐘"
},
@@ -254,6 +269,9 @@
"45 seconds": {
"45 seconds": "45 秒"
},
"5 min before": {
"5 min before": ""
},
"5 minutes": {
"5 minutes": "5 分鐘"
},
@@ -449,9 +467,15 @@
"Add by Address": {
"Add by Address": "按位址新增"
},
"Add location": {
"Add location": ""
},
"Add match": {
"Add match": "新增匹配條件"
},
"Add notes": {
"Add notes": ""
},
"Add the new user to the %1 group so they can run dms greeter sync --profile.": {
"Add the new user to the %1 group so they can run dms greeter sync --profile.": "將新使用者加入至 %1 群組,以便他們可以執行 dms greeter sync --profile。"
},
@@ -500,6 +524,9 @@
"Allow": {
"Allow": "允許"
},
"Allow adjusting device volume by scrolling on the right half of items in the device list": {
"Allow adjusting device volume by scrolling on the right half of items in the device list": ""
},
"Allow clicks to pass through the widget": {
"Allow clicks to pass through the widget": "允許點擊穿透小工具"
},
@@ -686,6 +713,9 @@
"At least one output must remain enabled": {
"At least one output must remain enabled": "至少一個輸出必須保持啟用"
},
"At start": {
"At start": ""
},
"Attach": {
"Attach": "附加"
},
@@ -776,15 +806,24 @@
"Auto (Wide)": {
"Auto (Wide)": "自動 (寬)"
},
"Auto Compositor Gaps": {
"Auto Compositor Gaps": ""
},
"Auto Location": {
"Auto Location": "自動定位"
},
"Auto Overflow": {
"Auto Overflow": ""
},
"Auto Popup Gaps": {
"Auto Popup Gaps": "自動調整彈出間隔"
},
"Auto mode is on. Manual profile selection is disabled.": {
"Auto mode is on. Manual profile selection is disabled.": "自動模式已開啟。手動選擇設定檔已停用。"
},
"Auto saved": {
"Auto saved": ""
},
"Auto-Clear After": {
"Auto-Clear After": "自動清除於"
},
@@ -815,6 +854,9 @@
"Auto-login on startup": {
"Auto-login on startup": "開機自動登入"
},
"Auto-save to disk": {
"Auto-save to disk": ""
},
"Auto-saving...": {
"Auto-saving...": "自動保存..."
},
@@ -866,6 +908,9 @@
"Automatically lock the screen when the system prepares to suspend": {
"Automatically lock the screen when the system prepares to suspend": "睡眠時自動鎖定螢幕"
},
"Automatically save changes to opened files as you type": {
"Automatically save changes to opened files as you type": ""
},
"Automation": {
"Automation": "自動化"
},
@@ -950,6 +995,9 @@
"Bar Configurations": {
"Bar Configurations": "欄設定"
},
"Bar Opacity": {
"Bar Opacity": ""
},
"Bar Shadows": {
"Bar Shadows": "列陰影"
},
@@ -1052,12 +1100,18 @@
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.": "模糊 bar、彈出視窗、模態視窗和通知後面的背景。需要合成器支援和配置。"
},
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": {
"Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.": ""
},
"Blur wallpaper when niri overview is open": {
"Blur wallpaper when niri overview is open": "當 niri 概覽打開時模糊桌布"
},
"Body": {
"Body": "主體"
},
"Body Font Size": {
"Body Font Size": ""
},
"Bold": {
"Bold": "粗體"
},
@@ -1178,6 +1232,9 @@
"Calendar": {
"Calendar": "日曆"
},
"Calendar Backend": {
"Calendar Backend": ""
},
"Camera": {
"Camera": "相機"
},
@@ -1343,6 +1400,9 @@
"Choose whether to launch a desktop app or a command": {
"Choose whether to launch a desktop app or a command": "選擇要啟動桌面應用程式還是指令"
},
"Choose which action buttons appear on clipboard entries": {
"Choose which action buttons appear on clipboard entries": ""
},
"Choose which displays show this widget": {
"Choose which displays show this widget": "選擇哪些顯示器顯示此小工具"
},
@@ -1703,6 +1763,24 @@
"Controls opacity of all popouts, modals, and their content layers": {
"Controls opacity of all popouts, modals, and their content layers": "控制所有彈出視窗、互動視窗及其內容層的透明度"
},
"Controls opacity of shell surfaces, popouts, and modals": {
"Controls opacity of shell surfaces, popouts, and modals": ""
},
"Controls opacity of the bar background": {
"Controls opacity of the bar background": ""
},
"Controls opacity of the border": {
"Controls opacity of the border": ""
},
"Controls opacity of the shadow layer": {
"Controls opacity of the shadow layer": ""
},
"Controls opacity of the widget outline": {
"Controls opacity of the widget outline": ""
},
"Controls opacity of widget backgrounds": {
"Controls opacity of widget backgrounds": ""
},
"Controls outlines around blurred foreground cards, pills, and notification cards": {
"Controls outlines around blurred foreground cards, pills, and notification cards": "控制模糊前景卡片、藥丸狀元素和通知卡片周圍的輪廓"
},
@@ -1712,6 +1790,9 @@
"Controls the base blur radius and offset of shadows": {
"Controls the base blur radius and offset of shadows": "控制陰影的基本模糊半徑和偏移"
},
"Controls the opacity of the shadow": {
"Controls the opacity of the shadow": ""
},
"Controls the outer edge of protocol-blurred windows": {
"Controls the outer edge of protocol-blurred windows": "控制協定模糊視窗的外邊緣"
},
@@ -1817,6 +1898,12 @@
"Critical Priority": {
"Critical Priority": "關鍵優先級"
},
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": {
"Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close": ""
},
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": {
"Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find": ""
},
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": {
"Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close": "Ctrl+Tab:切換分頁 • Ctrl+S:釘選/取消釘選 • Shift+Del:全部清除 • Esc:關閉"
},
@@ -2012,6 +2099,15 @@
"DankBar": {
"DankBar": "DankBar"
},
"DankCalendar": {
"DankCalendar": ""
},
"DankCalendar isn't installed": {
"DankCalendar isn't installed": ""
},
"DankCalendar isn't running": {
"DankCalendar isn't running": ""
},
"DankMaterialShell is ready to use": {
"DankMaterialShell is ready to use": "DankMaterialShell 已可使用"
},
@@ -2078,6 +2174,9 @@
"Default Launcher Shortcut": {
"Default Launcher Shortcut": "預設啟動器捷徑"
},
"Default Mode": {
"Default Mode": ""
},
"Default Opens": {
"Default Opens": "預設開啟方式"
},
@@ -2195,6 +2294,9 @@
"Device connections": {
"Device connections": "裝置連線"
},
"Device list scroll volume": {
"Device list scroll volume": ""
},
"Device names updated": {
"Device names updated": "裝置名稱已更新"
},
@@ -2369,12 +2471,18 @@
"Dock & Launcher": {
"Dock & Launcher": "Dock 和啟動器"
},
"Dock Opacity": {
"Dock Opacity": ""
},
"Dock Transparency": {
"Dock Transparency": "Dock 透明度"
},
"Dock Visibility": {
"Dock Visibility": "Dock 可見性"
},
"Dock margin, opacity, and border": {
"Dock margin, opacity, and border": ""
},
"Dock margin, transparency, and border": {
"Dock margin, transparency, and border": "Dock 邊距、透明度和邊框"
},
@@ -2465,6 +2573,9 @@
"Edge the launcher slides from": {
"Edge the launcher slides from": "啟動器滑出的邊緣"
},
"Edit": {
"Edit": ""
},
"Edit App": {
"Edit App": "編輯應用程式"
},
@@ -2480,6 +2591,9 @@
"Edit clipboard text": {
"Edit clipboard text": "編輯剪貼簿文字"
},
"Edit event": {
"Edit event": ""
},
"Editing changes on %1": {
"Editing changes on %1": ""
},
@@ -2597,6 +2711,9 @@
"End": {
"End": "結束"
},
"End must be after start": {
"End must be after start": ""
},
"Enlarge on Hover": {
"Enlarge on Hover": "懸停時放大"
},
@@ -2681,6 +2798,9 @@
"Ethernet": {
"Ethernet": "乙太網路"
},
"Event title": {
"Event title": ""
},
"Every 15 minutes": {
"Every 15 minutes": "每 15 分鐘"
},
@@ -3029,6 +3149,9 @@
"File Manager": {
"File Manager": "檔案管理員"
},
"File changed on disk": {
"File changed on disk": ""
},
"File manager used to open the trash. Pick \"custom\" to enter your own command.": {
"File manager used to open the trash. Pick \"custom\" to enter your own command.": "檔案管理器用於開啟垃圾桶。選擇「自訂」以輸入您自己的指令。"
},
@@ -3839,6 +3962,9 @@
"Insert your security key...": {
"Insert your security key...": "插入您的安全金鑰..."
},
"Inset the Notepad from screen edges using the compositor's configured gaps": {
"Inset the Notepad from screen edges using the compositor's configured gaps": ""
},
"Install": {
"Install": "安裝"
},
@@ -3947,6 +4073,12 @@
"Keep Changes": {
"Keep Changes": "保留變更"
},
"Keep My Edits": {
"Keep My Edits": ""
},
"Keep in Bar": {
"Keep in Bar": ""
},
"Keep typing": {
"Keep typing": "繼續輸入"
},
@@ -4274,6 +4406,9 @@
"Manual Gap Size": {
"Manual Gap Size": "手動調整間隔"
},
"Manual Gaps": {
"Manual Gaps": ""
},
"Manual Show/Hide": {
"Manual Show/Hide": "手動顯示/隱藏"
},
@@ -4358,6 +4493,9 @@
"Max Running Apps (0 = Unlimited)": {
"Max Running Apps (0 = Unlimited)": "最多執行中應用程式 (0 = 無限制)"
},
"Max Visible": {
"Max Visible": ""
},
"Max Volume": {
"Max Volume": "最大音量"
},
@@ -4706,6 +4844,9 @@
"New York, NY": {
"New York, NY": "紐約"
},
"New event": {
"New event": ""
},
"New group name...": {
"New group name...": "新群組名稱..."
},
@@ -4841,6 +4982,9 @@
"No brightness devices available": {
"No brightness devices available": "沒有可用的亮度裝置"
},
"No calendar source available": {
"No calendar source available": ""
},
"No changes": {
"No changes": "無更改"
},
@@ -4967,6 +5111,9 @@
"No recent clipboard entries found": {
"No recent clipboard entries found": "找不到近期剪貼簿項目"
},
"No reminder": {
"No reminder": ""
},
"No results": {
"No results": "無結果"
},
@@ -5030,6 +5177,9 @@
"No window rules configured": {
"No window rules configured": "未設定任何視窗規則"
},
"No writable calendar available": {
"No writable calendar available": ""
},
"Noise": {
"Noise": "雜訊"
},
@@ -5090,9 +5240,15 @@
"Notepad Font Settings": {
"Notepad Font Settings": "筆記本字體設定"
},
"Notepad Settings": {
"Notepad Settings": ""
},
"Notepad Slideout": {
"Notepad Slideout": "記事本滑出"
},
"Notes": {
"Notes": ""
},
"Nothing": {
"Nothing": "無內容"
},
@@ -5216,6 +5372,9 @@
"Open Frame": {
"Open Frame": "打開框架"
},
"Open From": {
"Open From": ""
},
"Open KDE Connect on your phone": {
"Open KDE Connect on your phone": "在您的手機上開啟 KDE Connect"
},
@@ -5459,6 +5618,9 @@
"Paste": {
"Paste": "貼上"
},
"Path copied to clipboard": {
"Path copied to clipboard": ""
},
"Path to a video file or folder containing videos": {
"Path to a video file or folder containing videos": "影片檔案或包含影片的資料夾路徑"
},
@@ -5645,6 +5807,9 @@
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": {
"Polkit integration is disabled. User management requires Polkit to elevate privileges.": "Polkit 整合已停用。使用者管理需要 Polkit 來提升權限。"
},
"Popout": {
"Popout": ""
},
"Popout Shadows": {
"Popout Shadows": "彈出陰影"
},
@@ -5966,6 +6131,9 @@
"Release": {
"Release": "放開"
},
"Reload From Disk": {
"Reload From Disk": ""
},
"Reload Plugin": {
"Reload Plugin": "重新載入插件"
},
@@ -5987,6 +6155,9 @@
"Remember last user": {
"Remember last user": "記住上次用戶"
},
"Reminder": {
"Reminder": ""
},
"Remove": {
"Remove": "刪除"
},
@@ -6287,6 +6458,9 @@
"Saving...": {
"Saving...": "儲存中..."
},
"Saving…": {
"Saving…": ""
},
"Scale": {
"Scale": "縮放"
},
@@ -6575,6 +6749,12 @@
"Set notification rules": {
"Set notification rules": "設定通知規則"
},
"Set the font size for notification body text (htmlBody)": {
"Set the font size for notification body text (htmlBody)": ""
},
"Set the font size for notification summary text": {
"Set the font size for notification summary text": ""
},
"Setting": {
"Setting": "設定"
},
@@ -6833,6 +7013,9 @@
"Show Workspace Apps": {
"Show Workspace Apps": "顯示工作區應用程式"
},
"Show a bar that drains as the popup's auto-dismiss timer runs": {
"Show a bar that drains as the popup's auto-dismiss timer runs": ""
},
"Show all 9 tags instead of only occupied tags": {
"Show all 9 tags instead of only occupied tags": ""
},
@@ -6974,6 +7157,9 @@
"Silence notifications": {
"Silence notifications": "靜音通知"
},
"Single-Line Popup": {
"Single-Line Popup": ""
},
"Size": {
"Size": "大小"
},
@@ -6998,6 +7184,9 @@
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": {
"Skip the greeter password after boot until you sign out. Lock screen unlock is unchanged. Takes effect on the next reboot after sync.": "開機後跳過歡迎介面密碼,直到您登出為止。鎖定螢幕解鎖不受影響。同步後於下次重新開機時生效。"
},
"Slideout": {
"Slideout": ""
},
"Small": {
"Small": "小"
},
@@ -7124,6 +7313,9 @@
"Summary": {
"Summary": "摘要"
},
"Summary Font Size": {
"Summary Font Size": ""
},
"Sunrise": {
"Sunrise": "日出"
},
@@ -7472,6 +7664,9 @@
"Timed Out": {
"Timed Out": "逾時"
},
"Timeout Progress Bar": {
"Timeout Progress Bar": ""
},
"Timeout for critical priority notifications": {
"Timeout for critical priority notifications": "緊急優先級通知的超時"
},
@@ -7493,6 +7688,9 @@
"Title (optional)": {
"Title (optional)": ""
},
"Title is required": {
"Title is required": ""
},
"Title regex (optional)": {
"Title regex (optional)": "標題正規表達式 (選用)"
},
@@ -7832,6 +8030,9 @@
"Use Grid Layout": {
"Use Grid Layout": "使用網格佈局"
},
"Use HH:MM time format": {
"Use HH:MM time format": ""
},
"Use IP Location": {
"Use IP Location": "使用 IP 位置"
},
@@ -7970,9 +8171,15 @@
"Uses the spotlight-bar IPC action and always opens the minimal bar.": {
"Uses the spotlight-bar IPC action and always opens the minimal bar.": "使用 spotlight-bar IPC 動作並始終開啟簡約工具列。"
},
"Using DankCalendar%1": {
"Using DankCalendar%1": ""
},
"Using global monospace font from Settings → Personalization": {
"Using global monospace font from Settings → Personalization": "使用來自「設定」→「個人化」的全域等寬字體"
},
"Using khal": {
"Using khal": ""
},
"Using shared settings from Gamma Control": {
"Using shared settings from Gamma Control": "使用 Gamma Control 的共享設定"
},
@@ -8060,6 +8267,9 @@
"Visibility": {
"Visibility": "能見度"
},
"Visible Entry Actions": {
"Visible Entry Actions": ""
},
"Visual Effects": {
"Visual Effects": "視覺效果"
},
@@ -8183,6 +8393,9 @@
"Widget Management": {
"Widget Management": "部件管理"
},
"Widget Opacity": {
"Widget Opacity": ""
},
"Widget Outline": {
"Widget Outline": "部件外框"
},
@@ -8426,6 +8639,9 @@
"featured": {
"featured": "精選"
},
"khal": {
"khal": ""
},
"last seen %1": {
"last seen %1": "上次看到 %1"
},
@@ -428,6 +428,28 @@
],
"description": "Automatically determine your location using your IP address"
},
{
"section": "calendarBackend",
"label": "Calendar Backend",
"tabIndex": 1,
"category": "Time & Weather",
"keywords": [
"backend",
"calendar",
"clock",
"daemon",
"dankcalendar",
"date",
"day",
"events",
"forecast",
"khal",
"month",
"time",
"weather",
"year"
]
},
{
"section": "dateFormat",
"label": "Date Format",
@@ -1818,21 +1840,6 @@
"icon": "rounded_corner",
"description": "Remove corner rounding from the bar"
},
{
"section": "_tab_6",
"label": "Dank Bar",
"tabIndex": 6,
"category": "Dank Bar",
"keywords": [
"bar",
"dank",
"panel",
"statusbar",
"taskbar",
"topbar"
],
"icon": "toolbar"
},
{
"section": "barAppearance",
"label": "Dank Bar",
@@ -6369,25 +6376,6 @@
],
"description": "Choose where on-screen displays appear on screen"
},
{
"section": "_tab_18",
"label": "On-screen Displays",
"tabIndex": 18,
"category": "On-screen Displays",
"keywords": [
"displays",
"indicator",
"monitor",
"monitors",
"osd",
"output",
"outputs",
"popup",
"screen",
"screens"
],
"icon": "tune"
},
{
"section": "osd",
"label": "On-screen Displays",
@@ -6523,20 +6511,6 @@
"icon": "tune",
"description": "Open a terminal and run a custom command instead of the in-shell upgrade flow."
},
{
"section": "_tab_20",
"label": "System Updater",
"tabIndex": 20,
"category": "System Updater",
"keywords": [
"packages",
"system",
"updater",
"updates",
"upgrade"
],
"icon": "refresh"
},
{
"section": "systemUpdater",
"label": "System Updater",
@@ -7991,19 +7965,6 @@
],
"description": "Reveal the arcs where surfaces meet the frame"
},
{
"section": "_tab_33",
"label": "Frame",
"tabIndex": 33,
"category": "Frame",
"keywords": [
"border",
"decoration",
"frame",
"window"
],
"icon": "frame_source"
},
{
"section": "frameEnabled",
"label": "Frame",
@@ -8882,23 +8843,6 @@
],
"description": "Space between windows"
},
{
"section": "_tab_38",
"label": "Window Rules",
"tabIndex": 38,
"category": "Applications",
"keywords": [
"applications",
"apps",
"floating",
"matching",
"programs",
"rules",
"window"
],
"icon": "select_window",
"conditionKey": "windowRulesCapable"
},
{
"section": "windowRules",
"label": "Window Rules",
@@ -8922,19 +8866,6 @@
"description": "Define compositor rules for window behavior",
"conditionKey": "windowRulesCapable"
},
{
"section": "_tab_39",
"label": "Ethernet",
"tabIndex": 39,
"category": "Network",
"keywords": [
"connectivity",
"ethernet",
"network",
"online"
],
"icon": "settings_ethernet"
},
{
"section": "networkEthernet",
"label": "Ethernet",
@@ -8952,17 +8883,28 @@
"icon": "settings_ethernet"
},
{
"section": "_tab_40",
"label": "WiFi",
"section": "networkSavedWifi",
"label": "Saved Networks",
"tabIndex": 40,
"category": "Network",
"keywords": [
"autoconnect",
"connection",
"connectivity",
"ethernet",
"forget",
"internet",
"known",
"network",
"networks",
"online",
"wifi"
"saved",
"ssid",
"wi-fi",
"wifi",
"wireless"
],
"icon": "wifi"
"icon": "bookmark"
},
{
"section": "networkWifi",
@@ -8982,19 +8924,6 @@
],
"icon": "wifi"
},
{
"section": "_tab_41",
"label": "VPN",
"tabIndex": 41,
"category": "Network",
"keywords": [
"connectivity",
"network",
"online",
"vpn"
],
"icon": "vpn_key"
},
{
"section": "networkVpn",
"label": "VPN",
+459 -67
View File
@@ -314,6 +314,13 @@
"reference": "",
"comment": ""
},
{
"term": "1 day before",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "1 device connected",
"translation": "",
@@ -335,6 +342,13 @@
"reference": "",
"comment": ""
},
{
"term": "1 hour before",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "1 minute",
"translation": "",
@@ -363,6 +377,13 @@
"reference": "",
"comment": ""
},
{
"term": "10 min before",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "10 minutes",
"translation": "",
@@ -405,6 +426,13 @@
"reference": "",
"comment": ""
},
{
"term": "15 min before",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "15 minutes",
"translation": "",
@@ -538,6 +566,13 @@
"reference": "",
"comment": ""
},
{
"term": "30 min before",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "30 minutes",
"translation": "",
@@ -594,6 +629,13 @@
"reference": "",
"comment": ""
},
{
"term": "5 min before",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "5 minutes",
"translation": "",
@@ -1049,6 +1091,13 @@
"reference": "",
"comment": ""
},
{
"term": "Add location",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Add match",
"translation": "",
@@ -1056,6 +1105,13 @@
"reference": "",
"comment": ""
},
{
"term": "Add notes",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Add the new user to the %1 group so they can run dms greeter sync --profile.",
"translation": "",
@@ -1168,6 +1224,13 @@
"reference": "",
"comment": ""
},
{
"term": "Allow adjusting device volume by scrolling on the right half of items in the device list",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Allow clicks to pass through the widget",
"translation": "",
@@ -1602,6 +1665,13 @@
"reference": "",
"comment": ""
},
{
"term": "At start",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Attach",
"translation": "",
@@ -1794,7 +1864,7 @@
{
"term": "Auto",
"translation": "",
"context": "theme category option",
"context": "calendar backend option | theme category option",
"reference": "",
"comment": ""
},
@@ -1812,6 +1882,13 @@
"reference": "",
"comment": ""
},
{
"term": "Auto Compositor Gaps",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Auto Location",
"translation": "",
@@ -1819,6 +1896,13 @@
"reference": "",
"comment": ""
},
{
"term": "Auto Overflow",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Auto Popup Gaps",
"translation": "",
@@ -1833,6 +1917,13 @@
"reference": "",
"comment": ""
},
{
"term": "Auto saved",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Auto-Clear After",
"translation": "",
@@ -1904,7 +1995,7 @@
"comment": ""
},
{
"term": "Auto-saving...",
"term": "Auto-save to disk",
"translation": "",
"context": "",
"reference": "",
@@ -2022,6 +2113,13 @@
"reference": "",
"comment": ""
},
{
"term": "Automatically save changes to opened files as you type",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Automation",
"translation": "",
@@ -2219,14 +2317,14 @@
"comment": ""
},
{
"term": "Bar Shadows",
"term": "Bar Opacity",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Bar Transparency",
"term": "Bar Shadows",
"translation": "",
"context": "",
"reference": "",
@@ -2450,7 +2548,7 @@
"comment": ""
},
{
"term": "Blur the background behind bars, popouts, modals, and notifications. Requires compositor support and configuration.",
"term": "Blur the background behind bars, popouts, modals, and notifications. Requires compositor support. Adjust Opacity accordingly.",
"translation": "",
"context": "",
"reference": "",
@@ -2470,6 +2568,13 @@
"reference": "",
"comment": ""
},
{
"term": "Body Font Size",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Bold",
"translation": "",
@@ -2750,6 +2855,13 @@
"reference": "",
"comment": ""
},
{
"term": "Calendar Backend",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Camera",
"translation": "",
@@ -3135,6 +3247,13 @@
"reference": "",
"comment": ""
},
{
"term": "Choose which action buttons appear on clipboard entries",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Choose which displays show this widget",
"translation": "",
@@ -3969,7 +4088,42 @@
"comment": ""
},
{
"term": "Controls opacity of all popouts, modals, and their content layers",
"term": "Controls opacity of shell surfaces, popouts, and modals",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Controls opacity of the bar background",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Controls opacity of the border",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Controls opacity of the shadow layer",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Controls opacity of the widget outline",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Controls opacity of widget backgrounds",
"translation": "",
"context": "",
"reference": "",
@@ -3997,14 +4151,14 @@
"comment": ""
},
{
"term": "Controls the outer edge of protocol-blurred windows",
"term": "Controls the opacity of the shadow",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Controls the transparency of the shadow",
"term": "Controls the outer edge of protocol-blurred windows",
"translation": "",
"context": "",
"reference": "",
@@ -4241,6 +4395,20 @@
"reference": "",
"comment": ""
},
{
"term": "Ctrl+A: Select All • Ctrl+P: Preview • Enter/Shift+Enter: Find Next/Previous • Esc: Close",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Ctrl+S: Save • Ctrl+O: Open • Ctrl+N: New • Ctrl+F: Find",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close",
"translation": "",
@@ -4493,13 +4661,6 @@
"reference": "",
"comment": ""
},
{
"term": "Custom Transparency",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Custom command and terminal params are split on whitespace; paths with spaces will break.",
"translation": "",
@@ -4696,6 +4857,27 @@
"reference": "",
"comment": ""
},
{
"term": "DankCalendar",
"translation": "",
"context": "calendar backend option",
"reference": "",
"comment": ""
},
{
"term": "DankCalendar isn't installed",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "DankCalendar isn't running",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "DankMaterialShell is ready to use",
"translation": "",
@@ -4850,6 +5032,13 @@
"reference": "",
"comment": ""
},
{
"term": "Default Mode",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Default Opens",
"translation": "",
@@ -5123,6 +5312,13 @@
"reference": "",
"comment": ""
},
{
"term": "Device list scroll volume",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Device names updated",
"translation": "",
@@ -5530,7 +5726,7 @@
"comment": ""
},
{
"term": "Dock Transparency",
"term": "Dock Opacity",
"translation": "",
"context": "",
"reference": "",
@@ -5544,7 +5740,7 @@
"comment": ""
},
{
"term": "Dock margin, transparency, and border",
"term": "Dock margin, opacity, and border",
"translation": "",
"context": "",
"reference": "",
@@ -5753,6 +5949,13 @@
"reference": "",
"comment": ""
},
{
"term": "Edit",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Edit App",
"translation": "",
@@ -5788,6 +5991,13 @@
"reference": "",
"comment": ""
},
{
"term": "Edit event",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Editing changes on %1",
"translation": "",
@@ -6061,6 +6271,13 @@
"reference": "",
"comment": ""
},
{
"term": "End must be after start",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Enlarge on Hover",
"translation": "",
@@ -6257,6 +6474,13 @@
"reference": "",
"comment": ""
},
{
"term": "Event title",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Every 15 minutes",
"translation": "",
@@ -7069,6 +7293,13 @@
"reference": "",
"comment": ""
},
{
"term": "File changed on disk",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "File manager used to open the trash. Pick \"custom\" to enter your own command.",
"translation": "",
@@ -8959,6 +9190,13 @@
"reference": "",
"comment": ""
},
{
"term": "Inset the Notepad from screen edges using the compositor's configured gaps",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Install",
"translation": "",
@@ -9211,6 +9449,20 @@
"reference": "",
"comment": ""
},
{
"term": "Keep My Edits",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Keep in Bar",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Keep typing",
"translation": "",
@@ -9974,6 +10226,13 @@
"reference": "",
"comment": ""
},
{
"term": "Manual Gaps",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Manual Show/Hide",
"translation": "",
@@ -10170,6 +10429,13 @@
"reference": "",
"comment": ""
},
{
"term": "Max Visible",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Max Volume",
"translation": "",
@@ -10982,6 +11248,13 @@
"reference": "",
"comment": ""
},
{
"term": "New event",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "New group name...",
"translation": "",
@@ -11297,6 +11570,13 @@
"reference": "",
"comment": ""
},
{
"term": "No calendar source available",
"translation": "",
"context": "calendar backend status",
"reference": "",
"comment": ""
},
{
"term": "No changes",
"translation": "",
@@ -11591,6 +11871,13 @@
"reference": "",
"comment": ""
},
{
"term": "No reminder",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "No results",
"translation": "",
@@ -11738,6 +12025,13 @@
"reference": "",
"comment": ""
},
{
"term": "No writable calendar available",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Noise",
"translation": "",
@@ -11872,7 +12166,7 @@
"comment": ""
},
{
"term": "Notepad Font Settings",
"term": "Notepad Settings",
"translation": "",
"context": "",
"reference": "",
@@ -11885,6 +12179,13 @@
"reference": "",
"comment": ""
},
{
"term": "Notes",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Nothing",
"translation": "",
@@ -12123,20 +12424,6 @@
"reference": "",
"comment": ""
},
{
"term": "Opacity of the bar background",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Opacity of widget backgrounds",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Opaque",
"translation": "",
@@ -12172,6 +12459,13 @@
"reference": "",
"comment": ""
},
{
"term": "Open From",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Open KDE Connect on your phone",
"translation": "",
@@ -12739,6 +13033,13 @@
"reference": "",
"comment": ""
},
{
"term": "Path copied to clipboard",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Path to a video file or folder containing videos",
"translation": "",
@@ -13173,6 +13474,13 @@
"reference": "",
"comment": ""
},
{
"term": "Popout",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Popout Shadows",
"translation": "",
@@ -13922,6 +14230,13 @@
"reference": "",
"comment": ""
},
{
"term": "Reload From Disk",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Reload Plugin",
"translation": "",
@@ -13971,6 +14286,13 @@
"reference": "",
"comment": ""
},
{
"term": "Reminder",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Remove",
"translation": "",
@@ -14671,6 +14993,13 @@
"reference": "",
"comment": ""
},
{
"term": "Saving…",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Scale",
"translation": "",
@@ -15343,6 +15672,20 @@
"reference": "",
"comment": ""
},
{
"term": "Set the font size for notification body text (htmlBody)",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Set the font size for notification summary text",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Setting",
"translation": "",
@@ -15945,6 +16288,13 @@
"reference": "",
"comment": ""
},
{
"term": "Show a bar that drains as the popup's auto-dismiss timer runs",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Show all 9 tags instead of only occupied tags",
"translation": "",
@@ -16274,6 +16624,13 @@
"reference": "",
"comment": ""
},
{
"term": "Single-Line Popup",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Size",
"translation": "",
@@ -16330,6 +16687,13 @@
"reference": "",
"comment": ""
},
{
"term": "Slideout",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Small",
"translation": "",
@@ -16624,6 +16988,13 @@
"reference": "",
"comment": ""
},
{
"term": "Summary Font Size",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Sunrise",
"translation": "",
@@ -17436,6 +17807,13 @@
"reference": "",
"comment": ""
},
{
"term": "Timeout Progress Bar",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Timeout for critical priority notifications",
"translation": "",
@@ -17485,6 +17863,13 @@
"reference": "",
"comment": ""
},
{
"term": "Title is required",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Title regex (optional)",
"translation": "",
@@ -17709,27 +18094,6 @@
"reference": "",
"comment": ""
},
{
"term": "Transparency of the border",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Transparency of the shadow layer",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Transparency of the widget outline",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Trash",
"translation": "",
@@ -18122,13 +18486,6 @@
"reference": "",
"comment": ""
},
{
"term": "Unsaved note...",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Unset",
"translation": "",
@@ -18276,6 +18633,13 @@
"reference": "",
"comment": ""
},
{
"term": "Use HH:MM time format",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Use IP Location",
"translation": "",
@@ -18598,6 +18962,13 @@
"reference": "",
"comment": ""
},
{
"term": "Using DankCalendar%1",
"translation": "",
"context": "calendar backend status",
"reference": "",
"comment": ""
},
{
"term": "Using global monospace font from Settings → Personalization",
"translation": "",
@@ -18605,6 +18976,13 @@
"reference": "",
"comment": ""
},
{
"term": "Using khal",
"translation": "",
"context": "calendar backend status",
"reference": "",
"comment": ""
},
{
"term": "Using shared settings from Gamma Control",
"translation": "",
@@ -18808,6 +19186,13 @@
"reference": "",
"comment": ""
},
{
"term": "Visible Entry Actions",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Visual Effects",
"translation": "",
@@ -19095,6 +19480,13 @@
"reference": "",
"comment": ""
},
{
"term": "Widget Opacity",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Widget Outline",
"translation": "",
@@ -19116,13 +19508,6 @@
"reference": "",
"comment": ""
},
{
"term": "Widget Transparency",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Widget added",
"translation": "",
@@ -19662,6 +20047,13 @@
"reference": "",
"comment": ""
},
{
"term": "khal",
"translation": "",
"context": "calendar backend option",
"reference": "",
"comment": ""
},
{
"term": "last seen %1",
"translation": "",