1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-01-24 21:42:51 -05:00

Compare commits

..

10 Commits

Author SHA1 Message Date
purian23
d1ecb5af70 Chroma core - syntax & markdown previews 2026-01-19 20:19:15 -05:00
purian23
f2be6cfeb1 notepad: Update cursor color & activity 2026-01-19 00:34:10 -05:00
purian23
65486ed3cf notepad: QOL updates 2026-01-18 23:49:38 -05:00
bbedward
cc30e2a9e4 workspaces: fix occupied color overridworkspacs: fix occupied color
overridee
2026-01-18 22:44:54 -05:00
bbedward
ac68451cdf processlist: add full keyboard navigation 2026-01-18 21:03:34 -05:00
bbedward
0f6ae11c3d launcher: add name, icon, description overrides + hide/unhide options
- convenient helpers without needing to make .desktop overrides
fixes #1329
2026-01-18 20:30:50 -05:00
bbedward
7cb39f00ad i18n: add french 2026-01-18 14:24:20 -05:00
bbedward
f313d03348 dankbar: add click-through option 2026-01-18 14:22:50 -05:00
Eggrror404
1adbf3937b add option to change occupied workspace color (#1427) 2026-01-18 13:25:37 -05:00
Kamil Chmielewski
a685d9da52 feat: power off monitors when lock screen activates (#1402)
Add ability to immediately power off monitors when the lock screen
activates, controlled by a new setting "Power off monitors on lock".
Uses a 100ms polling timer to detect when the session lock actually
becomes active, then invokes compositor-specific DPMS commands.

For niri, uses the new power-off-monitors action via niri msg CLI
with socket fallback.

Wake on input: first input after lock arms wake, second input
actually powers monitors back on while keeping the lock screen visible.

Closes #1157
2026-01-18 13:08:58 -05:00
52 changed files with 12948 additions and 1258 deletions

View File

@@ -1,5 +1,12 @@
This file is more of a quick reference so I know what to account for before next releases.
# 1.4.0
- Overhauled system monitor, graphs, styling
- dbus API for plugins, KDEConnect
- new dank16 algorithm
- launcher actions, customize env, args, name, icon
# 1.2.0
- Added clipboard and clipboard history integration

View File

@@ -0,0 +1,193 @@
package main
import (
"bytes"
"fmt"
"io"
"os"
"strings"
"github.com/alecthomas/chroma/v2"
"github.com/alecthomas/chroma/v2/formatters/html"
"github.com/alecthomas/chroma/v2/lexers"
"github.com/alecthomas/chroma/v2/styles"
"github.com/spf13/cobra"
"github.com/yuin/goldmark"
highlighting "github.com/yuin/goldmark-highlighting/v2"
"github.com/yuin/goldmark/extension"
"github.com/yuin/goldmark/parser"
ghtml "github.com/yuin/goldmark/renderer/html"
)
var (
chromaLanguage string
chromaStyle string
chromaInline bool
chromaMarkdown bool
)
var chromaCmd = &cobra.Command{
Use: "chroma [file]",
Short: "Syntax highlight source code",
Long: `Generate syntax-highlighted HTML from source code.
Reads from file or stdin, outputs HTML with syntax highlighting.
Language is auto-detected from filename or can be specified with --language.
Examples:
dms chroma main.go
dms chroma --language python script.py
echo "def foo(): pass" | dms chroma -l python
cat code.rs | dms chroma -l rust --style dracula
dms chroma --markdown README.md
dms chroma --markdown --style github-dark notes.md
dms chroma list-languages
dms chroma list-styles`,
Args: cobra.MaximumNArgs(1),
Run: runChroma,
}
var chromaListLanguagesCmd = &cobra.Command{
Use: "list-languages",
Short: "List all supported languages",
Run: func(cmd *cobra.Command, args []string) {
for _, name := range lexers.Names(true) {
fmt.Println(name)
}
},
}
var chromaListStylesCmd = &cobra.Command{
Use: "list-styles",
Short: "List all available color styles",
Run: func(cmd *cobra.Command, args []string) {
for _, name := range styles.Names() {
fmt.Println(name)
}
},
}
func init() {
chromaCmd.Flags().StringVarP(&chromaLanguage, "language", "l", "", "Language for highlighting (auto-detect if not specified)")
chromaCmd.Flags().StringVarP(&chromaStyle, "style", "s", "monokai", "Color style (monokai, dracula, github, etc.)")
chromaCmd.Flags().BoolVar(&chromaInline, "inline", false, "Output inline styles instead of CSS classes")
chromaCmd.Flags().BoolVarP(&chromaMarkdown, "markdown", "m", false, "Render markdown with syntax-highlighted code blocks")
chromaCmd.AddCommand(chromaListLanguagesCmd)
chromaCmd.AddCommand(chromaListStylesCmd)
}
func runChroma(cmd *cobra.Command, args []string) {
var source string
var filename string
// Read from file or stdin
if len(args) > 0 {
filename = args[0]
content, err := os.ReadFile(filename)
if err != nil {
fmt.Fprintf(os.Stderr, "Error reading file: %v\n", err)
os.Exit(1)
}
source = string(content)
} else {
content, err := io.ReadAll(os.Stdin)
if err != nil {
fmt.Fprintf(os.Stderr, "Error reading stdin: %v\n", err)
os.Exit(1)
}
source = string(content)
}
// Handle empty input
if strings.TrimSpace(source) == "" {
return
}
// Handle Markdown rendering
if chromaMarkdown {
md := goldmark.New(
goldmark.WithExtensions(
extension.GFM,
highlighting.NewHighlighting(
highlighting.WithStyle(chromaStyle),
highlighting.WithFormatOptions(
html.WithClasses(!chromaInline),
),
),
),
goldmark.WithParserOptions(
parser.WithAutoHeadingID(),
),
goldmark.WithRendererOptions(
ghtml.WithHardWraps(),
ghtml.WithXHTML(),
),
)
var buf bytes.Buffer
if err := md.Convert([]byte(source), &buf); err != nil {
fmt.Fprintf(os.Stderr, "Markdown rendering error: %v\n", err)
os.Exit(1)
}
fmt.Print(buf.String())
return
}
// Detect or use specified lexer
var lexer chroma.Lexer
if chromaLanguage != "" {
lexer = lexers.Get(chromaLanguage)
if lexer == nil {
fmt.Fprintf(os.Stderr, "Unknown language: %s\n", chromaLanguage)
os.Exit(1)
}
} else if filename != "" {
lexer = lexers.Match(filename)
}
// Try content analysis if no lexer found
if lexer == nil {
lexer = lexers.Analyse(source)
}
// Fallback to plaintext
if lexer == nil {
lexer = lexers.Fallback
}
lexer = chroma.Coalesce(lexer)
// Get style
style := styles.Get(chromaStyle)
if style == nil {
style = styles.Fallback
}
// Create HTML formatter
var formatter *html.Formatter
if chromaInline {
formatter = html.New(
html.WithClasses(false),
html.TabWidth(4),
)
} else {
formatter = html.New(
html.WithClasses(true),
html.TabWidth(4),
)
}
// Tokenize
iterator, err := lexer.Tokenise(nil, source)
if err != nil {
fmt.Fprintf(os.Stderr, "Tokenization error: %v\n", err)
os.Exit(1)
}
// Format and output
if err := formatter.Format(os.Stdout, style, iterator); err != nil {
fmt.Fprintf(os.Stderr, "Formatting error: %v\n", err)
os.Exit(1)
}
}

View File

@@ -517,5 +517,6 @@ func getCommonCommands() []*cobra.Command {
clipboardCmd,
doctorCmd,
configCmd,
chromaCmd,
}
}

View File

@@ -4,6 +4,7 @@ go 1.24.6
require (
github.com/Wifx/gonetworkmanager/v2 v2.2.0
github.com/alecthomas/chroma/v2 v2.17.2
github.com/charmbracelet/bubbles v0.21.0
github.com/charmbracelet/bubbletea v1.3.10
github.com/charmbracelet/lipgloss v1.1.0
@@ -28,6 +29,7 @@ require (
github.com/clipperhouse/uax29/v2 v2.3.0 // indirect
github.com/cloudflare/circl v1.6.2 // indirect
github.com/cyphar/filepath-securejoin v0.6.1 // indirect
github.com/dlclark/regexp2 v1.11.5 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/go-git/gcfg/v2 v2.0.2 // indirect
github.com/go-git/go-billy/v6 v6.0.0-20260114122816-19306b749ecc // indirect
@@ -38,6 +40,8 @@ require (
github.com/pjbgf/sha1cd v0.5.0 // indirect
github.com/sergi/go-diff v1.4.0 // indirect
github.com/stretchr/objx v0.5.3 // indirect
github.com/yuin/goldmark v1.7.16 // indirect
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc // indirect
golang.org/x/crypto v0.47.0 // indirect
golang.org/x/net v0.49.0 // indirect
)

View File

@@ -4,6 +4,14 @@ github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBi
github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE=
github.com/Wifx/gonetworkmanager/v2 v2.2.0 h1:kPstgsQtY8CmDOOFZd81ytM9Gi3f6ImzPCKF7nNhQ2U=
github.com/Wifx/gonetworkmanager/v2 v2.2.0/go.mod h1:fMDb//SHsKWxyDUAwXvCqurV3npbIyyaQWenGpZ/uXg=
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs=
github.com/alecthomas/chroma/v2 v2.17.2 h1:Rm81SCZ2mPoH+Q8ZCc/9YvzPUN/E7HgPiPJD8SLV6GI=
github.com/alecthomas/chroma/v2 v2.17.2/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk=
github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8=
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
@@ -24,16 +32,12 @@ github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoF
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
github.com/charmbracelet/log v0.4.2 h1:hYt8Qj6a8yLnvR+h7MwsJv/XvmBJXiueUcI3cIxsyig=
github.com/charmbracelet/log v0.4.2/go.mod h1:qifHGX/tc7eluv2R6pWIpyHDDrrb/AG71Pf2ysQu5nw=
github.com/charmbracelet/x/ansi v0.11.3 h1:6DcVaqWI82BBVM/atTyq6yBoRLZFBsnoDoX9GCu2YOI=
github.com/charmbracelet/x/ansi v0.11.3/go.mod h1:yI7Zslym9tCJcedxz5+WBq+eUGMJT0bM06Fqy1/Y4dI=
github.com/charmbracelet/x/ansi v0.11.4 h1:6G65PLu6HjmE858CnTUQY1LXT3ZUWwfvqEROLF8vqHI=
github.com/charmbracelet/x/ansi v0.11.4/go.mod h1:/5AZ+UfWExW3int5H5ugnsG/PWjNcSQcwYsHBlPFQN4=
github.com/charmbracelet/x/cellbuf v0.0.14 h1:iUEMryGyFTelKW3THW4+FfPgi4fkmKnnaLOXuc+/Kj4=
github.com/charmbracelet/x/cellbuf v0.0.14/go.mod h1:P447lJl49ywBbil/KjCk2HexGh4tEY9LH0/1QrZZ9rA=
github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk=
github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI=
github.com/clipperhouse/displaywidth v0.6.2 h1:ZDpTkFfpHOKte4RG5O/BOyf3ysnvFswpyYrV7z2uAKo=
github.com/clipperhouse/displaywidth v0.6.2/go.mod h1:R+kHuzaYWFkTm7xoMmK1lFydbci4X2CicfbGstSGg0o=
github.com/clipperhouse/displaywidth v0.7.0 h1:QNv1GYsnLX9QBrcWUtMlogpTXuM5FVnBwKWp1O5NwmE=
github.com/clipperhouse/displaywidth v0.7.0/go.mod h1:R+kHuzaYWFkTm7xoMmK1lFydbci4X2CicfbGstSGg0o=
github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs=
@@ -48,6 +52,10 @@ github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
@@ -58,14 +66,10 @@ github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c=
github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU=
github.com/go-git/gcfg/v2 v2.0.2 h1:MY5SIIfTGGEMhdA7d7JePuVVxtKL7Hp+ApGDJAJ7dpo=
github.com/go-git/gcfg/v2 v2.0.2/go.mod h1:/lv2NsxvhepuMrldsFilrgct6pxzpGdSRC13ydTLSLs=
github.com/go-git/go-billy/v6 v6.0.0-20251217170237-e9738f50a3cd h1:Gd/f9cGi/3h1JOPaa6er+CkKUGyGX2DBJdFbDKVO+R0=
github.com/go-git/go-billy/v6 v6.0.0-20251217170237-e9738f50a3cd/go.mod h1:d3XQcsHu1idnquxt48kAv+h+1MUiYKLH/e7LAzjP+pI=
github.com/go-git/go-billy/v6 v6.0.0-20260114122816-19306b749ecc h1:rhkjrnRkamkRC7woapp425E4CAH6RPcqsS9X8LA93IY=
github.com/go-git/go-billy/v6 v6.0.0-20260114122816-19306b749ecc/go.mod h1:X1oe0Z2qMsa9hkar3AAPuL9hu4Mi3ztXEjdqRhr6fcc=
github.com/go-git/go-git-fixtures/v5 v5.1.2-0.20251229094738-4b14af179146 h1:xYfxAopYyL44ot6dMBIb1Z1njFM0ZBQ99HdIB99KxLs=
github.com/go-git/go-git-fixtures/v5 v5.1.2-0.20251229094738-4b14af179146/go.mod h1:QE/75B8tBSLNGyUUbA9tw3EGHoFtYOtypa2h8YJxsWI=
github.com/go-git/go-git/v6 v6.0.0-20251231065035-29ae690a9f19 h1:0lz2eJScP8v5YZQsrEw+ggWC5jNySjg4bIZo5BIh6iI=
github.com/go-git/go-git/v6 v6.0.0-20251231065035-29ae690a9f19/go.mod h1:L+Evfcs7EdTqxwv854354cb6+++7TFL3hJn3Wy4g+3w=
github.com/go-git/go-git/v6 v6.0.0-20260114124804-a8db3a6585a6 h1:Yo1MlE8LpvD0pr7mZ04b6hKZKQcPvLrQFgyY1jNMEyU=
github.com/go-git/go-git/v6 v6.0.0-20260114124804-a8db3a6585a6/go.mod h1:enMzPHv+9hL4B7tH7OJGQKNzCkMzXovUoaiXfsLF7Xs=
github.com/go-logfmt/logfmt v0.6.1 h1:4hvbpePJKnIzH1B+8OR/JPbTx37NktoI9LE2QZBBkvE=
@@ -78,6 +82,8 @@ github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUv
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/holoplot/go-evdev v0.0.0-20250804134636-ab1d56a1fe83 h1:B+A58zGFuDrvEZpPN+yS6swJA0nzqgZvDzgl/OPyefU=
github.com/holoplot/go-evdev v0.0.0-20250804134636-ab1d56a1fe83/go.mod h1:iHAf8OIncO2gcQ8XOjS7CMJ2aPbX2Bs0wl5pZyanEqk=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
@@ -133,42 +139,35 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4=
github.com/stretchr/objx v0.5.3/go.mod h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
github.com/yuin/goldmark v1.4.15/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/goldmark v1.7.16 h1:n+CJdUxaFMiDUNnWC3dMWCIQJSkxH4uz3ZwQBkAlVNE=
github.com/yuin/goldmark v1.7.16/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg=
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc h1:+IAOyRda+RLrxa1WC7umKOZRsGq4QrFFMYApOeHzQwQ=
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc/go.mod h1:ovIvrum6DQJA4QsJSovrkC4saKHQVs7TvcaeO8AIl5I=
go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo=
go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8=
golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A=
golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0=
golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU=
golang.org/x/exp v0.0.0-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU=
golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU=
golang.org/x/image v0.34.0 h1:33gCkyw9hmwbZJeZkct8XyR11yH889EQt/QH4VmXMn8=
golang.org/x/image v0.34.0/go.mod h1:2RNFBZRB+vnwwFil8GkMdRvrJOFd1AzdZI6vOY+eJVU=
golang.org/x/image v0.35.0 h1:LKjiHdgMtO8z7Fh18nGY6KDcoEtVfsgLDPeLyguqb7I=
golang.org/x/image v0.35.0/go.mod h1:MwPLTVgvxSASsxdLzKrl8BRFuyqMyGhLwmC+TO1Sybk=
golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=
golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q=
golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg=
golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY=
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww=
golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=
golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -177,5 +176,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -21,6 +21,7 @@ Singleton {
property bool _isReadOnly: false
property bool _hasUnsavedChanges: false
property var _loadedSessionSnapshot: null
readonly property var _hooks: ({})
readonly property string _stateUrl: StandardPaths.writableLocation(StandardPaths.GenericStateLocation)
readonly property string _stateDir: Paths.strip(_stateUrl)
@@ -102,6 +103,10 @@ Singleton {
property string weatherLocation: "New York, NY"
property string weatherCoordinates: "40.7128,-74.0060"
property var hiddenApps: []
property var appOverrides: ({})
property bool searchAppActions: true
Component.onCompleted: {
if (!isGreeterMode) {
loadSettings();
@@ -261,6 +266,10 @@ Singleton {
_checkSessionWritable();
}
function set(key, value) {
Spec.set(root, key, value, saveSettings, _hooks);
}
function migrateFromUndefinedToV1(settings) {
console.info("SessionData: Migrating configuration from undefined to version 1");
if (typeof SettingsData !== "undefined") {
@@ -906,6 +915,61 @@ Singleton {
saveSettings();
}
function hideApp(appId) {
if (!appId)
return;
const current = [...hiddenApps];
if (current.indexOf(appId) === -1) {
current.push(appId);
hiddenApps = current;
saveSettings();
}
}
function showApp(appId) {
if (!appId)
return;
hiddenApps = hiddenApps.filter(id => id !== appId);
saveSettings();
}
function isAppHidden(appId) {
return appId && hiddenApps.indexOf(appId) !== -1;
}
function setAppOverride(appId, overrides) {
if (!appId)
return;
const newOverrides = Object.assign({}, appOverrides);
if (!overrides || Object.keys(overrides).length === 0) {
delete newOverrides[appId];
} else {
newOverrides[appId] = overrides;
}
appOverrides = newOverrides;
saveSettings();
}
function getAppOverride(appId) {
if (!appId)
return null;
return appOverrides[appId] || null;
}
function clearAppOverride(appId) {
if (!appId)
return;
const newOverrides = Object.assign({}, appOverrides);
delete newOverrides[appId];
appOverrides = newOverrides;
saveSettings();
}
function setSearchAppActions(enabled) {
searchAppActions = enabled;
saveSettings();
}
function syncWallpaperForCurrentMode() {
if (!perModeWallpaper)
return;

View File

@@ -206,6 +206,7 @@ Singleton {
property bool reverseScrolling: false
property bool dwlShowAllTags: false
property string workspaceColorMode: "default"
property string workspaceOccupiedColorMode: "none"
property string workspaceUnfocusedColorMode: "default"
property string workspaceUrgentColorMode: "default"
property bool workspaceFocusedBorderEnabled: false
@@ -394,6 +395,7 @@ Singleton {
property bool lockScreenShowDate: true
property bool lockScreenShowProfileImage: true
property bool lockScreenShowPasswordField: true
property bool lockScreenPowerOffMonitorsOnLock: false
property bool enableFprint: false
property int maxFprintTries: 15
@@ -493,7 +495,8 @@ Singleton {
"shadowIntensity": 0,
"shadowOpacity": 60,
"shadowColorMode": "text",
"shadowCustomColor": "#000000"
"shadowCustomColor": "#000000",
"clickThrough": false
}
]

View File

@@ -55,9 +55,23 @@ var SPEC = {
enabledGpuPciIds: { def: [] },
wifiDeviceOverride: { def: "" },
weatherHourlyDetailed: { def: true }
weatherHourlyDetailed: { def: true },
hiddenApps: { def: [] },
appOverrides: { def: {} },
searchAppActions: { def: true }
};
function getValidKeys() {
return Object.keys(SPEC).concat(["configVersion"]);
}
function set(root, key, value, saveFn, hooks) {
if (!(key in SPEC)) return;
root[key] = value;
var hookName = SPEC[key].onChange;
if (hookName && hooks && hooks[hookName]) {
hooks[hookName](root);
}
saveFn();
}

View File

@@ -100,6 +100,7 @@ var SPEC = {
reverseScrolling: { def: false },
dwlShowAllTags: { def: false },
workspaceColorMode: { def: "default" },
workspaceOccupiedColorMode: { def: "none" },
workspaceUnfocusedColorMode: { def: "default" },
workspaceUrgentColorMode: { def: "default" },
workspaceFocusedBorderEnabled: { def: false },
@@ -259,6 +260,7 @@ var SPEC = {
lockScreenShowDate: { def: true },
lockScreenShowProfileImage: { def: true },
lockScreenShowPasswordField: { def: true },
lockScreenPowerOffMonitorsOnLock: { def: false },
enableFprint: { def: false },
maxFprintTries: { def: 15 },
fprintdAvailable: { def: false, persist: false },
@@ -356,7 +358,8 @@ var SPEC = {
shadowIntensity: 0,
shadowOpacity: 60,
shadowColorMode: "text",
shadowCustomColor: "#000000"
shadowCustomColor: "#000000",
clickThrough: false
}], onChange: "updateBarConfigs" },
desktopClockEnabled: { def: false },

View File

@@ -71,6 +71,14 @@ FloatingWindow {
return (bytes / (1024 * 1024 * 1024)).toFixed(2) + " GB/s";
}
function nextTab() {
currentTab = (currentTab + 1) % 4;
}
function previousTab() {
currentTab = (currentTab - 1 + 4) % 4;
}
objectName: "processListModal"
title: I18n.tr("System Monitor", "sysmon window title")
minimumSize: Qt.size(750, 550)
@@ -79,16 +87,25 @@ FloatingWindow {
color: Theme.surfaceContainer
visible: false
onCurrentTabChanged: {
if (visible && currentTab === 0 && searchField.visible)
searchField.forceActiveFocus();
}
onVisibleChanged: {
if (!visible) {
closingModal();
searchText = "";
expandedPid = "";
if (processesTabLoader.item)
processesTabLoader.item.reset();
DgopService.removeRef(["cpu", "memory", "network", "disk", "system"]);
} else {
DgopService.addRef(["cpu", "memory", "network", "disk", "system"]);
Qt.callLater(() => {
if (contentFocusScope)
if (currentTab === 0 && searchField.visible)
searchField.forceActiveFocus();
else if (contentFocusScope)
contentFocusScope.forceActiveFocus();
});
}
@@ -96,6 +113,11 @@ FloatingWindow {
ProcessContextMenu {
id: processContextMenu
parentFocusItem: contentFocusScope
onProcessKilled: {
if (processesTabLoader.item)
processesTabLoader.item.forceRefresh(3);
}
}
FocusScope {
@@ -108,6 +130,9 @@ FloatingWindow {
focus: true
Keys.onPressed: event => {
if (processContextMenu.visible)
return;
switch (event.key) {
case Qt.Key_1:
currentTab = 0;
@@ -125,12 +150,25 @@ FloatingWindow {
currentTab = 3;
event.accepted = true;
return;
case Qt.Key_Tab:
nextTab();
event.accepted = true;
return;
case Qt.Key_Backtab:
previousTab();
event.accepted = true;
return;
case Qt.Key_Escape:
if (searchText.length > 0) {
searchText = "";
event.accepted = true;
return;
}
if (currentTab === 0 && processesTabLoader.item?.keyboardNavigationActive) {
processesTabLoader.item.reset();
event.accepted = true;
return;
}
hide();
event.accepted = true;
return;
@@ -142,6 +180,9 @@ FloatingWindow {
}
break;
}
if (currentTab === 0 && processesTabLoader.item)
processesTabLoader.item.handleKey(event);
}
Rectangle {
@@ -336,6 +377,8 @@ FloatingWindow {
text: searchText
visible: currentTab === 0
onTextChanged: searchText = text
ignoreUpDownKeys: true
keyForwardTargets: [contentFocusScope]
}
}

View File

@@ -1,3 +1,4 @@
pragma ComponentBehavior: Bound
import QtQuick
import qs.Common
import qs.Modals.Spotlight
@@ -19,6 +20,10 @@ Item {
property string searchMode: "apps"
property bool usePopupContextMenu: false
property bool editMode: false
property var editingApp: null
property string editAppId: ""
function resetScroll() {
if (searchMode === "apps") {
resultsView.resetScroll();
@@ -43,6 +48,49 @@ Item {
}
}
function openEditMode(app) {
if (!app)
return;
editingApp = app;
editAppId = app.id || app.execString || app.exec || "";
const existing = SessionData.getAppOverride(editAppId);
editNameField.text = existing?.name || "";
editIconField.text = existing?.icon || "";
editCommentField.text = existing?.comment || "";
editEnvVarsField.text = existing?.envVars || "";
editExtraFlagsField.text = existing?.extraFlags || "";
editMode = true;
Qt.callLater(() => editNameField.forceActiveFocus());
}
function closeEditMode() {
editMode = false;
editingApp = null;
editAppId = "";
Qt.callLater(() => searchField.forceActiveFocus());
}
function saveAppOverride() {
const override = {};
if (editNameField.text.trim())
override.name = editNameField.text.trim();
if (editIconField.text.trim())
override.icon = editIconField.text.trim();
if (editCommentField.text.trim())
override.comment = editCommentField.text.trim();
if (editEnvVarsField.text.trim())
override.envVars = editEnvVarsField.text.trim();
if (editExtraFlagsField.text.trim())
override.extraFlags = editExtraFlagsField.text.trim();
SessionData.setAppOverride(editAppId, override);
closeEditMode();
}
function resetAppOverride() {
SessionData.clearAppOverride(editAppId);
closeEditMode();
}
onSearchModeChanged: {
if (searchMode === "files") {
appLauncher.keyboardNavigationActive = false;
@@ -55,10 +103,16 @@ Item {
focus: true
clip: false
Keys.onPressed: event => {
if (editMode) {
if (event.key === Qt.Key_Escape) {
closeEditMode();
event.accepted = true;
}
return;
}
if (event.key === Qt.Key_Escape) {
if (parentModal)
parentModal.hide();
event.accepted = true;
} else if (event.key === Qt.Key_Down) {
if (searchMode === "apps") {
@@ -155,7 +209,6 @@ Item {
if (searchMode === "apps" && appLauncher.model.count > 0) {
const selectedApp = appLauncher.model.get(appLauncher.selectedIndex);
const menu = usePopupContextMenu ? popupContextMenu : layerContextMenuLoader.item;
if (selectedApp && menu && resultsView) {
const itemPos = resultsView.getSelectedItemPosition();
const contentPos = resultsView.mapToItem(spotlightKeyHandler, itemPos.x, itemPos.y);
@@ -168,7 +221,6 @@ Item {
AppLauncher {
id: appLauncher
viewMode: SettingsData.spotlightModalViewMode
gridColumns: SettingsData.appLauncherGridColumns
onAppLaunched: () => {
@@ -185,7 +237,6 @@ Item {
FileSearchController {
id: fileSearchController
onFileOpened: () => {
if (parentModal)
parentModal.hide();
@@ -197,7 +248,6 @@ Item {
SpotlightContextMenuPopup {
id: popupContextMenu
parent: spotlightKeyHandler
appLauncher: spotlightKeyHandler.appLauncher
parentHandler: spotlightKeyHandler
@@ -231,20 +281,37 @@ Item {
target: parentModal
function onSpotlightOpenChanged() {
if (parentModal && !parentModal.spotlightOpen) {
if (layerContextMenuLoader.item) {
if (layerContextMenuLoader.item)
layerContextMenuLoader.item.hide();
}
popupContextMenu.hide();
if (editMode)
closeEditMode();
}
}
enabled: parentModal !== null
}
Connections {
target: popupContextMenu
function onEditAppRequested(app) {
spotlightKeyHandler.openEditMode(app);
}
}
Connections {
target: layerContextMenuLoader.item
function onEditAppRequested(app) {
spotlightKeyHandler.openEditMode(app);
}
enabled: layerContextMenuLoader.item !== null
}
Column {
anchors.fill: parent
anchors.margins: Theme.spacingM
spacing: Theme.spacingM
clip: false
visible: !editMode
Item {
id: searchRow
@@ -275,18 +342,14 @@ Item {
ignoreTabKeys: true
keyForwardTargets: [spotlightKeyHandler]
onTextChanged: {
if (searchMode === "apps") {
if (searchMode === "apps")
appLauncher.searchQuery = text;
}
}
onTextEdited: {
updateSearchMode();
}
onTextEdited: updateSearchMode()
Keys.onPressed: event => {
if (event.key === Qt.Key_Escape) {
if (parentModal)
parentModal.hide();
event.accepted = true;
} else if ((event.key === Qt.Key_Return || event.key === Qt.Key_Enter) && text.length > 0) {
if (searchMode === "apps") {
@@ -334,13 +397,10 @@ Item {
MouseArea {
id: listViewArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: () => {
appLauncher.setViewMode("list");
}
onClicked: appLauncher.setViewMode("list")
}
}
@@ -359,13 +419,10 @@ Item {
MouseArea {
id: gridViewArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: () => {
appLauncher.setViewMode("grid");
}
onClicked: appLauncher.setViewMode("grid")
}
}
}
@@ -379,7 +436,6 @@ Item {
Rectangle {
id: filenameFilterButton
width: 36
height: 36
radius: Theme.cornerRadius
@@ -394,13 +450,10 @@ Item {
MouseArea {
id: filenameFilterArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: () => {
fileSearchController.searchField = "filename";
}
onClicked: fileSearchController.searchField = "filename"
onEntered: {
filenameTooltipLoader.active = true;
Qt.callLater(() => {
@@ -413,7 +466,6 @@ Item {
onExited: {
if (filenameTooltipLoader.item)
filenameTooltipLoader.item.hide();
filenameTooltipLoader.active = false;
}
}
@@ -421,7 +473,6 @@ Item {
Rectangle {
id: contentFilterButton
width: 36
height: 36
radius: Theme.cornerRadius
@@ -436,13 +487,10 @@ Item {
MouseArea {
id: contentFilterArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: () => {
fileSearchController.searchField = "body";
}
onClicked: fileSearchController.searchField = "body"
onEntered: {
contentTooltipLoader.active = true;
Qt.callLater(() => {
@@ -455,7 +503,6 @@ Item {
onExited: {
if (contentTooltipLoader.item)
contentTooltipLoader.item.hide();
contentTooltipLoader.active = false;
}
}
@@ -474,13 +521,10 @@ Item {
anchors.fill: parent
appLauncher: spotlightKeyHandler.appLauncher
visible: searchMode === "apps"
onItemRightClicked: (index, modelData, mouseX, mouseY) => {
const menu = usePopupContextMenu ? popupContextMenu : layerContextMenuLoader.item;
if (menu?.show) {
const isPopup = menu.contentItem !== undefined;
if (isPopup) {
const localPos = popupContextMenu.parent.mapFromItem(null, mouseX, mouseY);
menu.show(localPos.x, localPos.y, modelData, false);
@@ -500,16 +544,320 @@ Item {
}
}
FocusScope {
id: editView
anchors.fill: parent
anchors.margins: Theme.spacingM
visible: editMode
focus: editMode
Keys.onPressed: event => {
switch (event.key) {
case Qt.Key_Escape:
closeEditMode();
event.accepted = true;
return;
case Qt.Key_Return:
case Qt.Key_Enter:
if (event.modifiers & Qt.ControlModifier) {
saveAppOverride();
event.accepted = true;
}
return;
case Qt.Key_S:
if (event.modifiers & Qt.ControlModifier) {
saveAppOverride();
event.accepted = true;
}
return;
case Qt.Key_R:
if ((event.modifiers & Qt.ControlModifier) && SessionData.getAppOverride(editAppId) !== null) {
resetAppOverride();
event.accepted = true;
}
return;
}
}
Column {
anchors.fill: parent
spacing: Theme.spacingM
Row {
width: parent.width
spacing: Theme.spacingM
Rectangle {
width: 40
height: 40
radius: Theme.cornerRadius
color: backButtonArea.containsMouse ? Theme.surfaceHover : "transparent"
DankIcon {
anchors.centerIn: parent
name: "arrow_back"
size: 20
color: Theme.surfaceText
}
MouseArea {
id: backButtonArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: closeEditMode()
}
}
Image {
width: 40
height: 40
source: editingApp?.icon ? "image://icon/" + editingApp.icon : "image://icon/application-x-executable"
sourceSize.width: 40
sourceSize.height: 40
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter
}
Column {
anchors.verticalCenter: parent.verticalCenter
spacing: 2
StyledText {
text: I18n.tr("Edit App")
font.pixelSize: Theme.fontSizeLarge
color: Theme.surfaceText
font.weight: Font.Medium
}
StyledText {
text: editingApp?.name || ""
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
}
}
}
Rectangle {
width: parent.width
height: 1
color: Theme.outlineMedium
}
Flickable {
width: parent.width
height: parent.height - y - buttonsRow.height - Theme.spacingM
contentHeight: editFieldsColumn.height
clip: true
boundsBehavior: Flickable.StopAtBounds
Column {
id: editFieldsColumn
width: parent.width
spacing: Theme.spacingS
Column {
width: parent.width
spacing: 4
StyledText {
text: I18n.tr("Name")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
}
DankTextField {
id: editNameField
width: parent.width
height: 44
placeholderText: editingApp?.name || ""
keyNavigationTab: editIconField
keyNavigationBacktab: editExtraFlagsField
}
}
Column {
width: parent.width
spacing: 4
StyledText {
text: I18n.tr("Icon")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
}
DankTextField {
id: editIconField
width: parent.width
height: 44
placeholderText: editingApp?.icon || ""
keyNavigationTab: editCommentField
keyNavigationBacktab: editNameField
}
}
Column {
width: parent.width
spacing: 4
StyledText {
text: I18n.tr("Description")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
}
DankTextField {
id: editCommentField
width: parent.width
height: 44
placeholderText: editingApp?.comment || ""
keyNavigationTab: editEnvVarsField
keyNavigationBacktab: editIconField
}
}
Column {
width: parent.width
spacing: 4
StyledText {
text: I18n.tr("Environment Variables")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
}
StyledText {
text: "KEY=value KEY2=value2"
font.pixelSize: Theme.fontSizeSmall - 1
color: Theme.surfaceVariantText
}
DankTextField {
id: editEnvVarsField
width: parent.width
height: 44
placeholderText: "VAR=value"
keyNavigationTab: editExtraFlagsField
keyNavigationBacktab: editCommentField
}
}
Column {
width: parent.width
spacing: 4
StyledText {
text: I18n.tr("Extra Arguments")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
}
DankTextField {
id: editExtraFlagsField
width: parent.width
height: 44
placeholderText: "--flag --option=value"
keyNavigationTab: editNameField
keyNavigationBacktab: editEnvVarsField
}
}
}
}
Row {
id: buttonsRow
anchors.horizontalCenter: parent.horizontalCenter
spacing: Theme.spacingM
Rectangle {
id: resetButton
width: 90
height: 40
radius: Theme.cornerRadius
color: resetButtonArea.containsMouse ? Theme.surfacePressed : Theme.surfaceVariantAlpha
visible: SessionData.getAppOverride(editAppId) !== null
StyledText {
text: I18n.tr("Reset")
font.pixelSize: Theme.fontSizeMedium
color: Theme.error
font.weight: Font.Medium
anchors.centerIn: parent
}
MouseArea {
id: resetButtonArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: resetAppOverride()
}
}
Rectangle {
id: cancelButton
width: 90
height: 40
radius: Theme.cornerRadius
color: cancelButtonArea.containsMouse ? Theme.surfacePressed : Theme.surfaceVariantAlpha
StyledText {
text: I18n.tr("Cancel")
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceText
font.weight: Font.Medium
anchors.centerIn: parent
}
MouseArea {
id: cancelButtonArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: closeEditMode()
}
}
Rectangle {
id: saveButton
width: 90
height: 40
radius: Theme.cornerRadius
color: saveButtonArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.9) : Theme.primary
StyledText {
text: I18n.tr("Save")
font.pixelSize: Theme.fontSizeMedium
color: Theme.primaryText
font.weight: Font.Medium
anchors.centerIn: parent
}
MouseArea {
id: saveButtonArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: saveAppOverride()
}
}
}
}
}
Loader {
id: filenameTooltipLoader
active: false
sourceComponent: DankTooltip {}
}
Loader {
id: contentTooltipLoader
active: false
sourceComponent: DankTooltip {}
}

View File

@@ -1,7 +1,6 @@
import QtQuick
import Quickshell
import Quickshell.Wayland
import Quickshell.Widgets
import qs.Common
import qs.Modals.Spotlight
@@ -19,6 +18,8 @@ PanelWindow {
property real menuPositionX: 0
property real menuPositionY: 0
signal editAppRequested(var app)
readonly property real shadowBuffer: 5
screen: parentModal?.effectiveScreen
@@ -106,6 +107,7 @@ PanelWindow {
}
onHideRequested: root.hide()
onEditAppRequested: app => root.editAppRequested(app)
}
MouseArea {

View File

@@ -68,6 +68,27 @@ Item {
hideRequested();
}
readonly property bool isRegularApp: desktopEntry && !currentApp?.isPlugin && !currentApp?.isCore && !currentApp?.isAction && !currentApp?.isBuiltInLauncher
signal editAppRequested(var app)
function hideCurrentApp() {
if (!desktopEntry)
return;
const appId = desktopEntry.id || desktopEntry.execString || "";
SessionData.hideApp(appId);
if (appLauncher)
appLauncher.updateFilteredModel();
hideRequested();
}
function editCurrentApp() {
if (!desktopEntry)
return;
editAppRequested(desktopEntry);
hideRequested();
}
readonly property var menuItems: {
const items = [];
@@ -103,6 +124,21 @@ Item {
action: togglePin
});
if (isRegularApp) {
items.push({
type: "item",
icon: "visibility_off",
text: I18n.tr("Hide App"),
action: hideCurrentApp
});
items.push({
type: "item",
icon: "edit",
text: I18n.tr("Edit App"),
action: editCurrentApp
});
}
if (desktopEntry && desktopEntry.actions) {
items.push({
type: "separator"

View File

@@ -1,6 +1,5 @@
import QtQuick
import QtQuick.Controls
import Quickshell
import qs.Common
import qs.Modals.Spotlight
@@ -11,6 +10,8 @@ Popup {
property var parentHandler: null
property var searchField: null
signal editAppRequested(var app)
function show(x, y, app, fromKeyboard) {
fromKeyboard = fromKeyboard || false;
menuContent.currentApp = app;
@@ -53,7 +54,7 @@ Popup {
if (parentHandler) {
parentHandler.enabled = true;
}
if (searchField) {
if (searchField?.visible) {
Qt.callLater(() => {
searchField.forceActiveFocus();
});
@@ -84,5 +85,6 @@ Popup {
id: menuContent
appLauncher: root.appLauncher
onHideRequested: root.hide()
onEditAppRequested: app => root.editAppRequested(app)
}
}

View File

@@ -65,6 +65,20 @@ DankModal {
});
}
function showWithEditApp(app) {
openedFromOverview = false;
isClosing = false;
resetContent();
spotlightOpen = true;
open();
Qt.callLater(() => {
if (spotlightContent?.appLauncher)
spotlightContent.appLauncher.ensureInitialized();
if (spotlightContent?.openEditMode)
spotlightContent.openEditMode(app);
});
}
function hide() {
openedFromOverview = false;
isClosing = true;

View File

@@ -1,11 +1,7 @@
import QtQuick
import QtQuick.Controls
import Quickshell
import Quickshell.Widgets
import qs.Common
import qs.Modals.Spotlight
import qs.Modules.AppDrawer
import qs.Services
import qs.Widgets
DankPopout {
@@ -15,6 +11,63 @@ DankPopout {
property string searchMode: "apps"
property alias fileSearch: fileSearchController
property bool editMode: false
property var editingApp: null
property string editAppId: ""
function openEditMode(app) {
if (!app)
return;
editingApp = app;
editAppId = app.id || app.execString || app.exec || "";
const existing = SessionData.getAppOverride(editAppId);
if (contentLoader.item) {
contentLoader.item.searchField.focus = false;
contentLoader.item.editNameField.text = existing?.name || "";
contentLoader.item.editIconField.text = existing?.icon || "";
contentLoader.item.editCommentField.text = existing?.comment || "";
contentLoader.item.editEnvVarsField.text = existing?.envVars || "";
contentLoader.item.editExtraFlagsField.text = existing?.extraFlags || "";
}
editMode = true;
Qt.callLater(() => {
if (contentLoader.item?.editNameField)
contentLoader.item.editNameField.forceActiveFocus();
});
}
function closeEditMode() {
editMode = false;
editingApp = null;
editAppId = "";
Qt.callLater(() => {
if (contentLoader.item?.searchField)
contentLoader.item.searchField.forceActiveFocus();
});
}
function saveAppOverride() {
const override = {};
if (contentLoader.item) {
if (contentLoader.item.editNameField.text.trim())
override.name = contentLoader.item.editNameField.text.trim();
if (contentLoader.item.editIconField.text.trim())
override.icon = contentLoader.item.editIconField.text.trim();
if (contentLoader.item.editCommentField.text.trim())
override.comment = contentLoader.item.editCommentField.text.trim();
if (contentLoader.item.editEnvVarsField.text.trim())
override.envVars = contentLoader.item.editEnvVarsField.text.trim();
if (contentLoader.item.editExtraFlagsField.text.trim())
override.extraFlags = contentLoader.item.editExtraFlagsField.text.trim();
}
SessionData.setAppOverride(editAppId, override);
closeEditMode();
}
function resetAppOverride() {
SessionData.clearAppOverride(editAppId);
closeEditMode();
}
function updateSearchMode(text) {
if (text.startsWith("/")) {
@@ -42,16 +95,25 @@ DankPopout {
popupHeight: 600
triggerWidth: 40
positioning: ""
contentHandlesKeys: editMode
onBackgroundClicked: {
if (contextMenu.visible) {
contextMenu.close();
return;
}
if (editMode) {
closeEditMode();
return;
}
close();
}
onOpened: {
searchMode = "apps";
editMode = false;
editingApp = null;
editAppId = "";
appLauncher.ensureInitialized();
appLauncher.searchQuery = "";
appLauncher.selectedIndex = 0;
@@ -100,8 +162,45 @@ DankPopout {
LayoutMirroring.childrenInherit: true
property alias searchField: searchField
property alias keyHandler: keyHandler
property alias editNameField: editNameField
property alias editIconField: editIconField
property alias editCommentField: editCommentField
property alias editEnvVarsField: editEnvVarsField
property alias editExtraFlagsField: editExtraFlagsField
focus: true
color: "transparent"
Keys.onPressed: function (event) {
if (appDrawerPopout.editMode) {
switch (event.key) {
case Qt.Key_Escape:
appDrawerPopout.closeEditMode();
event.accepted = true;
return;
case Qt.Key_Return:
case Qt.Key_Enter:
if (event.modifiers & Qt.ControlModifier) {
appDrawerPopout.saveAppOverride();
event.accepted = true;
}
return;
case Qt.Key_S:
if (event.modifiers & Qt.ControlModifier) {
appDrawerPopout.saveAppOverride();
event.accepted = true;
}
return;
case Qt.Key_R:
if ((event.modifiers & Qt.ControlModifier) && SessionData.getAppOverride(appDrawerPopout.editAppId) !== null) {
appDrawerPopout.resetAppOverride();
event.accepted = true;
}
return;
}
}
}
radius: Theme.cornerRadius
antialiasing: true
smooth: true
@@ -140,7 +239,7 @@ DankPopout {
id: keyHandler
anchors.fill: parent
focus: true
focus: !appDrawerPopout.editMode
function selectNext() {
switch (appDrawerPopout.searchMode) {
@@ -172,6 +271,29 @@ DankPopout {
}
}
function getSelectedItemPosition() {
const index = appLauncher.selectedIndex;
if (appLauncher.viewMode === "list") {
const y = index * (appList.itemHeight + appList.itemSpacing) - appList.contentY;
return Qt.point(appList.width / 2, y + appList.itemHeight / 2 + appList.y);
}
const row = Math.floor(index / appGrid.actualColumns);
const col = index % appGrid.actualColumns;
const x = col * appGrid.cellWidth + appGrid.cellWidth / 2;
const y = row * appGrid.cellHeight - appGrid.contentY + appGrid.cellHeight / 2 + appGrid.y;
return Qt.point(x, y);
}
function openContextMenuForSelected() {
if (appDrawerPopout.searchMode !== "apps" || appLauncher.model.count === 0)
return;
const selectedApp = appLauncher.model.get(appLauncher.selectedIndex);
if (!selectedApp)
return;
const pos = getSelectedItemPosition();
contextMenu.show(pos.x, pos.y, selectedApp, true);
}
readonly property var keyMappings: {
const mappings = {};
mappings[Qt.Key_Escape] = () => appDrawerPopout.close();
@@ -181,6 +303,8 @@ DankPopout {
mappings[Qt.Key_Enter] = () => keyHandler.activateSelected();
mappings[Qt.Key_Tab] = () => appDrawerPopout.searchMode === "apps" && appLauncher.viewMode === "grid" ? appLauncher.selectNextInRow() : keyHandler.selectNext();
mappings[Qt.Key_Backtab] = () => appDrawerPopout.searchMode === "apps" && appLauncher.viewMode === "grid" ? appLauncher.selectPreviousInRow() : keyHandler.selectPrevious();
mappings[Qt.Key_Menu] = () => keyHandler.openContextMenuForSelected();
mappings[Qt.Key_F10] = () => keyHandler.openContextMenuForSelected();
if (appDrawerPopout.searchMode === "apps" && appLauncher.viewMode === "grid") {
mappings[Qt.Key_Right] = () => I18n.isRtl ? appLauncher.selectPreviousInRow() : appLauncher.selectNextInRow();
@@ -191,6 +315,9 @@ DankPopout {
}
Keys.onPressed: function (event) {
if (appDrawerPopout.editMode)
return;
if (keyMappings[event.key]) {
keyMappings[event.key]();
event.accepted = true;
@@ -198,9 +325,8 @@ DankPopout {
}
const hasCtrl = event.modifiers & Qt.ControlModifier;
if (!hasCtrl) {
if (!hasCtrl)
return;
}
switch (event.key) {
case Qt.Key_N:
@@ -234,6 +360,7 @@ DankPopout {
x: Theme.spacingS
y: Theme.spacingS
spacing: Theme.spacingS
visible: !appDrawerPopout.editMode
Item {
width: parent.width
@@ -487,7 +614,7 @@ DankPopout {
appLauncher.launchApp(modelData);
}
onItemRightClicked: function (index, modelData, mouseX, mouseY) {
contextMenu.show(mouseX, mouseY, modelData);
contextMenu.show(mouseX, mouseY, modelData, false);
}
onKeyboardNavigationReset: {
appLauncher.keyboardNavigationActive = false;
@@ -574,7 +701,7 @@ DankPopout {
appLauncher.launchApp(modelData);
}
onItemRightClicked: function (index, modelData, mouseX, mouseY) {
contextMenu.show(mouseX, mouseY, modelData);
contextMenu.show(mouseX, mouseY, modelData, false);
}
onKeyboardNavigationReset: {
appLauncher.keyboardNavigationActive = false;
@@ -615,6 +742,281 @@ DankPopout {
}
}
Item {
id: editView
anchors.fill: parent
anchors.margins: Theme.spacingS
visible: appDrawerPopout.editMode
Column {
anchors.fill: parent
spacing: Theme.spacingM
Row {
width: parent.width
spacing: Theme.spacingM
Rectangle {
width: 40
height: 40
radius: Theme.cornerRadius
color: backButtonArea.containsMouse ? Theme.surfaceHover : "transparent"
DankIcon {
anchors.centerIn: parent
name: "arrow_back"
size: 20
color: Theme.surfaceText
}
MouseArea {
id: backButtonArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: appDrawerPopout.closeEditMode()
}
}
Image {
width: 40
height: 40
source: appDrawerPopout.editingApp?.icon ? "image://icon/" + appDrawerPopout.editingApp.icon : "image://icon/application-x-executable"
sourceSize.width: 40
sourceSize.height: 40
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter
}
Column {
anchors.verticalCenter: parent.verticalCenter
spacing: 2
StyledText {
text: I18n.tr("Edit App")
font.pixelSize: Theme.fontSizeLarge
color: Theme.surfaceText
font.weight: Font.Medium
}
StyledText {
text: appDrawerPopout.editingApp?.name || ""
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
}
}
}
Rectangle {
width: parent.width
height: 1
color: Theme.outlineMedium
}
Flickable {
width: parent.width
height: parent.height - y - editButtonsRow.height - Theme.spacingM
contentHeight: editFieldsColumn.height
clip: true
boundsBehavior: Flickable.StopAtBounds
Column {
id: editFieldsColumn
width: parent.width
spacing: Theme.spacingS
Column {
width: parent.width
spacing: 4
StyledText {
text: I18n.tr("Name")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
}
DankTextField {
id: editNameField
width: parent.width
height: 44
focus: true
placeholderText: appDrawerPopout.editingApp?.name || ""
keyNavigationTab: editIconField
keyNavigationBacktab: editExtraFlagsField
}
}
Column {
width: parent.width
spacing: 4
StyledText {
text: I18n.tr("Icon")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
}
DankTextField {
id: editIconField
width: parent.width
height: 44
placeholderText: appDrawerPopout.editingApp?.icon || ""
keyNavigationTab: editCommentField
keyNavigationBacktab: editNameField
}
}
Column {
width: parent.width
spacing: 4
StyledText {
text: I18n.tr("Description")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
}
DankTextField {
id: editCommentField
width: parent.width
height: 44
placeholderText: appDrawerPopout.editingApp?.comment || ""
keyNavigationTab: editEnvVarsField
keyNavigationBacktab: editIconField
}
}
Column {
width: parent.width
spacing: 4
StyledText {
text: I18n.tr("Environment Variables")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
}
StyledText {
text: "KEY=value KEY2=value2"
font.pixelSize: Theme.fontSizeSmall - 1
color: Theme.surfaceVariantText
}
DankTextField {
id: editEnvVarsField
width: parent.width
height: 44
placeholderText: "VAR=value"
keyNavigationTab: editExtraFlagsField
keyNavigationBacktab: editCommentField
}
}
Column {
width: parent.width
spacing: 4
StyledText {
text: I18n.tr("Extra Arguments")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium
}
DankTextField {
id: editExtraFlagsField
width: parent.width
height: 44
placeholderText: "--flag --option=value"
keyNavigationTab: editNameField
keyNavigationBacktab: editEnvVarsField
}
}
}
}
Row {
id: editButtonsRow
anchors.horizontalCenter: parent.horizontalCenter
spacing: Theme.spacingM
Rectangle {
width: 90
height: 40
radius: Theme.cornerRadius
color: resetButtonArea.containsMouse ? Theme.surfacePressed : Theme.surfaceVariantAlpha
visible: SessionData.getAppOverride(appDrawerPopout.editAppId) !== null
StyledText {
text: I18n.tr("Reset")
font.pixelSize: Theme.fontSizeMedium
color: Theme.error
font.weight: Font.Medium
anchors.centerIn: parent
}
MouseArea {
id: resetButtonArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: appDrawerPopout.resetAppOverride()
}
}
Rectangle {
width: 90
height: 40
radius: Theme.cornerRadius
color: cancelButtonArea.containsMouse ? Theme.surfacePressed : Theme.surfaceVariantAlpha
StyledText {
text: I18n.tr("Cancel")
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceText
font.weight: Font.Medium
anchors.centerIn: parent
}
MouseArea {
id: cancelButtonArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: appDrawerPopout.closeEditMode()
}
}
Rectangle {
width: 90
height: 40
radius: Theme.cornerRadius
color: saveButtonArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.9) : Theme.primary
StyledText {
text: I18n.tr("Save")
font.pixelSize: Theme.fontSizeMedium
color: Theme.onPrimary
font.weight: Font.Medium
anchors.centerIn: parent
}
MouseArea {
id: saveButtonArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: appDrawerPopout.saveAppOverride()
}
}
}
}
}
MouseArea {
anchors.fill: parent
visible: contextMenu.visible
@@ -624,338 +1026,21 @@ DankPopout {
}
}
Popup {
SpotlightContextMenuPopup {
id: contextMenu
property var currentApp: null
readonly property var desktopEntry: (currentApp && !currentApp.isPlugin && appLauncher && appLauncher._uniqueApps && currentApp.appIndex >= 0 && currentApp.appIndex < appLauncher._uniqueApps.length) ? appLauncher._uniqueApps[currentApp.appIndex] : null
readonly property string appId: desktopEntry ? (desktopEntry.id || desktopEntry.execString || "") : ""
readonly property bool isPinned: appId && SessionData.isPinnedApp(appId)
parent: contentLoader.item
appLauncher: appLauncher
parentHandler: contentLoader.item?.keyHandler ?? null
searchField: contentLoader.item?.searchField ?? null
visible: false
z: 1000
}
function show(x, y, app) {
currentApp = app;
let finalX = x + 4;
let finalY = y + 4;
if (contextMenu.parent) {
const parentWidth = contextMenu.parent.width;
const parentHeight = contextMenu.parent.height;
const menuWidth = contextMenu.width;
const menuHeight = contextMenu.height;
if (finalX + menuWidth > parentWidth) {
finalX = Math.max(0, parentWidth - menuWidth);
}
if (finalY + menuHeight > parentHeight) {
finalY = Math.max(0, parentHeight - menuHeight);
}
}
contextMenu.x = finalX;
contextMenu.y = finalY;
contextMenu.open();
}
function hide() {
contextMenu.close();
}
width: Math.max(180, menuColumn.implicitWidth + Theme.spacingS * 2)
height: menuColumn.implicitHeight + Theme.spacingS * 2
padding: 0
closePolicy: Popup.CloseOnPressOutside
modal: false
dim: false
background: Rectangle {
radius: Theme.cornerRadius
color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency)
border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08)
border.width: 1
Rectangle {
anchors.fill: parent
anchors.topMargin: 4
anchors.leftMargin: 2
anchors.rightMargin: -2
anchors.bottomMargin: -4
radius: parent.radius
color: Qt.rgba(0, 0, 0, 0.15)
z: -1
}
}
enter: Transition {
NumberAnimation {
property: "opacity"
from: 0
to: 1
duration: Theme.shortDuration
easing.type: Theme.emphasizedEasing
}
}
exit: Transition {
NumberAnimation {
property: "opacity"
from: 1
to: 0
duration: Theme.shortDuration
easing.type: Theme.emphasizedEasing
}
}
Column {
id: menuColumn
anchors.fill: parent
anchors.margins: Theme.spacingS
spacing: 1
Rectangle {
width: parent.width
height: 32
radius: Theme.cornerRadius
color: pinMouseArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : "transparent"
Row {
anchors.left: parent.left
anchors.leftMargin: Theme.spacingS
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingS
DankIcon {
name: contextMenu.isPinned ? "keep_off" : "push_pin"
size: Theme.iconSize - 2
color: Theme.surfaceText
opacity: 0.7
anchors.verticalCenter: parent.verticalCenter
}
StyledText {
text: contextMenu.isPinned ? I18n.tr("Unpin from Dock") : I18n.tr("Pin to Dock")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Normal
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea {
id: pinMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
if (!contextMenu.desktopEntry) {
return;
}
if (contextMenu.isPinned) {
SessionData.removePinnedApp(contextMenu.appId);
} else {
SessionData.addPinnedApp(contextMenu.appId);
}
contextMenu.hide();
}
}
}
Rectangle {
width: parent.width - Theme.spacingS * 2
height: 5
anchors.horizontalCenter: parent.horizontalCenter
color: "transparent"
Rectangle {
anchors.centerIn: parent
width: parent.width
height: 1
color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2)
}
}
Repeater {
model: contextMenu.desktopEntry && contextMenu.desktopEntry.actions ? contextMenu.desktopEntry.actions : []
Rectangle {
width: Math.max(parent.width, actionRow.implicitWidth + Theme.spacingS * 2)
height: 32
radius: Theme.cornerRadius
color: actionMouseArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : "transparent"
Row {
id: actionRow
anchors.left: parent.left
anchors.leftMargin: Theme.spacingS
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingS
Item {
anchors.verticalCenter: parent.verticalCenter
width: Theme.iconSize - 2
height: Theme.iconSize - 2
visible: modelData.icon && modelData.icon !== ""
IconImage {
anchors.fill: parent
source: modelData.icon ? Quickshell.iconPath(modelData.icon, true) : ""
smooth: true
asynchronous: true
visible: status === Image.Ready
}
}
StyledText {
text: modelData.name || ""
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Normal
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea {
id: actionMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
if (modelData && contextMenu.desktopEntry) {
SessionService.launchDesktopAction(contextMenu.desktopEntry, modelData);
if (contextMenu.currentApp) {
appLauncher.appLaunched(contextMenu.currentApp);
}
}
contextMenu.hide();
}
}
}
}
Rectangle {
visible: contextMenu.desktopEntry && contextMenu.desktopEntry.actions && contextMenu.desktopEntry.actions.length > 0
width: parent.width - Theme.spacingS * 2
height: 5
anchors.horizontalCenter: parent.horizontalCenter
color: "transparent"
Rectangle {
anchors.centerIn: parent
width: parent.width
height: 1
color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2)
}
}
Rectangle {
width: parent.width
height: 32
radius: Theme.cornerRadius
color: launchMouseArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : "transparent"
Row {
anchors.left: parent.left
anchors.leftMargin: Theme.spacingS
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingS
DankIcon {
name: "launch"
size: Theme.iconSize - 2
color: Theme.surfaceText
opacity: 0.7
anchors.verticalCenter: parent.verticalCenter
}
StyledText {
text: I18n.tr("Launch")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Normal
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea {
id: launchMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
if (contextMenu.currentApp)
appLauncher.launchApp(contextMenu.currentApp);
contextMenu.hide();
}
}
}
Rectangle {
visible: SessionService.nvidiaCommand
width: parent.width - Theme.spacingS * 2
height: 5
anchors.horizontalCenter: parent.horizontalCenter
color: "transparent"
Rectangle {
anchors.centerIn: parent
width: parent.width
height: 1
color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2)
}
}
Rectangle {
visible: SessionService.nvidiaCommand
width: parent.width
height: 32
radius: Theme.cornerRadius
color: nvidiaMouseArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : "transparent"
Row {
anchors.left: parent.left
anchors.leftMargin: Theme.spacingS
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingS
DankIcon {
name: "memory"
size: Theme.iconSize - 2
color: Theme.surfaceText
opacity: 0.7
anchors.verticalCenter: parent.verticalCenter
}
StyledText {
text: I18n.tr("Launch on dGPU")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Normal
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea {
id: nvidiaMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
if (contextMenu.desktopEntry) {
SessionService.launchDesktopEntry(contextMenu.desktopEntry, true);
if (contextMenu.currentApp) {
appLauncher.appLaunched(contextMenu.currentApp);
}
}
contextMenu.hide();
}
}
}
Connections {
target: contextMenu
function onEditAppRequested(app) {
appDrawerPopout.openEditMode(app);
}
}
}

View File

@@ -72,6 +72,16 @@ Item {
}
}
Connections {
target: SessionData
function onHiddenAppsChanged() {
updateFilteredModel();
}
function onAppOverridesChanged() {
updateFilteredModel();
}
}
function updateFilteredModel() {
if (suppressUpdatesWhileLaunching) {
suppressUpdatesWhileLaunching = false;
@@ -124,7 +134,7 @@ Item {
emptyTriggerItems = emptyTriggerItems.concat(items);
});
const coreItems = AppSearchService.getCoreApps("");
apps = AppSearchService.applications.concat(emptyTriggerItems).concat(coreItems);
apps = AppSearchService.getVisibleApplications().concat(emptyTriggerItems).concat(coreItems);
} else {
apps = AppSearchService.getAppsInCategory(selectedCategory).slice(0, maxResults);
const coreItems = AppSearchService.getCoreApps("").filter(app => app.categories.includes(selectedCategory));
@@ -205,6 +215,7 @@ Item {
"isPlugin": isPluginItem,
"isCore": app.isCore === true,
"isBuiltInLauncher": app.isBuiltInLauncher === true,
"isAction": app.isAction === true,
"appIndex": uniqueApps.length - 1,
"pinned": app._pinned === true
});
@@ -283,6 +294,13 @@ Item {
return;
}
if (appData.isAction && actualApp.parentApp && actualApp.actionData) {
SessionService.launchDesktopAction(actualApp.parentApp, actualApp.actionData);
appLaunched(appData);
AppUsageHistoryData.addAppUsage(actualApp.parentApp);
return;
}
SessionService.launchDesktopEntry(actualApp);
appLaunched(appData);
AppUsageHistoryData.addAppUsage(actualApp);

View File

@@ -296,6 +296,9 @@ Item {
width: parent.width
anchors.centerIn: parent
implicitWidth: isVertical ? widgetThickness : totalSize
implicitHeight: isVertical ? totalSize : widgetThickness
Timer {
id: layoutTimer
interval: 0

View File

@@ -20,6 +20,13 @@ Item {
readonly property real innerPadding: barConfig?.innerPadding ?? 4
property alias hLeftSection: hLeftSection
property alias hCenterSection: hCenterSection
property alias hRightSection: hRightSection
property alias vLeftSection: vLeftSection
property alias vCenterSection: vCenterSection
property alias vRightSection: vRightSection
anchors.fill: parent
anchors.leftMargin: Math.max(Theme.spacingXS, innerPadding * 0.8)
anchors.rightMargin: Math.max(Theme.spacingXS, innerPadding * 0.8)

View File

@@ -500,8 +500,78 @@ PanelWindow {
height: axis.isVertical ? parent.height : maskThickness
}
readonly property bool clickThroughEnabled: barConfig?.clickThrough ?? false
readonly property var _leftSection: topBarContent ? (barWindow.isVertical ? topBarContent.vLeftSection : topBarContent.hLeftSection) : null
readonly property var _centerSection: topBarContent ? (barWindow.isVertical ? topBarContent.vCenterSection : topBarContent.hCenterSection) : null
readonly property var _rightSection: topBarContent ? (barWindow.isVertical ? topBarContent.vRightSection : topBarContent.hRightSection) : null
function sectionRect(section, isCenter) {
if (!section)
return {
"x": 0,
"y": 0,
"w": 0,
"h": 0
};
const pos = section.mapToItem(barWindow.contentItem, 0, 0);
const implW = section.implicitWidth || 0;
const implH = section.implicitHeight || 0;
const offsetX = isCenter && !barWindow.isVertical ? (section.width - implW) / 2 : 0;
const offsetY = !barWindow.isVertical ? (section.height - implH) / 2 : (isCenter ? (section.height - implH) / 2 : 0);
const edgePad = 2;
return {
"x": pos.x + offsetX - edgePad,
"y": pos.y + offsetY - edgePad,
"w": implW + edgePad * 2,
"h": implH + edgePad * 2
};
}
mask: Region {
item: inputMask
item: clickThroughEnabled ? null : inputMask
Region {
readonly property var r: barWindow.clickThroughEnabled ? barWindow.sectionRect(barWindow._leftSection, false) : {
"x": 0,
"y": 0,
"w": 0,
"h": 0
}
x: r.x
y: r.y
width: r.w
height: r.h
}
Region {
readonly property var r: barWindow.clickThroughEnabled ? barWindow.sectionRect(barWindow._centerSection, true) : {
"x": 0,
"y": 0,
"w": 0,
"h": 0
}
x: r.x
y: r.y
width: r.w
height: r.h
}
Region {
readonly property var r: barWindow.clickThroughEnabled ? barWindow.sectionRect(barWindow._rightSection, false) : {
"x": 0,
"y": 0,
"w": 0,
"h": 0
}
x: r.x
y: r.y
width: r.w
height: r.h
}
}
Item {

View File

@@ -731,7 +731,8 @@ Item {
Flow {
id: workspaceRow
anchors.centerIn: parent
x: isVertical ? visualBackground.x : (parent.width - implicitWidth) / 2
y: isVertical ? (parent.height - implicitHeight) / 2 : visualBackground.y
spacing: Theme.spacingS
flow: isVertical ? Flow.TopToBottom : Flow.LeftToRight
@@ -754,6 +755,17 @@ Item {
return !!(modelData && modelData.num === root.currentWorkspace);
return modelData === root.currentWorkspace;
}
property bool isOccupied: {
if (CompositorService.isHyprland)
return Array.from(Hyprland.toplevels?.values || []).some(tl => tl.workspace?.id === modelData?.id);
if (CompositorService.isDwl)
return modelData.clients > 0;
if (CompositorService.isNiri) {
const workspace = NiriService.allWorkspaces.find(ws => ws.idx + 1 === modelData && ws.output === root.effectiveScreenName);
return workspace ? (NiriService.windows?.some(win => win.workspace_id === workspace.id) ?? false) : false;
}
return false;
}
property bool isPlaceholder: {
if (root.useExtWorkspace)
return !!(modelData && modelData.hidden);
@@ -835,6 +847,23 @@ Item {
}
}
readonly property color occupiedColor: {
switch (SettingsData.workspaceOccupiedColorMode) {
case "sec":
return Theme.secondary;
case "s":
return Theme.surface;
case "sc":
return Theme.surfaceContainer;
case "sch":
return Theme.surfaceContainerHigh;
case "schh":
return Theme.surfaceContainerHighest;
default:
return unfocusedColor;
}
}
readonly property color urgentColor: {
switch (SettingsData.workspaceUrgentColorMode) {
case "primary":
@@ -968,12 +997,13 @@ Item {
dataUpdateTimer.restart();
}
width: root.isVertical ? root.barThickness : visualWidth
height: root.isVertical ? visualHeight : root.barThickness
width: root.isVertical ? root.widgetHeight : visualWidth
height: root.isVertical ? visualHeight : root.widgetHeight
Rectangle {
id: focusedBorderRing
anchors.centerIn: parent
x: root.isVertical ? (root.widgetHeight - width) / 2 : (parent.width - width) / 2
y: root.isVertical ? (parent.height - height) / 2 : (root.widgetHeight - height) / 2
width: {
const borderWidth = (SettingsData.workspaceFocusedBorderEnabled && isActive && !isPlaceholder) ? SettingsData.workspaceFocusedBorderThickness : 0;
return delegateRoot.visualWidth + borderWidth * 2;
@@ -1020,9 +1050,10 @@ Item {
id: visualContent
width: delegateRoot.visualWidth
height: delegateRoot.visualHeight
anchors.centerIn: parent
x: root.isVertical ? (root.widgetHeight - width) / 2 : (parent.width - width) / 2
y: root.isVertical ? (parent.height - height) / 2 : (root.widgetHeight - height) / 2
radius: Theme.cornerRadius
color: isActive ? activeColor : isUrgent ? urgentColor : isPlaceholder ? Theme.surfaceTextLight : isHovered ? Theme.withAlpha(unfocusedColor, 0.7) : unfocusedColor
color: isActive ? activeColor : isUrgent ? urgentColor : isPlaceholder ? Theme.surfaceTextLight : isHovered ? Theme.withAlpha(unfocusedColor, 0.7) : isOccupied ? occupiedColor : unfocusedColor
border.width: isUrgent ? 2 : 0
border.color: isUrgent ? urgentColor : "transparent"

View File

@@ -12,8 +12,34 @@ Scope {
property string sharedPasswordBuffer: ""
property bool shouldLock: false
onShouldLockChanged: {
if (shouldLock && lockPowerOffArmed) {
lockStateCheck.restart();
}
}
Timer {
id: lockStateCheck
interval: 100
repeat: false
onTriggered: {
if (sessionLock.locked && lockPowerOffArmed) {
pendingLock = false;
IdleService.monitorsOff = true;
CompositorService.powerOffMonitors();
lockWakeAllowed = false;
lockWakeDebounce.restart();
lockPowerOffArmed = false;
dpmsReapplyTimer.start();
}
}
}
property bool lockInitiatedLocally: false
property bool pendingLock: false
property bool lockPowerOffArmed: false
property bool lockWakeAllowed: false
Component.onCompleted: {
IdleService.lockComponent = this;
@@ -37,6 +63,7 @@ Scope {
return;
lockInitiatedLocally = true;
lockPowerOffArmed = SettingsData.lockScreenPowerOffMonitorsOnLock;
if (!SessionService.active && SessionService.loginctlAvailable) {
pendingLock = true;
@@ -78,6 +105,7 @@ Scope {
return;
}
lockInitiatedLocally = false;
lockPowerOffArmed = SettingsData.lockScreenPowerOffMonitorsOnLock;
shouldLock = true;
}
@@ -96,11 +124,13 @@ Scope {
if (SessionService.active && pendingLock) {
pendingLock = false;
lockInitiatedLocally = true;
lockPowerOffArmed = SettingsData.lockScreenPowerOffMonitorsOnLock;
shouldLock = true;
return;
}
if (SessionService.locked && !shouldLock && !pendingLock) {
lockInitiatedLocally = false;
lockPowerOffArmed = SettingsData.lockScreenPowerOffMonitorsOnLock;
shouldLock = true;
}
}
@@ -119,13 +149,6 @@ Scope {
locked: shouldLock
onLockedChanged: {
if (locked) {
pendingLock = false;
dpmsReapplyTimer.start();
}
}
WlSessionLockSurface {
id: lockSurface
@@ -155,7 +178,33 @@ Scope {
}
}
Connections {
target: sessionLock
function onLockedChanged() {
if (sessionLock.locked) {
pendingLock = false;
if (lockPowerOffArmed && SettingsData.lockScreenPowerOffMonitorsOnLock) {
IdleService.monitorsOff = true;
CompositorService.powerOffMonitors();
lockWakeAllowed = false;
lockWakeDebounce.restart();
}
lockPowerOffArmed = false;
dpmsReapplyTimer.start();
return;
}
lockWakeAllowed = false;
if (IdleService.monitorsOff && SettingsData.lockScreenPowerOffMonitorsOnLock) {
IdleService.monitorsOff = false;
CompositorService.powerOnMonitors();
}
}
}
LockScreenDemo {
id: demoWindow
}
@@ -200,4 +249,46 @@ Scope {
repeat: false
onTriggered: IdleService.reapplyDpmsIfNeeded()
}
Timer {
id: lockWakeDebounce
interval: 200
repeat: false
onTriggered: {
if (!sessionLock.locked)
return;
if (!SettingsData.lockScreenPowerOffMonitorsOnLock)
return;
if (!IdleService.monitorsOff) {
lockWakeAllowed = true;
return;
}
if (lockWakeAllowed) {
IdleService.monitorsOff = false;
CompositorService.powerOnMonitors();
} else {
lockWakeAllowed = true;
}
}
}
MouseArea {
anchors.fill: parent
enabled: sessionLock.locked
hoverEnabled: enabled
onPressed: lockWakeDebounce.restart()
onPositionChanged: lockWakeDebounce.restart()
onWheel: lockWakeDebounce.restart()
}
FocusScope {
anchors.fill: parent
focus: sessionLock.locked
Keys.onPressed: event => {
if (!sessionLock.locked)
return;
lockWakeDebounce.restart();
}
}
}

View File

@@ -182,30 +182,20 @@ Item {
}
onOpenRequested: {
if (hasUnsavedChanges()) {
root.pendingAction = "open";
root.confirmationDialogOpen = true;
confirmationDialogLoader.active = true;
if (confirmationDialogLoader.item)
confirmationDialogLoader.item.open();
} else {
root.fileDialogOpen = true;
loadBrowserLoader.active = true;
if (loadBrowserLoader.item)
loadBrowserLoader.item.open();
textEditor.autoSaveToSession();
if (textEditor.text.length > 0) {
createNewTab();
}
root.fileDialogOpen = true;
loadBrowserLoader.active = true;
if (loadBrowserLoader.item)
loadBrowserLoader.item.open();
}
onNewRequested: {
if (hasUnsavedChanges()) {
root.pendingAction = "new";
root.confirmationDialogOpen = true;
confirmationDialogLoader.active = true;
if (confirmationDialogLoader.item)
confirmationDialogLoader.item.open();
} else {
createNewTab();
}
textEditor.autoSaveToSession();
createNewTab();
}
onEscapePressed: {
@@ -266,7 +256,7 @@ Item {
id: saveBrowserLoader
active: false
FileBrowserModal {
FileBrowserSurfaceModal {
id: saveBrowser
browserTitle: I18n.tr("Save Notepad File")
@@ -332,7 +322,7 @@ Item {
id: loadBrowserLoader
active: false
FileBrowserModal {
FileBrowserSurfaceModal {
id: loadBrowser
browserTitle: I18n.tr("Open Notepad File")

View File

@@ -52,20 +52,15 @@ Column {
readonly property bool isActive: NotepadStorageService.currentTabIndex === index
readonly property bool isHovered: tabMouseArea.containsMouse && !closeMouseArea.containsMouse
readonly property real calculatedWidth: {
const textWidth = tabText.paintedWidth || 100;
const closeButtonWidth = NotepadStorageService.tabs.length > 1 ? 20 : 0;
const spacing = Theme.spacingXS;
const padding = Theme.spacingM * 2;
return Math.max(120, Math.min(200, textWidth + closeButtonWidth + spacing + padding));
}
readonly property real tabWidth: 128
width: calculatedWidth
width: tabWidth
height: 32
radius: Theme.cornerRadius
color: isActive ? Theme.primaryPressed : isHovered ? Theme.primaryHoverLight : Theme.withAlpha(Theme.primaryPressed, 0)
border.width: isActive ? 0 : 1
border.color: Theme.outlineMedium
clip: true
MouseArea {
id: tabMouseArea
@@ -79,11 +74,14 @@ Column {
Row {
id: tabContent
anchors.centerIn: parent
anchors.fill: parent
anchors.leftMargin: Theme.spacingM
anchors.rightMargin: Theme.spacingM
spacing: Theme.spacingXS
StyledText {
id: tabText
width: parent.width - (tabCloseButton.visible ? tabCloseButton.width + Theme.spacingXS : 0)
text: {
var prefix = "";
if (hasUnsavedChangesForTab(modelData)) {
@@ -96,6 +94,7 @@ Column {
font.weight: isActive ? Font.Medium : Font.Normal
elide: Text.ElideMiddle
maximumLineCount: 1
wrapMode: Text.NoWrap
anchors.verticalCenter: parent.verticalCenter
}

View File

@@ -1,3 +1,4 @@
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -6,8 +7,6 @@ import qs.Common
import qs.Services
import qs.Widgets
pragma ComponentBehavior: Bound
Column {
id: root
@@ -22,55 +21,181 @@ Column {
property int currentMatchIndex: -1
property int matchCount: 0
signal saveRequested()
signal openRequested()
signal newRequested()
signal escapePressed()
signal contentChanged()
signal settingsRequested()
// Plugin-provided markdown/syntax highlighting (via builtInPluginSettings)
property bool pluginInstalled: SettingsData.getBuiltInPluginSetting("dankNotepadMarkdown", "enabled", false)
property bool pluginMarkdownEnabled: SettingsData.getBuiltInPluginSetting("dankNotepadMarkdown", "markdownPreview", false)
property bool pluginSyntaxEnabled: SettingsData.getBuiltInPluginSetting("dankNotepadMarkdown", "syntaxHighlighting", false)
property string pluginHighlightedHtml: SettingsData.getBuiltInPluginSetting("dankNotepadMarkdown", "highlightedHtml", "")
property string pluginFileExtension: SettingsData.getBuiltInPluginSetting("dankNotepadMarkdown", "currentFileExtension", "")
// Local toggle for markdown preview (can be toggled from UI)
property bool markdownPreviewActive: pluginMarkdownEnabled
// Toggle markdown preview
function toggleMarkdownPreview() {
if (!markdownPreviewActive) {
// Entering preview mode
syncContentToPlugin();
markdownPreviewActive = true;
} else {
// Exiting preview mode
markdownPreviewActive = false;
}
}
// Local toggle for syntax highlighting preview (read-only view with colors)
property bool syntaxPreviewActive: false
// Store original text when entering syntax preview mode
property string syntaxPreviewOriginalText: ""
// Function to refresh plugin settings (called from Connections inside TextArea)
function refreshPluginSettings() {
pluginInstalled = SettingsData.getBuiltInPluginSetting("dankNotepadMarkdown", "enabled", false);
pluginMarkdownEnabled = SettingsData.getBuiltInPluginSetting("dankNotepadMarkdown", "markdownPreview", false);
pluginSyntaxEnabled = SettingsData.getBuiltInPluginSetting("dankNotepadMarkdown", "syntaxHighlighting", false);
pluginHighlightedHtml = SettingsData.getBuiltInPluginSetting("dankNotepadMarkdown", "highlightedHtml", "");
pluginFileExtension = SettingsData.getBuiltInPluginSetting("dankNotepadMarkdown", "currentFileExtension", "");
console.warn("NotepadTextEditor: Plugin settings refreshed. MdEnabled:", pluginMarkdownEnabled, "HtmlLength:", pluginHighlightedHtml.length);
}
// Toggle syntax preview mode
function toggleSyntaxPreview() {
if (!syntaxPreviewActive) {
// Entering preview mode
syncContentToPlugin();
syntaxPreviewActive = true;
} else {
// Exiting preview mode
syntaxPreviewActive = false;
}
}
// File extension detection for current tab
readonly property string currentFilePath: currentTab?.filePath || ""
readonly property string currentFileExtension: {
if (!currentFilePath)
return "";
var parts = currentFilePath.split('.');
return parts.length > 1 ? parts[parts.length - 1].toLowerCase() : "";
}
onCurrentTabChanged: handleCurrentTabChanged()
Component.onCompleted: handleCurrentTabChanged()
function handleCurrentTabChanged() {
if (!currentTab)
return;
// Reset preview state ONLY when tab actually changes
markdownPreviewActive = false;
syntaxPreviewActive = false;
syntaxPreviewOriginalText = "";
textArea.readOnly = false;
syncContentToPlugin();
}
function syncContentToPlugin() {
if (!currentTab)
return;
// Notify plugin of content update
// console.warn("NotepadTextEditor: Pushing content to plugin. Length:", textArea.text.length, "Path:", currentFilePath);
SettingsData.setBuiltInPluginSetting("dankNotepadMarkdown", "currentFilePath", currentFilePath);
SettingsData.setBuiltInPluginSetting("dankNotepadMarkdown", "currentFileExtension", currentFileExtension);
SettingsData.setBuiltInPluginSetting("dankNotepadMarkdown", "sourceContent", textArea.text);
SettingsData.setBuiltInPluginSetting("dankNotepadMarkdown", "currentTabChanged", Date.now());
}
// Debounce content updates to plugin to keep preview ready
Timer {
id: syncTimer
interval: 500
repeat: false
onTriggered: syncContentToPlugin()
}
Connections {
target: textArea
function onTextChanged() {
if (!markdownPreviewActive && !syntaxPreviewActive) {
syncTimer.restart();
}
}
}
readonly property string fileExtension: {
if (!currentFilePath)
return "";
var parts = currentFilePath.split('.');
return parts.length > 1 ? parts[parts.length - 1].toLowerCase() : "";
}
readonly property bool isMarkdownFile: fileExtension === "md" || fileExtension === "markdown" || fileExtension === "mdown"
readonly property bool isCodeFile: fileExtension !== "" && fileExtension !== "txt" && !isMarkdownFile
signal saveRequested
signal openRequested
signal newRequested
signal escapePressed
signal contentChanged
signal settingsRequested
function hasUnsavedChanges() {
if (!currentTab || !contentLoaded) {
return false
return false;
}
if (currentTab.isTemporary) {
return textArea.text.length > 0
return textArea.text.length > 0;
}
return textArea.text !== lastSavedContent
// If in preview mode, compare original text
if (markdownPreviewActive || syntaxPreviewActive) {
return syntaxPreviewOriginalText !== lastSavedContent;
}
return textArea.text !== lastSavedContent;
}
function loadCurrentTabContent() {
if (!currentTab) return
if (!currentTab)
return;
contentLoaded = false;
// Reset preview states on load
markdownPreviewActive = false;
syntaxPreviewActive = false;
syntaxPreviewOriginalText = "";
contentLoaded = false
NotepadStorageService.loadTabContent(
NotepadStorageService.currentTabIndex,
(content) => {
lastSavedContent = content
textArea.text = content
contentLoaded = true
}
)
NotepadStorageService.loadTabContent(NotepadStorageService.currentTabIndex, content => {
lastSavedContent = content;
textArea.text = content;
contentLoaded = true;
textArea.readOnly = false;
});
}
function saveCurrentTabContent() {
if (!currentTab || !contentLoaded) return
if (!currentTab || !contentLoaded)
return;
NotepadStorageService.saveTabContent(
NotepadStorageService.currentTabIndex,
textArea.text
)
lastSavedContent = textArea.text
// If in preview mode, save the original text, NOT the HTML
var contentToSave = (markdownPreviewActive || syntaxPreviewActive) ? syntaxPreviewOriginalText : textArea.text;
NotepadStorageService.saveTabContent(NotepadStorageService.currentTabIndex, contentToSave);
lastSavedContent = contentToSave;
}
function autoSaveToSession() {
if (!currentTab || !contentLoaded) return
saveCurrentTabContent()
if (!currentTab || !contentLoaded)
return;
saveCurrentTabContent();
}
function setTextDocumentLineHeight() {
return
return;
}
property string lastTextForLineModel: ""
@@ -78,100 +203,102 @@ Column {
function updateLineModel() {
if (!SettingsData.notepadShowLineNumbers) {
lineModel = []
lastTextForLineModel = ""
return
lineModel = [];
lastTextForLineModel = "";
return;
}
// In preview mode, line numbers might not match visual lines correctly due to wrapping/HTML
// But for now let's use the current text (plain or HTML)
if (textArea.text !== lastTextForLineModel || lineModel.length === 0) {
lastTextForLineModel = textArea.text
lineModel = textArea.text.split('\n')
lastTextForLineModel = textArea.text;
lineModel = textArea.text.split('\n');
}
}
function performSearch() {
let matches = []
currentMatchIndex = -1
let matches = [];
currentMatchIndex = -1;
if (!searchQuery || searchQuery.length === 0) {
searchMatches = []
matchCount = 0
textArea.select(0, 0)
return
searchMatches = [];
matchCount = 0;
textArea.select(0, 0);
return;
}
const text = textArea.text
const query = searchQuery.toLowerCase()
let index = 0
const text = textArea.text;
const query = searchQuery.toLowerCase();
let index = 0;
while (index < text.length) {
const foundIndex = text.toLowerCase().indexOf(query, index)
if (foundIndex === -1) break
const foundIndex = text.toLowerCase().indexOf(query, index);
if (foundIndex === -1)
break;
matches.push({
start: foundIndex,
end: foundIndex + searchQuery.length
})
index = foundIndex + 1
});
index = foundIndex + 1;
}
searchMatches = matches
matchCount = matches.length
searchMatches = matches;
matchCount = matches.length;
if (matchCount > 0) {
currentMatchIndex = 0
highlightCurrentMatch()
currentMatchIndex = 0;
highlightCurrentMatch();
} else {
textArea.select(0, 0)
textArea.select(0, 0);
}
}
function highlightCurrentMatch() {
if (currentMatchIndex >= 0 && currentMatchIndex < searchMatches.length) {
const match = searchMatches[currentMatchIndex]
const match = searchMatches[currentMatchIndex];
textArea.cursorPosition = match.start
textArea.moveCursorSelection(match.end, TextEdit.SelectCharacters)
textArea.cursorPosition = match.start;
textArea.moveCursorSelection(match.end, TextEdit.SelectCharacters);
const flickable = textArea.parent
const flickable = textArea.parent;
if (flickable && flickable.contentY !== undefined) {
const lineHeight = textArea.font.pixelSize * 1.5
const approxLine = textArea.text.substring(0, match.start).split('\n').length
const targetY = approxLine * lineHeight - flickable.height / 2
flickable.contentY = Math.max(0, Math.min(targetY, flickable.contentHeight - flickable.height))
const lineHeight = textArea.font.pixelSize * 1.5;
const approxLine = textArea.text.substring(0, match.start).split('\n').length;
const targetY = approxLine * lineHeight - flickable.height / 2;
flickable.contentY = Math.max(0, Math.min(targetY, flickable.contentHeight - flickable.height));
}
}
}
function findNext() {
if (matchCount === 0 || searchMatches.length === 0) return
currentMatchIndex = (currentMatchIndex + 1) % matchCount
highlightCurrentMatch()
if (matchCount === 0 || searchMatches.length === 0)
return;
currentMatchIndex = (currentMatchIndex + 1) % matchCount;
highlightCurrentMatch();
}
function findPrevious() {
if (matchCount === 0 || searchMatches.length === 0) return
currentMatchIndex = currentMatchIndex <= 0 ? matchCount - 1 : currentMatchIndex - 1
highlightCurrentMatch()
if (matchCount === 0 || searchMatches.length === 0)
return;
currentMatchIndex = currentMatchIndex <= 0 ? matchCount - 1 : currentMatchIndex - 1;
highlightCurrentMatch();
}
function showSearch() {
searchVisible = true
searchVisible = true;
Qt.callLater(() => {
searchField.forceActiveFocus()
})
searchField.forceActiveFocus();
});
}
function hideSearch() {
searchVisible = false
searchQuery = ""
searchMatches = []
matchCount = 0
currentMatchIndex = -1
textArea.select(0, 0)
textArea.forceActiveFocus()
searchVisible = false;
searchQuery = "";
searchMatches = [];
matchCount = 0;
currentMatchIndex = -1;
textArea.select(0, 0);
textArea.forceActiveFocus();
}
spacing: Theme.spacingM
@@ -221,43 +348,43 @@ Column {
clip: true
Component.onCompleted: {
text = root.searchQuery
text = root.searchQuery;
}
Connections {
target: root
function onSearchQueryChanged() {
if (searchField.text !== root.searchQuery) {
searchField.text = root.searchQuery
searchField.text = root.searchQuery;
}
}
}
onTextChanged: {
if (root.searchQuery !== text) {
root.searchQuery = text
root.performSearch()
root.searchQuery = text;
root.performSearch();
}
}
Keys.onEscapePressed: event => {
root.hideSearch()
event.accepted = true
root.hideSearch();
event.accepted = true;
}
Keys.onReturnPressed: event => {
if (event.modifiers & Qt.ShiftModifier) {
root.findPrevious()
root.findPrevious();
} else {
root.findNext()
root.findNext();
}
event.accepted = true
event.accepted = true;
}
Keys.onEnterPressed: event => {
if (event.modifiers & Qt.ShiftModifier) {
root.findPrevious()
root.findPrevious();
} else {
root.findNext()
root.findNext();
}
event.accepted = true
event.accepted = true;
}
}
@@ -325,6 +452,7 @@ Column {
DankFlickable {
id: flickable
visible: !root.markdownPreviewActive && !root.syntaxPreviewActive
anchors.fill: parent
anchors.margins: 1
clip: true
@@ -383,7 +511,7 @@ Column {
TextArea.flickable: TextArea {
id: textArea
placeholderText: I18n.tr("Start typing your notes here...")
placeholderText: ""
placeholderTextColor: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.5)
font.family: SettingsData.notepadUseMonospace ? SettingsData.monoFontFamily : (SettingsData.notepadFontFamily || SettingsData.fontFamily)
font.pixelSize: SettingsData.notepadFontSize * SettingsData.fontScale
@@ -397,6 +525,7 @@ Column {
focus: true
activeFocusOnTab: true
textFormat: TextEdit.PlainText
// readOnly: root.syntaxPreviewActive || root.markdownPreviewActive // Handled by visibility now
inputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhNoAutoUppercase
persistentSelection: true
tabStopDistance: 40
@@ -404,27 +533,57 @@ Column {
topPadding: Theme.spacingM
rightPadding: Theme.spacingM
bottomPadding: Theme.spacingM
cursorDelegate: Rectangle {
width: 1.5
radius: 1
color: Theme.surfaceText
x: textArea.cursorRectangle.x
y: textArea.cursorRectangle.y
height: textArea.cursorRectangle.height
opacity: 1.0
SequentialAnimation on opacity {
running: textArea.activeFocus
loops: Animation.Infinite
PropertyAnimation {
from: 1.0
to: 0.0
duration: 650
easing.type: Easing.InOutQuad
}
PropertyAnimation {
from: 0.0
to: 1.0
duration: 650
easing.type: Easing.InOutQuad
}
}
}
Component.onCompleted: {
loadCurrentTabContent()
setTextDocumentLineHeight()
root.updateLineModel()
loadCurrentTabContent();
setTextDocumentLineHeight();
root.updateLineModel();
Qt.callLater(() => {
textArea.forceActiveFocus()
})
textArea.forceActiveFocus();
});
}
Connections {
target: NotepadStorageService
function onCurrentTabIndexChanged() {
loadCurrentTabContent()
// Exit syntax preview mode when switching tabs
if (root.syntaxPreviewActive) {
root.syntaxPreviewActive = false;
}
loadCurrentTabContent();
Qt.callLater(() => {
textArea.forceActiveFocus()
})
textArea.forceActiveFocus();
});
}
function onTabsChanged() {
if (NotepadStorageService.tabs.length > 0 && !contentLoaded) {
loadCurrentTabContent()
loadCurrentTabContent();
}
}
}
@@ -432,46 +591,49 @@ Column {
Connections {
target: SettingsData
function onNotepadShowLineNumbersChanged() {
root.updateLineModel()
root.updateLineModel();
}
function onBuiltInPluginSettingsChanged() {
root.refreshPluginSettings();
}
}
onTextChanged: {
if (contentLoaded && text !== lastSavedContent) {
autoSaveTimer.restart()
autoSaveTimer.restart();
}
root.contentChanged()
root.updateLineModel()
root.contentChanged();
root.updateLineModel();
}
Keys.onEscapePressed: (event) => {
root.escapePressed()
event.accepted = true
Keys.onEscapePressed: event => {
root.escapePressed();
event.accepted = true;
}
Keys.onPressed: (event) => {
Keys.onPressed: event => {
if (event.modifiers & Qt.ControlModifier) {
switch (event.key) {
case Qt.Key_S:
event.accepted = true
root.saveRequested()
break
event.accepted = true;
root.saveRequested();
break;
case Qt.Key_O:
event.accepted = true
root.openRequested()
break
event.accepted = true;
root.openRequested();
break;
case Qt.Key_N:
event.accepted = true
root.newRequested()
break
event.accepted = true;
root.newRequested();
break;
case Qt.Key_A:
event.accepted = true
selectAll()
break
event.accepted = true;
selectAll();
break;
case Qt.Key_F:
event.accepted = true
root.showSearch()
break
event.accepted = true;
root.showSearch();
break;
}
}
}
@@ -479,6 +641,66 @@ Column {
background: Rectangle {
color: "transparent"
}
// Make links clickable in markdown preview mode
onLinkActivated: link => {
Qt.openUrlExternally(link);
}
}
StyledText {
id: placeholderOverlay
text: I18n.tr("Start typing your notes here...")
color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.5)
font.family: textArea.font.family
font.pixelSize: textArea.font.pixelSize
visible: textArea.text.length === 0
anchors.left: textArea.left
anchors.top: textArea.top
anchors.leftMargin: textArea.leftPadding
anchors.topMargin: textArea.topPadding
z: textArea.z + 1
}
}
// Dedicated Flickable for Preview Mode
DankFlickable {
id: previewFlickable
visible: root.markdownPreviewActive || root.syntaxPreviewActive
anchors.fill: parent
anchors.margins: 1
clip: true
contentWidth: width - 11
TextArea.flickable: TextArea {
id: previewAreaReal
text: root.pluginHighlightedHtml
textFormat: TextEdit.RichText
readOnly: true
// Copy styling from main textArea
placeholderText: ""
font.family: SettingsData.notepadUseMonospace ? SettingsData.monoFontFamily : (SettingsData.notepadFontFamily || SettingsData.fontFamily)
font.pixelSize: SettingsData.notepadFontSize * SettingsData.fontScale
font.letterSpacing: 0
color: Theme.surfaceText
selectedTextColor: Theme.background
selectionColor: Theme.primary
selectByMouse: true
selectByKeyboard: true
wrapMode: TextArea.Wrap
focus: true
activeFocusOnTab: true
leftPadding: Theme.spacingM
topPadding: Theme.spacingM
rightPadding: Theme.spacingM
bottomPadding: Theme.spacingM
// Make links clickable
onLinkActivated: link => {
Qt.openUrlExternally(link);
}
}
}
}
@@ -545,6 +767,44 @@ Column {
color: Theme.surfaceTextMedium
}
}
// Markdown preview toggle (only visible when plugin installed and viewing .md file)
Row {
spacing: Theme.spacingS
visible: root.pluginInstalled && root.isMarkdownFile
DankActionButton {
iconName: root.markdownPreviewActive ? "visibility" : "visibility_off"
iconSize: Theme.iconSize - 2
iconColor: root.markdownPreviewActive ? Theme.primary : Theme.surfaceTextMedium
onClicked: root.toggleMarkdownPreview()
}
StyledText {
anchors.verticalCenter: parent.verticalCenter
text: I18n.tr("Preview")
font.pixelSize: Theme.fontSizeSmall
color: root.markdownPreviewActive ? Theme.primary : Theme.surfaceTextMedium
}
}
// Syntax highlighting toggle (only visible when plugin installed and viewing code file)
Row {
spacing: Theme.spacingS
visible: root.pluginInstalled && root.pluginSyntaxEnabled && root.isCodeFile
DankActionButton {
iconName: root.syntaxPreviewActive ? "code" : "code_off"
iconSize: Theme.iconSize - 2
iconColor: root.syntaxPreviewActive ? Theme.primary : Theme.surfaceTextMedium
onClicked: root.toggleSyntaxPreview()
}
StyledText {
anchors.verticalCenter: parent.verticalCenter
text: root.syntaxPreviewActive ? I18n.tr("Edit") : I18n.tr("Highlight")
font.pixelSize: Theme.fontSizeSmall
color: root.syntaxPreviewActive ? Theme.primary : Theme.surfaceTextMedium
}
}
}
DankActionButton {
@@ -578,29 +838,29 @@ Column {
StyledText {
text: {
if (autoSaveTimer.running) {
return I18n.tr("Auto-saving...")
return I18n.tr("Auto-saving...");
}
if (hasUnsavedChanges()) {
if (currentTab && currentTab.isTemporary) {
return I18n.tr("Unsaved note...")
return I18n.tr("Unsaved note...");
} else {
return I18n.tr("Unsaved changes")
return I18n.tr("Unsaved changes");
}
} else {
return I18n.tr("Saved")
return I18n.tr("Saved");
}
}
font.pixelSize: Theme.fontSizeSmall
color: {
if (autoSaveTimer.running) {
return Theme.primary
return Theme.primary;
}
if (hasUnsavedChanges()) {
return Theme.warning
return Theme.warning;
} else {
return Theme.success
return Theme.success;
}
}
opacity: textArea.text.length > 0 ? 1.0 : 0.0
@@ -613,7 +873,7 @@ Column {
interval: 2000
repeat: false
onTriggered: {
autoSaveToSession()
autoSaveToSession();
}
}
}

View File

@@ -8,8 +8,61 @@ Popup {
id: processContextMenu
property var processData: null
property int selectedIndex: -1
property bool keyboardNavigation: false
property var parentFocusItem: null
function show(x, y) {
signal menuClosed
signal processKilled
readonly property var menuItems: [
{
text: I18n.tr("Copy PID"),
icon: "tag",
action: copyPid,
enabled: true
},
{
text: I18n.tr("Copy Name"),
icon: "content_copy",
action: copyName,
enabled: true
},
{
text: I18n.tr("Copy Full Command"),
icon: "code",
action: copyFullCommand,
enabled: true
},
{
type: "separator"
},
{
text: I18n.tr("Kill Process"),
icon: "close",
action: killProcess,
enabled: true,
dangerous: true
},
{
text: I18n.tr("Force Kill (SIGKILL)"),
icon: "dangerous",
action: forceKillProcess,
enabled: processData && processData.pid > 1000,
dangerous: true
}
]
readonly property int visibleItemCount: {
let count = 0;
for (let i = 0; i < menuItems.length; i++) {
if (menuItems[i].type !== "separator")
count++;
}
return count;
}
function show(x, y, fromKeyboard) {
let finalX = x;
let finalY = y;
@@ -27,17 +80,98 @@ Popup {
processContextMenu.x = finalX;
processContextMenu.y = finalY;
keyboardNavigation = fromKeyboard || false;
selectedIndex = fromKeyboard ? 0 : -1;
open();
}
function selectNext() {
if (visibleItemCount === 0)
return;
let current = selectedIndex;
let next = current;
do {
next = (next + 1) % menuItems.length;
} while (menuItems[next].type === "separator" && next !== current)
selectedIndex = next;
}
function selectPrevious() {
if (visibleItemCount === 0)
return;
let current = selectedIndex;
let prev = current;
do {
prev = (prev - 1 + menuItems.length) % menuItems.length;
} while (menuItems[prev].type === "separator" && prev !== current)
selectedIndex = prev;
}
function activateSelected() {
if (selectedIndex < 0 || selectedIndex >= menuItems.length)
return;
const item = menuItems[selectedIndex];
if (item.type === "separator" || !item.enabled)
return;
item.action();
}
function copyPid() {
if (processData)
Quickshell.execDetached(["dms", "cl", "copy", processData.pid.toString()]);
close();
}
function copyName() {
if (processData) {
const name = processData.command || "";
Quickshell.execDetached(["dms", "cl", "copy", name]);
}
close();
}
function copyFullCommand() {
if (processData) {
const fullCmd = processData.fullCommand || processData.command || "";
Quickshell.execDetached(["dms", "cl", "copy", fullCmd]);
}
close();
}
function killProcess() {
if (processData)
Quickshell.execDetached(["kill", processData.pid.toString()]);
processKilled();
close();
}
function forceKillProcess() {
if (processData)
Quickshell.execDetached(["kill", "-9", processData.pid.toString()]);
processKilled();
close();
}
width: 200
height: menuColumn.implicitHeight + Theme.spacingS * 2
padding: 0
modal: false
closePolicy: Popup.CloseOnEscape
onClosed: closePolicy = Popup.CloseOnEscape
onOpened: outsideClickTimer.start()
onClosed: {
closePolicy = Popup.CloseOnEscape;
keyboardNavigation = false;
selectedIndex = -1;
menuClosed();
if (parentFocusItem)
Qt.callLater(() => parentFocusItem.forceActiveFocus());
}
onOpened: {
outsideClickTimer.start();
if (keyboardNavigation)
Qt.callLater(() => keyboardHandler.forceActiveFocus());
}
Timer {
id: outsideClickTimer
@@ -55,142 +189,145 @@ Popup {
border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08)
border.width: 1
Item {
id: keyboardHandler
anchors.fill: parent
focus: keyboardNavigation
Keys.onPressed: event => {
switch (event.key) {
case Qt.Key_Down:
case Qt.Key_J:
keyboardNavigation = true;
selectNext();
event.accepted = true;
return;
case Qt.Key_Up:
case Qt.Key_K:
keyboardNavigation = true;
selectPrevious();
event.accepted = true;
return;
case Qt.Key_Return:
case Qt.Key_Enter:
case Qt.Key_Space:
activateSelected();
event.accepted = true;
return;
case Qt.Key_Escape:
case Qt.Key_Left:
case Qt.Key_H:
close();
event.accepted = true;
return;
}
}
}
Column {
id: menuColumn
anchors.fill: parent
anchors.margins: Theme.spacingS
spacing: 1
MenuItem {
text: I18n.tr("Copy PID")
iconName: "tag"
onClicked: {
if (processContextMenu.processData)
Quickshell.execDetached(["dms", "cl", "copy", processContextMenu.processData.pid.toString()]);
processContextMenu.close();
}
}
Repeater {
model: menuItems
MenuItem {
text: I18n.tr("Copy Name")
iconName: "content_copy"
onClicked: {
if (processContextMenu.processData) {
const name = processContextMenu.processData.command || "";
Quickshell.execDetached(["dms", "cl", "copy", name]);
Item {
width: parent.width
height: modelData.type === "separator" ? 5 : 32
visible: modelData.type !== "separator" || index > 0
property int itemVisibleIndex: {
let count = 0;
for (let i = 0; i < index; i++) {
if (menuItems[i].type !== "separator")
count++;
}
return count;
}
processContextMenu.close();
}
}
MenuItem {
text: I18n.tr("Copy Full Command")
iconName: "code"
onClicked: {
if (processContextMenu.processData) {
const fullCmd = processContextMenu.processData.fullCommand || processContextMenu.processData.command || "";
Quickshell.execDetached(["dms", "cl", "copy", fullCmd]);
Rectangle {
visible: modelData.type === "separator"
width: parent.width - Theme.spacingS * 2
height: 1
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.15)
}
Rectangle {
id: menuItem
visible: modelData.type !== "separator"
width: parent.width
height: 32
radius: Theme.cornerRadius
color: {
if (!modelData.enabled)
return "transparent";
const isSelected = keyboardNavigation && selectedIndex === index;
if (modelData.dangerous) {
if (isSelected)
return Qt.rgba(Theme.error.r, Theme.error.g, Theme.error.b, 0.2);
return menuItemArea.containsMouse ? Qt.rgba(Theme.error.r, Theme.error.g, Theme.error.b, 0.12) : "transparent";
}
if (isSelected)
return Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.2);
return menuItemArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : "transparent";
}
opacity: modelData.enabled ? 1 : 0.5
Row {
anchors.left: parent.left
anchors.leftMargin: Theme.spacingS
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingS
DankIcon {
name: modelData.icon || ""
size: 16
color: {
if (!modelData.enabled)
return Theme.surfaceVariantText;
const isSelected = keyboardNavigation && selectedIndex === index;
if (modelData.dangerous && (menuItemArea.containsMouse || isSelected))
return Theme.error;
return Theme.surfaceText;
}
anchors.verticalCenter: parent.verticalCenter
}
StyledText {
text: modelData.text || ""
font.pixelSize: Theme.fontSizeSmall
font.weight: Font.Normal
color: {
if (!modelData.enabled)
return Theme.surfaceVariantText;
const isSelected = keyboardNavigation && selectedIndex === index;
if (modelData.dangerous && (menuItemArea.containsMouse || isSelected))
return Theme.error;
return Theme.surfaceText;
}
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea {
id: menuItemArea
anchors.fill: parent
hoverEnabled: true
cursorShape: modelData.enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
enabled: modelData.enabled
onEntered: {
keyboardNavigation = false;
selectedIndex = index;
}
onClicked: modelData.action()
}
}
processContextMenu.close();
}
}
Rectangle {
width: parent.width - Theme.spacingS * 2
height: 1
anchors.horizontalCenter: parent.horizontalCenter
color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.15)
}
MenuItem {
text: I18n.tr("Kill Process")
iconName: "close"
dangerous: true
enabled: processContextMenu.processData
onClicked: {
if (processContextMenu.processData)
Quickshell.execDetached(["kill", processContextMenu.processData.pid.toString()]);
processContextMenu.close();
}
}
MenuItem {
text: I18n.tr("Force Kill (SIGKILL)")
iconName: "dangerous"
dangerous: true
enabled: processContextMenu.processData && processContextMenu.processData.pid > 1000
onClicked: {
if (processContextMenu.processData)
Quickshell.execDetached(["kill", "-9", processContextMenu.processData.pid.toString()]);
processContextMenu.close();
}
}
}
}
component MenuItem: Rectangle {
id: menuItem
property string text: ""
property string iconName: ""
property bool dangerous: false
property bool enabled: true
signal clicked
width: parent.width
height: 32
radius: Theme.cornerRadius
color: {
if (!enabled)
return "transparent";
if (dangerous)
return menuItemArea.containsMouse ? Qt.rgba(Theme.error.r, Theme.error.g, Theme.error.b, 0.12) : "transparent";
return menuItemArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : "transparent";
}
opacity: enabled ? 1 : 0.5
Row {
anchors.left: parent.left
anchors.leftMargin: Theme.spacingS
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingS
DankIcon {
name: menuItem.iconName
size: 16
color: {
if (!menuItem.enabled)
return Theme.surfaceVariantText;
if (menuItem.dangerous && menuItemArea.containsMouse)
return Theme.error;
return Theme.surfaceText;
}
anchors.verticalCenter: parent.verticalCenter
}
StyledText {
text: menuItem.text
font.pixelSize: Theme.fontSizeSmall
font.weight: Font.Normal
color: {
if (!menuItem.enabled)
return Theme.surfaceVariantText;
if (menuItem.dangerous && menuItemArea.containsMouse)
return Theme.error;
return Theme.surfaceText;
}
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea {
id: menuItemArea
anchors.fill: parent
hoverEnabled: true
cursorShape: menuItem.enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
enabled: menuItem.enabled
onClicked: menuItem.clicked()
}
}
}

View File

@@ -42,6 +42,8 @@ DankPopout {
if (!shouldBeVisible) {
searchText = "";
expandedPid = "";
if (processesView)
processesView.reset();
}
}
@@ -69,9 +71,13 @@ DankPopout {
if (processListPopout.shouldBeVisible)
forceActiveFocus();
processContextMenu.parent = processListContent;
processContextMenu.parentFocusItem = processListContent;
}
Keys.onPressed: event => {
if (processContextMenu.visible)
return;
switch (event.key) {
case Qt.Key_Escape:
if (processListPopout.searchText.length > 0) {
@@ -79,6 +85,11 @@ DankPopout {
event.accepted = true;
return;
}
if (processesView.keyboardNavigationActive) {
processesView.reset();
event.accepted = true;
return;
}
processListPopout.close();
event.accepted = true;
return;
@@ -90,14 +101,15 @@ DankPopout {
}
break;
}
processesView.handleKey(event);
}
Connections {
target: processListPopout
function onShouldBeVisibleChanged() {
if (processListPopout.shouldBeVisible) {
if (processListPopout.shouldBeVisible)
Qt.callLater(() => processListContent.forceActiveFocus());
}
}
}
@@ -142,6 +154,8 @@ DankPopout {
showClearButton: true
text: processListPopout.searchText
onTextChanged: processListPopout.searchText = text
ignoreUpDownKeys: true
keyForwardTargets: [processListContent]
}
}
@@ -314,6 +328,7 @@ DankPopout {
clip: true
ProcessesView {
id: processesView
anchors.fill: parent
anchors.margins: Theme.spacingS
searchText: processListPopout.searchText

View File

@@ -11,18 +11,27 @@ Item {
property string searchText: ""
property string expandedPid: ""
property var contextMenu: null
property bool hoveringExpandedItem: false
readonly property bool pauseUpdates: hoveringExpandedItem || (contextMenu?.visible ?? false)
property int selectedIndex: -1
property bool keyboardNavigationActive: false
property int forceRefreshCount: 0
readonly property bool pauseUpdates: (contextMenu?.visible ?? false) || expandedPid.length > 0
readonly property bool shouldUpdate: !pauseUpdates || forceRefreshCount > 0
property var cachedProcesses: []
signal openContextMenuRequested(int index, real x, real y, bool fromKeyboard)
onFilteredProcessesChanged: {
if (!pauseUpdates)
cachedProcesses = filteredProcesses;
if (!shouldUpdate)
return;
cachedProcesses = filteredProcesses;
if (forceRefreshCount > 0)
forceRefreshCount--;
}
onPauseUpdatesChanged: {
if (!pauseUpdates)
onShouldUpdateChanged: {
if (shouldUpdate)
cachedProcesses = filteredProcesses;
}
@@ -75,6 +84,135 @@ Item {
return procs;
}
function selectNext() {
if (cachedProcesses.length === 0)
return;
keyboardNavigationActive = true;
selectedIndex = Math.min(selectedIndex + 1, cachedProcesses.length - 1);
ensureVisible();
}
function selectPrevious() {
if (cachedProcesses.length === 0)
return;
keyboardNavigationActive = true;
if (selectedIndex <= 0) {
selectedIndex = -1;
keyboardNavigationActive = false;
return;
}
selectedIndex = selectedIndex - 1;
ensureVisible();
}
function selectFirst() {
if (cachedProcesses.length === 0)
return;
keyboardNavigationActive = true;
selectedIndex = 0;
ensureVisible();
}
function selectLast() {
if (cachedProcesses.length === 0)
return;
keyboardNavigationActive = true;
selectedIndex = cachedProcesses.length - 1;
ensureVisible();
}
function toggleExpand() {
if (selectedIndex < 0 || selectedIndex >= cachedProcesses.length)
return;
const process = cachedProcesses[selectedIndex];
const pidStr = (process?.pid ?? -1).toString();
expandedPid = (expandedPid === pidStr) ? "" : pidStr;
}
function openContextMenu() {
if (selectedIndex < 0 || selectedIndex >= cachedProcesses.length)
return;
const delegate = processListView.itemAtIndex(selectedIndex);
if (!delegate)
return;
const process = cachedProcesses[selectedIndex];
if (!process || !contextMenu)
return;
contextMenu.processData = process;
const itemPos = delegate.mapToItem(contextMenu.parent, delegate.width / 2, delegate.height / 2);
contextMenu.parentFocusItem = root;
contextMenu.show(itemPos.x, itemPos.y, true);
}
function reset() {
selectedIndex = -1;
keyboardNavigationActive = false;
expandedPid = "";
}
function forceRefresh(count) {
forceRefreshCount = count || 3;
}
function ensureVisible() {
if (selectedIndex < 0)
return;
processListView.positionViewAtIndex(selectedIndex, ListView.Contain);
}
function handleKey(event) {
switch (event.key) {
case Qt.Key_Down:
selectNext();
event.accepted = true;
return;
case Qt.Key_Up:
selectPrevious();
event.accepted = true;
return;
case Qt.Key_J:
if (event.modifiers & Qt.ControlModifier) {
selectNext();
event.accepted = true;
}
return;
case Qt.Key_K:
if (event.modifiers & Qt.ControlModifier) {
selectPrevious();
event.accepted = true;
}
return;
case Qt.Key_Home:
selectFirst();
event.accepted = true;
return;
case Qt.Key_End:
selectLast();
event.accepted = true;
return;
case Qt.Key_Space:
if (keyboardNavigationActive) {
toggleExpand();
event.accepted = true;
}
return;
case Qt.Key_Return:
case Qt.Key_Enter:
if (keyboardNavigationActive) {
toggleExpand();
event.accepted = true;
}
return;
case Qt.Key_Menu:
case Qt.Key_F10:
if (keyboardNavigationActive && selectedIndex >= 0) {
openContextMenu();
event.accepted = true;
}
return;
}
}
Component.onCompleted: {
DgopService.addRef(["processes", "cpu", "memory", "system"]);
cachedProcesses = filteredProcesses;
@@ -163,22 +301,28 @@ Item {
delegate: ProcessItem {
required property var modelData
required property int index
width: processListView.width
process: modelData
isExpanded: root.expandedPid === (modelData?.pid ?? -1).toString()
isSelected: root.keyboardNavigationActive && root.selectedIndex === index
contextMenu: root.contextMenu
onToggleExpand: {
const pidStr = (modelData?.pid ?? -1).toString();
root.expandedPid = (root.expandedPid === pidStr) ? "" : pidStr;
}
onHoveringExpandedChanged: {
if (hoveringExpanded)
root.hoveringExpandedItem = true;
else
Qt.callLater(() => {
root.hoveringExpandedItem = false;
});
onClicked: {
root.keyboardNavigationActive = true;
root.selectedIndex = index;
}
onContextMenuRequested: (mouseX, mouseY) => {
if (root.contextMenu) {
root.contextMenu.processData = modelData;
root.contextMenu.parentFocusItem = root;
const globalPos = mapToItem(root.contextMenu.parent, mouseX, mouseY);
root.contextMenu.show(globalPos.x, globalPos.y, false);
}
}
}
@@ -288,10 +432,12 @@ Item {
property var process: null
property bool isExpanded: false
property bool isSelected: false
property var contextMenu: null
readonly property bool hoveringExpanded: (isExpanded && processMouseArea.containsMouse) || copyMouseArea.containsMouse
signal toggleExpand
signal clicked
signal contextMenuRequested(real mouseX, real mouseY)
readonly property int processPid: process?.pid ?? 0
readonly property real processCpu: process?.cpu ?? 0
@@ -301,8 +447,16 @@ Item {
height: isExpanded ? (44 + expandedRect.height + Theme.spacingXS) : 44
radius: Theme.cornerRadius
color: processMouseArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.06) : "transparent"
border.color: processMouseArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : "transparent"
color: {
if (isSelected)
return Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.15);
return processMouseArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.06) : "transparent";
}
border.color: {
if (isSelected)
return Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.3);
return processMouseArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : "transparent";
}
border.width: 1
clip: true
@@ -327,14 +481,10 @@ Item {
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: mouse => {
if (mouse.button === Qt.RightButton) {
if (processItemRoot.processPid > 0 && processItemRoot.contextMenu) {
processItemRoot.contextMenu.processData = processItemRoot.process;
const globalPos = processMouseArea.mapToGlobal(mouse.x, mouse.y);
const localPos = processItemRoot.contextMenu.parent ? processItemRoot.contextMenu.parent.mapFromGlobal(globalPos.x, globalPos.y) : globalPos;
processItemRoot.contextMenu.show(localPos.x, localPos.y);
}
processItemRoot.contextMenuRequested(mouse.x, mouse.y);
return;
}
processItemRoot.clicked();
processItemRoot.toggleExpand();
}
}

View File

@@ -373,7 +373,9 @@ Item {
StyledText {
text: {
switch (barCard.modelData.position) {
SettingsData.barConfigs;
const cfg = SettingsData.getBarConfig(barCard.modelData.id);
switch (cfg?.position ?? SettingsData.Position.Top) {
case SettingsData.Position.Top:
return I18n.tr("Top");
case SettingsData.Position.Bottom:
@@ -398,7 +400,9 @@ Item {
StyledText {
text: {
const prefs = barCard.modelData.screenPreferences || ["all"];
SettingsData.barConfigs;
const cfg = SettingsData.getBarConfig(barCard.modelData.id);
const prefs = cfg?.screenPreferences || ["all"];
if (prefs.includes("all") || (typeof prefs[0] === "string" && prefs[0] === "all"))
return I18n.tr("All displays");
return I18n.tr("%1 display(s)").replace("%1", prefs.length);
@@ -415,9 +419,11 @@ Item {
StyledText {
text: {
const left = barCard.modelData.leftWidgets?.length || 0;
const center = barCard.modelData.centerWidgets?.length || 0;
const right = barCard.modelData.rightWidgets?.length || 0;
SettingsData.barConfigs;
const cfg = SettingsData.getBarConfig(barCard.modelData.id);
const left = cfg?.leftWidgets?.length || 0;
const center = cfg?.centerWidgets?.length || 0;
const right = cfg?.rightWidgets?.length || 0;
return I18n.tr("%1 widgets").replace("%1", left + center + right);
}
font.pixelSize: Theme.fontSizeSmall
@@ -428,14 +434,22 @@ Item {
text: "•"
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
visible: !barCard.modelData.enabled && barCard.modelData.id !== "default"
visible: {
SettingsData.barConfigs;
const cfg = SettingsData.getBarConfig(barCard.modelData.id);
return !cfg?.enabled && barCard.modelData.id !== "default";
}
}
StyledText {
text: I18n.tr("Disabled")
font.pixelSize: Theme.fontSizeSmall
color: Theme.error
visible: !barCard.modelData.enabled && barCard.modelData.id !== "default"
visible: {
SettingsData.barConfigs;
const cfg = SettingsData.getBarConfig(barCard.modelData.id);
return !cfg?.enabled && barCard.modelData.id !== "default";
}
}
}
}
@@ -745,6 +759,21 @@ Item {
}
}
Rectangle {
width: parent.width
height: 1
color: Theme.outline
opacity: 0.15
}
SettingsToggleRow {
text: I18n.tr("Click Through")
checked: selectedBarConfig?.clickThrough ?? false
onToggled: toggled => SettingsData.updateBarConfig(selectedBarId, {
clickThrough: toggled
})
}
Rectangle {
width: parent.width
height: 1
@@ -1057,6 +1086,7 @@ Item {
}
SettingsCard {
id: shadowCard
iconName: "layers"
title: I18n.tr("Shadow", "bar shadow settings card")
visible: selectedBarConfig?.enabled
@@ -1076,7 +1106,7 @@ Item {
}
SettingsSliderRow {
visible: parent.shadowActive
visible: shadowCard.shadowActive
text: I18n.tr("Opacity")
minimum: 10
maximum: 100
@@ -1088,7 +1118,7 @@ Item {
}
Column {
visible: parent.shadowActive
visible: shadowCard.shadowActive
width: parent.width
spacing: Theme.spacingS

View File

@@ -462,6 +462,250 @@ Item {
}
}
SettingsCard {
width: parent.width
iconName: "search"
title: I18n.tr("Search Options")
settingKey: "searchOptions"
SettingsToggleRow {
settingKey: "searchAppActions"
tags: ["launcher", "search", "actions", "shortcuts"]
text: I18n.tr("Search App Actions")
description: I18n.tr("Include desktop actions (shortcuts) in search results.")
checked: SessionData.searchAppActions
onToggled: checked => SessionData.setSearchAppActions(checked)
}
}
SettingsCard {
id: hiddenAppsCard
width: parent.width
iconName: "visibility_off"
title: I18n.tr("Hidden Apps")
settingKey: "hiddenApps"
property var hiddenAppsModel: {
SessionData.hiddenApps;
const apps = [];
const allApps = AppSearchService.applications || [];
for (const hiddenId of SessionData.hiddenApps) {
const app = allApps.find(a => (a.id || a.execString || a.exec) === hiddenId);
if (app) {
apps.push({
id: hiddenId,
name: app.name || hiddenId,
icon: app.icon || "",
comment: app.comment || ""
});
} else {
apps.push({
id: hiddenId,
name: hiddenId,
icon: "",
comment: ""
});
}
}
return apps.sort((a, b) => a.name.localeCompare(b.name));
}
StyledText {
width: parent.width
text: I18n.tr("Hidden apps won't appear in the launcher. Right-click an app and select 'Hide App' to hide it.")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
wrapMode: Text.WordWrap
}
Column {
id: hiddenAppsList
width: parent.width
spacing: Theme.spacingS
Repeater {
model: hiddenAppsCard.hiddenAppsModel
delegate: Rectangle {
width: hiddenAppsList.width
height: 48
radius: Theme.cornerRadius
color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, 0.3)
border.width: 0
Row {
anchors.left: parent.left
anchors.leftMargin: Theme.spacingM
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingM
Image {
width: 24
height: 24
source: modelData.icon ? "image://icon/" + modelData.icon : "image://icon/application-x-executable"
sourceSize.width: 24
sourceSize.height: 24
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter
onStatusChanged: {
if (status === Image.Error)
source = "image://icon/application-x-executable";
}
}
Column {
anchors.verticalCenter: parent.verticalCenter
spacing: 2
StyledText {
text: modelData.name
font.pixelSize: Theme.fontSizeMedium
font.weight: Font.Medium
color: Theme.surfaceText
}
StyledText {
text: modelData.comment || modelData.id
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
visible: text.length > 0
}
}
}
DankActionButton {
anchors.right: parent.right
anchors.rightMargin: Theme.spacingM
anchors.verticalCenter: parent.verticalCenter
iconName: "visibility"
iconSize: 18
iconColor: Theme.primary
onClicked: SessionData.showApp(modelData.id)
}
}
}
StyledText {
width: parent.width
text: I18n.tr("No hidden apps.")
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceVariantText
horizontalAlignment: Text.AlignHCenter
visible: hiddenAppsCard.hiddenAppsModel.length === 0
}
}
}
SettingsCard {
id: appOverridesCard
width: parent.width
iconName: "edit"
title: I18n.tr("App Customizations")
settingKey: "appOverrides"
property var overridesModel: {
SessionData.appOverrides;
const items = [];
const allApps = AppSearchService.applications || [];
for (const appId in SessionData.appOverrides) {
const override = SessionData.appOverrides[appId];
const app = allApps.find(a => (a.id || a.execString || a.exec) === appId);
items.push({
id: appId,
name: override.name || app?.name || appId,
originalName: app?.name || appId,
icon: override.icon || app?.icon || "",
hasOverride: true
});
}
return items.sort((a, b) => a.name.localeCompare(b.name));
}
StyledText {
width: parent.width
text: I18n.tr("Apps with custom display name, icon, or launch options. Right-click an app and select 'Edit App' to customize.")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
wrapMode: Text.WordWrap
}
Column {
id: overridesList
width: parent.width
spacing: Theme.spacingS
Repeater {
model: appOverridesCard.overridesModel
delegate: Rectangle {
width: overridesList.width
height: 48
radius: Theme.cornerRadius
color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, 0.3)
border.width: 0
Row {
anchors.left: parent.left
anchors.leftMargin: Theme.spacingM
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingM
Image {
width: 24
height: 24
source: modelData.icon ? "image://icon/" + modelData.icon : "image://icon/application-x-executable"
sourceSize.width: 24
sourceSize.height: 24
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter
onStatusChanged: {
if (status === Image.Error)
source = "image://icon/application-x-executable";
}
}
Column {
anchors.verticalCenter: parent.verticalCenter
spacing: 2
StyledText {
text: modelData.name
font.pixelSize: Theme.fontSizeMedium
font.weight: Font.Medium
color: Theme.surfaceText
}
StyledText {
text: modelData.originalName !== modelData.name ? modelData.originalName : modelData.id
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
}
}
}
DankActionButton {
anchors.right: parent.right
anchors.rightMargin: Theme.spacingM
anchors.verticalCenter: parent.verticalCenter
iconName: "delete"
iconSize: 18
iconColor: Theme.error
onClicked: SessionData.clearAppOverride(modelData.id)
}
}
}
StyledText {
width: parent.width
text: I18n.tr("No app customizations.")
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceVariantText
horizontalAlignment: Text.AlignHCenter
visible: appOverridesCard.overridesModel.length === 0
}
}
}
SettingsCard {
id: recentAppsCard
width: parent.width

View File

@@ -131,6 +131,15 @@ Item {
onToggled: checked => SettingsData.set("lockBeforeSuspend", checked)
}
SettingsToggleRow {
settingKey: "lockScreenPowerOffMonitorsOnLock"
tags: ["lock", "screen", "monitor", "display", "dpms", "power"]
text: I18n.tr("Power off monitors on lock")
description: I18n.tr("Turn off all displays immediately when the lock screen activates")
checked: SettingsData.lockScreenPowerOffMonitorsOnLock
onToggled: checked => SettingsData.set("lockScreenPowerOffMonitorsOnLock", checked)
}
SettingsToggleRow {
settingKey: "enableFprint"
tags: ["lock", "screen", "fingerprint", "authentication", "biometric", "fprint"]

View File

@@ -199,6 +199,48 @@ Item {
opacity: 0.15
}
SettingsButtonGroupRow {
text: I18n.tr("Occupied Color")
model: ["none", "sec", "s", "sc", "sch", "schh"]
visible: CompositorService.isNiri || CompositorService.isHyprland || CompositorService.isDwl
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]);
}
}
Rectangle {
width: parent.width
height: 1
color: Theme.outline
opacity: 0.15
visible: CompositorService.isNiri || CompositorService.isHyprland || CompositorService.isDwl
}
SettingsButtonGroupRow {
text: I18n.tr("Unfocused Color")
model: ["def", "s", "sc", "sch"]

View File

@@ -10,6 +10,8 @@ Singleton {
property var applications: []
property var _cachedCategories: null
property var _cachedVisibleApps: null
property var _hiddenAppsSet: new Set()
readonly property int maxResults: 10
readonly property int frecencySampleSize: 10
@@ -40,6 +42,51 @@ Singleton {
function refreshApplications() {
applications = DesktopEntries.applications.values;
_cachedCategories = null;
_cachedVisibleApps = null;
}
function _rebuildHiddenSet() {
_hiddenAppsSet = new Set(SessionData.hiddenApps || []);
_cachedVisibleApps = null;
}
function isAppHidden(app) {
if (!app)
return false;
const appId = app.id || app.execString || app.exec || "";
return _hiddenAppsSet.has(appId);
}
function getVisibleApplications() {
if (_cachedVisibleApps === null) {
_cachedVisibleApps = applications.filter(app => !isAppHidden(app));
}
return _cachedVisibleApps.map(app => applyAppOverride(app));
}
Connections {
target: SessionData
function onHiddenAppsChanged() {
root._rebuildHiddenSet();
}
function onAppOverridesChanged() {
root._cachedVisibleApps = null;
}
}
function applyAppOverride(app) {
if (!app)
return app;
const appId = app.id || app.execString || app.exec || "";
const override = SessionData.getAppOverride(appId);
if (!override)
return app;
return Object.assign({}, app, {
name: override.name || app.name,
icon: override.icon || app.icon,
comment: override.comment || app.comment,
_override: override
});
}
readonly property string dmsLogoPath: Qt.resolvedUrl("../assets/danklogo2.svg")
@@ -226,7 +273,10 @@ Singleton {
}
}
Component.onCompleted: refreshApplications()
Component.onCompleted: {
_rebuildHiddenSet();
refreshApplications();
}
function tokenize(text) {
return text.toLowerCase().trim().split(/[\s\-_]+/).filter(w => w.length > 0);
@@ -345,17 +395,17 @@ Singleton {
}
function searchApplications(query) {
if (!query || query.length === 0) {
return applications;
}
if (!query || query.length === 0)
return getVisibleApplications();
if (applications.length === 0)
return [];
const queryLower = query.toLowerCase().trim();
const scoredApps = [];
const results = [];
const visibleApps = getVisibleApplications();
for (const app of applications) {
for (const app of visibleApps) {
const name = (app.name || "").toLowerCase();
const genericName = (app.genericName || "").toLowerCase();
const comment = (app.comment || "").toLowerCase();
@@ -440,10 +490,58 @@ Singleton {
});
}
if (SessionData.searchAppActions) {
const actionResults = searchAppActions(queryLower, visibleApps);
for (const actionResult of actionResults) {
scoredApps.push({
app: actionResult.app,
score: actionResult.score
});
}
}
scoredApps.sort((a, b) => b.score - a.score);
return scoredApps.slice(0, maxResults).map(item => item.app);
}
function searchAppActions(query, apps) {
const results = [];
for (const app of apps) {
if (!app.actions || app.actions.length === 0)
continue;
for (const action of app.actions) {
const actionName = (action.name || "").toLowerCase();
if (!actionName)
continue;
let score = 0;
if (actionName === query) {
score = 8000;
} else if (actionName.startsWith(query)) {
score = 4000;
} else if (actionName.includes(query)) {
score = 400;
}
if (score > 0) {
results.push({
app: {
name: action.name,
icon: action.icon || app.icon,
comment: app.name,
categories: app.categories || [],
isAction: true,
parentApp: app,
actionData: action
},
score: score
});
}
}
}
return results;
}
function getCategoriesForApp(app) {
if (!app?.categories)
return [];
@@ -525,17 +623,15 @@ Singleton {
}
function getAppsInCategory(category) {
if (category === I18n.tr("All")) {
return applications;
}
const visibleApps = getVisibleApplications();
if (category === I18n.tr("All"))
return visibleApps;
// Check if it's a plugin category
const pluginItems = getPluginItems(category, "");
if (pluginItems.length > 0) {
if (pluginItems.length > 0)
return pluginItems;
}
return applications.filter(app => {
return visibleApps.filter(app => {
const appCategories = getCategoriesForApp(app);
return appCategories.includes(category);
});

View File

@@ -182,17 +182,44 @@ Singleton {
return /[;&|<>()$`\\"']/.test(prefix);
}
function parseEnvVars(envVarsStr) {
if (!envVarsStr || envVarsStr.trim().length === 0)
return {};
const envObj = {};
const pairs = envVarsStr.trim().split(/\s+/);
for (const pair of pairs) {
const eqIndex = pair.indexOf("=");
if (eqIndex > 0) {
const key = pair.substring(0, eqIndex);
const value = pair.substring(eqIndex + 1);
envObj[key] = value;
}
}
return envObj;
}
function launchDesktopEntry(desktopEntry, useNvidia) {
let cmd = desktopEntry.command;
if (useNvidia && nvidiaCommand)
cmd = [nvidiaCommand].concat(cmd);
const appId = desktopEntry.id || desktopEntry.execString || desktopEntry.exec || "";
const override = SessionData.getAppOverride(appId);
if (override?.extraFlags) {
const extraArgs = override.extraFlags.trim().split(/\s+/).filter(arg => arg.length > 0);
cmd = cmd.concat(extraArgs);
}
const userPrefix = SettingsData.launchPrefix?.trim() || "";
const defaultPrefix = Quickshell.env("DMS_DEFAULT_LAUNCH_PREFIX") || "";
const prefix = userPrefix.length > 0 ? userPrefix : defaultPrefix;
const workDir = desktopEntry.workingDirectory || Quickshell.env("HOME");
const cursorEnv = typeof SettingsData.getCursorEnvironment === "function" ? SettingsData.getCursorEnvironment() : {};
const overrideEnv = override?.envVars ? parseEnvVars(override.envVars) : {};
const finalEnv = Object.assign({}, cursorEnv, overrideEnv);
if (desktopEntry.runInTerminal) {
const terminal = Quickshell.env("TERMINAL") || "xterm";
const escapedCmd = cmd.map(arg => escapeShellArg(arg)).join(" ");
@@ -200,7 +227,7 @@ Singleton {
Quickshell.execDetached({
command: [terminal, "-e", "sh", "-c", shellCmd],
workingDirectory: workDir,
environment: cursorEnv
environment: finalEnv
});
return;
}
@@ -210,7 +237,7 @@ Singleton {
Quickshell.execDetached({
command: ["sh", "-c", `${prefix} ${escapedCmd}`],
workingDirectory: workDir,
environment: cursorEnv
environment: finalEnv
});
return;
}
@@ -221,7 +248,7 @@ Singleton {
Quickshell.execDetached({
command: cmd,
workingDirectory: workDir,
environment: cursorEnv
environment: finalEnv
});
}

View File

@@ -59,7 +59,6 @@ Flow {
animationTimer.restart();
} else {
const oldIndex = currentIndex;
currentIndex = index;
selectionChanged(index, true);
if (oldIndex !== index && oldIndex >= 0) {
selectionChanged(oldIndex, false);

View File

@@ -29,6 +29,7 @@ Item {
property bool shouldBeVisible: false
property var customKeyboardFocus: null
property bool backgroundInteractive: true
property bool contentHandlesKeys: false
property real storedBarThickness: Theme.barHeight - 4
property real storedBarSpacing: 4
@@ -461,8 +462,12 @@ Item {
id: focusHelper
parent: contentContainer
anchors.fill: parent
focus: true
visible: !root.contentHandlesKeys
enabled: !root.contentHandlesKeys
focus: !root.contentHandlesKeys
Keys.onPressed: event => {
if (root.contentHandlesKeys)
return;
if (event.key === Qt.Key_Escape) {
close();
event.accepted = true;

View File

@@ -53,6 +53,7 @@ StyledRect {
property real topPadding: Theme.spacingM
property real bottomPadding: Theme.spacingM
property bool ignoreLeftRightKeys: false
property bool ignoreUpDownKeys: false
property bool ignoreTabKeys: false
property var keyForwardTargets: []
property Item keyNavigationTab: null
@@ -145,9 +146,16 @@ StyledRect {
if (root.ignoreTabKeys && (event.key === Qt.Key_Tab || event.key === Qt.Key_Backtab)) {
event.accepted = false;
for (var i = 0; i < root.keyForwardTargets.length; i++) {
if (root.keyForwardTargets[i]) {
if (root.keyForwardTargets[i])
root.keyForwardTargets[i].Keys.pressed(event);
}
return;
}
if (root.ignoreUpDownKeys && (event.key === Qt.Key_Up || event.key === Qt.Key_Down)) {
event.accepted = false;
for (var i = 0; i < root.keyForwardTargets.length; i++) {
if (root.keyForwardTargets[i])
root.keyForwardTargets[i].Keys.pressed(event);
}
}
}
}

View File

@@ -24,7 +24,8 @@ LANGUAGES = {
"es": "es.json",
"he": "he.json",
"hu": "hu.json",
"fa": "fa.json"
"fa": "fa.json",
"fr": "fr.json"
}
def error(msg):

File diff suppressed because it is too large Load Diff

View File

@@ -251,6 +251,9 @@
"Always Show Percentage": {
"Always Show Percentage": "Mostrar siempre el porcentaje"
},
"Always hide the dock and reveal it when hovering near the dock area": {
"Always hide the dock and reveal it when hovering near the dock area": ""
},
"Always on icons": {
"Always on icons": "Iconos fijos"
},
@@ -707,6 +710,9 @@
"Clear All Jobs": {
"Clear All Jobs": "Borrar todos los trabajos"
},
"Clear History?": {
"Clear History?": ""
},
"Clear all history when server starts": {
"Clear all history when server starts": "Limpiar todo el historial cuando el servidor inicia"
},
@@ -917,6 +923,12 @@
"Copy": {
"Copy": ""
},
"Copy Full Command": {
"Copy Full Command": ""
},
"Copy Name": {
"Copy Name": ""
},
"Copy PID": {
"Copy PID": "Copiar ID del Proceso"
},
@@ -1124,6 +1136,9 @@
"Delete Printer": {
"Delete Printer": "Eliminar impresora"
},
"Delete Saved Item?": {
"Delete Saved Item?": ""
},
"Delete VPN": {
"Delete VPN": "Eliminar VPN"
},
@@ -1208,6 +1223,9 @@
"Disk Usage": {
"Disk Usage": "Uso de disco"
},
"Disks": {
"Disks": ""
},
"Dismiss": {
"Dismiss": "Descartar"
},
@@ -1442,6 +1460,12 @@
"Enterprise": {
"Enterprise": "Empresa"
},
"Entry pinned": {
"Entry pinned": ""
},
"Entry unpinned": {
"Entry unpinned": ""
},
"Error": {
"Error": "Error"
},
@@ -1484,6 +1508,9 @@
"Failed to cancel selected job": {
"Failed to cancel selected job": "Error al cancelar el trabajo seleccionado"
},
"Failed to check pin limit": {
"Failed to check pin limit": ""
},
"Failed to connect VPN": {
"Failed to connect VPN": "Hubo un error al conectar con la VPN"
},
@@ -1559,6 +1586,9 @@
"Failed to pause printer": {
"Failed to pause printer": "Error al pausar la impresora"
},
"Failed to pin entry": {
"Failed to pin entry": ""
},
"Failed to print test page": {
"Failed to print test page": "Error al imprimir la página de prueba"
},
@@ -1604,6 +1634,9 @@
"Failed to start connection to %1": {
"Failed to start connection to %1": "Error al iniciar la conexión con %1"
},
"Failed to unpin entry": {
"Failed to unpin entry": ""
},
"Failed to update VPN": {
"Failed to update VPN": "Error al actualizar VPN"
},
@@ -1709,6 +1742,9 @@
"Force HDR": {
"Force HDR": "Forzar HDR"
},
"Force Kill (SIGKILL)": {
"Force Kill (SIGKILL)": ""
},
"Force Kill Process": {
"Force Kill Process": "Forzar terminar el proceso"
},
@@ -1763,6 +1799,9 @@
"Gamma control not available. Requires DMS API v6+.": {
"Gamma control not available. Requires DMS API v6+.": "Control de gamma no disponible. Requiere DMS API v6+."
},
"Generic device name | Generic device name fallback": {
"device": ""
},
"GitHub": {
"GitHub": "GitHub"
},
@@ -1880,6 +1919,9 @@
"History Settings": {
"History Settings": "Ajustes de historial"
},
"History cleared. %1 pinned entries kept.": {
"History cleared. %1 pinned entries kept.": ""
},
"Hold Duration": {
"Hold Duration": "Duración de pulsación"
},
@@ -1994,6 +2036,9 @@
"Install plugins from the DMS plugin registry": {
"Install plugins from the DMS plugin registry": "Instalar complementos de los registros de complementos DMS"
},
"Intelligent Auto-hide": {
"Intelligent Auto-hide": ""
},
"Interface:": {
"Interface:": "Interfaz:"
},
@@ -2021,6 +2066,166 @@
"Jobs: ": {
"Jobs: ": "Trabajos:"
},
"KDE Connect SMS action": {
"Opening SMS": "",
"Opening SMS app": ""
},
"KDE Connect SMS dialog title": {
"Send SMS": ""
},
"KDE Connect SMS message input placeholder": {
"Message": ""
},
"KDE Connect SMS phone input placeholder": {
"Phone number": ""
},
"KDE Connect SMS send button": {
"Send": ""
},
"KDE Connect SMS tooltip": {
"SMS": ""
},
"KDE Connect accept pairing button": {
"Accept": ""
},
"KDE Connect browse action": {
"Opening file browser": "",
"Opening files": ""
},
"KDE Connect browse tooltip": {
"Browse Files": ""
},
"KDE Connect clipboard action": {
"Clipboard sent": ""
},
"KDE Connect clipboard tooltip": {
"Send Clipboard": ""
},
"KDE Connect connected status": {
"Connected": ""
},
"KDE Connect daemon hint": {
"Start kdeconnectd to use this plugin": ""
},
"KDE Connect error": {
"Failed to accept pairing": "",
"Failed to browse device": "",
"Failed to launch SMS app": "",
"Failed to reject pairing": "",
"Failed to ring device": "",
"Failed to send clipboard": "",
"Failed to send ping": "",
"Failed to share": "",
"Pairing failed": "",
"Unpair failed": ""
},
"KDE Connect file share notification": {
"File received from": ""
},
"KDE Connect hint message": {
"Make sure KDE Connect is running on your other devices": ""
},
"KDE Connect no devices message": {
"No devices found": ""
},
"KDE Connect no devices status": {
"No devices": ""
},
"KDE Connect not paired status": {
"Not paired": ""
},
"KDE Connect offline status": {
"Offline": ""
},
"KDE Connect open SMS app button": {
"Open App": ""
},
"KDE Connect open app hint": {
"Open KDE Connect on your phone": ""
},
"KDE Connect pair button": {
"Pair": ""
},
"KDE Connect pairing action": {
"Device paired": "",
"Pairing request sent": ""
},
"KDE Connect pairing in progress status": {
"Pairing": ""
},
"KDE Connect pairing request notification": {
"Pairing request from": ""
},
"KDE Connect pairing requested status": {
"Pairing requested": ""
},
"KDE Connect pairing verification key label": {
"Verification": ""
},
"KDE Connect ping action": {
"Ping sent": "",
"Ping sent to": ""
},
"KDE Connect ping tooltip": {
"Ping": ""
},
"KDE Connect refresh button | KDE Connect refresh tooltip": {
"Refresh": ""
},
"KDE Connect reject pairing button": {
"Reject": ""
},
"KDE Connect request pairing button": {
"Request Pairing": ""
},
"KDE Connect ring action": {
"Ringing": ""
},
"KDE Connect ring tooltip": {
"Ring": ""
},
"KDE Connect service unavailable message": {
"KDE Connect unavailable": ""
},
"KDE Connect share URL button": {
"Share URL": ""
},
"KDE Connect share button | KDE Connect share dialog title | KDE Connect share tooltip": {
"Share": ""
},
"KDE Connect share input placeholder": {
"Enter URL or text to share": ""
},
"KDE Connect share success": {
"Shared": ""
},
"KDE Connect start daemon hint": {
"Start kdeconnectd to connect devices": ""
},
"KDE Connect status": {
"No devices connected": ""
},
"KDE Connect status multiple devices": {
"devices connected": ""
},
"KDE Connect status single device": {
"1 device connected": ""
},
"KDE Connect unavailable error title": {
"KDE Connect Not Available": ""
},
"KDE Connect unavailable status": {
"Unavailable": ""
},
"KDE Connect unknown device status | unknown author": {
"Unknown": ""
},
"KDE Connect unpair action": {
"Device unpaired": ""
},
"KDE Connect unpair tooltip": {
"Unpair": ""
},
"Keep Awake": {
"Keep Awake": "Mantener despierto"
},
@@ -2255,9 +2460,18 @@
"Maximum History": {
"Maximum History": "Historial máxima"
},
"Maximum Pinned Entries": {
"Maximum Pinned Entries": ""
},
"Maximum number of clipboard entries to keep": {
"Maximum number of clipboard entries to keep": "Número máximo de entradas del portapapeles a conservar"
},
"Maximum number of entries that can be saved": {
"Maximum number of entries that can be saved": ""
},
"Maximum pinned entries reached": {
"Maximum pinned entries reached": ""
},
"Maximum size per clipboard entry": {
"Maximum size per clipboard entry": "Tamaño máximo por entrada en el portapapeles"
},
@@ -2549,6 +2763,12 @@
"No printers found": {
"No printers found": "No se encontraron impresoras"
},
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No saved clipboard entries": {
"No saved clipboard entries": ""
},
"No variants created. Click Add to create a new monitor widget.": {
"No variants created. Click Add to create a new monitor widget.": "No hay variantes creadas. Haga clic en Añadir para crear un nuevo widget de monitor."
},
@@ -2624,6 +2844,9 @@
"OSD Position": {
"OSD Position": "Posición OSD"
},
"Occupied Color": {
"Occupied Color": ""
},
"Off": {
"Off": "Apagado"
},
@@ -2771,6 +2994,9 @@
"Percentage": {
"Percentage": "Porcentaje"
},
"Performance": {
"Performance": ""
},
"Permission denied to set profile image.": {
"Permission denied to set profile image.": "Permiso denegado para poner la imagen de perfil."
},
@@ -2870,6 +3096,9 @@
"Power Profile Degradation": {
"Power Profile Degradation": "Perfil de Energía Degradada"
},
"Power off monitors on lock": {
"Power off monitors on lock": ""
},
"Power profile management available": {
"Power profile management available": "Gestión del perfil de potencia disponible"
},
@@ -2939,6 +3168,9 @@
"Process Count": {
"Process Count": "Conteo de procesos"
},
"Processes": {
"Processes": ""
},
"Processing": {
"Processing": "Procesando"
},
@@ -3137,6 +3369,9 @@
"Saved Configurations": {
"Saved Configurations": "Configuraciones guardadas"
},
"Saved item deleted": {
"Saved item deleted": ""
},
"Scale": {
"Scale": "Escala"
},
@@ -3158,6 +3393,9 @@
"Science": {
"Science": "Ciencia"
},
"Screen Sharing": {
"Screen Sharing": ""
},
"Screen sharing": {
"Screen sharing": "Compartir pantalla"
},
@@ -3437,6 +3675,9 @@
"Show darkened overlay behind modal dialogs": {
"Show darkened overlay behind modal dialogs": "Oscurecer el fondo al abrir un modal"
},
"Show dock when floating windows don't overlap its area": {
"Show dock when floating windows don't overlap its area": ""
},
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": {
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": "Mostrar la superposición del lanzador al escribir en la vista general de Niri. Desactivar para utilizar otro lanzador."
},
@@ -3752,9 +3993,15 @@
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": {
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "Este widget evita que la GPU entre en estados de apagado y puede afectar significativamente la batería en portátiles. No se recomienda usarlo en portátiles con gráficos híbridos."
},
"This will delete all unpinned entries. %1 pinned entries will be kept.": {
"This will delete all unpinned entries. %1 pinned entries will be kept.": ""
},
"This will permanently delete all clipboard history.": {
"This will permanently delete all clipboard history.": "Esto eliminará permanentemente todo el historial del portapapeles."
},
"This will permanently remove this saved clipboard item. This action cannot be undone.": {
"This will permanently remove this saved clipboard item. This action cannot be undone.": ""
},
"Tiling": {
"Tiling": "Mosaico"
},
@@ -3854,6 +4101,9 @@
"Trigger Prefix": {
"Trigger Prefix": ""
},
"Turn off all displays immediately when the lock screen activates": {
"Turn off all displays immediately when the lock screen activates": ""
},
"Turn off monitors after": {
"Turn off monitors after": "Apagar monitores después de"
},
@@ -3920,6 +4170,9 @@
"Update Plugin": {
"Update Plugin": "Actualizar complemento"
},
"Uptime": {
"Uptime": ""
},
"Urgent Color": {
"Urgent Color": ""
},
@@ -4303,6 +4556,18 @@
"dgop not available": {
"dgop not available": "dgop no disponible"
},
"dgop unavailable error message": {
"The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.": ""
},
"disk io header in system monitor": {
"Disk I/O": ""
},
"disk read label": {
"Read:": ""
},
"disk write label": {
"Write:": ""
},
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": {
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "dms/binds.kdl existe pero no está incluido en config.kdl. Las combinaciones de teclas personalizadas no funcionarán hasta que esto se solucione."
},
@@ -4336,18 +4601,33 @@
"empty plugin list": {
"No plugins found": "No se han encontrado plugins"
},
"empty state in disk mounts list": {
"No mount points found": ""
},
"empty state in gpu list": {
"No GPUs detected": ""
},
"empty state in process list": {
"No matching processes": ""
},
"empty theme list": {
"No themes found": "No se han encontrado temas"
},
"events": {
"events": "eventos"
},
"fallback gpu name": {
"Unknown GPU": ""
},
"files": {
"files": "archivos"
},
"generic theme description": {
"Material Design inspired color themes": "Temas de color inspirados en Material Design"
},
"gpu section header in system monitor": {
"GPU Monitoring": ""
},
"greeter back button": {
"Back": ""
},
@@ -4540,6 +4820,9 @@
"minutes": {
"minutes": "minutos"
},
"mount points header in system monitor": {
"Mount Points": ""
},
"ms": {
"ms": "ms"
},
@@ -4614,6 +4897,15 @@
"plugin search placeholder": {
"Search plugins...": "Buscar complementos..."
},
"process count label in footer": {
"Processes:": ""
},
"process detail label": {
"Full Command:": ""
},
"process search placeholder": {
"Search processes...": ""
},
"profile image file browser title": {
"Select Profile Image": "Elegir foto de perfil"
},
@@ -4639,12 +4931,25 @@
"shadow intensity slider": {
"Intensity": ""
},
"short for processes": {
"procs": ""
},
"source code link": {
"source": "fuente"
},
"sysmon window title": {
"System Monitor": "Monitor del sistema"
},
"system info header in system monitor": {
"System Information": ""
},
"system info label": {
"Architecture": "",
"Distribution": "",
"Hostname": "",
"Kernel": "",
"Load Average": ""
},
"theme browser description": {
"Install color themes from the DMS theme registry": "Instalar tema de colores desde el repositorio de temas de DMS"
},
@@ -4675,6 +4980,9 @@
"update dms for NM integration.": {
"update dms for NM integration.": "Actualizar dms para integración con NM."
},
"uptime label in footer": {
"Uptime:": ""
},
"version requirement": {
"Requires %1": ""
},

View File

@@ -251,6 +251,9 @@
"Always Show Percentage": {
"Always Show Percentage": "همیشه درصد را نشان بده"
},
"Always hide the dock and reveal it when hovering near the dock area": {
"Always hide the dock and reveal it when hovering near the dock area": ""
},
"Always on icons": {
"Always on icons": "آیکون‌ها همیشه فعال"
},
@@ -707,6 +710,9 @@
"Clear All Jobs": {
"Clear All Jobs": "پاک‌کردن همه کار‌های چاپ"
},
"Clear History?": {
"Clear History?": ""
},
"Clear all history when server starts": {
"Clear all history when server starts": "هنگام راه‌اندازی سرور تمام تاریخچه را پاک کن"
},
@@ -917,6 +923,12 @@
"Copy": {
"Copy": ""
},
"Copy Full Command": {
"Copy Full Command": ""
},
"Copy Name": {
"Copy Name": ""
},
"Copy PID": {
"Copy PID": "کپی PID"
},
@@ -1124,6 +1136,9 @@
"Delete Printer": {
"Delete Printer": "حذف چاپگر"
},
"Delete Saved Item?": {
"Delete Saved Item?": ""
},
"Delete VPN": {
"Delete VPN": "حذف VPN"
},
@@ -1208,6 +1223,9 @@
"Disk Usage": {
"Disk Usage": "میزان مصرف دیسک"
},
"Disks": {
"Disks": ""
},
"Dismiss": {
"Dismiss": "رد کردن"
},
@@ -1442,6 +1460,12 @@
"Enterprise": {
"Enterprise": "شرکت"
},
"Entry pinned": {
"Entry pinned": ""
},
"Entry unpinned": {
"Entry unpinned": ""
},
"Error": {
"Error": "خطا"
},
@@ -1484,6 +1508,9 @@
"Failed to cancel selected job": {
"Failed to cancel selected job": "لغو کار چاپ انتخاب شده ناموفق بود"
},
"Failed to check pin limit": {
"Failed to check pin limit": ""
},
"Failed to connect VPN": {
"Failed to connect VPN": "اتصال به VPN ناموفق بود"
},
@@ -1559,6 +1586,9 @@
"Failed to pause printer": {
"Failed to pause printer": "توقف چاپگر ناموفق بود"
},
"Failed to pin entry": {
"Failed to pin entry": ""
},
"Failed to print test page": {
"Failed to print test page": "چاپ صفحه تست ناموفق بود"
},
@@ -1604,6 +1634,9 @@
"Failed to start connection to %1": {
"Failed to start connection to %1": "شروع اتصال به %1 ناموفق بود"
},
"Failed to unpin entry": {
"Failed to unpin entry": ""
},
"Failed to update VPN": {
"Failed to update VPN": "بروزرسانی VPN ناموفق بود"
},
@@ -1709,6 +1742,9 @@
"Force HDR": {
"Force HDR": "اجبار HDR"
},
"Force Kill (SIGKILL)": {
"Force Kill (SIGKILL)": ""
},
"Force Kill Process": {
"Force Kill Process": "بستن اجباری فرایند"
},
@@ -1763,6 +1799,9 @@
"Gamma control not available. Requires DMS API v6+.": {
"Gamma control not available. Requires DMS API v6+.": "کنترل گاما در دسترس نیست. نیاز به DMS API نسخه ۶ به بالا دارد."
},
"Generic device name | Generic device name fallback": {
"device": ""
},
"GitHub": {
"GitHub": "گیت‌هاب"
},
@@ -1880,6 +1919,9 @@
"History Settings": {
"History Settings": "تنظیمات تاریخچه"
},
"History cleared. %1 pinned entries kept.": {
"History cleared. %1 pinned entries kept.": ""
},
"Hold Duration": {
"Hold Duration": "مدت زمان نگه‌داشتن"
},
@@ -1994,6 +2036,9 @@
"Install plugins from the DMS plugin registry": {
"Install plugins from the DMS plugin registry": "نصب افزونه‌ها از مخزن افزونه DMS"
},
"Intelligent Auto-hide": {
"Intelligent Auto-hide": ""
},
"Interface:": {
"Interface:": "اینترفیس:"
},
@@ -2021,6 +2066,166 @@
"Jobs: ": {
"Jobs: ": "کار‌های چاپ: "
},
"KDE Connect SMS action": {
"Opening SMS": "",
"Opening SMS app": ""
},
"KDE Connect SMS dialog title": {
"Send SMS": ""
},
"KDE Connect SMS message input placeholder": {
"Message": ""
},
"KDE Connect SMS phone input placeholder": {
"Phone number": ""
},
"KDE Connect SMS send button": {
"Send": ""
},
"KDE Connect SMS tooltip": {
"SMS": ""
},
"KDE Connect accept pairing button": {
"Accept": ""
},
"KDE Connect browse action": {
"Opening file browser": "",
"Opening files": ""
},
"KDE Connect browse tooltip": {
"Browse Files": ""
},
"KDE Connect clipboard action": {
"Clipboard sent": ""
},
"KDE Connect clipboard tooltip": {
"Send Clipboard": ""
},
"KDE Connect connected status": {
"Connected": ""
},
"KDE Connect daemon hint": {
"Start kdeconnectd to use this plugin": ""
},
"KDE Connect error": {
"Failed to accept pairing": "",
"Failed to browse device": "",
"Failed to launch SMS app": "",
"Failed to reject pairing": "",
"Failed to ring device": "",
"Failed to send clipboard": "",
"Failed to send ping": "",
"Failed to share": "",
"Pairing failed": "",
"Unpair failed": ""
},
"KDE Connect file share notification": {
"File received from": ""
},
"KDE Connect hint message": {
"Make sure KDE Connect is running on your other devices": ""
},
"KDE Connect no devices message": {
"No devices found": ""
},
"KDE Connect no devices status": {
"No devices": ""
},
"KDE Connect not paired status": {
"Not paired": ""
},
"KDE Connect offline status": {
"Offline": ""
},
"KDE Connect open SMS app button": {
"Open App": ""
},
"KDE Connect open app hint": {
"Open KDE Connect on your phone": ""
},
"KDE Connect pair button": {
"Pair": ""
},
"KDE Connect pairing action": {
"Device paired": "",
"Pairing request sent": ""
},
"KDE Connect pairing in progress status": {
"Pairing": ""
},
"KDE Connect pairing request notification": {
"Pairing request from": ""
},
"KDE Connect pairing requested status": {
"Pairing requested": ""
},
"KDE Connect pairing verification key label": {
"Verification": ""
},
"KDE Connect ping action": {
"Ping sent": "",
"Ping sent to": ""
},
"KDE Connect ping tooltip": {
"Ping": ""
},
"KDE Connect refresh button | KDE Connect refresh tooltip": {
"Refresh": ""
},
"KDE Connect reject pairing button": {
"Reject": ""
},
"KDE Connect request pairing button": {
"Request Pairing": ""
},
"KDE Connect ring action": {
"Ringing": ""
},
"KDE Connect ring tooltip": {
"Ring": ""
},
"KDE Connect service unavailable message": {
"KDE Connect unavailable": ""
},
"KDE Connect share URL button": {
"Share URL": ""
},
"KDE Connect share button | KDE Connect share dialog title | KDE Connect share tooltip": {
"Share": ""
},
"KDE Connect share input placeholder": {
"Enter URL or text to share": ""
},
"KDE Connect share success": {
"Shared": ""
},
"KDE Connect start daemon hint": {
"Start kdeconnectd to connect devices": ""
},
"KDE Connect status": {
"No devices connected": ""
},
"KDE Connect status multiple devices": {
"devices connected": ""
},
"KDE Connect status single device": {
"1 device connected": ""
},
"KDE Connect unavailable error title": {
"KDE Connect Not Available": ""
},
"KDE Connect unavailable status": {
"Unavailable": ""
},
"KDE Connect unknown device status | unknown author": {
"Unknown": ""
},
"KDE Connect unpair action": {
"Device unpaired": ""
},
"KDE Connect unpair tooltip": {
"Unpair": ""
},
"Keep Awake": {
"Keep Awake": "بیدار نگه‌ دار"
},
@@ -2255,9 +2460,18 @@
"Maximum History": {
"Maximum History": "حداکثر تاریخچه"
},
"Maximum Pinned Entries": {
"Maximum Pinned Entries": ""
},
"Maximum number of clipboard entries to keep": {
"Maximum number of clipboard entries to keep": "بیشینه تعداد ورودی‌های کلیپ‌بورد برای نگه‌داری"
},
"Maximum number of entries that can be saved": {
"Maximum number of entries that can be saved": ""
},
"Maximum pinned entries reached": {
"Maximum pinned entries reached": ""
},
"Maximum size per clipboard entry": {
"Maximum size per clipboard entry": "بیشینه اندازه برای هر ورودی کلیپ‌بورد"
},
@@ -2549,6 +2763,12 @@
"No printers found": {
"No printers found": "چاپگری یافت نشد"
},
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No saved clipboard entries": {
"No saved clipboard entries": ""
},
"No variants created. Click Add to create a new monitor widget.": {
"No variants created. Click Add to create a new monitor widget.": "هیچ گونه‌ی دیگری ایجاد نشد. برای ایجاد یک ابزارک مانیتور جدید، روی افزودن کلیک کنید."
},
@@ -2624,6 +2844,9 @@
"OSD Position": {
"OSD Position": "موقعیت OSD"
},
"Occupied Color": {
"Occupied Color": ""
},
"Off": {
"Off": "خاموش"
},
@@ -2771,6 +2994,9 @@
"Percentage": {
"Percentage": "درصد"
},
"Performance": {
"Performance": ""
},
"Permission denied to set profile image.": {
"Permission denied to set profile image.": "اجازه تنظیم تصویر نمایه داده نشد."
},
@@ -2870,6 +3096,9 @@
"Power Profile Degradation": {
"Power Profile Degradation": "تنزل‌دادن پروفایل پاور"
},
"Power off monitors on lock": {
"Power off monitors on lock": ""
},
"Power profile management available": {
"Power profile management available": "مدیریت پروفایل پاور در دسترس"
},
@@ -2939,6 +3168,9 @@
"Process Count": {
"Process Count": "تعداد فرایند‌ها"
},
"Processes": {
"Processes": ""
},
"Processing": {
"Processing": "درحال پردازش"
},
@@ -3137,6 +3369,9 @@
"Saved Configurations": {
"Saved Configurations": "پیکربندی‌های ذخیره شده"
},
"Saved item deleted": {
"Saved item deleted": ""
},
"Scale": {
"Scale": "بزرگنمایی"
},
@@ -3158,6 +3393,9 @@
"Science": {
"Science": "علمی"
},
"Screen Sharing": {
"Screen Sharing": ""
},
"Screen sharing": {
"Screen sharing": "اشتراک‌گذاری صفحه"
},
@@ -3437,6 +3675,9 @@
"Show darkened overlay behind modal dialogs": {
"Show darkened overlay behind modal dialogs": "نمایش overlay تیره پشت پنجره مودال"
},
"Show dock when floating windows don't overlap its area": {
"Show dock when floating windows don't overlap its area": ""
},
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": {
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": "overlay لانچر را هنگام تایپ در نمای کلی نیری نمایش بده. برای استفاده از لانچر دیگری غیرفعال کنید."
},
@@ -3752,9 +3993,15 @@
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": {
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "این ابزارک از حالت‌های خاموش شدن GPU جلوگیری می‌کند، که ​​می‌تواند به طور قابل توجهی بر عمر باتری لپ‌تاپ‌ها تأثیر بگذارد. استفاده از این ابزارک در لپ‌تاپ‌هایی با گرافیک هیبریدی توصیه نمی‌شود."
},
"This will delete all unpinned entries. %1 pinned entries will be kept.": {
"This will delete all unpinned entries. %1 pinned entries will be kept.": ""
},
"This will permanently delete all clipboard history.": {
"This will permanently delete all clipboard history.": "این کار تمام تاریخچه کلیپ‌بورد را برای همیشه حذف می‌کند."
},
"This will permanently remove this saved clipboard item. This action cannot be undone.": {
"This will permanently remove this saved clipboard item. This action cannot be undone.": ""
},
"Tiling": {
"Tiling": "تایلینگ"
},
@@ -3854,6 +4101,9 @@
"Trigger Prefix": {
"Trigger Prefix": ""
},
"Turn off all displays immediately when the lock screen activates": {
"Turn off all displays immediately when the lock screen activates": ""
},
"Turn off monitors after": {
"Turn off monitors after": "خاموش‌کردن مانیتور پس از"
},
@@ -3920,6 +4170,9 @@
"Update Plugin": {
"Update Plugin": "بروزرسانی افزونه"
},
"Uptime": {
"Uptime": ""
},
"Urgent Color": {
"Urgent Color": ""
},
@@ -4303,6 +4556,18 @@
"dgop not available": {
"dgop not available": "dgop در دسترس نیست"
},
"dgop unavailable error message": {
"The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.": ""
},
"disk io header in system monitor": {
"Disk I/O": ""
},
"disk read label": {
"Read:": ""
},
"disk write label": {
"Write:": ""
},
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": {
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "فایل dms/binds.kdl وجود دارد اما در config.kdl گنجانده نشده است. کلیدهای ترکیبی سفارشی تا زمانی که این مشکل برطرف نشود، کار نخواهند کرد."
},
@@ -4336,18 +4601,33 @@
"empty plugin list": {
"No plugins found": "هیچ افزونه‌ای یافت نشد"
},
"empty state in disk mounts list": {
"No mount points found": ""
},
"empty state in gpu list": {
"No GPUs detected": ""
},
"empty state in process list": {
"No matching processes": ""
},
"empty theme list": {
"No themes found": "هیچ تمی یافت نشد"
},
"events": {
"events": "رویداد‌ها"
},
"fallback gpu name": {
"Unknown GPU": ""
},
"files": {
"files": "فایل"
},
"generic theme description": {
"Material Design inspired color themes": "رنگ‌های تم الهام گرفته شده از متریال دیزاین"
},
"gpu section header in system monitor": {
"GPU Monitoring": ""
},
"greeter back button": {
"Back": "بازگشت"
},
@@ -4540,6 +4820,9 @@
"minutes": {
"minutes": "دقیقه"
},
"mount points header in system monitor": {
"Mount Points": ""
},
"ms": {
"ms": "ms"
},
@@ -4614,6 +4897,15 @@
"plugin search placeholder": {
"Search plugins...": "جستجوی افزونه‌ها..."
},
"process count label in footer": {
"Processes:": ""
},
"process detail label": {
"Full Command:": ""
},
"process search placeholder": {
"Search processes...": ""
},
"profile image file browser title": {
"Select Profile Image": "انتخاب تصویر نمایه"
},
@@ -4639,12 +4931,25 @@
"shadow intensity slider": {
"Intensity": ""
},
"short for processes": {
"procs": ""
},
"source code link": {
"source": "منبع"
},
"sysmon window title": {
"System Monitor": "ناظر سیستم"
},
"system info header in system monitor": {
"System Information": ""
},
"system info label": {
"Architecture": "",
"Distribution": "",
"Hostname": "",
"Kernel": "",
"Load Average": ""
},
"theme browser description": {
"Install color themes from the DMS theme registry": "نصب تم رنگ‌ها از مخزن تم DMS"
},
@@ -4675,6 +4980,9 @@
"update dms for NM integration.": {
"update dms for NM integration.": "DMS را برای یکپارچه‌سازی NM بروز کنید."
},
"uptime label in footer": {
"Uptime:": ""
},
"version requirement": {
"Requires %1": ""
},

File diff suppressed because it is too large Load Diff

View File

@@ -251,6 +251,9 @@
"Always Show Percentage": {
"Always Show Percentage": "הצג/י תמיד אחוזים"
},
"Always hide the dock and reveal it when hovering near the dock area": {
"Always hide the dock and reveal it when hovering near the dock area": ""
},
"Always on icons": {
"Always on icons": "סמלים דולקים תמיד"
},
@@ -489,7 +492,7 @@
"Behavior": "התנהגות"
},
"Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": {
"Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": "קשירת מסך הנעילה לאותות D-Bus מloginctl. יש להשבית אם משתמשים במסך נעילה חיצוני."
"Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": "מקשר את מסך הנעילה לאותות D-Bus מloginctl. יש להשבית אם משתמשים במסך נעילה חיצוני."
},
"Binds Include Missing": {
"Binds Include Missing": "קובץ includes של קיצורי מקלדת חסר"
@@ -707,6 +710,9 @@
"Clear All Jobs": {
"Clear All Jobs": "נקה/י את כל העבודות"
},
"Clear History?": {
"Clear History?": ""
},
"Clear all history when server starts": {
"Clear all history when server starts": "נקה/י את כל ההיסטוריה כאשר השרת מופעל"
},
@@ -753,7 +759,7 @@
"Clipboard service not available": "שירות לוח ההעתקה אינו זמין"
},
"Clipboard works but nothing saved to disk": {
"Clipboard works but nothing saved to disk": "לוח ההעתקה עובד אך שום דבר לא נשמר לדיסק"
"Clipboard works but nothing saved to disk": "לוח ההעתקה יעבוד אך שום דבר לא יישמר לדיסק"
},
"Clock": {
"Clock": "שעון"
@@ -917,6 +923,12 @@
"Copy": {
"Copy": "העתק/י"
},
"Copy Full Command": {
"Copy Full Command": ""
},
"Copy Name": {
"Copy Name": ""
},
"Copy PID": {
"Copy PID": "העתק/י PID"
},
@@ -1124,6 +1136,9 @@
"Delete Printer": {
"Delete Printer": "מחק/י מדפסת"
},
"Delete Saved Item?": {
"Delete Saved Item?": ""
},
"Delete VPN": {
"Delete VPN": "מחק/י VPN"
},
@@ -1208,6 +1223,9 @@
"Disk Usage": {
"Disk Usage": "שימוש בדיסק"
},
"Disks": {
"Disks": ""
},
"Dismiss": {
"Dismiss": "סגירה"
},
@@ -1221,10 +1239,10 @@
"Display Settings": "הגדרות תצוגה"
},
"Display a dock with pinned and running applications": {
"Display a dock with pinned and running applications": "הצג/י Dock עם יישומים מוצמדים ופעילים"
"Display a dock with pinned and running applications": "הצג/י את הDock עם אפליקציות מוצמדות ופעילות"
},
"Display all priorities over fullscreen apps": {
"Display all priorities over fullscreen apps": "הצג/י את כל רמות העדיפות מעל אפליקציות במסך מלא"
"Display all priorities over fullscreen apps": "הצג/י את כל ההתראות מעל אפליקציות במסך מלא"
},
"Display and switch DWL layouts": {
"Display and switch DWL layouts": "הצג/י והחלף/י פריסות DWL"
@@ -1371,7 +1389,7 @@
"Enable fingerprint authentication": "הפעלת אימות באמצעות טביעת אצבע"
},
"Enable loginctl lock integration": {
"Enable loginctl lock integration": "הפעל/י שילוב נעילה עם loginctl"
"Enable loginctl lock integration": "הפעלת האינטגרציה עם loginctl"
},
"Enable password field display on the lock screen window": {
"Show Password Field": "הצג/י שדה סיסמה"
@@ -1442,6 +1460,12 @@
"Enterprise": {
"Enterprise": "ארגוני"
},
"Entry pinned": {
"Entry pinned": ""
},
"Entry unpinned": {
"Entry unpinned": ""
},
"Error": {
"Error": "שגיאה"
},
@@ -1484,6 +1508,9 @@
"Failed to cancel selected job": {
"Failed to cancel selected job": "ביטול העבודה שנבחרה נכשל"
},
"Failed to check pin limit": {
"Failed to check pin limit": ""
},
"Failed to connect VPN": {
"Failed to connect VPN": "החיבור לVPN נכשל"
},
@@ -1559,6 +1586,9 @@
"Failed to pause printer": {
"Failed to pause printer": "השהיית המדפסת נכשלה"
},
"Failed to pin entry": {
"Failed to pin entry": ""
},
"Failed to print test page": {
"Failed to print test page": "הדפסת דף בדיקה נכשלה"
},
@@ -1604,6 +1634,9 @@
"Failed to start connection to %1": {
"Failed to start connection to %1": "התחלת החיבור ל%1 נכשלה"
},
"Failed to unpin entry": {
"Failed to unpin entry": ""
},
"Failed to update VPN": {
"Failed to update VPN": "עדכון הVPN נכשל"
},
@@ -1689,7 +1722,7 @@
"Focused Window": "חלון ממוקד"
},
"Follow Monitor Focus": {
"Follow Monitor Focus": "עקוב/י אחר מיקוד צג"
"Follow Monitor Focus": "מעקב אחרי המסך הממוקד"
},
"Follow focus": {
"Follow focus": "עקוב/י אחר מיקוד"
@@ -1709,6 +1742,9 @@
"Force HDR": {
"Force HDR": "אלץ/י HDR"
},
"Force Kill (SIGKILL)": {
"Force Kill (SIGKILL)": ""
},
"Force Kill Process": {
"Force Kill Process": "אילוץ סיום תהליך"
},
@@ -1763,6 +1799,9 @@
"Gamma control not available. Requires DMS API v6+.": {
"Gamma control not available. Requires DMS API v6+.": "בקרת גאמה אינה זמינה. נדרש API של DMS גרסה 6 ומעלה."
},
"Generic device name | Generic device name fallback": {
"device": ""
},
"GitHub": {
"GitHub": "GitHub"
},
@@ -1782,7 +1821,7 @@
"Gradually fade the screen before locking with a configurable grace period": "הפעל/י דהייה הדרגתית של המסך לפני הנעילה עם תקופת חסד הניתנת להגדרה"
},
"Gradually fade the screen before turning off monitors with a configurable grace period": {
"Gradually fade the screen before turning off monitors with a configurable grace period": "דהייה הדרגתית של התצוגה לפני כיבוי מסכים עם תקופת חסד הניתנת להגדרה"
"Gradually fade the screen before turning off monitors with a configurable grace period": "הפעל/י דהייה הדרגתית של התצוגה לפני כיבוי המסכים עם תקופת חסד הניתנת להגדרה"
},
"Graph Time Range": {
"Graph Time Range": "טווח זמן לגרף"
@@ -1800,7 +1839,7 @@
"Group": "קבוצה"
},
"Group Workspace Apps": {
"Group Workspace Apps": "קיבוץ יישומי שולחן עבודה"
"Group Workspace Apps": "קיבוץ האפליקציות של סביבת העבודה"
},
"Group by App": {
"Group by App": "קבץ/י לפי אפליקציה"
@@ -1880,6 +1919,9 @@
"History Settings": {
"History Settings": "הגדרות היסטוריה"
},
"History cleared. %1 pinned entries kept.": {
"History cleared. %1 pinned entries kept.": ""
},
"Hold Duration": {
"Hold Duration": "משך הלחיצה"
},
@@ -1994,6 +2036,9 @@
"Install plugins from the DMS plugin registry": {
"Install plugins from the DMS plugin registry": "התקן/י תוספים ממאגר התוספים של DMS"
},
"Intelligent Auto-hide": {
"Intelligent Auto-hide": ""
},
"Interface:": {
"Interface:": "ממשק:"
},
@@ -2021,6 +2066,166 @@
"Jobs: ": {
"Jobs: ": "עבודות: "
},
"KDE Connect SMS action": {
"Opening SMS": "",
"Opening SMS app": ""
},
"KDE Connect SMS dialog title": {
"Send SMS": ""
},
"KDE Connect SMS message input placeholder": {
"Message": ""
},
"KDE Connect SMS phone input placeholder": {
"Phone number": ""
},
"KDE Connect SMS send button": {
"Send": ""
},
"KDE Connect SMS tooltip": {
"SMS": ""
},
"KDE Connect accept pairing button": {
"Accept": ""
},
"KDE Connect browse action": {
"Opening file browser": "",
"Opening files": ""
},
"KDE Connect browse tooltip": {
"Browse Files": ""
},
"KDE Connect clipboard action": {
"Clipboard sent": ""
},
"KDE Connect clipboard tooltip": {
"Send Clipboard": ""
},
"KDE Connect connected status": {
"Connected": ""
},
"KDE Connect daemon hint": {
"Start kdeconnectd to use this plugin": ""
},
"KDE Connect error": {
"Failed to accept pairing": "",
"Failed to browse device": "",
"Failed to launch SMS app": "",
"Failed to reject pairing": "",
"Failed to ring device": "",
"Failed to send clipboard": "",
"Failed to send ping": "",
"Failed to share": "",
"Pairing failed": "",
"Unpair failed": ""
},
"KDE Connect file share notification": {
"File received from": ""
},
"KDE Connect hint message": {
"Make sure KDE Connect is running on your other devices": ""
},
"KDE Connect no devices message": {
"No devices found": ""
},
"KDE Connect no devices status": {
"No devices": ""
},
"KDE Connect not paired status": {
"Not paired": ""
},
"KDE Connect offline status": {
"Offline": ""
},
"KDE Connect open SMS app button": {
"Open App": ""
},
"KDE Connect open app hint": {
"Open KDE Connect on your phone": ""
},
"KDE Connect pair button": {
"Pair": ""
},
"KDE Connect pairing action": {
"Device paired": "",
"Pairing request sent": ""
},
"KDE Connect pairing in progress status": {
"Pairing": ""
},
"KDE Connect pairing request notification": {
"Pairing request from": ""
},
"KDE Connect pairing requested status": {
"Pairing requested": ""
},
"KDE Connect pairing verification key label": {
"Verification": ""
},
"KDE Connect ping action": {
"Ping sent": "",
"Ping sent to": ""
},
"KDE Connect ping tooltip": {
"Ping": ""
},
"KDE Connect refresh button | KDE Connect refresh tooltip": {
"Refresh": ""
},
"KDE Connect reject pairing button": {
"Reject": ""
},
"KDE Connect request pairing button": {
"Request Pairing": ""
},
"KDE Connect ring action": {
"Ringing": ""
},
"KDE Connect ring tooltip": {
"Ring": ""
},
"KDE Connect service unavailable message": {
"KDE Connect unavailable": ""
},
"KDE Connect share URL button": {
"Share URL": ""
},
"KDE Connect share button | KDE Connect share dialog title | KDE Connect share tooltip": {
"Share": ""
},
"KDE Connect share input placeholder": {
"Enter URL or text to share": ""
},
"KDE Connect share success": {
"Shared": ""
},
"KDE Connect start daemon hint": {
"Start kdeconnectd to connect devices": ""
},
"KDE Connect status": {
"No devices connected": ""
},
"KDE Connect status multiple devices": {
"devices connected": ""
},
"KDE Connect status single device": {
"1 device connected": ""
},
"KDE Connect unavailable error title": {
"KDE Connect Not Available": ""
},
"KDE Connect unavailable status": {
"Unavailable": ""
},
"KDE Connect unknown device status | unknown author": {
"Unknown": ""
},
"KDE Connect unpair action": {
"Device unpaired": ""
},
"KDE Connect unpair tooltip": {
"Unpair": ""
},
"Keep Awake": {
"Keep Awake": "השאר/י ער"
},
@@ -2255,9 +2460,18 @@
"Maximum History": {
"Maximum History": "היסטוריה מקסימלית"
},
"Maximum Pinned Entries": {
"Maximum Pinned Entries": ""
},
"Maximum number of clipboard entries to keep": {
"Maximum number of clipboard entries to keep": "מספר מקסימלי של רשומות לוח ההעתקה לשמירה"
},
"Maximum number of entries that can be saved": {
"Maximum number of entries that can be saved": ""
},
"Maximum pinned entries reached": {
"Maximum pinned entries reached": ""
},
"Maximum size per clipboard entry": {
"Maximum size per clipboard entry": "גודל מקסימלי לרשומת לוח ההעתקה"
},
@@ -2549,6 +2763,12 @@
"No printers found": {
"No printers found": "לא נמצאו מדפסות"
},
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No saved clipboard entries": {
"No saved clipboard entries": ""
},
"No variants created. Click Add to create a new monitor widget.": {
"No variants created. Click Add to create a new monitor widget.": "לא נוצרו גרסאות. לחץ/י על הוספה כדי ליצור ווידג׳ט תצוגה חדש."
},
@@ -2624,6 +2844,9 @@
"OSD Position": {
"OSD Position": "מיקום OSD"
},
"Occupied Color": {
"Occupied Color": ""
},
"Off": {
"Off": "כבוי"
},
@@ -2771,6 +2994,9 @@
"Percentage": {
"Percentage": "אחוזים"
},
"Performance": {
"Performance": ""
},
"Permission denied to set profile image.": {
"Permission denied to set profile image.": "ההרשאה להגדרת תמונת הפרופיל נדחתה."
},
@@ -2870,6 +3096,9 @@
"Power Profile Degradation": {
"Power Profile Degradation": "ירידת ביצועים בפרופיל צריכת החשמל"
},
"Power off monitors on lock": {
"Power off monitors on lock": ""
},
"Power profile management available": {
"Power profile management available": "ניהול פרופיל חשמל זמין"
},
@@ -2939,6 +3168,9 @@
"Process Count": {
"Process Count": "מספר תהליכים"
},
"Processes": {
"Processes": ""
},
"Processing": {
"Processing": "מעבד"
},
@@ -3137,6 +3369,9 @@
"Saved Configurations": {
"Saved Configurations": "תצורות שמורות"
},
"Saved item deleted": {
"Saved item deleted": ""
},
"Scale": {
"Scale": "קנה מידה"
},
@@ -3158,11 +3393,14 @@
"Science": {
"Science": "מדע"
},
"Screen Sharing": {
"Screen Sharing": ""
},
"Screen sharing": {
"Screen sharing": "שיתוף מסך"
},
"Scroll Wheel": {
"Scroll Wheel": "גלגל גלילה"
"Scroll Wheel": "גלגל הגלילה"
},
"Scroll on widget changes media volume": {
"Scroll on widget changes media volume": "גלילה על הווידג׳ט משנה עוצמת מדיה"
@@ -3174,7 +3412,7 @@
"Scroll title if it doesn't fit in widget": "גלילה של הכותרת אם היא לא נכנסת במלואה בווידג׳ט"
},
"Scroll wheel behavior on media widget": {
"Scroll wheel behavior on media widget": "התנהגות גלגל גלילה על ווידג׳ט מדיה"
"Scroll wheel behavior on media widget": "התנהגות גלגל הגלילה על ווידג׳ט המדיה"
},
"Scrolling": {
"Scrolling": "גלילה"
@@ -3333,7 +3571,7 @@
"Show Disk": "הצג/י דיסק"
},
"Show Dock": {
"Show Dock": "הצג/י Dock"
"Show Dock": "הצג/י את הDock"
},
"Show Feels Like Temperature": {
"Show Feels Like Temperature": "הצג/י טמפרטורה מורגשת"
@@ -3384,7 +3622,7 @@
"Show Network Graph": "הצג/י גרף רשת"
},
"Show Occupied Workspaces Only": {
"Show Occupied Workspaces Only": "הצג/י רק סביבות עבודה שתפוסות"
"Show Occupied Workspaces Only": "הצג/י רק סביבות עבודה שאינן ריקות"
},
"Show Power Off": {
"Show Power Off": "הצג/י כיבוי"
@@ -3437,6 +3675,9 @@
"Show darkened overlay behind modal dialogs": {
"Show darkened overlay behind modal dialogs": "הצג/י שכבה כהה מאחורי חלוניות שיח"
},
"Show dock when floating windows don't overlap its area": {
"Show dock when floating windows don't overlap its area": ""
},
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": {
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": "הצג/י שכבת משגר בעת הקלדה בסקירה של Niri. השבת/י כדי להשתמש במשגר אחר."
},
@@ -3501,7 +3742,7 @@
"Show workspace name on horizontal bars, and first letter on vertical bars": "הצג/י את השם של סביבת העבודה על סרגלים אופקיים, ואות ראשונה על סרגלים אנכיים"
},
"Show workspaces of the currently focused monitor": {
"Show workspaces of the currently focused monitor": "הצג/י סביבות עבודה שפעילות על המסך הממוקד שכרגע ממוקד"
"Show workspaces of the currently focused monitor": "הצג/י סביבות עבודה שפעילות על המסך שכרגע ממוקד"
},
"Shows all running applications with focus indication": {
"Shows all running applications with focus indication": "מציג את כל האפליקציות הפעילות עם סימון למיקוד"
@@ -3657,7 +3898,7 @@
"System": "מערכת"
},
"System App Theming": {
"System App Theming": "ערכת נושא ליישומי מערכת"
"System App Theming": "ערכת נושא לאפליקציות מערכת"
},
"System Monitor Unavailable": {
"System Monitor Unavailable": "מנטר המערכת אינו זמין"
@@ -3752,9 +3993,15 @@
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": {
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "ווידג׳ט זה מונע מהGPU לעבור למצב כבוי, דבר שעלול להשפיע משמעותית על חיי הסוללה במחשבים ניידים. לא מומלץ להשתמש בו במחשבים ניידים עם גרפיקה היברידית."
},
"This will delete all unpinned entries. %1 pinned entries will be kept.": {
"This will delete all unpinned entries. %1 pinned entries will be kept.": ""
},
"This will permanently delete all clipboard history.": {
"This will permanently delete all clipboard history.": "פעולה זו תמחק לצמיתות את כל היסטוריית לוח ההעתקה."
},
"This will permanently remove this saved clipboard item. This action cannot be undone.": {
"This will permanently remove this saved clipboard item. This action cannot be undone.": ""
},
"Tiling": {
"Tiling": "ריצוף"
},
@@ -3854,6 +4101,9 @@
"Trigger Prefix": {
"Trigger Prefix": "קידומת מפעיל"
},
"Turn off all displays immediately when the lock screen activates": {
"Turn off all displays immediately when the lock screen activates": ""
},
"Turn off monitors after": {
"Turn off monitors after": "כבה/י את כל המסכים לאחר"
},
@@ -3920,6 +4170,9 @@
"Update Plugin": {
"Update Plugin": "עדכן/י תוסף"
},
"Uptime": {
"Uptime": ""
},
"Urgent Color": {
"Urgent Color": "צבע דחוף"
},
@@ -4303,6 +4556,18 @@
"dgop not available": {
"dgop not available": "dgop אינו זמין"
},
"dgop unavailable error message": {
"The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.": ""
},
"disk io header in system monitor": {
"Disk I/O": ""
},
"disk read label": {
"Read:": ""
},
"disk write label": {
"Write:": ""
},
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": {
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "dms/binds.kdl קיים אך אינו כלול בconfig.kdl. קיצורי מקלדת מותאמים אישית לא יעבדו עד שהבעיה תתוקן."
},
@@ -4319,7 +4584,7 @@
"Dynamic colors from wallpaper": "צבעים דינמיים מתמונת הרקע"
},
"dynamic theme description": {
"Material colors generated from wallpaper": "צבעי Material שנוצרו מטפט"
"Material colors generated from wallpaper": "צבעי Material שנוצרו מהרקע"
},
"dynamic theme name": {
"Dynamic": "דינמי"
@@ -4336,18 +4601,33 @@
"empty plugin list": {
"No plugins found": "לא נמצאו תוספים"
},
"empty state in disk mounts list": {
"No mount points found": ""
},
"empty state in gpu list": {
"No GPUs detected": ""
},
"empty state in process list": {
"No matching processes": ""
},
"empty theme list": {
"No themes found": "לא נמצאו ערכות נושא"
},
"events": {
"events": "אירועים"
},
"fallback gpu name": {
"Unknown GPU": ""
},
"files": {
"files": "קבצים"
},
"generic theme description": {
"Material Design inspired color themes": "ערכות צבעים בהשראת Material Design"
},
"gpu section header in system monitor": {
"GPU Monitoring": ""
},
"greeter back button": {
"Back": "חזרה"
},
@@ -4404,7 +4684,7 @@
},
"greeter feature card description": {
"Background app icons": "סמלי אפליקציות ברקע",
"Colors from wallpaper": "צבעים מטפט",
"Colors from wallpaper": "צבעים מתמונת רקע",
"Community themes": "ערכות נושא קהילתיות",
"Extensible architecture": "ארכיטקטורה ניתנת להרחבה",
"GTK, Qt, IDEs, more": "GTK, Qt, סביבות פיתוח, ועוד",
@@ -4427,7 +4707,7 @@
"Plugins": "תוספים"
},
"greeter feature card title | greeter settings link": {
"DankBar": "DankBar"
"DankBar": "Dank Bar"
},
"greeter feature card title | lock screen notifications settings card": {
"Lock Screen": "מסך הנעילה"
@@ -4526,7 +4806,7 @@
"Lock Screen": "מסך הנעילה"
},
"loginctl not available - lock integration requires DMS socket connection": {
"loginctl not available - lock integration requires DMS socket connection": "loginctl אינו זמין, שילוב הנעילה דורש חיבור socket לDMS"
"loginctl not available - lock integration requires DMS socket connection": "loginctl אינו זמין, אינטגרציה של הנעילה דורשת חיבור socket לDMS"
},
"matugen error": {
"matugen not found - install matugen package for dynamic theming": "matugen לא נמצא - התקן/י את החבילה של matugen כדי לאפשר עיצוב דינמי"
@@ -4540,6 +4820,9 @@
"minutes": {
"minutes": "דקות"
},
"mount points header in system monitor": {
"Mount Points": ""
},
"ms": {
"ms": "מילישניות"
},
@@ -4614,6 +4897,15 @@
"plugin search placeholder": {
"Search plugins...": "חפש/י תוספים..."
},
"process count label in footer": {
"Processes:": ""
},
"process detail label": {
"Full Command:": ""
},
"process search placeholder": {
"Search processes...": ""
},
"profile image file browser title": {
"Select Profile Image": "בחר/י תמונת פרופיל"
},
@@ -4639,12 +4931,25 @@
"shadow intensity slider": {
"Intensity": "עוצמה"
},
"short for processes": {
"procs": ""
},
"source code link": {
"source": "קוד מקור"
},
"sysmon window title": {
"System Monitor": "מנטר המערכת"
},
"system info header in system monitor": {
"System Information": ""
},
"system info label": {
"Architecture": "",
"Distribution": "",
"Hostname": "",
"Kernel": "",
"Load Average": ""
},
"theme browser description": {
"Install color themes from the DMS theme registry": "התקן/י ערכות צבעים ממאגר ערכות הנושא של DMS"
},
@@ -4673,7 +4978,10 @@
"Unknown": "לא ידוע"
},
"update dms for NM integration.": {
"update dms for NM integration.": "עדכן/י את dms עבור שילוב עם NM."
"update dms for NM integration.": "עדכן/י את DMS כדי לאפשר אינטגרציה עם NM."
},
"uptime label in footer": {
"Uptime:": ""
},
"version requirement": {
"Requires %1": "גרסה %1 נדרשת"

View File

@@ -251,6 +251,9 @@
"Always Show Percentage": {
"Always Show Percentage": "Mindig mutassa a százalékot"
},
"Always hide the dock and reveal it when hovering near the dock area": {
"Always hide the dock and reveal it when hovering near the dock area": ""
},
"Always on icons": {
"Always on icons": "Mindig látható ikonok"
},
@@ -707,6 +710,9 @@
"Clear All Jobs": {
"Clear All Jobs": "Összes feladat törlése"
},
"Clear History?": {
"Clear History?": ""
},
"Clear all history when server starts": {
"Clear all history when server starts": "Minden előzmény törlése a szerver indításakor"
},
@@ -917,6 +923,12 @@
"Copy": {
"Copy": "Másolás"
},
"Copy Full Command": {
"Copy Full Command": ""
},
"Copy Name": {
"Copy Name": ""
},
"Copy PID": {
"Copy PID": "PID másolása"
},
@@ -1124,6 +1136,9 @@
"Delete Printer": {
"Delete Printer": "Nyomtató törlése"
},
"Delete Saved Item?": {
"Delete Saved Item?": ""
},
"Delete VPN": {
"Delete VPN": "VPN törlése"
},
@@ -1208,6 +1223,9 @@
"Disk Usage": {
"Disk Usage": "Lemezhasználat"
},
"Disks": {
"Disks": ""
},
"Dismiss": {
"Dismiss": "Bezárás"
},
@@ -1442,6 +1460,12 @@
"Enterprise": {
"Enterprise": "Vállalati"
},
"Entry pinned": {
"Entry pinned": ""
},
"Entry unpinned": {
"Entry unpinned": ""
},
"Error": {
"Error": "Hiba"
},
@@ -1484,6 +1508,9 @@
"Failed to cancel selected job": {
"Failed to cancel selected job": "Nem sikerült a kiválasztott feladatot törölni"
},
"Failed to check pin limit": {
"Failed to check pin limit": ""
},
"Failed to connect VPN": {
"Failed to connect VPN": "Nem sikerült csatlakozni a VPN-hez"
},
@@ -1559,6 +1586,9 @@
"Failed to pause printer": {
"Failed to pause printer": "Nem sikerült a nyomtatót szüneteltetetni"
},
"Failed to pin entry": {
"Failed to pin entry": ""
},
"Failed to print test page": {
"Failed to print test page": "Nem sikerült kinyomtatni a tesztoldalt"
},
@@ -1604,6 +1634,9 @@
"Failed to start connection to %1": {
"Failed to start connection to %1": "Nem sikerült elindítani a csatlakozást ehhez: %1"
},
"Failed to unpin entry": {
"Failed to unpin entry": ""
},
"Failed to update VPN": {
"Failed to update VPN": "Nem sikerült frissíteni a VPN-t"
},
@@ -1659,7 +1692,7 @@
"Fix Now": "Javítás most"
},
"Fixing...": {
"Fixing...": "Javítás..."
"Fixing...": "Javítás"
},
"Flags": {
"Flags": "Jelzők"
@@ -1709,6 +1742,9 @@
"Force HDR": {
"Force HDR": "HDR kényszerítése"
},
"Force Kill (SIGKILL)": {
"Force Kill (SIGKILL)": ""
},
"Force Kill Process": {
"Force Kill Process": "Folyamat kényszerített leállítása"
},
@@ -1763,6 +1799,9 @@
"Gamma control not available. Requires DMS API v6+.": {
"Gamma control not available. Requires DMS API v6+.": "Gamma vezérlés nem érhető el. DMS API v6+ szükséges."
},
"Generic device name | Generic device name fallback": {
"device": ""
},
"GitHub": {
"GitHub": "GitHub"
},
@@ -1880,6 +1919,9 @@
"History Settings": {
"History Settings": "Előzménybeállítások"
},
"History cleared. %1 pinned entries kept.": {
"History cleared. %1 pinned entries kept.": ""
},
"Hold Duration": {
"Hold Duration": "Nyomva tartás időtartama"
},
@@ -1994,6 +2036,9 @@
"Install plugins from the DMS plugin registry": {
"Install plugins from the DMS plugin registry": "Bővítmények telepítése a DMS bővítményregisztrációból"
},
"Intelligent Auto-hide": {
"Intelligent Auto-hide": ""
},
"Interface:": {
"Interface:": "Interfész:"
},
@@ -2021,6 +2066,166 @@
"Jobs: ": {
"Jobs: ": "Munkák: "
},
"KDE Connect SMS action": {
"Opening SMS": "",
"Opening SMS app": ""
},
"KDE Connect SMS dialog title": {
"Send SMS": ""
},
"KDE Connect SMS message input placeholder": {
"Message": ""
},
"KDE Connect SMS phone input placeholder": {
"Phone number": ""
},
"KDE Connect SMS send button": {
"Send": ""
},
"KDE Connect SMS tooltip": {
"SMS": ""
},
"KDE Connect accept pairing button": {
"Accept": ""
},
"KDE Connect browse action": {
"Opening file browser": "",
"Opening files": ""
},
"KDE Connect browse tooltip": {
"Browse Files": ""
},
"KDE Connect clipboard action": {
"Clipboard sent": ""
},
"KDE Connect clipboard tooltip": {
"Send Clipboard": ""
},
"KDE Connect connected status": {
"Connected": ""
},
"KDE Connect daemon hint": {
"Start kdeconnectd to use this plugin": ""
},
"KDE Connect error": {
"Failed to accept pairing": "",
"Failed to browse device": "",
"Failed to launch SMS app": "",
"Failed to reject pairing": "",
"Failed to ring device": "",
"Failed to send clipboard": "",
"Failed to send ping": "",
"Failed to share": "",
"Pairing failed": "",
"Unpair failed": ""
},
"KDE Connect file share notification": {
"File received from": ""
},
"KDE Connect hint message": {
"Make sure KDE Connect is running on your other devices": ""
},
"KDE Connect no devices message": {
"No devices found": ""
},
"KDE Connect no devices status": {
"No devices": ""
},
"KDE Connect not paired status": {
"Not paired": ""
},
"KDE Connect offline status": {
"Offline": ""
},
"KDE Connect open SMS app button": {
"Open App": ""
},
"KDE Connect open app hint": {
"Open KDE Connect on your phone": ""
},
"KDE Connect pair button": {
"Pair": ""
},
"KDE Connect pairing action": {
"Device paired": "",
"Pairing request sent": ""
},
"KDE Connect pairing in progress status": {
"Pairing": ""
},
"KDE Connect pairing request notification": {
"Pairing request from": ""
},
"KDE Connect pairing requested status": {
"Pairing requested": ""
},
"KDE Connect pairing verification key label": {
"Verification": ""
},
"KDE Connect ping action": {
"Ping sent": "",
"Ping sent to": ""
},
"KDE Connect ping tooltip": {
"Ping": ""
},
"KDE Connect refresh button | KDE Connect refresh tooltip": {
"Refresh": ""
},
"KDE Connect reject pairing button": {
"Reject": ""
},
"KDE Connect request pairing button": {
"Request Pairing": ""
},
"KDE Connect ring action": {
"Ringing": ""
},
"KDE Connect ring tooltip": {
"Ring": ""
},
"KDE Connect service unavailable message": {
"KDE Connect unavailable": ""
},
"KDE Connect share URL button": {
"Share URL": ""
},
"KDE Connect share button | KDE Connect share dialog title | KDE Connect share tooltip": {
"Share": ""
},
"KDE Connect share input placeholder": {
"Enter URL or text to share": ""
},
"KDE Connect share success": {
"Shared": ""
},
"KDE Connect start daemon hint": {
"Start kdeconnectd to connect devices": ""
},
"KDE Connect status": {
"No devices connected": ""
},
"KDE Connect status multiple devices": {
"devices connected": ""
},
"KDE Connect status single device": {
"1 device connected": ""
},
"KDE Connect unavailable error title": {
"KDE Connect Not Available": ""
},
"KDE Connect unavailable status": {
"Unavailable": ""
},
"KDE Connect unknown device status | unknown author": {
"Unknown": ""
},
"KDE Connect unpair action": {
"Device unpaired": ""
},
"KDE Connect unpair tooltip": {
"Unpair": ""
},
"Keep Awake": {
"Keep Awake": "Ébren tartás"
},
@@ -2255,9 +2460,18 @@
"Maximum History": {
"Maximum History": "Maximális előzmény"
},
"Maximum Pinned Entries": {
"Maximum Pinned Entries": ""
},
"Maximum number of clipboard entries to keep": {
"Maximum number of clipboard entries to keep": "Megtartandó vágólap-bejegyzések maximális száma"
},
"Maximum number of entries that can be saved": {
"Maximum number of entries that can be saved": ""
},
"Maximum pinned entries reached": {
"Maximum pinned entries reached": ""
},
"Maximum size per clipboard entry": {
"Maximum size per clipboard entry": "Maximális méret vágólap-bejegyzésenként"
},
@@ -2439,7 +2653,7 @@
"New York, NY": "New York, NY"
},
"New group name...": {
"New group name...": "Új csoportnév..."
"New group name...": "Új csoportnév"
},
"Next Transition": {
"Next Transition": "Következő átmenet"
@@ -2549,6 +2763,12 @@
"No printers found": {
"No printers found": "Nem található nyomtató"
},
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No saved clipboard entries": {
"No saved clipboard entries": ""
},
"No variants created. Click Add to create a new monitor widget.": {
"No variants created. Click Add to create a new monitor widget.": "Nincsenek létrehozott variánsok. Kattints a Hozzáadás gombra új monitor widget létrehozásához."
},
@@ -2624,6 +2844,9 @@
"OSD Position": {
"OSD Position": "OSD pozíció"
},
"Occupied Color": {
"Occupied Color": ""
},
"Off": {
"Off": "Kikapcsolva"
},
@@ -2771,6 +2994,9 @@
"Percentage": {
"Percentage": "Százalék"
},
"Performance": {
"Performance": ""
},
"Permission denied to set profile image.": {
"Permission denied to set profile image.": "Engedély megtagadva a profilkép beállításához."
},
@@ -2870,6 +3096,9 @@
"Power Profile Degradation": {
"Power Profile Degradation": "Energiaprofil romlása"
},
"Power off monitors on lock": {
"Power off monitors on lock": ""
},
"Power profile management available": {
"Power profile management available": "Energia profil kezelés elérhető"
},
@@ -2939,6 +3168,9 @@
"Process Count": {
"Process Count": "Folyamatszám"
},
"Processes": {
"Processes": ""
},
"Processing": {
"Processing": "Feldolgozás"
},
@@ -3137,6 +3369,9 @@
"Saved Configurations": {
"Saved Configurations": "Mentett konfigurációk"
},
"Saved item deleted": {
"Saved item deleted": ""
},
"Scale": {
"Scale": "Skála"
},
@@ -3158,6 +3393,9 @@
"Science": {
"Science": "Tudomány"
},
"Screen Sharing": {
"Screen Sharing": ""
},
"Screen sharing": {
"Screen sharing": "Képernyő megosztás"
},
@@ -3437,6 +3675,9 @@
"Show darkened overlay behind modal dialogs": {
"Show darkened overlay behind modal dialogs": "Sötétített átfedés megjelenítése a modális párbeszédablakok mögött"
},
"Show dock when floating windows don't overlap its area": {
"Show dock when floating windows don't overlap its area": ""
},
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": {
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": "Indító átfedés megjelenítése, amikor gépelsz a Niri-áttekintésben. Kapcsold ki, ha másik indítót használsz."
},
@@ -3752,9 +3993,15 @@
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": {
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "Ez a widget megakadályozza a GPU kikapcsolt állapotát, ami jelentősen befolyásolhatja a laptopok akkumulátor élettartamát. Nem ajánlott hibrid grafikus kártyával rendelkező laptopokon használni."
},
"This will delete all unpinned entries. %1 pinned entries will be kept.": {
"This will delete all unpinned entries. %1 pinned entries will be kept.": ""
},
"This will permanently delete all clipboard history.": {
"This will permanently delete all clipboard history.": "Ez véglegesen törölni fogja a vágólapelőzményeket."
},
"This will permanently remove this saved clipboard item. This action cannot be undone.": {
"This will permanently remove this saved clipboard item. This action cannot be undone.": ""
},
"Tiling": {
"Tiling": "Csempézés"
},
@@ -3854,6 +4101,9 @@
"Trigger Prefix": {
"Trigger Prefix": "Indító előtag"
},
"Turn off all displays immediately when the lock screen activates": {
"Turn off all displays immediately when the lock screen activates": ""
},
"Turn off monitors after": {
"Turn off monitors after": "Monitorok kikapcsolása ennyi idő után:"
},
@@ -3920,6 +4170,9 @@
"Update Plugin": {
"Update Plugin": "Bővítmény frissítése"
},
"Uptime": {
"Uptime": ""
},
"Urgent Color": {
"Urgent Color": "Sürgős szín"
},
@@ -4303,6 +4556,18 @@
"dgop not available": {
"dgop not available": "dgop nem elérhető"
},
"dgop unavailable error message": {
"The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.": ""
},
"disk io header in system monitor": {
"Disk I/O": ""
},
"disk read label": {
"Read:": ""
},
"disk write label": {
"Write:": ""
},
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": {
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "A dms/binds.kdl létezik, de nincs benne a config.kdl-ben. Az egyéni gyorsbillentyűk nem fognak működni, amíg ez nincs javítva."
},
@@ -4336,18 +4601,33 @@
"empty plugin list": {
"No plugins found": "Nem található bővítmény"
},
"empty state in disk mounts list": {
"No mount points found": ""
},
"empty state in gpu list": {
"No GPUs detected": ""
},
"empty state in process list": {
"No matching processes": ""
},
"empty theme list": {
"No themes found": "Nem található téma"
},
"events": {
"events": "események"
},
"fallback gpu name": {
"Unknown GPU": ""
},
"files": {
"files": "fájlok"
},
"generic theme description": {
"Material Design inspired color themes": "Material Design ihlette színtémák"
},
"gpu section header in system monitor": {
"GPU Monitoring": ""
},
"greeter back button": {
"Back": "Vissza"
},
@@ -4382,7 +4662,7 @@
"%1 issue(s) found": "%1 hiba található"
},
"greeter doctor page loading text": {
"Analyzing configuration...": "Konfiguráció elemzése..."
"Analyzing configuration...": "Konfiguráció elemzése"
},
"greeter doctor page status card": {
"Errors": "Hibák",
@@ -4540,6 +4820,9 @@
"minutes": {
"minutes": "percek"
},
"mount points header in system monitor": {
"Mount Points": ""
},
"ms": {
"ms": "ms"
},
@@ -4614,6 +4897,15 @@
"plugin search placeholder": {
"Search plugins...": "Bővítmények keresése…"
},
"process count label in footer": {
"Processes:": ""
},
"process detail label": {
"Full Command:": ""
},
"process search placeholder": {
"Search processes...": ""
},
"profile image file browser title": {
"Select Profile Image": "Profilkép kiválasztása"
},
@@ -4639,12 +4931,25 @@
"shadow intensity slider": {
"Intensity": "Intenzitás"
},
"short for processes": {
"procs": ""
},
"source code link": {
"source": "forrás"
},
"sysmon window title": {
"System Monitor": "Rendszerfigyelő"
},
"system info header in system monitor": {
"System Information": ""
},
"system info label": {
"Architecture": "",
"Distribution": "",
"Hostname": "",
"Kernel": "",
"Load Average": ""
},
"theme browser description": {
"Install color themes from the DMS theme registry": "Színtémák telepítése a DMS téma-regiszterből"
},
@@ -4675,6 +4980,9 @@
"update dms for NM integration.": {
"update dms for NM integration.": "dms frissítése a NM integrációhoz."
},
"uptime label in footer": {
"Uptime:": ""
},
"version requirement": {
"Requires %1": "%1 szükséges"
},

View File

@@ -251,6 +251,9 @@
"Always Show Percentage": {
"Always Show Percentage": "Mostra sempre percentuale"
},
"Always hide the dock and reveal it when hovering near the dock area": {
"Always hide the dock and reveal it when hovering near the dock area": ""
},
"Always on icons": {
"Always on icons": "Icone sempre attive"
},
@@ -707,6 +710,9 @@
"Clear All Jobs": {
"Clear All Jobs": "Elimina Tutte le Stampe"
},
"Clear History?": {
"Clear History?": ""
},
"Clear all history when server starts": {
"Clear all history when server starts": "Cancella tutta la cronologia all'avvio del server"
},
@@ -917,6 +923,12 @@
"Copy": {
"Copy": "Copia"
},
"Copy Full Command": {
"Copy Full Command": ""
},
"Copy Name": {
"Copy Name": ""
},
"Copy PID": {
"Copy PID": "Copia PID"
},
@@ -1124,6 +1136,9 @@
"Delete Printer": {
"Delete Printer": "Elimina Stampante"
},
"Delete Saved Item?": {
"Delete Saved Item?": ""
},
"Delete VPN": {
"Delete VPN": "Elimina VPN"
},
@@ -1208,6 +1223,9 @@
"Disk Usage": {
"Disk Usage": "Uso Disco"
},
"Disks": {
"Disks": ""
},
"Dismiss": {
"Dismiss": "Ignora"
},
@@ -1442,6 +1460,12 @@
"Enterprise": {
"Enterprise": "Enterprise"
},
"Entry pinned": {
"Entry pinned": ""
},
"Entry unpinned": {
"Entry unpinned": ""
},
"Error": {
"Error": "Errore"
},
@@ -1484,6 +1508,9 @@
"Failed to cancel selected job": {
"Failed to cancel selected job": "Impossibile cancellare la stampa selezionata"
},
"Failed to check pin limit": {
"Failed to check pin limit": ""
},
"Failed to connect VPN": {
"Failed to connect VPN": "Impossibile connettersi alla VPN"
},
@@ -1559,6 +1586,9 @@
"Failed to pause printer": {
"Failed to pause printer": "Impossibile mettere in pausa la stampante"
},
"Failed to pin entry": {
"Failed to pin entry": ""
},
"Failed to print test page": {
"Failed to print test page": "Impossibile stampare la pagina di prova"
},
@@ -1604,6 +1634,9 @@
"Failed to start connection to %1": {
"Failed to start connection to %1": "Impossibile avviare la connessione a %1"
},
"Failed to unpin entry": {
"Failed to unpin entry": ""
},
"Failed to update VPN": {
"Failed to update VPN": "Impossibile aggiornare la VPN"
},
@@ -1709,6 +1742,9 @@
"Force HDR": {
"Force HDR": "Forza HDR"
},
"Force Kill (SIGKILL)": {
"Force Kill (SIGKILL)": ""
},
"Force Kill Process": {
"Force Kill Process": "Forza Arresto Processo"
},
@@ -1763,6 +1799,9 @@
"Gamma control not available. Requires DMS API v6+.": {
"Gamma control not available. Requires DMS API v6+.": "Controllo gamma non disponibile. Richiede API DMS v6+."
},
"Generic device name | Generic device name fallback": {
"device": ""
},
"GitHub": {
"GitHub": "GitHub"
},
@@ -1880,6 +1919,9 @@
"History Settings": {
"History Settings": "Impostazioni Cronologia"
},
"History cleared. %1 pinned entries kept.": {
"History cleared. %1 pinned entries kept.": ""
},
"Hold Duration": {
"Hold Duration": "Durata della pressione"
},
@@ -1994,6 +2036,9 @@
"Install plugins from the DMS plugin registry": {
"Install plugins from the DMS plugin registry": "Installa plugin dal registro dei plugin DMS"
},
"Intelligent Auto-hide": {
"Intelligent Auto-hide": ""
},
"Interface:": {
"Interface:": "Interfaccia"
},
@@ -2021,6 +2066,166 @@
"Jobs: ": {
"Jobs: ": "Stampe: "
},
"KDE Connect SMS action": {
"Opening SMS": "",
"Opening SMS app": ""
},
"KDE Connect SMS dialog title": {
"Send SMS": ""
},
"KDE Connect SMS message input placeholder": {
"Message": ""
},
"KDE Connect SMS phone input placeholder": {
"Phone number": ""
},
"KDE Connect SMS send button": {
"Send": ""
},
"KDE Connect SMS tooltip": {
"SMS": ""
},
"KDE Connect accept pairing button": {
"Accept": ""
},
"KDE Connect browse action": {
"Opening file browser": "",
"Opening files": ""
},
"KDE Connect browse tooltip": {
"Browse Files": ""
},
"KDE Connect clipboard action": {
"Clipboard sent": ""
},
"KDE Connect clipboard tooltip": {
"Send Clipboard": ""
},
"KDE Connect connected status": {
"Connected": ""
},
"KDE Connect daemon hint": {
"Start kdeconnectd to use this plugin": ""
},
"KDE Connect error": {
"Failed to accept pairing": "",
"Failed to browse device": "",
"Failed to launch SMS app": "",
"Failed to reject pairing": "",
"Failed to ring device": "",
"Failed to send clipboard": "",
"Failed to send ping": "",
"Failed to share": "",
"Pairing failed": "",
"Unpair failed": ""
},
"KDE Connect file share notification": {
"File received from": ""
},
"KDE Connect hint message": {
"Make sure KDE Connect is running on your other devices": ""
},
"KDE Connect no devices message": {
"No devices found": ""
},
"KDE Connect no devices status": {
"No devices": ""
},
"KDE Connect not paired status": {
"Not paired": ""
},
"KDE Connect offline status": {
"Offline": ""
},
"KDE Connect open SMS app button": {
"Open App": ""
},
"KDE Connect open app hint": {
"Open KDE Connect on your phone": ""
},
"KDE Connect pair button": {
"Pair": ""
},
"KDE Connect pairing action": {
"Device paired": "",
"Pairing request sent": ""
},
"KDE Connect pairing in progress status": {
"Pairing": ""
},
"KDE Connect pairing request notification": {
"Pairing request from": ""
},
"KDE Connect pairing requested status": {
"Pairing requested": ""
},
"KDE Connect pairing verification key label": {
"Verification": ""
},
"KDE Connect ping action": {
"Ping sent": "",
"Ping sent to": ""
},
"KDE Connect ping tooltip": {
"Ping": ""
},
"KDE Connect refresh button | KDE Connect refresh tooltip": {
"Refresh": ""
},
"KDE Connect reject pairing button": {
"Reject": ""
},
"KDE Connect request pairing button": {
"Request Pairing": ""
},
"KDE Connect ring action": {
"Ringing": ""
},
"KDE Connect ring tooltip": {
"Ring": ""
},
"KDE Connect service unavailable message": {
"KDE Connect unavailable": ""
},
"KDE Connect share URL button": {
"Share URL": ""
},
"KDE Connect share button | KDE Connect share dialog title | KDE Connect share tooltip": {
"Share": ""
},
"KDE Connect share input placeholder": {
"Enter URL or text to share": ""
},
"KDE Connect share success": {
"Shared": ""
},
"KDE Connect start daemon hint": {
"Start kdeconnectd to connect devices": ""
},
"KDE Connect status": {
"No devices connected": ""
},
"KDE Connect status multiple devices": {
"devices connected": ""
},
"KDE Connect status single device": {
"1 device connected": ""
},
"KDE Connect unavailable error title": {
"KDE Connect Not Available": ""
},
"KDE Connect unavailable status": {
"Unavailable": ""
},
"KDE Connect unknown device status | unknown author": {
"Unknown": ""
},
"KDE Connect unpair action": {
"Device unpaired": ""
},
"KDE Connect unpair tooltip": {
"Unpair": ""
},
"Keep Awake": {
"Keep Awake": "Mantieni Attivo"
},
@@ -2255,9 +2460,18 @@
"Maximum History": {
"Maximum History": "Cronologia Massima"
},
"Maximum Pinned Entries": {
"Maximum Pinned Entries": ""
},
"Maximum number of clipboard entries to keep": {
"Maximum number of clipboard entries to keep": "Numero massimo di voci degli appunti da conservare"
},
"Maximum number of entries that can be saved": {
"Maximum number of entries that can be saved": ""
},
"Maximum pinned entries reached": {
"Maximum pinned entries reached": ""
},
"Maximum size per clipboard entry": {
"Maximum size per clipboard entry": "Dimensione massima per ogni voce degli appunti"
},
@@ -2549,6 +2763,12 @@
"No printers found": {
"No printers found": "Nessuna stampante trovata"
},
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No saved clipboard entries": {
"No saved clipboard entries": ""
},
"No variants created. Click Add to create a new monitor widget.": {
"No variants created. Click Add to create a new monitor widget.": "Nessuna variante creata. Fai clic su Aggiungi per creare un nuovo widget monitor."
},
@@ -2624,6 +2844,9 @@
"OSD Position": {
"OSD Position": "Posizione OSD"
},
"Occupied Color": {
"Occupied Color": ""
},
"Off": {
"Off": "Disattivato"
},
@@ -2771,6 +2994,9 @@
"Percentage": {
"Percentage": "Percentuale"
},
"Performance": {
"Performance": ""
},
"Permission denied to set profile image.": {
"Permission denied to set profile image.": "Impossibile impostare immagine profilo: Permesso negato."
},
@@ -2870,6 +3096,9 @@
"Power Profile Degradation": {
"Power Profile Degradation": "Riduzione Prestazioni Energetiche"
},
"Power off monitors on lock": {
"Power off monitors on lock": ""
},
"Power profile management available": {
"Power profile management available": "Gestione dei profili energetici disponibile"
},
@@ -2939,6 +3168,9 @@
"Process Count": {
"Process Count": "Numero di Processi"
},
"Processes": {
"Processes": ""
},
"Processing": {
"Processing": "In Elaborazione"
},
@@ -3137,6 +3369,9 @@
"Saved Configurations": {
"Saved Configurations": "Configurazioni Salvate"
},
"Saved item deleted": {
"Saved item deleted": ""
},
"Scale": {
"Scale": "Scala"
},
@@ -3158,6 +3393,9 @@
"Science": {
"Science": "Scienza"
},
"Screen Sharing": {
"Screen Sharing": ""
},
"Screen sharing": {
"Screen sharing": "Condivisione schermo"
},
@@ -3437,6 +3675,9 @@
"Show darkened overlay behind modal dialogs": {
"Show darkened overlay behind modal dialogs": "Mostra la sovrapposizione oscurata dietro le finestre di dialogo modali"
},
"Show dock when floating windows don't overlap its area": {
"Show dock when floating windows don't overlap its area": ""
},
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": {
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": "Mostra la sovrapposizione del launcher durante la digitazione nella panoramica di Niri. Disabilita per usare un altro launcher."
},
@@ -3752,9 +3993,15 @@
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": {
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "Questo widget impedisce gli stati di spegnimento della GPU, che possono influire in modo significativo sulla durata della batteria sui laptop. Non è consigliabile utilizzarlo su laptop con grafica ibrida."
},
"This will delete all unpinned entries. %1 pinned entries will be kept.": {
"This will delete all unpinned entries. %1 pinned entries will be kept.": ""
},
"This will permanently delete all clipboard history.": {
"This will permanently delete all clipboard history.": "La cronologia degli appunti verrà cancellata definitivamente."
},
"This will permanently remove this saved clipboard item. This action cannot be undone.": {
"This will permanently remove this saved clipboard item. This action cannot be undone.": ""
},
"Tiling": {
"Tiling": "Tiling"
},
@@ -3854,6 +4101,9 @@
"Trigger Prefix": {
"Trigger Prefix": "Prefisso Attivatore"
},
"Turn off all displays immediately when the lock screen activates": {
"Turn off all displays immediately when the lock screen activates": ""
},
"Turn off monitors after": {
"Turn off monitors after": "Spegni monitor dopo"
},
@@ -3920,6 +4170,9 @@
"Update Plugin": {
"Update Plugin": "Aggiorna Plugin"
},
"Uptime": {
"Uptime": ""
},
"Urgent Color": {
"Urgent Color": "Colore Urgente"
},
@@ -4303,6 +4556,18 @@
"dgop not available": {
"dgop not available": "dgop non disponibile"
},
"dgop unavailable error message": {
"The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.": ""
},
"disk io header in system monitor": {
"Disk I/O": ""
},
"disk read label": {
"Read:": ""
},
"disk write label": {
"Write:": ""
},
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": {
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "dms/binds.kdl esiste ma non è incluso in config.kdl. Le scorciatoie personalizzate non funzioneranno finché questo non sarà risolto."
},
@@ -4336,18 +4601,33 @@
"empty plugin list": {
"No plugins found": "Nessun plugin trovato"
},
"empty state in disk mounts list": {
"No mount points found": ""
},
"empty state in gpu list": {
"No GPUs detected": ""
},
"empty state in process list": {
"No matching processes": ""
},
"empty theme list": {
"No themes found": "Nessun tema trovato"
},
"events": {
"events": "eventi"
},
"fallback gpu name": {
"Unknown GPU": ""
},
"files": {
"files": "file"
},
"generic theme description": {
"Material Design inspired color themes": "Temi colore ispirati al Material Design"
},
"gpu section header in system monitor": {
"GPU Monitoring": ""
},
"greeter back button": {
"Back": "Indietro"
},
@@ -4540,6 +4820,9 @@
"minutes": {
"minutes": "minuti"
},
"mount points header in system monitor": {
"Mount Points": ""
},
"ms": {
"ms": "ms"
},
@@ -4614,6 +4897,15 @@
"plugin search placeholder": {
"Search plugins...": "Cerca plugin..."
},
"process count label in footer": {
"Processes:": ""
},
"process detail label": {
"Full Command:": ""
},
"process search placeholder": {
"Search processes...": ""
},
"profile image file browser title": {
"Select Profile Image": "Seleziona Immagine Profilo"
},
@@ -4639,12 +4931,25 @@
"shadow intensity slider": {
"Intensity": "Intensità"
},
"short for processes": {
"procs": ""
},
"source code link": {
"source": "sorgente"
},
"sysmon window title": {
"System Monitor": "Monitor Sistema"
},
"system info header in system monitor": {
"System Information": ""
},
"system info label": {
"Architecture": "",
"Distribution": "",
"Hostname": "",
"Kernel": "",
"Load Average": ""
},
"theme browser description": {
"Install color themes from the DMS theme registry": "Installa temi colore dal registro temi DMS"
},
@@ -4675,6 +4980,9 @@
"update dms for NM integration.": {
"update dms for NM integration.": "aggiorna dms per l'integrazione NM."
},
"uptime label in footer": {
"Uptime:": ""
},
"version requirement": {
"Requires %1": "Richiede %1"
},

View File

@@ -251,6 +251,9 @@
"Always Show Percentage": {
"Always Show Percentage": ""
},
"Always hide the dock and reveal it when hovering near the dock area": {
"Always hide the dock and reveal it when hovering near the dock area": ""
},
"Always on icons": {
"Always on icons": "常時表示アイコン"
},
@@ -707,6 +710,9 @@
"Clear All Jobs": {
"Clear All Jobs": ""
},
"Clear History?": {
"Clear History?": ""
},
"Clear all history when server starts": {
"Clear all history when server starts": ""
},
@@ -917,6 +923,12 @@
"Copy": {
"Copy": ""
},
"Copy Full Command": {
"Copy Full Command": ""
},
"Copy Name": {
"Copy Name": ""
},
"Copy PID": {
"Copy PID": "PIDをコピー"
},
@@ -1124,6 +1136,9 @@
"Delete Printer": {
"Delete Printer": ""
},
"Delete Saved Item?": {
"Delete Saved Item?": ""
},
"Delete VPN": {
"Delete VPN": ""
},
@@ -1208,6 +1223,9 @@
"Disk Usage": {
"Disk Usage": "ディスク使用率"
},
"Disks": {
"Disks": ""
},
"Dismiss": {
"Dismiss": "解除"
},
@@ -1442,6 +1460,12 @@
"Enterprise": {
"Enterprise": ""
},
"Entry pinned": {
"Entry pinned": ""
},
"Entry unpinned": {
"Entry unpinned": ""
},
"Error": {
"Error": "エラー"
},
@@ -1484,6 +1508,9 @@
"Failed to cancel selected job": {
"Failed to cancel selected job": "選ばれたジョブの取り消しに失敗しました"
},
"Failed to check pin limit": {
"Failed to check pin limit": ""
},
"Failed to connect VPN": {
"Failed to connect VPN": "VPNへの接続が失敗しました"
},
@@ -1559,6 +1586,9 @@
"Failed to pause printer": {
"Failed to pause printer": "プリンターの一時中断に失敗しました"
},
"Failed to pin entry": {
"Failed to pin entry": ""
},
"Failed to print test page": {
"Failed to print test page": ""
},
@@ -1604,6 +1634,9 @@
"Failed to start connection to %1": {
"Failed to start connection to %1": ""
},
"Failed to unpin entry": {
"Failed to unpin entry": ""
},
"Failed to update VPN": {
"Failed to update VPN": ""
},
@@ -1709,6 +1742,9 @@
"Force HDR": {
"Force HDR": ""
},
"Force Kill (SIGKILL)": {
"Force Kill (SIGKILL)": ""
},
"Force Kill Process": {
"Force Kill Process": "プロセスを強制終了"
},
@@ -1763,6 +1799,9 @@
"Gamma control not available. Requires DMS API v6+.": {
"Gamma control not available. Requires DMS API v6+.": "ガンマ制御は使用できません。DMS API v6+ が必要です。"
},
"Generic device name | Generic device name fallback": {
"device": ""
},
"GitHub": {
"GitHub": ""
},
@@ -1880,6 +1919,9 @@
"History Settings": {
"History Settings": ""
},
"History cleared. %1 pinned entries kept.": {
"History cleared. %1 pinned entries kept.": ""
},
"Hold Duration": {
"Hold Duration": ""
},
@@ -1994,6 +2036,9 @@
"Install plugins from the DMS plugin registry": {
"Install plugins from the DMS plugin registry": "DMSプラグインレジストリからプラグインをインストールする"
},
"Intelligent Auto-hide": {
"Intelligent Auto-hide": ""
},
"Interface:": {
"Interface:": ""
},
@@ -2021,6 +2066,166 @@
"Jobs: ": {
"Jobs: ": "ジョブ: "
},
"KDE Connect SMS action": {
"Opening SMS": "",
"Opening SMS app": ""
},
"KDE Connect SMS dialog title": {
"Send SMS": ""
},
"KDE Connect SMS message input placeholder": {
"Message": ""
},
"KDE Connect SMS phone input placeholder": {
"Phone number": ""
},
"KDE Connect SMS send button": {
"Send": ""
},
"KDE Connect SMS tooltip": {
"SMS": ""
},
"KDE Connect accept pairing button": {
"Accept": ""
},
"KDE Connect browse action": {
"Opening file browser": "",
"Opening files": ""
},
"KDE Connect browse tooltip": {
"Browse Files": ""
},
"KDE Connect clipboard action": {
"Clipboard sent": ""
},
"KDE Connect clipboard tooltip": {
"Send Clipboard": ""
},
"KDE Connect connected status": {
"Connected": ""
},
"KDE Connect daemon hint": {
"Start kdeconnectd to use this plugin": ""
},
"KDE Connect error": {
"Failed to accept pairing": "",
"Failed to browse device": "",
"Failed to launch SMS app": "",
"Failed to reject pairing": "",
"Failed to ring device": "",
"Failed to send clipboard": "",
"Failed to send ping": "",
"Failed to share": "",
"Pairing failed": "",
"Unpair failed": ""
},
"KDE Connect file share notification": {
"File received from": ""
},
"KDE Connect hint message": {
"Make sure KDE Connect is running on your other devices": ""
},
"KDE Connect no devices message": {
"No devices found": ""
},
"KDE Connect no devices status": {
"No devices": ""
},
"KDE Connect not paired status": {
"Not paired": ""
},
"KDE Connect offline status": {
"Offline": ""
},
"KDE Connect open SMS app button": {
"Open App": ""
},
"KDE Connect open app hint": {
"Open KDE Connect on your phone": ""
},
"KDE Connect pair button": {
"Pair": ""
},
"KDE Connect pairing action": {
"Device paired": "",
"Pairing request sent": ""
},
"KDE Connect pairing in progress status": {
"Pairing": ""
},
"KDE Connect pairing request notification": {
"Pairing request from": ""
},
"KDE Connect pairing requested status": {
"Pairing requested": ""
},
"KDE Connect pairing verification key label": {
"Verification": ""
},
"KDE Connect ping action": {
"Ping sent": "",
"Ping sent to": ""
},
"KDE Connect ping tooltip": {
"Ping": ""
},
"KDE Connect refresh button | KDE Connect refresh tooltip": {
"Refresh": ""
},
"KDE Connect reject pairing button": {
"Reject": ""
},
"KDE Connect request pairing button": {
"Request Pairing": ""
},
"KDE Connect ring action": {
"Ringing": ""
},
"KDE Connect ring tooltip": {
"Ring": ""
},
"KDE Connect service unavailable message": {
"KDE Connect unavailable": ""
},
"KDE Connect share URL button": {
"Share URL": ""
},
"KDE Connect share button | KDE Connect share dialog title | KDE Connect share tooltip": {
"Share": ""
},
"KDE Connect share input placeholder": {
"Enter URL or text to share": ""
},
"KDE Connect share success": {
"Shared": ""
},
"KDE Connect start daemon hint": {
"Start kdeconnectd to connect devices": ""
},
"KDE Connect status": {
"No devices connected": ""
},
"KDE Connect status multiple devices": {
"devices connected": ""
},
"KDE Connect status single device": {
"1 device connected": ""
},
"KDE Connect unavailable error title": {
"KDE Connect Not Available": ""
},
"KDE Connect unavailable status": {
"Unavailable": ""
},
"KDE Connect unknown device status | unknown author": {
"Unknown": ""
},
"KDE Connect unpair action": {
"Device unpaired": ""
},
"KDE Connect unpair tooltip": {
"Unpair": ""
},
"Keep Awake": {
"Keep Awake": "活動状態を維持"
},
@@ -2255,9 +2460,18 @@
"Maximum History": {
"Maximum History": ""
},
"Maximum Pinned Entries": {
"Maximum Pinned Entries": ""
},
"Maximum number of clipboard entries to keep": {
"Maximum number of clipboard entries to keep": ""
},
"Maximum number of entries that can be saved": {
"Maximum number of entries that can be saved": ""
},
"Maximum pinned entries reached": {
"Maximum pinned entries reached": ""
},
"Maximum size per clipboard entry": {
"Maximum size per clipboard entry": ""
},
@@ -2549,6 +2763,12 @@
"No printers found": {
"No printers found": ""
},
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No saved clipboard entries": {
"No saved clipboard entries": ""
},
"No variants created. Click Add to create a new monitor widget.": {
"No variants created. Click Add to create a new monitor widget.": ""
},
@@ -2624,6 +2844,9 @@
"OSD Position": {
"OSD Position": "OSD位置"
},
"Occupied Color": {
"Occupied Color": ""
},
"Off": {
"Off": ""
},
@@ -2771,6 +2994,9 @@
"Percentage": {
"Percentage": "百分率"
},
"Performance": {
"Performance": ""
},
"Permission denied to set profile image.": {
"Permission denied to set profile image.": "プロフィール画像の設定権限が拒否されました。"
},
@@ -2870,6 +3096,9 @@
"Power Profile Degradation": {
"Power Profile Degradation": "電源プロファイルの劣化"
},
"Power off monitors on lock": {
"Power off monitors on lock": ""
},
"Power profile management available": {
"Power profile management available": ""
},
@@ -2939,6 +3168,9 @@
"Process Count": {
"Process Count": ""
},
"Processes": {
"Processes": ""
},
"Processing": {
"Processing": "進行中"
},
@@ -3137,6 +3369,9 @@
"Saved Configurations": {
"Saved Configurations": ""
},
"Saved item deleted": {
"Saved item deleted": ""
},
"Scale": {
"Scale": ""
},
@@ -3158,6 +3393,9 @@
"Science": {
"Science": "科学"
},
"Screen Sharing": {
"Screen Sharing": ""
},
"Screen sharing": {
"Screen sharing": "画面共有"
},
@@ -3437,6 +3675,9 @@
"Show darkened overlay behind modal dialogs": {
"Show darkened overlay behind modal dialogs": "モーダルダイアログの背後に暗いオーバーレイを表示"
},
"Show dock when floating windows don't overlap its area": {
"Show dock when floating windows don't overlap its area": ""
},
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": {
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": ""
},
@@ -3752,9 +3993,15 @@
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": {
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "このウィジェットはGPUの省電力状態を防ぎ、ートパソコンのバッテリー寿命に大きな影響を与える可能性があります。ハイブリッドグラフィックス搭載のートパソコンでの使用は推奨されません。"
},
"This will delete all unpinned entries. %1 pinned entries will be kept.": {
"This will delete all unpinned entries. %1 pinned entries will be kept.": ""
},
"This will permanently delete all clipboard history.": {
"This will permanently delete all clipboard history.": "これはすべてのクリップボード履歴を完全に削除します。"
},
"This will permanently remove this saved clipboard item. This action cannot be undone.": {
"This will permanently remove this saved clipboard item. This action cannot be undone.": ""
},
"Tiling": {
"Tiling": "タイリング"
},
@@ -3854,6 +4101,9 @@
"Trigger Prefix": {
"Trigger Prefix": ""
},
"Turn off all displays immediately when the lock screen activates": {
"Turn off all displays immediately when the lock screen activates": ""
},
"Turn off monitors after": {
"Turn off monitors after": "後にモニターの電源を切る"
},
@@ -3920,6 +4170,9 @@
"Update Plugin": {
"Update Plugin": "プラグインを更新"
},
"Uptime": {
"Uptime": ""
},
"Urgent Color": {
"Urgent Color": ""
},
@@ -4303,6 +4556,18 @@
"dgop not available": {
"dgop not available": ""
},
"dgop unavailable error message": {
"The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.": ""
},
"disk io header in system monitor": {
"Disk I/O": ""
},
"disk read label": {
"Read:": ""
},
"disk write label": {
"Write:": ""
},
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": {
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": ""
},
@@ -4336,18 +4601,33 @@
"empty plugin list": {
"No plugins found": ""
},
"empty state in disk mounts list": {
"No mount points found": ""
},
"empty state in gpu list": {
"No GPUs detected": ""
},
"empty state in process list": {
"No matching processes": ""
},
"empty theme list": {
"No themes found": ""
},
"events": {
"events": "イベント"
},
"fallback gpu name": {
"Unknown GPU": ""
},
"files": {
"files": ""
},
"generic theme description": {
"Material Design inspired color themes": ""
},
"gpu section header in system monitor": {
"GPU Monitoring": ""
},
"greeter back button": {
"Back": ""
},
@@ -4540,6 +4820,9 @@
"minutes": {
"minutes": ""
},
"mount points header in system monitor": {
"Mount Points": ""
},
"ms": {
"ms": ""
},
@@ -4614,6 +4897,15 @@
"plugin search placeholder": {
"Search plugins...": ""
},
"process count label in footer": {
"Processes:": ""
},
"process detail label": {
"Full Command:": ""
},
"process search placeholder": {
"Search processes...": ""
},
"profile image file browser title": {
"Select Profile Image": "プロファイル画像を選んでください"
},
@@ -4639,12 +4931,25 @@
"shadow intensity slider": {
"Intensity": ""
},
"short for processes": {
"procs": ""
},
"source code link": {
"source": ""
},
"sysmon window title": {
"System Monitor": "システムモニタ"
},
"system info header in system monitor": {
"System Information": ""
},
"system info label": {
"Architecture": "",
"Distribution": "",
"Hostname": "",
"Kernel": "",
"Load Average": ""
},
"theme browser description": {
"Install color themes from the DMS theme registry": ""
},
@@ -4675,6 +4980,9 @@
"update dms for NM integration.": {
"update dms for NM integration.": "NM統合のためにDMSを更新します。"
},
"uptime label in footer": {
"Uptime:": ""
},
"version requirement": {
"Requires %1": ""
},

View File

@@ -251,6 +251,9 @@
"Always Show Percentage": {
"Always Show Percentage": "Zawsze pokazuj procenty"
},
"Always hide the dock and reveal it when hovering near the dock area": {
"Always hide the dock and reveal it when hovering near the dock area": ""
},
"Always on icons": {
"Always on icons": "Ikony zawsze włączone"
},
@@ -707,6 +710,9 @@
"Clear All Jobs": {
"Clear All Jobs": "Wyczyść wszystkie zadania"
},
"Clear History?": {
"Clear History?": ""
},
"Clear all history when server starts": {
"Clear all history when server starts": "Wyczyść historię gdy serwer startuje"
},
@@ -917,6 +923,12 @@
"Copy": {
"Copy": ""
},
"Copy Full Command": {
"Copy Full Command": ""
},
"Copy Name": {
"Copy Name": ""
},
"Copy PID": {
"Copy PID": "Kopiuj PID"
},
@@ -1124,6 +1136,9 @@
"Delete Printer": {
"Delete Printer": "Usuń drukarkę"
},
"Delete Saved Item?": {
"Delete Saved Item?": ""
},
"Delete VPN": {
"Delete VPN": "Usuń VPN"
},
@@ -1208,6 +1223,9 @@
"Disk Usage": {
"Disk Usage": "Użycie dysku"
},
"Disks": {
"Disks": ""
},
"Dismiss": {
"Dismiss": "Odrzuć"
},
@@ -1442,6 +1460,12 @@
"Enterprise": {
"Enterprise": "Korporacyjny"
},
"Entry pinned": {
"Entry pinned": ""
},
"Entry unpinned": {
"Entry unpinned": ""
},
"Error": {
"Error": "Błąd"
},
@@ -1484,6 +1508,9 @@
"Failed to cancel selected job": {
"Failed to cancel selected job": "Anulowanie wybranego zadania nie powiodło się"
},
"Failed to check pin limit": {
"Failed to check pin limit": ""
},
"Failed to connect VPN": {
"Failed to connect VPN": "Nie udało się połączyć z VPN"
},
@@ -1559,6 +1586,9 @@
"Failed to pause printer": {
"Failed to pause printer": "Wstrzymanie drukarki nie powiodło się"
},
"Failed to pin entry": {
"Failed to pin entry": ""
},
"Failed to print test page": {
"Failed to print test page": "Nie udało się wydrukować strony testowej"
},
@@ -1604,6 +1634,9 @@
"Failed to start connection to %1": {
"Failed to start connection to %1": "Rozpoczęcie połączenia do %1 nie powiodło się"
},
"Failed to unpin entry": {
"Failed to unpin entry": ""
},
"Failed to update VPN": {
"Failed to update VPN": "Nie udało się zaktualizować VPN"
},
@@ -1709,6 +1742,9 @@
"Force HDR": {
"Force HDR": "Wymuś HDR"
},
"Force Kill (SIGKILL)": {
"Force Kill (SIGKILL)": ""
},
"Force Kill Process": {
"Force Kill Process": "Wymuś zamknięcie procesu"
},
@@ -1763,6 +1799,9 @@
"Gamma control not available. Requires DMS API v6+.": {
"Gamma control not available. Requires DMS API v6+.": "Kontrola gamma niedostępna. Wymaga DMS API w wersji 6+."
},
"Generic device name | Generic device name fallback": {
"device": ""
},
"GitHub": {
"GitHub": "GitHub"
},
@@ -1880,6 +1919,9 @@
"History Settings": {
"History Settings": "Ustawienia Historii"
},
"History cleared. %1 pinned entries kept.": {
"History cleared. %1 pinned entries kept.": ""
},
"Hold Duration": {
"Hold Duration": "Czas przytrzymania"
},
@@ -1994,6 +2036,9 @@
"Install plugins from the DMS plugin registry": {
"Install plugins from the DMS plugin registry": "Instaluj wtyczki z rejestru wtyczek DMS"
},
"Intelligent Auto-hide": {
"Intelligent Auto-hide": ""
},
"Interface:": {
"Interface:": "Interfejs:"
},
@@ -2021,6 +2066,166 @@
"Jobs: ": {
"Jobs: ": "Zadania: "
},
"KDE Connect SMS action": {
"Opening SMS": "",
"Opening SMS app": ""
},
"KDE Connect SMS dialog title": {
"Send SMS": ""
},
"KDE Connect SMS message input placeholder": {
"Message": ""
},
"KDE Connect SMS phone input placeholder": {
"Phone number": ""
},
"KDE Connect SMS send button": {
"Send": ""
},
"KDE Connect SMS tooltip": {
"SMS": ""
},
"KDE Connect accept pairing button": {
"Accept": ""
},
"KDE Connect browse action": {
"Opening file browser": "",
"Opening files": ""
},
"KDE Connect browse tooltip": {
"Browse Files": ""
},
"KDE Connect clipboard action": {
"Clipboard sent": ""
},
"KDE Connect clipboard tooltip": {
"Send Clipboard": ""
},
"KDE Connect connected status": {
"Connected": ""
},
"KDE Connect daemon hint": {
"Start kdeconnectd to use this plugin": ""
},
"KDE Connect error": {
"Failed to accept pairing": "",
"Failed to browse device": "",
"Failed to launch SMS app": "",
"Failed to reject pairing": "",
"Failed to ring device": "",
"Failed to send clipboard": "",
"Failed to send ping": "",
"Failed to share": "",
"Pairing failed": "",
"Unpair failed": ""
},
"KDE Connect file share notification": {
"File received from": ""
},
"KDE Connect hint message": {
"Make sure KDE Connect is running on your other devices": ""
},
"KDE Connect no devices message": {
"No devices found": ""
},
"KDE Connect no devices status": {
"No devices": ""
},
"KDE Connect not paired status": {
"Not paired": ""
},
"KDE Connect offline status": {
"Offline": ""
},
"KDE Connect open SMS app button": {
"Open App": ""
},
"KDE Connect open app hint": {
"Open KDE Connect on your phone": ""
},
"KDE Connect pair button": {
"Pair": ""
},
"KDE Connect pairing action": {
"Device paired": "",
"Pairing request sent": ""
},
"KDE Connect pairing in progress status": {
"Pairing": ""
},
"KDE Connect pairing request notification": {
"Pairing request from": ""
},
"KDE Connect pairing requested status": {
"Pairing requested": ""
},
"KDE Connect pairing verification key label": {
"Verification": ""
},
"KDE Connect ping action": {
"Ping sent": "",
"Ping sent to": ""
},
"KDE Connect ping tooltip": {
"Ping": ""
},
"KDE Connect refresh button | KDE Connect refresh tooltip": {
"Refresh": ""
},
"KDE Connect reject pairing button": {
"Reject": ""
},
"KDE Connect request pairing button": {
"Request Pairing": ""
},
"KDE Connect ring action": {
"Ringing": ""
},
"KDE Connect ring tooltip": {
"Ring": ""
},
"KDE Connect service unavailable message": {
"KDE Connect unavailable": ""
},
"KDE Connect share URL button": {
"Share URL": ""
},
"KDE Connect share button | KDE Connect share dialog title | KDE Connect share tooltip": {
"Share": ""
},
"KDE Connect share input placeholder": {
"Enter URL or text to share": ""
},
"KDE Connect share success": {
"Shared": ""
},
"KDE Connect start daemon hint": {
"Start kdeconnectd to connect devices": ""
},
"KDE Connect status": {
"No devices connected": ""
},
"KDE Connect status multiple devices": {
"devices connected": ""
},
"KDE Connect status single device": {
"1 device connected": ""
},
"KDE Connect unavailable error title": {
"KDE Connect Not Available": ""
},
"KDE Connect unavailable status": {
"Unavailable": ""
},
"KDE Connect unknown device status | unknown author": {
"Unknown": ""
},
"KDE Connect unpair action": {
"Device unpaired": ""
},
"KDE Connect unpair tooltip": {
"Unpair": ""
},
"Keep Awake": {
"Keep Awake": "Utrzymuj aktywność"
},
@@ -2255,9 +2460,18 @@
"Maximum History": {
"Maximum History": "Maksymalna historia"
},
"Maximum Pinned Entries": {
"Maximum Pinned Entries": ""
},
"Maximum number of clipboard entries to keep": {
"Maximum number of clipboard entries to keep": "Maksymalna liczba wpisów schowka"
},
"Maximum number of entries that can be saved": {
"Maximum number of entries that can be saved": ""
},
"Maximum pinned entries reached": {
"Maximum pinned entries reached": ""
},
"Maximum size per clipboard entry": {
"Maximum size per clipboard entry": "Maksymalny rozmiar per wpis schowka"
},
@@ -2549,6 +2763,12 @@
"No printers found": {
"No printers found": "Nie znaleziono drukarek"
},
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No saved clipboard entries": {
"No saved clipboard entries": ""
},
"No variants created. Click Add to create a new monitor widget.": {
"No variants created. Click Add to create a new monitor widget.": "Nie stworzono wariantów. Kliknij Dodaj by stworzyć nowy widżet monitora."
},
@@ -2624,6 +2844,9 @@
"OSD Position": {
"OSD Position": "Pozycja OSD"
},
"Occupied Color": {
"Occupied Color": ""
},
"Off": {
"Off": "Wyłączony"
},
@@ -2771,6 +2994,9 @@
"Percentage": {
"Percentage": "Procent"
},
"Performance": {
"Performance": ""
},
"Permission denied to set profile image.": {
"Permission denied to set profile image.": "Odmowa uprawnień do ustawienia zdjęcia profilowego."
},
@@ -2870,6 +3096,9 @@
"Power Profile Degradation": {
"Power Profile Degradation": "Pogorszenie profilu zasilania"
},
"Power off monitors on lock": {
"Power off monitors on lock": ""
},
"Power profile management available": {
"Power profile management available": "Zarządzanie profilami zasilania dostępne"
},
@@ -2939,6 +3168,9 @@
"Process Count": {
"Process Count": "Liczba procesów"
},
"Processes": {
"Processes": ""
},
"Processing": {
"Processing": "Przetwarzanie"
},
@@ -3137,6 +3369,9 @@
"Saved Configurations": {
"Saved Configurations": "Zapisane konfiguracje"
},
"Saved item deleted": {
"Saved item deleted": ""
},
"Scale": {
"Scale": "Skala"
},
@@ -3158,6 +3393,9 @@
"Science": {
"Science": "Nauka"
},
"Screen Sharing": {
"Screen Sharing": ""
},
"Screen sharing": {
"Screen sharing": "Udostępnianie ekranu"
},
@@ -3437,6 +3675,9 @@
"Show darkened overlay behind modal dialogs": {
"Show darkened overlay behind modal dialogs": "Pokaż przyciemnioną nakładkę za oknami modalnymi"
},
"Show dock when floating windows don't overlap its area": {
"Show dock when floating windows don't overlap its area": ""
},
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": {
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": "Pokaż nakładkę launchera podczas pisania w przeglądzie Niri. Wyłączy by użyć innego launchera."
},
@@ -3752,9 +3993,15 @@
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": {
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "Ten widżet zapobiega wyłączaniu zasilania GPU, co może znacznie wpłynąć na żywotność baterii w laptopach. Nie zaleca się używania go na laptopach z hybrydową grafiką."
},
"This will delete all unpinned entries. %1 pinned entries will be kept.": {
"This will delete all unpinned entries. %1 pinned entries will be kept.": ""
},
"This will permanently delete all clipboard history.": {
"This will permanently delete all clipboard history.": "To trwale usunie całą historię schowka."
},
"This will permanently remove this saved clipboard item. This action cannot be undone.": {
"This will permanently remove this saved clipboard item. This action cannot be undone.": ""
},
"Tiling": {
"Tiling": "Dekarstwo"
},
@@ -3854,6 +4101,9 @@
"Trigger Prefix": {
"Trigger Prefix": ""
},
"Turn off all displays immediately when the lock screen activates": {
"Turn off all displays immediately when the lock screen activates": ""
},
"Turn off monitors after": {
"Turn off monitors after": "Wyłącz monitory po"
},
@@ -3920,6 +4170,9 @@
"Update Plugin": {
"Update Plugin": "Zaktualizuj wtyczkę"
},
"Uptime": {
"Uptime": ""
},
"Urgent Color": {
"Urgent Color": ""
},
@@ -4303,6 +4556,18 @@
"dgop not available": {
"dgop not available": "dgop niedostępne"
},
"dgop unavailable error message": {
"The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.": ""
},
"disk io header in system monitor": {
"Disk I/O": ""
},
"disk read label": {
"Read:": ""
},
"disk write label": {
"Write:": ""
},
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": {
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "Plik dms/binds.kdl istnieje, ale nie jest uwzględniony w pliku config.kdl. Niestandardowe skróty klawiszowe nie będą działać, dopóki ten problem nie zostanie rozwiązany."
},
@@ -4336,18 +4601,33 @@
"empty plugin list": {
"No plugins found": "Nie znaleziono wtyczek"
},
"empty state in disk mounts list": {
"No mount points found": ""
},
"empty state in gpu list": {
"No GPUs detected": ""
},
"empty state in process list": {
"No matching processes": ""
},
"empty theme list": {
"No themes found": "Nie znaleziono motywów"
},
"events": {
"events": "wydarzenia"
},
"fallback gpu name": {
"Unknown GPU": ""
},
"files": {
"files": "akta"
},
"generic theme description": {
"Material Design inspired color themes": "Motywy inspirowane Material Design"
},
"gpu section header in system monitor": {
"GPU Monitoring": ""
},
"greeter back button": {
"Back": ""
},
@@ -4540,6 +4820,9 @@
"minutes": {
"minutes": "protokół"
},
"mount points header in system monitor": {
"Mount Points": ""
},
"ms": {
"ms": "ms"
},
@@ -4614,6 +4897,15 @@
"plugin search placeholder": {
"Search plugins...": "Szukaj wtyczek..."
},
"process count label in footer": {
"Processes:": ""
},
"process detail label": {
"Full Command:": ""
},
"process search placeholder": {
"Search processes...": ""
},
"profile image file browser title": {
"Select Profile Image": "Wybierz obraz profilowy"
},
@@ -4639,12 +4931,25 @@
"shadow intensity slider": {
"Intensity": ""
},
"short for processes": {
"procs": ""
},
"source code link": {
"source": "źródło"
},
"sysmon window title": {
"System Monitor": "Monitor systemu"
},
"system info header in system monitor": {
"System Information": ""
},
"system info label": {
"Architecture": "",
"Distribution": "",
"Hostname": "",
"Kernel": "",
"Load Average": ""
},
"theme browser description": {
"Install color themes from the DMS theme registry": "Zainstaluj motywy z rejestru DMS"
},
@@ -4675,6 +4980,9 @@
"update dms for NM integration.": {
"update dms for NM integration.": "zaktualizuj dms dla integracji z NM."
},
"uptime label in footer": {
"Uptime:": ""
},
"version requirement": {
"Requires %1": ""
},

View File

@@ -251,6 +251,9 @@
"Always Show Percentage": {
"Always Show Percentage": "Sempre Mostrar Porcentagem"
},
"Always hide the dock and reveal it when hovering near the dock area": {
"Always hide the dock and reveal it when hovering near the dock area": ""
},
"Always on icons": {
"Always on icons": "Ícones sempre ligados"
},
@@ -707,6 +710,9 @@
"Clear All Jobs": {
"Clear All Jobs": "Limpar Todos os Trabalhos"
},
"Clear History?": {
"Clear History?": ""
},
"Clear all history when server starts": {
"Clear all history when server starts": "Limpar todo o histórico quando o servidor iniciar"
},
@@ -917,6 +923,12 @@
"Copy": {
"Copy": ""
},
"Copy Full Command": {
"Copy Full Command": ""
},
"Copy Name": {
"Copy Name": ""
},
"Copy PID": {
"Copy PID": "Copiar PID"
},
@@ -1124,6 +1136,9 @@
"Delete Printer": {
"Delete Printer": "Excluir Impressora"
},
"Delete Saved Item?": {
"Delete Saved Item?": ""
},
"Delete VPN": {
"Delete VPN": "Excluir VPN"
},
@@ -1208,6 +1223,9 @@
"Disk Usage": {
"Disk Usage": "Uso de Disco"
},
"Disks": {
"Disks": ""
},
"Dismiss": {
"Dismiss": "Descartar"
},
@@ -1442,6 +1460,12 @@
"Enterprise": {
"Enterprise": "Enterprise"
},
"Entry pinned": {
"Entry pinned": ""
},
"Entry unpinned": {
"Entry unpinned": ""
},
"Error": {
"Error": "Erro"
},
@@ -1484,6 +1508,9 @@
"Failed to cancel selected job": {
"Failed to cancel selected job": "Falha ao cancelar o trabalho selecionado"
},
"Failed to check pin limit": {
"Failed to check pin limit": ""
},
"Failed to connect VPN": {
"Failed to connect VPN": "Erro ao conectar à VPN"
},
@@ -1559,6 +1586,9 @@
"Failed to pause printer": {
"Failed to pause printer": "Falha ao pausar impressora"
},
"Failed to pin entry": {
"Failed to pin entry": ""
},
"Failed to print test page": {
"Failed to print test page": "Falha ao imprimir página de testes"
},
@@ -1604,6 +1634,9 @@
"Failed to start connection to %1": {
"Failed to start connection to %1": ""
},
"Failed to unpin entry": {
"Failed to unpin entry": ""
},
"Failed to update VPN": {
"Failed to update VPN": "Falha ao atualizar VPN"
},
@@ -1709,6 +1742,9 @@
"Force HDR": {
"Force HDR": ""
},
"Force Kill (SIGKILL)": {
"Force Kill (SIGKILL)": ""
},
"Force Kill Process": {
"Force Kill Process": "Forçar Fechamento do Processo"
},
@@ -1763,6 +1799,9 @@
"Gamma control not available. Requires DMS API v6+.": {
"Gamma control not available. Requires DMS API v6+.": "Controle de gama não disponível. Necessário DMS API v6+."
},
"Generic device name | Generic device name fallback": {
"device": ""
},
"GitHub": {
"GitHub": ""
},
@@ -1880,6 +1919,9 @@
"History Settings": {
"History Settings": "Configurações do Histórico"
},
"History cleared. %1 pinned entries kept.": {
"History cleared. %1 pinned entries kept.": ""
},
"Hold Duration": {
"Hold Duration": "Duração do Pressionamento"
},
@@ -1994,6 +2036,9 @@
"Install plugins from the DMS plugin registry": {
"Install plugins from the DMS plugin registry": "Instale plugins a partir do registro de plugins do DMS"
},
"Intelligent Auto-hide": {
"Intelligent Auto-hide": ""
},
"Interface:": {
"Interface:": "Interface:"
},
@@ -2021,6 +2066,166 @@
"Jobs: ": {
"Jobs: ": "Trabalhos:"
},
"KDE Connect SMS action": {
"Opening SMS": "",
"Opening SMS app": ""
},
"KDE Connect SMS dialog title": {
"Send SMS": ""
},
"KDE Connect SMS message input placeholder": {
"Message": ""
},
"KDE Connect SMS phone input placeholder": {
"Phone number": ""
},
"KDE Connect SMS send button": {
"Send": ""
},
"KDE Connect SMS tooltip": {
"SMS": ""
},
"KDE Connect accept pairing button": {
"Accept": ""
},
"KDE Connect browse action": {
"Opening file browser": "",
"Opening files": ""
},
"KDE Connect browse tooltip": {
"Browse Files": ""
},
"KDE Connect clipboard action": {
"Clipboard sent": ""
},
"KDE Connect clipboard tooltip": {
"Send Clipboard": ""
},
"KDE Connect connected status": {
"Connected": ""
},
"KDE Connect daemon hint": {
"Start kdeconnectd to use this plugin": ""
},
"KDE Connect error": {
"Failed to accept pairing": "",
"Failed to browse device": "",
"Failed to launch SMS app": "",
"Failed to reject pairing": "",
"Failed to ring device": "",
"Failed to send clipboard": "",
"Failed to send ping": "",
"Failed to share": "",
"Pairing failed": "",
"Unpair failed": ""
},
"KDE Connect file share notification": {
"File received from": ""
},
"KDE Connect hint message": {
"Make sure KDE Connect is running on your other devices": ""
},
"KDE Connect no devices message": {
"No devices found": ""
},
"KDE Connect no devices status": {
"No devices": ""
},
"KDE Connect not paired status": {
"Not paired": ""
},
"KDE Connect offline status": {
"Offline": ""
},
"KDE Connect open SMS app button": {
"Open App": ""
},
"KDE Connect open app hint": {
"Open KDE Connect on your phone": ""
},
"KDE Connect pair button": {
"Pair": ""
},
"KDE Connect pairing action": {
"Device paired": "",
"Pairing request sent": ""
},
"KDE Connect pairing in progress status": {
"Pairing": ""
},
"KDE Connect pairing request notification": {
"Pairing request from": ""
},
"KDE Connect pairing requested status": {
"Pairing requested": ""
},
"KDE Connect pairing verification key label": {
"Verification": ""
},
"KDE Connect ping action": {
"Ping sent": "",
"Ping sent to": ""
},
"KDE Connect ping tooltip": {
"Ping": ""
},
"KDE Connect refresh button | KDE Connect refresh tooltip": {
"Refresh": ""
},
"KDE Connect reject pairing button": {
"Reject": ""
},
"KDE Connect request pairing button": {
"Request Pairing": ""
},
"KDE Connect ring action": {
"Ringing": ""
},
"KDE Connect ring tooltip": {
"Ring": ""
},
"KDE Connect service unavailable message": {
"KDE Connect unavailable": ""
},
"KDE Connect share URL button": {
"Share URL": ""
},
"KDE Connect share button | KDE Connect share dialog title | KDE Connect share tooltip": {
"Share": ""
},
"KDE Connect share input placeholder": {
"Enter URL or text to share": ""
},
"KDE Connect share success": {
"Shared": ""
},
"KDE Connect start daemon hint": {
"Start kdeconnectd to connect devices": ""
},
"KDE Connect status": {
"No devices connected": ""
},
"KDE Connect status multiple devices": {
"devices connected": ""
},
"KDE Connect status single device": {
"1 device connected": ""
},
"KDE Connect unavailable error title": {
"KDE Connect Not Available": ""
},
"KDE Connect unavailable status": {
"Unavailable": ""
},
"KDE Connect unknown device status | unknown author": {
"Unknown": ""
},
"KDE Connect unpair action": {
"Device unpaired": ""
},
"KDE Connect unpair tooltip": {
"Unpair": ""
},
"Keep Awake": {
"Keep Awake": "Manter Ligado"
},
@@ -2255,9 +2460,18 @@
"Maximum History": {
"Maximum History": "Histórico Máximo"
},
"Maximum Pinned Entries": {
"Maximum Pinned Entries": ""
},
"Maximum number of clipboard entries to keep": {
"Maximum number of clipboard entries to keep": "Número máximo de entradas da área de transferência para guardar"
},
"Maximum number of entries that can be saved": {
"Maximum number of entries that can be saved": ""
},
"Maximum pinned entries reached": {
"Maximum pinned entries reached": ""
},
"Maximum size per clipboard entry": {
"Maximum size per clipboard entry": "Tamanho máximo por entrada da área de transferência"
},
@@ -2549,6 +2763,12 @@
"No printers found": {
"No printers found": "Nenhuma impressora encontrada"
},
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No saved clipboard entries": {
"No saved clipboard entries": ""
},
"No variants created. Click Add to create a new monitor widget.": {
"No variants created. Click Add to create a new monitor widget.": ""
},
@@ -2624,6 +2844,9 @@
"OSD Position": {
"OSD Position": "Posição do OSD"
},
"Occupied Color": {
"Occupied Color": ""
},
"Off": {
"Off": ""
},
@@ -2771,6 +2994,9 @@
"Percentage": {
"Percentage": "Porcetagem"
},
"Performance": {
"Performance": ""
},
"Permission denied to set profile image.": {
"Permission denied to set profile image.": "Permissão negada ao definir imagem de perfil."
},
@@ -2870,6 +3096,9 @@
"Power Profile Degradation": {
"Power Profile Degradation": "Degradação do Perfil de Energia"
},
"Power off monitors on lock": {
"Power off monitors on lock": ""
},
"Power profile management available": {
"Power profile management available": ""
},
@@ -2939,6 +3168,9 @@
"Process Count": {
"Process Count": ""
},
"Processes": {
"Processes": ""
},
"Processing": {
"Processing": "Processando"
},
@@ -3137,6 +3369,9 @@
"Saved Configurations": {
"Saved Configurations": "Configurações Salvas"
},
"Saved item deleted": {
"Saved item deleted": ""
},
"Scale": {
"Scale": ""
},
@@ -3158,6 +3393,9 @@
"Science": {
"Science": "Ciência"
},
"Screen Sharing": {
"Screen Sharing": ""
},
"Screen sharing": {
"Screen sharing": "Compartilhamento de tela"
},
@@ -3437,6 +3675,9 @@
"Show darkened overlay behind modal dialogs": {
"Show darkened overlay behind modal dialogs": "Exibir sobreposição escurecida atrás de diálogos modais"
},
"Show dock when floating windows don't overlap its area": {
"Show dock when floating windows don't overlap its area": ""
},
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": {
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": ""
},
@@ -3752,9 +3993,15 @@
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": {
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "Este widget mantém a GPU ativa, podendo reduzir a duração da bateria. Não recomendado em laptops com gráficos híbridos."
},
"This will delete all unpinned entries. %1 pinned entries will be kept.": {
"This will delete all unpinned entries. %1 pinned entries will be kept.": ""
},
"This will permanently delete all clipboard history.": {
"This will permanently delete all clipboard history.": "Isso vai apagar permanentemetne todo o histórico da área de transferência."
},
"This will permanently remove this saved clipboard item. This action cannot be undone.": {
"This will permanently remove this saved clipboard item. This action cannot be undone.": ""
},
"Tiling": {
"Tiling": "Tiling"
},
@@ -3854,6 +4101,9 @@
"Trigger Prefix": {
"Trigger Prefix": ""
},
"Turn off all displays immediately when the lock screen activates": {
"Turn off all displays immediately when the lock screen activates": ""
},
"Turn off monitors after": {
"Turn off monitors after": "Desligar monitores depois de"
},
@@ -3920,6 +4170,9 @@
"Update Plugin": {
"Update Plugin": "Atualizar Plugin"
},
"Uptime": {
"Uptime": ""
},
"Urgent Color": {
"Urgent Color": ""
},
@@ -4303,6 +4556,18 @@
"dgop not available": {
"dgop not available": ""
},
"dgop unavailable error message": {
"The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.": ""
},
"disk io header in system monitor": {
"Disk I/O": ""
},
"disk read label": {
"Read:": ""
},
"disk write label": {
"Write:": ""
},
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": {
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": ""
},
@@ -4336,18 +4601,33 @@
"empty plugin list": {
"No plugins found": ""
},
"empty state in disk mounts list": {
"No mount points found": ""
},
"empty state in gpu list": {
"No GPUs detected": ""
},
"empty state in process list": {
"No matching processes": ""
},
"empty theme list": {
"No themes found": ""
},
"events": {
"events": "eventos"
},
"fallback gpu name": {
"Unknown GPU": ""
},
"files": {
"files": "arquivos"
},
"generic theme description": {
"Material Design inspired color themes": ""
},
"gpu section header in system monitor": {
"GPU Monitoring": ""
},
"greeter back button": {
"Back": ""
},
@@ -4540,6 +4820,9 @@
"minutes": {
"minutes": "minutos"
},
"mount points header in system monitor": {
"Mount Points": ""
},
"ms": {
"ms": ""
},
@@ -4614,6 +4897,15 @@
"plugin search placeholder": {
"Search plugins...": ""
},
"process count label in footer": {
"Processes:": ""
},
"process detail label": {
"Full Command:": ""
},
"process search placeholder": {
"Search processes...": ""
},
"profile image file browser title": {
"Select Profile Image": "Selecionar Imagem de Perfil"
},
@@ -4639,12 +4931,25 @@
"shadow intensity slider": {
"Intensity": ""
},
"short for processes": {
"procs": ""
},
"source code link": {
"source": ""
},
"sysmon window title": {
"System Monitor": "Monitor do Sistema"
},
"system info header in system monitor": {
"System Information": ""
},
"system info label": {
"Architecture": "",
"Distribution": "",
"Hostname": "",
"Kernel": "",
"Load Average": ""
},
"theme browser description": {
"Install color themes from the DMS theme registry": ""
},
@@ -4675,6 +4980,9 @@
"update dms for NM integration.": {
"update dms for NM integration.": "atualize dms para integração com o NM."
},
"uptime label in footer": {
"Uptime:": ""
},
"version requirement": {
"Requires %1": ""
},

View File

@@ -15,7 +15,7 @@
"%1 connected": "%1 bağlı"
},
"%1 days ago": {
"%1 days ago": ""
"%1 days ago": "%1 gün önce"
},
"%1 display(s)": {
"%1 display(s)": "%1 ekran"
@@ -42,7 +42,7 @@
"%1 widgets": "%1 widget"
},
"%1m ago": {
"%1m ago": ""
"%1m ago": "%1dk önce"
},
"(Unnamed)": {
"(Unnamed)": "(İsimsiz)"
@@ -251,6 +251,9 @@
"Always Show Percentage": {
"Always Show Percentage": "Yüzdeyi Her Zaman Göster"
},
"Always hide the dock and reveal it when hovering near the dock area": {
"Always hide the dock and reveal it when hovering near the dock area": ""
},
"Always on icons": {
"Always on icons": "Her zaman açık simgeler"
},
@@ -707,6 +710,9 @@
"Clear All Jobs": {
"Clear All Jobs": "Tüm İşleri Temizle"
},
"Clear History?": {
"Clear History?": ""
},
"Clear all history when server starts": {
"Clear all history when server starts": "Sunucu başladığında tüm geçmişi temizle"
},
@@ -917,6 +923,12 @@
"Copy": {
"Copy": ""
},
"Copy Full Command": {
"Copy Full Command": ""
},
"Copy Name": {
"Copy Name": ""
},
"Copy PID": {
"Copy PID": "PID'i Kopyala"
},
@@ -1124,6 +1136,9 @@
"Delete Printer": {
"Delete Printer": "Yazıcı Sil"
},
"Delete Saved Item?": {
"Delete Saved Item?": ""
},
"Delete VPN": {
"Delete VPN": "VPN'i Sil"
},
@@ -1208,6 +1223,9 @@
"Disk Usage": {
"Disk Usage": "Disk Kullanımı"
},
"Disks": {
"Disks": ""
},
"Dismiss": {
"Dismiss": "Reddet"
},
@@ -1442,6 +1460,12 @@
"Enterprise": {
"Enterprise": "Kurumsal"
},
"Entry pinned": {
"Entry pinned": ""
},
"Entry unpinned": {
"Entry unpinned": ""
},
"Error": {
"Error": "Hata"
},
@@ -1484,6 +1508,9 @@
"Failed to cancel selected job": {
"Failed to cancel selected job": "Seçilen işler iptal edemedi"
},
"Failed to check pin limit": {
"Failed to check pin limit": ""
},
"Failed to connect VPN": {
"Failed to connect VPN": "VPN bağlantısı kurulamadı"
},
@@ -1559,6 +1586,9 @@
"Failed to pause printer": {
"Failed to pause printer": "Yazıcıyı duraklatma başarısız"
},
"Failed to pin entry": {
"Failed to pin entry": ""
},
"Failed to print test page": {
"Failed to print test page": "Test sayfası yazdırılamadı"
},
@@ -1604,6 +1634,9 @@
"Failed to start connection to %1": {
"Failed to start connection to %1": "%1 bağlantı başlatılamadı"
},
"Failed to unpin entry": {
"Failed to unpin entry": ""
},
"Failed to update VPN": {
"Failed to update VPN": "VPN güncellenemedi"
},
@@ -1709,6 +1742,9 @@
"Force HDR": {
"Force HDR": "Zorla HDR"
},
"Force Kill (SIGKILL)": {
"Force Kill (SIGKILL)": ""
},
"Force Kill Process": {
"Force Kill Process": "Süreci Zorla Kapat"
},
@@ -1763,6 +1799,9 @@
"Gamma control not available. Requires DMS API v6+.": {
"Gamma control not available. Requires DMS API v6+.": "Gama kontrolü mevcut değil. DMS API V6+ gerekir."
},
"Generic device name | Generic device name fallback": {
"device": ""
},
"GitHub": {
"GitHub": "GitHub"
},
@@ -1880,6 +1919,9 @@
"History Settings": {
"History Settings": "Geçmiş Ayarları"
},
"History cleared. %1 pinned entries kept.": {
"History cleared. %1 pinned entries kept.": ""
},
"Hold Duration": {
"Hold Duration": "Tutma Süresi"
},
@@ -1994,6 +2036,9 @@
"Install plugins from the DMS plugin registry": {
"Install plugins from the DMS plugin registry": "DMS eklenti defterinden eklentiler yükle"
},
"Intelligent Auto-hide": {
"Intelligent Auto-hide": ""
},
"Interface:": {
"Interface:": "Arayüz:"
},
@@ -2021,6 +2066,166 @@
"Jobs: ": {
"Jobs: ": "İşler:"
},
"KDE Connect SMS action": {
"Opening SMS": "",
"Opening SMS app": ""
},
"KDE Connect SMS dialog title": {
"Send SMS": ""
},
"KDE Connect SMS message input placeholder": {
"Message": ""
},
"KDE Connect SMS phone input placeholder": {
"Phone number": ""
},
"KDE Connect SMS send button": {
"Send": ""
},
"KDE Connect SMS tooltip": {
"SMS": ""
},
"KDE Connect accept pairing button": {
"Accept": ""
},
"KDE Connect browse action": {
"Opening file browser": "",
"Opening files": ""
},
"KDE Connect browse tooltip": {
"Browse Files": ""
},
"KDE Connect clipboard action": {
"Clipboard sent": ""
},
"KDE Connect clipboard tooltip": {
"Send Clipboard": ""
},
"KDE Connect connected status": {
"Connected": ""
},
"KDE Connect daemon hint": {
"Start kdeconnectd to use this plugin": ""
},
"KDE Connect error": {
"Failed to accept pairing": "",
"Failed to browse device": "",
"Failed to launch SMS app": "",
"Failed to reject pairing": "",
"Failed to ring device": "",
"Failed to send clipboard": "",
"Failed to send ping": "",
"Failed to share": "",
"Pairing failed": "",
"Unpair failed": ""
},
"KDE Connect file share notification": {
"File received from": ""
},
"KDE Connect hint message": {
"Make sure KDE Connect is running on your other devices": ""
},
"KDE Connect no devices message": {
"No devices found": ""
},
"KDE Connect no devices status": {
"No devices": ""
},
"KDE Connect not paired status": {
"Not paired": ""
},
"KDE Connect offline status": {
"Offline": ""
},
"KDE Connect open SMS app button": {
"Open App": ""
},
"KDE Connect open app hint": {
"Open KDE Connect on your phone": ""
},
"KDE Connect pair button": {
"Pair": ""
},
"KDE Connect pairing action": {
"Device paired": "",
"Pairing request sent": ""
},
"KDE Connect pairing in progress status": {
"Pairing": ""
},
"KDE Connect pairing request notification": {
"Pairing request from": ""
},
"KDE Connect pairing requested status": {
"Pairing requested": ""
},
"KDE Connect pairing verification key label": {
"Verification": ""
},
"KDE Connect ping action": {
"Ping sent": "",
"Ping sent to": ""
},
"KDE Connect ping tooltip": {
"Ping": ""
},
"KDE Connect refresh button | KDE Connect refresh tooltip": {
"Refresh": ""
},
"KDE Connect reject pairing button": {
"Reject": ""
},
"KDE Connect request pairing button": {
"Request Pairing": ""
},
"KDE Connect ring action": {
"Ringing": ""
},
"KDE Connect ring tooltip": {
"Ring": ""
},
"KDE Connect service unavailable message": {
"KDE Connect unavailable": ""
},
"KDE Connect share URL button": {
"Share URL": ""
},
"KDE Connect share button | KDE Connect share dialog title | KDE Connect share tooltip": {
"Share": ""
},
"KDE Connect share input placeholder": {
"Enter URL or text to share": ""
},
"KDE Connect share success": {
"Shared": ""
},
"KDE Connect start daemon hint": {
"Start kdeconnectd to connect devices": ""
},
"KDE Connect status": {
"No devices connected": ""
},
"KDE Connect status multiple devices": {
"devices connected": ""
},
"KDE Connect status single device": {
"1 device connected": ""
},
"KDE Connect unavailable error title": {
"KDE Connect Not Available": ""
},
"KDE Connect unavailable status": {
"Unavailable": ""
},
"KDE Connect unknown device status | unknown author": {
"Unknown": ""
},
"KDE Connect unpair action": {
"Device unpaired": ""
},
"KDE Connect unpair tooltip": {
"Unpair": ""
},
"Keep Awake": {
"Keep Awake": "Uyanık Tut"
},
@@ -2255,9 +2460,18 @@
"Maximum History": {
"Maximum History": "Maksimum Geçmiş"
},
"Maximum Pinned Entries": {
"Maximum Pinned Entries": ""
},
"Maximum number of clipboard entries to keep": {
"Maximum number of clipboard entries to keep": "Saklanacak maksimum pano kaydı sayısı"
},
"Maximum number of entries that can be saved": {
"Maximum number of entries that can be saved": ""
},
"Maximum pinned entries reached": {
"Maximum pinned entries reached": ""
},
"Maximum size per clipboard entry": {
"Maximum size per clipboard entry": "Pano kaydı başına maksimum boyut"
},
@@ -2549,6 +2763,12 @@
"No printers found": {
"No printers found": "Hiçbir yazıcı bulunmadı"
},
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No saved clipboard entries": {
"No saved clipboard entries": ""
},
"No variants created. Click Add to create a new monitor widget.": {
"No variants created. Click Add to create a new monitor widget.": "Hiçbir varyant oluşturulmadı. Yeni bir monitör widget'ı oluşturmak için Ekle'ye tıklayın."
},
@@ -2577,7 +2797,7 @@
"Not connected": "Bağlı değil"
},
"Not detected": {
"Not detected": ""
"Not detected": "Algılanmadı"
},
"Note: this only changes the percentage, it does not actually limit charging.": {
"Note: this only changes the percentage, it does not actually limit charging.": "Not: Bu sadece yüzdeyi değiştirir, şarjı sınırlamaz."
@@ -2624,6 +2844,9 @@
"OSD Position": {
"OSD Position": "OSD Pozisyonu"
},
"Occupied Color": {
"Occupied Color": ""
},
"Off": {
"Off": "Kapalı"
},
@@ -2697,7 +2920,7 @@
"Override": "Geçersiz Kıl"
},
"Override Border Size": {
"Override Border Size": ""
"Override Border Size": "Kenar boyutunu geçersiz kıl"
},
"Override Corner Radius": {
"Override Corner Radius": "Köşe Yarıçapını Değiştir"
@@ -2771,6 +2994,9 @@
"Percentage": {
"Percentage": "Yüzde"
},
"Performance": {
"Performance": ""
},
"Permission denied to set profile image.": {
"Permission denied to set profile image.": "Profil resmi ayarlama izni reddedildi."
},
@@ -2870,6 +3096,9 @@
"Power Profile Degradation": {
"Power Profile Degradation": "Güç Profili Dejenerasyonu"
},
"Power off monitors on lock": {
"Power off monitors on lock": ""
},
"Power profile management available": {
"Power profile management available": "Güç profili yönetimi mevcut"
},
@@ -2939,6 +3168,9 @@
"Process Count": {
"Process Count": "Süreç Sayısı"
},
"Processes": {
"Processes": ""
},
"Processing": {
"Processing": "İşleniyor"
},
@@ -3137,6 +3369,9 @@
"Saved Configurations": {
"Saved Configurations": "Kaydedilen Yapılandırmalar"
},
"Saved item deleted": {
"Saved item deleted": ""
},
"Scale": {
"Scale": "Ölçek"
},
@@ -3158,6 +3393,9 @@
"Science": {
"Science": "Bilim"
},
"Screen Sharing": {
"Screen Sharing": ""
},
"Screen sharing": {
"Screen sharing": "Ekran paylaşımı"
},
@@ -3437,6 +3675,9 @@
"Show darkened overlay behind modal dialogs": {
"Show darkened overlay behind modal dialogs": "Modal diyalogların arkasında karartılmış kaplama göster"
},
"Show dock when floating windows don't overlap its area": {
"Show dock when floating windows don't overlap its area": ""
},
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": {
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": "Niri genel görünümde yazarken başlatıcı katmanını göster. Başka bir başlatıcı kullanmak için devre dışı bırakın."
},
@@ -3752,9 +3993,15 @@
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": {
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "Bu widget, dizüstü bilgisayarlarda pil ömrünü önemli ölçüde etkileyebilen GPU güç kapatma durumlarını önler. Hibrit grafik kartına sahip dizüstü bilgisayarlarda kullanılması önerilmez."
},
"This will delete all unpinned entries. %1 pinned entries will be kept.": {
"This will delete all unpinned entries. %1 pinned entries will be kept.": ""
},
"This will permanently delete all clipboard history.": {
"This will permanently delete all clipboard history.": "Bu, tüm pano geçmişini kalıcı olarak siler."
},
"This will permanently remove this saved clipboard item. This action cannot be undone.": {
"This will permanently remove this saved clipboard item. This action cannot be undone.": ""
},
"Tiling": {
"Tiling": "Döşeme"
},
@@ -3854,6 +4101,9 @@
"Trigger Prefix": {
"Trigger Prefix": ""
},
"Turn off all displays immediately when the lock screen activates": {
"Turn off all displays immediately when the lock screen activates": ""
},
"Turn off monitors after": {
"Turn off monitors after": "Şu zaman sonra monitörleri kapat"
},
@@ -3920,6 +4170,9 @@
"Update Plugin": {
"Update Plugin": "Eklentiyi Güncelle"
},
"Uptime": {
"Uptime": ""
},
"Urgent Color": {
"Urgent Color": ""
},
@@ -4303,6 +4556,18 @@
"dgop not available": {
"dgop not available": "dgop mevcut değil"
},
"dgop unavailable error message": {
"The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.": ""
},
"disk io header in system monitor": {
"Disk I/O": ""
},
"disk read label": {
"Read:": ""
},
"disk write label": {
"Write:": ""
},
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": {
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "dms/binds.kdl dosyası mevcut ancak config.kdl dosyasına dahil edilmemiştir. Bu sorun giderilene kadar özel tuş atamaları çalışmayacaktır."
},
@@ -4336,18 +4601,33 @@
"empty plugin list": {
"No plugins found": "Eklenti bulunamadı"
},
"empty state in disk mounts list": {
"No mount points found": ""
},
"empty state in gpu list": {
"No GPUs detected": ""
},
"empty state in process list": {
"No matching processes": ""
},
"empty theme list": {
"No themes found": "Tema bulunmadı"
},
"events": {
"events": "etkinlikler"
},
"fallback gpu name": {
"Unknown GPU": ""
},
"files": {
"files": "dosyalar"
},
"generic theme description": {
"Material Design inspired color themes": "Malzeme Tasarımı'ndan ilham alan renk temaları"
},
"gpu section header in system monitor": {
"GPU Monitoring": ""
},
"greeter back button": {
"Back": ""
},
@@ -4374,9 +4654,9 @@
},
"greeter doctor page empty state": {
"No checks passed": "",
"No errors": "",
"No errors": "Sorun yok",
"No info items": "",
"No warnings": ""
"No warnings": "Uyarı yok"
},
"greeter doctor page error count": {
"%1 issue(s) found": ""
@@ -4385,9 +4665,9 @@
"Analyzing configuration...": ""
},
"greeter doctor page status card": {
"Errors": "",
"Info": "",
"OK": "",
"Errors": "Hatalar",
"Info": "Bilgi",
"OK": "Tamam",
"Warnings": ""
},
"greeter doctor page success": {
@@ -4409,7 +4689,7 @@
"Extensible architecture": "",
"GTK, Qt, IDEs, more": "",
"Modular widget bar": "",
"Night mode & gamma": "",
"Night mode & gamma": "Gece modu & gamma",
"Per-screen config": "",
"Quick system toggles": "",
"Security & privacy": ""
@@ -4424,7 +4704,7 @@
"Theme Registry": ""
},
"greeter feature card title | greeter plugins link": {
"Plugins": ""
"Plugins": "Eklentiler"
},
"greeter feature card title | greeter settings link": {
"DankBar": ""
@@ -4436,7 +4716,7 @@
"Finish": ""
},
"greeter first page button": {
"Get Started": ""
"Get Started": "Başlarken"
},
"greeter keybinds niri description": {
"niri shortcuts config": ""
@@ -4448,7 +4728,7 @@
"Welcome": ""
},
"greeter next button": {
"Next": ""
"Next": "Devam et"
},
"greeter no keybinds message": {
"No DMS shortcuts configured": ""
@@ -4459,8 +4739,8 @@
"greeter settings link": {
"Displays": "",
"Dock": "",
"Keybinds": "",
"Notifications": "",
"Keybinds": "Kısayollar",
"Notifications": "Bildirimler",
"Theme & Colors": "",
"Wallpaper": ""
},
@@ -4523,7 +4803,7 @@
"Notification Display": ""
},
"lock screen notifications settings card": {
"Lock Screen": ""
"Lock Screen": "Kilit ekranı"
},
"loginctl not available - lock integration requires DMS socket connection": {
"loginctl not available - lock integration requires DMS socket connection": "loginctl kullanılabilir değil - kilit entegrasyonu DMS soket bağlantısı gerektirir"
@@ -4540,6 +4820,9 @@
"minutes": {
"minutes": "dakika"
},
"mount points header in system monitor": {
"Mount Points": ""
},
"ms": {
"ms": "ms"
},
@@ -4553,11 +4836,11 @@
"No wallpaper selected": "Duvar kağıdı seçilmedi"
},
"notification center tab": {
"Current": "",
"Current": "Şu an",
"History": ""
},
"notification history filter": {
"All": "",
"All": "Tümü",
"Last hour": "",
"Today": "",
"Yesterday": ""
@@ -4566,23 +4849,23 @@
"Older": ""
},
"notification history filter | notification history retention option": {
"30 days": "",
"7 days": ""
"30 days": "30 günlük",
"7 days": "7 günlük"
},
"notification history limit": {
"Maximum number of notifications to keep": ""
},
"notification history retention option": {
"1 day": "",
"14 days": "",
"3 days": "",
"1 day": "1 günlük",
"14 days": "14 günlük",
"3 days": "3 günlük",
"Forever": ""
},
"notification history retention settings label": {
"History Retention": ""
},
"notification history setting": {
"Auto-delete notifications older than this": "",
"Auto-delete notifications older than this": "Bildirimler şundan eskiyse otomatik sil",
"Save critical priority notifications to history": "",
"Save low priority notifications to history": "",
"Save normal priority notifications to history": ""
@@ -4591,7 +4874,7 @@
"Save dismissed notifications to history": ""
},
"notification history toggle label": {
"Enable History": ""
"Enable History": "Geçmişi Aç"
},
"now": {
"now": ""
@@ -4614,6 +4897,15 @@
"plugin search placeholder": {
"Search plugins...": "Eklenti ara..."
},
"process count label in footer": {
"Processes:": ""
},
"process detail label": {
"Full Command:": ""
},
"process search placeholder": {
"Search processes...": ""
},
"profile image file browser title": {
"Select Profile Image": "Profil Resmi Seç"
},
@@ -4639,12 +4931,25 @@
"shadow intensity slider": {
"Intensity": ""
},
"short for processes": {
"procs": ""
},
"source code link": {
"source": "kaynak"
},
"sysmon window title": {
"System Monitor": "Sistem Monitörü"
},
"system info header in system monitor": {
"System Information": ""
},
"system info label": {
"Architecture": "",
"Distribution": "",
"Hostname": "",
"Kernel": "",
"Load Average": ""
},
"theme browser description": {
"Install color themes from the DMS theme registry": "DMS tema kayıt defterinden renk temaları yükle"
},
@@ -4675,6 +4980,9 @@
"update dms for NM integration.": {
"update dms for NM integration.": "NM entegrasyonu için dms'yi güncelle"
},
"uptime label in footer": {
"Uptime:": ""
},
"version requirement": {
"Requires %1": ""
},

View File

@@ -251,6 +251,9 @@
"Always Show Percentage": {
"Always Show Percentage": "始终显示百分比"
},
"Always hide the dock and reveal it when hovering near the dock area": {
"Always hide the dock and reveal it when hovering near the dock area": ""
},
"Always on icons": {
"Always on icons": "总显示的图标"
},
@@ -707,6 +710,9 @@
"Clear All Jobs": {
"Clear All Jobs": "清除所有任务"
},
"Clear History?": {
"Clear History?": ""
},
"Clear all history when server starts": {
"Clear all history when server starts": "当服务器启动时清除所有纪录"
},
@@ -917,6 +923,12 @@
"Copy": {
"Copy": "复制"
},
"Copy Full Command": {
"Copy Full Command": ""
},
"Copy Name": {
"Copy Name": ""
},
"Copy PID": {
"Copy PID": "复制进程ID"
},
@@ -1124,6 +1136,9 @@
"Delete Printer": {
"Delete Printer": "删除打印机"
},
"Delete Saved Item?": {
"Delete Saved Item?": ""
},
"Delete VPN": {
"Delete VPN": "删除 VPN"
},
@@ -1208,6 +1223,9 @@
"Disk Usage": {
"Disk Usage": "磁盘占用"
},
"Disks": {
"Disks": ""
},
"Dismiss": {
"Dismiss": "忽略"
},
@@ -1442,6 +1460,12 @@
"Enterprise": {
"Enterprise": "企业"
},
"Entry pinned": {
"Entry pinned": ""
},
"Entry unpinned": {
"Entry unpinned": ""
},
"Error": {
"Error": "错误"
},
@@ -1484,6 +1508,9 @@
"Failed to cancel selected job": {
"Failed to cancel selected job": "无法取消所选的任务"
},
"Failed to check pin limit": {
"Failed to check pin limit": ""
},
"Failed to connect VPN": {
"Failed to connect VPN": "连接 VPN 失败"
},
@@ -1559,6 +1586,9 @@
"Failed to pause printer": {
"Failed to pause printer": "无法暂停打印机"
},
"Failed to pin entry": {
"Failed to pin entry": ""
},
"Failed to print test page": {
"Failed to print test page": "打印测试页失败"
},
@@ -1604,6 +1634,9 @@
"Failed to start connection to %1": {
"Failed to start connection to %1": "连接至%1失败"
},
"Failed to unpin entry": {
"Failed to unpin entry": ""
},
"Failed to update VPN": {
"Failed to update VPN": "更新 VPN 失败"
},
@@ -1709,6 +1742,9 @@
"Force HDR": {
"Force HDR": "强制HDR"
},
"Force Kill (SIGKILL)": {
"Force Kill (SIGKILL)": ""
},
"Force Kill Process": {
"Force Kill Process": "强制结束进程"
},
@@ -1763,6 +1799,9 @@
"Gamma control not available. Requires DMS API v6+.": {
"Gamma control not available. Requires DMS API v6+.": "伽玛控制不可用,需要 DMS API v6+。"
},
"Generic device name | Generic device name fallback": {
"device": ""
},
"GitHub": {
"GitHub": "GitHub"
},
@@ -1880,6 +1919,9 @@
"History Settings": {
"History Settings": "历史设置"
},
"History cleared. %1 pinned entries kept.": {
"History cleared. %1 pinned entries kept.": ""
},
"Hold Duration": {
"Hold Duration": "按住持续时间"
},
@@ -1994,6 +2036,9 @@
"Install plugins from the DMS plugin registry": {
"Install plugins from the DMS plugin registry": "从 DMS 插件库安装插件"
},
"Intelligent Auto-hide": {
"Intelligent Auto-hide": ""
},
"Interface:": {
"Interface:": "接口:"
},
@@ -2021,6 +2066,166 @@
"Jobs: ": {
"Jobs: ": "任务: "
},
"KDE Connect SMS action": {
"Opening SMS": "",
"Opening SMS app": ""
},
"KDE Connect SMS dialog title": {
"Send SMS": ""
},
"KDE Connect SMS message input placeholder": {
"Message": ""
},
"KDE Connect SMS phone input placeholder": {
"Phone number": ""
},
"KDE Connect SMS send button": {
"Send": ""
},
"KDE Connect SMS tooltip": {
"SMS": ""
},
"KDE Connect accept pairing button": {
"Accept": ""
},
"KDE Connect browse action": {
"Opening file browser": "",
"Opening files": ""
},
"KDE Connect browse tooltip": {
"Browse Files": ""
},
"KDE Connect clipboard action": {
"Clipboard sent": ""
},
"KDE Connect clipboard tooltip": {
"Send Clipboard": ""
},
"KDE Connect connected status": {
"Connected": ""
},
"KDE Connect daemon hint": {
"Start kdeconnectd to use this plugin": ""
},
"KDE Connect error": {
"Failed to accept pairing": "",
"Failed to browse device": "",
"Failed to launch SMS app": "",
"Failed to reject pairing": "",
"Failed to ring device": "",
"Failed to send clipboard": "",
"Failed to send ping": "",
"Failed to share": "",
"Pairing failed": "",
"Unpair failed": ""
},
"KDE Connect file share notification": {
"File received from": ""
},
"KDE Connect hint message": {
"Make sure KDE Connect is running on your other devices": ""
},
"KDE Connect no devices message": {
"No devices found": ""
},
"KDE Connect no devices status": {
"No devices": ""
},
"KDE Connect not paired status": {
"Not paired": ""
},
"KDE Connect offline status": {
"Offline": ""
},
"KDE Connect open SMS app button": {
"Open App": ""
},
"KDE Connect open app hint": {
"Open KDE Connect on your phone": ""
},
"KDE Connect pair button": {
"Pair": ""
},
"KDE Connect pairing action": {
"Device paired": "",
"Pairing request sent": ""
},
"KDE Connect pairing in progress status": {
"Pairing": ""
},
"KDE Connect pairing request notification": {
"Pairing request from": ""
},
"KDE Connect pairing requested status": {
"Pairing requested": ""
},
"KDE Connect pairing verification key label": {
"Verification": ""
},
"KDE Connect ping action": {
"Ping sent": "",
"Ping sent to": ""
},
"KDE Connect ping tooltip": {
"Ping": ""
},
"KDE Connect refresh button | KDE Connect refresh tooltip": {
"Refresh": ""
},
"KDE Connect reject pairing button": {
"Reject": ""
},
"KDE Connect request pairing button": {
"Request Pairing": ""
},
"KDE Connect ring action": {
"Ringing": ""
},
"KDE Connect ring tooltip": {
"Ring": ""
},
"KDE Connect service unavailable message": {
"KDE Connect unavailable": ""
},
"KDE Connect share URL button": {
"Share URL": ""
},
"KDE Connect share button | KDE Connect share dialog title | KDE Connect share tooltip": {
"Share": ""
},
"KDE Connect share input placeholder": {
"Enter URL or text to share": ""
},
"KDE Connect share success": {
"Shared": ""
},
"KDE Connect start daemon hint": {
"Start kdeconnectd to connect devices": ""
},
"KDE Connect status": {
"No devices connected": ""
},
"KDE Connect status multiple devices": {
"devices connected": ""
},
"KDE Connect status single device": {
"1 device connected": ""
},
"KDE Connect unavailable error title": {
"KDE Connect Not Available": ""
},
"KDE Connect unavailable status": {
"Unavailable": ""
},
"KDE Connect unknown device status | unknown author": {
"Unknown": ""
},
"KDE Connect unpair action": {
"Device unpaired": ""
},
"KDE Connect unpair tooltip": {
"Unpair": ""
},
"Keep Awake": {
"Keep Awake": "保持活动"
},
@@ -2255,9 +2460,18 @@
"Maximum History": {
"Maximum History": "最多历史数"
},
"Maximum Pinned Entries": {
"Maximum Pinned Entries": ""
},
"Maximum number of clipboard entries to keep": {
"Maximum number of clipboard entries to keep": "剪切板项目记住的最大数量"
},
"Maximum number of entries that can be saved": {
"Maximum number of entries that can be saved": ""
},
"Maximum pinned entries reached": {
"Maximum pinned entries reached": ""
},
"Maximum size per clipboard entry": {
"Maximum size per clipboard entry": "每个剪切板项目的最大尺寸"
},
@@ -2549,6 +2763,12 @@
"No printers found": {
"No printers found": "未找到打印机"
},
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No saved clipboard entries": {
"No saved clipboard entries": ""
},
"No variants created. Click Add to create a new monitor widget.": {
"No variants created. Click Add to create a new monitor widget.": "没有任何变体。点击添加以创建新的显示器小部件。"
},
@@ -2624,6 +2844,9 @@
"OSD Position": {
"OSD Position": "OSD位置"
},
"Occupied Color": {
"Occupied Color": ""
},
"Off": {
"Off": "关闭"
},
@@ -2771,6 +2994,9 @@
"Percentage": {
"Percentage": "占用率"
},
"Performance": {
"Performance": ""
},
"Permission denied to set profile image.": {
"Permission denied to set profile image.": "因权限问题,无法设置个人资料图片。"
},
@@ -2870,6 +3096,9 @@
"Power Profile Degradation": {
"Power Profile Degradation": "电源配置性能下降"
},
"Power off monitors on lock": {
"Power off monitors on lock": ""
},
"Power profile management available": {
"Power profile management available": "电源配置文件管理可用"
},
@@ -2939,6 +3168,9 @@
"Process Count": {
"Process Count": "进程计数"
},
"Processes": {
"Processes": ""
},
"Processing": {
"Processing": "处理中"
},
@@ -3137,6 +3369,9 @@
"Saved Configurations": {
"Saved Configurations": "已保存的配置"
},
"Saved item deleted": {
"Saved item deleted": ""
},
"Scale": {
"Scale": "缩放"
},
@@ -3158,6 +3393,9 @@
"Science": {
"Science": "科学"
},
"Screen Sharing": {
"Screen Sharing": ""
},
"Screen sharing": {
"Screen sharing": "屏幕分享"
},
@@ -3437,6 +3675,9 @@
"Show darkened overlay behind modal dialogs": {
"Show darkened overlay behind modal dialogs": "在对话框后显示暗色遮罩"
},
"Show dock when floating windows don't overlap its area": {
"Show dock when floating windows don't overlap its area": ""
},
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": {
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": "在Niri概览中打字时显示启动器叠加层。禁用该项以使用其他启动器。"
},
@@ -3752,9 +3993,15 @@
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": {
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "此部件会阻止 GPU 进入省电状态,可能会显著影响笔记本的电池续航。不建议在配备混合显卡的笔记本上使用。"
},
"This will delete all unpinned entries. %1 pinned entries will be kept.": {
"This will delete all unpinned entries. %1 pinned entries will be kept.": ""
},
"This will permanently delete all clipboard history.": {
"This will permanently delete all clipboard history.": "此操作会清空剪贴板历史,且无法恢复。"
},
"This will permanently remove this saved clipboard item. This action cannot be undone.": {
"This will permanently remove this saved clipboard item. This action cannot be undone.": ""
},
"Tiling": {
"Tiling": "平铺"
},
@@ -3854,6 +4101,9 @@
"Trigger Prefix": {
"Trigger Prefix": "触发前缀"
},
"Turn off all displays immediately when the lock screen activates": {
"Turn off all displays immediately when the lock screen activates": ""
},
"Turn off monitors after": {
"Turn off monitors after": "在此时间后关闭显示器"
},
@@ -3920,6 +4170,9 @@
"Update Plugin": {
"Update Plugin": "更新插件"
},
"Uptime": {
"Uptime": ""
},
"Urgent Color": {
"Urgent Color": "高亮颜色"
},
@@ -4303,6 +4556,18 @@
"dgop not available": {
"dgop not available": "dgop不可用"
},
"dgop unavailable error message": {
"The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.": ""
},
"disk io header in system monitor": {
"Disk I/O": ""
},
"disk read label": {
"Read:": ""
},
"disk write label": {
"Write:": ""
},
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": {
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "dms/binds.kdl 存在,但未包含在 config.kdl 中。除非修复此问题,否则自定义键绑定将无法工作。"
},
@@ -4336,18 +4601,33 @@
"empty plugin list": {
"No plugins found": "未找到插件"
},
"empty state in disk mounts list": {
"No mount points found": ""
},
"empty state in gpu list": {
"No GPUs detected": ""
},
"empty state in process list": {
"No matching processes": ""
},
"empty theme list": {
"No themes found": "未找到主题"
},
"events": {
"events": "事件"
},
"fallback gpu name": {
"Unknown GPU": ""
},
"files": {
"files": "文件"
},
"generic theme description": {
"Material Design inspired color themes": "受Material设计启发的色彩主题"
},
"gpu section header in system monitor": {
"GPU Monitoring": ""
},
"greeter back button": {
"Back": "返回"
},
@@ -4540,6 +4820,9 @@
"minutes": {
"minutes": "分钟"
},
"mount points header in system monitor": {
"Mount Points": ""
},
"ms": {
"ms": "毫秒"
},
@@ -4614,6 +4897,15 @@
"plugin search placeholder": {
"Search plugins...": "插件搜索中..."
},
"process count label in footer": {
"Processes:": ""
},
"process detail label": {
"Full Command:": ""
},
"process search placeholder": {
"Search processes...": ""
},
"profile image file browser title": {
"Select Profile Image": "选择个人信息图像"
},
@@ -4639,12 +4931,25 @@
"shadow intensity slider": {
"Intensity": "强度"
},
"short for processes": {
"procs": ""
},
"source code link": {
"source": "源"
},
"sysmon window title": {
"System Monitor": "系统监视器"
},
"system info header in system monitor": {
"System Information": ""
},
"system info label": {
"Architecture": "",
"Distribution": "",
"Hostname": "",
"Kernel": "",
"Load Average": ""
},
"theme browser description": {
"Install color themes from the DMS theme registry": "从DMS主题注册表安装色彩主题"
},
@@ -4675,6 +4980,9 @@
"update dms for NM integration.": {
"update dms for NM integration.": "更新 DMS 以集成 NM"
},
"uptime label in footer": {
"Uptime:": ""
},
"version requirement": {
"Requires %1": "需要%1"
},

View File

@@ -251,6 +251,9 @@
"Always Show Percentage": {
"Always Show Percentage": "始終顯示百分比"
},
"Always hide the dock and reveal it when hovering near the dock area": {
"Always hide the dock and reveal it when hovering near the dock area": ""
},
"Always on icons": {
"Always on icons": "始終顯示圖示"
},
@@ -707,6 +710,9 @@
"Clear All Jobs": {
"Clear All Jobs": "清除所有工作"
},
"Clear History?": {
"Clear History?": ""
},
"Clear all history when server starts": {
"Clear all history when server starts": "伺服器啟動時清除所有歷史紀錄"
},
@@ -917,6 +923,12 @@
"Copy": {
"Copy": "複製"
},
"Copy Full Command": {
"Copy Full Command": ""
},
"Copy Name": {
"Copy Name": ""
},
"Copy PID": {
"Copy PID": "複製 PID"
},
@@ -1124,6 +1136,9 @@
"Delete Printer": {
"Delete Printer": "刪除印表機"
},
"Delete Saved Item?": {
"Delete Saved Item?": ""
},
"Delete VPN": {
"Delete VPN": "刪除 VPN"
},
@@ -1208,6 +1223,9 @@
"Disk Usage": {
"Disk Usage": "硬碟使用率"
},
"Disks": {
"Disks": ""
},
"Dismiss": {
"Dismiss": "忽略"
},
@@ -1442,6 +1460,12 @@
"Enterprise": {
"Enterprise": "企業"
},
"Entry pinned": {
"Entry pinned": ""
},
"Entry unpinned": {
"Entry unpinned": ""
},
"Error": {
"Error": "錯誤"
},
@@ -1484,6 +1508,9 @@
"Failed to cancel selected job": {
"Failed to cancel selected job": "取消選定工作失敗"
},
"Failed to check pin limit": {
"Failed to check pin limit": ""
},
"Failed to connect VPN": {
"Failed to connect VPN": "VPN 連線失敗"
},
@@ -1559,6 +1586,9 @@
"Failed to pause printer": {
"Failed to pause printer": "無法暫停印表機"
},
"Failed to pin entry": {
"Failed to pin entry": ""
},
"Failed to print test page": {
"Failed to print test page": "無法列印測試頁"
},
@@ -1604,6 +1634,9 @@
"Failed to start connection to %1": {
"Failed to start connection to %1": "無法啟動連線至 %1"
},
"Failed to unpin entry": {
"Failed to unpin entry": ""
},
"Failed to update VPN": {
"Failed to update VPN": "更新 VPN 失敗"
},
@@ -1709,6 +1742,9 @@
"Force HDR": {
"Force HDR": "強制 HDR"
},
"Force Kill (SIGKILL)": {
"Force Kill (SIGKILL)": ""
},
"Force Kill Process": {
"Force Kill Process": "強制結束程序"
},
@@ -1763,6 +1799,9 @@
"Gamma control not available. Requires DMS API v6+.": {
"Gamma control not available. Requires DMS API v6+.": "Gamma 控制不可用。需要 DMS API v6+。"
},
"Generic device name | Generic device name fallback": {
"device": ""
},
"GitHub": {
"GitHub": "GitHub"
},
@@ -1880,6 +1919,9 @@
"History Settings": {
"History Settings": "歷史紀錄設定"
},
"History cleared. %1 pinned entries kept.": {
"History cleared. %1 pinned entries kept.": ""
},
"Hold Duration": {
"Hold Duration": "按住持續時間"
},
@@ -1994,6 +2036,9 @@
"Install plugins from the DMS plugin registry": {
"Install plugins from the DMS plugin registry": "從 DMS 插件註冊表安裝插件"
},
"Intelligent Auto-hide": {
"Intelligent Auto-hide": ""
},
"Interface:": {
"Interface:": "介面:"
},
@@ -2021,6 +2066,166 @@
"Jobs: ": {
"Jobs: ": "工作: "
},
"KDE Connect SMS action": {
"Opening SMS": "",
"Opening SMS app": ""
},
"KDE Connect SMS dialog title": {
"Send SMS": ""
},
"KDE Connect SMS message input placeholder": {
"Message": ""
},
"KDE Connect SMS phone input placeholder": {
"Phone number": ""
},
"KDE Connect SMS send button": {
"Send": ""
},
"KDE Connect SMS tooltip": {
"SMS": ""
},
"KDE Connect accept pairing button": {
"Accept": ""
},
"KDE Connect browse action": {
"Opening file browser": "",
"Opening files": ""
},
"KDE Connect browse tooltip": {
"Browse Files": ""
},
"KDE Connect clipboard action": {
"Clipboard sent": ""
},
"KDE Connect clipboard tooltip": {
"Send Clipboard": ""
},
"KDE Connect connected status": {
"Connected": ""
},
"KDE Connect daemon hint": {
"Start kdeconnectd to use this plugin": ""
},
"KDE Connect error": {
"Failed to accept pairing": "",
"Failed to browse device": "",
"Failed to launch SMS app": "",
"Failed to reject pairing": "",
"Failed to ring device": "",
"Failed to send clipboard": "",
"Failed to send ping": "",
"Failed to share": "",
"Pairing failed": "",
"Unpair failed": ""
},
"KDE Connect file share notification": {
"File received from": ""
},
"KDE Connect hint message": {
"Make sure KDE Connect is running on your other devices": ""
},
"KDE Connect no devices message": {
"No devices found": ""
},
"KDE Connect no devices status": {
"No devices": ""
},
"KDE Connect not paired status": {
"Not paired": ""
},
"KDE Connect offline status": {
"Offline": ""
},
"KDE Connect open SMS app button": {
"Open App": ""
},
"KDE Connect open app hint": {
"Open KDE Connect on your phone": ""
},
"KDE Connect pair button": {
"Pair": ""
},
"KDE Connect pairing action": {
"Device paired": "",
"Pairing request sent": ""
},
"KDE Connect pairing in progress status": {
"Pairing": ""
},
"KDE Connect pairing request notification": {
"Pairing request from": ""
},
"KDE Connect pairing requested status": {
"Pairing requested": ""
},
"KDE Connect pairing verification key label": {
"Verification": ""
},
"KDE Connect ping action": {
"Ping sent": "",
"Ping sent to": ""
},
"KDE Connect ping tooltip": {
"Ping": ""
},
"KDE Connect refresh button | KDE Connect refresh tooltip": {
"Refresh": ""
},
"KDE Connect reject pairing button": {
"Reject": ""
},
"KDE Connect request pairing button": {
"Request Pairing": ""
},
"KDE Connect ring action": {
"Ringing": ""
},
"KDE Connect ring tooltip": {
"Ring": ""
},
"KDE Connect service unavailable message": {
"KDE Connect unavailable": ""
},
"KDE Connect share URL button": {
"Share URL": ""
},
"KDE Connect share button | KDE Connect share dialog title | KDE Connect share tooltip": {
"Share": ""
},
"KDE Connect share input placeholder": {
"Enter URL or text to share": ""
},
"KDE Connect share success": {
"Shared": ""
},
"KDE Connect start daemon hint": {
"Start kdeconnectd to connect devices": ""
},
"KDE Connect status": {
"No devices connected": ""
},
"KDE Connect status multiple devices": {
"devices connected": ""
},
"KDE Connect status single device": {
"1 device connected": ""
},
"KDE Connect unavailable error title": {
"KDE Connect Not Available": ""
},
"KDE Connect unavailable status": {
"Unavailable": ""
},
"KDE Connect unknown device status | unknown author": {
"Unknown": ""
},
"KDE Connect unpair action": {
"Device unpaired": ""
},
"KDE Connect unpair tooltip": {
"Unpair": ""
},
"Keep Awake": {
"Keep Awake": "保持喚醒"
},
@@ -2255,9 +2460,18 @@
"Maximum History": {
"Maximum History": "歷史紀錄上限"
},
"Maximum Pinned Entries": {
"Maximum Pinned Entries": ""
},
"Maximum number of clipboard entries to keep": {
"Maximum number of clipboard entries to keep": "剪貼簿項目保留數量上限"
},
"Maximum number of entries that can be saved": {
"Maximum number of entries that can be saved": ""
},
"Maximum pinned entries reached": {
"Maximum pinned entries reached": ""
},
"Maximum size per clipboard entry": {
"Maximum size per clipboard entry": "每個剪貼簿項目的最大大小"
},
@@ -2549,6 +2763,12 @@
"No printers found": {
"No printers found": "找不到印表機"
},
"No recent clipboard entries found": {
"No recent clipboard entries found": ""
},
"No saved clipboard entries": {
"No saved clipboard entries": ""
},
"No variants created. Click Add to create a new monitor widget.": {
"No variants created. Click Add to create a new monitor widget.": "尚未建立任何變體。按一下「新增」以建立新的顯示器小工具。"
},
@@ -2624,6 +2844,9 @@
"OSD Position": {
"OSD Position": "OSD 位置"
},
"Occupied Color": {
"Occupied Color": ""
},
"Off": {
"Off": "關閉"
},
@@ -2771,6 +2994,9 @@
"Percentage": {
"Percentage": "百分比"
},
"Performance": {
"Performance": ""
},
"Permission denied to set profile image.": {
"Permission denied to set profile image.": "權限不足,無法設定個人資料圖片。"
},
@@ -2870,6 +3096,9 @@
"Power Profile Degradation": {
"Power Profile Degradation": "電源配置降級"
},
"Power off monitors on lock": {
"Power off monitors on lock": ""
},
"Power profile management available": {
"Power profile management available": "電源設定檔管理功能可用"
},
@@ -2939,6 +3168,9 @@
"Process Count": {
"Process Count": "程序數量"
},
"Processes": {
"Processes": ""
},
"Processing": {
"Processing": "正在處理"
},
@@ -3137,6 +3369,9 @@
"Saved Configurations": {
"Saved Configurations": "已儲存的設定"
},
"Saved item deleted": {
"Saved item deleted": ""
},
"Scale": {
"Scale": "縮放"
},
@@ -3158,6 +3393,9 @@
"Science": {
"Science": "科學"
},
"Screen Sharing": {
"Screen Sharing": ""
},
"Screen sharing": {
"Screen sharing": "螢幕分享"
},
@@ -3437,6 +3675,9 @@
"Show darkened overlay behind modal dialogs": {
"Show darkened overlay behind modal dialogs": "在模態對話框後顯示暗化覆蓋層"
},
"Show dock when floating windows don't overlap its area": {
"Show dock when floating windows don't overlap its area": ""
},
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": {
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": "在 Niri 總覽中輸入時顯示啟動器疊加。停用以使用其他啟動器。"
},
@@ -3752,9 +3993,15 @@
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": {
"This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "此部件可防止 GPU 電源關閉,這會嚴重影響筆記型電腦的電池續航時間。不建議在配備混合顯示卡的筆記型電腦上使用此功能。"
},
"This will delete all unpinned entries. %1 pinned entries will be kept.": {
"This will delete all unpinned entries. %1 pinned entries will be kept.": ""
},
"This will permanently delete all clipboard history.": {
"This will permanently delete all clipboard history.": "這將永久刪除所有剪貼簿歷史記錄。"
},
"This will permanently remove this saved clipboard item. This action cannot be undone.": {
"This will permanently remove this saved clipboard item. This action cannot be undone.": ""
},
"Tiling": {
"Tiling": "平鋪"
},
@@ -3854,6 +4101,9 @@
"Trigger Prefix": {
"Trigger Prefix": "觸發前綴"
},
"Turn off all displays immediately when the lock screen activates": {
"Turn off all displays immediately when the lock screen activates": ""
},
"Turn off monitors after": {
"Turn off monitors after": "指定時間後關閉螢幕"
},
@@ -3920,6 +4170,9 @@
"Update Plugin": {
"Update Plugin": "更新插件"
},
"Uptime": {
"Uptime": ""
},
"Urgent Color": {
"Urgent Color": ""
},
@@ -4303,6 +4556,18 @@
"dgop not available": {
"dgop not available": "dgop 無法使用"
},
"dgop unavailable error message": {
"The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.": ""
},
"disk io header in system monitor": {
"Disk I/O": ""
},
"disk read label": {
"Read:": ""
},
"disk write label": {
"Write:": ""
},
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": {
"dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "dms/binds.kdl 存在但未包含在 config.kdl 中。此問題解決前,自訂按鍵綁定將無法運作。"
},
@@ -4336,18 +4601,33 @@
"empty plugin list": {
"No plugins found": "找不到任何外掛"
},
"empty state in disk mounts list": {
"No mount points found": ""
},
"empty state in gpu list": {
"No GPUs detected": ""
},
"empty state in process list": {
"No matching processes": ""
},
"empty theme list": {
"No themes found": "找不到任何主題"
},
"events": {
"events": "活動"
},
"fallback gpu name": {
"Unknown GPU": ""
},
"files": {
"files": "檔案"
},
"generic theme description": {
"Material Design inspired color themes": "受 Material Design 啟發的色彩主題"
},
"gpu section header in system monitor": {
"GPU Monitoring": ""
},
"greeter back button": {
"Back": "返回"
},
@@ -4540,6 +4820,9 @@
"minutes": {
"minutes": "分鐘"
},
"mount points header in system monitor": {
"Mount Points": ""
},
"ms": {
"ms": "毫秒"
},
@@ -4614,6 +4897,15 @@
"plugin search placeholder": {
"Search plugins...": "搜尋外掛..."
},
"process count label in footer": {
"Processes:": ""
},
"process detail label": {
"Full Command:": ""
},
"process search placeholder": {
"Search processes...": ""
},
"profile image file browser title": {
"Select Profile Image": "選擇個人資料圖片"
},
@@ -4639,12 +4931,25 @@
"shadow intensity slider": {
"Intensity": "強度"
},
"short for processes": {
"procs": ""
},
"source code link": {
"source": "來源"
},
"sysmon window title": {
"System Monitor": "系統監視器"
},
"system info header in system monitor": {
"System Information": ""
},
"system info label": {
"Architecture": "",
"Distribution": "",
"Hostname": "",
"Kernel": "",
"Load Average": ""
},
"theme browser description": {
"Install color themes from the DMS theme registry": "從 DMS 主題登錄檔安裝色彩主題"
},
@@ -4675,6 +4980,9 @@
"update dms for NM integration.": {
"update dms for NM integration.": "更新 dms 以進行 NM 整合。"
},
"uptime label in footer": {
"Uptime:": ""
},
"version requirement": {
"Requires %1": "需要 %1"
},

File diff suppressed because it is too large Load Diff